boss-agent-cli 2.0.0__tar.gz → 3.0.0__tar.gz

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 (410) hide show
  1. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/.codecov.yml +0 -2
  2. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -2
  3. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -1
  4. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/.github/PULL_REQUEST_TEMPLATE.md +2 -2
  5. boss_agent_cli-3.0.0/.github/workflows/star-history.yml +65 -0
  6. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/.github/workflows/update-contributors.yml +5 -3
  7. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/CHANGELOG.md +28 -0
  8. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/CONTRIBUTING.en.md +2 -2
  9. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/CONTRIBUTING.md +2 -2
  10. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/CONTRIBUTORS.svg +30 -8
  11. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/PKG-INFO +18 -15
  12. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/README.en.md +16 -11
  13. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/README.md +17 -12
  14. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/ROADMAP.en.md +2 -7
  15. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/ROADMAP.md +2 -7
  16. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/demo/index.html +3 -3
  17. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/demo/llms.txt +1 -1
  18. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/demo/promo-showcase/scenes.jsx +0 -1
  19. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/agent-quickstart.en.md +1 -2
  20. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/agent-quickstart.md +1 -2
  21. boss_agent_cli-3.0.0/docs/assets/star-history-dark.svg +43 -0
  22. boss_agent_cli-3.0.0/docs/assets/star-history.svg +43 -0
  23. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/capability-matrix.en.md +5 -5
  24. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/capability-matrix.md +5 -5
  25. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/commands.en.md +4 -4
  26. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/commands.md +4 -4
  27. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/getting-started.en.md +1 -1
  28. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/getting-started.md +1 -1
  29. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/integrations/docker.md +6 -5
  30. boss_agent_cli-3.0.0/docs/maintainer/branch-protection.md +66 -0
  31. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/maintainer/release-checklist.md +1 -1
  32. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/marketing/en-launch-story.md +1 -1
  33. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/marketing/zh-launch-story.md +1 -1
  34. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/platform-abstraction.en.md +4 -6
  35. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/platform-abstraction.md +4 -6
  36. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/platform-risk.en.md +5 -3
  37. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/platform-risk.md +5 -3
  38. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/research/platforms/README.md +2 -4
  39. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/research/platforms/lagou.md +7 -8
  40. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/research/platforms/liepin.md +8 -9
  41. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/research/platforms/zhipin.md +3 -4
  42. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/smoke-testing.md +1 -10
  43. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/troubleshooting.en.md +16 -22
  44. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/troubleshooting.md +20 -22
  45. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/pyproject.toml +21 -21
  46. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/scripts/README.md +10 -0
  47. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/scripts/package_portable.py +2 -12
  48. boss_agent_cli-3.0.0/scripts/probe_recruiter_chat_frontend.ps1 +24 -0
  49. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/scripts/probe_recruiter_chat_frontend.py +11 -1
  50. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/__init__.py +1 -4
  51. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/ai/local_models.py +0 -22
  52. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/api/_base_client.py +0 -3
  53. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/api/browser_client.py +13 -89
  54. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/api/browser_source.py +14 -50
  55. boss_agent_cli-3.0.0/src/boss_agent_cli/api/browser_urls.py +20 -0
  56. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/api/client.py +5 -18
  57. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/api/endpoints_loader.py +0 -12
  58. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/api/httpx_helpers.py +2 -9
  59. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/auth/browser.py +21 -120
  60. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/auth/cookie_extract.py +1 -6
  61. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/auth/health.py +3 -21
  62. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/auth/manager.py +2 -37
  63. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/automation/adapters.py +0 -11
  64. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/automation/config.py +1 -1
  65. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/automation/events.py +0 -11
  66. boss_agent_cli-3.0.0/src/boss_agent_cli/commands/_contact_lookup.py +79 -0
  67. boss_agent_cli-2.0.0/src/boss_agent_cli/commands/doctor_checks.py → boss_agent_cli-3.0.0/src/boss_agent_cli/commands/_doctor_checks.py +1 -67
  68. boss_agent_cli-2.0.0/src/boss_agent_cli/commands/login.py → boss_agent_cli-3.0.0/src/boss_agent_cli/commands/_login_errors.py +2 -65
  69. boss_agent_cli-3.0.0/src/boss_agent_cli/commands/_platform.py +50 -0
  70. boss_agent_cli-3.0.0/src/boss_agent_cli/commands/_recruiter_platform.py +25 -0
  71. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/agent.py +1 -1
  72. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/ai_cmd.py +1 -1
  73. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/chat.py +9 -5
  74. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/chat_summary.py +10 -5
  75. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/chatmsg.py +17 -6
  76. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/detail.py +1 -27
  77. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/digest.py +1 -1
  78. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/doctor.py +16 -45
  79. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/exchange.py +10 -5
  80. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/export.py +12 -156
  81. boss_agent_cli-3.0.0/src/boss_agent_cli/commands/login.py +69 -0
  82. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/mark.py +4 -3
  83. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/pipeline.py +2 -2
  84. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/platforms.py +0 -13
  85. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/recruiter/chat.py +1 -1
  86. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/recruiter/resume.py +1 -1
  87. boss_agent_cli-3.0.0/src/boss_agent_cli/commands/schema.py +44 -0
  88. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/show.py +1 -1
  89. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/status.py +2 -45
  90. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/wizard.py +4 -1
  91. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/config.py +1 -1
  92. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/display.py +3 -7
  93. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/mcp_server.py +1 -1
  94. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/mcp_tools.py +9 -8
  95. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/pipeline_state.py +1 -1
  96. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/platforms/__init__.py +0 -3
  97. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/platforms/base.py +0 -4
  98. boss_agent_cli-3.0.0/src/boss_agent_cli/platforms/factory.py +84 -0
  99. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/platforms/zhipin.py +1 -1
  100. boss_agent_cli-3.0.0/src/boss_agent_cli/schema/__init__.py +4 -0
  101. boss_agent_cli-3.0.0/src/boss_agent_cli/schema/availability.py +131 -0
  102. boss_agent_cli-2.0.0/src/boss_agent_cli/commands/schema.py → boss_agent_cli-3.0.0/src/boss_agent_cli/schema/data.py +12 -559
  103. boss_agent_cli-3.0.0/src/boss_agent_cli/schema/error_codes.py +267 -0
  104. boss_agent_cli-3.0.0/src/boss_agent_cli/schema/formats.py +128 -0
  105. boss_agent_cli-3.0.0/src/boss_agent_cli/services/__init__.py +1 -0
  106. boss_agent_cli-3.0.0/src/boss_agent_cli/services/browser_runtime.py +60 -0
  107. {boss_agent_cli-2.0.0/src/boss_agent_cli/commands → boss_agent_cli-3.0.0/src/boss_agent_cli/services}/chat_export.py +20 -17
  108. {boss_agent_cli-2.0.0/src/boss_agent_cli/commands → boss_agent_cli-3.0.0/src/boss_agent_cli/services}/chat_snapshot.py +16 -15
  109. {boss_agent_cli-2.0.0/src/boss_agent_cli/commands → boss_agent_cli-3.0.0/src/boss_agent_cli/services}/chat_utils.py +16 -0
  110. boss_agent_cli-3.0.0/src/boss_agent_cli/services/contact_lookup.py +65 -0
  111. boss_agent_cli-3.0.0/src/boss_agent_cli/services/job_card.py +32 -0
  112. boss_agent_cli-3.0.0/src/boss_agent_cli/services/job_export.py +153 -0
  113. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/wizard/actions.py +57 -25
  114. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/wizard/catalog.py +12 -4
  115. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/wizard/preflight.py +9 -9
  116. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/wizard/prompts.py +5 -2
  117. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/wizard/renderer.py +1 -34
  118. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_agent_automation.py +20 -33
  119. boss_agent_cli-3.0.0/tests/test_agent_automation_cross_validation.py +100 -0
  120. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_agent_docs.py +13 -8
  121. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_ai_local.py +0 -33
  122. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_api.py +0 -14
  123. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_api_client_methods.py +30 -15
  124. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_api_httpx_helpers.py +11 -5
  125. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_apply.py +0 -51
  126. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_auth_and_login_extended.py +0 -46
  127. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_auth_browser.py +6 -227
  128. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_auth_manager_extended.py +6 -74
  129. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_auth_manager_flow.py +0 -90
  130. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_browser_client.py +52 -12
  131. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_browser_source.py +57 -34
  132. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_chat_export_extended.py +41 -5
  133. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_chat_snapshot_extended.py +99 -1
  134. boss_agent_cli-3.0.0/tests/test_chatmsg_uid_flow.py +227 -0
  135. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_commands.py +21 -114
  136. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_contact_lookup.py +91 -1
  137. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_cookie_extract_regression.py +8 -11
  138. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_curl_auth_import.py +2 -2
  139. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_display.py +13 -13
  140. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_doctor_extended.py +48 -129
  141. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_export_extended.py +3 -3
  142. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_favorites.py +1 -1
  143. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_greet_detail_extended.py +1 -1
  144. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_mcp_server.py +9 -7
  145. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_new_commands.py +11 -208
  146. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_open_source_docs.py +45 -105
  147. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_platform_base.py +12 -0
  148. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_platform_cli.py +41 -27
  149. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_platform_not_supported.py +21 -3
  150. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_platforms_cmd.py +13 -16
  151. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_portable_package.py +3 -1
  152. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_public_api.py +6 -1
  153. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_recruiter_recommendations_and_read.py +1 -1
  154. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_recruiter_resume_attachments.py +2 -2
  155. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_schema_contract.py +15 -5
  156. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_schema_formats.py +14 -14
  157. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_search_filters.py +1 -1
  158. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_search_pipeline.py +1 -1
  159. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_shortlist.py +0 -30
  160. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_smoke_p0.py +10 -10
  161. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_stats.py +1 -1
  162. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_welfare_filter.py +4 -3
  163. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_wizard.py +94 -5
  164. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/uv.lock +9 -684
  165. boss_agent_cli-2.0.0/.github/dependabot.yml +0 -21
  166. boss_agent_cli-2.0.0/.github/workflows/ci.yml +0 -264
  167. boss_agent_cli-2.0.0/.github/workflows/docs.yml +0 -57
  168. boss_agent_cli-2.0.0/docs/assets/star-history-dark.svg +0 -47
  169. boss_agent_cli-2.0.0/docs/assets/star-history.svg +0 -47
  170. boss_agent_cli-2.0.0/docs/maintainer/branch-protection.md +0 -74
  171. boss_agent_cli-2.0.0/docs/research/bridge-grpc.md +0 -134
  172. boss_agent_cli-2.0.0/docs/research/platforms/zhaopin-recruiter-evaluation.md +0 -165
  173. boss_agent_cli-2.0.0/docs/research/platforms/zhaopin.md +0 -217
  174. boss_agent_cli-2.0.0/extension/background.js +0 -280
  175. boss_agent_cli-2.0.0/extension/manifest.json +0 -25
  176. boss_agent_cli-2.0.0/src/boss_agent_cli/api/zhilian.yaml +0 -81
  177. boss_agent_cli-2.0.0/src/boss_agent_cli/api/zhilian_client.py +0 -303
  178. boss_agent_cli-2.0.0/src/boss_agent_cli/automation/zhilian_adapter.py +0 -218
  179. boss_agent_cli-2.0.0/src/boss_agent_cli/automation/zhilian_browser.py +0 -327
  180. boss_agent_cli-2.0.0/src/boss_agent_cli/automation/zhilian_browser_actions.py +0 -32
  181. boss_agent_cli-2.0.0/src/boss_agent_cli/automation/zhilian_cdp.py +0 -66
  182. boss_agent_cli-2.0.0/src/boss_agent_cli/automation/zhilian_selectors.py +0 -104
  183. boss_agent_cli-2.0.0/src/boss_agent_cli/bridge/client.py +0 -372
  184. boss_agent_cli-2.0.0/src/boss_agent_cli/bridge/daemon.py +0 -270
  185. boss_agent_cli-2.0.0/src/boss_agent_cli/bridge/protocol.py +0 -70
  186. boss_agent_cli-2.0.0/src/boss_agent_cli/commands/_platform.py +0 -93
  187. boss_agent_cli-2.0.0/src/boss_agent_cli/commands/_recruiter_platform.py +0 -52
  188. boss_agent_cli-2.0.0/src/boss_agent_cli/commands/contact_lookup.py +0 -96
  189. boss_agent_cli-2.0.0/src/boss_agent_cli/platforms/zhilian.py +0 -83
  190. boss_agent_cli-2.0.0/src/boss_agent_cli/resume/__init__.py +0 -0
  191. boss_agent_cli-2.0.0/tests/test_agent_automation_cross_validation.py +0 -247
  192. boss_agent_cli-2.0.0/tests/test_bridge.py +0 -200
  193. boss_agent_cli-2.0.0/tests/test_bridge_extended.py +0 -340
  194. boss_agent_cli-2.0.0/tests/test_doctor_zhilian.py +0 -44
  195. boss_agent_cli-2.0.0/tests/test_zhilian_browser_automation.py +0 -250
  196. boss_agent_cli-2.0.0/tests/test_zhilian_client.py +0 -348
  197. boss_agent_cli-2.0.0/tests/test_zhilian_interview_data.py +0 -27
  198. boss_agent_cli-2.0.0/tests/test_zhilian_stub.py +0 -237
  199. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/.devcontainer/devcontainer.json +0 -0
  200. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/.dockerignore +0 -0
  201. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/.gitattributes +0 -0
  202. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/.github/CODEOWNERS +0 -0
  203. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  204. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/.github/ISSUE_TEMPLATE/documentation.yml +0 -0
  205. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/.github/social-preview.png +0 -0
  206. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/.github/workflows/pages.yml +0 -0
  207. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/.github/workflows/release.yml +0 -0
  208. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/.github/workflows/triage-cleanup.yml +0 -0
  209. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/.gitignore +0 -0
  210. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/.pre-commit-config.yaml +0 -0
  211. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/CODE_OF_CONDUCT.md +0 -0
  212. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/Dockerfile +0 -0
  213. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/LICENSE +0 -0
  214. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/SECURITY.md +0 -0
  215. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/demo/demo-en.tape +0 -0
  216. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/demo/demo-zh.tape +0 -0
  217. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/demo/demo_showcase.py +0 -0
  218. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/demo/demo_showcase_en.py +0 -0
  219. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/demo/promo-showcase/README.md +0 -0
  220. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/demo/promo-showcase/animations.jsx +0 -0
  221. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/demo/promo-showcase/app.jsx +0 -0
  222. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/demo/promo-showcase/boss-agent-cli-promo.html +0 -0
  223. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/demo/promo-showcase/lib.jsx +0 -0
  224. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/demo/showcase/boss-agent-cli-showcase-thumb.jpg +0 -0
  225. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docker-compose.yml +0 -0
  226. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/adr/0001-default-low-risk-assistance-mode.md +0 -0
  227. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/adr/0002-explicit-research-operating-mode.md +0 -0
  228. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/agent-hosts.en.md +0 -0
  229. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/agent-hosts.md +0 -0
  230. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/assets/logo.png +0 -0
  231. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/integrations/ai-models.en.md +0 -0
  232. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/integrations/ai-models.md +0 -0
  233. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/integrations/claude-code.md +0 -0
  234. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/integrations/codex.md +0 -0
  235. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/integrations/cursor.md +0 -0
  236. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/integrations/python-sdk.md +0 -0
  237. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/integrations/shell-agent.md +0 -0
  238. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/integrations/windsurf.md +0 -0
  239. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/maintainer/labels.md +0 -0
  240. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/marketing/awesome-submissions.md +0 -0
  241. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/marketing/promotion-article.md +0 -0
  242. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/docs/readme-badge-policy.md +0 -0
  243. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/evals/README.md +0 -0
  244. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/evals/results/20260624T103356Z-fixture.json +0 -0
  245. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/evals/results/README.md +0 -0
  246. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/evals/results/necessary-conditions-2026-06-24.json +0 -0
  247. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/evals/run_eval.py +0 -0
  248. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/evals/scenarios.json +0 -0
  249. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/examples/opencode/opencode.json +0 -0
  250. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/glama.json +0 -0
  251. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/mcp-server/README.en.md +0 -0
  252. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/mcp-server/README.md +0 -0
  253. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/mcp-server/server.py +0 -0
  254. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/scripts/quality_baseline.py +0 -0
  255. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/scripts/smoke_p0.py +0 -0
  256. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/scripts/update_contributors.py +0 -0
  257. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/ai/__init__.py +0 -0
  258. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/ai/config.py +0 -0
  259. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/ai/prompts.py +0 -0
  260. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/ai/service.py +0 -0
  261. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/api/__init__.py +0 -0
  262. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/api/boss.yaml +0 -0
  263. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/api/endpoints.py +0 -0
  264. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/api/models.py +0 -0
  265. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/api/recruiter.yaml +0 -0
  266. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/api/recruiter_client.py +0 -0
  267. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/api/recruiter_endpoints.py +0 -0
  268. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/api/recruiter_resume.py +0 -0
  269. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/api/throttle.py +0 -0
  270. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/api/zhipin_errors.py +0 -0
  271. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/auth/__init__.py +0 -0
  272. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/auth/curl_import.py +0 -0
  273. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/auth/qr_login.py +0 -0
  274. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/auth/token_store.py +0 -0
  275. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/automation/__init__.py +0 -0
  276. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/automation/boss_adapter.py +0 -0
  277. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/automation/decision.py +0 -0
  278. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/automation/execution.py +0 -0
  279. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/automation/mock_adapter.py +0 -0
  280. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/automation/models.py +0 -0
  281. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/automation/reply_ai.py +0 -0
  282. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/automation/runner.py +0 -0
  283. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/automation/safety.py +0 -0
  284. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/automation/scoring.py +0 -0
  285. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/automation/storage.py +0 -0
  286. {boss_agent_cli-2.0.0/src/boss_agent_cli/bridge → boss_agent_cli-3.0.0/src/boss_agent_cli/cache}/__init__.py +0 -0
  287. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/cache/store.py +0 -0
  288. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/chat_summary.py +0 -0
  289. {boss_agent_cli-2.0.0/src/boss_agent_cli/cache → boss_agent_cli-3.0.0/src/boss_agent_cli/commands}/__init__.py +0 -0
  290. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/ai_local.py +0 -0
  291. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/apply.py +0 -0
  292. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/cities.py +0 -0
  293. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/clean.py +0 -0
  294. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/config_cmd.py +0 -0
  295. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/crawl.py +0 -0
  296. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/favorites.py +0 -0
  297. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/greet.py +0 -0
  298. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/history.py +0 -0
  299. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/interviews.py +0 -0
  300. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/logout.py +0 -0
  301. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/me.py +0 -0
  302. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/preset.py +0 -0
  303. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/recommend.py +0 -0
  304. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/recruiter/__init__.py +0 -0
  305. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/recruiter/accept_resume.py +0 -0
  306. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/recruiter/applications.py +0 -0
  307. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/recruiter/candidates.py +0 -0
  308. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/recruiter/download_resume.py +0 -0
  309. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/recruiter/jobs.py +0 -0
  310. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/recruiter/recommendations.py +0 -0
  311. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/recruiter/reply.py +0 -0
  312. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/recruiter/request_resume.py +0 -0
  313. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/register.py +0 -0
  314. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/resume_cmd.py +0 -0
  315. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/search.py +0 -0
  316. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/shortlist.py +0 -0
  317. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/stats.py +0 -0
  318. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/commands/watch.py +0 -0
  319. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/compliance.py +0 -0
  320. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/crawler/__init__.py +0 -0
  321. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/crawler/exporter.py +0 -0
  322. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/crawler/hooks.py +0 -0
  323. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/crawler/operations.py +0 -0
  324. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/crawler/service.py +0 -0
  325. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/crawler/transport.py +0 -0
  326. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/digest.py +0 -0
  327. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/hooks.py +0 -0
  328. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/index_cache.py +0 -0
  329. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/main.py +0 -0
  330. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/match_score.py +0 -0
  331. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/mcp_args.py +0 -0
  332. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/output.py +0 -0
  333. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/platforms/recruiter_base.py +0 -0
  334. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/platforms/zhipin_recruiter.py +0 -0
  335. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/py.typed +0 -0
  336. {boss_agent_cli-2.0.0/src/boss_agent_cli/commands → boss_agent_cli-3.0.0/src/boss_agent_cli/resume}/__init__.py +0 -0
  337. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/resume/export.py +0 -0
  338. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/resume/models.py +0 -0
  339. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/resume/store.py +0 -0
  340. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/resume/templates.py +0 -0
  341. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/search_filters.py +0 -0
  342. {boss_agent_cli-2.0.0/src/boss_agent_cli/commands → boss_agent_cli-3.0.0/src/boss_agent_cli/services}/friend_list_pages.py +0 -0
  343. {boss_agent_cli-2.0.0/src/boss_agent_cli/commands/recruiter → boss_agent_cli-3.0.0/src/boss_agent_cli/services}/resume_parser.py +0 -0
  344. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/wizard/__init__.py +0 -0
  345. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/wizard/live_crawl.py +0 -0
  346. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/wizard/models.py +0 -0
  347. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/wizard/runner.py +0 -0
  348. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/src/boss_agent_cli/wizard/store.py +0 -0
  349. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/conftest.py +0 -0
  350. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/fixtures/favorites_card.json +0 -0
  351. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_agent_crawl.py +0 -0
  352. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_agent_error_contract.py +0 -0
  353. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_agent_host_examples.py +0 -0
  354. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_ai_commands.py +0 -0
  355. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_ai_config.py +0 -0
  356. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_ai_config_cmd.py +0 -0
  357. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_ai_cover_letter.py +0 -0
  358. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_ai_fit.py +0 -0
  359. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_ai_prompts.py +0 -0
  360. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_ai_resume_optimize.py +0 -0
  361. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_ai_service.py +0 -0
  362. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_ai_suggest_keywords.py +0 -0
  363. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_api_client_retry.py +0 -0
  364. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_auth.py +0 -0
  365. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_cache.py +0 -0
  366. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_cache_extended.py +0 -0
  367. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_chat_summary.py +0 -0
  368. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_chat_summary_command.py +0 -0
  369. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_chatmsg_extended.py +0 -0
  370. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_clean_cmd.py +0 -0
  371. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_cli_invariants.py +0 -0
  372. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_compliance.py +0 -0
  373. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_config_cmd.py +0 -0
  374. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_coverage_second_sprint.py +0 -0
  375. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_crawl.py +0 -0
  376. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_crawl_cli.py +0 -0
  377. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_digest.py +0 -0
  378. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_digest_command.py +0 -0
  379. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_endpoints_loader.py +0 -0
  380. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_eval_harness.py +0 -0
  381. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_greet_extended.py +0 -0
  382. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_hooks.py +0 -0
  383. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_index_cache.py +0 -0
  384. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_job_card_browser.py +0 -0
  385. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_job_item_lid.py +0 -0
  386. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_match_score.py +0 -0
  387. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_mcp_handler_registration.py +0 -0
  388. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_mcp_server_protocol.py +0 -0
  389. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_output.py +0 -0
  390. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_pipeline_commands.py +0 -0
  391. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_pipeline_state.py +0 -0
  392. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_preset.py +0 -0
  393. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_probe_script.py +0 -0
  394. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_qr_login.py +0 -0
  395. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_quality_baseline.py +0 -0
  396. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_recruiter_client_retry.py +0 -0
  397. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_recruiter_safety_regressions.py +0 -0
  398. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_resume_commands.py +0 -0
  399. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_resume_export.py +0 -0
  400. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_resume_import_compat.py +0 -0
  401. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_resume_init_hints.py +0 -0
  402. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_resume_models.py +0 -0
  403. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_resume_store.py +0 -0
  404. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_resume_templates.py +0 -0
  405. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_schema_mcp_tools.py +0 -0
  406. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_system_proxy.py +0 -0
  407. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_throttle.py +0 -0
  408. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_watch.py +0 -0
  409. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_watch_run_all.py +0 -0
  410. {boss_agent_cli-2.0.0 → boss_agent_cli-3.0.0}/tests/test_zhipin_errors.py +0 -0
@@ -32,6 +32,4 @@ ignore:
32
32
  - "scripts/"
33
33
  # 真实浏览器 / 守护进程链路:单测只能造出无意义的桩覆盖,排除后让
34
34
  # patch 门槛聚焦在真正可测的命令层与纯逻辑上。
35
- - "src/boss_agent_cli/bridge/daemon.py"
36
35
  - "src/boss_agent_cli/crawler/transport.py"
37
- - "src/boss_agent_cli/automation/zhilian_cdp.py"
@@ -85,7 +85,6 @@ body:
85
85
  label: 招聘平台 / Platform
86
86
  options:
87
87
  - zhipin
88
- - zhilian
89
88
  - unknown
90
89
  validations:
91
90
  required: true
@@ -136,7 +135,6 @@ body:
136
135
  description: 影响风控和登录表现
137
136
  options:
138
137
  - 不涉及(login/status 等命令)
139
- - Bridge(Chrome 扩展)
140
138
  - CDP(用户 Chrome)
141
139
  - patchright headless
142
140
  - 不确定
@@ -61,7 +61,6 @@ body:
61
61
  label: 目标平台 / Target platform
62
62
  options:
63
63
  - zhipin
64
- - zhilian
65
64
  - all platforms
66
65
  - not platform-specific
67
66
  validations:
@@ -48,10 +48,10 @@ Closes #
48
48
 
49
49
  ## 文档与契约 / Docs & Contracts
50
50
 
51
- - [ ] 如新增命令:已更新 `src/boss_agent_cli/commands/schema.py`
51
+ - [ ] 如新增命令:已更新 `src/boss_agent_cli/schema/data.py`
52
52
  - [ ] 如变更 CLI 行为:已更新 `README.md` 和 `docs/capability-matrix.md`
53
53
  - [ ] 如新增 MCP 工具:已更新 `mcp-server/server.py` 和 `mcp-server/README.md`
54
- - [ ] 如新增错误码:已添加到 `schema.py` 的 `error_codes`
54
+ - [ ] 如新增错误码:已添加到 `src/boss_agent_cli/schema/error_codes.py` 的 `ERROR_CODES`
55
55
  - [ ] 已更新 `CHANGELOG.md` 的 `[Unreleased]` 段落
56
56
  - [ ] 如变更 Agent 主卖点或安装路径:已同步更新 README / landing 的 MCP 接入说明、PyPI 版本与 GitHub Release 说明
57
57
 
@@ -0,0 +1,65 @@
1
+ name: Star History
2
+
3
+ on:
4
+ schedule:
5
+ - cron: "0 0 * * 0" # 每周日 00:00 UTC = 北京时间周一 08:00
6
+ workflow_dispatch:
7
+
8
+ concurrency:
9
+ group: ${{ github.workflow }}
10
+ cancel-in-progress: true
11
+
12
+ permissions:
13
+ contents: write
14
+
15
+ jobs:
16
+ star-history:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ # 2026-07 起 stargazers 接口只对 admin/collaborator 开放,Actions 默认的 github.token
20
+ # 读不到星标时间线,必须使用 fine-grained PAT(Metadata: Read-only + Contents: Read and write)。
21
+ - name: 校验凭据
22
+ env:
23
+ STAR_HISTORY_TOKEN: ${{ secrets.STAR_HISTORY_TOKEN }}
24
+ run: |
25
+ if [ -z "$STAR_HISTORY_TOKEN" ]; then
26
+ echo "::error::缺少 STAR_HISTORY_TOKEN。请创建 fine-grained PAT(Metadata: Read-only、Contents: Read and write)后执行:gh secret set STAR_HISTORY_TOKEN --repo $GITHUB_REPOSITORY"
27
+ exit 1
28
+ fi
29
+
30
+ - name: 检出仓库
31
+ uses: actions/checkout@v7
32
+ with:
33
+ ref: master
34
+ token: ${{ secrets.STAR_HISTORY_TOKEN }}
35
+
36
+ # mystarhistory 没有 pip 包,且脚本需读取同目录的 handlee-subset.woff2(字体内嵌进 SVG),
37
+ # 所以整体克隆并 pin 到 v1;升级时改这里的 SHA 即可。
38
+ - name: 获取 mystarhistory (pinned v1)
39
+ run: |
40
+ git clone -q https://github.com/carsteneu/mystarhistory.git "$RUNNER_TEMP/mystarhistory"
41
+ git -C "$RUNNER_TEMP/mystarhistory" checkout -q ec82d645a6df185f4d845b33691a6bcdd02f608a
42
+
43
+ - name: 生成明/暗两版 SVG
44
+ env:
45
+ GH_TOKEN: ${{ secrets.STAR_HISTORY_TOKEN }}
46
+ run: |
47
+ python3 "$RUNNER_TEMP/mystarhistory/mystarhistory.py" \
48
+ --repo "$GITHUB_REPOSITORY" \
49
+ --output docs/assets/star-history.svg
50
+ python3 "$RUNNER_TEMP/mystarhistory/mystarhistory.py" \
51
+ --repo "$GITHUB_REPOSITORY" \
52
+ --dark \
53
+ --output docs/assets/star-history-dark.svg
54
+
55
+ - name: 有变化则提交
56
+ run: |
57
+ if git diff --quiet -- docs/assets/star-history.svg docs/assets/star-history-dark.svg; then
58
+ echo "图表无变化,跳过提交"
59
+ exit 0
60
+ fi
61
+ git config user.name "github-actions[bot]"
62
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
63
+ git add docs/assets/star-history.svg docs/assets/star-history-dark.svg
64
+ git commit -m "docs: 刷新 Star History 快照"
65
+ git push
@@ -1,9 +1,10 @@
1
1
  name: Update Contributors
2
2
 
3
3
  on:
4
+ # PR 合并后刷新(pull_request_target 保证 fork PR 合并时也拿得到写权限)
5
+ pull_request_target:
6
+ types: [closed]
4
7
  workflow_dispatch:
5
- schedule:
6
- - cron: "0 0 * * 0" # 每周日 00:00 UTC
7
8
 
8
9
  concurrency:
9
10
  group: ${{ github.workflow }}-${{ github.ref }}
@@ -11,6 +12,7 @@ concurrency:
11
12
 
12
13
  jobs:
13
14
  update-contributors:
15
+ if: github.event_name == 'workflow_dispatch' || github.event.pull_request.merged == true
14
16
  runs-on: ubuntu-latest
15
17
  permissions:
16
18
  contents: write
@@ -31,7 +33,7 @@ jobs:
31
33
  with:
32
34
  commit-message: "chore: 更新贡献者名单"
33
35
  title: "chore: update contributors"
34
- body: "每周自动刷新 CONTRIBUTORS.svg(scripts/update_contributors.py)。"
36
+ body: "PR 合并后自动刷新 CONTRIBUTORS.svg(scripts/update_contributors.py)。"
35
37
  branch: chore/update-contributors
36
38
  add-paths: CONTRIBUTORS.svg
37
39
  delete-branch: true
@@ -4,6 +4,34 @@
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [3.0.0] - 2026-10-02
8
+
9
+ ### Changed(含 Breaking Change)
10
+ - **移除 Browser Bridge。** 删除本地 daemon、Chrome 扩展、Python `boss_agent_cli.bridge` 包与 `[bridge]` extra,移除 `boss doctor` 的七项 `bridge_*` 诊断;不再探测或连接旧 Bridge 服务。浏览器来源 `auto` 的通道顺序改为 CDP → headless,`existing-browser` 仅复用已有 CDP 浏览器中的目标页;`stored-cookie` 仍只连接显式指定的 CDP 端点,来源约束和风控停止契约不变。
11
+ - `chat` / `chatmsg` 默认继续使用本地凭据的 httpx 通道;需要不读取本地凭据的现有浏览器会话时,请显式使用 `boss --browser-source existing-browser --cdp-url http://localhost:9222 chat`,并在该浏览器中手动打开和登录 BOSS 直聘。
12
+ - **升级 CLI 不会停止旧 daemon,也不会卸载浏览器扩展。** 请手动停止旧 daemon(包括其他虚拟环境中的实例),在 `chrome://extensions` 禁用或移除旧扩展,并从安装配置中删除 `[bridge]` extra。CDP 调试端口仅限本机可信环境使用,不得用于规避平台风控。
13
+ - **移除智联招聘(`zhilian`)平台。** 求职者侧适配器(`ZhilianPlatform` / `ZhilianClient` / `zhilian.yaml`)、招聘者侧 `agent` 浏览器 / CDP 自动化(`automation/zhilian_*`)、`ZhilianPlatform` 包级公开导出、schema 与 MCP 描述中的平台可用性、能力矩阵、向导标签、研究文档和演示内容一并删除;BOSS 直聘(`zhipin`)成为唯一注册平台,多平台抽象(`Platform` / `RecruiterPlatform` 注册表与 `--platform` 选项)保留。`boss --platform zhilian ...`(含 `--role recruiter agent run`、`status --live`、`hr ...`、`platforms --platform zhilian`)以及用 `boss-mcp --platform zhilian` 启动的 MCP 宿主,现在都返回七键 `INVALID_PARAM` 信封(`unknown platform 'zhilian', supported: zhipin`)。
14
+ - 迁移:若 `config.json` 里写着 `platform: zhilian`,所有命令都会被拒绝,运行 `boss --platform zhipin config set platform zhipin` 改回默认平台。
15
+ - `boss doctor` 不再额外探测 zhaopin.com(`network_zhilian` 检查项移除);招聘者 `status --live` 的智联 selector 健康检查及其 `SELECTOR_HEALTH_FAILED` 错误、`selector_health` 字段随之移除。
16
+ - 升级前以 `zhilian` 保存的 wizard run(含 MCP `boss_wizard` 恢复)在恢复时同样返回 `INVALID_PARAM`,不再读取遗留登录态;请以 `zhipin` 新建 run。
17
+ - 便携包不再附带 `examples/zhilian-recruiter.sh`。
18
+ - 本地遗留的 `~/.boss-agent/auth/zhilian/` 登录态与自动化存储中的智联条目不再被读取,也不会被 zhipin 运行执行,可手动删除。
19
+
20
+ ### Changed
21
+ - 内部重构:`boss schema` 的能力描述、错误码登记表与格式转换从命令模块 `commands/schema.py` 拆到独立的 `boss_agent_cli.schema` 包(`data` / `error_codes` / `availability` / `formats`),`display` 与 `mcp_tools` 不再反向依赖命令层;CLI 输出、`boss schema` 四种格式与 MCP 工具面均逐字节不变。
22
+ - 内部重构:`commands/` 只保留 Click 命令与 `_` 前缀的 CLI 支撑模块;聊天导出 / 快照、联系人查找、职位导出、job_card 映射、浏览器内核探测等可复用逻辑移入 `boss_agent_cli.services`,平台实例构造移入 `platforms/factory.py`,wizard 不再调用命令模块的私有函数;行为不变。
23
+ - 内部重构:CDP 默认地址与 zhipin / zhilian 域名校验移到 `api/browser_urls.py`,`api/browser_client.py` 不再 import `auth.browser` 的私有符号,打断 api ↔ auth 运行时 import 循环;行为不变。
24
+ - 清理无运行时调用方的代码:`automation/zhilian_browser_actions.py`(与智联自动化平台 `execute_action` 重复的动作分派,#379 后已无调用方)、`automation.events.stable_action_id`、Bridge daemon 的 `start_daemon_background` / `stop_daemon` 与未使用的 `BridgeNotRunning` / `BridgeExtensionDisconnected`、`ai.local_models.parse_model_manifest`,以及 wizard renderer 中三个未被调用的渲染函数。原先经 `execute_browser_action` 覆盖智联浏览器 session 的用例改走运行时真实路径 `ZhilianRecruiterAutomationPlatform.execute_action`;`compliance` 中的历史兼容函数按设计保留。
25
+
26
+ ### Fixed
27
+ - `boss chat` 现在公开跨请求稳定的联系人 `uid`,`chatmsg` / `chat-summary` / `mark` / `exchange` 优先按 `uid` 重新解析联系人并使用本次沟通列表返回的动态 `securityId`;沟通快照、diff 与导出映射同步改用 `uid` 主键,避免轮换令牌导致联系人查找必然失败和快照重复。既有 `security_id` 参数名与无 `uid` 的旧快照仍兼容,但旧令牌仅作兜底且可能已经失效。
28
+ - 移除通用 CI / Docs workflow 后,同步清理失效的 README 状态徽章、远端门禁文档与工作流存在性断言;PR 和发版改为明确执行维护者本地质量门禁,避免主线测试固定读取已删除文件。
29
+
30
+ ## [2.0.1] - 2026-09-29
31
+
32
+ ### Fixed
33
+ - `boss chat` 现在公开跨请求稳定的联系人 `uid`,`chatmsg` / `chat-summary` / `mark` / `exchange` 优先按 `uid` 重新解析联系人并使用本次沟通列表返回的动态 `securityId`;沟通快照、diff 与导出映射同步改用 `uid` 主键,避免轮换令牌导致联系人查找必然失败和快照重复。既有 `security_id` 参数名与无 `uid` 的旧快照仍兼容,但旧令牌仅作兜底且可能已经失效。
34
+
7
35
  ## [2.0.0] - 2026-09-15
8
36
 
9
37
  ### Changed(含 Breaking Change)
@@ -84,7 +84,7 @@ Maintainers will `squash merge`, so the squash title must follow the commit conv
84
84
 
85
85
  1. Create a file under `src/boss_agent_cli/commands/`
86
86
  2. Register it in `commands/register.py` (`register_candidate_commands` / `register_recruiter_commands`; `main.py` only holds global options and does not attach commands directly)
87
- 3. Describe it in `src/boss_agent_cli/commands/schema.py` (under `SCHEMA_DATA["commands"]`); when the top-level command count changes, also update the "共 N 个顶层命令" count inside `SCHEMA_DATA["description"]` (a test asserts the count matches the command table length)
87
+ 3. Describe it in `src/boss_agent_cli/schema/data.py` (under `SCHEMA_DATA["commands"]`); when the top-level command count changes, also update the "共 N 个顶层命令" count inside `SCHEMA_DATA["description"]` (a test asserts the count matches the command table length)
88
88
  4. Add tests in `tests/test_commands.py` or a new file matching the command name
89
89
  5. Update `docs/commands.md` and `docs/commands.en.md` (command cheat-sheet)
90
90
  6. Update `AGENTS.md` (command-count invariant) and the command counts in `docs/capability-matrix.md` / `docs/capability-matrix.en.md`; `tests/test_agent_docs.py` hard-codes these count strings, so update it in the same change
@@ -113,7 +113,7 @@ Every command must output a JSON envelope to **stdout**:
113
113
  - `exit 0` — success (`ok=true`)
114
114
  - `exit 1` — failure (`ok=false`)
115
115
 
116
- On error, the envelope must contain `error.code`, `error.recoverable`, and `error.recovery_action`. See `SCHEMA_DATA["error_codes"]` in `src/boss_agent_cli/commands/schema.py` for the current enum.
116
+ On error, the envelope must contain `error.code`, `error.recoverable`, and `error.recovery_action`. See `ERROR_CODES` in `src/boss_agent_cli/schema/error_codes.py` for the current enum (the `error_codes` section of `boss schema` is generated from it).
117
117
 
118
118
  ## Testing Philosophy
119
119
 
@@ -95,7 +95,7 @@ git diff --check
95
95
  - `exit 0` 表示成功(`ok=true`)。
96
96
  - `exit 1` 表示失败(`ok=false`)。
97
97
 
98
- 出错时信封必须包含 `error.code`、`error.recoverable` 和 `error.recovery_action`。可用错误码见 `src/boss_agent_cli/commands/schema.py` 中 `SCHEMA_DATA["error_codes"]`。
98
+ 出错时信封必须包含 `error.code`、`error.recoverable` 和 `error.recovery_action`。可用错误码见 `src/boss_agent_cli/schema/error_codes.py` 中的 `ERROR_CODES`(`boss schema` 输出的 `error_codes` 即由它生成)。
99
99
 
100
100
  ## 测试理念
101
101
 
@@ -113,7 +113,7 @@ git diff --check
113
113
 
114
114
  1. 在 `src/boss_agent_cli/commands/` 下新建文件
115
115
  2. 在 `commands/register.py` 中注册命令(`register_candidate_commands` / `register_recruiter_commands`;`main.py` 只保留全局选项,不直接挂命令)
116
- 3. 在 `schema.py`(`SCHEMA_DATA["commands"]`)中添加命令描述;顶层命令数变化时同步 `SCHEMA_DATA["description"]` 中的「共 N 个顶层命令」计数(有测试断言计数与命令表长度一致)
116
+ 3. 在 `src/boss_agent_cli/schema/data.py`(`SCHEMA_DATA["commands"]`)中添加命令描述;顶层命令数变化时同步 `SCHEMA_DATA["description"]` 中的「共 N 个顶层命令」计数(有测试断言计数与命令表长度一致)
117
117
  4. 在 `tests/test_commands.py` 或按命令名新建测试文件
118
118
  5. 更新 `docs/commands.md` 和 `docs/commands.en.md`(命令速查表)
119
119
  6. 更新 `AGENTS.md`(CLI 不变量契约中的命令数)与 `docs/capability-matrix.md` / `docs/capability-matrix.en.md` 中的命令计数;`tests/test_agent_docs.py` 对这些计数字符串有硬编码断言,需一并更新
@@ -1,4 +1,4 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1000" height="250" viewBox="0 0 1000 250">
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1000" height="364" viewBox="0 0 1000 364">
2
2
  <g transform="translate(45, 22)">
3
3
  <defs>
4
4
  <clipPath id="cp-can4hou6joeng4">
@@ -77,6 +77,17 @@
77
77
  </a>
78
78
  </g>
79
79
  <g transform="translate(864, 22)">
80
+ <defs>
81
+ <clipPath id="cp-davids-dot">
82
+ <circle cx="36" cy="36" r="36" />
83
+ </clipPath>
84
+ </defs>
85
+ <a xlink:href="https://github.com/davids-dot" href="https://github.com/davids-dot" class="contributor-link" target="_blank" rel="nofollow sponsored" title="Davids dot">
86
+ <image width="72" height="72" xlink:href="data:image/jpeg;base64,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" href="data:image/jpeg;base64,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" clip-path="url(#cp-davids-dot)" />
87
+ <text x="36" y="86" text-anchor="middle" alignment-baseline="middle" font-size="10" fill="#666" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif">Davids dot</text>
88
+ </a>
89
+ </g>
90
+ <g transform="translate(45, 136)">
80
91
  <defs>
81
92
  <clipPath id="cp-Komikawayi">
82
93
  <circle cx="36" cy="36" r="36" />
@@ -87,7 +98,7 @@
87
98
  <text x="36" y="86" text-anchor="middle" alignment-baseline="middle" font-size="10" fill="#666" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif">Komi</text>
88
99
  </a>
89
100
  </g>
90
- <g transform="translate(45, 136)">
101
+ <g transform="translate(162, 136)">
91
102
  <defs>
92
103
  <clipPath id="cp-ruiqurm">
93
104
  <circle cx="36" cy="36" r="36" />
@@ -98,7 +109,7 @@
98
109
  <text x="36" y="86" text-anchor="middle" alignment-baseline="middle" font-size="10" fill="#666" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif">Qichen</text>
99
110
  </a>
100
111
  </g>
101
- <g transform="translate(162, 136)">
112
+ <g transform="translate(279, 136)">
102
113
  <defs>
103
114
  <clipPath id="cp-sudomarcma">
104
115
  <circle cx="36" cy="36" r="36" />
@@ -109,7 +120,7 @@
109
120
  <text x="36" y="86" text-anchor="middle" alignment-baseline="middle" font-size="10" fill="#666" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif">Songyan Ma</text>
110
121
  </a>
111
122
  </g>
112
- <g transform="translate(279, 136)">
123
+ <g transform="translate(396, 136)">
113
124
  <defs>
114
125
  <clipPath id="cp-jswysnemc">
115
126
  <circle cx="36" cy="36" r="36" />
@@ -120,7 +131,18 @@
120
131
  <text x="36" y="86" text-anchor="middle" alignment-baseline="middle" font-size="10" fill="#666" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif">Tadokoro Koji</text>
121
132
  </a>
122
133
  </g>
123
- <g transform="translate(396, 136)">
134
+ <g transform="translate(513, 136)">
135
+ <defs>
136
+ <clipPath id="cp-Wangchao1469">
137
+ <circle cx="36" cy="36" r="36" />
138
+ </clipPath>
139
+ </defs>
140
+ <a xlink:href="https://github.com/Wangchao1469" href="https://github.com/Wangchao1469" class="contributor-link" target="_blank" rel="nofollow sponsored" title="Wangchao1469">
141
+ <image width="72" height="72" xlink:href="data:image/png;base64,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" href="data:image/png;base64,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" clip-path="url(#cp-Wangchao1469)" />
142
+ <text x="36" y="86" text-anchor="middle" alignment-baseline="middle" font-size="10" fill="#666" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif">Wangchao1469</text>
143
+ </a>
144
+ </g>
145
+ <g transform="translate(630, 136)">
124
146
  <defs>
125
147
  <clipPath id="cp-eleksbai">
126
148
  <circle cx="36" cy="36" r="36" />
@@ -131,7 +153,7 @@
131
153
  <text x="36" y="86" text-anchor="middle" alignment-baseline="middle" font-size="10" fill="#666" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif">eleksbai</text>
132
154
  </a>
133
155
  </g>
134
- <g transform="translate(513, 136)">
156
+ <g transform="translate(747, 136)">
135
157
  <defs>
136
158
  <clipPath id="cp-jihuer">
137
159
  <circle cx="36" cy="36" r="36" />
@@ -142,7 +164,7 @@
142
164
  <text x="36" y="86" text-anchor="middle" alignment-baseline="middle" font-size="10" fill="#666" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif">jiyu</text>
143
165
  </a>
144
166
  </g>
145
- <g transform="translate(630, 136)">
167
+ <g transform="translate(864, 136)">
146
168
  <defs>
147
169
  <clipPath id="cp-louisgreen0726">
148
170
  <circle cx="36" cy="36" r="36" />
@@ -153,7 +175,7 @@
153
175
  <text x="36" y="86" text-anchor="middle" alignment-baseline="middle" font-size="10" fill="#666" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif">louisgreen</text>
154
176
  </a>
155
177
  </g>
156
- <g transform="translate(747, 136)">
178
+ <g transform="translate(45, 250)">
157
179
  <defs>
158
180
  <clipPath id="cp-onlysyz">
159
181
  <circle cx="36" cy="36" r="36" />
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: boss-agent-cli
3
- Version: 2.0.0
3
+ Version: 3.0.0
4
4
  Summary: AI Agent 专用的 BOSS 直聘求职 CLI 工具
5
5
  Project-URL: Homepage, https://github.com/can4hou6joeng4/boss-agent-cli
6
6
  Project-URL: Repository, https://github.com/can4hou6joeng4/boss-agent-cli
@@ -31,8 +31,6 @@ Requires-Dist: prompt-toolkit>=3.0.43
31
31
  Requires-Dist: pyyaml>=6.0
32
32
  Requires-Dist: rich>=13.0
33
33
  Requires-Dist: websockets>=12.0
34
- Provides-Extra: bridge
35
- Requires-Dist: aiohttp>=3.9; extra == 'bridge'
36
34
  Provides-Extra: crawl
37
35
  Requires-Dist: drissionpage<4.2,>=4.1.1.1; extra == 'crawl'
38
36
  Requires-Dist: openpyxl>=3.1; extra == 'crawl'
@@ -55,8 +53,6 @@ Description-Content-Type: text/markdown
55
53
 
56
54
  *🤖 面向真人与 AI Agent 的招聘平台 CLI —— 纯终端向导 · 福利筛选 · 双角色工作流 · JSON 信封。*
57
55
 
58
- [![CI](https://github.com/can4hou6joeng4/boss-agent-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/can4hou6joeng4/boss-agent-cli/actions/workflows/ci.yml)
59
- [![Coverage](https://codecov.io/gh/can4hou6joeng4/boss-agent-cli/branch/master/graph/badge.svg)](https://codecov.io/gh/can4hou6joeng4/boss-agent-cli)
60
56
  [![Python](https://img.shields.io/badge/Python-≥3.10-3776AB?logo=python&logoColor=white&style=flat-square)](https://python.org)
61
57
  [![License](https://img.shields.io/badge/License-MIT-green.svg?style=flat-square)](LICENSE)
62
58
  [![GitHub Release](https://img.shields.io/github/v/release/can4hou6joeng4/boss-agent-cli?style=flat-square)](https://github.com/can4hou6joeng4/boss-agent-cli/releases)
@@ -91,7 +87,7 @@ boss-agent-cli 把职位发现、福利筛选、本地简历与 AI、投递沟
91
87
  - **AI 求职增强 + 本地模型**:JD 分析、简历润色、定向优化、候选池匹配、模拟面试、沟通指导;本地模型权重外置,支持 Ollama/vLLM OpenAI 兼容接口 —— `ai analyze-jd` `ai local configure` `ai local smoke`
92
88
  - **Schema 驱动 + JSON 信封**:stdout 只输出 `{ok, data, pagination, error, hints}` 信封,`boss schema` 是能力真源,适合 CLI 编排 / Shell Agent / MCP / Python SDK
93
89
  - **招聘者完整链路**:候选人搜索、推荐牛人、首次招呼、附件简历接收与下载、简历、聊天/最近消息、回复和职位管理 —— `hr candidates/recommendations/greet/applications/resume/chat/last-messages/reply/request-resume/accept-resume/download-resume/jobs`
94
- - **多平台抽象**:`Platform` / `RecruiterPlatform` 双注册表,`--platform zhipin|zhilian`
90
+ - **平台抽象**:`Platform` / `RecruiterPlatform` 双注册表 + `--platform` 全局选项;当前注册平台为 `zhipin`(BOSS 直聘)
95
91
 
96
92
  ## 🚀 快速开始
97
93
 
@@ -121,19 +117,18 @@ boss hr jobs list
121
117
 
122
118
  所有命令输出结构化 JSON(`ok` 判断成败,`exit 0/1`)。完整上手见 [快速上手](docs/getting-started.md)。
123
119
 
124
- ## 🎭 角色与多平台
120
+ ## 🎭 角色与平台
125
121
 
126
122
  | 平台 | 求职者 | 招聘者 | 状态 |
127
123
  |------|:--:|:--:|------|
128
124
  | BOSS 直聘 (`zhipin`) | ✅ | ✅ | 默认 |
129
- | 智联招聘 (`zhilian`) | ✅ 候选者侧只读 + 本地辅助对等 | 🟡 `agent` browser/CDP 自动化 V1 | `hr` 子命令仍仅限 BOSS;智联招聘者侧通过 `boss --platform zhilian --role recruiter agent ...` 进入 |
130
125
 
131
126
  ```bash
132
- boss --platform zhilian search "Python" # 指定平台(支持 --platform zhipin|zhilian)
133
- boss config set platform zhilian # 设为默认
127
+ boss platforms # 查看已注册平台与能力状态(当前仅 zhipin)
128
+ boss --platform zhipin search "Python" # --platform 默认即 zhipin,可省略
134
129
  ```
135
130
 
136
- `boss hr ...` 当前仅支持默认招聘者平台 `zhipin-recruiter`;智联招聘者侧自动化走 `agent` 命令和 browser/CDP adapter。设计细节见 [docs/platform-abstraction.md](docs/platform-abstraction.md)。
131
+ `boss hr ...` 与招聘者侧 `agent` 自动化当前均只支持 `zhipin-recruiter`。设计细节见 [docs/platform-abstraction.md](docs/platform-abstraction.md)。
137
132
 
138
133
  ## 🤖 Agent 集成
139
134
 
@@ -204,7 +199,15 @@ boss status --live # 可选:一次低频只读探测
204
199
  boss doctor --live-probe
205
200
  ```
206
201
 
207
- 错误信封统一携带 `code` + `recoverable` + `recovery_action`,可程序化恢复。Browser Bridge 本地诊断覆盖 `bridge_daemon` / `bridge_extension` / `bridge_protocol` / `bridge_workspace` / `bridge_exec` / `bridge_fetch` / `bridge_navigate` 七项,daemon 用 `python -m boss_agent_cli.bridge.daemon --serve` 启动。Bridge 已连接时,BOSS 的 `chat` / `chatmsg` 优先复用现有浏览器做只读请求且不读取 CLI 保存的 Cookie;Bridge 未连接时保留本地凭据的 httpx 路径。现有浏览器候选耗尽返回 `BROWSER_SESSION_NOT_FOUND` + `boss doctor`,普通未登录路径仍返回 `AUTH_REQUIRED` + `boss login`。两种兼容模式命中平台风控时都停止当前 workflow 并保存 checkpoint;适配器必须有限运行、脱敏、可停止,并只在风险状态解除后显式恢复。
202
+ 错误信封统一携带 `code` + `recoverable` + `recovery_action`,可程序化恢复。`boss doctor` 检查 CDP 可达性并汇总 `browser_channel` 状态。`chat` / `chatmsg` 在默认 `auto` 来源下使用本地凭据的 httpx;显式选择 `--browser-source existing-browser` 才会通过 CDP 复用已有目标页,且不读取 CLI 保存的 Cookie。现有浏览器候选耗尽返回 `BROWSER_SESSION_NOT_FOUND` + `boss doctor`,普通未登录路径仍返回 `AUTH_REQUIRED` + `boss login`。所有来源命中平台风控时都停止当前 workflow 并保存 checkpoint;适配器必须有限运行、脱敏、可停止,并只在风险状态解除后显式恢复。
203
+
204
+ **v3.0.0 迁移:Browser Bridge daemon、Chrome 扩展和 `[bridge]` 安装 extra 已移除。升级 CLI 不会停止旧 daemon,也不会卸载浏览器扩展。** 请手动停止旧 daemon,禁用或移除旧扩展,并从安装命令中去掉 `[bridge]`。浏览器默认降级链为 CDP → headless;若要只复用已有会话,先在本机 CDP 浏览器的官方页面手动登录,再运行:
205
+
206
+ ```bash
207
+ boss --browser-source existing-browser --cdp-url http://localhost:9222 chat
208
+ ```
209
+
210
+ 该来源不新建页面、不导航、不注入 Cookie,也不启动浏览器。CDP 调试端口仅用于本机可信环境,不要暴露到公网或用来绕过平台风控。
208
211
 
209
212
  完整检查项、CDP 启动示例与错误码见 **[诊断与排障](docs/troubleshooting.md)**;涉及 Cookie / CDP / patchright / 请求频率 / 接口漂移的问题先读 [平台风险边界](docs/platform-risk.md)。
210
213
 
@@ -224,8 +227,8 @@ boss config reset # 恢复默认
224
227
  CLI (Click)
225
228
  └─ 兼容运行元数据(assisted / research 均开放已实现能力)
226
229
  └─ AuthManager ── 用户主动登录态(Fernet + PBKDF2 机器绑定加密)
227
- └─ Platform 双注册表 ── BossPlatform / ZhilianPlatform
228
- └─ BossClient ── httpx + 节流(高斯延迟);兼容 CDP / Bridge / patchright 登录与导出
230
+ └─ Platform 双注册表 ── BossPlatform / BossRecruiterPlatform
231
+ └─ BossClient ── httpx + 节流(高斯延迟);兼容 CDP / patchright 登录与导出
229
232
  └─ CacheStore(SQLite WAL) · AIService(OpenAI-compatible / Ollama / vLLM)
230
233
  └─ output.py → JSON 信封 → stdout
231
234
  ```
@@ -233,7 +236,7 @@ CLI (Click)
233
236
  **不变量**:stdout 仅 JSON 信封 · stderr 仅日志 · `exit 0/1` · 错误含 `code/recoverable/recovery_action` · `boss schema` 为能力真源。
234
237
  **双受众提示**:`hints.next_actions` 是给 Agent 执行的后继命令,`hints.operator_actions` 是给真人操作者的自然语言指引(扫码、在浏览器里调整条件等需要离开终端完成的动作);TTY 下只渲染后者到 stderr,Agent 应把它转述给操作者。
235
238
  **命令还是 wizard**:单次、无状态的能力调用走顶层命令;需要跨步骤状态、可恢复、或中途要把指引递给真人的走 `boss wizard`(goal 取值见 `boss schema` 的 `wizard_catalog`)。
236
- **选型**:Python ≥ 3.10 · Click · httpx · patchright / CDP / Bridge(登录、导出与声明的浏览器 adapter)· cryptography(Fernet)· sqlite3(WAL)· pytest(1600+ 项)。
239
+ **选型**:Python ≥ 3.10 · Click · httpx · patchright / CDP(登录、导出与声明的浏览器 adapter)· cryptography(Fernet)· sqlite3(WAL)· pytest(1600+ 项)。
237
240
 
238
241
  ## 🔌 本地存储
239
242
 
@@ -6,8 +6,6 @@
6
6
 
7
7
  *🤖 A recruiting-platform CLI for people and AI agents — terminal wizard · welfare filtering · dual-role workflows · JSON envelopes.*
8
8
 
9
- [![CI](https://github.com/can4hou6joeng4/boss-agent-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/can4hou6joeng4/boss-agent-cli/actions/workflows/ci.yml)
10
- [![Coverage](https://codecov.io/gh/can4hou6joeng4/boss-agent-cli/branch/master/graph/badge.svg)](https://codecov.io/gh/can4hou6joeng4/boss-agent-cli)
11
9
  [![Python](https://img.shields.io/badge/Python-≥3.10-3776AB?logo=python&logoColor=white&style=flat-square)](https://python.org)
12
10
  [![License](https://img.shields.io/badge/License-MIT-green.svg?style=flat-square)](LICENSE)
13
11
  [![GitHub Release](https://img.shields.io/github/v/release/can4hou6joeng4/boss-agent-cli?style=flat-square)](https://github.com/can4hou6joeng4/boss-agent-cli/releases)
@@ -42,7 +40,7 @@ Historical `operating_mode=assisted|research` configuration remains compatible,
42
40
  - **AI job-hunting assist + local models**: JD analysis, resume polish, role-targeted optimization, keyword suggestions, resume optimization, shortlist fit reports, interview prep, chat coaching; local weights stay outside the Python package via Ollama/vLLM OpenAI-compatible endpoints — `ai analyze-jd` `ai suggest-keywords` `ai resume-optimize` `ai interview-prep` `ai chat-coach` `ai local configure` `ai local smoke`
43
41
  - **Schema-first + JSON envelope**: stdout is a JSON-only `{ok, data, pagination, error, hints}` envelope, `boss schema` is the capability source of truth, and an **MCP server with 77 tools** exposes every implemented capability
44
42
  - **Recruiter workflow**: candidate search, recommendations, first contact with built-in read-state cleanup, resumes, chats, replies, and job management — `hr candidates/recommendations/greet/applications/resume/chat/last-messages/reply/request-resume/jobs`
45
- - **Cross-platform layer**: live `Platform` / `RecruiterPlatform` registries, `--platform zhipin|zhilian`
43
+ - **Platform layer**: live `Platform` / `RecruiterPlatform` registries behind the global `--platform` option; `zhipin` (BOSS Zhipin) is the only registered platform
46
44
 
47
45
  ## 🚀 Quickstart
48
46
 
@@ -77,14 +75,13 @@ Every command outputs structured JSON (`ok` for success, `exit 0/1`). Full walk-
77
75
  | Platform | Candidate | Recruiter | Status |
78
76
  |----------|:--:|:--:|--------|
79
77
  | BOSS Zhipin (`zhipin`) | ✅ | ✅ | default |
80
- | Zhaopin (`zhilian`) | ✅ candidate-side read-only + local-assist parity | 🟡 `agent` browser/CDP automation V1 | `hr` remains BOSS-only; Zhaopin recruiter automation uses `boss --platform zhilian --role recruiter agent ...` |
81
78
 
82
79
  ```bash
83
- boss --platform zhilian search "Python" # pick a platform (`zhipin` or `zhilian`)
84
- boss config set platform zhilian # set as default
80
+ boss platforms # list registered platforms and capability status (currently zhipin only)
81
+ boss --platform zhipin search "Python" # zhipin is the default, so --platform can be omitted
85
82
  ```
86
83
 
87
- `boss hr ...` currently supports only the default recruiter platform `zhipin-recruiter`; Zhaopin recruiter automation is exposed through `agent` and the browser/CDP adapter. Architecture notes: [docs/platform-abstraction.en.md](docs/platform-abstraction.en.md).
84
+ `boss hr ...` and recruiter-side `agent` automation currently support only `zhipin-recruiter`. Architecture notes: [docs/platform-abstraction.en.md](docs/platform-abstraction.en.md).
88
85
 
89
86
  ## 🤖 Agent Integration
90
87
 
@@ -157,7 +154,15 @@ boss status --live # optional low-frequency read-only probe
157
154
  boss doctor --live-probe
158
155
  ```
159
156
 
160
- Every error envelope carries `code` + `recoverable` + `recovery_action`, so agents can react programmatically. Browser Bridge local diagnostics cover `bridge_daemon` / `bridge_extension` / `bridge_protocol` / `bridge_workspace` / `bridge_exec` / `bridge_fetch` / `bridge_navigate`; start the daemon with `python -m boss_agent_cli.bridge.daemon --serve`. When Bridge is connected, BOSS `chat` and `chatmsg` prefer credential-free reads through the existing browser; without Bridge they keep the stored-credential httpx path. Exhausted existing-browser candidates return `BROWSER_SESSION_NOT_FOUND` plus `boss doctor`, while the ordinary unauthenticated path still returns `AUTH_REQUIRED` plus `boss login`. Every mode stops on platform risk-control blocks; declared adapters must remain bounded, checkpointed, redacted, and explicitly resumed.
157
+ Every error envelope carries `code` + `recoverable` + `recovery_action`, so agents can react programmatically. `boss doctor` checks CDP reachability and reports the `browser_channel` summary. With the default `auto` source, `chat` and `chatmsg` use httpx with stored credentials; explicitly selecting `--browser-source existing-browser` reuses an existing target-site tab through CDP without reading CLI-stored cookies. Exhausted existing-browser candidates return `BROWSER_SESSION_NOT_FOUND` plus `boss doctor`, while the ordinary unauthenticated path still returns `AUTH_REQUIRED` plus `boss login`. Every source stops on platform risk-control blocks and checkpoints the workflow; declared adapters must remain bounded, redacted, stoppable, and explicitly resumed only after the risk condition is resolved.
158
+
159
+ **v3.0.0 migration: the Browser Bridge daemon, Chrome extension, and `[bridge]` installation extra have been removed. Upgrading the CLI does not stop an old daemon or uninstall the browser extension.** Manually stop the old daemon, disable or remove the old extension, and drop `[bridge]` from installation commands. The default browser fallback chain is CDP → headless. To reuse an existing session only, first log in manually on the official site in a local CDP browser, then run:
160
+
161
+ ```bash
162
+ boss --browser-source existing-browser --cdp-url http://localhost:9222 chat
163
+ ```
164
+
165
+ This source does not create pages, navigate, inject cookies, or launch a browser. Keep the CDP debugging port within a trusted local environment; never expose it publicly or use it to bypass platform risk controls.
161
166
 
162
167
  Full checks, CDP launch examples, and error codes: **[Troubleshooting](docs/troubleshooting.en.md)**. For Cookie / CDP / patchright / request-rate / drift issues, read [Platform Risk Boundaries](docs/platform-risk.en.md) first.
163
168
 
@@ -178,8 +183,8 @@ CLI (Click)
178
183
  └─ Wizard / WorkflowRunner (TTY + headless JSON + persisted run state)
179
184
  └─ Capability metadata (assisted / research compatibility; no mode gate)
180
185
  └─ AuthManager ── user-triggered login state (Fernet + PBKDF2 machine-bound encryption)
181
- └─ Platform registries ── zhipin / zhilian
182
- └─ BossClient ── httpx + throttle; CDP / Bridge / patchright compatible for login & export
186
+ └─ Platform registries ── zhipin / zhipin-recruiter
187
+ └─ BossClient ── httpx + throttle; CDP / patchright compatible for login & export
183
188
  └─ CacheStore (SQLite WAL) · AIService (OpenAI-compatible / Ollama / vLLM)
184
189
  └─ output.py → JSON envelope → stdout
185
190
  ```
@@ -187,7 +192,7 @@ CLI (Click)
187
192
  **Invariants**: stdout is JSON-only · stderr holds logs · `exit 0/1` · errors carry `code/recoverable/recovery_action` · `boss schema` is the authoritative capability source.
188
193
  **Two audiences, one envelope**: `hints.next_actions` holds follow-up commands for the Agent to run; `hints.operator_actions` holds natural-language guidance for the human operator (scan a QR code, adjust filters in the browser — anything done away from the terminal). TTY renders only the latter, to stderr; an Agent should relay it to the operator.
189
194
  **Command or wizard**: single-shot, stateless capability calls go through top-level commands; anything needing cross-step state, resumability, or handing guidance to a human goes through `boss wizard` (goals listed under `wizard_catalog` in `boss schema`).
190
- **Stack**: Python ≥ 3.10 · Click · httpx · patchright / CDP / Bridge (login, export, and declared browser adapters) · cryptography · sqlite3 (WAL) · pytest (1600+).
195
+ **Stack**: Python ≥ 3.10 · Click · httpx · patchright / CDP (login, export, and declared browser adapters) · cryptography · sqlite3 (WAL) · pytest (1600+).
191
196
 
192
197
  ## 🔌 Local Storage
193
198