octo-agent 0.11.2

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 (319) hide show
  1. checksums.yaml +7 -0
  2. data/.clacky/skills/commit/SKILL.md +423 -0
  3. data/.clacky/skills/gem-release/SKILL.md +199 -0
  4. data/.clacky/skills/gem-release/scripts/release.sh +304 -0
  5. data/.clacky/skills/oss-upload/SKILL.md +47 -0
  6. data/.octorules +106 -0
  7. data/.rspec +3 -0
  8. data/.rubocop.yml +8 -0
  9. data/CHANGELOG.md +76 -0
  10. data/CODE_OF_CONDUCT.md +132 -0
  11. data/CONTRIBUTING.md +92 -0
  12. data/Dockerfile +28 -0
  13. data/LICENSE.txt +22 -0
  14. data/POSITIONING.md +46 -0
  15. data/README.md +134 -0
  16. data/README_CN.md +134 -0
  17. data/Rakefile +34 -0
  18. data/benchmark/fixtures/sample_project/Gemfile +3 -0
  19. data/benchmark/fixtures/sample_project/lib/api_handler.rb +32 -0
  20. data/benchmark/fixtures/sample_project/lib/order_calculator.rb +23 -0
  21. data/benchmark/fixtures/sample_project/lib/user_renderer.rb +20 -0
  22. data/benchmark/fixtures/sample_project/spec/order_calculator_spec.rb +20 -0
  23. data/benchmark/results/EVALUATION_REPORT.md +165 -0
  24. data/benchmark/results/baseline_20260511_174424.json +128 -0
  25. data/benchmark/results/report_20260511_175256.json +271 -0
  26. data/benchmark/results/report_20260511_175444.json +271 -0
  27. data/benchmark/results/treatment_20260511_175103.json +130 -0
  28. data/benchmark/runner.rb +441 -0
  29. data/bin/octo +7 -0
  30. data/docs/agent-first-ui-design.md +77 -0
  31. data/docs/billing-system.md +318 -0
  32. data/docs/channel-architecture.md +235 -0
  33. data/docs/engineering-article.md +343 -0
  34. data/docs/session-skill-invocation.md +69 -0
  35. data/docs/time_machine_design.md +247 -0
  36. data/docs/ui2-architecture.md +124 -0
  37. data/homebrew/README.md +96 -0
  38. data/homebrew/openocto.rb +24 -0
  39. data/lib/octo/agent/hook_manager.rb +61 -0
  40. data/lib/octo/agent/llm_caller.rb +800 -0
  41. data/lib/octo/agent/memory_updater.rb +246 -0
  42. data/lib/octo/agent/message_compressor.rb +225 -0
  43. data/lib/octo/agent/message_compressor_helper.rb +869 -0
  44. data/lib/octo/agent/next_message_suggester.rb +215 -0
  45. data/lib/octo/agent/session_serializer.rb +685 -0
  46. data/lib/octo/agent/skill_auto_creator.rb +114 -0
  47. data/lib/octo/agent/skill_evolution.rb +61 -0
  48. data/lib/octo/agent/skill_manager.rb +466 -0
  49. data/lib/octo/agent/skill_reflector.rb +89 -0
  50. data/lib/octo/agent/system_prompt_builder.rb +101 -0
  51. data/lib/octo/agent/time_machine.rb +214 -0
  52. data/lib/octo/agent/tool_executor.rb +454 -0
  53. data/lib/octo/agent/tool_registry.rb +150 -0
  54. data/lib/octo/agent.rb +2180 -0
  55. data/lib/octo/agent_config.rb +989 -0
  56. data/lib/octo/agent_profile.rb +112 -0
  57. data/lib/octo/anthropic_stream_aggregator.rb +137 -0
  58. data/lib/octo/background_task_registry.rb +324 -0
  59. data/lib/octo/banner.rb +34 -0
  60. data/lib/octo/bedrock_stream_aggregator.rb +137 -0
  61. data/lib/octo/block_font.rb +331 -0
  62. data/lib/octo/cli.rb +968 -0
  63. data/lib/octo/client.rb +623 -0
  64. data/lib/octo/default_agents/SOUL.md +3 -0
  65. data/lib/octo/default_agents/USER.md +1 -0
  66. data/lib/octo/default_agents/base_prompt.md +66 -0
  67. data/lib/octo/default_agents/coding/profile.yml +2 -0
  68. data/lib/octo/default_agents/coding/system_prompt.md +67 -0
  69. data/lib/octo/default_agents/general/profile.yml +2 -0
  70. data/lib/octo/default_agents/general/system_prompt.md +16 -0
  71. data/lib/octo/default_parsers/doc_parser.rb +69 -0
  72. data/lib/octo/default_parsers/docx_parser.rb +188 -0
  73. data/lib/octo/default_parsers/pdf_parser.rb +120 -0
  74. data/lib/octo/default_parsers/pdf_parser_ocr.py +103 -0
  75. data/lib/octo/default_parsers/pdf_parser_plumber.py +62 -0
  76. data/lib/octo/default_parsers/pptx_parser.rb +140 -0
  77. data/lib/octo/default_parsers/xlsx_parser.rb +121 -0
  78. data/lib/octo/default_skills/browser-setup/SKILL.md +426 -0
  79. data/lib/octo/default_skills/channel-manager/SKILL.md +623 -0
  80. data/lib/octo/default_skills/channel-manager/dingtalk_setup.rb +191 -0
  81. data/lib/octo/default_skills/channel-manager/discord_setup.rb +199 -0
  82. data/lib/octo/default_skills/channel-manager/feishu_setup.rb +574 -0
  83. data/lib/octo/default_skills/channel-manager/import_lark_skills.rb +97 -0
  84. data/lib/octo/default_skills/channel-manager/install_feishu_skills.rb +105 -0
  85. data/lib/octo/default_skills/channel-manager/weixin_setup.rb +274 -0
  86. data/lib/octo/default_skills/code-explorer/SKILL.md +36 -0
  87. data/lib/octo/default_skills/cron-task-creator/SKILL.md +257 -0
  88. data/lib/octo/default_skills/cron-task-creator/evals/evals.json +38 -0
  89. data/lib/octo/default_skills/onboard/SKILL.md +578 -0
  90. data/lib/octo/default_skills/onboard/scripts/import_external_skills.rb +413 -0
  91. data/lib/octo/default_skills/onboard/scripts/install_builtin_skills.rb +97 -0
  92. data/lib/octo/default_skills/persist-memory/SKILL.md +59 -0
  93. data/lib/octo/default_skills/personal-website/SKILL.md +113 -0
  94. data/lib/octo/default_skills/personal-website/publish.rb +235 -0
  95. data/lib/octo/default_skills/product-help/SKILL.md +123 -0
  96. data/lib/octo/default_skills/product-help/docs/agent-config.md +74 -0
  97. data/lib/octo/default_skills/product-help/docs/best-practices.md +49 -0
  98. data/lib/octo/default_skills/product-help/docs/browser-tool.md +53 -0
  99. data/lib/octo/default_skills/product-help/docs/built-in-skills.md +43 -0
  100. data/lib/octo/default_skills/product-help/docs/cli-reference.md +82 -0
  101. data/lib/octo/default_skills/product-help/docs/create-your-first-skill.md +47 -0
  102. data/lib/octo/default_skills/product-help/docs/faq.md +98 -0
  103. data/lib/octo/default_skills/product-help/docs/how-to-use-a-skill.md +58 -0
  104. data/lib/octo/default_skills/product-help/docs/installation.md +59 -0
  105. data/lib/octo/default_skills/product-help/docs/memory-system.md +61 -0
  106. data/lib/octo/default_skills/product-help/docs/octorules.md +62 -0
  107. data/lib/octo/default_skills/product-help/docs/session-management.md +63 -0
  108. data/lib/octo/default_skills/product-help/docs/skill-basics.md +55 -0
  109. data/lib/octo/default_skills/product-help/docs/skill-frontmatter.md +61 -0
  110. data/lib/octo/default_skills/product-help/docs/web-server.md +49 -0
  111. data/lib/octo/default_skills/product-help/docs/what-is-octo.md +37 -0
  112. data/lib/octo/default_skills/product-help/docs/windows-installation.md +36 -0
  113. data/lib/octo/default_skills/product-help/docs/writing-tips.md +53 -0
  114. data/lib/octo/default_skills/recall-memory/SKILL.md +65 -0
  115. data/lib/octo/default_skills/skill-add/SKILL.md +59 -0
  116. data/lib/octo/default_skills/skill-add/scripts/install_from_zip.rb +295 -0
  117. data/lib/octo/default_skills/skill-creator/SKILL.md +602 -0
  118. data/lib/octo/default_skills/skill-creator/agents/analyzer.md +274 -0
  119. data/lib/octo/default_skills/skill-creator/agents/comparator.md +202 -0
  120. data/lib/octo/default_skills/skill-creator/agents/grader.md +223 -0
  121. data/lib/octo/default_skills/skill-creator/eval-viewer/generate_review.py +471 -0
  122. data/lib/octo/default_skills/skill-creator/eval-viewer/viewer.html +1325 -0
  123. data/lib/octo/default_skills/skill-creator/references/schemas.md +430 -0
  124. data/lib/octo/default_skills/skill-creator/scripts/__init__.py +0 -0
  125. data/lib/octo/default_skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  126. data/lib/octo/default_skills/skill-creator/scripts/generate_report.py +326 -0
  127. data/lib/octo/default_skills/skill-creator/scripts/improve_description.py +310 -0
  128. data/lib/octo/default_skills/skill-creator/scripts/quick_validate.py +103 -0
  129. data/lib/octo/default_skills/skill-creator/scripts/run_eval.py +317 -0
  130. data/lib/octo/default_skills/skill-creator/scripts/run_loop.py +331 -0
  131. data/lib/octo/default_skills/skill-creator/scripts/utils.py +47 -0
  132. data/lib/octo/default_skills/skill-creator/scripts/validate_skill_frontmatter.rb +143 -0
  133. data/lib/octo/idle_compression_timer.rb +115 -0
  134. data/lib/octo/json_ui_controller.rb +204 -0
  135. data/lib/octo/message_format/anthropic.rb +409 -0
  136. data/lib/octo/message_format/bedrock.rb +361 -0
  137. data/lib/octo/message_format/open_ai.rb +222 -0
  138. data/lib/octo/message_history.rb +373 -0
  139. data/lib/octo/openai_stream_aggregator.rb +130 -0
  140. data/lib/octo/plain_ui_controller.rb +166 -0
  141. data/lib/octo/providers.rb +534 -0
  142. data/lib/octo/server/browser_manager.rb +397 -0
  143. data/lib/octo/server/channel/adapters/base.rb +82 -0
  144. data/lib/octo/server/channel/adapters/dingtalk/adapter.rb +314 -0
  145. data/lib/octo/server/channel/adapters/dingtalk/api_client.rb +391 -0
  146. data/lib/octo/server/channel/adapters/dingtalk/stream_client.rb +203 -0
  147. data/lib/octo/server/channel/adapters/discord/adapter.rb +229 -0
  148. data/lib/octo/server/channel/adapters/discord/api_client.rb +107 -0
  149. data/lib/octo/server/channel/adapters/discord/gateway_client.rb +270 -0
  150. data/lib/octo/server/channel/adapters/feishu/adapter.rb +320 -0
  151. data/lib/octo/server/channel/adapters/feishu/bot.rb +478 -0
  152. data/lib/octo/server/channel/adapters/feishu/file_processor.rb +36 -0
  153. data/lib/octo/server/channel/adapters/feishu/message_parser.rb +129 -0
  154. data/lib/octo/server/channel/adapters/feishu/ws_client.rb +423 -0
  155. data/lib/octo/server/channel/adapters/telegram/adapter.rb +375 -0
  156. data/lib/octo/server/channel/adapters/telegram/api_client.rb +205 -0
  157. data/lib/octo/server/channel/adapters/wecom/adapter.rb +148 -0
  158. data/lib/octo/server/channel/adapters/wecom/media_downloader.rb +115 -0
  159. data/lib/octo/server/channel/adapters/wecom/ws_client.rb +395 -0
  160. data/lib/octo/server/channel/adapters/weixin/adapter.rb +692 -0
  161. data/lib/octo/server/channel/adapters/weixin/api_client.rb +402 -0
  162. data/lib/octo/server/channel/channel_config.rb +178 -0
  163. data/lib/octo/server/channel/channel_manager.rb +468 -0
  164. data/lib/octo/server/channel/channel_ui_controller.rb +224 -0
  165. data/lib/octo/server/channel.rb +33 -0
  166. data/lib/octo/server/discover.rb +77 -0
  167. data/lib/octo/server/epipe_safe_io.rb +105 -0
  168. data/lib/octo/server/http_server.rb +3554 -0
  169. data/lib/octo/server/scheduler.rb +317 -0
  170. data/lib/octo/server/server_master.rb +325 -0
  171. data/lib/octo/server/session_registry.rb +431 -0
  172. data/lib/octo/server/web_ui_controller.rb +487 -0
  173. data/lib/octo/session_manager.rb +385 -0
  174. data/lib/octo/skill.rb +466 -0
  175. data/lib/octo/skill_loader.rb +328 -0
  176. data/lib/octo/tools/base.rb +118 -0
  177. data/lib/octo/tools/browser.rb +625 -0
  178. data/lib/octo/tools/edit.rb +165 -0
  179. data/lib/octo/tools/file_reader.rb +549 -0
  180. data/lib/octo/tools/glob.rb +162 -0
  181. data/lib/octo/tools/grep.rb +356 -0
  182. data/lib/octo/tools/invoke_skill.rb +96 -0
  183. data/lib/octo/tools/list_tasks.rb +54 -0
  184. data/lib/octo/tools/redo_task.rb +41 -0
  185. data/lib/octo/tools/request_user_feedback.rb +84 -0
  186. data/lib/octo/tools/security.rb +333 -0
  187. data/lib/octo/tools/terminal/output_cleaner.rb +63 -0
  188. data/lib/octo/tools/terminal/persistent_session.rb +268 -0
  189. data/lib/octo/tools/terminal/safe_rm.sh +106 -0
  190. data/lib/octo/tools/terminal/session_manager.rb +213 -0
  191. data/lib/octo/tools/terminal.rb +1828 -0
  192. data/lib/octo/tools/todo_manager.rb +374 -0
  193. data/lib/octo/tools/trash_manager.rb +388 -0
  194. data/lib/octo/tools/undo_task.rb +35 -0
  195. data/lib/octo/tools/web_fetch.rb +242 -0
  196. data/lib/octo/tools/web_search.rb +260 -0
  197. data/lib/octo/tools/write.rb +77 -0
  198. data/lib/octo/ui2/block_font.rb +10 -0
  199. data/lib/octo/ui2/components/base_component.rb +163 -0
  200. data/lib/octo/ui2/components/command_suggestions.rb +290 -0
  201. data/lib/octo/ui2/components/common_component.rb +96 -0
  202. data/lib/octo/ui2/components/inline_input.rb +226 -0
  203. data/lib/octo/ui2/components/input_area.rb +1338 -0
  204. data/lib/octo/ui2/components/message_component.rb +99 -0
  205. data/lib/octo/ui2/components/modal_component.rb +419 -0
  206. data/lib/octo/ui2/components/todo_area.rb +149 -0
  207. data/lib/octo/ui2/components/tool_component.rb +107 -0
  208. data/lib/octo/ui2/components/welcome_banner.rb +139 -0
  209. data/lib/octo/ui2/layout_manager.rb +807 -0
  210. data/lib/octo/ui2/line_editor.rb +363 -0
  211. data/lib/octo/ui2/markdown_renderer.rb +100 -0
  212. data/lib/octo/ui2/output_buffer.rb +370 -0
  213. data/lib/octo/ui2/progress_handle.rb +362 -0
  214. data/lib/octo/ui2/progress_indicator.rb +55 -0
  215. data/lib/octo/ui2/screen_buffer.rb +273 -0
  216. data/lib/octo/ui2/terminal_detector.rb +119 -0
  217. data/lib/octo/ui2/theme_manager.rb +85 -0
  218. data/lib/octo/ui2/themes/base_theme.rb +105 -0
  219. data/lib/octo/ui2/themes/hacker_theme.rb +62 -0
  220. data/lib/octo/ui2/themes/minimal_theme.rb +56 -0
  221. data/lib/octo/ui2/thinking_verbs.rb +26 -0
  222. data/lib/octo/ui2/ui_controller.rb +1625 -0
  223. data/lib/octo/ui2/view_renderer.rb +177 -0
  224. data/lib/octo/ui2.rb +40 -0
  225. data/lib/octo/ui_interface.rb +154 -0
  226. data/lib/octo/utils/arguments_parser.rb +191 -0
  227. data/lib/octo/utils/browser_detector.rb +195 -0
  228. data/lib/octo/utils/encoding.rb +92 -0
  229. data/lib/octo/utils/environment_detector.rb +140 -0
  230. data/lib/octo/utils/file_ignore_helper.rb +170 -0
  231. data/lib/octo/utils/file_processor.rb +601 -0
  232. data/lib/octo/utils/gitignore_parser.rb +154 -0
  233. data/lib/octo/utils/limit_stack.rb +152 -0
  234. data/lib/octo/utils/logger.rb +124 -0
  235. data/lib/octo/utils/login_shell.rb +72 -0
  236. data/lib/octo/utils/model_pricing.rb +646 -0
  237. data/lib/octo/utils/parser_manager.rb +165 -0
  238. data/lib/octo/utils/path_helper.rb +15 -0
  239. data/lib/octo/utils/scripts_manager.rb +59 -0
  240. data/lib/octo/utils/string_matcher.rb +158 -0
  241. data/lib/octo/utils/trash_directory.rb +112 -0
  242. data/lib/octo/utils/workspace_rules.rb +46 -0
  243. data/lib/octo/version.rb +5 -0
  244. data/lib/octo/web/app.css +7141 -0
  245. data/lib/octo/web/app.js +543 -0
  246. data/lib/octo/web/apple-touch-icon.png +0 -0
  247. data/lib/octo/web/auth.js +150 -0
  248. data/lib/octo/web/channels.js +276 -0
  249. data/lib/octo/web/datepicker.js +205 -0
  250. data/lib/octo/web/favicon.png +0 -0
  251. data/lib/octo/web/i18n.js +1073 -0
  252. data/lib/octo/web/icon-512.png +0 -0
  253. data/lib/octo/web/icon-dark.svg +25 -0
  254. data/lib/octo/web/icon.svg +29 -0
  255. data/lib/octo/web/index.html +871 -0
  256. data/lib/octo/web/marked.min.js +69 -0
  257. data/lib/octo/web/onboard.js +491 -0
  258. data/lib/octo/web/profile.js +442 -0
  259. data/lib/octo/web/sessions.js +4421 -0
  260. data/lib/octo/web/settings.js +913 -0
  261. data/lib/octo/web/sidebar.js +32 -0
  262. data/lib/octo/web/skills.js +885 -0
  263. data/lib/octo/web/tasks.js +297 -0
  264. data/lib/octo/web/theme.js +105 -0
  265. data/lib/octo/web/trash.js +343 -0
  266. data/lib/octo/web/vendor/hljs/highlight.min.js +1244 -0
  267. data/lib/octo/web/vendor/hljs/hljs-theme.css +95 -0
  268. data/lib/octo/web/vendor/katex/auto-render.min.js +1 -0
  269. data/lib/octo/web/vendor/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  270. data/lib/octo/web/vendor/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  271. data/lib/octo/web/vendor/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  272. data/lib/octo/web/vendor/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  273. data/lib/octo/web/vendor/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  274. data/lib/octo/web/vendor/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
  275. data/lib/octo/web/vendor/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  276. data/lib/octo/web/vendor/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
  277. data/lib/octo/web/vendor/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
  278. data/lib/octo/web/vendor/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  279. data/lib/octo/web/vendor/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
  280. data/lib/octo/web/vendor/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  281. data/lib/octo/web/vendor/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  282. data/lib/octo/web/vendor/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  283. data/lib/octo/web/vendor/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
  284. data/lib/octo/web/vendor/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  285. data/lib/octo/web/vendor/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  286. data/lib/octo/web/vendor/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  287. data/lib/octo/web/vendor/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  288. data/lib/octo/web/vendor/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  289. data/lib/octo/web/vendor/katex/katex.min.css +1 -0
  290. data/lib/octo/web/vendor/katex/katex.min.js +1 -0
  291. data/lib/octo/web/version.js +449 -0
  292. data/lib/octo/web/weixin-qr.html +209 -0
  293. data/lib/octo/web/ws-dispatcher.js +357 -0
  294. data/lib/octo/web/ws.js +128 -0
  295. data/lib/octo.rb +145 -0
  296. data/scripts/build/build.sh +329 -0
  297. data/scripts/build/lib/apt.sh +56 -0
  298. data/scripts/build/lib/brew.sh +89 -0
  299. data/scripts/build/lib/colors.sh +17 -0
  300. data/scripts/build/lib/gem.sh +95 -0
  301. data/scripts/build/lib/mise.sh +125 -0
  302. data/scripts/build/lib/network.sh +157 -0
  303. data/scripts/build/lib/os.sh +57 -0
  304. data/scripts/build/lib/shell.sh +37 -0
  305. data/scripts/build/src/install.sh.cc +174 -0
  306. data/scripts/build/src/install_browser.sh.cc +101 -0
  307. data/scripts/build/src/install_full.sh.cc +290 -0
  308. data/scripts/build/src/install_rails_deps.sh.cc +145 -0
  309. data/scripts/build/src/install_system_deps.sh.cc +123 -0
  310. data/scripts/build/src/uninstall.sh.cc +101 -0
  311. data/scripts/install.ps1 +532 -0
  312. data/scripts/install.sh +567 -0
  313. data/scripts/install_browser.sh +479 -0
  314. data/scripts/install_full.sh +838 -0
  315. data/scripts/install_rails_deps.sh +746 -0
  316. data/scripts/install_system_deps.sh +518 -0
  317. data/scripts/uninstall.sh +287 -0
  318. data/sig/octo.rbs +4 -0
  319. metadata +614 -0
@@ -0,0 +1,426 @@
1
+ ---
2
+ name: browser-setup
3
+ description: |
4
+ Configure the browser tool for Octo. Guides the user through Chrome or Edge setup,
5
+ verifies the connection, and writes ~/.octo/browser.yml.
6
+ Supports macOS, Linux, and WSL (Windows Chrome/Edge via remote debugging).
7
+ Trigger on: "browser setup", "setup browser", "配置浏览器", "browser config",
8
+ "browser doctor".
9
+ Subcommands: setup, doctor.
10
+ argument-hint: "setup | doctor"
11
+ allowed-tools:
12
+ - Bash
13
+ - Read
14
+ - Write
15
+ - browser
16
+ ---
17
+
18
+ # Browser Setup Skill
19
+
20
+ Configure the browser tool for Octo. Config is stored at `~/.octo/browser.yml`.
21
+
22
+ ## Region-Aware Download Links
23
+
24
+ Whenever you show the user a link to download or upgrade Chrome/Edge, pick the right one for their region instead of always using google.com.
25
+
26
+ Treat the user as **in China** when any of these is true:
27
+ - The user is talking to you in Chinese
28
+ - The system locale is Chinese (`echo $LANG` contains `zh_CN` / `zh_`)
29
+ - A previous run of `install_browser.sh` reported `Region: china` (visible in its output)
30
+ - `curl -s --max-time 3 https://www.google.com -o /dev/null -w "%{http_code}"` returns `000` while baidu.com works
31
+
32
+ Use these links accordingly:
33
+
34
+ | Region | Chrome | Edge |
35
+ |---|---|---|
36
+ | China | https://www.google.cn/chrome/ | https://www.microsoft.com/zh-cn/edge |
37
+ | Global | https://www.google.com/chrome/ | https://www.microsoft.com/edge |
38
+
39
+ When unsure, show **both** lines (label them "China:" and "Global:") so the user can pick.
40
+
41
+ ## Command Parsing
42
+
43
+ | User says | Subcommand |
44
+ |---|---|
45
+ | `browser setup`, `配置浏览器`, `setup browser` | setup |
46
+ | `browser doctor` | doctor |
47
+
48
+ If no subcommand is clear, default to `setup`.
49
+
50
+ ---
51
+
52
+ ## `setup`
53
+
54
+ **Core Strategy**: Progressive validation with clear next steps at each failure point.
55
+
56
+ ### Step 1 — Ensure Node.js is installed
57
+
58
+ Check Node.js version:
59
+ ```bash
60
+ node --version 2>/dev/null
61
+ ```
62
+
63
+ Parse the version. If Node.js is missing or version < 20:
64
+
65
+ Run the bundled installer to automatically install Node.js:
66
+ ```bash
67
+ bash ~/.octo/scripts/install_browser.sh
68
+ ```
69
+
70
+ If the script exits 0 → Node.js is now installed. Proceed to Step 2.
71
+
72
+ If the script exits non-zero or doesn't exist:
73
+
74
+ > ❌ Node.js 20+ is required for browser automation.
75
+ >
76
+ > Please install Node.js from: https://nodejs.org
77
+ >
78
+ > Let me know when done and I'll continue.
79
+
80
+ Wait for user confirmation, then retry this step once. If still failing, stop.
81
+
82
+ ### Step 2 — Ensure chrome-devtools-mcp is installed
83
+
84
+ Check if installed:
85
+ ```bash
86
+ chrome-devtools-mcp --version 2>/dev/null
87
+ ```
88
+
89
+ If found and exits 0 → skip to Step 3.
90
+
91
+ If missing, run the bundled installer:
92
+ ```bash
93
+ bash ~/.octo/scripts/install_browser.sh
94
+ ```
95
+
96
+ If the script exits non-zero or doesn't exist:
97
+
98
+ > ❌ Failed to install chrome-devtools-mcp automatically.
99
+ >
100
+ > Please run manually:
101
+ > ```
102
+ > npm install -g chrome-devtools-mcp@latest
103
+ > ```
104
+ >
105
+ > Let me know when done.
106
+
107
+ Wait for user confirmation, then verify installation:
108
+ ```bash
109
+ chrome-devtools-mcp --version 2>/dev/null
110
+ ```
111
+
112
+ If still missing after user confirms, stop with error message.
113
+
114
+ ### Step 3 — Verify Chrome/Edge is running with remote debugging
115
+
116
+ **CRITICAL**: Do NOT attempt `browser()` calls yet. First check if the browser is reachable using the API:
117
+
118
+ ```bash
119
+ curl -s http://${OCTO_SERVER_HOST}:${OCTO_SERVER_PORT}/api/browser/status
120
+ ```
121
+
122
+ This returns JSON with `daemon_running` and `enabled` status. **Ignore the result for now** — we just need to see if the Octo server is running.
123
+
124
+ Now attempt a browser connection to detect Chrome:
125
+
126
+ ```bash
127
+ browser(action="status")
128
+ ```
129
+
130
+ **If this succeeds** → Chrome is running and reachable. Proceed to Step 4.
131
+
132
+ **If this fails** → The error message will indicate the specific issue. Parse it carefully:
133
+
134
+ #### Case A: "Chrome/Edge is not running or remote debugging is not enabled"
135
+
136
+ This is the most common case. The system can't find Chrome's DevToolsActivePort file or the port is not reachable.
137
+
138
+ **Action**: Guide the user to enable remote debugging.
139
+
140
+ **On macOS**:
141
+ ```bash
142
+ open "chrome://inspect/#remote-debugging" 2>/dev/null || echo "Please open chrome://inspect/#remote-debugging manually"
143
+ ```
144
+
145
+ Then tell the user:
146
+
147
+ > I've tried to open the remote debugging page in Chrome.
148
+ >
149
+ > Please follow these steps:
150
+ > 1. Make sure **Chrome or Edge is open**
151
+ > 2. Visit: `chrome://inspect/#remote-debugging` (or `edge://inspect/#remote-debugging`)
152
+ > 3. Click **"Allow remote debugging for this browser instance"**
153
+ > 4. You should see a brief connection message appear
154
+ >
155
+ > Let me know when done ✅
156
+
157
+ **On Linux (non-WSL)**:
158
+
159
+ > Please follow these steps:
160
+ > 1. Make sure **Chrome or Edge is open**
161
+ > 2. Visit: `chrome://inspect/#remote-debugging`
162
+ > 3. Click **"Allow remote debugging for this browser instance"**
163
+ >
164
+ > Let me know when done ✅
165
+
166
+ **On WSL**:
167
+
168
+ > Please follow these steps:
169
+ > 1. Open **Edge** on Windows
170
+ > 2. Visit: `edge://inspect/#remote-debugging`
171
+ > 3. Click **"Allow remote debugging for this browser instance"**
172
+ >
173
+ > Let me know when done ✅
174
+
175
+ **After user confirms**, retry the connection **once**:
176
+ ```bash
177
+ browser(action="status")
178
+ ```
179
+
180
+ If still failing:
181
+
182
+ > ❌ Still unable to connect to Chrome.
183
+ >
184
+ > Please make sure:
185
+ > - Chrome/Edge is running
186
+ > - You clicked "Allow remote debugging" in chrome://inspect/#remote-debugging
187
+ > - No firewall is blocking localhost connections
188
+ >
189
+ > Run `/browser-setup doctor` to diagnose the issue in detail.
190
+
191
+ Stop here and suggest running doctor.
192
+
193
+ #### Case B: Other errors (MCP handshake timeout, daemon crash, etc.)
194
+
195
+ For any other error message, show it to the user and suggest:
196
+
197
+ > ❌ Browser connection failed: <error message>
198
+ >
199
+ > This may be a temporary issue. Please try:
200
+ > 1. Restart your browser
201
+ > 2. Run `/browser-setup` again
202
+ >
203
+ > If the problem persists, run `/browser-setup doctor` for detailed diagnostics.
204
+
205
+ ### Step 4 — Get and verify browser version
206
+
207
+ Now that connection is established, get the version:
208
+
209
+ ```bash
210
+ browser(action="act", kind="evaluate", js="navigator.userAgentData?.brands?.find(b => b.brand === 'Google Chrome' || b.brand === 'Microsoft Edge')?.version || navigator.userAgent.match(/Chrome\/(\d+)/)?.[1] || 'unknown'")
211
+ ```
212
+
213
+ Parse the version number:
214
+ - **version >= 146** → Excellent, proceed
215
+ - **version 144-145** → Show warning but proceed:
216
+ > ⚠️ Your browser version is v${VERSION}. Version 146+ is recommended for best compatibility.
217
+ > Continuing anyway...
218
+ - **version < 144 or "unknown"** → Stop:
219
+ > ❌ Browser version v${VERSION} is too old. Please upgrade Chrome or Edge to v146+.
220
+ >
221
+ > Use the download link from the **Region-Aware Download Links** section above
222
+ > (pick `China` or `Global` based on the user's region).
223
+ >
224
+ > After upgrading, run `/browser-setup` again.
225
+
226
+ ### Step 5 — Save configuration via API
227
+
228
+ Call the API to save the configuration:
229
+
230
+ ```bash
231
+ curl -s -X POST http://${OCTO_SERVER_HOST}:${OCTO_SERVER_PORT}/api/browser/configure \
232
+ -H "Content-Type: application/json" \
233
+ -d "{\"chrome_version\":\"${VERSION}\"}"
234
+ ```
235
+
236
+ If this fails (HTTP error or empty response), show a warning:
237
+
238
+ > ⚠️ Failed to save configuration via API. You may need to run `/browser-setup` again after restarting Octo.
239
+
240
+ ### Step 6 — Done
241
+
242
+ > ✅ Browser setup complete!
243
+ >
244
+ > **Chrome/Edge v${VERSION}** is connected and ready to use.
245
+ >
246
+ > You can now use browser automation features. Try asking me to:
247
+ > - "Open google.com in the browser"
248
+ > - "Take a screenshot"
249
+ > - "Fill out a form on this page"
250
+
251
+ ---
252
+
253
+ ## `doctor`
254
+
255
+ **Core Strategy**: Diagnose don't fix. Check each component and report status.
256
+
257
+ This is a **diagnostic tool**, not a repair tool. It will check each component and tell you what's wrong, but won't automatically fix things.
258
+
259
+ ### Diagnostic Steps
260
+
261
+ Run all checks **before** showing results. Then show a summary report.
262
+
263
+ #### 1. Check Config File
264
+
265
+ ```bash
266
+ test -f ~/.octo/browser.yml && cat ~/.octo/browser.yml
267
+ ```
268
+
269
+ Parse the result:
270
+ - **File missing** → ❌ Not configured
271
+ - **File exists, `enabled: false`** → ⏸️ Disabled
272
+ - **File exists, `enabled: true`** → ✅ Enabled
273
+
274
+ #### 2. Check Node.js
275
+
276
+ ```bash
277
+ node --version 2>/dev/null
278
+ ```
279
+
280
+ - **Not found** → ❌ Node.js not installed
281
+ - **Version < 20** → ❌ Node.js too old (need 20+)
282
+ - **Version >= 20** → ✅ Node.js OK
283
+
284
+ #### 3. Check chrome-devtools-mcp
285
+
286
+ ```bash
287
+ chrome-devtools-mcp --version 2>/dev/null
288
+ ```
289
+
290
+ - **Not found** → ❌ Not installed
291
+ - **Found** → ✅ Installed (version: ...)
292
+
293
+ #### 4. Check Octo Server
294
+
295
+ ```bash
296
+ curl -s -f http://${OCTO_SERVER_HOST}:${OCTO_SERVER_PORT}/api/browser/status
297
+ ```
298
+
299
+ - **Failed** → ❌ Server not responding
300
+ - **Success** → Parse JSON and show `daemon_running` status
301
+
302
+ #### 5. Check Chrome Connection
303
+
304
+ Only run this if steps 1-4 are OK.
305
+
306
+ ```bash
307
+ browser(action="status")
308
+ ```
309
+
310
+ - **Success** → ✅ Connected. Also get the tab count from the result.
311
+ - **Failed** → ❌ Not connected. Parse the error message to determine cause.
312
+
313
+ #### 6. Check Chrome Version
314
+
315
+ Only run this if step 5 succeeded.
316
+
317
+ ```bash
318
+ browser(action="act", kind="evaluate", js="navigator.userAgent.match(/Chrome\/(\d+)/)?.[1] || 'unknown'")
319
+ ```
320
+
321
+ - **version >= 146** → ✅ Excellent
322
+ - **version 144-145** → ⚠️ Acceptable but upgrade recommended
323
+ - **version < 144 or unknown** → ❌ Too old
324
+
325
+ ### Report Format
326
+
327
+ Show results in a clean table:
328
+
329
+ ```
330
+ Browser Doctor — Diagnostic Report
331
+ ═══════════════════════════════════════════════════════════════
332
+
333
+ Configuration
334
+ [✅] Config file found (~/.octo/browser.yml)
335
+ [✅] Browser tool enabled
336
+
337
+ Dependencies
338
+ [✅] Node.js v22.1.0
339
+ [✅] chrome-devtools-mcp installed (v1.2.3)
340
+
341
+ Connection
342
+ [✅] Octo server running
343
+ [✅] MCP daemon running
344
+ [✅] Chrome connected (3 tabs open)
345
+ [✅] Chrome v146
346
+
347
+ ═══════════════════════════════════════════════════════════════
348
+ ✅ All systems operational!
349
+ ```
350
+
351
+ If there are any ❌ or ⚠️ items, show them first in a **Problems Found** section, followed by specific **Recommended Actions**:
352
+
353
+ ```
354
+ Browser Doctor — Diagnostic Report
355
+ ═══════════════════════════════════════════════════════════════
356
+
357
+ ⚠️ Problems Found
358
+ [❌] Chrome not connected
359
+ Error: Chrome/Edge is not running or remote debugging is not enabled
360
+ [❌] Chrome version v142 is too old
361
+
362
+ ───────────────────────────────────────────────────────────────
363
+
364
+ Configuration
365
+ [✅] Config file found
366
+ [✅] Browser tool enabled
367
+
368
+ Dependencies
369
+ [✅] Node.js v22.1.0
370
+ [✅] chrome-devtools-mcp installed
371
+
372
+ Connection
373
+ [✅] Octo server running
374
+ [❌] Chrome not connected
375
+
376
+ ═══════════════════════════════════════════════════════════════
377
+
378
+ 🔧 Recommended Actions
379
+
380
+ 1. Enable remote debugging:
381
+ - Open Chrome and visit: chrome://inspect/#remote-debugging
382
+ - Click "Allow remote debugging for this browser instance"
383
+
384
+ 2. Upgrade your browser:
385
+ - Chrome v142 is too old (need v146+)
386
+ - Pick the download link for the user's region from the
387
+ **Region-Aware Download Links** section at the top of this skill
388
+ (China users → google.cn; others → google.com).
389
+
390
+ After fixing these issues, run `/browser-setup` again to verify.
391
+ ```
392
+
393
+ ### Common Diagnostic Scenarios
394
+
395
+ **Scenario 1: Config not found**
396
+ ```
397
+ [❌] Config file not found
398
+
399
+ 🔧 Fix: Run `/browser-setup` to configure the browser tool.
400
+ ```
401
+
402
+ **Scenario 2: Chrome not running**
403
+ ```
404
+ [❌] Chrome not connected
405
+ Error: Chrome/Edge is not running or remote debugging is not enabled
406
+
407
+ 🔧 Fix:
408
+ 1. Open Chrome or Edge
409
+ 2. Visit: chrome://inspect/#remote-debugging
410
+ 3. Click "Allow remote debugging"
411
+ ```
412
+
413
+ **Scenario 3: MCP not installed**
414
+ ```
415
+ [❌] chrome-devtools-mcp not installed
416
+
417
+ 🔧 Fix: Run `npm install -g chrome-devtools-mcp@latest`
418
+ (or run `/browser-setup` to install automatically)
419
+ ```
420
+
421
+ **Scenario 4: Everything OK**
422
+ ```
423
+ ✅ All systems operational!
424
+
425
+ The browser tool is ready to use.
426
+ ```