@bgicli/bgicli 2.4.3 → 2.4.5

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.
Files changed (3) hide show
  1. package/README.md +54 -41
  2. package/dist/bgi.js +195 -79
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  **BGI CLI** 是面向中国生物学研究者的 AI 终端工具,开箱即用,无需额外配置。
4
4
 
5
- - ✅ **开箱即用** — `npm install -g @bgicli/bgicli` 即可
6
- - ✅ **内置 889 个技能** — 21 个生信工作流 + 868 个 OpenClaw 医学技能,自动安装
5
+ - ✅ **开箱即用** — clone 仓库后一键安装即可
6
+ - ✅ **内置 1001 个技能** — 涵盖生信分析、结构生物学、药物发现、临床等全领域,自动安装
7
7
  - ✅ **智能技能路由** — 描述任务自动激活对应技能,无需手动搜索
8
8
  - ✅ **中国 AI 服务商** — 百炼(DashScope)聚合:Qwen、DeepSeek、Kimi、MiniMax 等 20+ 模型
9
9
  - ✅ **真实工具调用** — 执行 bash、读写文件、运行 R/Python 脚本
@@ -13,26 +13,43 @@
13
13
 
14
14
  ## 安装
15
15
 
16
+ **环境要求:** Node.js 18+
17
+
16
18
  ```bash
17
- # 需要 Node.js 18+
18
- npm install -g @bgicli/bgicli --registry https://registry.npmjs.org
19
+ git clone https://gitlab.genomics.cn/ai/bgi-cli.git
20
+ cd bgi-cli
21
+ npm install
22
+ npm run build
23
+ sudo npm link
19
24
  ```
20
25
 
21
- 首次运行自动初始化工作流和技能库(约 16MB),无需额外操作。
26
+ > **macOS / Linux 无 root 权限时**,`npm link` 可能报 EACCES 权限错误,需先配置 npm 用户目录:
27
+ > ```bash
28
+ > mkdir -p ~/.npm-global
29
+ > npm config set prefix '~/.npm-global'
30
+ > echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc # zsh 用户改为 ~/.zshrc
31
+ > source ~/.bashrc
32
+ > npm link # 再次执行
33
+ > ```
34
+
35
+ 安装完成后直接运行:
22
36
 
23
37
  ```bash
24
38
  bgi
25
39
  ```
26
40
 
41
+ 首次运行自动初始化技能库(约 16MB),无需额外操作。
42
+
27
43
  ---
28
44
 
29
45
  ## 卸载
30
46
 
31
47
  ```bash
32
- # 卸载 npm 包
33
- npm uninstall -g @bgicli/bgicli
48
+ # 卸载命令行工具
49
+ cd bgi-cli
50
+ npm unlink
34
51
 
35
- # 删除本地数据(配置、工作流、技能库)
52
+ # 删除本地数据(配置、技能库)
36
53
  # Linux / macOS
37
54
  rm -rf ~/.bgicli
38
55
 
@@ -48,7 +65,7 @@ Remove-Item -Recurse -Force "$env:USERPROFILE\.bgicli"
48
65
  bgi # 启动
49
66
  /connect # 首次配置 API Key
50
67
  /cat # 浏览技能分类目录
51
- /sk deseq2 # 搜索并激活 DESeq2 工作流
68
+ /sk deseq2 # 搜索并激活 DESeq2 技能
52
69
  /help # 查看全部命令
53
70
  ```
54
71
 
@@ -65,11 +82,16 @@ bgi # 启动
65
82
  | 模型 | 命令 |
66
83
  |------|------|
67
84
  | Qwen3.5-plus(默认) | `/model qwen3.5-plus` |
85
+ | Qwen3.5-397B(旗舰) | `/model qwen3.5-397b-a17b` |
68
86
  | Qwen3-235B | `/model qwen3-235b-a22b` |
69
- | DeepSeek-R1 | `/model deepseek-r1` |
87
+ | Qwen3-Coder-Plus | `/model qwen3-coder-plus` |
88
+ | DeepSeek-R1(推理) | `/model deepseek-r1` |
70
89
  | DeepSeek-V3 | `/model deepseek-v3` |
90
+ | DeepSeek-V3.2 | `/model deepseek-v3.2` |
71
91
  | Kimi-K2.5 | `/model kimi-k2.5` |
92
+ | Kimi-K2-Thinking(推理) | `/model kimi-k2-thinking` |
72
93
  | MiniMax-M2.5 | `/model MiniMax-M2.5` |
94
+ | GLM-5 | `/model glm-5` |
73
95
  | QwQ-Plus(推理) | `/model qwq-plus` |
74
96
 
75
97
  获取 API Key:[bailian.console.aliyun.com](https://bailian.console.aliyun.com/)
@@ -98,13 +120,15 @@ bgi # 启动
98
120
  | `/connect [provider]` | 配置 API Key |
99
121
  | `/status` | 显示当前配置 |
100
122
 
101
- ### 技能与工作流
123
+ ### 技能
102
124
  | 命令 | 说明 |
103
125
  |------|------|
104
126
  | `/cat` | 按领域浏览技能分类目录(11个领域) |
105
- | `/sk` | 列出全部技能(工作流 + OpenClaw Medical) |
127
+ | `/sk` | 列出全部技能 |
106
128
  | `/sk <关键词>` | 搜索并激活技能(如 `/sk deseq2`、`/sk alphafold`) |
107
129
  | `/wf` | 同 `/sk`,别名 |
130
+ | `/install <url\|slug>` | 从 GitHub 或 SkillHub 安装新技能 |
131
+ | `/uninstall <id>` | 卸载已安装的技能 |
108
132
 
109
133
  > **智能路由**:直接描述任务,BGI CLI 自动识别并激活对应技能。
110
134
 
@@ -176,13 +200,13 @@ bgi # 启动
176
200
 
177
201
  ---
178
202
 
179
- ## 内置技能库
203
+ ## 内置技能库(1001个)
180
204
 
181
- ### 生物信息学工作流(21个)
205
+ 使用 `/cat` 浏览分类目录,`/sk <关键词>` 搜索,`/install` 安装更多技能。
182
206
 
183
- #### 转录组学
184
- | ID | 说明 |
185
- |----|------|
207
+ ### 🧬 转录组学
208
+ | 技能 ID | 说明 |
209
+ |---------|------|
186
210
  | `bulk-rnaseq-counts-to-de-deseq2` | DESeq2 差异表达分析 |
187
211
  | `bulk-omics-clustering` | 样本/特征聚类(K-Means / HDBSCAN) |
188
212
  | `scrnaseq-scanpy-core-analysis` | 单细胞 RNA-seq(Scanpy/Python) |
@@ -192,46 +216,35 @@ bgi # 启动
192
216
  | `functional-enrichment-from-degs` | 功能富集(GO / KEGG / GSEA) |
193
217
  | `grn-pyscenic` | 基因调控网络(pySCENIC) |
194
218
 
195
- #### 基因组学
196
- | ID | 说明 |
197
- |----|------|
219
+ ### 🧪 基因组学
220
+ | 技能 ID | 说明 |
221
+ |---------|------|
198
222
  | `genetic-variant-annotation` | VCF 变异注释(VEP / ANNOVAR) |
199
223
  | `gwas-to-function-twas` | GWAS → TWAS 因果基因 |
200
224
  | `mendelian-randomization-twosamplemr` | 孟德尔随机化 |
201
225
  | `polygenic-risk-score-prs-catalog` | 多基因风险评分(PRS) |
202
226
  | `pooled-crispr-screens` | CRISPR 文库筛选(MAGeCK / BAGEL2) |
203
227
 
204
- #### 表观基因组
205
- | ID | 说明 |
206
- |----|------|
228
+ ### 🔗 表观基因组
229
+ | 技能 ID | 说明 |
230
+ |---------|------|
207
231
  | `chip-atlas-peak-enrichment` | ChIP-seq 峰值富集 |
208
232
  | `chip-atlas-diff-analysis` | 差异结合分析 |
209
233
  | `chip-atlas-target-genes` | 转录因子靶基因鉴定 |
210
234
 
211
- #### 临床与流行病学
212
- | ID | 说明 |
213
- |----|------|
235
+ ### 🏥 临床与流行病学
236
+ | 技能 ID | 说明 |
237
+ |---------|------|
238
+ | `survival-analysis-clinical` | 临床生存分析(KM 曲线 / Cox 回归 / 竞争风险) |
214
239
  | `clinicaltrials-landscape` | 临床试验格局分析 |
215
240
  | `literature-preclinical` | 临床前文献系统提取 |
216
241
  | `experimental-design-statistics` | 实验设计与统计检验 |
217
242
  | `lasso-biomarker-panel` | LASSO 生物标志物筛选 |
218
243
  | `pcr-primer-design` | PCR/qPCR 引物设计 |
219
244
 
220
- ### OpenClaw Medical Skills(868个)
221
-
222
- 覆盖结构生物学、单细胞、药物发现、抗体设计、文献检索等领域,使用 `/cat` 浏览分类目录。
245
+ ### 📦 更多技能(979个)
223
246
 
224
- ---
225
-
226
- ## 从源码安装
227
-
228
- ```bash
229
- git clone https://github.com/zja2004/BGI-CLI.git
230
- cd BGI-CLI
231
- npm install
232
- npm run build
233
- npm link
234
- ```
247
+ 结构生物学、单细胞、药物发现、抗体设计、文献检索、临床 AI 等,使用 `/cat` 或 `/sk <关键词>` 查找。
235
248
 
236
249
  ---
237
250
 
@@ -248,7 +261,7 @@ bgi
248
261
  ├── src/prompt.ts — 生物信息学系统提示
249
262
  ├── src/providers.ts — 中国 AI 服务商配置
250
263
  ├── src/config.ts — 配置管理(~/.bgicli/config.json)
251
- └── data/ — 内置数据(工作流 + Skills + Python 工具)
264
+ └── data/ — 内置数据(Skills + Python 工具)
252
265
  ```
253
266
 
254
267
  ---
package/dist/bgi.js CHANGED
@@ -13868,7 +13868,7 @@ var TOOL_DEFINITIONS = [
13868
13868
  type: "function",
13869
13869
  function: {
13870
13870
  name: "read_file",
13871
- description: "Read the contents of a file. Use to inspect data files, SKILL.md workflow guides, R/Python scripts, results files, etc.",
13871
+ description: "Read the contents of a file. Use to inspect data files, SKILL.md guides, R/Python scripts, results files, etc.",
13872
13872
  parameters: {
13873
13873
  type: "object",
13874
13874
  properties: {
@@ -13919,7 +13919,7 @@ var TOOL_DEFINITIONS = [
13919
13919
  type: "function",
13920
13920
  function: {
13921
13921
  name: "search_files",
13922
- description: "Search for files matching a pattern using glob syntax. Use to find scripts, data files, or workflow references.",
13922
+ description: "Search for files matching a pattern using glob syntax. Use to find scripts, data files, or skill references.",
13923
13923
  parameters: {
13924
13924
  type: "object",
13925
13925
  properties: {
@@ -14561,7 +14561,7 @@ async function compactMessages(messages, config) {
14561
14561
  messages: [
14562
14562
  {
14563
14563
  role: "system",
14564
- content: "\u4F60\u662F\u4E00\u4E2A\u5BF9\u8BDD\u6458\u8981\u52A9\u624B\u3002\u8BF7\u5C06\u4EE5\u4E0B\u5BF9\u8BDD\u5386\u53F2\u538B\u7F29\u4E3A\u7B80\u6D01\u7684\u4E2D\u6587\u6458\u8981\uFF0C\u4FDD\u7559\u6240\u6709\u5173\u952E\u6280\u672F\u4FE1\u606F\uFF1A\u6587\u4EF6\u8DEF\u5F84\u3001\u547D\u4EE4\u3001\u5206\u6790\u7ED3\u679C\u3001\u7528\u6237\u51B3\u7B56\u3001\u5DF2\u6FC0\u6D3B\u7684\u5DE5\u4F5C\u6D41/\u6280\u80FD\u3002\u6458\u8981\u5E94\u8BA9\u5BF9\u8BDD\u80FD\u591F\u65E0\u7F1D\u7EE7\u7EED\u3002"
14564
+ content: "\u4F60\u662F\u4E00\u4E2A\u5BF9\u8BDD\u6458\u8981\u52A9\u624B\u3002\u8BF7\u5C06\u4EE5\u4E0B\u5BF9\u8BDD\u5386\u53F2\u538B\u7F29\u4E3A\u7B80\u6D01\u7684\u4E2D\u6587\u6458\u8981\uFF0C\u4FDD\u7559\u6240\u6709\u5173\u952E\u6280\u672F\u4FE1\u606F\uFF1A\u6587\u4EF6\u8DEF\u5F84\u3001\u547D\u4EE4\u3001\u5206\u6790\u7ED3\u679C\u3001\u7528\u6237\u51B3\u7B56\u3001\u5DF2\u6FC0\u6D3B\u7684\u6280\u80FD\u3002\u6458\u8981\u5E94\u8BA9\u5BF9\u8BDD\u80FD\u591F\u65E0\u7F1D\u7EE7\u7EED\u3002"
14565
14565
  },
14566
14566
  {
14567
14567
  role: "user",
@@ -14603,7 +14603,7 @@ function buildSystemPrompt(dbSection) {
14603
14603
  ## Core Identity
14604
14604
  - You are purpose-built for bioinformatics, NOT a general coding assistant
14605
14605
  - You default to speaking Chinese unless the user writes in English
14606
- - You always prefer using existing, validated workflow scripts over writing new code from scratch
14606
+ - You always prefer using existing, validated skill scripts over writing new code from scratch
14607
14607
  - You are pragmatic: suggest concrete commands, not theory
14608
14608
 
14609
14609
  ---
@@ -14611,26 +14611,53 @@ function buildSystemPrompt(dbSection) {
14611
14611
  ## Tool Use Policy
14612
14612
  You have access to these tools:
14613
14613
  - **bash**: Execute shell commands (R, Python, bash scripts, bioinformatics tools)
14614
- - **read_file**: Read any file (scripts, data files, SKILL.md workflow guides)
14614
+ - **read_file**: Read any file (scripts, data files, SKILL.md guides)
14615
14615
  - **write_file**: Create or update files
14616
14616
  - **list_dir**: List directory contents
14617
14617
  - **search_files**: Find files by pattern (glob)
14618
14618
  - **fetch_geo**: Query NCBI GEO database by accession (GSE/GDS/GPL/GSM). Returns metadata, sample info, organism, platform, and ready-to-use R/Python download code. **Always call this first when the user mentions a GEO accession number \u2014 never ask them to download manually.**
14619
14619
 
14620
- **MANDATORY WORKFLOW**: When the user gives you a bioinformatics task:
14621
- 1. Check if a matching pre-built workflow exists (see Workflow Library below)
14622
- 2. If yes: read the workflow's SKILL.md first, then follow it strictly
14623
- 3. If no: plan a principled approach and explain your reasoning
14620
+ ## \u26A1 SKILL-FIRST PROTOCOL\uFF08\u5F3A\u5236\u6267\u884C\uFF0C\u4E0D\u53EF\u8DF3\u8FC7\uFF09
14621
+
14622
+ \u5F53\u7528\u6237\u63D0\u51FA\u4EFB\u4F55\u751F\u7269\u4FE1\u606F\u5B66 / \u836F\u7269\u53D1\u73B0 / \u4E34\u5E8A\u5206\u6790\u4EFB\u52A1\u65F6\uFF0C**\u5FC5\u987B\u4E25\u683C\u6309\u4EE5\u4E0B\u987A\u5E8F\u6267\u884C\uFF0C\u7981\u6B62\u4E71\u5E8F**\uFF1A
14623
+
14624
+ **\u7B2C\u4E00\u6B65 \u2014 \u8BC6\u522B\u6280\u80FD\uFF08\u5728\u8F93\u51FA\u4EFB\u4F55\u6B63\u6587\u524D\uFF09**
14625
+ \u626B\u63CF\u4E0B\u65B9 Skill Library\uFF0C\u627E\u51FA\u6240\u6709\u4E0E\u7528\u6237\u4EFB\u52A1\u76F8\u5173\u7684\u6280\u80FD\u3002\u5982\u679C Skill Library \u6CA1\u6709\u7CBE\u786E\u5339\u914D\uFF0C\u4E5F\u5E94\u641C\u7D22 Extended Skills \u76EE\u5F55\u3002
14626
+
14627
+ **\u7B2C\u4E8C\u6B65 \u2014 \u5C55\u793A\u5019\u9009\u6280\u80FD\u5E76\u8BF7\u7528\u6237\u786E\u8BA4**
14628
+ \u7528\u5982\u4E0B\u683C\u5F0F\uFF08\u4E2D\u6587\uFF09\u544A\u77E5\u7528\u6237\uFF0C**\u4E0D\u8981\u5148\u505A\u5176\u4ED6\u4E8B**\uFF1A
14629
+ > \u{1F50D} \u68C0\u6D4B\u5230\u4EE5\u4E0B\u76F8\u5173\u6280\u80FD\uFF1A
14630
+ >
14631
+ > \u2022 \`skill-id-1\` \u2014 **[\u6280\u80FD\u540D\u79F0]**\uFF1A[\u4E00\u53E5\u8BDD\u8BF4\u660E\u4E3A\u4F55\u5339\u914D\u8BE5\u4EFB\u52A1]
14632
+ > \u2022 \`skill-id-2\` \u2014 **[\u6280\u80FD\u540D\u79F0]**\uFF1A[\u4E00\u53E5\u8BDD\u8BF4\u660E]
14633
+ >
14634
+ > \u662F\u5426\u6FC0\u6D3B\u8FD9\u4E9B\u6280\u80FD\u5F00\u59CB\u5206\u6790\uFF1F
14635
+
14636
+ **\u7B2C\u4E09\u6B65 \u2014 \u6FC0\u6D3B\u6280\u80FD\uFF0C\u8BFB\u53D6 SKILL.md**
14637
+ \u7528\u6237\u786E\u8BA4\u540E\u7ACB\u5373\u6267\u884C\uFF1A\`cat ${WORKFLOWS_DIR}/<skill-id>/SKILL.md\`
14638
+ \u4E25\u683C\u6309\u7167 SKILL.md \u7684\u6BCF\u4E00\u6B65\u6267\u884C\uFF0C\u4E0D\u8DF3\u8FC7\u3001\u4E0D\u81EA\u884C\u53D1\u6325\u3002
14639
+
14640
+ **\u7B2C\u56DB\u6B65 \u2014 \u53EA\u95EE\u771F\u6B63\u5FC5\u8981\u7684\u6570\u636E\u95EE\u9898**
14641
+ SKILL.md \u8BFB\u5B8C\u540E\uFF0C\u53EA\u8BE2\u95EE\u6267\u884C\u6240\u9700\u7684\u5173\u952E\u4FE1\u606F\uFF08\u5982\u672C\u5730\u6587\u4EF6\u8DEF\u5F84\u3001\u6837\u672C\u5206\u7EC4\u540D\uFF09\u3002
14642
+
14643
+ \u274C **\u7EDD\u5BF9\u7981\u6B62**\uFF1A\u5728\u5B8C\u6210\u7B2C\u4E00\u6B65\uFF08\u8BC6\u522B\u6280\u80FD\uFF09\u4E4B\u524D\uFF0C\u8BE2\u95EE\u901A\u7528\u6570\u636E\u6536\u96C6\u95EE\u9898\u3002
14644
+ \u4F8B\u5982\u4E0B\u5217\u63D0\u95EE\u65B9\u5F0F\u662F**\u9519\u8BEF\u7684**\uFF0C\u5FC5\u987B\u907F\u514D\uFF1A
14645
+ - "\u60A8\u6709 GEO \u6570\u636E\u96C6\u5417\uFF1F"
14646
+ - "\u6570\u636E\u6765\u6E90\u662F\u4EC0\u4E48\uFF1F"
14647
+ - "\u60A8\u7684\u6570\u636E\u683C\u5F0F\u662F\u4EC0\u4E48\uFF1F"
14648
+ - "\u8BF7\u63D0\u4F9B\u4EE5\u4E0B\u4FE1\u606F\uFF1A1. \u6570\u636E\u6765\u6E90 2. \u6570\u636E\u5185\u5BB9 ..."
14649
+
14650
+ \u5982\u679C\u5B9E\u5728\u627E\u4E0D\u5230\u4EFB\u4F55\u5339\u914D\u6280\u80FD\uFF0C\u624D\u5141\u8BB8\u63D0\u95EE\u5E76\u8BF4\u660E\u7406\u7531\u3002
14624
14651
 
14625
14652
  ---
14626
14653
 
14627
- ## Workflow Library (21 Workflows)
14654
+ ## Skill Library (22 Bioinformatics Skills)
14628
14655
 
14629
- All workflows are at: **${WORKFLOWS_DIR}**
14656
+ All skills are at: **${WORKFLOWS_DIR}**
14630
14657
 
14631
- For any workflow, read its guide first:
14658
+ For any skill, read its guide first:
14632
14659
  \`\`\`bash
14633
- cat ${WORKFLOWS_DIR}/<workflow-id>/SKILL.md
14660
+ cat ${WORKFLOWS_DIR}/<skill-id>/SKILL.md
14634
14661
  \`\`\`
14635
14662
 
14636
14663
  ### \u{1F9EC} Transcriptomics
@@ -14677,7 +14704,7 @@ cat ${WORKFLOWS_DIR}/<workflow-id>/SKILL.md
14677
14704
 
14678
14705
  ---
14679
14706
 
14680
- ## Molecular Biology Tools
14707
+ ## Molecular Biology Skills
14681
14708
 
14682
14709
  Python tools are at: **${TOOLS_DIR}**
14683
14710
 
@@ -14710,16 +14737,16 @@ ${dbSection ?? "\uFF08\u6682\u672A\u6CE8\u518C\u4EFB\u4F55\u6570\u636E\u5E93\u30
14710
14737
 
14711
14738
  ---
14712
14739
 
14713
- ## OpenClaw Medical Skills (979\u4E2A\u4E13\u79D1\u6280\u80FD)
14740
+ ## Extended Skills (979\u4E2A)
14714
14741
 
14715
- \u6280\u80FD\u5E93\u4F4D\u4E8E: **${SKILLS_DIR}**
14742
+ \u66F4\u591A\u5185\u7F6E\u6280\u80FD\u4F4D\u4E8E: **${SKILLS_DIR}**
14716
14743
 
14717
14744
  \u6BCF\u4E2A\u6280\u80FD\u76EE\u5F55\u5305\u542B\u4E00\u4E2A \`SKILL.md\` \u6587\u4EF6\uFF0C\u8BFB\u53D6\u65B9\u5F0F:
14718
14745
  \`\`\`bash
14719
14746
  cat ${SKILLS_DIR}/<skill-id>/SKILL.md
14720
14747
  \`\`\`
14721
14748
 
14722
- **\u6280\u80FD\u6DB5\u76D6\u7684\u4E3B\u8981\u9886\u57DF**\uFF08\u7528\u6237\u5DF2\u901A\u8FC7 /sk \u547D\u4EE4\u52A0\u8F7D\u65F6\u81EA\u52A8\u6CE8\u5165\u4E0A\u4E0B\u6587\uFF09:
14749
+ **\u6DB5\u76D6\u9886\u57DF**\uFF08\u7528\u6237\u901A\u8FC7 /sk \u547D\u4EE4\u52A0\u8F7D\u540E\u81EA\u52A8\u6CE8\u5165\u4E0A\u4E0B\u6587\uFF09:
14723
14750
  - \u6587\u732E\u68C0\u7D22: pubmed-search, arxiv-search, bgpt-paper-search
14724
14751
  - \u7ED3\u6784\u751F\u7269\u5B66: alphafold, alphafold-database, bindcraft, binder-design
14725
14752
  - \u5355\u7EC6\u80DE: anndata, cellagent-annotation, scvi-tools
@@ -14728,7 +14755,9 @@ cat ${SKILLS_DIR}/<skill-id>/SKILL.md
14728
14755
  - \u6297\u4F53\u8BBE\u8BA1: antibody-design-agent, armored-cart-design-agent
14729
14756
  - \u4E34\u5E8A: clinical-*, ehr-fhir-integration, autonomous-oncology-agent
14730
14757
 
14731
- \u5F53\u7528\u6237\u63D0\u5230\u67D0\u4E2A\u4E13\u79D1\u4EFB\u52A1\u65F6\uFF0C\u5EFA\u8BAE\u4ED6\u4EEC\u4F7F\u7528 **/sk <\u5173\u952E\u8BCD>** \u641C\u7D22\u5E76\u52A0\u8F7D\u5BF9\u5E94\u6280\u80FD\u6307\u5357\u3002
14758
+ \u7528\u6237\u4E5F\u53EF\u4EE5\u901A\u8FC7 **/install** \u5B89\u88C5\u81EA\u5B9A\u4E49\u6280\u80FD\uFF0C\u5B89\u88C5\u540E\u4E0E\u5185\u7F6E\u6280\u80FD\u5B8C\u5168\u7B49\u4EF7\u3002
14759
+
14760
+ \u5F53\u7528\u6237\u63D0\u5230\u67D0\u4E2A\u4EFB\u52A1\u65F6\uFF0C\u5EFA\u8BAE\u4F7F\u7528 **/sk <\u5173\u952E\u8BCD>** \u641C\u7D22\u5E76\u52A0\u8F7D\u5BF9\u5E94\u6280\u80FD\u3002
14732
14761
 
14733
14762
  ---
14734
14763
 
@@ -14819,9 +14848,9 @@ message(sprintf("\u603B\u57FA\u56E0\u6570: %d | \u663E\u8457 DEG: %d (\u4E0A\u8C
14819
14848
  ## Script Execution Rules
14820
14849
 
14821
14850
  \u{1F6A8} **\u5173\u952E\u89C4\u5219\uFF1A**
14822
- 1. **\u4F18\u5148\u4F7F\u7528\u5DE5\u4F5C\u6D41\u811A\u672C**\uFF0C\u4E0D\u8981\u4ECE\u96F6\u5199\u4EE3\u7801
14851
+ 1. **\u4F18\u5148\u4F7F\u7528\u6280\u80FD\u5185\u7F6E\u811A\u672C**\uFF0C\u4E0D\u8981\u4ECE\u96F6\u5199\u4EE3\u7801
14823
14852
  2. **\u811A\u672C\u5931\u8D25\u5904\u7406\u987A\u5E8F**: \u4FEE\u590D\u5E76\u91CD\u8BD5 \u2192 \u4FEE\u6539\u811A\u672C \u2192 \u9002\u914D\u65B9\u6848 \u2192 \u6700\u540E\u624D\u4ECE\u5934\u5199
14824
- 3. **\u4F7F\u7528\u76F8\u5BF9\u8DEF\u5F84**\uFF1A\u5728\u5DE5\u4F5C\u6D41\u76EE\u5F55\u5185\u7528 \`source("scripts/xxx.R")\` \u800C\u975E\u7EDD\u5BF9\u8DEF\u5F84
14853
+ 3. **\u4F7F\u7528\u76F8\u5BF9\u8DEF\u5F84**\uFF1A\u5728\u6280\u80FD\u76EE\u5F55\u5185\u7528 \`source("scripts/xxx.R")\` \u800C\u975E\u7EDD\u5BF9\u8DEF\u5F84
14825
14854
  4. **\u9A8C\u8BC1\u6D88\u606F**\uFF1A\u6BCF\u6B65\u5B8C\u6210\u5E94\u770B\u5230 "\u2713" \u786E\u8BA4\u6D88\u606F\uFF1B\u770B\u4E0D\u5230\u8BF4\u660E\u6CA1\u7528\u811A\u672C
14826
14855
 
14827
14856
  ---
@@ -14838,25 +14867,25 @@ message(sprintf("\u603B\u57FA\u56E0\u6570: %d | \u663E\u8457 DEG: %d (\u4E0A\u8C
14838
14867
  \u4F7F\u7528 HPC \u5DE5\u5177\u63D0\u4EA4 AlphaFold \u4EFB\u52A1
14839
14868
 
14840
14869
  **\u7528\u6237\u8BF4 "\u627E DEG \u7684\u901A\u8DEF" \u2192**
14841
- \u4F7F\u7528 functional-enrichment-from-degs \u5DE5\u4F5C\u6D41
14870
+ \u4F7F\u7528 functional-enrichment-from-degs \u6280\u80FD
14842
14871
 
14843
14872
  **\u7528\u6237\u8BF4 "\u8BBE\u8BA1 CRISPR guide RNA" \u2192**
14844
14873
  \u4F7F\u7528 molecular_biology.py \u7684 design_crispr_knockout_guides()
14845
14874
 
14846
14875
  **\u7528\u6237\u8BF4 "\u54EA\u4E9B\u57FA\u56E0\u5728\u80BF\u7624\u91CC\u8868\u8FBE\u91CF\u9AD8" / "\u627E\u4E0A\u8C03\u57FA\u56E0" \u2192**
14847
- \u2192 \u5DEE\u5F02\u8868\u8FBE\u5206\u6790\uFF08DESeq2\uFF09\uFF0C\u4F7F\u7528 bulk-rnaseq-counts-to-de-deseq2 \u5DE5\u4F5C\u6D41
14876
+ \u2192 \u5DEE\u5F02\u8868\u8FBE\u5206\u6790\uFF08DESeq2\uFF09\uFF0C\u4F7F\u7528 bulk-rnaseq-counts-to-de-deseq2 \u6280\u80FD
14848
14877
 
14849
14878
  **\u7528\u6237\u8BF4 "\u5148\u505A\u5DEE\u5F02\u8868\u8FBE\uFF0C\u518D\u505A\u5BCC\u96C6\u5206\u6790" \u2192**
14850
14879
  \u2192 \u8BC6\u522B\u4E3A\u591A\u4EFB\u52A1\uFF1A\u4F9D\u6B21\u6267\u884C bulk-rnaseq-counts-to-de-deseq2 + functional-enrichment-from-degs
14851
14880
 
14852
14881
  **\u7528\u6237\u8BF4 "\u8FD9\u4E9B\u57FA\u56E0\u53C2\u4E0E\u4EC0\u4E48\u901A\u8DEF" / "\u57FA\u56E0\u529F\u80FD\u662F\u4EC0\u4E48" \u2192**
14853
- \u2192 \u529F\u80FD\u5BCC\u96C6\u5206\u6790\uFF0C\u4F7F\u7528 functional-enrichment-from-degs \u5DE5\u4F5C\u6D41
14882
+ \u2192 \u529F\u80FD\u5BCC\u96C6\u5206\u6790\uFF0C\u4F7F\u7528 functional-enrichment-from-degs \u6280\u80FD
14854
14883
 
14855
14884
  **\u7528\u6237\u8BF4 "\u5206\u6790\u5355\u7EC6\u80DE\u6570\u636E" / "10X\u6570\u636E\u5206\u6790" \u2192**
14856
14885
  \u5148\u95EE\uFF1APython \u8FD8\u662F R\uFF1F\u2192 Scanpy \u6216 Seurat
14857
14886
 
14858
14887
  **\u7528\u6237\u8BF4 "\u753B\u751F\u5B58\u66F2\u7EBF" / "\u5206\u6790\u60A3\u8005\u9884\u540E" / "OS/PFS \u5206\u6790" \u2192**
14859
- \u2192 \u751F\u5B58\u5206\u6790\uFF0C\u4F7F\u7528 survival-analysis-clinical \u5DE5\u4F5C\u6D41
14888
+ \u2192 \u751F\u5B58\u5206\u6790\uFF0C\u4F7F\u7528 survival-analysis-clinical \u6280\u80FD
14860
14889
 
14861
14890
  **\u7528\u6237\u8BF4 "\u5E2E\u6211\u5206\u6790 GSE12345" / "\u4E0B\u8F7D GEO \u6570\u636E" \u2192**
14862
14891
  \u2192 \u7ACB\u5373\u8C03\u7528 fetch_geo("GSE12345") \u83B7\u53D6\u5143\u6570\u636E\u548C\u4E0B\u8F7D\u4EE3\u7801\uFF0C\u65E0\u9700\u8BA9\u7528\u6237\u624B\u52A8\u4E0B\u8F7D`;
@@ -15149,7 +15178,7 @@ var SKILL_ROUTES = [
15149
15178
  id: "bulk-rnaseq-counts-to-de-deseq2",
15150
15179
  name: "DESeq2 \u5DEE\u5F02\u8868\u8FBE\u5206\u6790",
15151
15180
  category: "\u8F6C\u5F55\u7EC4",
15152
- tag: "workflow",
15181
+ tag: "builtin",
15153
15182
  keywords: [
15154
15183
  // exact tool names
15155
15184
  "deseq2",
@@ -15184,7 +15213,7 @@ var SKILL_ROUTES = [
15184
15213
  id: "bulk-omics-clustering",
15185
15214
  name: "\u6837\u672C / \u7279\u5F81\u805A\u7C7B",
15186
15215
  category: "\u8F6C\u5F55\u7EC4",
15187
- tag: "workflow",
15216
+ tag: "builtin",
15188
15217
  keywords: [
15189
15218
  "wgcna\u805A\u7C7B",
15190
15219
  "\u5C42\u6B21\u805A\u7C7B",
@@ -15209,7 +15238,7 @@ var SKILL_ROUTES = [
15209
15238
  id: "scrnaseq-scanpy-core-analysis",
15210
15239
  name: "scRNA-seq (Scanpy / Python)",
15211
15240
  category: "\u5355\u7EC6\u80DE",
15212
- tag: "workflow",
15241
+ tag: "builtin",
15213
15242
  keywords: [
15214
15243
  "scanpy",
15215
15244
  "scrna-seq",
@@ -15234,7 +15263,7 @@ var SKILL_ROUTES = [
15234
15263
  id: "scrnaseq-seurat-core-analysis",
15235
15264
  name: "scRNA-seq (Seurat / R)",
15236
15265
  category: "\u5355\u7EC6\u80DE",
15237
- tag: "workflow",
15266
+ tag: "builtin",
15238
15267
  keywords: [
15239
15268
  "seurat",
15240
15269
  "r\u8BED\u8A00\u5355\u7EC6\u80DE",
@@ -15252,7 +15281,7 @@ var SKILL_ROUTES = [
15252
15281
  id: "spatial-transcriptomics",
15253
15282
  name: "\u7A7A\u95F4\u8F6C\u5F55\u7EC4",
15254
15283
  category: "\u5355\u7EC6\u80DE",
15255
- tag: "workflow",
15284
+ tag: "builtin",
15256
15285
  keywords: [
15257
15286
  "\u7A7A\u95F4\u8F6C\u5F55\u7EC4",
15258
15287
  "spatial transcriptomics",
@@ -15274,7 +15303,7 @@ var SKILL_ROUTES = [
15274
15303
  id: "coexpression-network",
15275
15304
  name: "WGCNA \u5171\u8868\u8FBE\u7F51\u7EDC",
15276
15305
  category: "\u8F6C\u5F55\u7EC4",
15277
- tag: "workflow",
15306
+ tag: "builtin",
15278
15307
  keywords: [
15279
15308
  "wgcna",
15280
15309
  "\u5171\u8868\u8FBE\u7F51\u7EDC",
@@ -15293,7 +15322,7 @@ var SKILL_ROUTES = [
15293
15322
  id: "functional-enrichment-from-degs",
15294
15323
  name: "GO / KEGG / GSEA \u5BCC\u96C6\u5206\u6790",
15295
15324
  category: "\u8F6C\u5F55\u7EC4",
15296
- tag: "workflow",
15325
+ tag: "builtin",
15297
15326
  keywords: [
15298
15327
  "\u5BCC\u96C6\u5206\u6790",
15299
15328
  "go\u5206\u6790",
@@ -15318,14 +15347,26 @@ var SKILL_ROUTES = [
15318
15347
  "\u901A\u8DEF\u5BCC\u96C6",
15319
15348
  "\u57FA\u56E0\u96C6\u5206\u6790",
15320
15349
  "ora\u5206\u6790",
15321
- "gsea\u5206\u6790"
15350
+ "gsea\u5206\u6790",
15351
+ // mutation → pathway → phenotype
15352
+ "\u7A81\u53D8\u901A\u8DEF",
15353
+ "\u7A81\u53D8\u5F71\u54CD\u901A\u8DEF",
15354
+ "\u7A81\u53D8\u4E0B\u6E38\u901A\u8DEF",
15355
+ "\u6851\u57FA\u56FE\u901A\u8DEF",
15356
+ "kras\u901A\u8DEF",
15357
+ "ras-raf-mek\u901A\u8DEF",
15358
+ "mapk\u901A\u8DEF",
15359
+ "pi3k\u901A\u8DEF",
15360
+ "\u80BA\u764C\u901A\u8DEF",
15361
+ "\u9A71\u52A8\u57FA\u56E0\u901A\u8DEF",
15362
+ "\u4FE1\u53F7\u901A\u8DEF\u5BCC\u96C6"
15322
15363
  ]
15323
15364
  },
15324
15365
  {
15325
15366
  id: "grn-pyscenic",
15326
15367
  name: "pySCENIC \u57FA\u56E0\u8C03\u63A7\u7F51\u7EDC",
15327
15368
  category: "\u5355\u7EC6\u80DE",
15328
- tag: "workflow",
15369
+ tag: "builtin",
15329
15370
  keywords: [
15330
15371
  "pyscenic",
15331
15372
  "scenic",
@@ -15346,7 +15387,7 @@ var SKILL_ROUTES = [
15346
15387
  id: "genetic-variant-annotation",
15347
15388
  name: "\u9057\u4F20\u53D8\u5F02\u6CE8\u91CA",
15348
15389
  category: "\u57FA\u56E0\u7EC4",
15349
- tag: "workflow",
15390
+ tag: "builtin",
15350
15391
  keywords: [
15351
15392
  "\u53D8\u5F02\u6CE8\u91CA",
15352
15393
  "variant annotation",
@@ -15364,14 +15405,43 @@ var SKILL_ROUTES = [
15364
15405
  "vcf\u6587\u4EF6\u5206\u6790",
15365
15406
  "\u9057\u4F20\u53D8\u5F02\u89E3\u6790",
15366
15407
  "\u81F4\u75C5\u6027\u8BC4\u4F30",
15367
- "\u53D8\u5F02\u5F71\u54CD\u9884\u6D4B"
15408
+ "\u53D8\u5F02\u5F71\u54CD\u9884\u6D4B",
15409
+ // specific oncology mutations (KRAS/EGFR/ALK etc.)
15410
+ "kras\u7A81\u53D8",
15411
+ "kras g12c",
15412
+ "kras g12d",
15413
+ "kras g12v",
15414
+ "kras mutation",
15415
+ "egfr\u7A81\u53D8",
15416
+ "egfr l858r",
15417
+ "egfr\u5916\u663E\u5B5019\u7F3A\u5931",
15418
+ "alk\u878D\u5408",
15419
+ "braf v600e",
15420
+ "tp53\u7A81\u53D8",
15421
+ "pik3ca\u7A81\u53D8",
15422
+ // cancer contexts
15423
+ "nsclc\u7A81\u53D8",
15424
+ "\u80BA\u764C\u7A81\u53D8",
15425
+ "\u975E\u5C0F\u7EC6\u80DE\u80BA\u764C\u7A81\u53D8",
15426
+ "\u80BA\u817A\u764C\u7A81\u53D8",
15427
+ "\u80BF\u7624\u4F53\u7EC6\u80DE\u7A81\u53D8",
15428
+ "\u9A71\u52A8\u57FA\u56E0\u7A81\u53D8",
15429
+ "\u764C\u75C7\u9A71\u52A8\u7A81\u53D8",
15430
+ // mutation landscape
15431
+ "\u7A81\u53D8\u9891\u7387",
15432
+ "\u8DE8\u764C\u79CD\u7A81\u53D8",
15433
+ "\u7A81\u53D8\u70ED\u56FE",
15434
+ "\u7A81\u53D8\u666F\u89C2\u56FE",
15435
+ "\u7011\u5E03\u56FE\u7A81\u53D8",
15436
+ "mutation landscape",
15437
+ "oncoprint"
15368
15438
  ]
15369
15439
  },
15370
15440
  {
15371
15441
  id: "gwas-to-function-twas",
15372
15442
  name: "GWAS \u2192 TWAS \u529F\u80FD\u89E3\u6790",
15373
15443
  category: "\u57FA\u56E0\u7EC4",
15374
- tag: "workflow",
15444
+ tag: "builtin",
15375
15445
  keywords: [
15376
15446
  "gwas\u5206\u6790",
15377
15447
  "twas",
@@ -15394,7 +15464,7 @@ var SKILL_ROUTES = [
15394
15464
  id: "mendelian-randomization-twosamplemr",
15395
15465
  name: "\u5B5F\u5FB7\u5C14\u968F\u673A\u5316 (MR)",
15396
15466
  category: "\u7EDF\u8BA1",
15397
- tag: "workflow",
15467
+ tag: "builtin",
15398
15468
  keywords: [
15399
15469
  "\u5B5F\u5FB7\u5C14\u968F\u673A\u5316",
15400
15470
  "mendelian randomization",
@@ -15415,7 +15485,7 @@ var SKILL_ROUTES = [
15415
15485
  id: "polygenic-risk-score-prs-catalog",
15416
15486
  name: "PRS \u591A\u57FA\u56E0\u98CE\u9669\u8BC4\u5206",
15417
15487
  category: "\u57FA\u56E0\u7EC4",
15418
- tag: "workflow",
15488
+ tag: "builtin",
15419
15489
  keywords: [
15420
15490
  "prs\u8BC4\u5206",
15421
15491
  "polygenic risk score",
@@ -15433,7 +15503,7 @@ var SKILL_ROUTES = [
15433
15503
  id: "pooled-crispr-screens",
15434
15504
  name: "CRISPR \u6587\u5E93\u7B5B\u9009 (MAGeCK/BAGEL2)",
15435
15505
  category: "\u57FA\u56E0\u7EC4",
15436
- tag: "workflow",
15506
+ tag: "builtin",
15437
15507
  keywords: [
15438
15508
  "crispr\u6587\u5E93\u7B5B\u9009",
15439
15509
  "crispr screen",
@@ -15455,7 +15525,7 @@ var SKILL_ROUTES = [
15455
15525
  id: "chip-atlas-peak-enrichment",
15456
15526
  name: "ChIP-seq \u5CF0\u503C\u5BCC\u96C6 (ChIP-Atlas)",
15457
15527
  category: "\u8868\u89C2\u57FA\u56E0\u7EC4",
15458
- tag: "workflow",
15528
+ tag: "builtin",
15459
15529
  keywords: [
15460
15530
  "chip-atlas",
15461
15531
  "chip-seq\u5CF0\u503C\u5BCC\u96C6",
@@ -15474,7 +15544,7 @@ var SKILL_ROUTES = [
15474
15544
  id: "chip-atlas-diff-analysis",
15475
15545
  name: "ChIP-seq \u5DEE\u5F02\u7ED3\u5408\u5206\u6790",
15476
15546
  category: "\u8868\u89C2\u57FA\u56E0\u7EC4",
15477
- tag: "workflow",
15547
+ tag: "builtin",
15478
15548
  keywords: [
15479
15549
  "chip\u5DEE\u5F02\u5206\u6790",
15480
15550
  "differential binding",
@@ -15491,7 +15561,7 @@ var SKILL_ROUTES = [
15491
15561
  id: "chip-atlas-target-genes",
15492
15562
  name: "ChIP-seq \u9776\u57FA\u56E0\u9274\u5B9A",
15493
15563
  category: "\u8868\u89C2\u57FA\u56E0\u7EC4",
15494
- tag: "workflow",
15564
+ tag: "builtin",
15495
15565
  keywords: [
15496
15566
  "chip\u9776\u57FA\u56E0",
15497
15567
  "chip target gene",
@@ -15511,7 +15581,7 @@ var SKILL_ROUTES = [
15511
15581
  id: "clinicaltrials-landscape",
15512
15582
  name: "\u4E34\u5E8A\u8BD5\u9A8C\u683C\u5C40\u5206\u6790",
15513
15583
  category: "\u4E34\u5E8A",
15514
- tag: "workflow",
15584
+ tag: "builtin",
15515
15585
  keywords: [
15516
15586
  "clinicaltrials\u5206\u6790",
15517
15587
  "clinical trial landscape",
@@ -15529,7 +15599,7 @@ var SKILL_ROUTES = [
15529
15599
  id: "literature-preclinical",
15530
15600
  name: "\u4E34\u5E8A\u524D\u6587\u732E\u7CFB\u7EDF\u63D0\u53D6",
15531
15601
  category: "\u6587\u732E",
15532
- tag: "workflow",
15602
+ tag: "builtin",
15533
15603
  keywords: [
15534
15604
  "\u4E34\u5E8A\u524D\u6587\u732E",
15535
15605
  "preclinical literature",
@@ -15547,7 +15617,7 @@ var SKILL_ROUTES = [
15547
15617
  id: "experimental-design-statistics",
15548
15618
  name: "\u5B9E\u9A8C\u8BBE\u8BA1\u4E0E\u7EDF\u8BA1\u68C0\u9A8C",
15549
15619
  category: "\u7EDF\u8BA1",
15550
- tag: "workflow",
15620
+ tag: "builtin",
15551
15621
  keywords: [
15552
15622
  "\u6837\u672C\u91CF\u8BA1\u7B97",
15553
15623
  "\u7EDF\u8BA1\u68C0\u9A8C\u9009\u62E9",
@@ -15573,7 +15643,7 @@ var SKILL_ROUTES = [
15573
15643
  id: "lasso-biomarker-panel",
15574
15644
  name: "LASSO \u751F\u7269\u6807\u5FD7\u7269\u9762\u677F\u7B5B\u9009",
15575
15645
  category: "\u7EDF\u8BA1",
15576
- tag: "workflow",
15646
+ tag: "builtin",
15577
15647
  keywords: [
15578
15648
  "lasso\u56DE\u5F52\u7B5B\u9009",
15579
15649
  "lasso\u751F\u7269\u6807\u5FD7\u7269",
@@ -15594,7 +15664,7 @@ var SKILL_ROUTES = [
15594
15664
  id: "pcr-primer-design",
15595
15665
  name: "PCR / qPCR \u5F15\u7269\u8BBE\u8BA1",
15596
15666
  category: "\u5206\u5B50\u751F\u7269\u5B66",
15597
- tag: "workflow",
15667
+ tag: "builtin",
15598
15668
  keywords: [
15599
15669
  "\u5F15\u7269\u8BBE\u8BA1",
15600
15670
  "primer design",
@@ -15616,7 +15686,7 @@ var SKILL_ROUTES = [
15616
15686
  id: "survival-analysis-clinical",
15617
15687
  name: "\u4E34\u5E8A\u751F\u5B58\u5206\u6790 (KM + Cox)",
15618
15688
  category: "\u4E34\u5E8A",
15619
- tag: "workflow",
15689
+ tag: "builtin",
15620
15690
  keywords: [
15621
15691
  // exact method names
15622
15692
  "kaplan-meier",
@@ -15663,12 +15733,12 @@ var SKILL_ROUTES = [
15663
15733
  "\u7A81\u53D8\u4E0E\u9884\u540E"
15664
15734
  ]
15665
15735
  },
15666
- // ── OpenClaw Key Skills ────────────────────────────────────────────────────────
15736
+ // ── Extended Skills (key routable entries) ───────────────────────────────────
15667
15737
  {
15668
15738
  id: "pubmed-search",
15669
15739
  name: "PubMed \u6587\u732E\u68C0\u7D22",
15670
15740
  category: "\u6587\u732E",
15671
- tag: "skill",
15741
+ tag: "builtin",
15672
15742
  keywords: [
15673
15743
  "pubmed\u68C0\u7D22",
15674
15744
  "pubmed\u641C\u7D22",
@@ -15683,14 +15753,14 @@ var SKILL_ROUTES = [
15683
15753
  id: "arxiv-search",
15684
15754
  name: "arXiv \u9884\u5370\u672C\u68C0\u7D22",
15685
15755
  category: "\u6587\u732E",
15686
- tag: "skill",
15756
+ tag: "builtin",
15687
15757
  keywords: ["arxiv\u68C0\u7D22", "arxiv\u641C\u7D22", "\u9884\u5370\u672C\u68C0\u7D22", "\u9884\u5370\u672C\u8BBA\u6587", "arxiv\u6587\u732E"]
15688
15758
  },
15689
15759
  {
15690
15760
  id: "alphafold",
15691
15761
  name: "AlphaFold \u86CB\u767D\u8D28\u7ED3\u6784\u9884\u6D4B",
15692
15762
  category: "\u7ED3\u6784\u751F\u7269\u5B66",
15693
- tag: "skill",
15763
+ tag: "builtin",
15694
15764
  keywords: [
15695
15765
  "alphafold\u7ED3\u6784\u9884\u6D4B",
15696
15766
  "alphafold\u8FD0\u884C",
@@ -15704,7 +15774,7 @@ var SKILL_ROUTES = [
15704
15774
  id: "alphafold-database",
15705
15775
  name: "AlphaFold \u6570\u636E\u5E93\u67E5\u8BE2",
15706
15776
  category: "\u7ED3\u6784\u751F\u7269\u5B66",
15707
- tag: "skill",
15777
+ tag: "builtin",
15708
15778
  keywords: [
15709
15779
  "alphafold\u6570\u636E\u5E93",
15710
15780
  "alphafold db",
@@ -15717,7 +15787,7 @@ var SKILL_ROUTES = [
15717
15787
  id: "bindcraft",
15718
15788
  name: "BindCraft \u86CB\u767D\u8D28\u7ED3\u5408\u4F53\u8BBE\u8BA1",
15719
15789
  category: "\u7ED3\u6784\u751F\u7269\u5B66",
15720
- tag: "skill",
15790
+ tag: "builtin",
15721
15791
  keywords: [
15722
15792
  "bindcraft",
15723
15793
  "\u7ED3\u5408\u4F53\u8BBE\u8BA1",
@@ -15731,7 +15801,7 @@ var SKILL_ROUTES = [
15731
15801
  id: "anndata",
15732
15802
  name: "AnnData \u5355\u7EC6\u80DE\u6570\u636E\u64CD\u4F5C",
15733
15803
  category: "\u5355\u7EC6\u80DE",
15734
- tag: "skill",
15804
+ tag: "builtin",
15735
15805
  keywords: [
15736
15806
  "anndata\u64CD\u4F5C",
15737
15807
  "h5ad\u6587\u4EF6\u5904\u7406",
@@ -15745,7 +15815,7 @@ var SKILL_ROUTES = [
15745
15815
  id: "cellagent-annotation",
15746
15816
  name: "CellAgent \u7EC6\u80DE\u7C7B\u578B\u81EA\u52A8\u6CE8\u91CA",
15747
15817
  category: "\u5355\u7EC6\u80DE",
15748
- tag: "skill",
15818
+ tag: "builtin",
15749
15819
  keywords: [
15750
15820
  "\u7EC6\u80DE\u7C7B\u578B\u6CE8\u91CA",
15751
15821
  "cell type annotation",
@@ -15759,7 +15829,7 @@ var SKILL_ROUTES = [
15759
15829
  id: "scvi-tools",
15760
15830
  name: "scVI \u5355\u7EC6\u80DE\u6DF1\u5EA6\u5B66\u4E60",
15761
15831
  category: "\u5355\u7EC6\u80DE",
15762
- tag: "skill",
15832
+ tag: "builtin",
15763
15833
  keywords: [
15764
15834
  "scvi-tools",
15765
15835
  "scvi\u6A21\u578B",
@@ -15773,21 +15843,54 @@ var SKILL_ROUTES = [
15773
15843
  id: "agentd-drug-discovery",
15774
15844
  name: "\u836F\u7269\u53D1\u73B0 Agent",
15775
15845
  category: "\u836F\u7269",
15776
- tag: "skill",
15846
+ tag: "builtin",
15777
15847
  keywords: [
15778
15848
  "\u836F\u7269\u53D1\u73B0\u6D41\u7A0B",
15779
15849
  "drug discovery",
15780
15850
  "\u5019\u9009\u836F\u7269\u7B5B\u9009",
15781
15851
  "\u5148\u5BFC\u5316\u5408\u7269",
15782
15852
  "hit\u5316\u5408\u7269",
15783
- "\u836F\u7269\u9776\u70B9\u53D1\u73B0"
15853
+ "\u836F\u7269\u9776\u70B9\u53D1\u73B0",
15854
+ // drug target analysis
15855
+ "\u9776\u70B9\u8BC4\u4F30",
15856
+ "\u9776\u70B9\u53EF\u89C6\u5316",
15857
+ "\u9776\u70B9\u62A5\u544A",
15858
+ "\u9776\u70B9\u5206\u6790",
15859
+ "\u9776\u70B9\u53EF\u6210\u836F\u6027",
15860
+ "druggability",
15861
+ "\u53EF\u6210\u836F\u6027\u8BC4\u4F30",
15862
+ "\u9776\u70B9\u7EFC\u5408\u8BC4\u5206",
15863
+ "target visualization",
15864
+ "drug target report",
15865
+ "target assessment",
15866
+ // specific target contexts
15867
+ "kras\u9776\u70B9",
15868
+ "kras\u53EF\u6210\u836F\u6027",
15869
+ "kras\u6291\u5236\u5242",
15870
+ "kras\u7A81\u53D8\u9776\u70B9",
15871
+ "egfr\u9776\u70B9",
15872
+ "alk\u9776\u70B9",
15873
+ "braf\u9776\u70B9",
15874
+ "her2\u9776\u70B9",
15875
+ "met\u9776\u70B9",
15876
+ // visualization types for target reports
15877
+ "\u96F7\u8FBE\u56FE\u8BC4\u5206",
15878
+ "\u6C14\u6CE1\u56FE\u9776\u70B9",
15879
+ "\u6851\u57FA\u56FE\u7A81\u53D8\u901A\u8DEF",
15880
+ "\u9776\u70B9\u70ED\u56FE",
15881
+ // natural-language synonyms
15882
+ "\u54EA\u4E9B\u9776\u70B9\u503C\u5F97\u5F00\u53D1",
15883
+ "\u9776\u70B9\u4F18\u5148\u7EA7",
15884
+ "\u9776\u70B9\u6210\u836F\u6027\u5206\u6790",
15885
+ "\u9776\u5411\u6CBB\u7597\u9776\u70B9",
15886
+ "\u7CBE\u51C6\u533B\u5B66\u9776\u70B9"
15784
15887
  ]
15785
15888
  },
15786
15889
  {
15787
15890
  id: "chembl-database",
15788
15891
  name: "ChEMBL \u5316\u5408\u7269\u6D3B\u6027\u6570\u636E\u5E93",
15789
15892
  category: "\u836F\u7269",
15790
- tag: "skill",
15893
+ tag: "builtin",
15791
15894
  keywords: [
15792
15895
  "chembl\u67E5\u8BE2",
15793
15896
  "chembl\u6570\u636E\u5E93",
@@ -15801,7 +15904,7 @@ var SKILL_ROUTES = [
15801
15904
  id: "rdkit",
15802
15905
  name: "RDKit \u5316\u5B66\u4FE1\u606F\u5B66",
15803
15906
  category: "\u836F\u7269",
15804
- tag: "skill",
15907
+ tag: "builtin",
15805
15908
  keywords: [
15806
15909
  "rdkit",
15807
15910
  "\u5316\u5B66\u4FE1\u606F\u5B66",
@@ -15816,7 +15919,7 @@ var SKILL_ROUTES = [
15816
15919
  id: "bio-variant-calling",
15817
15920
  name: "\u53D8\u5F02\u68C0\u6D4B\u6D41\u7A0B (GATK/Mutect2)",
15818
15921
  category: "\u57FA\u56E0\u7EC4",
15819
- tag: "skill",
15922
+ tag: "builtin",
15820
15923
  keywords: [
15821
15924
  "\u53D8\u5F02\u68C0\u6D4B\u6D41\u7A0B",
15822
15925
  "variant calling\u6D41\u7A0B",
@@ -15831,7 +15934,7 @@ var SKILL_ROUTES = [
15831
15934
  id: "antibody-design-agent",
15832
15935
  name: "\u6297\u4F53\u8BBE\u8BA1 Agent",
15833
15936
  category: "\u6297\u4F53",
15834
- tag: "skill",
15937
+ tag: "builtin",
15835
15938
  keywords: [
15836
15939
  "\u6297\u4F53\u8BBE\u8BA1",
15837
15940
  "antibody design",
@@ -15845,7 +15948,7 @@ var SKILL_ROUTES = [
15845
15948
  id: "armored-cart-design-agent",
15846
15949
  name: "Armored CAR-T \u8BBE\u8BA1",
15847
15950
  category: "\u6297\u4F53",
15848
- tag: "skill",
15951
+ tag: "builtin",
15849
15952
  keywords: [
15850
15953
  "car-t\u8BBE\u8BA1",
15851
15954
  "cart\u7EC6\u80DE\u8BBE\u8BA1",
@@ -16001,7 +16104,7 @@ function clearCheckpoints(sessionId) {
16001
16104
 
16002
16105
  // src/index.ts
16003
16106
  var import_fs7 = require("fs");
16004
- var VERSION2 = "2.4.3";
16107
+ var VERSION2 = "2.4.4";
16005
16108
  var SKILLHUB_HUBS = {
16006
16109
  bgi: { label: "BGI\u5185\u7F51", apiBase: "https://clawhub.ai", backend: "clawhub" },
16007
16110
  clawhub: { label: "clawhub.ai", apiBase: "https://clawhub.ai", backend: "clawhub" },
@@ -16151,8 +16254,8 @@ function installBundledData() {
16151
16254
  const installedDataVersion = (0, import_fs6.existsSync)(DATA_VERSION_FILE) ? (0, import_fs6.readFileSync)(DATA_VERSION_FILE, "utf8").trim() : "";
16152
16255
  const needsUpdate = installedDataVersion !== VERSION2;
16153
16256
  const targets = [
16154
- { src: (0, import_path6.join)(bundledData, "workflows"), dest: WORKFLOWS_DIR, name: "Skills (\u751F\u4FE1\u5DE5\u4F5C\u6D41)" },
16155
- { src: (0, import_path6.join)(bundledData, "skills"), dest: SKILLS_DIR, name: "Skills (\u533B\u5B66\u4E13\u79D1)" },
16257
+ { src: (0, import_path6.join)(bundledData, "workflows"), dest: WORKFLOWS_DIR, name: "Skills (\u5206\u6790\u7C7B)" },
16258
+ { src: (0, import_path6.join)(bundledData, "skills"), dest: SKILLS_DIR, name: "Skills (\u6269\u5C55\u7C7B)" },
16156
16259
  { src: (0, import_path6.join)(bundledData, "tools"), dest: TOOLS_DIR, name: "\u5DE5\u5177" }
16157
16260
  ];
16158
16261
  let installed = false;
@@ -16231,7 +16334,7 @@ function printHelp() {
16231
16334
  console.log(` ${source_default.cyan("!<\u547D\u4EE4>")} \u7ED5\u8FC7 AI \u76F4\u63A5\u6267\u884C Shell \u547D\u4EE4\uFF08\u5B9E\u65F6\u8F93\u51FA\uFF09`);
16232
16335
  console.log(source_default.dim(" \u793A\u4F8B: !ls -la !Rscript analysis.R !python script.py !samtools view -h a.bam"));
16233
16336
  console.log();
16234
- console.log(source_default.bold.cyan("\u2500\u2500\u2500 \u5DE5\u4F5C\u6D41\u5411\u5BFC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
16337
+ console.log(source_default.bold.cyan("\u2500\u2500\u2500 Skill \u5411\u5BFC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
16235
16338
  console.log(` ${source_default.cyan("/run")} <skill-id> \u4EA4\u4E92\u5F0F\u53C2\u6570\u5411\u5BFC\uFF0C\u81EA\u52A8\u751F\u6210\u5E76\u6267\u884C\u5206\u6790\u811A\u672C`);
16236
16339
  console.log(` ${source_default.cyan("/check-env")} [id] \u68C0\u6D4B Skill \u6240\u9700 R/Python \u5305\u662F\u5426\u5DF2\u5B89\u88C5`);
16237
16340
  console.log(` ${source_default.cyan("/search")} <\u5173\u952E\u8BCD> \u5728 SkillHub \u641C\u7D22\u5E76\u4E0B\u8F7D\u6280\u80FD ${source_default.dim("[--hub=bgi|clawhub|tencent]")}`);
@@ -16976,7 +17079,7 @@ async function handleCommand(input, rl, history, thinkMode, injectedSkills) {
16976
17079
  }
16977
17080
  break;
16978
17081
  }
16979
- // ── /run workflow wizard ─────────────────────────────────────────────────
17082
+ // ── /run skill wizard ────────────────────────────────────────────────────
16980
17083
  case "run": {
16981
17084
  const targetId = arg;
16982
17085
  if (!targetId) {
@@ -17017,7 +17120,7 @@ async function handleCommand(input, rl, history, thinkMode, injectedSkills) {
17017
17120
  if (ans.trim()) answers[q2] = ans.trim();
17018
17121
  }
17019
17122
  const paramSummary = Object.entries(answers).map(([k2, v2]) => `- ${k2}: ${v2}`).join("\n");
17020
- const runPrompt = `\u8BF7\u6839\u636E\u4EE5\u4E0B\u53C2\u6570\uFF0C\u4F7F\u7528 ${skillName || runMatch.id} \u5DE5\u4F5C\u6D41\u751F\u6210\u5B8C\u6574\u7684\u5206\u6790\u811A\u672C\u5E76\u7ACB\u5373\u6267\u884C\uFF1A
17123
+ const runPrompt = `\u8BF7\u6839\u636E\u4EE5\u4E0B\u53C2\u6570\uFF0C\u4F7F\u7528 ${skillName || runMatch.id} \u6280\u80FD\u751F\u6210\u5B8C\u6574\u7684\u5206\u6790\u811A\u672C\u5E76\u7ACB\u5373\u6267\u884C\uFF1A
17021
17124
 
17022
17125
  \u7528\u6237\u63D0\u4F9B\u7684\u53C2\u6570\uFF1A
17023
17126
  ${paramSummary}
@@ -17878,16 +17981,29 @@ async function main() {
17878
17981
  const { routes: suggestedRoutes, topScore } = routeSkill(trimmed);
17879
17982
  const newRoutes = suggestedRoutes.filter((r2) => !injectedSkills.has(r2.id));
17880
17983
  if (newRoutes.length === 1 && topScore >= 8) {
17881
- const r2 = newRoutes[0];
17882
- const ok = await injectSkill(r2.id, history, injectedSkills, rl, true);
17883
- if (ok) {
17884
- console.log(source_default.dim(" (\u63D0\u793A: /clear \u53EF\u6E05\u9664\u4E0A\u4E0B\u6587\u540E\u5207\u6362 Skill)"));
17885
- }
17886
- } else if (newRoutes.length >= 2 && topScore >= 4) {
17887
- console.log(source_default.dim("\n\u{1F4A1} \u68C0\u6D4B\u5230\u76F8\u5173\u6280\u80FD\uFF0C\u8F93\u5165 /sk <id> \u6FC0\u6D3B:"));
17888
- newRoutes.slice(0, 3).forEach((r2) => {
17889
- console.log(source_default.dim(` /sk ${r2.id} \u2014 ${r2.name}`));
17984
+ await injectSkill(newRoutes[0].id, history, injectedSkills, rl, false);
17985
+ } else if (newRoutes.length >= 1 && topScore >= 2) {
17986
+ const candidates = newRoutes.slice(0, 3);
17987
+ console.log();
17988
+ console.log(source_default.bold.yellow("\u250C\u2500 \u{1F50D} \u68C0\u6D4B\u5230\u76F8\u5173\u6280\u80FD \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
17989
+ candidates.forEach((r2, i2) => {
17990
+ console.log(`\u2502 ${source_default.bold.cyan(`[${i2 + 1}]`)} ${source_default.cyan(r2.id)}${source_default.dim(" \u2014")} ${r2.name}`);
17890
17991
  });
17992
+ console.log(source_default.bold.yellow("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
17993
+ const pickPrompt = candidates.length > 1 ? ` \u6FC0\u6D3B\u54EA\u4E2A\u6280\u80FD\uFF1F\u8F93\u5165\u7F16\u53F7 (\u5982 1 \u6216 1,2)\uFF0C\u56DE\u8F66\u8DF3\u8FC7 \u203A ` : ` \u6FC0\u6D3B\u6B64\u6280\u80FD\uFF1F[Y/n] \u203A `;
17994
+ const skillChoice = await question(rl, source_default.yellow(pickPrompt));
17995
+ const choiceTrimmed = skillChoice.trim().toLowerCase();
17996
+ if (choiceTrimmed !== "" && choiceTrimmed !== "n") {
17997
+ let indices;
17998
+ if (candidates.length === 1) {
17999
+ indices = choiceTrimmed === "y" || choiceTrimmed === "" ? [0] : [];
18000
+ } else {
18001
+ indices = choiceTrimmed.split(",").map((s2) => parseInt(s2.trim(), 10) - 1).filter((i2) => i2 >= 0 && i2 < candidates.length);
18002
+ }
18003
+ for (const idx of indices) {
18004
+ await injectSkill(candidates[idx].id, history, injectedSkills, rl, true);
18005
+ }
18006
+ }
17891
18007
  console.log();
17892
18008
  }
17893
18009
  const expanded = expandFileRefs(trimmed);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bgicli/bgicli",
3
- "version": "2.4.3",
3
+ "version": "2.4.5",
4
4
  "description": "BGI CLI — Bioinformatics AI terminal for Chinese researchers (百炼/DeepSeek/Kimi/Qwen)",
5
5
  "bin": {
6
6
  "bgi": "dist/bgi.js"