bt-cli 0.4.48__tar.gz → 0.4.49__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.48 → bt_cli-0.4.49}/CLAUDE.md +1 -1
- {bt_cli-0.4.48 → bt_cli-0.4.49}/PKG-INFO +1 -1
- {bt_cli-0.4.48 → bt_cli-0.4.49}/pyproject.toml +1 -1
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/__init__.py +1 -1
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/secrets/commands/dynamic.py +29 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/secrets/test_commands.py +51 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/.claude/skills/bt/SKILL.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/.claude/skills/entitle/SKILL.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/.claude/skills/epml/SKILL.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/.claude/skills/epmw/SKILL.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/.claude/skills/pra/SKILL.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/.claude/skills/pws/SKILL.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/.env.example +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/.github/workflows/ci.yml +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/.github/workflows/release.yml +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/.gitignore +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/README.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/assets/cli-help.png +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/assets/cli-output.png +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/bt-cli.spec +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/bt_entry.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/epml-clients-server-side-filters-plan.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/epml-implementation-plan.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/pf-implementation-plan.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/scripts/bt_entry.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/scripts/pf_onboard.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/scripts/sync-package-data.sh +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/cli.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/commands/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/commands/configure.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/commands/learn.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/commands/quick.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/core/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/core/auth.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/core/client.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/core/config.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/core/config_file.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/core/csv_utils.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/core/errors.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/core/output.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/core/prompts.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/core/rest_debug.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/data/CLAUDE.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/data/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/data/skills/bt/SKILL.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/data/skills/entitle/SKILL.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/data/skills/epml/SKILL.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/data/skills/epmw/SKILL.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/data/skills/pra/SKILL.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/data/skills/pws/SKILL.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/data/skills/secrets/SKILL.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/client/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/client/base.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/commands/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/commands/accounts.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/commands/applications.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/commands/auth.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/commands/bundles.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/commands/integrations.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/commands/permissions.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/commands/policies.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/commands/requests.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/commands/resources.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/commands/roles.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/commands/users.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/commands/workflows.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/models/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/models/bundle.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/models/common.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/models/integration.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/models/permission.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/models/policy.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/models/resource.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/models/role.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/models/user.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/entitle/models/workflow.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/client/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/client/base.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/audit.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/auth.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/client_pkg.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/clients.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/external_apis.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/hosts.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/iolog.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/license.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/quick.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/rbp_cmdgrps.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/rbp_entitlement.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/rbp_hostgrps.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/rbp_policy.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/rbp_roles.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/rbp_tests.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/rbp_tmdategrps.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/rbp_tx.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/rbp_usergrps.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/settings.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/siems.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/commands/users.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epml/models/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epmw/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epmw/client/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epmw/client/base.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epmw/commands/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epmw/commands/audits.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epmw/commands/auth.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epmw/commands/computers.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epmw/commands/events.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epmw/commands/groups.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epmw/commands/policies.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epmw/commands/quick.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epmw/commands/requests.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epmw/commands/roles.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epmw/commands/tasks.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epmw/commands/users.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/epmw/models/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/client/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/client/base.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/commands/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/commands/auth.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/commands/group_policies.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/commands/import_export.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/commands/jump_clients.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/commands/jump_groups.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/commands/jump_items.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/commands/jumpoints.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/commands/policies.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/commands/quick.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/commands/teams.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/commands/users.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/commands/vault.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/models/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/models/common.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/models/group_policy.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/models/jump_client.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/models/jump_group.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/models/jump_item.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/models/jumpoint.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/models/team.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/models/user.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pra/models/vault.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/client/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/client/base.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/client/beyondinsight.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/client/passwordsafe.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/commands/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/commands/accounts.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/commands/assets.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/commands/attributes.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/commands/auth.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/commands/clouds.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/commands/config.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/commands/credentials.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/commands/databases.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/commands/directories.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/commands/functional.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/commands/import_export.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/commands/platforms.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/commands/quick.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/commands/search.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/commands/secrets.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/commands/systems.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/commands/users.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/commands/workgroups.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/config.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/models/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/models/account.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/models/asset.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/models/common.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/pws/models/system.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/secrets/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/secrets/client/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/secrets/client/base.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/secrets/commands/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/secrets/commands/_hints.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/secrets/commands/auth.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/secrets/commands/folders.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/secrets/commands/integrations.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/secrets/commands/leases.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/secrets/commands/static.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/src/bt_cli/secrets/models/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/conftest.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/core/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/core/test_auth.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/core/test_config.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/core/test_errors.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/core/test_rest_debug.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/entitle/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/entitle/test_client.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/entitle/test_commands.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/entitle-smoke-test.sh +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/epml/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/epml/test_client.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/epml/test_commands.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/epmw/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/epmw/test_client.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/epmw/test_commands.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/epmw-quick-test-plan.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/fixtures/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/fixtures/responses.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/integration/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/integration/conftest.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/integration/helpers.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/integration/test_entitle_integration.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/integration/test_epmw_integration.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/integration/test_epmw_lifecycle.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/integration/test_pra_integration.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/integration/test_pra_lifecycle.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/integration/test_pws_integration.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/integration/test_pws_lifecycle.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/pra/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/pra/test_client.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/pra/test_commands.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/pra-smoke-test.sh +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/pra-test-plan.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/pws/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/pws/test_client.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/pws/test_commands.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/pws-quick-test-plan.md +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/pws-smoke-test.sh +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/secrets/__init__.py +0 -0
- {bt_cli-0.4.48 → bt_cli-0.4.49}/tests/secrets/test_client.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# BT-CLI
|
|
2
2
|
|
|
3
|
-
BeyondTrust Platform CLI for Password Safe, Entitle, PRA, EPM Windows, EPM Linux, and the BeyondTrust Secrets API. **Version: 0.4.
|
|
3
|
+
BeyondTrust Platform CLI for Password Safe, Entitle, PRA, EPM Windows, EPM Linux, and the BeyondTrust Secrets API. **Version: 0.4.49**
|
|
4
4
|
|
|
5
5
|
## Setup
|
|
6
6
|
|
|
@@ -46,6 +46,32 @@ def _dynamic_row(item: dict) -> dict:
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
|
|
49
|
+
def _apply_hint(full_path: str, fmt: GenerateFormat) -> str:
|
|
50
|
+
"""Build a one-line apply-recipe in syntax valid for the chosen format.
|
|
51
|
+
|
|
52
|
+
`eval $(...)`, `| iex`, and `for /f` all swallow comment lines harmlessly,
|
|
53
|
+
so embedding the hint costs nothing when the output is piped through —
|
|
54
|
+
it's just discoverable for users who run the command on its own first.
|
|
55
|
+
|
|
56
|
+
Non-shell formats (env / dotenv / json) get no hint: env/dotenv are for
|
|
57
|
+
writing to files, json is for scripts; neither has a single canonical
|
|
58
|
+
apply command.
|
|
59
|
+
"""
|
|
60
|
+
if fmt is GenerateFormat.EXPORT:
|
|
61
|
+
return f"# Tip: apply with -> eval $(bt secrets dynamic generate {full_path})"
|
|
62
|
+
if fmt is GenerateFormat.POWERSHELL:
|
|
63
|
+
return (
|
|
64
|
+
f"# Tip: apply with -> "
|
|
65
|
+
f"bt secrets dynamic generate {full_path} --format powershell | iex"
|
|
66
|
+
)
|
|
67
|
+
if fmt is GenerateFormat.CMD:
|
|
68
|
+
return (
|
|
69
|
+
f'REM Tip: apply with -> for /f "delims=" %i in '
|
|
70
|
+
f"('bt secrets dynamic generate {full_path} --format cmd') do %i"
|
|
71
|
+
)
|
|
72
|
+
return ""
|
|
73
|
+
|
|
74
|
+
|
|
49
75
|
def _format_credentials(secret: dict, fmt: GenerateFormat) -> str:
|
|
50
76
|
"""Format an AWS STS credential triplet in the requested shape.
|
|
51
77
|
|
|
@@ -227,6 +253,9 @@ def generate(
|
|
|
227
253
|
print_error("Unrecognized credential shape; printing raw payload")
|
|
228
254
|
print_json(secret)
|
|
229
255
|
raise typer.Exit(1)
|
|
256
|
+
hint = _apply_hint(full_path, format_)
|
|
257
|
+
if hint:
|
|
258
|
+
text = f"{text}\n{hint}"
|
|
230
259
|
typer.echo(text)
|
|
231
260
|
|
|
232
261
|
|
|
@@ -194,6 +194,57 @@ class TestDynamic:
|
|
|
194
194
|
assert "export AWS_SESSION_TOKEN=TOK-FAKE" in result.stdout
|
|
195
195
|
# PAT must not leak in any form
|
|
196
196
|
assert "PAT_test" not in result.stdout
|
|
197
|
+
# Inline apply-hint includes the actual path the user passed
|
|
198
|
+
assert "eval $(bt secrets dynamic generate lab/aws/ec2-readonly)" in result.stdout
|
|
199
|
+
|
|
200
|
+
@respx.mock
|
|
201
|
+
def test_dynamic_generate_powershell_hint(self, env_overrides):
|
|
202
|
+
respx.post(_url("/dynamic/ec2-readonly/generate")).mock(
|
|
203
|
+
return_value=httpx.Response(201, json={"secret": {
|
|
204
|
+
"accessKeyId": "ASIA-FAKE", "secretAccessKey": "SAK-FAKE",
|
|
205
|
+
"sessionToken": "TOK-FAKE", "expiration": "2026-01-01T00:00:00Z",
|
|
206
|
+
}})
|
|
207
|
+
)
|
|
208
|
+
result = CliRunner().invoke(
|
|
209
|
+
secrets_app, ["dynamic", "generate", "lab/aws/ec2-readonly", "--format", "powershell"],
|
|
210
|
+
)
|
|
211
|
+
assert result.exit_code == 0
|
|
212
|
+
assert "--format powershell | iex" in result.stdout
|
|
213
|
+
# Hint must use # (valid PowerShell comment); not REM
|
|
214
|
+
assert "REM Tip" not in result.stdout
|
|
215
|
+
|
|
216
|
+
@respx.mock
|
|
217
|
+
def test_dynamic_generate_cmd_hint(self, env_overrides):
|
|
218
|
+
respx.post(_url("/dynamic/ec2-readonly/generate")).mock(
|
|
219
|
+
return_value=httpx.Response(201, json={"secret": {
|
|
220
|
+
"accessKeyId": "ASIA-FAKE", "secretAccessKey": "SAK-FAKE",
|
|
221
|
+
"sessionToken": "TOK-FAKE", "expiration": "2026-01-01T00:00:00Z",
|
|
222
|
+
}})
|
|
223
|
+
)
|
|
224
|
+
result = CliRunner().invoke(
|
|
225
|
+
secrets_app, ["dynamic", "generate", "lab/aws/ec2-readonly", "--format", "cmd"],
|
|
226
|
+
)
|
|
227
|
+
assert result.exit_code == 0
|
|
228
|
+
assert "for /f" in result.stdout
|
|
229
|
+
assert "--format cmd" in result.stdout
|
|
230
|
+
# cmd format must use REM (not #) for the apply hint
|
|
231
|
+
assert "REM Tip" in result.stdout
|
|
232
|
+
|
|
233
|
+
@respx.mock
|
|
234
|
+
def test_dynamic_generate_no_hint_for_non_shell_formats(self, env_overrides):
|
|
235
|
+
"""env / dotenv / json shouldn't carry an apply hint — no canonical apply mode."""
|
|
236
|
+
respx.post(_url("/dynamic/ec2-readonly/generate")).mock(
|
|
237
|
+
return_value=httpx.Response(201, json={"secret": {
|
|
238
|
+
"accessKeyId": "ASIA-FAKE", "secretAccessKey": "SAK-FAKE",
|
|
239
|
+
"sessionToken": "TOK-FAKE", "expiration": "2026-01-01T00:00:00Z",
|
|
240
|
+
}})
|
|
241
|
+
)
|
|
242
|
+
for fmt in ("env", "dotenv"):
|
|
243
|
+
result = CliRunner().invoke(
|
|
244
|
+
secrets_app, ["dynamic", "generate", "lab/aws/ec2-readonly", "--format", fmt],
|
|
245
|
+
)
|
|
246
|
+
assert result.exit_code == 0, fmt
|
|
247
|
+
assert "Tip: apply with" not in result.stdout, fmt
|
|
197
248
|
|
|
198
249
|
@respx.mock
|
|
199
250
|
def test_dynamic_generate_json(self, env_overrides):
|
|
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
|
|
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
|