boss-agent-cli 2.0.1__tar.gz → 3.0.1__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 (472) hide show
  1. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/.codecov.yml +0 -2
  2. boss_agent_cli-3.0.1/.coderabbit.yaml +64 -0
  3. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -2
  4. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -1
  5. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/.github/PULL_REQUEST_TEMPLATE.md +2 -2
  6. boss_agent_cli-3.0.1/.github/dependabot.yml +31 -0
  7. boss_agent_cli-3.0.1/.github/labeler.yml +25 -0
  8. boss_agent_cli-3.0.1/.github/workflows/ci.yml +91 -0
  9. boss_agent_cli-3.0.1/.github/workflows/dependabot-auto-merge.yml +29 -0
  10. boss_agent_cli-3.0.1/.github/workflows/labeler.yml +25 -0
  11. boss_agent_cli-3.0.1/.github/workflows/stale.yml +38 -0
  12. boss_agent_cli-3.0.1/.github/workflows/star-history.yml +65 -0
  13. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/.github/workflows/update-contributors.yml +5 -3
  14. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/.pre-commit-config.yaml +2 -0
  15. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/CHANGELOG.md +74 -0
  16. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/CONTRIBUTING.en.md +4 -4
  17. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/CONTRIBUTING.md +4 -4
  18. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/CONTRIBUTORS.svg +30 -8
  19. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/PKG-INFO +28 -20
  20. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/README.en.md +23 -16
  21. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/README.md +24 -17
  22. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/ROADMAP.en.md +2 -7
  23. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/ROADMAP.md +2 -7
  24. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/demo/index.html +49 -41
  25. boss_agent_cli-3.0.1/demo/keynote-animation/.gitignore +7 -0
  26. boss_agent_cli-3.0.1/demo/keynote-animation/README.en.md +63 -0
  27. boss_agent_cli-3.0.1/demo/keynote-animation/README.md +63 -0
  28. boss_agent_cli-3.0.1/demo/keynote-animation/assets/Inter-var.woff +0 -0
  29. boss_agent_cli-3.0.1/demo/keynote-animation/assets/LICENSES.md +15 -0
  30. boss_agent_cli-3.0.1/demo/keynote-animation/assets/NotoSansSC-500.woff +0 -0
  31. boss_agent_cli-3.0.1/demo/keynote-animation/assets/NotoSansSC-800.woff +0 -0
  32. boss_agent_cli-3.0.1/demo/keynote-animation/assets/OFL.txt +94 -0
  33. boss_agent_cli-3.0.1/demo/keynote-animation/directions.html +14 -0
  34. boss_agent_cli-3.0.1/demo/keynote-animation/eras.js +6 -0
  35. boss_agent_cli-3.0.1/demo/keynote-animation/export_showcase.py +56 -0
  36. boss_agent_cli-3.0.1/demo/keynote-animation/index.html +17 -0
  37. boss_agent_cli-3.0.1/demo/keynote-animation/output/soundtrack.m4a +0 -0
  38. boss_agent_cli-3.0.1/demo/keynote-animation/player.js +38 -0
  39. boss_agent_cli-3.0.1/demo/keynote-animation/render.py +194 -0
  40. boss_agent_cli-3.0.1/demo/keynote-animation/render_directions.py +48 -0
  41. boss_agent_cli-3.0.1/demo/keynote-animation/scenes.js +138 -0
  42. boss_agent_cli-3.0.1/demo/keynote-animation/score.py +133 -0
  43. boss_agent_cli-3.0.1/demo/keynote-animation/storyboard.json +22 -0
  44. boss_agent_cli-3.0.1/demo/keynote-animation/verify.py +153 -0
  45. boss_agent_cli-3.0.1/demo/keynote-animation/visuals.js +89 -0
  46. boss_agent_cli-3.0.1/demo/llms.txt +36 -0
  47. boss_agent_cli-3.0.1/demo/promo-showcase/README.en.md +32 -0
  48. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/demo/promo-showcase/README.md +7 -3
  49. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/demo/promo-showcase/scenes.jsx +0 -1
  50. boss_agent_cli-3.0.1/demo/showcase/boss-agent-cli-showcase-thumb.jpg +0 -0
  51. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/agent-quickstart.en.md +13 -6
  52. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/agent-quickstart.md +13 -6
  53. boss_agent_cli-3.0.1/docs/assets/logo.png +0 -0
  54. boss_agent_cli-3.0.1/docs/assets/star-history-dark.svg +44 -0
  55. boss_agent_cli-3.0.1/docs/assets/star-history.svg +44 -0
  56. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/capability-matrix.en.md +4 -4
  57. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/capability-matrix.md +4 -4
  58. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/commands.en.md +88 -5
  59. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/commands.md +88 -5
  60. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/getting-started.en.md +1 -1
  61. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/getting-started.md +1 -1
  62. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/integrations/docker.md +6 -5
  63. boss_agent_cli-3.0.1/docs/maintainer/branch-protection.md +68 -0
  64. boss_agent_cli-3.0.1/docs/maintainer/release-checklist.md +83 -0
  65. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/marketing/en-launch-story.md +1 -1
  66. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/marketing/zh-launch-story.md +1 -1
  67. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/platform-abstraction.en.md +4 -6
  68. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/platform-abstraction.md +4 -6
  69. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/platform-risk.en.md +5 -3
  70. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/platform-risk.md +5 -3
  71. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/research/platforms/README.md +2 -4
  72. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/research/platforms/lagou.md +7 -8
  73. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/research/platforms/liepin.md +8 -9
  74. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/research/platforms/zhipin.md +3 -4
  75. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/smoke-testing.md +1 -10
  76. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/troubleshooting.en.md +68 -22
  77. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/troubleshooting.md +63 -22
  78. boss_agent_cli-3.0.1/llms.txt +35 -0
  79. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/pyproject.toml +33 -23
  80. boss_agent_cli-3.0.1/scripts/README.md +61 -0
  81. boss_agent_cli-3.0.1/scripts/_release_probe.py +152 -0
  82. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/scripts/package_portable.py +2 -12
  83. boss_agent_cli-3.0.1/scripts/probe_recruiter_chat_frontend.ps1 +24 -0
  84. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/scripts/probe_recruiter_chat_frontend.py +11 -1
  85. boss_agent_cli-3.0.1/scripts/verify_release.py +317 -0
  86. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/__init__.py +1 -4
  87. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/ai/local_models.py +0 -22
  88. boss_agent_cli-3.0.1/src/boss_agent_cli/api/_base_client.py +496 -0
  89. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/boss.yaml +48 -0
  90. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/browser_client.py +433 -131
  91. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/browser_source.py +14 -50
  92. boss_agent_cli-3.0.1/src/boss_agent_cli/api/browser_urls.py +20 -0
  93. boss_agent_cli-3.0.1/src/boss_agent_cli/api/cdp_risk_lock.py +176 -0
  94. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/client.py +76 -45
  95. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/endpoints.py +2 -0
  96. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/endpoints_loader.py +22 -12
  97. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/httpx_helpers.py +2 -9
  98. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/models.py +24 -1
  99. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/recruiter.yaml +64 -0
  100. boss_agent_cli-3.0.1/src/boss_agent_cli/api/recruiter_client.py +1685 -0
  101. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/recruiter_endpoints.py +2 -0
  102. boss_agent_cli-3.0.1/src/boss_agent_cli/api/recruiter_resume.py +274 -0
  103. boss_agent_cli-3.0.1/src/boss_agent_cli/api/request_budget.py +418 -0
  104. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/throttle.py +18 -14
  105. boss_agent_cli-3.0.1/src/boss_agent_cli/api/zhipin_errors.py +141 -0
  106. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/auth/browser.py +240 -237
  107. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/auth/cookie_extract.py +8 -7
  108. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/auth/health.py +3 -21
  109. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/auth/manager.py +131 -47
  110. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/auth/qr_login.py +36 -7
  111. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/adapters.py +0 -11
  112. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/boss_adapter.py +42 -9
  113. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/config.py +1 -1
  114. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/events.py +0 -11
  115. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/execution.py +23 -7
  116. boss_agent_cli-3.0.1/src/boss_agent_cli/automation/runner.py +125 -0
  117. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/safety.py +35 -3
  118. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/storage.py +93 -7
  119. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/cache/store.py +68 -14
  120. boss_agent_cli-2.0.1/src/boss_agent_cli/commands/contact_lookup.py → boss_agent_cli-3.0.1/src/boss_agent_cli/commands/_contact_lookup.py +3 -63
  121. boss_agent_cli-2.0.1/src/boss_agent_cli/commands/doctor_checks.py → boss_agent_cli-3.0.1/src/boss_agent_cli/commands/_doctor_checks.py +39 -74
  122. boss_agent_cli-2.0.1/src/boss_agent_cli/commands/login.py → boss_agent_cli-3.0.1/src/boss_agent_cli/commands/_login_errors.py +3 -65
  123. boss_agent_cli-3.0.1/src/boss_agent_cli/commands/_platform.py +50 -0
  124. boss_agent_cli-3.0.1/src/boss_agent_cli/commands/_recruiter_platform.py +25 -0
  125. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/agent.py +23 -10
  126. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/apply.py +6 -7
  127. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/chat.py +3 -3
  128. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/chat_summary.py +1 -1
  129. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/chatmsg.py +1 -1
  130. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/clean.py +36 -3
  131. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/config_cmd.py +27 -13
  132. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/crawl.py +19 -5
  133. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/detail.py +8 -29
  134. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/digest.py +1 -1
  135. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/doctor.py +73 -65
  136. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/exchange.py +1 -1
  137. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/export.py +12 -156
  138. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/favorites.py +4 -2
  139. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/greet.py +2 -1
  140. boss_agent_cli-3.0.1/src/boss_agent_cli/commands/login.py +77 -0
  141. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/mark.py +1 -1
  142. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/pipeline.py +1 -1
  143. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/platforms.py +0 -13
  144. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/preset.py +11 -1
  145. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recommend.py +12 -4
  146. boss_agent_cli-3.0.1/src/boss_agent_cli/commands/recruiter/chat.py +542 -0
  147. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recruiter/resume.py +6 -2
  148. boss_agent_cli-3.0.1/src/boss_agent_cli/commands/schema.py +48 -0
  149. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/search.py +70 -10
  150. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/shortlist.py +5 -0
  151. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/show.py +4 -3
  152. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/status.py +6 -44
  153. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/watch.py +22 -2
  154. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/wizard.py +4 -1
  155. boss_agent_cli-3.0.1/src/boss_agent_cli/config.py +91 -0
  156. boss_agent_cli-3.0.1/src/boss_agent_cli/crawler/controls.py +21 -0
  157. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/crawler/service.py +249 -82
  158. boss_agent_cli-3.0.1/src/boss_agent_cli/crawler/transport.py +543 -0
  159. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/display.py +114 -32
  160. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/index_cache.py +1 -0
  161. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/main.py +67 -9
  162. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/mcp_args.py +6 -2
  163. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/mcp_server.py +149 -17
  164. boss_agent_cli-3.0.1/src/boss_agent_cli/mcp_tools.py +87 -0
  165. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/output.py +63 -7
  166. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/pipeline_state.py +1 -1
  167. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/platforms/__init__.py +0 -3
  168. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/platforms/base.py +10 -4
  169. boss_agent_cli-3.0.1/src/boss_agent_cli/platforms/factory.py +84 -0
  170. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/platforms/recruiter_base.py +6 -2
  171. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/platforms/zhipin.py +21 -4
  172. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/platforms/zhipin_recruiter.py +47 -11
  173. boss_agent_cli-3.0.1/src/boss_agent_cli/schema/__init__.py +4 -0
  174. boss_agent_cli-3.0.1/src/boss_agent_cli/schema/availability.py +131 -0
  175. boss_agent_cli-2.0.1/src/boss_agent_cli/commands/schema.py → boss_agent_cli-3.0.1/src/boss_agent_cli/schema/data.py +125 -573
  176. boss_agent_cli-3.0.1/src/boss_agent_cli/schema/error_codes.py +287 -0
  177. boss_agent_cli-3.0.1/src/boss_agent_cli/schema/formats.py +162 -0
  178. boss_agent_cli-3.0.1/src/boss_agent_cli/schema/tool_catalog.py +1015 -0
  179. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/search_filters.py +497 -73
  180. boss_agent_cli-3.0.1/src/boss_agent_cli/services/__init__.py +1 -0
  181. boss_agent_cli-3.0.1/src/boss_agent_cli/services/browser_runtime.py +60 -0
  182. {boss_agent_cli-2.0.1/src/boss_agent_cli/commands → boss_agent_cli-3.0.1/src/boss_agent_cli/services}/chat_export.py +1 -1
  183. {boss_agent_cli-2.0.1/src/boss_agent_cli/commands → boss_agent_cli-3.0.1/src/boss_agent_cli/services}/chat_snapshot.py +1 -1
  184. boss_agent_cli-3.0.1/src/boss_agent_cli/services/contact_lookup.py +65 -0
  185. boss_agent_cli-3.0.1/src/boss_agent_cli/services/job_card.py +33 -0
  186. boss_agent_cli-3.0.1/src/boss_agent_cli/services/job_export.py +153 -0
  187. boss_agent_cli-3.0.1/src/boss_agent_cli/services/job_identity.py +24 -0
  188. {boss_agent_cli-2.0.1/src/boss_agent_cli/commands/recruiter → boss_agent_cli-3.0.1/src/boss_agent_cli/services}/resume_parser.py +3 -3
  189. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/wizard/actions.py +45 -11
  190. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/wizard/catalog.py +11 -3
  191. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/wizard/preflight.py +9 -9
  192. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/wizard/prompts.py +5 -1
  193. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/wizard/renderer.py +4 -35
  194. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/wizard/runner.py +51 -6
  195. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/wizard/store.py +3 -1
  196. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_agent_automation.py +20 -33
  197. boss_agent_cli-3.0.1/tests/test_agent_automation_cross_validation.py +100 -0
  198. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_agent_crawl.py +3 -1
  199. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_agent_docs.py +13 -8
  200. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_ai_local.py +0 -33
  201. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_api.py +23 -26
  202. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_api_client_methods.py +32 -15
  203. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_api_client_retry.py +41 -54
  204. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_api_httpx_helpers.py +11 -5
  205. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_apply.py +0 -51
  206. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_auth_and_login_extended.py +0 -46
  207. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_auth_browser.py +15 -229
  208. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_auth_manager_extended.py +6 -74
  209. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_auth_manager_flow.py +0 -90
  210. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_browser_client.py +69 -16
  211. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_browser_source.py +61 -35
  212. boss_agent_cli-3.0.1/tests/test_cdp_request_safety.py +497 -0
  213. boss_agent_cli-3.0.1/tests/test_cdp_risk_lock_coverage.py +313 -0
  214. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_chat_export_extended.py +2 -2
  215. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_chat_snapshot_extended.py +1 -1
  216. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_commands.py +20 -114
  217. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_config_cmd.py +34 -0
  218. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_contact_lookup.py +1 -1
  219. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_cookie_extract_regression.py +41 -11
  220. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_crawl.py +65 -24
  221. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_curl_auth_import.py +2 -2
  222. boss_agent_cli-3.0.1/tests/test_dependency_constraints.py +60 -0
  223. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_display.py +13 -13
  224. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_doctor_extended.py +181 -133
  225. boss_agent_cli-3.0.1/tests/test_exit_codes.py +95 -0
  226. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_export_extended.py +3 -3
  227. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_favorites.py +1 -1
  228. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_greet_detail_extended.py +1 -1
  229. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_mcp_handler_registration.py +41 -5
  230. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_mcp_server.py +9 -7
  231. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_new_commands.py +14 -211
  232. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_open_source_docs.py +79 -104
  233. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_output.py +82 -0
  234. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_platform_base.py +19 -2
  235. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_platform_cli.py +41 -27
  236. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_platform_not_supported.py +21 -3
  237. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_platforms_cmd.py +13 -16
  238. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_portable_package.py +3 -1
  239. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_public_api.py +6 -1
  240. boss_agent_cli-3.0.1/tests/test_recruiter_chat_summary.py +279 -0
  241. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_recruiter_client_retry.py +49 -37
  242. boss_agent_cli-3.0.1/tests/test_recruiter_exchange_availability.py +251 -0
  243. boss_agent_cli-3.0.1/tests/test_recruiter_exchange_confirm.py +424 -0
  244. boss_agent_cli-3.0.1/tests/test_recruiter_last_msg_batching.py +154 -0
  245. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_recruiter_recommendations_and_read.py +1 -1
  246. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_recruiter_resume_attachments.py +9 -2
  247. boss_agent_cli-3.0.1/tests/test_release_verification.py +320 -0
  248. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_schema_contract.py +18 -6
  249. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_schema_formats.py +46 -22
  250. boss_agent_cli-3.0.1/tests/test_schema_mcp_tools.py +99 -0
  251. boss_agent_cli-3.0.1/tests/test_search_active_filter.py +322 -0
  252. boss_agent_cli-3.0.1/tests/test_search_active_request_volume.py +419 -0
  253. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_search_filters.py +1 -1
  254. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_search_pipeline.py +159 -1
  255. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_shortlist.py +2 -30
  256. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_smoke_p0.py +10 -10
  257. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_stats.py +1 -1
  258. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_throttle.py +3 -3
  259. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_welfare_filter.py +4 -3
  260. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_wizard.py +59 -6
  261. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/uv.lock +380 -966
  262. boss_agent_cli-2.0.1/.github/dependabot.yml +0 -21
  263. boss_agent_cli-2.0.1/.github/workflows/ci.yml +0 -264
  264. boss_agent_cli-2.0.1/.github/workflows/docs.yml +0 -57
  265. boss_agent_cli-2.0.1/demo/llms.txt +0 -28
  266. boss_agent_cli-2.0.1/demo/showcase/boss-agent-cli-showcase-thumb.jpg +0 -0
  267. boss_agent_cli-2.0.1/docs/assets/star-history-dark.svg +0 -47
  268. boss_agent_cli-2.0.1/docs/assets/star-history.svg +0 -47
  269. boss_agent_cli-2.0.1/docs/maintainer/branch-protection.md +0 -74
  270. boss_agent_cli-2.0.1/docs/maintainer/release-checklist.md +0 -65
  271. boss_agent_cli-2.0.1/docs/research/bridge-grpc.md +0 -134
  272. boss_agent_cli-2.0.1/docs/research/platforms/zhaopin-recruiter-evaluation.md +0 -165
  273. boss_agent_cli-2.0.1/docs/research/platforms/zhaopin.md +0 -217
  274. boss_agent_cli-2.0.1/extension/background.js +0 -280
  275. boss_agent_cli-2.0.1/extension/manifest.json +0 -25
  276. boss_agent_cli-2.0.1/scripts/README.md +0 -30
  277. boss_agent_cli-2.0.1/src/boss_agent_cli/api/_base_client.py +0 -225
  278. boss_agent_cli-2.0.1/src/boss_agent_cli/api/recruiter_client.py +0 -808
  279. boss_agent_cli-2.0.1/src/boss_agent_cli/api/recruiter_resume.py +0 -113
  280. boss_agent_cli-2.0.1/src/boss_agent_cli/api/zhilian.yaml +0 -81
  281. boss_agent_cli-2.0.1/src/boss_agent_cli/api/zhilian_client.py +0 -303
  282. boss_agent_cli-2.0.1/src/boss_agent_cli/api/zhipin_errors.py +0 -48
  283. boss_agent_cli-2.0.1/src/boss_agent_cli/automation/runner.py +0 -120
  284. boss_agent_cli-2.0.1/src/boss_agent_cli/automation/zhilian_adapter.py +0 -218
  285. boss_agent_cli-2.0.1/src/boss_agent_cli/automation/zhilian_browser.py +0 -327
  286. boss_agent_cli-2.0.1/src/boss_agent_cli/automation/zhilian_browser_actions.py +0 -32
  287. boss_agent_cli-2.0.1/src/boss_agent_cli/automation/zhilian_cdp.py +0 -66
  288. boss_agent_cli-2.0.1/src/boss_agent_cli/automation/zhilian_selectors.py +0 -104
  289. boss_agent_cli-2.0.1/src/boss_agent_cli/bridge/client.py +0 -372
  290. boss_agent_cli-2.0.1/src/boss_agent_cli/bridge/daemon.py +0 -270
  291. boss_agent_cli-2.0.1/src/boss_agent_cli/bridge/protocol.py +0 -70
  292. boss_agent_cli-2.0.1/src/boss_agent_cli/commands/_platform.py +0 -93
  293. boss_agent_cli-2.0.1/src/boss_agent_cli/commands/_recruiter_platform.py +0 -52
  294. boss_agent_cli-2.0.1/src/boss_agent_cli/commands/recruiter/chat.py +0 -281
  295. boss_agent_cli-2.0.1/src/boss_agent_cli/config.py +0 -59
  296. boss_agent_cli-2.0.1/src/boss_agent_cli/crawler/transport.py +0 -499
  297. boss_agent_cli-2.0.1/src/boss_agent_cli/mcp_tools.py +0 -1032
  298. boss_agent_cli-2.0.1/src/boss_agent_cli/platforms/zhilian.py +0 -83
  299. boss_agent_cli-2.0.1/src/boss_agent_cli/resume/__init__.py +0 -0
  300. boss_agent_cli-2.0.1/tests/test_agent_automation_cross_validation.py +0 -247
  301. boss_agent_cli-2.0.1/tests/test_bridge.py +0 -200
  302. boss_agent_cli-2.0.1/tests/test_bridge_extended.py +0 -340
  303. boss_agent_cli-2.0.1/tests/test_doctor_zhilian.py +0 -44
  304. boss_agent_cli-2.0.1/tests/test_schema_mcp_tools.py +0 -42
  305. boss_agent_cli-2.0.1/tests/test_zhilian_browser_automation.py +0 -250
  306. boss_agent_cli-2.0.1/tests/test_zhilian_client.py +0 -348
  307. boss_agent_cli-2.0.1/tests/test_zhilian_interview_data.py +0 -27
  308. boss_agent_cli-2.0.1/tests/test_zhilian_stub.py +0 -237
  309. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/.devcontainer/devcontainer.json +0 -0
  310. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/.dockerignore +0 -0
  311. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/.gitattributes +0 -0
  312. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/.github/CODEOWNERS +0 -0
  313. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  314. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/.github/ISSUE_TEMPLATE/documentation.yml +0 -0
  315. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/.github/social-preview.png +0 -0
  316. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/.github/workflows/pages.yml +0 -0
  317. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/.github/workflows/release.yml +0 -0
  318. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/.github/workflows/triage-cleanup.yml +0 -0
  319. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/.gitignore +0 -0
  320. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/CODE_OF_CONDUCT.md +0 -0
  321. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/Dockerfile +0 -0
  322. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/LICENSE +0 -0
  323. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/SECURITY.md +0 -0
  324. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/demo/demo-en.tape +0 -0
  325. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/demo/demo-zh.tape +0 -0
  326. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/demo/demo_showcase.py +0 -0
  327. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/demo/demo_showcase_en.py +0 -0
  328. {boss_agent_cli-2.0.1/docs → boss_agent_cli-3.0.1/demo/keynote-animation}/assets/logo.png +0 -0
  329. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/demo/promo-showcase/animations.jsx +0 -0
  330. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/demo/promo-showcase/app.jsx +0 -0
  331. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/demo/promo-showcase/boss-agent-cli-promo.html +0 -0
  332. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/demo/promo-showcase/lib.jsx +0 -0
  333. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docker-compose.yml +0 -0
  334. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/adr/0001-default-low-risk-assistance-mode.md +0 -0
  335. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/adr/0002-explicit-research-operating-mode.md +0 -0
  336. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/agent-hosts.en.md +0 -0
  337. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/agent-hosts.md +0 -0
  338. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/integrations/ai-models.en.md +0 -0
  339. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/integrations/ai-models.md +0 -0
  340. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/integrations/claude-code.md +0 -0
  341. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/integrations/codex.md +0 -0
  342. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/integrations/cursor.md +0 -0
  343. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/integrations/python-sdk.md +0 -0
  344. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/integrations/shell-agent.md +0 -0
  345. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/integrations/windsurf.md +0 -0
  346. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/maintainer/labels.md +0 -0
  347. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/marketing/awesome-submissions.md +0 -0
  348. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/marketing/promotion-article.md +0 -0
  349. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/docs/readme-badge-policy.md +0 -0
  350. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/evals/README.md +0 -0
  351. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/evals/results/20260624T103356Z-fixture.json +0 -0
  352. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/evals/results/README.md +0 -0
  353. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/evals/results/necessary-conditions-2026-06-24.json +0 -0
  354. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/evals/run_eval.py +0 -0
  355. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/evals/scenarios.json +0 -0
  356. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/examples/opencode/opencode.json +0 -0
  357. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/glama.json +0 -0
  358. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/mcp-server/README.en.md +0 -0
  359. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/mcp-server/README.md +0 -0
  360. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/mcp-server/server.py +0 -0
  361. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/scripts/quality_baseline.py +0 -0
  362. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/scripts/smoke_p0.py +0 -0
  363. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/scripts/update_contributors.py +0 -0
  364. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/ai/__init__.py +0 -0
  365. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/ai/config.py +0 -0
  366. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/ai/prompts.py +0 -0
  367. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/ai/service.py +0 -0
  368. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/__init__.py +0 -0
  369. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/auth/__init__.py +0 -0
  370. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/auth/curl_import.py +0 -0
  371. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/auth/token_store.py +0 -0
  372. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/__init__.py +0 -0
  373. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/decision.py +0 -0
  374. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/mock_adapter.py +0 -0
  375. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/models.py +0 -0
  376. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/reply_ai.py +0 -0
  377. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/scoring.py +0 -0
  378. {boss_agent_cli-2.0.1/src/boss_agent_cli/bridge → boss_agent_cli-3.0.1/src/boss_agent_cli/cache}/__init__.py +0 -0
  379. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/chat_summary.py +0 -0
  380. {boss_agent_cli-2.0.1/src/boss_agent_cli/cache → boss_agent_cli-3.0.1/src/boss_agent_cli/commands}/__init__.py +0 -0
  381. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/ai_cmd.py +0 -0
  382. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/ai_local.py +0 -0
  383. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/cities.py +0 -0
  384. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/history.py +0 -0
  385. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/interviews.py +0 -0
  386. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/logout.py +0 -0
  387. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/me.py +0 -0
  388. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recruiter/__init__.py +0 -0
  389. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recruiter/accept_resume.py +0 -0
  390. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recruiter/applications.py +0 -0
  391. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recruiter/candidates.py +0 -0
  392. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recruiter/download_resume.py +0 -0
  393. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recruiter/jobs.py +0 -0
  394. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recruiter/recommendations.py +0 -0
  395. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recruiter/reply.py +0 -0
  396. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recruiter/request_resume.py +0 -0
  397. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/register.py +0 -0
  398. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/resume_cmd.py +0 -0
  399. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/stats.py +0 -0
  400. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/compliance.py +0 -0
  401. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/crawler/__init__.py +0 -0
  402. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/crawler/exporter.py +0 -0
  403. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/crawler/hooks.py +0 -0
  404. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/crawler/operations.py +0 -0
  405. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/digest.py +0 -0
  406. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/hooks.py +0 -0
  407. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/match_score.py +0 -0
  408. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/py.typed +0 -0
  409. {boss_agent_cli-2.0.1/src/boss_agent_cli/commands → boss_agent_cli-3.0.1/src/boss_agent_cli/resume}/__init__.py +0 -0
  410. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/resume/export.py +0 -0
  411. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/resume/models.py +0 -0
  412. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/resume/store.py +0 -0
  413. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/resume/templates.py +0 -0
  414. {boss_agent_cli-2.0.1/src/boss_agent_cli/commands → boss_agent_cli-3.0.1/src/boss_agent_cli/services}/chat_utils.py +0 -0
  415. {boss_agent_cli-2.0.1/src/boss_agent_cli/commands → boss_agent_cli-3.0.1/src/boss_agent_cli/services}/friend_list_pages.py +0 -0
  416. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/wizard/__init__.py +0 -0
  417. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/wizard/live_crawl.py +0 -0
  418. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/src/boss_agent_cli/wizard/models.py +0 -0
  419. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/conftest.py +0 -0
  420. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/fixtures/favorites_card.json +0 -0
  421. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_agent_error_contract.py +0 -0
  422. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_agent_host_examples.py +0 -0
  423. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_ai_commands.py +0 -0
  424. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_ai_config.py +0 -0
  425. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_ai_config_cmd.py +0 -0
  426. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_ai_cover_letter.py +0 -0
  427. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_ai_fit.py +0 -0
  428. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_ai_prompts.py +0 -0
  429. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_ai_resume_optimize.py +0 -0
  430. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_ai_service.py +0 -0
  431. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_ai_suggest_keywords.py +0 -0
  432. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_auth.py +0 -0
  433. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_cache.py +0 -0
  434. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_cache_extended.py +0 -0
  435. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_chat_summary.py +0 -0
  436. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_chat_summary_command.py +0 -0
  437. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_chatmsg_extended.py +0 -0
  438. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_chatmsg_uid_flow.py +0 -0
  439. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_clean_cmd.py +0 -0
  440. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_cli_invariants.py +0 -0
  441. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_compliance.py +0 -0
  442. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_coverage_second_sprint.py +0 -0
  443. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_crawl_cli.py +0 -0
  444. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_digest.py +0 -0
  445. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_digest_command.py +0 -0
  446. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_endpoints_loader.py +0 -0
  447. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_eval_harness.py +0 -0
  448. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_greet_extended.py +0 -0
  449. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_hooks.py +0 -0
  450. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_index_cache.py +0 -0
  451. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_job_card_browser.py +0 -0
  452. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_job_item_lid.py +0 -0
  453. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_match_score.py +0 -0
  454. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_mcp_server_protocol.py +0 -0
  455. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_pipeline_commands.py +0 -0
  456. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_pipeline_state.py +0 -0
  457. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_preset.py +0 -0
  458. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_probe_script.py +0 -0
  459. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_qr_login.py +0 -0
  460. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_quality_baseline.py +0 -0
  461. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_recruiter_safety_regressions.py +0 -0
  462. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_resume_commands.py +0 -0
  463. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_resume_export.py +0 -0
  464. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_resume_import_compat.py +0 -0
  465. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_resume_init_hints.py +0 -0
  466. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_resume_models.py +0 -0
  467. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_resume_store.py +0 -0
  468. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_resume_templates.py +0 -0
  469. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_system_proxy.py +0 -0
  470. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_watch.py +0 -0
  471. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/tests/test_watch_run_all.py +0 -0
  472. {boss_agent_cli-2.0.1 → boss_agent_cli-3.0.1}/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"
@@ -0,0 +1,64 @@
1
+ # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
2
+ # CodeRabbit 配置:安静模式,只做中文审查与概要,不发诗、不发装饰性内容。
3
+ language: zh-CN
4
+ early_access: false
5
+ reviews:
6
+ profile: chill
7
+ request_changes_workflow: false
8
+ high_level_summary: true
9
+ review_status: false
10
+ review_details: false
11
+ poem: false
12
+ in_progress_fortune: false
13
+ sequence_diagrams: false
14
+ estimate_code_review_effort: false
15
+ related_prs: false
16
+ suggested_labels: false
17
+ suggested_reviewers: false
18
+ collapse_walkthrough: true
19
+ auto_review:
20
+ enabled: true
21
+ drafts: false
22
+ ignore_title_keywords:
23
+ - "WIP"
24
+ - "[skip review]"
25
+ path_filters:
26
+ - "!docs/assets/star-history*.svg"
27
+ - "!CONTRIBUTORS.svg"
28
+ - "!demo/**/*.tape"
29
+ - "!**/package-lock.json"
30
+ - "!**/*.lock"
31
+ - "!**/go.sum"
32
+ - "!**/*.min.js"
33
+ - "!**/*.png"
34
+ - "!**/*.jpg"
35
+ - "!**/*.jpeg"
36
+ - "!**/*.gif"
37
+ - "!**/*.webp"
38
+ - "!**/*.ico"
39
+ - "!**/*.mp4"
40
+ - "!**/*.m4a"
41
+ - "!**/*.woff"
42
+ - "!**/*.woff2"
43
+ - "!**/*.ttf"
44
+ path_instructions:
45
+ - path: "src/boss_agent_cli/**"
46
+ instructions: |
47
+ 这是 BOSS 直聘的 Agent CLI,平台风控很敏感,评审时重点看:
48
+ - 命令输出必须守 JSON 信封契约:stdout 只输出 JSON 信封(ok / data / error / hints),日志与进度走 stderr;出错要带 error.code、recoverable、recovery_action。
49
+ - CDP / 浏览器通道下不要改用 httpx 直连平台接口;平台请求只能串行,不能并发或批量并行。
50
+ - 遇到风控码 36/37 必须立即停止并返回可恢复错误,不能重试或绕过。
51
+ - 不得新增任何会主动向真实候选人/招聘方发消息、打招呼、交换联系方式的默认行为;这类动作必须由用户显式发起。
52
+ - 不要引入运行时遥测或远程日志。Python 源码用 tab 缩进,类型需通过 mypy。
53
+ - path: "tests/**"
54
+ instructions: |
55
+ 测试必须完全离线:mock AuthManager / BossClient / CacheStore / AIService,不访问网络、不启动真实浏览器、不使用真实账号,绝不向真实候选人发送消息。每条成功路径至少对应一条错误路径。
56
+ chat:
57
+ art: false
58
+ knowledge_base:
59
+ code_guidelines:
60
+ enabled: true
61
+ # 默认已包含 AGENTS.md / CLAUDE.md 等;这里补充仓库自己的贡献规范
62
+ filePatterns:
63
+ - "**/AGENTS.md"
64
+ - "CONTRIBUTING.md"
@@ -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,31 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "uv"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ day: "monday"
8
+ time: "09:00"
9
+ timezone: "Asia/Shanghai"
10
+ open-pull-requests-limit: 3
11
+ commit-message:
12
+ prefix: "chore"
13
+ groups:
14
+ uv-minor-patch:
15
+ update-types:
16
+ - "minor"
17
+ - "patch"
18
+ - package-ecosystem: "github-actions"
19
+ directory: "/"
20
+ schedule:
21
+ interval: "weekly"
22
+ day: "monday"
23
+ time: "09:00"
24
+ timezone: "Asia/Shanghai"
25
+ open-pull-requests-limit: 3
26
+ commit-message:
27
+ prefix: "ci"
28
+ groups:
29
+ github-actions:
30
+ patterns:
31
+ - "*"
@@ -0,0 +1,25 @@
1
+ # 按改动路径给 PR 打标签(actions/labeler)。标签需事先存在于仓库。
2
+ documentation:
3
+ - changed-files:
4
+ - any-glob-to-any-file:
5
+ - "docs/**"
6
+ - "**/*.md"
7
+ ci:
8
+ - changed-files:
9
+ - any-glob-to-any-file:
10
+ - ".github/**"
11
+ dependencies:
12
+ - changed-files:
13
+ - any-glob-to-any-file:
14
+ - "pyproject.toml"
15
+ - "uv.lock"
16
+ test:
17
+ - changed-files:
18
+ - any-glob-to-any-file:
19
+ - "tests/**"
20
+ recruiter:
21
+ - changed-files:
22
+ - any-glob-to-any-file:
23
+ - "src/boss_agent_cli/commands/recruiter/**"
24
+ - "src/boss_agent_cli/api/recruiter*"
25
+ - "src/boss_agent_cli/platforms/*recruiter*"
@@ -0,0 +1,91 @@
1
+ name: CI
2
+
3
+ # 外部贡献者的 PR 也要跑:用 pull_request(不是 pull_request_target),
4
+ # fork 的 PR 只拿到只读 token、拿不到任何 secret,本工作流也不需要 secret。
5
+ on:
6
+ pull_request:
7
+ push:
8
+ branches: [master]
9
+ workflow_dispatch:
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ concurrency:
15
+ group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
16
+ cancel-in-progress: true
17
+
18
+ env:
19
+ PYTHONUTF8: "1"
20
+ UV_LOCKED: "1"
21
+
22
+ jobs:
23
+ lint:
24
+ name: Lint & typecheck
25
+ runs-on: ubuntu-latest
26
+ timeout-minutes: 15
27
+ env:
28
+ UV_PYTHON: "3.12"
29
+ steps:
30
+ - uses: actions/checkout@v7
31
+
32
+ - name: Install uv
33
+ uses: astral-sh/setup-uv@v7
34
+ with:
35
+ enable-cache: true
36
+ cache-dependency-glob: uv.lock
37
+
38
+ - name: Install dependencies
39
+ run: |
40
+ uv python install
41
+ uv sync --all-extras
42
+
43
+ - name: Ruff
44
+ run: uv run ruff check src/boss_agent_cli tests scripts --output-format=github
45
+
46
+ - name: Mypy
47
+ run: uv run mypy src/boss_agent_cli
48
+
49
+ - name: Cache pre-commit hooks
50
+ uses: actions/cache@v6
51
+ with:
52
+ path: ~/.cache/pre-commit
53
+ key: pre-commit-${{ runner.os }}-${{ hashFiles('.pre-commit-config.yaml') }}
54
+
55
+ - name: Pre-commit
56
+ run: uv run pre-commit run --all-files --show-diff-on-failure
57
+
58
+ - name: CLI loads and schema envelope is valid
59
+ run: |
60
+ uv run boss --help > /dev/null
61
+ uv run boss --json schema --format native \
62
+ | python3 -c "import sys, json; d = json.load(sys.stdin); assert d['ok'], d; print('schema commands:', len(d['data']['commands']))"
63
+
64
+ test:
65
+ name: Test (Python ${{ matrix.python-version }})
66
+ runs-on: ubuntu-latest
67
+ timeout-minutes: 20
68
+ strategy:
69
+ fail-fast: false
70
+ matrix:
71
+ # 最低支持版本、主力版本、最新版本
72
+ python-version: ["3.10", "3.12", "3.14"]
73
+ env:
74
+ UV_PYTHON: ${{ matrix.python-version }}
75
+ steps:
76
+ - uses: actions/checkout@v7
77
+
78
+ - name: Install uv
79
+ uses: astral-sh/setup-uv@v7
80
+ with:
81
+ enable-cache: true
82
+ cache-dependency-glob: uv.lock
83
+
84
+ - name: Install dependencies
85
+ run: |
86
+ uv python install
87
+ uv sync --all-extras
88
+
89
+ # 测试全部离线:平台接口、浏览器、CDP 都是 mock,不需要网络和真实浏览器。
90
+ - name: Pytest
91
+ run: uv run pytest -q
@@ -0,0 +1,29 @@
1
+ name: Dependabot auto-merge
2
+
3
+ on: pull_request_target
4
+
5
+ permissions:
6
+ contents: write
7
+ pull-requests: write
8
+
9
+ jobs:
10
+ auto-merge:
11
+ if: github.event.pull_request.user.login == 'dependabot[bot]'
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - name: Fetch Dependabot metadata
15
+ id: meta
16
+ uses: dependabot/fetch-metadata@v2
17
+ with:
18
+ github-token: ${{ secrets.GITHUB_TOKEN }}
19
+
20
+ # Patch/minor only; major bumps and browser-automation deps stay manual.
21
+ - name: Enable auto-merge
22
+ if: >-
23
+ steps.meta.outputs.update-type != 'version-update:semver-major' &&
24
+ !contains(steps.meta.outputs.dependency-names, 'patchright') &&
25
+ !contains(steps.meta.outputs.dependency-names, 'playwright')
26
+ run: gh pr merge --auto --squash "$PR_URL"
27
+ env:
28
+ PR_URL: ${{ github.event.pull_request.html_url }}
29
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,25 @@
1
+ name: Labeler
2
+
3
+ # 用 pull_request_target 才能给 fork 来的 PR 打标签。
4
+ # 这里不 checkout、不运行 PR 里的任何代码,只读取默认分支上的 .github/labeler.yml,
5
+ # 因此不会把写权限暴露给 PR 代码。
6
+ on:
7
+ pull_request_target:
8
+ types: [opened, synchronize, reopened]
9
+
10
+ permissions: {}
11
+
12
+ concurrency:
13
+ group: labeler-${{ github.event.pull_request.number }}
14
+ cancel-in-progress: true
15
+
16
+ jobs:
17
+ label:
18
+ runs-on: ubuntu-latest
19
+ permissions:
20
+ contents: read
21
+ pull-requests: write
22
+ steps:
23
+ - uses: actions/labeler@v7
24
+ with:
25
+ sync-labels: false
@@ -0,0 +1,38 @@
1
+ name: Stale
2
+
3
+ # 保守的过期清理:60 天无动静标记 stale,再 14 天无回应才关闭。
4
+ # 有负责人、草稿 PR、带豁免标签的不处理;任何新评论或更新都会摘掉 stale。
5
+ on:
6
+ schedule:
7
+ - cron: "17 2 * * 1" # 每周一 10:17(北京时间)
8
+ workflow_dispatch:
9
+
10
+ permissions: {}
11
+
12
+ jobs:
13
+ stale:
14
+ runs-on: ubuntu-latest
15
+ permissions:
16
+ actions: write
17
+ issues: write
18
+ pull-requests: write
19
+ steps:
20
+ - uses: actions/stale@v11
21
+ with:
22
+ days-before-stale: 60
23
+ days-before-close: 14
24
+ stale-issue-label: stale
25
+ stale-pr-label: stale
26
+ exempt-issue-labels: "pinned,security,bug,in-progress,blocked,triage,needs-repro,research"
27
+ exempt-pr-labels: "pinned,security,bug,in-progress,blocked,triage,needs-repro,research"
28
+ exempt-all-assignees: true
29
+ exempt-draft-pr: true
30
+ operations-per-run: 30
31
+ stale-issue-message: >-
32
+ 这个 issue 已经 60 天没有动静,先标记为 stale;如果 14 天内仍无更新会自动关闭。还需要的话留言即可保留。
33
+ / This issue has had no activity for 60 days and is now marked stale. It will be closed in 14 days unless there is new activity — just leave a comment to keep it open.
34
+ stale-pr-message: >-
35
+ 这个 PR 已经 60 天没有动静,先标记为 stale;如果 14 天内仍无更新会自动关闭。还在推进的话推个提交或留言即可。
36
+ / This PR has had no activity for 60 days and is now marked stale. It will be closed in 14 days unless there is new activity — push a commit or comment to keep it open.
37
+ close-issue-message: "因长期无更新自动关闭,需要时可随时重新打开。/ Closed due to inactivity — feel free to reopen."
38
+ close-pr-message: "因长期无更新自动关闭,需要时可随时重新打开。/ Closed due to inactivity — feel free to reopen."
@@ -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
@@ -11,6 +11,8 @@ repos:
11
11
  hooks:
12
12
  - id: trailing-whitespace
13
13
  - id: end-of-file-fixer
14
+ # star-history 工作流自动生成,不带结尾换行
15
+ exclude: ^docs/assets/star-history(-dark)?\.svg$
14
16
  - id: check-yaml
15
17
  - id: check-added-large-files
16
18
  args: [--maxkb=500]
@@ -4,6 +4,80 @@
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ### Added
8
+ - 新增跨实例、CLI/MCP 子进程与 crawl 的本地共享请求预算:默认单个主动操作持锁至响应分类完成,滑动 60 秒最多 20 次,总等待上限 30 秒;`request_budget_dir` 可显式分组,组内采用统一限制并共享风险阻断。HTTP 429 / code 9 和有效 `Retry-After` 持久化冷却,进程退出只释放执行锁;预算超限返回 `REQUEST_BUDGET_EXHAUSTED`,保留 checkpoint 后显式恢复。主动操作计量不覆盖浏览器自主资源、轮询、自动重定向或认证内部的每条网络请求,不按公网 IP 自动合并任务。
9
+ - 招聘者 `agent run --resume` / MCP `boss_agent_run.resume` 提供显式恢复入口,保留确认结果与队列,普通运行不清除停止状态。
10
+ - 招聘者 `hr chat` 的 hints 新增 `total_unread`:聊天页显示的未读总数,读自页面 geek-list 组件的 `uncountTab$` 第 1 项(实测与页面 UI 一致,覆盖全部会话,不限于已加载的部分);同时给出原始分项计数 `unread_by_tab` 和来源 `total_unread_source`(`page.uncountTab$[1]`)。只读页面内存,不额外发请求;页面不可用(非 CDP 或没打开聊天页)时三项均为 `null`(Refs #456)。
11
+ - `boss search` 新增 `--active <档位>`,按 HR 活跃度筛选职位(#442)。档位 `online` / `today` / `3d` / `week` / `2w` / `month` / `half-year`,也认 `3day`、`3日` 等写法;平台文案按「在线/刚刚活跃 > 今日活跃 > 3日内活跃 > 本周活跃 > 2周内活跃 > 本月活跃 > 近半年活跃 > 半年前活跃」比较。列表带 `activeTimeDesc` 或 `bossOnline` 为在线时直接判断,否则查 job_card;和 `--welfare` 同用时一次详情请求同时判断两项。启用后跳过搜索缓存,无法识别的文案被排除并写进 `hints.active_filter`。职位结果新增 `boss_active_desc` 字段(`boss_active` 不变,搜索缓存 schema 升到 3),`preset add`、MCP `boss_search` / `boss_preset_add` 与向导求职流程同步支持。
12
+ - 替换仓库 README 与项目站点的展示动画为 48 秒极光发布会成片,提供 MP4、轻量动图、新封面和可交互源工程;站点播放期间保持当前画面,切换到终端演示时暂停视频。
13
+ - 新增维护者发布验证脚本:默认离线核对版本、wheel/sdist 元数据与分发文件,显式启用后可在临时环境全新解析依赖、验证 CLI/MCP,或从 PyPI 安装指定版本复验;输出结构化步骤结果,不执行发布或真实平台请求。
14
+ - 新增仓库根 `llms.txt`:面向 LLM 的单页能力入口(能力真源、信封契约、运行边界与链接),指向 `boss schema` 与关键文档;不引入会与 schema 漂移的静态工具清单。
15
+ - `boss login` 的浏览器 Cookie 提取从 6 个扩展到 10 个:新增 Vivaldi / Arc / LibreWolf / Safari,自动检测优先级不变、新浏览器作为后备;macOS Safari 需要完全磁盘访问,读取失败时静默尝试下一个浏览器。
16
+ - 新增 `docs/research/opencli-benchmark-2026-10-15.md`(含英文对照):对标 OpenCLI / boss-cli / opencli-mcp / xhs-cli 的差距矩阵、已确认缺陷(文档漂移)与分批改进方案;分层规则复核更正见方案 §3.3。
17
+ - 新增全局 `--exit-codes {envelope,sysexits}`(默认 envelope,0/1 契约不变):sysexits 模式按错误类别返回语义化退出码(77 认证;75 限流/预算/超时;78 参数/配置;69 风控/平台不支持;其余 1),usage error 通过解析前预扫描同一选项;stdout 信封不受影响。
18
+
19
+ ### Changed
20
+ - MCP、OpenAI 和 Anthropic 工具格式统一使用不依赖 MCP SDK 的共享目录,工具导出由旧的不完整命令映射改为与运行时一致的 77 个工具;原生 schema 保留 39 个顶层命令。保留工具参数结构的脱敏例外仅限 schema 明确声明的内置参数路径,真实业务数据和敏感默认值/示例仍脱敏。
21
+ - 恢复面向 PR 的 `CI` 工作流(参照 Wholiver/metis 的 Test 工作流):`pull_request` 与推送 `master` 时运行 ruff、mypy、pre-commit、CLI/schema 冒烟和 Python 3.10 / 3.12 / 3.14 测试矩阵;只读权限、同一 PR 新推送取消旧运行、不使用任何 secret,外部贡献者的 fork PR 可直接运行。pre-commit 的 end-of-file-fixer 排除 star-history 自动生成的 SVG,并补上 `wizard/renderer.py` 结尾换行,使 `pre-commit run --all-files` 在 master 上可以通过;贡献指南同步更新 CI 说明,去掉已失效的 Codecov 描述。
22
+ - 同步项目站点中英文正文与 `llms.txt` 的 v3.0.0 版本、命令与 MCP 数量、双角色工作流及平台风险停止/显式恢复说明,移除过时的模式级阻断宣传;修正发布会源工程的本地预览服务目录。
23
+ - 文档对齐:`CLAUDE.md` 与 `docs/maintainer/branch-protection.md` 同步 2026-10-09 已恢复的 PR CI(lint + Python 3.10 / 3.12 / 3.14 测试矩阵;required status checks 仍未配置);`pyproject.toml` 注释改指本地 `scripts/verify_release.py --fresh-install`;中英文 README 与 `CLAUDE.md` 的测试计数更新为 2900+。
24
+
25
+ ### Fixed
26
+ - 修正节流完成时间覆盖后续预约、高斯采样突破间隔下限及 crawl 分类别预算边界;使用单调时钟保持预约,crawl 首页种子导航、分页、页面 fetch 和 CDP fallback 分别申请预算。等待及发送前检查停止、风险和截止时间,停止信号不触发重试或通道降级;写后确认受阻保留 `ACTION_UNCONFIRMED` 和 `confirmation_stop`,失败下载仍记节流,429 下载不读正文或创建文件。crawl 在中断或清理失败前保存进度,清理异常保留原风险或预算停止状态。
27
+ - 校验 `--delay`、延迟范围和共享预算配置的有限数值、正整数及绝对路径约束;非法配置不落盘,保留配置修复入口。预算组有效风险状态进入 `status` / `doctor`,显式清风险锁保留预算及冷却,风险写盘失败仍阻断当前实例。
28
+ - 浏览器风险识别续查:聊天页 `/wapi/` 的 HTTP 403 在响应头事件立即停止,不等正文;错误/缺失 Content-Type 的受限 HTML 仍生成脱敏分类元数据。业务 JSON 先解析原码,避免成功响应中的 HTML 说明触发误锁;纯文本业务响应同样检查风险,外站和普通静态资源不误锁。
29
+ - 补齐 code 31(IP/环境限制)、32(账号限制)及官方 `403.html` 访问受限页:API、浏览器、认证与 crawl 在刷新、重登清 Cookie 或继续导航前停止并保存原码/未知状态;隐藏文案不用于猜测当前原因。当前网页 code 31 已只读观察,32 仅有静态与离线证据;页面展示时间和移动端可用均不触发自动解锁。
30
+ - 风险锁改为显式本地恢复:code 35/36、环境类或含糊的 code 37、HTTP 403 和官方 verify/security 安全页在候选、招聘者与认证通道锁存原始风险原因及可用业务码;httpx、headless、裸 CDP、令牌变化和历史 `--ignore-risk-lock` 均不能绕过已记录锁。用户确认目标业务页恢复后执行 `boss clean --risk-lock` 再显式恢复任务,清理不代表平台解封,再次风险立即重锁。code 37 刷新要求凭据与明确过期语义同时存在,风险/安全验证优先;code 35/security 路径与含糊 token 分类为静态证据和离线回归,未声称真实账号线上解除已验证。
31
+ - 独立 crawl 与 API 共用同 `data_dir` 风险锁,在浏览器构造、连接和后台启动前阻断已锁任务;新风险持久化原始原因/业务码,未知码保持 `null`,code 38 明确属于身份资料流程。风险 outcome、已采集队列和 checkpoint 保留,人工恢复放在 `operator_actions`,resume 不清锁;本地结果与已完成 run 导入仍可用。
32
+ - 候选人搜索、推荐、批量沟通与 watch 在同次结果/分页流程中按非空职位 ID 去重,保留首条完整 `security_id/lid`,不按职位 ID 合并不同账号的历史记录。候选池可选 `lid` 经兼容 SQLite 扩展保存,CLI/MCP/schema、crawl/favorites 导入同步;favorites 更新访问上下文时不拼接旧 `lid`。
33
+ - `recommend` 保留缺失/不明确的分页标记为 `has_more=null`,只有平台明确返回布尔 `true` 才给出下一页提示,避免上层无依据继续请求;兼容 `total` 仍是本页条数,新增 `total_kind` 明确其范围。
34
+ - 风险响应在刷新、登录降级或采集 fallback 前停止:原始 code 36、环境类/不明确 code 37、HTTP 403 和安全页共享错误契约;Cookie、二维码各阶段、CDP 探测/刷新、招聘者动作前后回读与自动化读响应均原样传播风险,保存可用 checkpoint,不继续请求或更换通道。
35
+ - 端点显式声明读写与可重放性质,GET 变更和未知操作不再按方法推断可重试;fetch/响应体与 CDP renderer 加有界截止。浏览器上下文销毁、httpx 断链/损坏响应等未知写结果保留 `ACTION_UNCONFIRMED`,候选人与招聘者均不提示自动重发;招聘者准确绑定目标好友,不强制开启禁用编辑器,不以 outgoing WS 或未知手机号动作编号确认成功。
36
+ - 自动化使用独立原子停止标志并在动作边界重新读取,逐项保存已确认防重结果,风险和中断保留进度;wizard 成功结果先落盘再处理超时,旧更新不能覆盖 stop。MCP handler 改用异步子进程,长运行期间控制工具仍可响应,取消/超时有界中断并回收进程,保留副作用未知标记与 checkpoint 宽限。
37
+ - 搜索缓存命中重建本次排序的编号索引,`lid` 随编号、show/detail/job-card 传递,crawl 候选池仅从同 run/job/security 的既有本机缓存恢复 `lid`,兼容旧数据。福利/活跃度筛选先跳过已沟通过职位,有限需求按需串行并在结果足够时停止;apply 原始风险分支不再提示自动重试。
38
+ - 招聘者 `hr chat` 打开聊天页后页面来源仍是 0 条、`unread` 全为 `null`(#456 后续)。实测聊天页(Vue 2 + vue-rx)的会话列表挂在 geek-list 组件实例的 `list$` 和父组件 chat 的 `allList$` 订阅上(`$observables`),不在原快照扫描的 `$data` / computed / `$store` 里;列表项自带 `newMsgCount`、`lastText`、`lastTS`、`lastMsgStatus`、`lastIsSelf`。快照脚本现在先读 vue-rx 订阅(仍只读页面内存、字段白名单),页面已加载的会话直接给出未读数、最后一条消息和时间,没覆盖到的会话再走 `userLastMsg`;`hints.summary_sources.page_snapshot` 给出数据来源路径、已加载条数和页面是否还有更多(`has_more`)。页面只保存已滚动加载的会话,未加载的会话拿不到未读数,仍为 `null`。另外修正快照脚本从未真正执行的问题:`evaluate_js` 不带参数时只把函数表达式求值成函数对象而不调用,快照因此一直为空,现在带参数调用。
39
+ - 招聘者 `hr chat` 的最近消息补全实测全部失败(`last_messages_error: 未知的非法参数`,356 条都退回 `friend_list`,#456 后续)。对照前端代码和 3 个 friendId 的实测:`userLastMsg` 参数本身没错(表单 `src=0&friendIds=a,b,c`),问题是把整页 356 个 friendId 一次塞进去,前端自己每批不超过 100 个,并按 friendSource 分组(店长直聘好友 `src=1`)。现在按 friendSource 分组、每批 50 个串行请求,默认只补前 100 个会话(最多 2 次请求),`hr chat --summary-limit`(0–300,0=不请求)可调,任一批失败立即停止并在 `hints.summary_sources` 记录 `last_messages_error` / `last_messages_error_code` / `last_messages_requests` / `last_messages_skipped`;`hr last-messages` 同样分批并新增 `--limit`。按实测返回形状(`uid`、`lastTS`、`lastMsgInfo.showText/fromId/status/msgTime`)解析:时间优先用毫秒时间戳而不是「12:00」展示串,候选人发来的最后一条消息不再显示成「发送中」(`msg_status` 只对自己发出的消息有值)。该接口不返回未读数,`unread` 仍只来自聊天页快照。
40
+ - 风控锁(#453)补齐聊天页动作和登录覆盖。招聘者 `hr reply` / `hr request-resume` / `hr resume --exchange` 在执行前仅检查本地锁,不为核对令牌建立 CDP 连接;未解除时不执行页面动作。页面的 code 35/36/37 或安全页会锁存并保留原始原因,`error.details.page_risk` 保留接口路径和码。登录、导入和刷新也在平台请求前检查同一锁;历史 `--ignore-risk-lock` 参数保留兼容但不放行,用户确认官方目标业务页恢复后须执行 `boss clean --risk-lock` 显式清除本地阻断。
41
+ - 招聘者 `hr chat` 的未读数、最后一条消息、时间不再全是 `null` / `未知` / `-`。实测沟通列表接口(filterByLabel)只返回 friendId、姓名、updateTime 等基础字段,原实现的补全又没对上数据。现在 CDP 模式下先读聊天页 geek-list 组件里已加载的会话列表(只读页面内存、不发请求,字段按白名单挑选);页面没覆盖到的会话才调用一次 `userLastMsg`(单次、串行),并兼容消息对象(按 from/to uid 对应候选人)和 `{friendId: 消息}` 映射等返回形状;都拿不到时字段为 `null`,`last_time` 退回 `updateTime` 并标注 `last_time_source`。每条记录新增 `summary_source`,`hints.summary_sources` 给出来源统计和最近消息接口错误。`hr last-messages` 同步改为未知字段输出 `null`。
42
+ - 招聘者 `hr resume --exchange` 在换电话/换微信按钮还没解锁时不再走一遍页面动作、最后报含糊的 `ACTION_UNCONFIRMED`。实测平台要求招聘者先在会话里发过消息才解锁这两个按钮(求简历不受限),未解锁时 `handleExChange` 照常返回但什么都没发。现在交换前先检查按钮组件的禁用状态(`disabled` / `aria-disabled` 属性、`disabled`/`gray` 等 class、根元素 `pointer-events: none`、组件 props/data 的禁用标记);页面判断不了时,用动作前读到的完整聊天记录里是否有自己发出的消息兜底。确定未解锁时不调用 `handleExChange`,返回新错误码 `EXCHANGE_NOT_AVAILABLE`(`recoverable=true`,提示先 `boss hr reply` 或 `boss hr request-resume` 后再试),`error.details` 带 `availability`、`availability_signals`、`history_self_message`;信号拿不准时不拦截。按钮看起来可用但聊天记录里没有自己的消息时仍按原流程执行,若最终未确认,`ACTION_UNCONFIRMED` 的提示会点出按钮可能尚未解锁。
43
+ - 招聘者 `hr resume --exchange --type wechat` 实际已发出换微信请求却返回 `ACTION_UNCONFIRMED`(#443 后续)。实测这类请求在聊天记录里是不带文案的动作卡片(`body.type=4`、`action.aid=32`),原判定只认文案。现在聊天记录和 WS 帧都按动作卡片的 aid 判定:aid 32 = 换微信,aid 37 = 求附件简历;换手机号的 aid 尚无样本,暂时接受除这两个之外任意 aid 的卡片。卡片必须是自己发出、动作后新出现(mid 不在动作前快照里,且时间不早于动作开始 60 秒以上)。没有 WS 证据时聊天记录回读改为轮询(首读加 3 次重试,共约 6 秒),`error.details` 新增 `history_attempts`;换微信时出现的 aid 37 卡片也计入 `resume_request_detected`。
44
+ - CDP 模式不再用 httpx 带着浏览器登录态访问平台(#452 / #451 后续)。实测 `--cdp-url` 下 `job_card` 先走 httpx(Cookie 从 Chrome 拷出、`__zp_stoken__` 作查询参数),与浏览器通道并发,Chrome 里的 stoken 随即被判异常,之后 CLI 的浏览器请求一律 code 37,而手动浏览因页面重新校验换了 stoken 仍正常。现在配了 `--cdp-url`、显式 `--browser-source existing-browser` / `stored-cookie`,或本进程已接上 CDP Chrome 时,`BossClient` / `BossRecruiterClient` 的所有平台读写都只走浏览器通道(`job_card` 不再 httpx 优先,`detail`、向导详情、收藏、投递记录、聊天等读取一并改走浏览器),没有浏览器实现的操作(招聘者附件下载)返回 `NOT_SUPPORTED`;`search` / `watch` / 向导的福利、活跃度补详情在 CDP 下改为串行并按 `CrawlBudget` 间隔;`crawl` 的列表兜底和详情改为在采集页签内同源请求,去掉 httpx 回退。风险锁沿用历史 `cdp_risk_lock` 名称,摘要仅作诊断;锁存后所有 BOSS 请求在本地拒绝,账号风险保留 `ACCOUNT_RISK`,环境锁保留 `ENVIRONMENT_RISK_LOCKED`。`boss doctor` / `boss status` 展示本地状态,只有用户确认目标业务页恢复并执行 `boss clean --risk-lock` 后才能显式继续;令牌变化不会自动解锁,HTTP/headless 也不能绕过已有锁。`detail` 命中风控后不再换通道补请求。
45
+ - 收紧 `boss search --active` 的请求量(#451 回归,#442)。实测列表项不带 `activeTimeDesc`,原实现会固定翻 5 页并对离线 HR 的职位 3 线程并发取 job_card,`--active 3d` 跑约 28 秒后触发平台风控 code 37。现在 `--active online` 只看列表的 `bossOnline`,不查详情、只翻 1 页,请求量与普通搜索相同;其余档位先看 1 页,结果不足 10 条(或 `limit`)且本页仍有职位要查详情才继续,最多 3 页;在线行直接通过任何档位。需要查详情时改为串行,每次请求前按列表请求的节奏(5–10 秒)间隔,CDP / 指定浏览器来源时只走浏览器 job_card,不再 httpx 与浏览器混用;与 `--welfare` 同用时同样保守,单独 `--welfare` 行为不变。`bossOnline` 统一按 `True` / `1` / `"1"` 判为在线(`JobItem.boss_active` 与活跃度判断共用),`hints.active_filter` 新增 `detail_lookups` 提示实际查了多少个详情。`boss watch` 和向导求职流程的默认翻页同步调整。
46
+ - 招聘者 `hr request-resume` / `hr resume --exchange` 不再把已生效的动作误报为 `unexpected page result`,换微信也不再顺带发出求附件简历请求(#443)。确认按钮只在当前组件和本次动作新弹出的可见弹层里按文字「确定」查找,没有新弹层就不点;求简历同时认新旧两种文案(含「想要一份您的附件简历」),并在动作后只读回查聊天记录。页面动作执行但找不到发送证据时返回新错误码 `ACTION_UNCONFIRMED`(`recoverable=false`,先 `boss hr chatmsg <friend_id>` 核实、勿直接重试),页面日志、确认状态和 WS 统计放进 `error.details`;同时修正 CDP 文本帧被当作 base64 解码的问题。
47
+ - 定向更新安全依赖:`[mcp]` 的 PyJWT 锁定到 2.15.1、`[crawl]` 的 urllib3 锁定到 2.8.0、`[dev]` 的 virtualenv 锁定到 21.7.13,并仅连带更新 python-discovery 到 1.6.1。在对应 extra 中声明安全版本下界,避免全新安装回退到已知风险版本,不扩大基础运行依赖;补齐依赖作用域和 JWT 调用者选项隔离/过期声明校验回归。
48
+ - `boss config set platform` 在写入前按当前注册表拒绝已移除、未知或空平台值;失败不创建配置文件,也不改写已有内容,保留显式 `--platform zhipin` 修复旧配置的入口。
49
+ - `boss doctor` 将可执行后继命令与真人操作指引分别放入 `next_actions` / `operator_actions`,命令保留数据目录、平台、浏览器来源和 CDP 上下文;TTY 显示真人指引。源码质量工具检查和维护脚本建议仅面向本项目源码运行,安装包用户不再被要求拥有开发工具链。
50
+
51
+ ## [3.0.1] - 2026-10-23
52
+
53
+ ### Fixed
54
+ - 招聘者在线简历接口 `/wapi/zpjob/view/geek/info` 返回「旧简历接口已下线」时,`hr resume` 与 wizard 改为 `ENDPOINT_DEPRECATED`(不可恢复,停止重试),并在 `error.details.tracking_issue` 指向 #472。聊天发送旧端点 #217 仍走同一错误码,跟踪链接改到各自的 `details`,不再写死在 `recovery_action`。`recovery_action` 文案改为查看 `error.details.tracking_issue`,错误码本身不变。
55
+ - CDP 回读在线简历时,已解开的 `resumeInfo` 在弹层内部的 `new-chat-resume` 上,外层 `transition` 的 `$children` 为空。读取改为同时扫描弹层里的 Vue 实例;`geekBaseInfo` 只保留解析器会用到的字段。教育经历同时认 `degreeName` / `startDateDesc` / `endDateDesc`。
56
+ - `hr resume` 的在线简历请求改为 `uid`、`encryptJid`、`securityId`,并带 `X-Requested-With: XMLHttpRequest`。不再发送插件时期的参数名,也不生成 `sigx`。登录态沟通页的完整正文由页面自己请求 `GET /wapi/zpjob/view/geek/info/v2`(含 wasm 的 `challenge`);CLI 不复刻该请求。CDP 下若旧接口仍返回下线文案,且已打开 `/web/chat/index`,再调用页面自己的 `newChatResumeViewer`,只读取 securityId 匹配的白名单字段并关闭弹层。没有聊天页或没有可读正文时,仍返回 `ENDPOINT_DEPRECATED`。
57
+
58
+ ## [3.0.0] - 2026-10-02
59
+
60
+ ### Changed(含 Breaking Change)
61
+ - **移除 Browser Bridge。** 删除本地 daemon、Chrome 扩展、Python `boss_agent_cli.bridge` 包与 `[bridge]` extra,移除 `boss doctor` 的七项 `bridge_*` 诊断;不再探测或连接旧 Bridge 服务。浏览器来源 `auto` 的通道顺序改为 CDP → headless,`existing-browser` 仅复用已有 CDP 浏览器中的目标页;`stored-cookie` 仍只连接显式指定的 CDP 端点,来源约束和风控停止契约不变。
62
+ - `chat` / `chatmsg` 默认继续使用本地凭据的 httpx 通道;需要不读取本地凭据的现有浏览器会话时,请显式使用 `boss --browser-source existing-browser --cdp-url http://localhost:9222 chat`,并在该浏览器中手动打开和登录 BOSS 直聘。
63
+ - **升级 CLI 不会停止旧 daemon,也不会卸载浏览器扩展。** 请手动停止旧 daemon(包括其他虚拟环境中的实例),在 `chrome://extensions` 禁用或移除旧扩展,并从安装配置中删除 `[bridge]` extra。CDP 调试端口仅限本机可信环境使用,不得用于规避平台风控。
64
+ - **移除智联招聘(`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`)。
65
+ - 迁移:若 `config.json` 里写着 `platform: zhilian`,所有命令都会被拒绝,运行 `boss --platform zhipin config set platform zhipin` 改回默认平台。
66
+ - `boss doctor` 不再额外探测 zhaopin.com(`network_zhilian` 检查项移除);招聘者 `status --live` 的智联 selector 健康检查及其 `SELECTOR_HEALTH_FAILED` 错误、`selector_health` 字段随之移除。
67
+ - 升级前以 `zhilian` 保存的 wizard run(含 MCP `boss_wizard` 恢复)在恢复时同样返回 `INVALID_PARAM`,不再读取遗留登录态;请以 `zhipin` 新建 run。
68
+ - 便携包不再附带 `examples/zhilian-recruiter.sh`。
69
+ - 本地遗留的 `~/.boss-agent/auth/zhilian/` 登录态与自动化存储中的智联条目不再被读取,也不会被 zhipin 运行执行,可手动删除。
70
+
71
+ ### Changed
72
+ - 内部重构:`boss schema` 的能力描述、错误码登记表与格式转换从命令模块 `commands/schema.py` 拆到独立的 `boss_agent_cli.schema` 包(`data` / `error_codes` / `availability` / `formats`),`display` 与 `mcp_tools` 不再反向依赖命令层;CLI 输出、`boss schema` 四种格式与 MCP 工具面均逐字节不变。
73
+ - 内部重构:`commands/` 只保留 Click 命令与 `_` 前缀的 CLI 支撑模块;聊天导出 / 快照、联系人查找、职位导出、job_card 映射、浏览器内核探测等可复用逻辑移入 `boss_agent_cli.services`,平台实例构造移入 `platforms/factory.py`,wizard 不再调用命令模块的私有函数;行为不变。
74
+ - 内部重构:CDP 默认地址与 zhipin / zhilian 域名校验移到 `api/browser_urls.py`,`api/browser_client.py` 不再 import `auth.browser` 的私有符号,打断 api ↔ auth 运行时 import 循环;行为不变。
75
+ - 清理无运行时调用方的代码:`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` 中的历史兼容函数按设计保留。
76
+
77
+ ### Fixed
78
+ - `boss chat` 现在公开跨请求稳定的联系人 `uid`,`chatmsg` / `chat-summary` / `mark` / `exchange` 优先按 `uid` 重新解析联系人并使用本次沟通列表返回的动态 `securityId`;沟通快照、diff 与导出映射同步改用 `uid` 主键,避免轮换令牌导致联系人查找必然失败和快照重复。既有 `security_id` 参数名与无 `uid` 的旧快照仍兼容,但旧令牌仅作兜底且可能已经失效。
79
+ - 移除通用 CI / Docs workflow 后,同步清理失效的 README 状态徽章、远端门禁文档与工作流存在性断言;PR 和发版改为明确执行维护者本地质量门禁,避免主线测试固定读取已删除文件。
80
+
7
81
  ## [2.0.1] - 2026-09-29
8
82
 
9
83
  ### Fixed
@@ -70,7 +70,7 @@ Before investing in promotion, examples, or integrations, check those passive si
70
70
  ```
71
71
  5. **Commit** atomically — one logical change per commit.
72
72
  6. **Push** and open a PR against `master`.
73
- 7. **CI green** is a hard prerequisite before merge (4 Python versions × lint × security scan).
73
+ 7. **CI green** is a hard prerequisite before merge: the `CI` workflow runs ruff / mypy / pre-commit and tests on Python 3.10, 3.12 and 3.14 for every PR (fork PRs included, no secrets needed), plus CodeQL and GitGuardian scans. Tests are fully offline; don't add tests that need the network, a real browser or a real account.
74
74
 
75
75
  Maintainers will `squash merge`, so the squash title must follow the commit convention above.
76
76
 
@@ -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,11 +113,11 @@ 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
 
120
- - **TDD encouraged**: write the test before the implementation. CI coverage is tracked on [Codecov](https://codecov.io/gh/can4hou6joeng4/boss-agent-cli), baseline 80%.
120
+ - **TDD encouraged**: write the test before the implementation. For coverage, run `uv run pytest --cov=boss_agent_cli` locally.
121
121
  - **Mock external I/O**: `AuthManager`, `BossClient`, `CacheStore`, and `AIService` are mock boundaries — tests should not hit the real BOSS Zhipin API.
122
122
  - **Error-path parity**: for every success path, add at least one error path test (auth expired, rate-limited, invalid param, etc.).
123
123