bt-cli 0.4.55__tar.gz → 0.4.56__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.55 → bt_cli-0.4.56}/CLAUDE.md +1 -1
- {bt_cli-0.4.55 → bt_cli-0.4.56}/PKG-INFO +1 -1
- {bt_cli-0.4.55 → bt_cli-0.4.56}/pyproject.toml +1 -1
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/__init__.py +1 -1
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/commands/configure.py +66 -4
- {bt_cli-0.4.55 → bt_cli-0.4.56}/.claude/skills/bt/SKILL.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/.claude/skills/entitle/SKILL.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/.claude/skills/epml/SKILL.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/.claude/skills/epmw/SKILL.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/.claude/skills/pra/SKILL.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/.claude/skills/pws/SKILL.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/.env.example +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/.github/workflows/ci.yml +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/.github/workflows/release.yml +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/.gitignore +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/README.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/assets/cli-help.png +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/assets/cli-output.png +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/bt-cli.spec +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/bt_entry.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/epml-clients-server-side-filters-plan.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/epml-implementation-plan.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/pf-implementation-plan.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/scripts/bt_entry.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/scripts/pf_onboard.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/scripts/sync-package-data.sh +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/cli.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/commands/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/commands/learn.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/commands/quick.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/core/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/core/auth.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/core/client.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/core/config.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/core/config_file.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/core/csv_utils.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/core/errors.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/core/output.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/core/prompts.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/core/rest_debug.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/data/CLAUDE.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/data/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/data/skills/bt/SKILL.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/data/skills/entitle/SKILL.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/data/skills/epml/SKILL.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/data/skills/epmw/SKILL.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/data/skills/pf/SKILL.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/data/skills/pra/SKILL.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/data/skills/pws/SKILL.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/data/skills/secrets/SKILL.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/client/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/client/base.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/commands/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/commands/accounts.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/commands/applications.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/commands/auth.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/commands/bundles.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/commands/integrations.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/commands/permissions.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/commands/policies.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/commands/requests.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/commands/resources.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/commands/roles.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/commands/users.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/commands/workflows.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/models/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/models/bundle.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/models/common.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/models/integration.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/models/permission.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/models/policy.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/models/resource.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/models/role.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/models/user.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/entitle/models/workflow.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/client/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/client/base.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/audit.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/auth.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/client_pkg.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/clients.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/external_apis.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/hosts.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/iolog.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/license.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/quick.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/rbp_cmdgrps.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/rbp_entitlement.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/rbp_hostgrps.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/rbp_policy.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/rbp_roles.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/rbp_tests.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/rbp_tmdategrps.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/rbp_tx.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/rbp_usergrps.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/settings.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/siems.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/commands/users.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epml/models/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epmw/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epmw/client/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epmw/client/base.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epmw/commands/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epmw/commands/audits.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epmw/commands/auth.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epmw/commands/computers.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epmw/commands/events.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epmw/commands/groups.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epmw/commands/policies.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epmw/commands/quick.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epmw/commands/requests.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epmw/commands/roles.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epmw/commands/tasks.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epmw/commands/users.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/epmw/models/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pf/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pf/client/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pf/client/base.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pf/commands/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pf/commands/auth.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pf/commands/machines.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pf/commands/tokens.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pf/commands/user.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/client/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/client/base.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/commands/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/commands/auth.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/commands/group_policies.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/commands/import_export.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/commands/jump_clients.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/commands/jump_groups.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/commands/jump_items.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/commands/jumpoints.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/commands/policies.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/commands/quick.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/commands/teams.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/commands/users.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/commands/vault.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/models/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/models/common.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/models/group_policy.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/models/jump_client.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/models/jump_group.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/models/jump_item.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/models/jumpoint.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/models/team.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/models/user.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pra/models/vault.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/client/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/client/base.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/client/beyondinsight.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/client/passwordsafe.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/commands/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/commands/accounts.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/commands/assets.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/commands/attributes.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/commands/auth.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/commands/clouds.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/commands/config.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/commands/credentials.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/commands/databases.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/commands/directories.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/commands/functional.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/commands/import_export.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/commands/platforms.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/commands/quick.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/commands/search.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/commands/secrets.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/commands/systems.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/commands/users.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/commands/workgroups.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/config.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/models/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/models/account.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/models/asset.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/models/common.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/pws/models/system.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/secrets/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/secrets/client/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/secrets/client/base.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/secrets/commands/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/secrets/commands/_hints.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/secrets/commands/auth.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/secrets/commands/dynamic.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/secrets/commands/folders.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/secrets/commands/integrations.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/secrets/commands/leases.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/secrets/commands/static.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/src/bt_cli/secrets/models/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/conftest.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/core/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/core/test_auth.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/core/test_config.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/core/test_config_file.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/core/test_errors.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/core/test_output.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/core/test_rest_debug.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/entitle/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/entitle/test_client.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/entitle/test_commands.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/entitle-smoke-test.sh +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/epml/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/epml/test_client.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/epml/test_commands.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/epmw/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/epmw/test_client.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/epmw/test_commands.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/epmw-quick-test-plan.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/fixtures/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/fixtures/responses.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/integration/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/integration/conftest.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/integration/helpers.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/integration/test_entitle_integration.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/integration/test_epmw_integration.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/integration/test_epmw_lifecycle.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/integration/test_pra_integration.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/integration/test_pra_lifecycle.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/integration/test_pws_integration.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/integration/test_pws_lifecycle.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/pf/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/pf/test_client.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/pf/test_commands.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/pra/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/pra/test_client.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/pra/test_commands.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/pra-smoke-test.sh +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/pra-test-plan.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/pws/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/pws/test_client.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/pws/test_commands.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/pws-quick-test-plan.md +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/pws-smoke-test.sh +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/secrets/__init__.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/secrets/test_client.py +0 -0
- {bt_cli-0.4.55 → bt_cli-0.4.56}/tests/secrets/test_commands.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.56**
|
|
4
4
|
|
|
5
5
|
## Setup
|
|
6
6
|
|
|
@@ -57,6 +57,15 @@ def configure_callback(
|
|
|
57
57
|
help="Entitle user-context API key, only required for `bt entitle requests create` "
|
|
58
58
|
"(visible in shell history/process list — prefer interactive `bt configure`)",
|
|
59
59
|
),
|
|
60
|
+
site_id: Optional[str] = typer.Option(
|
|
61
|
+
None, "--site-id", help="Site UUID (pf, secrets, epml)"
|
|
62
|
+
),
|
|
63
|
+
pat: Optional[str] = typer.Option(
|
|
64
|
+
None,
|
|
65
|
+
"--pat",
|
|
66
|
+
help="Personal Access Token (pf, secrets, epml) — visible in shell "
|
|
67
|
+
"history/process list; prefer interactive `bt configure`",
|
|
68
|
+
),
|
|
60
69
|
show_input: bool = typer.Option(
|
|
61
70
|
False,
|
|
62
71
|
"--show-input",
|
|
@@ -84,18 +93,25 @@ def configure_callback(
|
|
|
84
93
|
return
|
|
85
94
|
|
|
86
95
|
# Check if any non-interactive flags were provided
|
|
87
|
-
has_flags = any([api_url, client_id, client_secret, api_key, user_api_key])
|
|
96
|
+
has_flags = any([api_url, client_id, client_secret, api_key, user_api_key, site_id, pat])
|
|
88
97
|
|
|
89
98
|
if has_flags and product:
|
|
90
99
|
# Non-interactive mode with flags
|
|
91
100
|
_configure_with_flags(
|
|
92
|
-
product, profile, api_url, client_id, client_secret, api_key, user_api_key
|
|
101
|
+
product, profile, api_url, client_id, client_secret, api_key, user_api_key,
|
|
102
|
+
site_id, pat,
|
|
93
103
|
)
|
|
94
104
|
else:
|
|
95
105
|
# Interactive mode
|
|
96
106
|
_configure_interactive(product, profile, show_input=show_input)
|
|
97
107
|
|
|
98
108
|
|
|
109
|
+
def _confirm_received(value: str) -> None:
|
|
110
|
+
"""Echo a masked confirmation so the user knows a hidden paste landed."""
|
|
111
|
+
hint = "****" + value[-4:] if len(value) > 4 else "****"
|
|
112
|
+
console.print(f" [dim]Received {len(value)} characters ({hint})[/dim]")
|
|
113
|
+
|
|
114
|
+
|
|
99
115
|
def _configure_interactive(
|
|
100
116
|
product: Optional[str] = None,
|
|
101
117
|
profile: Optional[str] = None,
|
|
@@ -196,6 +212,8 @@ def _configure_interactive(
|
|
|
196
212
|
else:
|
|
197
213
|
hint = "****" + existing_val[-4:] if len(existing_val) > 4 else "****"
|
|
198
214
|
console.print(f" [dim](current: {hint}, press Enter to keep)[/dim]")
|
|
215
|
+
if not show_input:
|
|
216
|
+
console.print(" [dim](input hidden — nothing echoes while you type/paste)[/dim]")
|
|
199
217
|
value = Prompt.ask(
|
|
200
218
|
prompt_text,
|
|
201
219
|
password=not show_input,
|
|
@@ -203,6 +221,19 @@ def _configure_interactive(
|
|
|
203
221
|
)
|
|
204
222
|
if not value and default:
|
|
205
223
|
value = default
|
|
224
|
+
elif value:
|
|
225
|
+
_confirm_received(value)
|
|
226
|
+
elif field_info.get("required") and not show_input:
|
|
227
|
+
# Hidden prompts don't receive pastes on some terminals (notably
|
|
228
|
+
# Windows consoles) — offer a visible retry instead of failing.
|
|
229
|
+
if Confirm.ask(
|
|
230
|
+
" Nothing received — paste may not work with hidden input. "
|
|
231
|
+
"Retry with input visible?",
|
|
232
|
+
default=True,
|
|
233
|
+
):
|
|
234
|
+
value = Prompt.ask(prompt_text, default="")
|
|
235
|
+
if value:
|
|
236
|
+
_confirm_received(value)
|
|
206
237
|
# Handle regular fields
|
|
207
238
|
else:
|
|
208
239
|
value = Prompt.ask(
|
|
@@ -255,6 +286,8 @@ def _configure_with_flags(
|
|
|
255
286
|
client_secret: Optional[str],
|
|
256
287
|
api_key: Optional[str],
|
|
257
288
|
user_api_key: Optional[str] = None,
|
|
289
|
+
site_id: Optional[str] = None,
|
|
290
|
+
pat: Optional[str] = None,
|
|
258
291
|
) -> None:
|
|
259
292
|
"""Configure using command-line flags (non-interactive)."""
|
|
260
293
|
if product not in PRODUCTS:
|
|
@@ -281,6 +314,17 @@ def _configure_with_flags(
|
|
|
281
314
|
print_error("--user-api-key is only valid for product=entitle")
|
|
282
315
|
raise typer.Exit(2)
|
|
283
316
|
new_config["user_api_key"] = user_api_key
|
|
317
|
+
pat_products = ("pf", "secrets", "epml")
|
|
318
|
+
if site_id is not None:
|
|
319
|
+
if product not in pat_products:
|
|
320
|
+
print_error(f"--site-id is only valid for product={'|'.join(pat_products)}")
|
|
321
|
+
raise typer.Exit(2)
|
|
322
|
+
new_config["site_id"] = site_id
|
|
323
|
+
if pat is not None:
|
|
324
|
+
if product not in pat_products:
|
|
325
|
+
print_error(f"--pat is only valid for product={'|'.join(pat_products)}")
|
|
326
|
+
raise typer.Exit(2)
|
|
327
|
+
new_config["pat"] = pat
|
|
284
328
|
|
|
285
329
|
# Infer auth method
|
|
286
330
|
if api_key:
|
|
@@ -330,6 +374,24 @@ def _test_connection(product: str, profile: str) -> None:
|
|
|
330
374
|
client.get("/Computers", params={"pageSize": 1})
|
|
331
375
|
print_success("EPM Windows connection successful!")
|
|
332
376
|
|
|
377
|
+
elif product == "epml":
|
|
378
|
+
from ..epml.client import get_client
|
|
379
|
+
with get_client() as client:
|
|
380
|
+
client.get_settings()
|
|
381
|
+
print_success("EPM Linux connection successful!")
|
|
382
|
+
|
|
383
|
+
elif product == "secrets":
|
|
384
|
+
from ..secrets.client import get_client
|
|
385
|
+
with get_client() as client:
|
|
386
|
+
client.list_folders()
|
|
387
|
+
print_success("Secrets API connection successful!")
|
|
388
|
+
|
|
389
|
+
elif product == "pf":
|
|
390
|
+
from ..pf.client import get_client
|
|
391
|
+
with get_client() as client:
|
|
392
|
+
info = client.get_user_info() or {}
|
|
393
|
+
print_success(f"Pathfinder connection successful! ({info.get('email', '?')})")
|
|
394
|
+
|
|
333
395
|
except Exception as e:
|
|
334
396
|
print_error(f"Connection failed: {e}")
|
|
335
397
|
|
|
@@ -375,7 +437,7 @@ def show_config(
|
|
|
375
437
|
first = True
|
|
376
438
|
for key, value in settings.items():
|
|
377
439
|
# Mask secrets
|
|
378
|
-
if not show_secrets and any(s in key for s in ["secret", "key", "password"]):
|
|
440
|
+
if not show_secrets and (key == "pat" or any(s in key for s in ["secret", "key", "password"])):
|
|
379
441
|
if isinstance(value, str) and value.startswith("keyring://"):
|
|
380
442
|
display_value = "[dim]<stored in keyring>[/dim]"
|
|
381
443
|
else:
|
|
@@ -599,7 +661,7 @@ def show_effective_config(
|
|
|
599
661
|
def mask_secret(key: str, value: str) -> str:
|
|
600
662
|
if not value:
|
|
601
663
|
return "[dim]not set[/dim]"
|
|
602
|
-
if not show_secrets and any(s in key.lower() for s in ["secret", "key", "password"]):
|
|
664
|
+
if not show_secrets and (key.lower() == "pat" or any(s in key.lower() for s in ["secret", "key", "password"])):
|
|
603
665
|
return "****" + value[-4:] if len(value) > 4 else "****"
|
|
604
666
|
return value
|
|
605
667
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|