@bgicli/bgicli 2.4.4 → 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 (2) hide show
  1. package/dist/bgi.js +130 -16
  2. package/package.json +1 -1
package/dist/bgi.js CHANGED
@@ -14617,10 +14617,37 @@ You have access to these tools:
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**: When the user gives you a bioinformatics task:
14621
- 1. Check if a matching pre-built skill exists (see Skill Library below)
14622
- 2. If yes: read the skill'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
 
@@ -15320,7 +15347,19 @@ var SKILL_ROUTES = [
15320
15347
  "\u901A\u8DEF\u5BCC\u96C6",
15321
15348
  "\u57FA\u56E0\u96C6\u5206\u6790",
15322
15349
  "ora\u5206\u6790",
15323
- "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"
15324
15363
  ]
15325
15364
  },
15326
15365
  {
@@ -15366,7 +15405,36 @@ var SKILL_ROUTES = [
15366
15405
  "vcf\u6587\u4EF6\u5206\u6790",
15367
15406
  "\u9057\u4F20\u53D8\u5F02\u89E3\u6790",
15368
15407
  "\u81F4\u75C5\u6027\u8BC4\u4F30",
15369
- "\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"
15370
15438
  ]
15371
15439
  },
15372
15440
  {
@@ -15782,7 +15850,40 @@ var SKILL_ROUTES = [
15782
15850
  "\u5019\u9009\u836F\u7269\u7B5B\u9009",
15783
15851
  "\u5148\u5BFC\u5316\u5408\u7269",
15784
15852
  "hit\u5316\u5408\u7269",
15785
- "\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"
15786
15887
  ]
15787
15888
  },
15788
15889
  {
@@ -17880,16 +17981,29 @@ async function main() {
17880
17981
  const { routes: suggestedRoutes, topScore } = routeSkill(trimmed);
17881
17982
  const newRoutes = suggestedRoutes.filter((r2) => !injectedSkills.has(r2.id));
17882
17983
  if (newRoutes.length === 1 && topScore >= 8) {
17883
- const r2 = newRoutes[0];
17884
- const ok = await injectSkill(r2.id, history, injectedSkills, rl, true);
17885
- if (ok) {
17886
- console.log(source_default.dim(" (\u63D0\u793A: /clear \u53EF\u6E05\u9664\u4E0A\u4E0B\u6587\u540E\u5207\u6362 Skill)"));
17887
- }
17888
- } else if (newRoutes.length >= 2 && topScore >= 4) {
17889
- console.log(source_default.dim("\n\u{1F4A1} \u68C0\u6D4B\u5230\u76F8\u5173\u6280\u80FD\uFF0C\u8F93\u5165 /sk <id> \u6FC0\u6D3B:"));
17890
- newRoutes.slice(0, 3).forEach((r2) => {
17891
- 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}`);
17892
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
+ }
17893
18007
  console.log();
17894
18008
  }
17895
18009
  const expanded = expandFileRefs(trimmed);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bgicli/bgicli",
3
- "version": "2.4.4",
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"