bt-cli 0.4.35__tar.gz → 0.4.36__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.
- {bt_cli-0.4.35/src/bt_cli/data → bt_cli-0.4.36/.claude}/skills/epml/SKILL.md +20 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/CLAUDE.md +1 -1
- {bt_cli-0.4.35 → bt_cli-0.4.36}/PKG-INFO +1 -1
- {bt_cli-0.4.35 → bt_cli-0.4.36}/pyproject.toml +1 -1
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/__init__.py +1 -1
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/data/CLAUDE.md +1 -1
- {bt_cli-0.4.35/.claude → bt_cli-0.4.36/src/bt_cli/data}/skills/epml/SKILL.md +20 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/rbp_tmdategrps.py +62 -9
- {bt_cli-0.4.35/src/bt_cli/data → bt_cli-0.4.36/.claude}/skills/bt/SKILL.md +0 -0
- {bt_cli-0.4.35/src/bt_cli/data → bt_cli-0.4.36/.claude}/skills/entitle/SKILL.md +0 -0
- {bt_cli-0.4.35/src/bt_cli/data → bt_cli-0.4.36/.claude}/skills/epmw/SKILL.md +0 -0
- {bt_cli-0.4.35/src/bt_cli/data → bt_cli-0.4.36/.claude}/skills/pra/SKILL.md +0 -0
- {bt_cli-0.4.35/src/bt_cli/data → bt_cli-0.4.36/.claude}/skills/pws/SKILL.md +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/.env.example +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/.github/workflows/ci.yml +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/.github/workflows/release.yml +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/.gitignore +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/README.md +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/assets/cli-help.png +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/assets/cli-output.png +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/bt-cli.spec +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/bt_entry.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/epml-implementation-plan.md +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/scripts/bt_entry.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/scripts/sync-package-data.sh +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/cli.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/commands/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/commands/configure.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/commands/learn.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/commands/quick.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/core/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/core/auth.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/core/client.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/core/config.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/core/config_file.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/core/csv_utils.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/core/errors.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/core/output.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/core/prompts.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/core/rest_debug.py +0 -0
- {bt_cli-0.4.35/tests/pws → bt_cli-0.4.36/src/bt_cli/data}/__init__.py +0 -0
- {bt_cli-0.4.35/.claude → bt_cli-0.4.36/src/bt_cli/data}/skills/bt/SKILL.md +0 -0
- {bt_cli-0.4.35/.claude → bt_cli-0.4.36/src/bt_cli/data}/skills/entitle/SKILL.md +0 -0
- {bt_cli-0.4.35/.claude → bt_cli-0.4.36/src/bt_cli/data}/skills/epmw/SKILL.md +0 -0
- {bt_cli-0.4.35/.claude → bt_cli-0.4.36/src/bt_cli/data}/skills/pra/SKILL.md +0 -0
- {bt_cli-0.4.35/.claude → bt_cli-0.4.36/src/bt_cli/data}/skills/pws/SKILL.md +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/client/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/client/base.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/commands/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/commands/accounts.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/commands/applications.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/commands/auth.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/commands/bundles.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/commands/integrations.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/commands/permissions.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/commands/policies.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/commands/resources.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/commands/roles.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/commands/users.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/commands/workflows.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/models/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/models/bundle.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/models/common.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/models/integration.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/models/permission.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/models/policy.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/models/resource.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/models/role.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/models/user.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/entitle/models/workflow.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/client/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/client/base.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/audit.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/auth.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/client_pkg.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/external_apis.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/hosts.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/iolog.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/license.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/quick.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/rbp_cmdgrps.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/rbp_entitlement.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/rbp_hostgrps.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/rbp_policy.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/rbp_roles.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/rbp_tests.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/rbp_tx.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/rbp_usergrps.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/settings.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/siems.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/commands/users.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epml/models/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epmw/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epmw/client/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epmw/client/base.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epmw/commands/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epmw/commands/audits.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epmw/commands/auth.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epmw/commands/computers.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epmw/commands/events.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epmw/commands/groups.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epmw/commands/policies.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epmw/commands/quick.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epmw/commands/requests.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epmw/commands/roles.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epmw/commands/tasks.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epmw/commands/users.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/epmw/models/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/client/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/client/base.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/commands/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/commands/auth.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/commands/import_export.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/commands/jump_clients.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/commands/jump_groups.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/commands/jump_items.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/commands/jumpoints.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/commands/policies.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/commands/quick.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/commands/teams.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/commands/users.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/commands/vault.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/models/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/models/common.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/models/jump_client.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/models/jump_group.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/models/jump_item.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/models/jumpoint.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/models/team.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/models/user.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pra/models/vault.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/client/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/client/base.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/client/beyondinsight.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/client/passwordsafe.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/commands/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/commands/accounts.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/commands/assets.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/commands/attributes.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/commands/auth.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/commands/clouds.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/commands/config.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/commands/credentials.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/commands/databases.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/commands/directories.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/commands/functional.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/commands/import_export.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/commands/platforms.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/commands/quick.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/commands/search.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/commands/secrets.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/commands/systems.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/commands/users.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/commands/workgroups.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/config.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/models/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/models/account.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/models/asset.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/models/common.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/src/bt_cli/pws/models/system.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/conftest.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/core/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/core/test_auth.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/core/test_config.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/core/test_errors.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/core/test_rest_debug.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/entitle/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/entitle/test_client.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/entitle/test_commands.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/entitle-smoke-test.sh +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/epml/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/epml/test_client.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/epml/test_commands.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/epmw/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/epmw/test_client.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/epmw/test_commands.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/epmw-quick-test-plan.md +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/fixtures/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/fixtures/responses.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/integration/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/integration/conftest.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/integration/helpers.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/integration/test_entitle_integration.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/integration/test_epmw_integration.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/integration/test_epmw_lifecycle.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/integration/test_pra_integration.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/integration/test_pra_lifecycle.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/integration/test_pws_integration.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/integration/test_pws_lifecycle.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/pra/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/pra/test_client.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/pra/test_commands.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/pra-smoke-test.sh +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/pra-test-plan.md +0 -0
- {bt_cli-0.4.35/src/bt_cli/data → bt_cli-0.4.36/tests/pws}/__init__.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/pws/test_client.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/pws/test_commands.py +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/pws-quick-test-plan.md +0 -0
- {bt_cli-0.4.35 → bt_cli-0.4.36}/tests/pws-smoke-test.sh +0 -0
|
@@ -205,6 +205,26 @@ bt epml quick tests-then-deploy --suite <suite_id> # commits if pass; rollb
|
|
|
205
205
|
|
|
206
206
|
- **`bt epml rbp roles get <id>`** — there is no GET-single-role in the v1 API. The detailed view (role with all child relations resolved) only exists at `/api/v6/pbul/{hostid}/rbp/roledetail/{id}`, which is on the IAM-only authorizer. Not callable with a PAT today. Workaround: use `bt epml rbp roles list` for the role row, then `bt epml rbp roles {cmdgrps,hostgrps,usergrps,tmdategrps} list <id>` to fetch each child relation.
|
|
207
207
|
|
|
208
|
+
## Tenant-side gotchas (not a CLI bug)
|
|
209
|
+
|
|
210
|
+
- **`bt epml rbp tx begin` may return** `400 "RBP Transactions not enabled on host"`. This is a per-tenant feature flag on the PMUL host — transactions need to be enabled at the appliance / settings level before they'll work. The CLI surfaces the server's exact message; nothing client-side to fix. (Verified 2026-05-01 against the lab tenant — host id 100 does not have transactions enabled.) The `quick tests-then-deploy` workflow depends on transactions, so it'll also fail until the host is configured for it.
|
|
211
|
+
|
|
212
|
+
## tmdate shape (`dotw` map)
|
|
213
|
+
|
|
214
|
+
The OpenAPI spec describes `tmdate` as a `string` field with `x-go-name: "JsonDefinition"`. The actual runtime shape is a structured object:
|
|
215
|
+
|
|
216
|
+
```json
|
|
217
|
+
{"dotw": {
|
|
218
|
+
"mon": [{"from":"09:00","to":"17:00"}],
|
|
219
|
+
"tue": [{"from":"09:00","to":"17:00"}],
|
|
220
|
+
...
|
|
221
|
+
"sat": [],
|
|
222
|
+
"sun": []
|
|
223
|
+
}}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
A day with an empty list is inactive. A day can have multiple windows (e.g. split shift). The CLI's `--from/--to/--days` short flags build the map for you; for anything more complex use `--file` with the full JSON.
|
|
227
|
+
|
|
208
228
|
## Path-version policy (CLI internal)
|
|
209
229
|
|
|
210
230
|
Where the spec offers both legacy `/api/pbul/{hostid}/rbp/<x>` and newer
|
|
@@ -205,6 +205,26 @@ bt epml quick tests-then-deploy --suite <suite_id> # commits if pass; rollb
|
|
|
205
205
|
|
|
206
206
|
- **`bt epml rbp roles get <id>`** — there is no GET-single-role in the v1 API. The detailed view (role with all child relations resolved) only exists at `/api/v6/pbul/{hostid}/rbp/roledetail/{id}`, which is on the IAM-only authorizer. Not callable with a PAT today. Workaround: use `bt epml rbp roles list` for the role row, then `bt epml rbp roles {cmdgrps,hostgrps,usergrps,tmdategrps} list <id>` to fetch each child relation.
|
|
207
207
|
|
|
208
|
+
## Tenant-side gotchas (not a CLI bug)
|
|
209
|
+
|
|
210
|
+
- **`bt epml rbp tx begin` may return** `400 "RBP Transactions not enabled on host"`. This is a per-tenant feature flag on the PMUL host — transactions need to be enabled at the appliance / settings level before they'll work. The CLI surfaces the server's exact message; nothing client-side to fix. (Verified 2026-05-01 against the lab tenant — host id 100 does not have transactions enabled.) The `quick tests-then-deploy` workflow depends on transactions, so it'll also fail until the host is configured for it.
|
|
211
|
+
|
|
212
|
+
## tmdate shape (`dotw` map)
|
|
213
|
+
|
|
214
|
+
The OpenAPI spec describes `tmdate` as a `string` field with `x-go-name: "JsonDefinition"`. The actual runtime shape is a structured object:
|
|
215
|
+
|
|
216
|
+
```json
|
|
217
|
+
{"dotw": {
|
|
218
|
+
"mon": [{"from":"09:00","to":"17:00"}],
|
|
219
|
+
"tue": [{"from":"09:00","to":"17:00"}],
|
|
220
|
+
...
|
|
221
|
+
"sat": [],
|
|
222
|
+
"sun": []
|
|
223
|
+
}}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
A day with an empty list is inactive. A day can have multiple windows (e.g. split shift). The CLI's `--from/--to/--days` short flags build the map for you; for anything more complex use `--file` with the full JSON.
|
|
227
|
+
|
|
208
228
|
## Path-version policy (CLI internal)
|
|
209
229
|
|
|
210
230
|
Where the spec offers both legacy `/api/pbul/{hostid}/rbp/<x>` and newer
|
|
@@ -95,7 +95,12 @@ def list_tmdates(
|
|
|
95
95
|
host: Optional[int] = _host_opt(),
|
|
96
96
|
output: OutputFormat = typer.Option(OutputFormat.JSON, "--output", "-o"),
|
|
97
97
|
):
|
|
98
|
-
"""List time/date entries in a group.
|
|
98
|
+
"""List time/date entries in a group.
|
|
99
|
+
|
|
100
|
+
Each entry's schedule lives in the nested `dotw` map. Defaults to JSON
|
|
101
|
+
output because the structure is non-tabular; use `-o table` for a
|
|
102
|
+
summarized day-by-day view.
|
|
103
|
+
"""
|
|
99
104
|
from bt_cli.epml.client import get_client
|
|
100
105
|
try:
|
|
101
106
|
with get_client() as c:
|
|
@@ -104,10 +109,26 @@ def list_tmdates(
|
|
|
104
109
|
print_json(data)
|
|
105
110
|
else:
|
|
106
111
|
rows = data if isinstance(data, list) else (data.get("data", []) if isinstance(data, dict) else [])
|
|
107
|
-
|
|
108
|
-
|
|
112
|
+
view = []
|
|
113
|
+
for r in rows:
|
|
114
|
+
dotw = (r.get("dotw") or {})
|
|
115
|
+
active_days = [d for d in ("mon","tue","wed","thu","fri","sat","sun") if dotw.get(d)]
|
|
116
|
+
# Show window summary using the first day's first window if any
|
|
117
|
+
window = ""
|
|
118
|
+
for d in active_days:
|
|
119
|
+
rng = (dotw.get(d) or [{}])[0]
|
|
120
|
+
if rng.get("from") and rng.get("to"):
|
|
121
|
+
window = f"{rng['from']}-{rng['to']}"
|
|
122
|
+
break
|
|
123
|
+
view.append({
|
|
124
|
+
"description": r.get("description", "") or r.get("name", "") or "-",
|
|
125
|
+
"days": ",".join(active_days) or "-",
|
|
126
|
+
"window": window or "-",
|
|
127
|
+
})
|
|
128
|
+
print_table(view, [
|
|
109
129
|
("Description", "description"),
|
|
110
|
-
("
|
|
130
|
+
("Days", "days"),
|
|
131
|
+
("Window", "window"),
|
|
111
132
|
], title=f"tmdates in tmdategrp {tmdategrp_id}")
|
|
112
133
|
except httpx.HTTPStatusError as e:
|
|
113
134
|
print_api_error(e, "list tmdates"); raise typer.Exit(1)
|
|
@@ -115,18 +136,46 @@ def list_tmdates(
|
|
|
115
136
|
print_api_error(e, "list tmdates"); raise typer.Exit(1)
|
|
116
137
|
|
|
117
138
|
|
|
139
|
+
_VALID_DAYS = ("mon", "tue", "wed", "thu", "fri", "sat", "sun")
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def _build_dotw(from_: str, to: str, days: str) -> dict:
|
|
143
|
+
"""Build a `dotw` map (day-of-the-week → list of from/to ranges).
|
|
144
|
+
|
|
145
|
+
The spec calls the per-tmdate field `tmdate: string` (a JSON definition)
|
|
146
|
+
but the actual API uses a structured object: `{"dotw": {"mon": [{"from":"...","to":"..."}], ...}}`.
|
|
147
|
+
Days that aren't in `--days` get an empty list (= not active).
|
|
148
|
+
"""
|
|
149
|
+
selected = {d.strip().lower() for d in days.split(",") if d.strip()}
|
|
150
|
+
bad = selected - set(_VALID_DAYS)
|
|
151
|
+
if bad:
|
|
152
|
+
raise ValueError(f"unknown days: {','.join(sorted(bad))} — must be in {','.join(_VALID_DAYS)}")
|
|
153
|
+
window = {"from": from_, "to": to}
|
|
154
|
+
return {d: ([window] if d in selected else []) for d in _VALID_DAYS}
|
|
155
|
+
|
|
156
|
+
|
|
118
157
|
@tmdates_app.command("add")
|
|
119
158
|
def add_tmdates(
|
|
120
159
|
tmdategrp_id: int = typer.Argument(..., help="Time/Date group ID"),
|
|
121
|
-
file: Optional[typer.FileText] = typer.Option(None, "--file", "-f", help="JSON file: array of tmdate objects"),
|
|
160
|
+
file: Optional[typer.FileText] = typer.Option(None, "--file", "-f", help="JSON file: array of tmdate objects (full shape, with `dotw`)"),
|
|
122
161
|
description: Optional[str] = typer.Option(None, "--description", "-d", help="Description for a single tmdate (used with --from/--to)"),
|
|
123
162
|
from_: Optional[str] = typer.Option(None, "--from", help="Time window start (e.g. 09:00)"),
|
|
124
163
|
to: Optional[str] = typer.Option(None, "--to", help="Time window end (e.g. 17:00)"),
|
|
164
|
+
days: str = typer.Option("mon,tue,wed,thu,fri", "--days", help="Comma-separated days when --from/--to applies"),
|
|
125
165
|
host: Optional[int] = _host_opt(),
|
|
126
166
|
):
|
|
127
|
-
"""Add tmdate entries.
|
|
167
|
+
"""Add tmdate entries.
|
|
128
168
|
|
|
129
|
-
|
|
169
|
+
Two ways to specify entries:
|
|
170
|
+
|
|
171
|
+
- **--from / --to / --days**: quick one-window helper. Builds a per-day-of-week
|
|
172
|
+
schedule (`dotw` map). Default `--days mon,tue,wed,thu,fri` (weekdays).
|
|
173
|
+
- **--file**: a JSON array of full tmdate objects. Each object should be
|
|
174
|
+
`{"dotw": {"mon": [{"from":"09:00","to":"17:00"}], ...}}` — every weekday key
|
|
175
|
+
with a list of windows. Days you omit are silently treated as inactive.
|
|
176
|
+
|
|
177
|
+
The wrapper around the array (`{"tmdates": [...]}`) is added by the client
|
|
178
|
+
automatically — it's not in the spec but is required by the server.
|
|
130
179
|
"""
|
|
131
180
|
from bt_cli.epml.client import get_client
|
|
132
181
|
if file:
|
|
@@ -136,9 +185,13 @@ def add_tmdates(
|
|
|
136
185
|
raise typer.Exit(2)
|
|
137
186
|
else:
|
|
138
187
|
if not (from_ and to):
|
|
139
|
-
typer.echo("Provide --file, or both --from and --to (with optional --description)", err=True)
|
|
188
|
+
typer.echo("Provide --file, or both --from and --to (with optional --description / --days)", err=True)
|
|
189
|
+
raise typer.Exit(2)
|
|
190
|
+
try:
|
|
191
|
+
entry = {"dotw": _build_dotw(from_, to, days)}
|
|
192
|
+
except ValueError as e:
|
|
193
|
+
typer.echo(f"Bad --days: {e}", err=True)
|
|
140
194
|
raise typer.Exit(2)
|
|
141
|
-
entry = {"from": from_, "to": to}
|
|
142
195
|
if description:
|
|
143
196
|
entry["description"] = description
|
|
144
197
|
tmdates = [entry]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|