clawdbot 2026.1.4

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 (503) hide show
  1. package/CHANGELOG.md +115 -0
  2. package/LICENSE +21 -0
  3. package/README-header.png +0 -0
  4. package/README.md +297 -0
  5. package/dist/agents/agent-paths.js +17 -0
  6. package/dist/agents/bash-process-registry.js +126 -0
  7. package/dist/agents/bash-tools.js +837 -0
  8. package/dist/agents/clawdbot-tools.js +30 -0
  9. package/dist/agents/clawdis-tools.js +27 -0
  10. package/dist/agents/context.js +34 -0
  11. package/dist/agents/defaults.js +6 -0
  12. package/dist/agents/model-auth.js +112 -0
  13. package/dist/agents/model-catalog.js +55 -0
  14. package/dist/agents/model-fallback.js +191 -0
  15. package/dist/agents/model-scan.js +263 -0
  16. package/dist/agents/model-selection.js +116 -0
  17. package/dist/agents/models-config.js +49 -0
  18. package/dist/agents/pi-embedded-helpers.js +74 -0
  19. package/dist/agents/pi-embedded-runner.js +407 -0
  20. package/dist/agents/pi-embedded-subscribe.js +568 -0
  21. package/dist/agents/pi-embedded-utils.js +20 -0
  22. package/dist/agents/pi-embedded.js +1 -0
  23. package/dist/agents/pi-oauth.js +88 -0
  24. package/dist/agents/pi-tools.js +433 -0
  25. package/dist/agents/sandbox-paths.js +68 -0
  26. package/dist/agents/sandbox.js +644 -0
  27. package/dist/agents/shell-utils.js +53 -0
  28. package/dist/agents/skills-install.js +244 -0
  29. package/dist/agents/skills-status.js +157 -0
  30. package/dist/agents/skills.js +470 -0
  31. package/dist/agents/steerable-agent-loop.js +338 -0
  32. package/dist/agents/steerable-provider-transport.js +48 -0
  33. package/dist/agents/system-prompt.js +104 -0
  34. package/dist/agents/tool-display.js +162 -0
  35. package/dist/agents/tool-images.js +138 -0
  36. package/dist/agents/tools/browser-tool.js +339 -0
  37. package/dist/agents/tools/canvas-tool.js +193 -0
  38. package/dist/agents/tools/common.js +88 -0
  39. package/dist/agents/tools/cron-tool.js +124 -0
  40. package/dist/agents/tools/discord-actions-guild.js +186 -0
  41. package/dist/agents/tools/discord-actions-messaging.js +285 -0
  42. package/dist/agents/tools/discord-actions-moderation.js +70 -0
  43. package/dist/agents/tools/discord-actions.js +56 -0
  44. package/dist/agents/tools/discord-schema.js +199 -0
  45. package/dist/agents/tools/discord-tool.js +16 -0
  46. package/dist/agents/tools/gateway-tool.js +46 -0
  47. package/dist/agents/tools/gateway.js +27 -0
  48. package/dist/agents/tools/image-tool.js +132 -0
  49. package/dist/agents/tools/nodes-tool.js +413 -0
  50. package/dist/agents/tools/nodes-utils.js +92 -0
  51. package/dist/agents/tools/sessions-helpers.js +88 -0
  52. package/dist/agents/tools/sessions-history-tool.js +53 -0
  53. package/dist/agents/tools/sessions-list-tool.js +143 -0
  54. package/dist/agents/tools/sessions-send-helpers.js +100 -0
  55. package/dist/agents/tools/sessions-send-tool.js +347 -0
  56. package/dist/agents/tools/slack-actions.js +129 -0
  57. package/dist/agents/tools/slack-schema.js +59 -0
  58. package/dist/agents/tools/slack-tool.js +16 -0
  59. package/dist/agents/usage.js +39 -0
  60. package/dist/agents/workspace.js +241 -0
  61. package/dist/auto-reply/chunk.js +76 -0
  62. package/dist/auto-reply/envelope.js +38 -0
  63. package/dist/auto-reply/group-activation.js +20 -0
  64. package/dist/auto-reply/heartbeat.js +57 -0
  65. package/dist/auto-reply/model.js +14 -0
  66. package/dist/auto-reply/reply/abort.js +14 -0
  67. package/dist/auto-reply/reply/agent-runner.js +371 -0
  68. package/dist/auto-reply/reply/block-streaming.js +34 -0
  69. package/dist/auto-reply/reply/body.js +29 -0
  70. package/dist/auto-reply/reply/commands.js +207 -0
  71. package/dist/auto-reply/reply/directive-handling.js +361 -0
  72. package/dist/auto-reply/reply/directives.js +47 -0
  73. package/dist/auto-reply/reply/followup-runner.js +149 -0
  74. package/dist/auto-reply/reply/groups.js +91 -0
  75. package/dist/auto-reply/reply/mentions.js +38 -0
  76. package/dist/auto-reply/reply/model-selection.js +114 -0
  77. package/dist/auto-reply/reply/queue.js +399 -0
  78. package/dist/auto-reply/reply/reply-tags.js +26 -0
  79. package/dist/auto-reply/reply/session-updates.js +87 -0
  80. package/dist/auto-reply/reply/session.js +160 -0
  81. package/dist/auto-reply/reply/typing.js +75 -0
  82. package/dist/auto-reply/reply.js +535 -0
  83. package/dist/auto-reply/send-policy.js +28 -0
  84. package/dist/auto-reply/status.js +158 -0
  85. package/dist/auto-reply/templating.js +9 -0
  86. package/dist/auto-reply/thinking.js +49 -0
  87. package/dist/auto-reply/tokens.js +2 -0
  88. package/dist/auto-reply/tool-meta.js +74 -0
  89. package/dist/auto-reply/transcription.js +57 -0
  90. package/dist/auto-reply/types.js +1 -0
  91. package/dist/browser/bridge-server.js +37 -0
  92. package/dist/browser/cdp.js +382 -0
  93. package/dist/browser/chrome.js +432 -0
  94. package/dist/browser/client-actions-core.js +67 -0
  95. package/dist/browser/client-actions-observe.js +24 -0
  96. package/dist/browser/client-actions-types.js +1 -0
  97. package/dist/browser/client-actions.js +3 -0
  98. package/dist/browser/client-fetch.js +43 -0
  99. package/dist/browser/client.js +105 -0
  100. package/dist/browser/config.js +140 -0
  101. package/dist/browser/constants.js +4 -0
  102. package/dist/browser/profiles-service.js +122 -0
  103. package/dist/browser/profiles.js +85 -0
  104. package/dist/browser/pw-ai.js +2 -0
  105. package/dist/browser/pw-session.js +144 -0
  106. package/dist/browser/pw-tools-core.js +363 -0
  107. package/dist/browser/routes/agent.js +535 -0
  108. package/dist/browser/routes/basic.js +155 -0
  109. package/dist/browser/routes/index.js +8 -0
  110. package/dist/browser/routes/tabs.js +105 -0
  111. package/dist/browser/routes/utils.js +62 -0
  112. package/dist/browser/screenshot.js +40 -0
  113. package/dist/browser/server-context.js +377 -0
  114. package/dist/browser/server.js +81 -0
  115. package/dist/browser/target-id.js +18 -0
  116. package/dist/browser/trash.js +21 -0
  117. package/dist/canvas-host/a2ui/.bundle.hash +1 -0
  118. package/dist/canvas-host/a2ui/a2ui.bundle.js +17768 -0
  119. package/dist/canvas-host/a2ui/index.html +246 -0
  120. package/dist/canvas-host/a2ui.js +187 -0
  121. package/dist/canvas-host/server.js +382 -0
  122. package/dist/cli/browser-cli-actions-input.js +459 -0
  123. package/dist/cli/browser-cli-actions-observe.js +56 -0
  124. package/dist/cli/browser-cli-examples.js +31 -0
  125. package/dist/cli/browser-cli-inspect.js +97 -0
  126. package/dist/cli/browser-cli-manage.js +286 -0
  127. package/dist/cli/browser-cli-shared.js +1 -0
  128. package/dist/cli/browser-cli.js +26 -0
  129. package/dist/cli/canvas-cli.js +416 -0
  130. package/dist/cli/cron-cli.js +454 -0
  131. package/dist/cli/deps.js +17 -0
  132. package/dist/cli/dns-cli.js +180 -0
  133. package/dist/cli/gateway-cli.js +489 -0
  134. package/dist/cli/gateway-rpc.js +20 -0
  135. package/dist/cli/hooks-cli.js +135 -0
  136. package/dist/cli/models-cli.js +248 -0
  137. package/dist/cli/nodes-camera.js +57 -0
  138. package/dist/cli/nodes-canvas.js +26 -0
  139. package/dist/cli/nodes-cli.js +946 -0
  140. package/dist/cli/nodes-screen.js +37 -0
  141. package/dist/cli/parse-duration.js +20 -0
  142. package/dist/cli/ports.js +97 -0
  143. package/dist/cli/program.js +406 -0
  144. package/dist/cli/prompt.js +19 -0
  145. package/dist/cli/tui-cli.js +35 -0
  146. package/dist/cli/wait.js +8 -0
  147. package/dist/commands/agent.js +645 -0
  148. package/dist/commands/antigravity-oauth.js +327 -0
  149. package/dist/commands/configure.js +480 -0
  150. package/dist/commands/doctor.js +484 -0
  151. package/dist/commands/health.js +108 -0
  152. package/dist/commands/models/aliases.js +64 -0
  153. package/dist/commands/models/fallbacks.js +99 -0
  154. package/dist/commands/models/image-fallbacks.js +99 -0
  155. package/dist/commands/models/list.js +323 -0
  156. package/dist/commands/models/scan.js +266 -0
  157. package/dist/commands/models/set-image.js +23 -0
  158. package/dist/commands/models/set.js +23 -0
  159. package/dist/commands/models/shared.js +72 -0
  160. package/dist/commands/models.js +7 -0
  161. package/dist/commands/onboard-auth.js +70 -0
  162. package/dist/commands/onboard-helpers.js +295 -0
  163. package/dist/commands/onboard-interactive.js +17 -0
  164. package/dist/commands/onboard-non-interactive.js +202 -0
  165. package/dist/commands/onboard-providers.js +634 -0
  166. package/dist/commands/onboard-remote.js +120 -0
  167. package/dist/commands/onboard-skills.js +148 -0
  168. package/dist/commands/onboard-types.js +1 -0
  169. package/dist/commands/onboard.js +12 -0
  170. package/dist/commands/send.js +124 -0
  171. package/dist/commands/sessions.js +212 -0
  172. package/dist/commands/setup.js +58 -0
  173. package/dist/commands/signal-install.js +135 -0
  174. package/dist/commands/status.js +207 -0
  175. package/dist/commands/update.js +16 -0
  176. package/dist/config/config.js +6 -0
  177. package/dist/config/defaults.js +61 -0
  178. package/dist/config/io.js +147 -0
  179. package/dist/config/legacy-migrate.js +13 -0
  180. package/dist/config/legacy.js +159 -0
  181. package/dist/config/paths.js +71 -0
  182. package/dist/config/schema.js +150 -0
  183. package/dist/config/sessions.js +282 -0
  184. package/dist/config/talk.js +31 -0
  185. package/dist/config/types.js +1 -0
  186. package/dist/config/validation.js +29 -0
  187. package/dist/config/zod-schema.js +831 -0
  188. package/dist/cron/isolated-agent.js +499 -0
  189. package/dist/cron/run-log.js +72 -0
  190. package/dist/cron/schedule.js +24 -0
  191. package/dist/cron/service.js +471 -0
  192. package/dist/cron/store.js +43 -0
  193. package/dist/cron/types.js +1 -0
  194. package/dist/discord/index.js +2 -0
  195. package/dist/discord/monitor.js +1188 -0
  196. package/dist/discord/probe.js +54 -0
  197. package/dist/discord/send.js +577 -0
  198. package/dist/discord/token.js +8 -0
  199. package/dist/gateway/auth.js +121 -0
  200. package/dist/gateway/call.js +94 -0
  201. package/dist/gateway/chat-attachments.js +41 -0
  202. package/dist/gateway/client.js +180 -0
  203. package/dist/gateway/config-reload.js +274 -0
  204. package/dist/gateway/control-ui.js +184 -0
  205. package/dist/gateway/hooks-mapping.js +282 -0
  206. package/dist/gateway/hooks.js +168 -0
  207. package/dist/gateway/net.js +29 -0
  208. package/dist/gateway/protocol/index.js +61 -0
  209. package/dist/gateway/protocol/schema.js +560 -0
  210. package/dist/gateway/server-bridge-subscriptions.js +93 -0
  211. package/dist/gateway/server-bridge.js +1013 -0
  212. package/dist/gateway/server-browser.js +12 -0
  213. package/dist/gateway/server-chat.js +159 -0
  214. package/dist/gateway/server-constants.js +8 -0
  215. package/dist/gateway/server-discovery.js +62 -0
  216. package/dist/gateway/server-http.js +165 -0
  217. package/dist/gateway/server-methods/agent-job.js +125 -0
  218. package/dist/gateway/server-methods/agent.js +250 -0
  219. package/dist/gateway/server-methods/chat.js +200 -0
  220. package/dist/gateway/server-methods/config.js +50 -0
  221. package/dist/gateway/server-methods/connect.js +6 -0
  222. package/dist/gateway/server-methods/cron.js +83 -0
  223. package/dist/gateway/server-methods/health.js +28 -0
  224. package/dist/gateway/server-methods/models.js +16 -0
  225. package/dist/gateway/server-methods/nodes.js +294 -0
  226. package/dist/gateway/server-methods/providers.js +217 -0
  227. package/dist/gateway/server-methods/send.js +166 -0
  228. package/dist/gateway/server-methods/sessions.js +305 -0
  229. package/dist/gateway/server-methods/skills.js +83 -0
  230. package/dist/gateway/server-methods/system.js +118 -0
  231. package/dist/gateway/server-methods/talk.js +22 -0
  232. package/dist/gateway/server-methods/types.js +1 -0
  233. package/dist/gateway/server-methods/voicewake.js +30 -0
  234. package/dist/gateway/server-methods/web.js +58 -0
  235. package/dist/gateway/server-methods/wizard.js +100 -0
  236. package/dist/gateway/server-methods.js +53 -0
  237. package/dist/gateway/server-providers.js +644 -0
  238. package/dist/gateway/server-shared.js +1 -0
  239. package/dist/gateway/server-utils.js +35 -0
  240. package/dist/gateway/server.js +1437 -0
  241. package/dist/gateway/session-utils.js +216 -0
  242. package/dist/gateway/ws-log.js +349 -0
  243. package/dist/gateway/ws-logging.js +8 -0
  244. package/dist/globals.js +41 -0
  245. package/dist/hooks/gmail-ops.js +236 -0
  246. package/dist/hooks/gmail-setup-utils.js +278 -0
  247. package/dist/hooks/gmail-watcher.js +175 -0
  248. package/dist/hooks/gmail.js +177 -0
  249. package/dist/index.js +50 -0
  250. package/dist/infra/agent-events.js +46 -0
  251. package/dist/infra/binaries.js +9 -0
  252. package/dist/infra/bonjour-discovery.js +163 -0
  253. package/dist/infra/bonjour.js +200 -0
  254. package/dist/infra/bridge/server.js +562 -0
  255. package/dist/infra/canvas-host-url.js +54 -0
  256. package/dist/infra/env.js +8 -0
  257. package/dist/infra/errors.js +28 -0
  258. package/dist/infra/gateway-lock.js +8 -0
  259. package/dist/infra/heartbeat-events.js +21 -0
  260. package/dist/infra/heartbeat-runner.js +453 -0
  261. package/dist/infra/heartbeat-wake.js +61 -0
  262. package/dist/infra/is-main.js +37 -0
  263. package/dist/infra/machine-name.js +40 -0
  264. package/dist/infra/node-pairing.js +211 -0
  265. package/dist/infra/pam.js +42 -0
  266. package/dist/infra/path-env.js +92 -0
  267. package/dist/infra/ports.js +87 -0
  268. package/dist/infra/provider-summary.js +80 -0
  269. package/dist/infra/restart.js +29 -0
  270. package/dist/infra/retry.js +16 -0
  271. package/dist/infra/runtime-guard.js +59 -0
  272. package/dist/infra/system-events.js +44 -0
  273. package/dist/infra/system-presence.js +216 -0
  274. package/dist/infra/tailnet.js +46 -0
  275. package/dist/infra/tailscale.js +149 -0
  276. package/dist/infra/voicewake.js +77 -0
  277. package/dist/infra/widearea-dns.js +123 -0
  278. package/dist/infra/ws.js +13 -0
  279. package/dist/logger.js +52 -0
  280. package/dist/logging.js +490 -0
  281. package/dist/macos/gateway-daemon.js +141 -0
  282. package/dist/macos/relay.js +46 -0
  283. package/dist/media/constants.js +33 -0
  284. package/dist/media/host.js +42 -0
  285. package/dist/media/image-ops.js +121 -0
  286. package/dist/media/mime.js +115 -0
  287. package/dist/media/parse.js +81 -0
  288. package/dist/media/server.js +64 -0
  289. package/dist/media/store.js +139 -0
  290. package/dist/process/command-queue.js +97 -0
  291. package/dist/process/exec.js +75 -0
  292. package/dist/protocol.schema.json +2918 -0
  293. package/dist/provider-web.js +8 -0
  294. package/dist/providers/web/index.js +2 -0
  295. package/dist/runtime.js +8 -0
  296. package/dist/telegram/bot.js +394 -0
  297. package/dist/telegram/download.js +34 -0
  298. package/dist/telegram/index.js +4 -0
  299. package/dist/telegram/monitor.js +47 -0
  300. package/dist/telegram/probe.js +63 -0
  301. package/dist/telegram/proxy.js +9 -0
  302. package/dist/telegram/send.js +138 -0
  303. package/dist/telegram/token.js +30 -0
  304. package/dist/telegram/webhook-set.js +12 -0
  305. package/dist/telegram/webhook.js +56 -0
  306. package/dist/utils.js +133 -0
  307. package/dist/version.js +18 -0
  308. package/dist/web/active-listener.js +7 -0
  309. package/dist/web/auto-reply.js +1203 -0
  310. package/dist/web/inbound.js +481 -0
  311. package/dist/web/login-qr.js +204 -0
  312. package/dist/web/login.js +59 -0
  313. package/dist/web/media.js +148 -0
  314. package/dist/web/outbound.js +67 -0
  315. package/dist/web/qr-image.js +97 -0
  316. package/dist/web/reconnect.js +60 -0
  317. package/dist/web/reply-heartbeat-wake.js +61 -0
  318. package/dist/web/session.js +346 -0
  319. package/docs/AGENTS.default.md +116 -0
  320. package/docs/CNAME +1 -0
  321. package/docs/RELEASING.md +64 -0
  322. package/docs/_config.yml +51 -0
  323. package/docs/_layouts/default.html +145 -0
  324. package/docs/agent-send.md +21 -0
  325. package/docs/agent.md +104 -0
  326. package/docs/android/connect.md +131 -0
  327. package/docs/architecture.md +89 -0
  328. package/docs/assets/markdown.css +130 -0
  329. package/docs/assets/pixel-lobster.svg +60 -0
  330. package/docs/assets/terminal.css +497 -0
  331. package/docs/assets/theme.js +55 -0
  332. package/docs/audio.md +50 -0
  333. package/docs/background-process.md +74 -0
  334. package/docs/bash.md +32 -0
  335. package/docs/bonjour.md +159 -0
  336. package/docs/browser.md +289 -0
  337. package/docs/camera.md +152 -0
  338. package/docs/clawd.md +199 -0
  339. package/docs/clawdbot-mac.md +104 -0
  340. package/docs/configuration.md +1177 -0
  341. package/docs/control-api.md +49 -0
  342. package/docs/control-ui.md +83 -0
  343. package/docs/cron.md +374 -0
  344. package/docs/dashboard.md +17 -0
  345. package/docs/device-models.md +46 -0
  346. package/docs/discord.md +293 -0
  347. package/docs/discovery.md +112 -0
  348. package/docs/docker.md +251 -0
  349. package/docs/docs.json +86 -0
  350. package/docs/doctor.md +47 -0
  351. package/docs/elevated.md +31 -0
  352. package/docs/faq.md +640 -0
  353. package/docs/gateway/pairing.md +109 -0
  354. package/docs/gateway-lock.md +28 -0
  355. package/docs/gateway.md +174 -0
  356. package/docs/gmail-pubsub.md +191 -0
  357. package/docs/grammy.md +27 -0
  358. package/docs/group-messages.md +71 -0
  359. package/docs/groups.md +78 -0
  360. package/docs/health.md +28 -0
  361. package/docs/heartbeat.md +64 -0
  362. package/docs/images.md +52 -0
  363. package/docs/imessage.md +63 -0
  364. package/docs/index.md +182 -0
  365. package/docs/ios/connect.md +177 -0
  366. package/docs/ios/spec.md +236 -0
  367. package/docs/location-command.md +95 -0
  368. package/docs/logging.md +99 -0
  369. package/docs/lore.md +131 -0
  370. package/docs/mac/bun.md +133 -0
  371. package/docs/mac/canvas.md +161 -0
  372. package/docs/mac/child-process.md +72 -0
  373. package/docs/mac/dev-setup.md +81 -0
  374. package/docs/mac/health.md +28 -0
  375. package/docs/mac/icon.md +26 -0
  376. package/docs/mac/logging.md +51 -0
  377. package/docs/mac/menu-bar.md +69 -0
  378. package/docs/mac/peekaboo.md +170 -0
  379. package/docs/mac/permissions.md +40 -0
  380. package/docs/mac/release.md +76 -0
  381. package/docs/mac/remote.md +57 -0
  382. package/docs/mac/signing.md +41 -0
  383. package/docs/mac/skills.md +27 -0
  384. package/docs/mac/voice-overlay.md +52 -0
  385. package/docs/mac/voicewake.md +56 -0
  386. package/docs/mac/webchat.md +27 -0
  387. package/docs/mac/xpc.md +40 -0
  388. package/docs/models.md +90 -0
  389. package/docs/nix.md +49 -0
  390. package/docs/nodes.md +157 -0
  391. package/docs/onboarding-config-protocol.md +29 -0
  392. package/docs/onboarding.md +185 -0
  393. package/docs/presence.md +133 -0
  394. package/docs/queue.md +78 -0
  395. package/docs/refactor/browser-control-simplification.md +58 -0
  396. package/docs/refactor/canvas-a2ui.md +93 -0
  397. package/docs/refactor/cli-unification.md +64 -0
  398. package/docs/refactor/gateway-client.md +31 -0
  399. package/docs/refactor/gateway.md +99 -0
  400. package/docs/refactor/new-arch.md +171 -0
  401. package/docs/refactor/tui.md +26 -0
  402. package/docs/refactor/web-gateway-troubleshooting.md +37 -0
  403. package/docs/refactor/webagent-session.md +46 -0
  404. package/docs/remote-gateway-readme.md +148 -0
  405. package/docs/remote.md +66 -0
  406. package/docs/research/memory.md +227 -0
  407. package/docs/rpc.md +35 -0
  408. package/docs/security.md +168 -0
  409. package/docs/session-tool.md +119 -0
  410. package/docs/session.md +84 -0
  411. package/docs/sessions.md +8 -0
  412. package/docs/setup.md +118 -0
  413. package/docs/signal.md +113 -0
  414. package/docs/skills-config.md +58 -0
  415. package/docs/skills.md +149 -0
  416. package/docs/slack.md +158 -0
  417. package/docs/surface.md +20 -0
  418. package/docs/tailscale.md +71 -0
  419. package/docs/talk.md +79 -0
  420. package/docs/telegram.md +90 -0
  421. package/docs/templates/AGENTS.md +126 -0
  422. package/docs/templates/BOOTSTRAP.md +53 -0
  423. package/docs/templates/IDENTITY.md +17 -0
  424. package/docs/templates/SOUL.md +41 -0
  425. package/docs/templates/TOOLS.md +41 -0
  426. package/docs/templates/USER.md +22 -0
  427. package/docs/test.md +35 -0
  428. package/docs/thinking.md +46 -0
  429. package/docs/tools.md +248 -0
  430. package/docs/troubleshooting.md +227 -0
  431. package/docs/tui.md +69 -0
  432. package/docs/typebox.md +42 -0
  433. package/docs/voicewake.md +61 -0
  434. package/docs/web.md +115 -0
  435. package/docs/webchat.md +34 -0
  436. package/docs/webhook.md +132 -0
  437. package/docs/whatsapp-clawd.jpg +0 -0
  438. package/docs/whatsapp.md +142 -0
  439. package/docs/wizard.md +158 -0
  440. package/package.json +178 -0
  441. package/skills/apple-notes/SKILL.md +50 -0
  442. package/skills/apple-reminders/SKILL.md +67 -0
  443. package/skills/bear-notes/SKILL.md +79 -0
  444. package/skills/bird/SKILL.md +25 -0
  445. package/skills/blogwatcher/SKILL.md +46 -0
  446. package/skills/blucli/SKILL.md +27 -0
  447. package/skills/brave-search/SKILL.md +30 -0
  448. package/skills/brave-search/scripts/content.mjs +53 -0
  449. package/skills/brave-search/scripts/search.mjs +79 -0
  450. package/skills/camsnap/SKILL.md +25 -0
  451. package/skills/clawdhub/SKILL.md +53 -0
  452. package/skills/coding-agent/SKILL.md +275 -0
  453. package/skills/discord/SKILL.md +369 -0
  454. package/skills/eightctl/SKILL.md +29 -0
  455. package/skills/food-order/SKILL.md +41 -0
  456. package/skills/gemini/SKILL.md +23 -0
  457. package/skills/gifgrep/SKILL.md +47 -0
  458. package/skills/github/SKILL.md +47 -0
  459. package/skills/gog/SKILL.md +36 -0
  460. package/skills/goplaces/SKILL.md +30 -0
  461. package/skills/imsg/SKILL.md +25 -0
  462. package/skills/local-places/SERVER_README.md +101 -0
  463. package/skills/local-places/SKILL.md +91 -0
  464. package/skills/local-places/pyproject.toml +27 -0
  465. package/skills/local-places/src/local_places/__init__.py +2 -0
  466. package/skills/local-places/src/local_places/__pycache__/__init__.cpython-314.pyc +0 -0
  467. package/skills/local-places/src/local_places/__pycache__/google_places.cpython-314.pyc +0 -0
  468. package/skills/local-places/src/local_places/__pycache__/main.cpython-314.pyc +0 -0
  469. package/skills/local-places/src/local_places/__pycache__/schemas.cpython-314.pyc +0 -0
  470. package/skills/local-places/src/local_places/google_places.py +314 -0
  471. package/skills/local-places/src/local_places/main.py +65 -0
  472. package/skills/local-places/src/local_places/schemas.py +107 -0
  473. package/skills/mcporter/SKILL.md +38 -0
  474. package/skills/nano-banana-pro/SKILL.md +29 -0
  475. package/skills/nano-banana-pro/scripts/generate_image.py +167 -0
  476. package/skills/nano-pdf/SKILL.md +20 -0
  477. package/skills/notion/SKILL.md +156 -0
  478. package/skills/obsidian/SKILL.md +55 -0
  479. package/skills/openai-image-gen/SKILL.md +31 -0
  480. package/skills/openai-image-gen/scripts/gen.py +173 -0
  481. package/skills/openai-whisper/SKILL.md +19 -0
  482. package/skills/openai-whisper-api/SKILL.md +43 -0
  483. package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
  484. package/skills/openhue/SKILL.md +30 -0
  485. package/skills/oracle/SKILL.md +105 -0
  486. package/skills/ordercli/SKILL.md +47 -0
  487. package/skills/peekaboo/SKILL.md +153 -0
  488. package/skills/qmd/SKILL.md +26 -0
  489. package/skills/sag/SKILL.md +62 -0
  490. package/skills/slack/SKILL.md +143 -0
  491. package/skills/songsee/SKILL.md +29 -0
  492. package/skills/sonoscli/SKILL.md +26 -0
  493. package/skills/spotify-player/SKILL.md +34 -0
  494. package/skills/summarize/SKILL.md +49 -0
  495. package/skills/things-mac/SKILL.md +61 -0
  496. package/skills/tmux/SKILL.md +121 -0
  497. package/skills/tmux/scripts/find-sessions.sh +112 -0
  498. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  499. package/skills/trello/SKILL.md +84 -0
  500. package/skills/video-frames/SKILL.md +29 -0
  501. package/skills/video-frames/scripts/frame.sh +81 -0
  502. package/skills/wacli/SKILL.md +42 -0
  503. package/skills/weather/SKILL.md +49 -0
@@ -0,0 +1,346 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import fsSync from "node:fs";
3
+ import fs from "node:fs/promises";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import { DisconnectReason, fetchLatestBaileysVersion, makeCacheableSignalKeyStore, makeWASocket, useMultiFileAuthState, } from "@whiskeysockets/baileys";
7
+ import qrcode from "qrcode-terminal";
8
+ import { resolveDefaultSessionStorePath } from "../config/sessions.js";
9
+ import { danger, info, success } from "../globals.js";
10
+ import { getChildLogger, toPinoLikeLogger } from "../logging.js";
11
+ import { defaultRuntime } from "../runtime.js";
12
+ import { CONFIG_DIR, ensureDir, jidToE164 } from "../utils.js";
13
+ import { VERSION } from "../version.js";
14
+ export function resolveWebAuthDir() {
15
+ return path.join(os.homedir(), ".clawdbot", "credentials");
16
+ }
17
+ function resolveWebCredsPath() {
18
+ return path.join(resolveWebAuthDir(), "creds.json");
19
+ }
20
+ function resolveWebCredsBackupPath() {
21
+ return path.join(resolveWebAuthDir(), "creds.json.bak");
22
+ }
23
+ export const WA_WEB_AUTH_DIR = path.join(CONFIG_DIR, "credentials");
24
+ let credsSaveQueue = Promise.resolve();
25
+ function enqueueSaveCreds(saveCreds, logger) {
26
+ credsSaveQueue = credsSaveQueue
27
+ .then(() => safeSaveCreds(saveCreds, logger))
28
+ .catch((err) => {
29
+ logger.warn({ error: String(err) }, "WhatsApp creds save queue error");
30
+ });
31
+ }
32
+ function readCredsJsonRaw(filePath) {
33
+ try {
34
+ if (!fsSync.existsSync(filePath))
35
+ return null;
36
+ const stats = fsSync.statSync(filePath);
37
+ if (!stats.isFile() || stats.size <= 1)
38
+ return null;
39
+ return fsSync.readFileSync(filePath, "utf-8");
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ function maybeRestoreCredsFromBackup(logger) {
46
+ try {
47
+ const credsPath = resolveWebCredsPath();
48
+ const backupPath = resolveWebCredsBackupPath();
49
+ const raw = readCredsJsonRaw(credsPath);
50
+ if (raw) {
51
+ // Validate that creds.json is parseable.
52
+ JSON.parse(raw);
53
+ return;
54
+ }
55
+ const backupRaw = readCredsJsonRaw(backupPath);
56
+ if (!backupRaw)
57
+ return;
58
+ // Ensure backup is parseable before restoring.
59
+ JSON.parse(backupRaw);
60
+ fsSync.copyFileSync(backupPath, credsPath);
61
+ logger.warn({ credsPath }, "restored corrupted WhatsApp creds.json from backup");
62
+ }
63
+ catch {
64
+ // ignore
65
+ }
66
+ }
67
+ async function safeSaveCreds(saveCreds, logger) {
68
+ try {
69
+ // Best-effort backup so we can recover after abrupt restarts.
70
+ // Important: don't clobber a good backup with a corrupted/truncated creds.json.
71
+ const credsPath = resolveWebCredsPath();
72
+ const backupPath = resolveWebCredsBackupPath();
73
+ const raw = readCredsJsonRaw(credsPath);
74
+ if (raw) {
75
+ try {
76
+ JSON.parse(raw);
77
+ fsSync.copyFileSync(credsPath, backupPath);
78
+ }
79
+ catch {
80
+ // keep existing backup
81
+ }
82
+ }
83
+ }
84
+ catch {
85
+ // ignore backup failures
86
+ }
87
+ try {
88
+ await Promise.resolve(saveCreds());
89
+ }
90
+ catch (err) {
91
+ logger.warn({ error: String(err) }, "failed saving WhatsApp creds");
92
+ }
93
+ }
94
+ /**
95
+ * Create a Baileys socket backed by the multi-file auth store we keep on disk.
96
+ * Consumers can opt into QR printing for interactive login flows.
97
+ */
98
+ export async function createWaSocket(printQr, verbose, opts = {}) {
99
+ const baseLogger = getChildLogger({ module: "baileys" }, {
100
+ level: verbose ? "info" : "silent",
101
+ });
102
+ const logger = toPinoLikeLogger(baseLogger, verbose ? "info" : "silent");
103
+ const authDir = resolveWebAuthDir();
104
+ await ensureDir(authDir);
105
+ const sessionLogger = getChildLogger({ module: "web-session" });
106
+ maybeRestoreCredsFromBackup(sessionLogger);
107
+ const { state, saveCreds } = await useMultiFileAuthState(authDir);
108
+ const { version } = await fetchLatestBaileysVersion();
109
+ const sock = makeWASocket({
110
+ auth: {
111
+ creds: state.creds,
112
+ keys: makeCacheableSignalKeyStore(state.keys, logger),
113
+ },
114
+ version,
115
+ logger,
116
+ printQRInTerminal: false,
117
+ browser: ["clawdbot", "cli", VERSION],
118
+ syncFullHistory: false,
119
+ markOnlineOnConnect: false,
120
+ });
121
+ sock.ev.on("creds.update", () => enqueueSaveCreds(saveCreds, sessionLogger));
122
+ sock.ev.on("connection.update", (update) => {
123
+ try {
124
+ const { connection, lastDisconnect, qr } = update;
125
+ if (qr) {
126
+ opts.onQr?.(qr);
127
+ if (printQr) {
128
+ console.log("Scan this QR in WhatsApp (Linked Devices):");
129
+ qrcode.generate(qr, { small: true });
130
+ }
131
+ }
132
+ if (connection === "close") {
133
+ const status = getStatusCode(lastDisconnect?.error);
134
+ if (status === DisconnectReason.loggedOut) {
135
+ console.error(danger("WhatsApp session logged out. Run: clawdbot login"));
136
+ }
137
+ }
138
+ if (connection === "open" && verbose) {
139
+ console.log(success("WhatsApp Web connected."));
140
+ }
141
+ }
142
+ catch (err) {
143
+ sessionLogger.error({ error: String(err) }, "connection.update handler error");
144
+ }
145
+ });
146
+ // Handle WebSocket-level errors to prevent unhandled exceptions from crashing the process
147
+ if (sock.ws &&
148
+ typeof sock.ws.on === "function") {
149
+ sock.ws.on("error", (err) => {
150
+ sessionLogger.error({ error: String(err) }, "WebSocket error");
151
+ });
152
+ }
153
+ return sock;
154
+ }
155
+ export async function waitForWaConnection(sock) {
156
+ return new Promise((resolve, reject) => {
157
+ const evWithOff = sock.ev;
158
+ const handler = (...args) => {
159
+ const update = (args[0] ?? {});
160
+ if (update.connection === "open") {
161
+ evWithOff.off?.("connection.update", handler);
162
+ resolve();
163
+ }
164
+ if (update.connection === "close") {
165
+ evWithOff.off?.("connection.update", handler);
166
+ reject(update.lastDisconnect ?? new Error("Connection closed"));
167
+ }
168
+ };
169
+ sock.ev.on("connection.update", handler);
170
+ });
171
+ }
172
+ export function getStatusCode(err) {
173
+ return (err?.output?.statusCode ??
174
+ err?.status);
175
+ }
176
+ function safeStringify(value, limit = 800) {
177
+ try {
178
+ const seen = new WeakSet();
179
+ const raw = JSON.stringify(value, (_key, v) => {
180
+ if (typeof v === "bigint")
181
+ return v.toString();
182
+ if (typeof v === "function") {
183
+ const maybeName = v.name;
184
+ const name = typeof maybeName === "string" && maybeName.length > 0
185
+ ? maybeName
186
+ : "anonymous";
187
+ return `[Function ${name}]`;
188
+ }
189
+ if (typeof v === "object" && v) {
190
+ if (seen.has(v))
191
+ return "[Circular]";
192
+ seen.add(v);
193
+ }
194
+ return v;
195
+ }, 2);
196
+ if (!raw)
197
+ return String(value);
198
+ return raw.length > limit ? `${raw.slice(0, limit)}…` : raw;
199
+ }
200
+ catch {
201
+ return String(value);
202
+ }
203
+ }
204
+ function extractBoomDetails(err) {
205
+ if (!err || typeof err !== "object")
206
+ return null;
207
+ const output = err?.output;
208
+ if (!output || typeof output !== "object")
209
+ return null;
210
+ const payload = output.payload;
211
+ const statusCode = typeof output.statusCode === "number"
212
+ ? output.statusCode
213
+ : typeof payload?.statusCode === "number"
214
+ ? payload.statusCode
215
+ : undefined;
216
+ const error = typeof payload?.error === "string" ? payload.error : undefined;
217
+ const message = typeof payload?.message === "string" ? payload.message : undefined;
218
+ if (!statusCode && !error && !message)
219
+ return null;
220
+ return { statusCode, error, message };
221
+ }
222
+ export function formatError(err) {
223
+ if (err instanceof Error)
224
+ return err.message;
225
+ if (typeof err === "string")
226
+ return err;
227
+ if (!err || typeof err !== "object")
228
+ return String(err);
229
+ // Baileys frequently wraps errors under `error` with a Boom-like shape.
230
+ const boom = extractBoomDetails(err) ??
231
+ extractBoomDetails(err?.error) ??
232
+ extractBoomDetails(err?.lastDisconnect?.error);
233
+ const status = boom?.statusCode ?? getStatusCode(err);
234
+ const code = err?.code;
235
+ const codeText = typeof code === "string" || typeof code === "number"
236
+ ? String(code)
237
+ : undefined;
238
+ const messageCandidates = [
239
+ boom?.message,
240
+ typeof err?.message === "string"
241
+ ? err.message
242
+ : undefined,
243
+ typeof err?.error?.message ===
244
+ "string"
245
+ ? err.error?.message
246
+ : undefined,
247
+ ].filter((v) => Boolean(v && v.trim().length > 0));
248
+ const message = messageCandidates[0];
249
+ const pieces = [];
250
+ if (typeof status === "number")
251
+ pieces.push(`status=${status}`);
252
+ if (boom?.error)
253
+ pieces.push(boom.error);
254
+ if (message)
255
+ pieces.push(message);
256
+ if (codeText)
257
+ pieces.push(`code=${codeText}`);
258
+ if (pieces.length > 0)
259
+ return pieces.join(" ");
260
+ return safeStringify(err);
261
+ }
262
+ export async function webAuthExists() {
263
+ const sessionLogger = getChildLogger({ module: "web-session" });
264
+ maybeRestoreCredsFromBackup(sessionLogger);
265
+ const authDir = resolveWebAuthDir();
266
+ const credsPath = resolveWebCredsPath();
267
+ try {
268
+ await fs.access(authDir);
269
+ }
270
+ catch {
271
+ return false;
272
+ }
273
+ try {
274
+ const stats = await fs.stat(credsPath);
275
+ if (!stats.isFile() || stats.size <= 1)
276
+ return false;
277
+ const raw = await fs.readFile(credsPath, "utf-8");
278
+ JSON.parse(raw);
279
+ return true;
280
+ }
281
+ catch {
282
+ return false;
283
+ }
284
+ }
285
+ export async function logoutWeb(runtime = defaultRuntime) {
286
+ const exists = await webAuthExists();
287
+ if (!exists) {
288
+ runtime.log(info("No WhatsApp Web session found; nothing to delete."));
289
+ return false;
290
+ }
291
+ await fs.rm(resolveWebAuthDir(), { recursive: true, force: true });
292
+ // Also drop session store to clear lingering per-sender state after logout.
293
+ await fs.rm(resolveDefaultSessionStorePath(), { force: true });
294
+ runtime.log(success("Cleared WhatsApp Web credentials."));
295
+ return true;
296
+ }
297
+ export function readWebSelfId() {
298
+ // Read the cached WhatsApp Web identity (jid + E.164) from disk if present.
299
+ try {
300
+ const credsPath = resolveWebCredsPath();
301
+ if (!fsSync.existsSync(credsPath)) {
302
+ return { e164: null, jid: null };
303
+ }
304
+ const raw = fsSync.readFileSync(credsPath, "utf-8");
305
+ const parsed = JSON.parse(raw);
306
+ const jid = parsed?.me?.id ?? null;
307
+ const e164 = jid ? jidToE164(jid) : null;
308
+ return { e164, jid };
309
+ }
310
+ catch {
311
+ return { e164: null, jid: null };
312
+ }
313
+ }
314
+ /**
315
+ * Return the age (in milliseconds) of the cached WhatsApp web auth state, or null when missing.
316
+ * Helpful for heartbeats/observability to spot stale credentials.
317
+ */
318
+ export function getWebAuthAgeMs() {
319
+ try {
320
+ const stats = fsSync.statSync(resolveWebCredsPath());
321
+ return Date.now() - stats.mtimeMs;
322
+ }
323
+ catch {
324
+ return null;
325
+ }
326
+ }
327
+ export function newConnectionId() {
328
+ return randomUUID();
329
+ }
330
+ export function logWebSelfId(runtime = defaultRuntime, includeProviderPrefix = false) {
331
+ // Human-friendly log of the currently linked personal web session.
332
+ const { e164, jid } = readWebSelfId();
333
+ const details = e164 || jid
334
+ ? `${e164 ?? "unknown"}${jid ? ` (jid ${jid})` : ""}`
335
+ : "unknown";
336
+ const prefix = includeProviderPrefix ? "Web Provider: " : "";
337
+ runtime.log(info(`${prefix}${details}`));
338
+ }
339
+ export async function pickProvider(pref) {
340
+ const choice = pref === "auto" ? "web" : pref;
341
+ const hasWeb = await webAuthExists();
342
+ if (!hasWeb) {
343
+ throw new Error("No WhatsApp Web session found. Run `clawdbot login --verbose` to link.");
344
+ }
345
+ return choice;
346
+ }
@@ -0,0 +1,116 @@
1
+ ---
2
+ summary: "Default Clawdbot agent instructions and skills roster for the personal assistant setup"
3
+ read_when:
4
+ - Starting a new Clawdbot agent session
5
+ - Enabling or auditing default skills
6
+ ---
7
+ # AGENTS.md — Clawdbot Personal Assistant (default)
8
+
9
+ ## First run (recommended)
10
+
11
+ Clawdbot uses a dedicated workspace directory for the agent. Default: `~/.clawdbot/workspace`.
12
+
13
+ 1) Create the workspace (if it doesn’t already exist):
14
+
15
+ ```bash
16
+ mkdir -p ~/.clawdbot/workspace
17
+ ```
18
+
19
+ 2) Copy the default workspace templates into the workspace:
20
+
21
+ ```bash
22
+ cp docs/templates/AGENTS.md ~/.clawdbot/workspace/AGENTS.md
23
+ cp docs/templates/SOUL.md ~/.clawdbot/workspace/SOUL.md
24
+ cp docs/templates/TOOLS.md ~/.clawdbot/workspace/TOOLS.md
25
+ ```
26
+
27
+ 3) Optional: if you want the personal assistant skill roster, replace AGENTS.md with this file:
28
+
29
+ ```bash
30
+ cp docs/AGENTS.default.md ~/.clawdbot/workspace/AGENTS.md
31
+ ```
32
+
33
+ 4) Optional: choose a different workspace by setting `agent.workspace` (supports `~`):
34
+
35
+ ```json5
36
+ {
37
+ agent: {
38
+ workspace: "~/clawd"
39
+ }
40
+ }
41
+ ```
42
+
43
+ ## Safety defaults
44
+ - Don’t dump directories or secrets into chat.
45
+ - Don’t run destructive commands unless explicitly asked.
46
+ - Don’t send partial/streaming replies to external messaging surfaces (only final replies).
47
+
48
+ ## Session start (required)
49
+ - Read `SOUL.md`, `USER.md`, `memory.md`, and today+yesterday in `memory/`.
50
+ - Do it before responding.
51
+
52
+ ## Soul (required)
53
+ - `SOUL.md` defines identity, tone, and boundaries. Keep it current.
54
+ - If you change `SOUL.md`, tell the user.
55
+ - You are a fresh instance each session; continuity lives in these files.
56
+
57
+ ## Shared spaces (recommended)
58
+ - You’re not the user’s voice; be careful in group chats or public channels.
59
+ - Don’t share private data, contact info, or internal notes.
60
+
61
+ ## Memory system (recommended)
62
+ - Daily log: `memory/YYYY-MM-DD.md` (create `memory/` if needed).
63
+ - Long-term memory: `memory.md` for durable facts, preferences, and decisions.
64
+ - On session start, read today + yesterday + `memory.md` if present.
65
+ - Capture: decisions, preferences, constraints, open loops.
66
+ - Avoid secrets unless explicitly requested.
67
+
68
+ ## Tools & skills
69
+ - Tools live in skills; follow each skill’s `SKILL.md` when you need it.
70
+ - Keep environment-specific notes in `TOOLS.md` (Notes for Skills).
71
+
72
+ ## Backup tip (recommended)
73
+ If you treat this workspace as Clawd’s “memory”, make it a git repo (ideally private) so `AGENTS.md` and your memory files are backed up.
74
+
75
+ ```bash
76
+ cd ~/.clawdbot/workspace
77
+ git init
78
+ git add AGENTS.md
79
+ git commit -m "Add Clawd workspace"
80
+ # Optional: add a private remote + push
81
+ ```
82
+
83
+ ## What Clawdbot Does
84
+ - Runs WhatsApp gateway + Pi coding agent so the assistant can read/write chats, fetch context, and run skills via the host Mac.
85
+ - macOS app manages permissions (screen recording, notifications, microphone) and exposes the `clawdbot` CLI via its bundled binary.
86
+ - Direct chats collapse into the shared `main` session by default; groups stay isolated as `surface:group:<id>` (rooms: `surface:channel:<id>`); heartbeats keep background tasks alive.
87
+
88
+ ## Core Skills (enable in Settings → Skills)
89
+ - **mcporter** — Tool server runtime/CLI for managing external skill backends.
90
+ - **Peekaboo** — Fast macOS screenshots with optional AI vision analysis.
91
+ - **camsnap** — Capture frames, clips, or motion alerts from RTSP/ONVIF security cams.
92
+ - **oracle** — OpenAI-ready agent CLI with session replay and browser control.
93
+ - **qmd** — Hybrid markdown search (BM25 + vectors + rerank) with a local server for agents.
94
+ - **eightctl** — Control your sleep, from the terminal.
95
+ - **imsg** — Send, read, stream iMessage & SMS.
96
+ - **wacli** — WhatsApp CLI: sync, search, send.
97
+ - **discord** — Discord actions: react, stickers, polls.
98
+ - **gog** — Google Suite CLI: Gmail, Calendar, Drive, Contacts.
99
+ - **spotify-player** — Terminal Spotify client to search/queue/control playback.
100
+ - **sag** — ElevenLabs speech with mac-style say UX; streams to speakers by default.
101
+ - **Sonos CLI** — Control Sonos speakers (discover/status/playback/volume/grouping) from scripts.
102
+ - **blucli** — Play, group, and automate BluOS players from scripts.
103
+ - **OpenHue CLI** — Philips Hue lighting control for scenes and automations.
104
+ - **OpenAI Whisper** — Local speech-to-text for quick dictation and voicemail transcripts.
105
+ - **Gemini CLI** — Google Gemini models from the terminal for fast Q&A.
106
+ - **bird** — X/Twitter CLI to tweet, reply, read threads, and search without a browser.
107
+ - **agent-tools** — Utility toolkit for automations and helper scripts.
108
+
109
+ ## Usage Notes
110
+ - Prefer the `clawdbot` CLI for scripting; mac app handles permissions.
111
+ - Run installs from the Skills tab; it hides the button if a binary is already present.
112
+ - Keep heartbeats enabled so the assistant can schedule reminders, monitor inboxes, and trigger camera captures.
113
+ - Canvas UI runs full-screen with native overlays. Avoid placing critical controls in the top-left/top-right/bottom edges; add explicit gutters in the layout and don’t rely on safe-area insets.
114
+ - For browser-driven verification, use `clawdbot browser` (tabs/status/screenshot) with the clawd-managed Chrome profile.
115
+ - For DOM inspection, use `clawdbot browser eval|query|dom|snapshot` (and `--json`/`--out` when you need machine output).
116
+ - For interactions, use `clawdbot browser click|type|hover|drag|select|upload|press|wait|navigate|back|evaluate|run` (click/type require snapshot refs; use `evaluate` for CSS selectors).
package/docs/CNAME ADDED
@@ -0,0 +1 @@
1
+ clawdbot.com
@@ -0,0 +1,64 @@
1
+ ---
2
+ summary: "Step-by-step release checklist for npm + macOS app"
3
+ read_when:
4
+ - Cutting a new npm release
5
+ - Cutting a new macOS app release
6
+ - Verifying metadata before publishing
7
+ ---
8
+
9
+ # Release Checklist (npm + macOS)
10
+
11
+ Use `pnpm` (Node 22+) from the repo root. Keep the working tree clean before tagging/publishing.
12
+
13
+ 1) **Version & metadata**
14
+ - [ ] Bump `package.json` version (e.g., `1.1.0`).
15
+ - [ ] Update CLI/version strings: `src/cli/program.ts` and the Baileys user agent in `src/provider-web.ts`.
16
+ - [ ] Confirm package metadata (name, description, repository, keywords, license) and `bin` map points to `dist/index.js` for `clawdbot`.
17
+ - [ ] If dependencies changed, run `pnpm install` so `pnpm-lock.yaml` is current.
18
+
19
+ 2) **Build & artifacts**
20
+ - [ ] If A2UI inputs changed, run `pnpm canvas:a2ui:bundle` and commit any updated `src/canvas-host/a2ui/a2ui.bundle.js`.
21
+ - [ ] `pnpm run build` (regenerates `dist/`).
22
+ - [ ] Optional: `npm pack --pack-destination /tmp` after the build; inspect the tarball contents and keep it handy for the GitHub release (do **not** commit it).
23
+
24
+ 3) **Changelog & docs**
25
+ - [ ] Update `CHANGELOG.md` with user-facing highlights (create the file if missing); keep entries strictly descending by version.
26
+ - [ ] Ensure README examples/flags match current CLI behavior (notably new commands or options).
27
+
28
+ 4) **Validation**
29
+ - [ ] `pnpm lint`
30
+ - [ ] `pnpm test` (or `pnpm test:coverage` if you need coverage output)
31
+ - [ ] `pnpm run build` (last sanity check after tests)
32
+ - [ ] `pnpm release:check` (verifies npm pack contents)
33
+ - [ ] (Optional) Spot-check the web gateway if your changes affect send/receive paths.
34
+
35
+ 5) **macOS app (Sparkle)**
36
+ - [ ] Build + sign the macOS app, then zip it for distribution.
37
+ - [ ] Generate the Sparkle appcast (HTML notes via `scripts/make_appcast.sh`) and update `appcast.xml`.
38
+ - [ ] Keep the app zip (and optional dSYM zip) ready to attach to the GitHub release.
39
+ - [ ] Follow `docs/mac/release.md` for the exact commands and required env vars.
40
+ - `APP_BUILD` must be numeric + monotonic (no `-beta`) so Sparkle compares versions correctly.
41
+ - If notarizing, use the `clawdbot-notary` keychain profile created from App Store Connect API env vars (see `docs/mac/release.md`).
42
+
43
+ 6) **Publish (npm)**
44
+ - [ ] Confirm git status is clean; commit and push as needed.
45
+ - [ ] `npm login` (verify 2FA) if needed.
46
+ - [ ] `npm publish --access public` (use `--tag beta` for pre-releases).
47
+ - [ ] Verify the registry: `npm view clawdbot version` and `npx -y clawdbot@X.Y.Z --version` (or `--help`).
48
+
49
+ ### Troubleshooting (notes from 2.0.0-beta2 release)
50
+ - **npm pack/publish hangs or produces huge tarball**: the macOS app bundle in `dist/Clawdbot.app` (and release zips) get swept into the package. Fix by whitelisting publish contents via `package.json` `files` (include dist subdirs, docs, skills; exclude app bundles). Confirm with `npm pack --dry-run` that `dist/Clawdbot.app` is not listed.
51
+ - **npm auth web loop for dist-tags**: use legacy auth to get an OTP prompt:
52
+ - `NPM_CONFIG_AUTH_TYPE=legacy npm dist-tag add clawdbot@X.Y.Z latest`
53
+ - **`npx` verification fails with `ECOMPROMISED: Lock compromised`**: retry with a fresh cache:
54
+ - `NPM_CONFIG_CACHE=/tmp/npm-cache-$(date +%s) npx -y clawdbot@X.Y.Z --version`
55
+ - **Tag needs repointing after a late fix**: force-update and push the tag, then ensure the GitHub release assets still match:
56
+ - `git tag -f vX.Y.Z && git push -f origin vX.Y.Z`
57
+
58
+ 7) **GitHub release + appcast**
59
+ - [ ] Tag and push: `git tag vX.Y.Z && git push origin vX.Y.Z` (or `git push --tags`).
60
+ - [ ] Create/refresh the GitHub release for `vX.Y.Z` with **title `clawdbot X.Y.Z`** (not just the tag); body should inline the product-facing bullets from the changelog (no bare links) **and must not repeat the title inside the body**.
61
+ - [ ] Attach artifacts: `npm pack` tarball (optional), `Clawdbot-X.Y.Z.zip`, and `Clawdbot-X.Y.Z.dSYM.zip` (if generated).
62
+ - [ ] Commit the updated `appcast.xml` and push it (Sparkle feeds from main).
63
+ - [ ] From a clean temp directory (no `package.json`), run `npx -y clawdbot@X.Y.Z send --help` to confirm install/CLI entrypoints work.
64
+ - [ ] Announce/share release notes.
@@ -0,0 +1,51 @@
1
+ title: "CLAWDBOT Docs"
2
+ description: "A TypeScript/Node gateway + macOS/iOS companions for WhatsApp (web) and Telegram (bot)."
3
+ markdown: kramdown
4
+ highlighter: rouge
5
+
6
+ # Keep GitHub Pages' default page URLs (e.g. /gateway.html). Many docs links
7
+ # are written as relative *.md links and are rewritten during the build.
8
+
9
+ plugins:
10
+ - jekyll-relative-links
11
+
12
+ relative_links:
13
+ enabled: true
14
+ collections: true
15
+
16
+ defaults:
17
+ - scope:
18
+ path: ""
19
+ values:
20
+ layout: default
21
+
22
+ nav:
23
+ - title: "Home"
24
+ url: "/"
25
+ - title: "Clawd Setup"
26
+ url: "/clawd.html"
27
+ - title: "Gateway"
28
+ url: "/gateway.html"
29
+ - title: "Remote"
30
+ url: "/remote.html"
31
+ - title: "Discovery"
32
+ url: "/discovery.html"
33
+ - title: "Configuration"
34
+ url: "/configuration.html"
35
+ - title: "WebChat"
36
+ url: "/webchat.html"
37
+ - title: "macOS App"
38
+ url: "/clawdbot-mac.html"
39
+ - title: "iOS Node"
40
+ url: "/ios/connect.html"
41
+ - title: "Telegram"
42
+ url: "/telegram.html"
43
+ - title: "Security"
44
+ url: "/security.html"
45
+ - title: "Troubleshooting"
46
+ url: "/troubleshooting.html"
47
+
48
+ kramdown:
49
+ input: GFM
50
+ hard_wrap: false
51
+ syntax_highlighter: rouge