@intent-systems/nexus 2026.1.5-3

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 (827) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/LICENSE +21 -0
  3. package/README-header.png +0 -0
  4. package/README.md +462 -0
  5. package/dist/agents/agent-paths.js +16 -0
  6. package/dist/agents/agent-scope.js +44 -0
  7. package/dist/agents/auth-profiles.js +626 -0
  8. package/dist/agents/bash-process-registry.js +126 -0
  9. package/dist/agents/bash-tools.js +838 -0
  10. package/dist/agents/chutes-oauth.js +47 -0
  11. package/dist/agents/clawdbot-tools.js +62 -0
  12. package/dist/agents/context.js +34 -0
  13. package/dist/agents/defaults.js +6 -0
  14. package/dist/agents/memory-search.js +80 -0
  15. package/dist/agents/model-auth.js +115 -0
  16. package/dist/agents/model-catalog.js +55 -0
  17. package/dist/agents/model-fallback.js +210 -0
  18. package/dist/agents/model-scan.js +263 -0
  19. package/dist/agents/model-selection.js +152 -0
  20. package/dist/agents/models-config.js +171 -0
  21. package/dist/agents/nexus-tools.js +46 -0
  22. package/dist/agents/pi-embedded-block-chunker.js +188 -0
  23. package/dist/agents/pi-embedded-helpers.js +139 -0
  24. package/dist/agents/pi-embedded-runner.js +932 -0
  25. package/dist/agents/pi-embedded-subscribe.js +541 -0
  26. package/dist/agents/pi-embedded-utils.js +20 -0
  27. package/dist/agents/pi-embedded.js +1 -0
  28. package/dist/agents/pi-extensions/compaction-safeguard.js +140 -0
  29. package/dist/agents/pi-tool-definition-adapter.js +17 -0
  30. package/dist/agents/pi-tools.js +510 -0
  31. package/dist/agents/pi-tools.schema.js +358 -0
  32. package/dist/agents/sandbox-paths.js +68 -0
  33. package/dist/agents/sandbox.js +667 -0
  34. package/dist/agents/shell-utils.js +53 -0
  35. package/dist/agents/skill-runner.js +224 -0
  36. package/dist/agents/skill-state.js +164 -0
  37. package/dist/agents/skill-tools.js +191 -0
  38. package/dist/agents/skill-usage.js +43 -0
  39. package/dist/agents/skills-install.js +244 -0
  40. package/dist/agents/skills-status.js +157 -0
  41. package/dist/agents/skills.js +472 -0
  42. package/dist/agents/subagent-registry.js +321 -0
  43. package/dist/agents/subagent-registry.store.js +47 -0
  44. package/dist/agents/system-prompt.js +179 -0
  45. package/dist/agents/timeout.js +26 -0
  46. package/dist/agents/tool-display.js +155 -0
  47. package/dist/agents/tool-display.json +236 -0
  48. package/dist/agents/tool-images.js +138 -0
  49. package/dist/agents/tool-policy.js +87 -0
  50. package/dist/agents/tools/agent-step.js +41 -0
  51. package/dist/agents/tools/browser-tool.js +295 -0
  52. package/dist/agents/tools/canvas-tool.js +193 -0
  53. package/dist/agents/tools/common.js +88 -0
  54. package/dist/agents/tools/cron-tool.js +141 -0
  55. package/dist/agents/tools/discord-actions-guild.js +186 -0
  56. package/dist/agents/tools/discord-actions-messaging.js +313 -0
  57. package/dist/agents/tools/discord-actions-moderation.js +70 -0
  58. package/dist/agents/tools/discord-actions.js +56 -0
  59. package/dist/agents/tools/discord-schema.js +199 -0
  60. package/dist/agents/tools/discord-tool.js +16 -0
  61. package/dist/agents/tools/gateway-tool.js +46 -0
  62. package/dist/agents/tools/gateway.js +28 -0
  63. package/dist/agents/tools/image-tool.js +140 -0
  64. package/dist/agents/tools/memory-tool.js +92 -0
  65. package/dist/agents/tools/nodes-tool.js +413 -0
  66. package/dist/agents/tools/nodes-utils.js +92 -0
  67. package/dist/agents/tools/sessions-announce-target.js +35 -0
  68. package/dist/agents/tools/sessions-helpers.js +88 -0
  69. package/dist/agents/tools/sessions-history-tool.js +137 -0
  70. package/dist/agents/tools/sessions-list-tool.js +196 -0
  71. package/dist/agents/tools/sessions-send-helpers.js +103 -0
  72. package/dist/agents/tools/sessions-send-tool.js +371 -0
  73. package/dist/agents/tools/sessions-spawn-tool.js +319 -0
  74. package/dist/agents/tools/slack-actions.js +129 -0
  75. package/dist/agents/tools/slack-schema.js +59 -0
  76. package/dist/agents/tools/slack-tool.js +16 -0
  77. package/dist/agents/tools/telegram-actions.js +159 -0
  78. package/dist/agents/tools/telegram-schema.js +28 -0
  79. package/dist/agents/tools/telegram-tool.js +16 -0
  80. package/dist/agents/tools/whatsapp-login-tool.js +63 -0
  81. package/dist/agents/usage.js +58 -0
  82. package/dist/agents/workspace.js +264 -0
  83. package/dist/auto-reply/chunk.js +177 -0
  84. package/dist/auto-reply/command-auth.js +44 -0
  85. package/dist/auto-reply/command-detection.js +22 -0
  86. package/dist/auto-reply/envelope.js +30 -0
  87. package/dist/auto-reply/group-activation.js +20 -0
  88. package/dist/auto-reply/heartbeat.js +58 -0
  89. package/dist/auto-reply/model.js +22 -0
  90. package/dist/auto-reply/reply/abort.js +14 -0
  91. package/dist/auto-reply/reply/agent-runner.js +426 -0
  92. package/dist/auto-reply/reply/bash-command.js +314 -0
  93. package/dist/auto-reply/reply/block-streaming.js +34 -0
  94. package/dist/auto-reply/reply/body.js +29 -0
  95. package/dist/auto-reply/reply/commands.js +332 -0
  96. package/dist/auto-reply/reply/directive-handling.js +626 -0
  97. package/dist/auto-reply/reply/directives.js +59 -0
  98. package/dist/auto-reply/reply/dispatch-from-config.js +23 -0
  99. package/dist/auto-reply/reply/followup-runner.js +181 -0
  100. package/dist/auto-reply/reply/groups.js +152 -0
  101. package/dist/auto-reply/reply/mentions.js +64 -0
  102. package/dist/auto-reply/reply/model-selection.js +209 -0
  103. package/dist/auto-reply/reply/queue.js +399 -0
  104. package/dist/auto-reply/reply/reply-dispatcher.js +68 -0
  105. package/dist/auto-reply/reply/reply-tags.js +26 -0
  106. package/dist/auto-reply/reply/session-updates.js +103 -0
  107. package/dist/auto-reply/reply/session.js +169 -0
  108. package/dist/auto-reply/reply/typing.js +125 -0
  109. package/dist/auto-reply/reply.js +655 -0
  110. package/dist/auto-reply/send-policy.js +28 -0
  111. package/dist/auto-reply/status.js +197 -0
  112. package/dist/auto-reply/templating.js +9 -0
  113. package/dist/auto-reply/thinking.js +49 -0
  114. package/dist/auto-reply/tokens.js +2 -0
  115. package/dist/auto-reply/tool-meta.js +74 -0
  116. package/dist/auto-reply/transcription.js +57 -0
  117. package/dist/auto-reply/types.js +1 -0
  118. package/dist/browser/bridge-server.js +37 -0
  119. package/dist/browser/cdp.js +382 -0
  120. package/dist/browser/chrome.js +432 -0
  121. package/dist/browser/client-actions-core.js +67 -0
  122. package/dist/browser/client-actions-observe.js +24 -0
  123. package/dist/browser/client-actions-types.js +1 -0
  124. package/dist/browser/client-actions.js +3 -0
  125. package/dist/browser/client-fetch.js +43 -0
  126. package/dist/browser/client.js +105 -0
  127. package/dist/browser/config.js +155 -0
  128. package/dist/browser/constants.js +5 -0
  129. package/dist/browser/profiles-service.js +124 -0
  130. package/dist/browser/profiles.js +96 -0
  131. package/dist/browser/pw-ai.js +2 -0
  132. package/dist/browser/pw-session.js +144 -0
  133. package/dist/browser/pw-tools-core.js +363 -0
  134. package/dist/browser/routes/agent.js +535 -0
  135. package/dist/browser/routes/basic.js +155 -0
  136. package/dist/browser/routes/index.js +8 -0
  137. package/dist/browser/routes/tabs.js +105 -0
  138. package/dist/browser/routes/utils.js +62 -0
  139. package/dist/browser/screenshot.js +40 -0
  140. package/dist/browser/server-context.js +377 -0
  141. package/dist/browser/server.js +81 -0
  142. package/dist/browser/target-id.js +18 -0
  143. package/dist/browser/trash.js +21 -0
  144. package/dist/canvas-host/a2ui/a2ui.bundle.js +17768 -0
  145. package/dist/canvas-host/a2ui/index.html +246 -0
  146. package/dist/canvas-host/a2ui.js +187 -0
  147. package/dist/canvas-host/server.js +382 -0
  148. package/dist/channel-web.js +8 -0
  149. package/dist/cli/browser-cli-actions-input.js +459 -0
  150. package/dist/cli/browser-cli-actions-observe.js +56 -0
  151. package/dist/cli/browser-cli-examples.js +31 -0
  152. package/dist/cli/browser-cli-inspect.js +97 -0
  153. package/dist/cli/browser-cli-manage.js +286 -0
  154. package/dist/cli/browser-cli-shared.js +1 -0
  155. package/dist/cli/browser-cli.js +26 -0
  156. package/dist/cli/canvas-cli.js +416 -0
  157. package/dist/cli/cloud-cli.js +336 -0
  158. package/dist/cli/credential-cli.js +227 -0
  159. package/dist/cli/cron-cli.js +454 -0
  160. package/dist/cli/deps.js +17 -0
  161. package/dist/cli/dns-cli.js +180 -0
  162. package/dist/cli/gateway-cli.js +665 -0
  163. package/dist/cli/gateway-rpc.js +20 -0
  164. package/dist/cli/hooks-cli.js +135 -0
  165. package/dist/cli/memory-cli.js +101 -0
  166. package/dist/cli/models-cli.js +248 -0
  167. package/dist/cli/nodes-camera.js +57 -0
  168. package/dist/cli/nodes-canvas.js +26 -0
  169. package/dist/cli/nodes-cli.js +946 -0
  170. package/dist/cli/nodes-screen.js +37 -0
  171. package/dist/cli/pairing-cli.js +100 -0
  172. package/dist/cli/parse-duration.js +20 -0
  173. package/dist/cli/plugins-cli.js +158 -0
  174. package/dist/cli/ports.js +97 -0
  175. package/dist/cli/profile.js +81 -0
  176. package/dist/cli/program.js +162 -0
  177. package/dist/cli/prompt.js +19 -0
  178. package/dist/cli/run-main.js +48 -0
  179. package/dist/cli/skills-cli.js +132 -0
  180. package/dist/cli/skills-hub-cli.js +1093 -0
  181. package/dist/cli/telegram-cli.js +56 -0
  182. package/dist/cli/tool-connector-cli.js +118 -0
  183. package/dist/cli/tui-cli.js +35 -0
  184. package/dist/cli/upstream-sync-cli.js +2833 -0
  185. package/dist/cli/usage-cli.js +24 -0
  186. package/dist/cli/wait.js +8 -0
  187. package/dist/commands/agent-via-gateway.js +115 -0
  188. package/dist/commands/agent.js +665 -0
  189. package/dist/commands/antigravity-oauth.js +327 -0
  190. package/dist/commands/auth-choice-options.js +80 -0
  191. package/dist/commands/auth-choice.js +134 -0
  192. package/dist/commands/auth-token.js +31 -0
  193. package/dist/commands/bootstrap-preset.js +214 -0
  194. package/dist/commands/capabilities.js +36 -0
  195. package/dist/commands/chutes-oauth.js +144 -0
  196. package/dist/commands/claude-md.js +137 -0
  197. package/dist/commands/config-view.js +11 -0
  198. package/dist/commands/configure.js +648 -0
  199. package/dist/commands/credential.js +236 -0
  200. package/dist/commands/cursor-rules.js +230 -0
  201. package/dist/commands/doctor-state-migrations.js +358 -0
  202. package/dist/commands/doctor-ui.js +113 -0
  203. package/dist/commands/doctor.js +673 -0
  204. package/dist/commands/health.js +112 -0
  205. package/dist/commands/identity.js +54 -0
  206. package/dist/commands/init.js +167 -0
  207. package/dist/commands/models/aliases.js +85 -0
  208. package/dist/commands/models/fallbacks.js +123 -0
  209. package/dist/commands/models/image-fallbacks.js +123 -0
  210. package/dist/commands/models/list.js +347 -0
  211. package/dist/commands/models/scan.js +271 -0
  212. package/dist/commands/models/set-image.js +27 -0
  213. package/dist/commands/models/set.js +27 -0
  214. package/dist/commands/models/shared.js +73 -0
  215. package/dist/commands/models.js +7 -0
  216. package/dist/commands/onboard-auth.js +101 -0
  217. package/dist/commands/onboard-channels.js +814 -0
  218. package/dist/commands/onboard-eve-identity.js +98 -0
  219. package/dist/commands/onboard-github.js +153 -0
  220. package/dist/commands/onboard-helpers.js +303 -0
  221. package/dist/commands/onboard-interactive.js +17 -0
  222. package/dist/commands/onboard-non-interactive.js +228 -0
  223. package/dist/commands/onboard-providers.js +829 -0
  224. package/dist/commands/onboard-quickstart.js +185 -0
  225. package/dist/commands/onboard-remote.js +120 -0
  226. package/dist/commands/onboard-skills.js +148 -0
  227. package/dist/commands/onboard-types.js +1 -0
  228. package/dist/commands/onboard.js +19 -0
  229. package/dist/commands/openai-codex-model-default.js +38 -0
  230. package/dist/commands/poll.js +64 -0
  231. package/dist/commands/quest.js +27 -0
  232. package/dist/commands/reset.js +61 -0
  233. package/dist/commands/send.js +124 -0
  234. package/dist/commands/sessions-ingest.js +359 -0
  235. package/dist/commands/sessions.js +212 -0
  236. package/dist/commands/setup.js +59 -0
  237. package/dist/commands/signal-install.js +135 -0
  238. package/dist/commands/skills-manifest.js +235 -0
  239. package/dist/commands/status.js +139 -0
  240. package/dist/commands/suggestions.js +54 -0
  241. package/dist/commands/systemd-linger.js +71 -0
  242. package/dist/commands/update.js +16 -0
  243. package/dist/commands/usage-upload.js +27 -0
  244. package/dist/config/config.js +6 -0
  245. package/dist/config/defaults.js +140 -0
  246. package/dist/config/group-policy.js +49 -0
  247. package/dist/config/includes.js +183 -0
  248. package/dist/config/io.js +188 -0
  249. package/dist/config/legacy-migrate.js +13 -0
  250. package/dist/config/legacy.js +425 -0
  251. package/dist/config/paths.js +82 -0
  252. package/dist/config/port-defaults.js +32 -0
  253. package/dist/config/schema.js +173 -0
  254. package/dist/config/sessions.js +611 -0
  255. package/dist/config/talk.js +31 -0
  256. package/dist/config/types.js +1 -0
  257. package/dist/config/validation.js +29 -0
  258. package/dist/config/zod-schema.js +1110 -0
  259. package/dist/control-ui/assets/index-D8Q5AI4D.js +2393 -0
  260. package/dist/control-ui/assets/index-D8Q5AI4D.js.map +1 -0
  261. package/dist/control-ui/assets/index-g06q5Xc3.css +1 -0
  262. package/dist/control-ui/favicon.ico +0 -0
  263. package/dist/control-ui/index.html +16 -0
  264. package/dist/cron/isolated-agent.js +529 -0
  265. package/dist/cron/normalize.js +73 -0
  266. package/dist/cron/parse.js +24 -0
  267. package/dist/cron/run-log.js +72 -0
  268. package/dist/cron/schedule.js +24 -0
  269. package/dist/cron/service.js +471 -0
  270. package/dist/cron/store.js +43 -0
  271. package/dist/cron/types.js +1 -0
  272. package/dist/daemon/constants.js +10 -0
  273. package/dist/daemon/launchd.js +295 -0
  274. package/dist/daemon/legacy.js +63 -0
  275. package/dist/daemon/program-args.js +141 -0
  276. package/dist/daemon/schtasks.js +269 -0
  277. package/dist/daemon/service.js +69 -0
  278. package/dist/daemon/systemd.js +332 -0
  279. package/dist/discord/index.js +2 -0
  280. package/dist/discord/monitor.js +1089 -0
  281. package/dist/discord/probe.js +54 -0
  282. package/dist/discord/send.js +652 -0
  283. package/dist/discord/token.js +8 -0
  284. package/dist/entry.js +16 -0
  285. package/dist/gateway/auth.js +121 -0
  286. package/dist/gateway/call.js +103 -0
  287. package/dist/gateway/chat-attachments.js +41 -0
  288. package/dist/gateway/client.js +180 -0
  289. package/dist/gateway/config-reload.js +274 -0
  290. package/dist/gateway/control-ui.js +184 -0
  291. package/dist/gateway/hooks-mapping.js +282 -0
  292. package/dist/gateway/hooks.js +168 -0
  293. package/dist/gateway/net.js +29 -0
  294. package/dist/gateway/protocol/index.js +62 -0
  295. package/dist/gateway/protocol/schema.js +577 -0
  296. package/dist/gateway/server-bridge-subscriptions.js +93 -0
  297. package/dist/gateway/server-bridge.js +1066 -0
  298. package/dist/gateway/server-browser.js +11 -0
  299. package/dist/gateway/server-channels.js +680 -0
  300. package/dist/gateway/server-chat.js +159 -0
  301. package/dist/gateway/server-constants.js +8 -0
  302. package/dist/gateway/server-discovery.js +62 -0
  303. package/dist/gateway/server-http.js +165 -0
  304. package/dist/gateway/server-methods/agent-job.js +114 -0
  305. package/dist/gateway/server-methods/agent.js +254 -0
  306. package/dist/gateway/server-methods/channels.js +239 -0
  307. package/dist/gateway/server-methods/chat.js +207 -0
  308. package/dist/gateway/server-methods/config.js +50 -0
  309. package/dist/gateway/server-methods/connect.js +6 -0
  310. package/dist/gateway/server-methods/cron.js +89 -0
  311. package/dist/gateway/server-methods/health.js +28 -0
  312. package/dist/gateway/server-methods/models.js +16 -0
  313. package/dist/gateway/server-methods/nodes.js +294 -0
  314. package/dist/gateway/server-methods/providers.js +257 -0
  315. package/dist/gateway/server-methods/send.js +254 -0
  316. package/dist/gateway/server-methods/sessions.js +382 -0
  317. package/dist/gateway/server-methods/skills.js +83 -0
  318. package/dist/gateway/server-methods/system.js +118 -0
  319. package/dist/gateway/server-methods/talk.js +22 -0
  320. package/dist/gateway/server-methods/types.js +1 -0
  321. package/dist/gateway/server-methods/voicewake.js +30 -0
  322. package/dist/gateway/server-methods/web.js +81 -0
  323. package/dist/gateway/server-methods/wizard.js +100 -0
  324. package/dist/gateway/server-methods.js +53 -0
  325. package/dist/gateway/server-providers.js +687 -0
  326. package/dist/gateway/server-shared.js +1 -0
  327. package/dist/gateway/server-utils.js +35 -0
  328. package/dist/gateway/server.js +1478 -0
  329. package/dist/gateway/session-utils.js +355 -0
  330. package/dist/gateway/ws-log.js +343 -0
  331. package/dist/gateway/ws-logging.js +8 -0
  332. package/dist/globals.js +41 -0
  333. package/dist/hooks/gmail-ops.js +236 -0
  334. package/dist/hooks/gmail-setup-utils.js +278 -0
  335. package/dist/hooks/gmail-watcher.js +190 -0
  336. package/dist/hooks/gmail.js +177 -0
  337. package/dist/imessage/client.js +165 -0
  338. package/dist/imessage/index.js +3 -0
  339. package/dist/imessage/monitor.js +365 -0
  340. package/dist/imessage/probe.js +26 -0
  341. package/dist/imessage/send.js +83 -0
  342. package/dist/imessage/targets.js +176 -0
  343. package/dist/index.js +55 -0
  344. package/dist/infra/agent-events.js +46 -0
  345. package/dist/infra/binaries.js +9 -0
  346. package/dist/infra/bonjour-discovery.js +163 -0
  347. package/dist/infra/bonjour.js +200 -0
  348. package/dist/infra/bridge/server.js +564 -0
  349. package/dist/infra/canvas-host-url.js +54 -0
  350. package/dist/infra/channel-summary.js +78 -0
  351. package/dist/infra/control-ui-assets.js +112 -0
  352. package/dist/infra/dotenv.js +15 -0
  353. package/dist/infra/env.js +8 -0
  354. package/dist/infra/errors.js +28 -0
  355. package/dist/infra/event-log.js +251 -0
  356. package/dist/infra/gateway-lock.js +8 -0
  357. package/dist/infra/git-commit.js +91 -0
  358. package/dist/infra/heartbeat-events.js +21 -0
  359. package/dist/infra/heartbeat-runner.js +458 -0
  360. package/dist/infra/heartbeat-wake.js +61 -0
  361. package/dist/infra/is-main.js +37 -0
  362. package/dist/infra/json-file.js +21 -0
  363. package/dist/infra/machine-name.js +40 -0
  364. package/dist/infra/nexus-root.js +56 -0
  365. package/dist/infra/node-pairing.js +212 -0
  366. package/dist/infra/path-env.js +93 -0
  367. package/dist/infra/ports.js +87 -0
  368. package/dist/infra/provider-summary.js +80 -0
  369. package/dist/infra/provider-usage.auth.js +189 -0
  370. package/dist/infra/provider-usage.fetch.claude.js +129 -0
  371. package/dist/infra/provider-usage.fetch.codex.js +62 -0
  372. package/dist/infra/provider-usage.fetch.copilot.js +42 -0
  373. package/dist/infra/provider-usage.fetch.gemini.js +57 -0
  374. package/dist/infra/provider-usage.fetch.js +6 -0
  375. package/dist/infra/provider-usage.fetch.minimax.js +214 -0
  376. package/dist/infra/provider-usage.fetch.shared.js +11 -0
  377. package/dist/infra/provider-usage.fetch.zai.js +62 -0
  378. package/dist/infra/provider-usage.format.js +77 -0
  379. package/dist/infra/provider-usage.js +145 -0
  380. package/dist/infra/provider-usage.load.js +54 -0
  381. package/dist/infra/provider-usage.shared.js +19 -0
  382. package/dist/infra/provider-usage.types.js +1 -0
  383. package/dist/infra/restart.js +29 -0
  384. package/dist/infra/retry.js +16 -0
  385. package/dist/infra/runtime-guard.js +59 -0
  386. package/dist/infra/shell-env.js +88 -0
  387. package/dist/infra/system-events.js +71 -0
  388. package/dist/infra/system-presence.js +217 -0
  389. package/dist/infra/tailnet.js +46 -0
  390. package/dist/infra/tailscale.js +149 -0
  391. package/dist/infra/unhandled-rejections.js +19 -0
  392. package/dist/infra/usage-suggestions.js +241 -0
  393. package/dist/infra/usage-upload.js +290 -0
  394. package/dist/infra/voicewake.js +78 -0
  395. package/dist/infra/widearea-dns.js +123 -0
  396. package/dist/infra/ws.js +13 -0
  397. package/dist/logger.js +52 -0
  398. package/dist/logging.js +506 -0
  399. package/dist/macos/gateway-daemon.js +145 -0
  400. package/dist/macos/relay.js +49 -0
  401. package/dist/media/constants.js +33 -0
  402. package/dist/media/host.js +42 -0
  403. package/dist/media/image-ops.js +119 -0
  404. package/dist/media/mime.js +123 -0
  405. package/dist/media/parse.js +83 -0
  406. package/dist/media/server.js +64 -0
  407. package/dist/media/store.js +139 -0
  408. package/dist/polls.js +43 -0
  409. package/dist/process/command-queue.js +97 -0
  410. package/dist/process/exec.js +75 -0
  411. package/dist/provider-web.js +8 -0
  412. package/dist/providers/github-copilot-auth.js +123 -0
  413. package/dist/providers/github-copilot-models.js +35 -0
  414. package/dist/providers/github-copilot-token.js +11 -0
  415. package/dist/providers/location.js +48 -0
  416. package/dist/providers/web/index.js +2 -0
  417. package/dist/runtime.js +8 -0
  418. package/dist/sessions/level-overrides.js +9 -0
  419. package/dist/sessions/send-policy.js +68 -0
  420. package/dist/signal/client.js +134 -0
  421. package/dist/signal/daemon.js +69 -0
  422. package/dist/signal/index.js +3 -0
  423. package/dist/signal/monitor.js +411 -0
  424. package/dist/signal/probe.js +46 -0
  425. package/dist/signal/send.js +91 -0
  426. package/dist/slack/actions.js +97 -0
  427. package/dist/slack/index.js +5 -0
  428. package/dist/slack/monitor.js +1270 -0
  429. package/dist/slack/probe.js +47 -0
  430. package/dist/slack/send.js +131 -0
  431. package/dist/slack/token.js +10 -0
  432. package/dist/telegram/allowed-updates.js +8 -0
  433. package/dist/telegram/bot.js +724 -0
  434. package/dist/telegram/download.js +34 -0
  435. package/dist/telegram/index.js +4 -0
  436. package/dist/telegram/monitor.js +47 -0
  437. package/dist/telegram/pairing-store.js +77 -0
  438. package/dist/telegram/probe.js +63 -0
  439. package/dist/telegram/proxy.js +9 -0
  440. package/dist/telegram/reaction-level.js +45 -0
  441. package/dist/telegram/send.js +151 -0
  442. package/dist/telegram/sent-message-cache.js +65 -0
  443. package/dist/telegram/token.js +30 -0
  444. package/dist/telegram/update-offset-store.js +61 -0
  445. package/dist/telegram/webhook-set.js +12 -0
  446. package/dist/telegram/webhook.js +56 -0
  447. package/dist/tui/commands.js +87 -0
  448. package/dist/tui/components/assistant-message.js +16 -0
  449. package/dist/tui/components/chat-log.js +92 -0
  450. package/dist/tui/components/custom-editor.js +55 -0
  451. package/dist/tui/components/selectors.js +8 -0
  452. package/dist/tui/components/tool-execution.js +111 -0
  453. package/dist/tui/components/user-message.js +17 -0
  454. package/dist/tui/gateway-chat.js +140 -0
  455. package/dist/tui/theme/theme.js +80 -0
  456. package/dist/tui/tui.js +708 -0
  457. package/dist/utils.js +153 -0
  458. package/dist/version.js +18 -0
  459. package/dist/web/accounts.js +86 -0
  460. package/dist/web/active-listener.js +25 -0
  461. package/dist/web/auto-reply.js +1256 -0
  462. package/dist/web/inbound.js +649 -0
  463. package/dist/web/login-qr.js +230 -0
  464. package/dist/web/login.js +71 -0
  465. package/dist/web/media.js +175 -0
  466. package/dist/web/outbound.js +102 -0
  467. package/dist/web/qr-image.js +97 -0
  468. package/dist/web/reconnect.js +60 -0
  469. package/dist/web/session.js +370 -0
  470. package/dist/wizard/clack-prompter.js +56 -0
  471. package/dist/wizard/onboarding.js +620 -0
  472. package/dist/wizard/prompts.js +6 -0
  473. package/dist/wizard/session.js +203 -0
  474. package/docs/AGENTS.default.md +116 -0
  475. package/docs/CAPABILITIES.md +444 -0
  476. package/docs/CNAME +1 -0
  477. package/docs/NEXUS_CORE_REWRITE_SPEC.md +226 -0
  478. package/docs/RELEASING.md +69 -0
  479. package/docs/_config.yml +53 -0
  480. package/docs/_layouts/default.html +145 -0
  481. package/docs/agent-assisted-install.md +95 -0
  482. package/docs/agent-loop.md +61 -0
  483. package/docs/agent-send.md +21 -0
  484. package/docs/agent.md +108 -0
  485. package/docs/android.md +133 -0
  486. package/docs/architecture.md +114 -0
  487. package/docs/assets/markdown.css +133 -0
  488. package/docs/assets/pixel-lobster.svg +60 -0
  489. package/docs/assets/terminal.css +470 -0
  490. package/docs/assets/theme.js +55 -0
  491. package/docs/audio.md +48 -0
  492. package/docs/automation/nexus-sync.md +371 -0
  493. package/docs/background-process.md +74 -0
  494. package/docs/bash.md +32 -0
  495. package/docs/bedrock.md +71 -0
  496. package/docs/bonjour.md +159 -0
  497. package/docs/browser-linux-troubleshooting.md +114 -0
  498. package/docs/browser.md +293 -0
  499. package/docs/bun.md +56 -0
  500. package/docs/camera.md +152 -0
  501. package/docs/clawd.md +212 -0
  502. package/docs/concepts/usage-tracking.md +29 -0
  503. package/docs/configuration.md +1666 -0
  504. package/docs/control-ui.md +83 -0
  505. package/docs/cron.md +385 -0
  506. package/docs/dashboard.md +17 -0
  507. package/docs/device-models.md +46 -0
  508. package/docs/discord.md +308 -0
  509. package/docs/discovery.md +112 -0
  510. package/docs/docker.md +258 -0
  511. package/docs/docs.json +105 -0
  512. package/docs/doctor.md +68 -0
  513. package/docs/elevated.md +31 -0
  514. package/docs/faq.md +736 -0
  515. package/docs/feature-inventory/overview.md +141 -0
  516. package/docs/feature-inventory/rollout-checklist.md +53 -0
  517. package/docs/feature-inventory/test-matrix.md +87 -0
  518. package/docs/feature-inventory.md +9 -0
  519. package/docs/gateway/configuration-examples.md +221 -0
  520. package/docs/gateway/configuration.md +172 -0
  521. package/docs/gateway/cron.md +61 -0
  522. package/docs/gateway/heartbeat.md +207 -0
  523. package/docs/gateway/pairing.md +109 -0
  524. package/docs/gateway-lock.md +28 -0
  525. package/docs/gateway.md +227 -0
  526. package/docs/gmail-pubsub.md +191 -0
  527. package/docs/grammy.md +27 -0
  528. package/docs/group-messages.md +73 -0
  529. package/docs/groups.md +130 -0
  530. package/docs/health.md +28 -0
  531. package/docs/heartbeat.md +73 -0
  532. package/docs/home-userspace.md +277 -0
  533. package/docs/hubs.md +148 -0
  534. package/docs/images.md +51 -0
  535. package/docs/imessage.md +94 -0
  536. package/docs/index.md +196 -0
  537. package/docs/ios.md +372 -0
  538. package/docs/linux.md +11 -0
  539. package/docs/location-command.md +95 -0
  540. package/docs/location.md +46 -0
  541. package/docs/logging.md +110 -0
  542. package/docs/lore.md +131 -0
  543. package/docs/mac/bun.md +133 -0
  544. package/docs/mac/canvas.md +161 -0
  545. package/docs/mac/child-process.md +72 -0
  546. package/docs/mac/dev-setup.md +81 -0
  547. package/docs/mac/health.md +28 -0
  548. package/docs/mac/icon.md +26 -0
  549. package/docs/mac/logging.md +51 -0
  550. package/docs/mac/menu-bar.md +69 -0
  551. package/docs/mac/peekaboo.md +170 -0
  552. package/docs/mac/permissions.md +40 -0
  553. package/docs/mac/release.md +76 -0
  554. package/docs/mac/remote.md +57 -0
  555. package/docs/mac/signing.md +41 -0
  556. package/docs/mac/skills.md +27 -0
  557. package/docs/mac/voice-overlay.md +52 -0
  558. package/docs/mac/voicewake.md +56 -0
  559. package/docs/mac/webchat.md +27 -0
  560. package/docs/mac/xpc.md +40 -0
  561. package/docs/macos.md +104 -0
  562. package/docs/model-failover.md +75 -0
  563. package/docs/models.md +91 -0
  564. package/docs/multi-agent.md +74 -0
  565. package/docs/nix.md +95 -0
  566. package/docs/nodes.md +157 -0
  567. package/docs/onboarding-config-protocol.md +34 -0
  568. package/docs/onboarding.md +189 -0
  569. package/docs/pairing.md +85 -0
  570. package/docs/plans/cron-add-hardening.md +72 -0
  571. package/docs/plans/group-policy-hardening.md +121 -0
  572. package/docs/poll.md +52 -0
  573. package/docs/prereqs.md +67 -0
  574. package/docs/presence.md +133 -0
  575. package/docs/proposals/model-config.md +147 -0
  576. package/docs/provider-routing.md +25 -0
  577. package/docs/queue.md +78 -0
  578. package/docs/reference/templates/AGENTS.md +164 -0
  579. package/docs/remote-gateway-readme.md +153 -0
  580. package/docs/remote.md +61 -0
  581. package/docs/research/memory.md +227 -0
  582. package/docs/rpc.md +35 -0
  583. package/docs/security.md +200 -0
  584. package/docs/session-ingestion.md +119 -0
  585. package/docs/session-tool.md +154 -0
  586. package/docs/session.md +85 -0
  587. package/docs/sessions.md +8 -0
  588. package/docs/setup.md +131 -0
  589. package/docs/showcase.md +37 -0
  590. package/docs/signal.md +122 -0
  591. package/docs/skills-config.md +58 -0
  592. package/docs/skills.md +153 -0
  593. package/docs/slack.md +221 -0
  594. package/docs/subagents.md +72 -0
  595. package/docs/tailscale.md +71 -0
  596. package/docs/talk.md +79 -0
  597. package/docs/telegram.md +96 -0
  598. package/docs/templates/AGENTS.md +286 -0
  599. package/docs/templates/BOOTSTRAP.md +35 -0
  600. package/docs/templates/IDENTITY.md +17 -0
  601. package/docs/templates/PROFILE.md +14 -0
  602. package/docs/templates/SOUL.md +41 -0
  603. package/docs/templates/TOOLS.md +41 -0
  604. package/docs/templates/USER.md +8 -0
  605. package/docs/test.md +43 -0
  606. package/docs/testing-onboarding-quickstart.md +76 -0
  607. package/docs/testing-philosophy.md +211 -0
  608. package/docs/thinking.md +46 -0
  609. package/docs/timezone.md +40 -0
  610. package/docs/tools.md +346 -0
  611. package/docs/troubleshooting.md +257 -0
  612. package/docs/tui.md +71 -0
  613. package/docs/typebox.md +42 -0
  614. package/docs/updating.md +138 -0
  615. package/docs/usage-cloud-aggregation-spec.md +133 -0
  616. package/docs/usage-suggestions-pipeline.md +126 -0
  617. package/docs/voicewake.md +61 -0
  618. package/docs/web.md +115 -0
  619. package/docs/webchat.md +34 -0
  620. package/docs/webhook.md +132 -0
  621. package/docs/whatsapp-clawd.jpg +0 -0
  622. package/docs/whatsapp.md +170 -0
  623. package/docs/windows.md +11 -0
  624. package/docs/wizard.md +167 -0
  625. package/package.json +209 -0
  626. package/skills/1password/SKILL.md +54 -0
  627. package/skills/1password/docs/setup.md +85 -0
  628. package/skills/1password/docs/troubleshooting.md +63 -0
  629. package/skills/1password/references/cli-examples.md +29 -0
  630. package/skills/1password/references/get-started.md +17 -0
  631. package/skills/agent-browser/SKILL.md +450 -0
  632. package/skills/agent-browser/docs/browser-use-eval.md +95 -0
  633. package/skills/agent-browser/docs/first-tests.md +261 -0
  634. package/skills/agent-browser/docs/wordle-nyt-eval.js +32 -0
  635. package/skills/aix/SKILL.md +93 -0
  636. package/skills/aix/docs/embeddings.md +40 -0
  637. package/skills/aix/docs/setup.md +58 -0
  638. package/skills/aix/docs/troubleshooting.md +41 -0
  639. package/skills/aix/references/sql.md +48 -0
  640. package/skills/apple-notes/SKILL.md +50 -0
  641. package/skills/apple-reminders/SKILL.md +67 -0
  642. package/skills/bear-notes/SKILL.md +79 -0
  643. package/skills/bird/SKILL.md +32 -0
  644. package/skills/bird/docs/auth.md +31 -0
  645. package/skills/bird/docs/troubleshooting.md +31 -0
  646. package/skills/blogwatcher/SKILL.md +46 -0
  647. package/skills/blucli/SKILL.md +27 -0
  648. package/skills/brave-search/SKILL.md +36 -0
  649. package/skills/brave-search/docs/setup.md +40 -0
  650. package/skills/brave-search/docs/troubleshooting.md +37 -0
  651. package/skills/brave-search/docs/usage.md +28 -0
  652. package/skills/brave-search/scripts/content.mjs +53 -0
  653. package/skills/brave-search/scripts/search.mjs +79 -0
  654. package/skills/browser-use-agent-sdk/SKILL.md +90 -0
  655. package/skills/camsnap/SKILL.md +25 -0
  656. package/skills/clawdhub/SKILL.md +53 -0
  657. package/skills/coding-agent/SKILL.md +274 -0
  658. package/skills/comms/SKILL.md +249 -0
  659. package/skills/comms/docs/adapters.md +54 -0
  660. package/skills/comms/docs/setup.md +56 -0
  661. package/skills/comms/docs/troubleshooting.md +44 -0
  662. package/skills/comms/references/schema.md +49 -0
  663. package/skills/computer-use/SKILL.md +204 -0
  664. package/skills/computer-use/docs/open-interpreter.md +26 -0
  665. package/skills/computer-use/docs/peekaboo.md +26 -0
  666. package/skills/computer-use/docs/setup.md +47 -0
  667. package/skills/computer-use/docs/troubleshooting.md +33 -0
  668. package/skills/discord/SKILL.md +370 -0
  669. package/skills/eightctl/SKILL.md +29 -0
  670. package/skills/eve/SKILL.md +215 -0
  671. package/skills/eve/docs/dual-account.md +84 -0
  672. package/skills/eve/docs/intelligence.md +58 -0
  673. package/skills/eve/docs/setup.md +60 -0
  674. package/skills/eve/docs/troubleshooting.md +54 -0
  675. package/skills/eve/scripts/setup-dual-account.sh +125 -0
  676. package/skills/filesystem/SKILL.md +217 -0
  677. package/skills/food-order/SKILL.md +41 -0
  678. package/skills/gemini/SKILL.md +23 -0
  679. package/skills/gh/SKILL.md +22 -0
  680. package/skills/gh/docs/usage.md +41 -0
  681. package/skills/gifgrep/SKILL.md +47 -0
  682. package/skills/github/SKILL.md +26 -0
  683. package/skills/github/docs/setup.md +21 -0
  684. package/skills/github/docs/troubleshooting.md +24 -0
  685. package/skills/gog/SKILL.md +104 -0
  686. package/skills/gog/docs/portability.md +94 -0
  687. package/skills/gog/docs/setup.md +76 -0
  688. package/skills/gog/docs/troubleshooting.md +94 -0
  689. package/skills/gog/scripts/cdp/README.md +90 -0
  690. package/skills/gog/scripts/cdp/add_test_users.py +69 -0
  691. package/skills/gog/scripts/cdp/auth_add_accounts.py +209 -0
  692. package/skills/gog/scripts/cdp/auth_add_accounts_manual.py +206 -0
  693. package/skills/gog/scripts/cdp/create_oauth_client.py +165 -0
  694. package/skills/gog/scripts/cdp/launch_cdp_chrome.sh +58 -0
  695. package/skills/google-oauth/SKILL.md +94 -0
  696. package/skills/goplaces/SKILL.md +30 -0
  697. package/skills/imsg/SKILL.md +25 -0
  698. package/skills/json-render/SKILL.md +154 -0
  699. package/skills/json-render/assets/components/README.md +21 -0
  700. package/skills/json-render/assets/components/catalog.ts +78 -0
  701. package/skills/json-render/assets/components/registry.tsx +172 -0
  702. package/skills/json-render/assets/demo/App.css +397 -0
  703. package/skills/json-render/assets/demo/App.tsx +897 -0
  704. package/skills/json-render/assets/demo/README.md +22 -0
  705. package/skills/json-render/assets/demo/catalog.ts +78 -0
  706. package/skills/json-render/assets/demo/data/nexus-core.json +31 -0
  707. package/skills/json-render/assets/demo/index.css +27 -0
  708. package/skills/json-render/assets/demo/registry.tsx +150 -0
  709. package/skills/json-render/docs/nexus-state-demo.md +84 -0
  710. package/skills/json-render/docs/shadcn-preset.md +33 -0
  711. package/skills/json-render/scripts/create-vite-demo.sh +45 -0
  712. package/skills/json-render/scripts/llm-server/README.md +33 -0
  713. package/skills/json-render/scripts/llm-server/catalog.ts +78 -0
  714. package/skills/json-render/scripts/llm-server/package-lock.json +702 -0
  715. package/skills/json-render/scripts/llm-server/package.json +18 -0
  716. package/skills/json-render/scripts/llm-server/server.ts +285 -0
  717. package/skills/local-places/SERVER_README.md +101 -0
  718. package/skills/local-places/SKILL.md +91 -0
  719. package/skills/local-places/pyproject.toml +27 -0
  720. package/skills/local-places/src/local_places/__init__.py +2 -0
  721. package/skills/local-places/src/local_places/__pycache__/__init__.cpython-314.pyc +0 -0
  722. package/skills/local-places/src/local_places/__pycache__/google_places.cpython-314.pyc +0 -0
  723. package/skills/local-places/src/local_places/__pycache__/main.cpython-314.pyc +0 -0
  724. package/skills/local-places/src/local_places/__pycache__/schemas.cpython-314.pyc +0 -0
  725. package/skills/local-places/src/local_places/google_places.py +314 -0
  726. package/skills/local-places/src/local_places/main.py +65 -0
  727. package/skills/local-places/src/local_places/schemas.py +107 -0
  728. package/skills/mcporter/SKILL.md +38 -0
  729. package/skills/model-usage/SKILL.md +45 -0
  730. package/skills/model-usage/references/codexbar-cli.md +28 -0
  731. package/skills/model-usage/scripts/model_usage.py +310 -0
  732. package/skills/nano-banana-pro/SKILL.md +30 -0
  733. package/skills/nano-banana-pro/scripts/generate_image.py +169 -0
  734. package/skills/nano-pdf/SKILL.md +20 -0
  735. package/skills/nexus-cloud/SKILL.md +53 -0
  736. package/skills/nexus-cloud/docs/security.md +24 -0
  737. package/skills/nexus-cloud/docs/setup.md +51 -0
  738. package/skills/nexus-cloud/docs/troubleshooting.md +28 -0
  739. package/skills/notion/SKILL.md +156 -0
  740. package/skills/obsidian/SKILL.md +55 -0
  741. package/skills/onboarding/SKILL.md +515 -0
  742. package/skills/onboarding/docs/CAPABILITIES.md +444 -0
  743. package/skills/onboarding/docs/CAPABILITY_TAXONOMY.md +608 -0
  744. package/skills/onboarding/docs/CLI_GRAMMAR.md +797 -0
  745. package/skills/onboarding/docs/CLI_GRAMMAR_CREDENTIALS.md +632 -0
  746. package/skills/onboarding/docs/CLI_GRAMMAR_ONBOARDING.md +815 -0
  747. package/skills/onboarding/docs/CLI_GRAMMAR_SKILLS.md +449 -0
  748. package/skills/onboarding/docs/DOCUMENTATION_OVERVIEW.md +290 -0
  749. package/skills/onboarding/docs/ENTITY_MODEL.md +582 -0
  750. package/skills/onboarding/docs/GOAL_STATE_ARCHITECTURE.md +395 -0
  751. package/skills/onboarding/docs/NEXUS_SYSTEM_OVERVIEW.md +476 -0
  752. package/skills/onboarding/docs/SKILLS_HUB_SPEC.md +477 -0
  753. package/skills/onboarding/docs/SKILLS_SPECIFICATION.md +947 -0
  754. package/skills/onboarding/docs/SKILL_GATEWAY_DESIGN.md +702 -0
  755. package/skills/onboarding/docs/SKILL_GATEWAY_PRD.md +278 -0
  756. package/skills/onboarding/docs/SKILL_INVENTORY.md +266 -0
  757. package/skills/onboarding/docs/STATE_ARCHITECTURE.md +547 -0
  758. package/skills/onboarding/docs/TROUBLESHOOTING.md +363 -0
  759. package/skills/onboarding/docs/USER_JOURNEY.md +797 -0
  760. package/skills/onboarding/docs/WOW_MOMENTS.md +232 -0
  761. package/skills/onboarding/docs/agent-apple-id.md +289 -0
  762. package/skills/onboarding/docs/skill-deep-dives/1password.md +367 -0
  763. package/skills/onboarding/docs/skill-deep-dives/TEMPLATE.md +197 -0
  764. package/skills/onboarding/docs/skill-deep-dives/aix.md +498 -0
  765. package/skills/onboarding/docs/skill-deep-dives/bird.md +357 -0
  766. package/skills/onboarding/docs/skill-deep-dives/brave-search.md +601 -0
  767. package/skills/onboarding/docs/skill-deep-dives/comms.md +607 -0
  768. package/skills/onboarding/docs/skill-deep-dives/computer-use.md +599 -0
  769. package/skills/onboarding/docs/skill-deep-dives/cron-and-heartbeat.md +576 -0
  770. package/skills/onboarding/docs/skill-deep-dives/eve.md +711 -0
  771. package/skills/onboarding/docs/skill-deep-dives/github.md +333 -0
  772. package/skills/onboarding/docs/skill-deep-dives/gog.md +640 -0
  773. package/skills/onboarding/docs/skill-deep-dives/homebrew-prereqs.md +785 -0
  774. package/skills/onboarding/docs/skill-deep-dives/nexus-cloud.md +689 -0
  775. package/skills/onboarding/docs/skill-deep-dives/qmd.md +742 -0
  776. package/skills/onboarding/docs/skill-deep-dives/telegram.md +379 -0
  777. package/skills/onboarding/docs/skill-deep-dives/wacli.md +399 -0
  778. package/skills/onboarding/docs/skill-deep-dives/weather.md +513 -0
  779. package/skills/onboarding/scripts/ralph/prd.json +215 -0
  780. package/skills/onboarding/scripts/ralph/progress.txt +99 -0
  781. package/skills/onboarding/scripts/ralph/prompt.md +87 -0
  782. package/skills/onboarding/scripts/ralph/ralph.log +84 -0
  783. package/skills/onboarding/scripts/ralph/ralph.sh +45 -0
  784. package/skills/onboarding/scripts/setup-cursor-skills.sh +40 -0
  785. package/skills/openai-image-gen/SKILL.md +31 -0
  786. package/skills/openai-image-gen/scripts/gen.py +173 -0
  787. package/skills/openai-whisper/SKILL.md +19 -0
  788. package/skills/openai-whisper-api/SKILL.md +43 -0
  789. package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
  790. package/skills/openhue/SKILL.md +30 -0
  791. package/skills/oracle/SKILL.md +105 -0
  792. package/skills/ordercli/SKILL.md +47 -0
  793. package/skills/peekaboo/SKILL.md +153 -0
  794. package/skills/qmd/SKILL.md +32 -0
  795. package/skills/qmd/docs/mcp.md +30 -0
  796. package/skills/qmd/docs/ollama.md +42 -0
  797. package/skills/qmd/docs/setup.md +44 -0
  798. package/skills/sag/SKILL.md +62 -0
  799. package/skills/skill-cli-template/SKILL.md +109 -0
  800. package/skills/skill-creator/scripts/__pycache__/quick_validate.cpython-311.pyc +0 -0
  801. package/skills/slack/SKILL.md +144 -0
  802. package/skills/songsee/SKILL.md +29 -0
  803. package/skills/sonoscli/SKILL.md +26 -0
  804. package/skills/spotify-player/SKILL.md +34 -0
  805. package/skills/summarize/SKILL.md +49 -0
  806. package/skills/telegram/SKILL.md +20 -0
  807. package/skills/telegram/docs/pairing.md +30 -0
  808. package/skills/telegram/docs/setup.md +41 -0
  809. package/skills/telegram/docs/webhook.md +17 -0
  810. package/skills/things-mac/SKILL.md +61 -0
  811. package/skills/tmux/SKILL.md +121 -0
  812. package/skills/tmux/scripts/find-sessions.sh +112 -0
  813. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  814. package/skills/trello/SKILL.md +84 -0
  815. package/skills/upstream-sync/SKILL.md +151 -0
  816. package/skills/upstream-sync/scripts/auto-port.sh +227 -0
  817. package/skills/upstream-sync/scripts/check-all.sh +88 -0
  818. package/skills/upstream-sync/scripts/check-nexus.sh +146 -0
  819. package/skills/upstream-sync/scripts/check-pi-ai.sh +129 -0
  820. package/skills/video-frames/SKILL.md +29 -0
  821. package/skills/video-frames/scripts/frame.sh +81 -0
  822. package/skills/wacli/SKILL.md +48 -0
  823. package/skills/wacli/docs/auth.md +21 -0
  824. package/skills/wacli/docs/backup.md +9 -0
  825. package/skills/wacli/docs/troubleshooting.md +21 -0
  826. package/skills/weather/SKILL.md +53 -0
  827. package/skills/weather/docs/usage.md +40 -0
@@ -0,0 +1,1093 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+ import crypto from "node:crypto";
5
+ import { Readable } from "node:stream";
6
+ import { pipeline } from "node:stream/promises";
7
+ import { fileTypeFromFile } from "file-type";
8
+ import { buildWorkspaceSkillStatus } from "../agents/skills-status.js";
9
+ import { getSkillMetadata, hasBinary, loadWorkspaceSkillEntries, } from "../agents/skills.js";
10
+ import { DEFAULT_AGENT_WORKSPACE_DIR } from "../agents/workspace.js";
11
+ import { generateSkillManifest, writeSkillManifest } from "../commands/skills-manifest.js";
12
+ import { loadConfig } from "../config/config.js";
13
+ import { runCommandWithTimeout } from "../process/exec.js";
14
+ import { listCredentialEntries, resolveCredentialValue, } from "../credentials/store.js";
15
+ import { MANAGED_SKILLS_DIR, resolveUserPath } from "../utils.js";
16
+ function getHubBaseUrl() {
17
+ return (process.env.NEXUS_HUB_URL ||
18
+ process.env.NEXUS_WEBSITE_URL ||
19
+ "https://getnexus.sh");
20
+ }
21
+ function normalizeSkillKey(value) {
22
+ return value.trim().toLowerCase();
23
+ }
24
+ function normalizeQuery(query) {
25
+ return query
26
+ .toLowerCase()
27
+ .split(/\s+/)
28
+ .map((token) => token.trim())
29
+ .filter(Boolean);
30
+ }
31
+ function normalizeStringList(value) {
32
+ if (Array.isArray(value)) {
33
+ return value.map((entry) => String(entry).trim()).filter(Boolean);
34
+ }
35
+ if (typeof value === "string") {
36
+ return value
37
+ .split(",")
38
+ .map((entry) => entry.trim())
39
+ .filter(Boolean);
40
+ }
41
+ return [];
42
+ }
43
+ function normalizeHubDependencies(value) {
44
+ const raw = value && typeof value === "object" ? value : {};
45
+ return {
46
+ dependencies: normalizeStringList(raw.dependencies),
47
+ tools: normalizeStringList(raw.tools),
48
+ connectors: normalizeStringList(raw.connectors),
49
+ };
50
+ }
51
+ function parseFrontmatter(content) {
52
+ const trimmed = content.trimStart();
53
+ if (!trimmed.startsWith("---")) {
54
+ return { frontmatter: {}, body: content };
55
+ }
56
+ const lines = trimmed.split("\n");
57
+ let endIndex = -1;
58
+ for (let i = 1; i < lines.length; i += 1) {
59
+ if (lines[i].trim() === "---") {
60
+ endIndex = i;
61
+ break;
62
+ }
63
+ }
64
+ if (endIndex === -1) {
65
+ return { frontmatter: {}, body: content };
66
+ }
67
+ const frontLines = lines.slice(1, endIndex);
68
+ const body = lines.slice(endIndex + 1).join("\n");
69
+ const frontmatter = {};
70
+ let currentListKey = null;
71
+ for (const line of frontLines) {
72
+ const trimmedLine = line.trim();
73
+ if (!trimmedLine || trimmedLine.startsWith("#")) {
74
+ continue;
75
+ }
76
+ const listMatch = line.match(/^\s*-\s+(.+)$/);
77
+ if (listMatch && currentListKey) {
78
+ const existing = frontmatter[currentListKey];
79
+ if (!Array.isArray(existing)) {
80
+ frontmatter[currentListKey] = [];
81
+ }
82
+ frontmatter[currentListKey].push(stripQuotes(listMatch[1].trim()));
83
+ continue;
84
+ }
85
+ const match = line.match(/^([A-Za-z0-9_-]+):\s*(.*)$/);
86
+ if (!match) {
87
+ currentListKey = null;
88
+ continue;
89
+ }
90
+ const key = match[1];
91
+ const rawValue = match[2].trim();
92
+ if (!rawValue) {
93
+ frontmatter[key] = [];
94
+ currentListKey = key;
95
+ continue;
96
+ }
97
+ currentListKey = null;
98
+ frontmatter[key] = parseScalarValue(rawValue);
99
+ }
100
+ return { frontmatter, body };
101
+ }
102
+ function stripQuotes(value) {
103
+ if ((value.startsWith('"') && value.endsWith('"')) ||
104
+ (value.startsWith("'") && value.endsWith("'"))) {
105
+ return value.slice(1, -1);
106
+ }
107
+ return value;
108
+ }
109
+ function parseScalarValue(value) {
110
+ const cleaned = stripQuotes(value);
111
+ if (cleaned === "true")
112
+ return true;
113
+ if (cleaned === "false")
114
+ return false;
115
+ if (cleaned.startsWith("{") || cleaned.startsWith("[")) {
116
+ try {
117
+ return JSON.parse(cleaned);
118
+ }
119
+ catch {
120
+ return cleaned;
121
+ }
122
+ }
123
+ return cleaned;
124
+ }
125
+ function normalizeMetadata(value) {
126
+ if (!value)
127
+ return {};
128
+ if (typeof value === "object") {
129
+ return value;
130
+ }
131
+ if (typeof value === "string") {
132
+ try {
133
+ const parsed = JSON.parse(value);
134
+ if (parsed && typeof parsed === "object") {
135
+ return parsed;
136
+ }
137
+ }
138
+ catch {
139
+ return {};
140
+ }
141
+ }
142
+ return {};
143
+ }
144
+ function resolveCapabilities(entry) {
145
+ const candidates = [
146
+ entry.capabilities,
147
+ entry.provides,
148
+ entry.metadata?.nexus
149
+ ? entry.metadata.nexus.provides
150
+ : undefined,
151
+ entry.metadata?.nexus
152
+ ? entry.metadata.nexus.capabilities
153
+ : undefined,
154
+ entry.metadata?.capabilities,
155
+ ];
156
+ for (const candidate of candidates) {
157
+ const parsed = normalizeStringList(candidate);
158
+ if (parsed.length > 0) {
159
+ return parsed;
160
+ }
161
+ }
162
+ return [];
163
+ }
164
+ function extractExcerpt(body, max = 700) {
165
+ const trimmed = body.trim();
166
+ if (!trimmed)
167
+ return "";
168
+ if (trimmed.length <= max)
169
+ return trimmed;
170
+ return `${trimmed.slice(0, max)}…`;
171
+ }
172
+ function scoreTextMatch(query, name, description) {
173
+ if (!query)
174
+ return 1;
175
+ const q = query.toLowerCase().trim();
176
+ const nameLower = name.toLowerCase();
177
+ const descLower = description.toLowerCase();
178
+ if (nameLower.includes(q))
179
+ return 100;
180
+ if (descLower.includes(q))
181
+ return 40;
182
+ const tokens = normalizeQuery(query);
183
+ let score = 0;
184
+ for (const token of tokens) {
185
+ if (nameLower.includes(token))
186
+ score += 20;
187
+ if (descLower.includes(token))
188
+ score += 8;
189
+ }
190
+ return score;
191
+ }
192
+ function extractDependencies(metadata) {
193
+ const requires = metadata?.requires ?? {};
194
+ return {
195
+ bins: requires.bins ?? [],
196
+ anyBins: requires.anyBins ?? [],
197
+ env: requires.env ?? [],
198
+ config: requires.config ?? [],
199
+ credentials: requires.credentials ?? [],
200
+ install: metadata?.install ?? [],
201
+ };
202
+ }
203
+ function manifestToMetadata(manifest) {
204
+ if (!manifest || typeof manifest !== "object")
205
+ return null;
206
+ const raw = manifest;
207
+ if (raw.nexus && typeof raw.nexus === "object")
208
+ return raw.nexus;
209
+ if (raw.metadata && typeof raw.metadata === "object") {
210
+ const nested = raw.metadata;
211
+ if (nested.nexus && typeof nested.nexus === "object")
212
+ return nested.nexus;
213
+ if (typeof nested.nexus === "string") {
214
+ try {
215
+ return JSON.parse(nested.nexus);
216
+ }
217
+ catch {
218
+ return null;
219
+ }
220
+ }
221
+ }
222
+ return null;
223
+ }
224
+ function summarizeInstallOptions(install) {
225
+ return install.map((entry) => ({
226
+ kind: entry.kind,
227
+ label: entry.label ?? "",
228
+ }));
229
+ }
230
+ async function fetchHubSkills(query, opts) {
231
+ const baseUrl = getHubBaseUrl();
232
+ const url = new URL("/api/skills/search", baseUrl);
233
+ url.searchParams.set("q", query);
234
+ url.searchParams.set("limit", String(opts.limit));
235
+ url.searchParams.set("includeManifest", "true");
236
+ if (opts.type)
237
+ url.searchParams.set("type", opts.type);
238
+ if (opts.capability)
239
+ url.searchParams.set("capability", opts.capability);
240
+ const res = await fetch(url);
241
+ if (!res.ok) {
242
+ const body = await res.text().catch(() => "");
243
+ throw new Error(`Hub search failed (${res.status}): ${body}`);
244
+ }
245
+ const data = (await res.json());
246
+ return data.skills ?? [];
247
+ }
248
+ async function fetchHubSkillDetails(slug) {
249
+ const baseUrl = getHubBaseUrl();
250
+ const url = new URL(`/api/skills/${encodeURIComponent(slug)}`, baseUrl);
251
+ const res = await fetch(url);
252
+ if (!res.ok) {
253
+ const body = await res.text().catch(() => "");
254
+ throw new Error(`Hub skill lookup failed (${res.status}): ${body}`);
255
+ }
256
+ const data = (await res.json());
257
+ if (!data.skill?.slug || !data.skill?.name) {
258
+ throw new Error("Hub skill lookup failed (invalid response)");
259
+ }
260
+ return {
261
+ slug: data.skill.slug,
262
+ name: data.skill.name,
263
+ dependencies: normalizeHubDependencies(data.skill.dependencies),
264
+ };
265
+ }
266
+ async function downloadSkillArtifact(slug) {
267
+ const baseUrl = getHubBaseUrl();
268
+ const url = new URL(`/api/skills/${encodeURIComponent(slug)}/download`, baseUrl);
269
+ const res = await fetch(url, { method: "POST" });
270
+ if (!res.ok) {
271
+ const body = await res.text().catch(() => "");
272
+ throw new Error(`Download request failed (${res.status}): ${body}`);
273
+ }
274
+ return (await res.json());
275
+ }
276
+ function slugToDirName(slug) {
277
+ return slug.replace(/[\\/]/g, "__");
278
+ }
279
+ function dirNameToSlug(dirName) {
280
+ return dirName.split("__").join("/");
281
+ }
282
+ async function ensureDir(dir) {
283
+ await fs.mkdir(dir, { recursive: true });
284
+ }
285
+ async function loadManagedSkillSlugs(managedSkillsDir) {
286
+ const slugs = new Set();
287
+ const managedDir = path.join(managedSkillsDir, "managed");
288
+ let entries = [];
289
+ try {
290
+ entries = await fs.readdir(managedDir, { withFileTypes: true });
291
+ }
292
+ catch {
293
+ return slugs;
294
+ }
295
+ for (const entry of entries) {
296
+ if (!entry.isDirectory())
297
+ continue;
298
+ const slug = dirNameToSlug(entry.name);
299
+ if (!slug)
300
+ continue;
301
+ slugs.add(normalizeSkillKey(slug));
302
+ }
303
+ return slugs;
304
+ }
305
+ function isSkillInstalled(id, installed) {
306
+ const key = normalizeSkillKey(id);
307
+ return installed.names.has(key) || installed.slugs.has(key);
308
+ }
309
+ async function streamToFile(res, outPath) {
310
+ if (!res.body) {
311
+ throw new Error("Download response had no body");
312
+ }
313
+ await ensureDir(path.dirname(outPath));
314
+ const stream = Readable.fromWeb(res.body);
315
+ const handle = await fs.open(outPath, "w");
316
+ try {
317
+ await pipeline(stream, handle.createWriteStream());
318
+ }
319
+ finally {
320
+ await handle.close();
321
+ }
322
+ }
323
+ async function sha256File(filePath) {
324
+ const data = await fs.readFile(filePath);
325
+ return crypto.createHash("sha256").update(data).digest("hex");
326
+ }
327
+ async function extractArchive(artifactPath, destDir) {
328
+ let ext = "";
329
+ try {
330
+ const type = await fileTypeFromFile(artifactPath);
331
+ ext = type?.ext ?? "";
332
+ }
333
+ catch {
334
+ ext = "";
335
+ }
336
+ await ensureDir(destDir);
337
+ if (ext === "zip" || artifactPath.endsWith(".zip")) {
338
+ if (!hasBinary("unzip")) {
339
+ throw new Error("Missing 'unzip' binary. Install unzip or extract manually.");
340
+ }
341
+ const result = await runCommandWithTimeout(["unzip", "-q", artifactPath, "-d", destDir], 300_000);
342
+ if (result.code !== 0) {
343
+ throw new Error(result.stderr || result.stdout || "Unzip failed");
344
+ }
345
+ return;
346
+ }
347
+ if (!hasBinary("tar")) {
348
+ throw new Error("Missing 'tar' binary. Install tar or extract manually.");
349
+ }
350
+ const result = await runCommandWithTimeout(["tar", "-xf", artifactPath, "-C", destDir], 300_000);
351
+ if (result.code !== 0) {
352
+ throw new Error(result.stderr || result.stdout || "Tar extraction failed");
353
+ }
354
+ }
355
+ async function normalizeSkillRoot(destDir) {
356
+ const skillPath = path.join(destDir, "SKILL.md");
357
+ try {
358
+ await fs.access(skillPath);
359
+ return;
360
+ }
361
+ catch {
362
+ // continue
363
+ }
364
+ const entries = await fs.readdir(destDir, { withFileTypes: true });
365
+ if (entries.length !== 1)
366
+ return;
367
+ const only = entries[0];
368
+ if (!only.isDirectory())
369
+ return;
370
+ const nested = path.join(destDir, only.name);
371
+ const nestedSkill = path.join(nested, "SKILL.md");
372
+ try {
373
+ await fs.access(nestedSkill);
374
+ }
375
+ catch {
376
+ return;
377
+ }
378
+ const nestedEntries = await fs.readdir(nested);
379
+ for (const entry of nestedEntries) {
380
+ await fs.rename(path.join(nested, entry), path.join(destDir, entry));
381
+ }
382
+ await fs.rm(nested, { recursive: true, force: true });
383
+ }
384
+ async function resolveHubDependencyPlan(slug, installed, getDetails, onMissing) {
385
+ const plan = [];
386
+ const visiting = new Set();
387
+ const visited = new Set();
388
+ const addDependency = async (depSlug) => {
389
+ const key = normalizeSkillKey(depSlug);
390
+ if (!key || isSkillInstalled(depSlug, installed) || visited.has(key)) {
391
+ return;
392
+ }
393
+ if (visiting.has(key)) {
394
+ return;
395
+ }
396
+ visiting.add(key);
397
+ let details;
398
+ try {
399
+ details = await getDetails(depSlug);
400
+ }
401
+ catch {
402
+ visiting.delete(key);
403
+ if (onMissing)
404
+ onMissing(depSlug);
405
+ return;
406
+ }
407
+ const deps = [
408
+ ...details.dependencies.tools,
409
+ ...details.dependencies.connectors,
410
+ ];
411
+ for (const dep of deps) {
412
+ await addDependency(dep);
413
+ }
414
+ visiting.delete(key);
415
+ visited.add(key);
416
+ plan.push(details.slug);
417
+ };
418
+ let root;
419
+ try {
420
+ root = await getDetails(slug);
421
+ }
422
+ catch {
423
+ if (onMissing)
424
+ onMissing(slug);
425
+ return plan;
426
+ }
427
+ const rootDeps = [
428
+ ...root.dependencies.tools,
429
+ ...root.dependencies.connectors,
430
+ ];
431
+ for (const dep of rootDeps) {
432
+ await addDependency(dep);
433
+ }
434
+ return plan;
435
+ }
436
+ async function resolveSkillFile(inputPath) {
437
+ const stats = await fs.stat(inputPath);
438
+ if (stats.isFile()) {
439
+ return { skillDir: path.dirname(inputPath), skillFile: inputPath };
440
+ }
441
+ const skillFile = path.join(inputPath, "SKILL.md");
442
+ return { skillDir: inputPath, skillFile };
443
+ }
444
+ async function createTarball(sourceDir, outPath) {
445
+ if (!hasBinary("tar")) {
446
+ throw new Error("Missing 'tar' binary. Install tar to publish skills.");
447
+ }
448
+ const result = await runCommandWithTimeout(["tar", "-czf", outPath, "-C", sourceDir, "."], 300_000);
449
+ if (result.code !== 0) {
450
+ throw new Error(result.stderr || result.stdout || "Tar failed");
451
+ }
452
+ }
453
+ async function computeArtifactInfo(filePath) {
454
+ const hash = await sha256File(filePath);
455
+ const stats = await fs.stat(filePath);
456
+ return { sha256: hash, bytes: stats.size };
457
+ }
458
+ async function resolveHubToken(input) {
459
+ if (input && input.trim())
460
+ return input.trim();
461
+ const envToken = process.env.NEXUS_HUB_TOKEN ||
462
+ process.env.NEXUS_WEBSITE_TOKEN ||
463
+ process.env.SKILLS_HUB_API_TOKEN;
464
+ if (envToken?.trim())
465
+ return envToken.trim();
466
+ const entries = await listCredentialEntries();
467
+ const candidates = entries.filter((entry) => entry.service === "nexus-hub" || entry.service === "nexus-cloud");
468
+ for (const entry of candidates) {
469
+ const resolved = await resolveCredentialValue(entry.record);
470
+ if (resolved?.value) {
471
+ return resolved.value;
472
+ }
473
+ }
474
+ return null;
475
+ }
476
+ function buildManifestPayload(input) {
477
+ const { frontmatter, body, overrides } = input;
478
+ const metadata = normalizeMetadata(frontmatter.metadata);
479
+ const nexusMeta = metadata.nexus && typeof metadata.nexus === "object"
480
+ ? metadata.nexus
481
+ : {};
482
+ const name = overrides.name ||
483
+ (typeof frontmatter.name === "string" ? frontmatter.name : "") ||
484
+ "";
485
+ const description = overrides.description ||
486
+ (typeof frontmatter.description === "string" ? frontmatter.description : "") ||
487
+ "";
488
+ const type = overrides.type ||
489
+ (typeof frontmatter.type === "string" ? frontmatter.type : "") ||
490
+ (typeof nexusMeta.type === "string" ? nexusMeta.type : "") ||
491
+ "";
492
+ const version = overrides.version ||
493
+ (typeof frontmatter.version === "string" ? frontmatter.version : "") ||
494
+ "";
495
+ const license = overrides.license ||
496
+ (typeof frontmatter.license === "string" ? frontmatter.license : "") ||
497
+ "";
498
+ const repository = overrides.repository ||
499
+ (typeof frontmatter.repository === "string" ? frontmatter.repository : "") ||
500
+ (typeof frontmatter.repo === "string" ? frontmatter.repo : "") ||
501
+ "";
502
+ const homepage = overrides.homepage ||
503
+ (typeof frontmatter.homepage === "string" ? frontmatter.homepage : "") ||
504
+ (typeof frontmatter.website === "string" ? frontmatter.website : "") ||
505
+ "";
506
+ const baseManifest = {
507
+ ...frontmatter,
508
+ name,
509
+ description,
510
+ type,
511
+ version,
512
+ license,
513
+ ...(repository ? { repository } : {}),
514
+ ...(homepage ? { homepage } : {}),
515
+ };
516
+ const manifestEntry = {
517
+ ...baseManifest,
518
+ metadata: {
519
+ ...metadata,
520
+ nexus: {
521
+ ...nexusMeta,
522
+ ...(type ? { type } : {}),
523
+ },
524
+ },
525
+ };
526
+ const capabilityCandidates = {
527
+ ...manifestEntry,
528
+ capabilities: overrides.capabilities ?? manifestEntry.capabilities,
529
+ };
530
+ const capabilities = resolveCapabilities(capabilityCandidates);
531
+ if (capabilities.length > 0) {
532
+ manifestEntry.capabilities = capabilities;
533
+ const nexus = manifestEntry.metadata;
534
+ nexus.nexus = {
535
+ ...(nexus.nexus ?? {}),
536
+ provides: capabilities,
537
+ };
538
+ }
539
+ const readmeExcerpt = extractExcerpt(body || description);
540
+ return {
541
+ name,
542
+ description,
543
+ type,
544
+ version,
545
+ license,
546
+ repository,
547
+ homepage,
548
+ capabilities,
549
+ manifest: manifestEntry,
550
+ readmeExcerpt,
551
+ };
552
+ }
553
+ async function installHubSkill(params) {
554
+ const dirName = slugToDirName(params.slug);
555
+ const destDir = path.join(params.managedDir, dirName);
556
+ try {
557
+ if (!params.force) {
558
+ await fs.access(destDir);
559
+ if (params.allowSkip) {
560
+ return { installed: false, destDir };
561
+ }
562
+ throw new Error(`Skill already installed at ${destDir}. Use --force to overwrite.`);
563
+ }
564
+ await fs.rm(destDir, { recursive: true, force: true });
565
+ }
566
+ catch (err) {
567
+ if (err.code !== "ENOENT") {
568
+ throw err;
569
+ }
570
+ }
571
+ const download = await downloadSkillArtifact(params.slug);
572
+ if (!download.downloadUrl || !download.artifactSha256) {
573
+ throw new Error("Download URL missing from hub response");
574
+ }
575
+ const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "nexus-skill-"));
576
+ const artifactPath = path.join(tmpDir, "artifact.bin");
577
+ const downloadHeaders = {};
578
+ if (download.cloudToken) {
579
+ downloadHeaders.authorization = `Bearer ${download.cloudToken}`;
580
+ }
581
+ const res = await fetch(download.downloadUrl, { headers: downloadHeaders });
582
+ if (!res.ok) {
583
+ const body = await res.text().catch(() => "");
584
+ throw new Error(`Download failed (${res.status}): ${body}`);
585
+ }
586
+ await streamToFile(res, artifactPath);
587
+ const hash = await sha256File(artifactPath);
588
+ if (hash !== download.artifactSha256) {
589
+ throw new Error(`Checksum mismatch (expected ${download.artifactSha256}, got ${hash})`);
590
+ }
591
+ await extractArchive(artifactPath, destDir);
592
+ await normalizeSkillRoot(destDir);
593
+ const manifest = await generateSkillManifest(MANAGED_SKILLS_DIR, params.userSkillsDir);
594
+ await writeSkillManifest(manifest);
595
+ return { installed: true, destDir };
596
+ }
597
+ export function registerSkillsHubCommand(program) {
598
+ const skills = program.command("skills").description("Search and install skills from the Nexus Hub");
599
+ skills
600
+ .command("search <query>")
601
+ .description("Search local skills and the Nexus Hub")
602
+ .option("--type <type>", "Filter by type (guide|tool|connector)")
603
+ .option("--capability <cap>", "Filter by capability")
604
+ .option("--limit <n>", "Hub results to return", (value) => Number(value))
605
+ .option("--local-only", "Only search local skills")
606
+ .option("--hub-only", "Only search the hub")
607
+ .option("--suggest", "Suggest up to 3 uninstalled hub skills")
608
+ .option("--json", "Output JSON")
609
+ .action(async (query, opts) => {
610
+ const suggestMode = Boolean(opts.suggest);
611
+ const limitRaw = Number(opts.limit);
612
+ const hubLimit = Number.isFinite(limitRaw) && limitRaw > 0
613
+ ? limitRaw
614
+ : suggestMode
615
+ ? 3
616
+ : 10;
617
+ const cfg = loadConfig();
618
+ const workspaceDir = resolveUserPath(cfg.agent?.workspace ?? DEFAULT_AGENT_WORKSPACE_DIR);
619
+ const managedSkillsDir = MANAGED_SKILLS_DIR;
620
+ const status = buildWorkspaceSkillStatus(workspaceDir, {
621
+ config: cfg,
622
+ managedSkillsDir,
623
+ });
624
+ const metadataEntries = loadWorkspaceSkillEntries(workspaceDir, {
625
+ config: cfg,
626
+ managedSkillsDir,
627
+ });
628
+ const metadataByName = new Map(metadataEntries.map((entry) => [entry.skill.name, getSkillMetadata(entry)]));
629
+ const installedNames = new Set(metadataEntries.map((entry) => normalizeSkillKey(entry.skill.name)));
630
+ const installedSlugs = await loadManagedSkillSlugs(managedSkillsDir);
631
+ const installedIndex = {
632
+ names: installedNames,
633
+ slugs: installedSlugs,
634
+ };
635
+ const localMatches = status.skills
636
+ .map((skill) => {
637
+ const metadata = metadataByName.get(skill.name);
638
+ let score = scoreTextMatch(query, skill.name, skill.description);
639
+ if (opts.type && metadata?.type && metadata.type !== opts.type) {
640
+ score = 0;
641
+ }
642
+ if (opts.capability) {
643
+ const provides = metadata?.provides ?? [];
644
+ if (!provides.includes(String(opts.capability))) {
645
+ score = 0;
646
+ }
647
+ }
648
+ const deps = extractDependencies(metadata ?? undefined);
649
+ return {
650
+ name: skill.name,
651
+ description: skill.description,
652
+ type: metadata?.type,
653
+ installed: true,
654
+ eligible: skill.eligible,
655
+ missing: {
656
+ bins: skill.missing.bins,
657
+ env: skill.missing.env,
658
+ config: skill.missing.config,
659
+ os: skill.missing.os,
660
+ credentials: deps.credentials,
661
+ },
662
+ install: summarizeInstallOptions(skill.install),
663
+ provides: metadata?.provides ?? [],
664
+ score,
665
+ };
666
+ })
667
+ .filter((skill) => skill.score > 0)
668
+ .sort((a, b) => b.score - a.score)
669
+ .map(({ score, ...rest }) => rest);
670
+ let hubMatches = [];
671
+ if (!opts.localOnly) {
672
+ try {
673
+ const hubSkills = await fetchHubSkills(query, {
674
+ limit: Math.max(1, hubLimit),
675
+ type: opts.type,
676
+ capability: opts.capability,
677
+ });
678
+ hubMatches = hubSkills.map((skill) => {
679
+ const metadata = manifestToMetadata(skill.manifest);
680
+ const deps = extractDependencies(metadata ?? undefined);
681
+ return {
682
+ slug: skill.slug,
683
+ name: skill.name,
684
+ description: skill.description,
685
+ type: skill.type,
686
+ version: skill.version ?? null,
687
+ capabilities: skill.capabilities ?? [],
688
+ installed: installedIndex.names.has(normalizeSkillKey(skill.name)) ||
689
+ installedIndex.slugs.has(normalizeSkillKey(skill.slug)),
690
+ verified: Boolean(skill.verified),
691
+ dependencies: deps,
692
+ };
693
+ });
694
+ }
695
+ catch (err) {
696
+ if (opts.json) {
697
+ console.log(JSON.stringify({
698
+ query,
699
+ local: localMatches,
700
+ hub: [],
701
+ error: err instanceof Error ? err.message : String(err),
702
+ }, null, 2));
703
+ return;
704
+ }
705
+ console.error(`Hub search failed: ${err instanceof Error ? err.message : String(err)}`);
706
+ }
707
+ }
708
+ if (suggestMode) {
709
+ const maxSuggestions = Math.min(3, hubLimit);
710
+ const suggestions = hubMatches
711
+ .filter((skill) => !skill.installed)
712
+ .slice(0, maxSuggestions);
713
+ const suggestionDetails = await Promise.all(suggestions.map(async (skill) => {
714
+ try {
715
+ const details = await fetchHubSkillDetails(skill.slug);
716
+ return { skill, dependencies: details.dependencies };
717
+ }
718
+ catch {
719
+ return {
720
+ skill,
721
+ dependencies: { dependencies: [], tools: [], connectors: [] },
722
+ };
723
+ }
724
+ }));
725
+ if (opts.json) {
726
+ console.log(JSON.stringify({
727
+ query,
728
+ suggestions: suggestionDetails.map(({ skill, dependencies }) => ({
729
+ slug: skill.slug,
730
+ name: skill.name,
731
+ description: skill.description,
732
+ type: skill.type,
733
+ version: skill.version ?? null,
734
+ verified: Boolean(skill.verified),
735
+ dependencies,
736
+ installCommand: `nexus skills install ${skill.slug}`,
737
+ installWithDepsCommand: `nexus skills install ${skill.slug} --with-deps`,
738
+ })),
739
+ hubUrl: getHubBaseUrl(),
740
+ }, null, 2));
741
+ return;
742
+ }
743
+ console.log(`\nSuggested hub skills (${suggestionDetails.length})\n`);
744
+ if (suggestionDetails.length === 0) {
745
+ console.log(" (none)\n");
746
+ return;
747
+ }
748
+ for (const { skill, dependencies } of suggestionDetails) {
749
+ const verified = skill.verified ? "verified" : "unverified";
750
+ console.log(` 🌐 ${skill.slug} — ${skill.description} (${verified})`);
751
+ console.log(` Install → nexus skills install ${skill.slug}`);
752
+ console.log(` Install chain → nexus skills install ${skill.slug} --with-deps`);
753
+ const deps = [
754
+ dependencies.tools.length > 0
755
+ ? `Tools: ${dependencies.tools.join(", ")}`
756
+ : null,
757
+ dependencies.connectors.length > 0
758
+ ? `Connectors: ${dependencies.connectors.join(", ")}`
759
+ : null,
760
+ ].filter(Boolean);
761
+ if (deps.length > 0) {
762
+ console.log(` Requires → ${deps.join(" | ")}`);
763
+ }
764
+ }
765
+ console.log("");
766
+ return;
767
+ }
768
+ if (opts.json) {
769
+ console.log(JSON.stringify({
770
+ query,
771
+ local: opts.hubOnly ? [] : localMatches,
772
+ hub: opts.localOnly ? [] : hubMatches,
773
+ hubUrl: getHubBaseUrl(),
774
+ }, null, 2));
775
+ return;
776
+ }
777
+ if (!opts.hubOnly) {
778
+ console.log(`\nLocal matches (${localMatches.length})\n`);
779
+ if (localMatches.length === 0) {
780
+ console.log(" (none)\n");
781
+ }
782
+ else {
783
+ for (const skill of localMatches) {
784
+ const status = skill.eligible ? "✅" : "🔧";
785
+ console.log(` ${status} ${skill.name} — ${skill.description}`);
786
+ const deps = [
787
+ skill.missing.credentials.length > 0
788
+ ? `Connectors: ${skill.missing.credentials.join(", ")}`
789
+ : null,
790
+ skill.missing.bins.length > 0
791
+ ? `Bins: ${skill.missing.bins.join(", ")}`
792
+ : null,
793
+ skill.missing.env.length > 0
794
+ ? `Env: ${skill.missing.env.join(", ")}`
795
+ : null,
796
+ skill.missing.config.length > 0
797
+ ? `Config: ${skill.missing.config.join(", ")}`
798
+ : null,
799
+ ].filter(Boolean);
800
+ if (deps.length > 0) {
801
+ console.log(` Requires → ${deps.join(" | ")}`);
802
+ }
803
+ if (skill.install.length > 0) {
804
+ console.log(` Install → ${skill.install.map((i) => i.label).filter(Boolean).join(", ")}`);
805
+ }
806
+ }
807
+ console.log("");
808
+ }
809
+ }
810
+ if (!opts.localOnly) {
811
+ console.log(`Hub matches (${hubMatches.length})\n`);
812
+ if (hubMatches.length === 0) {
813
+ console.log(" (none)\n");
814
+ }
815
+ else {
816
+ for (const skill of hubMatches) {
817
+ const status = skill.installed ? "✅" : "🌐";
818
+ const verified = skill.verified ? "verified" : "unverified";
819
+ console.log(` ${status} ${skill.slug} — ${skill.description} (${verified})`);
820
+ if (!skill.installed) {
821
+ console.log(` Install → nexus skills install ${skill.slug}`);
822
+ }
823
+ const deps = [
824
+ skill.dependencies.credentials.length > 0
825
+ ? `Connectors: ${skill.dependencies.credentials.join(", ")}`
826
+ : null,
827
+ skill.dependencies.bins.length > 0
828
+ ? `Bins: ${skill.dependencies.bins.join(", ")}`
829
+ : null,
830
+ skill.dependencies.env.length > 0
831
+ ? `Env: ${skill.dependencies.env.join(", ")}`
832
+ : null,
833
+ skill.dependencies.config.length > 0
834
+ ? `Config: ${skill.dependencies.config.join(", ")}`
835
+ : null,
836
+ ].filter(Boolean);
837
+ if (deps.length > 0) {
838
+ console.log(` Requires → ${deps.join(" | ")}`);
839
+ }
840
+ }
841
+ console.log("");
842
+ }
843
+ }
844
+ });
845
+ skills
846
+ .command("publish [skillPath]")
847
+ .description("Publish a skill to the Nexus Hub")
848
+ .option("--slug <slug>", "Publish a new version for an existing skill")
849
+ .option("--name <name>", "Override skill name")
850
+ .option("--description <description>", "Override skill description")
851
+ .option("--type <type>", "Override skill type (guide|tool|connector)")
852
+ .option("--version <version>", "Override skill version")
853
+ .option("--license <license>", "Override license")
854
+ .option("--repository <url>", "Override repository URL")
855
+ .option("--homepage <url>", "Override homepage URL")
856
+ .option("--visibility <value>", "public or unlisted", "public")
857
+ .option("--capability <cap>", "Add capability", (value, prev) => {
858
+ const list = Array.isArray(prev) ? prev : [];
859
+ list.push(value);
860
+ return list;
861
+ })
862
+ .option("--capabilities <list>", "Comma-separated capabilities")
863
+ .option("--source <path>", "Optional source archive or directory")
864
+ .option("--source-commit <sha>", "Optional source commit SHA")
865
+ .option("--token <token>", "Hub API token (or NEXUS_HUB_TOKEN)")
866
+ .option("--base <url>", "Hub base URL (default getnexus.sh)")
867
+ .action(async (skillPath, opts) => {
868
+ try {
869
+ const inputPath = resolveUserPath(skillPath ?? process.cwd());
870
+ const { skillDir, skillFile } = await resolveSkillFile(inputPath);
871
+ const content = await fs.readFile(skillFile, "utf-8");
872
+ const { frontmatter, body } = parseFrontmatter(content);
873
+ const capOverrides = [
874
+ ...(Array.isArray(opts.capability) ? opts.capability : []),
875
+ ...normalizeStringList(opts.capabilities),
876
+ ].map((cap) => cap.trim()).filter(Boolean);
877
+ const overrides = {
878
+ path: skillDir,
879
+ slug: typeof opts.slug === "string" ? opts.slug.trim() : undefined,
880
+ name: typeof opts.name === "string" ? opts.name.trim() : undefined,
881
+ description: typeof opts.description === "string" ? opts.description.trim() : undefined,
882
+ type: typeof opts.type === "string" ? opts.type.trim() : undefined,
883
+ version: typeof opts.version === "string" ? opts.version.trim() : undefined,
884
+ license: typeof opts.license === "string" ? opts.license.trim() : undefined,
885
+ repository: typeof opts.repository === "string" ? opts.repository.trim() : undefined,
886
+ homepage: typeof opts.homepage === "string" ? opts.homepage.trim() : undefined,
887
+ visibility: typeof opts.visibility === "string" ? opts.visibility.trim() : "public",
888
+ capabilities: capOverrides.length > 0 ? capOverrides : undefined,
889
+ sourcePath: typeof opts.source === "string" ? resolveUserPath(opts.source) : undefined,
890
+ sourceCommit: typeof opts.sourceCommit === "string"
891
+ ? opts.sourceCommit.trim()
892
+ : undefined,
893
+ token: typeof opts.token === "string" ? opts.token.trim() : undefined,
894
+ baseUrl: typeof opts.base === "string" ? opts.base.trim() : undefined,
895
+ };
896
+ const token = await resolveHubToken(overrides.token);
897
+ if (!token) {
898
+ throw new Error("Missing hub token. Run `nexus cloud login` or set NEXUS_HUB_TOKEN.");
899
+ }
900
+ const payload = buildManifestPayload({
901
+ frontmatter,
902
+ body,
903
+ overrides,
904
+ });
905
+ const missing = [];
906
+ if (!payload.name)
907
+ missing.push("name");
908
+ if (!payload.description)
909
+ missing.push("description");
910
+ if (!payload.type)
911
+ missing.push("type");
912
+ if (!payload.version)
913
+ missing.push("version");
914
+ if (!payload.license)
915
+ missing.push("license");
916
+ if (missing.length > 0) {
917
+ throw new Error(`Missing required fields: ${missing.join(", ")} (use flags or frontmatter)`);
918
+ }
919
+ const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "nexus-skill-publish-"));
920
+ const artifactPath = path.join(tmpDir, "artifact.tgz");
921
+ await createTarball(skillDir, artifactPath);
922
+ const artifact = await computeArtifactInfo(artifactPath);
923
+ let source = null;
924
+ let sourcePath = null;
925
+ if (overrides.sourcePath) {
926
+ const sourceStats = await fs.stat(overrides.sourcePath);
927
+ if (sourceStats.isDirectory()) {
928
+ sourcePath = path.join(tmpDir, "source.tgz");
929
+ await createTarball(overrides.sourcePath, sourcePath);
930
+ }
931
+ else {
932
+ sourcePath = overrides.sourcePath;
933
+ }
934
+ source = await computeArtifactInfo(sourcePath);
935
+ }
936
+ const baseUrl = overrides.baseUrl || getHubBaseUrl();
937
+ const endpoint = overrides.slug
938
+ ? `/api/skills/${encodeURIComponent(overrides.slug)}/versions`
939
+ : "/api/skills";
940
+ const response = await fetch(new URL(endpoint, baseUrl), {
941
+ method: "POST",
942
+ headers: {
943
+ "content-type": "application/json",
944
+ authorization: `Bearer ${token}`,
945
+ },
946
+ body: JSON.stringify({
947
+ name: payload.name,
948
+ description: payload.description,
949
+ type: payload.type,
950
+ version: payload.version,
951
+ license: payload.license,
952
+ repository: payload.repository || "",
953
+ homepage: payload.homepage || "",
954
+ visibility: overrides.visibility || "public",
955
+ sourceCommit: overrides.sourceCommit || "",
956
+ capabilities: payload.capabilities,
957
+ readmeExcerpt: payload.readmeExcerpt,
958
+ manifest: payload.manifest,
959
+ artifact: { sha256: artifact.sha256, bytes: artifact.bytes },
960
+ ...(source
961
+ ? { source: { sha256: source.sha256, bytes: source.bytes } }
962
+ : {}),
963
+ }),
964
+ });
965
+ const data = await response.json().catch(() => ({}));
966
+ if (!response.ok) {
967
+ if (response.status === 409 && !overrides.slug) {
968
+ throw new Error("Skill already exists. Re-run with --slug <owner/name> to publish a new version.");
969
+ }
970
+ throw new Error(data?.error || `Publish failed (${response.status})`);
971
+ }
972
+ const upload = data?.upload;
973
+ const needed = Array.isArray(upload?.needed) ? upload.needed : [];
974
+ const fileMap = new Map([
975
+ [artifact.sha256, artifactPath],
976
+ ]);
977
+ if (source && sourcePath) {
978
+ fileMap.set(source.sha256, sourcePath);
979
+ }
980
+ for (const item of needed) {
981
+ if (!item?.id || !item?.url)
982
+ continue;
983
+ const filePath = fileMap.get(item.id);
984
+ if (!filePath)
985
+ continue;
986
+ const blob = await fs.readFile(filePath);
987
+ const headers = {};
988
+ if (upload?.cloudToken && item.url.includes("/api/v1/blobs/")) {
989
+ headers.authorization = `Bearer ${upload.cloudToken}`;
990
+ }
991
+ const uploadResp = await fetch(item.url, {
992
+ method: "PUT",
993
+ headers,
994
+ body: blob,
995
+ });
996
+ if (!uploadResp.ok) {
997
+ const bodyText = await uploadResp.text().catch(() => "");
998
+ throw new Error(`Upload failed (${uploadResp.status}): ${bodyText || "unknown error"}`);
999
+ }
1000
+ }
1001
+ console.log(`✅ Published ${payload.name} (${payload.version})` +
1002
+ (data?.skill?.slug ? ` as ${data.skill.slug}` : ""));
1003
+ if (needed.length > 0) {
1004
+ console.log(` Uploaded ${needed.length} artifact(s)`);
1005
+ }
1006
+ }
1007
+ catch (err) {
1008
+ console.error(err instanceof Error ? err.message : `Publish failed: ${String(err)}`);
1009
+ process.exit(1);
1010
+ }
1011
+ });
1012
+ skills
1013
+ .command("install <slug>")
1014
+ .description("Install a skill from the Nexus Hub")
1015
+ .option("--force", "Overwrite if destination exists")
1016
+ .option("--with-deps", "Install tool/connector dependencies first")
1017
+ .action(async (slug, opts) => {
1018
+ try {
1019
+ const cfg = loadConfig();
1020
+ const workspaceDir = resolveUserPath(cfg.agent?.workspace ?? DEFAULT_AGENT_WORKSPACE_DIR);
1021
+ const userSkillsDir = path.join(workspaceDir, "skills");
1022
+ const managedSkillsDir = MANAGED_SKILLS_DIR;
1023
+ const managedDir = path.join(managedSkillsDir, "managed");
1024
+ const metadataEntries = loadWorkspaceSkillEntries(workspaceDir, {
1025
+ config: cfg,
1026
+ managedSkillsDir,
1027
+ });
1028
+ const installedNames = new Set(metadataEntries.map((entry) => normalizeSkillKey(entry.skill.name)));
1029
+ const installedSlugs = await loadManagedSkillSlugs(managedSkillsDir);
1030
+ const installedIndex = {
1031
+ names: installedNames,
1032
+ slugs: installedSlugs,
1033
+ };
1034
+ const detailsCache = new Map();
1035
+ const getDetails = async (detailSlug) => {
1036
+ const key = normalizeSkillKey(detailSlug);
1037
+ const cached = detailsCache.get(key);
1038
+ if (cached)
1039
+ return cached;
1040
+ const details = await fetchHubSkillDetails(detailSlug);
1041
+ detailsCache.set(key, details);
1042
+ return details;
1043
+ };
1044
+ if (opts.withDeps) {
1045
+ const missingDeps = [];
1046
+ const plan = await resolveHubDependencyPlan(slug, installedIndex, getDetails, (missing) => {
1047
+ missingDeps.push(missing);
1048
+ });
1049
+ if (plan.length > 0) {
1050
+ console.log(`\nInstalling dependencies (${plan.length})...\n`);
1051
+ }
1052
+ for (const dep of plan) {
1053
+ const result = await installHubSkill({
1054
+ slug: dep,
1055
+ managedDir,
1056
+ userSkillsDir,
1057
+ allowSkip: true,
1058
+ });
1059
+ if (result.installed) {
1060
+ installedIndex.slugs.add(normalizeSkillKey(dep));
1061
+ const detail = detailsCache.get(normalizeSkillKey(dep));
1062
+ if (detail?.name) {
1063
+ installedIndex.names.add(normalizeSkillKey(detail.name));
1064
+ }
1065
+ console.log(`✅ Installed dependency ${dep}`);
1066
+ }
1067
+ else {
1068
+ console.log(`⏭️ Dependency already installed: ${dep}`);
1069
+ }
1070
+ }
1071
+ if (plan.length > 0) {
1072
+ console.log("");
1073
+ }
1074
+ if (missingDeps.length > 0) {
1075
+ console.log(`⚠️ Missing dependencies in hub: ${missingDeps.join(", ")}`);
1076
+ }
1077
+ }
1078
+ const result = await installHubSkill({
1079
+ slug,
1080
+ managedDir,
1081
+ userSkillsDir,
1082
+ force: Boolean(opts.force),
1083
+ });
1084
+ console.log(`✅ Installed ${slug} to ${result.destDir}`);
1085
+ console.log(` Run: nexus skill use ${path.basename(slug)}`);
1086
+ }
1087
+ catch (err) {
1088
+ console.error(err instanceof Error ? err.message : `Install failed: ${String(err)}`);
1089
+ process.exit(1);
1090
+ }
1091
+ });
1092
+ }
1093
+ // Cloud login moved to cloud-cli.