xsoar-cli 2.0.2__tar.gz → 2.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 (163) hide show
  1. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/CHANGELOG.md +19 -0
  2. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/PKG-INFO +24 -1
  3. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/README.md +23 -0
  4. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/_version.py +2 -2
  5. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/cli.py +10 -0
  6. xsoar_cli-2.1.1/src/xsoar_cli/commands/completions/README.md +47 -0
  7. xsoar_cli-2.1.1/src/xsoar_cli/commands/completions/commands.py +144 -0
  8. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/manifest/README.md +6 -7
  9. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/manifest/commands.py +19 -6
  10. xsoar_cli-2.1.1/tests/cli/test_completions.py +266 -0
  11. xsoar_cli-2.1.1/tests/unit/__init__.py +0 -0
  12. xsoar_cli-2.1.1/tests/unit/test_main.py +87 -0
  13. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/.github/workflows/main.yml +0 -0
  14. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/.github/workflows/pull-request-open.yml +0 -0
  15. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/.github/workflows/release.yml +0 -0
  16. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/.github/workflows/update-changelog.yml +0 -0
  17. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/.gitignore +0 -0
  18. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/CLAUDE.md +0 -0
  19. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/CONTRIBUTING.md +0 -0
  20. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/LICENSE.txt +0 -0
  21. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/pyproject.toml +0 -0
  22. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/__init__.py +0 -0
  23. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/__init__.py +0 -0
  24. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/case/README.md +0 -0
  25. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/case/__init__.py +0 -0
  26. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/case/commands.py +0 -0
  27. {xsoar_cli-2.0.2/src/xsoar_cli/commands/config → xsoar_cli-2.1.1/src/xsoar_cli/commands/completions}/__init__.py +0 -0
  28. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/config/README.md +0 -0
  29. {xsoar_cli-2.0.2/src/xsoar_cli/commands/content → xsoar_cli-2.1.1/src/xsoar_cli/commands/config}/__init__.py +0 -0
  30. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/config/commands.py +0 -0
  31. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/content/README.md +0 -0
  32. {xsoar_cli-2.0.2/src/xsoar_cli/commands/graph → xsoar_cli-2.1.1/src/xsoar_cli/commands/content}/__init__.py +0 -0
  33. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/content/commands.py +0 -0
  34. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/graph/README.md +0 -0
  35. {xsoar_cli-2.0.2/src/xsoar_cli/commands/integration → xsoar_cli-2.1.1/src/xsoar_cli/commands/graph}/__init__.py +0 -0
  36. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/graph/commands.py +0 -0
  37. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/integration/README.md +0 -0
  38. {xsoar_cli-2.0.2/src/xsoar_cli/commands/manifest → xsoar_cli-2.1.1/src/xsoar_cli/commands/integration}/__init__.py +0 -0
  39. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/integration/commands.py +0 -0
  40. {xsoar_cli-2.0.2/src/xsoar_cli/commands/pack → xsoar_cli-2.1.1/src/xsoar_cli/commands/manifest}/__init__.py +0 -0
  41. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/pack/README.md +0 -0
  42. {xsoar_cli-2.0.2/src/xsoar_cli/commands/plugins → xsoar_cli-2.1.1/src/xsoar_cli/commands/pack}/__init__.py +0 -0
  43. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/pack/commands.py +0 -0
  44. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/plugins/README.md +0 -0
  45. {xsoar_cli-2.0.2/src/xsoar_cli/commands/rbac → xsoar_cli-2.1.1/src/xsoar_cli/commands/plugins}/__init__.py +0 -0
  46. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/plugins/commands.py +0 -0
  47. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/rbac/README.md +0 -0
  48. {xsoar_cli-2.0.2/src/xsoar_cli/error_handling → xsoar_cli-2.1.1/src/xsoar_cli/commands/rbac}/__init__.py +0 -0
  49. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/rbac/commands.py +0 -0
  50. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/configuration.py +0 -0
  51. {xsoar_cli-2.0.2/src/xsoar_cli/utilities → xsoar_cli-2.1.1/src/xsoar_cli/error_handling}/__init__.py +0 -0
  52. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/error_handling/connection.py +0 -0
  53. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/error_handling/http.py +0 -0
  54. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/log.py +0 -0
  55. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/plugins/README.md +0 -0
  56. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/plugins/__init__.py +0 -0
  57. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/plugins/manager.py +0 -0
  58. {xsoar_cli-2.0.2/src/xsoar_cli/xsoar_client → xsoar_cli-2.1.1/src/xsoar_cli/utilities}/__init__.py +0 -0
  59. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/utilities/config_file.py +0 -0
  60. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/utilities/content.py +0 -0
  61. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/utilities/download_content_handlers.py +0 -0
  62. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/utilities/manifest.py +0 -0
  63. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/utilities/validators.py +0 -0
  64. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/utilities/version_check.py +0 -0
  65. {xsoar_cli-2.0.2/src/xsoar_cli/xsoar_client/artifact_providers → xsoar_cli-2.1.1/src/xsoar_cli/xsoar_client}/__init__.py +0 -0
  66. {xsoar_cli-2.0.2/tests/cli → xsoar_cli-2.1.1/src/xsoar_cli/xsoar_client/artifact_providers}/__init__.py +0 -0
  67. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/xsoar_client/artifact_providers/azure.py +0 -0
  68. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/xsoar_client/artifact_providers/base.py +0 -0
  69. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/xsoar_client/artifact_providers/s3.py +0 -0
  70. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/xsoar_client/cases.py +0 -0
  71. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/xsoar_client/client.py +0 -0
  72. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/xsoar_client/constants.py +0 -0
  73. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/xsoar_client/content.py +0 -0
  74. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/xsoar_client/integrations.py +0 -0
  75. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/xsoar_client/packs.py +0 -0
  76. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/xsoar_client/rbac.py +0 -0
  77. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/__init__.py +0 -0
  78. {xsoar_cli-2.0.2/tests/unit → xsoar_cli-2.1.1/tests/cli}/__init__.py +0 -0
  79. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/cli/conftest.py +0 -0
  80. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/cli/test_base.py +0 -0
  81. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/cli/test_case.py +0 -0
  82. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/cli/test_config.py +0 -0
  83. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/cli/test_content.py +0 -0
  84. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/cli/test_graph.py +0 -0
  85. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/cli/test_manifest.py +0 -0
  86. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/cli/test_pack.py +0 -0
  87. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/cli/test_plugins.py +0 -0
  88. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/conftest.py +0 -0
  89. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/cases/create.json +0 -0
  90. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/cases/get.json +0 -0
  91. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/content/automation_search.json +0 -0
  92. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/content/playbook_search.json +0 -0
  93. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/content/user_commands.json +0 -0
  94. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/integrations/instances.json +0 -0
  95. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/manifest/manifest_base.json +0 -0
  96. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/manifest/manifest_invalid.json +0 -0
  97. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/manifest/manifest_with_pack_not_on_server.json +0 -0
  98. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/manifest/server_base_response.json +0 -0
  99. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/manifest/server_base_response_missing_one_pack.json +0 -0
  100. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/manifest/server_base_response_with_updates.json +0 -0
  101. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/manifest/server_base_response_with_updates_and_one_extra.json +0 -0
  102. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/packs/installed.json +0 -0
  103. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/packs/installed_expired.json +0 -0
  104. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/rbac/roles.json +0 -0
  105. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/rbac/user_groups.json +0 -0
  106. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/rbac/users.json +0 -0
  107. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Download/playbook-empty.yml +0 -0
  108. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonPlaybooks/.pack-ignore +0 -0
  109. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonPlaybooks/.secrets-ignore +0 -0
  110. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonPlaybooks/Author_image.png +0 -0
  111. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonPlaybooks/Playbooks/GenericPlaybook.yml +0 -0
  112. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonPlaybooks/README.md +0 -0
  113. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonPlaybooks/pack_metadata.json +0 -0
  114. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonScripts/.pack-ignore +0 -0
  115. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonScripts/.secrets-ignore +0 -0
  116. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonScripts/Author_image.png +0 -0
  117. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonScripts/README.md +0 -0
  118. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonScripts/Scripts/GenericScript/GenericScript.py +0 -0
  119. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonScripts/Scripts/GenericScript/GenericScript.yml +0 -0
  120. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonScripts/Scripts/GenericScript/README.md +0 -0
  121. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonScripts/pack_metadata.json +0 -0
  122. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/.pack-ignore +0 -0
  123. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/.secrets-ignore +0 -0
  124. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Author_image.png +0 -0
  125. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Playbooks/EDR_InitialTriage.yml +0 -0
  126. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/README.md +0 -0
  127. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Scripts/EDR_FetchFile/EDR_FetchFile.py +0 -0
  128. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Scripts/EDR_FetchFile/EDR_FetchFile.yml +0 -0
  129. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Scripts/EDR_FetchFile/README.md +0 -0
  130. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Scripts/EDR_Triage/EDR_Triage.py +0 -0
  131. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Scripts/EDR_Triage/EDR_Triage.yml +0 -0
  132. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Scripts/EDR_Triage/README.md +0 -0
  133. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Scripts/LegacyItem/LegacyItem.py +0 -0
  134. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Scripts/LegacyItem/LegacyItem.yml +0 -0
  135. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Scripts/LegacyItem/README.md +0 -0
  136. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Scripts/LegacyItem/test_data/basescript-dummy.json +0 -0
  137. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/pack_metadata.json +0 -0
  138. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_Layouts/.pack-ignore +0 -0
  139. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_Layouts/.secrets-ignore +0 -0
  140. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_Layouts/Author_image.png +0 -0
  141. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_Layouts/Layouts/layoutscontainer-GenericLayout.json +0 -0
  142. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_Layouts/README.md +0 -0
  143. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_Layouts/pack_metadata.json +0 -0
  144. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/Not_applicable/Playbooks/Empty.yml +0 -0
  145. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/conftest.py +0 -0
  146. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_artifact_azure.py +0 -0
  147. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_artifact_base.py +0 -0
  148. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_artifact_s3.py +0 -0
  149. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_cases.py +0 -0
  150. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_client.py +0 -0
  151. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_config_file.py +0 -0
  152. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_content_domain.py +0 -0
  153. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_content_filters.py +0 -0
  154. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_content_handlers.py +0 -0
  155. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_error_handling.py +0 -0
  156. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_integrations.py +0 -0
  157. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_manifest_utils.py +0 -0
  158. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_packs.py +0 -0
  159. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_plugin_manager.py +0 -0
  160. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_rbac.py +0 -0
  161. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_validators.py +0 -0
  162. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_version_check.py +0 -0
  163. {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/uv.lock +0 -0
@@ -8,6 +8,21 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
8
8
 
9
9
  ### Changed
10
10
 
11
+ - `manifest generate` now uses an `--output-dir` option (default: current directory) instead of a positional path argument. The output file is always named `xsoar_config.json`. Prompts for confirmation if the file already exists.
12
+ - `manifest update`, `manifest validate`, `manifest diff`, and `manifest deploy` now support file path tab completion for the manifest argument.
13
+
14
+ ## [2.1.0] - 2026-04-08
15
+
16
+ ### Added
17
+
18
+ - `completions install` command to generate and install shell completion scripts for Bash, Zsh (including Oh My Zsh), and Fish. Auto-detects the current shell from `$SHELL`, overridable with `--shell`.
19
+ - `completions uninstall` command to remove previously installed completion scripts.
20
+ - Shell completion no longer triggers the version update check or logging setup, which previously leaked output into completion results.
21
+
22
+ ## [2.0.2] - 2026-04-08
23
+
24
+ ### Changed
25
+
11
26
  - Redesigned test suite into a two-layer structure: `tests/cli/` for CLI integration tests (CliRunner-based) and `tests/unit/` for direct unit tests. Replaced repetitive `@patch` decorator stacking and manual `CliRunner` instantiation with shared fixtures (`invoke`, `mock_xsoar_env`, `mock_content_env`, `mock_case_env`) and factory fixtures (`make_mock_client`, `make_http_error`, `make_case_response`).
12
27
 
13
28
  ### Removed
@@ -19,6 +34,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
19
34
  ### Added
20
35
 
21
36
  - `content download` subcommand for downloading individual content items by name. Supports playbooks and layouts (`xsoar-cli content download --type playbook|layout <name>`).
37
+ - `content download --output` option to specify the content repository root directory. Useful when running xsoar-cli from outside the content repository.
38
+ - `content download` automatically runs `demisto-sdk format` on downloaded files to ensure they conform to the content repository standard.
39
+ - `content download` re-attaches downloaded content items to their pack after writing, so they no longer appear as detached in XSOAR.
40
+ - `content download` resolves the content item's pack ID and writes to the correct `Packs/<pack_id>/` directory. Prompts for fallback to the current working directory if the pack directory does not exist.
22
41
 
23
42
  ## [2.0.0] - 2026-04-07
24
43
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xsoar-cli
3
- Version: 2.0.2
3
+ Version: 2.1.1
4
4
  Project-URL: Documentation, https://github.com/tlium/xsoar-cli#readme
5
5
  Project-URL: Issues, https://github.com/tlium/xsoar-cli/issues
6
6
  Project-URL: Source, https://github.com/tlium/xsoar-cli
@@ -111,6 +111,28 @@ Or with pip:
111
111
  pip uninstall xsoar-cli
112
112
  ```
113
113
 
114
+ ## Shell Completion
115
+
116
+ xsoar-cli supports tab completion for Bash, Zsh, and Fish. Completion covers commands, subcommands, and options.
117
+
118
+ The easiest way to set up completions is with the built-in command:
119
+
120
+ ```bash
121
+ xsoar-cli completions install
122
+ ```
123
+
124
+ This auto-detects your shell and writes the completion script to the appropriate location. Use `--shell` to specify a shell explicitly. For Zsh, Oh My Zsh is detected automatically.
125
+
126
+ To remove completions:
127
+
128
+ ```bash
129
+ xsoar-cli completions uninstall
130
+ ```
131
+
132
+ Regenerate completions after upgrading xsoar-cli by running `xsoar-cli completions install` again.
133
+
134
+ For manual setup or details, see the [completions command documentation](src/xsoar_cli/commands/completions/README.md).
135
+
114
136
  ## Configuration
115
137
 
116
138
  The xsoar-cli config file is located in `~/.config/xsoar-cli/config.json`. To create a configuration file from template, please run:
@@ -236,6 +258,7 @@ For more information on a specific command execute `xsoar-cli <command> --help`.
236
258
  ### Commands
237
259
 
238
260
  - **[case](src/xsoar_cli/commands/case/README.md)** - Retrieve case details and clone cases between environments
261
+ - **[completions](src/xsoar_cli/commands/completions/README.md)** - Install and manage shell completion
239
262
  - **[content](src/xsoar_cli/commands/content/README.md)** - Inspect and manage content items on your XSOAR server
240
263
  - **[config](src/xsoar_cli/commands/config/README.md)** - Create, validate, and manage CLI configuration files
241
264
  - **[graph](src/xsoar_cli/commands/graph/README.md)** - Generate visual dependency graphs for content packs
@@ -81,6 +81,28 @@ Or with pip:
81
81
  pip uninstall xsoar-cli
82
82
  ```
83
83
 
84
+ ## Shell Completion
85
+
86
+ xsoar-cli supports tab completion for Bash, Zsh, and Fish. Completion covers commands, subcommands, and options.
87
+
88
+ The easiest way to set up completions is with the built-in command:
89
+
90
+ ```bash
91
+ xsoar-cli completions install
92
+ ```
93
+
94
+ This auto-detects your shell and writes the completion script to the appropriate location. Use `--shell` to specify a shell explicitly. For Zsh, Oh My Zsh is detected automatically.
95
+
96
+ To remove completions:
97
+
98
+ ```bash
99
+ xsoar-cli completions uninstall
100
+ ```
101
+
102
+ Regenerate completions after upgrading xsoar-cli by running `xsoar-cli completions install` again.
103
+
104
+ For manual setup or details, see the [completions command documentation](src/xsoar_cli/commands/completions/README.md).
105
+
84
106
  ## Configuration
85
107
 
86
108
  The xsoar-cli config file is located in `~/.config/xsoar-cli/config.json`. To create a configuration file from template, please run:
@@ -206,6 +228,7 @@ For more information on a specific command execute `xsoar-cli <command> --help`.
206
228
  ### Commands
207
229
 
208
230
  - **[case](src/xsoar_cli/commands/case/README.md)** - Retrieve case details and clone cases between environments
231
+ - **[completions](src/xsoar_cli/commands/completions/README.md)** - Install and manage shell completion
209
232
  - **[content](src/xsoar_cli/commands/content/README.md)** - Inspect and manage content items on your XSOAR server
210
233
  - **[config](src/xsoar_cli/commands/config/README.md)** - Create, validate, and manage CLI configuration files
211
234
  - **[graph](src/xsoar_cli/commands/graph/README.md)** - Generate visual dependency graphs for content packs
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '2.0.2'
22
- __version_tuple__ = version_tuple = (2, 0, 2)
21
+ __version__ = version = '2.1.1'
22
+ __version_tuple__ = version_tuple = (2, 1, 1)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -8,11 +8,13 @@
8
8
 
9
9
  import logging
10
10
  import logging.handlers
11
+ import os
11
12
  import sys
12
13
 
13
14
  import click
14
15
 
15
16
  from .commands.case import commands as case_commands
17
+ from .commands.completions import commands as completions_commands
16
18
  from .commands.config import commands as config_commands
17
19
  from .commands.content import commands as content_commands
18
20
  from .commands.graph import commands as graph_commands
@@ -64,6 +66,7 @@ def cli(ctx: click.Context, debug: bool) -> None:
64
66
 
65
67
  def _register_commands() -> None:
66
68
  cli.add_command(case_commands.case)
69
+ cli.add_command(completions_commands.completions)
67
70
  cli.add_command(config_commands.config)
68
71
  cli.add_command(content_commands.content)
69
72
 
@@ -119,6 +122,13 @@ _setup: LoggingSetup | None = None
119
122
  def main() -> None:
120
123
  """Entry point (pyproject.toml console_scripts). Sets up logging, invokes
121
124
  the CLI, and ensures the exit code is logged before the process exits."""
125
+ # When Click is handling shell completion (Bash, Zsh, Fish) it re-invokes
126
+ # the CLI with _XSOAR_CLI_COMPLETE set. Skip logging and the version check
127
+ # so their output does not leak into the completion results.
128
+ if "_XSOAR_CLI_COMPLETE" in os.environ:
129
+ cli()
130
+ return
131
+
122
132
  # Start by setting up logging facilitites
123
133
  config_data = read_config_file()
124
134
  global _setup # noqa: PLW0603
@@ -0,0 +1,47 @@
1
+ # Completions
2
+
3
+ Install and manage shell completion for xsoar-cli. Supports Bash, Zsh (including Oh My Zsh), and Fish.
4
+
5
+ ## Install
6
+
7
+ Generate and install the shell completion script. The target shell is auto-detected from `$SHELL` if not specified.
8
+
9
+ For Zsh, the install location is determined automatically:
10
+ - **Oh My Zsh**: `$ZSH_CUSTOM/completions/_xsoar-cli`
11
+ - **Plain Zsh**: `~/.zfunc/_xsoar-cli`
12
+
13
+ **Syntax:** `xsoar-cli completions install [OPTIONS]`
14
+
15
+ **Options:**
16
+ - `--shell [bash|zsh|fish]` - Target shell. Auto-detected from `$SHELL` if not specified.
17
+
18
+ **Examples:**
19
+ ```
20
+ # Auto-detect shell
21
+ xsoar-cli completions install
22
+
23
+ # Specify shell explicitly
24
+ xsoar-cli completions install --shell zsh
25
+ xsoar-cli completions install --shell bash
26
+ xsoar-cli completions install --shell fish
27
+ ```
28
+
29
+ Regenerate completions after upgrading xsoar-cli by running the same command again.
30
+
31
+ ## Uninstall
32
+
33
+ Remove a previously installed completion script. Uses the same detection logic as `install` to locate the file.
34
+
35
+ **Syntax:** `xsoar-cli completions uninstall [OPTIONS]`
36
+
37
+ **Options:**
38
+ - `--shell [bash|zsh|fish]` - Target shell. Auto-detected from `$SHELL` if not specified.
39
+
40
+ **Examples:**
41
+ ```
42
+ # Auto-detect shell
43
+ xsoar-cli completions uninstall
44
+
45
+ # Specify shell explicitly
46
+ xsoar-cli completions uninstall --shell zsh
47
+ ```
@@ -0,0 +1,144 @@
1
+ """Shell completion install and uninstall commands."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ import os
7
+ from pathlib import Path
8
+
9
+ import click
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+ SHELLS = ("bash", "zsh", "fish")
14
+ PROG_NAME = "xsoar-cli"
15
+ COMPLETE_VAR = "_XSOAR_CLI_COMPLETE"
16
+
17
+
18
+ def _detect_shell() -> str | None:
19
+ """Detect the current shell from the SHELL environment variable."""
20
+ shell_path = os.environ.get("SHELL", "")
21
+ if not shell_path:
22
+ return None
23
+ shell_name = Path(shell_path).name
24
+ if shell_name in SHELLS:
25
+ return shell_name
26
+ return None
27
+
28
+
29
+ def _get_completion_path(shell: str) -> Path:
30
+ """Return the target path for the completion script."""
31
+ home = Path.home()
32
+ if shell == "zsh":
33
+ # Prefer Oh My Zsh custom completions directory if available.
34
+ zsh_custom = os.environ.get("ZSH_CUSTOM")
35
+ if zsh_custom:
36
+ return Path(zsh_custom) / "completions" / f"_{PROG_NAME}"
37
+ omz_default = home / ".oh-my-zsh"
38
+ if omz_default.is_dir():
39
+ return omz_default / "custom" / "completions" / f"_{PROG_NAME}"
40
+ return home / ".zfunc" / f"_{PROG_NAME}"
41
+ if shell == "bash":
42
+ return home / f".{PROG_NAME}-complete.bash"
43
+ if shell == "fish":
44
+ return home / ".config" / "fish" / "completions" / f"{PROG_NAME}.fish"
45
+ msg = f"Unsupported shell: {shell}"
46
+ raise ValueError(msg)
47
+
48
+
49
+ def _generate_completion_script(shell: str) -> str:
50
+ """Generate the Click completion script for the given shell."""
51
+ # Lazy import to avoid circular import at module load time. The cli
52
+ # module imports this command group at startup, but this function is
53
+ # only called when the user runs "completions install".
54
+ from click.shell_completion import get_completion_class # Lazy import for performance reasons
55
+
56
+ from xsoar_cli.cli import cli as cli_group # Lazy import for performance reasons
57
+
58
+ cls = get_completion_class(shell)
59
+ if cls is None:
60
+ msg = f"No completion support for shell: {shell}"
61
+ raise click.ClickException(msg)
62
+ comp = cls(cli_group, {}, PROG_NAME, COMPLETE_VAR)
63
+ return comp.source()
64
+
65
+
66
+ def _resolve_shell(shell_name: str | None) -> str:
67
+ """Return a validated shell name, auto-detecting if not provided."""
68
+ if shell_name is not None:
69
+ return shell_name
70
+ detected = _detect_shell()
71
+ if detected is None:
72
+ raise click.ClickException("Could not detect shell from $SHELL. Use --shell to specify it explicitly.")
73
+ return detected
74
+
75
+
76
+ @click.group(help="Install and manage shell completion for xsoar-cli.")
77
+ def completions() -> None:
78
+ pass
79
+
80
+
81
+ @click.command()
82
+ @click.option(
83
+ "--shell",
84
+ "shell_name",
85
+ type=click.Choice(SHELLS),
86
+ default=None,
87
+ help="Target shell. Auto-detected from $SHELL if not specified.",
88
+ )
89
+ def install(shell_name: str | None) -> None:
90
+ """Install shell completion for xsoar-cli."""
91
+ shell = _resolve_shell(shell_name)
92
+ script = _generate_completion_script(shell)
93
+ target = _get_completion_path(shell)
94
+
95
+ target.parent.mkdir(parents=True, exist_ok=True)
96
+ target.write_text(script)
97
+ logger.info("Wrote %s completion script to %s", shell, target)
98
+ click.echo(f"Completion script written to {target}")
99
+
100
+ if shell == "zsh":
101
+ zsh_custom = os.environ.get("ZSH_CUSTOM")
102
+ omz_dir = Path.home() / ".oh-my-zsh"
103
+ if not zsh_custom and not omz_dir.is_dir():
104
+ click.echo(
105
+ "\nAdd the following to your ~/.zshrc (before compinit):"
106
+ "\n\n fpath+=~/.zfunc"
107
+ "\n autoload -Uz compinit && compinit"
108
+ "\n\nThen reload with: exec zsh"
109
+ )
110
+ else:
111
+ click.echo("\nReload your shell with: exec zsh")
112
+ elif shell == "bash":
113
+ click.echo(f"\nAdd the following to your ~/.bashrc:\n\n source {target}\n\nThen reload with: source ~/.bashrc")
114
+ elif shell == "fish":
115
+ click.echo("\nNo further configuration needed. Reload with: exec fish")
116
+
117
+
118
+ @click.command()
119
+ @click.option(
120
+ "--shell",
121
+ "shell_name",
122
+ type=click.Choice(SHELLS),
123
+ default=None,
124
+ help="Target shell. Auto-detected from $SHELL if not specified.",
125
+ )
126
+ def uninstall(shell_name: str | None) -> None:
127
+ """Remove shell completion for xsoar-cli."""
128
+ shell = _resolve_shell(shell_name)
129
+ target = _get_completion_path(shell)
130
+
131
+ if not target.is_file():
132
+ click.echo(f"No completion file found at {target}")
133
+ return
134
+
135
+ target.unlink()
136
+ logger.info("Removed %s completion script from %s", shell, target)
137
+ click.echo(f"Removed completion file {target}")
138
+
139
+ if shell == "bash":
140
+ click.echo(f"\nRemember to remove the following line from your ~/.bashrc:\n\n source {target}")
141
+
142
+
143
+ completions.add_command(install)
144
+ completions.add_command(uninstall)
@@ -4,20 +4,19 @@ Content pack deployment management commands using a declarative configuration fi
4
4
 
5
5
  ## Generate
6
6
 
7
- Generate a new manifest file from currently installed content packs. Assumes all packs are marketplace packs (no custom packs).
7
+ Generate a new manifest file from currently installed content packs. Assumes all packs are marketplace packs (no custom packs). The output file is always named `xsoar_config.json`. Prompts for confirmation if the file already exists.
8
8
 
9
- **Syntax:** `xsoar-cli manifest generate [OPTIONS] MANIFEST_PATH`
9
+ **Syntax:** `xsoar-cli manifest generate [OPTIONS]`
10
10
 
11
11
  **Options:**
12
12
  - `--environment TEXT` - Target environment (default: uses default environment from config)
13
-
14
- **Arguments:**
15
- - `MANIFEST_PATH` - Path where the new manifest file will be created
13
+ - `--output-dir DIRECTORY` - Directory to write xsoar_config.json to (default: current directory)
16
14
 
17
15
  **Examples:**
18
16
  ```
19
- xsoar-cli manifest generate ./xsoar_config.json
20
- xsoar-cli manifest generate --environment prod ./xsoar_config.json
17
+ xsoar-cli manifest generate
18
+ xsoar-cli manifest generate --output-dir /path/to/repo
19
+ xsoar-cli manifest generate --environment prod
21
20
  ```
22
21
 
23
22
  ## Validate
@@ -118,18 +118,31 @@ def manifest() -> None:
118
118
  """Various commands to interact/update/deploy content packs defined in the xsoar_config.json manifest."""
119
119
 
120
120
 
121
+ MANIFEST_FILENAME = "xsoar_config.json"
122
+
123
+
121
124
  @click.command()
122
125
  @click.option("--environment", default=None, help="Default environment set in config file.")
123
- @click.argument("manifest_path", type=str)
126
+ @click.option(
127
+ "--output-dir",
128
+ type=click.Path(exists=True, file_okay=False),
129
+ default=".",
130
+ show_default=True,
131
+ help="Directory to write xsoar_config.json to.",
132
+ )
124
133
  @click.pass_context
125
134
  @load_config
126
135
  @validate_xsoar_connectivity()
127
- def generate(ctx: click.Context, environment: str | None, manifest_path: str) -> None:
136
+ def generate(ctx: click.Context, environment: str | None, output_dir: str) -> None:
128
137
  """Generate a new xsoar_config.json manifest from installed content packs.
129
138
 
130
139
  This command assumes that you do not have any custom content packs uploaded to XSOAR.
131
140
  All packs will be added as "marketplace_packs" in the manifest.
132
141
  """
142
+ manifest_path = str(Path(output_dir) / MANIFEST_FILENAME)
143
+ if Path(manifest_path).is_file():
144
+ click.confirm(f"{manifest_path} already exists. Overwrite?", abort=True)
145
+
133
146
  config = get_xsoar_config(ctx)
134
147
  xsoar_client: Client = config.get_client(environment)
135
148
  logger.info("Generating manifest from installed packs (environment: '%s')", environment or config.default_environment)
@@ -151,7 +164,7 @@ def generate(ctx: click.Context, environment: str | None, manifest_path: str) ->
151
164
 
152
165
  @click.command()
153
166
  @click.option("--environment", default=None, help="Default environment set in config file.")
154
- @click.argument("manifest", type=str)
167
+ @click.argument("manifest", type=click.Path(exists=True))
155
168
  @click.pass_context
156
169
  @load_config
157
170
  @validate_artifacts_provider
@@ -239,7 +252,7 @@ def update(ctx: click.Context, environment: str | None, manifest: str) -> None:
239
252
  default="diff",
240
253
  help="Validate the full manifest, or only the definitions that diff with installed versions",
241
254
  )
242
- @click.argument("manifest", type=str)
255
+ @click.argument("manifest", type=click.Path(exists=True))
243
256
  @click.pass_context
244
257
  @load_config
245
258
  @validate_artifacts_provider
@@ -304,7 +317,7 @@ def validate(ctx: click.Context, environment: str | None, mode: str, manifest: s
304
317
 
305
318
  @click.command()
306
319
  @click.option("--environment", default=None, help="Default environment set in config file.")
307
- @click.argument("manifest", type=str)
320
+ @click.argument("manifest", type=click.Path(exists=True))
308
321
  @click.pass_context
309
322
  @load_config
310
323
  @validate_xsoar_connectivity()
@@ -362,7 +375,7 @@ def diff(ctx: click.Context, manifest: str, environment: str | None) -> None:
362
375
  @click.option("--environment", default=None, help="Default environment set in config file.")
363
376
  @click.option("--verbose", is_flag=True, default=False)
364
377
  @click.option("--yes", is_flag=True, default=False)
365
- @click.argument("manifest", type=str)
378
+ @click.argument("manifest", type=click.Path(exists=True))
366
379
  @click.pass_context
367
380
  @load_config
368
381
  @validate_artifacts_provider