zubo 0.1.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 (222) hide show
  1. package/.github/workflows/ci.yml +35 -0
  2. package/README.md +149 -0
  3. package/bun.lock +216 -0
  4. package/desktop/README.md +57 -0
  5. package/desktop/package.json +12 -0
  6. package/desktop/src-tauri/Cargo.toml +25 -0
  7. package/desktop/src-tauri/build.rs +3 -0
  8. package/desktop/src-tauri/icons/README.md +17 -0
  9. package/desktop/src-tauri/icons/icon.png +0 -0
  10. package/desktop/src-tauri/src/main.rs +189 -0
  11. package/desktop/src-tauri/tauri.conf.json +68 -0
  12. package/docs/ROADMAP.md +490 -0
  13. package/migrations/001_init.sql +9 -0
  14. package/migrations/002_memory.sql +33 -0
  15. package/migrations/003_cron.sql +24 -0
  16. package/migrations/004_usage.sql +12 -0
  17. package/migrations/005_secrets.sql +8 -0
  18. package/migrations/006_agents.sql +1 -0
  19. package/migrations/007_workflows.sql +22 -0
  20. package/migrations/008_proactive.sql +24 -0
  21. package/migrations/009_uploads.sql +9 -0
  22. package/migrations/010_observability.sql +22 -0
  23. package/migrations/011_api_keys.sql +7 -0
  24. package/migrations/012_indexes.sql +5 -0
  25. package/migrations/013_budget.sql +11 -0
  26. package/migrations/014_usage_session_idx.sql +2 -0
  27. package/package.json +39 -0
  28. package/site/404.html +156 -0
  29. package/site/CNAME +1 -0
  30. package/site/docs/agents.html +294 -0
  31. package/site/docs/api.html +446 -0
  32. package/site/docs/channels.html +345 -0
  33. package/site/docs/cli.html +238 -0
  34. package/site/docs/config.html +1034 -0
  35. package/site/docs/index.html +433 -0
  36. package/site/docs/integrations.html +381 -0
  37. package/site/docs/memory.html +254 -0
  38. package/site/docs/security.html +375 -0
  39. package/site/docs/skills.html +322 -0
  40. package/site/docs.css +412 -0
  41. package/site/index.html +638 -0
  42. package/site/install.sh +98 -0
  43. package/site/logo.svg +1 -0
  44. package/site/og-image.png +0 -0
  45. package/site/robots.txt +4 -0
  46. package/site/script.js +361 -0
  47. package/site/sitemap.xml +63 -0
  48. package/site/skills.html +532 -0
  49. package/site/style.css +1686 -0
  50. package/src/agent/agents.ts +159 -0
  51. package/src/agent/compaction.ts +53 -0
  52. package/src/agent/context.ts +18 -0
  53. package/src/agent/delegate.ts +118 -0
  54. package/src/agent/loop.ts +318 -0
  55. package/src/agent/prompts.ts +111 -0
  56. package/src/agent/session.ts +87 -0
  57. package/src/agent/teams.ts +116 -0
  58. package/src/agent/workflow-executor.ts +192 -0
  59. package/src/agent/workflow.ts +175 -0
  60. package/src/channels/adapter.ts +21 -0
  61. package/src/channels/dashboard.html.ts +2969 -0
  62. package/src/channels/discord.ts +137 -0
  63. package/src/channels/optional-deps.d.ts +17 -0
  64. package/src/channels/router.ts +199 -0
  65. package/src/channels/signal.ts +133 -0
  66. package/src/channels/slack.ts +101 -0
  67. package/src/channels/telegram.ts +102 -0
  68. package/src/channels/utils.ts +18 -0
  69. package/src/channels/webchat.ts +1797 -0
  70. package/src/channels/whatsapp.ts +119 -0
  71. package/src/config/loader.ts +22 -0
  72. package/src/config/paths.ts +43 -0
  73. package/src/config/schema.ts +121 -0
  74. package/src/db/connection.ts +20 -0
  75. package/src/db/export.ts +148 -0
  76. package/src/db/migrations.ts +42 -0
  77. package/src/index.ts +261 -0
  78. package/src/llm/claude.ts +193 -0
  79. package/src/llm/factory.ts +115 -0
  80. package/src/llm/failover.ts +101 -0
  81. package/src/llm/openai-compat.ts +409 -0
  82. package/src/llm/provider.ts +83 -0
  83. package/src/llm/smart-router.ts +241 -0
  84. package/src/logs.ts +53 -0
  85. package/src/memory/chunker.ts +58 -0
  86. package/src/memory/document-parser.ts +115 -0
  87. package/src/memory/embedder.ts +235 -0
  88. package/src/memory/engine.ts +170 -0
  89. package/src/memory/fts-index.ts +55 -0
  90. package/src/memory/hybrid-search.ts +72 -0
  91. package/src/memory/store.ts +56 -0
  92. package/src/memory/vector-index.ts +72 -0
  93. package/src/model.ts +118 -0
  94. package/src/registry/cli.ts +43 -0
  95. package/src/registry/client.ts +54 -0
  96. package/src/registry/installer.ts +67 -0
  97. package/src/scheduler/briefing.ts +71 -0
  98. package/src/scheduler/cron.ts +258 -0
  99. package/src/scheduler/heartbeat.ts +58 -0
  100. package/src/scheduler/memory-triggers.ts +100 -0
  101. package/src/scheduler/natural-cron.ts +163 -0
  102. package/src/scheduler/proactive.ts +25 -0
  103. package/src/scheduler/recipes.ts +110 -0
  104. package/src/secrets/store.ts +64 -0
  105. package/src/setup.ts +413 -0
  106. package/src/skills.ts +293 -0
  107. package/src/start.ts +373 -0
  108. package/src/status.ts +165 -0
  109. package/src/tools/builtin/connect-service.ts +205 -0
  110. package/src/tools/builtin/cron.ts +126 -0
  111. package/src/tools/builtin/datetime.ts +36 -0
  112. package/src/tools/builtin/delegate-task.ts +81 -0
  113. package/src/tools/builtin/delegate.ts +42 -0
  114. package/src/tools/builtin/diagnose.ts +41 -0
  115. package/src/tools/builtin/google-oauth.ts +379 -0
  116. package/src/tools/builtin/manage-agents.ts +149 -0
  117. package/src/tools/builtin/manage-skills.ts +294 -0
  118. package/src/tools/builtin/manage-teams.ts +89 -0
  119. package/src/tools/builtin/manage-triggers.ts +94 -0
  120. package/src/tools/builtin/manage-workflows.ts +119 -0
  121. package/src/tools/builtin/memory-search.ts +38 -0
  122. package/src/tools/builtin/memory-write.ts +30 -0
  123. package/src/tools/builtin/run-workflow.ts +36 -0
  124. package/src/tools/builtin/secrets.ts +122 -0
  125. package/src/tools/builtin/skill-registry.ts +75 -0
  126. package/src/tools/builtin-integrations/api-helpers.ts +26 -0
  127. package/src/tools/builtin-integrations/github/github_issues/SKILL.md +56 -0
  128. package/src/tools/builtin-integrations/github/github_issues/handler.ts +108 -0
  129. package/src/tools/builtin-integrations/github/github_prs/SKILL.md +57 -0
  130. package/src/tools/builtin-integrations/github/github_prs/handler.ts +113 -0
  131. package/src/tools/builtin-integrations/github/github_repos/SKILL.md +37 -0
  132. package/src/tools/builtin-integrations/github/github_repos/handler.ts +88 -0
  133. package/src/tools/builtin-integrations/google/gmail/SKILL.md +51 -0
  134. package/src/tools/builtin-integrations/google/gmail/handler.ts +125 -0
  135. package/src/tools/builtin-integrations/google/google_calendar/SKILL.md +35 -0
  136. package/src/tools/builtin-integrations/google/google_calendar/handler.ts +105 -0
  137. package/src/tools/builtin-integrations/google/google_docs/SKILL.md +35 -0
  138. package/src/tools/builtin-integrations/google/google_docs/handler.ts +108 -0
  139. package/src/tools/builtin-integrations/google/google_drive/SKILL.md +39 -0
  140. package/src/tools/builtin-integrations/google/google_drive/handler.ts +106 -0
  141. package/src/tools/builtin-integrations/google/google_sheets/SKILL.md +36 -0
  142. package/src/tools/builtin-integrations/google/google_sheets/handler.ts +116 -0
  143. package/src/tools/builtin-integrations/jira/jira_boards/SKILL.md +21 -0
  144. package/src/tools/builtin-integrations/jira/jira_boards/handler.ts +74 -0
  145. package/src/tools/builtin-integrations/jira/jira_issues/SKILL.md +28 -0
  146. package/src/tools/builtin-integrations/jira/jira_issues/handler.ts +140 -0
  147. package/src/tools/builtin-integrations/linear/linear_issues/SKILL.md +30 -0
  148. package/src/tools/builtin-integrations/linear/linear_issues/handler.ts +75 -0
  149. package/src/tools/builtin-integrations/linear/linear_projects/SKILL.md +21 -0
  150. package/src/tools/builtin-integrations/linear/linear_projects/handler.ts +43 -0
  151. package/src/tools/builtin-integrations/notion/notion_databases/SKILL.md +39 -0
  152. package/src/tools/builtin-integrations/notion/notion_databases/handler.ts +83 -0
  153. package/src/tools/builtin-integrations/notion/notion_pages/SKILL.md +43 -0
  154. package/src/tools/builtin-integrations/notion/notion_pages/handler.ts +130 -0
  155. package/src/tools/builtin-integrations/notion/notion_search/SKILL.md +27 -0
  156. package/src/tools/builtin-integrations/notion/notion_search/handler.ts +69 -0
  157. package/src/tools/builtin-integrations/slack/slack_messages/SKILL.md +42 -0
  158. package/src/tools/builtin-integrations/slack/slack_messages/handler.ts +72 -0
  159. package/src/tools/builtin-integrations/twitter/twitter_posts/SKILL.md +24 -0
  160. package/src/tools/builtin-integrations/twitter/twitter_posts/handler.ts +133 -0
  161. package/src/tools/builtin-skills/file-read/SKILL.md +26 -0
  162. package/src/tools/builtin-skills/file-read/handler.ts +66 -0
  163. package/src/tools/builtin-skills/file-write/SKILL.md +30 -0
  164. package/src/tools/builtin-skills/file-write/handler.ts +64 -0
  165. package/src/tools/builtin-skills/http-request/SKILL.md +34 -0
  166. package/src/tools/builtin-skills/http-request/handler.ts +87 -0
  167. package/src/tools/builtin-skills/shell/SKILL.md +26 -0
  168. package/src/tools/builtin-skills/shell/handler.ts +96 -0
  169. package/src/tools/builtin-skills/url-fetch/SKILL.md +26 -0
  170. package/src/tools/builtin-skills/url-fetch/handler.ts +37 -0
  171. package/src/tools/builtin-skills/web-search/SKILL.md +26 -0
  172. package/src/tools/builtin-skills/web-search/handler.ts +50 -0
  173. package/src/tools/executor.ts +205 -0
  174. package/src/tools/integration-installer.ts +106 -0
  175. package/src/tools/permissions.ts +45 -0
  176. package/src/tools/registry.ts +39 -0
  177. package/src/tools/sandbox-runner.ts +56 -0
  178. package/src/tools/sandbox.ts +82 -0
  179. package/src/tools/skill-installer.ts +52 -0
  180. package/src/tools/skill-loader.ts +259 -0
  181. package/src/types/optional-deps.d.ts +23 -0
  182. package/src/util/auth.ts +121 -0
  183. package/src/util/costs.ts +59 -0
  184. package/src/util/error-buffer.ts +32 -0
  185. package/src/util/google-tokens.ts +180 -0
  186. package/src/util/logger.ts +73 -0
  187. package/src/util/perf-collector.ts +35 -0
  188. package/src/util/rate-limiter.ts +70 -0
  189. package/src/util/tokens.ts +17 -0
  190. package/src/voice/stt.ts +57 -0
  191. package/src/voice/tts.ts +103 -0
  192. package/tests/agent/session.test.ts +109 -0
  193. package/tests/agent-loop.test.ts +54 -0
  194. package/tests/auth.test.ts +89 -0
  195. package/tests/channels.test.ts +67 -0
  196. package/tests/compaction.test.ts +44 -0
  197. package/tests/config.test.ts +51 -0
  198. package/tests/costs.test.ts +19 -0
  199. package/tests/cron.test.ts +55 -0
  200. package/tests/db/export.test.ts +219 -0
  201. package/tests/executor.test.ts +144 -0
  202. package/tests/export.test.ts +137 -0
  203. package/tests/helpers/mock-llm.ts +34 -0
  204. package/tests/helpers/test-db.ts +74 -0
  205. package/tests/integration/chat-flow.test.ts +48 -0
  206. package/tests/integrations.test.ts +97 -0
  207. package/tests/memory/engine.test.ts +114 -0
  208. package/tests/memory-engine.test.ts +57 -0
  209. package/tests/permissions.test.ts +21 -0
  210. package/tests/rate-limiter.test.ts +70 -0
  211. package/tests/registry.test.ts +67 -0
  212. package/tests/router.test.ts +36 -0
  213. package/tests/session.test.ts +58 -0
  214. package/tests/skill-loader.test.ts +44 -0
  215. package/tests/tokens.test.ts +30 -0
  216. package/tests/tools/executor.test.ts +130 -0
  217. package/tests/util/auth.test.ts +75 -0
  218. package/tests/util/rate-limiter.test.ts +73 -0
  219. package/tests/voice.test.ts +60 -0
  220. package/tests/webchat.test.ts +88 -0
  221. package/tests/workflow.test.ts +38 -0
  222. package/tsconfig.json +16 -0
@@ -0,0 +1,345 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Channel Setup — Zubo Docs</title>
7
+ <meta name="description" content="Connect Zubo to Telegram, Discord, Slack, WhatsApp, Signal, and Web Chat. Step-by-step setup guides for every supported messaging channel.">
8
+ <meta name="theme-color" content="#060608">
9
+ <link rel="canonical" href="https://zubo.bot/docs/channels.html">
10
+ <meta property="og:title" content="Channel Setup — Zubo Docs">
11
+ <meta property="og:description" content="Connect Zubo to Telegram, Discord, Slack, WhatsApp, Signal, and Web Chat. Step-by-step setup guides.">
12
+ <meta property="og:type" content="article">
13
+ <meta property="og:url" content="https://zubo.bot/docs/channels.html">
14
+ <meta property="og:image" content="https://zubo.bot/og-image.png">
15
+ <meta property="og:site_name" content="Zubo">
16
+ <meta name="twitter:card" content="summary_large_image">
17
+ <meta name="twitter:title" content="Channel Setup — Zubo Docs">
18
+ <meta name="twitter:description" content="Connect Zubo to Telegram, Discord, Slack, WhatsApp, Signal, and Web Chat.">
19
+ <meta name="twitter:image" content="https://zubo.bot/og-image.png">
20
+ <meta name="twitter:creator" content="@thomaskanze">
21
+ <link rel="preconnect" href="https://fonts.googleapis.com">
22
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
23
+ <link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,600;12..96,700;12..96,800&family=DM+Sans:ital,opsz,wght@0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700;1,9..40,400&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
24
+ <link rel="stylesheet" href="../style.css">
25
+ <link rel="stylesheet" href="../docs.css">
26
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><rect width='100' height='100' rx='20' fill='%237c3aed'/><path d='M50 15C52 37 63 48 85 50C63 52 52 63 50 85C48 63 37 52 15 50C37 48 48 37 50 15Z' fill='white'/></svg>">
27
+ </head>
28
+ <body>
29
+
30
+ <header class="nav scrolled" id="nav">
31
+ <div class="nav-inner">
32
+ <a href="../index.html" class="nav-logo">
33
+ <span class="logo-wordmark">zubo</span>
34
+ </a>
35
+ <nav class="nav-links" id="nav-links">
36
+ <a href="../index.html#features">Features</a>
37
+ <a href="index.html" style="color:#fff;">Docs</a>
38
+ <a href="../skills.html">Skills</a>
39
+ <a href="../index.html#get-started">Get Started</a>
40
+ </nav>
41
+ <div class="nav-right">
42
+ <a href="https://github.com/apwn/zubo" class="nav-github" aria-label="GitHub">
43
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/></svg>
44
+ </a>
45
+ <a href="../index.html#get-started" class="btn btn-primary btn-nav">Get Started</a>
46
+ <button class="nav-toggle" id="nav-toggle" aria-label="Toggle menu">
47
+ <span></span><span></span><span></span>
48
+ </button>
49
+ </div>
50
+ </div>
51
+ </header>
52
+
53
+ <div class="docs-layout">
54
+ <aside class="docs-sidebar" id="docs-sidebar">
55
+ <div class="docs-sidebar-section">
56
+ <div class="docs-sidebar-heading">Getting Started</div>
57
+ <div class="docs-sidebar-links">
58
+ <a href="index.html">Overview</a>
59
+ <a href="config.html">Configuration</a>
60
+ </div>
61
+ </div>
62
+ <div class="docs-sidebar-section">
63
+ <div class="docs-sidebar-heading">Core Concepts</div>
64
+ <div class="docs-sidebar-links">
65
+ <a href="agents.html">Agents &amp; Workflows</a>
66
+ <a href="memory.html">Memory System</a>
67
+ <a href="skills.html">Skills</a>
68
+ </div>
69
+ </div>
70
+ <div class="docs-sidebar-section">
71
+ <div class="docs-sidebar-heading">Guides</div>
72
+ <div class="docs-sidebar-links">
73
+ <a href="channels.html" class="active">Channel Setup</a>
74
+ <a href="integrations.html">Integrations</a>
75
+ <a href="security.html">Security &amp; Auth</a>
76
+ </div>
77
+ </div>
78
+ <div class="docs-sidebar-section">
79
+ <div class="docs-sidebar-heading">Reference</div>
80
+ <div class="docs-sidebar-links">
81
+ <a href="api.html">API Reference</a>
82
+ <a href="cli.html">CLI Commands</a>
83
+ </div>
84
+ </div>
85
+ </aside>
86
+
87
+ <main class="docs-content">
88
+ <div class="docs-breadcrumb">
89
+ <a href="../index.html">Home</a>
90
+ <span>/</span>
91
+ <a href="index.html">Docs</a>
92
+ <span>/</span>
93
+ Channel Setup
94
+ </div>
95
+
96
+ <h1>Channel Setup</h1>
97
+ <p>Zubo connects to multiple messaging platforms simultaneously. All channels share the same agent personality, memory, tools, and skills. Messages from any channel are routed through the unified agent loop &mdash; so your agent behaves consistently whether someone messages it on Telegram, Discord, Slack, WhatsApp, Signal, or the built-in web chat.</p>
98
+
99
+ <h2>Web Chat (Always On)</h2>
100
+ <p>The web chat channel is enabled by default and requires no configuration. When Zubo starts, it serves a full-featured chat interface and dashboard at <code>http://localhost:&lt;port&gt;</code>.</p>
101
+ <ul>
102
+ <li><strong>No setup required</strong> &mdash; web chat is active out of the box</li>
103
+ <li><strong>Port</strong> &mdash; auto-assigned (<code>0</code>) by default, or set a specific port via config</li>
104
+ <li><strong>Features</strong> &mdash; streaming responses, file upload, voice input, tool status indicators, full conversation history</li>
105
+ <li><strong>Dashboard</strong> &mdash; the same URL serves the Zubo dashboard with analytics, memory management, skills, and settings</li>
106
+ </ul>
107
+ <p>Configuration:</p>
108
+ <pre><code>{
109
+ "channels": {
110
+ "webchat": { "enabled": true, "port": 3000 }
111
+ }
112
+ }</code></pre>
113
+ <p>Or set the port via CLI:</p>
114
+ <pre><code>zubo config set channels.webchat.port 3000</code></pre>
115
+
116
+ <h2>Telegram</h2>
117
+ <p>Connect Zubo to Telegram so you can chat with your agent from the Telegram app on any device.</p>
118
+ <h3>Setup Steps</h3>
119
+ <ol>
120
+ <li>Open Telegram and search for <strong>@BotFather</strong></li>
121
+ <li>Send <code>/newbot</code> and follow the prompts to create a new bot. BotFather will give you a bot token (e.g., <code>123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11</code>)</li>
122
+ <li>Add the token to your Zubo config:
123
+ <pre><code>zubo config set channels.telegram.botToken "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11"</code></pre>
124
+ </li>
125
+ <li>(Optional) Restrict access to specific Telegram users by their numeric user ID:
126
+ <pre><code>{
127
+ "channels": {
128
+ "telegram": {
129
+ "botToken": "123456:ABC-DEF...",
130
+ "allowedUsers": [12345678]
131
+ }
132
+ }
133
+ }</code></pre>
134
+ </li>
135
+ <li>Restart Zubo: <code>zubo restart</code></li>
136
+ </ol>
137
+ <p><strong>Getting your Telegram user ID:</strong> search for <strong>@userinfobot</strong> on Telegram and send it any message. It will reply with your numeric user ID.</p>
138
+
139
+ <h3>Config Fields</h3>
140
+ <table>
141
+ <thead>
142
+ <tr><th>Field</th><th>Type</th><th>Default</th><th>Description</th></tr>
143
+ </thead>
144
+ <tbody>
145
+ <tr><td><code>enabled</code></td><td>boolean</td><td><code>true</code></td><td>Enable or disable the Telegram channel</td></tr>
146
+ <tr><td><code>botToken</code></td><td>string</td><td>&mdash;</td><td>Bot token from BotFather</td></tr>
147
+ <tr><td><code>allowedUsers</code></td><td>number[]</td><td><code>[]</code></td><td>Telegram user IDs allowed to message. Empty array means anyone can message.</td></tr>
148
+ </tbody>
149
+ </table>
150
+
151
+ <h2>Discord</h2>
152
+ <p>Add Zubo as a Discord bot so it can respond to messages in your server.</p>
153
+ <h3>Setup Steps</h3>
154
+ <ol>
155
+ <li>Go to the <a href="https://discord.com/developers/applications">Discord Developer Portal</a></li>
156
+ <li>Click <strong>New Application</strong> and give it a name</li>
157
+ <li>Go to the <strong>Bot</strong> section in the left sidebar, then click <strong>Reset Token</strong> to generate a bot token. Copy and save it.</li>
158
+ <li>Still in the Bot section, scroll down to <strong>Privileged Gateway Intents</strong> and enable <strong>Message Content Intent</strong></li>
159
+ <li>Go to <strong>OAuth2 &rarr; URL Generator</strong> in the left sidebar. Select the <code>bot</code> scope, then check the <strong>Send Messages</strong> and <strong>Read Message History</strong> permissions.</li>
160
+ <li>Copy the generated URL at the bottom and open it in your browser to invite the bot to your server</li>
161
+ <li>Add the token to your Zubo config:
162
+ <pre><code>zubo config set channels.discord.botToken "MTk4NjIz..."</code></pre>
163
+ </li>
164
+ <li>Restart Zubo: <code>zubo restart</code></li>
165
+ </ol>
166
+
167
+ <h3>Config Fields</h3>
168
+ <table>
169
+ <thead>
170
+ <tr><th>Field</th><th>Type</th><th>Default</th><th>Description</th></tr>
171
+ </thead>
172
+ <tbody>
173
+ <tr><td><code>enabled</code></td><td>boolean</td><td><code>true</code></td><td>Enable or disable the Discord channel</td></tr>
174
+ <tr><td><code>botToken</code></td><td>string</td><td>&mdash;</td><td>Bot token from the Discord Developer Portal</td></tr>
175
+ <tr><td><code>allowedUsers</code></td><td>string[]</td><td><code>[]</code></td><td>Discord user IDs allowed to message. Empty array means anyone can message.</td></tr>
176
+ </tbody>
177
+ </table>
178
+
179
+ <h2>Slack</h2>
180
+ <p>Connect Zubo to your Slack workspace using Socket Mode for real-time communication without exposing a public URL.</p>
181
+ <h3>Setup Steps</h3>
182
+ <ol>
183
+ <li>Go to <a href="https://api.slack.com/apps">api.slack.com/apps</a> and click <strong>Create New App</strong>. Choose "From scratch" and select your workspace.</li>
184
+ <li>In the left sidebar, go to <strong>Settings &rarr; Socket Mode</strong> and enable it</li>
185
+ <li>When prompted, generate an <strong>App-Level Token</strong> with the <code>connections:write</code> scope. Copy this token (it starts with <code>xapp-</code>).</li>
186
+ <li>Go to <strong>OAuth &amp; Permissions</strong> in the left sidebar. Under <strong>Bot Token Scopes</strong>, add: <code>chat:write</code>, <code>app_mentions:read</code>, <code>im:history</code>, <code>im:read</code>, <code>im:write</code></li>
187
+ <li>Click <strong>Install to Workspace</strong> at the top of the page and authorize. Copy the <strong>Bot User OAuth Token</strong> (it starts with <code>xoxb-</code>).</li>
188
+ <li>Add both tokens to your Zubo config:
189
+ <pre><code>{
190
+ "channels": {
191
+ "slack": {
192
+ "botToken": "xoxb-...",
193
+ "appToken": "xapp-...",
194
+ "allowedUsers": []
195
+ }
196
+ }
197
+ }</code></pre>
198
+ </li>
199
+ <li>Restart Zubo: <code>zubo restart</code></li>
200
+ </ol>
201
+
202
+ <h3>Config Fields</h3>
203
+ <table>
204
+ <thead>
205
+ <tr><th>Field</th><th>Type</th><th>Default</th><th>Description</th></tr>
206
+ </thead>
207
+ <tbody>
208
+ <tr><td><code>enabled</code></td><td>boolean</td><td><code>true</code></td><td>Enable or disable the Slack channel</td></tr>
209
+ <tr><td><code>botToken</code></td><td>string</td><td>&mdash;</td><td>Bot User OAuth Token (starts with <code>xoxb-</code>)</td></tr>
210
+ <tr><td><code>appToken</code></td><td>string</td><td>&mdash;</td><td>App-Level Token (starts with <code>xapp-</code>)</td></tr>
211
+ <tr><td><code>allowedUsers</code></td><td>string[]</td><td><code>[]</code></td><td>Slack user IDs allowed to message. Empty array means anyone in the workspace can message.</td></tr>
212
+ </tbody>
213
+ </table>
214
+
215
+ <h2>WhatsApp</h2>
216
+ <p>Zubo connects to WhatsApp using the Baileys library, which provides an unofficial WhatsApp Web API. No Meta Business account or phone number API is required &mdash; it works by linking as a companion device to your existing WhatsApp account.</p>
217
+ <h3>Setup Steps</h3>
218
+ <ol>
219
+ <li>Add WhatsApp to your Zubo config:
220
+ <pre><code>{
221
+ "channels": {
222
+ "whatsapp": { "enabled": true }
223
+ }
224
+ }</code></pre>
225
+ </li>
226
+ <li>Start (or restart) Zubo. A QR code will appear in your terminal.</li>
227
+ <li>On your phone, open <strong>WhatsApp &rarr; Settings &rarr; Linked Devices &rarr; Link a Device</strong></li>
228
+ <li>Scan the QR code displayed in the terminal</li>
229
+ <li>Once linked, Zubo will respond to incoming WhatsApp messages</li>
230
+ </ol>
231
+
232
+ <h3>Config Fields</h3>
233
+ <table>
234
+ <thead>
235
+ <tr><th>Field</th><th>Type</th><th>Default</th><th>Description</th></tr>
236
+ </thead>
237
+ <tbody>
238
+ <tr><td><code>enabled</code></td><td>boolean</td><td><code>true</code></td><td>Enable or disable the WhatsApp channel</td></tr>
239
+ <tr><td><code>authDir</code></td><td>string</td><td>auto</td><td>Directory where WhatsApp authentication credentials are stored. Defaults to a directory inside <code>~/.zubo</code>.</td></tr>
240
+ <tr><td><code>allowedNumbers</code></td><td>string[]</td><td><code>[]</code></td><td>Phone numbers allowed to message, in international format (e.g., <code>"+1234567890"</code>). Empty array means anyone can message.</td></tr>
241
+ </tbody>
242
+ </table>
243
+
244
+ <h2>Signal</h2>
245
+ <p>Connect Zubo to Signal using <a href="https://github.com/AsamK/signal-cli">signal-cli</a>, a command-line interface for the Signal messenger.</p>
246
+ <h3>Setup Steps</h3>
247
+ <ol>
248
+ <li>Install signal-cli on your system:
249
+ <pre><code># macOS
250
+ brew install signal-cli
251
+
252
+ # Linux (download from GitHub releases)
253
+ # See: https://github.com/AsamK/signal-cli/releases</code></pre>
254
+ </li>
255
+ <li>Register your phone number with Signal:
256
+ <pre><code>signal-cli -u +1234567890 register</code></pre>
257
+ </li>
258
+ <li>Verify the number with the SMS code you receive:
259
+ <pre><code>signal-cli -u +1234567890 verify 123-456</code></pre>
260
+ </li>
261
+ <li>Add Signal to your Zubo config:
262
+ <pre><code>{
263
+ "channels": {
264
+ "signal": {
265
+ "phoneNumber": "+1234567890",
266
+ "signalCliPath": "/usr/local/bin/signal-cli",
267
+ "allowedNumbers": ["+1987654321"]
268
+ }
269
+ }
270
+ }</code></pre>
271
+ </li>
272
+ <li>Restart Zubo: <code>zubo restart</code></li>
273
+ </ol>
274
+
275
+ <h3>Config Fields</h3>
276
+ <table>
277
+ <thead>
278
+ <tr><th>Field</th><th>Type</th><th>Default</th><th>Description</th></tr>
279
+ </thead>
280
+ <tbody>
281
+ <tr><td><code>enabled</code></td><td>boolean</td><td><code>true</code></td><td>Enable or disable the Signal channel</td></tr>
282
+ <tr><td><code>phoneNumber</code></td><td>string</td><td>&mdash;</td><td>Your registered Signal phone number in international format</td></tr>
283
+ <tr><td><code>signalCliPath</code></td><td>string</td><td>auto</td><td>Path to the signal-cli binary. Zubo will attempt to find it automatically if not specified.</td></tr>
284
+ <tr><td><code>allowedNumbers</code></td><td>string[]</td><td><code>[]</code></td><td>Phone numbers allowed to message. Empty array means anyone can message.</td></tr>
285
+ </tbody>
286
+ </table>
287
+
288
+ <h2>Running Multiple Channels</h2>
289
+ <p>Zubo is designed to run all channels simultaneously. There is no limit to how many channels you can enable at once.</p>
290
+ <ul>
291
+ <li><strong>Shared state</strong> &mdash; all channels share the same memory, personality, tools, skills, and session. Your agent has one unified brain regardless of which platform a message comes from.</li>
292
+ <li><strong>Automatic routing</strong> &mdash; when a message arrives from Telegram, Discord, or any other channel, it goes through the same agent loop. The response is automatically sent back to whichever channel the message originated from.</li>
293
+ <li><strong>Proactive messages</strong> &mdash; scheduled tasks, alerts, and proactive triggers can broadcast to all connected channels simultaneously, or target a specific channel.</li>
294
+ <li><strong>Per-channel formatting</strong> &mdash; while the agent personality is shared, each channel adapter handles platform-specific formatting (Markdown for Telegram, embeds for Discord, blocks for Slack, etc.).</li>
295
+ </ul>
296
+
297
+ <h2>Channel Security</h2>
298
+ <p>Controlling who can interact with your agent is critical, especially for public-facing deployments.</p>
299
+ <ul>
300
+ <li><strong>Access control</strong> &mdash; use <code>allowedUsers</code> or <code>allowedNumbers</code> on each channel to restrict who can send messages. When the list is empty, anyone on that platform can message your agent.</li>
301
+ <li><strong>Rate limiting</strong> &mdash; the web chat channel enforces rate limits per IP address. Other channels enforce rate limits per user ID. Configure limits via <code>rateLimit.chatPerMinute</code> in your config.</li>
302
+ <li><strong>API authentication</strong> &mdash; enable bearer token auth for the web chat HTTP endpoints by setting <code>auth.enabled: true</code> in your config. See the <a href="security.html">Security &amp; Auth</a> guide for details.</li>
303
+ <li><strong>Tool confirmation</strong> &mdash; destructive tools like <code>shell</code>, <code>file_write</code>, and <code>secret_delete</code> require explicit user confirmation before executing, regardless of channel.</li>
304
+ </ul>
305
+
306
+ <h2>Best Practices</h2>
307
+ <ul>
308
+ <li><strong>Always set <code>allowedUsers</code></strong> for public-facing channels &mdash; without it, anyone who finds your bot can interact with your agent and its tools</li>
309
+ <li><strong>Start with web chat only</strong>, then add channels one at a time as needed. This makes it easier to debug connection issues.</li>
310
+ <li><strong>Disable without removing</strong> &mdash; use <code>zubo config set channels.telegram.enabled false</code> to temporarily disable a channel without deleting its configuration</li>
311
+ <li><strong>Check logs</strong> if a channel is not connecting: <code>zubo logs</code> will show connection errors and status updates for each channel adapter</li>
312
+ <li><strong>Monitor from the dashboard</strong> &mdash; the Settings &rarr; Channels page shows real-time connection status for every enabled channel</li>
313
+ <li><strong>Keep tokens secure</strong> &mdash; bot tokens grant full control over your bot. Never share them or commit them to version control. Zubo stores them in <code>~/.zubo/config.json</code> with restricted file permissions.</li>
314
+ <li><strong>Test incrementally</strong> &mdash; after adding a new channel, send a simple test message before relying on it for important tasks</li>
315
+ </ul>
316
+
317
+ <div class="docs-page-nav">
318
+ <a href="skills.html">
319
+ <span class="nav-dir">Previous</span>
320
+ <span class="nav-label">&larr; Skills</span>
321
+ </a>
322
+ <a href="integrations.html">
323
+ <span class="nav-dir">Next</span>
324
+ <span class="nav-label">Integrations &rarr;</span>
325
+ </a>
326
+ </div>
327
+ </main>
328
+ </div>
329
+
330
+ <button class="docs-sidebar-toggle" id="docs-sidebar-toggle" aria-label="Toggle sidebar">&#9776;</button>
331
+
332
+ <script src="../script.js"></script>
333
+ <script type="application/ld+json">
334
+ {
335
+ "@context": "https://schema.org",
336
+ "@type": "BreadcrumbList",
337
+ "itemListElement": [
338
+ { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://zubo.bot/" },
339
+ { "@type": "ListItem", "position": 2, "name": "Docs", "item": "https://zubo.bot/docs/" },
340
+ { "@type": "ListItem", "position": 3, "name": "Channel Setup", "item": "https://zubo.bot/docs/channels.html" }
341
+ ]
342
+ }
343
+ </script>
344
+ </body>
345
+ </html>
@@ -0,0 +1,238 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>CLI Commands — Zubo Docs</title>
7
+ <meta name="description" content="Complete CLI reference for Zubo. Every command with flags, examples, exit codes, and environment variables.">
8
+ <meta name="theme-color" content="#060608">
9
+ <link rel="canonical" href="https://zubo.bot/docs/cli.html">
10
+ <meta property="og:title" content="CLI Commands — Zubo Docs">
11
+ <meta property="og:description" content="Complete CLI reference for Zubo. Every command with flags, examples, exit codes, and environment variables.">
12
+ <meta property="og:type" content="article">
13
+ <meta property="og:url" content="https://zubo.bot/docs/cli.html">
14
+ <meta property="og:image" content="https://zubo.bot/og-image.png">
15
+ <meta property="og:site_name" content="Zubo">
16
+ <meta name="twitter:card" content="summary_large_image">
17
+ <meta name="twitter:title" content="CLI Commands — Zubo Docs">
18
+ <meta name="twitter:description" content="Complete CLI reference for Zubo. Every command with flags, examples, and exit codes.">
19
+ <meta name="twitter:image" content="https://zubo.bot/og-image.png">
20
+ <meta name="twitter:creator" content="@thomaskanze">
21
+ <link rel="preconnect" href="https://fonts.googleapis.com">
22
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
23
+ <link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,600;12..96,700;12..96,800&family=DM+Sans:ital,opsz,wght@0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700;1,9..40,400&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
24
+ <link rel="stylesheet" href="../style.css">
25
+ <link rel="stylesheet" href="../docs.css">
26
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><rect width='100' height='100' rx='20' fill='%237c3aed'/><path d='M50 15C52 37 63 48 85 50C63 52 52 63 50 85C48 63 37 52 15 50C37 48 48 37 50 15Z' fill='white'/></svg>">
27
+ </head>
28
+ <body>
29
+
30
+ <header class="nav scrolled" id="nav">
31
+ <div class="nav-inner">
32
+ <a href="../index.html" class="nav-logo"><span class="logo-wordmark">zubo</span></a>
33
+ <nav class="nav-links" id="nav-links">
34
+ <a href="../index.html#features">Features</a>
35
+ <a href="index.html" style="color:#fff;">Docs</a>
36
+ <a href="../skills.html">Skills</a>
37
+ <a href="../index.html#get-started">Get Started</a>
38
+ </nav>
39
+ <div class="nav-right">
40
+ <a href="https://github.com/apwn/zubo" class="nav-github" aria-label="GitHub"><svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/></svg></a>
41
+ <a href="../index.html#get-started" class="btn btn-primary btn-nav">Get Started</a>
42
+ <button class="nav-toggle" id="nav-toggle" aria-label="Toggle menu"><span></span><span></span><span></span></button>
43
+ </div>
44
+ </div>
45
+ </header>
46
+
47
+ <div class="docs-layout">
48
+ <aside class="docs-sidebar" id="docs-sidebar">
49
+ <div class="docs-sidebar-section">
50
+ <div class="docs-sidebar-heading">Getting Started</div>
51
+ <div class="docs-sidebar-links">
52
+ <a href="index.html">Overview</a>
53
+ <a href="config.html">Configuration</a>
54
+ </div>
55
+ </div>
56
+ <div class="docs-sidebar-section">
57
+ <div class="docs-sidebar-heading">Core Concepts</div>
58
+ <div class="docs-sidebar-links">
59
+ <a href="agents.html">Agents &amp; Workflows</a>
60
+ <a href="memory.html">Memory System</a>
61
+ <a href="skills.html">Skills</a>
62
+ </div>
63
+ </div>
64
+ <div class="docs-sidebar-section">
65
+ <div class="docs-sidebar-heading">Guides</div>
66
+ <div class="docs-sidebar-links">
67
+ <a href="channels.html">Channel Setup</a>
68
+ <a href="integrations.html">Integrations</a>
69
+ <a href="security.html">Security &amp; Auth</a>
70
+ </div>
71
+ </div>
72
+ <div class="docs-sidebar-section">
73
+ <div class="docs-sidebar-heading">Reference</div>
74
+ <div class="docs-sidebar-links">
75
+ <a href="api.html">API Reference</a>
76
+ <a href="cli.html" class="active">CLI Commands</a>
77
+ </div>
78
+ </div>
79
+ </aside>
80
+
81
+ <main class="docs-content">
82
+ <div class="docs-breadcrumb"><a href="../index.html">Home</a><span>/</span><a href="index.html">Docs</a><span>/</span>CLI Commands</div>
83
+
84
+ <h1>CLI Commands</h1>
85
+ <p>The <code>zubo</code> CLI manages your agent. Here's every command.</p>
86
+
87
+ <h2>Core Commands</h2>
88
+
89
+ <h3>zubo setup</h3>
90
+ <p>Interactive wizard for first-time configuration. Walks you through the full initial setup process:</p>
91
+ <ul>
92
+ <li>Choose LLM provider (Anthropic, OpenAI, Ollama, etc.)</li>
93
+ <li>Enter API key</li>
94
+ <li>Select model</li>
95
+ <li>Optionally configure channels</li>
96
+ </ul>
97
+ <p>Writes to <code>~/.zubo/config.json</code>.</p>
98
+ <pre><code>zubo setup</code></pre>
99
+
100
+ <h3>zubo start</h3>
101
+ <p>Start the Zubo agent. Opens the web dashboard in your browser.</p>
102
+ <pre><code>zubo start # Foreground mode
103
+ zubo start --daemon # Background mode</code></pre>
104
+ <p>In foreground mode, logs are printed directly to the terminal. In daemon mode, the agent runs in the background and logs are written to a file. Use <code>zubo logs</code> to view them.</p>
105
+
106
+ <h3>zubo stop</h3>
107
+ <p>Stop the background daemon. This sends a shutdown signal to the running daemon process.</p>
108
+ <pre><code>zubo stop</code></pre>
109
+
110
+ <h3>zubo status</h3>
111
+ <p>Show current status: provider, model, channels, process state.</p>
112
+ <pre><code>zubo status</code></pre>
113
+
114
+ <h2>Logs</h2>
115
+ <pre><code>zubo logs # Show last 50 lines
116
+ zubo logs --follow # Stream logs live (like tail -f)
117
+ zubo logs -f # Short form</code></pre>
118
+ <p>When using <code>--follow</code> or <code>-f</code>, new log entries are streamed to your terminal in real time. Press <code>Ctrl+C</code> to stop following.</p>
119
+
120
+ <h2>Model Management</h2>
121
+ <pre><code>zubo model # Show active provider/model
122
+ zubo model --list # List all configured providers
123
+ zubo model ollama/llama3.3 # Switch to provider/model</code></pre>
124
+ <p>The model argument uses the format <code>provider/model</code>. For example, <code>anthropic/claude-sonnet-4-5-20250929</code>, <code>openai/gpt-4o</code>, or <code>ollama/llama3.3</code>. The change takes effect immediately if the agent is running.</p>
125
+
126
+ <h2>Configuration</h2>
127
+ <pre><code>zubo config set &lt;key&gt; &lt;value&gt; # Set a config value
128
+ zubo config get [key] # Get config value(s)</code></pre>
129
+ <p>Examples:</p>
130
+ <pre><code>zubo config set activeProvider ollama
131
+ zubo config set model llama3.3
132
+ zubo config set heartbeatMinutes 60
133
+ zubo config set auth.enabled true
134
+ zubo config set rateLimit.chatPerMinute 30
135
+ zubo config set channels.webchat.port 3000
136
+ zubo config get # Show all config (keys masked)
137
+ zubo config get activeProvider # Show single value</code></pre>
138
+ <p>Supports dotted keys for nested values (e.g., <code>auth.enabled</code> sets the <code>enabled</code> field inside the <code>auth</code> object). Values are auto-parsed: <code>true</code>/<code>false</code> become booleans, digit strings become numbers, and everything else is stored as a string.</p>
139
+
140
+ <h2>Skills</h2>
141
+ <pre><code>zubo skills # Interactive menu
142
+ zubo skills list # List installed skills
143
+ zubo skills new # Create a new skill (wizard)
144
+ zubo skills remove # Remove a skill
145
+ zubo skills reinstall # Reinstall built-in skills</code></pre>
146
+ <p>The interactive menu (<code>zubo skills</code> with no subcommand) presents a selection interface for all skill management operations. Use the subcommands for non-interactive or scripted usage.</p>
147
+
148
+ <h2>Skill Registry</h2>
149
+ <pre><code>zubo install &lt;name&gt; # Install skill from registry
150
+ zubo search &lt;query&gt; # Search the registry
151
+ zubo publish [name] # Publish a skill</code></pre>
152
+ <p><code>zubo install</code> downloads and installs the named skill from the community registry into <code>~/.zubo/skills/</code>. <code>zubo search</code> returns matching skills with their names and descriptions. <code>zubo publish</code> validates and submits the current skill directory (or the named skill) to the registry.</p>
153
+
154
+ <h2>Authentication</h2>
155
+ <pre><code>zubo auth create-key [label] # Create API key (shown once)
156
+ zubo auth list-keys # List all keys
157
+ zubo auth delete-key &lt;id&gt; # Delete a key</code></pre>
158
+ <p>API keys are used when <code>auth.enabled</code> is <code>true</code>. The key value is displayed only once at creation time &mdash; store it securely. The optional label helps you identify the key later. Use <code>zubo auth list-keys</code> to see all keys with their IDs, labels, and last-used dates.</p>
159
+
160
+ <h2>Data Management</h2>
161
+ <pre><code>zubo export # Export as JSON
162
+ zubo export --format sqlite # Backup as SQLite file
163
+ zubo export --output backup.json # Custom output path
164
+ zubo import &lt;path&gt; # Import from JSON</code></pre>
165
+ <p>The JSON export includes conversations, memory chunks, settings, analytics, and uploaded file metadata. The SQLite backup creates a copy of the raw database file. Import restores data from a previously exported JSON file.</p>
166
+
167
+ <h2>Command Summary</h2>
168
+ <table>
169
+ <thead><tr><th>Command</th><th>Description</th></tr></thead>
170
+ <tbody>
171
+ <tr><td><code>zubo setup</code></td><td>Interactive configuration wizard</td></tr>
172
+ <tr><td><code>zubo start</code></td><td>Start agent (foreground)</td></tr>
173
+ <tr><td><code>zubo start --daemon</code></td><td>Start in background</td></tr>
174
+ <tr><td><code>zubo stop</code></td><td>Stop background daemon</td></tr>
175
+ <tr><td><code>zubo status</code></td><td>Show runtime status</td></tr>
176
+ <tr><td><code>zubo logs</code></td><td>Show last 50 log lines</td></tr>
177
+ <tr><td><code>zubo logs --follow</code></td><td>Stream logs live</td></tr>
178
+ <tr><td><code>zubo model</code></td><td>Show active model</td></tr>
179
+ <tr><td><code>zubo model --list</code></td><td>List providers</td></tr>
180
+ <tr><td><code>zubo model &lt;p/m&gt;</code></td><td>Switch provider/model</td></tr>
181
+ <tr><td><code>zubo config set &lt;k&gt; &lt;v&gt;</code></td><td>Set config value</td></tr>
182
+ <tr><td><code>zubo config get [key]</code></td><td>Show config value(s)</td></tr>
183
+ <tr><td><code>zubo skills</code></td><td>Interactive skill menu</td></tr>
184
+ <tr><td><code>zubo skills list</code></td><td>List installed skills</td></tr>
185
+ <tr><td><code>zubo skills new</code></td><td>Create new skill</td></tr>
186
+ <tr><td><code>zubo skills remove</code></td><td>Remove a skill</td></tr>
187
+ <tr><td><code>zubo skills reinstall</code></td><td>Reinstall built-in skills</td></tr>
188
+ <tr><td><code>zubo install &lt;name&gt;</code></td><td>Install from registry</td></tr>
189
+ <tr><td><code>zubo search &lt;query&gt;</code></td><td>Search registry</td></tr>
190
+ <tr><td><code>zubo publish [name]</code></td><td>Publish skill</td></tr>
191
+ <tr><td><code>zubo auth create-key</code></td><td>Create API key</td></tr>
192
+ <tr><td><code>zubo auth list-keys</code></td><td>List API keys</td></tr>
193
+ <tr><td><code>zubo auth delete-key &lt;id&gt;</code></td><td>Delete API key</td></tr>
194
+ <tr><td><code>zubo export</code></td><td>Export JSON</td></tr>
195
+ <tr><td><code>zubo export --format sqlite</code></td><td>Backup SQLite</td></tr>
196
+ <tr><td><code>zubo import &lt;path&gt;</code></td><td>Import JSON</td></tr>
197
+ </tbody>
198
+ </table>
199
+
200
+ <h2>Exit Codes</h2>
201
+ <table>
202
+ <thead><tr><th>Code</th><th>Meaning</th></tr></thead>
203
+ <tbody>
204
+ <tr><td><code>0</code></td><td>Success</td></tr>
205
+ <tr><td><code>1</code></td><td>Error (missing config, invalid args, etc.)</td></tr>
206
+ </tbody>
207
+ </table>
208
+
209
+ <h2>Environment Variables</h2>
210
+ <table>
211
+ <thead><tr><th>Variable</th><th>Description</th></tr></thead>
212
+ <tbody>
213
+ <tr><td><code>ZUBO_HOME</code></td><td>Override the default <code>~/.zubo</code> directory. All configuration, skills, memory, and database files will be read from and written to this directory instead.</td></tr>
214
+ </tbody>
215
+ </table>
216
+
217
+ <div class="docs-page-nav">
218
+ <a href="api.html"><span class="nav-dir">Previous</span><span class="nav-label">&larr; API Reference</span></a>
219
+ <div></div>
220
+ </div>
221
+ </main>
222
+ </div>
223
+
224
+ <button class="docs-sidebar-toggle" id="docs-sidebar-toggle" aria-label="Toggle sidebar">&#9776;</button>
225
+ <script src="../script.js"></script>
226
+ <script type="application/ld+json">
227
+ {
228
+ "@context": "https://schema.org",
229
+ "@type": "BreadcrumbList",
230
+ "itemListElement": [
231
+ { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://zubo.bot/" },
232
+ { "@type": "ListItem", "position": 2, "name": "Docs", "item": "https://zubo.bot/docs/" },
233
+ { "@type": "ListItem", "position": 3, "name": "CLI Commands", "item": "https://zubo.bot/docs/cli.html" }
234
+ ]
235
+ }
236
+ </script>
237
+ </body>
238
+ </html>