@mengzf/skillflow-mcp 0.0.0-stage → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +279 -2
- package/dist/adapters/claude-code.adapter.d.ts +10 -0
- package/dist/adapters/claude-code.adapter.d.ts.map +1 -0
- package/dist/adapters/claude-code.adapter.js +166 -0
- package/dist/adapters/claude-code.adapter.js.map +1 -0
- package/dist/adapters/codex.adapter.d.ts +10 -0
- package/dist/adapters/codex.adapter.d.ts.map +1 -0
- package/dist/adapters/codex.adapter.js +109 -0
- package/dist/adapters/codex.adapter.js.map +1 -0
- package/dist/adapters/dsh.adapter.d.ts +7 -0
- package/dist/adapters/dsh.adapter.d.ts.map +1 -0
- package/dist/adapters/dsh.adapter.js +60 -0
- package/dist/adapters/dsh.adapter.js.map +1 -0
- package/dist/adapters/qoder.adapter.d.ts +10 -0
- package/dist/adapters/qoder.adapter.d.ts.map +1 -0
- package/dist/adapters/qoder.adapter.js +119 -0
- package/dist/adapters/qoder.adapter.js.map +1 -0
- package/dist/adapters/trae.adapter.d.ts +8 -0
- package/dist/adapters/trae.adapter.d.ts.map +1 -0
- package/dist/adapters/trae.adapter.js +104 -0
- package/dist/adapters/trae.adapter.js.map +1 -0
- package/dist/adapters/types.d.ts +25 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/adapters/universal.sync.d.ts +22 -0
- package/dist/adapters/universal.sync.d.ts.map +1 -0
- package/dist/adapters/universal.sync.js +140 -0
- package/dist/adapters/universal.sync.js.map +1 -0
- package/dist/adapters/workbuddy.sniffer.d.ts +22 -0
- package/dist/adapters/workbuddy.sniffer.d.ts.map +1 -0
- package/dist/adapters/workbuddy.sniffer.js +148 -0
- package/dist/adapters/workbuddy.sniffer.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +33 -0
- package/dist/config.js.map +1 -0
- package/dist/db/index.d.ts +4 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +39 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/invocation-filter.d.ts +29 -0
- package/dist/db/invocation-filter.d.ts.map +1 -0
- package/dist/db/invocation-filter.js +78 -0
- package/dist/db/invocation-filter.js.map +1 -0
- package/dist/db/schema.d.ts +3 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +129 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/seed.d.ts +15 -0
- package/dist/db/seed.d.ts.map +1 -0
- package/dist/db/seed.js +128 -0
- package/dist/db/seed.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +372 -0
- package/dist/server.js.map +1 -0
- package/dist/services/benchmark.service.d.ts +27 -0
- package/dist/services/benchmark.service.d.ts.map +1 -0
- package/dist/services/benchmark.service.js +94 -0
- package/dist/services/benchmark.service.js.map +1 -0
- package/dist/services/dashboard.service.d.ts +14 -0
- package/dist/services/dashboard.service.d.ts.map +1 -0
- package/dist/services/dashboard.service.js +296 -0
- package/dist/services/dashboard.service.js.map +1 -0
- package/dist/services/filter.service.d.ts +26 -0
- package/dist/services/filter.service.d.ts.map +1 -0
- package/dist/services/filter.service.js +103 -0
- package/dist/services/filter.service.js.map +1 -0
- package/dist/services/impact.service.d.ts +20 -0
- package/dist/services/impact.service.d.ts.map +1 -0
- package/dist/services/impact.service.js +114 -0
- package/dist/services/impact.service.js.map +1 -0
- package/dist/services/telemetry.service.d.ts +41 -0
- package/dist/services/telemetry.service.d.ts.map +1 -0
- package/dist/services/telemetry.service.js +244 -0
- package/dist/services/telemetry.service.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/models.d.ts +73 -0
- package/dist/types/models.d.ts.map +1 -0
- package/dist/types/models.js +2 -0
- package/dist/types/models.js.map +1 -0
- package/dist/types/tools.d.ts +173 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +195 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/ascii-chart.d.ts +9 -0
- package/dist/utils/ascii-chart.d.ts.map +1 -0
- package/dist/utils/ascii-chart.js +29 -0
- package/dist/utils/ascii-chart.js.map +1 -0
- package/dist/utils/formatter.d.ts +6 -0
- package/dist/utils/formatter.d.ts.map +1 -0
- package/dist/utils/formatter.js +29 -0
- package/dist/utils/formatter.js.map +1 -0
- package/dist/utils/governance.d.ts +25 -0
- package/dist/utils/governance.d.ts.map +1 -0
- package/dist/utils/governance.js +70 -0
- package/dist/utils/governance.js.map +1 -0
- package/dist/utils/hours.d.ts +3 -0
- package/dist/utils/hours.d.ts.map +1 -0
- package/dist/utils/hours.js +15 -0
- package/dist/utils/hours.js.map +1 -0
- package/dist/utils/pricing.d.ts +19 -0
- package/dist/utils/pricing.d.ts.map +1 -0
- package/dist/utils/pricing.js +96 -0
- package/dist/utils/pricing.js.map +1 -0
- package/dist/utils/quality.d.ts +15 -0
- package/dist/utils/quality.d.ts.map +1 -0
- package/dist/utils/quality.js +47 -0
- package/dist/utils/quality.js.map +1 -0
- package/dist/web/render.d.ts +2 -0
- package/dist/web/render.d.ts.map +1 -0
- package/dist/web/render.js +1919 -0
- package/dist/web/render.js.map +1 -0
- package/dist/web/server.d.ts +10 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +160 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +51 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 SkillFlow Team
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,280 @@
|
|
|
1
|
-
#
|
|
1
|
+
# SkillFlow MCP (跨 Agent 技能命中监测与多维效能遥测中枢)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
`SkillFlow MCP` 是一个统一的 **Model Context Protocol (MCP)** 服务与技能效能分析引擎。
|
|
4
|
+
|
|
5
|
+
它的核心作用是:在开发者使用各类 AI 编程智能体(**Claude Code、Trae、Qoder、WorkBuddy、Codex、DSH 等**)时,**无侵入地记录每轮对话中 Skill 的命中情况,量化技能对开发流程的帮助(估算节省的交互步骤与消耗的 Token),并提供单次对话与跨 Agent 全局多维度的效能看板**。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 🌟 核心特性
|
|
10
|
+
|
|
11
|
+
1. **统一跨 Agent 共享底座**:
|
|
12
|
+
- 基于 Node.js 24 原生内置的 `node:sqlite`(`DatabaseSync`)开发,**零原生 C++ 编译依赖**(Windows/macOS/Linux 开箱即用)。
|
|
13
|
+
- 默认存储于 `~/.skillflow/skillflow.db`,开启 WAL(Write-Ahead Logging)高并发读写模式。无论你在 Trae、Claude Code 还是 Qoder 中工作,所有会话与统计数据**实时汇总互通**。
|
|
14
|
+
2. **精准的技能命中与收益核算**:
|
|
15
|
+
- 记录每次 Skill 触发的执行状态(`success`、`partial`、`failed`、`skipped`)。
|
|
16
|
+
- 内置**反事实基准对比模型(Benchmark Diffing)**,自动计算节省的流程步骤(`saved_steps`)与节省的 Token 数量(`saved_tokens`)。
|
|
17
|
+
3. **多维统计分析看板**:
|
|
18
|
+
- **时间维度**:当前会话(`current_session`)、今日(`today`)、近 7 天(`7days`)、近 30 天(`30days`)、全量历史(`all`)。
|
|
19
|
+
- **Agent 生态矩阵**:横向对比 Claude Code、Trae、Qoder、WorkBuddy、Codex、DSH 各自的调用频次与贡献节约量。
|
|
20
|
+
- **技能价值榜**:Top 技能排名与终端/聊天窗口友好的 ASCII 进度与柱状图。
|
|
21
|
+
4. **灵活的技能基准管理**:
|
|
22
|
+
- 预设 10 大标准技能基准(`code-review`、`frontend-design`、`security-review`、`simplify`、`docx`、`xlsx`、`pptx`、`pdf-reading`、`dataviz`、`workflow-authoring`)。
|
|
23
|
+
- 支持自定义新增或动态调整团队内部技能的基准参数。
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 🛠️ 提供的 MCP Tools & Resources
|
|
28
|
+
|
|
29
|
+
### 1. MCP Tools
|
|
30
|
+
| MCP Tool 名称 | 核心用途 | 参数说明 |
|
|
31
|
+
|:---|:---|:---|
|
|
32
|
+
| `record_skill_hit` | 记录/上报一次 Skill 激活命中事件并核算收益 | `session_id` (必填), `skill_id` (必填), `agent_name`, `round_index`, `status`, `actual_tokens`, `actual_steps`, `saved_steps`, `saved_tokens`, `metadata` |
|
|
33
|
+
| `get_round_skill_impact` | 查看指定轮次或当前会话的技能命中情况与明细报告 | `session_id` (可选,默认取最近会话), `round_index` (可选,默认最新轮次), `include_session_summary` (默认 true) |
|
|
34
|
+
| `get_skill_dashboard` | 获取全景效能看板(按时间范围、Agent 矩阵、Skill 贡献榜聚合) | `time_range` (`current_session`/`today`/`7days`/`30days`/`all`), `session_id`, `agent_name`, `skill_id`, `model_name`, `status` (`success`/`partial`/`failed`/`skipped`), `group_by` |
|
|
35
|
+
| `manage_skill_benchmark` | 管理技能基准库(列表、详情、新增/修改基准、删除、重置预设) | `action` (`list`/`get`/`set`/`delete`/`reset_defaults`), `skill_id`, `skill_name`, `category`, `baseline_steps`, `baseline_tokens` |
|
|
36
|
+
| `get_web_dashboard_url` | 获取本地 Web 可视化看板的访问地址及运行状态 | 无必填入参,返回 `http://localhost:3000` 链接与说明 |
|
|
37
|
+
|
|
38
|
+
### 2. MCP Resources (资源直读)
|
|
39
|
+
| 资源 URI | 类型 | 说明 |
|
|
40
|
+
|:---|:---|:---|
|
|
41
|
+
| `skillflow://dashboard` | `text/html` | 自包含的 Web 可视化看板 HTML 视图,支持支持 Resource 渲染的 Client 直接嵌入 |
|
|
42
|
+
| `skillflow://analytics.json` | `application/json` | 全局聚合分析指标的原始 JSON 数据 |
|
|
43
|
+
| `skillflow://skills` | `application/json` | 完整技能基准清单数据 |
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 🌐 进阶增强:本地 Web 可视化看板
|
|
48
|
+
|
|
49
|
+
服务启动时会在后台自动拉起一个内置的极轻量级 Web 服务器(基于 Node.js 原生 `node:http`,零第三方 HTTP 依赖):
|
|
50
|
+
- **默认地址**:`http://localhost:3000`(若端口被占用会自动顺延至 3001..)
|
|
51
|
+
- **环境变量**:
|
|
52
|
+
- `SKILLFLOW_PORT=3000`(自定义端口)
|
|
53
|
+
- `SKILLFLOW_ENABLE_WEB=false`(若只想要单纯 stdio 模式可关闭 Web)
|
|
54
|
+
- **看板功能**:
|
|
55
|
+
- 🎨 浅色 Apple 风格 UI,自适应桌面 / 平板 / 手机三档断点。
|
|
56
|
+
- ⚡ 实时 5 秒自动轮询刷新。
|
|
57
|
+
- 🔎 多维查询条件:时间范围、Agent 宿主、Skill 技能、执行模型、执行状态,可任意组合并一键重置;条件同时作用于指标卡、排行榜、生态分布与调用流水。
|
|
58
|
+
- 📊 流程步骤节约与 Token 节省排行榜。
|
|
59
|
+
- 🤖 Claude Code / Trae / Qoder / WorkBuddy / Codex / DSH 各平台占比分布。
|
|
60
|
+
- ⏱️ 实时调用流水列表(展示时间、会话 ID、技能名、状态、节省指标),并显示当前条件下的匹配总数。
|
|
61
|
+
- **看板数据接口**(均支持上述查询参数,直接以查询串传入):
|
|
62
|
+
|
|
63
|
+
| 接口 | 说明 |
|
|
64
|
+
| :--- | :--- |
|
|
65
|
+
| `GET /api/dashboard` | 指标卡 + Skill 排行 + Agent/模型分布聚合 |
|
|
66
|
+
| `GET /api/invocations` | 调用流水明细,支持 `limit`(1–100),返回 `total` 匹配总数 |
|
|
67
|
+
| `GET /api/filters` | 可选的 Agent / Skill / 模型 / 状态清单及各自命中数 |
|
|
68
|
+
| `GET /api/skills` | 已注册 Skill 基线清单 |
|
|
69
|
+
| `GET /api/health` | 服务健康检查 |
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 🚀 快速启动与编译
|
|
74
|
+
|
|
75
|
+
### 环境要求
|
|
76
|
+
- Node.js >= 24.0.0
|
|
77
|
+
- npm >= 10.0.0
|
|
78
|
+
|
|
79
|
+
### 安装与构建
|
|
80
|
+
```bash
|
|
81
|
+
# 1. 克隆或进入项目目录
|
|
82
|
+
cd D:\code\skill
|
|
83
|
+
|
|
84
|
+
# 2. 安装依赖
|
|
85
|
+
npm install
|
|
86
|
+
|
|
87
|
+
# 3. 运行完整测试套件 (包含单测与 MCP 协议集成测试)
|
|
88
|
+
npm test
|
|
89
|
+
|
|
90
|
+
# 4. 编译输出到 ./dist
|
|
91
|
+
npm run build
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## 🚀 全球一键使用(已发布至 npm)
|
|
97
|
+
|
|
98
|
+
得益于已正式发布至 npm 官方仓库,任何开发者**无需下载源码、无需克隆仓库**,即可一键使用:
|
|
99
|
+
|
|
100
|
+
### 1. 独立运行 Web 监控大屏
|
|
101
|
+
在任意终端直接运行:
|
|
102
|
+
```bash
|
|
103
|
+
npx -y @mengzf/skillflow-mcp
|
|
104
|
+
```
|
|
105
|
+
服务会自动下载并启动在 `http://localhost:3000`!
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 🔌 各 Agent 一键接入配置(推荐方式)
|
|
110
|
+
|
|
111
|
+
直接通过 `npx` 引入,后续更新版本将**全自动无感静默升级**:
|
|
112
|
+
|
|
113
|
+
### 1. Claude Code
|
|
114
|
+
直接运行官方添加命令:
|
|
115
|
+
```bash
|
|
116
|
+
claude mcp add skillflow -- npx -y @mengzf/skillflow-mcp
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### 2. Trae (ByteDance)
|
|
120
|
+
在 Trae 的 MCP 配置中添加:
|
|
121
|
+
```json
|
|
122
|
+
{
|
|
123
|
+
"mcpServers": {
|
|
124
|
+
"skillflow": {
|
|
125
|
+
"command": "npx",
|
|
126
|
+
"args": ["-y", "@mengzf/skillflow-mcp"]
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 3. Qoder / WorkBuddy / Codex / DSH
|
|
133
|
+
在客户端对应的 MCP Server 列表添加:
|
|
134
|
+
- **Command / 命令**: `npx`
|
|
135
|
+
- **Args / 参数**: `["-y", "@mengzf/skillflow-mcp"]`
|
|
136
|
+
或直接写入用户全局配置 `~/.claude/settings.json`(或项目级 `.claude/settings.json`):
|
|
137
|
+
```json
|
|
138
|
+
{
|
|
139
|
+
"mcpServers": {
|
|
140
|
+
"skillflow": {
|
|
141
|
+
"command": "node",
|
|
142
|
+
"args": ["D:/code/skill/dist/index.js"]
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### 2. Trae (ByteDance)
|
|
149
|
+
在 Trae 设置面板中的 **MCP Servers** 或 `mcp.json` 中配置:
|
|
150
|
+
```json
|
|
151
|
+
{
|
|
152
|
+
"mcpServers": {
|
|
153
|
+
"skillflow": {
|
|
154
|
+
"command": "node",
|
|
155
|
+
"args": ["D:/code/skill/dist/index.js"],
|
|
156
|
+
"disabled": false
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### 3. Qoder (阿里通义)
|
|
163
|
+
在 Qoder 的 MCP 插件设置界面添加:
|
|
164
|
+
- **Name**: `skillflow`
|
|
165
|
+
- **Transport**: `stdio`
|
|
166
|
+
- **Command**: `node`
|
|
167
|
+
- **Arguments**: `["D:/code/skill/dist/index.js"]`
|
|
168
|
+
|
|
169
|
+
### 4. WorkBuddy (腾讯)
|
|
170
|
+
在 WorkBuddy 的 Agent 扩展 / 工具市场中选择添加本地 MCP:
|
|
171
|
+
```json
|
|
172
|
+
{
|
|
173
|
+
"skillflow": {
|
|
174
|
+
"command": "node",
|
|
175
|
+
"args": ["D:/code/skill/dist/index.js"]
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### 5. Codex & DSH
|
|
181
|
+
在客户端对应的 MCP Server 列表填入:
|
|
182
|
+
```json
|
|
183
|
+
{
|
|
184
|
+
"command": "node",
|
|
185
|
+
"args": ["D:/code/skill/dist/index.js"]
|
|
186
|
+
]
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 💬 实际交互使用示例
|
|
192
|
+
|
|
193
|
+
配置完成后,在**任何一个 Agent** 中都可以用自然的中文直接询问:
|
|
194
|
+
|
|
195
|
+
### 场景 1:探查本轮对话命中了什么 Skill
|
|
196
|
+
> **用户**:“查看刚才这轮对话有没有触发 skill?帮我省了多少东西?”
|
|
197
|
+
> **Agent**:自动调用 `get_round_skill_impact`,返回如下 Markdown 报告:
|
|
198
|
+
|
|
199
|
+
```markdown
|
|
200
|
+
### 🎯 Skill 命中与效能分析报告 (Round #2)
|
|
201
|
+
|
|
202
|
+
- **会话 ID**: `sess-20261111-trae-01`
|
|
203
|
+
- **宿主 Agent**: `Trae`
|
|
204
|
+
- **本轮命中技能数**: **2** 个
|
|
205
|
+
- **流程步骤节省**: **+18 步**
|
|
206
|
+
- **Token 节省估计**: **+8,850 Tokens** (82.3% 资源缩减, 价值 ~$0.03)
|
|
207
|
+
|
|
208
|
+
#### 📋 本轮命中清单明细
|
|
209
|
+
|
|
210
|
+
| 命中的 Skill | 分类 | 状态 | 实际步骤 | 基准步骤 | 步骤节省 | 实际 Token | Token 节省 | 节约比 |
|
|
211
|
+
| :--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
|
|
212
|
+
| **Frontend Design** (`frontend-design`) | design | ✅ 成功 | 1 | 10 | **+9** | 620 | **+4,380** | 87.6% |
|
|
213
|
+
| **Code Review** (`code-review`) | engineering | ✅ 成功 | 1 | 10 | **+9** | 530 | **+4,470** | 89.4% |
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
#### 📈 会话累计数据看板 (当前会话全轮次)
|
|
217
|
+
|
|
218
|
+
- **当前总交互轮次**: 2 轮
|
|
219
|
+
- **全会话技能总触发**: 3 次
|
|
220
|
+
- **全会话累计节约步骤**: **+25 步**
|
|
221
|
+
- **全会话累计节约 Token**: **+13,250 Tokens** (~$0.04)
|
|
222
|
+
- **流程自动化压缩率**: [████████████████░░] 93%
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
### 场景 2:跨 Agent 全局效能看板
|
|
228
|
+
> **用户**:“统计一下我在所有 Agent 上的 skill 使用情况”
|
|
229
|
+
> **Agent**:自动调用 `get_skill_dashboard(time_range="all")`,返回全景大盘:
|
|
230
|
+
|
|
231
|
+
```markdown
|
|
232
|
+
## 📊 SkillFlow 跨平台全景效能看板
|
|
233
|
+
|
|
234
|
+
> **筛选范围**: `ALL` | **Agent 维度**: `全部生态` | **主视角**: `skill`
|
|
235
|
+
|
|
236
|
+
### 💡 核心效能大盘指标
|
|
237
|
+
|
|
238
|
+
| 统计维度 | 数值指标 | 效能评估说明 |
|
|
239
|
+
| :--- | :--- | :--- |
|
|
240
|
+
| **覆盖会话** | **68** 场 | 活跃对话会话总数 |
|
|
241
|
+
| **Skill 触发总量** | **184** 次 | 成功率 **97.8%** |
|
|
242
|
+
| **累计精简流程** | **+1,240 步** | 消除的重复/排查交互步骤 |
|
|
243
|
+
| **累计节省 Token** | **+5,420,000 Tokens** | 折合模型成本节约 **~$16.26** |
|
|
244
|
+
|
|
245
|
+
### 🏆 价值贡献最大 Skill Top 5 (节省步骤榜)
|
|
246
|
+
|
|
247
|
+
1. `Code Review` [██████████████████] +540 步 (54次)
|
|
248
|
+
2. `Frontend Design` [████████████░░░░░░] +360 步 (40次)
|
|
249
|
+
3. `Security Review` [████████░░░░░░░░░░] +240 步 (20次)
|
|
250
|
+
4. `Code Simplificat` [██████░░░░░░░░░░░░] +180 步 (30次)
|
|
251
|
+
5. `Word Document Ge` [████░░░░░░░░░░░░░░] +120 步 (20次)
|
|
252
|
+
|
|
253
|
+
### 🤖 各 Agent 生态调用与收益贡献矩阵
|
|
254
|
+
|
|
255
|
+
| Agent 宿主 | 覆盖会话 | 触发次数 | 占比 | 贡献节约步骤 | 贡献节约 Token |
|
|
256
|
+
| :--- | :---: | :---: | :---: | :---: | :---: |
|
|
257
|
+
| **Claude Code** | 28 | 82 次 | 44.6% | **+560 步** | **+2,450,000** |
|
|
258
|
+
| **Trae** | 18 | 48 次 | 26.1% | **+320 步** | **+1,420,000** |
|
|
259
|
+
| **WorkBuddy** | 12 | 31 次 | 16.8% | **+210 步** | **+910,000** |
|
|
260
|
+
| **Qoder** | 6 | 15 次 | 8.2% | **+105 步** | **+440,000** |
|
|
261
|
+
| **DSH / Codex** | 4 | 8 次 | 4.3% | **+45 步** | **+200,000** |
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## 📐 算法原理:如何量化“节省”?
|
|
267
|
+
|
|
268
|
+
1. **基准对比(Benchmark Profile)**:
|
|
269
|
+
对于某个技能(如 `code-review`),若不使用该技能,开发者手动审查代码、多轮询问与修复通常需要 **12 个步骤** 并消耗约 **6,500 Tokens**。
|
|
270
|
+
2. **结算逻辑**:
|
|
271
|
+
- 当技能执行成功(`status = 'success'`)且实际花费 1 步与 500 Token 时:
|
|
272
|
+
- **节省步骤** = $12 - 1 = 11$ 步;
|
|
273
|
+
- **节省 Token** = $6500 - 500 = 6000$ Tokens。
|
|
274
|
+
- 当技能部分成功(`status = 'partial'`)时按 50% 折算。
|
|
275
|
+
- 当执行失败(`status = 'failed'`)时节省量计为 0。
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## 📄 License
|
|
280
|
+
MIT License.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AgentHistoryAdapter, DiscoveredSkillInvocation } from './types.js';
|
|
2
|
+
export declare class ClaudeCodeAdapter implements AgentHistoryAdapter {
|
|
3
|
+
readonly agentName = "Claude Code";
|
|
4
|
+
private fileMtimeCache;
|
|
5
|
+
private memoryCache;
|
|
6
|
+
private findProjectsDir;
|
|
7
|
+
scan(): DiscoveredSkillInvocation[];
|
|
8
|
+
private parseFile;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=claude-code.adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/claude-code.adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAgB5E,qBAAa,iBAAkB,YAAW,mBAAmB;IAC3D,QAAQ,CAAC,SAAS,iBAAiB;IACnC,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,WAAW,CAAkD;IAErE,OAAO,CAAC,eAAe;IAQvB,IAAI,IAAI,yBAAyB,EAAE;IA6CnC,OAAO,CAAC,SAAS;CAgGlB"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
const KNOWN_SLASH_COMMANDS = {
|
|
5
|
+
'code-review': 'Code Review',
|
|
6
|
+
'frontend-design': 'Frontend Design',
|
|
7
|
+
'simplify': 'Code Simplification',
|
|
8
|
+
'security-review': 'Security Review',
|
|
9
|
+
'explain-usage': 'Explain Usage',
|
|
10
|
+
'docx': 'Word Document Generator',
|
|
11
|
+
'xlsx': 'Excel Spreadsheet Generator',
|
|
12
|
+
'pptx': 'Presentation Builder',
|
|
13
|
+
'pdf-reading': 'PDF Inspector',
|
|
14
|
+
'dataviz': 'Data Visualization Engine',
|
|
15
|
+
'workflow-authoring': 'Workflow Authoring',
|
|
16
|
+
};
|
|
17
|
+
export class ClaudeCodeAdapter {
|
|
18
|
+
agentName = 'Claude Code';
|
|
19
|
+
fileMtimeCache = new Map();
|
|
20
|
+
memoryCache = new Map();
|
|
21
|
+
findProjectsDir() {
|
|
22
|
+
const defaultDir = path.join(os.homedir(), '.claude', 'projects');
|
|
23
|
+
if (fs.existsSync(defaultDir)) {
|
|
24
|
+
return defaultDir;
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
scan() {
|
|
29
|
+
const dir = this.findProjectsDir();
|
|
30
|
+
if (!dir)
|
|
31
|
+
return [];
|
|
32
|
+
const invocations = [];
|
|
33
|
+
const files = [];
|
|
34
|
+
const walk = (d) => {
|
|
35
|
+
try {
|
|
36
|
+
for (const item of fs.readdirSync(d, { withFileTypes: true })) {
|
|
37
|
+
const full = path.join(d, item.name);
|
|
38
|
+
if (item.isDirectory()) {
|
|
39
|
+
walk(full);
|
|
40
|
+
}
|
|
41
|
+
else if (item.isFile() && item.name.endsWith('.jsonl')) {
|
|
42
|
+
files.push(full);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch { }
|
|
47
|
+
};
|
|
48
|
+
walk(dir);
|
|
49
|
+
for (const filePath of files) {
|
|
50
|
+
try {
|
|
51
|
+
const stat = fs.statSync(filePath);
|
|
52
|
+
const prevMtime = this.fileMtimeCache.get(filePath);
|
|
53
|
+
if (prevMtime === stat.mtimeMs && this.memoryCache.has(filePath)) {
|
|
54
|
+
// File has not changed since last scan, reuse parsed invocations
|
|
55
|
+
invocations.push(...this.memoryCache.get(filePath));
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const fileInvocations = [];
|
|
59
|
+
this.parseFile(filePath, fileInvocations);
|
|
60
|
+
this.fileMtimeCache.set(filePath, stat.mtimeMs);
|
|
61
|
+
this.memoryCache.set(filePath, fileInvocations);
|
|
62
|
+
invocations.push(...fileInvocations);
|
|
63
|
+
}
|
|
64
|
+
catch { }
|
|
65
|
+
}
|
|
66
|
+
return invocations;
|
|
67
|
+
}
|
|
68
|
+
parseFile(filePath, results) {
|
|
69
|
+
try {
|
|
70
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
71
|
+
const lines = content.split('\n');
|
|
72
|
+
let currentSessionId = path.basename(filePath, '.jsonl');
|
|
73
|
+
let currentModel = 'claude-3-5-sonnet';
|
|
74
|
+
let roundCounter = 0;
|
|
75
|
+
for (const line of lines) {
|
|
76
|
+
if (!line.trim())
|
|
77
|
+
continue;
|
|
78
|
+
try {
|
|
79
|
+
const obj = JSON.parse(line);
|
|
80
|
+
if (obj.sessionId)
|
|
81
|
+
currentSessionId = obj.sessionId;
|
|
82
|
+
if (obj.message?.model)
|
|
83
|
+
currentModel = obj.message.model;
|
|
84
|
+
if (obj.model)
|
|
85
|
+
currentModel = obj.model;
|
|
86
|
+
// 1. Tool Call Detection: tool_use name='Skill'
|
|
87
|
+
if (obj.message?.content && Array.isArray(obj.message.content)) {
|
|
88
|
+
for (const item of obj.message.content) {
|
|
89
|
+
if (item.type === 'tool_use' && (item.name === 'Skill' || item.name?.startsWith('anthropic-skills:') || item.name?.includes('skill'))) {
|
|
90
|
+
roundCounter++;
|
|
91
|
+
const rawSkill = (item.input?.skill || item.name || 'unknown').toString();
|
|
92
|
+
const skillId = rawSkill.replace(/^anthropic-skills:/, '');
|
|
93
|
+
const skillName = KNOWN_SLASH_COMMANDS[skillId] || skillId;
|
|
94
|
+
const usage = obj.message?.usage;
|
|
95
|
+
const inputTokens = usage?.input_tokens || 0;
|
|
96
|
+
const outputTokens = usage?.output_tokens || 0;
|
|
97
|
+
const totalTokens = inputTokens + outputTokens;
|
|
98
|
+
results.push({
|
|
99
|
+
session_id: currentSessionId,
|
|
100
|
+
agent_name: 'Claude Code',
|
|
101
|
+
model_name: currentModel,
|
|
102
|
+
skill_id: skillId,
|
|
103
|
+
skill_name: skillName,
|
|
104
|
+
round_index: roundCounter,
|
|
105
|
+
trigger_mode: 'explicit',
|
|
106
|
+
status: 'success',
|
|
107
|
+
actual_tokens: totalTokens,
|
|
108
|
+
context_tokens: inputTokens,
|
|
109
|
+
output_tokens: outputTokens,
|
|
110
|
+
actual_steps: 1,
|
|
111
|
+
timestamp: obj.timestamp || new Date().toISOString(),
|
|
112
|
+
metadata: {
|
|
113
|
+
source: 'claude_code_history_parser',
|
|
114
|
+
tool_use_id: item.id,
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// 2. User Prompt Slash Command Detection (e.g. /code-review, /frontend-design)
|
|
121
|
+
if (obj.type === 'user' && obj.message?.content) {
|
|
122
|
+
let promptText = '';
|
|
123
|
+
if (typeof obj.message.content === 'string') {
|
|
124
|
+
promptText = obj.message.content;
|
|
125
|
+
}
|
|
126
|
+
else if (Array.isArray(obj.message.content)) {
|
|
127
|
+
promptText = obj.message.content
|
|
128
|
+
.filter((c) => c.type === 'text')
|
|
129
|
+
.map((c) => c.text)
|
|
130
|
+
.join(' ');
|
|
131
|
+
}
|
|
132
|
+
for (const [cmd, displayName] of Object.entries(KNOWN_SLASH_COMMANDS)) {
|
|
133
|
+
const slashRegex = new RegExp(`^\\s*\\/${cmd}\\b`, 'i');
|
|
134
|
+
if (slashRegex.test(promptText)) {
|
|
135
|
+
roundCounter++;
|
|
136
|
+
results.push({
|
|
137
|
+
session_id: currentSessionId,
|
|
138
|
+
agent_name: 'Claude Code',
|
|
139
|
+
model_name: currentModel,
|
|
140
|
+
skill_id: cmd,
|
|
141
|
+
skill_name: displayName,
|
|
142
|
+
round_index: roundCounter,
|
|
143
|
+
trigger_mode: 'explicit',
|
|
144
|
+
status: 'success',
|
|
145
|
+
actual_tokens: 3500,
|
|
146
|
+
context_tokens: 3000,
|
|
147
|
+
output_tokens: 500,
|
|
148
|
+
actual_steps: 1,
|
|
149
|
+
timestamp: obj.timestamp || new Date().toISOString(),
|
|
150
|
+
metadata: {
|
|
151
|
+
source: 'claude_code_slash_command',
|
|
152
|
+
prompt_snippet: promptText.substring(0, 50),
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch { }
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch { }
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=claude-code.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.adapter.js","sourceRoot":"","sources":["../../src/adapters/claude-code.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAGzB,MAAM,oBAAoB,GAA2B;IACnD,aAAa,EAAE,aAAa;IAC5B,iBAAiB,EAAE,iBAAiB;IACpC,UAAU,EAAE,qBAAqB;IACjC,iBAAiB,EAAE,iBAAiB;IACpC,eAAe,EAAE,eAAe;IAChC,MAAM,EAAE,yBAAyB;IACjC,MAAM,EAAE,6BAA6B;IACrC,MAAM,EAAE,sBAAsB;IAC9B,aAAa,EAAE,eAAe;IAC9B,SAAS,EAAE,2BAA2B;IACtC,oBAAoB,EAAE,oBAAoB;CAC3C,CAAC;AAEF,MAAM,OAAO,iBAAiB;IACnB,SAAS,GAAG,aAAa,CAAC;IAC3B,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,WAAW,GAAG,IAAI,GAAG,EAAuC,CAAC;IAE7D,eAAe;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAClE,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QAEpB,MAAM,WAAW,GAAgC,EAAE,CAAC;QACpD,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE;YACzB,IAAI,CAAC;gBACH,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;oBAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;oBACrC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;wBACvB,IAAI,CAAC,IAAI,CAAC,CAAC;oBACb,CAAC;yBAAM,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACzD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACnB,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACnC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAEpD,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACjE,iEAAiE;oBACjE,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,CAAC;oBACrD,SAAS;gBACX,CAAC;gBAED,MAAM,eAAe,GAAgC,EAAE,CAAC;gBACxD,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;gBAE1C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBAChD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;gBAChD,WAAW,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAEO,SAAS,CAAC,QAAgB,EAAE,OAAoC;QACtE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAElC,IAAI,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACzD,IAAI,YAAY,GAAG,mBAAmB,CAAC;YACvC,IAAI,YAAY,GAAG,CAAC,CAAC;YAErB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;oBAAE,SAAS;gBAC3B,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC7B,IAAI,GAAG,CAAC,SAAS;wBAAE,gBAAgB,GAAG,GAAG,CAAC,SAAS,CAAC;oBACpD,IAAI,GAAG,CAAC,OAAO,EAAE,KAAK;wBAAE,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;oBACzD,IAAI,GAAG,CAAC,KAAK;wBAAE,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC;oBAExC,gDAAgD;oBAChD,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC/D,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;4BACvC,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gCACtI,YAAY,EAAE,CAAC;gCACf,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;gCAC1E,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;gCAC3D,MAAM,SAAS,GAAG,oBAAoB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;gCAC3D,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;gCACjC,MAAM,WAAW,GAAG,KAAK,EAAE,YAAY,IAAI,CAAC,CAAC;gCAC7C,MAAM,YAAY,GAAG,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC;gCAC/C,MAAM,WAAW,GAAG,WAAW,GAAG,YAAY,CAAC;gCAE/C,OAAO,CAAC,IAAI,CAAC;oCACX,UAAU,EAAE,gBAAgB;oCAC5B,UAAU,EAAE,aAAa;oCACzB,UAAU,EAAE,YAAY;oCACxB,QAAQ,EAAE,OAAO;oCACjB,UAAU,EAAE,SAAS;oCACrB,WAAW,EAAE,YAAY;oCACzB,YAAY,EAAE,UAAU;oCACxB,MAAM,EAAE,SAAS;oCACjB,aAAa,EAAE,WAAW;oCAC1B,cAAc,EAAE,WAAW;oCAC3B,aAAa,EAAE,YAAY;oCAC3B,YAAY,EAAE,CAAC;oCACf,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oCACpD,QAAQ,EAAE;wCACR,MAAM,EAAE,4BAA4B;wCACpC,WAAW,EAAE,IAAI,CAAC,EAAE;qCACrB;iCACF,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,+EAA+E;oBAC/E,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;wBAChD,IAAI,UAAU,GAAG,EAAE,CAAC;wBACpB,IAAI,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;4BAC5C,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;wBACnC,CAAC;6BAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;4BAC9C,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO;iCAC7B,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iCACrC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iCACvB,IAAI,CAAC,GAAG,CAAC,CAAC;wBACf,CAAC;wBAED,KAAK,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;4BACtE,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,WAAW,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC;4BACxD,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gCAChC,YAAY,EAAE,CAAC;gCACf,OAAO,CAAC,IAAI,CAAC;oCACX,UAAU,EAAE,gBAAgB;oCAC5B,UAAU,EAAE,aAAa;oCACzB,UAAU,EAAE,YAAY;oCACxB,QAAQ,EAAE,GAAG;oCACb,UAAU,EAAE,WAAW;oCACvB,WAAW,EAAE,YAAY;oCACzB,YAAY,EAAE,UAAU;oCACxB,MAAM,EAAE,SAAS;oCACjB,aAAa,EAAE,IAAI;oCACnB,cAAc,EAAE,IAAI;oCACpB,aAAa,EAAE,GAAG;oCAClB,YAAY,EAAE,CAAC;oCACf,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oCACpD,QAAQ,EAAE;wCACR,MAAM,EAAE,2BAA2B;wCACnC,cAAc,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;qCAC5C;iCACF,CAAC,CAAC;gCACH,MAAM;4BACR,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACZ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AgentHistoryAdapter, DiscoveredSkillInvocation } from './types.js';
|
|
2
|
+
export declare class CodexAdapter implements AgentHistoryAdapter {
|
|
3
|
+
readonly agentName = "Codex";
|
|
4
|
+
private fileMtimeCache;
|
|
5
|
+
private memoryCache;
|
|
6
|
+
private findSessionsDir;
|
|
7
|
+
scan(): DiscoveredSkillInvocation[];
|
|
8
|
+
private parseRollout;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=codex.adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/codex.adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5E,qBAAa,YAAa,YAAW,mBAAmB;IACtD,QAAQ,CAAC,SAAS,WAAW;IAC7B,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,WAAW,CAAkD;IAErE,OAAO,CAAC,eAAe;IAQvB,IAAI,IAAI,yBAAyB,EAAE;IA4CnC,OAAO,CAAC,YAAY;CAmDrB"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
export class CodexAdapter {
|
|
5
|
+
agentName = 'Codex';
|
|
6
|
+
fileMtimeCache = new Map();
|
|
7
|
+
memoryCache = new Map();
|
|
8
|
+
findSessionsDir() {
|
|
9
|
+
const defaultDir = path.join(os.homedir(), '.codex', 'sessions');
|
|
10
|
+
if (fs.existsSync(defaultDir)) {
|
|
11
|
+
return defaultDir;
|
|
12
|
+
}
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
scan() {
|
|
16
|
+
const dir = this.findSessionsDir();
|
|
17
|
+
if (!dir)
|
|
18
|
+
return [];
|
|
19
|
+
const invocations = [];
|
|
20
|
+
const files = [];
|
|
21
|
+
const walk = (d) => {
|
|
22
|
+
try {
|
|
23
|
+
for (const item of fs.readdirSync(d, { withFileTypes: true })) {
|
|
24
|
+
const full = path.join(d, item.name);
|
|
25
|
+
if (item.isDirectory()) {
|
|
26
|
+
walk(full);
|
|
27
|
+
}
|
|
28
|
+
else if (item.isFile() && item.name.endsWith('.jsonl') && item.name.startsWith('rollout-')) {
|
|
29
|
+
files.push(full);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch { }
|
|
34
|
+
};
|
|
35
|
+
walk(dir);
|
|
36
|
+
for (const filePath of files) {
|
|
37
|
+
try {
|
|
38
|
+
const stat = fs.statSync(filePath);
|
|
39
|
+
const prevMtime = this.fileMtimeCache.get(filePath);
|
|
40
|
+
if (prevMtime === stat.mtimeMs && this.memoryCache.has(filePath)) {
|
|
41
|
+
invocations.push(...this.memoryCache.get(filePath));
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const fileInvocations = [];
|
|
45
|
+
this.parseRollout(filePath, fileInvocations);
|
|
46
|
+
this.fileMtimeCache.set(filePath, stat.mtimeMs);
|
|
47
|
+
this.memoryCache.set(filePath, fileInvocations);
|
|
48
|
+
invocations.push(...fileInvocations);
|
|
49
|
+
}
|
|
50
|
+
catch { }
|
|
51
|
+
}
|
|
52
|
+
return invocations;
|
|
53
|
+
}
|
|
54
|
+
parseRollout(filePath, results) {
|
|
55
|
+
try {
|
|
56
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
57
|
+
const lines = content.split('\n');
|
|
58
|
+
let sessionId = path.basename(filePath, '.jsonl');
|
|
59
|
+
let timestamp = new Date().toISOString();
|
|
60
|
+
let model = 'gpt-5';
|
|
61
|
+
let roundCounter = 0;
|
|
62
|
+
for (const line of lines) {
|
|
63
|
+
if (!line.trim())
|
|
64
|
+
continue;
|
|
65
|
+
try {
|
|
66
|
+
const obj = JSON.parse(line);
|
|
67
|
+
if (obj.payload?.session_id)
|
|
68
|
+
sessionId = obj.payload.session_id;
|
|
69
|
+
if (obj.timestamp)
|
|
70
|
+
timestamp = obj.timestamp;
|
|
71
|
+
if (obj.payload?.model_provider)
|
|
72
|
+
model = obj.payload.model_provider;
|
|
73
|
+
if (obj.payload?.base_instructions?.provenance?.model) {
|
|
74
|
+
model = obj.payload.base_instructions.provenance.model;
|
|
75
|
+
}
|
|
76
|
+
// Search for tool execution or custom skill in payload
|
|
77
|
+
const payloadStr = JSON.stringify(obj.payload || {});
|
|
78
|
+
if (payloadStr.includes('skill') || payloadStr.includes('review') || payloadStr.includes('design') || payloadStr.includes('format')) {
|
|
79
|
+
roundCounter++;
|
|
80
|
+
const skillId = 'codex-agentic-skill';
|
|
81
|
+
results.push({
|
|
82
|
+
session_id: sessionId,
|
|
83
|
+
agent_name: 'Codex',
|
|
84
|
+
model_name: model,
|
|
85
|
+
skill_id: skillId,
|
|
86
|
+
skill_name: 'Codex Agentic Workflow',
|
|
87
|
+
round_index: roundCounter,
|
|
88
|
+
trigger_mode: 'explicit',
|
|
89
|
+
status: 'success',
|
|
90
|
+
actual_tokens: 4500,
|
|
91
|
+
context_tokens: 3800,
|
|
92
|
+
output_tokens: 700,
|
|
93
|
+
actual_steps: 1,
|
|
94
|
+
timestamp,
|
|
95
|
+
metadata: {
|
|
96
|
+
source: 'codex_rollout_parser',
|
|
97
|
+
file: path.basename(filePath),
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
break; // Record once per session rollout
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch { }
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch { }
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=codex.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.adapter.js","sourceRoot":"","sources":["../../src/adapters/codex.adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { AgentHistoryAdapter, DiscoveredSkillInvocation } from './types.js';
|
|
2
|
+
export declare class DshAdapter implements AgentHistoryAdapter {
|
|
3
|
+
readonly agentName = "DSH";
|
|
4
|
+
private findSessionsDir;
|
|
5
|
+
scan(): DiscoveredSkillInvocation[];
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=dsh.adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dsh.adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/dsh.adapter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5E,qBAAa,UAAW,YAAW,mBAAmB;IACpD,QAAQ,CAAC,SAAS,SAAS;IAE3B,OAAO,CAAC,eAAe;IAQvB,IAAI,IAAI,yBAAyB,EAAE;CA+CpC"}
|