calvyn-code 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1718) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +217 -0
  3. package/README.zh-CN.md +180 -0
  4. package/acp_adapter/__init__.py +1 -0
  5. package/acp_adapter/__main__.py +5 -0
  6. package/acp_adapter/auth.py +68 -0
  7. package/acp_adapter/bootstrap/__init__.py +0 -0
  8. package/acp_adapter/bootstrap/bootstrap_browser_tools.ps1 +288 -0
  9. package/acp_adapter/bootstrap/bootstrap_browser_tools.sh +399 -0
  10. package/acp_adapter/entry.py +292 -0
  11. package/acp_adapter/events.py +265 -0
  12. package/acp_adapter/permissions.py +148 -0
  13. package/acp_adapter/server.py +1713 -0
  14. package/acp_adapter/session.py +629 -0
  15. package/acp_adapter/tools.py +1180 -0
  16. package/agent/__init__.py +6 -0
  17. package/agent/__pycache__/__init__.cpython-312.pyc +0 -0
  18. package/agent/__pycache__/account_usage.cpython-312.pyc +0 -0
  19. package/agent/__pycache__/anthropic_adapter.cpython-312.pyc +0 -0
  20. package/agent/__pycache__/async_utils.cpython-312.pyc +0 -0
  21. package/agent/__pycache__/auxiliary_client.cpython-312.pyc +0 -0
  22. package/agent/__pycache__/codex_responses_adapter.cpython-312.pyc +0 -0
  23. package/agent/__pycache__/context_compressor.cpython-312.pyc +0 -0
  24. package/agent/__pycache__/context_engine.cpython-312.pyc +0 -0
  25. package/agent/__pycache__/context_references.cpython-312.pyc +0 -0
  26. package/agent/__pycache__/credential_pool.cpython-312.pyc +0 -0
  27. package/agent/__pycache__/curator.cpython-312.pyc +0 -0
  28. package/agent/__pycache__/display.cpython-312.pyc +0 -0
  29. package/agent/__pycache__/error_classifier.cpython-312.pyc +0 -0
  30. package/agent/__pycache__/file_safety.cpython-312.pyc +0 -0
  31. package/agent/__pycache__/google_code_assist.cpython-312.pyc +0 -0
  32. package/agent/__pycache__/google_oauth.cpython-312.pyc +0 -0
  33. package/agent/__pycache__/i18n.cpython-312.pyc +0 -0
  34. package/agent/__pycache__/image_gen_provider.cpython-312.pyc +0 -0
  35. package/agent/__pycache__/image_gen_registry.cpython-312.pyc +0 -0
  36. package/agent/__pycache__/insights.cpython-312.pyc +0 -0
  37. package/agent/__pycache__/lmstudio_reasoning.cpython-312.pyc +0 -0
  38. package/agent/__pycache__/manual_compression_feedback.cpython-312.pyc +0 -0
  39. package/agent/__pycache__/markdown_tables.cpython-312.pyc +0 -0
  40. package/agent/__pycache__/memory_manager.cpython-312.pyc +0 -0
  41. package/agent/__pycache__/memory_provider.cpython-312.pyc +0 -0
  42. package/agent/__pycache__/model_metadata.cpython-312.pyc +0 -0
  43. package/agent/__pycache__/models_dev.cpython-312.pyc +0 -0
  44. package/agent/__pycache__/moonshot_schema.cpython-312.pyc +0 -0
  45. package/agent/__pycache__/onboarding.cpython-312.pyc +0 -0
  46. package/agent/__pycache__/portal_tags.cpython-312.pyc +0 -0
  47. package/agent/__pycache__/prompt_builder.cpython-312.pyc +0 -0
  48. package/agent/__pycache__/prompt_caching.cpython-312.pyc +0 -0
  49. package/agent/__pycache__/redact.cpython-312.pyc +0 -0
  50. package/agent/__pycache__/retry_utils.cpython-312.pyc +0 -0
  51. package/agent/__pycache__/shell_hooks.cpython-312.pyc +0 -0
  52. package/agent/__pycache__/skill_commands.cpython-312.pyc +0 -0
  53. package/agent/__pycache__/skill_preprocessing.cpython-312.pyc +0 -0
  54. package/agent/__pycache__/skill_utils.cpython-312.pyc +0 -0
  55. package/agent/__pycache__/subdirectory_hints.cpython-312.pyc +0 -0
  56. package/agent/__pycache__/think_scrubber.cpython-312.pyc +0 -0
  57. package/agent/__pycache__/title_generator.cpython-312.pyc +0 -0
  58. package/agent/__pycache__/tool_guardrails.cpython-312.pyc +0 -0
  59. package/agent/__pycache__/tool_result_classification.cpython-312.pyc +0 -0
  60. package/agent/__pycache__/trajectory.cpython-312.pyc +0 -0
  61. package/agent/__pycache__/usage_pricing.cpython-312.pyc +0 -0
  62. package/agent/__pycache__/video_gen_provider.cpython-312.pyc +0 -0
  63. package/agent/__pycache__/video_gen_registry.cpython-312.pyc +0 -0
  64. package/agent/__pycache__/web_search_provider.cpython-312.pyc +0 -0
  65. package/agent/__pycache__/web_search_registry.cpython-312.pyc +0 -0
  66. package/agent/account_usage.py +326 -0
  67. package/agent/anthropic_adapter.py +2087 -0
  68. package/agent/async_utils.py +68 -0
  69. package/agent/auxiliary_client.py +4893 -0
  70. package/agent/bedrock_adapter.py +1276 -0
  71. package/agent/codex_responses_adapter.py +1084 -0
  72. package/agent/context_compressor.py +1583 -0
  73. package/agent/context_engine.py +211 -0
  74. package/agent/context_references.py +519 -0
  75. package/agent/copilot_acp_client.py +684 -0
  76. package/agent/credential_pool.py +1780 -0
  77. package/agent/credential_sources.py +449 -0
  78. package/agent/curator.py +1782 -0
  79. package/agent/curator_backup.py +694 -0
  80. package/agent/display.py +987 -0
  81. package/agent/error_classifier.py +1058 -0
  82. package/agent/file_safety.py +112 -0
  83. package/agent/gemini_cloudcode_adapter.py +909 -0
  84. package/agent/gemini_native_adapter.py +971 -0
  85. package/agent/gemini_schema.py +99 -0
  86. package/agent/google_code_assist.py +452 -0
  87. package/agent/google_oauth.py +1062 -0
  88. package/agent/i18n.py +258 -0
  89. package/agent/image_gen_provider.py +243 -0
  90. package/agent/image_gen_registry.py +145 -0
  91. package/agent/image_routing.py +301 -0
  92. package/agent/insights.py +931 -0
  93. package/agent/lmstudio_reasoning.py +48 -0
  94. package/agent/lsp/__init__.py +106 -0
  95. package/agent/lsp/__pycache__/__init__.cpython-312.pyc +0 -0
  96. package/agent/lsp/__pycache__/cli.cpython-312.pyc +0 -0
  97. package/agent/lsp/__pycache__/client.cpython-312.pyc +0 -0
  98. package/agent/lsp/__pycache__/eventlog.cpython-312.pyc +0 -0
  99. package/agent/lsp/__pycache__/manager.cpython-312.pyc +0 -0
  100. package/agent/lsp/__pycache__/protocol.cpython-312.pyc +0 -0
  101. package/agent/lsp/__pycache__/servers.cpython-312.pyc +0 -0
  102. package/agent/lsp/__pycache__/workspace.cpython-312.pyc +0 -0
  103. package/agent/lsp/cli.py +308 -0
  104. package/agent/lsp/client.py +930 -0
  105. package/agent/lsp/eventlog.py +213 -0
  106. package/agent/lsp/install.py +376 -0
  107. package/agent/lsp/manager.py +644 -0
  108. package/agent/lsp/protocol.py +196 -0
  109. package/agent/lsp/range_shift.py +149 -0
  110. package/agent/lsp/reporter.py +78 -0
  111. package/agent/lsp/servers.py +1040 -0
  112. package/agent/lsp/workspace.py +223 -0
  113. package/agent/manual_compression_feedback.py +49 -0
  114. package/agent/markdown_tables.py +309 -0
  115. package/agent/memory_manager.py +556 -0
  116. package/agent/memory_provider.py +279 -0
  117. package/agent/model_metadata.py +1827 -0
  118. package/agent/models_dev.py +724 -0
  119. package/agent/moonshot_schema.py +231 -0
  120. package/agent/nous_rate_guard.py +326 -0
  121. package/agent/onboarding.py +193 -0
  122. package/agent/plugin_llm.py +1046 -0
  123. package/agent/portal_tags.py +64 -0
  124. package/agent/prompt_builder.py +1457 -0
  125. package/agent/prompt_caching.py +79 -0
  126. package/agent/rate_limit_tracker.py +246 -0
  127. package/agent/redact.py +403 -0
  128. package/agent/retry_utils.py +57 -0
  129. package/agent/shell_hooks.py +837 -0
  130. package/agent/skill_commands.py +502 -0
  131. package/agent/skill_preprocessing.py +131 -0
  132. package/agent/skill_utils.py +512 -0
  133. package/agent/subdirectory_hints.py +224 -0
  134. package/agent/think_scrubber.py +386 -0
  135. package/agent/title_generator.py +171 -0
  136. package/agent/tool_guardrails.py +458 -0
  137. package/agent/tool_result_classification.py +26 -0
  138. package/agent/trajectory.py +56 -0
  139. package/agent/transports/__init__.py +68 -0
  140. package/agent/transports/__pycache__/__init__.cpython-312.pyc +0 -0
  141. package/agent/transports/__pycache__/anthropic.cpython-312.pyc +0 -0
  142. package/agent/transports/__pycache__/base.cpython-312.pyc +0 -0
  143. package/agent/transports/__pycache__/bedrock.cpython-312.pyc +0 -0
  144. package/agent/transports/__pycache__/chat_completions.cpython-312.pyc +0 -0
  145. package/agent/transports/__pycache__/codex.cpython-312.pyc +0 -0
  146. package/agent/transports/__pycache__/types.cpython-312.pyc +0 -0
  147. package/agent/transports/anthropic.py +179 -0
  148. package/agent/transports/base.py +89 -0
  149. package/agent/transports/bedrock.py +154 -0
  150. package/agent/transports/chat_completions.py +614 -0
  151. package/agent/transports/codex.py +283 -0
  152. package/agent/transports/codex_app_server.py +368 -0
  153. package/agent/transports/codex_app_server_session.py +810 -0
  154. package/agent/transports/codex_event_projector.py +312 -0
  155. package/agent/transports/hermes_tools_mcp_server.py +233 -0
  156. package/agent/transports/types.py +162 -0
  157. package/agent/usage_pricing.py +877 -0
  158. package/agent/video_gen_provider.py +300 -0
  159. package/agent/video_gen_registry.py +117 -0
  160. package/agent/web_search_provider.py +221 -0
  161. package/agent/web_search_registry.py +262 -0
  162. package/assets/banner.png +0 -0
  163. package/batch_runner.py +1303 -0
  164. package/bin/calvyn.js +67 -0
  165. package/calvyn_bootstrap.py +130 -0
  166. package/calvyn_constants.py +346 -0
  167. package/calvyn_logging.py +390 -0
  168. package/calvyn_state.py +2967 -0
  169. package/calvyn_time.py +105 -0
  170. package/cli.py +14160 -0
  171. package/cron/__init__.py +42 -0
  172. package/cron/__pycache__/__init__.cpython-312.pyc +0 -0
  173. package/cron/__pycache__/jobs.cpython-312.pyc +0 -0
  174. package/cron/__pycache__/scheduler.cpython-312.pyc +0 -0
  175. package/cron/jobs.py +1160 -0
  176. package/cron/scheduler.py +1832 -0
  177. package/gateway/__init__.py +35 -0
  178. package/gateway/__pycache__/__init__.cpython-312.pyc +0 -0
  179. package/gateway/__pycache__/channel_directory.cpython-312.pyc +0 -0
  180. package/gateway/__pycache__/config.cpython-312.pyc +0 -0
  181. package/gateway/__pycache__/delivery.cpython-312.pyc +0 -0
  182. package/gateway/__pycache__/display_config.cpython-312.pyc +0 -0
  183. package/gateway/__pycache__/hooks.cpython-312.pyc +0 -0
  184. package/gateway/__pycache__/pairing.cpython-312.pyc +0 -0
  185. package/gateway/__pycache__/platform_registry.cpython-312.pyc +0 -0
  186. package/gateway/__pycache__/restart.cpython-312.pyc +0 -0
  187. package/gateway/__pycache__/run.cpython-312.pyc +0 -0
  188. package/gateway/__pycache__/runtime_footer.cpython-312.pyc +0 -0
  189. package/gateway/__pycache__/session.cpython-312.pyc +0 -0
  190. package/gateway/__pycache__/session_context.cpython-312.pyc +0 -0
  191. package/gateway/__pycache__/shutdown_forensics.cpython-312.pyc +0 -0
  192. package/gateway/__pycache__/slash_access.cpython-312.pyc +0 -0
  193. package/gateway/__pycache__/status.cpython-312.pyc +0 -0
  194. package/gateway/__pycache__/stream_consumer.cpython-312.pyc +0 -0
  195. package/gateway/__pycache__/whatsapp_identity.cpython-312.pyc +0 -0
  196. package/gateway/assets/telegram-botfather-threads-settings.jpg +0 -0
  197. package/gateway/builtin_hooks/__init__.py +1 -0
  198. package/gateway/channel_directory.py +357 -0
  199. package/gateway/config.py +1873 -0
  200. package/gateway/delivery.py +258 -0
  201. package/gateway/display_config.py +206 -0
  202. package/gateway/hooks.py +210 -0
  203. package/gateway/mirror.py +179 -0
  204. package/gateway/pairing.py +322 -0
  205. package/gateway/platform_registry.py +260 -0
  206. package/gateway/platforms/ADDING_A_PLATFORM.md +374 -0
  207. package/gateway/platforms/__init__.py +45 -0
  208. package/gateway/platforms/__pycache__/__init__.cpython-312.pyc +0 -0
  209. package/gateway/platforms/__pycache__/base.cpython-312.pyc +0 -0
  210. package/gateway/platforms/__pycache__/helpers.cpython-312.pyc +0 -0
  211. package/gateway/platforms/__pycache__/telegram.cpython-312.pyc +0 -0
  212. package/gateway/platforms/__pycache__/telegram_network.cpython-312.pyc +0 -0
  213. package/gateway/platforms/__pycache__/yuanbao.cpython-312.pyc +0 -0
  214. package/gateway/platforms/__pycache__/yuanbao_media.cpython-312.pyc +0 -0
  215. package/gateway/platforms/__pycache__/yuanbao_proto.cpython-312.pyc +0 -0
  216. package/gateway/platforms/_http_client_limits.py +84 -0
  217. package/gateway/platforms/api_server.py +3488 -0
  218. package/gateway/platforms/base.py +3747 -0
  219. package/gateway/platforms/bluebubbles.py +937 -0
  220. package/gateway/platforms/dingtalk.py +1473 -0
  221. package/gateway/platforms/discord.py +5584 -0
  222. package/gateway/platforms/email.py +773 -0
  223. package/gateway/platforms/feishu.py +5059 -0
  224. package/gateway/platforms/feishu_comment.py +1382 -0
  225. package/gateway/platforms/feishu_comment_rules.py +430 -0
  226. package/gateway/platforms/helpers.py +279 -0
  227. package/gateway/platforms/homeassistant.py +449 -0
  228. package/gateway/platforms/matrix.py +2777 -0
  229. package/gateway/platforms/mattermost.py +852 -0
  230. package/gateway/platforms/msgraph_webhook.py +397 -0
  231. package/gateway/platforms/qqbot/__init__.py +91 -0
  232. package/gateway/platforms/qqbot/adapter.py +3072 -0
  233. package/gateway/platforms/qqbot/chunked_upload.py +602 -0
  234. package/gateway/platforms/qqbot/constants.py +74 -0
  235. package/gateway/platforms/qqbot/crypto.py +45 -0
  236. package/gateway/platforms/qqbot/keyboards.py +473 -0
  237. package/gateway/platforms/qqbot/onboard.py +220 -0
  238. package/gateway/platforms/qqbot/utils.py +71 -0
  239. package/gateway/platforms/signal.py +1518 -0
  240. package/gateway/platforms/signal_rate_limit.py +369 -0
  241. package/gateway/platforms/slack.py +3028 -0
  242. package/gateway/platforms/sms.py +377 -0
  243. package/gateway/platforms/telegram.py +4836 -0
  244. package/gateway/platforms/telegram_network.py +249 -0
  245. package/gateway/platforms/webhook.py +806 -0
  246. package/gateway/platforms/wecom.py +1610 -0
  247. package/gateway/platforms/wecom_callback.py +403 -0
  248. package/gateway/platforms/wecom_crypto.py +142 -0
  249. package/gateway/platforms/weixin.py +2170 -0
  250. package/gateway/platforms/whatsapp.py +1283 -0
  251. package/gateway/platforms/yuanbao.py +4873 -0
  252. package/gateway/platforms/yuanbao_media.py +645 -0
  253. package/gateway/platforms/yuanbao_proto.py +1209 -0
  254. package/gateway/platforms/yuanbao_sticker.py +558 -0
  255. package/gateway/restart.py +20 -0
  256. package/gateway/run.py +17074 -0
  257. package/gateway/runtime_footer.py +150 -0
  258. package/gateway/session.py +1399 -0
  259. package/gateway/session_context.py +156 -0
  260. package/gateway/shutdown_forensics.py +462 -0
  261. package/gateway/slash_access.py +229 -0
  262. package/gateway/status.py +972 -0
  263. package/gateway/sticker_cache.py +111 -0
  264. package/gateway/stream_consumer.py +1286 -0
  265. package/gateway/whatsapp_identity.py +156 -0
  266. package/hermes_cli/__init__.py +47 -0
  267. package/hermes_cli/__pycache__/__init__.cpython-312.pyc +0 -0
  268. package/hermes_cli/__pycache__/_parser.cpython-312.pyc +0 -0
  269. package/hermes_cli/__pycache__/auth.cpython-312.pyc +0 -0
  270. package/hermes_cli/__pycache__/banner.cpython-312.pyc +0 -0
  271. package/hermes_cli/__pycache__/browser_connect.cpython-312.pyc +0 -0
  272. package/hermes_cli/__pycache__/callbacks.cpython-312.pyc +0 -0
  273. package/hermes_cli/__pycache__/checkpoints.cpython-312.pyc +0 -0
  274. package/hermes_cli/__pycache__/cli_output.cpython-312.pyc +0 -0
  275. package/hermes_cli/__pycache__/codex_models.cpython-312.pyc +0 -0
  276. package/hermes_cli/__pycache__/codex_runtime_switch.cpython-312.pyc +0 -0
  277. package/hermes_cli/__pycache__/colors.cpython-312.pyc +0 -0
  278. package/hermes_cli/__pycache__/commands.cpython-312.pyc +0 -0
  279. package/hermes_cli/__pycache__/config.cpython-312.pyc +0 -0
  280. package/hermes_cli/__pycache__/copilot_auth.cpython-312.pyc +0 -0
  281. package/hermes_cli/__pycache__/curator.cpython-312.pyc +0 -0
  282. package/hermes_cli/__pycache__/curses_ui.cpython-312.pyc +0 -0
  283. package/hermes_cli/__pycache__/debug.cpython-312.pyc +0 -0
  284. package/hermes_cli/__pycache__/default_soul.cpython-312.pyc +0 -0
  285. package/hermes_cli/__pycache__/env_loader.cpython-312.pyc +0 -0
  286. package/hermes_cli/__pycache__/fallback_cmd.cpython-312.pyc +0 -0
  287. package/hermes_cli/__pycache__/gateway.cpython-312.pyc +0 -0
  288. package/hermes_cli/__pycache__/gateway_windows.cpython-312.pyc +0 -0
  289. package/hermes_cli/__pycache__/goals.cpython-312.pyc +0 -0
  290. package/hermes_cli/__pycache__/inventory.cpython-312.pyc +0 -0
  291. package/hermes_cli/__pycache__/kanban.cpython-312.pyc +0 -0
  292. package/hermes_cli/__pycache__/kanban_db.cpython-312.pyc +0 -0
  293. package/hermes_cli/__pycache__/main.cpython-312.pyc +0 -0
  294. package/hermes_cli/__pycache__/model_catalog.cpython-312.pyc +0 -0
  295. package/hermes_cli/__pycache__/model_normalize.cpython-312.pyc +0 -0
  296. package/hermes_cli/__pycache__/model_switch.cpython-312.pyc +0 -0
  297. package/hermes_cli/__pycache__/models.cpython-312.pyc +0 -0
  298. package/hermes_cli/__pycache__/nous_subscription.cpython-312.pyc +0 -0
  299. package/hermes_cli/__pycache__/pairing.cpython-312.pyc +0 -0
  300. package/hermes_cli/__pycache__/platforms.cpython-312.pyc +0 -0
  301. package/hermes_cli/__pycache__/plugins.cpython-312.pyc +0 -0
  302. package/hermes_cli/__pycache__/profiles.cpython-312.pyc +0 -0
  303. package/hermes_cli/__pycache__/providers.cpython-312.pyc +0 -0
  304. package/hermes_cli/__pycache__/pt_input_extras.cpython-312.pyc +0 -0
  305. package/hermes_cli/__pycache__/runtime_provider.cpython-312.pyc +0 -0
  306. package/hermes_cli/__pycache__/security_advisories.cpython-312.pyc +0 -0
  307. package/hermes_cli/__pycache__/setup.cpython-312.pyc +0 -0
  308. package/hermes_cli/__pycache__/skills_hub.cpython-312.pyc +0 -0
  309. package/hermes_cli/__pycache__/skin_engine.cpython-312.pyc +0 -0
  310. package/hermes_cli/__pycache__/stdio.cpython-312.pyc +0 -0
  311. package/hermes_cli/__pycache__/timeouts.cpython-312.pyc +0 -0
  312. package/hermes_cli/__pycache__/tips.cpython-312.pyc +0 -0
  313. package/hermes_cli/__pycache__/tools_config.cpython-312.pyc +0 -0
  314. package/hermes_cli/__pycache__/voice.cpython-312.pyc +0 -0
  315. package/hermes_cli/_parser.py +365 -0
  316. package/hermes_cli/_subprocess_compat.py +175 -0
  317. package/hermes_cli/auth.py +6299 -0
  318. package/hermes_cli/auth_commands.py +749 -0
  319. package/hermes_cli/azure_detect.py +300 -0
  320. package/hermes_cli/backup.py +938 -0
  321. package/hermes_cli/banner.py +703 -0
  322. package/hermes_cli/browser_connect.py +139 -0
  323. package/hermes_cli/callbacks.py +243 -0
  324. package/hermes_cli/checkpoints.py +244 -0
  325. package/hermes_cli/claw.py +810 -0
  326. package/hermes_cli/cli_output.py +78 -0
  327. package/hermes_cli/clipboard.py +495 -0
  328. package/hermes_cli/codex_models.py +198 -0
  329. package/hermes_cli/codex_runtime_plugin_migration.py +757 -0
  330. package/hermes_cli/codex_runtime_switch.py +266 -0
  331. package/hermes_cli/colors.py +38 -0
  332. package/hermes_cli/commands.py +1728 -0
  333. package/hermes_cli/completion.py +315 -0
  334. package/hermes_cli/config.py +5382 -0
  335. package/hermes_cli/copilot_auth.py +392 -0
  336. package/hermes_cli/cron.py +313 -0
  337. package/hermes_cli/curator.py +598 -0
  338. package/hermes_cli/curses_ui.py +472 -0
  339. package/hermes_cli/debug.py +747 -0
  340. package/hermes_cli/default_soul.py +11 -0
  341. package/hermes_cli/dep_ensure.py +107 -0
  342. package/hermes_cli/dingtalk_auth.py +293 -0
  343. package/hermes_cli/doctor.py +1863 -0
  344. package/hermes_cli/dump.py +326 -0
  345. package/hermes_cli/env_loader.py +175 -0
  346. package/hermes_cli/fallback_cmd.py +361 -0
  347. package/hermes_cli/gateway.py +5422 -0
  348. package/hermes_cli/gateway_windows.py +692 -0
  349. package/hermes_cli/goals.py +757 -0
  350. package/hermes_cli/hooks.py +385 -0
  351. package/hermes_cli/inventory.py +240 -0
  352. package/hermes_cli/kanban.py +2252 -0
  353. package/hermes_cli/kanban_db.py +4840 -0
  354. package/hermes_cli/kanban_diagnostics.py +776 -0
  355. package/hermes_cli/kanban_specify.py +266 -0
  356. package/hermes_cli/logs.py +391 -0
  357. package/hermes_cli/main.py +12396 -0
  358. package/hermes_cli/mcp_config.py +781 -0
  359. package/hermes_cli/memory_setup.py +465 -0
  360. package/hermes_cli/model_catalog.py +330 -0
  361. package/hermes_cli/model_normalize.py +473 -0
  362. package/hermes_cli/model_switch.py +1777 -0
  363. package/hermes_cli/models.py +3789 -0
  364. package/hermes_cli/nous_subscription.py +799 -0
  365. package/hermes_cli/oneshot.py +351 -0
  366. package/hermes_cli/pairing.py +115 -0
  367. package/hermes_cli/platforms.py +83 -0
  368. package/hermes_cli/plugins.py +1562 -0
  369. package/hermes_cli/plugins_cmd.py +1587 -0
  370. package/hermes_cli/profile_distribution.py +703 -0
  371. package/hermes_cli/profiles.py +1319 -0
  372. package/hermes_cli/providers.py +720 -0
  373. package/hermes_cli/proxy/__init__.py +20 -0
  374. package/hermes_cli/proxy/adapters/__init__.py +35 -0
  375. package/hermes_cli/proxy/adapters/base.py +94 -0
  376. package/hermes_cli/proxy/adapters/nous_portal.py +137 -0
  377. package/hermes_cli/proxy/cli.py +141 -0
  378. package/hermes_cli/proxy/server.py +265 -0
  379. package/hermes_cli/pt_input_extras.py +83 -0
  380. package/hermes_cli/pty_bridge.py +237 -0
  381. package/hermes_cli/relaunch.py +205 -0
  382. package/hermes_cli/runtime_provider.py +1428 -0
  383. package/hermes_cli/security_advisories.py +452 -0
  384. package/hermes_cli/setup.py +3559 -0
  385. package/hermes_cli/skills_config.py +177 -0
  386. package/hermes_cli/skills_hub.py +1595 -0
  387. package/hermes_cli/skin_engine.py +929 -0
  388. package/hermes_cli/slack_cli.py +160 -0
  389. package/hermes_cli/status.py +550 -0
  390. package/hermes_cli/stdio.py +252 -0
  391. package/hermes_cli/timeouts.py +82 -0
  392. package/hermes_cli/tips.py +487 -0
  393. package/hermes_cli/tools_config.py +3151 -0
  394. package/hermes_cli/uninstall.py +681 -0
  395. package/hermes_cli/vercel_auth.py +70 -0
  396. package/hermes_cli/voice.py +846 -0
  397. package/hermes_cli/web_server.py +4438 -0
  398. package/hermes_cli/webhook.py +275 -0
  399. package/locales/af.yaml +350 -0
  400. package/locales/de.yaml +350 -0
  401. package/locales/en.yaml +365 -0
  402. package/locales/es.yaml +350 -0
  403. package/locales/fr.yaml +350 -0
  404. package/locales/ga.yaml +354 -0
  405. package/locales/hu.yaml +350 -0
  406. package/locales/it.yaml +350 -0
  407. package/locales/ja.yaml +350 -0
  408. package/locales/ko.yaml +350 -0
  409. package/locales/pt.yaml +350 -0
  410. package/locales/ru.yaml +350 -0
  411. package/locales/tr.yaml +350 -0
  412. package/locales/uk.yaml +350 -0
  413. package/locales/zh-hant.yaml +350 -0
  414. package/locales/zh.yaml +350 -0
  415. package/mcp_serve.py +898 -0
  416. package/model_tools.py +899 -0
  417. package/optional-skills/DESCRIPTION.md +24 -0
  418. package/optional-skills/autonomous-ai-agents/DESCRIPTION.md +2 -0
  419. package/optional-skills/autonomous-ai-agents/blackbox/SKILL.md +144 -0
  420. package/optional-skills/autonomous-ai-agents/honcho/SKILL.md +431 -0
  421. package/optional-skills/blockchain/evm/SKILL.md +211 -0
  422. package/optional-skills/blockchain/evm/scripts/evm_client.py +1508 -0
  423. package/optional-skills/blockchain/hyperliquid/SKILL.md +211 -0
  424. package/optional-skills/blockchain/hyperliquid/scripts/hyperliquid_client.py +1660 -0
  425. package/optional-skills/blockchain/solana/SKILL.md +208 -0
  426. package/optional-skills/blockchain/solana/scripts/solana_client.py +698 -0
  427. package/optional-skills/communication/DESCRIPTION.md +1 -0
  428. package/optional-skills/communication/one-three-one-rule/SKILL.md +104 -0
  429. package/optional-skills/creative/blender-mcp/SKILL.md +117 -0
  430. package/optional-skills/creative/concept-diagrams/SKILL.md +362 -0
  431. package/optional-skills/creative/concept-diagrams/examples/apartment-floor-plan-conversion.md +244 -0
  432. package/optional-skills/creative/concept-diagrams/examples/automated-password-reset-flow.md +276 -0
  433. package/optional-skills/creative/concept-diagrams/examples/autonomous-llm-research-agent-flow.md +240 -0
  434. package/optional-skills/creative/concept-diagrams/examples/banana-journey-tree-to-smoothie.md +161 -0
  435. package/optional-skills/creative/concept-diagrams/examples/commercial-aircraft-structure.md +209 -0
  436. package/optional-skills/creative/concept-diagrams/examples/cpu-ooo-microarchitecture.md +236 -0
  437. package/optional-skills/creative/concept-diagrams/examples/electricity-grid-flow.md +182 -0
  438. package/optional-skills/creative/concept-diagrams/examples/feature-film-production-pipeline.md +172 -0
  439. package/optional-skills/creative/concept-diagrams/examples/hospital-emergency-department-flow.md +165 -0
  440. package/optional-skills/creative/concept-diagrams/examples/ml-benchmark-grouped-bar-chart.md +114 -0
  441. package/optional-skills/creative/concept-diagrams/examples/place-order-uml-sequence.md +325 -0
  442. package/optional-skills/creative/concept-diagrams/examples/smart-city-infrastructure.md +173 -0
  443. package/optional-skills/creative/concept-diagrams/examples/smartphone-layer-anatomy.md +154 -0
  444. package/optional-skills/creative/concept-diagrams/examples/sn2-reaction-mechanism.md +247 -0
  445. package/optional-skills/creative/concept-diagrams/examples/wind-turbine-structure.md +338 -0
  446. package/optional-skills/creative/concept-diagrams/references/dashboard-patterns.md +43 -0
  447. package/optional-skills/creative/concept-diagrams/references/infrastructure-patterns.md +144 -0
  448. package/optional-skills/creative/concept-diagrams/references/physical-shape-cookbook.md +42 -0
  449. package/optional-skills/creative/concept-diagrams/templates/template.html +174 -0
  450. package/optional-skills/creative/hyperframes/SKILL.md +191 -0
  451. package/optional-skills/creative/hyperframes/references/cli.md +185 -0
  452. package/optional-skills/creative/hyperframes/references/composition.md +129 -0
  453. package/optional-skills/creative/hyperframes/references/features.md +289 -0
  454. package/optional-skills/creative/hyperframes/references/gsap.md +136 -0
  455. package/optional-skills/creative/hyperframes/references/troubleshooting.md +137 -0
  456. package/optional-skills/creative/hyperframes/references/website-to-video.md +145 -0
  457. package/optional-skills/creative/hyperframes/scripts/setup.sh +135 -0
  458. package/optional-skills/creative/kanban-video-orchestrator/SKILL.md +207 -0
  459. package/optional-skills/creative/kanban-video-orchestrator/assets/brief.md.tmpl +79 -0
  460. package/optional-skills/creative/kanban-video-orchestrator/assets/setup.sh.tmpl +185 -0
  461. package/optional-skills/creative/kanban-video-orchestrator/assets/soul.md.tmpl +38 -0
  462. package/optional-skills/creative/kanban-video-orchestrator/references/examples.md +227 -0
  463. package/optional-skills/creative/kanban-video-orchestrator/references/intake.md +166 -0
  464. package/optional-skills/creative/kanban-video-orchestrator/references/kanban-setup.md +276 -0
  465. package/optional-skills/creative/kanban-video-orchestrator/references/monitoring.md +180 -0
  466. package/optional-skills/creative/kanban-video-orchestrator/references/role-archetypes.md +298 -0
  467. package/optional-skills/creative/kanban-video-orchestrator/references/tool-matrix.md +317 -0
  468. package/optional-skills/creative/kanban-video-orchestrator/scripts/bootstrap_pipeline.py +501 -0
  469. package/optional-skills/creative/kanban-video-orchestrator/scripts/monitor.py +195 -0
  470. package/optional-skills/creative/meme-generation/EXAMPLES.md +46 -0
  471. package/optional-skills/creative/meme-generation/SKILL.md +130 -0
  472. package/optional-skills/creative/meme-generation/scripts/generate_meme.py +471 -0
  473. package/optional-skills/creative/meme-generation/scripts/templates.json +97 -0
  474. package/optional-skills/devops/cli/SKILL.md +156 -0
  475. package/optional-skills/devops/cli/references/app-discovery.md +112 -0
  476. package/optional-skills/devops/cli/references/authentication.md +59 -0
  477. package/optional-skills/devops/cli/references/cli-reference.md +104 -0
  478. package/optional-skills/devops/cli/references/running-apps.md +171 -0
  479. package/optional-skills/devops/docker-management/SKILL.md +281 -0
  480. package/optional-skills/devops/pinggy-tunnel/SKILL.md +309 -0
  481. package/optional-skills/devops/watchers/SKILL.md +112 -0
  482. package/optional-skills/devops/watchers/scripts/_watermark.py +148 -0
  483. package/optional-skills/devops/watchers/scripts/watch_github.py +168 -0
  484. package/optional-skills/devops/watchers/scripts/watch_http_json.py +131 -0
  485. package/optional-skills/devops/watchers/scripts/watch_rss.py +121 -0
  486. package/optional-skills/dogfood/DESCRIPTION.md +3 -0
  487. package/optional-skills/dogfood/adversarial-ux-test/SKILL.md +191 -0
  488. package/optional-skills/email/agentmail/SKILL.md +126 -0
  489. package/optional-skills/finance/3-statement-model/SKILL.md +433 -0
  490. package/optional-skills/finance/3-statement-model/references/formatting.md +118 -0
  491. package/optional-skills/finance/3-statement-model/references/formulas.md +292 -0
  492. package/optional-skills/finance/3-statement-model/references/sec-filings.md +125 -0
  493. package/optional-skills/finance/comps-analysis/SKILL.md +662 -0
  494. package/optional-skills/finance/dcf-model/SKILL.md +1270 -0
  495. package/optional-skills/finance/dcf-model/TROUBLESHOOTING.md +40 -0
  496. package/optional-skills/finance/dcf-model/requirements.txt +7 -0
  497. package/optional-skills/finance/dcf-model/scripts/validate_dcf.py +292 -0
  498. package/optional-skills/finance/excel-author/SKILL.md +244 -0
  499. package/optional-skills/finance/excel-author/scripts/recalc.py +88 -0
  500. package/optional-skills/finance/lbo-model/SKILL.md +291 -0
  501. package/optional-skills/finance/merger-model/SKILL.md +144 -0
  502. package/optional-skills/finance/pptx-author/SKILL.md +173 -0
  503. package/optional-skills/finance/stocks/SKILL.md +95 -0
  504. package/optional-skills/finance/stocks/scripts/stocks_client.py +755 -0
  505. package/optional-skills/health/DESCRIPTION.md +1 -0
  506. package/optional-skills/health/fitness-nutrition/SKILL.md +256 -0
  507. package/optional-skills/health/fitness-nutrition/references/FORMULAS.md +100 -0
  508. package/optional-skills/health/fitness-nutrition/scripts/body_calc.py +210 -0
  509. package/optional-skills/health/fitness-nutrition/scripts/nutrition_search.py +86 -0
  510. package/optional-skills/health/neuroskill-bci/SKILL.md +459 -0
  511. package/optional-skills/health/neuroskill-bci/references/api.md +286 -0
  512. package/optional-skills/health/neuroskill-bci/references/metrics.md +220 -0
  513. package/optional-skills/health/neuroskill-bci/references/protocols.md +452 -0
  514. package/optional-skills/mcp/DESCRIPTION.md +3 -0
  515. package/optional-skills/mcp/fastmcp/SKILL.md +300 -0
  516. package/optional-skills/mcp/fastmcp/references/fastmcp-cli.md +110 -0
  517. package/optional-skills/mcp/fastmcp/scripts/scaffold_fastmcp.py +56 -0
  518. package/optional-skills/mcp/fastmcp/templates/api_wrapper.py +54 -0
  519. package/optional-skills/mcp/fastmcp/templates/database_server.py +77 -0
  520. package/optional-skills/mcp/fastmcp/templates/file_processor.py +55 -0
  521. package/optional-skills/mcp/mcporter/SKILL.md +123 -0
  522. package/optional-skills/migration/DESCRIPTION.md +2 -0
  523. package/optional-skills/migration/openclaw-migration/SKILL.md +298 -0
  524. package/optional-skills/migration/openclaw-migration/scripts/openclaw_to_hermes.py +3136 -0
  525. package/optional-skills/mlops/accelerate/SKILL.md +336 -0
  526. package/optional-skills/mlops/accelerate/references/custom-plugins.md +453 -0
  527. package/optional-skills/mlops/accelerate/references/megatron-integration.md +489 -0
  528. package/optional-skills/mlops/accelerate/references/performance.md +525 -0
  529. package/optional-skills/mlops/chroma/SKILL.md +410 -0
  530. package/optional-skills/mlops/chroma/references/integration.md +38 -0
  531. package/optional-skills/mlops/clip/SKILL.md +257 -0
  532. package/optional-skills/mlops/clip/references/applications.md +207 -0
  533. package/optional-skills/mlops/faiss/SKILL.md +225 -0
  534. package/optional-skills/mlops/faiss/references/index_types.md +280 -0
  535. package/optional-skills/mlops/flash-attention/SKILL.md +367 -0
  536. package/optional-skills/mlops/flash-attention/references/benchmarks.md +215 -0
  537. package/optional-skills/mlops/flash-attention/references/transformers-integration.md +293 -0
  538. package/optional-skills/mlops/guidance/SKILL.md +576 -0
  539. package/optional-skills/mlops/guidance/references/backends.md +554 -0
  540. package/optional-skills/mlops/guidance/references/constraints.md +674 -0
  541. package/optional-skills/mlops/guidance/references/examples.md +767 -0
  542. package/optional-skills/mlops/huggingface-tokenizers/SKILL.md +520 -0
  543. package/optional-skills/mlops/huggingface-tokenizers/references/algorithms.md +653 -0
  544. package/optional-skills/mlops/huggingface-tokenizers/references/integration.md +637 -0
  545. package/optional-skills/mlops/huggingface-tokenizers/references/pipeline.md +723 -0
  546. package/optional-skills/mlops/huggingface-tokenizers/references/training.md +565 -0
  547. package/optional-skills/mlops/inference/outlines/SKILL.md +656 -0
  548. package/optional-skills/mlops/inference/outlines/references/backends.md +615 -0
  549. package/optional-skills/mlops/inference/outlines/references/examples.md +773 -0
  550. package/optional-skills/mlops/inference/outlines/references/json_generation.md +652 -0
  551. package/optional-skills/mlops/instructor/SKILL.md +744 -0
  552. package/optional-skills/mlops/instructor/references/examples.md +107 -0
  553. package/optional-skills/mlops/instructor/references/providers.md +70 -0
  554. package/optional-skills/mlops/instructor/references/validation.md +606 -0
  555. package/optional-skills/mlops/lambda-labs/SKILL.md +549 -0
  556. package/optional-skills/mlops/lambda-labs/references/advanced-usage.md +611 -0
  557. package/optional-skills/mlops/lambda-labs/references/troubleshooting.md +530 -0
  558. package/optional-skills/mlops/llava/SKILL.md +308 -0
  559. package/optional-skills/mlops/llava/references/training.md +197 -0
  560. package/optional-skills/mlops/modal/SKILL.md +345 -0
  561. package/optional-skills/mlops/modal/references/advanced-usage.md +503 -0
  562. package/optional-skills/mlops/modal/references/troubleshooting.md +494 -0
  563. package/optional-skills/mlops/nemo-curator/SKILL.md +387 -0
  564. package/optional-skills/mlops/nemo-curator/references/deduplication.md +87 -0
  565. package/optional-skills/mlops/nemo-curator/references/filtering.md +102 -0
  566. package/optional-skills/mlops/peft/SKILL.md +435 -0
  567. package/optional-skills/mlops/peft/references/advanced-usage.md +514 -0
  568. package/optional-skills/mlops/peft/references/troubleshooting.md +480 -0
  569. package/optional-skills/mlops/pinecone/SKILL.md +362 -0
  570. package/optional-skills/mlops/pinecone/references/deployment.md +181 -0
  571. package/optional-skills/mlops/pytorch-fsdp/SKILL.md +130 -0
  572. package/optional-skills/mlops/pytorch-fsdp/references/index.md +7 -0
  573. package/optional-skills/mlops/pytorch-fsdp/references/other.md +4261 -0
  574. package/optional-skills/mlops/pytorch-lightning/SKILL.md +350 -0
  575. package/optional-skills/mlops/pytorch-lightning/references/callbacks.md +436 -0
  576. package/optional-skills/mlops/pytorch-lightning/references/distributed.md +490 -0
  577. package/optional-skills/mlops/pytorch-lightning/references/hyperparameter-tuning.md +556 -0
  578. package/optional-skills/mlops/qdrant/SKILL.md +497 -0
  579. package/optional-skills/mlops/qdrant/references/advanced-usage.md +648 -0
  580. package/optional-skills/mlops/qdrant/references/troubleshooting.md +631 -0
  581. package/optional-skills/mlops/saelens/SKILL.md +390 -0
  582. package/optional-skills/mlops/saelens/references/README.md +69 -0
  583. package/optional-skills/mlops/saelens/references/api.md +333 -0
  584. package/optional-skills/mlops/saelens/references/tutorials.md +318 -0
  585. package/optional-skills/mlops/simpo/SKILL.md +223 -0
  586. package/optional-skills/mlops/simpo/references/datasets.md +478 -0
  587. package/optional-skills/mlops/simpo/references/hyperparameters.md +452 -0
  588. package/optional-skills/mlops/simpo/references/loss-functions.md +350 -0
  589. package/optional-skills/mlops/slime/SKILL.md +468 -0
  590. package/optional-skills/mlops/slime/references/api-reference.md +392 -0
  591. package/optional-skills/mlops/slime/references/troubleshooting.md +386 -0
  592. package/optional-skills/mlops/stable-diffusion/SKILL.md +523 -0
  593. package/optional-skills/mlops/stable-diffusion/references/advanced-usage.md +716 -0
  594. package/optional-skills/mlops/stable-diffusion/references/troubleshooting.md +555 -0
  595. package/optional-skills/mlops/tensorrt-llm/SKILL.md +191 -0
  596. package/optional-skills/mlops/tensorrt-llm/references/multi-gpu.md +298 -0
  597. package/optional-skills/mlops/tensorrt-llm/references/optimization.md +242 -0
  598. package/optional-skills/mlops/tensorrt-llm/references/serving.md +470 -0
  599. package/optional-skills/mlops/torchtitan/SKILL.md +362 -0
  600. package/optional-skills/mlops/torchtitan/references/checkpoint.md +181 -0
  601. package/optional-skills/mlops/torchtitan/references/custom-models.md +258 -0
  602. package/optional-skills/mlops/torchtitan/references/float8.md +133 -0
  603. package/optional-skills/mlops/torchtitan/references/fsdp.md +126 -0
  604. package/optional-skills/mlops/training/axolotl/SKILL.md +166 -0
  605. package/optional-skills/mlops/training/axolotl/references/api.md +5548 -0
  606. package/optional-skills/mlops/training/axolotl/references/dataset-formats.md +1029 -0
  607. package/optional-skills/mlops/training/axolotl/references/index.md +15 -0
  608. package/optional-skills/mlops/training/axolotl/references/other.md +3563 -0
  609. package/optional-skills/mlops/training/trl-fine-tuning/SKILL.md +463 -0
  610. package/optional-skills/mlops/training/trl-fine-tuning/references/dpo-variants.md +227 -0
  611. package/optional-skills/mlops/training/trl-fine-tuning/references/grpo-training.md +504 -0
  612. package/optional-skills/mlops/training/trl-fine-tuning/references/online-rl.md +82 -0
  613. package/optional-skills/mlops/training/trl-fine-tuning/references/reward-modeling.md +122 -0
  614. package/optional-skills/mlops/training/trl-fine-tuning/references/sft-training.md +168 -0
  615. package/optional-skills/mlops/training/trl-fine-tuning/templates/basic_grpo_training.py +228 -0
  616. package/optional-skills/mlops/training/unsloth/SKILL.md +84 -0
  617. package/optional-skills/mlops/training/unsloth/references/index.md +7 -0
  618. package/optional-skills/mlops/training/unsloth/references/llms-full.md +16799 -0
  619. package/optional-skills/mlops/training/unsloth/references/llms-txt.md +12044 -0
  620. package/optional-skills/mlops/training/unsloth/references/llms.md +82 -0
  621. package/optional-skills/mlops/whisper/SKILL.md +321 -0
  622. package/optional-skills/mlops/whisper/references/languages.md +189 -0
  623. package/optional-skills/productivity/canvas/SKILL.md +98 -0
  624. package/optional-skills/productivity/canvas/scripts/canvas_api.py +157 -0
  625. package/optional-skills/productivity/here-now/SKILL.md +217 -0
  626. package/optional-skills/productivity/here-now/scripts/drive.sh +406 -0
  627. package/optional-skills/productivity/here-now/scripts/publish.sh +445 -0
  628. package/optional-skills/productivity/memento-flashcards/SKILL.md +324 -0
  629. package/optional-skills/productivity/memento-flashcards/scripts/memento_cards.py +353 -0
  630. package/optional-skills/productivity/memento-flashcards/scripts/youtube_quiz.py +88 -0
  631. package/optional-skills/productivity/shop-app/SKILL.md +340 -0
  632. package/optional-skills/productivity/shopify/SKILL.md +373 -0
  633. package/optional-skills/productivity/siyuan/SKILL.md +298 -0
  634. package/optional-skills/productivity/telephony/SKILL.md +418 -0
  635. package/optional-skills/productivity/telephony/scripts/telephony.py +1343 -0
  636. package/optional-skills/research/bioinformatics/SKILL.md +235 -0
  637. package/optional-skills/research/darwinian-evolver/SKILL.md +199 -0
  638. package/optional-skills/research/darwinian-evolver/scripts/parrot_openrouter.py +218 -0
  639. package/optional-skills/research/darwinian-evolver/scripts/show_snapshot.py +69 -0
  640. package/optional-skills/research/darwinian-evolver/templates/custom_problem_template.py +240 -0
  641. package/optional-skills/research/domain-intel/SKILL.md +97 -0
  642. package/optional-skills/research/domain-intel/scripts/domain_intel.py +397 -0
  643. package/optional-skills/research/drug-discovery/SKILL.md +227 -0
  644. package/optional-skills/research/drug-discovery/references/ADMET_REFERENCE.md +66 -0
  645. package/optional-skills/research/drug-discovery/scripts/chembl_target.py +53 -0
  646. package/optional-skills/research/drug-discovery/scripts/ro5_screen.py +44 -0
  647. package/optional-skills/research/duckduckgo-search/SKILL.md +238 -0
  648. package/optional-skills/research/duckduckgo-search/scripts/duckduckgo.sh +28 -0
  649. package/optional-skills/research/gitnexus-explorer/SKILL.md +214 -0
  650. package/optional-skills/research/gitnexus-explorer/scripts/proxy.mjs +92 -0
  651. package/optional-skills/research/osint-investigation/SKILL.md +277 -0
  652. package/optional-skills/research/osint-investigation/references/sources/courtlistener.md +98 -0
  653. package/optional-skills/research/osint-investigation/references/sources/gdelt.md +104 -0
  654. package/optional-skills/research/osint-investigation/references/sources/icij-offshore.md +104 -0
  655. package/optional-skills/research/osint-investigation/references/sources/nyc-acris.md +90 -0
  656. package/optional-skills/research/osint-investigation/references/sources/ofac-sdn.md +92 -0
  657. package/optional-skills/research/osint-investigation/references/sources/opencorporates.md +103 -0
  658. package/optional-skills/research/osint-investigation/references/sources/sec-edgar.md +83 -0
  659. package/optional-skills/research/osint-investigation/references/sources/senate-ld.md +89 -0
  660. package/optional-skills/research/osint-investigation/references/sources/usaspending.md +97 -0
  661. package/optional-skills/research/osint-investigation/references/sources/wayback.md +93 -0
  662. package/optional-skills/research/osint-investigation/references/sources/wikipedia.md +107 -0
  663. package/optional-skills/research/osint-investigation/scripts/_http.py +82 -0
  664. package/optional-skills/research/osint-investigation/scripts/_normalize.py +67 -0
  665. package/optional-skills/research/osint-investigation/scripts/build_findings.py +221 -0
  666. package/optional-skills/research/osint-investigation/scripts/entity_resolution.py +228 -0
  667. package/optional-skills/research/osint-investigation/scripts/fetch_courtlistener.py +149 -0
  668. package/optional-skills/research/osint-investigation/scripts/fetch_gdelt.py +162 -0
  669. package/optional-skills/research/osint-investigation/scripts/fetch_icij_offshore.py +234 -0
  670. package/optional-skills/research/osint-investigation/scripts/fetch_nyc_acris.py +203 -0
  671. package/optional-skills/research/osint-investigation/scripts/fetch_ofac_sdn.py +175 -0
  672. package/optional-skills/research/osint-investigation/scripts/fetch_opencorporates.py +192 -0
  673. package/optional-skills/research/osint-investigation/scripts/fetch_sec_edgar.py +184 -0
  674. package/optional-skills/research/osint-investigation/scripts/fetch_senate_ld.py +146 -0
  675. package/optional-skills/research/osint-investigation/scripts/fetch_usaspending.py +170 -0
  676. package/optional-skills/research/osint-investigation/scripts/fetch_wayback.py +142 -0
  677. package/optional-skills/research/osint-investigation/scripts/fetch_wikipedia.py +267 -0
  678. package/optional-skills/research/osint-investigation/scripts/timing_analysis.py +253 -0
  679. package/optional-skills/research/osint-investigation/templates/source-template.md +59 -0
  680. package/optional-skills/research/parallel-cli/SKILL.md +391 -0
  681. package/optional-skills/research/qmd/SKILL.md +441 -0
  682. package/optional-skills/research/scrapling/SKILL.md +336 -0
  683. package/optional-skills/research/searxng-search/SKILL.md +212 -0
  684. package/optional-skills/research/searxng-search/scripts/searxng.sh +22 -0
  685. package/optional-skills/security/1password/SKILL.md +163 -0
  686. package/optional-skills/security/1password/references/cli-examples.md +31 -0
  687. package/optional-skills/security/1password/references/get-started.md +21 -0
  688. package/optional-skills/security/DESCRIPTION.md +3 -0
  689. package/optional-skills/security/oss-forensics/SKILL.md +423 -0
  690. package/optional-skills/security/oss-forensics/references/evidence-types.md +89 -0
  691. package/optional-skills/security/oss-forensics/references/github-archive-guide.md +184 -0
  692. package/optional-skills/security/oss-forensics/references/investigation-templates.md +131 -0
  693. package/optional-skills/security/oss-forensics/references/recovery-techniques.md +164 -0
  694. package/optional-skills/security/oss-forensics/scripts/evidence-store.py +313 -0
  695. package/optional-skills/security/oss-forensics/templates/forensic-report.md +151 -0
  696. package/optional-skills/security/oss-forensics/templates/malicious-package-report.md +43 -0
  697. package/optional-skills/security/sherlock/SKILL.md +193 -0
  698. package/optional-skills/software-development/rest-graphql-debug/SKILL.md +514 -0
  699. package/optional-skills/web-development/DESCRIPTION.md +5 -0
  700. package/optional-skills/web-development/page-agent/SKILL.md +190 -0
  701. package/package.json +78 -0
  702. package/plugins/__init__.py +1 -0
  703. package/plugins/__pycache__/__init__.cpython-312.pyc +0 -0
  704. package/plugins/context_engine/__init__.py +219 -0
  705. package/plugins/disk-cleanup/README.md +51 -0
  706. package/plugins/disk-cleanup/__init__.py +316 -0
  707. package/plugins/disk-cleanup/disk_cleanup.py +497 -0
  708. package/plugins/disk-cleanup/plugin.yaml +7 -0
  709. package/plugins/example-dashboard/dashboard/manifest.json +14 -0
  710. package/plugins/example-dashboard/dashboard/plugin_api.py +17 -0
  711. package/plugins/google_meet/README.md +131 -0
  712. package/plugins/google_meet/SKILL.md +148 -0
  713. package/plugins/google_meet/__init__.py +103 -0
  714. package/plugins/google_meet/audio_bridge.py +244 -0
  715. package/plugins/google_meet/cli.py +479 -0
  716. package/plugins/google_meet/meet_bot.py +852 -0
  717. package/plugins/google_meet/node/__init__.py +54 -0
  718. package/plugins/google_meet/node/cli.py +125 -0
  719. package/plugins/google_meet/node/client.py +107 -0
  720. package/plugins/google_meet/node/protocol.py +124 -0
  721. package/plugins/google_meet/node/registry.py +113 -0
  722. package/plugins/google_meet/node/server.py +201 -0
  723. package/plugins/google_meet/plugin.yaml +16 -0
  724. package/plugins/google_meet/process_manager.py +324 -0
  725. package/plugins/google_meet/realtime/__init__.py +10 -0
  726. package/plugins/google_meet/realtime/openai_client.py +332 -0
  727. package/plugins/google_meet/tools.py +348 -0
  728. package/plugins/hermes-achievements/LICENSE +21 -0
  729. package/plugins/hermes-achievements/README.md +150 -0
  730. package/plugins/hermes-achievements/dashboard/dist/index.js +732 -0
  731. package/plugins/hermes-achievements/dashboard/dist/style.css +146 -0
  732. package/plugins/hermes-achievements/dashboard/manifest.json +11 -0
  733. package/plugins/hermes-achievements/dashboard/plugin_api.py +1062 -0
  734. package/plugins/hermes-achievements/docs/achievements-performance-implementation-plan.md +157 -0
  735. package/plugins/hermes-achievements/docs/achievements-performance-implementation-spec.md +219 -0
  736. package/plugins/hermes-achievements/docs/achievements-performance-spec.md +174 -0
  737. package/plugins/hermes-achievements/docs/assets/achievements-dashboard-hd.png +0 -0
  738. package/plugins/hermes-achievements/docs/assets/achievements-tier-showcase-hd.png +0 -0
  739. package/plugins/hermes-achievements/tests/test_achievement_engine.py +156 -0
  740. package/plugins/image_gen/openai/__init__.py +303 -0
  741. package/plugins/image_gen/openai/__pycache__/__init__.cpython-312.pyc +0 -0
  742. package/plugins/image_gen/openai/plugin.yaml +7 -0
  743. package/plugins/image_gen/openai-codex/__init__.py +378 -0
  744. package/plugins/image_gen/openai-codex/__pycache__/__init__.cpython-312.pyc +0 -0
  745. package/plugins/image_gen/openai-codex/plugin.yaml +5 -0
  746. package/plugins/image_gen/xai/__init__.py +316 -0
  747. package/plugins/image_gen/xai/__pycache__/__init__.cpython-312.pyc +0 -0
  748. package/plugins/image_gen/xai/plugin.yaml +7 -0
  749. package/plugins/kanban/dashboard/dist/index.js +3143 -0
  750. package/plugins/kanban/dashboard/dist/style.css +1500 -0
  751. package/plugins/kanban/dashboard/manifest.json +14 -0
  752. package/plugins/kanban/dashboard/plugin_api.py +1612 -0
  753. package/plugins/kanban/systemd/hermes-kanban-dispatcher.service +32 -0
  754. package/plugins/memory/__init__.py +408 -0
  755. package/plugins/memory/byterover/README.md +41 -0
  756. package/plugins/memory/byterover/__init__.py +384 -0
  757. package/plugins/memory/byterover/plugin.yaml +9 -0
  758. package/plugins/memory/hindsight/README.md +138 -0
  759. package/plugins/memory/hindsight/__init__.py +1758 -0
  760. package/plugins/memory/hindsight/plugin.yaml +8 -0
  761. package/plugins/memory/holographic/README.md +36 -0
  762. package/plugins/memory/holographic/__init__.py +409 -0
  763. package/plugins/memory/holographic/holographic.py +203 -0
  764. package/plugins/memory/holographic/plugin.yaml +5 -0
  765. package/plugins/memory/holographic/retrieval.py +593 -0
  766. package/plugins/memory/holographic/store.py +579 -0
  767. package/plugins/memory/honcho/README.md +328 -0
  768. package/plugins/memory/honcho/__init__.py +1329 -0
  769. package/plugins/memory/honcho/cli.py +1452 -0
  770. package/plugins/memory/honcho/client.py +784 -0
  771. package/plugins/memory/honcho/plugin.yaml +7 -0
  772. package/plugins/memory/honcho/session.py +1255 -0
  773. package/plugins/memory/mem0/README.md +38 -0
  774. package/plugins/memory/mem0/__init__.py +374 -0
  775. package/plugins/memory/mem0/plugin.yaml +5 -0
  776. package/plugins/memory/openviking/README.md +40 -0
  777. package/plugins/memory/openviking/__init__.py +945 -0
  778. package/plugins/memory/openviking/plugin.yaml +9 -0
  779. package/plugins/memory/retaindb/README.md +40 -0
  780. package/plugins/memory/retaindb/__init__.py +767 -0
  781. package/plugins/memory/retaindb/plugin.yaml +7 -0
  782. package/plugins/memory/supermemory/README.md +99 -0
  783. package/plugins/memory/supermemory/__init__.py +792 -0
  784. package/plugins/memory/supermemory/plugin.yaml +5 -0
  785. package/plugins/model-providers/README.md +70 -0
  786. package/plugins/model-providers/ai-gateway/__init__.py +43 -0
  787. package/plugins/model-providers/ai-gateway/__pycache__/__init__.cpython-312.pyc +0 -0
  788. package/plugins/model-providers/ai-gateway/plugin.yaml +5 -0
  789. package/plugins/model-providers/alibaba/__init__.py +13 -0
  790. package/plugins/model-providers/alibaba/__pycache__/__init__.cpython-312.pyc +0 -0
  791. package/plugins/model-providers/alibaba/plugin.yaml +5 -0
  792. package/plugins/model-providers/alibaba-coding-plan/__init__.py +21 -0
  793. package/plugins/model-providers/alibaba-coding-plan/__pycache__/__init__.cpython-312.pyc +0 -0
  794. package/plugins/model-providers/alibaba-coding-plan/plugin.yaml +5 -0
  795. package/plugins/model-providers/anthropic/__init__.py +52 -0
  796. package/plugins/model-providers/anthropic/__pycache__/__init__.cpython-312.pyc +0 -0
  797. package/plugins/model-providers/anthropic/plugin.yaml +5 -0
  798. package/plugins/model-providers/arcee/__init__.py +13 -0
  799. package/plugins/model-providers/arcee/__pycache__/__init__.cpython-312.pyc +0 -0
  800. package/plugins/model-providers/arcee/plugin.yaml +5 -0
  801. package/plugins/model-providers/azure-foundry/__init__.py +21 -0
  802. package/plugins/model-providers/azure-foundry/__pycache__/__init__.cpython-312.pyc +0 -0
  803. package/plugins/model-providers/azure-foundry/plugin.yaml +5 -0
  804. package/plugins/model-providers/bedrock/__init__.py +29 -0
  805. package/plugins/model-providers/bedrock/__pycache__/__init__.cpython-312.pyc +0 -0
  806. package/plugins/model-providers/bedrock/plugin.yaml +5 -0
  807. package/plugins/model-providers/copilot/__init__.py +58 -0
  808. package/plugins/model-providers/copilot/__pycache__/__init__.cpython-312.pyc +0 -0
  809. package/plugins/model-providers/copilot/plugin.yaml +5 -0
  810. package/plugins/model-providers/copilot-acp/__init__.py +34 -0
  811. package/plugins/model-providers/copilot-acp/__pycache__/__init__.cpython-312.pyc +0 -0
  812. package/plugins/model-providers/copilot-acp/plugin.yaml +5 -0
  813. package/plugins/model-providers/custom/__init__.py +68 -0
  814. package/plugins/model-providers/custom/__pycache__/__init__.cpython-312.pyc +0 -0
  815. package/plugins/model-providers/custom/plugin.yaml +5 -0
  816. package/plugins/model-providers/deepseek/__init__.py +99 -0
  817. package/plugins/model-providers/deepseek/__pycache__/__init__.cpython-312.pyc +0 -0
  818. package/plugins/model-providers/deepseek/plugin.yaml +5 -0
  819. package/plugins/model-providers/gemini/__init__.py +72 -0
  820. package/plugins/model-providers/gemini/__pycache__/__init__.cpython-312.pyc +0 -0
  821. package/plugins/model-providers/gemini/plugin.yaml +5 -0
  822. package/plugins/model-providers/gmi/__init__.py +31 -0
  823. package/plugins/model-providers/gmi/__pycache__/__init__.cpython-312.pyc +0 -0
  824. package/plugins/model-providers/gmi/plugin.yaml +5 -0
  825. package/plugins/model-providers/huggingface/__init__.py +20 -0
  826. package/plugins/model-providers/huggingface/__pycache__/__init__.cpython-312.pyc +0 -0
  827. package/plugins/model-providers/huggingface/plugin.yaml +5 -0
  828. package/plugins/model-providers/kilocode/__init__.py +14 -0
  829. package/plugins/model-providers/kilocode/__pycache__/__init__.cpython-312.pyc +0 -0
  830. package/plugins/model-providers/kilocode/plugin.yaml +5 -0
  831. package/plugins/model-providers/kimi-coding/__init__.py +71 -0
  832. package/plugins/model-providers/kimi-coding/__pycache__/__init__.cpython-312.pyc +0 -0
  833. package/plugins/model-providers/kimi-coding/plugin.yaml +5 -0
  834. package/plugins/model-providers/minimax/__init__.py +45 -0
  835. package/plugins/model-providers/minimax/__pycache__/__init__.cpython-312.pyc +0 -0
  836. package/plugins/model-providers/minimax/plugin.yaml +5 -0
  837. package/plugins/model-providers/nous/__init__.py +54 -0
  838. package/plugins/model-providers/nous/__pycache__/__init__.cpython-312.pyc +0 -0
  839. package/plugins/model-providers/nous/plugin.yaml +5 -0
  840. package/plugins/model-providers/novita/__init__.py +27 -0
  841. package/plugins/model-providers/novita/__pycache__/__init__.cpython-312.pyc +0 -0
  842. package/plugins/model-providers/novita/plugin.yaml +5 -0
  843. package/plugins/model-providers/nvidia/__init__.py +21 -0
  844. package/plugins/model-providers/nvidia/__pycache__/__init__.cpython-312.pyc +0 -0
  845. package/plugins/model-providers/nvidia/plugin.yaml +5 -0
  846. package/plugins/model-providers/ollama-cloud/__init__.py +14 -0
  847. package/plugins/model-providers/ollama-cloud/__pycache__/__init__.cpython-312.pyc +0 -0
  848. package/plugins/model-providers/ollama-cloud/plugin.yaml +5 -0
  849. package/plugins/model-providers/openai-codex/__init__.py +15 -0
  850. package/plugins/model-providers/openai-codex/__pycache__/__init__.cpython-312.pyc +0 -0
  851. package/plugins/model-providers/openai-codex/plugin.yaml +5 -0
  852. package/plugins/model-providers/opencode-zen/__init__.py +30 -0
  853. package/plugins/model-providers/opencode-zen/__pycache__/__init__.cpython-312.pyc +0 -0
  854. package/plugins/model-providers/opencode-zen/plugin.yaml +5 -0
  855. package/plugins/model-providers/openrouter/__init__.py +115 -0
  856. package/plugins/model-providers/openrouter/__pycache__/__init__.cpython-312.pyc +0 -0
  857. package/plugins/model-providers/openrouter/plugin.yaml +5 -0
  858. package/plugins/model-providers/qwen-oauth/__init__.py +82 -0
  859. package/plugins/model-providers/qwen-oauth/__pycache__/__init__.cpython-312.pyc +0 -0
  860. package/plugins/model-providers/qwen-oauth/plugin.yaml +5 -0
  861. package/plugins/model-providers/stepfun/__init__.py +14 -0
  862. package/plugins/model-providers/stepfun/__pycache__/__init__.cpython-312.pyc +0 -0
  863. package/plugins/model-providers/stepfun/plugin.yaml +5 -0
  864. package/plugins/model-providers/xai/__init__.py +15 -0
  865. package/plugins/model-providers/xai/__pycache__/__init__.cpython-312.pyc +0 -0
  866. package/plugins/model-providers/xai/plugin.yaml +5 -0
  867. package/plugins/model-providers/xiaomi/__init__.py +14 -0
  868. package/plugins/model-providers/xiaomi/__pycache__/__init__.cpython-312.pyc +0 -0
  869. package/plugins/model-providers/xiaomi/plugin.yaml +5 -0
  870. package/plugins/model-providers/zai/__init__.py +21 -0
  871. package/plugins/model-providers/zai/__pycache__/__init__.cpython-312.pyc +0 -0
  872. package/plugins/model-providers/zai/plugin.yaml +5 -0
  873. package/plugins/observability/langfuse/README.md +53 -0
  874. package/plugins/observability/langfuse/__init__.py +1004 -0
  875. package/plugins/observability/langfuse/plugin.yaml +14 -0
  876. package/plugins/platforms/google_chat/__init__.py +3 -0
  877. package/plugins/platforms/google_chat/__pycache__/__init__.cpython-312.pyc +0 -0
  878. package/plugins/platforms/google_chat/__pycache__/adapter.cpython-312.pyc +0 -0
  879. package/plugins/platforms/google_chat/adapter.py +3343 -0
  880. package/plugins/platforms/google_chat/oauth.py +639 -0
  881. package/plugins/platforms/google_chat/plugin.yaml +39 -0
  882. package/plugins/platforms/irc/__init__.py +3 -0
  883. package/plugins/platforms/irc/__pycache__/__init__.cpython-312.pyc +0 -0
  884. package/plugins/platforms/irc/__pycache__/adapter.cpython-312.pyc +0 -0
  885. package/plugins/platforms/irc/adapter.py +969 -0
  886. package/plugins/platforms/irc/plugin.yaml +54 -0
  887. package/plugins/platforms/line/__init__.py +3 -0
  888. package/plugins/platforms/line/__pycache__/__init__.cpython-312.pyc +0 -0
  889. package/plugins/platforms/line/__pycache__/adapter.cpython-312.pyc +0 -0
  890. package/plugins/platforms/line/adapter.py +1639 -0
  891. package/plugins/platforms/line/plugin.yaml +65 -0
  892. package/plugins/platforms/simplex/__init__.py +3 -0
  893. package/plugins/platforms/simplex/__pycache__/__init__.cpython-312.pyc +0 -0
  894. package/plugins/platforms/simplex/__pycache__/adapter.cpython-312.pyc +0 -0
  895. package/plugins/platforms/simplex/adapter.py +746 -0
  896. package/plugins/platforms/simplex/plugin.yaml +37 -0
  897. package/plugins/platforms/teams/__init__.py +3 -0
  898. package/plugins/platforms/teams/__pycache__/__init__.cpython-312.pyc +0 -0
  899. package/plugins/platforms/teams/__pycache__/adapter.cpython-312.pyc +0 -0
  900. package/plugins/platforms/teams/adapter.py +1188 -0
  901. package/plugins/platforms/teams/plugin.yaml +48 -0
  902. package/plugins/spotify/__init__.py +66 -0
  903. package/plugins/spotify/__pycache__/__init__.cpython-312.pyc +0 -0
  904. package/plugins/spotify/__pycache__/client.cpython-312.pyc +0 -0
  905. package/plugins/spotify/__pycache__/tools.cpython-312.pyc +0 -0
  906. package/plugins/spotify/client.py +435 -0
  907. package/plugins/spotify/plugin.yaml +13 -0
  908. package/plugins/spotify/tools.py +454 -0
  909. package/plugins/teams_pipeline/__init__.py +23 -0
  910. package/plugins/teams_pipeline/cli.py +463 -0
  911. package/plugins/teams_pipeline/meetings.py +333 -0
  912. package/plugins/teams_pipeline/models.py +350 -0
  913. package/plugins/teams_pipeline/pipeline.py +692 -0
  914. package/plugins/teams_pipeline/plugin.yaml +9 -0
  915. package/plugins/teams_pipeline/runtime.py +135 -0
  916. package/plugins/teams_pipeline/store.py +194 -0
  917. package/plugins/teams_pipeline/subscriptions.py +249 -0
  918. package/plugins/video_gen/fal/__init__.py +523 -0
  919. package/plugins/video_gen/fal/__pycache__/__init__.cpython-312.pyc +0 -0
  920. package/plugins/video_gen/fal/plugin.yaml +7 -0
  921. package/plugins/video_gen/xai/__init__.py +441 -0
  922. package/plugins/video_gen/xai/__pycache__/__init__.cpython-312.pyc +0 -0
  923. package/plugins/video_gen/xai/plugin.yaml +7 -0
  924. package/plugins/web/__init__.py +7 -0
  925. package/plugins/web/__pycache__/__init__.cpython-312.pyc +0 -0
  926. package/plugins/web/brave_free/__init__.py +14 -0
  927. package/plugins/web/brave_free/__pycache__/__init__.cpython-312.pyc +0 -0
  928. package/plugins/web/brave_free/__pycache__/provider.cpython-312.pyc +0 -0
  929. package/plugins/web/brave_free/plugin.yaml +7 -0
  930. package/plugins/web/brave_free/provider.py +137 -0
  931. package/plugins/web/ddgs/__init__.py +15 -0
  932. package/plugins/web/ddgs/__pycache__/__init__.cpython-312.pyc +0 -0
  933. package/plugins/web/ddgs/__pycache__/provider.cpython-312.pyc +0 -0
  934. package/plugins/web/ddgs/plugin.yaml +7 -0
  935. package/plugins/web/ddgs/provider.py +104 -0
  936. package/plugins/web/exa/__init__.py +15 -0
  937. package/plugins/web/exa/__pycache__/__init__.cpython-312.pyc +0 -0
  938. package/plugins/web/exa/__pycache__/provider.cpython-312.pyc +0 -0
  939. package/plugins/web/exa/plugin.yaml +7 -0
  940. package/plugins/web/exa/provider.py +212 -0
  941. package/plugins/web/firecrawl/__init__.py +28 -0
  942. package/plugins/web/firecrawl/__pycache__/__init__.cpython-312.pyc +0 -0
  943. package/plugins/web/firecrawl/__pycache__/provider.cpython-312.pyc +0 -0
  944. package/plugins/web/firecrawl/plugin.yaml +7 -0
  945. package/plugins/web/firecrawl/provider.py +773 -0
  946. package/plugins/web/parallel/__init__.py +16 -0
  947. package/plugins/web/parallel/__pycache__/__init__.cpython-312.pyc +0 -0
  948. package/plugins/web/parallel/__pycache__/provider.cpython-312.pyc +0 -0
  949. package/plugins/web/parallel/plugin.yaml +7 -0
  950. package/plugins/web/parallel/provider.py +291 -0
  951. package/plugins/web/searxng/__init__.py +15 -0
  952. package/plugins/web/searxng/__pycache__/__init__.cpython-312.pyc +0 -0
  953. package/plugins/web/searxng/__pycache__/provider.cpython-312.pyc +0 -0
  954. package/plugins/web/searxng/plugin.yaml +7 -0
  955. package/plugins/web/searxng/provider.py +140 -0
  956. package/plugins/web/tavily/__init__.py +15 -0
  957. package/plugins/web/tavily/__pycache__/__init__.cpython-312.pyc +0 -0
  958. package/plugins/web/tavily/__pycache__/provider.cpython-312.pyc +0 -0
  959. package/plugins/web/tavily/plugin.yaml +7 -0
  960. package/plugins/web/tavily/provider.py +285 -0
  961. package/providers/README.md +78 -0
  962. package/providers/__init__.py +192 -0
  963. package/providers/__pycache__/__init__.cpython-312.pyc +0 -0
  964. package/providers/__pycache__/base.cpython-312.pyc +0 -0
  965. package/providers/base.py +184 -0
  966. package/pyproject.toml +255 -0
  967. package/run_agent.py +16409 -0
  968. package/scripts/benchmark_browser_eval.py +138 -0
  969. package/scripts/build_model_catalog.py +95 -0
  970. package/scripts/build_skills_index.py +325 -0
  971. package/scripts/check-windows-footguns.py +624 -0
  972. package/scripts/contributor_audit.py +473 -0
  973. package/scripts/discord-voice-doctor.py +396 -0
  974. package/scripts/hermes-gateway +416 -0
  975. package/scripts/install.cmd +28 -0
  976. package/scripts/install.ps1 +1611 -0
  977. package/scripts/install.sh +2007 -0
  978. package/scripts/install_psutil_android.py +117 -0
  979. package/scripts/keystroke_diagnostic.py +81 -0
  980. package/scripts/kill_modal.sh +34 -0
  981. package/scripts/lib/node-bootstrap.sh +238 -0
  982. package/scripts/lint_diff.py +207 -0
  983. package/scripts/postinstall.js +150 -0
  984. package/scripts/profile-tui.py +626 -0
  985. package/scripts/release.py +1680 -0
  986. package/scripts/run_tests.sh +129 -0
  987. package/scripts/sample_and_compress.py +409 -0
  988. package/scripts/setup_open_webui.sh +349 -0
  989. package/scripts/whatsapp-bridge/allowlist.js +88 -0
  990. package/scripts/whatsapp-bridge/allowlist.test.mjs +80 -0
  991. package/scripts/whatsapp-bridge/bridge.js +729 -0
  992. package/scripts/whatsapp-bridge/package-lock.json +2141 -0
  993. package/scripts/whatsapp-bridge/package.json +19 -0
  994. package/skills/apple/DESCRIPTION.md +2 -0
  995. package/skills/apple/apple-notes/SKILL.md +90 -0
  996. package/skills/apple/apple-reminders/SKILL.md +98 -0
  997. package/skills/apple/findmy/SKILL.md +131 -0
  998. package/skills/apple/imessage/SKILL.md +102 -0
  999. package/skills/apple/macos-computer-use/SKILL.md +201 -0
  1000. package/skills/autonomous-ai-agents/DESCRIPTION.md +3 -0
  1001. package/skills/autonomous-ai-agents/claude-code/SKILL.md +745 -0
  1002. package/skills/autonomous-ai-agents/codex/SKILL.md +130 -0
  1003. package/skills/autonomous-ai-agents/hermes-agent/SKILL.md +1014 -0
  1004. package/skills/autonomous-ai-agents/opencode/SKILL.md +219 -0
  1005. package/skills/creative/DESCRIPTION.md +3 -0
  1006. package/skills/creative/architecture-diagram/SKILL.md +148 -0
  1007. package/skills/creative/architecture-diagram/templates/template.html +319 -0
  1008. package/skills/creative/ascii-art/SKILL.md +322 -0
  1009. package/skills/creative/ascii-video/README.md +290 -0
  1010. package/skills/creative/ascii-video/SKILL.md +241 -0
  1011. package/skills/creative/ascii-video/references/architecture.md +802 -0
  1012. package/skills/creative/ascii-video/references/composition.md +892 -0
  1013. package/skills/creative/ascii-video/references/effects.md +1865 -0
  1014. package/skills/creative/ascii-video/references/inputs.md +685 -0
  1015. package/skills/creative/ascii-video/references/optimization.md +688 -0
  1016. package/skills/creative/ascii-video/references/scenes.md +1011 -0
  1017. package/skills/creative/ascii-video/references/shaders.md +1385 -0
  1018. package/skills/creative/ascii-video/references/troubleshooting.md +367 -0
  1019. package/skills/creative/baoyu-comic/PORT_NOTES.md +77 -0
  1020. package/skills/creative/baoyu-comic/SKILL.md +247 -0
  1021. package/skills/creative/baoyu-comic/references/analysis-framework.md +176 -0
  1022. package/skills/creative/baoyu-comic/references/art-styles/chalk.md +101 -0
  1023. package/skills/creative/baoyu-comic/references/art-styles/ink-brush.md +97 -0
  1024. package/skills/creative/baoyu-comic/references/art-styles/ligne-claire.md +75 -0
  1025. package/skills/creative/baoyu-comic/references/art-styles/manga.md +93 -0
  1026. package/skills/creative/baoyu-comic/references/art-styles/minimalist.md +84 -0
  1027. package/skills/creative/baoyu-comic/references/art-styles/realistic.md +89 -0
  1028. package/skills/creative/baoyu-comic/references/auto-selection.md +71 -0
  1029. package/skills/creative/baoyu-comic/references/base-prompt.md +98 -0
  1030. package/skills/creative/baoyu-comic/references/character-template.md +180 -0
  1031. package/skills/creative/baoyu-comic/references/layouts/cinematic.md +23 -0
  1032. package/skills/creative/baoyu-comic/references/layouts/dense.md +23 -0
  1033. package/skills/creative/baoyu-comic/references/layouts/four-panel.md +40 -0
  1034. package/skills/creative/baoyu-comic/references/layouts/mixed.md +23 -0
  1035. package/skills/creative/baoyu-comic/references/layouts/splash.md +23 -0
  1036. package/skills/creative/baoyu-comic/references/layouts/standard.md +23 -0
  1037. package/skills/creative/baoyu-comic/references/layouts/webtoon.md +30 -0
  1038. package/skills/creative/baoyu-comic/references/ohmsha-guide.md +85 -0
  1039. package/skills/creative/baoyu-comic/references/partial-workflows.md +106 -0
  1040. package/skills/creative/baoyu-comic/references/presets/concept-story.md +121 -0
  1041. package/skills/creative/baoyu-comic/references/presets/four-panel.md +107 -0
  1042. package/skills/creative/baoyu-comic/references/presets/ohmsha.md +114 -0
  1043. package/skills/creative/baoyu-comic/references/presets/shoujo.md +116 -0
  1044. package/skills/creative/baoyu-comic/references/presets/wuxia.md +110 -0
  1045. package/skills/creative/baoyu-comic/references/storyboard-template.md +143 -0
  1046. package/skills/creative/baoyu-comic/references/tones/action.md +110 -0
  1047. package/skills/creative/baoyu-comic/references/tones/dramatic.md +95 -0
  1048. package/skills/creative/baoyu-comic/references/tones/energetic.md +105 -0
  1049. package/skills/creative/baoyu-comic/references/tones/neutral.md +63 -0
  1050. package/skills/creative/baoyu-comic/references/tones/romantic.md +100 -0
  1051. package/skills/creative/baoyu-comic/references/tones/vintage.md +104 -0
  1052. package/skills/creative/baoyu-comic/references/tones/warm.md +94 -0
  1053. package/skills/creative/baoyu-comic/references/workflow.md +401 -0
  1054. package/skills/creative/baoyu-infographic/PORT_NOTES.md +43 -0
  1055. package/skills/creative/baoyu-infographic/SKILL.md +237 -0
  1056. package/skills/creative/baoyu-infographic/references/analysis-framework.md +182 -0
  1057. package/skills/creative/baoyu-infographic/references/base-prompt.md +43 -0
  1058. package/skills/creative/baoyu-infographic/references/layouts/bento-grid.md +41 -0
  1059. package/skills/creative/baoyu-infographic/references/layouts/binary-comparison.md +48 -0
  1060. package/skills/creative/baoyu-infographic/references/layouts/bridge.md +41 -0
  1061. package/skills/creative/baoyu-infographic/references/layouts/circular-flow.md +41 -0
  1062. package/skills/creative/baoyu-infographic/references/layouts/comic-strip.md +41 -0
  1063. package/skills/creative/baoyu-infographic/references/layouts/comparison-matrix.md +41 -0
  1064. package/skills/creative/baoyu-infographic/references/layouts/dashboard.md +41 -0
  1065. package/skills/creative/baoyu-infographic/references/layouts/dense-modules.md +72 -0
  1066. package/skills/creative/baoyu-infographic/references/layouts/funnel.md +41 -0
  1067. package/skills/creative/baoyu-infographic/references/layouts/hierarchical-layers.md +48 -0
  1068. package/skills/creative/baoyu-infographic/references/layouts/hub-spoke.md +41 -0
  1069. package/skills/creative/baoyu-infographic/references/layouts/iceberg.md +41 -0
  1070. package/skills/creative/baoyu-infographic/references/layouts/isometric-map.md +41 -0
  1071. package/skills/creative/baoyu-infographic/references/layouts/jigsaw.md +41 -0
  1072. package/skills/creative/baoyu-infographic/references/layouts/linear-progression.md +48 -0
  1073. package/skills/creative/baoyu-infographic/references/layouts/periodic-table.md +41 -0
  1074. package/skills/creative/baoyu-infographic/references/layouts/story-mountain.md +41 -0
  1075. package/skills/creative/baoyu-infographic/references/layouts/structural-breakdown.md +48 -0
  1076. package/skills/creative/baoyu-infographic/references/layouts/tree-branching.md +41 -0
  1077. package/skills/creative/baoyu-infographic/references/layouts/venn-diagram.md +41 -0
  1078. package/skills/creative/baoyu-infographic/references/layouts/winding-roadmap.md +41 -0
  1079. package/skills/creative/baoyu-infographic/references/structured-content-template.md +244 -0
  1080. package/skills/creative/baoyu-infographic/references/styles/aged-academia.md +36 -0
  1081. package/skills/creative/baoyu-infographic/references/styles/bold-graphic.md +36 -0
  1082. package/skills/creative/baoyu-infographic/references/styles/chalkboard.md +61 -0
  1083. package/skills/creative/baoyu-infographic/references/styles/claymation.md +29 -0
  1084. package/skills/creative/baoyu-infographic/references/styles/corporate-memphis.md +29 -0
  1085. package/skills/creative/baoyu-infographic/references/styles/craft-handmade.md +44 -0
  1086. package/skills/creative/baoyu-infographic/references/styles/cyberpunk-neon.md +29 -0
  1087. package/skills/creative/baoyu-infographic/references/styles/hand-drawn-edu.md +63 -0
  1088. package/skills/creative/baoyu-infographic/references/styles/ikea-manual.md +29 -0
  1089. package/skills/creative/baoyu-infographic/references/styles/kawaii.md +29 -0
  1090. package/skills/creative/baoyu-infographic/references/styles/knolling.md +29 -0
  1091. package/skills/creative/baoyu-infographic/references/styles/lego-brick.md +29 -0
  1092. package/skills/creative/baoyu-infographic/references/styles/morandi-journal.md +60 -0
  1093. package/skills/creative/baoyu-infographic/references/styles/origami.md +29 -0
  1094. package/skills/creative/baoyu-infographic/references/styles/pixel-art.md +29 -0
  1095. package/skills/creative/baoyu-infographic/references/styles/pop-laboratory.md +48 -0
  1096. package/skills/creative/baoyu-infographic/references/styles/retro-pop-grid.md +47 -0
  1097. package/skills/creative/baoyu-infographic/references/styles/storybook-watercolor.md +29 -0
  1098. package/skills/creative/baoyu-infographic/references/styles/subway-map.md +29 -0
  1099. package/skills/creative/baoyu-infographic/references/styles/technical-schematic.md +36 -0
  1100. package/skills/creative/baoyu-infographic/references/styles/ui-wireframe.md +29 -0
  1101. package/skills/creative/claude-design/SKILL.md +591 -0
  1102. package/skills/creative/comfyui/SKILL.md +612 -0
  1103. package/skills/creative/comfyui/references/official-cli.md +255 -0
  1104. package/skills/creative/comfyui/references/rest-api.md +312 -0
  1105. package/skills/creative/comfyui/references/template-integrity.md +243 -0
  1106. package/skills/creative/comfyui/references/workflow-format.md +226 -0
  1107. package/skills/creative/comfyui/scripts/_common.py +835 -0
  1108. package/skills/creative/comfyui/scripts/auto_fix_deps.py +225 -0
  1109. package/skills/creative/comfyui/scripts/check_deps.py +437 -0
  1110. package/skills/creative/comfyui/scripts/comfyui_setup.sh +286 -0
  1111. package/skills/creative/comfyui/scripts/extract_schema.py +315 -0
  1112. package/skills/creative/comfyui/scripts/fetch_logs.py +158 -0
  1113. package/skills/creative/comfyui/scripts/hardware_check.py +497 -0
  1114. package/skills/creative/comfyui/scripts/health_check.py +223 -0
  1115. package/skills/creative/comfyui/scripts/run_batch.py +243 -0
  1116. package/skills/creative/comfyui/scripts/run_workflow.py +796 -0
  1117. package/skills/creative/comfyui/scripts/ws_monitor.py +267 -0
  1118. package/skills/creative/comfyui/tests/README.md +50 -0
  1119. package/skills/creative/comfyui/tests/conftest.py +64 -0
  1120. package/skills/creative/comfyui/tests/pytest.ini +5 -0
  1121. package/skills/creative/comfyui/tests/test_check_deps.py +68 -0
  1122. package/skills/creative/comfyui/tests/test_cloud_integration.py +95 -0
  1123. package/skills/creative/comfyui/tests/test_common.py +447 -0
  1124. package/skills/creative/comfyui/tests/test_extract_schema.py +185 -0
  1125. package/skills/creative/comfyui/tests/test_run_workflow.py +213 -0
  1126. package/skills/creative/comfyui/workflows/README.md +86 -0
  1127. package/skills/creative/comfyui/workflows/animatediff_video.json +64 -0
  1128. package/skills/creative/comfyui/workflows/flux_dev_txt2img.json +78 -0
  1129. package/skills/creative/comfyui/workflows/sd15_txt2img.json +49 -0
  1130. package/skills/creative/comfyui/workflows/sdxl_img2img.json +54 -0
  1131. package/skills/creative/comfyui/workflows/sdxl_inpaint.json +59 -0
  1132. package/skills/creative/comfyui/workflows/sdxl_txt2img.json +49 -0
  1133. package/skills/creative/comfyui/workflows/upscale_4x.json +27 -0
  1134. package/skills/creative/comfyui/workflows/wan_video_t2v.json +69 -0
  1135. package/skills/creative/creative-ideation/SKILL.md +152 -0
  1136. package/skills/creative/creative-ideation/references/full-prompt-library.md +110 -0
  1137. package/skills/creative/design-md/SKILL.md +199 -0
  1138. package/skills/creative/design-md/templates/starter.md +99 -0
  1139. package/skills/creative/excalidraw/SKILL.md +199 -0
  1140. package/skills/creative/excalidraw/references/colors.md +44 -0
  1141. package/skills/creative/excalidraw/references/dark-mode.md +68 -0
  1142. package/skills/creative/excalidraw/references/examples.md +141 -0
  1143. package/skills/creative/excalidraw/scripts/upload.py +133 -0
  1144. package/skills/creative/humanizer/LICENSE +21 -0
  1145. package/skills/creative/humanizer/SKILL.md +578 -0
  1146. package/skills/creative/manim-video/README.md +23 -0
  1147. package/skills/creative/manim-video/SKILL.md +269 -0
  1148. package/skills/creative/manim-video/references/animation-design-thinking.md +161 -0
  1149. package/skills/creative/manim-video/references/animations.md +282 -0
  1150. package/skills/creative/manim-video/references/camera-and-3d.md +135 -0
  1151. package/skills/creative/manim-video/references/decorations.md +202 -0
  1152. package/skills/creative/manim-video/references/equations.md +216 -0
  1153. package/skills/creative/manim-video/references/graphs-and-data.md +163 -0
  1154. package/skills/creative/manim-video/references/mobjects.md +333 -0
  1155. package/skills/creative/manim-video/references/paper-explainer.md +255 -0
  1156. package/skills/creative/manim-video/references/production-quality.md +190 -0
  1157. package/skills/creative/manim-video/references/rendering.md +185 -0
  1158. package/skills/creative/manim-video/references/scene-planning.md +118 -0
  1159. package/skills/creative/manim-video/references/troubleshooting.md +135 -0
  1160. package/skills/creative/manim-video/references/updaters-and-trackers.md +260 -0
  1161. package/skills/creative/manim-video/references/visual-design.md +124 -0
  1162. package/skills/creative/manim-video/scripts/setup.sh +14 -0
  1163. package/skills/creative/p5js/README.md +64 -0
  1164. package/skills/creative/p5js/SKILL.md +556 -0
  1165. package/skills/creative/p5js/references/animation.md +439 -0
  1166. package/skills/creative/p5js/references/color-systems.md +352 -0
  1167. package/skills/creative/p5js/references/core-api.md +410 -0
  1168. package/skills/creative/p5js/references/export-pipeline.md +566 -0
  1169. package/skills/creative/p5js/references/interaction.md +398 -0
  1170. package/skills/creative/p5js/references/shapes-and-geometry.md +300 -0
  1171. package/skills/creative/p5js/references/troubleshooting.md +532 -0
  1172. package/skills/creative/p5js/references/typography.md +302 -0
  1173. package/skills/creative/p5js/references/visual-effects.md +895 -0
  1174. package/skills/creative/p5js/references/webgl-and-3d.md +423 -0
  1175. package/skills/creative/p5js/scripts/export-frames.js +179 -0
  1176. package/skills/creative/p5js/scripts/render.sh +108 -0
  1177. package/skills/creative/p5js/scripts/serve.sh +28 -0
  1178. package/skills/creative/p5js/scripts/setup.sh +87 -0
  1179. package/skills/creative/p5js/templates/viewer.html +395 -0
  1180. package/skills/creative/pixel-art/ATTRIBUTION.md +54 -0
  1181. package/skills/creative/pixel-art/SKILL.md +218 -0
  1182. package/skills/creative/pixel-art/references/palettes.md +49 -0
  1183. package/skills/creative/pixel-art/scripts/__init__.py +0 -0
  1184. package/skills/creative/pixel-art/scripts/palettes.py +167 -0
  1185. package/skills/creative/pixel-art/scripts/pixel_art.py +162 -0
  1186. package/skills/creative/pixel-art/scripts/pixel_art_video.py +345 -0
  1187. package/skills/creative/popular-web-designs/SKILL.md +214 -0
  1188. package/skills/creative/popular-web-designs/templates/airbnb.md +259 -0
  1189. package/skills/creative/popular-web-designs/templates/airtable.md +102 -0
  1190. package/skills/creative/popular-web-designs/templates/apple.md +326 -0
  1191. package/skills/creative/popular-web-designs/templates/bmw.md +193 -0
  1192. package/skills/creative/popular-web-designs/templates/cal.md +272 -0
  1193. package/skills/creative/popular-web-designs/templates/claude.md +325 -0
  1194. package/skills/creative/popular-web-designs/templates/clay.md +317 -0
  1195. package/skills/creative/popular-web-designs/templates/clickhouse.md +294 -0
  1196. package/skills/creative/popular-web-designs/templates/cohere.md +279 -0
  1197. package/skills/creative/popular-web-designs/templates/coinbase.md +142 -0
  1198. package/skills/creative/popular-web-designs/templates/composio.md +320 -0
  1199. package/skills/creative/popular-web-designs/templates/cursor.md +322 -0
  1200. package/skills/creative/popular-web-designs/templates/elevenlabs.md +278 -0
  1201. package/skills/creative/popular-web-designs/templates/expo.md +294 -0
  1202. package/skills/creative/popular-web-designs/templates/figma.md +233 -0
  1203. package/skills/creative/popular-web-designs/templates/framer.md +259 -0
  1204. package/skills/creative/popular-web-designs/templates/hashicorp.md +291 -0
  1205. package/skills/creative/popular-web-designs/templates/ibm.md +345 -0
  1206. package/skills/creative/popular-web-designs/templates/intercom.md +159 -0
  1207. package/skills/creative/popular-web-designs/templates/kraken.md +138 -0
  1208. package/skills/creative/popular-web-designs/templates/linear.app.md +380 -0
  1209. package/skills/creative/popular-web-designs/templates/lovable.md +311 -0
  1210. package/skills/creative/popular-web-designs/templates/minimax.md +270 -0
  1211. package/skills/creative/popular-web-designs/templates/mintlify.md +339 -0
  1212. package/skills/creative/popular-web-designs/templates/miro.md +121 -0
  1213. package/skills/creative/popular-web-designs/templates/mistral.ai.md +274 -0
  1214. package/skills/creative/popular-web-designs/templates/mongodb.md +279 -0
  1215. package/skills/creative/popular-web-designs/templates/notion.md +322 -0
  1216. package/skills/creative/popular-web-designs/templates/nvidia.md +306 -0
  1217. package/skills/creative/popular-web-designs/templates/ollama.md +280 -0
  1218. package/skills/creative/popular-web-designs/templates/opencode.ai.md +294 -0
  1219. package/skills/creative/popular-web-designs/templates/pinterest.md +243 -0
  1220. package/skills/creative/popular-web-designs/templates/posthog.md +269 -0
  1221. package/skills/creative/popular-web-designs/templates/raycast.md +281 -0
  1222. package/skills/creative/popular-web-designs/templates/replicate.md +274 -0
  1223. package/skills/creative/popular-web-designs/templates/resend.md +316 -0
  1224. package/skills/creative/popular-web-designs/templates/revolut.md +198 -0
  1225. package/skills/creative/popular-web-designs/templates/runwayml.md +257 -0
  1226. package/skills/creative/popular-web-designs/templates/sanity.md +370 -0
  1227. package/skills/creative/popular-web-designs/templates/sentry.md +275 -0
  1228. package/skills/creative/popular-web-designs/templates/spacex.md +207 -0
  1229. package/skills/creative/popular-web-designs/templates/spotify.md +259 -0
  1230. package/skills/creative/popular-web-designs/templates/stripe.md +335 -0
  1231. package/skills/creative/popular-web-designs/templates/supabase.md +268 -0
  1232. package/skills/creative/popular-web-designs/templates/superhuman.md +265 -0
  1233. package/skills/creative/popular-web-designs/templates/together.ai.md +276 -0
  1234. package/skills/creative/popular-web-designs/templates/uber.md +308 -0
  1235. package/skills/creative/popular-web-designs/templates/vercel.md +323 -0
  1236. package/skills/creative/popular-web-designs/templates/voltagent.md +336 -0
  1237. package/skills/creative/popular-web-designs/templates/warp.md +266 -0
  1238. package/skills/creative/popular-web-designs/templates/webflow.md +105 -0
  1239. package/skills/creative/popular-web-designs/templates/wise.md +186 -0
  1240. package/skills/creative/popular-web-designs/templates/x.ai.md +270 -0
  1241. package/skills/creative/popular-web-designs/templates/zapier.md +341 -0
  1242. package/skills/creative/pretext/SKILL.md +220 -0
  1243. package/skills/creative/pretext/references/patterns.md +258 -0
  1244. package/skills/creative/pretext/templates/donut-orbit.html +1468 -0
  1245. package/skills/creative/pretext/templates/hello-orb-flow.html +95 -0
  1246. package/skills/creative/sketch/SKILL.md +218 -0
  1247. package/skills/creative/songwriting-and-ai-music/SKILL.md +287 -0
  1248. package/skills/creative/touchdesigner-mcp/SKILL.md +356 -0
  1249. package/skills/creative/touchdesigner-mcp/references/3d-scene.md +275 -0
  1250. package/skills/creative/touchdesigner-mcp/references/animation.md +221 -0
  1251. package/skills/creative/touchdesigner-mcp/references/audio-reactive.md +175 -0
  1252. package/skills/creative/touchdesigner-mcp/references/dat-scripting.md +352 -0
  1253. package/skills/creative/touchdesigner-mcp/references/external-data.md +322 -0
  1254. package/skills/creative/touchdesigner-mcp/references/geometry-comp.md +121 -0
  1255. package/skills/creative/touchdesigner-mcp/references/glsl.md +151 -0
  1256. package/skills/creative/touchdesigner-mcp/references/layout-compositor.md +131 -0
  1257. package/skills/creative/touchdesigner-mcp/references/mcp-tools.md +382 -0
  1258. package/skills/creative/touchdesigner-mcp/references/midi-osc.md +211 -0
  1259. package/skills/creative/touchdesigner-mcp/references/network-patterns.md +966 -0
  1260. package/skills/creative/touchdesigner-mcp/references/operator-tips.md +106 -0
  1261. package/skills/creative/touchdesigner-mcp/references/operators.md +239 -0
  1262. package/skills/creative/touchdesigner-mcp/references/panel-ui.md +281 -0
  1263. package/skills/creative/touchdesigner-mcp/references/particles.md +245 -0
  1264. package/skills/creative/touchdesigner-mcp/references/pitfalls.md +704 -0
  1265. package/skills/creative/touchdesigner-mcp/references/postfx.md +183 -0
  1266. package/skills/creative/touchdesigner-mcp/references/projection-mapping.md +211 -0
  1267. package/skills/creative/touchdesigner-mcp/references/python-api.md +463 -0
  1268. package/skills/creative/touchdesigner-mcp/references/replicator.md +198 -0
  1269. package/skills/creative/touchdesigner-mcp/references/troubleshooting.md +244 -0
  1270. package/skills/creative/touchdesigner-mcp/scripts/setup.sh +115 -0
  1271. package/skills/data-science/DESCRIPTION.md +3 -0
  1272. package/skills/data-science/jupyter-live-kernel/SKILL.md +167 -0
  1273. package/skills/devops/kanban-orchestrator/SKILL.md +189 -0
  1274. package/skills/devops/kanban-worker/SKILL.md +184 -0
  1275. package/skills/devops/webhook-subscriptions/SKILL.md +204 -0
  1276. package/skills/diagramming/DESCRIPTION.md +3 -0
  1277. package/skills/dogfood/SKILL.md +162 -0
  1278. package/skills/dogfood/references/issue-taxonomy.md +109 -0
  1279. package/skills/dogfood/templates/dogfood-report-template.md +86 -0
  1280. package/skills/domain/DESCRIPTION.md +24 -0
  1281. package/skills/email/DESCRIPTION.md +3 -0
  1282. package/skills/email/himalaya/SKILL.md +299 -0
  1283. package/skills/email/himalaya/references/configuration.md +227 -0
  1284. package/skills/email/himalaya/references/message-composition.md +199 -0
  1285. package/skills/gaming/DESCRIPTION.md +3 -0
  1286. package/skills/gaming/minecraft-modpack-server/SKILL.md +187 -0
  1287. package/skills/gaming/pokemon-player/SKILL.md +216 -0
  1288. package/skills/gifs/DESCRIPTION.md +3 -0
  1289. package/skills/github/DESCRIPTION.md +3 -0
  1290. package/skills/github/codebase-inspection/SKILL.md +116 -0
  1291. package/skills/github/github-auth/SKILL.md +247 -0
  1292. package/skills/github/github-auth/scripts/gh-env.sh +66 -0
  1293. package/skills/github/github-code-review/SKILL.md +481 -0
  1294. package/skills/github/github-code-review/references/review-output-template.md +74 -0
  1295. package/skills/github/github-issues/SKILL.md +370 -0
  1296. package/skills/github/github-issues/templates/bug-report.md +35 -0
  1297. package/skills/github/github-issues/templates/feature-request.md +31 -0
  1298. package/skills/github/github-pr-workflow/SKILL.md +367 -0
  1299. package/skills/github/github-pr-workflow/references/ci-troubleshooting.md +183 -0
  1300. package/skills/github/github-pr-workflow/references/conventional-commits.md +71 -0
  1301. package/skills/github/github-pr-workflow/templates/pr-body-bugfix.md +35 -0
  1302. package/skills/github/github-pr-workflow/templates/pr-body-feature.md +33 -0
  1303. package/skills/github/github-repo-management/SKILL.md +516 -0
  1304. package/skills/github/github-repo-management/references/github-api-cheatsheet.md +161 -0
  1305. package/skills/index-cache/anthropics_skills_skills_.json +1 -0
  1306. package/skills/index-cache/claude_marketplace_anthropics_skills.json +1 -0
  1307. package/skills/index-cache/lobehub_index.json +1 -0
  1308. package/skills/index-cache/openai_skills_skills_.json +1 -0
  1309. package/skills/inference-sh/DESCRIPTION.md +19 -0
  1310. package/skills/mcp/DESCRIPTION.md +3 -0
  1311. package/skills/mcp/native-mcp/SKILL.md +357 -0
  1312. package/skills/media/DESCRIPTION.md +3 -0
  1313. package/skills/media/gif-search/SKILL.md +91 -0
  1314. package/skills/media/heartmula/SKILL.md +171 -0
  1315. package/skills/media/songsee/SKILL.md +83 -0
  1316. package/skills/media/spotify/SKILL.md +135 -0
  1317. package/skills/media/youtube-content/SKILL.md +73 -0
  1318. package/skills/media/youtube-content/references/output-formats.md +56 -0
  1319. package/skills/media/youtube-content/scripts/fetch_transcript.py +124 -0
  1320. package/skills/mlops/DESCRIPTION.md +3 -0
  1321. package/skills/mlops/evaluation/DESCRIPTION.md +3 -0
  1322. package/skills/mlops/evaluation/lm-evaluation-harness/SKILL.md +498 -0
  1323. package/skills/mlops/evaluation/lm-evaluation-harness/references/api-evaluation.md +490 -0
  1324. package/skills/mlops/evaluation/lm-evaluation-harness/references/benchmark-guide.md +488 -0
  1325. package/skills/mlops/evaluation/lm-evaluation-harness/references/custom-tasks.md +602 -0
  1326. package/skills/mlops/evaluation/lm-evaluation-harness/references/distributed-eval.md +519 -0
  1327. package/skills/mlops/evaluation/weights-and-biases/SKILL.md +594 -0
  1328. package/skills/mlops/evaluation/weights-and-biases/references/artifacts.md +584 -0
  1329. package/skills/mlops/evaluation/weights-and-biases/references/integrations.md +700 -0
  1330. package/skills/mlops/evaluation/weights-and-biases/references/sweeps.md +847 -0
  1331. package/skills/mlops/huggingface-hub/SKILL.md +81 -0
  1332. package/skills/mlops/inference/DESCRIPTION.md +3 -0
  1333. package/skills/mlops/inference/llama-cpp/SKILL.md +249 -0
  1334. package/skills/mlops/inference/llama-cpp/references/advanced-usage.md +504 -0
  1335. package/skills/mlops/inference/llama-cpp/references/hub-discovery.md +168 -0
  1336. package/skills/mlops/inference/llama-cpp/references/optimization.md +89 -0
  1337. package/skills/mlops/inference/llama-cpp/references/quantization.md +243 -0
  1338. package/skills/mlops/inference/llama-cpp/references/server.md +150 -0
  1339. package/skills/mlops/inference/llama-cpp/references/troubleshooting.md +442 -0
  1340. package/skills/mlops/inference/obliteratus/SKILL.md +342 -0
  1341. package/skills/mlops/inference/obliteratus/references/analysis-modules.md +166 -0
  1342. package/skills/mlops/inference/obliteratus/references/methods-guide.md +141 -0
  1343. package/skills/mlops/inference/obliteratus/templates/abliteration-config.yaml +33 -0
  1344. package/skills/mlops/inference/obliteratus/templates/analysis-study.yaml +40 -0
  1345. package/skills/mlops/inference/obliteratus/templates/batch-abliteration.yaml +41 -0
  1346. package/skills/mlops/inference/vllm/SKILL.md +372 -0
  1347. package/skills/mlops/inference/vllm/references/optimization.md +226 -0
  1348. package/skills/mlops/inference/vllm/references/quantization.md +284 -0
  1349. package/skills/mlops/inference/vllm/references/server-deployment.md +255 -0
  1350. package/skills/mlops/inference/vllm/references/troubleshooting.md +447 -0
  1351. package/skills/mlops/models/DESCRIPTION.md +3 -0
  1352. package/skills/mlops/models/audiocraft/SKILL.md +568 -0
  1353. package/skills/mlops/models/audiocraft/references/advanced-usage.md +666 -0
  1354. package/skills/mlops/models/audiocraft/references/troubleshooting.md +504 -0
  1355. package/skills/mlops/models/segment-anything/SKILL.md +506 -0
  1356. package/skills/mlops/models/segment-anything/references/advanced-usage.md +589 -0
  1357. package/skills/mlops/models/segment-anything/references/troubleshooting.md +484 -0
  1358. package/skills/mlops/research/DESCRIPTION.md +3 -0
  1359. package/skills/mlops/research/dspy/SKILL.md +594 -0
  1360. package/skills/mlops/research/dspy/references/examples.md +663 -0
  1361. package/skills/mlops/research/dspy/references/modules.md +475 -0
  1362. package/skills/mlops/research/dspy/references/optimizers.md +566 -0
  1363. package/skills/mlops/training/DESCRIPTION.md +3 -0
  1364. package/skills/mlops/vector-databases/DESCRIPTION.md +3 -0
  1365. package/skills/note-taking/DESCRIPTION.md +3 -0
  1366. package/skills/note-taking/obsidian/SKILL.md +61 -0
  1367. package/skills/productivity/DESCRIPTION.md +3 -0
  1368. package/skills/productivity/airtable/SKILL.md +229 -0
  1369. package/skills/productivity/google-workspace/SKILL.md +335 -0
  1370. package/skills/productivity/google-workspace/references/gmail-search-syntax.md +63 -0
  1371. package/skills/productivity/google-workspace/scripts/_hermes_home.py +43 -0
  1372. package/skills/productivity/google-workspace/scripts/google_api.py +1221 -0
  1373. package/skills/productivity/google-workspace/scripts/gws_bridge.py +108 -0
  1374. package/skills/productivity/google-workspace/scripts/setup.py +454 -0
  1375. package/skills/productivity/linear/SKILL.md +380 -0
  1376. package/skills/productivity/linear/scripts/linear_api.py +445 -0
  1377. package/skills/productivity/maps/SKILL.md +195 -0
  1378. package/skills/productivity/maps/scripts/maps_client.py +1298 -0
  1379. package/skills/productivity/nano-pdf/SKILL.md +52 -0
  1380. package/skills/productivity/notion/SKILL.md +448 -0
  1381. package/skills/productivity/notion/references/block-types.md +112 -0
  1382. package/skills/productivity/ocr-and-documents/DESCRIPTION.md +3 -0
  1383. package/skills/productivity/ocr-and-documents/SKILL.md +172 -0
  1384. package/skills/productivity/ocr-and-documents/scripts/extract_marker.py +87 -0
  1385. package/skills/productivity/ocr-and-documents/scripts/extract_pymupdf.py +98 -0
  1386. package/skills/productivity/powerpoint/LICENSE.txt +30 -0
  1387. package/skills/productivity/powerpoint/SKILL.md +237 -0
  1388. package/skills/productivity/powerpoint/editing.md +205 -0
  1389. package/skills/productivity/powerpoint/pptxgenjs.md +420 -0
  1390. package/skills/productivity/powerpoint/scripts/__init__.py +0 -0
  1391. package/skills/productivity/powerpoint/scripts/add_slide.py +195 -0
  1392. package/skills/productivity/powerpoint/scripts/clean.py +286 -0
  1393. package/skills/productivity/powerpoint/scripts/office/helpers/__init__.py +0 -0
  1394. package/skills/productivity/powerpoint/scripts/office/helpers/merge_runs.py +199 -0
  1395. package/skills/productivity/powerpoint/scripts/office/helpers/simplify_redlines.py +197 -0
  1396. package/skills/productivity/powerpoint/scripts/office/pack.py +159 -0
  1397. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  1398. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  1399. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  1400. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  1401. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  1402. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  1403. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  1404. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  1405. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  1406. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  1407. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  1408. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  1409. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  1410. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  1411. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  1412. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  1413. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  1414. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  1415. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  1416. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  1417. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  1418. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  1419. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  1420. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  1421. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  1422. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  1423. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  1424. package/skills/productivity/powerpoint/scripts/office/schemas/ecma/fourth-edition/opc-contentTypes.xsd +42 -0
  1425. package/skills/productivity/powerpoint/scripts/office/schemas/ecma/fourth-edition/opc-coreProperties.xsd +50 -0
  1426. package/skills/productivity/powerpoint/scripts/office/schemas/ecma/fourth-edition/opc-digSig.xsd +49 -0
  1427. package/skills/productivity/powerpoint/scripts/office/schemas/ecma/fourth-edition/opc-relationships.xsd +33 -0
  1428. package/skills/productivity/powerpoint/scripts/office/schemas/mce/mc.xsd +75 -0
  1429. package/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  1430. package/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  1431. package/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  1432. package/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  1433. package/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  1434. package/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  1435. package/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  1436. package/skills/productivity/teams-meeting-pipeline/SKILL.md +116 -0
  1437. package/skills/red-teaming/godmode/SKILL.md +404 -0
  1438. package/skills/red-teaming/godmode/references/jailbreak-templates.md +128 -0
  1439. package/skills/red-teaming/godmode/references/refusal-detection.md +142 -0
  1440. package/skills/red-teaming/godmode/scripts/auto_jailbreak.py +769 -0
  1441. package/skills/red-teaming/godmode/scripts/godmode_race.py +530 -0
  1442. package/skills/red-teaming/godmode/scripts/load_godmode.py +45 -0
  1443. package/skills/red-teaming/godmode/scripts/parseltongue.py +550 -0
  1444. package/skills/red-teaming/godmode/templates/prefill-subtle.json +10 -0
  1445. package/skills/red-teaming/godmode/templates/prefill.json +18 -0
  1446. package/skills/research/DESCRIPTION.md +3 -0
  1447. package/skills/research/arxiv/SKILL.md +282 -0
  1448. package/skills/research/arxiv/scripts/search_arxiv.py +114 -0
  1449. package/skills/research/blogwatcher/SKILL.md +137 -0
  1450. package/skills/research/llm-wiki/SKILL.md +507 -0
  1451. package/skills/research/polymarket/SKILL.md +77 -0
  1452. package/skills/research/polymarket/references/api-endpoints.md +220 -0
  1453. package/skills/research/polymarket/scripts/polymarket.py +284 -0
  1454. package/skills/research/research-paper-writing/SKILL.md +2377 -0
  1455. package/skills/research/research-paper-writing/references/autoreason-methodology.md +394 -0
  1456. package/skills/research/research-paper-writing/references/checklists.md +434 -0
  1457. package/skills/research/research-paper-writing/references/citation-workflow.md +564 -0
  1458. package/skills/research/research-paper-writing/references/experiment-patterns.md +728 -0
  1459. package/skills/research/research-paper-writing/references/human-evaluation.md +476 -0
  1460. package/skills/research/research-paper-writing/references/paper-types.md +481 -0
  1461. package/skills/research/research-paper-writing/references/reviewer-guidelines.md +433 -0
  1462. package/skills/research/research-paper-writing/references/sources.md +191 -0
  1463. package/skills/research/research-paper-writing/references/writing-guide.md +474 -0
  1464. package/skills/research/research-paper-writing/templates/README.md +251 -0
  1465. package/skills/research/research-paper-writing/templates/aaai2026/README.md +534 -0
  1466. package/skills/research/research-paper-writing/templates/aaai2026/aaai2026-unified-supp.tex +144 -0
  1467. package/skills/research/research-paper-writing/templates/aaai2026/aaai2026-unified-template.tex +952 -0
  1468. package/skills/research/research-paper-writing/templates/aaai2026/aaai2026.bib +111 -0
  1469. package/skills/research/research-paper-writing/templates/aaai2026/aaai2026.bst +1493 -0
  1470. package/skills/research/research-paper-writing/templates/aaai2026/aaai2026.sty +315 -0
  1471. package/skills/research/research-paper-writing/templates/acl/README.md +50 -0
  1472. package/skills/research/research-paper-writing/templates/acl/acl.sty +312 -0
  1473. package/skills/research/research-paper-writing/templates/acl/acl_latex.tex +377 -0
  1474. package/skills/research/research-paper-writing/templates/acl/acl_lualatex.tex +101 -0
  1475. package/skills/research/research-paper-writing/templates/acl/acl_natbib.bst +1940 -0
  1476. package/skills/research/research-paper-writing/templates/acl/anthology.bib.txt +26 -0
  1477. package/skills/research/research-paper-writing/templates/acl/custom.bib +70 -0
  1478. package/skills/research/research-paper-writing/templates/acl/formatting.md +326 -0
  1479. package/skills/research/research-paper-writing/templates/colm2025/README.md +3 -0
  1480. package/skills/research/research-paper-writing/templates/colm2025/colm2025_conference.bib +11 -0
  1481. package/skills/research/research-paper-writing/templates/colm2025/colm2025_conference.bst +1440 -0
  1482. package/skills/research/research-paper-writing/templates/colm2025/colm2025_conference.pdf +0 -0
  1483. package/skills/research/research-paper-writing/templates/colm2025/colm2025_conference.sty +218 -0
  1484. package/skills/research/research-paper-writing/templates/colm2025/colm2025_conference.tex +305 -0
  1485. package/skills/research/research-paper-writing/templates/colm2025/fancyhdr.sty +485 -0
  1486. package/skills/research/research-paper-writing/templates/colm2025/math_commands.tex +508 -0
  1487. package/skills/research/research-paper-writing/templates/colm2025/natbib.sty +1246 -0
  1488. package/skills/research/research-paper-writing/templates/iclr2026/fancyhdr.sty +485 -0
  1489. package/skills/research/research-paper-writing/templates/iclr2026/iclr2026_conference.bib +24 -0
  1490. package/skills/research/research-paper-writing/templates/iclr2026/iclr2026_conference.bst +1440 -0
  1491. package/skills/research/research-paper-writing/templates/iclr2026/iclr2026_conference.pdf +0 -0
  1492. package/skills/research/research-paper-writing/templates/iclr2026/iclr2026_conference.sty +246 -0
  1493. package/skills/research/research-paper-writing/templates/iclr2026/iclr2026_conference.tex +414 -0
  1494. package/skills/research/research-paper-writing/templates/iclr2026/math_commands.tex +508 -0
  1495. package/skills/research/research-paper-writing/templates/iclr2026/natbib.sty +1246 -0
  1496. package/skills/research/research-paper-writing/templates/icml2026/algorithm.sty +79 -0
  1497. package/skills/research/research-paper-writing/templates/icml2026/algorithmic.sty +201 -0
  1498. package/skills/research/research-paper-writing/templates/icml2026/example_paper.bib +75 -0
  1499. package/skills/research/research-paper-writing/templates/icml2026/example_paper.pdf +0 -0
  1500. package/skills/research/research-paper-writing/templates/icml2026/example_paper.tex +662 -0
  1501. package/skills/research/research-paper-writing/templates/icml2026/fancyhdr.sty +864 -0
  1502. package/skills/research/research-paper-writing/templates/icml2026/icml2026.bst +1443 -0
  1503. package/skills/research/research-paper-writing/templates/icml2026/icml2026.sty +767 -0
  1504. package/skills/research/research-paper-writing/templates/icml2026/icml_numpapers.pdf +0 -0
  1505. package/skills/research/research-paper-writing/templates/neurips2025/Makefile +36 -0
  1506. package/skills/research/research-paper-writing/templates/neurips2025/extra_pkgs.tex +53 -0
  1507. package/skills/research/research-paper-writing/templates/neurips2025/main.tex +38 -0
  1508. package/skills/research/research-paper-writing/templates/neurips2025/neurips.sty +382 -0
  1509. package/skills/smart-home/DESCRIPTION.md +3 -0
  1510. package/skills/smart-home/openhue/SKILL.md +109 -0
  1511. package/skills/social-media/DESCRIPTION.md +3 -0
  1512. package/skills/social-media/xurl/SKILL.md +414 -0
  1513. package/skills/software-development/debugging-hermes-tui-commands/SKILL.md +152 -0
  1514. package/skills/software-development/hermes-agent-skill-authoring/SKILL.md +165 -0
  1515. package/skills/software-development/node-inspect-debugger/SKILL.md +319 -0
  1516. package/skills/software-development/plan/SKILL.md +58 -0
  1517. package/skills/software-development/python-debugpy/SKILL.md +375 -0
  1518. package/skills/software-development/requesting-code-review/SKILL.md +280 -0
  1519. package/skills/software-development/spike/SKILL.md +197 -0
  1520. package/skills/software-development/subagent-driven-development/SKILL.md +352 -0
  1521. package/skills/software-development/subagent-driven-development/references/context-budget-discipline.md +53 -0
  1522. package/skills/software-development/subagent-driven-development/references/gates-taxonomy.md +93 -0
  1523. package/skills/software-development/systematic-debugging/SKILL.md +367 -0
  1524. package/skills/software-development/test-driven-development/SKILL.md +343 -0
  1525. package/skills/software-development/writing-plans/SKILL.md +297 -0
  1526. package/skills/yuanbao/SKILL.md +108 -0
  1527. package/tools/__init__.py +25 -0
  1528. package/tools/__pycache__/__init__.cpython-312.pyc +0 -0
  1529. package/tools/__pycache__/approval.cpython-312.pyc +0 -0
  1530. package/tools/__pycache__/binary_extensions.cpython-312.pyc +0 -0
  1531. package/tools/__pycache__/browser_camofox.cpython-312.pyc +0 -0
  1532. package/tools/__pycache__/browser_camofox_state.cpython-312.pyc +0 -0
  1533. package/tools/__pycache__/browser_cdp_tool.cpython-312.pyc +0 -0
  1534. package/tools/__pycache__/browser_dialog_tool.cpython-312.pyc +0 -0
  1535. package/tools/__pycache__/browser_supervisor.cpython-312.pyc +0 -0
  1536. package/tools/__pycache__/browser_tool.cpython-312.pyc +0 -0
  1537. package/tools/__pycache__/budget_config.cpython-312.pyc +0 -0
  1538. package/tools/__pycache__/checkpoint_manager.cpython-312.pyc +0 -0
  1539. package/tools/__pycache__/clarify_gateway.cpython-312.pyc +0 -0
  1540. package/tools/__pycache__/clarify_tool.cpython-312.pyc +0 -0
  1541. package/tools/__pycache__/code_execution_tool.cpython-312.pyc +0 -0
  1542. package/tools/__pycache__/computer_use_tool.cpython-312.pyc +0 -0
  1543. package/tools/__pycache__/cronjob_tools.cpython-312.pyc +0 -0
  1544. package/tools/__pycache__/debug_helpers.cpython-312.pyc +0 -0
  1545. package/tools/__pycache__/delegate_tool.cpython-312.pyc +0 -0
  1546. package/tools/__pycache__/discord_tool.cpython-312.pyc +0 -0
  1547. package/tools/__pycache__/feishu_doc_tool.cpython-312.pyc +0 -0
  1548. package/tools/__pycache__/feishu_drive_tool.cpython-312.pyc +0 -0
  1549. package/tools/__pycache__/file_operations.cpython-312.pyc +0 -0
  1550. package/tools/__pycache__/file_state.cpython-312.pyc +0 -0
  1551. package/tools/__pycache__/file_tools.cpython-312.pyc +0 -0
  1552. package/tools/__pycache__/homeassistant_tool.cpython-312.pyc +0 -0
  1553. package/tools/__pycache__/image_generation_tool.cpython-312.pyc +0 -0
  1554. package/tools/__pycache__/interrupt.cpython-312.pyc +0 -0
  1555. package/tools/__pycache__/kanban_tools.cpython-312.pyc +0 -0
  1556. package/tools/__pycache__/lazy_deps.cpython-312.pyc +0 -0
  1557. package/tools/__pycache__/managed_tool_gateway.cpython-312.pyc +0 -0
  1558. package/tools/__pycache__/mcp_tool.cpython-312.pyc +0 -0
  1559. package/tools/__pycache__/memory_tool.cpython-312.pyc +0 -0
  1560. package/tools/__pycache__/mixture_of_agents_tool.cpython-312.pyc +0 -0
  1561. package/tools/__pycache__/openrouter_client.cpython-312.pyc +0 -0
  1562. package/tools/__pycache__/process_registry.cpython-312.pyc +0 -0
  1563. package/tools/__pycache__/registry.cpython-312.pyc +0 -0
  1564. package/tools/__pycache__/schema_sanitizer.cpython-312.pyc +0 -0
  1565. package/tools/__pycache__/send_message_tool.cpython-312.pyc +0 -0
  1566. package/tools/__pycache__/session_search_tool.cpython-312.pyc +0 -0
  1567. package/tools/__pycache__/skill_manager_tool.cpython-312.pyc +0 -0
  1568. package/tools/__pycache__/skill_provenance.cpython-312.pyc +0 -0
  1569. package/tools/__pycache__/skill_usage.cpython-312.pyc +0 -0
  1570. package/tools/__pycache__/skills_guard.cpython-312.pyc +0 -0
  1571. package/tools/__pycache__/skills_sync.cpython-312.pyc +0 -0
  1572. package/tools/__pycache__/skills_tool.cpython-312.pyc +0 -0
  1573. package/tools/__pycache__/slash_confirm.cpython-312.pyc +0 -0
  1574. package/tools/__pycache__/terminal_tool.cpython-312.pyc +0 -0
  1575. package/tools/__pycache__/tirith_security.cpython-312.pyc +0 -0
  1576. package/tools/__pycache__/todo_tool.cpython-312.pyc +0 -0
  1577. package/tools/__pycache__/tool_backend_helpers.cpython-312.pyc +0 -0
  1578. package/tools/__pycache__/tool_result_storage.cpython-312.pyc +0 -0
  1579. package/tools/__pycache__/tts_tool.cpython-312.pyc +0 -0
  1580. package/tools/__pycache__/url_safety.cpython-312.pyc +0 -0
  1581. package/tools/__pycache__/video_generation_tool.cpython-312.pyc +0 -0
  1582. package/tools/__pycache__/vision_tools.cpython-312.pyc +0 -0
  1583. package/tools/__pycache__/voice_mode.cpython-312.pyc +0 -0
  1584. package/tools/__pycache__/web_tools.cpython-312.pyc +0 -0
  1585. package/tools/__pycache__/website_policy.cpython-312.pyc +0 -0
  1586. package/tools/__pycache__/x_search_tool.cpython-312.pyc +0 -0
  1587. package/tools/__pycache__/xai_http.cpython-312.pyc +0 -0
  1588. package/tools/__pycache__/yuanbao_tools.cpython-312.pyc +0 -0
  1589. package/tools/ansi_strip.py +44 -0
  1590. package/tools/approval.py +1392 -0
  1591. package/tools/binary_extensions.py +42 -0
  1592. package/tools/browser_camofox.py +700 -0
  1593. package/tools/browser_camofox_state.py +48 -0
  1594. package/tools/browser_cdp_tool.py +569 -0
  1595. package/tools/browser_dialog_tool.py +148 -0
  1596. package/tools/browser_providers/__init__.py +10 -0
  1597. package/tools/browser_providers/__pycache__/__init__.cpython-312.pyc +0 -0
  1598. package/tools/browser_providers/__pycache__/base.cpython-312.pyc +0 -0
  1599. package/tools/browser_providers/__pycache__/browser_use.cpython-312.pyc +0 -0
  1600. package/tools/browser_providers/__pycache__/browserbase.cpython-312.pyc +0 -0
  1601. package/tools/browser_providers/__pycache__/firecrawl.cpython-312.pyc +0 -0
  1602. package/tools/browser_providers/base.py +59 -0
  1603. package/tools/browser_providers/browser_use.py +225 -0
  1604. package/tools/browser_providers/browserbase.py +222 -0
  1605. package/tools/browser_providers/firecrawl.py +112 -0
  1606. package/tools/browser_supervisor.py +1457 -0
  1607. package/tools/browser_tool.py +3676 -0
  1608. package/tools/budget_config.py +51 -0
  1609. package/tools/checkpoint_manager.py +1639 -0
  1610. package/tools/clarify_gateway.py +278 -0
  1611. package/tools/clarify_tool.py +141 -0
  1612. package/tools/code_execution_tool.py +1782 -0
  1613. package/tools/computer_use/__init__.py +43 -0
  1614. package/tools/computer_use/__pycache__/__init__.cpython-312.pyc +0 -0
  1615. package/tools/computer_use/__pycache__/backend.cpython-312.pyc +0 -0
  1616. package/tools/computer_use/__pycache__/schema.cpython-312.pyc +0 -0
  1617. package/tools/computer_use/__pycache__/tool.cpython-312.pyc +0 -0
  1618. package/tools/computer_use/backend.py +150 -0
  1619. package/tools/computer_use/cua_backend.py +682 -0
  1620. package/tools/computer_use/schema.py +191 -0
  1621. package/tools/computer_use/tool.py +521 -0
  1622. package/tools/computer_use_tool.py +39 -0
  1623. package/tools/credential_files.py +437 -0
  1624. package/tools/cronjob_tools.py +719 -0
  1625. package/tools/debug_helpers.py +106 -0
  1626. package/tools/delegate_tool.py +2797 -0
  1627. package/tools/discord_tool.py +959 -0
  1628. package/tools/env_passthrough.py +145 -0
  1629. package/tools/environments/__init__.py +14 -0
  1630. package/tools/environments/__pycache__/__init__.cpython-312.pyc +0 -0
  1631. package/tools/environments/__pycache__/base.cpython-312.pyc +0 -0
  1632. package/tools/environments/__pycache__/docker.cpython-312.pyc +0 -0
  1633. package/tools/environments/__pycache__/file_sync.cpython-312.pyc +0 -0
  1634. package/tools/environments/__pycache__/local.cpython-312.pyc +0 -0
  1635. package/tools/environments/__pycache__/managed_modal.cpython-312.pyc +0 -0
  1636. package/tools/environments/__pycache__/modal.cpython-312.pyc +0 -0
  1637. package/tools/environments/__pycache__/modal_utils.cpython-312.pyc +0 -0
  1638. package/tools/environments/__pycache__/singularity.cpython-312.pyc +0 -0
  1639. package/tools/environments/__pycache__/ssh.cpython-312.pyc +0 -0
  1640. package/tools/environments/base.py +844 -0
  1641. package/tools/environments/daytona.py +270 -0
  1642. package/tools/environments/docker.py +656 -0
  1643. package/tools/environments/file_sync.py +400 -0
  1644. package/tools/environments/local.py +658 -0
  1645. package/tools/environments/managed_modal.py +282 -0
  1646. package/tools/environments/modal.py +479 -0
  1647. package/tools/environments/modal_utils.py +199 -0
  1648. package/tools/environments/singularity.py +263 -0
  1649. package/tools/environments/ssh.py +295 -0
  1650. package/tools/environments/vercel_sandbox.py +655 -0
  1651. package/tools/feishu_doc_tool.py +138 -0
  1652. package/tools/feishu_drive_tool.py +431 -0
  1653. package/tools/file_operations.py +1825 -0
  1654. package/tools/file_state.py +332 -0
  1655. package/tools/file_tools.py +1172 -0
  1656. package/tools/fuzzy_match.py +703 -0
  1657. package/tools/homeassistant_tool.py +513 -0
  1658. package/tools/image_generation_tool.py +1098 -0
  1659. package/tools/interrupt.py +98 -0
  1660. package/tools/kanban_tools.py +1139 -0
  1661. package/tools/lazy_deps.py +608 -0
  1662. package/tools/managed_tool_gateway.py +168 -0
  1663. package/tools/mcp_oauth.py +633 -0
  1664. package/tools/mcp_oauth_manager.py +607 -0
  1665. package/tools/mcp_tool.py +3483 -0
  1666. package/tools/memory_tool.py +584 -0
  1667. package/tools/microsoft_graph_auth.py +245 -0
  1668. package/tools/microsoft_graph_client.py +408 -0
  1669. package/tools/mixture_of_agents_tool.py +542 -0
  1670. package/tools/neutts_samples/jo.txt +1 -0
  1671. package/tools/neutts_samples/jo.wav +0 -0
  1672. package/tools/neutts_synth.py +104 -0
  1673. package/tools/openrouter_client.py +33 -0
  1674. package/tools/osv_check.py +155 -0
  1675. package/tools/patch_parser.py +592 -0
  1676. package/tools/path_security.py +43 -0
  1677. package/tools/process_registry.py +1534 -0
  1678. package/tools/registry.py +589 -0
  1679. package/tools/schema_sanitizer.py +370 -0
  1680. package/tools/send_message_tool.py +1900 -0
  1681. package/tools/session_search_tool.py +613 -0
  1682. package/tools/skill_manager_tool.py +932 -0
  1683. package/tools/skill_provenance.py +78 -0
  1684. package/tools/skill_usage.py +610 -0
  1685. package/tools/skills_guard.py +932 -0
  1686. package/tools/skills_hub.py +3263 -0
  1687. package/tools/skills_sync.py +432 -0
  1688. package/tools/skills_tool.py +1569 -0
  1689. package/tools/slash_confirm.py +167 -0
  1690. package/tools/terminal_tool.py +2376 -0
  1691. package/tools/tirith_security.py +775 -0
  1692. package/tools/todo_tool.py +277 -0
  1693. package/tools/tool_backend_helpers.py +144 -0
  1694. package/tools/tool_output_limits.py +92 -0
  1695. package/tools/tool_result_storage.py +232 -0
  1696. package/tools/transcription_tools.py +936 -0
  1697. package/tools/tts_tool.py +2285 -0
  1698. package/tools/url_safety.py +330 -0
  1699. package/tools/video_generation_tool.py +561 -0
  1700. package/tools/vision_tools.py +1422 -0
  1701. package/tools/voice_mode.py +1019 -0
  1702. package/tools/web_tools.py +1551 -0
  1703. package/tools/website_policy.py +283 -0
  1704. package/tools/x_search_tool.py +424 -0
  1705. package/tools/xai_http.py +83 -0
  1706. package/tools/yuanbao_tools.py +736 -0
  1707. package/toolset_distributions.py +364 -0
  1708. package/toolsets.py +866 -0
  1709. package/trajectory_compressor.py +1509 -0
  1710. package/tui_gateway/__init__.py +0 -0
  1711. package/tui_gateway/entry.py +251 -0
  1712. package/tui_gateway/event_publisher.py +126 -0
  1713. package/tui_gateway/render.py +49 -0
  1714. package/tui_gateway/server.py +6623 -0
  1715. package/tui_gateway/slash_worker.py +76 -0
  1716. package/tui_gateway/transport.py +219 -0
  1717. package/tui_gateway/ws.py +178 -0
  1718. package/utils.py +361 -0
@@ -0,0 +1,1611 @@
1
+ # ============================================================================
2
+ # Hermes Agent Installer for Windows
3
+ # ============================================================================
4
+ # Installation script for Windows (PowerShell).
5
+ # Uses uv for fast Python provisioning and package management.
6
+ #
7
+ # Usage:
8
+ # irm https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.ps1 | iex
9
+ #
10
+ # Or download and run with options:
11
+ # .\install.ps1 -NoVenv -SkipSetup
12
+ #
13
+ # ============================================================================
14
+
15
+ param(
16
+ [switch]$NoVenv,
17
+ [switch]$SkipSetup,
18
+ [string]$Branch = "main",
19
+ [string]$HermesHome = "$env:LOCALAPPDATA\hermes",
20
+ [string]$InstallDir = "$env:LOCALAPPDATA\hermes\hermes-agent"
21
+ )
22
+
23
+ $ErrorActionPreference = "Stop"
24
+
25
+ # ============================================================================
26
+ # Configuration
27
+ # ============================================================================
28
+
29
+ $RepoUrlSsh = "git@github.com:NousResearch/hermes-agent.git"
30
+ $RepoUrlHttps = "https://github.com/NousResearch/hermes-agent.git"
31
+ $PythonVersion = "3.11"
32
+ $NodeVersion = "22"
33
+
34
+ # ============================================================================
35
+ # Helper functions
36
+ # ============================================================================
37
+
38
+ function Write-Banner {
39
+ Write-Host ""
40
+ Write-Host "┌─────────────────────────────────────────────────────────┐" -ForegroundColor Magenta
41
+ Write-Host "│ ⚕ Hermes Agent Installer │" -ForegroundColor Magenta
42
+ Write-Host "├─────────────────────────────────────────────────────────┤" -ForegroundColor Magenta
43
+ Write-Host "│ An open source AI agent by Nous Research. │" -ForegroundColor Magenta
44
+ Write-Host "└─────────────────────────────────────────────────────────┘" -ForegroundColor Magenta
45
+ Write-Host ""
46
+ }
47
+
48
+ function Write-Info {
49
+ param([string]$Message)
50
+ Write-Host "→ $Message" -ForegroundColor Cyan
51
+ }
52
+
53
+ function Write-Success {
54
+ param([string]$Message)
55
+ Write-Host "✓ $Message" -ForegroundColor Green
56
+ }
57
+
58
+ function Write-Warn {
59
+ param([string]$Message)
60
+ Write-Host "⚠ $Message" -ForegroundColor Yellow
61
+ }
62
+
63
+ function Write-Err {
64
+ param([string]$Message)
65
+ Write-Host "✗ $Message" -ForegroundColor Red
66
+ }
67
+
68
+ # ============================================================================
69
+ # Dependency checks
70
+ # ============================================================================
71
+
72
+ function Install-Uv {
73
+ Write-Info "Checking for uv package manager..."
74
+
75
+ # Check if uv is already available
76
+ if (Get-Command uv -ErrorAction SilentlyContinue) {
77
+ $version = uv --version
78
+ $script:UvCmd = "uv"
79
+ Write-Success "uv found ($version)"
80
+ return $true
81
+ }
82
+
83
+ # Check common install locations
84
+ $uvPaths = @(
85
+ "$env:USERPROFILE\.local\bin\uv.exe",
86
+ "$env:USERPROFILE\.cargo\bin\uv.exe"
87
+ )
88
+ foreach ($uvPath in $uvPaths) {
89
+ if (Test-Path $uvPath) {
90
+ $script:UvCmd = $uvPath
91
+ $version = & $uvPath --version
92
+ Write-Success "uv found at $uvPath ($version)"
93
+ return $true
94
+ }
95
+ }
96
+
97
+ # Install uv
98
+ Write-Info "Installing uv (fast Python package manager)..."
99
+ try {
100
+ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" 2>&1 | Out-Null
101
+
102
+ # Find the installed binary
103
+ $uvExe = "$env:USERPROFILE\.local\bin\uv.exe"
104
+ if (-not (Test-Path $uvExe)) {
105
+ $uvExe = "$env:USERPROFILE\.cargo\bin\uv.exe"
106
+ }
107
+ if (-not (Test-Path $uvExe)) {
108
+ # Refresh PATH and try again
109
+ $env:Path = [Environment]::GetEnvironmentVariable("Path", "User") + ";" + [Environment]::GetEnvironmentVariable("Path", "Machine")
110
+ if (Get-Command uv -ErrorAction SilentlyContinue) {
111
+ $uvExe = (Get-Command uv).Source
112
+ }
113
+ }
114
+
115
+ if (Test-Path $uvExe) {
116
+ $script:UvCmd = $uvExe
117
+ $version = & $uvExe --version
118
+ Write-Success "uv installed ($version)"
119
+ return $true
120
+ }
121
+
122
+ Write-Err "uv installed but not found on PATH"
123
+ Write-Info "Try restarting your terminal and re-running"
124
+ return $false
125
+ } catch {
126
+ Write-Err "Failed to install uv"
127
+ Write-Info "Install manually: https://docs.astral.sh/uv/getting-started/installation/"
128
+ return $false
129
+ }
130
+ }
131
+
132
+ function Test-Python {
133
+ Write-Info "Checking Python $PythonVersion..."
134
+
135
+ # Let uv find or install Python
136
+ try {
137
+ $pythonPath = & $UvCmd python find $PythonVersion 2>$null
138
+ if ($pythonPath) {
139
+ $ver = & $pythonPath --version 2>$null
140
+ Write-Success "Python found: $ver"
141
+ return $true
142
+ }
143
+ } catch { }
144
+
145
+ # Python not found — use uv to install it (no admin needed!)
146
+ Write-Info "Python $PythonVersion not found, installing via uv..."
147
+ try {
148
+ # Temporarily relax ErrorActionPreference: uv writes download progress
149
+ # ("Downloading cpython-3.11.15-windows-x86_64-none (24.5MiB)") to
150
+ # stderr. With $ErrorActionPreference = "Stop" (set at the top of this
151
+ # script) PowerShell wraps stderr lines from native commands as
152
+ # ErrorRecord objects when captured via 2>&1, then throws a terminating
153
+ # exception on the first one — even though uv exits 0 and Python was
154
+ # installed successfully. Verify success via `uv python find`
155
+ # afterwards, which is the reliable signal regardless of exit-code
156
+ # semantics or stderr noise. This fix was previously landed as
157
+ # commit ec1714e71 and then lost in a release squash; reapplied here.
158
+ $prevEAP = $ErrorActionPreference
159
+ $ErrorActionPreference = "Continue"
160
+ $uvOutput = & $UvCmd python install $PythonVersion 2>&1
161
+ $uvExitCode = $LASTEXITCODE
162
+ $ErrorActionPreference = $prevEAP
163
+
164
+ # Check if Python is now available (more reliable than exit code
165
+ # since uv may return non-zero due to "already installed" etc.)
166
+ $pythonPath = & $UvCmd python find $PythonVersion 2>$null
167
+ if ($pythonPath) {
168
+ $ver = & $pythonPath --version 2>$null
169
+ Write-Success "Python installed: $ver"
170
+ return $true
171
+ }
172
+
173
+ # uv ran but Python still not findable — show what happened
174
+ if ($uvExitCode -ne 0) {
175
+ Write-Warn "uv python install output:"
176
+ Write-Host $uvOutput -ForegroundColor DarkGray
177
+ }
178
+ } catch {
179
+ # Restore EAP in case the try block threw before the assignment
180
+ if ($prevEAP) { $ErrorActionPreference = $prevEAP }
181
+ Write-Warn "uv python install error: $_"
182
+ }
183
+
184
+ # Fallback: check if ANY Python 3.10+ is already available on the system
185
+ Write-Info "Trying to find any existing Python 3.10+..."
186
+ foreach ($fallbackVer in @("3.12", "3.13", "3.10")) {
187
+ try {
188
+ $pythonPath = & $UvCmd python find $fallbackVer 2>$null
189
+ if ($pythonPath) {
190
+ $ver = & $pythonPath --version 2>$null
191
+ Write-Success "Found fallback: $ver"
192
+ $script:PythonVersion = $fallbackVer
193
+ return $true
194
+ }
195
+ } catch { }
196
+ }
197
+
198
+ # Fallback: try system python — but skip the Microsoft Store stub.
199
+ # On Windows, %LOCALAPPDATA%\Microsoft\WindowsApps\python.exe is a 0-byte
200
+ # reparse-point stub that prints "Python was not found; run without
201
+ # arguments to install from the Microsoft Store..." to stdout and exits
202
+ # non-zero. Get-Command finds it; invoking it produces a confusing error
203
+ # that the user sees as our installer crashing.
204
+ $pythonCmd = Get-Command python -ErrorAction SilentlyContinue
205
+ if ($pythonCmd) {
206
+ $isStoreStub = $false
207
+ try {
208
+ $pythonSource = $pythonCmd.Source
209
+ if ($pythonSource -and $pythonSource -like "*\WindowsApps\*") {
210
+ $isStoreStub = $true
211
+ } else {
212
+ # Even outside WindowsApps, a 0-byte file is the stub
213
+ $item = Get-Item $pythonSource -ErrorAction SilentlyContinue
214
+ if ($item -and $item.Length -eq 0) { $isStoreStub = $true }
215
+ }
216
+ } catch { }
217
+
218
+ if (-not $isStoreStub) {
219
+ try {
220
+ $prevEAP2 = $ErrorActionPreference
221
+ $ErrorActionPreference = "Continue"
222
+ $sysVer = & python --version 2>&1
223
+ $ErrorActionPreference = $prevEAP2
224
+ if ($sysVer -match "Python 3\.(1[0-9]|[1-9][0-9])") {
225
+ Write-Success "Using system Python: $sysVer"
226
+ return $true
227
+ }
228
+ } catch {
229
+ if ($prevEAP2) { $ErrorActionPreference = $prevEAP2 }
230
+ }
231
+ }
232
+ }
233
+
234
+ Write-Err "Failed to install Python $PythonVersion"
235
+ Write-Info "Install Python 3.11 manually, then re-run this script:"
236
+ Write-Info " https://www.python.org/downloads/"
237
+ Write-Info " Or: winget install Python.Python.3.11"
238
+ return $false
239
+ }
240
+
241
+ function Install-Git {
242
+ <#
243
+ .SYNOPSIS
244
+ Ensure Git (and Git Bash) are installed. Git for Windows bundles bash.exe
245
+ which Hermes uses to run shell commands.
246
+
247
+ Priority order (deliberately simple — no winget, no registry, no system
248
+ package manager):
249
+ 1. Existing ``git`` on PATH — use it as-is (the common fast path).
250
+ 2. Download **PortableGit** from the official git-for-windows GitHub
251
+ release (self-extracting 7z.exe) and unpack it to
252
+ ``%LOCALAPPDATA%\hermes\git`` — never touches system Git, never
253
+ requires admin, works even on locked-down machines and machines
254
+ with a broken system Git install.
255
+
256
+ **Why PortableGit, not MinGit:** MinGit is the minimal-automation
257
+ distribution and ships ONLY ``git.exe`` — no bash, no POSIX utilities.
258
+ Hermes needs ``bash.exe`` to run shell commands. PortableGit is the
259
+ full Git for Windows distribution without the installer UI; it ships
260
+ ``git.exe`` + ``bash.exe`` + ``sh``, ``awk``, ``sed``, ``grep``, ``curl``,
261
+ ``ssh``, etc. in ``usr\bin\``.
262
+
263
+ We deliberately skip winget because it fails badly when the system Git
264
+ install is in a half-installed state (partially registered, or uninstall-
265
+ blocked). Owning the Hermes copy of Git ourselves is predictable and
266
+ recoverable: if it ever breaks, ``Remove-Item %LOCALAPPDATA%\hermes\git``
267
+ and re-running this installer fully recovers.
268
+
269
+ After install we locate ``bash.exe`` and persist the path in
270
+ ``HERMES_GIT_BASH_PATH`` (User scope) so Hermes can find it in a fresh
271
+ shell without a second PATH refresh.
272
+ #>
273
+ Write-Info "Checking Git..."
274
+
275
+ if (Get-Command git -ErrorAction SilentlyContinue) {
276
+ $version = git --version
277
+ Write-Success "Git found ($version)"
278
+ Set-GitBashEnvVar
279
+ return $true
280
+ }
281
+
282
+ # Download PortableGit into $HermesHome\git. Always works as long as
283
+ # we can reach github.com — no admin, no winget, no reliance on the
284
+ # user's possibly-broken system Git install.
285
+ Write-Info "Git not found — downloading PortableGit to $HermesHome\git\ ..."
286
+ Write-Info "(no admin rights required; isolated from any system Git install)"
287
+
288
+ try {
289
+ $arch = if ([Environment]::Is64BitOperatingSystem) {
290
+ # Detect ARM64 vs x64 explicitly; PortableGit ships separate assets.
291
+ if ($env:PROCESSOR_ARCHITECTURE -eq "ARM64" -or $env:PROCESSOR_ARCHITEW6432 -eq "ARM64") {
292
+ "arm64"
293
+ } else {
294
+ "64-bit"
295
+ }
296
+ } else {
297
+ # PortableGit does not ship a 32-bit build — fall back to MinGit 32-bit
298
+ # with a warning that bash-based features will be unavailable.
299
+ "32-bit-mingit"
300
+ }
301
+
302
+ $releaseApi = "https://api.github.com/repos/git-for-windows/git/releases/latest"
303
+ $release = Invoke-RestMethod -Uri $releaseApi -UseBasicParsing -Headers @{ "User-Agent" = "hermes-installer" }
304
+
305
+ if ($arch -eq "32-bit-mingit") {
306
+ Write-Warn "32-bit Windows detected — PortableGit is 64-bit only. Installing MinGit 32-bit as a last resort; bash-dependent Hermes features (terminal tool, agent-browser) will not work on this machine."
307
+ $assetPattern = "MinGit-*-32-bit.zip"
308
+ $downloadIsZip = $true
309
+ } elseif ($arch -eq "arm64") {
310
+ $assetPattern = "PortableGit-*-arm64.7z.exe"
311
+ $downloadIsZip = $false
312
+ } else {
313
+ $assetPattern = "PortableGit-*-64-bit.7z.exe"
314
+ $downloadIsZip = $false
315
+ }
316
+
317
+ $asset = $release.assets | Where-Object { $_.name -like $assetPattern } | Select-Object -First 1
318
+
319
+ if (-not $asset) {
320
+ throw "Could not find $assetPattern in latest git-for-windows release"
321
+ }
322
+
323
+ $downloadUrl = $asset.browser_download_url
324
+ $downloadExt = if ($downloadIsZip) { "zip" } else { "7z.exe" }
325
+ $tmpFile = "$env:TEMP\$($asset.name)"
326
+ $gitDir = "$HermesHome\git"
327
+
328
+ Write-Info "Downloading $($asset.name) ($([math]::Round($asset.size / 1MB, 1)) MB)..."
329
+ Invoke-WebRequest -Uri $downloadUrl -OutFile $tmpFile -UseBasicParsing
330
+
331
+ if (Test-Path $gitDir) {
332
+ Write-Info "Removing previous Git install at $gitDir ..."
333
+ Remove-Item -Recurse -Force $gitDir
334
+ }
335
+ New-Item -ItemType Directory -Path $gitDir -Force | Out-Null
336
+
337
+ if ($downloadIsZip) {
338
+ Expand-Archive -Path $tmpFile -DestinationPath $gitDir -Force
339
+ } else {
340
+ # PortableGit is a self-extracting 7z archive. Invoke it with
341
+ # `-o<target> -y` (silent) to extract to $gitDir. No 7z install
342
+ # required; it's fully self-contained.
343
+ Write-Info "Extracting PortableGit to $gitDir ..."
344
+ $extractProc = Start-Process -FilePath $tmpFile `
345
+ -ArgumentList "-o`"$gitDir`"", "-y" `
346
+ -NoNewWindow -Wait -PassThru
347
+ if ($extractProc.ExitCode -ne 0) {
348
+ throw "PortableGit extraction failed (exit code $($extractProc.ExitCode))"
349
+ }
350
+ }
351
+ Remove-Item -Force $tmpFile -ErrorAction SilentlyContinue
352
+
353
+ # PortableGit layout: cmd\git.exe + bin\bash.exe + usr\bin\ (coreutils)
354
+ # MinGit layout: cmd\git.exe + usr\bin\bash.exe (if present)
355
+ $gitExe = "$gitDir\cmd\git.exe"
356
+ if (-not (Test-Path $gitExe)) {
357
+ throw "Git extraction did not produce git.exe at $gitExe"
358
+ }
359
+
360
+ # Add to session PATH so the rest of this install run can use git.
361
+ $env:Path = "$gitDir\cmd;$env:Path"
362
+
363
+ # Persist to User PATH so fresh shells see it. PortableGit needs
364
+ # cmd\ (for git.exe), bin\ (for bash.exe + core tools), and
365
+ # usr\bin\ (for perl, ssh, curl, and other POSIX coreutils).
366
+ $newPathEntries = @(
367
+ "$gitDir\cmd",
368
+ "$gitDir\bin",
369
+ "$gitDir\usr\bin"
370
+ )
371
+ $userPath = [Environment]::GetEnvironmentVariable("Path", "User")
372
+ $userPathItems = if ($userPath) { $userPath -split ";" } else { @() }
373
+ $changed = $false
374
+ foreach ($entry in $newPathEntries) {
375
+ if ($userPathItems -notcontains $entry) {
376
+ $userPathItems += $entry
377
+ $changed = $true
378
+ }
379
+ }
380
+ if ($changed) {
381
+ [Environment]::SetEnvironmentVariable("Path", ($userPathItems -join ";"), "User")
382
+ }
383
+
384
+ $version = & $gitExe --version
385
+ Write-Success "Git $version installed to $gitDir (portable, user-scoped)"
386
+ Set-GitBashEnvVar
387
+ return $true
388
+ } catch {
389
+ Write-Err "Could not install portable Git: $_"
390
+ Write-Info ""
391
+ Write-Info "Fallback: install Git manually from https://git-scm.com/download/win"
392
+ Write-Info "then re-run this installer. Hermes needs Git Bash on Windows to run"
393
+ Write-Info "shell commands (same as Claude Code and other coding agents)."
394
+ return $false
395
+ }
396
+ }
397
+
398
+ function Set-GitBashEnvVar {
399
+ <#
400
+ .SYNOPSIS
401
+ Locate ``bash.exe`` from an already-installed Git and persist the path in
402
+ ``HERMES_GIT_BASH_PATH`` (User env scope) so Hermes can find it even before
403
+ PATH propagation completes in a newly-spawned shell.
404
+ #>
405
+ $candidates = @()
406
+
407
+ # Our own portable Git install is ALWAYS checked first, so a broken
408
+ # system Git doesn't hijack us. If the user had a working system Git
409
+ # we'd have returned early from Install-Git's fast path and never called
410
+ # this with a system-Git-only installation anyway.
411
+ #
412
+ # Layouts:
413
+ # PortableGit (our default): $HermesHome\git\bin\bash.exe
414
+ # MinGit (32-bit fallback): $HermesHome\git\usr\bin\bash.exe
415
+ $candidates += "$HermesHome\git\bin\bash.exe" # PortableGit layout (primary)
416
+ $candidates += "$HermesHome\git\usr\bin\bash.exe" # MinGit / PortableGit usr\bin fallback
417
+
418
+ # git.exe on PATH can tell us where the install root is
419
+ $gitCmd = Get-Command git -ErrorAction SilentlyContinue
420
+ if ($gitCmd) {
421
+ $gitExe = $gitCmd.Source
422
+ # Git for Windows (full installer): <root>\cmd\git.exe + <root>\bin\bash.exe
423
+ # MinGit: <root>\cmd\git.exe + <root>\usr\bin\bash.exe
424
+ $gitRoot = Split-Path (Split-Path $gitExe -Parent) -Parent
425
+ $candidates += "$gitRoot\bin\bash.exe"
426
+ $candidates += "$gitRoot\usr\bin\bash.exe"
427
+ }
428
+
429
+ # Standard system install locations as a final fallback. Note:
430
+ # ProgramFiles(x86) can't be referenced via ${env:...} string interpolation
431
+ # because of the parens — use [Environment]::GetEnvironmentVariable().
432
+ $candidates += "${env:ProgramFiles}\Git\bin\bash.exe"
433
+ $pf86 = [Environment]::GetEnvironmentVariable("ProgramFiles(x86)")
434
+ if ($pf86) { $candidates += "$pf86\Git\bin\bash.exe" }
435
+ $candidates += "${env:LocalAppData}\Programs\Git\bin\bash.exe"
436
+
437
+ foreach ($candidate in $candidates) {
438
+ if ($candidate -and (Test-Path $candidate)) {
439
+ [Environment]::SetEnvironmentVariable("HERMES_GIT_BASH_PATH", $candidate, "User")
440
+ $env:HERMES_GIT_BASH_PATH = $candidate
441
+ Write-Info "Set HERMES_GIT_BASH_PATH=$candidate"
442
+ return
443
+ }
444
+ }
445
+
446
+ Write-Warn "Could not locate bash.exe — Hermes may not find Git Bash."
447
+ Write-Info "If needed, set HERMES_GIT_BASH_PATH manually to your bash.exe path."
448
+ }
449
+
450
+ function Test-Node {
451
+ Write-Info "Checking Node.js (for browser tools)..."
452
+
453
+ if (Get-Command node -ErrorAction SilentlyContinue) {
454
+ $version = node --version
455
+ Write-Success "Node.js $version found"
456
+ $script:HasNode = $true
457
+ return $true
458
+ }
459
+
460
+ # Check our own managed install from a previous run
461
+ $managedNode = "$HermesHome\node\node.exe"
462
+ if (Test-Path $managedNode) {
463
+ $version = & $managedNode --version
464
+ $env:Path = "$HermesHome\node;$env:Path"
465
+ Write-Success "Node.js $version found (Hermes-managed)"
466
+ $script:HasNode = $true
467
+ return $true
468
+ }
469
+
470
+ Write-Info "Node.js not found — installing Node.js $NodeVersion LTS..."
471
+
472
+ # Try winget first (cleanest on modern Windows)
473
+ if (Get-Command winget -ErrorAction SilentlyContinue) {
474
+ Write-Info "Installing via winget..."
475
+ try {
476
+ winget install OpenJS.NodeJS.LTS --silent --accept-package-agreements --accept-source-agreements 2>&1 | Out-Null
477
+ # Refresh PATH
478
+ $env:Path = [Environment]::GetEnvironmentVariable("Path", "User") + ";" + [Environment]::GetEnvironmentVariable("Path", "Machine")
479
+ if (Get-Command node -ErrorAction SilentlyContinue) {
480
+ $version = node --version
481
+ Write-Success "Node.js $version installed via winget"
482
+ $script:HasNode = $true
483
+ return $true
484
+ }
485
+ } catch { }
486
+ }
487
+
488
+ # Fallback: download binary zip to ~/.hermes/node/
489
+ Write-Info "Downloading Node.js $NodeVersion binary..."
490
+ try {
491
+ $arch = if ([Environment]::Is64BitOperatingSystem) { "x64" } else { "x86" }
492
+ $indexUrl = "https://nodejs.org/dist/latest-v${NodeVersion}.x/"
493
+ $indexPage = Invoke-WebRequest -Uri $indexUrl -UseBasicParsing
494
+ $zipName = ($indexPage.Content | Select-String -Pattern "node-v${NodeVersion}\.\d+\.\d+-win-${arch}\.zip" -AllMatches).Matches[0].Value
495
+
496
+ if ($zipName) {
497
+ $downloadUrl = "${indexUrl}${zipName}"
498
+ $tmpZip = "$env:TEMP\$zipName"
499
+ $tmpDir = "$env:TEMP\hermes-node-extract"
500
+
501
+ Invoke-WebRequest -Uri $downloadUrl -OutFile $tmpZip -UseBasicParsing
502
+ if (Test-Path $tmpDir) { Remove-Item -Recurse -Force $tmpDir }
503
+ Expand-Archive -Path $tmpZip -DestinationPath $tmpDir -Force
504
+
505
+ $extractedDir = Get-ChildItem $tmpDir -Directory | Select-Object -First 1
506
+ if ($extractedDir) {
507
+ if (Test-Path "$HermesHome\node") { Remove-Item -Recurse -Force "$HermesHome\node" }
508
+ Move-Item $extractedDir.FullName "$HermesHome\node"
509
+ $env:Path = "$HermesHome\node;$env:Path"
510
+
511
+ $version = & "$HermesHome\node\node.exe" --version
512
+ Write-Success "Node.js $version installed to ~/.hermes/node/"
513
+ $script:HasNode = $true
514
+
515
+ Remove-Item -Force $tmpZip -ErrorAction SilentlyContinue
516
+ Remove-Item -Recurse -Force $tmpDir -ErrorAction SilentlyContinue
517
+ return $true
518
+ }
519
+ }
520
+ } catch {
521
+ Write-Warn "Download failed: $_"
522
+ }
523
+
524
+ Write-Warn "Could not auto-install Node.js"
525
+ Write-Info "Install manually: https://nodejs.org/en/download/"
526
+ $script:HasNode = $false
527
+ return $true
528
+ }
529
+
530
+ function Install-SystemPackages {
531
+ $script:HasRipgrep = $false
532
+ $script:HasFfmpeg = $false
533
+ $needRipgrep = $false
534
+ $needFfmpeg = $false
535
+
536
+ Write-Info "Checking ripgrep (fast file search)..."
537
+ if (Get-Command rg -ErrorAction SilentlyContinue) {
538
+ $version = rg --version | Select-Object -First 1
539
+ Write-Success "$version found"
540
+ $script:HasRipgrep = $true
541
+ } else {
542
+ $needRipgrep = $true
543
+ }
544
+
545
+ Write-Info "Checking ffmpeg (TTS voice messages)..."
546
+ if (Get-Command ffmpeg -ErrorAction SilentlyContinue) {
547
+ Write-Success "ffmpeg found"
548
+ $script:HasFfmpeg = $true
549
+ } else {
550
+ $needFfmpeg = $true
551
+ }
552
+
553
+ if (-not $needRipgrep -and -not $needFfmpeg) { return }
554
+
555
+ # Build description and package lists for each package manager
556
+ $descParts = @()
557
+ $wingetPkgs = @()
558
+ $chocoPkgs = @()
559
+ $scoopPkgs = @()
560
+
561
+ if ($needRipgrep) {
562
+ $descParts += "ripgrep for faster file search"
563
+ $wingetPkgs += "BurntSushi.ripgrep.MSVC"
564
+ $chocoPkgs += "ripgrep"
565
+ $scoopPkgs += "ripgrep"
566
+ }
567
+ if ($needFfmpeg) {
568
+ $descParts += "ffmpeg for TTS voice messages"
569
+ $wingetPkgs += "Gyan.FFmpeg"
570
+ $chocoPkgs += "ffmpeg"
571
+ $scoopPkgs += "ffmpeg"
572
+ }
573
+
574
+ $description = $descParts -join " and "
575
+ $hasWinget = Get-Command winget -ErrorAction SilentlyContinue
576
+ $hasChoco = Get-Command choco -ErrorAction SilentlyContinue
577
+ $hasScoop = Get-Command scoop -ErrorAction SilentlyContinue
578
+
579
+ # Try winget first (most common on modern Windows)
580
+ if ($hasWinget) {
581
+ Write-Info "Installing $description via winget..."
582
+ foreach ($pkg in $wingetPkgs) {
583
+ try {
584
+ winget install $pkg --silent --accept-package-agreements --accept-source-agreements 2>&1 | Out-Null
585
+ } catch { }
586
+ }
587
+ # Refresh PATH and recheck
588
+ $env:Path = [Environment]::GetEnvironmentVariable("Path", "User") + ";" + [Environment]::GetEnvironmentVariable("Path", "Machine")
589
+ if ($needRipgrep -and (Get-Command rg -ErrorAction SilentlyContinue)) {
590
+ Write-Success "ripgrep installed"
591
+ $script:HasRipgrep = $true
592
+ $needRipgrep = $false
593
+ }
594
+ if ($needFfmpeg -and (Get-Command ffmpeg -ErrorAction SilentlyContinue)) {
595
+ Write-Success "ffmpeg installed"
596
+ $script:HasFfmpeg = $true
597
+ $needFfmpeg = $false
598
+ }
599
+ if (-not $needRipgrep -and -not $needFfmpeg) { return }
600
+ }
601
+
602
+ # Fallback: choco
603
+ if ($hasChoco -and ($needRipgrep -or $needFfmpeg)) {
604
+ Write-Info "Trying Chocolatey..."
605
+ foreach ($pkg in $chocoPkgs) {
606
+ try { choco install $pkg -y 2>&1 | Out-Null } catch { }
607
+ }
608
+ if ($needRipgrep -and (Get-Command rg -ErrorAction SilentlyContinue)) {
609
+ Write-Success "ripgrep installed via chocolatey"
610
+ $script:HasRipgrep = $true
611
+ $needRipgrep = $false
612
+ }
613
+ if ($needFfmpeg -and (Get-Command ffmpeg -ErrorAction SilentlyContinue)) {
614
+ Write-Success "ffmpeg installed via chocolatey"
615
+ $script:HasFfmpeg = $true
616
+ $needFfmpeg = $false
617
+ }
618
+ }
619
+
620
+ # Fallback: scoop
621
+ if ($hasScoop -and ($needRipgrep -or $needFfmpeg)) {
622
+ Write-Info "Trying Scoop..."
623
+ foreach ($pkg in $scoopPkgs) {
624
+ try { scoop install $pkg 2>&1 | Out-Null } catch { }
625
+ }
626
+ if ($needRipgrep -and (Get-Command rg -ErrorAction SilentlyContinue)) {
627
+ Write-Success "ripgrep installed via scoop"
628
+ $script:HasRipgrep = $true
629
+ $needRipgrep = $false
630
+ }
631
+ if ($needFfmpeg -and (Get-Command ffmpeg -ErrorAction SilentlyContinue)) {
632
+ Write-Success "ffmpeg installed via scoop"
633
+ $script:HasFfmpeg = $true
634
+ $needFfmpeg = $false
635
+ }
636
+ }
637
+
638
+ # Show manual instructions for anything still missing
639
+ if ($needRipgrep) {
640
+ Write-Warn "ripgrep not installed (file search will use findstr fallback)"
641
+ Write-Info " winget install BurntSushi.ripgrep.MSVC"
642
+ }
643
+ if ($needFfmpeg) {
644
+ Write-Warn "ffmpeg not installed (TTS voice messages will be limited)"
645
+ Write-Info " winget install Gyan.FFmpeg"
646
+ }
647
+ }
648
+
649
+ # ============================================================================
650
+ # Installation
651
+ # ============================================================================
652
+
653
+ function Install-Repository {
654
+ Write-Info "Installing to $InstallDir..."
655
+
656
+ $didUpdate = $false
657
+
658
+ if (Test-Path $InstallDir) {
659
+ # Test-Path "$InstallDir\.git" returns True when .git is a file OR a
660
+ # directory OR a symlink OR a submodule-style gitfile — and also when
661
+ # it's a broken stub left over from a failed previous install (e.g.
662
+ # a partial Remove-Item that couldn't delete a locked index.lock).
663
+ # Validate the repo properly by asking git itself. Two checks
664
+ # belt-and-braces: rev-parse AND git status. If either fails the
665
+ # repo is broken and we fall through to a fresh clone.
666
+ $repoValid = $false
667
+ if (Test-Path "$InstallDir\.git") {
668
+ Push-Location $InstallDir
669
+ try {
670
+ # Reset $LASTEXITCODE before the probe so we don't pick up
671
+ # a stale 0 from an earlier git call in this session.
672
+ $global:LASTEXITCODE = 0
673
+ $revParseOut = & git -c windows.appendAtomically=false rev-parse --is-inside-work-tree 2>&1
674
+ $revParseOk = ($LASTEXITCODE -eq 0) -and ($revParseOut -match "true")
675
+
676
+ $global:LASTEXITCODE = 0
677
+ $null = & git -c windows.appendAtomically=false status --short 2>&1
678
+ $statusOk = ($LASTEXITCODE -eq 0)
679
+
680
+ if ($revParseOk -and $statusOk) {
681
+ $repoValid = $true
682
+ }
683
+ } catch {}
684
+ Pop-Location
685
+ }
686
+
687
+ if ($repoValid) {
688
+ Write-Info "Existing installation found, updating..."
689
+ Push-Location $InstallDir
690
+ try {
691
+ git -c windows.appendAtomically=false fetch origin
692
+ if ($LASTEXITCODE -ne 0) { throw "git fetch failed (exit $LASTEXITCODE)" }
693
+ git -c windows.appendAtomically=false checkout $Branch
694
+ if ($LASTEXITCODE -ne 0) { throw "git checkout $Branch failed (exit $LASTEXITCODE)" }
695
+ git -c windows.appendAtomically=false pull origin $Branch
696
+ if ($LASTEXITCODE -ne 0) { throw "git pull failed (exit $LASTEXITCODE)" }
697
+ } finally {
698
+ Pop-Location
699
+ }
700
+ $didUpdate = $true
701
+ } else {
702
+ # Directory exists but isn't a usable git repo. Wipe it and
703
+ # fall through to a fresh clone. A leftover ``.git`` stub from
704
+ # a partial uninstall used to lock the installer into the
705
+ # "update" branch forever, emitting three ``fatal: not a git
706
+ # repository`` errors and failing with "not in a git directory".
707
+ Write-Warn "Existing directory at $InstallDir is not a valid git repo — replacing it."
708
+ try {
709
+ Remove-Item -Recurse -Force $InstallDir -ErrorAction Stop
710
+ } catch {
711
+ Write-Err "Could not remove $InstallDir : $_"
712
+ Write-Info "Close any programs that might be using files in $InstallDir (editors,"
713
+ Write-Info "terminals, running hermes processes) and try again."
714
+ throw
715
+ }
716
+ }
717
+ }
718
+
719
+ if (-not $didUpdate) {
720
+ $cloneSuccess = $false
721
+
722
+ # Fix Windows git "copy-fd: write returned: Invalid argument" error.
723
+ # Git for Windows can fail on atomic file operations (hook templates,
724
+ # config lock files) due to antivirus, OneDrive, or NTFS filter drivers.
725
+ # The -c flag injects config before any file I/O occurs.
726
+ Write-Info "Configuring git for Windows compatibility..."
727
+ $env:GIT_CONFIG_COUNT = "1"
728
+ $env:GIT_CONFIG_KEY_0 = "windows.appendAtomically"
729
+ $env:GIT_CONFIG_VALUE_0 = "false"
730
+ git config --global windows.appendAtomically false 2>$null
731
+
732
+ # Try SSH first, then HTTPS, with -c flag for atomic write fix
733
+ Write-Info "Trying SSH clone..."
734
+ $env:GIT_SSH_COMMAND = "ssh -o BatchMode=yes -o ConnectTimeout=5"
735
+ try {
736
+ git -c windows.appendAtomically=false clone --branch $Branch --recurse-submodules $RepoUrlSsh $InstallDir
737
+ if ($LASTEXITCODE -eq 0) { $cloneSuccess = $true }
738
+ } catch { }
739
+ $env:GIT_SSH_COMMAND = $null
740
+
741
+ if (-not $cloneSuccess) {
742
+ if (Test-Path $InstallDir) { Remove-Item -Recurse -Force $InstallDir -ErrorAction SilentlyContinue }
743
+ Write-Info "SSH failed, trying HTTPS..."
744
+ try {
745
+ git -c windows.appendAtomically=false clone --branch $Branch --recurse-submodules $RepoUrlHttps $InstallDir
746
+ if ($LASTEXITCODE -eq 0) { $cloneSuccess = $true }
747
+ } catch { }
748
+ }
749
+
750
+ # Fallback: download ZIP archive (bypasses git file I/O issues entirely)
751
+ if (-not $cloneSuccess) {
752
+ if (Test-Path $InstallDir) { Remove-Item -Recurse -Force $InstallDir -ErrorAction SilentlyContinue }
753
+ Write-Warn "Git clone failed — downloading ZIP archive instead..."
754
+ try {
755
+ $zipUrl = "https://github.com/NousResearch/hermes-agent/archive/refs/heads/$Branch.zip"
756
+ $zipPath = "$env:TEMP\hermes-agent-$Branch.zip"
757
+ $extractPath = "$env:TEMP\hermes-agent-extract"
758
+
759
+ Invoke-WebRequest -Uri $zipUrl -OutFile $zipPath -UseBasicParsing
760
+ if (Test-Path $extractPath) { Remove-Item -Recurse -Force $extractPath }
761
+ Expand-Archive -Path $zipPath -DestinationPath $extractPath -Force
762
+
763
+ # GitHub ZIPs extract to repo-branch/ subdirectory
764
+ $extractedDir = Get-ChildItem $extractPath -Directory | Select-Object -First 1
765
+ if ($extractedDir) {
766
+ New-Item -ItemType Directory -Force -Path (Split-Path $InstallDir) -ErrorAction SilentlyContinue | Out-Null
767
+ Move-Item $extractedDir.FullName $InstallDir -Force
768
+ Write-Success "Downloaded and extracted"
769
+
770
+ # Initialize git repo so updates work later
771
+ Push-Location $InstallDir
772
+ git -c windows.appendAtomically=false init 2>$null
773
+ git -c windows.appendAtomically=false config windows.appendAtomically false 2>$null
774
+ git remote add origin $RepoUrlHttps 2>$null
775
+ Pop-Location
776
+ Write-Success "Git repo initialized for future updates"
777
+
778
+ $cloneSuccess = $true
779
+ }
780
+
781
+ # Cleanup temp files
782
+ Remove-Item -Force $zipPath -ErrorAction SilentlyContinue
783
+ Remove-Item -Recurse -Force $extractPath -ErrorAction SilentlyContinue
784
+ } catch {
785
+ Write-Err "ZIP download also failed: $_"
786
+ }
787
+ }
788
+
789
+ if (-not $cloneSuccess) {
790
+ throw "Failed to download repository (tried git clone SSH, HTTPS, and ZIP)"
791
+ }
792
+ }
793
+
794
+ # Set per-repo config (harmless if it fails)
795
+ Push-Location $InstallDir
796
+ git -c windows.appendAtomically=false config windows.appendAtomically false 2>$null
797
+
798
+ # Ensure submodules are initialized and updated
799
+ Write-Info "Initializing submodules..."
800
+ git -c windows.appendAtomically=false submodule update --init --recursive 2>$null
801
+ if ($LASTEXITCODE -ne 0) {
802
+ Write-Warn "Submodule init failed (terminal/RL tools may need manual setup)"
803
+ } else {
804
+ Write-Success "Submodules ready"
805
+ }
806
+ Pop-Location
807
+
808
+ Write-Success "Repository ready"
809
+ }
810
+
811
+ function Install-Venv {
812
+ if ($NoVenv) {
813
+ Write-Info "Skipping virtual environment (-NoVenv)"
814
+ return
815
+ }
816
+
817
+ Write-Info "Creating virtual environment with Python $PythonVersion..."
818
+
819
+ Push-Location $InstallDir
820
+
821
+ if (Test-Path "venv") {
822
+ Write-Info "Virtual environment already exists, recreating..."
823
+ Remove-Item -Recurse -Force "venv"
824
+ }
825
+
826
+ # uv creates the venv and pins the Python version in one step
827
+ & $UvCmd venv venv --python $PythonVersion
828
+
829
+ Pop-Location
830
+
831
+ Write-Success "Virtual environment ready (Python $PythonVersion)"
832
+ }
833
+
834
+ function Install-Dependencies {
835
+ Write-Info "Installing dependencies..."
836
+
837
+ Push-Location $InstallDir
838
+
839
+ if (-not $NoVenv) {
840
+ # Tell uv to install into our venv (no activation needed)
841
+ $env:VIRTUAL_ENV = "$InstallDir\venv"
842
+ }
843
+
844
+ # Hash-verified install (Tier 0) — when uv.lock is present, prefer
845
+ # `uv sync --locked`. The lockfile records SHA256 hashes for every
846
+ # transitive dependency, so a compromised transitive (different hash
847
+ # than what we shipped) is REJECTED by the resolver. This is the
848
+ # *only* path that protects against the "direct dep is fine, but the
849
+ # dep's dep got worm-poisoned overnight" failure mode. The
850
+ # `uv pip install` tiers below re-resolve transitives fresh from PyPI
851
+ # without any hash verification — they exist to keep installs working
852
+ # when the lockfile is stale, missing, or out-of-sync with the
853
+ # current extras spec, NOT because they're equivalent in posture.
854
+ if (Test-Path "uv.lock") {
855
+ Write-Info "Trying tier: hash-verified (uv.lock) ..."
856
+ # Critical flag choice: `--extra all`, NOT `--all-extras`.
857
+ # --all-extras = every [project.optional-dependencies] key,
858
+ # bypassing the curated [all] extra. On Windows
859
+ # that means [matrix] -> python-olm (no wheel,
860
+ # needs `make` to build from sdist) and the
861
+ # install fails.
862
+ # --extra all = just the [all] extra's contents (curated).
863
+ #
864
+ # UV_PROJECT_ENVIRONMENT pins the sync target to our venv\.
865
+ # Without it, modern uv (>=0.5) ignores VIRTUAL_ENV for `sync`
866
+ # and creates a sibling .venv\ inside the repo — leaving venv\
867
+ # empty and producing the broken state where `hermes.exe` exists
868
+ # in the wrong directory and imports fail with ModuleNotFoundError.
869
+ # (Mirrors the same flag in scripts/install.sh::install_deps.)
870
+ $env:UV_PROJECT_ENVIRONMENT = "$InstallDir\venv"
871
+ & $UvCmd sync --extra all --locked
872
+ if ($LASTEXITCODE -eq 0) {
873
+ Write-Success "Main package installed (hash-verified via uv.lock)"
874
+ $script:InstalledTier = "hash-verified (uv.lock)"
875
+ # Skip the rest of the tiered cascade — we already have a
876
+ # complete, hash-verified install.
877
+ $skipPipFallback = $true
878
+ } else {
879
+ Write-Warn "uv.lock sync failed (lockfile may be stale), falling back to PyPI resolve..."
880
+ $skipPipFallback = $false
881
+ }
882
+ } else {
883
+ Write-Info "uv.lock not found — falling back to PyPI resolve (no hash verification)"
884
+ $skipPipFallback = $false
885
+ }
886
+
887
+ # Install main package. Tiered fallback so a single flaky transitive
888
+ # doesn't silently drop everything. Each tier's stdout/stderr is
889
+ # preserved — no Out-Null swallowing — so the user can see what failed.
890
+ #
891
+ # Tier 1: [all] — the curated extra in pyproject.toml.
892
+ # Tier 2: [all] minus the currently-broken extras list ($brokenExtras).
893
+ # Edit $brokenExtras below when something on PyPI breaks; this
894
+ # lets users keep the rest of [all] when one transitive is
895
+ # unavailable. The list of [all]'s contents is parsed from
896
+ # pyproject.toml at runtime — there is NO hand-mirrored copy
897
+ # to drift out of sync.
898
+ # Tier 3: bare `.` — last-resort so at least the core CLI launches.
899
+
900
+ # Currently-broken extras. Edit this list when an upstream package
901
+ # gets quarantined / yanked / breaks resolution. Empty means everything
902
+ # in [all] should be installable; populate with the names of extras
903
+ # whose deps are temporarily unavailable.
904
+ $brokenExtras = @()
905
+
906
+ # Parse [project.optional-dependencies].all from pyproject.toml.
907
+ # tomllib is stdlib on Python 3.11+ which the bootstrap guarantees.
908
+ $pythonExeForParse = if (-not $NoVenv) { "$InstallDir\venv\Scripts\python.exe" } else { (& $UvCmd python find $PythonVersion) }
909
+ $allExtras = @()
910
+ if (Test-Path $pythonExeForParse) {
911
+ $parsed = & $pythonExeForParse -c @"
912
+ import re, sys, tomllib
913
+ try:
914
+ with open('pyproject.toml', 'rb') as fh:
915
+ data = tomllib.load(fh)
916
+ specs = data['project']['optional-dependencies']['all']
917
+ out = []
918
+ for s in specs:
919
+ m = re.search(r'hermes-agent\[([\w-]+)\]', s)
920
+ if m: out.append(m.group(1))
921
+ print(','.join(out))
922
+ except Exception:
923
+ sys.exit(1)
924
+ "@ 2>$null
925
+ if ($LASTEXITCODE -eq 0 -and $parsed) {
926
+ $allExtras = $parsed.Trim().Split(',')
927
+ }
928
+ }
929
+ if (-not $allExtras -or $allExtras.Count -eq 0) {
930
+ Write-Warn "Could not parse [all] from pyproject.toml; Tier 2 will be a no-op."
931
+ $safeAll = "all"
932
+ } else {
933
+ $safeAll = ($allExtras | Where-Object { $brokenExtras -notcontains $_ }) -join ","
934
+ }
935
+ $brokenLabel = if ($brokenExtras) { ($brokenExtras -join ", ") } else { "none" }
936
+
937
+ $installTiers = @(
938
+ @{ Name = "all"; Spec = ".[all]" },
939
+ @{ Name = "all minus known-broken ($brokenLabel)"; Spec = ".[$safeAll]" },
940
+ @{ Name = "core only (no extras)"; Spec = "." }
941
+ )
942
+ $installed = $skipPipFallback
943
+ if (-not $skipPipFallback) {
944
+ foreach ($tier in $installTiers) {
945
+ Write-Info "Trying tier: $($tier.Name) ..."
946
+ & $UvCmd pip install -e $tier.Spec
947
+ if ($LASTEXITCODE -eq 0) {
948
+ Write-Success "Main package installed ($($tier.Name))"
949
+ $script:InstalledTier = $tier.Name
950
+ $installed = $true
951
+ break
952
+ }
953
+ Write-Warn "Tier '$($tier.Name)' failed (exit $LASTEXITCODE). Trying next tier..."
954
+ }
955
+ }
956
+ if (-not $installed) {
957
+ throw "Failed to install hermes-agent package even with no extras. Inspect the uv pip install output above."
958
+ }
959
+
960
+ # Baseline-import gate. Even if a tier reported success above, the
961
+ # actual deps may have landed somewhere other than $InstallDir\venv\
962
+ # (e.g. uv 0.5+ syncing into a sibling .venv\ when UV_PROJECT_ENVIRONMENT
963
+ # isn't set, leaving venv\ empty and hermes.exe broken with
964
+ # `ModuleNotFoundError: No module named 'dotenv'` on first run).
965
+ # We probe via the venv's own python so a misdirected sync is caught
966
+ # here, not 30 seconds later when the user runs `hermes`.
967
+ if (-not $NoVenv) {
968
+ $venvPython = "$InstallDir\venv\Scripts\python.exe"
969
+ if (-not (Test-Path $venvPython)) {
970
+ throw "Install reported success but $venvPython does not exist. The dependency sync likely landed in a sibling .venv\ directory. Re-run the installer; if it persists, manually: cd '$InstallDir'; Remove-Item -Recurse -Force venv,.venv; uv venv venv --python $PythonVersion; `$env:UV_PROJECT_ENVIRONMENT='$InstallDir\venv'; uv sync --extra all --locked"
971
+ }
972
+ & $venvPython -c "import dotenv, openai, rich, prompt_toolkit" 2>&1 | Out-Null
973
+ if ($LASTEXITCODE -ne 0) {
974
+ $sibling = "$InstallDir\.venv"
975
+ $hint = if (Test-Path $sibling) {
976
+ "Detected sibling .venv\ at $sibling — uv synced there instead of venv\. Recover with: cd '$InstallDir'; Remove-Item -Recurse -Force venv; Move-Item .venv venv"
977
+ } else {
978
+ "Recover with: cd '$InstallDir'; `$env:UV_PROJECT_ENVIRONMENT='$InstallDir\venv'; uv sync --extra all --locked"
979
+ }
980
+ throw "Baseline imports failed in $InstallDir\venv (dotenv/openai/rich/prompt_toolkit). The install completed but dependencies are not in the venv. $hint"
981
+ }
982
+ Write-Success "Baseline imports verified in venv"
983
+ }
984
+
985
+ # Verify the dashboard deps specifically — they're the most common thing
986
+ # users hit and lazy-import errors from `hermes dashboard` are confusing.
987
+ # If tier 1 failed (the common case), [web] was still picked up by tiers
988
+ # 2-3; only tier 4 leaves you without it.
989
+ $pythonExe = if (-not $NoVenv) { "$InstallDir\venv\Scripts\python.exe" } else { (& $UvCmd python find $PythonVersion) }
990
+ if (Test-Path $pythonExe) {
991
+ $webOk = $false
992
+ try {
993
+ & $pythonExe -c "import fastapi, uvicorn" 2>&1 | Out-Null
994
+ if ($LASTEXITCODE -eq 0) { $webOk = $true }
995
+ } catch { }
996
+ if (-not $webOk) {
997
+ Write-Warn "fastapi/uvicorn not importable — `hermes dashboard` will not work."
998
+ Write-Info "Attempting targeted install of [web] extra as last resort..."
999
+ & $UvCmd pip install -e ".[web]"
1000
+ if ($LASTEXITCODE -eq 0) {
1001
+ Write-Success "[web] extra installed; `hermes dashboard` should now work."
1002
+ } else {
1003
+ Write-Warn "Could not install [web] extra. Run manually: uv pip install --python `"$pythonExe`" `"fastapi>=0.104,<1`" `"uvicorn[standard]>=0.24,<1`""
1004
+ }
1005
+ }
1006
+ }
1007
+
1008
+ Pop-Location
1009
+
1010
+ Write-Success "All dependencies installed"
1011
+ }
1012
+
1013
+ function Set-PathVariable {
1014
+ Write-Info "Setting up hermes command..."
1015
+
1016
+ if ($NoVenv) {
1017
+ $hermesBin = "$InstallDir"
1018
+ } else {
1019
+ $hermesBin = "$InstallDir\venv\Scripts"
1020
+ }
1021
+
1022
+ # Add the venv Scripts dir to user PATH so hermes is globally available
1023
+ # On Windows, the hermes.exe in venv\Scripts\ has the venv Python baked in
1024
+ $currentPath = [Environment]::GetEnvironmentVariable("Path", "User")
1025
+
1026
+ if ($currentPath -notlike "*$hermesBin*") {
1027
+ [Environment]::SetEnvironmentVariable(
1028
+ "Path",
1029
+ "$hermesBin;$currentPath",
1030
+ "User"
1031
+ )
1032
+ Write-Success "Added to user PATH: $hermesBin"
1033
+ } else {
1034
+ Write-Info "PATH already configured"
1035
+ }
1036
+
1037
+ # Set HERMES_HOME so the Python code finds config/data in the right place.
1038
+ # Only needed on Windows where we install to %LOCALAPPDATA%\hermes instead
1039
+ # of the Unix default ~/.hermes
1040
+ $currentHermesHome = [Environment]::GetEnvironmentVariable("HERMES_HOME", "User")
1041
+ if (-not $currentHermesHome -or $currentHermesHome -ne $HermesHome) {
1042
+ [Environment]::SetEnvironmentVariable("HERMES_HOME", $HermesHome, "User")
1043
+ Write-Success "Set HERMES_HOME=$HermesHome"
1044
+ }
1045
+ $env:HERMES_HOME = $HermesHome
1046
+
1047
+ # Update current session
1048
+ $env:Path = "$hermesBin;$env:Path"
1049
+
1050
+ Write-Success "hermes command ready"
1051
+ }
1052
+
1053
+ function Copy-ConfigTemplates {
1054
+ Write-Info "Setting up configuration files..."
1055
+
1056
+ # Create ~/.hermes directory structure
1057
+ New-Item -ItemType Directory -Force -Path "$HermesHome\cron" | Out-Null
1058
+ New-Item -ItemType Directory -Force -Path "$HermesHome\sessions" | Out-Null
1059
+ New-Item -ItemType Directory -Force -Path "$HermesHome\logs" | Out-Null
1060
+ New-Item -ItemType Directory -Force -Path "$HermesHome\pairing" | Out-Null
1061
+ New-Item -ItemType Directory -Force -Path "$HermesHome\hooks" | Out-Null
1062
+ New-Item -ItemType Directory -Force -Path "$HermesHome\image_cache" | Out-Null
1063
+ New-Item -ItemType Directory -Force -Path "$HermesHome\audio_cache" | Out-Null
1064
+ New-Item -ItemType Directory -Force -Path "$HermesHome\memories" | Out-Null
1065
+ New-Item -ItemType Directory -Force -Path "$HermesHome\skills" | Out-Null
1066
+
1067
+
1068
+ # Create .env
1069
+ $envPath = "$HermesHome\.env"
1070
+ if (-not (Test-Path $envPath)) {
1071
+ $examplePath = "$InstallDir\.env.example"
1072
+ if (Test-Path $examplePath) {
1073
+ Copy-Item $examplePath $envPath
1074
+ Write-Success "Created ~/.hermes/.env from template"
1075
+ } else {
1076
+ New-Item -ItemType File -Force -Path $envPath | Out-Null
1077
+ Write-Success "Created ~/.hermes/.env"
1078
+ }
1079
+ } else {
1080
+ Write-Info "~/.hermes/.env already exists, keeping it"
1081
+ }
1082
+
1083
+ # Create config.yaml
1084
+ $configPath = "$HermesHome\config.yaml"
1085
+ if (-not (Test-Path $configPath)) {
1086
+ $examplePath = "$InstallDir\cli-config.yaml.example"
1087
+ if (Test-Path $examplePath) {
1088
+ Copy-Item $examplePath $configPath
1089
+ Write-Success "Created ~/.hermes/config.yaml from template"
1090
+ }
1091
+ } else {
1092
+ Write-Info "~/.hermes/config.yaml already exists, keeping it"
1093
+ }
1094
+
1095
+ # Create SOUL.md if it doesn't exist (global persona file).
1096
+ # IMPORTANT: write without a BOM. Windows PowerShell 5.1's
1097
+ # ``Set-Content -Encoding UTF8`` writes UTF-8 WITH a byte-order-mark
1098
+ # (the default PS5 behaviour), and Hermes's prompt-injection scanner
1099
+ # flags the BOM as an invisible unicode character and refuses to
1100
+ # load the file. PS7's ``-Encoding utf8NoBOM`` fixes that but we
1101
+ # don't control which PowerShell version the user has. Go direct
1102
+ # to .NET with an explicit UTF8Encoding($false) — BOM-free on every
1103
+ # PowerShell version.
1104
+ $soulPath = "$HermesHome\SOUL.md"
1105
+ if (-not (Test-Path $soulPath)) {
1106
+ $soulContent = @"
1107
+ # Hermes Agent Persona
1108
+
1109
+ <!--
1110
+ This file defines the agent's personality and tone.
1111
+ The agent will embody whatever you write here.
1112
+ Edit this to customize how Hermes communicates with you.
1113
+
1114
+ Examples:
1115
+ - "You are a warm, playful assistant who uses kaomoji occasionally."
1116
+ - "You are a concise technical expert. No fluff, just facts."
1117
+ - "You speak like a friendly coworker who happens to know everything."
1118
+
1119
+ This file is loaded fresh each message -- no restart needed.
1120
+ Delete the contents (or this file) to use the default personality.
1121
+ -->
1122
+ "@
1123
+ $utf8NoBom = New-Object System.Text.UTF8Encoding($false)
1124
+ [System.IO.File]::WriteAllText($soulPath, $soulContent, $utf8NoBom)
1125
+ Write-Success "Created ~/.hermes/SOUL.md (edit to customize personality)"
1126
+ }
1127
+
1128
+ Write-Success "Configuration directory ready: ~/.hermes/"
1129
+
1130
+ # Seed bundled skills into ~/.hermes/skills/ (manifest-based, one-time per skill)
1131
+ Write-Info "Syncing bundled skills to ~/.hermes/skills/ ..."
1132
+ $pythonExe = "$InstallDir\venv\Scripts\python.exe"
1133
+ if (Test-Path $pythonExe) {
1134
+ try {
1135
+ & $pythonExe "$InstallDir\tools\skills_sync.py" 2>$null
1136
+ Write-Success "Skills synced to ~/.hermes/skills/"
1137
+ } catch {
1138
+ # Fallback: simple directory copy
1139
+ $bundledSkills = "$InstallDir\skills"
1140
+ $userSkills = "$HermesHome\skills"
1141
+ if ((Test-Path $bundledSkills) -and -not (Get-ChildItem $userSkills -Exclude '.bundled_manifest' -ErrorAction SilentlyContinue)) {
1142
+ Copy-Item -Path "$bundledSkills\*" -Destination $userSkills -Recurse -Force -ErrorAction SilentlyContinue
1143
+ Write-Success "Skills copied to ~/.hermes/skills/"
1144
+ }
1145
+ }
1146
+ }
1147
+ }
1148
+
1149
+ function Install-NodeDeps {
1150
+ if (-not $HasNode) {
1151
+ Write-Info "Skipping Node.js dependencies (Node not installed)"
1152
+ return
1153
+ }
1154
+
1155
+ # Resolve npm explicitly to npm.cmd, NOT npm.ps1. Node.js on Windows
1156
+ # ships BOTH npm.cmd (a batch shim) and npm.ps1 (a PowerShell shim).
1157
+ # Get-Command's default ordering picks whichever comes first in PATHEXT,
1158
+ # and on many systems that's .ps1 — but .ps1 requires scripts to be
1159
+ # enabled in PowerShell's execution policy, which most Windows users
1160
+ # don't have (the Restricted / RemoteSigned default blocks unsigned
1161
+ # .ps1 files). .cmd has no such restriction and works on every box.
1162
+ #
1163
+ # Strategy: look next to the npm shim we found and prefer npm.cmd if
1164
+ # it exists in the same directory. Fall back to whatever Get-Command
1165
+ # returned if we can't find a .cmd sibling.
1166
+ $npmCmd = Get-Command npm -ErrorAction SilentlyContinue
1167
+ if (-not $npmCmd) {
1168
+ Write-Warn "npm not found on PATH — skipping Node.js dependencies."
1169
+ Write-Info "Open a new PowerShell window and re-run 'hermes setup tools' later."
1170
+ return
1171
+ }
1172
+ $npmExe = $npmCmd.Source
1173
+ if ($npmExe -like "*.ps1") {
1174
+ $npmCmdSibling = Join-Path (Split-Path $npmExe -Parent) "npm.cmd"
1175
+ if (Test-Path $npmCmdSibling) {
1176
+ Write-Info "Using npm.cmd (PowerShell execution policy blocks npm.ps1)"
1177
+ $npmExe = $npmCmdSibling
1178
+ } else {
1179
+ Write-Warn "Only npm.ps1 available — install may fail if script execution is disabled."
1180
+ Write-Info " If it fails, either enable PS script execution or install Node via winget."
1181
+ }
1182
+ }
1183
+
1184
+ # Helper: run "npm install" in a given directory and surface the real
1185
+ # error when it fails. Returns $true on success.
1186
+ #
1187
+ # Implementation note: ``Start-Process -FilePath npm.cmd`` fails with
1188
+ # ``%1 is not a valid Win32 application`` on some PowerShell versions
1189
+ # because Start-Process bypasses cmd.exe / PATHEXT and expects a real
1190
+ # PE file. The invocation-operator ``& $npmExe`` routes through the
1191
+ # PowerShell command pipeline which DOES honour .cmd batch shims, so
1192
+ # it works uniformly for npm.cmd, npx.cmd, and bare .exe files.
1193
+ function _Run-NpmInstall([string]$label, [string]$installDir, [string]$logPath, [string]$npmPath) {
1194
+ Push-Location $installDir
1195
+ try {
1196
+ # Redirect ALL output streams to the log file via 2>&1 and then
1197
+ # ``Tee-Object`` / ``Out-File``. Simpler approach: call npm
1198
+ # with output redirected and inspect $LASTEXITCODE afterwards.
1199
+ & $npmPath install --silent *> $logPath
1200
+ $code = $LASTEXITCODE
1201
+ if ($code -eq 0) {
1202
+ Write-Success "$label dependencies installed"
1203
+ Remove-Item -Force $logPath -ErrorAction SilentlyContinue
1204
+ return $true
1205
+ }
1206
+ Write-Warn "$label npm install failed — exit code $code"
1207
+ if (Test-Path $logPath) {
1208
+ $errText = (Get-Content $logPath -Raw -ErrorAction SilentlyContinue)
1209
+ if ($errText) {
1210
+ $snippet = if ($errText.Length -gt 1200) { $errText.Substring(0, 1200) + "..." } else { $errText }
1211
+ Write-Info " npm output:"
1212
+ foreach ($line in $snippet -split "`n") {
1213
+ Write-Host " $line" -ForegroundColor DarkGray
1214
+ }
1215
+ Write-Info " Full log: $logPath"
1216
+ }
1217
+ }
1218
+ Write-Info "Run manually later: cd `"$installDir`"; npm install"
1219
+ return $false
1220
+ } catch {
1221
+ Write-Warn "$label npm install could not be launched: $_"
1222
+ return $false
1223
+ } finally {
1224
+ Pop-Location
1225
+ }
1226
+ }
1227
+
1228
+ # Browser tools
1229
+ if (Test-Path "$InstallDir\package.json") {
1230
+ Write-Info "Installing Node.js dependencies (browser tools)..."
1231
+ $browserLog = "$env:TEMP\hermes-npm-browser-$(Get-Random).log"
1232
+ $browserNpmOk = _Run-NpmInstall "Browser tools" $InstallDir $browserLog $npmExe
1233
+
1234
+ # Install Playwright Chromium (mirrors scripts/install.sh behaviour for
1235
+ # Linux). Without this, tools/browser_tool.py::check_browser_requirements
1236
+ # returns False (no Chromium under %LOCALAPPDATA%\ms-playwright), and the
1237
+ # browser_* tools are silently filtered out of the agent's tool schema.
1238
+ # System Chrome at "C:\Program Files\Google\Chrome\..." is NOT used by
1239
+ # agent-browser — it expects a Playwright-managed Chromium.
1240
+ if ($browserNpmOk) {
1241
+ Write-Info "Installing browser engine (Playwright Chromium)..."
1242
+ # npx lives next to npm in the same bin dir. Prefer .cmd to dodge
1243
+ # the same execution-policy gotcha that affects npm.ps1 (see above).
1244
+ $npmDir = Split-Path $npmExe -Parent
1245
+ $npxExe = $null
1246
+ foreach ($cand in @("npx.cmd", "npx.exe", "npx")) {
1247
+ $try = Join-Path $npmDir $cand
1248
+ if (Test-Path $try) { $npxExe = $try; break }
1249
+ }
1250
+ if (-not $npxExe) {
1251
+ $npxCmd = Get-Command npx -ErrorAction SilentlyContinue
1252
+ if ($npxCmd) { $npxExe = $npxCmd.Source }
1253
+ }
1254
+ if (-not $npxExe) {
1255
+ Write-Warn "npx not found — cannot install Playwright Chromium."
1256
+ Write-Info "Run manually later: cd `"$InstallDir`"; npx playwright install chromium"
1257
+ } else {
1258
+ $pwLog = "$env:TEMP\hermes-playwright-install-$(Get-Random).log"
1259
+ Push-Location $InstallDir
1260
+ try {
1261
+ & $npxExe playwright install chromium *> $pwLog
1262
+ $pwCode = $LASTEXITCODE
1263
+ if ($pwCode -eq 0) {
1264
+ Write-Success "Playwright Chromium installed (browser tools ready)"
1265
+ Remove-Item -Force $pwLog -ErrorAction SilentlyContinue
1266
+ } else {
1267
+ Write-Warn "Playwright Chromium install failed — exit code $pwCode"
1268
+ Write-Warn "Browser tools will not work until Chromium is installed."
1269
+ if (Test-Path $pwLog) {
1270
+ $pwErr = Get-Content $pwLog -Raw -ErrorAction SilentlyContinue
1271
+ if ($pwErr) {
1272
+ $snippet = if ($pwErr.Length -gt 1200) { $pwErr.Substring(0, 1200) + "..." } else { $pwErr }
1273
+ Write-Info " playwright output:"
1274
+ foreach ($line in $snippet -split "`n") {
1275
+ Write-Host " $line" -ForegroundColor DarkGray
1276
+ }
1277
+ Write-Info " Full log: $pwLog"
1278
+ }
1279
+ }
1280
+ Write-Info "Run manually later: cd `"$InstallDir`"; npx playwright install chromium"
1281
+ }
1282
+ } catch {
1283
+ Write-Warn "Playwright Chromium install could not be launched: $_"
1284
+ Write-Info "Run manually later: cd `"$InstallDir`"; npx playwright install chromium"
1285
+ } finally {
1286
+ Pop-Location
1287
+ }
1288
+ }
1289
+ }
1290
+ }
1291
+
1292
+ # TUI
1293
+ $tuiDir = "$InstallDir\ui-tui"
1294
+ if (Test-Path "$tuiDir\package.json") {
1295
+ Write-Info "Installing TUI dependencies..."
1296
+ $tuiLog = "$env:TEMP\hermes-npm-tui-$(Get-Random).log"
1297
+ [void](_Run-NpmInstall "TUI" $tuiDir $tuiLog $npmExe)
1298
+ }
1299
+ }
1300
+
1301
+ function Install-PlatformSdks {
1302
+ # Ensure messaging-platform SDKs matching tokens the user added to
1303
+ # ~/.hermes/.env are importable. Two problems this solves:
1304
+ #
1305
+ # 1. The tiered `uv pip install` cascade above can fall through to a
1306
+ # lower tier when the first fails (common when RL git deps choke),
1307
+ # which silently skips some messaging SDKs from [messaging].
1308
+ # 2. `uv` creates the venv without pip. If a messaging SDK ends up
1309
+ # missing, the user can't `pip install python-telegram-bot` to
1310
+ # recover — pip simply isn't in their venv.
1311
+ #
1312
+ # Strategy: bootstrap pip via `python -m ensurepip` (idempotent), then
1313
+ # for each token set in .env, verify the matching SDK imports. If not,
1314
+ # run one targeted `pip install` as last-chance recovery. Keeps fresh
1315
+ # Windows installs from hitting silent "python-telegram-bot not installed"
1316
+ # at runtime.
1317
+ if ($NoVenv) {
1318
+ Write-Info "Skipping platform-SDK verification (-NoVenv: no venv to bootstrap)"
1319
+ return
1320
+ }
1321
+
1322
+ $pythonExe = "$InstallDir\venv\Scripts\python.exe"
1323
+ if (-not (Test-Path $pythonExe)) {
1324
+ Write-Warn "Skipping platform-SDK verification: $pythonExe not found"
1325
+ return
1326
+ }
1327
+
1328
+ $envPath = "$HermesHome\.env"
1329
+ if (-not (Test-Path $envPath)) { return }
1330
+ $envLines = Get-Content $envPath -ErrorAction SilentlyContinue
1331
+
1332
+ # Map: env var set in .env -> (import name, pip spec matching [messaging] extra).
1333
+ # Specs mirror pyproject.toml to avoid version drift.
1334
+ $sdkMap = @(
1335
+ @{ Var = "TELEGRAM_BOT_TOKEN"; Import = "telegram"; Spec = "python-telegram-bot[webhooks]>=22.6,<23" },
1336
+ @{ Var = "DISCORD_BOT_TOKEN"; Import = "discord"; Spec = "discord.py[voice]>=2.7.1,<3" },
1337
+ @{ Var = "SLACK_BOT_TOKEN"; Import = "slack_sdk"; Spec = "slack-sdk>=3.27.0,<4" },
1338
+ @{ Var = "SLACK_APP_TOKEN"; Import = "slack_bolt";Spec = "slack-bolt>=1.18.0,<2" },
1339
+ @{ Var = "WHATSAPP_ENABLED"; Import = "qrcode"; Spec = "qrcode>=7.0,<8" }
1340
+ )
1341
+
1342
+ # Which tokens are actually set (not placeholder)?
1343
+ $needed = @()
1344
+ foreach ($sdk in $sdkMap) {
1345
+ $match = $envLines | Where-Object {
1346
+ $_ -match ("^" + [regex]::Escape($sdk.Var) + "=.+") `
1347
+ -and $_ -notmatch "your-token-here" `
1348
+ -and $_ -notmatch "^\s*#"
1349
+ }
1350
+ if ($match) { $needed += $sdk }
1351
+ }
1352
+ if ($needed.Count -eq 0) { return }
1353
+
1354
+ Write-Host ""
1355
+ Write-Info "Verifying platform SDKs for tokens found in $envPath ..."
1356
+
1357
+ # Verify each SDK's import without triggering side-effect imports.
1358
+ # Quirk: PowerShell wraps non-zero-exit native stderr as a
1359
+ # NativeCommandError that prints even with `2>$null` / `*> $null`
1360
+ # unless we set $ErrorActionPreference to SilentlyContinue for the
1361
+ # span. Save + restore rather than nuking globally.
1362
+ $prevEAP = $ErrorActionPreference
1363
+ $ErrorActionPreference = "SilentlyContinue"
1364
+ try {
1365
+ $missing = @()
1366
+ foreach ($sdk in $needed) {
1367
+ & $pythonExe -c "import $($sdk.Import)" 2>&1 | Out-Null
1368
+ if ($LASTEXITCODE -ne 0) {
1369
+ $missing += $sdk
1370
+ Write-Warn " $($sdk.Import) NOT importable (needed for $($sdk.Var))"
1371
+ } else {
1372
+ Write-Success " $($sdk.Import) OK"
1373
+ }
1374
+ }
1375
+ } finally {
1376
+ $ErrorActionPreference = $prevEAP
1377
+ }
1378
+ if ($missing.Count -eq 0) { return }
1379
+
1380
+ # Bootstrap pip into the venv if it isn't there. `uv` creates venvs
1381
+ # without pip; ensurepip is the stdlib-blessed way to add it.
1382
+ $prevEAP = $ErrorActionPreference
1383
+ $ErrorActionPreference = "SilentlyContinue"
1384
+ try {
1385
+ & $pythonExe -m pip --version 2>&1 | Out-Null
1386
+ if ($LASTEXITCODE -ne 0) {
1387
+ Write-Info "Bootstrapping pip into venv (uv doesn't ship pip)..."
1388
+ & $pythonExe -m ensurepip --upgrade 2>&1 | Out-Null
1389
+ if ($LASTEXITCODE -ne 0) {
1390
+ Write-Warn "ensurepip failed — can't auto-install missing SDKs."
1391
+ Write-Info "Manual recovery: $UvCmd pip install `"$($missing[0].Spec)`""
1392
+ return
1393
+ }
1394
+ }
1395
+
1396
+ foreach ($sdk in $missing) {
1397
+ Write-Info " Installing $($sdk.Spec) ..."
1398
+ & $pythonExe -m pip install $sdk.Spec 2>&1 | ForEach-Object { Write-Host " $_" }
1399
+ if ($LASTEXITCODE -eq 0) {
1400
+ Write-Success " Installed $($sdk.Import)"
1401
+ } else {
1402
+ Write-Warn " Failed to install $($sdk.Spec). Recover manually: $pythonExe -m pip install `"$($sdk.Spec)`""
1403
+ }
1404
+ }
1405
+ } finally {
1406
+ $ErrorActionPreference = $prevEAP
1407
+ }
1408
+ }
1409
+
1410
+ function Invoke-SetupWizard {
1411
+ if ($SkipSetup) {
1412
+ Write-Info "Skipping setup wizard (-SkipSetup)"
1413
+ return
1414
+ }
1415
+
1416
+ Write-Host ""
1417
+ Write-Info "Starting setup wizard..."
1418
+ Write-Host ""
1419
+
1420
+ Push-Location $InstallDir
1421
+
1422
+ # Run hermes setup using the venv Python directly (no activation needed)
1423
+ if (-not $NoVenv) {
1424
+ & ".\venv\Scripts\python.exe" -m hermes_cli.main setup
1425
+ } else {
1426
+ python -m hermes_cli.main setup
1427
+ }
1428
+
1429
+ Pop-Location
1430
+ }
1431
+
1432
+ function Start-GatewayIfConfigured {
1433
+ $envPath = "$HermesHome\.env"
1434
+ if (-not (Test-Path $envPath)) { return }
1435
+
1436
+ $hasMessaging = $false
1437
+ $content = Get-Content $envPath -ErrorAction SilentlyContinue
1438
+ foreach ($var in @("TELEGRAM_BOT_TOKEN", "DISCORD_BOT_TOKEN", "SLACK_BOT_TOKEN", "SLACK_APP_TOKEN", "WHATSAPP_ENABLED")) {
1439
+ $match = $content | Where-Object { $_ -match "^${var}=.+" -and $_ -notmatch "your-token-here" }
1440
+ if ($match) { $hasMessaging = $true; break }
1441
+ }
1442
+
1443
+ if (-not $hasMessaging) { return }
1444
+
1445
+ $hermesCmd = "$InstallDir\venv\Scripts\hermes.exe"
1446
+ if (-not (Test-Path $hermesCmd)) {
1447
+ $hermesCmd = "hermes"
1448
+ }
1449
+
1450
+ # If WhatsApp is enabled but not yet paired, run foreground for QR scan
1451
+ $whatsappEnabled = $content | Where-Object { $_ -match "^WHATSAPP_ENABLED=true" }
1452
+ $whatsappSession = "$HermesHome\whatsapp\session\creds.json"
1453
+ if ($whatsappEnabled -and -not (Test-Path $whatsappSession)) {
1454
+ Write-Host ""
1455
+ Write-Info "WhatsApp is enabled but not yet paired."
1456
+ Write-Info "Running 'hermes whatsapp' to pair via QR code..."
1457
+ Write-Host ""
1458
+ $response = Read-Host "Pair WhatsApp now? [Y/n]"
1459
+ if ($response -eq "" -or $response -match "^[Yy]") {
1460
+ try {
1461
+ & $hermesCmd whatsapp
1462
+ } catch {
1463
+ # Expected after pairing completes
1464
+ }
1465
+ }
1466
+ }
1467
+
1468
+ Write-Host ""
1469
+ Write-Info "Messaging platform token detected!"
1470
+ Write-Info "The gateway handles messaging platforms and cron job execution."
1471
+ Write-Host ""
1472
+ $response = Read-Host "Would you like to start the gateway now? [Y/n]"
1473
+
1474
+ if ($response -eq "" -or $response -match "^[Yy]") {
1475
+ Write-Info "Starting gateway in background..."
1476
+ try {
1477
+ $logFile = "$HermesHome\logs\gateway.log"
1478
+ Start-Process -FilePath $hermesCmd -ArgumentList "gateway" `
1479
+ -RedirectStandardOutput $logFile `
1480
+ -RedirectStandardError "$HermesHome\logs\gateway-error.log" `
1481
+ -WindowStyle Hidden
1482
+ Write-Success "Gateway started! Your bot is now online."
1483
+ Write-Info "Logs: $logFile"
1484
+ Write-Info "To stop: close the gateway process from Task Manager"
1485
+ } catch {
1486
+ Write-Warn "Failed to start gateway. Run manually: hermes gateway"
1487
+ }
1488
+ } else {
1489
+ Write-Info "Skipped. Start the gateway later with: hermes gateway"
1490
+ }
1491
+ }
1492
+
1493
+ function Write-Completion {
1494
+ Write-Host ""
1495
+ Write-Host "┌─────────────────────────────────────────────────────────┐" -ForegroundColor Green
1496
+ Write-Host "│ ✓ Installation Complete! │" -ForegroundColor Green
1497
+ Write-Host "└─────────────────────────────────────────────────────────┘" -ForegroundColor Green
1498
+ Write-Host ""
1499
+
1500
+ # Show file locations
1501
+ Write-Host "📁 Your files:" -ForegroundColor Cyan
1502
+ Write-Host ""
1503
+ Write-Host " Config: " -NoNewline -ForegroundColor Yellow
1504
+ Write-Host "$HermesHome\config.yaml"
1505
+ Write-Host " API Keys: " -NoNewline -ForegroundColor Yellow
1506
+ Write-Host "$HermesHome\.env"
1507
+ Write-Host " Data: " -NoNewline -ForegroundColor Yellow
1508
+ Write-Host "$HermesHome\cron\, sessions\, logs\"
1509
+ Write-Host " Code: " -NoNewline -ForegroundColor Yellow
1510
+ Write-Host "$HermesHome\hermes-agent\"
1511
+ Write-Host ""
1512
+
1513
+ Write-Host "─────────────────────────────────────────────────────────" -ForegroundColor Cyan
1514
+ Write-Host ""
1515
+ Write-Host "🚀 Commands:" -ForegroundColor Cyan
1516
+ Write-Host ""
1517
+ Write-Host " hermes " -NoNewline -ForegroundColor Green
1518
+ Write-Host "Start chatting"
1519
+ Write-Host " hermes setup " -NoNewline -ForegroundColor Green
1520
+ Write-Host "Configure API keys & settings"
1521
+ Write-Host " hermes config " -NoNewline -ForegroundColor Green
1522
+ Write-Host "View/edit configuration"
1523
+ Write-Host " hermes config edit " -NoNewline -ForegroundColor Green
1524
+ Write-Host "Open config in editor"
1525
+ Write-Host " hermes gateway " -NoNewline -ForegroundColor Green
1526
+ Write-Host "Start messaging gateway (Telegram, Discord, etc.)"
1527
+ Write-Host " hermes update " -NoNewline -ForegroundColor Green
1528
+ Write-Host "Update to latest version"
1529
+ Write-Host ""
1530
+
1531
+ Write-Host "─────────────────────────────────────────────────────────" -ForegroundColor Cyan
1532
+ Write-Host ""
1533
+ Write-Host "⚡ Restart your terminal for PATH changes to take effect" -ForegroundColor Yellow
1534
+ Write-Host ""
1535
+
1536
+ if (-not $HasNode) {
1537
+ Write-Host "Note: Node.js could not be installed automatically." -ForegroundColor Yellow
1538
+ Write-Host "Browser tools need Node.js. Install manually:" -ForegroundColor Yellow
1539
+ Write-Host " https://nodejs.org/en/download/" -ForegroundColor Yellow
1540
+ Write-Host ""
1541
+ }
1542
+
1543
+ if (-not $HasRipgrep) {
1544
+ Write-Host "Note: ripgrep (rg) was not installed. For faster file search:" -ForegroundColor Yellow
1545
+ Write-Host " winget install BurntSushi.ripgrep.MSVC" -ForegroundColor Yellow
1546
+ Write-Host ""
1547
+ }
1548
+ }
1549
+
1550
+ # ============================================================================
1551
+ # Main
1552
+ # ============================================================================
1553
+
1554
+ function Main {
1555
+ Write-Banner
1556
+
1557
+ # Windows refuses to delete a directory any shell is currently cd'd
1558
+ # inside — and silently leaves orphan files behind, which then wedge
1559
+ # "is this a valid git repo" probes on re-install. If the current
1560
+ # working dir is under $InstallDir, step out to the user's home
1561
+ # BEFORE doing anything else. Harmless when the user ran the
1562
+ # installer from somewhere else.
1563
+ try {
1564
+ $currentResolved = (Get-Location).ProviderPath
1565
+ $installResolved = $null
1566
+ if (Test-Path $InstallDir) {
1567
+ $installResolved = (Resolve-Path $InstallDir -ErrorAction SilentlyContinue).ProviderPath
1568
+ }
1569
+ if ($installResolved -and $currentResolved.ToLower().StartsWith($installResolved.ToLower())) {
1570
+ Write-Info "Stepping out of $InstallDir so Windows can replace files there if needed..."
1571
+ Set-Location $env:USERPROFILE
1572
+ }
1573
+ } catch {}
1574
+
1575
+ if (-not (Install-Uv)) { throw "uv installation failed — cannot continue" }
1576
+ if (-not (Test-Python)) { throw "Python $PythonVersion not available — cannot continue" }
1577
+ if (-not (Install-Git)) { throw "Git not available and auto-install failed — install from https://git-scm.com/download/win then re-run" }
1578
+ # Test-Node always returns $true (sets $script:HasNode on success, emits a
1579
+ # warning on failure and continues so non-browser installs still work).
1580
+ # Cast to [void] so the bare return value doesn't print "True" to the
1581
+ # console between the "Node found" line and the next installer step.
1582
+ [void](Test-Node)
1583
+ Install-SystemPackages # ripgrep + ffmpeg in one step
1584
+
1585
+ Install-Repository
1586
+ Install-Venv
1587
+ Install-Dependencies
1588
+ Install-NodeDeps
1589
+ Set-PathVariable
1590
+ Copy-ConfigTemplates
1591
+ Invoke-SetupWizard
1592
+ Install-PlatformSdks
1593
+ Start-GatewayIfConfigured
1594
+
1595
+ Write-Completion
1596
+ }
1597
+
1598
+ # Wrap in try/catch so errors don't kill the terminal when run via:
1599
+ # irm https://...install.ps1 | iex
1600
+ # (exit/throw inside iex kills the entire PowerShell session)
1601
+ try {
1602
+ Main
1603
+ } catch {
1604
+ Write-Host ""
1605
+ Write-Err "Installation failed: $_"
1606
+ Write-Host ""
1607
+ Write-Info "If the error is unclear, try downloading and running the script directly:"
1608
+ Write-Host " Invoke-WebRequest -Uri 'https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.ps1' -OutFile install.ps1" -ForegroundColor Yellow
1609
+ Write-Host " .\install.ps1" -ForegroundColor Yellow
1610
+ Write-Host ""
1611
+ }