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