bazilion 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/README.md +4 -4
  2. package/dist/cli.js +104 -35
  3. package/dist/cli.js.map +1 -1
  4. package/dist/daemon.js +349 -29
  5. package/dist/daemon.js.map +1 -1
  6. package/dist/web/client/assets/AgentAvatar-JYijLvZ2.js +1 -0
  7. package/dist/web/client/assets/AgentTabs-DioGqUVR.js +1 -0
  8. package/dist/web/client/assets/Button-ByiV6fpd.js +1 -0
  9. package/dist/web/client/assets/ChatPane-DzEgOEqS.js +74 -0
  10. package/dist/web/client/assets/ConfigTabs-pY-V0Rie.js +1 -0
  11. package/dist/web/client/assets/FieldRow-CNKma5LE.js +1 -0
  12. package/dist/web/client/assets/MembersEditor-C6UpqDdV.js +1 -0
  13. package/dist/web/client/assets/SpawnTeamModal-BEkNCKXm.js +1 -0
  14. package/dist/web/client/assets/TemplatesTabs-UM04RMO9.js +1 -0
  15. package/dist/web/client/assets/_id-BNJapCT4.js +1 -0
  16. package/dist/web/client/assets/_id-CjGoV8Mr.js +1 -0
  17. package/dist/web/client/assets/_id-DehuCHUw.js +1 -0
  18. package/dist/web/client/assets/_id-Dz9fjcCM.js +1 -0
  19. package/dist/web/client/assets/agents-M6omAXcZ.js +1 -0
  20. package/dist/web/client/assets/config-DIuEc5bm.js +3 -0
  21. package/dist/web/client/assets/groups-DpE2d2zZ.js +1 -0
  22. package/dist/web/client/assets/inbox-BPnLsRNf.js +1 -0
  23. package/dist/web/client/assets/index-MAJuXnie.js +12 -0
  24. package/dist/web/client/assets/jsx-runtime-DGeXAQPT.js +1 -0
  25. package/dist/web/client/assets/login-CawJX16E.js +1 -0
  26. package/dist/web/client/assets/mcp-DIrh9-v_.js +1 -0
  27. package/dist/web/client/assets/memory-BpHbdKsd.js +1 -0
  28. package/dist/web/client/assets/preload-helper-CvnapA2_.js +1 -0
  29. package/dist/web/client/assets/profile-groups-ByoKak0c.js +1 -0
  30. package/dist/web/client/assets/profiles-BEjv8LGo.js +1 -0
  31. package/dist/web/client/assets/routes-D2COHy7v.js +1 -0
  32. package/dist/web/client/assets/services-D212jSK_.js +1 -0
  33. package/dist/web/client/assets/skills-Da0MURjY.js +1 -0
  34. package/dist/web/client/assets/styles-BgE5bCHA.css +2 -0
  35. package/dist/web/client/assets/telegram-Czh2MdVm.js +1 -0
  36. package/dist/web/client/assets/tokens-E_JvO5JN.js +1 -0
  37. package/dist/web/client/assets/triggers-BBRZQOm7.js +1 -0
  38. package/dist/web/client/assets/welcome-Dn-zvmBE.js +1 -0
  39. package/dist/web/server/assets/{_id-C78M9_j9.js → _id-BKev9H1p.js} +2 -2
  40. package/dist/web/server/assets/{_id-Dc8P9sy2.js → _id-BNwlbWHP.js} +1 -1
  41. package/dist/web/server/assets/{_id-GJk3EYTT.js → _id-BdRiQb2H.js} +42 -5
  42. package/dist/web/server/assets/{_id-CrQbC5L8.js → _id-BqnDy_Ca.js} +2 -2
  43. package/dist/web/server/assets/{_id-CHNm7EAd.js → _id-CRqqi8IE.js} +1 -1
  44. package/dist/web/server/assets/{_id-Bm4-_AP-.js → _id-CXg-Blec.js} +1 -1
  45. package/dist/web/server/assets/{_id-BZ-YCWSw.js → _id-CnQflrRv.js} +2 -2
  46. package/dist/web/server/assets/{_id-DF3pfi9M.js → _id-D8duqgd5.js} +1 -1
  47. package/dist/web/server/assets/{_id-pd4S7LTi.js → _id-DDixKEud.js} +1 -1
  48. package/dist/web/server/assets/{_id-CvIGhq4U.js → _id-DUIrFV3G.js} +2 -2
  49. package/dist/web/server/assets/{_id-CGZbudCl.js → _id-D_Ew11ED.js} +1 -1
  50. package/dist/web/server/assets/{_id-Crcw2HhT.js → _id-Sjw0zhA6.js} +1 -1
  51. package/dist/web/server/assets/{_tanstack-start-manifest_v-CPyKYMJg.js → _tanstack-start-manifest_v-D9FLKShQ.js} +45 -41
  52. package/dist/web/server/assets/{agents-70EwQJR6.js → agents-C7SBPN0M.js} +1 -1
  53. package/dist/web/server/assets/{agents-K4Smhnq3.js → agents-ChcAJUI5.js} +2 -2
  54. package/dist/web/server/assets/{agents-Ds4lcREv.js → agents-k5QURC4I.js} +1 -1
  55. package/dist/web/server/assets/{auth-DpAGLHpA.js → auth-DzRAMwVt.js} +1 -1
  56. package/dist/web/server/assets/{config-DxCGYgR9.js → config-Bq3o924J.js} +2 -2
  57. package/dist/web/server/assets/{config-CMXUx_IF.js → config-CHaCv89D.js} +1 -1
  58. package/dist/web/server/assets/{config-DQbCsY_l.js → config-CdVjqjin.js} +18 -9
  59. package/dist/web/server/assets/{createServerRpc-CBTntoKx.js → createServerRpc-CeKECg65.js} +1 -1
  60. package/dist/web/server/assets/{createSsrRpc-DHBVUN8O.js → createSsrRpc-ZBGxhl8t.js} +1 -1
  61. package/dist/web/server/assets/{empty-plugin-adapters-Bos_V2s-.js → empty-plugin-adapters-DKUlnwwl.js} +1 -1
  62. package/dist/web/server/assets/{groups-Cms8cvH5.js → groups-CbSwND2r.js} +2 -2
  63. package/dist/web/server/assets/{groups-CXVew7BP.js → groups-CeRRlZaZ.js} +1 -1
  64. package/dist/web/server/assets/{groups-Dmcvw5ya.js → groups-pk4CYSuf.js} +1 -1
  65. package/dist/web/server/assets/{inbox-0QfwsrGo.js → inbox-Bxb3W04M.js} +2 -2
  66. package/dist/web/server/assets/{inbox-B7UWoICA.js → inbox-CkiSvD14.js} +1 -1
  67. package/dist/web/server/assets/{inbox-8HybA2Ws.js → inbox-DU27iHv_.js} +1 -1
  68. package/dist/web/server/assets/{mcp-DIa0kIOf.js → mcp-BU_kKENi.js} +1 -1
  69. package/dist/web/server/assets/{mcp-DsTjY3uz.js → mcp-BsFKEoXt.js} +1 -1
  70. package/dist/web/server/assets/{mcp-42BrkI1I.js → mcp-CKqwG4mt.js} +2 -2
  71. package/dist/web/server/assets/{memory-Dr0lOM2y.js → memory-BaYnfm7K.js} +1 -1
  72. package/dist/web/server/assets/{memory-BfrMp8iY.js → memory-CQaqWnyM.js} +1 -1
  73. package/dist/web/server/assets/{memory-EEgLDfCj.js → memory-Ns2-Z31p.js} +2 -2
  74. package/dist/web/server/assets/{profile-groups-C5isDI2t.js → profile-groups-CiU06yN1.js} +1 -1
  75. package/dist/web/server/assets/{profile-groups-B_kIT6BU.js → profile-groups-D21MYoLM.js} +1 -1
  76. package/dist/web/server/assets/{profile-groups-BW5gU-fG.js → profile-groups-aoJleXHP.js} +2 -2
  77. package/dist/web/server/assets/{profiles-BbPTpmyq.js → profiles-C6a3RKgu.js} +1 -1
  78. package/dist/web/server/assets/{profiles-Cy5auEj8.js → profiles-CZ5NkmVw.js} +2 -2
  79. package/dist/web/server/assets/{profiles-BP1v-jna.js → profiles-LxcC_L6n.js} +1 -1
  80. package/dist/web/server/assets/{router-CL100-Ly.js → router-BrDascdO.js} +21 -21
  81. package/dist/web/server/assets/{routes-D2H1Hnoh.js → routes-C61gBiXa.js} +1 -1
  82. package/dist/web/server/assets/{routes-Dzk8jvIo.js → routes-Ce2VWrU9.js} +1 -1
  83. package/dist/web/server/assets/{routes-CzJLQxcS.js → routes-V9URcp1v.js} +2 -2
  84. package/dist/web/server/assets/{services-DFenjiw0.js → services-B91w2f-X.js} +1 -1
  85. package/dist/web/server/assets/{services-DEgYsWJ4.js → services-Ccc5s2bS.js} +2 -2
  86. package/dist/web/server/assets/{services-Bgj6M2gC.js → services-DhRiNeq0.js} +1 -1
  87. package/dist/web/server/assets/{skills-BASIP_rT.js → skills-CFIWVg32.js} +1 -1
  88. package/dist/web/server/assets/{skills-DZXN680t.js → skills-D89ND2kR.js} +67 -7
  89. package/dist/web/server/assets/{skills-C-JPRCHh.js → skills-l2cyQ3zS.js} +2 -2
  90. package/dist/web/server/assets/start-CYDpZ6cb.js +4 -0
  91. package/dist/web/server/assets/{telegram-sUckI94O.js → telegram-BdaUIjvs.js} +1 -1
  92. package/dist/web/server/assets/{telegram-BbvqVWxa.js → telegram-DfAddLdv.js} +1 -1
  93. package/dist/web/server/assets/{telegram-Bq49AtnP.js → telegram-T3l9KtiE.js} +2 -2
  94. package/dist/web/server/assets/{tokens-Dwn00iV7.js → tokens-BCz3PSoT.js} +1 -1
  95. package/dist/web/server/assets/{tokens-CImgxhDI.js → tokens-CkKqrtk-.js} +1 -1
  96. package/dist/web/server/assets/{tokens-BERRE0wB.js → tokens-DdpnfV_Y.js} +2 -2
  97. package/dist/web/server/assets/{triggers-TyIjwSYn.js → triggers-BcH_6PW1.js} +1 -1
  98. package/dist/web/server/assets/{triggers-DtexqbNH.js → triggers-BcTTwMfy.js} +2 -2
  99. package/dist/web/server/assets/{triggers-_iSeahif.js → triggers-BzJG1nN5.js} +1 -1
  100. package/dist/web/server/assets/{welcome-BkQ9NC5K.js → welcome-CP4CZ9B6.js} +13 -9
  101. package/dist/web/server/server.js +94 -82
  102. package/dist/worker.js +65 -2
  103. package/dist/worker.js.map +1 -1
  104. package/package.json +17 -17
  105. package/dist/web/client/assets/AgentAvatar-Cq7PVBE_.js +0 -1
  106. package/dist/web/client/assets/AgentTabs-M5K8emJ8.js +0 -1
  107. package/dist/web/client/assets/Button-BefUtjMZ.js +0 -1
  108. package/dist/web/client/assets/ChatPane-C8zQfpzH.js +0 -74
  109. package/dist/web/client/assets/ConfigTabs-DRqAymcN.js +0 -1
  110. package/dist/web/client/assets/FieldRow-BqWnxZiX.js +0 -1
  111. package/dist/web/client/assets/MembersEditor-B-47GLUb.js +0 -1
  112. package/dist/web/client/assets/SpawnTeamModal-DiiC7Nc0.js +0 -1
  113. package/dist/web/client/assets/TemplatesTabs-DB4KERTQ.js +0 -1
  114. package/dist/web/client/assets/_id-B7gv1aPQ.js +0 -1
  115. package/dist/web/client/assets/_id-C7d1AqS0.js +0 -1
  116. package/dist/web/client/assets/_id-DhiwjC8u.js +0 -1
  117. package/dist/web/client/assets/_id-p8lUuNFm.js +0 -1
  118. package/dist/web/client/assets/agents-v8G-wt0M.js +0 -1
  119. package/dist/web/client/assets/config-BdmYpS_y.js +0 -3
  120. package/dist/web/client/assets/groups-DiY_ExGM.js +0 -1
  121. package/dist/web/client/assets/inbox-DtfVx246.js +0 -1
  122. package/dist/web/client/assets/index-BQUL6oyH.js +0 -12
  123. package/dist/web/client/assets/login-CVS70W9g.js +0 -1
  124. package/dist/web/client/assets/mcp-BDLQq8OZ.js +0 -1
  125. package/dist/web/client/assets/memory-6GGuAXwx.js +0 -1
  126. package/dist/web/client/assets/profile-groups-BA8rwZMA.js +0 -1
  127. package/dist/web/client/assets/profiles-C0aAcPZg.js +0 -1
  128. package/dist/web/client/assets/routes-DgAhnKFw.js +0 -1
  129. package/dist/web/client/assets/services-BZ86QEah.js +0 -1
  130. package/dist/web/client/assets/skills-mv_NNNwo.js +0 -1
  131. package/dist/web/client/assets/styles-CmqUskDu.css +0 -2
  132. package/dist/web/client/assets/telegram-5f9WXs3x.js +0 -1
  133. package/dist/web/client/assets/tokens-DHiYsFUh.js +0 -1
  134. package/dist/web/client/assets/triggers-CjC8Ljrz.js +0 -1
  135. package/dist/web/client/assets/welcome-C-Cu-ziL.js +0 -1
  136. package/dist/web/server/assets/start-cOXH7eTI.js +0 -4
package/README.md CHANGED
@@ -33,7 +33,7 @@ From another terminal:
33
33
  # Set up a provider (env var, or `bazilion config set` to persist it).
34
34
  export ANTHROPIC_API_KEY=sk-ant-...
35
35
  bazilion provider enable anthropic
36
- bazilion provider models anthropic claude-sonnet-4-6
36
+ bazilion provider models-set anthropic claude-opus-4-8
37
37
 
38
38
  # Spawn an agent from the default profile and chat with it.
39
39
  bazilion agent spawn --profile default --name first
@@ -53,7 +53,7 @@ The web UI is bundled into the published `bazilion` package and starts with:
53
53
  bazilion dashboard
54
54
  ```
55
55
 
56
- For source development, clone the repo and run the daemon plus Vite dev server:
56
+ For source development, clone the repo and run the daemon plus Vite dev server. Node 24+ and pnpm 10+ are required; if `corepack` is unavailable, install pnpm directly with `npm install -g pnpm`.
57
57
 
58
58
  ```sh
59
59
  git clone https://github.com/rullopat/bazilion
@@ -71,13 +71,13 @@ bazilion auth openai login # browser flow on localhost:1455
71
71
  bazilion auth openai status # check connection / token expiry
72
72
  ```
73
73
 
74
- After connecting, enable `openai-codex` and curate at least one model. Credentials are stored AES-256-GCM-encrypted in the daemon's `secrets` table.
74
+ After connecting, enable `openai-codex` and curate at least one model, for example `gpt-5.3-codex-spark`. Credentials are stored AES-256-GCM-encrypted in the daemon's `secrets` table.
75
75
 
76
76
  ## What's in the box
77
77
 
78
78
  - **CLI + daemon + web UI**, spawned together via `bazilion dashboard`. The daemon binds `127.0.0.1:4321`, the web UI binds `127.0.0.1:4322`, and the daemon owns `~/.bazilion/` (SQLite DB, profiles, agents, groups, skills, logs).
79
79
  - **17 subcommand families**: `agent`, `profile`, `group`, `skill`, `provider`, `config`, `auth`, `memory`, `send`, `inbox`, `trigger`, `serve`, `doctor`, `backup`, `token`, `login`, `uninstall`.
80
- - **Provider support** via [pi-ai](https://www.npmjs.com/package/@earendil-works/pi-ai): Anthropic, OpenAI (key + ChatGPT OAuth), Google AI Studio + Vertex, Azure OpenAI, AWS Bedrock, Mistral, Groq, Cerebras, xAI, Z.AI, Hugging Face, OpenRouter, Vercel AI Gateway, LM Studio, Ollama.
80
+ - **Provider support** via [pi-ai](https://www.npmjs.com/package/@earendil-works/pi-ai): Anthropic, OpenAI (key + ChatGPT OAuth), Google AI Studio + Vertex, Azure OpenAI, AWS Bedrock, Mistral, Groq, Cerebras, xAI, zAI, Hugging Face, OpenRouter, Vercel AI Gateway, Cloudflare, GitHub Copilot, DeepSeek, Fireworks, Together, Moonshot/Kimi, MiniMax, Xiaomi MiMo, Ant Ling, NVIDIA NIM, OpenCode, LM Studio, Ollama, and llama.cpp.
81
81
  - **OpenClaw-compatible skills**: drop a `SKILL.md` into `~/.bazilion/skills/<name>/`, or import in bulk via `bazilion skill import --from openclaw`.
82
82
 
83
83
  ## Uninstall
package/dist/cli.js CHANGED
@@ -6,7 +6,7 @@ import { defineCommand as defineCommand23, runCommand, showUsage } from "citty";
6
6
  // package.json
7
7
  var package_default = {
8
8
  name: "bazilion",
9
- version: "0.6.0",
9
+ version: "0.8.0",
10
10
  description: "Multi-agent runtime CLI \u2014 spawn LLM agents, manage profiles/groups/skills, and run the local daemon.",
11
11
  license: "MIT",
12
12
  repository: {
@@ -49,26 +49,26 @@ var package_default = {
49
49
  access: "public"
50
50
  },
51
51
  dependencies: {
52
- "@earendil-works/pi-agent-core": "^0.77.0",
53
- "@earendil-works/pi-ai": "^0.77.0",
54
- "@earendil-works/pi-coding-agent": "^0.77.0",
55
- "@tanstack/react-router": "1.170.16",
56
- "@hono/node-server": "^2.0.4",
52
+ "@earendil-works/pi-agent-core": "^0.79.10",
53
+ "@earendil-works/pi-ai": "^0.79.10",
54
+ "@earendil-works/pi-coding-agent": "^0.79.10",
55
+ "@hono/node-server": "^2.0.6",
57
56
  "@mozilla/readability": "^0.6.0",
57
+ "@tanstack/react-router": "1.170.16",
58
58
  "@tobilu/qmd": "^2.5.3",
59
59
  "adm-zip": "^0.5.17",
60
60
  citty: "^0.2.2",
61
- dompurify: "^3.4.7",
62
- grammy: "^1.43.0",
63
- hono: "^4.12.23",
61
+ dompurify: "^3.4.11",
62
+ grammy: "^1.44.0",
63
+ hono: "^4.12.26",
64
64
  linkedom: "^0.18.12",
65
- "lucide-react": "^1.17.0",
66
- playwright: "^1.60.0",
65
+ "lucide-react": "^1.21.0",
66
+ playwright: "^1.61.0",
67
67
  "qrcode-terminal": "^0.12.0",
68
- react: "^19.2.6",
69
- "react-dom": "^19.2.6",
70
- typebox: "^1.1.39",
71
- undici: "^8.3.0",
68
+ react: "^19.2.7",
69
+ "react-dom": "^19.2.7",
70
+ typebox: "^1.3.0",
71
+ undici: "^8.5.0",
72
72
  yaml: "^2.9.0"
73
73
  },
74
74
  devDependencies: {
@@ -736,15 +736,38 @@ var skillAddCmd = defineCommand({
736
736
  meta: { name: "add", description: "Attach a skill to an agent" },
737
737
  args: {
738
738
  agent: { type: "positional", required: true },
739
- skill: { type: "positional", required: true }
739
+ skill: { type: "positional", required: true },
740
+ "allow-warnings": {
741
+ type: "boolean",
742
+ description: "Attach even when the static skill scan reports findings"
743
+ }
740
744
  },
741
745
  async run({ args }) {
742
746
  const client = createClient2();
743
- const body = { skill: args.skill };
744
- await client.post(`/api/agents/${args.agent}/skills`, body);
747
+ const body = { skill: args.skill, allowFindings: args["allow-warnings"] };
748
+ try {
749
+ await client.post(`/api/agents/${args.agent}/skills`, body);
750
+ } catch (err) {
751
+ if (err instanceof ApiClientError && err.body.code === "skill_scan_blocked") {
752
+ console.error(`error: ${err.body.error}`);
753
+ printSkillFindings(err.body.findings ?? []);
754
+ console.error(" hint: inspect the skill, then rerun with --allow-warnings to confirm");
755
+ process.exitCode = 1;
756
+ return;
757
+ }
758
+ throw err;
759
+ }
745
760
  console.log(`attached skill ${args.skill} to ${args.agent}`);
746
761
  }
747
762
  });
763
+ function printSkillFindings(findings) {
764
+ if (findings.length === 0) return;
765
+ console.error("scan findings:");
766
+ for (const f of findings) {
767
+ const line = f.line ? ` line ${f.line}` : "";
768
+ console.error(` ${f.severity}: ${f.code}${line} - ${f.message}`);
769
+ }
770
+ }
748
771
  var skillRmCmd = defineCommand({
749
772
  meta: { name: "rm", description: "Detach a skill from an agent" },
750
773
  args: {
@@ -872,8 +895,11 @@ var openaiLoginCmd = defineCommand2({
872
895
  if (status.accountId) console.log(`account: ${status.accountId}`);
873
896
  console.log(`access token expires: ${formatExpiry(status.expiresAt)}`);
874
897
  console.log("");
875
- console.log(`enable the 'openai-codex' provider on /config and add at least one model`);
876
- console.log("(e.g. gpt-5.3-codex, gpt-5.4, gpt-5.5) to start using it.");
898
+ console.log(`enable the 'openai-codex' provider on /config and save at least one model`);
899
+ console.log("(e.g. gpt-5.3-codex-spark, gpt-5.4, gpt-5.5) to start using it.");
900
+ console.log("CLI equivalent:");
901
+ console.log(" bazilion provider enable openai-codex");
902
+ console.log(" bazilion provider models-set openai-codex gpt-5.3-codex-spark");
877
903
  }
878
904
  });
879
905
  var openaiLogoutCmd = defineCommand2({
@@ -1507,7 +1533,7 @@ var doctorCommand = defineCommand7({
1507
1533
  check("all skills parse", false, `${r.skills.parseErrors} skill(s) have errors`);
1508
1534
  }
1509
1535
  console.log();
1510
- console.log("providers (at least one needed for chat)");
1536
+ console.log("providers (enable one and save at least one model for chat)");
1511
1537
  if (r.providers.configured.length === 0) {
1512
1538
  console.log(" - no cloud providers configured");
1513
1539
  console.log(" (set e.g. ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY)");
@@ -1567,7 +1593,10 @@ var doctorCommand = defineCommand7({
1567
1593
  todo.push(" - set a cloud api key (ANTHROPIC_API_KEY / OPENAI_API_KEY / GEMINI_API_KEY)");
1568
1594
  todo.push(" or make sure LMStudio / Ollama is running locally");
1569
1595
  }
1570
- if (!hasProfiles) todo.push(" - create a profile: bazilion profile create <id> --model \u2026");
1596
+ if (!hasProfiles) {
1597
+ todo.push(" - enable a provider: bazilion provider enable <provider>");
1598
+ todo.push(" - save a model: bazilion provider models-set <provider> <model-id>");
1599
+ }
1571
1600
  if (!hasAgents) todo.push(" - spawn an agent: bazilion agent spawn --profile <id>");
1572
1601
  for (const line of todo) console.log(line);
1573
1602
  } else {
@@ -2824,6 +2853,12 @@ var serveCommand = defineCommand17({
2824
2853
  import { existsSync as existsSync6, readFileSync as readFileSync7, statSync } from "fs";
2825
2854
  import { basename as basename2, resolve as resolve2 } from "path";
2826
2855
  import { defineCommand as defineCommand18 } from "citty";
2856
+ function printFindings(findings, prefix = " ") {
2857
+ for (const f of findings) {
2858
+ const line = f.line ? ` line ${f.line}` : "";
2859
+ console.log(`${prefix}${f.severity}: ${f.code}${line} - ${f.message}`);
2860
+ }
2861
+ }
2827
2862
  var listCmd10 = defineCommand18({
2828
2863
  meta: { name: "list", description: "List installed skills (or those attached to an agent)" },
2829
2864
  args: {
@@ -2854,6 +2889,15 @@ var listCmd10 = defineCommand18({
2854
2889
  s.parseError ? `(parse error: ${s.parseError})` : s.description
2855
2890
  ]);
2856
2891
  for (const line of columnize(rows)) console.log(line);
2892
+ const flagged = skills.filter((s) => s.scanFindings && s.scanFindings.length > 0);
2893
+ if (flagged.length > 0) {
2894
+ console.log("");
2895
+ console.log("scan findings:");
2896
+ for (const s of flagged) {
2897
+ console.log(`${s.name}:`);
2898
+ printFindings(s.scanFindings ?? []);
2899
+ }
2900
+ }
2857
2901
  }
2858
2902
  });
2859
2903
  var importCmd = defineCommand18({
@@ -2874,19 +2918,36 @@ var importCmd = defineCommand18({
2874
2918
  const absFrom = resolve2(args.from);
2875
2919
  const isLocalZip = args.from.toLowerCase().endsWith(".zip") && existsSync6(absFrom) && statSync(absFrom).isFile();
2876
2920
  let result;
2877
- if (isLocalZip) {
2878
- const bytes = readFileSync7(absFrom);
2879
- const file = new File([bytes], basename2(absFrom), { type: "application/zip" });
2880
- const fd = new FormData();
2881
- fd.set("file", file);
2882
- if (args.force) fd.set("force", "true");
2883
- result = await client.postMultipart("/api/skills/import", fd);
2884
- } else {
2885
- const body = {
2886
- source: args.from,
2887
- force: args.force
2888
- };
2889
- result = await client.post("/api/skills/import", body);
2921
+ try {
2922
+ if (isLocalZip) {
2923
+ const bytes = readFileSync7(absFrom);
2924
+ const file = new File([bytes], basename2(absFrom), { type: "application/zip" });
2925
+ const fd = new FormData();
2926
+ fd.set("file", file);
2927
+ if (args.force) fd.set("force", "true");
2928
+ result = await client.postMultipart("/api/skills/import", fd);
2929
+ } else {
2930
+ const body = {
2931
+ source: args.from,
2932
+ force: args.force
2933
+ };
2934
+ result = await client.post("/api/skills/import", body);
2935
+ }
2936
+ } catch (err) {
2937
+ if (err instanceof ApiClientError && err.body.code === "skill_scan_blocked") {
2938
+ console.error(`error: ${err.body.error}`);
2939
+ if (err.body.findings && err.body.findings.length > 0) {
2940
+ console.error("scan findings:");
2941
+ for (const f of err.body.findings) {
2942
+ const line = f.line ? ` line ${f.line}` : "";
2943
+ console.error(` ${f.severity}: ${f.code}${line} - ${f.message}`);
2944
+ }
2945
+ }
2946
+ console.error(" hint: inspect the skill, then rerun with --force to confirm");
2947
+ process.exitCode = 1;
2948
+ return;
2949
+ }
2950
+ throw err;
2890
2951
  }
2891
2952
  if (result.imported.length === 0 && result.skipped.length === 0) {
2892
2953
  console.log("(nothing to import)");
@@ -2898,6 +2959,14 @@ var importCmd = defineCommand18({
2898
2959
  for (const s of result.skipped) {
2899
2960
  console.log(`skipped ${s.name}: ${s.reason}`);
2900
2961
  }
2962
+ if (result.findings && Object.keys(result.findings).length > 0) {
2963
+ console.log("");
2964
+ console.log("confirmed scan findings:");
2965
+ for (const [name, findings] of Object.entries(result.findings)) {
2966
+ console.log(`${name}:`);
2967
+ printFindings(findings);
2968
+ }
2969
+ }
2901
2970
  }
2902
2971
  });
2903
2972
  var rmCmd5 = defineCommand18({