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.
Files changed (485) hide show
  1. hhru_bot-0.1.1/.agents/plugins/marketplace.json +25 -0
  2. hhru_bot-0.1.1/.claude/settings.json +5 -0
  3. hhru_bot-0.1.1/.claude-plugin/marketplace.json +29 -0
  4. hhru_bot-0.1.1/.claude-plugin/plugin.json +21 -0
  5. hhru_bot-0.1.1/.codex-plugin/plugin.json +36 -0
  6. hhru_bot-0.1.1/.github/workflows/ci.yml +133 -0
  7. hhru_bot-0.1.1/.gitignore +39 -0
  8. hhru_bot-0.1.1/CLAUDE.md +723 -0
  9. hhru_bot-0.1.1/Dockerfile +14 -0
  10. hhru_bot-0.1.1/LICENSE +21 -0
  11. hhru_bot-0.1.1/PKG-INFO +1251 -0
  12. hhru_bot-0.1.1/README.md +1224 -0
  13. hhru_bot-0.1.1/commands/hhru.md +63 -0
  14. hhru_bot-0.1.1/config/config.example.yaml +236 -0
  15. hhru_bot-0.1.1/deploy/com.hhru.bot.apply.plist +75 -0
  16. hhru_bot-0.1.1/deploy/com.hhru.bot.bump.plist +64 -0
  17. hhru_bot-0.1.1/docker-compose.yml +23 -0
  18. hhru_bot-0.1.1/docs/cli-spec.md +1221 -0
  19. hhru_bot-0.1.1/docs/design/issue-55-write-negotiations.md +505 -0
  20. hhru_bot-0.1.1/docs/market-recipes.md +312 -0
  21. hhru_bot-0.1.1/docs/portfolio-evidence.md +20 -0
  22. hhru_bot-0.1.1/docs/research/issue-257-live-probe.md +100 -0
  23. hhru_bot-0.1.1/docs/research/issue-265-cefr-live-probe.md +87 -0
  24. hhru_bot-0.1.1/docs/research/issue-335-semernyakov-diff-audit.md +65 -0
  25. hhru_bot-0.1.1/docs/research/issue-567-profile-hydration.md +72 -0
  26. hhru_bot-0.1.1/docs/research/issue-84-references.md +133 -0
  27. hhru_bot-0.1.1/docs/research/reference-audit-full-sweep.md +239 -0
  28. hhru_bot-0.1.1/docs/research/reference-selector-diff-audit.md +366 -0
  29. hhru_bot-0.1.1/docs/testing.md +122 -0
  30. hhru_bot-0.1.1/pyproject.toml +77 -0
  31. hhru_bot-0.1.1/requirements.txt +5 -0
  32. hhru_bot-0.1.1/scripts/check_pytest_budget.py +72 -0
  33. hhru_bot-0.1.1/scripts/crontab.example +9 -0
  34. hhru_bot-0.1.1/scripts/gen_cli_docs.py +153 -0
  35. hhru_bot-0.1.1/scripts/live_test.sh +7 -0
  36. hhru_bot-0.1.1/scripts/live_test_safe.sh +3 -0
  37. hhru_bot-0.1.1/scripts/manual_ai_live_check.py +76 -0
  38. hhru_bot-0.1.1/scripts/run.sh +4 -0
  39. hhru_bot-0.1.1/scripts/scheduled_run.sh +106 -0
  40. hhru_bot-0.1.1/setup.cfg +4 -0
  41. hhru_bot-0.1.1/skills/hhru/SKILL.md +194 -0
  42. hhru_bot-0.1.1/skills/hhru-apply/SKILL.md +84 -0
  43. hhru_bot-0.1.1/skills/hhru-market/SKILL.md +62 -0
  44. hhru_bot-0.1.1/skills/hhru-monitor/SKILL.md +70 -0
  45. hhru_bot-0.1.1/src/hhru_bot/__init__.py +58 -0
  46. hhru_bot-0.1.1/src/hhru_bot/_version.py +104 -0
  47. hhru_bot-0.1.1/src/hhru_bot/about.py +231 -0
  48. hhru_bot-0.1.1/src/hhru_bot/account_profile.py +97 -0
  49. hhru_bot-0.1.1/src/hhru_bot/accounts.py +62 -0
  50. hhru_bot-0.1.1/src/hhru_bot/adaptive_metrics.py +136 -0
  51. hhru_bot-0.1.1/src/hhru_bot/adaptive_resume.py +351 -0
  52. hhru_bot-0.1.1/src/hhru_bot/adaptive_resume_apply.py +206 -0
  53. hhru_bot-0.1.1/src/hhru_bot/ai/__init__.py +29 -0
  54. hhru_bot-0.1.1/src/hhru_bot/ai/feedback.py +57 -0
  55. hhru_bot-0.1.1/src/hhru_bot/ai/letters.py +188 -0
  56. hhru_bot-0.1.1/src/hhru_bot/ai/llm_client.py +184 -0
  57. hhru_bot-0.1.1/src/hhru_bot/ai/questions.py +288 -0
  58. hhru_bot-0.1.1/src/hhru_bot/ai/runtime_provider.py +43 -0
  59. hhru_bot-0.1.1/src/hhru_bot/ai/types.py +115 -0
  60. hhru_bot-0.1.1/src/hhru_bot/apply/__init__.py +30 -0
  61. hhru_bot-0.1.1/src/hhru_bot/apply/antibot.py +109 -0
  62. hhru_bot-0.1.1/src/hhru_bot/apply/blockers.py +170 -0
  63. hhru_bot-0.1.1/src/hhru_bot/apply/dedup.py +80 -0
  64. hhru_bot-0.1.1/src/hhru_bot/apply/letter.py +160 -0
  65. hhru_bot-0.1.1/src/hhru_bot/apply/locators.py +30 -0
  66. hhru_bot-0.1.1/src/hhru_bot/apply/pipeline.py +735 -0
  67. hhru_bot-0.1.1/src/hhru_bot/apply/probe.py +322 -0
  68. hhru_bot-0.1.1/src/hhru_bot/apply/questionnaire.py +203 -0
  69. hhru_bot-0.1.1/src/hhru_bot/apply/questions.py +245 -0
  70. hhru_bot-0.1.1/src/hhru_bot/apply/router.py +185 -0
  71. hhru_bot-0.1.1/src/hhru_bot/apply/steps.py +573 -0
  72. hhru_bot-0.1.1/src/hhru_bot/apply/success.py +154 -0
  73. hhru_bot-0.1.1/src/hhru_bot/apply/verdict.py +84 -0
  74. hhru_bot-0.1.1/src/hhru_bot/apply/verify.py +549 -0
  75. hhru_bot-0.1.1/src/hhru_bot/auth.py +128 -0
  76. hhru_bot-0.1.1/src/hhru_bot/auth_code.py +171 -0
  77. hhru_bot-0.1.1/src/hhru_bot/backup.py +423 -0
  78. hhru_bot-0.1.1/src/hhru_bot/blacklist.py +24 -0
  79. hhru_bot-0.1.1/src/hhru_bot/browser.py +839 -0
  80. hhru_bot-0.1.1/src/hhru_bot/bump.py +133 -0
  81. hhru_bot-0.1.1/src/hhru_bot/catalog_preflight.py +119 -0
  82. hhru_bot-0.1.1/src/hhru_bot/cli.py +490 -0
  83. hhru_bot-0.1.1/src/hhru_bot/commands/__init__.py +8 -0
  84. hhru_bot-0.1.1/src/hhru_bot/commands/_audit.py +38 -0
  85. hhru_bot-0.1.1/src/hhru_bot/commands/_common.py +1509 -0
  86. hhru_bot-0.1.1/src/hhru_bot/commands/_common_resume_guidance.py +42 -0
  87. hhru_bot-0.1.1/src/hhru_bot/commands/_professional_role_guidance.py +33 -0
  88. hhru_bot-0.1.1/src/hhru_bot/commands/_wizard_next_guidance.py +36 -0
  89. hhru_bot-0.1.1/src/hhru_bot/commands/about.py +113 -0
  90. hhru_bot-0.1.1/src/hhru_bot/commands/account.py +405 -0
  91. hhru_bot-0.1.1/src/hhru_bot/commands/adaptive_report.py +27 -0
  92. hhru_bot-0.1.1/src/hhru_bot/commands/adaptive_resume.py +184 -0
  93. hhru_bot-0.1.1/src/hhru_bot/commands/apply.py +242 -0
  94. hhru_bot-0.1.1/src/hhru_bot/commands/backup.py +45 -0
  95. hhru_bot-0.1.1/src/hhru_bot/commands/blacklist.py +34 -0
  96. hhru_bot-0.1.1/src/hhru_bot/commands/bump.py +118 -0
  97. hhru_bot-0.1.1/src/hhru_bot/commands/calendar.py +94 -0
  98. hhru_bot-0.1.1/src/hhru_bot/commands/call_api.py +106 -0
  99. hhru_bot-0.1.1/src/hhru_bot/commands/census.py +56 -0
  100. hhru_bot-0.1.1/src/hhru_bot/commands/clear_negotiations.py +478 -0
  101. hhru_bot-0.1.1/src/hhru_bot/commands/clear_skipped.py +70 -0
  102. hhru_bot-0.1.1/src/hhru_bot/commands/common.py +263 -0
  103. hhru_bot-0.1.1/src/hhru_bot/commands/competitors.py +784 -0
  104. hhru_bot-0.1.1/src/hhru_bot/commands/config_cmd.py +173 -0
  105. hhru_bot-0.1.1/src/hhru_bot/commands/copy_resume.py +522 -0
  106. hhru_bot-0.1.1/src/hhru_bot/commands/create_resume.py +227 -0
  107. hhru_bot-0.1.1/src/hhru_bot/commands/delete_education_entry.py +176 -0
  108. hhru_bot-0.1.1/src/hhru_bot/commands/delete_photo.py +162 -0
  109. hhru_bot-0.1.1/src/hhru_bot/commands/delete_resume.py +113 -0
  110. hhru_bot-0.1.1/src/hhru_bot/commands/diagnostics.py +187 -0
  111. hhru_bot-0.1.1/src/hhru_bot/commands/edit_education.py +262 -0
  112. hhru_bot-0.1.1/src/hhru_bot/commands/edit_experience.py +390 -0
  113. hhru_bot-0.1.1/src/hhru_bot/commands/edit_languages.py +211 -0
  114. hhru_bot-0.1.1/src/hhru_bot/commands/edit_skills.py +223 -0
  115. hhru_bot-0.1.1/src/hhru_bot/commands/fill_form.py +93 -0
  116. hhru_bot-0.1.1/src/hhru_bot/commands/funnel.py +128 -0
  117. hhru_bot-0.1.1/src/hhru_bot/commands/import_cookies.py +71 -0
  118. hhru_bot-0.1.1/src/hhru_bot/commands/learn.py +36 -0
  119. hhru_bot-0.1.1/src/hhru_bot/commands/list_resumes.py +298 -0
  120. hhru_bot-0.1.1/src/hhru_bot/commands/log_cmd.py +457 -0
  121. hhru_bot-0.1.1/src/hhru_bot/commands/login.py +22 -0
  122. hhru_bot-0.1.1/src/hhru_bot/commands/login_code.py +31 -0
  123. hhru_bot-0.1.1/src/hhru_bot/commands/mark.py +79 -0
  124. hhru_bot-0.1.1/src/hhru_bot/commands/market.py +43 -0
  125. hhru_bot-0.1.1/src/hhru_bot/commands/probe.py +1192 -0
  126. hhru_bot-0.1.1/src/hhru_bot/commands/professional_roles.py +120 -0
  127. hhru_bot-0.1.1/src/hhru_bot/commands/profile.py +63 -0
  128. hhru_bot-0.1.1/src/hhru_bot/commands/publish_resume.py +122 -0
  129. hhru_bot-0.1.1/src/hhru_bot/commands/query.py +281 -0
  130. hhru_bot-0.1.1/src/hhru_bot/commands/questionnaire.py +685 -0
  131. hhru_bot-0.1.1/src/hhru_bot/commands/refresh_token.py +61 -0
  132. hhru_bot-0.1.1/src/hhru_bot/commands/reject.py +41 -0
  133. hhru_bot-0.1.1/src/hhru_bot/commands/rename_resume.py +102 -0
  134. hhru_bot-0.1.1/src/hhru_bot/commands/reply_employers.py +567 -0
  135. hhru_bot-0.1.1/src/hhru_bot/commands/report_vacancy.py +157 -0
  136. hhru_bot-0.1.1/src/hhru_bot/commands/responses.py +448 -0
  137. hhru_bot-0.1.1/src/hhru_bot/commands/resume_pool.py +272 -0
  138. hhru_bot-0.1.1/src/hhru_bot/commands/resume_position.py +587 -0
  139. hhru_bot-0.1.1/src/hhru_bot/commands/resume_sections.py +165 -0
  140. hhru_bot-0.1.1/src/hhru_bot/commands/resume_views.py +153 -0
  141. hhru_bot-0.1.1/src/hhru_bot/commands/resume_visibility.py +203 -0
  142. hhru_bot-0.1.1/src/hhru_bot/commands/review.py +61 -0
  143. hhru_bot-0.1.1/src/hhru_bot/commands/robot_queue.py +23 -0
  144. hhru_bot-0.1.1/src/hhru_bot/commands/run.py +39 -0
  145. hhru_bot-0.1.1/src/hhru_bot/commands/schedule.py +365 -0
  146. hhru_bot-0.1.1/src/hhru_bot/commands/search.py +237 -0
  147. hhru_bot-0.1.1/src/hhru_bot/commands/select_photo.py +130 -0
  148. hhru_bot-0.1.1/src/hhru_bot/commands/settings.py +63 -0
  149. hhru_bot-0.1.1/src/hhru_bot/commands/skipped.py +33 -0
  150. hhru_bot-0.1.1/src/hhru_bot/commands/stats.py +106 -0
  151. hhru_bot-0.1.1/src/hhru_bot/commands/uncertain.py +61 -0
  152. hhru_bot-0.1.1/src/hhru_bot/commands/update.py +88 -0
  153. hhru_bot-0.1.1/src/hhru_bot/commands/upload_photo.py +115 -0
  154. hhru_bot-0.1.1/src/hhru_bot/commands/whoami.py +153 -0
  155. hhru_bot-0.1.1/src/hhru_bot/commands/wizard_next.py +177 -0
  156. hhru_bot-0.1.1/src/hhru_bot/common.py +770 -0
  157. hhru_bot-0.1.1/src/hhru_bot/competitor_workers.py +237 -0
  158. hhru_bot-0.1.1/src/hhru_bot/competitors.py +759 -0
  159. hhru_bot-0.1.1/src/hhru_bot/config.py +317 -0
  160. hhru_bot-0.1.1/src/hhru_bot/config_sections/__init__.py +24 -0
  161. hhru_bot-0.1.1/src/hhru_bot/config_sections/_registry.py +40 -0
  162. hhru_bot-0.1.1/src/hhru_bot/config_sections/_validation.py +9 -0
  163. hhru_bot-0.1.1/src/hhru_bot/config_sections/account.py +61 -0
  164. hhru_bot-0.1.1/src/hhru_bot/config_sections/ai.py +83 -0
  165. hhru_bot-0.1.1/src/hhru_bot/config_sections/ai_profile.py +83 -0
  166. hhru_bot-0.1.1/src/hhru_bot/config_sections/candidate_facts.py +163 -0
  167. hhru_bot-0.1.1/src/hhru_bot/config_sections/cluster.py +39 -0
  168. hhru_bot-0.1.1/src/hhru_bot/config_sections/education.py +74 -0
  169. hhru_bot-0.1.1/src/hhru_bot/config_sections/questionnaires.py +82 -0
  170. hhru_bot-0.1.1/src/hhru_bot/config_sections/resume_sections.py +46 -0
  171. hhru_bot-0.1.1/src/hhru_bot/config_sections/scoring.py +149 -0
  172. hhru_bot-0.1.1/src/hhru_bot/config_sections/search.py +30 -0
  173. hhru_bot-0.1.1/src/hhru_bot/cookie_import.py +247 -0
  174. hhru_bot-0.1.1/src/hhru_bot/copy_resume.py +816 -0
  175. hhru_bot-0.1.1/src/hhru_bot/create_resume.py +1034 -0
  176. hhru_bot-0.1.1/src/hhru_bot/delete_photo.py +401 -0
  177. hhru_bot-0.1.1/src/hhru_bot/delete_resume.py +268 -0
  178. hhru_bot-0.1.1/src/hhru_bot/diagnostics.py +218 -0
  179. hhru_bot-0.1.1/src/hhru_bot/exit_codes.py +21 -0
  180. hhru_bot-0.1.1/src/hhru_bot/experience.py +1633 -0
  181. hhru_bot-0.1.1/src/hhru_bot/external_forms/__init__.py +5 -0
  182. hhru_bot-0.1.1/src/hhru_bot/external_forms/detect.py +294 -0
  183. hhru_bot-0.1.1/src/hhru_bot/google_calendar.py +135 -0
  184. hhru_bot-0.1.1/src/hhru_bot/history.py +5325 -0
  185. hhru_bot-0.1.1/src/hhru_bot/languages.py +348 -0
  186. hhru_bot-0.1.1/src/hhru_bot/logging_setup.py +146 -0
  187. hhru_bot-0.1.1/src/hhru_bot/negotiations_chat.py +396 -0
  188. hhru_bot-0.1.1/src/hhru_bot/negotiations_probe.py +245 -0
  189. hhru_bot-0.1.1/src/hhru_bot/portfolio_evidence.py +147 -0
  190. hhru_bot-0.1.1/src/hhru_bot/professional_roles.py +771 -0
  191. hhru_bot-0.1.1/src/hhru_bot/provenance.py +363 -0
  192. hhru_bot-0.1.1/src/hhru_bot/publish_resume.py +244 -0
  193. hhru_bot-0.1.1/src/hhru_bot/questionnaires/__init__.py +63 -0
  194. hhru_bot-0.1.1/src/hhru_bot/questionnaires/answerer.py +355 -0
  195. hhru_bot-0.1.1/src/hhru_bot/questionnaires/resolver.py +424 -0
  196. hhru_bot-0.1.1/src/hhru_bot/questionnaires/templates.py +426 -0
  197. hhru_bot-0.1.1/src/hhru_bot/rename_resume.py +47 -0
  198. hhru_bot-0.1.1/src/hhru_bot/reply_suggestions.py +65 -0
  199. hhru_bot-0.1.1/src/hhru_bot/report.py +196 -0
  200. hhru_bot-0.1.1/src/hhru_bot/report_adaptive.py +50 -0
  201. hhru_bot-0.1.1/src/hhru_bot/report_funnel.py +185 -0
  202. hhru_bot-0.1.1/src/hhru_bot/report_market.py +123 -0
  203. hhru_bot-0.1.1/src/hhru_bot/report_skipped.py +29 -0
  204. hhru_bot-0.1.1/src/hhru_bot/report_vacancy.py +270 -0
  205. hhru_bot-0.1.1/src/hhru_bot/responses.py +633 -0
  206. hhru_bot-0.1.1/src/hhru_bot/resume_clusters.py +121 -0
  207. hhru_bot-0.1.1/src/hhru_bot/resume_education.py +1096 -0
  208. hhru_bot-0.1.1/src/hhru_bot/resume_ids.py +120 -0
  209. hhru_bot-0.1.1/src/hhru_bot/resume_limits.py +20 -0
  210. hhru_bot-0.1.1/src/hhru_bot/resume_photo.py +1055 -0
  211. hhru_bot-0.1.1/src/hhru_bot/resume_pool.py +86 -0
  212. hhru_bot-0.1.1/src/hhru_bot/resume_position.py +1390 -0
  213. hhru_bot-0.1.1/src/hhru_bot/resume_sections.py +397 -0
  214. hhru_bot-0.1.1/src/hhru_bot/resume_state.py +140 -0
  215. hhru_bot-0.1.1/src/hhru_bot/resume_titles.py +141 -0
  216. hhru_bot-0.1.1/src/hhru_bot/resume_views.py +140 -0
  217. hhru_bot-0.1.1/src/hhru_bot/resume_visibility.py +591 -0
  218. hhru_bot-0.1.1/src/hhru_bot/resume_wizard.py +290 -0
  219. hhru_bot-0.1.1/src/hhru_bot/scoring/__init__.py +43 -0
  220. hhru_bot-0.1.1/src/hhru_bot/scoring/employer.py +212 -0
  221. hhru_bot-0.1.1/src/hhru_bot/scoring/letter_match.py +125 -0
  222. hhru_bot-0.1.1/src/hhru_bot/scoring/prefilter.py +80 -0
  223. hhru_bot-0.1.1/src/hhru_bot/scoring/resume_match.py +440 -0
  224. hhru_bot-0.1.1/src/hhru_bot/scoring/types.py +66 -0
  225. hhru_bot-0.1.1/src/hhru_bot/scoring/vacancy.py +331 -0
  226. hhru_bot-0.1.1/src/hhru_bot/search.py +1208 -0
  227. hhru_bot-0.1.1/src/hhru_bot/selector_groups/__init__.py +10 -0
  228. hhru_bot-0.1.1/src/hhru_bot/selector_groups/_generated.py +319 -0
  229. hhru_bot-0.1.1/src/hhru_bot/selector_groups/account_profile.py +65 -0
  230. hhru_bot-0.1.1/src/hhru_bot/selector_groups/apply_form.py +110 -0
  231. hhru_bot-0.1.1/src/hhru_bot/selector_groups/competitor_resume.py +25 -0
  232. hhru_bot-0.1.1/src/hhru_bot/selector_groups/login.py +11 -0
  233. hhru_bot-0.1.1/src/hhru_bot/selector_groups/negotiations.py +83 -0
  234. hhru_bot-0.1.1/src/hhru_bot/selector_groups/resume_experience.py +337 -0
  235. hhru_bot-0.1.1/src/hhru_bot/selector_groups/resume_list.py +59 -0
  236. hhru_bot-0.1.1/src/hhru_bot/selector_groups/resume_page.py +204 -0
  237. hhru_bot-0.1.1/src/hhru_bot/selector_groups/resume_photo.py +219 -0
  238. hhru_bot-0.1.1/src/hhru_bot/selector_groups/resume_rename.py +13 -0
  239. hhru_bot-0.1.1/src/hhru_bot/selector_groups/resume_visibility.py +102 -0
  240. hhru_bot-0.1.1/src/hhru_bot/selector_groups/search_page.py +81 -0
  241. hhru_bot-0.1.1/src/hhru_bot/selector_groups/vacancy_complain.py +74 -0
  242. hhru_bot-0.1.1/src/hhru_bot/selector_groups/vacancy_page.py +34 -0
  243. hhru_bot-0.1.1/src/hhru_bot/selectors.py +105 -0
  244. hhru_bot-0.1.1/src/hhru_bot/session_security.py +166 -0
  245. hhru_bot-0.1.1/src/hhru_bot/skill_gaps.py +61 -0
  246. hhru_bot-0.1.1/src/hhru_bot/skills.py +571 -0
  247. hhru_bot-0.1.1/src/hhru_bot/throttle.py +73 -0
  248. hhru_bot-0.1.1/src/hhru_bot/transient_overlays.py +131 -0
  249. hhru_bot-0.1.1/src/hhru_bot/update.py +620 -0
  250. hhru_bot-0.1.1/src/hhru_bot/vacancy_refresh.py +99 -0
  251. hhru_bot-0.1.1/src/hhru_bot/write_lock.py +62 -0
  252. hhru_bot-0.1.1/src/hhru_bot.egg-info/PKG-INFO +1251 -0
  253. hhru_bot-0.1.1/src/hhru_bot.egg-info/SOURCES.txt +483 -0
  254. hhru_bot-0.1.1/src/hhru_bot.egg-info/dependency_links.txt +1 -0
  255. hhru_bot-0.1.1/src/hhru_bot.egg-info/entry_points.txt +3 -0
  256. hhru_bot-0.1.1/src/hhru_bot.egg-info/requires.txt +19 -0
  257. hhru_bot-0.1.1/src/hhru_bot.egg-info/top_level.txt +2 -0
  258. hhru_bot-0.1.1/tests/_fakes.py +251 -0
  259. hhru_bot-0.1.1/tests/conftest.py +181 -0
  260. hhru_bot-0.1.1/tests/fixtures/vacancy_card_no_salary.html +20 -0
  261. hhru_bot-0.1.1/tests/fixtures/vacancy_card_salary_usd.html +24 -0
  262. hhru_bot-0.1.1/tests/fixtures/vacancy_card_text_only_salary.html +36 -0
  263. hhru_bot-0.1.1/tests/fixtures/vacancy_card_text_only_salary.txt +6 -0
  264. hhru_bot-0.1.1/tests/fixtures/vacancy_card_with_rating.html +44 -0
  265. hhru_bot-0.1.1/tests/fixtures/vacancy_card_with_salary.html +35 -0
  266. hhru_bot-0.1.1/tests/packaging_smoke.py +71 -0
  267. hhru_bot-0.1.1/tests/test_about.py +388 -0
  268. hhru_bot-0.1.1/tests/test_account_command.py +186 -0
  269. hhru_bot-0.1.1/tests/test_account_delete.py +189 -0
  270. hhru_bot-0.1.1/tests/test_account_profile.py +58 -0
  271. hhru_bot-0.1.1/tests/test_account_profile_login.py +124 -0
  272. hhru_bot-0.1.1/tests/test_account_write_lock_isolation.py +108 -0
  273. hhru_bot-0.1.1/tests/test_accounts.py +99 -0
  274. hhru_bot-0.1.1/tests/test_adaptive_metrics.py +60 -0
  275. hhru_bot-0.1.1/tests/test_adaptive_resume.py +226 -0
  276. hhru_bot-0.1.1/tests/test_adaptive_resume_apply.py +203 -0
  277. hhru_bot-0.1.1/tests/test_adaptive_resume_command.py +179 -0
  278. hhru_bot-0.1.1/tests/test_ai_config.py +179 -0
  279. hhru_bot-0.1.1/tests/test_ai_feedback.py +91 -0
  280. hhru_bot-0.1.1/tests/test_ai_hermes_transport.py +251 -0
  281. hhru_bot-0.1.1/tests/test_ai_live_transport.py +133 -0
  282. hhru_bot-0.1.1/tests/test_ai_questions.py +157 -0
  283. hhru_bot-0.1.1/tests/test_ai_questions_extract.py +341 -0
  284. hhru_bot-0.1.1/tests/test_ai_runtime_provider.py +30 -0
  285. hhru_bot-0.1.1/tests/test_apply_antibot.py +127 -0
  286. hhru_bot-0.1.1/tests/test_apply_audit.py +508 -0
  287. hhru_bot-0.1.1/tests/test_apply_blockers.py +275 -0
  288. hhru_bot-0.1.1/tests/test_apply_letter.py +283 -0
  289. hhru_bot-0.1.1/tests/test_apply_letter_integration.py +271 -0
  290. hhru_bot-0.1.1/tests/test_apply_limit.py +591 -0
  291. hhru_bot-0.1.1/tests/test_apply_pipeline.py +1497 -0
  292. hhru_bot-0.1.1/tests/test_apply_placeholder.py +172 -0
  293. hhru_bot-0.1.1/tests/test_apply_plan.py +151 -0
  294. hhru_bot-0.1.1/tests/test_apply_probe.py +562 -0
  295. hhru_bot-0.1.1/tests/test_apply_progress.py +74 -0
  296. hhru_bot-0.1.1/tests/test_apply_questions.py +546 -0
  297. hhru_bot-0.1.1/tests/test_apply_router.py +61 -0
  298. hhru_bot-0.1.1/tests/test_apply_scoring_integration.py +221 -0
  299. hhru_bot-0.1.1/tests/test_apply_steps.py +1082 -0
  300. hhru_bot-0.1.1/tests/test_apply_success.py +295 -0
  301. hhru_bot-0.1.1/tests/test_apply_verify.py +1067 -0
  302. hhru_bot-0.1.1/tests/test_audit_launch_and_navigation.py +377 -0
  303. hhru_bot-0.1.1/tests/test_auth.py +118 -0
  304. hhru_bot-0.1.1/tests/test_auth_code.py +232 -0
  305. hhru_bot-0.1.1/tests/test_backup.py +287 -0
  306. hhru_bot-0.1.1/tests/test_browser_navigation.py +805 -0
  307. hhru_bot-0.1.1/tests/test_bump.py +264 -0
  308. hhru_bot-0.1.1/tests/test_bump_command_runs.py +153 -0
  309. hhru_bot-0.1.1/tests/test_call_api.py +96 -0
  310. hhru_bot-0.1.1/tests/test_candidate_facts.py +337 -0
  311. hhru_bot-0.1.1/tests/test_catalog_preflight.py +161 -0
  312. hhru_bot-0.1.1/tests/test_check_hh_connectivity.py +65 -0
  313. hhru_bot-0.1.1/tests/test_ci_selector_gate.py +100 -0
  314. hhru_bot-0.1.1/tests/test_clear_negotiations_command.py +658 -0
  315. hhru_bot-0.1.1/tests/test_clear_skipped_command.py +114 -0
  316. hhru_bot-0.1.1/tests/test_cli_commands.py +844 -0
  317. hhru_bot-0.1.1/tests/test_cli_honesty_audit.py +102 -0
  318. hhru_bot-0.1.1/tests/test_command_audit.py +37 -0
  319. hhru_bot-0.1.1/tests/test_common.py +1114 -0
  320. hhru_bot-0.1.1/tests/test_common_run_context.py +325 -0
  321. hhru_bot-0.1.1/tests/test_competitors.py +589 -0
  322. hhru_bot-0.1.1/tests/test_competitors_command.py +806 -0
  323. hhru_bot-0.1.1/tests/test_config.py +766 -0
  324. hhru_bot-0.1.1/tests/test_config_command.py +140 -0
  325. hhru_bot-0.1.1/tests/test_config_scoring_warning.py +96 -0
  326. hhru_bot-0.1.1/tests/test_cookie_import.py +510 -0
  327. hhru_bot-0.1.1/tests/test_copy_resume_browser.py +855 -0
  328. hhru_bot-0.1.1/tests/test_copy_resume_command.py +869 -0
  329. hhru_bot-0.1.1/tests/test_create_resume.py +105 -0
  330. hhru_bot-0.1.1/tests/test_create_resume_browser.py +2066 -0
  331. hhru_bot-0.1.1/tests/test_create_resume_command.py +405 -0
  332. hhru_bot-0.1.1/tests/test_delete_education_entry_browser.py +478 -0
  333. hhru_bot-0.1.1/tests/test_delete_education_entry_command.py +253 -0
  334. hhru_bot-0.1.1/tests/test_delete_photo.py +497 -0
  335. hhru_bot-0.1.1/tests/test_delete_photo_command.py +146 -0
  336. hhru_bot-0.1.1/tests/test_delete_resume_browser.py +333 -0
  337. hhru_bot-0.1.1/tests/test_delete_resume_command.py +164 -0
  338. hhru_bot-0.1.1/tests/test_diagnostics.py +189 -0
  339. hhru_bot-0.1.1/tests/test_docker_compose.py +29 -0
  340. hhru_bot-0.1.1/tests/test_edit_skills_command.py +283 -0
  341. hhru_bot-0.1.1/tests/test_experience.py +2075 -0
  342. hhru_bot-0.1.1/tests/test_experience_panel_reconcile.py +253 -0
  343. hhru_bot-0.1.1/tests/test_external_forms_detect.py +258 -0
  344. hhru_bot-0.1.1/tests/test_fill_form.py +334 -0
  345. hhru_bot-0.1.1/tests/test_funnel_command.py +184 -0
  346. hhru_bot-0.1.1/tests/test_google_calendar.py +38 -0
  347. hhru_bot-0.1.1/tests/test_hhru_live_behavior.py +385 -0
  348. hhru_bot-0.1.1/tests/test_history_competitors.py +891 -0
  349. hhru_bot-0.1.1/tests/test_history_created_at_format.py +189 -0
  350. hhru_bot-0.1.1/tests/test_history_estimate_salary.py +165 -0
  351. hhru_bot-0.1.1/tests/test_history_funnel.py +634 -0
  352. hhru_bot-0.1.1/tests/test_history_key_consistency.py +193 -0
  353. hhru_bot-0.1.1/tests/test_history_market.py +793 -0
  354. hhru_bot-0.1.1/tests/test_history_questionnaires.py +365 -0
  355. hhru_bot-0.1.1/tests/test_history_replies.py +580 -0
  356. hhru_bot-0.1.1/tests/test_history_schema.py +506 -0
  357. hhru_bot-0.1.1/tests/test_history_skipped.py +194 -0
  358. hhru_bot-0.1.1/tests/test_history_stats.py +149 -0
  359. hhru_bot-0.1.1/tests/test_import_cookies_command.py +94 -0
  360. hhru_bot-0.1.1/tests/test_languages.py +591 -0
  361. hhru_bot-0.1.1/tests/test_letter_fewshot.py +187 -0
  362. hhru_bot-0.1.1/tests/test_letter_randomize.py +180 -0
  363. hhru_bot-0.1.1/tests/test_list_resume_cards.py +476 -0
  364. hhru_bot-0.1.1/tests/test_list_resumes_command.py +615 -0
  365. hhru_bot-0.1.1/tests/test_live_browser_guard.py +260 -0
  366. hhru_bot-0.1.1/tests/test_live_test_script.py +45 -0
  367. hhru_bot-0.1.1/tests/test_log_command.py +605 -0
  368. hhru_bot-0.1.1/tests/test_logging_setup.py +178 -0
  369. hhru_bot-0.1.1/tests/test_login_import_cookies_account_isolation.py +162 -0
  370. hhru_bot-0.1.1/tests/test_manual_input_commands.py +678 -0
  371. hhru_bot-0.1.1/tests/test_mark_command.py +93 -0
  372. hhru_bot-0.1.1/tests/test_markers.py +52 -0
  373. hhru_bot-0.1.1/tests/test_market_bounds.py +532 -0
  374. hhru_bot-0.1.1/tests/test_market_currency.py +217 -0
  375. hhru_bot-0.1.1/tests/test_multi_account_isolation.py +198 -0
  376. hhru_bot-0.1.1/tests/test_negotiations_chat.py +299 -0
  377. hhru_bot-0.1.1/tests/test_negotiations_probe.py +143 -0
  378. hhru_bot-0.1.1/tests/test_no_hardcoded_resume_ids.py +112 -0
  379. hhru_bot-0.1.1/tests/test_no_page_request.py +29 -0
  380. hhru_bot-0.1.1/tests/test_page_state.py +368 -0
  381. hhru_bot-0.1.1/tests/test_playwright_fakes_contract.py +187 -0
  382. hhru_bot-0.1.1/tests/test_plugin_metadata.py +107 -0
  383. hhru_bot-0.1.1/tests/test_plugin_packaging.py +96 -0
  384. hhru_bot-0.1.1/tests/test_plugin_refs.py +85 -0
  385. hhru_bot-0.1.1/tests/test_portfolio_evidence.py +118 -0
  386. hhru_bot-0.1.1/tests/test_probe_command.py +100 -0
  387. hhru_bot-0.1.1/tests/test_probe_gitignore.py +39 -0
  388. hhru_bot-0.1.1/tests/test_probe_healthcheck.py +557 -0
  389. hhru_bot-0.1.1/tests/test_probe_letter_integration.py +180 -0
  390. hhru_bot-0.1.1/tests/test_professional_roles.py +608 -0
  391. hhru_bot-0.1.1/tests/test_professional_roles_command.py +132 -0
  392. hhru_bot-0.1.1/tests/test_profile_command.py +62 -0
  393. hhru_bot-0.1.1/tests/test_provenance.py +197 -0
  394. hhru_bot-0.1.1/tests/test_publish_resume.py +327 -0
  395. hhru_bot-0.1.1/tests/test_publish_resume_command.py +282 -0
  396. hhru_bot-0.1.1/tests/test_pytest_budget.py +107 -0
  397. hhru_bot-0.1.1/tests/test_query_command.py +440 -0
  398. hhru_bot-0.1.1/tests/test_questionnaire_answerer.py +552 -0
  399. hhru_bot-0.1.1/tests/test_questionnaire_bulk.py +1096 -0
  400. hhru_bot-0.1.1/tests/test_questionnaire_cli.py +1300 -0
  401. hhru_bot-0.1.1/tests/test_questionnaire_resolver.py +983 -0
  402. hhru_bot-0.1.1/tests/test_questionnaire_templates_history.py +427 -0
  403. hhru_bot-0.1.1/tests/test_refresh_token_command.py +124 -0
  404. hhru_bot-0.1.1/tests/test_reject_feedback.py +67 -0
  405. hhru_bot-0.1.1/tests/test_release_packaging.py +74 -0
  406. hhru_bot-0.1.1/tests/test_reliability_bundle.py +358 -0
  407. hhru_bot-0.1.1/tests/test_reply_employers_command.py +1022 -0
  408. hhru_bot-0.1.1/tests/test_report_funnel.py +156 -0
  409. hhru_bot-0.1.1/tests/test_report_market.py +156 -0
  410. hhru_bot-0.1.1/tests/test_report_stats.py +183 -0
  411. hhru_bot-0.1.1/tests/test_report_vacancy_browser.py +192 -0
  412. hhru_bot-0.1.1/tests/test_report_vacancy_command.py +115 -0
  413. hhru_bot-0.1.1/tests/test_responses_command.py +651 -0
  414. hhru_bot-0.1.1/tests/test_responses_history.py +286 -0
  415. hhru_bot-0.1.1/tests/test_responses_pagination.py +186 -0
  416. hhru_bot-0.1.1/tests/test_responses_parser.py +415 -0
  417. hhru_bot-0.1.1/tests/test_responses_ssr_topic_mapping.py +564 -0
  418. hhru_bot-0.1.1/tests/test_resume_cluster_config.py +75 -0
  419. hhru_bot-0.1.1/tests/test_resume_clusters.py +53 -0
  420. hhru_bot-0.1.1/tests/test_resume_edit_command_runs.py +1539 -0
  421. hhru_bot-0.1.1/tests/test_resume_education.py +63 -0
  422. hhru_bot-0.1.1/tests/test_resume_education_additional_direct.py +215 -0
  423. hhru_bot-0.1.1/tests/test_resume_education_edit_block.py +397 -0
  424. hhru_bot-0.1.1/tests/test_resume_education_fill_reset.py +86 -0
  425. hhru_bot-0.1.1/tests/test_resume_education_form_shapes.py +183 -0
  426. hhru_bot-0.1.1/tests/test_resume_education_hydration_wait.py +165 -0
  427. hhru_bot-0.1.1/tests/test_resume_education_primary_route.py +47 -0
  428. hhru_bot-0.1.1/tests/test_resume_error_banner.py +295 -0
  429. hhru_bot-0.1.1/tests/test_resume_error_banner_live.py +129 -0
  430. hhru_bot-0.1.1/tests/test_resume_id_addressing.py +273 -0
  431. hhru_bot-0.1.1/tests/test_resume_ids.py +200 -0
  432. hhru_bot-0.1.1/tests/test_resume_limits.py +35 -0
  433. hhru_bot-0.1.1/tests/test_resume_pool.py +82 -0
  434. hhru_bot-0.1.1/tests/test_resume_pool_command.py +308 -0
  435. hhru_bot-0.1.1/tests/test_resume_position.py +1670 -0
  436. hhru_bot-0.1.1/tests/test_resume_position_catalog_fixture.py +186 -0
  437. hhru_bot-0.1.1/tests/test_resume_position_command.py +438 -0
  438. hhru_bot-0.1.1/tests/test_resume_position_empty_state_live.py +142 -0
  439. hhru_bot-0.1.1/tests/test_resume_position_gate.py +23 -0
  440. hhru_bot-0.1.1/tests/test_resume_position_title_source.py +83 -0
  441. hhru_bot-0.1.1/tests/test_resume_position_wizard_direct.py +196 -0
  442. hhru_bot-0.1.1/tests/test_resume_position_wizard_direct_fixture.py +145 -0
  443. hhru_bot-0.1.1/tests/test_resume_sections.py +592 -0
  444. hhru_bot-0.1.1/tests/test_resume_sections_apply.py +169 -0
  445. hhru_bot-0.1.1/tests/test_resume_sections_recommendation_route.py +40 -0
  446. hhru_bot-0.1.1/tests/test_resume_titles.py +265 -0
  447. hhru_bot-0.1.1/tests/test_resume_views.py +173 -0
  448. hhru_bot-0.1.1/tests/test_resume_visibility.py +692 -0
  449. hhru_bot-0.1.1/tests/test_resume_visibility_command.py +226 -0
  450. hhru_bot-0.1.1/tests/test_resume_visibility_dom_fixture.py +125 -0
  451. hhru_bot-0.1.1/tests/test_resume_wizard.py +393 -0
  452. hhru_bot-0.1.1/tests/test_salary_parse.py +181 -0
  453. hhru_bot-0.1.1/tests/test_sandbox_preflight.py +199 -0
  454. hhru_bot-0.1.1/tests/test_schedule_command.py +308 -0
  455. hhru_bot-0.1.1/tests/test_schema.py +82 -0
  456. hhru_bot-0.1.1/tests/test_scoring.py +331 -0
  457. hhru_bot-0.1.1/tests/test_scoring_letter_match.py +131 -0
  458. hhru_bot-0.1.1/tests/test_scoring_ml.py +581 -0
  459. hhru_bot-0.1.1/tests/test_scoring_prefilter.py +429 -0
  460. hhru_bot-0.1.1/tests/test_scoring_resume_match.py +449 -0
  461. hhru_bot-0.1.1/tests/test_search.py +673 -0
  462. hhru_bot-0.1.1/tests/test_search_command_output.py +411 -0
  463. hhru_bot-0.1.1/tests/test_search_extra_fields.py +254 -0
  464. hhru_bot-0.1.1/tests/test_search_pagination.py +125 -0
  465. hhru_bot-0.1.1/tests/test_search_publication_time.py +134 -0
  466. hhru_bot-0.1.1/tests/test_search_salary_extract.py +227 -0
  467. hhru_bot-0.1.1/tests/test_select_photo.py +421 -0
  468. hhru_bot-0.1.1/tests/test_selector_contracts.py +1136 -0
  469. hhru_bot-0.1.1/tests/test_selector_metrics.py +222 -0
  470. hhru_bot-0.1.1/tests/test_selectors_shim.py +61 -0
  471. hhru_bot-0.1.1/tests/test_session_security.py +261 -0
  472. hhru_bot-0.1.1/tests/test_settings.py +91 -0
  473. hhru_bot-0.1.1/tests/test_skill_gaps.py +22 -0
  474. hhru_bot-0.1.1/tests/test_skills.py +1031 -0
  475. hhru_bot-0.1.1/tests/test_skipped_command.py +39 -0
  476. hhru_bot-0.1.1/tests/test_stats_command.py +169 -0
  477. hhru_bot-0.1.1/tests/test_throttle_policy.py +347 -0
  478. hhru_bot-0.1.1/tests/test_transient_overlays.py +75 -0
  479. hhru_bot-0.1.1/tests/test_update.py +315 -0
  480. hhru_bot-0.1.1/tests/test_update_windows.py +134 -0
  481. hhru_bot-0.1.1/tests/test_upload_photo.py +708 -0
  482. hhru_bot-0.1.1/tests/test_vacancy_refresh.py +41 -0
  483. hhru_bot-0.1.1/tests/test_whoami_command.py +315 -0
  484. hhru_bot-0.1.1/tests/test_wizard_next_command.py +295 -0
  485. 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,5 @@
1
+ {
2
+ "permissions": {
3
+ "ask": ["Bash(./scripts/live_test.sh:*)"]
4
+ }
5
+ }
@@ -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