boss-agent-cli 3.0.0__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 (441) hide show
  1. boss_agent_cli-3.0.1/.coderabbit.yaml +64 -0
  2. boss_agent_cli-3.0.1/.github/dependabot.yml +31 -0
  3. boss_agent_cli-3.0.1/.github/labeler.yml +25 -0
  4. boss_agent_cli-3.0.1/.github/workflows/ci.yml +91 -0
  5. boss_agent_cli-3.0.1/.github/workflows/dependabot-auto-merge.yml +29 -0
  6. boss_agent_cli-3.0.1/.github/workflows/labeler.yml +25 -0
  7. boss_agent_cli-3.0.1/.github/workflows/stale.yml +38 -0
  8. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/.pre-commit-config.yaml +2 -0
  9. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/CHANGELOG.md +51 -0
  10. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/CONTRIBUTING.en.md +2 -2
  11. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/CONTRIBUTING.md +2 -2
  12. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/PKG-INFO +12 -7
  13. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/README.en.md +8 -6
  14. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/README.md +8 -6
  15. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/demo/index.html +47 -39
  16. boss_agent_cli-3.0.1/demo/keynote-animation/.gitignore +7 -0
  17. boss_agent_cli-3.0.1/demo/keynote-animation/README.en.md +63 -0
  18. boss_agent_cli-3.0.1/demo/keynote-animation/README.md +63 -0
  19. boss_agent_cli-3.0.1/demo/keynote-animation/assets/Inter-var.woff +0 -0
  20. boss_agent_cli-3.0.1/demo/keynote-animation/assets/LICENSES.md +15 -0
  21. boss_agent_cli-3.0.1/demo/keynote-animation/assets/NotoSansSC-500.woff +0 -0
  22. boss_agent_cli-3.0.1/demo/keynote-animation/assets/NotoSansSC-800.woff +0 -0
  23. boss_agent_cli-3.0.1/demo/keynote-animation/assets/OFL.txt +94 -0
  24. boss_agent_cli-3.0.1/demo/keynote-animation/directions.html +14 -0
  25. boss_agent_cli-3.0.1/demo/keynote-animation/eras.js +6 -0
  26. boss_agent_cli-3.0.1/demo/keynote-animation/export_showcase.py +56 -0
  27. boss_agent_cli-3.0.1/demo/keynote-animation/index.html +17 -0
  28. boss_agent_cli-3.0.1/demo/keynote-animation/output/soundtrack.m4a +0 -0
  29. boss_agent_cli-3.0.1/demo/keynote-animation/player.js +38 -0
  30. boss_agent_cli-3.0.1/demo/keynote-animation/render.py +194 -0
  31. boss_agent_cli-3.0.1/demo/keynote-animation/render_directions.py +48 -0
  32. boss_agent_cli-3.0.1/demo/keynote-animation/scenes.js +138 -0
  33. boss_agent_cli-3.0.1/demo/keynote-animation/score.py +133 -0
  34. boss_agent_cli-3.0.1/demo/keynote-animation/storyboard.json +22 -0
  35. boss_agent_cli-3.0.1/demo/keynote-animation/verify.py +153 -0
  36. boss_agent_cli-3.0.1/demo/keynote-animation/visuals.js +89 -0
  37. boss_agent_cli-3.0.1/demo/llms.txt +36 -0
  38. boss_agent_cli-3.0.1/demo/promo-showcase/README.en.md +32 -0
  39. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/demo/promo-showcase/README.md +7 -3
  40. boss_agent_cli-3.0.1/demo/showcase/boss-agent-cli-showcase-thumb.jpg +0 -0
  41. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/agent-quickstart.en.md +12 -4
  42. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/agent-quickstart.md +12 -4
  43. boss_agent_cli-3.0.1/docs/assets/logo.png +0 -0
  44. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/assets/star-history-dark.svg +10 -9
  45. boss_agent_cli-3.0.1/docs/assets/star-history.svg +44 -0
  46. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/commands.en.md +88 -5
  47. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/commands.md +88 -5
  48. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/maintainer/branch-protection.md +7 -5
  49. boss_agent_cli-3.0.1/docs/maintainer/release-checklist.md +83 -0
  50. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/troubleshooting.en.md +52 -0
  51. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/troubleshooting.md +43 -0
  52. boss_agent_cli-3.0.1/llms.txt +35 -0
  53. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/pyproject.toml +13 -3
  54. boss_agent_cli-3.0.1/scripts/README.md +61 -0
  55. boss_agent_cli-3.0.1/scripts/_release_probe.py +152 -0
  56. boss_agent_cli-3.0.1/scripts/verify_release.py +317 -0
  57. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/__init__.py +1 -1
  58. boss_agent_cli-3.0.1/src/boss_agent_cli/api/_base_client.py +496 -0
  59. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/boss.yaml +48 -0
  60. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/browser_client.py +420 -42
  61. boss_agent_cli-3.0.1/src/boss_agent_cli/api/cdp_risk_lock.py +176 -0
  62. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/client.py +73 -29
  63. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/endpoints.py +2 -0
  64. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/endpoints_loader.py +24 -2
  65. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/models.py +24 -1
  66. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/recruiter.yaml +64 -0
  67. boss_agent_cli-3.0.1/src/boss_agent_cli/api/recruiter_client.py +1685 -0
  68. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/recruiter_endpoints.py +2 -0
  69. boss_agent_cli-3.0.1/src/boss_agent_cli/api/recruiter_resume.py +274 -0
  70. boss_agent_cli-3.0.1/src/boss_agent_cli/api/request_budget.py +418 -0
  71. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/throttle.py +18 -14
  72. boss_agent_cli-3.0.1/src/boss_agent_cli/api/zhipin_errors.py +141 -0
  73. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/auth/browser.py +220 -118
  74. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/auth/cookie_extract.py +7 -1
  75. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/auth/manager.py +129 -10
  76. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/auth/qr_login.py +36 -7
  77. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/boss_adapter.py +42 -9
  78. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/execution.py +23 -7
  79. boss_agent_cli-3.0.1/src/boss_agent_cli/automation/runner.py +125 -0
  80. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/safety.py +35 -3
  81. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/storage.py +93 -7
  82. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/cache/store.py +68 -14
  83. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/_doctor_checks.py +44 -13
  84. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/_login_errors.py +1 -0
  85. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/agent.py +22 -9
  86. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/apply.py +6 -7
  87. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/clean.py +36 -3
  88. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/config_cmd.py +27 -13
  89. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/crawl.py +19 -5
  90. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/detail.py +7 -2
  91. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/doctor.py +58 -21
  92. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/favorites.py +4 -2
  93. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/greet.py +2 -1
  94. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/login.py +10 -2
  95. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/preset.py +11 -1
  96. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recommend.py +12 -4
  97. boss_agent_cli-3.0.1/src/boss_agent_cli/commands/recruiter/chat.py +542 -0
  98. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recruiter/resume.py +5 -1
  99. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/schema.py +10 -6
  100. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/search.py +70 -10
  101. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/shortlist.py +5 -0
  102. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/show.py +3 -2
  103. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/status.py +5 -0
  104. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/watch.py +22 -2
  105. boss_agent_cli-3.0.1/src/boss_agent_cli/config.py +91 -0
  106. boss_agent_cli-3.0.1/src/boss_agent_cli/crawler/controls.py +21 -0
  107. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/crawler/service.py +249 -82
  108. boss_agent_cli-3.0.1/src/boss_agent_cli/crawler/transport.py +543 -0
  109. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/display.py +111 -25
  110. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/index_cache.py +1 -0
  111. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/main.py +67 -9
  112. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/mcp_args.py +6 -2
  113. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/mcp_server.py +148 -16
  114. boss_agent_cli-3.0.1/src/boss_agent_cli/mcp_tools.py +87 -0
  115. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/output.py +63 -7
  116. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/platforms/base.py +10 -0
  117. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/platforms/recruiter_base.py +6 -2
  118. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/platforms/zhipin.py +20 -3
  119. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/platforms/zhipin_recruiter.py +47 -11
  120. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/schema/data.py +118 -19
  121. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/schema/error_codes.py +23 -3
  122. boss_agent_cli-3.0.1/src/boss_agent_cli/schema/formats.py +162 -0
  123. boss_agent_cli-3.0.1/src/boss_agent_cli/schema/tool_catalog.py +1015 -0
  124. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/search_filters.py +497 -73
  125. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/services/job_card.py +2 -1
  126. boss_agent_cli-3.0.1/src/boss_agent_cli/services/job_identity.py +24 -0
  127. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/services/resume_parser.py +3 -3
  128. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/wizard/actions.py +39 -4
  129. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/wizard/prompts.py +5 -0
  130. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/wizard/renderer.py +3 -1
  131. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/wizard/runner.py +51 -6
  132. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/wizard/store.py +3 -1
  133. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_agent_crawl.py +3 -1
  134. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_api.py +23 -12
  135. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_api_client_methods.py +2 -0
  136. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_api_client_retry.py +41 -54
  137. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_auth_browser.py +9 -2
  138. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_browser_client.py +17 -4
  139. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_browser_source.py +6 -3
  140. boss_agent_cli-3.0.1/tests/test_cdp_request_safety.py +497 -0
  141. boss_agent_cli-3.0.1/tests/test_cdp_risk_lock_coverage.py +313 -0
  142. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_commands.py +3 -3
  143. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_config_cmd.py +34 -0
  144. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_cookie_extract_regression.py +33 -0
  145. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_crawl.py +65 -24
  146. boss_agent_cli-3.0.1/tests/test_dependency_constraints.py +60 -0
  147. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_doctor_extended.py +133 -4
  148. boss_agent_cli-3.0.1/tests/test_exit_codes.py +95 -0
  149. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_mcp_handler_registration.py +41 -5
  150. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_new_commands.py +3 -3
  151. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_open_source_docs.py +38 -3
  152. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_output.py +82 -0
  153. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_platform_base.py +7 -2
  154. boss_agent_cli-3.0.1/tests/test_recruiter_chat_summary.py +279 -0
  155. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_recruiter_client_retry.py +49 -37
  156. boss_agent_cli-3.0.1/tests/test_recruiter_exchange_availability.py +251 -0
  157. boss_agent_cli-3.0.1/tests/test_recruiter_exchange_confirm.py +424 -0
  158. boss_agent_cli-3.0.1/tests/test_recruiter_last_msg_batching.py +154 -0
  159. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_recruiter_resume_attachments.py +7 -0
  160. boss_agent_cli-3.0.1/tests/test_release_verification.py +320 -0
  161. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_schema_contract.py +3 -1
  162. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_schema_formats.py +32 -8
  163. boss_agent_cli-3.0.1/tests/test_schema_mcp_tools.py +99 -0
  164. boss_agent_cli-3.0.1/tests/test_search_active_filter.py +322 -0
  165. boss_agent_cli-3.0.1/tests/test_search_active_request_volume.py +419 -0
  166. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_search_pipeline.py +158 -0
  167. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_shortlist.py +2 -0
  168. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_throttle.py +3 -3
  169. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_wizard.py +28 -2
  170. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/uv.lock +372 -283
  171. boss_agent_cli-3.0.0/demo/llms.txt +0 -28
  172. boss_agent_cli-3.0.0/demo/showcase/boss-agent-cli-showcase-thumb.jpg +0 -0
  173. boss_agent_cli-3.0.0/docs/assets/star-history.svg +0 -43
  174. boss_agent_cli-3.0.0/docs/maintainer/release-checklist.md +0 -65
  175. boss_agent_cli-3.0.0/scripts/README.md +0 -40
  176. boss_agent_cli-3.0.0/src/boss_agent_cli/api/_base_client.py +0 -222
  177. boss_agent_cli-3.0.0/src/boss_agent_cli/api/recruiter_client.py +0 -808
  178. boss_agent_cli-3.0.0/src/boss_agent_cli/api/recruiter_resume.py +0 -113
  179. boss_agent_cli-3.0.0/src/boss_agent_cli/api/zhipin_errors.py +0 -48
  180. boss_agent_cli-3.0.0/src/boss_agent_cli/automation/runner.py +0 -120
  181. boss_agent_cli-3.0.0/src/boss_agent_cli/commands/recruiter/chat.py +0 -281
  182. boss_agent_cli-3.0.0/src/boss_agent_cli/config.py +0 -59
  183. boss_agent_cli-3.0.0/src/boss_agent_cli/crawler/transport.py +0 -499
  184. boss_agent_cli-3.0.0/src/boss_agent_cli/mcp_tools.py +0 -1033
  185. boss_agent_cli-3.0.0/src/boss_agent_cli/schema/formats.py +0 -128
  186. boss_agent_cli-3.0.0/tests/test_schema_mcp_tools.py +0 -42
  187. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/.codecov.yml +0 -0
  188. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/.devcontainer/devcontainer.json +0 -0
  189. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/.dockerignore +0 -0
  190. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/.gitattributes +0 -0
  191. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/.github/CODEOWNERS +0 -0
  192. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  193. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  194. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/.github/ISSUE_TEMPLATE/documentation.yml +0 -0
  195. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  196. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  197. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/.github/social-preview.png +0 -0
  198. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/.github/workflows/pages.yml +0 -0
  199. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/.github/workflows/release.yml +0 -0
  200. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/.github/workflows/star-history.yml +0 -0
  201. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/.github/workflows/triage-cleanup.yml +0 -0
  202. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/.github/workflows/update-contributors.yml +0 -0
  203. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/.gitignore +0 -0
  204. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/CODE_OF_CONDUCT.md +0 -0
  205. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/CONTRIBUTORS.svg +0 -0
  206. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/Dockerfile +0 -0
  207. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/LICENSE +0 -0
  208. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/ROADMAP.en.md +0 -0
  209. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/ROADMAP.md +0 -0
  210. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/SECURITY.md +0 -0
  211. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/demo/demo-en.tape +0 -0
  212. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/demo/demo-zh.tape +0 -0
  213. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/demo/demo_showcase.py +0 -0
  214. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/demo/demo_showcase_en.py +0 -0
  215. {boss_agent_cli-3.0.0/docs → boss_agent_cli-3.0.1/demo/keynote-animation}/assets/logo.png +0 -0
  216. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/demo/promo-showcase/animations.jsx +0 -0
  217. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/demo/promo-showcase/app.jsx +0 -0
  218. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/demo/promo-showcase/boss-agent-cli-promo.html +0 -0
  219. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/demo/promo-showcase/lib.jsx +0 -0
  220. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/demo/promo-showcase/scenes.jsx +0 -0
  221. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docker-compose.yml +0 -0
  222. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/adr/0001-default-low-risk-assistance-mode.md +0 -0
  223. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/adr/0002-explicit-research-operating-mode.md +0 -0
  224. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/agent-hosts.en.md +0 -0
  225. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/agent-hosts.md +0 -0
  226. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/capability-matrix.en.md +0 -0
  227. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/capability-matrix.md +0 -0
  228. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/getting-started.en.md +0 -0
  229. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/getting-started.md +0 -0
  230. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/integrations/ai-models.en.md +0 -0
  231. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/integrations/ai-models.md +0 -0
  232. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/integrations/claude-code.md +0 -0
  233. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/integrations/codex.md +0 -0
  234. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/integrations/cursor.md +0 -0
  235. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/integrations/docker.md +0 -0
  236. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/integrations/python-sdk.md +0 -0
  237. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/integrations/shell-agent.md +0 -0
  238. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/integrations/windsurf.md +0 -0
  239. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/maintainer/labels.md +0 -0
  240. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/marketing/awesome-submissions.md +0 -0
  241. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/marketing/en-launch-story.md +0 -0
  242. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/marketing/promotion-article.md +0 -0
  243. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/marketing/zh-launch-story.md +0 -0
  244. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/platform-abstraction.en.md +0 -0
  245. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/platform-abstraction.md +0 -0
  246. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/platform-risk.en.md +0 -0
  247. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/platform-risk.md +0 -0
  248. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/readme-badge-policy.md +0 -0
  249. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/research/platforms/README.md +0 -0
  250. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/research/platforms/lagou.md +0 -0
  251. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/research/platforms/liepin.md +0 -0
  252. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/research/platforms/zhipin.md +0 -0
  253. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/docs/smoke-testing.md +0 -0
  254. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/evals/README.md +0 -0
  255. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/evals/results/20260624T103356Z-fixture.json +0 -0
  256. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/evals/results/README.md +0 -0
  257. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/evals/results/necessary-conditions-2026-06-24.json +0 -0
  258. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/evals/run_eval.py +0 -0
  259. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/evals/scenarios.json +0 -0
  260. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/examples/opencode/opencode.json +0 -0
  261. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/glama.json +0 -0
  262. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/mcp-server/README.en.md +0 -0
  263. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/mcp-server/README.md +0 -0
  264. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/mcp-server/server.py +0 -0
  265. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/scripts/package_portable.py +0 -0
  266. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/scripts/probe_recruiter_chat_frontend.ps1 +0 -0
  267. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/scripts/probe_recruiter_chat_frontend.py +0 -0
  268. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/scripts/quality_baseline.py +0 -0
  269. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/scripts/smoke_p0.py +0 -0
  270. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/scripts/update_contributors.py +0 -0
  271. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/ai/__init__.py +0 -0
  272. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/ai/config.py +0 -0
  273. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/ai/local_models.py +0 -0
  274. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/ai/prompts.py +0 -0
  275. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/ai/service.py +0 -0
  276. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/__init__.py +0 -0
  277. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/browser_source.py +0 -0
  278. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/browser_urls.py +0 -0
  279. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/api/httpx_helpers.py +0 -0
  280. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/auth/__init__.py +0 -0
  281. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/auth/curl_import.py +0 -0
  282. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/auth/health.py +0 -0
  283. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/auth/token_store.py +0 -0
  284. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/__init__.py +0 -0
  285. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/adapters.py +0 -0
  286. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/config.py +0 -0
  287. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/decision.py +0 -0
  288. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/events.py +0 -0
  289. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/mock_adapter.py +0 -0
  290. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/models.py +0 -0
  291. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/reply_ai.py +0 -0
  292. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/automation/scoring.py +0 -0
  293. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/cache/__init__.py +0 -0
  294. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/chat_summary.py +0 -0
  295. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/__init__.py +0 -0
  296. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/_contact_lookup.py +0 -0
  297. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/_platform.py +0 -0
  298. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/_recruiter_platform.py +0 -0
  299. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/ai_cmd.py +0 -0
  300. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/ai_local.py +0 -0
  301. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/chat.py +0 -0
  302. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/chat_summary.py +0 -0
  303. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/chatmsg.py +0 -0
  304. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/cities.py +0 -0
  305. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/digest.py +0 -0
  306. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/exchange.py +0 -0
  307. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/export.py +0 -0
  308. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/history.py +0 -0
  309. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/interviews.py +0 -0
  310. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/logout.py +0 -0
  311. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/mark.py +0 -0
  312. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/me.py +0 -0
  313. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/pipeline.py +0 -0
  314. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/platforms.py +0 -0
  315. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recruiter/__init__.py +0 -0
  316. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recruiter/accept_resume.py +0 -0
  317. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recruiter/applications.py +0 -0
  318. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recruiter/candidates.py +0 -0
  319. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recruiter/download_resume.py +0 -0
  320. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recruiter/jobs.py +0 -0
  321. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recruiter/recommendations.py +0 -0
  322. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recruiter/reply.py +0 -0
  323. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/recruiter/request_resume.py +0 -0
  324. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/register.py +0 -0
  325. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/resume_cmd.py +0 -0
  326. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/stats.py +0 -0
  327. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/commands/wizard.py +0 -0
  328. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/compliance.py +0 -0
  329. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/crawler/__init__.py +0 -0
  330. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/crawler/exporter.py +0 -0
  331. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/crawler/hooks.py +0 -0
  332. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/crawler/operations.py +0 -0
  333. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/digest.py +0 -0
  334. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/hooks.py +0 -0
  335. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/match_score.py +0 -0
  336. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/pipeline_state.py +0 -0
  337. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/platforms/__init__.py +0 -0
  338. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/platforms/factory.py +0 -0
  339. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/py.typed +0 -0
  340. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/resume/__init__.py +0 -0
  341. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/resume/export.py +0 -0
  342. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/resume/models.py +0 -0
  343. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/resume/store.py +0 -0
  344. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/resume/templates.py +0 -0
  345. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/schema/__init__.py +0 -0
  346. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/schema/availability.py +0 -0
  347. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/services/__init__.py +0 -0
  348. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/services/browser_runtime.py +0 -0
  349. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/services/chat_export.py +0 -0
  350. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/services/chat_snapshot.py +0 -0
  351. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/services/chat_utils.py +0 -0
  352. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/services/contact_lookup.py +0 -0
  353. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/services/friend_list_pages.py +0 -0
  354. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/services/job_export.py +0 -0
  355. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/wizard/__init__.py +0 -0
  356. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/wizard/catalog.py +0 -0
  357. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/wizard/live_crawl.py +0 -0
  358. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/wizard/models.py +0 -0
  359. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/src/boss_agent_cli/wizard/preflight.py +0 -0
  360. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/conftest.py +0 -0
  361. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/fixtures/favorites_card.json +0 -0
  362. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_agent_automation.py +0 -0
  363. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_agent_automation_cross_validation.py +0 -0
  364. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_agent_docs.py +0 -0
  365. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_agent_error_contract.py +0 -0
  366. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_agent_host_examples.py +0 -0
  367. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_ai_commands.py +0 -0
  368. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_ai_config.py +0 -0
  369. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_ai_config_cmd.py +0 -0
  370. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_ai_cover_letter.py +0 -0
  371. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_ai_fit.py +0 -0
  372. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_ai_local.py +0 -0
  373. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_ai_prompts.py +0 -0
  374. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_ai_resume_optimize.py +0 -0
  375. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_ai_service.py +0 -0
  376. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_ai_suggest_keywords.py +0 -0
  377. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_api_httpx_helpers.py +0 -0
  378. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_apply.py +0 -0
  379. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_auth.py +0 -0
  380. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_auth_and_login_extended.py +0 -0
  381. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_auth_manager_extended.py +0 -0
  382. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_auth_manager_flow.py +0 -0
  383. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_cache.py +0 -0
  384. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_cache_extended.py +0 -0
  385. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_chat_export_extended.py +0 -0
  386. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_chat_snapshot_extended.py +0 -0
  387. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_chat_summary.py +0 -0
  388. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_chat_summary_command.py +0 -0
  389. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_chatmsg_extended.py +0 -0
  390. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_chatmsg_uid_flow.py +0 -0
  391. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_clean_cmd.py +0 -0
  392. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_cli_invariants.py +0 -0
  393. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_compliance.py +0 -0
  394. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_contact_lookup.py +0 -0
  395. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_coverage_second_sprint.py +0 -0
  396. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_crawl_cli.py +0 -0
  397. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_curl_auth_import.py +0 -0
  398. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_digest.py +0 -0
  399. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_digest_command.py +0 -0
  400. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_display.py +0 -0
  401. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_endpoints_loader.py +0 -0
  402. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_eval_harness.py +0 -0
  403. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_export_extended.py +0 -0
  404. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_favorites.py +0 -0
  405. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_greet_detail_extended.py +0 -0
  406. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_greet_extended.py +0 -0
  407. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_hooks.py +0 -0
  408. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_index_cache.py +0 -0
  409. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_job_card_browser.py +0 -0
  410. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_job_item_lid.py +0 -0
  411. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_match_score.py +0 -0
  412. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_mcp_server.py +0 -0
  413. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_mcp_server_protocol.py +0 -0
  414. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_pipeline_commands.py +0 -0
  415. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_pipeline_state.py +0 -0
  416. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_platform_cli.py +0 -0
  417. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_platform_not_supported.py +0 -0
  418. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_platforms_cmd.py +0 -0
  419. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_portable_package.py +0 -0
  420. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_preset.py +0 -0
  421. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_probe_script.py +0 -0
  422. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_public_api.py +0 -0
  423. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_qr_login.py +0 -0
  424. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_quality_baseline.py +0 -0
  425. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_recruiter_recommendations_and_read.py +0 -0
  426. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_recruiter_safety_regressions.py +0 -0
  427. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_resume_commands.py +0 -0
  428. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_resume_export.py +0 -0
  429. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_resume_import_compat.py +0 -0
  430. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_resume_init_hints.py +0 -0
  431. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_resume_models.py +0 -0
  432. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_resume_store.py +0 -0
  433. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_resume_templates.py +0 -0
  434. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_search_filters.py +0 -0
  435. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_smoke_p0.py +0 -0
  436. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_stats.py +0 -0
  437. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_system_proxy.py +0 -0
  438. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_watch.py +0 -0
  439. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_watch_run_all.py +0 -0
  440. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_welfare_filter.py +0 -0
  441. {boss_agent_cli-3.0.0 → boss_agent_cli-3.0.1}/tests/test_zhipin_errors.py +0 -0
@@ -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"
@@ -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."
@@ -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,57 @@
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
+
7
58
  ## [3.0.0] - 2026-10-02
8
59
 
9
60
  ### Changed(含 Breaking Change)
@@ -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
 
@@ -117,7 +117,7 @@ On error, the envelope must contain `error.code`, `error.recoverable`, and `erro
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
 
@@ -70,7 +70,7 @@ git diff --check
70
70
  ```
71
71
  5. **原子提交**:每个 commit 只做一件事。
72
72
  6. **Push** 并向 `master` 发起 Pull Request。
73
- 7. **CI 全绿**才能合并:4 个 Python 版本(3.10–3.13)跑测试,加 lint / typecheck / docs / 安全扫描。
73
+ 7. **CI 全绿**才能合并:`CI` 工作流在 PR 上跑 ruff / mypy / pre-commit 和 Python 3.10、3.12、3.14 的测试(fork 的 PR 同样会跑,不需要任何 secret),另有 CodeQL 和 GitGuardian 安全扫描。测试全部离线,不要写需要网络、真实浏览器或真实账号的测试。
74
74
 
75
75
  维护者会使用 squash merge,所以最终 squash 标题也要遵守上面的 commit 格式。
76
76
 
@@ -99,7 +99,7 @@ git diff --check
99
99
 
100
100
  ## 测试理念
101
101
 
102
- - **鼓励 TDD**:先写测试再写实现。CI 覆盖率在 [Codecov](https://codecov.io/gh/can4hou6joeng4/boss-agent-cli) 追踪,基线 80%。
102
+ - **鼓励 TDD**:先写测试再写实现。需要看覆盖率时本地跑 `uv run pytest --cov=boss_agent_cli`。
103
103
  - **Mock 外部 I/O**:`AuthManager`、`BossClient`、`CacheStore`、`AIService` 是 mock 边界,测试不应真正调用 BOSS 直聘 API。
104
104
  - **错误路径对等**:每条成功路径至少对应一条错误路径测试(认证过期、限流、参数非法等)。
105
105
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: boss-agent-cli
3
- Version: 3.0.0
3
+ Version: 3.0.1
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
@@ -34,6 +34,7 @@ Requires-Dist: websockets>=12.0
34
34
  Provides-Extra: crawl
35
35
  Requires-Dist: drissionpage<4.2,>=4.1.1.1; extra == 'crawl'
36
36
  Requires-Dist: openpyxl>=3.1; extra == 'crawl'
37
+ Requires-Dist: urllib3<3.0.0,>=2.8.0; extra == 'crawl'
37
38
  Provides-Extra: dev
38
39
  Requires-Dist: mypy>=1.20; extra == 'dev'
39
40
  Requires-Dist: pre-commit>=3.0; extra == 'dev'
@@ -41,8 +42,10 @@ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
41
42
  Requires-Dist: pytest>=9.0.3; extra == 'dev'
42
43
  Requires-Dist: ruff>=0.4; extra == 'dev'
43
44
  Requires-Dist: types-pyyaml>=6.0; extra == 'dev'
45
+ Requires-Dist: virtualenv<22.0.0,>=21.7.13; extra == 'dev'
44
46
  Provides-Extra: mcp
45
47
  Requires-Dist: mcp<3.0.0,>=2.1.0; extra == 'mcp'
48
+ Requires-Dist: pyjwt<3.0.0,>=2.15.1; extra == 'mcp'
46
49
  Description-Content-Type: text/markdown
47
50
 
48
51
  <div align="center">
@@ -62,11 +65,11 @@ Description-Content-Type: text/markdown
62
65
 
63
66
  [快速上手](docs/getting-started.md) · [Agent 集成](#-agent-集成) · [命令](#-命令) · [排障](docs/troubleshooting.md) · [路线图](ROADMAP.md) · **中文** | [English](README.en.md)
64
67
 
65
- <a href="demo/showcase/boss-agent-cli-showcase.mp4" title="观看完整项目展示视频">
66
- <img src="demo/showcase/boss-agent-cli-showcase.gif" alt="boss-agent-cli 项目展示动图" width="100%">
68
+ <a href="demo/showcase/boss-agent-cli-showcase.mp4" title="观看 48 秒产品发布会动画">
69
+ <img src="demo/showcase/boss-agent-cli-showcase.gif?v=keynote-20261008" alt="boss-agent-cli 极光发布会动画:福利筛选、双角色工作流与 Agent 接入" width="100%">
67
70
  </a>
68
71
 
69
- **[观看完整展示视频](demo/showcase/boss-agent-cli-showcase.mp4)** · [终端交互演示](demo/demo-zh.gif) · schema 驱动 · 福利筛选 · JSON 信封
72
+ **[观看 48 秒发布会动画](demo/showcase/boss-agent-cli-showcase.mp4)** · [交互版](https://can4hou6joeng4.github.io/boss-agent-cli/keynote-animation/) · [终端交互演示](demo/demo-zh.gif) · 福利筛选 · 双角色工作流 · Agent 接入
70
73
 
71
74
  </div>
72
75
 
@@ -82,6 +85,7 @@ boss-agent-cli 把职位发现、福利筛选、本地简历与 AI、投递沟
82
85
 
83
86
  - **职位发现**:关键词搜索 + 8 维筛选,按编号回看缓存结果 —— `search` `show` `detail`
84
87
  - **福利筛选(核心差异化)**:`--welfare "双休,五险一金"` 自动翻页补抓、按 AND 逻辑做**真实匹配**,并可 `--sort score` 按本地匹配分排序 —— `search --welfare`
88
+ - **HR 活跃度筛选**:`--active 3d` 只留最近活跃的 HR,避免把投递次数浪费在长期不上线的岗位上;`online` 只看列表、请求量与普通搜索相同,其余档位可能要逐个查职位详情,更慢、风控风险更高,低风险场景建议用 `--active online` —— `search --active`
85
89
  - **纯终端向导**:直接运行 `boss` 或 `boss wizard`,选择角色、平台和目标;同一 workflow 也可用 `--input-json`、run ID 或 MCP 推进和恢复
86
90
  - **本地候选池与统计**:查看详情后本地保存、读取带有效状态的网页职位收藏并仅同步有效项 / 用标签和备注复盘候选岗位、离线对比、查看漏斗统计 —— `shortlist` `stats` `watch` `preset` `favorites`
87
91
  - **AI 求职增强 + 本地模型**:JD 分析、简历润色、定向优化、候选池匹配、模拟面试、沟通指导;本地模型权重外置,支持 Ollama/vLLM OpenAI 兼容接口 —— `ai analyze-jd` `ai local configure` `ai local smoke`
@@ -104,6 +108,7 @@ boss doctor # 环境自检
104
108
  boss login # 登录(按平台选择链路)
105
109
  boss status # 验证登录态
106
110
  boss search "Golang" --city 广州 --welfare "双休,五险一金" # 搜索 + 福利筛选
111
+ boss search "Golang" --city 广州 --active 3d # 只看 3 日内活跃的 HR
107
112
  boss detail <security_id> # 查看详情
108
113
  boss shortlist add <security_id> <job_id> --tags 后端,远程 # 加入本地候选池并打本地标签
109
114
  boss shortlist compare --tag 远程 # 离线对比候选岗位
@@ -115,7 +120,7 @@ boss hr recommendations --job-id <encJobId>
115
120
  boss hr jobs list
116
121
  ```
117
122
 
118
- 所有命令输出结构化 JSON(`ok` 判断成败,`exit 0/1`)。完整上手见 [快速上手](docs/getting-started.md)。
123
+ 所有命令输出结构化 JSON(`ok` 判断成败,默认 `exit 0/1`;可选 `--exit-codes sysexits` 返回按错误类别区分的语义化退出码)。完整上手见 [快速上手](docs/getting-started.md)。
119
124
 
120
125
  ## 🎭 角色与平台
121
126
 
@@ -233,10 +238,10 @@ CLI (Click)
233
238
  └─ output.py → JSON 信封 → stdout
234
239
  ```
235
240
 
236
- **不变量**:stdout 仅 JSON 信封 · stderr 仅日志 · `exit 0/1` · 错误含 `code/recoverable/recovery_action` · `boss schema` 为能力真源。
241
+ **不变量**:stdout 仅 JSON 信封 · stderr 仅日志 · `exit 0/1`(可选 `--exit-codes sysexits` 语义化退出码) · 错误含 `code/recoverable/recovery_action` · `boss schema` 为能力真源。
237
242
  **双受众提示**:`hints.next_actions` 是给 Agent 执行的后继命令,`hints.operator_actions` 是给真人操作者的自然语言指引(扫码、在浏览器里调整条件等需要离开终端完成的动作);TTY 下只渲染后者到 stderr,Agent 应把它转述给操作者。
238
243
  **命令还是 wizard**:单次、无状态的能力调用走顶层命令;需要跨步骤状态、可恢复、或中途要把指引递给真人的走 `boss wizard`(goal 取值见 `boss schema` 的 `wizard_catalog`)。
239
- **选型**:Python ≥ 3.10 · Click · httpx · patchright / CDP(登录、导出与声明的浏览器 adapter)· cryptography(Fernet)· sqlite3(WAL)· pytest(1600+ 项)。
244
+ **选型**:Python ≥ 3.10 · Click · httpx · patchright / CDP(登录、导出与声明的浏览器 adapter)· cryptography(Fernet)· sqlite3(WAL)· pytest(2900+ 项)。
240
245
 
241
246
  ## 🔌 本地存储
242
247
 
@@ -15,11 +15,11 @@
15
15
 
16
16
  [Getting Started](docs/getting-started.en.md) · [Agent Integration](#-agent-integration) · [Commands](#-commands) · [Troubleshooting](docs/troubleshooting.en.md) · [Roadmap](ROADMAP.en.md) · [中文](README.md) | **English**
17
17
 
18
- <a href="demo/showcase/boss-agent-cli-showcase.mp4" title="Watch the full project showcase video">
19
- <img src="demo/showcase/boss-agent-cli-showcase.gif" alt="boss-agent-cli project showcase animation" width="100%">
18
+ <a href="demo/showcase/boss-agent-cli-showcase.mp4" title="Watch the 48-second product keynote">
19
+ <img src="demo/showcase/boss-agent-cli-showcase.gif?v=keynote-20261008" alt="boss-agent-cli Aurora Keynote: welfare filtering, dual-role workflows and agent integration" width="100%">
20
20
  </a>
21
21
 
22
- **[Watch the full showcase video](demo/showcase/boss-agent-cli-showcase.mp4)** · [terminal demo](demo/demo-en.gif) · schema-driven · welfare filtering · JSON envelope
22
+ **[Watch the 48-second keynote](demo/showcase/boss-agent-cli-showcase.mp4)** · [interactive edition](https://can4hou6joeng4.github.io/boss-agent-cli/keynote-animation/) · [terminal demo](demo/demo-en.gif) · welfare filtering · dual-role workflows · agent integration
23
23
 
24
24
  </div>
25
25
 
@@ -35,6 +35,7 @@ Historical `operating_mode=assisted|research` configuration remains compatible,
35
35
 
36
36
  - **Job discovery**: keyword search + layered filters, with cached `show` navigation — `search` `show` `detail`
37
37
  - **Welfare filtering (the differentiator)**: `--welfare "双休,五险一金"` pages, fetches details, runs **real AND matching**, and can `--sort score` by local match score — `search --welfare`
38
+ - **HR activity filter**: `--active 3d` keeps only jobs whose recruiter was active recently, so you don't spend applications on recruiters who never log in; `online` is list-only with the same request volume as a plain search, while other levels may fetch per-job details and are slower and riskier — prefer `--active online` for low-risk use — `search --active`
38
39
  - **Terminal wizard**: run `boss` or `boss wizard`, select a role, platform, and goal, then resume the same workflow through JSON, run IDs, or MCP
39
40
  - **Local shortlist & stats**: inspect details, read web favorited jobs with validity status and sync only active entries, organize candidates with local tags and notes, compare jobs offline, and see funnel stats — `shortlist` `stats` `watch` `preset` `favorites`
40
41
  - **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`
@@ -57,6 +58,7 @@ boss doctor # environment chec
57
58
  boss login # platform-aware login
58
59
  boss status # verify login
59
60
  boss search "Golang" --city 广州 --welfare "双休,五险一金" # search + welfare filtering
61
+ boss search "Golang" --city 广州 --active 3d # only recruiters active in the last 3 days
60
62
  boss detail <security_id> # view detail
61
63
  boss shortlist add <security_id> <job_id> --tags backend,remote # add to local shortlist with local tags
62
64
  boss shortlist compare --tag remote # compare shortlisted jobs offline
@@ -68,7 +70,7 @@ boss hr recommendations --job-id <encJobId>
68
70
  boss hr jobs list
69
71
  ```
70
72
 
71
- Every command outputs structured JSON (`ok` for success, `exit 0/1`). Full walk-through: [Getting Started](docs/getting-started.en.md).
73
+ Every command outputs structured JSON (`ok` for success, `exit 0/1` by default; the optional `--exit-codes sysexits` returns semantic exit codes per error class). Full walk-through: [Getting Started](docs/getting-started.en.md).
72
74
 
73
75
  ## 🎭 Roles & Platforms
74
76
 
@@ -189,10 +191,10 @@ CLI (Click)
189
191
  └─ output.py → JSON envelope → stdout
190
192
  ```
191
193
 
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.
194
+ **Invariants**: stdout is JSON-only · stderr holds logs · `exit 0/1` (optional `--exit-codes sysexits` for semantic codes) · errors carry `code/recoverable/recovery_action` · `boss schema` is the authoritative capability source.
193
195
  **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.
194
196
  **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`).
195
- **Stack**: Python ≥ 3.10 · Click · httpx · patchright / CDP (login, export, and declared browser adapters) · cryptography · sqlite3 (WAL) · pytest (1600+).
197
+ **Stack**: Python ≥ 3.10 · Click · httpx · patchright / CDP (login, export, and declared browser adapters) · cryptography · sqlite3 (WAL) · pytest (2900+).
196
198
 
197
199
  ## 🔌 Local Storage
198
200