direct-cli 0.3.3__tar.gz → 0.3.5__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 (215) hide show
  1. direct_cli-0.3.5/.github/workflows/quality.yml +33 -0
  2. {direct_cli-0.3.3 → direct_cli-0.3.5}/PKG-INFO +69 -58
  3. {direct_cli-0.3.3 → direct_cli-0.3.5}/README.md +64 -57
  4. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/tapi_yandex_direct/tapi_yandex_direct.py +102 -8
  5. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/auth.py +98 -1
  6. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/cli.py +2 -5
  7. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/audiencetargets.py +5 -2
  8. direct_cli-0.3.5/direct_cli/commands/auth.py +421 -0
  9. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/bidmodifiers.py +3 -20
  10. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/dictionaries.py +3 -5
  11. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/dynamicads.py +5 -2
  12. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/dynamicfeedadtargets.py +1 -3
  13. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/reports.py +6 -8
  14. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/strategies.py +154 -34
  15. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/v4account.py +78 -15
  16. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/v4finance.py +169 -0
  17. direct_cli-0.3.5/direct_cli/commands/v4wordstat.py +157 -0
  18. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/smoke_matrix.py +8 -2
  19. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/v4_contracts.py +52 -20
  20. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli.egg-info/PKG-INFO +69 -58
  21. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli.egg-info/SOURCES.txt +6 -0
  22. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli.egg-info/requires.txt +4 -0
  23. {direct_cli-0.3.3 → direct_cli-0.3.5}/pyproject.toml +27 -1
  24. {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/sandbox_write_live.py +122 -0
  25. {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/test_safe_commands.sh +18 -0
  26. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/API_COVERAGE.md +4 -0
  27. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/MANUAL_COVERAGE.md +4 -3
  28. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/api_coverage_payloads.py +6 -0
  29. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_api_coverage.py +115 -0
  30. direct_cli-0.3.5/tests/test_auth_oauth.py +1405 -0
  31. direct_cli-0.3.5/tests/test_cli_contract.py +192 -0
  32. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_dry_run.py +54 -5
  33. direct_cli-0.3.5/tests/test_low_coverage_payloads.py +853 -0
  34. direct_cli-0.3.5/tests/test_reports_parsing.py +245 -0
  35. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_smoke_matrix.py +154 -3
  36. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_v4_contracts.py +13 -0
  37. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_v4_live_contracts.py +36 -0
  38. direct_cli-0.3.5/tests/test_v4_safety.py +17 -0
  39. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_v4account.py +109 -3
  40. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_v4finance_money.py +178 -0
  41. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_v4finance_read.py +59 -4
  42. direct_cli-0.3.5/tests/test_v4wordstat.py +250 -0
  43. direct_cli-0.3.3/direct_cli/commands/auth.py +0 -202
  44. direct_cli-0.3.3/tests/test_auth_oauth.py +0 -657
  45. direct_cli-0.3.3/tests/test_v4_safety.py +0 -15
  46. {direct_cli-0.3.3 → direct_cli-0.3.5}/.env.example +0 -0
  47. {direct_cli-0.3.3 → direct_cli-0.3.5}/.github/copilot-instructions.md +0 -0
  48. {direct_cli-0.3.3 → direct_cli-0.3.5}/.github/workflows/api-coverage.yml +0 -0
  49. {direct_cli-0.3.3 → direct_cli-0.3.5}/.github/workflows/claude-code-review.yml +0 -0
  50. {direct_cli-0.3.3 → direct_cli-0.3.5}/.github/workflows/claude.yml +0 -0
  51. {direct_cli-0.3.3 → direct_cli-0.3.5}/.gitignore +0 -0
  52. {direct_cli-0.3.3 → direct_cli-0.3.5}/AGENTS.md +0 -0
  53. {direct_cli-0.3.3 → direct_cli-0.3.5}/CHANGELOG.md +0 -0
  54. {direct_cli-0.3.3 → direct_cli-0.3.5}/CLAUDE.md +0 -0
  55. {direct_cli-0.3.3 → direct_cli-0.3.5}/MANIFEST.in +0 -0
  56. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/__init__.py +0 -0
  57. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_deprecated.py +0 -0
  58. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_smoke_probes.py +0 -0
  59. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/__init__.py +0 -0
  60. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/tapi_yandex_direct/__init__.py +0 -0
  61. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/tapi_yandex_direct/endpoints.py +0 -0
  62. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/tapi_yandex_direct/exceptions.py +0 -0
  63. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/tapi_yandex_direct/resource_mapping.py +0 -0
  64. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/tapi_yandex_direct/tapi_yandex_direct.pyi +0 -0
  65. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/tapi_yandex_direct/v4/__init__.py +0 -0
  66. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/tapi_yandex_direct/v4/adapter.py +0 -0
  67. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/tapi_yandex_direct/v4/adapter.pyi +0 -0
  68. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/_vendor/tapi_yandex_direct/v4/resource_mapping.py +0 -0
  69. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/api.py +0 -0
  70. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/__init__.py +0 -0
  71. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/adextensions.py +0 -0
  72. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/adgroups.py +0 -0
  73. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/adimages.py +0 -0
  74. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/ads.py +0 -0
  75. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/advideos.py +0 -0
  76. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/agencyclients.py +0 -0
  77. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/balance.py +0 -0
  78. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/bids.py +0 -0
  79. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/businesses.py +0 -0
  80. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/campaigns.py +0 -0
  81. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/changes.py +0 -0
  82. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/clients.py +0 -0
  83. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/creatives.py +0 -0
  84. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/feeds.py +0 -0
  85. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/keywordbids.py +0 -0
  86. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/keywords.py +0 -0
  87. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/keywordsresearch.py +0 -0
  88. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/leads.py +0 -0
  89. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/negativekeywordsharedsets.py +0 -0
  90. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/retargeting.py +0 -0
  91. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/sitelinks.py +0 -0
  92. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/smartadtargets.py +0 -0
  93. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/turbopages.py +0 -0
  94. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/v4events.py +0 -0
  95. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/v4goals.py +0 -0
  96. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/v4shells.py +0 -0
  97. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/commands/vcards.py +0 -0
  98. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/output.py +0 -0
  99. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/reports_coverage.py +0 -0
  100. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/utils.py +0 -0
  101. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/v4/__init__.py +0 -0
  102. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/v4/money.py +0 -0
  103. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli/wsdl_coverage.py +0 -0
  104. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli.egg-info/dependency_links.txt +0 -0
  105. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli.egg-info/entry_points.txt +0 -0
  106. {direct_cli-0.3.3 → direct_cli-0.3.5}/direct_cli.egg-info/top_level.txt +0 -0
  107. {direct_cli-0.3.3 → direct_cli-0.3.5}/docs/superpowers/plans/2026-04-12-issue-32-completion.md +0 -0
  108. {direct_cli-0.3.3 → direct_cli-0.3.5}/docs/superpowers/specs/2026-04-23-vendor-tapi-yandex-direct-design.md +0 -0
  109. {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/anonymize_cassettes.py +0 -0
  110. {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/build_api_coverage_checklist.py +0 -0
  111. {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/build_api_coverage_report.py +0 -0
  112. {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/check_reports_drift.py +0 -0
  113. {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/check_wsdl_drift.py +0 -0
  114. {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/patch_vendor_imports.py +0 -0
  115. {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/refresh_reports_cache.py +0 -0
  116. {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/refresh_wsdl_cache.py +0 -0
  117. {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/release_pypi.sh +0 -0
  118. {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/test_dangerous_commands.sh +0 -0
  119. {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/test_sandbox_write.sh +0 -0
  120. {direct_cli-0.3.3 → direct_cli-0.3.5}/scripts/update_vendor.sh +0 -0
  121. {direct_cli-0.3.3 → direct_cli-0.3.5}/setup.cfg +0 -0
  122. {direct_cli-0.3.3 → direct_cli-0.3.5}/setup.py +0 -0
  123. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/API_ISSUE_AUDIT.md +0 -0
  124. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/__init__.py +0 -0
  125. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_adgroups_add_update_delete.yaml +0 -0
  126. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_adimages_add_get_delete.yaml +0 -0
  127. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_ads_add_update_delete.yaml +0 -0
  128. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_ads_suspend_resume_archive_unarchive.yaml +0 -0
  129. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_advideos_add_get.yaml +0 -0
  130. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_audiencetargets_add_delete.yaml +0 -0
  131. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_audiencetargets_suspend_resume.yaml +0 -0
  132. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_bids_set.yaml +0 -0
  133. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_campaign_create_get_delete.yaml +0 -0
  134. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_creatives_chain_advideo_to_creative.yaml +0 -0
  135. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_dynamicads_add_delete.yaml +0 -0
  136. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_dynamicads_suspend_resume.yaml +0 -0
  137. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_keywordbids_set.yaml +0 -0
  138. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_keywords_add_update_delete.yaml +0 -0
  139. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_keywords_suspend_resume.yaml +0 -0
  140. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_sitelinks_add_get_delete.yaml +0 -0
  141. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_smartadtargets_add_update_delete.yaml +0 -0
  142. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_live_write/test_live_draft_smartadtargets_suspend_resume.yaml +0 -0
  143. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteAdExtensions.test_add_delete.yaml +0 -0
  144. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteAdGroups.test_add_update_delete.yaml +0 -0
  145. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteAdImages.test_add_delete.yaml +0 -0
  146. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteAds.test_add_text_ad_update_delete.yaml +0 -0
  147. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteAudienceTargets.test_add_delete.yaml +0 -0
  148. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteBidModifiersAdd.test_add_delete_mobile.yaml +0 -0
  149. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteBidModifiersSet.test_set_without_id_is_rejected.yaml +0 -0
  150. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteBids.test_set_bid.yaml +0 -0
  151. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteCampaignDraftLifecycle.test_draft_create_get_delete.yaml +0 -0
  152. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteCampaigns.test_campaign_lifecycle.yaml +0 -0
  153. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteDynamicAds.test_add_update_delete.yaml +0 -0
  154. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteFeeds.test_add_update_delete.yaml +0 -0
  155. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteKeywordBids.test_set_keyword_bid.yaml +0 -0
  156. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteKeywords.test_add_update_delete.yaml +0 -0
  157. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteNegativeKeywordSharedSets.test_add_update_delete.yaml +0 -0
  158. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteRetargeting.test_add_delete.yaml +0 -0
  159. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteSitelinks.test_add_delete.yaml +0 -0
  160. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteSmartAdTargets.test_add_update_delete.yaml +0 -0
  161. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/cassettes/test_integration_write/TestWriteVCards.test_add_delete.yaml +0 -0
  162. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/conftest.py +0 -0
  163. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/fixtures/test-video.mp4 +0 -0
  164. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/reports_cache/raw/fields-list.html +0 -0
  165. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/reports_cache/raw/headers.html +0 -0
  166. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/reports_cache/raw/period.html +0 -0
  167. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/reports_cache/raw/spec.html +0 -0
  168. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/reports_cache/raw/type.html +0 -0
  169. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/reports_cache/spec.json +0 -0
  170. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_auth_bw.py +0 -0
  171. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_auth_op.py +0 -0
  172. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_balance.py +0 -0
  173. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_cli.py +0 -0
  174. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_comprehensive.py +0 -0
  175. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_integration.py +0 -0
  176. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_integration_live_write.py +0 -0
  177. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_integration_write.py +0 -0
  178. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_reports_drift.py +0 -0
  179. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_transport_contract.py +0 -0
  180. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_v4_foundation.py +0 -0
  181. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_v4events.py +0 -0
  182. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_v4goals.py +0 -0
  183. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/test_vendor_imports.py +0 -0
  184. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/adextensions.xml +0 -0
  185. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/adgroups.xml +0 -0
  186. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/adimages.xml +0 -0
  187. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/ads.xml +0 -0
  188. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/advideos.xml +0 -0
  189. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/agencyclients.xml +0 -0
  190. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/audiencetargets.xml +0 -0
  191. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/bidmodifiers.xml +0 -0
  192. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/bids.xml +0 -0
  193. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/businesses.xml +0 -0
  194. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/campaigns.xml +0 -0
  195. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/changes.xml +0 -0
  196. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/clients.xml +0 -0
  197. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/creatives.xml +0 -0
  198. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/dictionaries.xml +0 -0
  199. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/dynamicfeedadtargets.xml +0 -0
  200. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/dynamictextadtargets.xml +0 -0
  201. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/feeds.xml +0 -0
  202. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/imports/adextensiontypes.xsd +0 -0
  203. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/imports/general.xsd +0 -0
  204. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/imports/generalclients.xsd +0 -0
  205. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/keywordbids.xml +0 -0
  206. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/keywords.xml +0 -0
  207. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/keywordsresearch.xml +0 -0
  208. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/leads.xml +0 -0
  209. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/negativekeywordsharedsets.xml +0 -0
  210. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/retargetinglists.xml +0 -0
  211. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/sitelinks.xml +0 -0
  212. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/smartadtargets.xml +0 -0
  213. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/strategies.xml +0 -0
  214. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/turbopages.xml +0 -0
  215. {direct_cli-0.3.3 → direct_cli-0.3.5}/tests/wsdl_cache/vcards.xml +0 -0
@@ -0,0 +1,33 @@
1
+ name: Quality
2
+
3
+ on:
4
+ push:
5
+ branches: ["main"]
6
+ pull_request:
7
+
8
+ jobs:
9
+ quality:
10
+ name: quality
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - name: Checkout repository
14
+ uses: actions/checkout@v4
15
+
16
+ - name: Set up Python
17
+ uses: actions/setup-python@v5
18
+ with:
19
+ python-version: "3.11"
20
+
21
+ - name: Install package with dev dependencies
22
+ run: |
23
+ python -m pip install --upgrade pip
24
+ pip install -e ".[dev]"
25
+
26
+ - name: Lint
27
+ run: ruff check .
28
+
29
+ - name: Type check
30
+ run: mypy .
31
+
32
+ - name: Run offline tests
33
+ run: pytest -m "not integration"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: direct-cli
3
- Version: 0.3.3
3
+ Version: 0.3.5
4
4
  Summary: Command-line interface for Yandex Direct API
5
5
  Author: axisrow
6
6
  License: MIT
@@ -33,9 +33,13 @@ Requires-Dist: pytest-recording>=0.13; extra == "dev"
33
33
  Requires-Dist: vcrpy>=6.0; extra == "dev"
34
34
  Requires-Dist: black>=22.0; extra == "dev"
35
35
  Requires-Dist: flake8>=4.0; extra == "dev"
36
+ Requires-Dist: mypy>=1.8; extra == "dev"
37
+ Requires-Dist: ruff>=0.1; extra == "dev"
36
38
  Requires-Dist: requests>=2.0; extra == "dev"
37
39
  Requires-Dist: beautifulsoup4>=4.12; extra == "dev"
38
40
  Requires-Dist: lxml>=4.9; extra == "dev"
41
+ Requires-Dist: types-setuptools; extra == "dev"
42
+ Requires-Dist: types-tabulate; extra == "dev"
39
43
 
40
44
  # Direct CLI
41
45
 
@@ -82,7 +86,9 @@ OAuth and profile commands:
82
86
  ```bash
83
87
  direct auth login
84
88
  direct auth login --profile agency1
89
+ direct auth login --profile agency1 --format json
85
90
  direct auth login --code abc123 --profile agency1
91
+ printf '%s\n' abc123 | direct auth login --code-stdin --profile agency1
86
92
  direct auth list
87
93
  direct auth use --profile agency1
88
94
  direct auth status --profile agency1
@@ -95,6 +101,10 @@ Notes:
95
101
  - `--login` remains Direct client login.
96
102
  - Authorization is performed via `direct auth login`.
97
103
  - OAuth profiles store refresh tokens and refresh access tokens automatically.
104
+ - In a non-interactive shell, run `direct auth login --profile NAME` first, then finish with `direct auth login --code-stdin --profile NAME` and pass the browser code on stdin.
105
+ - `direct auth login --code CODE --profile NAME` remains supported for compatibility, but `--code-stdin` avoids exposing the code in process arguments.
106
+ - If the first non-interactive step includes `--client-secret`, the secret is remembered for the matching completion step.
107
+ - If a profile already stores a confidential OAuth client, `direct auth login --code CODE --profile NAME` reuses the saved `client_id` and `client_secret`.
98
108
  - `direct auth login --oauth-token TOKEN` is a manual access-token import and does not auto-refresh.
99
109
  - Alias `auth_login` is not supported.
100
110
 
@@ -155,6 +165,19 @@ direct v4events get-events-log --from 2026-04-14T00:00:00 --to 2026-04-15T00:00:
155
165
  direct v4events get-events-log --from 2026-04-14T00:00:00 --to 2026-04-15T00:00:00 --currency RUB --limit 100 --offset 0 --format table
156
166
  ```
157
167
 
168
+ ### V4 Live Wordstat Reports
169
+
170
+ Wordstat reports are asynchronous. Direct CLI makes exactly one API call per
171
+ command and does not poll automatically; repeat `list-reports` or `get-report`
172
+ yourself until the report is ready.
173
+
174
+ ```bash
175
+ direct v4wordstat create-report --phrases "buy laptop,buy desktop" --geo-ids 213
176
+ direct v4wordstat list-reports --format table
177
+ direct v4wordstat get-report --report-id 123 --format table
178
+ direct v4wordstat delete-report --report-id 123
179
+ ```
180
+
158
181
  ### V4 Live Finance
159
182
 
160
183
  Finance methods require an extra financial token for money operations. In the
@@ -165,13 +188,16 @@ per-request token from `--master-token`, `--operation-num`, and
165
188
  `--finance-login`; alternatively pass a precomputed token with `--finance-token`.
166
189
  Environment variables are
167
190
  `YANDEX_DIRECT_MASTER_TOKEN`, `YANDEX_DIRECT_FINANCE_LOGIN`,
168
- `YANDEX_DIRECT_FINANCE_TOKEN`, and `YANDEX_DIRECT_OPERATION_NUM`. Money mutation
169
- commands are dry-run-only in this release and always require `--dry-run`; dry-run
170
- output masks the financial token.
191
+ `YANDEX_DIRECT_FINANCE_TOKEN`, and `YANDEX_DIRECT_OPERATION_NUM`.
192
+ `transfer-money` and `pay-campaigns` are dry-run-only in this release and
193
+ always require `--dry-run`; `create-invoice` can be sent live when `--dry-run`
194
+ is omitted. Dry-run output masks the financial token.
171
195
 
172
196
  ```bash
197
+ direct v4finance get-clients-units --logins client-login,other-client --format table
173
198
  direct v4finance get-credit-limits --logins client-login --master-token MASTER_TOKEN --operation-num 123 --finance-login agency-login
174
199
  direct v4finance get-credit-limits --logins client-login,other-client --format table
200
+ direct v4finance create-invoice --payment 123=100.50 --payment 456=25 --currency RUB --master-token MASTER_TOKEN --operation-num 124 --finance-login agency-login --dry-run
175
201
  direct v4finance check-payment --custom-transaction-id A123456789012345678901234567890B
176
202
  direct v4finance transfer-money --from-campaign-id 123 --to-campaign-id 456 --amount 100.50 --currency RUB --master-token MASTER_TOKEN --operation-num 123 --finance-login agency-login --dry-run
177
203
  direct v4finance pay-campaigns --campaign-ids 123,456 --amount 100.50 --currency RUB --contract-id CONTRACT_ID --pay-method Bank --master-token MASTER_TOKEN --operation-num 123 --finance-login agency-login --dry-run
@@ -179,12 +205,15 @@ direct v4finance pay-campaigns --campaign-ids 123,456 --amount 100.50 --currency
179
205
 
180
206
  ### V4 Live Shared Account
181
207
 
182
- Shared-account mutations are dry-run-only in this release and always require
183
- `--dry-run`.
208
+ Shared-account mutations require `--dry-run` in production and can be sent live
209
+ only with top-level `--sandbox`. These commands follow the official v4 Live
210
+ shared-account method shapes: `EnableSharedAccount` accepts one client `Login`,
211
+ and `AccountManagement` updates shared-account settings through `Accounts`.
184
212
 
185
213
  ```bash
186
214
  direct v4account enable-shared-account --client-login client-login --dry-run
187
215
  direct v4account account-management --action Update --account-id 1327944 --day-budget 100.50 --spend-mode Default --money-in-sms Yes --money-out-sms No --email ops@example.com --money-warning-value 25 --dry-run
216
+ direct --sandbox v4account enable-shared-account --client-login client-login
188
217
  ```
189
218
 
190
219
  ### CLI Convention
@@ -254,13 +283,8 @@ Allowed:
254
283
  direct dictionaries get-geo-regions --region-ids 225,187 --fields GeoRegionId,GeoRegionName
255
284
  ```
256
285
 
257
- Not allowed:
258
-
259
- ```bash
260
- direct dictionaries get-geo-regions \
261
- --region-ids 225,187 \
262
- --fields GeoRegionId,GeoRegionName
263
- ```
286
+ Not allowed: splitting a canonical `direct ...` command over multiple shell
287
+ lines with `\`.
264
288
 
265
289
  #### Flag Design Rules
266
290
 
@@ -286,12 +310,8 @@ Use:
286
310
  direct changes check-campaigns --timestamp 2026-04-14T00:00:00
287
311
  ```
288
312
 
289
- Do not use:
290
-
291
- ```bash
292
- direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
293
- direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
294
- ```
313
+ Do not use: a timestamp with a `Z` suffix, or a quoted timestamp that contains
314
+ a space between the date and time.
295
315
 
296
316
  #### Documentation Contract
297
317
 
@@ -313,17 +333,9 @@ direct dynamicads set-bids --id 789 --bid 12500000 --context-bid 9000000 --prior
313
333
  direct dictionaries get-geo-regions --name Moscow --region-ids 225,187 --exact-names Москва,Санкт-Петербург --fields GeoRegionId,GeoRegionName
314
334
  ```
315
335
 
316
- Invalid examples:
317
-
318
- ```bash
319
- direct dictionaries get-geo-regions --json '{"GeoRegionIds":[225]}' --fields GeoRegionId,GeoRegionName
320
- direct dynamicads set-bids --id 789 --bid 12500000 --json '{"StrategyPriority":"HIGH"}'
321
- direct dictionaries get-geo-regions \
322
- --region-ids 225 \
323
- --fields GeoRegionId,GeoRegionName
324
- direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
325
- direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
326
- ```
336
+ Invalid examples include command lines that pass raw JSON flags, use shell
337
+ line continuations, add timezone suffixes to CLI datetimes, or quote
338
+ space-separated datetime values.
327
339
 
328
340
  #### Campaigns
329
341
 
@@ -435,8 +447,8 @@ direct dynamicads set-bids --id 789 --bid 12500000 --context-bid 9000000 --prior
435
447
 
436
448
  # Shared bidding strategies
437
449
  direct strategies get --limit 5
438
- direct strategies add --name "Shared Clicks" --type WbMaximumClicks --params '{"SpendLimit":1000000000,"AverageCpc":30000000}' --dry-run
439
- direct strategies update --id 42 --params '{"AverageCpc":35000000}' --dry-run
450
+ direct strategies add --name "Shared Clicks" --type WbMaximumClicks --spend-limit 1000000000 --average-cpc 30000000 --dry-run
451
+ direct strategies update --id 42 --type WbMaximumClicks --average-cpc 35000000 --dry-run
440
452
  direct strategies archive --id 42 --dry-run
441
453
 
442
454
  # Dynamic feed ad targets
@@ -611,6 +623,11 @@ The report contains one row per `WRITE_SANDBOX` command:
611
623
  The same OAuth token works for both production and the sandbox; no separate
612
624
  sandbox token is needed.
613
625
 
626
+ For `v4account` sandbox smoke, `enable-shared-account` uses
627
+ `YANDEX_DIRECT_V4ACCOUNT_CLIENT_LOGIN` or falls back to `YANDEX_DIRECT_LOGIN`.
628
+ `account-management` requires `YANDEX_DIRECT_V4ACCOUNT_ACCOUNT_ID`; without it
629
+ the runner reports `NOT_COVERED` for that command.
630
+
614
631
  #### Re-recording write cassettes
615
632
 
616
633
  The `integration_write` pytest tier still replays stored write-test traffic
@@ -731,7 +748,9 @@ OAuth и profile-команды:
731
748
  ```bash
732
749
  direct auth login
733
750
  direct auth login --profile agency1
751
+ direct auth login --profile agency1 --format json
734
752
  direct auth login --code abc123 --profile agency1
753
+ printf '%s\n' abc123 | direct auth login --code-stdin --profile agency1
735
754
  direct auth list
736
755
  direct auth use --profile agency1
737
756
  direct auth status --profile agency1
@@ -740,6 +759,10 @@ direct --profile agency1 campaigns get
740
759
 
741
760
  Примечания:
742
761
  - OAuth profiles сохраняют refresh token и автоматически обновляют access token.
762
+ - В non-interactive shell сначала выполните `direct auth login --profile NAME`, затем завершите через `direct auth login --code-stdin --profile NAME` и передайте browser code через stdin.
763
+ - `direct auth login --code CODE --profile NAME` сохраняется для совместимости, но `--code-stdin` не раскрывает код в process arguments.
764
+ - Если первый non-interactive шаг включает `--client-secret`, secret запоминается для последующего completion step.
765
+ - Если profile уже хранит confidential OAuth client, `direct auth login --code CODE --profile NAME` использует сохраненные `client_id` и `client_secret`.
743
766
  - `direct auth login --oauth-token TOKEN` импортирует access token вручную и не включает auto-refresh.
744
767
 
745
768
  Порядок выбора credentials:
@@ -881,13 +904,8 @@ Allowed:
881
904
  direct dictionaries get-geo-regions --region-ids 225,187 --fields GeoRegionId,GeoRegionName
882
905
  ```
883
906
 
884
- Not allowed:
885
-
886
- ```bash
887
- direct dictionaries get-geo-regions \
888
- --region-ids 225,187 \
889
- --fields GeoRegionId,GeoRegionName
890
- ```
907
+ Not allowed: splitting a canonical `direct ...` command over multiple shell
908
+ lines with `\`.
891
909
 
892
910
  #### Flag Design Rules
893
911
 
@@ -913,12 +931,8 @@ Use:
913
931
  direct changes check-campaigns --timestamp 2026-04-14T00:00:00
914
932
  ```
915
933
 
916
- Do not use:
917
-
918
- ```bash
919
- direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
920
- direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
921
- ```
934
+ Do not use: a timestamp with a `Z` suffix, or a quoted timestamp that contains
935
+ a space between the date and time.
922
936
 
923
937
  #### Documentation Contract
924
938
 
@@ -939,17 +953,9 @@ direct dynamicads set-bids --id 789 --bid 12500000
939
953
  direct dictionaries get-geo-regions --region-ids 225 --fields GeoRegionId,GeoRegionName
940
954
  ```
941
955
 
942
- Invalid examples:
943
-
944
- ```bash
945
- direct dictionaries get-geo-regions --json '{"GeoRegionIds":[225]}' --fields GeoRegionId,GeoRegionName
946
- direct dynamicads set-bids --id 789 --bid 12500000 --json '{"StrategyPriority":"HIGH"}'
947
- direct dictionaries get-geo-regions \
948
- --region-ids 225 \
949
- --fields GeoRegionId,GeoRegionName
950
- direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
951
- direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
952
- ```
956
+ Invalid examples include command lines that pass raw JSON flags, use shell
957
+ line continuations, add timezone suffixes to CLI datetimes, or quote
958
+ space-separated datetime values.
953
959
 
954
960
  #### Кампании
955
961
 
@@ -1061,8 +1067,8 @@ direct dynamicads set-bids --id 789 --bid 12500000 --context-bid 9000000 --prior
1061
1067
 
1062
1068
  # Общие стратегии ставок
1063
1069
  direct strategies get --limit 5
1064
- direct strategies add --name "Общая стратегия" --type WbMaximumClicks --params '{"SpendLimit":1000000000,"AverageCpc":30000000}' --dry-run
1065
- direct strategies update --id 42 --params '{"AverageCpc":35000000}' --dry-run
1070
+ direct strategies add --name "Общая стратегия" --type WbMaximumClicks --spend-limit 1000000000 --average-cpc 30000000 --dry-run
1071
+ direct strategies update --id 42 --type WbMaximumClicks --average-cpc 35000000 --dry-run
1066
1072
  direct strategies archive --id 42 --dry-run
1067
1073
 
1068
1074
  # Динамические таргеты по фиду
@@ -1206,6 +1212,11 @@ best-effort. Отчёт содержит одну строку на каждую
1206
1212
  Один и тот же OAuth-токен работает и для продакшена, и для sandbox; отдельный
1207
1213
  sandbox-токен не нужен.
1208
1214
 
1215
+ Для `v4account` sandbox smoke команда `enable-shared-account` использует
1216
+ `YANDEX_DIRECT_V4ACCOUNT_CLIENT_LOGIN` или fallback на `YANDEX_DIRECT_LOGIN`.
1217
+ Для `account-management` нужна переменная
1218
+ `YANDEX_DIRECT_V4ACCOUNT_ACCOUNT_ID`; без неё runner покажет `NOT_COVERED`.
1219
+
1209
1220
  #### Перезапись write-кассет
1210
1221
 
1211
1222
  Уровень `integration_write` в pytest всё ещё воспроизводит сохранённый
@@ -43,7 +43,9 @@ OAuth and profile commands:
43
43
  ```bash
44
44
  direct auth login
45
45
  direct auth login --profile agency1
46
+ direct auth login --profile agency1 --format json
46
47
  direct auth login --code abc123 --profile agency1
48
+ printf '%s\n' abc123 | direct auth login --code-stdin --profile agency1
47
49
  direct auth list
48
50
  direct auth use --profile agency1
49
51
  direct auth status --profile agency1
@@ -56,6 +58,10 @@ Notes:
56
58
  - `--login` remains Direct client login.
57
59
  - Authorization is performed via `direct auth login`.
58
60
  - OAuth profiles store refresh tokens and refresh access tokens automatically.
61
+ - In a non-interactive shell, run `direct auth login --profile NAME` first, then finish with `direct auth login --code-stdin --profile NAME` and pass the browser code on stdin.
62
+ - `direct auth login --code CODE --profile NAME` remains supported for compatibility, but `--code-stdin` avoids exposing the code in process arguments.
63
+ - If the first non-interactive step includes `--client-secret`, the secret is remembered for the matching completion step.
64
+ - If a profile already stores a confidential OAuth client, `direct auth login --code CODE --profile NAME` reuses the saved `client_id` and `client_secret`.
59
65
  - `direct auth login --oauth-token TOKEN` is a manual access-token import and does not auto-refresh.
60
66
  - Alias `auth_login` is not supported.
61
67
 
@@ -116,6 +122,19 @@ direct v4events get-events-log --from 2026-04-14T00:00:00 --to 2026-04-15T00:00:
116
122
  direct v4events get-events-log --from 2026-04-14T00:00:00 --to 2026-04-15T00:00:00 --currency RUB --limit 100 --offset 0 --format table
117
123
  ```
118
124
 
125
+ ### V4 Live Wordstat Reports
126
+
127
+ Wordstat reports are asynchronous. Direct CLI makes exactly one API call per
128
+ command and does not poll automatically; repeat `list-reports` or `get-report`
129
+ yourself until the report is ready.
130
+
131
+ ```bash
132
+ direct v4wordstat create-report --phrases "buy laptop,buy desktop" --geo-ids 213
133
+ direct v4wordstat list-reports --format table
134
+ direct v4wordstat get-report --report-id 123 --format table
135
+ direct v4wordstat delete-report --report-id 123
136
+ ```
137
+
119
138
  ### V4 Live Finance
120
139
 
121
140
  Finance methods require an extra financial token for money operations. In the
@@ -126,13 +145,16 @@ per-request token from `--master-token`, `--operation-num`, and
126
145
  `--finance-login`; alternatively pass a precomputed token with `--finance-token`.
127
146
  Environment variables are
128
147
  `YANDEX_DIRECT_MASTER_TOKEN`, `YANDEX_DIRECT_FINANCE_LOGIN`,
129
- `YANDEX_DIRECT_FINANCE_TOKEN`, and `YANDEX_DIRECT_OPERATION_NUM`. Money mutation
130
- commands are dry-run-only in this release and always require `--dry-run`; dry-run
131
- output masks the financial token.
148
+ `YANDEX_DIRECT_FINANCE_TOKEN`, and `YANDEX_DIRECT_OPERATION_NUM`.
149
+ `transfer-money` and `pay-campaigns` are dry-run-only in this release and
150
+ always require `--dry-run`; `create-invoice` can be sent live when `--dry-run`
151
+ is omitted. Dry-run output masks the financial token.
132
152
 
133
153
  ```bash
154
+ direct v4finance get-clients-units --logins client-login,other-client --format table
134
155
  direct v4finance get-credit-limits --logins client-login --master-token MASTER_TOKEN --operation-num 123 --finance-login agency-login
135
156
  direct v4finance get-credit-limits --logins client-login,other-client --format table
157
+ direct v4finance create-invoice --payment 123=100.50 --payment 456=25 --currency RUB --master-token MASTER_TOKEN --operation-num 124 --finance-login agency-login --dry-run
136
158
  direct v4finance check-payment --custom-transaction-id A123456789012345678901234567890B
137
159
  direct v4finance transfer-money --from-campaign-id 123 --to-campaign-id 456 --amount 100.50 --currency RUB --master-token MASTER_TOKEN --operation-num 123 --finance-login agency-login --dry-run
138
160
  direct v4finance pay-campaigns --campaign-ids 123,456 --amount 100.50 --currency RUB --contract-id CONTRACT_ID --pay-method Bank --master-token MASTER_TOKEN --operation-num 123 --finance-login agency-login --dry-run
@@ -140,12 +162,15 @@ direct v4finance pay-campaigns --campaign-ids 123,456 --amount 100.50 --currency
140
162
 
141
163
  ### V4 Live Shared Account
142
164
 
143
- Shared-account mutations are dry-run-only in this release and always require
144
- `--dry-run`.
165
+ Shared-account mutations require `--dry-run` in production and can be sent live
166
+ only with top-level `--sandbox`. These commands follow the official v4 Live
167
+ shared-account method shapes: `EnableSharedAccount` accepts one client `Login`,
168
+ and `AccountManagement` updates shared-account settings through `Accounts`.
145
169
 
146
170
  ```bash
147
171
  direct v4account enable-shared-account --client-login client-login --dry-run
148
172
  direct v4account account-management --action Update --account-id 1327944 --day-budget 100.50 --spend-mode Default --money-in-sms Yes --money-out-sms No --email ops@example.com --money-warning-value 25 --dry-run
173
+ direct --sandbox v4account enable-shared-account --client-login client-login
149
174
  ```
150
175
 
151
176
  ### CLI Convention
@@ -215,13 +240,8 @@ Allowed:
215
240
  direct dictionaries get-geo-regions --region-ids 225,187 --fields GeoRegionId,GeoRegionName
216
241
  ```
217
242
 
218
- Not allowed:
219
-
220
- ```bash
221
- direct dictionaries get-geo-regions \
222
- --region-ids 225,187 \
223
- --fields GeoRegionId,GeoRegionName
224
- ```
243
+ Not allowed: splitting a canonical `direct ...` command over multiple shell
244
+ lines with `\`.
225
245
 
226
246
  #### Flag Design Rules
227
247
 
@@ -247,12 +267,8 @@ Use:
247
267
  direct changes check-campaigns --timestamp 2026-04-14T00:00:00
248
268
  ```
249
269
 
250
- Do not use:
251
-
252
- ```bash
253
- direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
254
- direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
255
- ```
270
+ Do not use: a timestamp with a `Z` suffix, or a quoted timestamp that contains
271
+ a space between the date and time.
256
272
 
257
273
  #### Documentation Contract
258
274
 
@@ -274,17 +290,9 @@ direct dynamicads set-bids --id 789 --bid 12500000 --context-bid 9000000 --prior
274
290
  direct dictionaries get-geo-regions --name Moscow --region-ids 225,187 --exact-names Москва,Санкт-Петербург --fields GeoRegionId,GeoRegionName
275
291
  ```
276
292
 
277
- Invalid examples:
278
-
279
- ```bash
280
- direct dictionaries get-geo-regions --json '{"GeoRegionIds":[225]}' --fields GeoRegionId,GeoRegionName
281
- direct dynamicads set-bids --id 789 --bid 12500000 --json '{"StrategyPriority":"HIGH"}'
282
- direct dictionaries get-geo-regions \
283
- --region-ids 225 \
284
- --fields GeoRegionId,GeoRegionName
285
- direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
286
- direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
287
- ```
293
+ Invalid examples include command lines that pass raw JSON flags, use shell
294
+ line continuations, add timezone suffixes to CLI datetimes, or quote
295
+ space-separated datetime values.
288
296
 
289
297
  #### Campaigns
290
298
 
@@ -396,8 +404,8 @@ direct dynamicads set-bids --id 789 --bid 12500000 --context-bid 9000000 --prior
396
404
 
397
405
  # Shared bidding strategies
398
406
  direct strategies get --limit 5
399
- direct strategies add --name "Shared Clicks" --type WbMaximumClicks --params '{"SpendLimit":1000000000,"AverageCpc":30000000}' --dry-run
400
- direct strategies update --id 42 --params '{"AverageCpc":35000000}' --dry-run
407
+ direct strategies add --name "Shared Clicks" --type WbMaximumClicks --spend-limit 1000000000 --average-cpc 30000000 --dry-run
408
+ direct strategies update --id 42 --type WbMaximumClicks --average-cpc 35000000 --dry-run
401
409
  direct strategies archive --id 42 --dry-run
402
410
 
403
411
  # Dynamic feed ad targets
@@ -572,6 +580,11 @@ The report contains one row per `WRITE_SANDBOX` command:
572
580
  The same OAuth token works for both production and the sandbox; no separate
573
581
  sandbox token is needed.
574
582
 
583
+ For `v4account` sandbox smoke, `enable-shared-account` uses
584
+ `YANDEX_DIRECT_V4ACCOUNT_CLIENT_LOGIN` or falls back to `YANDEX_DIRECT_LOGIN`.
585
+ `account-management` requires `YANDEX_DIRECT_V4ACCOUNT_ACCOUNT_ID`; without it
586
+ the runner reports `NOT_COVERED` for that command.
587
+
575
588
  #### Re-recording write cassettes
576
589
 
577
590
  The `integration_write` pytest tier still replays stored write-test traffic
@@ -692,7 +705,9 @@ OAuth и profile-команды:
692
705
  ```bash
693
706
  direct auth login
694
707
  direct auth login --profile agency1
708
+ direct auth login --profile agency1 --format json
695
709
  direct auth login --code abc123 --profile agency1
710
+ printf '%s\n' abc123 | direct auth login --code-stdin --profile agency1
696
711
  direct auth list
697
712
  direct auth use --profile agency1
698
713
  direct auth status --profile agency1
@@ -701,6 +716,10 @@ direct --profile agency1 campaigns get
701
716
 
702
717
  Примечания:
703
718
  - OAuth profiles сохраняют refresh token и автоматически обновляют access token.
719
+ - В non-interactive shell сначала выполните `direct auth login --profile NAME`, затем завершите через `direct auth login --code-stdin --profile NAME` и передайте browser code через stdin.
720
+ - `direct auth login --code CODE --profile NAME` сохраняется для совместимости, но `--code-stdin` не раскрывает код в process arguments.
721
+ - Если первый non-interactive шаг включает `--client-secret`, secret запоминается для последующего completion step.
722
+ - Если profile уже хранит confidential OAuth client, `direct auth login --code CODE --profile NAME` использует сохраненные `client_id` и `client_secret`.
704
723
  - `direct auth login --oauth-token TOKEN` импортирует access token вручную и не включает auto-refresh.
705
724
 
706
725
  Порядок выбора credentials:
@@ -842,13 +861,8 @@ Allowed:
842
861
  direct dictionaries get-geo-regions --region-ids 225,187 --fields GeoRegionId,GeoRegionName
843
862
  ```
844
863
 
845
- Not allowed:
846
-
847
- ```bash
848
- direct dictionaries get-geo-regions \
849
- --region-ids 225,187 \
850
- --fields GeoRegionId,GeoRegionName
851
- ```
864
+ Not allowed: splitting a canonical `direct ...` command over multiple shell
865
+ lines with `\`.
852
866
 
853
867
  #### Flag Design Rules
854
868
 
@@ -874,12 +888,8 @@ Use:
874
888
  direct changes check-campaigns --timestamp 2026-04-14T00:00:00
875
889
  ```
876
890
 
877
- Do not use:
878
-
879
- ```bash
880
- direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
881
- direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
882
- ```
891
+ Do not use: a timestamp with a `Z` suffix, or a quoted timestamp that contains
892
+ a space between the date and time.
883
893
 
884
894
  #### Documentation Contract
885
895
 
@@ -900,17 +910,9 @@ direct dynamicads set-bids --id 789 --bid 12500000
900
910
  direct dictionaries get-geo-regions --region-ids 225 --fields GeoRegionId,GeoRegionName
901
911
  ```
902
912
 
903
- Invalid examples:
904
-
905
- ```bash
906
- direct dictionaries get-geo-regions --json '{"GeoRegionIds":[225]}' --fields GeoRegionId,GeoRegionName
907
- direct dynamicads set-bids --id 789 --bid 12500000 --json '{"StrategyPriority":"HIGH"}'
908
- direct dictionaries get-geo-regions \
909
- --region-ids 225 \
910
- --fields GeoRegionId,GeoRegionName
911
- direct changes check-campaigns --timestamp 2026-04-14T00:00:00Z
912
- direct changes check-campaigns --timestamp "2026-04-14 00:00:00"
913
- ```
913
+ Invalid examples include command lines that pass raw JSON flags, use shell
914
+ line continuations, add timezone suffixes to CLI datetimes, or quote
915
+ space-separated datetime values.
914
916
 
915
917
  #### Кампании
916
918
 
@@ -1022,8 +1024,8 @@ direct dynamicads set-bids --id 789 --bid 12500000 --context-bid 9000000 --prior
1022
1024
 
1023
1025
  # Общие стратегии ставок
1024
1026
  direct strategies get --limit 5
1025
- direct strategies add --name "Общая стратегия" --type WbMaximumClicks --params '{"SpendLimit":1000000000,"AverageCpc":30000000}' --dry-run
1026
- direct strategies update --id 42 --params '{"AverageCpc":35000000}' --dry-run
1027
+ direct strategies add --name "Общая стратегия" --type WbMaximumClicks --spend-limit 1000000000 --average-cpc 30000000 --dry-run
1028
+ direct strategies update --id 42 --type WbMaximumClicks --average-cpc 35000000 --dry-run
1027
1029
  direct strategies archive --id 42 --dry-run
1028
1030
 
1029
1031
  # Динамические таргеты по фиду
@@ -1167,6 +1169,11 @@ best-effort. Отчёт содержит одну строку на каждую
1167
1169
  Один и тот же OAuth-токен работает и для продакшена, и для sandbox; отдельный
1168
1170
  sandbox-токен не нужен.
1169
1171
 
1172
+ Для `v4account` sandbox smoke команда `enable-shared-account` использует
1173
+ `YANDEX_DIRECT_V4ACCOUNT_CLIENT_LOGIN` или fallback на `YANDEX_DIRECT_LOGIN`.
1174
+ Для `account-management` нужна переменная
1175
+ `YANDEX_DIRECT_V4ACCOUNT_ACCOUNT_ID`; без неё runner покажет `NOT_COVERED`.
1176
+
1170
1177
  #### Перезапись write-кассет
1171
1178
 
1172
1179
  Уровень `integration_write` в pytest всё ещё воспроизводит сохранённый