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.
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/CHANGELOG.md +19 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/PKG-INFO +24 -1
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/README.md +23 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/_version.py +2 -2
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/cli.py +10 -0
- xsoar_cli-2.1.1/src/xsoar_cli/commands/completions/README.md +47 -0
- xsoar_cli-2.1.1/src/xsoar_cli/commands/completions/commands.py +144 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/manifest/README.md +6 -7
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/manifest/commands.py +19 -6
- xsoar_cli-2.1.1/tests/cli/test_completions.py +266 -0
- xsoar_cli-2.1.1/tests/unit/__init__.py +0 -0
- xsoar_cli-2.1.1/tests/unit/test_main.py +87 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/.github/workflows/main.yml +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/.github/workflows/pull-request-open.yml +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/.github/workflows/release.yml +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/.github/workflows/update-changelog.yml +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/.gitignore +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/CLAUDE.md +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/CONTRIBUTING.md +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/LICENSE.txt +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/pyproject.toml +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/__init__.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/__init__.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/case/README.md +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/case/__init__.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/case/commands.py +0 -0
- {xsoar_cli-2.0.2/src/xsoar_cli/commands/config → xsoar_cli-2.1.1/src/xsoar_cli/commands/completions}/__init__.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/config/README.md +0 -0
- {xsoar_cli-2.0.2/src/xsoar_cli/commands/content → xsoar_cli-2.1.1/src/xsoar_cli/commands/config}/__init__.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/config/commands.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/content/README.md +0 -0
- {xsoar_cli-2.0.2/src/xsoar_cli/commands/graph → xsoar_cli-2.1.1/src/xsoar_cli/commands/content}/__init__.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/content/commands.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/graph/README.md +0 -0
- {xsoar_cli-2.0.2/src/xsoar_cli/commands/integration → xsoar_cli-2.1.1/src/xsoar_cli/commands/graph}/__init__.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/graph/commands.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/integration/README.md +0 -0
- {xsoar_cli-2.0.2/src/xsoar_cli/commands/manifest → xsoar_cli-2.1.1/src/xsoar_cli/commands/integration}/__init__.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/integration/commands.py +0 -0
- {xsoar_cli-2.0.2/src/xsoar_cli/commands/pack → xsoar_cli-2.1.1/src/xsoar_cli/commands/manifest}/__init__.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/pack/README.md +0 -0
- {xsoar_cli-2.0.2/src/xsoar_cli/commands/plugins → xsoar_cli-2.1.1/src/xsoar_cli/commands/pack}/__init__.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/pack/commands.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/plugins/README.md +0 -0
- {xsoar_cli-2.0.2/src/xsoar_cli/commands/rbac → xsoar_cli-2.1.1/src/xsoar_cli/commands/plugins}/__init__.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/plugins/commands.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/rbac/README.md +0 -0
- {xsoar_cli-2.0.2/src/xsoar_cli/error_handling → xsoar_cli-2.1.1/src/xsoar_cli/commands/rbac}/__init__.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/commands/rbac/commands.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/configuration.py +0 -0
- {xsoar_cli-2.0.2/src/xsoar_cli/utilities → xsoar_cli-2.1.1/src/xsoar_cli/error_handling}/__init__.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/error_handling/connection.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/error_handling/http.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/log.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/plugins/README.md +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/plugins/__init__.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/plugins/manager.py +0 -0
- {xsoar_cli-2.0.2/src/xsoar_cli/xsoar_client → xsoar_cli-2.1.1/src/xsoar_cli/utilities}/__init__.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/utilities/config_file.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/utilities/content.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/utilities/download_content_handlers.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/utilities/manifest.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/utilities/validators.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/utilities/version_check.py +0 -0
- {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
- {xsoar_cli-2.0.2/tests/cli → xsoar_cli-2.1.1/src/xsoar_cli/xsoar_client/artifact_providers}/__init__.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/xsoar_client/artifact_providers/azure.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/xsoar_client/artifact_providers/base.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/xsoar_client/artifact_providers/s3.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/xsoar_client/cases.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/xsoar_client/client.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/xsoar_client/constants.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/xsoar_client/content.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/xsoar_client/integrations.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/xsoar_client/packs.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/src/xsoar_cli/xsoar_client/rbac.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/__init__.py +0 -0
- {xsoar_cli-2.0.2/tests/unit → xsoar_cli-2.1.1/tests/cli}/__init__.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/cli/conftest.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/cli/test_base.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/cli/test_case.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/cli/test_config.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/cli/test_content.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/cli/test_graph.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/cli/test_manifest.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/cli/test_pack.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/cli/test_plugins.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/conftest.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/cases/create.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/cases/get.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/content/automation_search.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/content/playbook_search.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/content/user_commands.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/integrations/instances.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/manifest/manifest_base.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/manifest/manifest_invalid.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/manifest/manifest_with_pack_not_on_server.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/manifest/server_base_response.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/manifest/server_base_response_missing_one_pack.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/manifest/server_base_response_with_updates.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/manifest/server_base_response_with_updates_and_one_extra.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/packs/installed.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/packs/installed_expired.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/rbac/roles.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/rbac/user_groups.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/fixtures/rbac/users.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Download/playbook-empty.yml +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonPlaybooks/.pack-ignore +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonPlaybooks/.secrets-ignore +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonPlaybooks/Author_image.png +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonPlaybooks/Playbooks/GenericPlaybook.yml +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonPlaybooks/README.md +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonPlaybooks/pack_metadata.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonScripts/.pack-ignore +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonScripts/.secrets-ignore +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonScripts/Author_image.png +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonScripts/README.md +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonScripts/Scripts/GenericScript/GenericScript.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonScripts/Scripts/GenericScript/GenericScript.yml +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonScripts/Scripts/GenericScript/README.md +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_CommonScripts/pack_metadata.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/.pack-ignore +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/.secrets-ignore +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Author_image.png +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Playbooks/EDR_InitialTriage.yml +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/README.md +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Scripts/EDR_FetchFile/EDR_FetchFile.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Scripts/EDR_FetchFile/EDR_FetchFile.yml +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Scripts/EDR_FetchFile/README.md +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Scripts/EDR_Triage/EDR_Triage.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Scripts/EDR_Triage/EDR_Triage.yml +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Scripts/EDR_Triage/README.md +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Scripts/LegacyItem/LegacyItem.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Scripts/LegacyItem/LegacyItem.yml +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/Scripts/LegacyItem/README.md +0 -0
- {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
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_EDR/pack_metadata.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_Layouts/.pack-ignore +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_Layouts/.secrets-ignore +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_Layouts/Author_image.png +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_Layouts/Layouts/layoutscontainer-GenericLayout.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_Layouts/README.md +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/MyOrg_Layouts/pack_metadata.json +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/mock_content/Packs/Not_applicable/Playbooks/Empty.yml +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/conftest.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_artifact_azure.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_artifact_base.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_artifact_s3.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_cases.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_client.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_config_file.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_content_domain.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_content_filters.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_content_handlers.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_error_handling.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_integrations.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_manifest_utils.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_packs.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_plugin_manager.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_rbac.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_validators.py +0 -0
- {xsoar_cli-2.0.2 → xsoar_cli-2.1.1}/tests/unit/test_version_check.py +0 -0
- {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.
|
|
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.
|
|
22
|
-
__version_tuple__ = version_tuple = (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]
|
|
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
|
|
20
|
-
xsoar-cli manifest generate --
|
|
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.
|
|
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,
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
378
|
+
@click.argument("manifest", type=click.Path(exists=True))
|
|
366
379
|
@click.pass_context
|
|
367
380
|
@load_config
|
|
368
381
|
@validate_artifacts_provider
|