hhru-bot 0.1.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.
- hhru_bot-0.1.1/.agents/plugins/marketplace.json +25 -0
- hhru_bot-0.1.1/.claude/settings.json +5 -0
- hhru_bot-0.1.1/.claude-plugin/marketplace.json +29 -0
- hhru_bot-0.1.1/.claude-plugin/plugin.json +21 -0
- hhru_bot-0.1.1/.codex-plugin/plugin.json +36 -0
- hhru_bot-0.1.1/.github/workflows/ci.yml +133 -0
- hhru_bot-0.1.1/.gitignore +39 -0
- hhru_bot-0.1.1/CLAUDE.md +723 -0
- hhru_bot-0.1.1/Dockerfile +14 -0
- hhru_bot-0.1.1/LICENSE +21 -0
- hhru_bot-0.1.1/PKG-INFO +1251 -0
- hhru_bot-0.1.1/README.md +1224 -0
- hhru_bot-0.1.1/commands/hhru.md +63 -0
- hhru_bot-0.1.1/config/config.example.yaml +236 -0
- hhru_bot-0.1.1/deploy/com.hhru.bot.apply.plist +75 -0
- hhru_bot-0.1.1/deploy/com.hhru.bot.bump.plist +64 -0
- hhru_bot-0.1.1/docker-compose.yml +23 -0
- hhru_bot-0.1.1/docs/cli-spec.md +1221 -0
- hhru_bot-0.1.1/docs/design/issue-55-write-negotiations.md +505 -0
- hhru_bot-0.1.1/docs/market-recipes.md +312 -0
- hhru_bot-0.1.1/docs/portfolio-evidence.md +20 -0
- hhru_bot-0.1.1/docs/research/issue-257-live-probe.md +100 -0
- hhru_bot-0.1.1/docs/research/issue-265-cefr-live-probe.md +87 -0
- hhru_bot-0.1.1/docs/research/issue-335-semernyakov-diff-audit.md +65 -0
- hhru_bot-0.1.1/docs/research/issue-567-profile-hydration.md +72 -0
- hhru_bot-0.1.1/docs/research/issue-84-references.md +133 -0
- hhru_bot-0.1.1/docs/research/reference-audit-full-sweep.md +239 -0
- hhru_bot-0.1.1/docs/research/reference-selector-diff-audit.md +366 -0
- hhru_bot-0.1.1/docs/testing.md +122 -0
- hhru_bot-0.1.1/pyproject.toml +77 -0
- hhru_bot-0.1.1/requirements.txt +5 -0
- hhru_bot-0.1.1/scripts/check_pytest_budget.py +72 -0
- hhru_bot-0.1.1/scripts/crontab.example +9 -0
- hhru_bot-0.1.1/scripts/gen_cli_docs.py +153 -0
- hhru_bot-0.1.1/scripts/live_test.sh +7 -0
- hhru_bot-0.1.1/scripts/live_test_safe.sh +3 -0
- hhru_bot-0.1.1/scripts/manual_ai_live_check.py +76 -0
- hhru_bot-0.1.1/scripts/run.sh +4 -0
- hhru_bot-0.1.1/scripts/scheduled_run.sh +106 -0
- hhru_bot-0.1.1/setup.cfg +4 -0
- hhru_bot-0.1.1/skills/hhru/SKILL.md +194 -0
- hhru_bot-0.1.1/skills/hhru-apply/SKILL.md +84 -0
- hhru_bot-0.1.1/skills/hhru-market/SKILL.md +62 -0
- hhru_bot-0.1.1/skills/hhru-monitor/SKILL.md +70 -0
- hhru_bot-0.1.1/src/hhru_bot/__init__.py +58 -0
- hhru_bot-0.1.1/src/hhru_bot/_version.py +104 -0
- hhru_bot-0.1.1/src/hhru_bot/about.py +231 -0
- hhru_bot-0.1.1/src/hhru_bot/account_profile.py +97 -0
- hhru_bot-0.1.1/src/hhru_bot/accounts.py +62 -0
- hhru_bot-0.1.1/src/hhru_bot/adaptive_metrics.py +136 -0
- hhru_bot-0.1.1/src/hhru_bot/adaptive_resume.py +351 -0
- hhru_bot-0.1.1/src/hhru_bot/adaptive_resume_apply.py +206 -0
- hhru_bot-0.1.1/src/hhru_bot/ai/__init__.py +29 -0
- hhru_bot-0.1.1/src/hhru_bot/ai/feedback.py +57 -0
- hhru_bot-0.1.1/src/hhru_bot/ai/letters.py +188 -0
- hhru_bot-0.1.1/src/hhru_bot/ai/llm_client.py +184 -0
- hhru_bot-0.1.1/src/hhru_bot/ai/questions.py +288 -0
- hhru_bot-0.1.1/src/hhru_bot/ai/runtime_provider.py +43 -0
- hhru_bot-0.1.1/src/hhru_bot/ai/types.py +115 -0
- hhru_bot-0.1.1/src/hhru_bot/apply/__init__.py +30 -0
- hhru_bot-0.1.1/src/hhru_bot/apply/antibot.py +109 -0
- hhru_bot-0.1.1/src/hhru_bot/apply/blockers.py +170 -0
- hhru_bot-0.1.1/src/hhru_bot/apply/dedup.py +80 -0
- hhru_bot-0.1.1/src/hhru_bot/apply/letter.py +160 -0
- hhru_bot-0.1.1/src/hhru_bot/apply/locators.py +30 -0
- hhru_bot-0.1.1/src/hhru_bot/apply/pipeline.py +735 -0
- hhru_bot-0.1.1/src/hhru_bot/apply/probe.py +322 -0
- hhru_bot-0.1.1/src/hhru_bot/apply/questionnaire.py +203 -0
- hhru_bot-0.1.1/src/hhru_bot/apply/questions.py +245 -0
- hhru_bot-0.1.1/src/hhru_bot/apply/router.py +185 -0
- hhru_bot-0.1.1/src/hhru_bot/apply/steps.py +573 -0
- hhru_bot-0.1.1/src/hhru_bot/apply/success.py +154 -0
- hhru_bot-0.1.1/src/hhru_bot/apply/verdict.py +84 -0
- hhru_bot-0.1.1/src/hhru_bot/apply/verify.py +549 -0
- hhru_bot-0.1.1/src/hhru_bot/auth.py +128 -0
- hhru_bot-0.1.1/src/hhru_bot/auth_code.py +171 -0
- hhru_bot-0.1.1/src/hhru_bot/backup.py +423 -0
- hhru_bot-0.1.1/src/hhru_bot/blacklist.py +24 -0
- hhru_bot-0.1.1/src/hhru_bot/browser.py +839 -0
- hhru_bot-0.1.1/src/hhru_bot/bump.py +133 -0
- hhru_bot-0.1.1/src/hhru_bot/catalog_preflight.py +119 -0
- hhru_bot-0.1.1/src/hhru_bot/cli.py +490 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/__init__.py +8 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/_audit.py +38 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/_common.py +1509 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/_common_resume_guidance.py +42 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/_professional_role_guidance.py +33 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/_wizard_next_guidance.py +36 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/about.py +113 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/account.py +405 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/adaptive_report.py +27 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/adaptive_resume.py +184 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/apply.py +242 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/backup.py +45 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/blacklist.py +34 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/bump.py +118 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/calendar.py +94 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/call_api.py +106 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/census.py +56 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/clear_negotiations.py +478 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/clear_skipped.py +70 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/common.py +263 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/competitors.py +784 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/config_cmd.py +173 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/copy_resume.py +522 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/create_resume.py +227 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/delete_education_entry.py +176 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/delete_photo.py +162 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/delete_resume.py +113 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/diagnostics.py +187 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/edit_education.py +262 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/edit_experience.py +390 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/edit_languages.py +211 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/edit_skills.py +223 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/fill_form.py +93 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/funnel.py +128 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/import_cookies.py +71 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/learn.py +36 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/list_resumes.py +298 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/log_cmd.py +457 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/login.py +22 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/login_code.py +31 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/mark.py +79 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/market.py +43 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/probe.py +1192 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/professional_roles.py +120 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/profile.py +63 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/publish_resume.py +122 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/query.py +281 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/questionnaire.py +685 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/refresh_token.py +61 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/reject.py +41 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/rename_resume.py +102 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/reply_employers.py +567 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/report_vacancy.py +157 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/responses.py +448 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/resume_pool.py +272 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/resume_position.py +587 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/resume_sections.py +165 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/resume_views.py +153 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/resume_visibility.py +203 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/review.py +61 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/robot_queue.py +23 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/run.py +39 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/schedule.py +365 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/search.py +237 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/select_photo.py +130 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/settings.py +63 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/skipped.py +33 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/stats.py +106 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/uncertain.py +61 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/update.py +88 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/upload_photo.py +115 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/whoami.py +153 -0
- hhru_bot-0.1.1/src/hhru_bot/commands/wizard_next.py +177 -0
- hhru_bot-0.1.1/src/hhru_bot/common.py +770 -0
- hhru_bot-0.1.1/src/hhru_bot/competitor_workers.py +237 -0
- hhru_bot-0.1.1/src/hhru_bot/competitors.py +759 -0
- hhru_bot-0.1.1/src/hhru_bot/config.py +317 -0
- hhru_bot-0.1.1/src/hhru_bot/config_sections/__init__.py +24 -0
- hhru_bot-0.1.1/src/hhru_bot/config_sections/_registry.py +40 -0
- hhru_bot-0.1.1/src/hhru_bot/config_sections/_validation.py +9 -0
- hhru_bot-0.1.1/src/hhru_bot/config_sections/account.py +61 -0
- hhru_bot-0.1.1/src/hhru_bot/config_sections/ai.py +83 -0
- hhru_bot-0.1.1/src/hhru_bot/config_sections/ai_profile.py +83 -0
- hhru_bot-0.1.1/src/hhru_bot/config_sections/candidate_facts.py +163 -0
- hhru_bot-0.1.1/src/hhru_bot/config_sections/cluster.py +39 -0
- hhru_bot-0.1.1/src/hhru_bot/config_sections/education.py +74 -0
- hhru_bot-0.1.1/src/hhru_bot/config_sections/questionnaires.py +82 -0
- hhru_bot-0.1.1/src/hhru_bot/config_sections/resume_sections.py +46 -0
- hhru_bot-0.1.1/src/hhru_bot/config_sections/scoring.py +149 -0
- hhru_bot-0.1.1/src/hhru_bot/config_sections/search.py +30 -0
- hhru_bot-0.1.1/src/hhru_bot/cookie_import.py +247 -0
- hhru_bot-0.1.1/src/hhru_bot/copy_resume.py +816 -0
- hhru_bot-0.1.1/src/hhru_bot/create_resume.py +1034 -0
- hhru_bot-0.1.1/src/hhru_bot/delete_photo.py +401 -0
- hhru_bot-0.1.1/src/hhru_bot/delete_resume.py +268 -0
- hhru_bot-0.1.1/src/hhru_bot/diagnostics.py +218 -0
- hhru_bot-0.1.1/src/hhru_bot/exit_codes.py +21 -0
- hhru_bot-0.1.1/src/hhru_bot/experience.py +1633 -0
- hhru_bot-0.1.1/src/hhru_bot/external_forms/__init__.py +5 -0
- hhru_bot-0.1.1/src/hhru_bot/external_forms/detect.py +294 -0
- hhru_bot-0.1.1/src/hhru_bot/google_calendar.py +135 -0
- hhru_bot-0.1.1/src/hhru_bot/history.py +5325 -0
- hhru_bot-0.1.1/src/hhru_bot/languages.py +348 -0
- hhru_bot-0.1.1/src/hhru_bot/logging_setup.py +146 -0
- hhru_bot-0.1.1/src/hhru_bot/negotiations_chat.py +396 -0
- hhru_bot-0.1.1/src/hhru_bot/negotiations_probe.py +245 -0
- hhru_bot-0.1.1/src/hhru_bot/portfolio_evidence.py +147 -0
- hhru_bot-0.1.1/src/hhru_bot/professional_roles.py +771 -0
- hhru_bot-0.1.1/src/hhru_bot/provenance.py +363 -0
- hhru_bot-0.1.1/src/hhru_bot/publish_resume.py +244 -0
- hhru_bot-0.1.1/src/hhru_bot/questionnaires/__init__.py +63 -0
- hhru_bot-0.1.1/src/hhru_bot/questionnaires/answerer.py +355 -0
- hhru_bot-0.1.1/src/hhru_bot/questionnaires/resolver.py +424 -0
- hhru_bot-0.1.1/src/hhru_bot/questionnaires/templates.py +426 -0
- hhru_bot-0.1.1/src/hhru_bot/rename_resume.py +47 -0
- hhru_bot-0.1.1/src/hhru_bot/reply_suggestions.py +65 -0
- hhru_bot-0.1.1/src/hhru_bot/report.py +196 -0
- hhru_bot-0.1.1/src/hhru_bot/report_adaptive.py +50 -0
- hhru_bot-0.1.1/src/hhru_bot/report_funnel.py +185 -0
- hhru_bot-0.1.1/src/hhru_bot/report_market.py +123 -0
- hhru_bot-0.1.1/src/hhru_bot/report_skipped.py +29 -0
- hhru_bot-0.1.1/src/hhru_bot/report_vacancy.py +270 -0
- hhru_bot-0.1.1/src/hhru_bot/responses.py +633 -0
- hhru_bot-0.1.1/src/hhru_bot/resume_clusters.py +121 -0
- hhru_bot-0.1.1/src/hhru_bot/resume_education.py +1096 -0
- hhru_bot-0.1.1/src/hhru_bot/resume_ids.py +120 -0
- hhru_bot-0.1.1/src/hhru_bot/resume_limits.py +20 -0
- hhru_bot-0.1.1/src/hhru_bot/resume_photo.py +1055 -0
- hhru_bot-0.1.1/src/hhru_bot/resume_pool.py +86 -0
- hhru_bot-0.1.1/src/hhru_bot/resume_position.py +1390 -0
- hhru_bot-0.1.1/src/hhru_bot/resume_sections.py +397 -0
- hhru_bot-0.1.1/src/hhru_bot/resume_state.py +140 -0
- hhru_bot-0.1.1/src/hhru_bot/resume_titles.py +141 -0
- hhru_bot-0.1.1/src/hhru_bot/resume_views.py +140 -0
- hhru_bot-0.1.1/src/hhru_bot/resume_visibility.py +591 -0
- hhru_bot-0.1.1/src/hhru_bot/resume_wizard.py +290 -0
- hhru_bot-0.1.1/src/hhru_bot/scoring/__init__.py +43 -0
- hhru_bot-0.1.1/src/hhru_bot/scoring/employer.py +212 -0
- hhru_bot-0.1.1/src/hhru_bot/scoring/letter_match.py +125 -0
- hhru_bot-0.1.1/src/hhru_bot/scoring/prefilter.py +80 -0
- hhru_bot-0.1.1/src/hhru_bot/scoring/resume_match.py +440 -0
- hhru_bot-0.1.1/src/hhru_bot/scoring/types.py +66 -0
- hhru_bot-0.1.1/src/hhru_bot/scoring/vacancy.py +331 -0
- hhru_bot-0.1.1/src/hhru_bot/search.py +1208 -0
- hhru_bot-0.1.1/src/hhru_bot/selector_groups/__init__.py +10 -0
- hhru_bot-0.1.1/src/hhru_bot/selector_groups/_generated.py +319 -0
- hhru_bot-0.1.1/src/hhru_bot/selector_groups/account_profile.py +65 -0
- hhru_bot-0.1.1/src/hhru_bot/selector_groups/apply_form.py +110 -0
- hhru_bot-0.1.1/src/hhru_bot/selector_groups/competitor_resume.py +25 -0
- hhru_bot-0.1.1/src/hhru_bot/selector_groups/login.py +11 -0
- hhru_bot-0.1.1/src/hhru_bot/selector_groups/negotiations.py +83 -0
- hhru_bot-0.1.1/src/hhru_bot/selector_groups/resume_experience.py +337 -0
- hhru_bot-0.1.1/src/hhru_bot/selector_groups/resume_list.py +59 -0
- hhru_bot-0.1.1/src/hhru_bot/selector_groups/resume_page.py +204 -0
- hhru_bot-0.1.1/src/hhru_bot/selector_groups/resume_photo.py +219 -0
- hhru_bot-0.1.1/src/hhru_bot/selector_groups/resume_rename.py +13 -0
- hhru_bot-0.1.1/src/hhru_bot/selector_groups/resume_visibility.py +102 -0
- hhru_bot-0.1.1/src/hhru_bot/selector_groups/search_page.py +81 -0
- hhru_bot-0.1.1/src/hhru_bot/selector_groups/vacancy_complain.py +74 -0
- hhru_bot-0.1.1/src/hhru_bot/selector_groups/vacancy_page.py +34 -0
- hhru_bot-0.1.1/src/hhru_bot/selectors.py +105 -0
- hhru_bot-0.1.1/src/hhru_bot/session_security.py +166 -0
- hhru_bot-0.1.1/src/hhru_bot/skill_gaps.py +61 -0
- hhru_bot-0.1.1/src/hhru_bot/skills.py +571 -0
- hhru_bot-0.1.1/src/hhru_bot/throttle.py +73 -0
- hhru_bot-0.1.1/src/hhru_bot/transient_overlays.py +131 -0
- hhru_bot-0.1.1/src/hhru_bot/update.py +620 -0
- hhru_bot-0.1.1/src/hhru_bot/vacancy_refresh.py +99 -0
- hhru_bot-0.1.1/src/hhru_bot/write_lock.py +62 -0
- hhru_bot-0.1.1/src/hhru_bot.egg-info/PKG-INFO +1251 -0
- hhru_bot-0.1.1/src/hhru_bot.egg-info/SOURCES.txt +483 -0
- hhru_bot-0.1.1/src/hhru_bot.egg-info/dependency_links.txt +1 -0
- hhru_bot-0.1.1/src/hhru_bot.egg-info/entry_points.txt +3 -0
- hhru_bot-0.1.1/src/hhru_bot.egg-info/requires.txt +19 -0
- hhru_bot-0.1.1/src/hhru_bot.egg-info/top_level.txt +2 -0
- hhru_bot-0.1.1/tests/_fakes.py +251 -0
- hhru_bot-0.1.1/tests/conftest.py +181 -0
- hhru_bot-0.1.1/tests/fixtures/vacancy_card_no_salary.html +20 -0
- hhru_bot-0.1.1/tests/fixtures/vacancy_card_salary_usd.html +24 -0
- hhru_bot-0.1.1/tests/fixtures/vacancy_card_text_only_salary.html +36 -0
- hhru_bot-0.1.1/tests/fixtures/vacancy_card_text_only_salary.txt +6 -0
- hhru_bot-0.1.1/tests/fixtures/vacancy_card_with_rating.html +44 -0
- hhru_bot-0.1.1/tests/fixtures/vacancy_card_with_salary.html +35 -0
- hhru_bot-0.1.1/tests/packaging_smoke.py +71 -0
- hhru_bot-0.1.1/tests/test_about.py +388 -0
- hhru_bot-0.1.1/tests/test_account_command.py +186 -0
- hhru_bot-0.1.1/tests/test_account_delete.py +189 -0
- hhru_bot-0.1.1/tests/test_account_profile.py +58 -0
- hhru_bot-0.1.1/tests/test_account_profile_login.py +124 -0
- hhru_bot-0.1.1/tests/test_account_write_lock_isolation.py +108 -0
- hhru_bot-0.1.1/tests/test_accounts.py +99 -0
- hhru_bot-0.1.1/tests/test_adaptive_metrics.py +60 -0
- hhru_bot-0.1.1/tests/test_adaptive_resume.py +226 -0
- hhru_bot-0.1.1/tests/test_adaptive_resume_apply.py +203 -0
- hhru_bot-0.1.1/tests/test_adaptive_resume_command.py +179 -0
- hhru_bot-0.1.1/tests/test_ai_config.py +179 -0
- hhru_bot-0.1.1/tests/test_ai_feedback.py +91 -0
- hhru_bot-0.1.1/tests/test_ai_hermes_transport.py +251 -0
- hhru_bot-0.1.1/tests/test_ai_live_transport.py +133 -0
- hhru_bot-0.1.1/tests/test_ai_questions.py +157 -0
- hhru_bot-0.1.1/tests/test_ai_questions_extract.py +341 -0
- hhru_bot-0.1.1/tests/test_ai_runtime_provider.py +30 -0
- hhru_bot-0.1.1/tests/test_apply_antibot.py +127 -0
- hhru_bot-0.1.1/tests/test_apply_audit.py +508 -0
- hhru_bot-0.1.1/tests/test_apply_blockers.py +275 -0
- hhru_bot-0.1.1/tests/test_apply_letter.py +283 -0
- hhru_bot-0.1.1/tests/test_apply_letter_integration.py +271 -0
- hhru_bot-0.1.1/tests/test_apply_limit.py +591 -0
- hhru_bot-0.1.1/tests/test_apply_pipeline.py +1497 -0
- hhru_bot-0.1.1/tests/test_apply_placeholder.py +172 -0
- hhru_bot-0.1.1/tests/test_apply_plan.py +151 -0
- hhru_bot-0.1.1/tests/test_apply_probe.py +562 -0
- hhru_bot-0.1.1/tests/test_apply_progress.py +74 -0
- hhru_bot-0.1.1/tests/test_apply_questions.py +546 -0
- hhru_bot-0.1.1/tests/test_apply_router.py +61 -0
- hhru_bot-0.1.1/tests/test_apply_scoring_integration.py +221 -0
- hhru_bot-0.1.1/tests/test_apply_steps.py +1082 -0
- hhru_bot-0.1.1/tests/test_apply_success.py +295 -0
- hhru_bot-0.1.1/tests/test_apply_verify.py +1067 -0
- hhru_bot-0.1.1/tests/test_audit_launch_and_navigation.py +377 -0
- hhru_bot-0.1.1/tests/test_auth.py +118 -0
- hhru_bot-0.1.1/tests/test_auth_code.py +232 -0
- hhru_bot-0.1.1/tests/test_backup.py +287 -0
- hhru_bot-0.1.1/tests/test_browser_navigation.py +805 -0
- hhru_bot-0.1.1/tests/test_bump.py +264 -0
- hhru_bot-0.1.1/tests/test_bump_command_runs.py +153 -0
- hhru_bot-0.1.1/tests/test_call_api.py +96 -0
- hhru_bot-0.1.1/tests/test_candidate_facts.py +337 -0
- hhru_bot-0.1.1/tests/test_catalog_preflight.py +161 -0
- hhru_bot-0.1.1/tests/test_check_hh_connectivity.py +65 -0
- hhru_bot-0.1.1/tests/test_ci_selector_gate.py +100 -0
- hhru_bot-0.1.1/tests/test_clear_negotiations_command.py +658 -0
- hhru_bot-0.1.1/tests/test_clear_skipped_command.py +114 -0
- hhru_bot-0.1.1/tests/test_cli_commands.py +844 -0
- hhru_bot-0.1.1/tests/test_cli_honesty_audit.py +102 -0
- hhru_bot-0.1.1/tests/test_command_audit.py +37 -0
- hhru_bot-0.1.1/tests/test_common.py +1114 -0
- hhru_bot-0.1.1/tests/test_common_run_context.py +325 -0
- hhru_bot-0.1.1/tests/test_competitors.py +589 -0
- hhru_bot-0.1.1/tests/test_competitors_command.py +806 -0
- hhru_bot-0.1.1/tests/test_config.py +766 -0
- hhru_bot-0.1.1/tests/test_config_command.py +140 -0
- hhru_bot-0.1.1/tests/test_config_scoring_warning.py +96 -0
- hhru_bot-0.1.1/tests/test_cookie_import.py +510 -0
- hhru_bot-0.1.1/tests/test_copy_resume_browser.py +855 -0
- hhru_bot-0.1.1/tests/test_copy_resume_command.py +869 -0
- hhru_bot-0.1.1/tests/test_create_resume.py +105 -0
- hhru_bot-0.1.1/tests/test_create_resume_browser.py +2066 -0
- hhru_bot-0.1.1/tests/test_create_resume_command.py +405 -0
- hhru_bot-0.1.1/tests/test_delete_education_entry_browser.py +478 -0
- hhru_bot-0.1.1/tests/test_delete_education_entry_command.py +253 -0
- hhru_bot-0.1.1/tests/test_delete_photo.py +497 -0
- hhru_bot-0.1.1/tests/test_delete_photo_command.py +146 -0
- hhru_bot-0.1.1/tests/test_delete_resume_browser.py +333 -0
- hhru_bot-0.1.1/tests/test_delete_resume_command.py +164 -0
- hhru_bot-0.1.1/tests/test_diagnostics.py +189 -0
- hhru_bot-0.1.1/tests/test_docker_compose.py +29 -0
- hhru_bot-0.1.1/tests/test_edit_skills_command.py +283 -0
- hhru_bot-0.1.1/tests/test_experience.py +2075 -0
- hhru_bot-0.1.1/tests/test_experience_panel_reconcile.py +253 -0
- hhru_bot-0.1.1/tests/test_external_forms_detect.py +258 -0
- hhru_bot-0.1.1/tests/test_fill_form.py +334 -0
- hhru_bot-0.1.1/tests/test_funnel_command.py +184 -0
- hhru_bot-0.1.1/tests/test_google_calendar.py +38 -0
- hhru_bot-0.1.1/tests/test_hhru_live_behavior.py +385 -0
- hhru_bot-0.1.1/tests/test_history_competitors.py +891 -0
- hhru_bot-0.1.1/tests/test_history_created_at_format.py +189 -0
- hhru_bot-0.1.1/tests/test_history_estimate_salary.py +165 -0
- hhru_bot-0.1.1/tests/test_history_funnel.py +634 -0
- hhru_bot-0.1.1/tests/test_history_key_consistency.py +193 -0
- hhru_bot-0.1.1/tests/test_history_market.py +793 -0
- hhru_bot-0.1.1/tests/test_history_questionnaires.py +365 -0
- hhru_bot-0.1.1/tests/test_history_replies.py +580 -0
- hhru_bot-0.1.1/tests/test_history_schema.py +506 -0
- hhru_bot-0.1.1/tests/test_history_skipped.py +194 -0
- hhru_bot-0.1.1/tests/test_history_stats.py +149 -0
- hhru_bot-0.1.1/tests/test_import_cookies_command.py +94 -0
- hhru_bot-0.1.1/tests/test_languages.py +591 -0
- hhru_bot-0.1.1/tests/test_letter_fewshot.py +187 -0
- hhru_bot-0.1.1/tests/test_letter_randomize.py +180 -0
- hhru_bot-0.1.1/tests/test_list_resume_cards.py +476 -0
- hhru_bot-0.1.1/tests/test_list_resumes_command.py +615 -0
- hhru_bot-0.1.1/tests/test_live_browser_guard.py +260 -0
- hhru_bot-0.1.1/tests/test_live_test_script.py +45 -0
- hhru_bot-0.1.1/tests/test_log_command.py +605 -0
- hhru_bot-0.1.1/tests/test_logging_setup.py +178 -0
- hhru_bot-0.1.1/tests/test_login_import_cookies_account_isolation.py +162 -0
- hhru_bot-0.1.1/tests/test_manual_input_commands.py +678 -0
- hhru_bot-0.1.1/tests/test_mark_command.py +93 -0
- hhru_bot-0.1.1/tests/test_markers.py +52 -0
- hhru_bot-0.1.1/tests/test_market_bounds.py +532 -0
- hhru_bot-0.1.1/tests/test_market_currency.py +217 -0
- hhru_bot-0.1.1/tests/test_multi_account_isolation.py +198 -0
- hhru_bot-0.1.1/tests/test_negotiations_chat.py +299 -0
- hhru_bot-0.1.1/tests/test_negotiations_probe.py +143 -0
- hhru_bot-0.1.1/tests/test_no_hardcoded_resume_ids.py +112 -0
- hhru_bot-0.1.1/tests/test_no_page_request.py +29 -0
- hhru_bot-0.1.1/tests/test_page_state.py +368 -0
- hhru_bot-0.1.1/tests/test_playwright_fakes_contract.py +187 -0
- hhru_bot-0.1.1/tests/test_plugin_metadata.py +107 -0
- hhru_bot-0.1.1/tests/test_plugin_packaging.py +96 -0
- hhru_bot-0.1.1/tests/test_plugin_refs.py +85 -0
- hhru_bot-0.1.1/tests/test_portfolio_evidence.py +118 -0
- hhru_bot-0.1.1/tests/test_probe_command.py +100 -0
- hhru_bot-0.1.1/tests/test_probe_gitignore.py +39 -0
- hhru_bot-0.1.1/tests/test_probe_healthcheck.py +557 -0
- hhru_bot-0.1.1/tests/test_probe_letter_integration.py +180 -0
- hhru_bot-0.1.1/tests/test_professional_roles.py +608 -0
- hhru_bot-0.1.1/tests/test_professional_roles_command.py +132 -0
- hhru_bot-0.1.1/tests/test_profile_command.py +62 -0
- hhru_bot-0.1.1/tests/test_provenance.py +197 -0
- hhru_bot-0.1.1/tests/test_publish_resume.py +327 -0
- hhru_bot-0.1.1/tests/test_publish_resume_command.py +282 -0
- hhru_bot-0.1.1/tests/test_pytest_budget.py +107 -0
- hhru_bot-0.1.1/tests/test_query_command.py +440 -0
- hhru_bot-0.1.1/tests/test_questionnaire_answerer.py +552 -0
- hhru_bot-0.1.1/tests/test_questionnaire_bulk.py +1096 -0
- hhru_bot-0.1.1/tests/test_questionnaire_cli.py +1300 -0
- hhru_bot-0.1.1/tests/test_questionnaire_resolver.py +983 -0
- hhru_bot-0.1.1/tests/test_questionnaire_templates_history.py +427 -0
- hhru_bot-0.1.1/tests/test_refresh_token_command.py +124 -0
- hhru_bot-0.1.1/tests/test_reject_feedback.py +67 -0
- hhru_bot-0.1.1/tests/test_release_packaging.py +74 -0
- hhru_bot-0.1.1/tests/test_reliability_bundle.py +358 -0
- hhru_bot-0.1.1/tests/test_reply_employers_command.py +1022 -0
- hhru_bot-0.1.1/tests/test_report_funnel.py +156 -0
- hhru_bot-0.1.1/tests/test_report_market.py +156 -0
- hhru_bot-0.1.1/tests/test_report_stats.py +183 -0
- hhru_bot-0.1.1/tests/test_report_vacancy_browser.py +192 -0
- hhru_bot-0.1.1/tests/test_report_vacancy_command.py +115 -0
- hhru_bot-0.1.1/tests/test_responses_command.py +651 -0
- hhru_bot-0.1.1/tests/test_responses_history.py +286 -0
- hhru_bot-0.1.1/tests/test_responses_pagination.py +186 -0
- hhru_bot-0.1.1/tests/test_responses_parser.py +415 -0
- hhru_bot-0.1.1/tests/test_responses_ssr_topic_mapping.py +564 -0
- hhru_bot-0.1.1/tests/test_resume_cluster_config.py +75 -0
- hhru_bot-0.1.1/tests/test_resume_clusters.py +53 -0
- hhru_bot-0.1.1/tests/test_resume_edit_command_runs.py +1539 -0
- hhru_bot-0.1.1/tests/test_resume_education.py +63 -0
- hhru_bot-0.1.1/tests/test_resume_education_additional_direct.py +215 -0
- hhru_bot-0.1.1/tests/test_resume_education_edit_block.py +397 -0
- hhru_bot-0.1.1/tests/test_resume_education_fill_reset.py +86 -0
- hhru_bot-0.1.1/tests/test_resume_education_form_shapes.py +183 -0
- hhru_bot-0.1.1/tests/test_resume_education_hydration_wait.py +165 -0
- hhru_bot-0.1.1/tests/test_resume_education_primary_route.py +47 -0
- hhru_bot-0.1.1/tests/test_resume_error_banner.py +295 -0
- hhru_bot-0.1.1/tests/test_resume_error_banner_live.py +129 -0
- hhru_bot-0.1.1/tests/test_resume_id_addressing.py +273 -0
- hhru_bot-0.1.1/tests/test_resume_ids.py +200 -0
- hhru_bot-0.1.1/tests/test_resume_limits.py +35 -0
- hhru_bot-0.1.1/tests/test_resume_pool.py +82 -0
- hhru_bot-0.1.1/tests/test_resume_pool_command.py +308 -0
- hhru_bot-0.1.1/tests/test_resume_position.py +1670 -0
- hhru_bot-0.1.1/tests/test_resume_position_catalog_fixture.py +186 -0
- hhru_bot-0.1.1/tests/test_resume_position_command.py +438 -0
- hhru_bot-0.1.1/tests/test_resume_position_empty_state_live.py +142 -0
- hhru_bot-0.1.1/tests/test_resume_position_gate.py +23 -0
- hhru_bot-0.1.1/tests/test_resume_position_title_source.py +83 -0
- hhru_bot-0.1.1/tests/test_resume_position_wizard_direct.py +196 -0
- hhru_bot-0.1.1/tests/test_resume_position_wizard_direct_fixture.py +145 -0
- hhru_bot-0.1.1/tests/test_resume_sections.py +592 -0
- hhru_bot-0.1.1/tests/test_resume_sections_apply.py +169 -0
- hhru_bot-0.1.1/tests/test_resume_sections_recommendation_route.py +40 -0
- hhru_bot-0.1.1/tests/test_resume_titles.py +265 -0
- hhru_bot-0.1.1/tests/test_resume_views.py +173 -0
- hhru_bot-0.1.1/tests/test_resume_visibility.py +692 -0
- hhru_bot-0.1.1/tests/test_resume_visibility_command.py +226 -0
- hhru_bot-0.1.1/tests/test_resume_visibility_dom_fixture.py +125 -0
- hhru_bot-0.1.1/tests/test_resume_wizard.py +393 -0
- hhru_bot-0.1.1/tests/test_salary_parse.py +181 -0
- hhru_bot-0.1.1/tests/test_sandbox_preflight.py +199 -0
- hhru_bot-0.1.1/tests/test_schedule_command.py +308 -0
- hhru_bot-0.1.1/tests/test_schema.py +82 -0
- hhru_bot-0.1.1/tests/test_scoring.py +331 -0
- hhru_bot-0.1.1/tests/test_scoring_letter_match.py +131 -0
- hhru_bot-0.1.1/tests/test_scoring_ml.py +581 -0
- hhru_bot-0.1.1/tests/test_scoring_prefilter.py +429 -0
- hhru_bot-0.1.1/tests/test_scoring_resume_match.py +449 -0
- hhru_bot-0.1.1/tests/test_search.py +673 -0
- hhru_bot-0.1.1/tests/test_search_command_output.py +411 -0
- hhru_bot-0.1.1/tests/test_search_extra_fields.py +254 -0
- hhru_bot-0.1.1/tests/test_search_pagination.py +125 -0
- hhru_bot-0.1.1/tests/test_search_publication_time.py +134 -0
- hhru_bot-0.1.1/tests/test_search_salary_extract.py +227 -0
- hhru_bot-0.1.1/tests/test_select_photo.py +421 -0
- hhru_bot-0.1.1/tests/test_selector_contracts.py +1136 -0
- hhru_bot-0.1.1/tests/test_selector_metrics.py +222 -0
- hhru_bot-0.1.1/tests/test_selectors_shim.py +61 -0
- hhru_bot-0.1.1/tests/test_session_security.py +261 -0
- hhru_bot-0.1.1/tests/test_settings.py +91 -0
- hhru_bot-0.1.1/tests/test_skill_gaps.py +22 -0
- hhru_bot-0.1.1/tests/test_skills.py +1031 -0
- hhru_bot-0.1.1/tests/test_skipped_command.py +39 -0
- hhru_bot-0.1.1/tests/test_stats_command.py +169 -0
- hhru_bot-0.1.1/tests/test_throttle_policy.py +347 -0
- hhru_bot-0.1.1/tests/test_transient_overlays.py +75 -0
- hhru_bot-0.1.1/tests/test_update.py +315 -0
- hhru_bot-0.1.1/tests/test_update_windows.py +134 -0
- hhru_bot-0.1.1/tests/test_upload_photo.py +708 -0
- hhru_bot-0.1.1/tests/test_vacancy_refresh.py +41 -0
- hhru_bot-0.1.1/tests/test_whoami_command.py +315 -0
- hhru_bot-0.1.1/tests/test_wizard_next_command.py +295 -0
- hhru_bot-0.1.1/tests/test_write_lock.py +269 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "hhru",
|
|
3
|
+
"metadata": {
|
|
4
|
+
"version": "0.1.0"
|
|
5
|
+
},
|
|
6
|
+
"interface": {
|
|
7
|
+
"displayName": "HH.ru"
|
|
8
|
+
},
|
|
9
|
+
"plugins": [
|
|
10
|
+
{
|
|
11
|
+
"name": "hhru-cc-plugin",
|
|
12
|
+
"version": "0.1.0",
|
|
13
|
+
"source": {
|
|
14
|
+
"source": "url",
|
|
15
|
+
"url": "https://github.com/axisrow/hhru.git",
|
|
16
|
+
"ref": "v0.1.0"
|
|
17
|
+
},
|
|
18
|
+
"policy": {
|
|
19
|
+
"installation": "AVAILABLE",
|
|
20
|
+
"authentication": "ON_INSTALL"
|
|
21
|
+
},
|
|
22
|
+
"category": "Productivity"
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "hhru",
|
|
3
|
+
"owner": {
|
|
4
|
+
"name": "axisrow"
|
|
5
|
+
},
|
|
6
|
+
"metadata": {
|
|
7
|
+
"description": "Marketplace for the hhru CLI plugin — job search, apply, and resume bump automation for hh.ru.",
|
|
8
|
+
"version": "0.1.1"
|
|
9
|
+
},
|
|
10
|
+
"plugins": [
|
|
11
|
+
{
|
|
12
|
+
"name": "hhru-cc-plugin",
|
|
13
|
+
"source": "./",
|
|
14
|
+
"description": "CLI-инструмент для поиска вакансий, откликов и поднятия резюме на hh.ru (Playwright). Подключает команды hhru-бота как инструменты и скиллы.",
|
|
15
|
+
"version": "0.1.1",
|
|
16
|
+
"author": {
|
|
17
|
+
"name": "axisrow"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"hh.ru",
|
|
21
|
+
"job-search",
|
|
22
|
+
"playwright",
|
|
23
|
+
"cli",
|
|
24
|
+
"vacancies",
|
|
25
|
+
"apply"
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "hhru-cc-plugin",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "CLI-инструмент для поиска вакансий, откликов и поднятия резюме на hh.ru (Playwright). Подключает команды hhru-бота как инструменты и скиллы для Claude Code.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "axisrow"
|
|
7
|
+
},
|
|
8
|
+
"homepage": "https://github.com/axisrow/hhru",
|
|
9
|
+
"repository": "https://github.com/axisrow/hhru",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"keywords": [
|
|
12
|
+
"hh.ru",
|
|
13
|
+
"job-search",
|
|
14
|
+
"playwright",
|
|
15
|
+
"cli",
|
|
16
|
+
"vacancies",
|
|
17
|
+
"apply"
|
|
18
|
+
],
|
|
19
|
+
"commands": "./commands",
|
|
20
|
+
"skills": "./skills"
|
|
21
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "hhru-cc-plugin",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Safe hh.ru job-search workflows powered by the hhru CLI.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "axisrow"
|
|
7
|
+
},
|
|
8
|
+
"homepage": "https://github.com/axisrow/hhru",
|
|
9
|
+
"repository": "https://github.com/axisrow/hhru",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"keywords": [
|
|
12
|
+
"hh.ru",
|
|
13
|
+
"job-search",
|
|
14
|
+
"playwright",
|
|
15
|
+
"cli",
|
|
16
|
+
"vacancies",
|
|
17
|
+
"apply"
|
|
18
|
+
],
|
|
19
|
+
"skills": "./skills/",
|
|
20
|
+
"interface": {
|
|
21
|
+
"displayName": "HH.ru",
|
|
22
|
+
"shortDescription": "Safe hh.ru job-search workflows",
|
|
23
|
+
"longDescription": "Search vacancies, monitor responses, and run confirmation-gated hh.ru application workflows through the hhru CLI.",
|
|
24
|
+
"developerName": "axisrow",
|
|
25
|
+
"category": "Productivity",
|
|
26
|
+
"capabilities": [
|
|
27
|
+
"Read",
|
|
28
|
+
"Write"
|
|
29
|
+
],
|
|
30
|
+
"websiteURL": "https://github.com/axisrow/hhru",
|
|
31
|
+
"defaultPrompt": [
|
|
32
|
+
"Use HH.ru to check my application status.",
|
|
33
|
+
"Use HH.ru to find relevant vacancies without applying."
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
name: ci
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
tags: ["v*"]
|
|
7
|
+
pull_request:
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
lint-test:
|
|
11
|
+
strategy:
|
|
12
|
+
matrix:
|
|
13
|
+
os: [ubuntu-latest, windows-latest]
|
|
14
|
+
runs-on: ${{ matrix.os }}
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
|
|
18
|
+
- name: Set up Python
|
|
19
|
+
uses: actions/setup-python@v5
|
|
20
|
+
with:
|
|
21
|
+
python-version: "3.12"
|
|
22
|
+
cache: pip
|
|
23
|
+
|
|
24
|
+
- name: Install dependencies
|
|
25
|
+
run: |
|
|
26
|
+
python -m pip install --upgrade pip
|
|
27
|
+
pip install -r requirements.txt
|
|
28
|
+
pip install jsonschema ruff pytest pytest-xdist
|
|
29
|
+
- name: Install Chromium (Linux)
|
|
30
|
+
if: runner.os == 'Linux'
|
|
31
|
+
run: python -m playwright install --with-deps chromium
|
|
32
|
+
|
|
33
|
+
- name: Install Chromium (Windows)
|
|
34
|
+
if: runner.os == 'Windows'
|
|
35
|
+
run: python -m playwright install chromium
|
|
36
|
+
|
|
37
|
+
- name: Ruff check
|
|
38
|
+
run: ruff check src tests scripts
|
|
39
|
+
|
|
40
|
+
- name: Ruff format check
|
|
41
|
+
run: ruff format --check src tests scripts
|
|
42
|
+
|
|
43
|
+
- name: Plugin manifests in sync with package version
|
|
44
|
+
run: python3 scripts/sync_plugin_manifests.py --check
|
|
45
|
+
|
|
46
|
+
- name: Plugin marketplace refs resolve
|
|
47
|
+
# A version-bump PR is allowed to introduce its future release tag;
|
|
48
|
+
# the push checks below validate it before/when release publication runs.
|
|
49
|
+
if: github.event_name != 'pull_request'
|
|
50
|
+
run: python3 scripts/check_plugin_refs.py
|
|
51
|
+
|
|
52
|
+
- name: Pytest suite budget (Linux)
|
|
53
|
+
if: runner.os == 'Linux'
|
|
54
|
+
run: python scripts/check_pytest_budget.py
|
|
55
|
+
|
|
56
|
+
- name: Windows portability smoke tests
|
|
57
|
+
if: runner.os == 'Windows'
|
|
58
|
+
run: python -m pytest -q tests/test_write_lock.py
|
|
59
|
+
|
|
60
|
+
- name: Windows updater console-launcher test
|
|
61
|
+
if: runner.os == 'Windows'
|
|
62
|
+
run: python -m pytest -q tests/test_update_windows.py
|
|
63
|
+
|
|
64
|
+
- name: Selector contract check
|
|
65
|
+
run: python scripts/selector_contracts.py check
|
|
66
|
+
|
|
67
|
+
- name: CLI docs in sync with argparse
|
|
68
|
+
# Справочник команд в README автогенерируется из argparse. Если кто-то
|
|
69
|
+
# добавил флаг/команду, но забыл перегенерить доку — шаг падает.
|
|
70
|
+
# Модель FastAPI/OpenAPI: код = источник правды, .md собирается.
|
|
71
|
+
env:
|
|
72
|
+
PYTHONIOENCODING: utf-8
|
|
73
|
+
run: python3 scripts/gen_cli_docs.py --check
|
|
74
|
+
|
|
75
|
+
packaging:
|
|
76
|
+
# Страховка, что упакованный дистрибутив (wheel) работает при `pip install .`,
|
|
77
|
+
# а не только при запуске из checkout: History создаёт таблицы и пишет/читает.
|
|
78
|
+
runs-on: ubuntu-latest
|
|
79
|
+
steps:
|
|
80
|
+
- uses: actions/checkout@v4
|
|
81
|
+
|
|
82
|
+
- name: Set up Python
|
|
83
|
+
uses: actions/setup-python@v5
|
|
84
|
+
with:
|
|
85
|
+
python-version: "3.12"
|
|
86
|
+
|
|
87
|
+
- name: Build wheel and install into clean env
|
|
88
|
+
run: |
|
|
89
|
+
python -m pip install --upgrade pip build
|
|
90
|
+
python -m build --wheel
|
|
91
|
+
VERSION=$(python -c 'import tomllib; print(tomllib.load(open("pyproject.toml", "rb"))["project"]["version"])')
|
|
92
|
+
python scripts/build_release.py \
|
|
93
|
+
--tag "v${VERSION}" \
|
|
94
|
+
--commit "$(git rev-parse HEAD)" \
|
|
95
|
+
--output dist/release
|
|
96
|
+
python -m venv /tmp/venv
|
|
97
|
+
/tmp/venv/bin/pip install --upgrade pip
|
|
98
|
+
/tmp/venv/bin/pip install dist/*.whl
|
|
99
|
+
/tmp/venv/bin/pip install playwright PyYAML
|
|
100
|
+
|
|
101
|
+
- name: Smoke — History works from installed wheel
|
|
102
|
+
run: /tmp/venv/bin/python tests/packaging_smoke.py --plugin-archive dist/release/hhru-cc-plugin-*.tar.gz
|
|
103
|
+
|
|
104
|
+
release:
|
|
105
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
106
|
+
needs: [lint-test, packaging]
|
|
107
|
+
runs-on: ubuntu-latest
|
|
108
|
+
permissions:
|
|
109
|
+
contents: write
|
|
110
|
+
steps:
|
|
111
|
+
- uses: actions/checkout@v4
|
|
112
|
+
|
|
113
|
+
- name: Set up Python
|
|
114
|
+
uses: actions/setup-python@v5
|
|
115
|
+
with:
|
|
116
|
+
python-version: "3.12"
|
|
117
|
+
|
|
118
|
+
- name: Build the CLI wheel and tagged plugin bundle
|
|
119
|
+
env:
|
|
120
|
+
RELEASE_TAG: ${{ github.ref_name }}
|
|
121
|
+
RELEASE_SHA: ${{ github.sha }}
|
|
122
|
+
run: |
|
|
123
|
+
python -m pip install --upgrade pip build
|
|
124
|
+
python -m build --wheel
|
|
125
|
+
python scripts/build_release.py \
|
|
126
|
+
--tag "$RELEASE_TAG" \
|
|
127
|
+
--commit "$RELEASE_SHA" \
|
|
128
|
+
--output dist/release
|
|
129
|
+
|
|
130
|
+
- name: Publish one tagged release
|
|
131
|
+
env:
|
|
132
|
+
GH_TOKEN: ${{ github.token }}
|
|
133
|
+
run: gh release create "$GITHUB_REF_NAME" dist/*.whl dist/release/* --generate-notes
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
__pycache__/
|
|
2
|
+
*.pyc
|
|
3
|
+
.venv/
|
|
4
|
+
build/
|
|
5
|
+
dist/
|
|
6
|
+
*.egg-info/
|
|
7
|
+
*.egg
|
|
8
|
+
.zcode/
|
|
9
|
+
|
|
10
|
+
# ВСЕ изменяемые данные проекта живут в data/ (конфиг, БД, сессия, логи, дампы
|
|
11
|
+
# probe) — одна строка вместо шести точечных правил (#133). Версионируемый
|
|
12
|
+
# шаблон формата конфига лежит отдельно в config/config.example.yaml и НЕ
|
|
13
|
+
# игнорируется. Новый изменяемый артефакт кладите в data/ — правку .gitignore
|
|
14
|
+
# он не требует.
|
|
15
|
+
data/
|
|
16
|
+
# Defence-in-depth: session-секреты hh.ru (cookies/localStorage) игнорируются в
|
|
17
|
+
# ЛЮБОЙ директории, не только в data/. Catch-all покрывает legacy user-конфиги,
|
|
18
|
+
# где storage_state_file при relative-to-config резолве уезжает за пределы data/
|
|
19
|
+
# (напр. старый config/config.yaml со значением 'data/...' → config/data/...).
|
|
20
|
+
# *.bak*/*.tmp покрывают промежуточные файлы import-cookies (#166):
|
|
21
|
+
# write_storage_state кладёт бэкап предыдущей сессии рядом с
|
|
22
|
+
# storage_state_file (тот же секрет hhtoken под другим именем) и пишет новую
|
|
23
|
+
# сессию через temp-файл + os.replace() (atomic write); оба содержат то же
|
|
24
|
+
# секретное значение, что и storage_state_file, но не покрыты правилом выше.
|
|
25
|
+
**/storage_state/*.json
|
|
26
|
+
**/storage_state/*.json.bak*
|
|
27
|
+
**/storage_state/*.json.tmp
|
|
28
|
+
|
|
29
|
+
.env
|
|
30
|
+
|
|
31
|
+
# Локальный lock-файл uv; зависимости проекта фиксируются в pyproject.toml.
|
|
32
|
+
/uv.lock
|
|
33
|
+
|
|
34
|
+
# Ad-hoc SQL-запросы для рыночного анализа (scripts/queries/) — разовые
|
|
35
|
+
# аналитические артефакты, не код; версионировать не нужно.
|
|
36
|
+
scripts/queries/
|
|
37
|
+
|
|
38
|
+
# Автогенерируемое evidence-описание селекторов; воспроизводится healthcheck-ом.
|
|
39
|
+
selectors/live-evidence.json
|