Showing preview only (2,064K chars total). Download the full file or copy to clipboard to get everything.
Repository: algorandfoundation/algokit-cli
Branch: main
Commit: 472eb87eaed1
Files: 755
Total size: 1.8 MB
Directory structure:
gitextract_vthf3g10/
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ ├── actions/
│ │ ├── build-binaries/
│ │ │ ├── linux/
│ │ │ │ └── action.yaml
│ │ │ ├── macos/
│ │ │ │ └── action.yaml
│ │ │ └── windows/
│ │ │ └── action.yaml
│ │ ├── install-apple-dev-id-cert/
│ │ │ └── action.yaml
│ │ └── setup-poetry/
│ │ └── action.yaml
│ ├── dependabot.yml
│ ├── pull_request_template.md
│ └── workflows/
│ ├── build-binaries.yaml
│ ├── build-python.yaml
│ ├── cd.yaml
│ ├── check-python.yaml
│ ├── clear-caches.yaml
│ ├── pr.yaml
│ └── publish-release-packages.yaml
├── .gitignore
├── .idea/
│ └── runConfigurations/
│ └── Run_AlgoKit_CLI.xml
├── .pre-commit-config.yaml
├── .vscode/
│ ├── extensions.json
│ ├── launch.json
│ └── settings.json
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── debug.py
├── docs/
│ ├── algokit.md
│ ├── architecture-decisions/
│ │ ├── 2022-11-14_sandbox-approach.md
│ │ ├── 2022-11-22_beaker-testing-strategy.md
│ │ ├── 2023-01-11_beaker_productionisation_review.md
│ │ ├── 2023-01-11_brew_install.md
│ │ ├── 2023-01-12_smart-contract-deployment.md
│ │ ├── 2023-06-06_frontend-templates.md
│ │ ├── 2023-07-19_advanced_generate_command.md
│ │ ├── 2024-01-13_native_binaries.md
│ │ ├── 2024-01-23_init-wizard-v2.md
│ │ ├── 2024-01-31_binary_distribution.md
│ │ └── 2024-03-06_local_dev_ui_packaging.md
│ ├── articles/
│ │ └── output_stability.md
│ ├── cli/
│ │ └── index.md
│ ├── features/
│ │ ├── compile.md
│ │ ├── completions.md
│ │ ├── config.md
│ │ ├── dispenser.md
│ │ ├── doctor.md
│ │ ├── explore.md
│ │ ├── generate.md
│ │ ├── goal.md
│ │ ├── init.md
│ │ ├── localnet.md
│ │ ├── project/
│ │ │ ├── bootstrap.md
│ │ │ ├── deploy.md
│ │ │ ├── link.md
│ │ │ ├── list.md
│ │ │ └── run.md
│ │ ├── project.md
│ │ ├── tasks/
│ │ │ ├── analyze.md
│ │ │ ├── ipfs.md
│ │ │ ├── mint.md
│ │ │ ├── nfd.md
│ │ │ ├── opt.md
│ │ │ ├── send.md
│ │ │ ├── sign.md
│ │ │ ├── transfer.md
│ │ │ ├── vanity_address.md
│ │ │ └── wallet.md
│ │ └── tasks.md
│ ├── sphinx/
│ │ ├── conf.py
│ │ └── index.rst
│ └── tutorials/
│ ├── algokit-template.md
│ ├── intro.md
│ └── smart-contracts.md
├── entitlements.xml
├── misc/
│ └── multiformats_config/
│ ├── multibase-table.json
│ └── multicodec-table.json
├── poetry.toml
├── pyproject.toml
├── scripts/
│ ├── package_mac.sh
│ ├── package_windows.bat
│ ├── snap/
│ │ └── create-snapcraft-yaml.sh
│ ├── update-brew-cask.sh
│ └── winget/
│ ├── build-installer.ps1
│ ├── installer/
│ │ ├── AppxManifest.xml
│ │ └── priconfig.xml
│ └── update-package.ps1
├── src/
│ └── algokit/
│ ├── __init__.py
│ ├── __main__.py
│ ├── cli/
│ │ ├── __init__.py
│ │ ├── codespace.py
│ │ ├── common/
│ │ │ ├── __init__.py
│ │ │ ├── constants.py
│ │ │ └── utils.py
│ │ ├── compile.py
│ │ ├── compilers/
│ │ │ ├── __init__.py
│ │ │ ├── python.py
│ │ │ └── typescript.py
│ │ ├── completions.py
│ │ ├── config.py
│ │ ├── dispenser.py
│ │ ├── doctor.py
│ │ ├── explore.py
│ │ ├── generate.py
│ │ ├── goal.py
│ │ ├── init/
│ │ │ ├── __init__.py
│ │ │ ├── command.py
│ │ │ ├── example.py
│ │ │ └── helpers.py
│ │ ├── localnet.py
│ │ ├── project/
│ │ │ ├── __init__.py
│ │ │ ├── bootstrap.py
│ │ │ ├── deploy.py
│ │ │ ├── link.py
│ │ │ ├── list.py
│ │ │ └── run.py
│ │ ├── task.py
│ │ ├── tasks/
│ │ │ ├── __init__.py
│ │ │ ├── analyze.py
│ │ │ ├── assets.py
│ │ │ ├── ipfs.py
│ │ │ ├── mint.py
│ │ │ ├── nfd.py
│ │ │ ├── send_transaction.py
│ │ │ ├── sign_transaction.py
│ │ │ ├── transfer.py
│ │ │ ├── utils.py
│ │ │ ├── vanity_address.py
│ │ │ └── wallet.py
│ │ └── tui/
│ │ ├── __init__.py
│ │ └── init/
│ │ ├── __init__.py
│ │ ├── example_selector.py
│ │ └── screens/
│ │ ├── __init__.py
│ │ └── example_selector_screen.py
│ ├── core/
│ │ ├── __init__.py
│ │ ├── _toml.py
│ │ ├── _vendor/
│ │ │ ├── __init__.py
│ │ │ └── auth0/
│ │ │ ├── __init__.py
│ │ │ └── authentication/
│ │ │ ├── __init__.py
│ │ │ └── token_verifier.py
│ │ ├── atomic_write.py
│ │ ├── codespace.py
│ │ ├── compilers/
│ │ │ ├── python.py
│ │ │ └── typescript.py
│ │ ├── conf.py
│ │ ├── config_commands/
│ │ │ ├── __init__.py
│ │ │ ├── container_engine.py
│ │ │ ├── js_package_manager.py
│ │ │ ├── py_package_manager.py
│ │ │ └── version_prompt.py
│ │ ├── dispenser.py
│ │ ├── doctor.py
│ │ ├── generate.py
│ │ ├── goal.py
│ │ ├── init.py
│ │ ├── log_handlers.py
│ │ ├── proc.py
│ │ ├── project/
│ │ │ ├── __init__.py
│ │ │ ├── bootstrap.py
│ │ │ ├── deploy.py
│ │ │ └── run.py
│ │ ├── questionary_extensions.py
│ │ ├── sandbox.py
│ │ ├── tasks/
│ │ │ ├── __init__.py
│ │ │ ├── analyze.py
│ │ │ ├── ipfs.py
│ │ │ ├── mint/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── mint.py
│ │ │ │ └── models.py
│ │ │ ├── nfd.py
│ │ │ ├── vanity_address.py
│ │ │ └── wallet.py
│ │ ├── typed_client_generation.py
│ │ └── utils.py
│ ├── py.typed
│ └── resources/
│ └── distribution-method
└── tests/
├── __init__.py
├── compile/
│ ├── __init__.py
│ ├── conftest.py
│ ├── test_python.py
│ ├── test_python.test_compile_py_help.approved.txt
│ ├── test_python.test_puyapy_is_installed_globally.approved.txt
│ ├── test_python.test_puyapy_is_installed_in_project.approved.txt
│ ├── test_python.test_puyapy_is_not_installed_anywhere.approved.txt
│ ├── test_python.test_specificed_puyapy_version_is_not_installed.approved.txt
│ ├── test_typescript.py
│ ├── test_typescript.test_compile_py_help.approved.txt
│ ├── test_typescript.test_puyats_is_installed_globally.approved.txt
│ ├── test_typescript.test_puyats_is_installed_in_project.approved.txt
│ ├── test_typescript.test_puyats_is_not_installed_anywhere.approved.txt
│ └── test_typescript.test_specificed_puyats_version_is_not_installed.approved.txt
├── completions/
│ ├── __init__.py
│ ├── test_completions.py
│ ├── test_completions.test_completions_help.approved.txt
│ ├── test_completions.test_completions_install_handles_config_outside_home.approved.txt
│ ├── test_completions.test_completions_install_handles_no_profile.approved.txt
│ ├── test_completions.test_completions_install_handles_unsupported_bash_gracefully.approved.txt
│ ├── test_completions.test_completions_install_is_idempotent.approved.txt
│ ├── test_completions.test_completions_installs_correctly_with_detected_shell.approved.txt
│ ├── test_completions.test_completions_installs_correctly_with_specified_shell.bash.approved.txt
│ ├── test_completions.test_completions_installs_correctly_with_specified_shell.zsh.approved.txt
│ ├── test_completions.test_completions_subcommands_help.install.approved.txt
│ ├── test_completions.test_completions_subcommands_help.uninstall.approved.txt
│ ├── test_completions.test_completions_subcommands_with_unknown_shell_fails_gracefully.install.approved.txt
│ ├── test_completions.test_completions_subcommands_with_unknown_shell_fails_gracefully.uninstall.approved.txt
│ ├── test_completions.test_completions_subcommands_with_unsupported_shell_fails_gracefully.install.approved.txt
│ ├── test_completions.test_completions_subcommands_with_unsupported_shell_fails_gracefully.uninstall.approved.txt
│ ├── test_completions.test_completions_uninstall_handles_no_profile.approved.txt
│ ├── test_completions.test_completions_uninstall_is_idempotent.approved.txt
│ ├── test_completions.test_completions_uninstalls_correctly.bash.approved.txt
│ └── test_completions.test_completions_uninstalls_correctly.zsh.approved.txt
├── config/
│ ├── __init__.py
│ ├── test_package_managers.py
│ ├── test_package_managers.test_js_package_manager_help.approved.txt
│ ├── test_package_managers.test_js_package_manager_invalid_argument.approved.txt
│ ├── test_package_managers.test_js_package_manager_set_npm.approved.txt
│ ├── test_package_managers.test_js_package_manager_set_pnpm.approved.txt
│ ├── test_package_managers.test_py_package_manager_help.approved.txt
│ ├── test_package_managers.test_py_package_manager_invalid_argument.approved.txt
│ ├── test_package_managers.test_py_package_manager_set_poetry.approved.txt
│ └── test_package_managers.test_py_package_manager_set_uv.approved.txt
├── conftest.py
├── dispenser/
│ ├── TestFundCommand.test_fund_command_address_invalid.approved.txt
│ ├── TestFundCommand.test_fund_command_alias_invalid.approved.txt
│ ├── TestFundCommand.test_fund_command_from_alias_successful.approved.txt
│ ├── TestFundCommand.test_fund_command_http_error.approved.txt
│ ├── TestFundCommand.test_fund_command_invalid_args.approved.txt
│ ├── TestFundCommand.test_fund_command_not_authenticated.approved.txt
│ ├── TestFundCommand.test_fund_command_success.False.False.approved.txt
│ ├── TestFundCommand.test_fund_command_success.False.True.approved.txt
│ ├── TestFundCommand.test_fund_command_success.True.False.approved.txt
│ ├── TestFundCommand.test_fund_command_success.True.True.approved.txt
│ ├── TestLimitCommand.test_limit_command_http_error.approved.txt
│ ├── TestLimitCommand.test_limit_command_not_authenticated.approved.txt
│ ├── TestLimitCommand.test_limit_command_success.False.False.approved.txt
│ ├── TestLimitCommand.test_limit_command_success.False.True.approved.txt
│ ├── TestLimitCommand.test_limit_command_success.True.False.approved.txt
│ ├── TestLimitCommand.test_limit_command_success.True.True.approved.txt
│ ├── TestLoginCommand.test_login_command_already_logged_in.approved.txt
│ ├── TestLoginCommand.test_login_command_cancelled_timeout.approved.txt
│ ├── TestLoginCommand.test_login_command_expired_token_refresh.False.approved.txt
│ ├── TestLoginCommand.test_login_command_expired_token_refresh.True.approved.txt
│ ├── TestLoginCommand.test_login_command_success_ci.file.None.approved.txt
│ ├── TestLoginCommand.test_login_command_success_ci.file.custom_file.txt.approved.txt
│ ├── TestLoginCommand.test_login_command_success_ci.stdout.None.approved.txt
│ ├── TestLoginCommand.test_login_command_success_user.approved.txt
│ ├── TestLogoutCommand.test_logout_command_already_logged_out.approved.txt
│ ├── TestLogoutCommand.test_logout_command_revoke_exception.approved.txt
│ ├── TestLogoutCommand.test_logout_command_success.approved.txt
│ ├── TestRefundCommand.test_refund_command_http_error.approved.txt
│ ├── TestRefundCommand.test_refund_command_invalid_args.approved.txt
│ ├── TestRefundCommand.test_refund_command_not_authenticated.approved.txt
│ ├── TestRefundCommand.test_refund_command_success.False.approved.txt
│ ├── TestRefundCommand.test_refund_command_success.True.approved.txt
│ └── test_dispenser.py
├── doctor/
│ ├── __init__.py
│ ├── test_doctor.py
│ ├── test_doctor.test_doctor_all_commands_bad_exit[linux].approved.txt
│ ├── test_doctor.test_doctor_all_commands_bad_exit[macOS].approved.txt
│ ├── test_doctor.test_doctor_all_commands_bad_exit[windows].approved.txt
│ ├── test_doctor.test_doctor_all_commands_not_found[linux].approved.txt
│ ├── test_doctor.test_doctor_all_commands_not_found[macOS].approved.txt
│ ├── test_doctor.test_doctor_all_commands_not_found[windows].approved.txt
│ ├── test_doctor.test_doctor_help.approved.txt
│ ├── test_doctor.test_doctor_successful[linux].approved.txt
│ ├── test_doctor.test_doctor_successful[macOS].approved.txt
│ ├── test_doctor.test_doctor_successful[windows].approved.txt
│ ├── test_doctor.test_doctor_with_copy.approved.txt
│ ├── test_doctor.test_doctor_with_docker_compose_version_gitpod.approved.txt
│ ├── test_doctor.test_doctor_with_docker_compose_version_unparseable.approved.txt
│ ├── test_doctor.test_doctor_with_docker_compose_version_warning.approved.txt
│ ├── test_doctor.test_doctor_with_weird_values_on_mac.approved.txt
│ ├── test_doctor.test_doctor_with_weird_values_on_windows.approved.txt
│ ├── test_doctor.test_new_algokit_version_available.approved.txt
│ ├── test_doctor.test_npm_permission_denied.approved.txt
│ ├── test_doctor.test_unexpected_exception_locating_executable.approved.txt
│ └── test_doctor.test_unparseable_python_version.approved.txt
├── explore/
│ ├── __init__.py
│ ├── test_explore.py
│ ├── test_explore.test_explore.localnet.approved.txt
│ ├── test_explore.test_explore.mainnet.approved.txt
│ └── test_explore.test_explore.testnet.approved.txt
├── generate/
│ ├── __init__.py
│ ├── app.arc32.json
│ ├── app.arc56.json
│ ├── application.json
│ ├── test_generate_client.py
│ ├── test_generate_client.test_generate_client_no_app_spec_found.approved.txt
│ ├── test_generate_client.test_generate_client_output_path_is_dir.approved.txt
│ ├── test_generate_client.test_generate_client_python[--output {contract_name}.py-hello_world_app.py].approved.txt
│ ├── test_generate_client.test_generate_client_python[-l python -v 1.1.0-hello_world_app_client.py].approved.txt
│ ├── test_generate_client.test_generate_client_python[-l python-hello_world_app_client.py].approved.txt
│ ├── test_generate_client.test_generate_client_python[-o client.py --language python --version 1.1.2-client.py].approved.txt
│ ├── test_generate_client.test_generate_client_python[-o client.py -p --mode minimal-client.py].approved.txt
│ ├── test_generate_client.test_generate_client_python[-o client.py-client.py].approved.txt
│ ├── test_generate_client.test_generate_client_python[-o client.ts --language python-client.ts].approved.txt
│ ├── test_generate_client.test_generate_client_python_arc32_filename.-o.client.py.approved.txt
│ ├── test_generate_client.test_generate_client_python_arc56_filename.-o.client.py.approved.txt
│ ├── test_generate_client.test_generate_client_python_multiple_app_specs_in_directory.-o.client.py.approved.txt
│ ├── test_generate_client.test_generate_client_recursive.approved.txt
│ ├── test_generate_client.test_generate_client_typescript[linux---output {contract_name}.ts-HelloWorldApp.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[linux--l typescript -v 2.6.0-HelloWorldAppClient.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[linux--l typescript-HelloWorldAppClient.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[linux--o client.py --language typescript-client.py].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[linux--o client.ts --language typescript --version 3.0.0-client.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[linux--o client.ts -pn --mode minimal-client.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[linux--o client.ts-client.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[macOS---output {contract_name}.ts-HelloWorldApp.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[macOS--l typescript -v 2.6.0-HelloWorldAppClient.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[macOS--l typescript-HelloWorldAppClient.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[macOS--o client.py --language typescript-client.py].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[macOS--o client.ts --language typescript --version 3.0.0-client.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[macOS--o client.ts -pn --mode minimal-client.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[macOS--o client.ts-client.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[windows---output {contract_name}.ts-HelloWorldApp.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[windows--l typescript -v 2.6.0-HelloWorldAppClient.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[windows--l typescript-HelloWorldAppClient.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[windows--o client.py --language typescript-client.py].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[windows--o client.ts --language typescript --version 3.0.0-client.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[windows--o client.ts -pn --mode minimal-client.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[windows--o client.ts-client.ts].approved.txt
│ ├── test_generate_client.test_generate_help.approved.txt
│ ├── test_generate_client.test_generate_no_options.approved.txt
│ ├── test_generate_client.test_npx_failed[linux].approved.txt
│ ├── test_generate_client.test_npx_failed[macOS].approved.txt
│ ├── test_generate_client.test_npx_failed[windows].approved.txt
│ ├── test_generate_client.test_npx_missing.approved.txt
│ ├── test_generate_client.test_pipx_missing.approved.txt
│ ├── test_generate_client.test_python_generator_is_installed_globally.approved.txt
│ ├── test_generate_client.test_python_generator_is_installed_in_project.approved.txt
│ ├── test_generate_client.test_python_generator_version_is_not_installed_anywhere.approved.txt
│ ├── test_generate_client.test_typescript_generator_is_installed_globally[linux].approved.txt
│ ├── test_generate_client.test_typescript_generator_is_installed_globally[macOS].approved.txt
│ ├── test_generate_client.test_typescript_generator_is_installed_globally[windows].approved.txt
│ ├── test_generate_client.test_typescript_generator_is_installed_in_project[linux].approved.txt
│ ├── test_generate_client.test_typescript_generator_is_installed_in_project[macOS].approved.txt
│ ├── test_generate_client.test_typescript_generator_is_installed_in_project[windows].approved.txt
│ ├── test_generate_client.test_typescript_generator_version_is_not_installed_anywhere[linux].approved.txt
│ ├── test_generate_client.test_typescript_generator_version_is_not_installed_anywhere[macOS].approved.txt
│ ├── test_generate_client.test_typescript_generator_version_is_not_installed_anywhere[windows].approved.txt
│ ├── test_generate_custom_generate_commands.py
│ ├── test_generate_custom_generate_commands.test_generate_custom_generate_command_missing_git_valid_generator.approved.txt
│ ├── test_generate_custom_generate_commands.test_generate_custom_generate_command_no_git_valid_generator.approved.txt
│ ├── test_generate_custom_generate_commands.test_generate_custom_generate_commands_invalid_generic_generator.approved.txt
│ ├── test_generate_custom_generate_commands.test_generate_custom_generate_commands_no_toml.approved.txt
│ ├── test_generate_custom_generate_commands.test_generate_custom_generate_commands_valid_generator.approved.txt
│ ├── test_generate_custom_generate_commands.test_generate_custom_generate_commands_valid_generator_invalid_path.approved.txt
│ ├── test_generate_custom_generate_commands.test_generate_custom_generate_commands_valid_generator_no_description.approved.txt
│ ├── test_generate_custom_generate_commands.test_generate_custom_generate_commands_valid_generator_run.approved.txt
│ └── test_generate_custom_generate_commands.test_generate_custom_generate_commands_valid_generator_run_with_python_path.approved.txt
├── goal/
│ ├── __init__.py
│ ├── test_goal.py
│ ├── test_goal.test_goal_complex_args.approved.txt
│ ├── test_goal.test_goal_compose_outdated.approved.txt
│ ├── test_goal.test_goal_console.approved.txt
│ ├── test_goal.test_goal_console_algod_not_created.approved.txt
│ ├── test_goal.test_goal_console_failed.approved.txt
│ ├── test_goal.test_goal_help.approved.txt
│ ├── test_goal.test_goal_no_args.approved.txt
│ ├── test_goal.test_goal_simple_args.approved.txt
│ ├── test_goal.test_goal_simple_args_on_named_localnet.approved.txt
│ ├── test_goal.test_goal_simple_args_with_input_file.approved.txt
│ ├── test_goal.test_goal_simple_args_with_input_output_files.approved.txt
│ ├── test_goal.test_goal_simple_args_with_input_output_files_with_dot_convention_name.approved.txt
│ ├── test_goal.test_goal_simple_args_with_multiple_input_output_files.approved.txt
│ ├── test_goal.test_goal_simple_args_with_output_file.approved.txt
│ ├── test_goal.test_goal_simple_args_without_file_error.approved.txt
│ ├── test_goal.test_goal_start_without_docker.approved.txt
│ └── test_goal.test_goal_start_without_docker_engine_running.approved.txt
├── init/
│ ├── __init__.py
│ ├── copier-helloworld.bundle
│ ├── example/
│ │ ├── __init__.py
│ │ ├── test_example.py
│ │ ├── test_example.test_example_command_help.approved.txt
│ │ ├── test_example.test_example_command_list_option.approved.txt
│ │ ├── test_example.test_example_command_tui_select_nothing.approved.txt
│ │ ├── test_example.test_example_command_tui_select_valid.approved.txt
│ │ ├── test_example.test_example_command_tui_select_valid_but_source_missing.approved.txt
│ │ ├── test_example.test_example_command_with_invalid_id.approved.txt
│ │ ├── test_example.test_example_command_with_valid_id.approved.txt
│ │ └── test_example.test_example_command_with_valid_id_source_not_exist.approved.txt
│ ├── test_init.py
│ ├── test_init.test_init_ask_about_git.approved.txt
│ ├── test_init.test_init_blessed_template_url_get_community_warning.approved.txt
│ ├── test_init.test_init_bootstrap_no.approved.txt
│ ├── test_init.test_init_bootstrap_yes.approved.txt
│ ├── test_init.test_init_do_not_use_existing_folder.approved.txt
│ ├── test_init.test_init_existing_filename_same_as_folder_name.approved.txt
│ ├── test_init.test_init_help.approved.txt
│ ├── test_init.test_init_input_template_url.approved.txt
│ ├── test_init.test_init_invalid_template_url.approved.txt
│ ├── test_init.test_init_minimal_interaction_required_no_git_no_network_no_bootstrap.approved.txt
│ ├── test_init.test_init_minimal_interaction_required_yes_git_no_network.approved.txt
│ ├── test_init.test_init_missing_git.approved.txt
│ ├── test_init.test_init_no_community_template.approved.txt
│ ├── test_init.test_init_no_interaction_required_defaults_no_git_no_network.approved.txt
│ ├── test_init.test_init_no_interaction_required_no_git_no_network.approved.txt
│ ├── test_init.test_init_no_interaction_required_no_git_no_network_with_no_ide.approved.txt
│ ├── test_init.test_init_no_interaction_required_no_git_no_network_with_vscode.approved.txt
│ ├── test_init.test_init_no_interaction_required_no_git_no_network_with_vscode_and_readme.approved.txt
│ ├── test_init.test_init_project_name.approved.txt
│ ├── test_init.test_init_project_name_not_empty.approved.txt
│ ├── test_init.test_init_project_name_reenter_folder_name.approved.txt
│ ├── test_init.test_init_template_selection.approved.txt
│ ├── test_init.test_init_template_url_and_template_name.approved.txt
│ ├── test_init.test_init_template_with_python_task_fails_on_missing_python.approved.txt
│ ├── test_init.test_init_template_with_python_task_works.approved.txt
│ ├── test_init.test_init_use_existing_folder.approved.txt
│ ├── test_init.test_init_with_any_template_url_get_community_warning.approved.txt
│ ├── test_init.test_init_with_any_template_url_get_community_warning_with_unsafe_tag.approved.txt
│ ├── test_init.test_init_with_custom_env.approved.txt
│ ├── test_init.test_init_with_official_template_name.approved.txt
│ ├── test_init.test_init_with_official_template_name_and_hash.approved.txt
│ ├── test_init.test_init_wizard_v2_append_to_vscode_workspace.approved.txt
│ ├── test_init.test_init_wizard_v2_flow.Custom Template.approved.txt
│ ├── test_init.test_init_wizard_v2_flow.DApp Frontend.approved.txt
│ ├── test_init.test_init_wizard_v2_flow.Full Stack.approved.txt
│ ├── test_init.test_init_wizard_v2_flow.Smart Contract.approved.txt
│ ├── test_init.test_init_wizard_v2_github_folder_no_workspace.approved.txt
│ ├── test_init.test_init_wizard_v2_github_folder_with_workspace.approved.txt
│ ├── test_init.test_invalid_name.approved.txt
│ ├── test_init_with_bootstrap.py
│ ├── test_init_with_bootstrap.test_init_bootstrap_broken_poetry.approved.txt
│ └── test_init_with_bootstrap.test_init_bootstrap_version_fail.approved.txt
├── localnet/
│ ├── __init__.py
│ ├── conftest.py
│ ├── test_localnet.py
│ ├── test_localnet.test_localnet_help.approved.txt
│ ├── test_localnet_codespace.py
│ ├── test_localnet_codespace.test_install_gh_not_installed_failed_install.approved.txt
│ ├── test_localnet_codespace.test_install_gh_unix.approved.txt
│ ├── test_localnet_codespace.test_install_gh_windows.approved.txt
│ ├── test_localnet_codespace.test_invalid_scope_auth.approved.txt
│ ├── test_localnet_console.py
│ ├── test_localnet_console.test_goal_console.approved.txt
│ ├── test_localnet_reset.py
│ ├── test_localnet_reset.test_localnet_reset_with_existing_sandbox_with_out_of_date_config.approved.txt
│ ├── test_localnet_reset.test_localnet_reset_with_existing_sandbox_with_up_to_date_config.approved.txt
│ ├── test_localnet_reset.test_localnet_reset_with_existing_sandbox_with_up_to_date_config_with_pull.approved.txt
│ ├── test_localnet_reset.test_localnet_reset_with_named_sandbox_config.approved.txt
│ ├── test_localnet_reset.test_localnet_reset_without_docker.approved.txt
│ ├── test_localnet_reset.test_localnet_reset_without_docker_compose.approved.txt
│ ├── test_localnet_reset.test_localnet_reset_without_docker_engine_running.approved.txt
│ ├── test_localnet_reset.test_localnet_reset_without_existing_sandbox.approved.txt
│ ├── test_localnet_start.py
│ ├── test_localnet_start.test_localnet_img_check_cmd_error.approved.txt
│ ├── test_localnet_start.test_localnet_start.approved.txt
│ ├── test_localnet_start.test_localnet_start_failure.approved.txt
│ ├── test_localnet_start.test_localnet_start_health_bad_status.approved.txt
│ ├── test_localnet_start.test_localnet_start_health_failure.approved.txt
│ ├── test_localnet_start.test_localnet_start_out_date.approved.txt
│ ├── test_localnet_start.test_localnet_start_out_of_date_definition.approved.txt
│ ├── test_localnet_start.test_localnet_start_out_of_date_definition_and_missing_config.approved.txt
│ ├── test_localnet_start.test_localnet_start_up_to_date_definition.approved.txt
│ ├── test_localnet_start.test_localnet_start_with_custom_config_dir.approved.txt
│ ├── test_localnet_start.test_localnet_start_with_gitpod_docker_compose_version.approved.txt
│ ├── test_localnet_start.test_localnet_start_with_name.approved.txt
│ ├── test_localnet_start.test_localnet_start_with_no_dev_mode.approved.txt
│ ├── test_localnet_start.test_localnet_start_with_old_docker_compose_version.approved.txt
│ ├── test_localnet_start.test_localnet_start_with_unparseable_docker_compose_version.approved.txt
│ ├── test_localnet_start.test_localnet_start_without_docker.approved.txt
│ ├── test_localnet_start.test_localnet_start_without_docker_compose.approved.txt
│ ├── test_localnet_start.test_localnet_start_without_docker_engine_running.approved.txt
│ ├── test_localnet_status.py
│ ├── test_localnet_status.test_localnet_status_docker_error.approved.txt
│ ├── test_localnet_status.test_localnet_status_failure.approved.txt
│ ├── test_localnet_status.test_localnet_status_http_error.approved.txt
│ ├── test_localnet_status.test_localnet_status_missing_service.approved.txt
│ ├── test_localnet_status.test_localnet_status_no_existing_definition.approved.txt
│ ├── test_localnet_status.test_localnet_status_service_not_started.approved.txt
│ ├── test_localnet_status.test_localnet_status_successful.approved.txt
│ ├── test_localnet_status.test_localnet_status_unexpected_port.approved.txt
│ ├── test_localnet_status.test_localnet_status_without_docker.approved.txt
│ ├── test_localnet_status.test_localnet_status_without_docker_compose.approved.txt
│ ├── test_localnet_status.test_localnet_status_without_docker_engine_running.approved.txt
│ ├── test_localnet_stop.py
│ ├── test_localnet_stop.test_localnet_stop.approved.txt
│ ├── test_localnet_stop.test_localnet_stop_failure.approved.txt
│ ├── test_localnet_stop.test_localnet_stop_no_existing_definition.approved.txt
│ ├── test_localnet_stop.test_localnet_stop_with_name.approved.txt
│ ├── test_localnet_stop.test_localnet_stop_without_docker.approved.txt
│ ├── test_localnet_stop.test_localnet_stop_without_docker_compose.approved.txt
│ ├── test_localnet_stop.test_localnet_stop_without_docker_engine_running.approved.txt
│ ├── test_sandbox.py
│ ├── test_sandbox.test_algod_network_template_json.approved.txt
│ ├── test_sandbox.test_get_conduit_yaml.approved.txt
│ ├── test_sandbox.test_get_config_json.approved.txt
│ └── test_sandbox.test_get_docker_compose_yml.approved.txt
├── portability/
│ └── test_pyinstaller_binary.py
├── project/
│ ├── __init__.py
│ ├── bootstrap/
│ │ ├── __init__.py
│ │ ├── test_bootstrap.py
│ │ ├── test_bootstrap.test_bootstrap_help.approved.txt
│ │ ├── test_bootstrap_all.py
│ │ ├── test_bootstrap_all.test_bootstrap_all_algokit_min_version.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_algokit_min_version_ignore_error.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_empty.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_env.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_npm[linux].approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_npm[macOS].approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_npm[windows].approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_poetry.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_poetry_via_pyproject.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_projects_filter.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_projects_filter_not_found.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_projects_name_filter.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_projects_name_filter_not_found.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_projects_type_filter.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_projects_type_filter_not_found.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_skip_dirs.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_sub_dir.approved.txt
│ │ ├── test_bootstrap_env.py
│ │ ├── test_bootstrap_env.test_bootstrap_env_dotenv_different_prompt_scenarios.approved.txt
│ │ ├── test_bootstrap_env.test_bootstrap_env_dotenv_exists.approved.txt
│ │ ├── test_bootstrap_env.test_bootstrap_env_dotenv_missing_template_exists.approved.txt
│ │ ├── test_bootstrap_env.test_bootstrap_env_dotenv_with_values.approved.txt
│ │ ├── test_bootstrap_env.test_bootstrap_env_multiple_templates.approved.txt
│ │ ├── test_bootstrap_env.test_bootstrap_env_no_files.approved.txt
│ │ ├── test_bootstrap_env.test_bootstrap_network_prefixed_env_dotenv_exists.approved.txt
│ │ ├── test_bootstrap_env.test_bootstrap_network_prefixed_envs..env.approved.txt
│ │ ├── test_bootstrap_env.test_bootstrap_network_prefixed_envs..env.localnet.approved.txt
│ │ ├── test_bootstrap_env.test_bootstrap_network_prefixed_envs..env.localnet.template.approved.txt
│ │ ├── test_bootstrap_env.test_bootstrap_network_prefixed_envs..env.template.approved.txt
│ │ ├── test_bootstrap_npm.py
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_ci_mode_with_lock_file[linux].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_ci_mode_with_lock_file[macOS].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_ci_mode_with_lock_file[windows].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_ci_mode_without_lock_file[linux].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_ci_mode_without_lock_file[macOS].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_ci_mode_without_lock_file[windows].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_happy_path[linux].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_happy_path[macOS].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_happy_path[windows].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_without_npm[linux].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_without_npm[macOS].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_without_npm[windows].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_without_npm_and_package_file[linux].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_without_npm_and_package_file[macOS].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_without_npm_and_package_file[windows].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_without_package_file[linux].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_without_package_file[macOS].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_without_package_file[windows].approved.txt
│ │ ├── test_bootstrap_package_manager_selection.py
│ │ ├── test_bootstrap_package_manager_selection.test_bootstrap_respects_configured_package_managers[linux].approved.txt
│ │ ├── test_bootstrap_package_manager_selection.test_bootstrap_respects_configured_package_managers[macOS].approved.txt
│ │ ├── test_bootstrap_package_manager_selection.test_bootstrap_respects_configured_package_managers[windows].approved.txt
│ │ ├── test_bootstrap_package_manager_selection.test_interactive_prompt_fallback_with_preference_saving.approved.txt
│ │ ├── test_bootstrap_package_manager_selection.test_project_override_takes_precedence_over_user_preference.approved.txt
│ │ ├── test_bootstrap_package_manager_selection.test_project_override_takes_precedence_over_user_preference[linux].approved.txt
│ │ ├── test_bootstrap_package_manager_selection.test_project_override_takes_precedence_over_user_preference[macOS].approved.txt
│ │ ├── test_bootstrap_package_manager_selection.test_project_override_takes_precedence_over_user_preference[windows].approved.txt
│ │ ├── test_bootstrap_package_manager_selection.test_smart_defaults_when_no_user_preference.approved.txt
│ │ ├── test_bootstrap_pnpm.py
│ │ ├── test_bootstrap_pnpm.test_bootstrap_pnpm_ci_mode_without_lock_file.approved.txt
│ │ ├── test_bootstrap_pnpm.test_bootstrap_pnpm_happy_path[linux].approved.txt
│ │ ├── test_bootstrap_pnpm.test_bootstrap_pnpm_happy_path[macOS].approved.txt
│ │ ├── test_bootstrap_pnpm.test_bootstrap_pnpm_happy_path[windows].approved.txt
│ │ ├── test_bootstrap_pnpm.test_bootstrap_pnpm_without_package_file.approved.txt
│ │ ├── test_bootstrap_poetry.py
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_with_poetry.approved.txt
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_without_poetry.approved.txt
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_without_poetry_failed_install.approved.txt
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_without_poetry_failed_poetry_path.approved.txt
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_without_poetry_or_pipx_path[no_system_pythons].approved.txt
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_without_poetry_or_pipx_path[python3_only].approved.txt
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_without_poetry_or_pipx_path[python_and_python3].approved.txt
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_without_poetry_or_pipx_path[python_only].approved.txt
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_without_poetry_or_pipx_path_failed_install.approved.txt
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_without_poetry_or_pipx_path_failed_poetry_path.approved.txt
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_without_poetry_or_pipx_path_or_pipx_module.approved.txt
│ │ ├── test_bootstrap_translation.py
│ │ ├── test_bootstrap_uv.py
│ │ ├── test_bootstrap_uv.test_bootstrap_uv_happy_path.approved.txt
│ │ ├── test_bootstrap_uv.test_bootstrap_uv_poetry_project_migration_declined.approved.txt
│ │ ├── test_bootstrap_uv.test_bootstrap_uv_user_declines_install.approved.txt
│ │ └── test_precedence_hierarchy.py
│ ├── deploy/
│ │ ├── __init__.py
│ │ ├── test_deploy.py
│ │ ├── test_deploy.test_algokit_config_empty_array.approved.txt
│ │ ├── test_deploy.test_algokit_config_invalid_syntax.approved.txt
│ │ ├── test_deploy.test_algokit_config_name_no_base.approved.txt
│ │ ├── test_deploy.test_algokit_config_name_overrides.approved.txt
│ │ ├── test_deploy.test_algokit_deploy_only_base_deploy_config.approved.txt
│ │ ├── test_deploy.test_algokit_env_and_name_correct_set.approved.txt
│ │ ├── test_deploy.test_algokit_env_name_missing.approved.txt
│ │ ├── test_deploy.test_ci_flag_interactivity_mode_via_cli.approved.txt
│ │ ├── test_deploy.test_ci_flag_interactivity_mode_via_env.approved.txt
│ │ ├── test_deploy.test_command_bad_exit_code.approved.txt
│ │ ├── test_deploy.test_command_invocation_and_command_splitting.approved.txt
│ │ ├── test_deploy.test_command_not_executable.approved.txt
│ │ ├── test_deploy.test_command_not_found_and_no_config.approved.txt
│ │ ├── test_deploy.test_command_splitting_from_config.approved.txt
│ │ ├── test_deploy.test_command_without_splitting_from_config.approved.txt
│ │ ├── test_deploy.test_deploy_custom_project_dir.approved.txt
│ │ ├── test_deploy.test_deploy_dispenser_alias.deployer.approved.txt
│ │ ├── test_deploy.test_deploy_dispenser_alias.dispenser.approved.txt
│ │ ├── test_deploy.test_deploy_shutil_command_not_found.approved.txt
│ │ ├── test_deploy.test_deploy_windows_command_not_found.approved.txt
│ │ ├── test_deploy.test_deploy_with_extra_args.approved.txt
│ │ ├── test_deploy.test_deploy_with_extra_args_and_custom_command.approved.txt
│ │ └── test_deploy.test_secrets_prompting_via_stdin.approved.txt
│ ├── link/
│ │ ├── application.json
│ │ ├── test_link.py
│ │ ├── test_link.test_link_command_all_success.approved.txt
│ │ ├── test_link.test_link_command_by_name_success.approved.txt
│ │ ├── test_link.test_link_command_empty_folder.approved.txt
│ │ ├── test_link.test_link_command_multiple_names_no_specs_success.approved.txt
│ │ ├── test_link.test_link_command_multiple_names_success.approved.txt
│ │ ├── test_link.test_link_command_name_not_found.approved.txt
│ │ ├── test_link.test_link_runtime_error.approved.txt
│ │ └── test_link.test_list_command_from_workspace_success.approved.txt
│ ├── list/
│ │ ├── test_list.py
│ │ ├── test_list.test_list_command_from_empty_folder.approved.txt
│ │ ├── test_list.test_list_command_from_workspace_success.approved.txt
│ │ ├── test_list.test_list_command_no_args.approved.txt
│ │ ├── test_list.test_list_command_verbose_from_workspace_success.approved.txt
│ │ └── test_list.test_run_command_from_workspace_success.approved.txt
│ └── run/
│ ├── __init__.py
│ ├── test_run.py
│ ├── test_run.test_list_all_commands_in_workspace.approved.txt
│ ├── test_run.test_run_command_from_standalone.approved.txt
│ ├── test_run.test_run_command_from_standalone_execution_error.approved.txt
│ ├── test_run.test_run_command_from_standalone_pass_env.approved.txt
│ ├── test_run.test_run_command_from_standalone_resolution_error.approved.txt
│ ├── test_run.test_run_command_from_standalone_with_extra_args.approved.txt
│ ├── test_run.test_run_command_from_workspace_execution_error.approved.txt
│ ├── test_run.test_run_command_from_workspace_filtered.approved.txt
│ ├── test_run.test_run_command_from_workspace_filtered_no_project.approved.txt
│ ├── test_run.test_run_command_from_workspace_resolution_error.approved.txt
│ ├── test_run.test_run_command_from_workspace_sequential_success.approved.txt
│ ├── test_run.test_run_command_from_workspace_success.approved.txt
│ ├── test_run.test_run_command_from_workspace_with_extra_args.approved.txt
│ ├── test_run.test_run_command_from_workspace_with_extra_args_and_project_filter.approved.txt
│ └── test_run.test_run_command_help_works_without_path_resolution.approved.txt
├── tasks/
│ ├── TestAddAlias.test_wallet_add_account_successful.approved.txt
│ ├── TestAddAlias.test_wallet_add_address_successful.approved.txt
│ ├── TestAddAlias.test_wallet_add_alias_exists.approved.txt
│ ├── TestAddAlias.test_wallet_add_alias_generic_error.approved.txt
│ ├── TestAddAlias.test_wallet_add_alias_limit_error.approved.txt
│ ├── TestAddAlias.test_wallet_add_alias_mnemonic_differs.approved.txt
│ ├── TestAddAlias.test_wallet_add_invalid_address.approved.txt
│ ├── TestGetAlias.test_wallet_get_alias_not_found.approved.txt
│ ├── TestGetAlias.test_wallet_get_alias_successful.approved.txt
│ ├── TestIpfsLogin.test_ipfs_login_exists.approved.txt
│ ├── TestIpfsLogin.test_ipfs_login_successful.approved.txt
│ ├── TestIpfsLogout.test_ipfs_logout.approved.txt
│ ├── TestIpfsUpload.test_ipfs_upload_http_error.approved.txt
│ ├── TestIpfsUpload.test_ipfs_upload_successful.approved.txt
│ ├── TestListAliases.test_wallet_list_aliases_not_found.approved.txt
│ ├── TestListAliases.test_wallet_list_aliases_successful.approved.txt
│ ├── TestRemoveAlias.test_wallet_remove_alias_generic_error.approved.txt
│ ├── TestRemoveAlias.test_wallet_remove_alias_not_found.approved.txt
│ ├── TestRemoveAlias.test_wallet_remove_alias_successful.approved.txt
│ ├── TestResetAliases.test_wallet_reset_aliases_generic_error.approved.txt
│ ├── TestResetAliases.test_wallet_reset_aliases_not_found.approved.txt
│ ├── TestResetAliases.test_wallet_reset_aliases_successful.approved.txt
│ ├── __init__.py
│ ├── conftest.py
│ ├── test_analyze.py
│ ├── test_analyze.test_analyze_abort_disclaimer.approved.txt
│ ├── test_analyze.test_analyze_diff_flag.approved.txt
│ ├── test_analyze.test_analyze_diff_flag_missing_old_report.approved.txt
│ ├── test_analyze.test_analyze_error_in_tealer.approved.txt
│ ├── test_analyze.test_analyze_error_no_pipx.approved.txt
│ ├── test_analyze.test_analyze_multiple_files.approved.txt
│ ├── test_analyze.test_analyze_multiple_files_recursive.approved.txt
│ ├── test_analyze.test_analyze_single_file.approved.txt
│ ├── test_analyze.test_analyze_skipping_tmpl_vars.approved.txt
│ ├── test_analyze.test_exclude_vulnerabilities.approved.txt
│ ├── test_asset.py
│ ├── test_asset.test_opt_in_invalid_network.approved.txt
│ ├── test_asset.test_opt_in_no_args.approved.txt
│ ├── test_asset.test_opt_in_of_assets_from_account_alias_successful.approved.txt
│ ├── test_asset.test_opt_in_to_assets_from_account_address_failed.approved.txt
│ ├── test_asset.test_opt_in_to_assets_from_account_address_successful.approved.txt
│ ├── test_asset.test_opt_out_assets_from_account_address_failed.approved.txt
│ ├── test_asset.test_opt_out_invalid_network.approved.txt
│ ├── test_asset.test_opt_out_no_args.approved.txt
│ ├── test_asset.test_opt_out_of_all_assets_from_account_address_successful.approved.txt
│ ├── test_asset.test_opt_out_of_assets_from_account_address_successful.approved.txt
│ ├── test_asset.test_opt_out_of_assets_from_account_alias_successful.approved.txt
│ ├── test_ipfs.py
│ ├── test_mint.py
│ ├── test_mint.test_mint_token_acfg_token_metadata_mismatch.approved.txt
│ ├── test_mint.test_mint_token_generic_error.approved.txt
│ ├── test_mint.test_mint_token_no_pinata_jwt_error.approved.txt
│ ├── test_mint.test_mint_token_pinata_error.approved.txt
│ ├── test_mint.test_mint_token_successful.address.False.localnet.approved.txt
│ ├── test_mint.test_mint_token_successful.address.False.mainnet.approved.txt
│ ├── test_mint.test_mint_token_successful.address.False.testnet.approved.txt
│ ├── test_mint.test_mint_token_successful.alias.True.localnet.approved.txt
│ ├── test_mint.test_mint_token_successful.alias.True.mainnet.approved.txt
│ ├── test_mint.test_mint_token_successful.alias.True.testnet.approved.txt
│ ├── test_mint.test_mint_token_successful_on_decimals.decimals_given_params.approved.txt
│ ├── test_mint.test_mint_token_successful_on_decimals.no_decimals_given.approved.txt
│ ├── test_nfd_lookup.py
│ ├── test_nfd_lookup.test_nfd_lookup_by_address_success.approved.txt
│ ├── test_nfd_lookup.test_nfd_lookup_by_domain_success.approved.txt
│ ├── test_send_transaction.py
│ ├── test_send_transaction.test_decoding_error.approved.txt
│ ├── test_send_transaction.test_file_decoding_no_txn_error.approved.txt
│ ├── test_send_transaction.test_mutually_exclusive_options.approved.txt
│ ├── test_send_transaction.test_send_atomic_txn_group_successful.approved.txt
│ ├── test_send_transaction.test_send_from_file_successful.approved.txt
│ ├── test_send_transaction.test_send_from_piped_input_successful.approved.txt
│ ├── test_send_transaction.test_send_from_transaction_successful.approved.txt
│ ├── test_sign_transaction.py
│ ├── test_sign_transaction.test_file_decoding_errors.approved.txt
│ ├── test_sign_transaction.test_mutually_exclusive_options.approved.txt
│ ├── test_sign_transaction.test_sign_atomic_txn_group_successful.approved.txt
│ ├── test_sign_transaction.test_sign_from_stdin_with_address_successful.approved.txt
│ ├── test_sign_transaction.test_sign_from_stdin_with_alias_successful.approved.txt
│ ├── test_sign_transaction.test_sign_many_from_file_with_address_successful.approved.txt
│ ├── test_sign_transaction.test_sign_many_from_file_with_alias_successful.approved.txt
│ ├── test_sign_transaction.test_transaction_decoding_errors.approved.txt
│ ├── test_transfer.py
│ ├── test_transfer.test_transfer_algo_from_address_successful.approved.txt
│ ├── test_transfer.test_transfer_algo_from_alias_successful.approved.txt
│ ├── test_transfer.test_transfer_algo_successful.approved.txt
│ ├── test_transfer.test_transfer_asset_from_address_successful.approved.txt
│ ├── test_transfer.test_transfer_asset_from_address_to_alias_successful.approved.txt
│ ├── test_transfer.test_transfer_asset_from_alias_successful.approved.txt
│ ├── test_transfer.test_transfer_failed.approved.txt
│ ├── test_transfer.test_transfer_invalid_receiver_account.approved.txt
│ ├── test_transfer.test_transfer_invalid_sender_accoount.approved.txt
│ ├── test_transfer.test_transfer_invalid_sender_account.approved.txt
│ ├── test_transfer.test_transfer_no_amount.approved.txt
│ ├── test_transfer.test_transfer_no_args.approved.txt
│ ├── test_transfer.test_transfer_no_option.approved.txt
│ ├── test_transfer.test_transfer_on_mainnet.approved.txt
│ ├── test_transfer.test_transfer_on_testnet.approved.txt
│ ├── test_vanity_address.py
│ ├── test_vanity_address.test_vanity_address_invalid_input_on_alias.approved.txt
│ ├── test_vanity_address.test_vanity_address_invalid_input_on_file.approved.txt
│ ├── test_vanity_address.test_vanity_address_invalid_keyword.approved.txt
│ ├── test_vanity_address.test_vanity_address_no_options.approved.txt
│ └── test_wallet.py
├── test_root.py
├── test_root.test_help.approved.txt
├── utils/
│ ├── __init__.py
│ ├── app_dir_mock.py
│ ├── approvals.py
│ ├── click_invoker.py
│ ├── proc_mock.py
│ └── which_mock.py
└── version_check/
├── __init__.py
├── test_version_check.py
├── test_version_check.test_version_check_disable_version_check.approved.txt
├── test_version_check.test_version_check_enable_version_check.approved.txt
├── test_version_check.test_version_check_queries_github_when_cache_out_of_date.approved.txt
├── test_version_check.test_version_check_queries_github_when_no_cache.approved.txt
├── test_version_check.test_version_check_respects_disable_config.approved.txt
├── test_version_check.test_version_check_respects_skip_option.approved.txt
└── test_version_check.test_version_check_uses_cache.approved.txt
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
root=true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
[*.py]
indent_size = 4
================================================
FILE: .gitattributes
================================================
* text=auto eol=lf
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: "\U0001F41C Bug report"
about: Report a reproducible bug.
title: ''
labels: bug
assignees: ''
---
### Subject of the issue
<!-- Describe your issue here. -->
### Your environment
<!--
* Please provide the output of `algokit doctor` command response,
* This will give us a good idea about your environment
-->
### Steps to reproduce
1.
2.
### Expected behaviour
### Actual behaviour
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: "\U0001F514 Feature Request"
about: Suggestions for how we can improve the algorand platform.
title: ''
labels: enhancement
assignees: ''
---
## Problem
<!-- What is the problem that we’re trying to solve? -->
## Solution
<!-- Do you have a potential/suggested solution? Document more than one if possible. -->
### Proposal
<!-- Describe the solution you’d like in detail. -->
### Pros and Cons
<!-- What are the advantages and disadvantages of this solution? -->
## Dependencies
<!-- Does the solution have any team or design dependencies? -->
================================================
FILE: .github/actions/build-binaries/linux/action.yaml
================================================
name: "Build Linux Binary Artifacts"
description: "Build Linux specific pyinstaller binary artifacts"
inputs:
package_name:
description: "The name of the package"
required: true
artifacts_dir:
description: "The directory to write artifacts you want to publish"
required: true
version:
description: "The version to use for this artifact"
runs:
using: "composite"
steps:
- name: Build binary
shell: bash
run: |
poetry run poe package_unix
- name: Package binary artifact
shell: bash
run: |
cd dist/algokit/
echo snap > ./_internal/algokit/resources/distribution-method
tar -zcf ${{ inputs.artifacts_dir }}/${{ inputs.package_name }}-snap.tar.gz *
cd ../..
- name: Upload binary artifact
uses: actions/upload-artifact@v4
with:
name: ${{ inputs.package_name }}-snap
path: ${{ inputs.artifacts_dir }}/${{ inputs.package_name }}-snap.tar.gz
================================================
FILE: .github/actions/build-binaries/macos/action.yaml
================================================
name: "Build macOS Binary Artifacts"
description: "Build macOS specific pyinstaller binary artifacts"
inputs:
package_name:
description: "The name of the package"
required: true
artifacts_dir:
description: "The directory to write artifacts you want to publish"
required: true
version:
description: "The version to use for this artifact"
with_codesign:
description: "Flag to determine if we should sign the binary"
required: true
apple_team_id:
description: "The Apple Team ID"
required: true
apple_bundle_id:
description: "The bundle ID to be used for packaging and notarisation"
required: true
apple_cert_id:
description: "The Apple Developer ID certificate ID"
required: true
apple_notary_user:
description: "The Apple user to notarise the package"
required: true
apple_notary_password:
description: "The Apple password to notarise the package"
required: true
runs:
using: "composite"
steps:
- name: Build binary
shell: bash
run: |
export APPLE_CERT_ID="${{ inputs.with_codesign == 'true' && inputs.apple_cert_id || '' }}"
export APPLE_BUNDLE_ID="${{ inputs.with_codesign == 'true' && inputs.apple_bundle_id || format('beta.{0}', inputs.apple_bundle_id) }}"
poetry run poe package_mac
env:
APPLE_CERT_ID: ${{ inputs.with_codesign == 'true' && inputs.apple_cert_id || '' }}
APPLE_BUNDLE_ID: ${{ inputs.with_codesign == 'true' && inputs.apple_bundle_id || format('beta.{0}', inputs.apple_bundle_id) }}
- name: Add metadata to binary
shell: bash
run: |
echo brew > ${{ github.workspace }}/dist/algokit/_internal/algokit/resources/distribution-method
# Workaround an issue with PyInstaller where Python.framework was incorrectly signed during the build
- name: Codesign python.framework
if: ${{ inputs.with_codesign == 'true' }}
shell: bash
run: |
codesign --force --sign "${{ inputs.apple_cert_id }}" --timestamp "${{ github.workspace }}/dist/algokit/_internal/Python.framework"
- name: Notarize
if: ${{ inputs.with_codesign == 'true' }}
uses: lando/notarize-action@v2
with:
appstore-connect-team-id: ${{ inputs.apple_team_id }}
appstore-connect-username: ${{ inputs.apple_notary_user }}
appstore-connect-password: ${{ inputs.apple_notary_password }}
primary-bundle-id: ${{ inputs.apple_bundle_id }}
product-path: "${{ github.workspace }}/dist/algokit"
tool: notarytool
verbose: true
- name: Package binary artifact
shell: bash
run: |
cd dist/algokit/
tar -zcf ${{ inputs.artifacts_dir }}/${{ inputs.package_name }}-brew.tar.gz *
cd ../..
- name: Upload binary artifact
uses: actions/upload-artifact@v4
with:
name: ${{ inputs.package_name }}
path: ${{ inputs.artifacts_dir }}/${{ inputs.package_name }}-brew.tar.gz
================================================
FILE: .github/actions/build-binaries/windows/action.yaml
================================================
name: "Build Windows Binary Artifacts"
description: "Build Windows specific pyinstaller binary artifacts"
inputs:
package_name:
description: "The name of the package"
required: true
version:
description: "The version to use for this artifact"
artifacts_dir:
description: "The directory to write artifacts you want to publish"
required: true
with_codesign:
description: "Flag to determine if we should sign the binary"
required: true
azure_tenant_id:
description: "The Microsoft Entra tenant (directory) ID."
required: true
azure_client_id:
description: "The client (application) ID of an App Registration in the tenant."
required: true
azure_client_secret:
description: "A client secret that was generated for the App Registration."
required: true
runs:
using: "composite"
steps:
- name: Configure build environment
shell: pwsh
run: |
# Find Windows SDK tools dynamically (works on both Windows 2022 and 2025)
$sdkPath = "C:\Program Files (x86)\Windows Kits\10\bin"
# First, try to find makepri and makeappx in PATH
$makepriCmd = Get-Command makepri -ErrorAction SilentlyContinue
$makeappxCmd = Get-Command makeappx -ErrorAction SilentlyContinue
if (-not $makepriCmd -or -not $makeappxCmd) {
Write-Host "SDK tools not in PATH, searching for Windows SDK..."
if (Test-Path $sdkPath) {
# Find the latest SDK version
$latestVersion = Get-ChildItem $sdkPath -Directory |
Where-Object { $_.Name -match '^\d+\.\d+\.\d+\.\d+$' } |
Sort-Object { [Version]$_.Name } -Descending |
Select-Object -First 1
if ($latestVersion) {
$sdkBinPath = Join-Path $latestVersion.FullName "x64"
Write-Host "Adding Windows SDK to PATH: $sdkBinPath"
echo "$sdkBinPath" >> $env:GITHUB_PATH
# Verify tools exist
$makepriPath = Join-Path $sdkBinPath "makepri.exe"
$makeappxPath = Join-Path $sdkBinPath "makeappx.exe"
if (-not (Test-Path $makepriPath)) {
throw "makepri.exe not found at $makepriPath"
}
if (-not (Test-Path $makeappxPath)) {
throw "makeappx.exe not found at $makeappxPath"
}
Write-Host "✓ Found makepri.exe at: $makepriPath"
Write-Host "✓ Found makeappx.exe at: $makeappxPath"
} else {
throw "No Windows SDK versions found in $sdkPath"
}
} else {
throw "Windows SDK not found at $sdkPath"
}
} else {
Write-Host "✓ SDK tools already in PATH"
Write-Host " makepri: $($makepriCmd.Source)"
Write-Host " makeappx: $($makeappxCmd.Source)"
}
# Set environment variables
echo 'BINARY_BUILD_DIR=dist\algokit' >> $env:GITHUB_ENV
echo 'WINGET_INSTALLER=${{ inputs.artifacts_dir }}\${{ inputs.package_name }}-winget.msix' >> $env:GITHUB_ENV
- name: Build binary
shell: bash
run: |
poetry run poe package_windows
- name: Add metadata to binary
shell: bash
run: |
echo winget > '${{ env.BINARY_BUILD_DIR }}\_internal\algokit\resources\distribution-method'
- name: Sign executable
if: ${{ inputs.with_codesign == 'true' }}
uses: azure/trusted-signing-action@v0.3.20
with:
azure-tenant-id: ${{ inputs.azure_tenant_id }}
azure-client-id: ${{ inputs.azure_client_id }}
azure-client-secret: ${{ inputs.azure_client_secret }}
endpoint: https://weu.codesigning.azure.net/
trusted-signing-account-name: algokit-signing
certificate-profile-name: algokit
files-folder: ${{ env.BINARY_BUILD_DIR }}
files-folder-filter: exe
file-digest: SHA256
timestamp-rfc3161: http://timestamp.acs.microsoft.com
timestamp-digest: SHA256
- name: Build winget installer
shell: pwsh
run: |
& .\scripts\winget\build-installer.ps1 `
-binaryDir '${{ env.BINARY_BUILD_DIR }}' `
-releaseVersion '${{ inputs.version }}' `
-outputFile '${{ env.WINGET_INSTALLER }}'
- name: Sign winget installer
if: ${{ inputs.with_codesign == 'true' }}
uses: azure/trusted-signing-action@v0.3.20
with:
azure-tenant-id: ${{ inputs.azure_tenant_id }}
azure-client-id: ${{ inputs.azure_client_id }}
azure-client-secret: ${{ inputs.azure_client_secret }}
endpoint: https://weu.codesigning.azure.net/
trusted-signing-account-name: algokit-signing
certificate-profile-name: algokit
files-folder: ${{ env.WINGET_INSTALLER }}
files-folder-filter: msix
file-digest: SHA256
timestamp-rfc3161: http://timestamp.acs.microsoft.com
timestamp-digest: SHA256
- name: Upload winget artifact
uses: actions/upload-artifact@v4
with:
name: ${{ inputs.package_name }}-winget
path: ${{ env.WINGET_INSTALLER }}
if-no-files-found: error
================================================
FILE: .github/actions/install-apple-dev-id-cert/action.yaml
================================================
name: "Install Apple Developer ID certificate"
description: "Install Apple Developer ID certificate to macos-build keychain"
inputs:
cert_data:
description: "Base64 string represents the Apple developer ID certificate"
required: true
cert_password:
description: "The password to unlock the Apple developer ID certificate"
required: true
runs:
using: "composite"
steps:
- name: Install cert
shell: bash
env:
APPLE_CERT_DATA: ${{ inputs.cert_data }}
APPLE_CERT_PASSWORD: ${{ inputs.cert_password }}
run: |
# Export certs
echo "$APPLE_CERT_DATA" | base64 --decode > /tmp/certs.p12
# Create keychain
security create-keychain -p actions macos-build.keychain
security default-keychain -s macos-build.keychain
security unlock-keychain -p actions macos-build.keychain
security set-keychain-settings -t 3600 -u macos-build.keychain
echo "Keychain created"
# Import certs to keychain
security import /tmp/certs.p12 -k ~/Library/Keychains/macos-build.keychain -P "$APPLE_CERT_PASSWORD" -T /usr/bin/codesign -T /usr/bin/productsign
echo "Cert imported"
# Key signing
security set-key-partition-list -S apple-tool:,apple: -s -k actions macos-build.keychain
echo "Key signed"
# Delete temp file
rm /tmp/certs.p12
echo "Done"
================================================
FILE: .github/actions/setup-poetry/action.yaml
================================================
name: "Python Poetry Action"
description: "An action to setup Poetry"
runs:
using: "composite"
steps:
# A workaround for pipx isn't installed on M1 runner.
# We should remove it after this issue is resolved.
# https://github.com/actions/runner-images/issues/9256
- if: ${{ runner.os == 'macOS' && runner.arch == 'ARM64' }}
run: |
pip install poetry
pip install poetry-plugin-export
shell: bash
- if: ${{ runner.os != 'macOS' || runner.arch != 'ARM64' }}
run: |
pip install --user pipx
pipx ensurepath
pipx install poetry ${{ runner.os == 'macOS' && '--python "$Python_ROOT_DIR/bin/python"' || '' }}
pipx inject poetry poetry-plugin-export
shell: bash
- name: Get full Python version
id: full-python-version
shell: bash
run: echo "full_version=$(python -c 'import sys; print(".".join(map(str, sys.version_info[:3])))')" >> $GITHUB_OUTPUT
- name: Setup poetry cache
uses: actions/cache@v4
with:
path: ./.venv
key: venv-${{ hashFiles('poetry.lock') }}-${{ runner.os }}-${{ runner.arch }}-${{ steps.full-python-version.outputs.full_version }}
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "weekly"
commit-message:
prefix: "chore(deps)"
groups:
all:
patterns:
- "*"
update-types:
- "minor"
- "patch"
================================================
FILE: .github/pull_request_template.md
================================================
Fixes #
## Proposed Changes
-
-
-
================================================
FILE: .github/workflows/build-binaries.yaml
================================================
name: Build, Test and Publish Pyinstaller Binaries
on:
workflow_call:
inputs:
production_release:
required: true
type: string
python_version:
required: true
type: string
release_version:
required: false
type: string
jobs:
build-binaries:
runs-on: ${{ matrix.os }}
strategy:
matrix:
# macos-14 is the Apple Silicon M1 runner (mac os 14)
# macos-15-intel is the last available Intel Mac runner (mac os 15)
# See https://github.com/actions/runner-images?tab=readme-ov-file#available-images
os: [ubuntu-22.04, windows-latest, macos-15-intel, macos-14]
steps:
- name: Set signing condition
id: signing
run: |
# Allow signing on:
# 1. Main branch non-PR events when production_release is true OR
# 2. Main branch CRON triggered events
if [[ "${{ github.event_name }}" != "pull_request" && \
"${{ github.ref_name }}" == "main" && \
("${{ inputs.production_release }}" == "true" || "${{ github.event_name }}" == "schedule") ]]; then
echo "allowed=true" >> $GITHUB_OUTPUT
else
echo "allowed=false" >> $GITHUB_OUTPUT
fi
shell: bash
- name: Checkout source code
uses: actions/checkout@v4
with:
ref: ${{ inputs.release_version != '' && format('v{0}', inputs.release_version) || '' }}
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ inputs.python_version }}
- name: Set up Poetry
uses: ./.github/actions/setup-poetry
- name: Install dependencies
run: poetry install --no-interaction
- name: Configure build environment
shell: bash
run: |
artifacts_dir="${{ github.workspace }}${{ runner.os == 'Windows' && '\dist\artifacts' || '/dist/artifacts' }}"
mkdir -p $artifacts_dir
package_name_version="${{ inputs.release_version != '' && format('-{0}', inputs.release_version) || '' }}"
package_name="algokit${package_name_version}-${{ runner.os }}_${{ runner.arch }}"
echo "PACKAGE_NAME=`echo $package_name | tr '[:upper:]' '[:lower:]'`" >> $GITHUB_ENV
echo "ARTIFACTS_DIR=${artifacts_dir}" >> $GITHUB_ENV
# GitHub doesn't support expressions in the uses block
- name: Build windows binary
if: ${{ runner.os == 'Windows' }}
uses: ./.github/actions/build-binaries/windows
with:
package_name: ${{ env.PACKAGE_NAME }}
version: ${{ inputs.release_version }}
artifacts_dir: ${{ env.ARTIFACTS_DIR }}
with_codesign: ${{ steps.signing.outputs.allowed }}
azure_tenant_id: ${{ steps.signing.outputs.allowed == 'true' && secrets.AZURE_TENANT_ID || '' }}
azure_client_id: ${{ steps.signing.outputs.allowed == 'true' && secrets.AZURE_CLIENT_ID || '' }}
azure_client_secret: ${{ steps.signing.outputs.allowed == 'true' && secrets.AZURE_CLIENT_SECRET || '' }}
- name: Build linux binary
if: ${{ runner.os == 'Linux' }}
uses: ./.github/actions/build-binaries/linux
with:
package_name: ${{ env.PACKAGE_NAME }}
version: ${{ inputs.release_version }}
artifacts_dir: ${{ env.ARTIFACTS_DIR }}
- name: Install Apple Developer Id Cert
if: ${{ runner.os == 'macOS' && steps.signing.outputs.allowed == 'true' }}
uses: ./.github/actions/install-apple-dev-id-cert
with:
cert_data: ${{ secrets.APPLE_CERT_DATA }}
cert_password: ${{ secrets.APPLE_CERT_PASSWORD }}
- name: Build macOS binary
if: ${{ runner.os == 'macOS' }}
uses: ./.github/actions/build-binaries/macos
with:
package_name: ${{ env.PACKAGE_NAME }}
version: ${{ inputs.release_version }}
artifacts_dir: ${{ env.ARTIFACTS_DIR }}
with_codesign: ${{ steps.signing.outputs.allowed }}
apple_team_id: ${{ steps.signing.outputs.allowed == 'true' && secrets.APPLE_TEAM_ID || '' }}
apple_bundle_id: ${{ inputs.production_release == 'true' && vars.APPLE_BUNDLE_ID || format('beta.{0}', vars.APPLE_BUNDLE_ID) }}
apple_cert_id: ${{ steps.signing.outputs.allowed == 'true' && secrets.APPLE_CERT_ID || '' }}
apple_notary_user: ${{ steps.signing.outputs.allowed == 'true' && secrets.APPLE_NOTARY_USER || '' }}
apple_notary_password: ${{ steps.signing.outputs.allowed == 'true' && secrets.APPLE_NOTARY_PASSWORD || '' }}
- name: Add binary to path
run: |
echo "${{ github.workspace }}${{ runner.os == 'Windows' && '\dist\algokit' || '/dist/algokit' }}" >> $GITHUB_PATH
shell: bash
- name: Run portability tests
if: ${{ runner.os == 'Windows' }}
run: |
git config --global user.email "actions@github.com" && git config --global user.name "github-actions"
poetry run pytest tests/ -m pyinstaller_binary_tests --log-cli-level=INFO
shell: cmd
- name: Run portability tests
if: ${{ runner.os != 'Windows' }}
run: |
git config --global user.email "actions@github.com" && git config --global user.name "github-actions"
poetry run pytest tests/ -m pyinstaller_binary_tests --log-cli-level=INFO
shell: bash
# softprops/action-gh-release doesn't support the \ character in paths
- name: Adjust artifacts directory for softprops/action-gh-release
if: ${{ runner.os == 'Windows' }}
shell: pwsh
run: |
$adjusted = '${{ env.ARTIFACTS_DIR }}' -replace '\\','/'
echo "ARTIFACTS_DIR=$adjusted" >> $env:GITHUB_ENV
- name: Append artifacts to release
if: ${{ inputs.production_release == 'true' }}
uses: softprops/action-gh-release@v1
with:
fail_on_unmatched_files: true
files: |
${{ env.ARTIFACTS_DIR }}/*.*
tag_name: ${{ format('v{0}', inputs.release_version) }}
prerelease: ${{ contains(inputs.release_version, 'beta') }}
================================================
FILE: .github/workflows/build-python.yaml
================================================
name: Build, Test and Publish Python
on: [workflow_call]
jobs:
build-python:
strategy:
fail-fast: false
matrix:
os: ["ubuntu-latest", "macos-latest", "windows-latest"]
python: ["3.10", "3.11", "3.12", "3.13", "3.14"]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python }}
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 20
- name: Set up Poetry
uses: ./.github/actions/setup-poetry
- name: Install dependencies
# TODO: remove fixed pipx dependency once 3.12 compatibility is addressed
# track here -> https://github.com/crytic/tealer/pull/209
run: poetry install --no-interaction --without docs && pipx install tealer==0.1.2
- name: Install PuyaPy
if: ${{ matrix.python == '3.12' }}
run: pipx install puyapy
- name: pytest
shell: bash
if: ${{ !(matrix.python == '3.12' && matrix.os == 'ubuntu-latest') }}
# git config is needed due to several tests relying on e2e copier invocation and copier relies on git during `copy` command
run: |
set -o pipefail
git config --global user.email "actions@github.com" && git config --global user.name "github-actions"
poetry run pytest -n auto
id: pytest
- name: pytest + coverage
shell: bash
if: matrix.python == '3.12' && matrix.os == 'ubuntu-latest'
env:
COVERAGE_CORE: sysmon
# git config is needed due to several tests relying on e2e copier invocation and copier relies on git during `copy` command
run: |
set -o pipefail
git config --global user.email "actions@github.com" && git config --global user.name "github-actions"
poetry run pytest -n auto --junitxml=pytest-junit.xml --cov-report=term-missing:skip-covered --cov=src | tee pytest-coverage.txt
id: pytest-cov
- name: Upload received snapshots (in case of failure)
if: failure() && (steps.pytest.outcome == 'failure' || steps.pytest-cov.outcome == 'failure')
uses: actions/upload-artifact@v4
with:
name: test-artifacts-${{ matrix.os }}-python${{ matrix.python }}
path: tests/**/*.received.txt
- name: pytest coverage comment - using Python 3.12 on ubuntu-latest
if: matrix.python == '3.12' && matrix.os == 'ubuntu-latest'
continue-on-error: true # forks fail to add a comment, so continue any way
uses: MishaKav/pytest-coverage-comment@main
with:
pytest-coverage-path: ./pytest-coverage.txt
junitxml-path: ./pytest-junit.xml
- name: Build Wheel
run: poetry build --format wheel
================================================
FILE: .github/workflows/cd.yaml
================================================
name: Continuous Delivery of Python package
on:
push:
branches:
- main
paths-ignore:
- "docs/**"
- "**.md"
- ".vscode/**"
- ".idea/**"
- ".gitignore"
- ".editorconfig"
- ".pre-commit-config.yaml"
- ".github/**"
- "tests/**"
- "scripts/**"
workflow_dispatch:
inputs:
production_release:
description: "Production release?"
required: true
default: "true"
concurrency: release
permissions:
contents: write
packages: read
jobs:
ci-check-python:
name: Check Python
uses: ./.github/workflows/check-python.yaml
ci-build-python:
name: Build Python
uses: ./.github/workflows/build-python.yaml
needs: ci-check-python
release:
name: Release wheels to pypi
needs: ci-build-python
runs-on: ubuntu-latest
outputs:
release_version: ${{ steps.get_release_version.outputs.RELEASE_VERSION }}
steps:
- name: Generate bot token
uses: actions/create-github-app-token@v1
id: app_token
with:
app-id: ${{ secrets.BOT_ID }}
private-key: ${{ secrets.BOT_SK }}
- uses: actions/checkout@v4
with:
# Fetch entire repository history so we can determine version number from it
fetch-depth: 0
token: ${{ steps.app_token.outputs.token }}
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.10"
- name: Set up Poetry
uses: ./.github/actions/setup-poetry
- name: Install dependencies
run: poetry install --no-interaction --no-root
- name: Get branch name
shell: bash
run: echo "branch=${GITHUB_REF#refs/heads/}" >> $GITHUB_OUTPUT
id: get_branch
- name: Set Git user as GitHub actions
run: git config --global user.email "179917785+engineering-ci[bot]@users.noreply.github.com" && git config --global user.name "engineering-ci[bot]"
- name: Create Continuous Deployment - Feature Branch
if: steps.get_branch.outputs.branch != 'main' && inputs.production_release != 'true'
run: |
poetry run semantic-release \
-v DEBUG \
--prerelease \
--patch \
--define=prerelease_tag=beta+${{ steps.get_branch.outputs.branch }} \
--define=branch=${{ steps.get_branch.outputs.branch }} \
publish
release_version_tag="$(git describe $(git rev-list --tags --max-count=1))"
gh release edit --prerelease $release_version_tag
echo "RELEASE_VERSION=${release_version_tag:1}" >> $GITHUB_ENV
env:
GH_TOKEN: ${{ steps.app_token.outputs.token }}
REPOSITORY_USERNAME: __token__
REPOSITORY_PASSWORD: ${{ secrets.PYPI_API_KEY }}
- name: Create Continuous Deployment - Beta (non-prod)
if: steps.get_branch.outputs.branch == 'main' && inputs.production_release != 'true'
run: |
poetry run semantic-release \
-v DEBUG \
--prerelease \
--define=branch=main \
publish
release_version="$(poetry run semantic-release print-version --current)"
gh release edit --prerelease "v$release_version"
echo "RELEASE_VERSION=$release_version" >> $GITHUB_ENV
env:
GH_TOKEN: ${{ steps.app_token.outputs.token }}
REPOSITORY_USERNAME: __token__
REPOSITORY_PASSWORD: ${{ secrets.PYPI_API_KEY }}
- name: Create Continuous Deployment - Production
if: steps.get_branch.outputs.branch == 'main' && inputs.production_release == 'true'
run: |
poetry run semantic-release \
-v DEBUG \
--define=version_source="commit" \
--define=patch_without_tag=true \
--define=upload_to_repository=true \
--define=branch=main \
publish
release_version="$(poetry run semantic-release print-version --current)"
echo "RELEASE_VERSION=$release_version" >> $GITHUB_ENV
env:
GH_TOKEN: ${{ steps.app_token.outputs.token }}
REPOSITORY_USERNAME: __token__
REPOSITORY_PASSWORD: ${{ secrets.PYPI_API_KEY }}
- name: Get release version
shell: bash
run: echo "RELEASE_VERSION=$RELEASE_VERSION" >> $GITHUB_OUTPUT
id: get_release_version
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: algokit-cli
path: dist/algokit*-py3-none-any.whl
if-no-files-found: error
build-and-upload-binaries:
name: Build and Upload Binaries
if: ${{ github.ref_name == 'main' }}
uses: ./.github/workflows/build-binaries.yaml
needs: release
with:
production_release: ${{ inputs.production_release }}
python_version: "3.12"
release_version: ${{ needs.release.outputs.release_version }}
secrets: inherit
cd-publish-release-packages:
name: Release binaries via distribution channels
needs:
- release
- build-and-upload-binaries
if: ${{ github.ref_name == 'main' && inputs.production_release == 'true' }} # Might want to adjust this to publish (pre-release) on merge as well.
uses: ./.github/workflows/publish-release-packages.yaml
with:
artifactName: algokit-cli
release_version: ${{ needs.release.outputs.release_version }}
secrets: inherit
================================================
FILE: .github/workflows/check-python.yaml
================================================
name: Check Python Code
on:
workflow_call:
jobs:
check-python:
runs-on: "ubuntu-latest"
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Set up Poetry
uses: ./.github/actions/setup-poetry
- name: Install dependencies
run: poetry install --no-interaction --with docs
- name: Audit with pip-audit
run: |
poetry export --without=dev --without=docs -o requirements.txt
poetry run pip-audit -r requirements.txt
# If a vulnerability is found in a dependency without an available fix,
# it can be temporarily ignored by adding --ignore-vuln e.g. poetry run pip-audit -r requirements.txt --ignore-vuln 'GHSA-xxxxx'
- name: Check formatting with Ruff
run: |
# stop the build if there are files that don't meet formatting requirements
poetry run ruff format --check .
- name: Check linting with Ruff
run: |
# stop the build if there are Python syntax errors or undefined names
poetry run ruff check .
- name: Check types with mypy
run: poetry run mypy
- name: Check docs are up to date
run: |
poetry run poe docs
[ $(git status --porcelain docs/ | wc -l) -eq "0" ]
================================================
FILE: .github/workflows/clear-caches.yaml
================================================
name: Clear Repository Caches
on:
schedule:
# Run every 5 days at 2 AM UTC
- cron: "0 2 */5 * *"
workflow_dispatch: # Allow manual trigger
permissions:
actions: write
jobs:
clear-caches:
name: Clear Repository Caches
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Clear all repository caches
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
echo "🧹 Starting cache cleanup process..."
if gh cache delete --all --succeed-on-no-caches; then
echo "🎉 Cache cleanup completed!"
else
echo "❌ Failed to clear caches"
exit 1
fi
================================================
FILE: .github/workflows/pr.yaml
================================================
name: Codebase validation
on:
pull_request:
paths-ignore:
- "README.md"
schedule:
- cron: "0 8 * * 1" # Each monday 8 AM UTC
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
pr-check:
name: Check Python
uses: ./.github/workflows/check-python.yaml
pr-build:
name: Build & Test Python
needs: pr-check
uses: ./.github/workflows/build-python.yaml
pr-binaries-build:
name: Build & Test Binaries
needs: pr-check
uses: ./.github/workflows/build-binaries.yaml
with:
production_release: "false"
python_version: "3.12"
secrets: inherit
================================================
FILE: .github/workflows/publish-release-packages.yaml
================================================
name: Publish packages to public repositories
on:
workflow_call:
inputs:
artifactName:
required: true
type: string
description: "The github artifact holding the wheel file which will be published"
release_version:
required: true
type: string
description: "The release version that will be published (e.g. 0.1.0)"
do_brew:
required: false
default: true
type: boolean
description: "Publish to brew repository"
do_snap:
required: false
default: true
type: boolean
description: "Publish to snap repository"
do_winget:
required: false
default: true
type: boolean
description: "Publish to Winget repository"
workflow_dispatch:
inputs:
artifactName:
required: true
type: string
description: "The github artifact holding the wheel file which will be published"
release_version:
required: true
type: string
description: "The release version that will be published (e.g. 0.1.0)"
do_brew:
required: false
default: true
type: boolean
description: "Publish to brew repository"
do_snap:
required: false
default: true
type: boolean
description: "Publish to snap repository"
do_winget:
required: false
default: true
type: boolean
description: "Publish to Winget repository"
jobs:
publish-brew:
runs-on: ubuntu-latest
if: ${{ inputs.do_brew }}
steps:
- uses: actions/create-github-app-token@v1
id: app-token
with:
app-id: ${{ secrets.BOT_ID }}
private-key: ${{ secrets.BOT_SK }}
repositories: homebrew-tap
owner: algorandfoundation
- name: Checkout source code
uses: actions/checkout@v4
- name: Download wheel from release
run: gh release download v${{ inputs.release_version }} --pattern "*.whl" --dir dist
env:
GH_TOKEN: ${{ github.token }}
- name: Download binary artifact from release
run: gh release download v${{ inputs.release_version }} --pattern "*-brew.tar.gz" --dir dist
env:
GH_TOKEN: ${{ github.token }}
- name: Set Git user as GitHub actions
run: git config --global user.email "179917785+engineering-ci[bot]@users.noreply.github.com" && git config --global user.name "engineering-ci[bot]"
- name: Update homebrew cask
run: scripts/update-brew-cask.sh "dist/algokit*-py3-none-any.whl" "dist/algokit*-macos_arm64-brew.tar.gz" "dist/algokit*-macos_x64-brew.tar.gz" "algorandfoundation/homebrew-tap"
env:
TAP_GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
publish-winget:
runs-on: windows-latest
if: ${{ inputs.do_winget }}
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Publish to winget
shell: pwsh
env:
WINGET_GITHUB_TOKEN: ${{ secrets.WINGET_GITHUB_TOKEN }}
run: |
echo 'Publishing to winget'
& .\scripts\winget\update-package.ps1 `
-releaseVersion '${{ inputs.release_version }}'
publish-snap:
runs-on: ubuntu-latest
if: ${{ inputs.do_snap }}
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Download binary artifact from release
run: |
gh release download v${{ inputs.release_version }} --pattern "*-snap.tar.gz" --dir dist
BINARY_PATH=$(ls dist/*-snap.tar.gz)
echo "BINARY_PATH=$BINARY_PATH" >> $GITHUB_ENV
env:
GH_TOKEN: ${{ github.token }}
- name: Generate snapcraft.yaml
run: |
./scripts/snap/create-snapcraft-yaml.sh ${{ github.workspace }} ${{ inputs.release_version }} ${{ env.BINARY_PATH }} "stable"
- name: Upload snapcraft.yaml as reference artifact
uses: actions/upload-artifact@v4
with:
name: snapcraft-yaml
path: ${{ github.workspace }}/snap/snapcraft.yaml
- name: Build snap
uses: snapcore/action-build@v1
with:
snapcraft-args: --target-arch amd64
- name: Set path to snap binary
shell: bash
run: |
echo "SNAP_BINARY_PATH=$(find ${{ github.workspace }} -name '*.snap')" >> $GITHUB_ENV
- name: Publish snap
uses: snapcore/action-publish@v1
env:
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_RELEASE_TOKEN }}
with:
snap: ${{ env.SNAP_BINARY_PATH }}
release: stable
================================================
FILE: .gitignore
================================================
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
pytest-coverage.txt
pytest-junit.xml
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock
# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
# in version control.
# https://pdm.fming.dev/#use-with-ide
.pdm.toml
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Ruff (linter)
.ruff_cache/
# Cython debug symbols
cython_debug/
# PyCharm
.idea/
!.idea/runConfigurations
# macOS
.DS_Store
# we use this file for quickly editing run/debug args, it shouldn't be committed
/args.in
# Received approval test files
*.received.*
#Sphinx
.doctrees/
docs/cli/temp.md
# Miscellaneous
ci_token.txt
.algokit/
temp/
================================================
FILE: .idea/runConfigurations/Run_AlgoKit_CLI.xml
================================================
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Run AlgoKit CLI" type="PythonConfigurationType" factoryName="Python">
<module name="algokit-cli" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="debug" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="true" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
</component>
================================================
FILE: .pre-commit-config.yaml
================================================
repos:
- repo: local
hooks:
- id: ruff-format
name: ruff-format
description: "Run 'ruff format' for extremely fast Python formatting"
entry: poetry run ruff format
language: system
types: [python]
args: [--no-cache]
require_serial: true
exclude: ^src/.*core/_vendor/
- id: ruff
name: ruff
description: "Run 'ruff' for extremely fast Python linting"
entry: poetry run ruff check
language: system
"types": [python]
args: [--fix, --no-cache]
require_serial: false
files: "^(src|tests)/"
exclude: "^src/algokit/core/_vendor/"
- id: mypy
name: mypy
description: "`mypy` will check Python types for correctness"
entry: poetry run mypy
language: system
types_or: [python, pyi]
require_serial: true
files: "^(src|tests)/"
exclude: "^src/algokit/core/_vendor/"
================================================
FILE: .vscode/extensions.json
================================================
{
"recommendations": [
"esbenp.prettier-vscode",
"ms-python.python",
"ms-python.vscode-pylance",
"charliermarsh.ruff",
"tamasfe.even-better-toml",
"editorconfig.editorconfig",
"matangover.mypy"
]
}
================================================
FILE: .vscode/launch.json
================================================
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: Module",
"type": "debugpy",
"cwd": "${workspaceFolder}",
"request": "launch",
"module": "debug",
"justMyCode": false,
"console": "integratedTerminal"
},
{
"name": "Python: Debug Pytest",
"type": "debugpy",
"request": "launch",
"program": "${file}",
"purpose": ["debug-test"],
"console": "integratedTerminal",
"justMyCode": false,
"env": {
"PYTHONPATH": "${workspaceFolder}/src",
"PYTEST_ADDOPTS": "--no-cov"
}
}
]
}
================================================
FILE: .vscode/settings.json
================================================
{
// General - see also /.editorconfig
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll": "explicit"
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"files.exclude": {
"**/.git": true,
"**/.DS_Store": true,
"**/Thumbs.db": true,
".mypy_cache": true,
".pytest_cache": true,
".ruff_cache": true,
"**/__pycache__": true,
".idea": true
},
// Python
"python.defaultInterpreterPath": "${workspaceFolder}/.venv",
"python.analysis.extraPaths": ["${workspaceFolder}/src"],
"[python]": {
"editor.defaultFormatter": "charliermarsh.ruff"
},
"python.analysis.typeCheckingMode": "basic",
"ruff.enable": true,
"ruff.lint.run": "onSave",
"ruff.lint.args": ["--config=pyproject.toml"],
"ruff.importStrategy": "fromEnvironment",
"ruff.fixAll": true, //lint and fix all files in workspace
"ruff.organizeImports": true, //organize imports on save
"ruff.codeAction.disableRuleComment": {
"enable": true
},
"ruff.codeAction.fixViolation": {
"enable": true
},
"mypy.configFile": "pyproject.toml",
// set to empty array to use config from project
"mypy.targets": [],
"mypy.runUsingActiveInterpreter": true,
"python.testing.unittestEnabled": false,
"python.testing.pytestEnabled": true,
// PowerShell
"[powershell]": {
"editor.defaultFormatter": "ms-vscode.powershell"
},
"powershell.codeFormatting.preset": "Stroustrup",
"python.testing.pytestArgs": ["."]
}
================================================
FILE: CHANGELOG.md
================================================
# Changelog
<!--next-version-placeholder-->
## v2.10.2 (2026-01-30)
## v2.10.1 (2026-01-29)
### Fix
* Update versioning constraint to support 3.14 ([#706](https://github.com/algorandfoundation/algokit-cli/issues/706)) ([`b6be55a`](https://github.com/algorandfoundation/algokit-cli/commit/b6be55ac219fcc6f46bc938644a272586efa4ff8))
## v2.10.0 (2025-12-12)
### Feature
* Update to use the localnet specific conduit algod importer ([#700](https://github.com/algorandfoundation/algokit-cli/issues/700)) ([`c9b423a`](https://github.com/algorandfoundation/algokit-cli/commit/c9b423afa96e6ae91d29064fea09a4b5293c4c55))
* Add check flag to control when image update checks are run ([`dc39e49`](https://github.com/algorandfoundation/algokit-cli/commit/dc39e495b489bb110261cc5199d12a684fae2870))
* Reduce frequency of localnet image update checks ([`3de015e`](https://github.com/algorandfoundation/algokit-cli/commit/3de015e60a32f810891b7f8d6d475f9595ff9bda))
### Documentation
* Updated invalid links and fixed some typos in the docs ([#693](https://github.com/algorandfoundation/algokit-cli/issues/693)) ([`35518c3`](https://github.com/algorandfoundation/algokit-cli/commit/35518c332b789ca7b3a70ed3321e8d295d5c3ab9))
* Removed obsolete info and fixed typos ([#687](https://github.com/algorandfoundation/algokit-cli/issues/687)) ([`330cc05`](https://github.com/algorandfoundation/algokit-cli/commit/330cc059bf7bf1966a093edc333d3d4d87047276))
## v2.9.1 (2025-09-11)
### Fix
* Dynamically detect Windows SDK tools for GitHub Actions compatibility ([#686](https://github.com/algorandfoundation/algokit-cli/issues/686)) ([`db88fb9`](https://github.com/algorandfoundation/algokit-cli/commit/db88fb9129061f7fcb8282c7745a9bd3178b872d))
* Enables package manager command translation ([#684](https://github.com/algorandfoundation/algokit-cli/issues/684)) ([`a08eae5`](https://github.com/algorandfoundation/algokit-cli/commit/a08eae534cd9898687ba80400ba132221fcea69d))
## v2.9.0 (2025-09-03)
### Feature
* Pnpm and uv support ([#672](https://github.com/algorandfoundation/algokit-cli/issues/672)) ([`52293f4`](https://github.com/algorandfoundation/algokit-cli/commit/52293f43e7d0c441fb2863f5871a3ae7461119cd))
### Fix
* Pin prompt_toolkit as the latest version breaks algokit init ([`d1dc658`](https://github.com/algorandfoundation/algokit-cli/commit/d1dc658f4fada935d8e8ccc31067ce695bd487fb))
## v2.8.0 (2025-07-29)
### Feature
* Replace GITHUB_TOKEN with engineering-ci bot token in release workflows ([`4070cb0`](https://github.com/algorandfoundation/algokit-cli/commit/4070cb013b9af77fc4ae66cbb6edb8de7c431ce2))
### Fix
* Update the brew cask to not require sudo on install ([`a82f74b`](https://github.com/algorandfoundation/algokit-cli/commit/a82f74ba90d3ab61ddba98356ed512579d158e38))
* Bust cache by tweaking the poetry lock ([#662](https://github.com/algorandfoundation/algokit-cli/issues/662)) ([`a137989`](https://github.com/algorandfoundation/algokit-cli/commit/a137989f1d679ed47e6219998f488bbf5571a74c))
## v2.7.1 (2025-06-19)
### Fix
* Adds health check for indexer ([#653](https://github.com/algorandfoundation/algokit-cli/issues/653)) ([`ceed902`](https://github.com/algorandfoundation/algokit-cli/commit/ceed902315770a8af68219e1eca52a37d4af7cf2))
## v2.7.0 (2025-05-15)
### Feature
* Add algokit init example command ([`70ed744`](https://github.com/algorandfoundation/algokit-cli/commit/70ed744574a8689374b3396c224c636966848e47))
* Added the choose example selector ([`da5cc9e`](https://github.com/algorandfoundation/algokit-cli/commit/da5cc9e538dae458230a0ff78ff3ab7671777ddb))
* Adding new init command structure with example subcommand ([`3fb110a`](https://github.com/algorandfoundation/algokit-cli/commit/3fb110afa867a65d67aeb605a3a5c23f651d278f))
### Fix
* Add fallback for browser opening in explore command ([`71088cf`](https://github.com/algorandfoundation/algokit-cli/commit/71088cf031c6575c7368f60ad2d2ea20311fe1cd))
* Add fallback for browser opening in explore command ([`d1be606`](https://github.com/algorandfoundation/algokit-cli/commit/d1be606cc252affb5de0516c9c973ab176b574b8))
* Compile ts hangs when puya-ts is detected but not installed in the project ([#628](https://github.com/algorandfoundation/algokit-cli/issues/628)) ([`f3cd199`](https://github.com/algorandfoundation/algokit-cli/commit/f3cd19967068e4310eaae5acbf85d8ec445e5181))
## v2.6.2 (2025-03-28)
### Fix
* Raise min required copier version to 3.6.0 ([#623](https://github.com/algorandfoundation/algokit-cli/issues/623)) ([`9ef7b51`](https://github.com/algorandfoundation/algokit-cli/commit/9ef7b51112cdf4e27a4ef89d1df6dedeecf9448e))
## v2.6.1 (2025-03-27)
### Fix
* Handle non zero exit code when running npm ls ([#622](https://github.com/algorandfoundation/algokit-cli/issues/622)) ([`3d6f3c9`](https://github.com/algorandfoundation/algokit-cli/commit/3d6f3c967302398dbbfab41ba96216e412d068a8))
* Resolve project run issue by forcing utf-8 encoding on windows ([#620](https://github.com/algorandfoundation/algokit-cli/issues/620)) ([`b837417`](https://github.com/algorandfoundation/algokit-cli/commit/b837417e7f6b01c6ea5abda3dc664cd7c4531e85))
### Documentation
* AK-194: Updated dev portal links ([#615](https://github.com/algorandfoundation/algokit-cli/issues/615)) ([`52bb519`](https://github.com/algorandfoundation/algokit-cli/commit/52bb5191fd7153a7f2ec32b6646a33d3deabdec3))
* Clarify when python is needed ([#617](https://github.com/algorandfoundation/algokit-cli/issues/617)) ([`4661f71`](https://github.com/algorandfoundation/algokit-cli/commit/4661f71a97293f3697476a90fea4054b1f516dec))
## v2.6.0 (2025-03-19)
### Feature
* Add typescript template integration ([#614](https://github.com/algorandfoundation/algokit-cli/issues/614)) ([`7fc345c`](https://github.com/algorandfoundation/algokit-cli/commit/7fc345c783258325de3231de9488191e4b2932aa))
* Puya-ts support under `compile` command group ([#612](https://github.com/algorandfoundation/algokit-cli/issues/612)) ([`9bd9056`](https://github.com/algorandfoundation/algokit-cli/commit/9bd90560da69cf511b0452d771d53a0c588214c2))
* Npm runs `ci` instead of `install` when CI flag is present or passed explicitly ([#605](https://github.com/algorandfoundation/algokit-cli/issues/605)) ([`cc8a95d`](https://github.com/algorandfoundation/algokit-cli/commit/cc8a95d529452467d3e2849f9d998ae55178a2b5))
### Fix
* Fix configured localnet ([#610](https://github.com/algorandfoundation/algokit-cli/issues/610)) ([`ba91e82`](https://github.com/algorandfoundation/algokit-cli/commit/ba91e82a226867cb764bf36fc43654924ea5ba4c))
### Documentation
* Removed mentions to dappflow from ADR document. ([#601](https://github.com/algorandfoundation/algokit-cli/issues/601)) ([`6691cc7`](https://github.com/algorandfoundation/algokit-cli/commit/6691cc70e1cbf812e95cbab6b3ce3143a3b6fd77))
* Update map image ([#602](https://github.com/algorandfoundation/algokit-cli/issues/602)) ([`eb03bf7`](https://github.com/algorandfoundation/algokit-cli/commit/eb03bf7f7541286097627fe424c64070bd59f108))
## v2.5.2 (2025-01-07)
### Fix
* Handle client generation in a dir containing multiple app spec types ([#599](https://github.com/algorandfoundation/algokit-cli/issues/599)) ([`1a479a1`](https://github.com/algorandfoundation/algokit-cli/commit/1a479a1e33ae4ba0e03a12c12210372cb8f59be1))
### Documentation
* Add info about keyring in wsl2 ([#600](https://github.com/algorandfoundation/algokit-cli/issues/600)) ([`5e5df31`](https://github.com/algorandfoundation/algokit-cli/commit/5e5df31c79b99f375726a57780c0732f2bafcf73))
## v2.5.1 (2024-11-28)
### Fix
* Duplicate code-workspace declarations ([#596](https://github.com/algorandfoundation/algokit-cli/issues/596)) ([`505c6c6`](https://github.com/algorandfoundation/algokit-cli/commit/505c6c624d869d4bef9adaa973dad7d735b7bae0))
## v2.5.0 (2024-11-25)
### Feature
* Add support for ARC56 typed client generation ([#595](https://github.com/algorandfoundation/algokit-cli/issues/595)) ([`72807c3`](https://github.com/algorandfoundation/algokit-cli/commit/72807c3b7e8114528e026a0fa34b8ba07a49fc8a))
### Documentation
* Adding extra troubleshooting case; extra prereq for winget installation ([#591](https://github.com/algorandfoundation/algokit-cli/issues/591)) ([`84d7690`](https://github.com/algorandfoundation/algokit-cli/commit/84d769014bf71ddd798cace122bad141b1429416))
## v2.4.3 (2024-10-29)
### Fix
* Edge cases for running interactive goal commands with --tty flag ([#589](https://github.com/algorandfoundation/algokit-cli/issues/589)) ([`e280a7f`](https://github.com/algorandfoundation/algokit-cli/commit/e280a7f9e6208b4a15f384809a2f0c8607ed9fb7))
## v2.4.2 (2024-10-10)
### Documentation
* More details on snap install in README.md ([#577](https://github.com/algorandfoundation/algokit-cli/issues/577)) ([`44f900f`](https://github.com/algorandfoundation/algokit-cli/commit/44f900ffdf7a9021aa2ddcf97a45a384852ce6f8))
## v2.4.1 (2024-09-19)
### Fix
* Pinning requests dependency ([#575](https://github.com/algorandfoundation/algokit-cli/issues/575)) ([`2fc2dfe`](https://github.com/algorandfoundation/algokit-cli/commit/2fc2dfe71d195aaadd3c0d20017ce3ceb2f0d414))
## v2.4.0 (2024-09-19)
### Feature
* Adding flags to enable dev mode; flags for custom path to localnet config ([#569](https://github.com/algorandfoundation/algokit-cli/issues/569)) ([`09c2c10`](https://github.com/algorandfoundation/algokit-cli/commit/09c2c107d037c40a85c545bce9fc97de79c2c157))
## v2.3.0 (2024-08-23)
### Feature
* Explicit sequential execution; extra args param for run/deploy commands ([#557](https://github.com/algorandfoundation/algokit-cli/issues/557)) ([`41f5c7b`](https://github.com/algorandfoundation/algokit-cli/commit/41f5c7b631a90a06d51676efd1f437416c8cb750))
## v2.2.3 (2024-08-02)
### Fix
* Add warning for cases when `algokit explore` is used within wsl ([#549](https://github.com/algorandfoundation/algokit-cli/issues/549)) ([`3e2d017`](https://github.com/algorandfoundation/algokit-cli/commit/3e2d0170bcc8870dda3d62141b93866fe8bcad1d))
* Build binaries with the correct version information ([#550](https://github.com/algorandfoundation/algokit-cli/issues/550)) ([`0725d8f`](https://github.com/algorandfoundation/algokit-cli/commit/0725d8f16c5999f706de486852c96a2f0d16603e))
## v2.2.2 (2024-07-29)
## v2.2.1 (2024-07-23)
### Documentation
* Extra notes on edge case with python installation on debian ([#539](https://github.com/algorandfoundation/algokit-cli/issues/539)) ([`f358e24`](https://github.com/algorandfoundation/algokit-cli/commit/f358e24122df759585034c7e3541f5a8f4c446f1))
## v2.2.0 (2024-07-08)
### Feature
* Adding default algorand network configs to use when no .env.{network} found ([#533](https://github.com/algorandfoundation/algokit-cli/issues/533)) ([`a726756`](https://github.com/algorandfoundation/algokit-cli/commit/a726756b2f96557a8e54e1f89c4926dc206265d3))
### Fix
* Given that .copier-answers.yml is now expected at .algokit folder, improve defaults lookup ([#535](https://github.com/algorandfoundation/algokit-cli/issues/535)) ([`5d319d3`](https://github.com/algorandfoundation/algokit-cli/commit/5d319d323a5a38e77d65895048e6a2a30e8b64d8))
## v2.1.4 (2024-06-27)
### Fix
* Filter null values from asset metadata ([#529](https://github.com/algorandfoundation/algokit-cli/issues/529)) ([`05411d6`](https://github.com/algorandfoundation/algokit-cli/commit/05411d638c0ef7600df3428a5da74f8666d226a7))
## v2.1.3 (2024-06-25)
### Fix
* Some localnet proxy tweaks ([#526](https://github.com/algorandfoundation/algokit-cli/issues/526)) ([`2c7999d`](https://github.com/algorandfoundation/algokit-cli/commit/2c7999daefc5071dd89a6dcdc2f0a3f7f3ef819b))
## v2.1.2 (2024-06-20)
### Fix
* Localnet status and proxy dns issue ([#525](https://github.com/algorandfoundation/algokit-cli/issues/525)) ([`a0c5bc6`](https://github.com/algorandfoundation/algokit-cli/commit/a0c5bc69e71fc64864f9f10ddd92f8c967f03416))
* Add localnet proxy to add Access-Control-Allow-Private-Network header ([#523](https://github.com/algorandfoundation/algokit-cli/issues/523)) ([`2267e9e`](https://github.com/algorandfoundation/algokit-cli/commit/2267e9e2ff2b707dc246021578b8dbc6bd43a021))
### Documentation
* Moving descriptions of workspace vs standalone to project.md ([#522](https://github.com/algorandfoundation/algokit-cli/issues/522)) ([`946c53a`](https://github.com/algorandfoundation/algokit-cli/commit/946c53a3d90fad983a21856c0cad969f37d90e6f))
* Minor revamp in project/config docs ([#521](https://github.com/algorandfoundation/algokit-cli/issues/521)) ([`872f6b1`](https://github.com/algorandfoundation/algokit-cli/commit/872f6b1dd01f843255fa2b76cb7e857c23aee4aa))
## v2.1.1 (2024-06-17)
### Fix
* Ensure utf-8 is used as part of cli animate method invocation (windows compatibility) ([#518](https://github.com/algorandfoundation/algokit-cli/issues/518)) ([`ba9e090`](https://github.com/algorandfoundation/algokit-cli/commit/ba9e0902880298beb6a883096d26b25e77d31422))
## v2.1.0 (2024-06-12)
### Feature
* GitHub Codespaces support in LocalNet command group ([#456](https://github.com/algorandfoundation/algokit-cli/issues/456)) ([`7eeaead`](https://github.com/algorandfoundation/algokit-cli/commit/7eeaeadc577dd12fa93c87cae18da497770d6f35))
### Documentation
* Updated docs to include updated links for project features ([`7c56b18`](https://github.com/algorandfoundation/algokit-cli/commit/7c56b181d984f3301e2abc59ea91128f2845ec66))
## v2.0.6 (2024-05-22)
### Fix
* Remove ConsensusProtocol = future; unpin algod ([#505](https://github.com/algorandfoundation/algokit-cli/issues/505)) ([`55fbda5`](https://github.com/algorandfoundation/algokit-cli/commit/55fbda511310c094675dca7ff45131006083df66))
## v2.0.5 (2024-05-21)
### Fix
* Pin localnet algod container to fix conduit issue in latest algod ([#502](https://github.com/algorandfoundation/algokit-cli/issues/502)) ([`6e760e9`](https://github.com/algorandfoundation/algokit-cli/commit/6e760e9c887187f053ea6a11b969ddc8cda3fb6a))
## v2.0.4 (2024-05-20)
### Fix
* Task transfer on rekeyed account and update dependencies ([#498](https://github.com/algorandfoundation/algokit-cli/issues/498)) ([`8592cbf`](https://github.com/algorandfoundation/algokit-cli/commit/8592cbff4b9c45b4394eb853761255a8d11b7510))
### Documentation
* Add troubleshooting section ([#496](https://github.com/algorandfoundation/algokit-cli/issues/496)) ([`ef1a504`](https://github.com/algorandfoundation/algokit-cli/commit/ef1a5046a7b3ba6ddf22e65a4b1fe7868196e625))
* Refine quick start ([#487](https://github.com/algorandfoundation/algokit-cli/issues/487)) ([`1964dec`](https://github.com/algorandfoundation/algokit-cli/commit/1964decd340a7847005cab4be408f6273fd5cb53))
* Remove spelling mistake in intro.md instalation docs ([#491](https://github.com/algorandfoundation/algokit-cli/issues/491)) ([`70c55e0`](https://github.com/algorandfoundation/algokit-cli/commit/70c55e050caf4309c76ae5aae1dd7a284db93382))
## v2.0.3 (2024-04-16)
### Fix
* Remove deprecated version from localnet compose file ([#476](https://github.com/algorandfoundation/algokit-cli/issues/476)) ([`4a3b1f0`](https://github.com/algorandfoundation/algokit-cli/commit/4a3b1f0c2dec5d03d12b42617ff546bd94d1da57))
### Documentation
* Minor refinements in npm min version spec ([#474](https://github.com/algorandfoundation/algokit-cli/issues/474)) ([`a887430`](https://github.com/algorandfoundation/algokit-cli/commit/a8874304319efc3449336a4bbb817471613d6743))
## v2.0.2 (2024-04-02)
### Fix
* Pin pyyaml-include transitive dep ([#472](https://github.com/algorandfoundation/algokit-cli/issues/472)) ([`970536c`](https://github.com/algorandfoundation/algokit-cli/commit/970536cb7246fcaf6b84aacda95a74f8ff9bc285))
### Documentation
* Adding node.js to prerequisites for installation as FYI ([`8147173`](https://github.com/algorandfoundation/algokit-cli/commit/8147173ba827ac3be4c4dec28a97abc16abbd2cf))
## v2.0.1 (2024-03-29)
### Documentation
* Few tweaks post release ([#465](https://github.com/algorandfoundation/algokit-cli/issues/465)) ([`a4a5645`](https://github.com/algorandfoundation/algokit-cli/commit/a4a5645c11790eba1162f7d80ade26fe40f83944))
## v2.0.0 (2024-03-27)
### Feature
* Algokit-cli v2 ([#462](https://github.com/algorandfoundation/algokit-cli/issues/462)) ([`182c449`](https://github.com/algorandfoundation/algokit-cli/commit/182c449544e4a23e17919e9629dfdc5ddbf399a5))
* LocalNet should run as an archival node so that you can access all blocks (useful for testing) ([#461](https://github.com/algorandfoundation/algokit-cli/issues/461)) ([`794cccc`](https://github.com/algorandfoundation/algokit-cli/commit/794cccce2bb4aeccfe56813af754406b87ba5112))
### Breaking
* 2.0 release ([`182c449`](https://github.com/algorandfoundation/algokit-cli/commit/182c449544e4a23e17919e9629dfdc5ddbf399a5))
## v1.13.1 (2024-03-20)
### Fix
* Create the npm dir in the app data directory on windows, as npx needs it ([#458](https://github.com/algorandfoundation/algokit-cli/issues/458)) ([`3195a1c`](https://github.com/algorandfoundation/algokit-cli/commit/3195a1c8cd21835d04a472d0d156ca08ef9030ec))
## v1.13.0 (2024-03-13)
### Feature
* Add command to compile python to TEAL with Puyapy ([`1030799`](https://github.com/algorandfoundation/algokit-cli/commit/10307990a07fd3fa8ba60f6886f5b4be722dc065))
### Fix
* Adjust how we run npx, so it supports all windows versions ([#454](https://github.com/algorandfoundation/algokit-cli/issues/454)) ([`a997953`](https://github.com/algorandfoundation/algokit-cli/commit/a997953871251b0f1dfed3ad6e2cb8901c2c5cd3))
### Documentation
* Ref commit for snapcraft ([#452](https://github.com/algorandfoundation/algokit-cli/issues/452)) ([`0ab21bc`](https://github.com/algorandfoundation/algokit-cli/commit/0ab21bcd2b7a6d188791a3480eab7fe1b885667d))
* Update playground init docs ([#451](https://github.com/algorandfoundation/algokit-cli/issues/451)) ([`1a15d5d`](https://github.com/algorandfoundation/algokit-cli/commit/1a15d5def4e610f0b10a41918f5d4055dea19efc))
* Change last name in 2023-07-19_advanced_generate_command.md ([#448](https://github.com/algorandfoundation/algokit-cli/issues/448)) ([`8df02df`](https://github.com/algorandfoundation/algokit-cli/commit/8df02df981c0b68cfea2a4dc4698759d5e393974))
## v1.12.3 (2024-03-06)
### Fix
* Path resolution to ensure git is initialized at workspace level ([#447](https://github.com/algorandfoundation/algokit-cli/issues/447)) ([`4fa1eaf`](https://github.com/algorandfoundation/algokit-cli/commit/4fa1eafe604129bb0595d0774ee4eb1484d3c13b))
### Documentation
* Updating dockerhub links on localnet docs ([#445](https://github.com/algorandfoundation/algokit-cli/issues/445)) ([`9d4df31`](https://github.com/algorandfoundation/algokit-cli/commit/9d4df31abe1de07909c7d03de1dc2dcc4334d7dc))
## v1.12.2 (2024-03-01)
### Fix
* Algod container proper SIGTERM handling ([#438](https://github.com/algorandfoundation/algokit-cli/issues/438)) ([`1a654ca`](https://github.com/algorandfoundation/algokit-cli/commit/1a654ca6b1519beda0a1d23fefb9673591cd5eea))
### Documentation
* Update named localnet documents on config file locations ([#444](https://github.com/algorandfoundation/algokit-cli/issues/444)) ([`643ab01`](https://github.com/algorandfoundation/algokit-cli/commit/643ab011bae488d24c18e8351e29de439a31c24e))
* Minor patch in the badge ([#440](https://github.com/algorandfoundation/algokit-cli/issues/440)) ([`7d82db0`](https://github.com/algorandfoundation/algokit-cli/commit/7d82db08a127ef486f31687affca184f1229039b))
## v1.12.1 (2024-02-26)
## v1.12.0 (2024-02-26)
### Feature
* Init wizard v2 ([#415](https://github.com/algorandfoundation/algokit-cli/issues/415)) ([`55d6922`](https://github.com/algorandfoundation/algokit-cli/commit/55d6922e5ae1c8b1f6e42a910f387739344f53a5))
### Fix
* Upload windows artifact to release ([#429](https://github.com/algorandfoundation/algokit-cli/issues/429)) ([`d922a49`](https://github.com/algorandfoundation/algokit-cli/commit/d922a493f8f92c61ae56df0043a356f8fd523f4d))
## v1.11.4 (2024-02-19)
### Fix
* Fix issue of goal command interacting with filename containing dot ([#424](https://github.com/algorandfoundation/algokit-cli/issues/424)) ([`22ece81`](https://github.com/algorandfoundation/algokit-cli/commit/22ece811af63c69734169029db1a477730d1e0ad))
### Documentation
* Adr init wizard v2 and related improvements ([#411](https://github.com/algorandfoundation/algokit-cli/issues/411)) ([`8c5445a`](https://github.com/algorandfoundation/algokit-cli/commit/8c5445a558e503590fee636a9e5826026a5aacaf))
## v1.11.3 (2024-02-08)
### Fix
* Binary execution mode compatibility ([#406](https://github.com/algorandfoundation/algokit-cli/issues/406)) ([`5cb9b1f`](https://github.com/algorandfoundation/algokit-cli/commit/5cb9b1f8e1f7fc3cc7114cba5cef78c9fcc7df95))
### Documentation
* ADR - native binaries distribution via snap/winget/brew ([#404](https://github.com/algorandfoundation/algokit-cli/issues/404)) ([`b7301bf`](https://github.com/algorandfoundation/algokit-cli/commit/b7301bf7ef4d776aa0b0b16e061f2a546780cabb))
* Improve onboarding experience ([`a4d6bb5`](https://github.com/algorandfoundation/algokit-cli/commit/a4d6bb502ed5bbfe87682ea863590c47393aed6a))
## v1.11.2 (2024-02-01)
### Fix
* Bump algokit-client-generator to 1.1.1 ([#403](https://github.com/algorandfoundation/algokit-cli/issues/403)) ([`28dd709`](https://github.com/algorandfoundation/algokit-cli/commit/28dd709314b5557b1351a6db6f2305e168438d28))
## v1.11.1 (2024-01-30)
### Fix
* Patching tealer 3.12 compatibility ([#401](https://github.com/algorandfoundation/algokit-cli/issues/401)) ([`05ea554`](https://github.com/algorandfoundation/algokit-cli/commit/05ea554fcad9fdf3eb5b038231eaf1155f9e5ce7))
* Patch cd pipeline merge conflict ([#399](https://github.com/algorandfoundation/algokit-cli/issues/399)) ([`806d0e2`](https://github.com/algorandfoundation/algokit-cli/commit/806d0e269f9e621c3ed8f47a8fd3d4e24a5a366c))
## v1.11.0 (2024-01-28)
### Feature
* Upgrading to latest version of algokit-client-generator-ts ([#398](https://github.com/algorandfoundation/algokit-cli/issues/398)) ([`1b6773b`](https://github.com/algorandfoundation/algokit-cli/commit/1b6773b1bbfcc5191e0da86af4e445de29ae3058))
### Documentation
* Adr on native binaries ([#395](https://github.com/algorandfoundation/algokit-cli/issues/395)) ([`42f61d1`](https://github.com/algorandfoundation/algokit-cli/commit/42f61d1a5ffdb411947a7581a36df1ed53786a25))
## v1.10.0 (2024-01-24)
### Feature
* Adding algokit analyze - perform static analysis with tealer integration ([#370](https://github.com/algorandfoundation/algokit-cli/issues/370)) ([`3e56a4b`](https://github.com/algorandfoundation/algokit-cli/commit/3e56a4b4e1f59d747cd7eb4e2cfea8b8d9c7c670))
### Fix
* Installation process for tealer (windows compatibility) ([#396](https://github.com/algorandfoundation/algokit-cli/issues/396)) ([`971aff4`](https://github.com/algorandfoundation/algokit-cli/commit/971aff46a6b5502135122bff951ee2d9c15fa80f))
## v1.9.3 (2024-01-11)
## v1.9.2 (2024-01-09)
### Fix
* Run localnet on goal command ([#380](https://github.com/algorandfoundation/algokit-cli/issues/380)) ([`5a06ddc`](https://github.com/algorandfoundation/algokit-cli/commit/5a06ddce965716ea4fb47a1d8a19b8cb65d17b77))
### Documentation
* Update the list of AlgoKit CLI high-level features in the docs ([`8e3b827`](https://github.com/algorandfoundation/algokit-cli/commit/8e3b8273d65a1fbcd7e3bf600b96c82500eef538))
## v1.9.1 (2023-12-29)
## v1.9.0 (2023-12-29)
### Feature
* Add support for a customisable named localnet ([#373](https://github.com/algorandfoundation/algokit-cli/issues/373)) ([`41c4946`](https://github.com/algorandfoundation/algokit-cli/commit/41c4946fce6894a9f6548bf4a2cbdd499dec4cb4))
## v1.8.2 (2023-12-20)
## v1.8.1 (2023-12-19)
### Fix
* Update multiformats version as it needs to be in sync with multiformats-config ([#372](https://github.com/algorandfoundation/algokit-cli/issues/372)) ([`67a5966`](https://github.com/algorandfoundation/algokit-cli/commit/67a59662c67d7f1d2e5eedeb1e8d62289e0ad5ac))
## v1.8.0 (2023-12-14)
### Feature
* Update generators to support generating typed clients with simulate functionality ([#368](https://github.com/algorandfoundation/algokit-cli/issues/368)) ([`90c876b`](https://github.com/algorandfoundation/algokit-cli/commit/90c876b819f4f9bba040e8630584cedc13678f5a))
* Use Pinata ipfs instead of web3.storage ([#367](https://github.com/algorandfoundation/algokit-cli/issues/367)) ([`fc7ee5d`](https://github.com/algorandfoundation/algokit-cli/commit/fc7ee5d36c09b91251c46ab2be670015ac106164))
### Fix
* Replacing Yaspin with Simplified Spinners for Windows Systems ([#369](https://github.com/algorandfoundation/algokit-cli/issues/369)) ([`e12311e`](https://github.com/algorandfoundation/algokit-cli/commit/e12311e3be087e78aed092dd9b2670f8183afea3))
## v1.7.3 (2023-12-08)
### Fix
* Adding confirmation prompt prior to execution of algokit generators ([#366](https://github.com/algorandfoundation/algokit-cli/issues/366)) ([`eeb5bae`](https://github.com/algorandfoundation/algokit-cli/commit/eeb5bae18c4ffb2384f92627d19a4308a46bfdf0))
## v1.7.2 (2023-12-04)
### Fix
* Removing outdated reference to `algokit sandbox` command ([#362](https://github.com/algorandfoundation/algokit-cli/issues/362)) ([`e6cd395`](https://github.com/algorandfoundation/algokit-cli/commit/e6cd395bf600485be6edbe4e68c9ba4885598000))
* Fixing Localnet status ([#365](https://github.com/algorandfoundation/algokit-cli/issues/365)) ([`8277572`](https://github.com/algorandfoundation/algokit-cli/commit/8277572db58d14bfcbda5e8bda18673d536b84a0))
* Update vulnerable package dependency versions ([#361](https://github.com/algorandfoundation/algokit-cli/issues/361)) ([`450e02d`](https://github.com/algorandfoundation/algokit-cli/commit/450e02ddba02c98d9c8fe8a6baedaf84ef7e9460))
## v1.7.1 (2023-11-22)
### Fix
* Hotfixing conduit path for localnet windows compatibility ([#360](https://github.com/algorandfoundation/algokit-cli/issues/360)) ([`897e335`](https://github.com/algorandfoundation/algokit-cli/commit/897e33554252083ed2b0d8a18a49969ef82a097b))
## v1.7.0 (2023-11-22)
### Feature
* Migrating localnet to latest indexer v3.x images ([#351](https://github.com/algorandfoundation/algokit-cli/issues/351)) ([`04ef300`](https://github.com/algorandfoundation/algokit-cli/commit/04ef3008366028118358e342c0e83e08f3c095ba))
## v1.6.3 (2023-11-14)
### Fix
* Correctly convert list of tuple to dictionary ([#353](https://github.com/algorandfoundation/algokit-cli/issues/353)) ([`ad71719`](https://github.com/algorandfoundation/algokit-cli/commit/ad717190f5822964d726555b7d7f8e1f5453cdfa))
## v1.6.2 (2023-11-10)
### Fix
* Support detect ~/test.txt as valid goal paths ([#347](https://github.com/algorandfoundation/algokit-cli/issues/347)) ([`8ac5ec5`](https://github.com/algorandfoundation/algokit-cli/commit/8ac5ec5843cf243fb051e504d821b719c37cbe38))
* Support the multiple file outputs of goal clerk split ([#346](https://github.com/algorandfoundation/algokit-cli/issues/346)) ([`fd9cd54`](https://github.com/algorandfoundation/algokit-cli/commit/fd9cd54137ca40595220fe916799eb682971387b))
## v1.6.1 (2023-11-08)
### Documentation
* Typo resolved ([#341](https://github.com/algorandfoundation/algokit-cli/issues/341)) ([`e71ff96`](https://github.com/algorandfoundation/algokit-cli/commit/e71ff964a9879a30689be049d3af3ec3002c3198))
* Fixing typo in docs ([#339](https://github.com/algorandfoundation/algokit-cli/issues/339)) ([`e8eba42`](https://github.com/algorandfoundation/algokit-cli/commit/e8eba421b32767ae9d57d8bbe75f86c268f5cbf7))
## v1.6.0 (2023-10-26)
### Feature
* Algokit tasks - 1.6.0 release ([#334](https://github.com/algorandfoundation/algokit-cli/issues/334)) ([`e35f4f8`](https://github.com/algorandfoundation/algokit-cli/commit/e35f4f836f5433449a6685d1aeca01b8fd416fe2))
### Fix
* Pinning aiohttp beta to hotfix 3.12 support ([#338](https://github.com/algorandfoundation/algokit-cli/issues/338)) ([`96fc7e6`](https://github.com/algorandfoundation/algokit-cli/commit/96fc7e668c3a5b4fb9f00216ee6278b8ded1cf87))
## v1.5.3 (2023-10-23)
## v1.5.2 (2023-10-20)
### Fix
* Docker compose ps parsing for version >= 2.21 ([#336](https://github.com/algorandfoundation/algokit-cli/issues/336)) ([`06ba5e9`](https://github.com/algorandfoundation/algokit-cli/commit/06ba5e908a879a45ab793ffbc6c9436eeeb5b370))
### Documentation
* Updating docs for the issue on python 3.12 ([#332](https://github.com/algorandfoundation/algokit-cli/issues/332)) ([`288b561`](https://github.com/algorandfoundation/algokit-cli/commit/288b5617f284b5135f272cdb4c1c160c2aa6fc33))
## v1.5.1 (2023-10-17)
## v1.5.0 (2023-10-04)
### Feature
* Algokit `dispenser` ([#309](https://github.com/algorandfoundation/algokit-cli/issues/309)) ([`6b7a514`](https://github.com/algorandfoundation/algokit-cli/commit/6b7a51421d42d90192c866ff7ce7307a4b180b9c))
### Documentation
* Explicit reference on how to obtain the dispenser address ([#321](https://github.com/algorandfoundation/algokit-cli/issues/321)) ([`d7db09c`](https://github.com/algorandfoundation/algokit-cli/commit/d7db09c50e41ec8840f908f6a3db223622562269))
## v1.4.2 (2023-09-29)
### Documentation
* Adding tealscript template ([#318](https://github.com/algorandfoundation/algokit-cli/issues/318)) ([`a855530`](https://github.com/algorandfoundation/algokit-cli/commit/a855530923a308e3826d4203b851cfbc49420bed))
* Fixed links to tutorials ([`8207043`](https://github.com/algorandfoundation/algokit-cli/commit/820704305d7bb66d3f5e7c6627e53594a74f9e45))
## v1.4.1 (2023-08-21)
### Fix
* Localnet displays a warning when image is out of date ([#308](https://github.com/algorandfoundation/algokit-cli/issues/308)) ([`be5a5df`](https://github.com/algorandfoundation/algokit-cli/commit/be5a5df0883b378a0dd889b9996ff68850df5698))
* Adding fixes to allow working with local filesystem files when interacting with algokit goal commands ([#304](https://github.com/algorandfoundation/algokit-cli/issues/304)) ([`caca2b5`](https://github.com/algorandfoundation/algokit-cli/commit/caca2b59b07817648ae7d8f208fe02f895cee92e))
## v1.4.0 (2023-08-14)
### Feature
* Advanced algokit generate command ([#306](https://github.com/algorandfoundation/algokit-cli/issues/306)) ([`0381862`](https://github.com/algorandfoundation/algokit-cli/commit/038186239c6787b0e80d49ea6a0e5e4135ce4240))
## v1.3.0 (2023-08-01)
### Feature
* Add new "deploy" command to execute user/template defined logic to deploy smart contracts to an Algorand network ([#295](https://github.com/algorandfoundation/algokit-cli/issues/295)) ([`6673f80`](https://github.com/algorandfoundation/algokit-cli/commit/6673f8062989172674471056baf1e8a7f34753b7))
### Fix
* Pip-audit dependencies ([#307](https://github.com/algorandfoundation/algokit-cli/issues/307)) ([`142dba3`](https://github.com/algorandfoundation/algokit-cli/commit/142dba3651731003936c32ff9a6144c58289c829))
* Handle deploy commands on windows that are actually `.cmd` files or similar ([#303](https://github.com/algorandfoundation/algokit-cli/issues/303)) ([`17791c7`](https://github.com/algorandfoundation/algokit-cli/commit/17791c7ca7f5aabe510b1dcaa1d09b9ed403233b))
### Documentation
* Advanced algokit generate command ADR ([#305](https://github.com/algorandfoundation/algokit-cli/issues/305)) ([`cb0ac17`](https://github.com/algorandfoundation/algokit-cli/commit/cb0ac17e9afda66e74ae2c63d0729c3b34f2a4b7))
* Adding algokit template documentation ([#300](https://github.com/algorandfoundation/algokit-cli/issues/300)) ([`6e19743`](https://github.com/algorandfoundation/algokit-cli/commit/6e19743bacf3856f91e2610cff58676a17e99deb))
## v1.2.0 (2023-07-04)
### Feature
* Detecting whether opening folder contains *.code-workspace file ([#294](https://github.com/algorandfoundation/algokit-cli/issues/294)) ([`e902d55`](https://github.com/algorandfoundation/algokit-cli/commit/e902d55a6077d60eb3c5b3fa809e1ba80b61b37e))
* Adding react and fullstack templates ([#291](https://github.com/algorandfoundation/algokit-cli/issues/291)) ([`5af81f1`](https://github.com/algorandfoundation/algokit-cli/commit/5af81f100b16ce1281980ff3067df648fb5c9b4f))
### Fix
* Hotfixing a bug that is caused by pydantic v2 being installed as a copier dependency ([#297](https://github.com/algorandfoundation/algokit-cli/issues/297)) ([`31b580b`](https://github.com/algorandfoundation/algokit-cli/commit/31b580b2364e123fd81fdab14da93b704ea4bdda))
* Update algokit-client-generators ([#293](https://github.com/algorandfoundation/algokit-cli/issues/293)) ([`cf0f46f`](https://github.com/algorandfoundation/algokit-cli/commit/cf0f46ffba9c3a33e75bad56195589bed3c5dc3a))
### Documentation
* Switching to more reliable visitors badge provider ([`51dce8b`](https://github.com/algorandfoundation/algokit-cli/commit/51dce8be83f0b72765ddffc9ea67886235d83fbb))
* Fixing underline caused by whitespace in html tags on readme ([`f824596`](https://github.com/algorandfoundation/algokit-cli/commit/f824596d845fce31fe6d32fd9dc14fa0086746ca))
## v1.1.6 (2023-06-21)
### Fix
* Increase timeout when doing algod health check ([#290](https://github.com/algorandfoundation/algokit-cli/issues/290)) ([`2b39970`](https://github.com/algorandfoundation/algokit-cli/commit/2b39970c53d358050639fbcb02ab6e99c1808d98))
### Documentation
* Adding readme assets ([`e300fa9`](https://github.com/algorandfoundation/algokit-cli/commit/e300fa929850b1f3677cb3545b8f284e8f3a7ef9))
## v1.1.5 (2023-06-15)
### Fix
* Update typescript algokit-client-generator to 2.2.1 ([#286](https://github.com/algorandfoundation/algokit-cli/issues/286)) ([`bbb86b4`](https://github.com/algorandfoundation/algokit-cli/commit/bbb86b4049ed6d81f3bd73a0e207deae8f200459))
## v1.1.4 (2023-06-14)
### Fix
* Update typescript algokit-client-generator ([#284](https://github.com/algorandfoundation/algokit-cli/issues/284)) ([`37d5082`](https://github.com/algorandfoundation/algokit-cli/commit/37d5082f86fd3db43ebb7c96558a484267883067))
## v1.1.3 (2023-06-13)
### Fix
* Update python algokit-client-generator ([#283](https://github.com/algorandfoundation/algokit-cli/issues/283)) ([`5330baa`](https://github.com/algorandfoundation/algokit-cli/commit/5330baaf8617a1b5b640d5efecdcbe05fd2ea2a3))
## v1.1.2 (2023-06-13)
### Fix
* Use /v2/status for algod health check ([#282](https://github.com/algorandfoundation/algokit-cli/issues/282)) ([`91e5e36`](https://github.com/algorandfoundation/algokit-cli/commit/91e5e36886edfa5d90f6aaf77f9db6a666bbdc43))
## v1.1.1 (2023-06-13)
### Fix
* Add check for localnet start to wait for algod to be ready ([#281](https://github.com/algorandfoundation/algokit-cli/issues/281)) ([`dff0a5d`](https://github.com/algorandfoundation/algokit-cli/commit/dff0a5d45fb79317509f6a44fa3fc37b93a2d8af))
### Documentation
* Updating adr header to reflect status and deciders ([`b84a07d`](https://github.com/algorandfoundation/algokit-cli/commit/b84a07dee0c1b5fc9060b806feeb07c41b4cd4fd))
## v1.1.0 (2023-06-07)
### Feature
* Adding minimum required version for algokit. ([#273](https://github.com/algorandfoundation/algokit-cli/issues/273)) ([`10aacc2`](https://github.com/algorandfoundation/algokit-cli/commit/10aacc2c17acc55c47d69674e9ace780313aee46))
* Use official Algorand Docker images for LocalNet ([#268](https://github.com/algorandfoundation/algokit-cli/issues/268)) ([`fc5106c`](https://github.com/algorandfoundation/algokit-cli/commit/fc5106cc773a4672eb1ec8614bb60ed2dc61be42))
* Add generate client command ([#266](https://github.com/algorandfoundation/algokit-cli/issues/266)) ([`b885fb1`](https://github.com/algorandfoundation/algokit-cli/commit/b885fb16b3b9a49231a6b786d1156bd7b202fb12))
### Fix
* Don't reset localnet if only algod_config.json is missing ([#269](https://github.com/algorandfoundation/algokit-cli/issues/269)) ([`ff3ef56`](https://github.com/algorandfoundation/algokit-cli/commit/ff3ef560565bdb92951fa7d6e3bbf4437db873a0))
* Bootstrap failure during init now shows the error to avoid confusion ([`8a36e82`](https://github.com/algorandfoundation/algokit-cli/commit/8a36e82497cc342082d71df5c327837ddad221a4))
* Workaround ValueError raised when using --defaults flag with copier 7.1 ([#256](https://github.com/algorandfoundation/algokit-cli/issues/256)) ([`e224070`](https://github.com/algorandfoundation/algokit-cli/commit/e22407074bf8c8ce2b1576379c90df76a70f6df9))
### Documentation
* Document typed client dependency ([#275](https://github.com/algorandfoundation/algokit-cli/issues/275)) ([`87d7233`](https://github.com/algorandfoundation/algokit-cli/commit/87d7233bd35a1b896d15e0aea3f63e738738254f))
* Add example usage for typed clients ([`16d91f5`](https://github.com/algorandfoundation/algokit-cli/commit/16d91f5d3e5ef0115826780bc1daa918fbf031a8))
* Add generate docs ([#270](https://github.com/algorandfoundation/algokit-cli/issues/270)) ([`da8e46d`](https://github.com/algorandfoundation/algokit-cli/commit/da8e46dfda97e514be17955ad39986f42b93b5e2))
* Update localnet docs to include links to AlgoKit Utils ([`6e937a8`](https://github.com/algorandfoundation/algokit-cli/commit/6e937a8ff487955063ac1023c51ac3c83f5cbb01))
* README update ([`8702e45`](https://github.com/algorandfoundation/algokit-cli/commit/8702e45c25eb2ec422587e307151037fbf6c1914))
* Changes to wording of output stability snippet ([`f378013`](https://github.com/algorandfoundation/algokit-cli/commit/f378013db7b52c5d69f71ba606fbe3f8f50fa843))
* Added output stability article content ([`c3a89f1`](https://github.com/algorandfoundation/algokit-cli/commit/c3a89f14b461ec2a22b23f3e423d107bff72fbb9))
* Include note about pipx ensurepath ([`847013d`](https://github.com/algorandfoundation/algokit-cli/commit/847013d1733f3b11ed6d3c64b223e84dd7bc1124))
* Link to repo search, fixes #240 ([`2550f6f`](https://github.com/algorandfoundation/algokit-cli/commit/2550f6ff147fd3de9f5da6dee470e9f214500c20))
## v1.0.1 (2023-03-29)
### Documentation
* Reference overview image with absolute url ([`c987f84`](https://github.com/algorandfoundation/algokit-cli/commit/c987f84d3079cf88c262e21a542e60c74a71829a))
* Added overview image ([`4c387ee`](https://github.com/algorandfoundation/algokit-cli/commit/4c387ee7fbbae2c01498dec83fa76ffd4d4990fa))
* Make README.md links absolute ([`8435bc7`](https://github.com/algorandfoundation/algokit-cli/commit/8435bc7faaddd33e4bb204f8c965365aee097b42))
## v1.0.0 (2023-03-29)
### Feature
* **localnet:** Changing the default reset behaviour to not pull images ([`6d3f10e`](https://github.com/algorandfoundation/algokit-cli/commit/6d3f10e5690f15d04d03bc38290f2c670905ba24))
### Breaking
* 1.0 release ([`68b02ad`](https://github.com/algorandfoundation/algokit-cli/commit/68b02ad49de0c8da083fcce542a76f6342ac0020))
### Documentation
* Remove mention of virtualenv when describing bootstrap command ([`302498f`](https://github.com/algorandfoundation/algokit-cli/commit/302498f21cb59eea4e01b482d3f07eecada34909))
* Explain what running bootstrap during init will do ([`4bd58bd`](https://github.com/algorandfoundation/algokit-cli/commit/4bd58bd981eef9a382c2a16f9d0bd06ebe397ba3))
* Added file copy advice ([`2b4882c`](https://github.com/algorandfoundation/algokit-cli/commit/2b4882c1878c07da7933d9a266f80560395fbb5f))
* Added note about algokit explore after a localnet start ([`7a068b1`](https://github.com/algorandfoundation/algokit-cli/commit/7a068b1d90592e5eebd3f7af5a5f6d216c45ec1f))
* Provide feedback when calling algokit explore ([`def4ef5`](https://github.com/algorandfoundation/algokit-cli/commit/def4ef5ce5bb2eb3e7b7c0dbcdbf0d4c4f8f6b1d))
* Update --bootstrap help text on algokit init ([`ce9ebea`](https://github.com/algorandfoundation/algokit-cli/commit/ce9ebeaf9bb636f6af4cd2b98d6a32a4b4e10f15))
* Updating auto-generated docs ([`637d534`](https://github.com/algorandfoundation/algokit-cli/commit/637d534b14c92fa3b4be27f58a0e3a950ad5d75e))
* Command help text improvements for bootstrap and init ([`67eb3f6`](https://github.com/algorandfoundation/algokit-cli/commit/67eb3f6b79ac47abe4f4d1497db66acda5d0d4fd))
* Update config and completions help text ([`7e0c087`](https://github.com/algorandfoundation/algokit-cli/commit/7e0c0872c1ca9ae531c69ae37dce43f44bc74634))
* Update doctor help text ([`111bf2e`](https://github.com/algorandfoundation/algokit-cli/commit/111bf2e874fff0960ed7faf5c073dd44d8b487cd))
* Removing incorrect references to sandbox ([`7179eb8`](https://github.com/algorandfoundation/algokit-cli/commit/7179eb8c67160671d549bd8f7114f54fb03b3fad))
* Improving doctor command feature description ([`a8a2862`](https://github.com/algorandfoundation/algokit-cli/commit/a8a2862efc03448022df9fd2f9fa42e3ad883cde))
* Updating bootstrap command descriptions ([`07a5fdb`](https://github.com/algorandfoundation/algokit-cli/commit/07a5fdbaa2653ab6505fd67432fac3c36ee5d711))
* Fixing heading order in intro tutorial ([`46b5023`](https://github.com/algorandfoundation/algokit-cli/commit/46b50235b965f1e9736d3e8c67d1a95c9a13923c))
* Getting README.md ready for 1.0 ([`815712f`](https://github.com/algorandfoundation/algokit-cli/commit/815712f83a2b56172c3cc51c7615bb33cae32b2f))
## v0.6.0 (2023-03-28)
### Feature
* Prompt for template first ([`91326f3`](https://github.com/algorandfoundation/algokit-cli/commit/91326f339650f9ea33ff4746f6707f507364b81a))
### Documentation
* Autogen docs ([`9803ff7`](https://github.com/algorandfoundation/algokit-cli/commit/9803ff7764090b4d5b1d661f8e7ead3b74a49d0f))
* Added the intro tutorial ([`087852b`](https://github.com/algorandfoundation/algokit-cli/commit/087852b9be034daddca3a609bb7fd9ff0b476b6e))
## v0.5.0 (2023-03-24)
### Feature
* Change playground template to point to new repo ([`805d63c`](https://github.com/algorandfoundation/algokit-cli/commit/805d63c10be3c62a3ef8d78bd2d40d1e6d1c8c5c))
* **init:** Added --no-ide flag to allow user to prevent IDE opening ([#211](https://github.com/algorandfoundation/algokit-cli/issues/211)) ([`cd9f015`](https://github.com/algorandfoundation/algokit-cli/commit/cd9f01549fc460641bd7a64f606963efb7f4082a))
## v0.4.1 (2023-03-22)
### Fix
* **init:** Resolving issue with opening VS Code automatically on windows ([`691543d`](https://github.com/algorandfoundation/algokit-cli/commit/691543dfb7748dcb0495ceb0593dfe14e500d8fc))
## v0.4.0 (2023-03-22)
### Feature
* Increase max content width to 120 for easier reading in wider terminals ([`cadc615`](https://github.com/algorandfoundation/algokit-cli/commit/cadc6150fb0a6c7d5f1ae60ccd7bccee89fb38fb))
* Include "extra version info" in all commands not just docker compose ([`f1c1d69`](https://github.com/algorandfoundation/algokit-cli/commit/f1c1d6992faefa26c8656121e30b894dfce32c03))
* Detect if code is on path && .vscode exists and try to launch ([`78f8b3f`](https://github.com/algorandfoundation/algokit-cli/commit/78f8b3f7f655d7286b4c090002e09edc52f3009a))
* Add a command to see logs from localnet docker containers ([`31c9cc4`](https://github.com/algorandfoundation/algokit-cli/commit/31c9cc4d44f2df2abcb8014dad6633232781f6e0))
### Fix
* Make failure to run npm install during bootstrap error message more explicit ([`468a186`](https://github.com/algorandfoundation/algokit-cli/commit/468a18683ebe80f671438df6a2f4bcf1d0c7c4a5))
* When executing goal/bash inside algod container only show localnet hint if it looks like the container doesn't exist or isn't running ([`b9dc57f`](https://github.com/algorandfoundation/algokit-cli/commit/b9dc57fe24a0f28df0b4399f0f579c39ab5336d8))
* Allow going back to template selection from custom url ([`929eefb`](https://github.com/algorandfoundation/algokit-cli/commit/929eefbd9bb8b4e38b24423980d18c0bbc09e9a3))
### Documentation
* **localnet:** Removing known LocalNet issue that is fixed ([`6747642`](https://github.com/algorandfoundation/algokit-cli/commit/6747642cc2a6b79e5cfa7b71418dfbaadbbf6659))
## v0.3.3 (2023-03-09)
### Fix
* Use /v2/status when querying localnet algod container ([#198](https://github.com/algorandfoundation/algokit-cli/issues/198)) ([`0fb0488`](https://github.com/algorandfoundation/algokit-cli/commit/0fb0488e7a5ebd7da22f764e9047df9c6ef7ac31))
### Documentation
* Fix references to renamed sandbox command ([#194](https://github.com/algorandfoundation/algokit-cli/issues/194)) ([`8b2910b`](https://github.com/algorandfoundation/algokit-cli/commit/8b2910b465e67c0e428cc4dde65e7a502f2fc7c0))
* Added step in install instructions to restart terminal ([`f8e47a5`](https://github.com/algorandfoundation/algokit-cli/commit/f8e47a5ea47e6f78a39dee436381b615c794d5d5))
* Update windows install instructions ([`e9d0a9d`](https://github.com/algorandfoundation/algokit-cli/commit/e9d0a9dc2ffc7f0998978e1fa5eceb6c94a9ce52))
## v0.3.2 (2023-03-03)
### Fix
* Resolve config paths in case of folder redirection e.g. UWP python ([#191](https://github.com/algorandfoundation/algokit-cli/issues/191)) ([`0c2b291`](https://github.com/algorandfoundation/algokit-cli/commit/0c2b29179d003b17909a8dc22f655dc2b11bcdb8))
## v0.3.1 (2023-02-24)
### Fix
* Git versions prior to 2.28 no longer fail on algokit init ([#184](https://github.com/algorandfoundation/algokit-cli/issues/184)) ([`0559582`](https://github.com/algorandfoundation/algokit-cli/commit/0559582ba9fb27df9ab98b2a66606ddaeeaf6da0))
* Fix version comparison when checking for new versions ([#183](https://github.com/algorandfoundation/algokit-cli/issues/183)) ([`c272658`](https://github.com/algorandfoundation/algokit-cli/commit/c2726589b2699832844d2c67c452c01ecf742824))
## v0.3.0 (2023-02-23)
### Feature
* Add init --template-url-ref option to allow using a specific commit, tag or branch ([`5bf19a3`](https://github.com/algorandfoundation/algokit-cli/commit/5bf19a38eee8b621010956a64e2d2f9e318af9e8))
* Rename sandbox command to localnet ([`7ee55bd`](https://github.com/algorandfoundation/algokit-cli/commit/7ee55bdd5d0a87cd3aa7af1281c0867798be79ed))
### Fix
* **doctor:** Ensuring full docker version information is visible in Doctor output to improve debugging, fixes comment in #164 ([#173](https://github.com/algorandfoundation/algokit-cli/issues/173)) ([`a2c51e8`](https://github.com/algorandfoundation/algokit-cli/commit/a2c51e8018ba7b8049dc1230f7f9c1e02c24cd15))
* Handle git not being installed when running algokit ([`ccc5eb0`](https://github.com/algorandfoundation/algokit-cli/commit/ccc5eb0369892bb640914a5cf370072d28502d7f))
* **doctor:** Docker compose version parsing, fixes #164 ([`c3f4ef8`](https://github.com/algorandfoundation/algokit-cli/commit/c3f4ef80f7ca0e3da0d4841c06d81d8abe0c078d))
* Updating gitpython to resolve pip-audit vulnerability warning ([#169](https://github.com/algorandfoundation/algokit-cli/issues/169)) ([`2a10d67`](https://github.com/algorandfoundation/algokit-cli/commit/2a10d676e20f4f7d3b7d28ea24d6f5ded099d3ae))
### Documentation
* Gave context to Sandbox and PyTEAL ([`0a96e13`](https://github.com/algorandfoundation/algokit-cli/commit/0a96e13c16284dfdc8d9525310119a1351ff862a))
* Updated use cases -> capabilities ([`ef0527a`](https://github.com/algorandfoundation/algokit-cli/commit/ef0527a87f11651efb3061711749049d36ed6d04))
* Added missing recommendation for type-safe client ([`26a6717`](https://github.com/algorandfoundation/algokit-cli/commit/26a6717e763811e0f9c23818d842ab0ea2fb2a99))
* Completed draft for architecture decision for smart contract deployment ([`40faf83`](https://github.com/algorandfoundation/algokit-cli/commit/40faf83cc97f75005f54bc344999848055f70b84))
* First draft of architecture decision for smart contract deployment ([`9e77817`](https://github.com/algorandfoundation/algokit-cli/commit/9e778170e9b4924d10b73a2fbea08accf38e3b33))
* Rename sandbox to localnet ([`aa35da7`](https://github.com/algorandfoundation/algokit-cli/commit/aa35da72f67f3dcd35adb0866a8b1ddad17fc4fe))
* Update example output for Verify installation section ([`14f6f90`](https://github.com/algorandfoundation/algokit-cli/commit/14f6f9058c3ffd69d8c3ce9b4b1160bdeb017a0b))
* Fixing incorrect description for Sandbox command ([`4bea5fa`](https://github.com/algorandfoundation/algokit-cli/commit/4bea5fa06be10a1282c1627b7979380aebc6e297))
* Fix init description in algokit.md ([#156](https://github.com/algorandfoundation/algokit-cli/issues/156)) ([`39eee95`](https://github.com/algorandfoundation/algokit-cli/commit/39eee9508f28799856692b0729bebf8b923af687))
## v0.2.0 (2023-01-16)
### Feature
* Update windows install instructions and bump version so PyPi will accept new release ([#154](https://github.com/algorandfoundation/algokit-cli/issues/154)) ([`5ff5223`](https://github.com/algorandfoundation/algokit-cli/commit/5ff52237172bddf06d3ff845b18e77c31dce9b11))
## v0.1.3 (2023-01-16)
### Documentation
* Update pipx install instructions ([`e91a06a`](https://github.com/algorandfoundation/algokit-cli/commit/e91a06a38f5b278e9ac26dfef5d7c4833633e750))
## v0.1.2 (2023-01-11)
### Documentation
* Approved ([`19eb063`](https://github.com/algorandfoundation/algokit-cli/commit/19eb063a2d8327884a5856939db4e0ea157ac26f))
* Remove --cask from Option 3 ([`cfa3b73`](https://github.com/algorandfoundation/algokit-cli/commit/cfa3b73099f6da94420bdfc9541bbce4d521993d))
## v0.1.1 (2023-01-10)
### Fix
* Adding installation documentation update re: pipx ([`75d3590`](https://github.com/algorandfoundation/algokit-cli/commit/75d359022f9fc3a3cf3ac8d21b16a449e42b1857))
* Temporarily turning off PyPi publishing while we decide on the final package name ([`6c1a2e2`](https://github.com/algorandfoundation/algokit-cli/commit/6c1a2e25d2de00a9052b7db700d8681d75b09e6a))
## v0.1.0 (2023-01-09)
### Feature
* Windows Chocolatey package ([#80](https://github.com/algorandfoundation/algokit-cli/issues/80)) ([`3f4bb04`](https://github.com/algorandfoundation/algokit-cli/commit/3f4bb04ee3ce09e7ca9ab843453f50f6a3eab98c))
* **bootstrap:** Prompt for env tokens ([#114](https://github.com/algorandfoundation/algokit-cli/issues/114)) ([`a6fe18f`](https://github.com/algorandfoundation/algokit-cli/commit/a6fe18fded0bddec91959998916fc96ac6af5008))
* **explore:** Add explore command for launching Dappflow Explorer ([#112](https://github.com/algorandfoundation/algokit-cli/issues/112)) ([`4db26b0`](https://github.com/algorandfoundation/algokit-cli/commit/4db26b08c6919fb980afa6afbb233d8793feeec1))
* **version-check:** Added check to periodically check for new releases on GitHub and inform when found ([#111](https://github.com/algorandfoundation/algokit-cli/issues/111)) ([`1772439`](https://github.com/algorandfoundation/algokit-cli/commit/1772439b02190dce159e75da110c76b200774c00))
* **doctor:** Use sys.version for fuller output (vs version_info tuple) ([#101](https://github.com/algorandfoundation/algokit-cli/issues/101)) ([`55fe4fc`](https://github.com/algorandfoundation/algokit-cli/commit/55fe4fc6984b7fecfe3e417a87cc3a1c0c0ee070))
* **completions:** Add completions support for bash and zsh ([`e7c50e5`](https://github.com/algorandfoundation/algokit-cli/commit/e7c50e58c6b371475fb6d7d2f45e85790289eadb))
* **doctor:** Tweak commands for windows ([`8f79629`](https://github.com/algorandfoundation/algokit-cli/commit/8f79629a358eb71cb28b4e739bbe445c2ec74646))
* **doctor:** Fix timezone in tests ([`d9fe303`](https://github.com/algorandfoundation/algokit-cli/commit/d9fe303934f3c093d7548228fce74c83286fa1f2))
* **doctor:** Adding tests ([`58d5708`](https://github.com/algorandfoundation/algokit-cli/commit/58d57080e53b24f60e6a4315e09e920032fdf0b0))
* **doctor:** Refactor ([`b0fe39a`](https://github.com/algorandfoundation/algokit-cli/commit/b0fe39aafe34b74bf8aebba1e9ec5f4e8048923e))
* **doctor:** Colouring output ([`6bfb300`](https://github.com/algorandfoundation/algokit-cli/commit/6bfb30093e005cb59e92aefe4714ff492ec2582b))
* **doctor:** Address pr comments and add more logic ([`e7a3090`](https://github.com/algorandfoundation/algokit-cli/commit/e7a309024d2fc5704950e1138eb44b0f242f8bdb))
* **.env file:** Add tests for default and custom values ([`58511dc`](https://github.com/algorandfoundation/algokit-cli/commit/58511dc598ac1ec4b388c45d680d9075a5650b98))
* **init:** Add `.env` file to template and passing custom values (if required) ([`e77eca8`](https://github.com/algorandfoundation/algokit-cli/commit/e77eca8bde7e5c6faa80375d6b11f44c0579be6e))
* **init:** Implemented ability to specify a commit hash so you can anchor templates from semi-trusted sources to a known good version ([#77](https://github.com/algorandfoundation/algokit-cli/issues/77)) ([`772d420`](https://github.com/algorandfoundation/algokit-cli/commit/772d420ea73a7878ef5ac9d446c79b9bfd1fbbf2))
* **sandbox:** Added `algokit sandbox console` ([`95565df`](https://github.com/algorandfoundation/algokit-cli/commit/95565dff45a6751f960ebfba64fb9ed001a67260))
* **goal:** Added algokit goal --console ([`8dd947b`](https://github.com/algorandfoundation/algokit-cli/commit/8dd947bdb4f7029bf043cb0cfebe494c17bf2729))
* **algokit:** Implementing automated, semantic versioning ([`e4859d4`](https://github.com/algorandfoundation/algokit-cli/commit/e4859d496c61ea4e4c16e9a1c910dff4e896037a))
### Fix
* **docs:** Tweaks to the reference documentation ([`6d872a1`](https://github.com/algorandfoundation/algokit-cli/commit/6d872a17bf00820c78c5e8c52caf20cd9efe9c94))
* Expression on Publish Release Packages action ([`1c08f95`](https://github.com/algorandfoundation/algokit-cli/commit/1c08f95d568b8a9264b319cf40b87b0af05a8c72))
* Attempting to isolate main branch versioning ([`5ab7089`](https://github.com/algorandfoundation/algokit-cli/commit/5ab7089a21c431eba2965f1af895eb5d4b6c6ae6))
* Improve documentation and argument values for version-prompt config ([`aee3a1a`](https://github.com/algorandfoundation/algokit-cli/commit/aee3a1a74a921659ec60e28a1b48c11d4a14d2da))
* **completions:** Explicitly use utf8 for Windows compat ([`5033f8e`](https://github.com/algorandfoundation/algokit-cli/commit/5033f8e26cd27374228a983eebb3e5c88c841958))
* **bootstrap:** Improving robustness and test coverage for bootstrap poetry command ([#89](https://github.com/algorandfoundation/algokit-cli/issues/89)) ([`a4a6823`](https://github.com/algorandfoundation/algokit-cli/commit/a4a6823b4c5015e5d0f2d361a7373820e641835d))
* **init:** Don't prompt for project name in the template - take it from the directry name in the root init command ([`fc84791`](https://github.com/algorandfoundation/algokit-cli/commit/fc847911e58bd969428c0dc6e3117501181f545d))
* Windows weird error on GitHub Actions ([`0b81808`](https://github.com/algorandfoundation/algokit-cli/commit/0b8180829be53e26b998e4c723c0d8a384d95b91))
* **git:** Update gitattributes to ensure EOL=LF ([`b13a972`](https://github.com/algorandfoundation/algokit-cli/commit/b13a97202ddeefe81c8eda5d3b058cc4a136291e))
* **build:** Run black with --check ([`e4e3875`](https://github.com/algorandfoundation/algokit-cli/commit/e4e3875b864557f86edabe2851a3f2f8f2071fa3))
* **logging:** Ensure log files get opened in UTF-8 encoding ([`bc666fe`](https://github.com/algorandfoundation/algokit-cli/commit/bc666fe7e3aed8d250d997946188f8f70b01b4d5))
* Removing deleted folder from beaker template from assert ([`8b4b46a`](https://github.com/algorandfoundation/algokit-cli/commit/8b4b46a75b6a4794d9ceb41f80f80415ef44d503))
* Temporary fix for excessive build minutes consumption and commenting out PyPi publishing code since it errors out ([`399ca0e`](https://github.com/algorandfoundation/algokit-cli/commit/399ca0eca85751c245a07abe2cbe9a73cce4172b))
### Breaking
* --ok-exit-code no longer exists on algokit bootstrap poetry, no need for copier templates to call algokit now so no need for this feature ([`a4a6823`](https://github.com/algorandfoundation/algokit-cli/commit/a4a6823b4c5015e5d0f2d361a7373820e641835d))
================================================
FILE: CONTRIBUTING.md
================================================
# AlgoKit CLI for contributors
## Commits
We are using the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) standard for commit messages. This allows us to automatically generate release notes and version numbers. We do this via [Python Semantic Release](https://python-semantic-release.readthedocs.io/en/latest/) and [GitHub actions](.github/workflows/cd.yaml).
## Guiding Principles
AlgoKit development is done within the [AlgoKit Guiding Principles](./docs/algokit.md#guiding-principles).
## Setup (AlgoKit CLI development)
### Initial setup
1. Clone this repository: `git clone https://github.com/algorandfoundation/algokit-cli`
2. Install pre-requisites:
- Manually:
- Install `Python` - [Link](https://www.python.org/downloads/): The minimum required version is `3.10`, but `3.11` is recommended.)
- Install `Poetry` - [Link](https://python-poetry.org/docs/#installation): The minimum required version is `1.2`.
- If you're not using PyCharm, then run `poetry install` in the repository root directory (this should set up `.venv` and install all Python dependencies - PyCharm will do this for you on startup)
- Via AlgoKit CLI:
- [Install AlgoKit CLI](./README.md#install) and run `algokit project bootstrap poetry` in the root directory
- Install `tealer` - by running `pipx install tealer==0.1.2`. This is a prerequisite to running `pytest`, tealer is a third party tool for static analysis of TEAL code, algokit uses it in `task analyse` command. AlgoKit uses `pytest-xdist` to speed up the test suite execution by running tests in parallel, this requires `tealer` to be installed globally to avoid race conditions.
3. Install pre-commit hooks (optional but recommended):
[pre-commit](https://pre-commit.com/) is configured in this repository. To enable it, make sure that `poetry install` has been run and the virtual-env is activated by running `poetry shell`. Then execute `pre-commit install` to install the git hook scripts.
Once it is done, git will ensure formatting, linting, and static typing (via `mypy`) is correct when you perform a commit.
4. Open the project and start debugging / developing via:
- VS Code
1. Open the repository root in VS Code.
2. Install recommended extensions.
3. Hit F5 (or whatever you have debug mapped to) and it should start running with breakpoint debugging.
> **Note**
> The first time you run, VS Code may prompt you to select the Python Interpreter, or if you are having issues running you may need to select it via the `Python: Select Interpreter` pallette command. You should select the Python Interpreter with the ./.venv path)
- IDEA (e.g. PyCharm)
1. Open the repository root in the IDE
2. Hit Shift+F9 (or whatever you have debug mapped to) and it should start running with breakpoint debugging
- Other
1. Open the repository root in your text editor of choice
2. In a terminal run `poetry shell`
3. Run `./debug.py` through your debugger of choice
- In each of the above cases, an `args.in` file will be created in the source root.
Each line will be executed in order, with the arguments passed to the cli.
For example, you could have:
```
version
--help
version --help
```
Not a terribly useful sequence of commands, but hopefully this helps illustrate the usage.
### Subsequently
1. If you update to the latest source code and there are new dependencies you will need to run `poetry install` again
2. Follow step 3 above
### Documentation
Markdown documentation can be found within the docs directory of the repo, there is a mixture of handwritten documentation and autogenerated documentation for the CLI tool itself.
To autogenerate the CLI documentation from the click source:
1. Install the docs dependencies: `poetry install --with docs`
2. Run the docs generation: `poetry run poe docs`
Note: this command won't work on Windows.
The CLI docs are generated using Sphinx, and its configuration can be found in `docs\sphinx`. The generated Markdown output is post processed to add a Table of Contents and top level title and the final Markdown is output to `docs\cli`. The commands to achieve this are defined in `pyproject.toml` under `[tool.poe.tasks]`
### Libraries and Tools
AlgoKit uses Python as a main language and many Python libraries and tools. This section lists all of them with a tiny brief.
- [Poetry](https://python-poetry.org/): Python packaging and dependency management.
- [pipx](https://github.com/pypa/pipx): Install and Run Python Applications in Isolated Environments
- [Click](https://palletsprojects.com/p/click/): A Python package for creating beautiful command line interfaces.
- [Black](https://github.com/psf/black): A Python code formatter.
- [Tox](https://tox.wiki/en/latest/): Automate and standardize testing in Python.
## Architecture decisions
As part of developing AlgoKit we are documenting key architecture decisions using [Architecture Decision Records (ADRs)](https://adr.github.io/). The following are the key decisions that have been made thus far:
- [2022-11-14: AlgoKit sandbox approach](docs/architecture-decisions/2022-11-14_sandbox-approach.md)
- [2022-11-22: Beaker testing strategy](docs/architecture-decisions/2022-11-22_beaker-testing-strategy.md)
- [2023-01-11: HomeBrew install strategy](docs/architecture-decisions/2023-01-11_brew_install.md)
- [2023-01-11: Beaker productionisation review](docs/architecture-decisions/2023-01-11_beaker_productionisation_review.md)
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2022-2023 Algorand Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
<div align="center">
<a href="https://github.com/algorandfoundation/algokit-cli"><img src="https://raw.githubusercontent.com/algorandfoundation/algokit-cli/main/docs/imgs/banner.png" width=60%></a>
</div>
<p align="center">
<a target="_blank" href="https://github.com/algorandfoundation/algokit-cli/blob/main/docs/algokit.md"><img src="https://img.shields.io/badge/docs-repository-00dc94?logo=github&style=flat.svg" /></a>
<a target="_blank" href="https://dev.algorand.co/algokit/algokit-intro"><img src="https://img.shields.io/badge/learn-AlgoKit-00dc94?logo=algorand&mac=flat.svg" /></a>
<a target="_blank" href="https://github.com/algorandfoundation/algokit-cli"><img src="https://img.shields.io/github/stars/algorandfoundation/algokit-cli?color=00dc94&logo=star&style=flat" /></a>
<a target="_blank" href="https://dev.algorand.co/algokit/algokit-intro"><img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Fgithub.com%2Falgorandfoundation%2Falgokit-cli&countColor=%2300dc94&style=flat" /></a>
</p>
---
The Algorand AlgoKit CLI is the one-stop shop tool for developers building on the [Algorand network](https://www.algorand.com/).
AlgoKit gets developers of all levels up and running with a familiar, fun and productive development environment in minutes. The goal of AlgoKit is to help developers build and launch secure, automated production-ready applications rapidly.
[Install AlgoKit](#install) | [Quick Start Tutorial](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/tutorials/intro.md) | [Documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/algokit.md)
## What is AlgoKit?
AlgoKit compromises of a number of components that make it the one-stop shop tool for developers building on the [Algorand network](https://www.algorand.com/).

AlgoKit can help you [**learn**](#learn), [**develop**](#develop) and [**operate**](#operate) Algorand solutions. It consists of [a number of repositories](https://github.com/search?q=org%3Aalgorandfoundation+algokit-&type=repositories), including this one.
### Learn
There are many learning resources on the [Algorand Developer Portal](https://dev.algorand.co/) and the [AlgoKit landing page](https://dev.algorand.co/algokit/algokit-intro) has a range of links to more learning materials. In particular, check out the [quick start tutorial](https://dev.algorand.co/getting-started/algokit-quick-start/).
If you need help you can access both the [Algorand Discord](https://discord.gg/84AActu3at) (pro-tip: check out the algokit channel!) and the [Algorand Forum](https://forum.algorand.org/).
We have also developed an [AlgoKit video series](https://www.youtube.com/@algodevs/playlists).
### Develop
AlgoKit helps you develop Algorand solutions:
- **Interaction**: AlgoKit exposes a number of interaction methods, namely:
- [**AlgoKit CLI**](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/algokit.md): A Command Line Interface (CLI) so you can quickly access AlgoKit capabilities
- [VS Code](https://code.visualstudio.com/): All AlgoKit project templates include VS Code configurations so you have a smooth out-of-the-box development experience using VS Code
- [lora](https://lora.algokit.io/): AlgoKit has integrations with lora; a web-based user interface that let's you visualise and interact with an Algorand network
- **Getting Started**: AlgoKit helps you get started quickly when building new solutions:
- [**AlgoKit Templates**](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/init.md): Template libraries to get you started faster and quickly set up a productive dev experience
- **Development**: AlgoKit provides SDKs, tools and libraries that help you quickly and effectively build high quality Algorand solutions:
- **AlgoKit Utils** ([Python](https://github.com/algorandfoundation/algokit-utils-py#readme) | [TypeScript](https://github.com/algorandfoundation/algokit-utils-ts#readme)): A set of utility libraries so you can develop, test, build and deploy Algorand solutions quickly and easily
- [Algorand SDKs](https://dev.algorand.co/reference/sdks/sdk-list/) - The core Algorand SDK providing Algorand protocol API calls, which AlgoKit Utils wraps, but still exposes for advanced scenarios
- [**Algorand Python**](https://github.com/algorandfoundation/puya): A semantically and syntactically compatible, typed Python language that works with standard Python tooling and allows you to express smart contracts (apps) and smart signatures (logic signatures) for deployment on the Algorand Virtual Machine (AVM).
- [**Algorand TypeScript (Beta)**](https://github.com/algorandfoundation/puya-ts): A semantically and syntactically compatible, typed TypeScript language that works with standard TypeScript tooling and allows you to express smart contracts (apps) and smart signatures (logic signatures) for deployment on the Algorand Virtual Machine (AVM). This language is currently in beta.
- [**TEALScript**](https://github.com/algorandfoundation/TEALScript): A subset of TypeScript that can be used to express smart contracts (apps) and smart signatures (logic signatures) for deployment on the Algorand Virtual Machine (AVM).
- [**AlgoKit LocalNet**](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/localnet.md): A local isolated Algorand network so you can simulate real transactions and workloads on your computer
### Operate
AlgoKit can help you deploy and operate Algorand solutions.
AlgoKit comes with out-of-the-box [Continuous Integration / Continuous Deployment (CI/CD) templates](https://github.com/algorandfoundation/algokit-python-template) that help you rapidly set up best-practice software delivery processes that ensure you build quality in and have a solution that can evolve
## What can AlgoKit help me do?
The set of capabilities supported by AlgoKit will evolve over time, but currently includes:
- Quickly run, explore and interact with an isolated local Algorand network (LocalNet)
- Building, testing, deploying and calling [Algorand Python](https://github.com/algorandfoundation/puya) / [Algorand TypeScript (Beta)](https://github.com/algorandfoundation/puya-ts) / [TEALScript](https://github.com/algorandfoundation/TEALScript) smart contracts
For a user guide and guidance on how to use AlgoKit, please refer to the [docs](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/algokit.md).
Future capabilities are likely to include:
- Quickly deploy [standardised](https://github.com/algorandfoundation/ARCs/#arcs-algorand-requests-for-comments), audited smart contracts
- Building and deploying Algorand dApps
## Is this for me?
The target audience for this tool is software developers building applications on the Algorand network. A working knowledge of using a command line interfaces and experience using the supported programming languages is assumed.
## How can I contribute?
This is an open source project managed by the Algorand Foundation. See the [contributing page](https://github.com/algorandfoundation/algokit-cli/blob/main/CONTRIBUTING.md) to learn about making improvements to the CLI tool itself, including developer setup instructions.
# Install
> **Note** Refer to [Troubleshooting](#troubleshooting) for more details on mitigation of known edge cases when installing AlgoKit.
## Prerequisites
The installation pre-requisites change depending on the method you use to install. Please refer to [Installation Methods](#installation-methods).
Depending on the features you choose to leverage from the AlgoKit CLI, additional dependencies may be required.
The AlgoKit CLI will tell you if you are missing one for a given command. These optional dependencies are:
- **Git**: Essential for creating and updating projects from templates. Installation guide available at [Git Installation](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git).
- **Docker**: Necessary for running the AlgoKit LocalNet environment. Docker Compose version 2.5.0 or higher is required. See [Docker Installation](https://docs.docker.com/get-docker/).
- **Python**: For those installing the AlgoKit CLI via `pipx` or building contracts using Algorand Python. **Minimum required version is Python 3.12+ when working with Algorand Python**. See [Python Installation](https://www.python.org/downloads/).
- **Node.js**: For those working on frontend templates or building contracts using Algorand TypeScript or TEALScript. **Minimum required versions are Node.js `v22` and npm `v10`**. See [Node.js Installation](https://nodejs.org/en/download/).
> **Note**
> If you have previously installed AlgoKit using `pipx` and would like to switch to a different installation method, please ensure that
> you first uninstall the existing version by running `pipx uninstall algokit`. Once uninstalled, you can follow the installation instructions for your preferred platform.
## Cross-platform installation
AlgoKit can be installed using OS specific package managers, or using the python tool [pipx](https://pypa.github.io/pipx/).
See below for specific installation instructions.
### Installation Methods
- [Windows](#install-algokit-on-windows)
- [Mac](#install-algokit-on-mac)
- [Linux](#install-algokit-on-linux)
- [Universal via pipx](#install-algokit-with-pipx-on-any-os)
## Install AlgoKit on Windows
> **Note**
> AlgoKit is supported on Windows 10 1709 (build 16299) and later.
> We only publish an x64 binary, however it also runs on ARM devices by default using the built in x64 emulation feature.
1. Ensure prerequisites are installed
- [WinGet](https://learn.microsoft.com/en-us/windows/package-manager/winget/) (should be installed by default on recent Windows 10 or later)
- [Git](https://github.com/git-guides/install-git#install-git-on-windows) (or `winget install git.git`)
- [Docker](https://docs.docker.com/desktop/install/windows-install/) (or `winget install docker.dockerdesktop`)
> **Note**
> See [our LocalNet documentation](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/features/localnet.md#prerequisites) for more tips on installing Docker on Windows
- [Microsoft C++ Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/)
2. Install using winget
```shell
winget install algokit
```
3. [Verify installation](#verify-installation)
### Maintenance
Some useful commands for updating or removing AlgoKit in the future.
- To update AlgoKit: `winget upgrade algokit`
- To remove AlgoKit: `winget uninstall algokit`
## Install AlgoKit on Mac
> **Note**
> AlgoKit is supported on macOS Big Sur (11) and later for both x64 and ARM (Apple Silicon)
1. Ensure prerequisites are installed
- [Homebrew](https://docs.brew.sh/Installation)
- [Git](https://github.com/git-guides/install-git#install-git-on-mac) (should already be available if `brew` is installed)
- [Docker](https://docs.docker.com/desktop/install/mac-install/), (or `brew install --cask docker`)
> **Note**
> Docker requires MacOS 11+
2. Install using Homebrew
```shell
brew install algorandfoundation/tap/algokit
```
3. Restart the terminal to ensure AlgoKit is available on the path
4. [Verify installation](#verify-installation)
### Maintenance
Some useful commands for updating or removing AlgoKit in the future.
- To update AlgoKit: `brew upgrade algokit`
- To remove AlgoKit: `brew uninstall algokit`
## Install AlgoKit on Linux
> **Note**
> AlgoKit is compatible with Ubuntu 16.04 and later, Debian, RedHat, and any distribution that supports [Snap](https://snapcraft.io/docs/installing-snapd), but it is only supported on x64 architecture; ARM is not supported.
1. Ensure prerequisites are installed
- [Snap](https://snapcraft.io/docs/installing-snapd) (should be installed by default on Ubuntu 16.04.4 LTS (Xenial Xerus) or later)
- [Git](https://github.com/git-guides/install-git#install-git-on-linux)
- [Docker](https://docs.docker.com/desktop/install/linux-install/)
2. Install using snap
```shell
sudo snap install algokit --classic
```
> For detailed guidelines per each supported linux distro, refer to [Snap Store](https://snapcraft.io/algokit).
3. [Verify installation](#verify-installation)
### Maintenance
Some useful commands for updating or removing AlgoKit in the future.
- To update AlgoKit: `snap refresh algokit`
- To remove AlgoKit: `snap remove --purge algokit`
## Install AlgoKit with pipx on any OS
1. Ensure desired prerequisites are installed
- [Python 3.10 - 3.14](https://www.python.org/downloads/)
- [pipx](https://pypa.github.io/pipx/installation/)
- [Git](https://github.com/git-guides/install-git)
- [Docker](https://docs.docker.com/get-docker/)
2. Install using pipx
```shell
pipx install algokit
```
3. Restart the terminal to ensure AlgoKit is available on the path
4. [Verify installation](#verify-installation)
### Maintenance
Some useful commands for updating or removing AlgoKit in the future.
- To update AlgoKit: `pipx upgrade algokit`
- To remove AlgoKit: `pipx uninstall algokit`
## Verify installation
Verify AlgoKit is installed correctly by running `algokit --version` and you should see output similar to:
```
algokit, version 1.0.1
```
> **Note**
> If you get receive one of the following errors:
>
> - `command not found: algokit` (bash/zsh)
> - `The term 'algokit' is not recognized as the name of a cmdlet, function, script file, or operable program.` (PowerShell)
>
> Then ensure that `algokit` is available on the PATH by running `pipx ensurepath` and restarting the terminal.
It is also recommended that you run `algokit doctor` to verify there are no issues in your local environment and to diagnose any problems if you do have difficulties running AlgoKit. The output of this command will look similar to:
```
timestamp: 2023-03-27T01:23:45+00:00
AlgoKit: 1.0.1
AlgoKit Python: 3.11.1 (main, Dec 23 2022, 09:28:24) [Clang 14.0.0 (clang-1400.0.29.202)] (location: /Users/algokit/.local/pipx/venvs/algokit)
OS: macOS-13.1-arm64-arm-64bit
docker: 20.10.21
docker compose: 2.13.0
git: 2.37.1
python: 3.10.9 (location: /opt/homebrew/bin/python)
python3: 3.10.9 (location: /opt/homebrew/bin/python3)
pipx: 1.1.0
poetry: 1.3.2
node: 18.12.1
npm: 8.19.2
brew: 3.6.18
If you are experiencing a problem with AlgoKit, feel free to submit an issue via:
https://github.com/algorandfoundation/algokit-cli/issues/new
Please include this output, if you want to populate this message in your clipboard, run `algokit doctor -c`
```
Per the above output, the doctor command output is a helpful tool if you need to ask for support or [raise an issue](https://github.com/algorandfoundation/algokit-cli/issues/new).
## Troubleshooting
This section addresses specific edge cases and issues that some users might encounter when interacting with the CLI. The following table provides solutions to known edge cases:
| Issue Description | OS(s) with observed behaviour | Steps to mitigate | References |
| --------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- |
| This scenario may arise if installed `python` was build without `--with-ssl` flag enabled, causing pip to fail when trying to install dependencies. | Debian 12 | Run `sudo apt-get install -y libssl-dev` to install the required openssl dependency. Afterwards, ensure to reinstall python with `--with-ssl` flag enabled. This includes options like [building python from source code](https://medium.com/@enahwe/how-to-06bc8a042345) or using tools like [pyenv](https://github.com/pyenv/pyenv). | <https://github.com/actions/setup-python/issues/93> |
| `poetry install` invoked directly or via `algokit project bootstrap all` fails on `Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE)`. | `MacOS` >=14 using `python` 3.13 installed via `homebrew` | Install dependencies deprecated in `3.13` and latest MacOS versions via `brew install pkg-config`, delete the virtual environment folder and retry the `poetry install` command invocation. | N/A |
================================================
FILE: debug.py
================================================
"""
This script is for invoking algokit from your IDE with a dynamic set of args,
defined in args.in (which is in .gitignore)
"""
import os
import subprocess
import sys
from pathlib import Path
try:
import click
except ImportError:
print( # noqa: T201
"ERROR: Couldn't import click, make sure you've run 'poetry install' and activated the virtual environment.\n"
"For tips on getting started with developing AlgoKit CLI itself see CONTRIBUTING.md.\n",
file=sys.stderr,
)
raise
if sys.prefix == sys.base_prefix:
click.echo(
click.style(
"WARNING: virtualenv not activated, this is unexpected and you probably want to activate it first",
fg="red",
),
err=True,
)
vcs_root = Path(__file__).parent
args_file = vcs_root / "args.in"
if not args_file.exists():
click.echo(
click.style(
"arg.in does not exist, creating an empty file.\n"
"Edit this file to change what runs - each line should contain the command line arguments to algokit.\n"
"\n",
fg="yellow",
),
err=True,
)
args_file.touch(exist_ok=False)
args_file.write_text("--version")
commands_sequence = args_file.read_text().splitlines()
# change to src directory so algokit is in path
os.chdir(vcs_root / "src")
for command in commands_sequence or [""]:
click.echo(click.style(f"> algokit -v {command}", bold=True), err=True)
run_result = subprocess.run([sys.executable, "-m", "algokit", "-v", *command.split()], check=False)
if run_result.returncode != 0:
click.echo(
click.style(
f"command failed, return code was: {run_result.returncode}",
bold=True,
fg="red",
),
err=True,
)
sys.exit(run_result.returncode)
================================================
FILE: docs/algokit.md
================================================
# AlgoKit
The Algorand AlgoKit CLI is the one-stop shop tool for developers building on the Algorand network. The goal of AlgoKit is to help developers build and launch secure, automated production-ready applications rapidly.
## AlgoKit CLI commands
For details on how to use individual features see the following
- [Bootstrap](./features/project/bootstrap.md) - Bootstrap AlgoKit project dependencies
- [Compile](./features/compile.md) - Compile Algorand Python code
- [Completions](./features/completions.md) - Install shell completions for AlgoKit
- [Deploy](./features/project/deploy.md) - Deploy your smart contracts effortlessly to various networks
- [Dispenser](./features/dispenser.md) - Fund your TestNet account with ALGOs from the AlgoKit TestNet Dispenser
- [Doctor](./features/doctor.md) - Check AlgoKit installation and dependencies
- [Explore](./features/explore.md) - Explore Algorand Blockchains using lora
- [Generate](./features/generate.md) - Generate code for an Algorand project
- [Goal](./features/goal.md) - Run the Algorand goal CLI against the AlgoKit Sandbox
- [Init](./features/init.md) - Quickly initialize new projects using official Algorand Templates or community provided templates
- [LocalNet](./features/localnet.md) - Manage a locally sandboxed private Algorand network
- [Project](./features/project.md) - Manage an AlgoKit project workspace on your file system
- [Tasks](./features/tasks.md) - Perform a variety of useful operations on the Algorand blockchain
## Common AlgoKit CLI options
AlgoKit has a number of global options that can impact all commands. Note: these global options must be appended to `algokit` and appear before a command, e.g. `algokit -v localnet start`, but not `algokit localnet start -v`. The exception to this is `-h`, which can be appended to any command or sub-command to see contextual help information.
- `-h, --help` The help option can be used on any command to get details on any command, its sub-commands and options.
- `-v, --verbose` Enables DEBUG logging, useful when troubleshooting or if you want to peek under the covers and learn what AlgoKit CLI is doing.
- `--color / --no-color` Enables or disables output of console styling, we also support the [NO_COLOR](https://no-color.org) environment variable.
- `--skip-version-check` Skips updated AlgoKit version checking and prompting for that execution, this can also be disabled [permanently on a given machine](./cli/index.md#version-prompt) with `algokit config version-prompt disable`.
See also the [AlgoKit CLI Reference](./cli/index.md), which details every command, sub-command and option.
## AlgoKit Tutorials
The following tutorials guide you through various scenarios:
- [AlgoKit quick start](https://dev.algorand.co/algokit/algokit-intro)
- [Creating AlgoKit templates](https://dev.algorand.co/algokit/custom-algokit-templates)
## Guiding Principles
AlgoKit is guided by the following solution principles which flow through to the applications created by developers.
1. **Cohesive developer tool suite**: Using AlgoKit should feel professional and cohesive, like it was designed to work together, for the developer; not against them. Developers are guided towards delivering end-to-end, high quality outcomes on MainNet so they and Algorand are more likely to be successful.
2. **Seamless onramp**: New developers have a seamless experience to get started and they are guided into a pit of success with best practices, supported by great training collateral; you should be able to go from nothing to debugging code in 5 minutes.
3. **Leverage existing ecosystem**: AlgoKit functionality gets into the hands of Algorand developers quickly by building on top of the existing ecosystem wherever possible and aligned to these principles.
4. **Sustainable**: AlgoKit should be built in a flexible fashion with long-term maintenance in mind. Updates to latest patches in dependencies, Algorand protocol development updates, and community contributions and feedback will all feed in to the evolution of the software.
5. **Secure by default**: Include defaults, patterns and tooling that help developers write secure code and reduce the likelihood of security incidents in the Algorand ecosystem. This solution should help Algorand be the most secure Blockchain ecosystem.
6. **Extensible**: Be extensible for community contribution rather than stifling innovation, bottle-necking all changes through the Algorand Foundation and preventing the opportunity for other ecosystems being represented (e.g. Go, Rust, etc.). This helps make developers feel welcome and is part of the developer experience, plus it makes it easier to add features sustainably.
7. **Meet developers where they are**: Make Blockchain development mainstream by giving all developers an idiomatic development experience in the operating system, IDE and language they are comfortable with so they can dive in quickly and have less they need to learn before being productive.
8. **Modular components**: Solution components should be modular and loosely coupled to facilitate efficient parallel development by small, effective teams, reduced architectural complexity and allowing developers to pick and choose the specific tools and capabilities they want to use based on their needs and what they are comfortable with.
================================================
FILE: docs/architecture-decisions/2022-11-14_sandbox-approach.md
================================================
# AlgoKit sandbox approach
- **Status**: Approved
- **Owner:** Rob Moore
- **Deciders**: Anne Kenyon (Algorand Inc.), Alessandro Cappellato (Algorand Foundation), Will Winder (Algorand Inc.)
- **Date created**: 2022-11-14
- **Date decided:** 2022-11-14
- **Date updated**: 2022-11-16
## Context
In order for AlgoKit to facilitate a productive development experience it needs to provide a managed Algorand sandbox experience. This allows developers to run an offline (local-only) private instance of Algorand that they can privately experiment with, run automated tests against and reset at will.
## Requirements
- The sandbox works cross-platform (i.e. runs natively on Windows, Mac and Linux)
- You can spin up algod and indexer since both have useful use cases when developing
- The sandbox is kept up to date with the latest version of algod / indexer
- There is access to KMD so that you can programmatically fund accounts to improve the developer experience and reduce manual effort
- There is access to the tealdbg port outside of algod so you can attach a debugger to it
- The sandbox is isolated and (once running) works offline so the workload is private, allows development when there is no internet (e.g. when on a plane) and allows for multiple instances to be run in parallel (e.g. when developing multiple independent projects simultaneously)
- Works in continuous integration and local development environments so you can facilitate automated testing
## Principles
- **[AlgoKit Guiding Principles](../../docs/algokit.md#Guiding-Principles)** - specifically Seamless onramp, Leverage existing ecosystem, Meet devs where they are
- **Lightweight** - the solution should have as low an impact as possible on resources on the developers machine
- **Fast** - the solution should start quickly, which makes for a nicer experience locally and also allows it to be used for continuous integration automation testing
## Options
### Option 1 - Pre-built DockerHub images
Pre-built application developer-optimised DockerHub images that work cross-platform; aka an evolved AlgoKit version of <https://github.com/MakerXStudio/algorand-sandbox-dev>.
**Pros**
- It's quick to download the images and quick to start the container since you don't need to compile Algod / indexer and the images are optimised for small size
- The only dependency needed is Docker, which is a fairly common dependency for most developers to use these days
- The images are reasonably lightweight
- The images provide an optimised application developer experience with: (devmode) algo, KMD, tealdbg, indexer
- It natively works cross-platform
**Cons**
- Some people have reported problems running WSL 2 on a small proportion of Windows environments (to get the latest Docker experience)
- Docker within Docker can be a problem in some CI environments that run agents on Docker in the first place
- Work needs to be done to create an automated CI/CD that automatically releases new versions to keep it up to date with latest algod/indexer versions
### Option 2 - Lightweight algod client implementation
Work with the Algorand Inc. team to get a lightweight algod client that can run outside of a Docker container cross-platform.
**Pros**
- Likely to be the most lightweight and fastest option - opening up better/easier isolated/parallelised automated testing options
- Wouldn't need Docker as a dependency
**Cons**
- Indexer wouldn't be supported (Postgres would require Docker anyway)
- Algorand Inc. does not distribute Windows binaries.
### Option 3 - Sandbox
Use the existing [Algorand Sandbox](https://github.com/algorand/sandbox).
**Pros**
- Implicitly kept up to date with Algorand - no extra thing to maintain
- Battle-tested by the core Algorand team day-in-day-out
- Supports all environments including unreleased feature branches (because it can target a git repo / commit hash)
**Cons**
- Sandbox is designed for network testing, not application development - it's much more complex than the needs of application developers
- Slow to start because it has to download and built algod and indexer (this is particularly problematic for ephemeral CI/CD build agents)
- It's not cross-platform (it requires bash to run sandbox.sh, although a sandbox.ps1 version could be created)
## Preferred option
Option 1 and Option 2.
Option 1 provides a fully-featured experience that will work great in most scenarios, having option 2 as a second option would open up more advanced parallel automated testing scenarios in addition to that.
## Selected option
Option 1
We're aiming to release the first version of AlgoKit within a short timeframe, which won't give time for Option 2 to be developed. Sandbox itself has been ruled out since it's not cross-platform and is too slow for both development and continuous integration.
Option 1 also results in a similar result to running Sandbox, so existing Algorand documentation, libraries and approaches should work well with this option making it a good slot-in replacement for Sandbox for application developers.
AlgoKit is designed to be modular: we can add in other approaches over time such as Option 2 when/if it becomes available.
================================================
FILE: docs/architecture-decisions/2022-11-22_beaker-testing-strategy.md
================================================
# Beaker testing strategy
- **Status**: Draft
- **Owner:** Rob Moore
- **Deciders**: Anne Kenyon (Algorand Inc.), Alessandro Cappellato (Algorand Foundation), Michael Diamant (Algorand Inc.), Benjamin Guidarelli (Algorand Foundation)
- **Date created**: 2022-11-22
- **Date decided:** TBD
- **Date updated**: 2022-11-28
## Context
AlgoKit will be providing a smart contract development experience built on top of [PyTEAL](https://pyteal.readthedocs.io/en/stable/) and [Beaker](https://developer.algorand.org/articles/hello-beaker/). Beaker is currently in a pre-production state and needs to be productionised to provide confidence for use in generating production-ready smart contracts by AlgoKit users. One of the key things to resolve to productionisation of Beaker is to improve the automated test coverage.
Beaker itself is currently split into the PyTEAL generation related code and the deployment and invocation related code (including interacting with Sandbox). This decision is solely focussed on the PyTEAL generation components of Beaker. The current automated test coverage of this part of the codebase is ~50% and is largely based on compiling and/or executing smart contracts against Algorand Sandbox. While it's generally not best practice to try and case a specific code coverage percentage, a coverage of ~80%+ is likely indicative of good coverage in a dynamic language such as Python.
The Sandbox tests provide a great deal of confidence, but are also slow to execute, which can potentially impair Beaker development and maintenance experience, especially as the coverage % is grown and/or features are added over time.
Beaker, like PyTEAL, can be considered to be a transpiler on top of TEAL. When generating smart contracts, the individual TEAL opcodes are significant, since security audits will often consider the impact at that level, and it can have impacts on (limited!) resource usage of the smart contract. As such, "output stability" is potentially an important characteristic to test for.
## Requirements
- We have a high degree of confidence that writing smart contracts in Beaker leads to expected results for production smart contracts
- We have reasonable regression coverage so features are unlikely to break as new features and refactorings are added over time
- We have a level of confidence in the "output stability" of the TEAL code generated from a Beaker smart contract
## Principles
- **Fast development feedback loops** - The feedback loop during normal development should be as fast as possible to improve the development experience of developing Beaker itself
- **Low overhead** - The overhead of writing and maintaining tests is as low as possible; tests should be quick to read and write
- **Implementation decoupled** - Tests aren't testing the implementation details of Beaker, but rather the user-facing experience and output of it; this reduces the likelihood of needing to rewrite tests when performing refactoring of the codebase
## Options
### Option 1: TEAL Approval tests
Writing [approval tests](https://approvaltests.com/) of the TEAL output generated from a given Beaker smart contract.
**Pros**
- Ensures TEAL output stability and focussing on asserting the output of Beaker rather than testing whether Algorand Protocol is working
- Runs in-memory/in-process so will execute in low 10s of milliseconds making it easy to provide high coverage with low developer feedback loop overhead
- Tests are easy to write - the assertion is a single line of code (no tedious assertions)
- The tests go from Beaker contract -> TEAL approval so don't bake implementation detail and thus allow full Beaker refactoring with regression confidence without needing to modify the tests
- Excellent regression coverage characteristics - fast test run and quick to write allows for high coverage and anchoring assertions to TEAL output is a very clear regression marker
**Cons**
- The tests rely on the approver to understand the TEAL opcodes that are emitted and verify they match the intent of the Beaker contract - anecdotally this can be difficult at times even for experienced (Py)TEAL developers
- Doesn't assert the correctness of the TEAL output, just that it matches the previously manually approved output
### Option 2: Sandbox compile tests
Writing Beaker smart contracts and checking that the TEAL output successfully compiles against algod.
**Pros**
- Ensures that the TEAL output compiles, giving some surety about the intactness of it and focussing on asserting the output of Beaker rather than testing whether Algorand Protocol is working
- Faster than executing the contract
- Tests are easy to write - the assertion is a single line of code (no tedious assertions)
**Cons**
- Order of magnitude slower than asserting TEAL output (out of process communication)
- Doesn't assert the correctness of the TEAL output, just that it compiles
### Option 3: Sandbox execution tests
Execute the smart contracts and assert the output is as expected. This can be done using dry run and/or actual transactions.
**Pros**
- Asserts that the TEAL output _executes_ correctly giving the highest confidence
- Doesn't require the test writer to understand the TEAL output
- Tests don't bake implementation detail and do assert on output so give a reasonable degree of refactoring confidence without modifying tests
**Cons**
- Tests are more complex to write
- Tests take an order of magnitude longer to run than just compilation (two orders of magnitude to run than checking TEAL output)
- Harder to get high regression coverage since it's slower to write and run the tests making it impractical to get full coverage
- Doesn't ensure output stability
- Is testing that the Algorand Protocol itself works (TEAL `x` when executed does `y`) so the testing scope is broader than just Beaker itself
## Preferred option
Option 1 (combined with Option 2 to ensure the approved TEAL actually compiles, potentially only run on CI by default to ensure fast local dev loop) for the bulk of testing to provide a rapid feedback loop for developers as well as ensuring output stability and great regression coverage.
## Selected option
Combination of option 1, 2 and 3:
- While Option 1 + 2 provides high confidence with fast feedback loop, it relies on the approver being able to determine the TEAL output does what they think it does, which isn't always the case
- Option 3 will be used judiciously to provide that extra level of confidence that the fundamentals of the Beaker output are correct for each main feature; this will involve key scenarios being tested with execution based tests, the goal isn't to get combinatorial coverage, which would be slow and time-consuming, but to give a higher degree of confidence
- The decision of when to use Option 3 as well as Option 1+2 will be made on a per-feature basis and reviewed via pull request, over time a set of principles may be able to be revised that outline a clear delineation
- Use of PyTest markers to separate execution so by default the dev feedback loop is still fast, but the full suite is always run against pull requests and merges to main
================================================
FILE: docs/architecture-decisions/2023-01-11_beaker_productionisation_review.md
================================================
# Beaker productionisation review
- **Status**: Approved
- **Owners:** Rob Moore, Adam Chidlow
- **Deciders**: Anne Kenyon (Algorand Inc.), Alessandro Cappellato (Algorand Foundation), Jason Weathersby (Algorand Foundation), Benjamin Guidarelli (Algorand Foundation), Bob Broderick (Algorand Inc.)
- **Date created**: 2023-01-11
- **Date decided:** 2023-02-04
- **Date updated**: 2023-02-04
## Context
Beaker is a smart contract development framework for [Algorand](https://www.algorand.com/) that provides a wrapper over [PyTeal](https://pyteal.readthedocs.io/en/stable/) that focusses on providing a great developer experience through terse, expressive language constructs and making common tasks easier. Beaker is useful because it creates a higher level programming construct from PyTEAL that is easier to get started when learning and results in code that is terser and easier to read and write.
Beaker is an important part of the [AlgoKit strategy](https://github.com/algorandfoundation/algokit-cli/#algokit-cli). It helps create a more seamless onramp to Algorand development by providing an easier starting point for developers. As part of the lead up to releasing AlgoKit, it was desired to perform a v1.0 release of Beaker and explicitly mark it as being production ready. In order to provide confidence a productionisation review was conducted by [MakerX](https://www.makerx.com.au/); this document summarises the recommendations from that review.
An architecture decision was made in the lead up to this review on a [testing strategy for Beaker](https://github.com/algorandfoundation/algokit-cli/blob/main/docs/architecture-decisions/2022-11-22_beaker-testing-strategy.md).
## Goal
The goals of this productionisation review are to:
- Get Beaker ready for production use
- Gain confidence in Beaker's software architecture and maintainability
- Reduce the likelihood of need for breaking changes soon after release by getting key recommended breaking changes identified now
## Findings summary
The Beaker codebase is well factored and had a decent initial test coverage (albeit some of that test coverage is via a series of examples that while they provide high code coverage, don't actually validate all of the functionality).
A series of changes have been landed to improve some of the fundamentals of Beaker in preparation for production launch:
- [Various improvements](https://github.com/algorand-devrel/beaker/pull/142) - Improved test coverage, improved dev experience (setup + ongoing) via Poetry, improvements to the code quality setup (linting, automatic formatting, typing), allowed Windows development on Beaker itself, significantly improved CI/CD pipeline speed, removing the examples directory and tests from being distributed wit hthe PyPi package
- [Typing improvements](https://github.com/algorand-devrel/beaker/pull/147)
- [Removed inline imports](https://github.com/algorand-devrel/beaker/pull/148)
- [Removed dead code](https://github.com/algorand-devrel/beaker/pull/149/files)
- [Added automated release management and versioning](https://github.com/algorand-devrel/beaker/pull/161)
In addition, there are a remaining set of more major (breaking) changes that are recommended. The recommendations are split into 2 categories, recommendations for immediate improvement (i.e. included in v1.0) and future suggestions that can be addressed post v1.0 launch.
The recommended additional areas for immediate improvement are:
- **Replace the class-based structure with an instance based one** - remove some areas of potential surprise for developers and simplify the Beaker codebase by moving to a composable instance-based structure rather than a static class-based structure
- **Defer PyTEAL compilation** - improve flexibility and future contract output stability by deferring PyTEAL compilation (i.e. Beaker -> TEAL transpilation) to not happen when the Beaker contract is initialised
- **Renamings** - There are some clear parameters that make sense to rename for various reasons
- **Key decorator improvements** - Refactor some of the Beaker decorators to fix some bugs and improve user experience
- **Beaker state refactor** - Refactor of the Beaker state interfaces to improve user extensibility and significantly simplify the Beaker codebase to improve maintainability
The recommended areas for future improvement are:
- Typed client generation from app spec to improve deploy-time and run-time dev experience
- `Tmpl` values in app spec so you can have type-safe deployment clients that substitute any template values reliably at contract deploy time
- Refactor storage types (blob, reserved, etc.) to allow use of in-built Python types and operators (terser, more intuitive)
- Box storage implementation improved to match local/global behaviour and also automatically delete itself on contract deletion
- Composable and stackable authorization and `@authorize` as a standalone decorator
- PyTEAL typings to be improved to support types beyond `Expr` where a more explicit type can be specified (improves typing and extensibility)
- Support referencing an app/lsig via ID/address (deployed separately, potentially automatically as part reading a Directed Acyclic Graph (DAG) in application.json of application dependencies) or bytes (deployed inline, what was previously called precompile, noting this would be deploy-time substitution, not smart contract run-time substitute like `TemplateVariable`), this also may allow precompile to be deprecated (it's a very complex implementation for what we believe to be an advanced edge case)
## Immediate recommendations
### (1) Replace the class-based structure with an instance based one
#### What?
Beaker is currently structured around users sub-classing the `beaker.Application` class. They then hold state variables (from `beaker.state.*`) as [class variables](https://pynative.com/python-class-variables/) and also contain methods which are forwarded to the `pyteal.abi.Router` instance created during `Application.compile(...)` based on decorators from `beaker.decorators.*`. We propose replacing this with an "instance based structure", drawing inspiration from highly popular Python web frameworks such as `flask` ([example](https://flask.palletsprojects.com/en/2.2.x/quickstart/#a-minimal-application)).
This change will simplify Beaker's code (improving maintainability) and, more importantly, reduce the potential for end-user error and confusion.
#### Why?
**User-facing benefits**
1. The current structure, by encouraging and supporting [bound instance methods](https://www.geeksforgeeks.org/bound-methods-python/) alongside [class variables](https://pynative.com/python-class-variables/), is a potential source of confusion for users new to writing smart contracts or PyTEAL. The distinction between what runs on `beaker.Application` instantiation, evaluation by PyTeal during compile, and finally what runs on-chain, can be difficult to grasp at first. One might assume (wrongly) that Beaker is somehow maintaining the state of `self.*` between methods, but this is not the case. Contrast this with Solidity, for example, where state can be directly manipulated because it's help within the class instance.
2. Currently, actually using `self.*` can easily lead to problems, since if they are not defined before calling `super().__init__(...)` they won't be defined when compiling. This can be fixed by not automatically compiling in `Application.__init__()` (which is also proposed in (2) below) for simple constants, however another issue is that using `self.foo = <Some beaker.state object>`, would not currently work with the introspection beaker is performing. This could potentially be fixed by itself, but developers will still need to define these values _before_ calling `super().__init__()` which is a source of confusion. Usually, idiomatic Python will call super init sooner rather than later so this is something that can trip up experienced Python developers.
3. In order to compose applications together, say if there were two ARC standard implementations that we wanted to combine into the same contract, the user doesn't need to understand Python's multiple-inheritance idiosyncrasies like [Method Resolution Order](https://www.geeksforgeeks.org/method-resolution-order-in-python-inheritance/). Additionally, by taking a functional composition approach, we can have easy to understand entry points where you can check any pre-conditions.
4. Since state variables are currently defined as class variables, this makes them "globals", which can lead to errors/bugs that are non-obvious.
For instance, consider:
```python
class MyBaseApp(beaker.Application):
counter = beaker.ApplicationStateValue(stack_type=pyteal.TealType.uint64)
@beaker.create
def create(self) -> pyteal.Expr:
return self.initialize_application_state()
class MyApp(MyBaseApp):
pass
MyApp.counter.default = pyteal.Int(10)
class MyOtherApp(MyBaseApp):
pass
app1 = MyApp()
app2 = MyOtherApp()
assert app1.approval_program != app2.approval_program # fails
```
5. Setting parameters that control the program creation is awkward with the current approach of extending `beaker.Application`, currently this impacts just the `version` parameter (which specifies the TEAL version), but there are clear examples we can see for other variables that are useful to define at this point in the future (e.g. a state allocation override if you know that the state a contract will need grows in the future).
6. There are bugs in beaker which are directly caused by the class-based structure. For example, bare methods are currently evaluated as a subroutine only once:
```python
class MyApp(beaker.Application):
price = beaker.ApplicationStateValue(stack_type=pyteal.TealType.uint64)
def __init__(self, default_price: int, version: int = pyteal.MAX_TEAL_VERSION):
self.price.default = pyteal.Int(default_price)
super().__init__(version=version)
class CorrectApp(MyApp):
@beaker.create
def create(self, *, output: pyteal.abi.Uint64) -> pyteal.Expr:
return pyteal.Seq(self.initialize_application_state(), output.set(self.price))
class IncorrectApp(MyApp):
@beaker.create
def create(self) -> pyteal.Expr:
return self.initialize_application_state()
correct_app1 = CorrectApp(default_price=123)
correct_app2 = CorrectApp(default_price=456)
incorrect_app1 = IncorrectApp(default_price=123)
incorrect_app2 = IncorrectApp(default_price=456)
assert correct_app1.approval_program != correct_app2.approval_program # success
assert incorrect_app1.approval_program != incorrect_app2.approval_program # failure
```
**Beaker maintainability benefit**
The main benefit to Beaker is the removal the complex code that modifies function signatures to remove `self` before passing to PyTEAL. Removing the instance method implementation will significantly reduce the complexity of the code and likelihood of unknown bugs surfacing from that part of the codebase.
#### Before & After (user's perspective)
While the proposed changes are fairly substantial internally, and propose a radically different architecture conceptually for beaker Applications, the migration should actually be relatively straight forward for users with existing Beaker code:
The following examples assume the import of relevant names from `beaker` and/or `pyteal` are present to simplify the code.
**Before:**
```python
class CounterApp(Application):
counter = ApplicationStateValue(
stack_type=TealType.uint64,
descr="A counter for showing how to use application state",
)
@create
def create(self):
return self.initialize_application_state()
@external(authorize=Authorize.only(Global.creator_address()))
def increment(self, *, output: abi.Uint64):
"""increment the counter"""
return Seq(
self.counter.set(self.counter + Int(1)),
output.set(self.counter),
)
@external(authorize=Authorize.only(Global.creator_address()))
def decrement(self, *, output: abi.Uint64):
"""decrement the counter"""
return Seq(
self.counter.set(self.counter - Int(1)),
output.set(self.counter),
)
```
**After:**
The changes are:
- State is moved into a dedicated class `CounterState`
- `beaker.Application` is directly instantiated (along with the state, and optionally the teal `version`)
- Class methods are de-indented, `self` is removed and the decorator is prefixed with `app.` (which in turn reduces the number of imports needed from the `beaker` namespace and provides better exploratory intellisense for users)
```python
class CounterState(beaker.State):
counter = ApplicationStateValue(
stack_type=TealType.uint64,
descr="A counter for showing how to use application state",
)
app = beaker.Application(state=CounterState())
@app.create
def create():
return app.state.initialize_application_state()
@app.external(authorize=Authorize.only(Global.creator_address()))
def increment(*, output: abi.Uint64):
"""increment the counter"""
return Seq(
app.state.counter.set(app.state.counter + Int(1)),
output.set(app.state.counter),
)
@app.external(authorize=Authorize.only(Global.creator_address()))
def decrement(*, output: abi.Uint64):
"""decrement the counter"""
return Seq(
app.state.counter.set(app.state.counter - Int(1)),
output.set(app.state.counter),
)
```
### (2) Defer PyTEAL compilation
#### What?
Currently, `beaker.Application.compile()` is called as part of `__init__()`, assuming there are no `precompiles` defined. We recommend that `compile()` always be deferred to a later point, and further that `compile()` does not mutate `Application` in any way, but instead returns a new object.
#### Why?
The deferment of the `compile()` call is actually a necessary part of recommendation #1 that we have skipped over thus far, but would be recommended anyway.
The immediate `compile()` has issues such as requiring implementors (i.e. subclasses) to call `super().__init__()` as a **final** step in their own `__init__` method - any code that runs after the super init call will have no effect on the application produced!
Immediate compilation also reduces the control the user has over the output. Although currently the only parameter that `compile` takes is a `client`, it might be useful to add (optional) parameters here to control the compilation. For example, if you can pass in the list of optimisations that should be applied, that allows you to have [output stability](../articles/output_stability.md) of your smart contract code if new optimisations are added in the future.
The separation of compiled state outside of `Application` simplifies the design, and can be done mostly transparently to end-users.
The separation of compiled state will also benefit future interoperability. It allows for more explicit decoupling of PyTEAL compilation (Beaker / PyTEAL transpilation -> TEAL) and deploment (TEAL -> compiled byte code -> Algorand network). Once `beaker.client` is split into a separate package, if the compiled state can be both generated from a beaker Application object _or_ loaded from disk (or similar), this means Beaker's ApplicationClient could be used in more situations, such as for a (say) tealish smart contract, or a C# smart contract, or a raw PyTEAL or TEAL smart contract, etc. This conforms better to the modularity principle in AlgoKit and also vice versa allows for a Beaker smart contract to be deployed by a TypeScript deployer, or C# deployer, etc.
#### Before & After - user's perspective
For most use cases, this should be a relatively small and probably imperceptible change.
We believe there are two common usage scenarios that use the output of PyTEAL compilation currently:
1. Output the `Application` via `Application.dump(...)`
2. Interact with the `Application` by passing it to `ApplicationClient(app=..., ...)`.
We propose maintaining those two scenarios without any immediate external changes, but internally:
1. `Application.dump(...)` will call `Application.compile().dump()`, and potentially trigger a `DeprecationWarning` if we decide that we want users to always explicitly call compile.
2. `ApplicationClient(app=..., ...)` will call `Application.compile()` and not retain any reference to `app`.
To make use of scenarios 1 _and_ 2, or to control compilation parameters, a user should also be able to (for instance):
```python
app = Application(...)
compiled_app: CompiledApplication = app.compile(...)
compiled_app.dump(...)
client = ApplicationClient(app=compiled_app, ...)
```
We suggest also potentially renaming `CompiledApplication.dump()`, perhaps to something along the lines of `serialize()`.
The `compile()` call is actually a transpilation call (Beaker / PyTEAL transpilation -> TEAL), although it's called compile in PyTEAL so consideration should be made to either keep consistency with PyTEAL or use the more accurate `transpile()` (which also reduces confusion around the fact that you then have to call `compile` on algod to compile the TEAL to byte code before deployment).
The exact details of what `CompiledApplication` will look like are TBD, but should be driven by the principles outlined in the "Why?" section above. Broadly, it stands to reason it would contain the approval and clear TEAL, the ABI spec and the app spec though at least.
Finally, there is likely need to use metadata from transpilation such as the mapping of source code to line numbers, but we are confident these use cases will be able to be implemented on top of the proposed change.
### (3) Renamings
Renaming `version` parameter in `Application.__init__(version: int = pyteal.MAX_VERSION)` to (e.g.) `avm_version`, to be more explicit. Otherwise developers may be confused that it's the version of the specific smart contract. It may be desirable to allow `version` to continue to be specified for some time, but to raise a `DeprecationWarning`.
Rename methods in `beaker.lib.*` to start with an uppercase. Although going against PEP-8, this prevents collisions with `builtins` such as `min` and `max`, and also follows the useful convention from PyTeal where methods that produce TEAL code (vs just running Python code at transpilation time) start with uppercase such as `Add`, `Or`, `Concat`, etc.
### (4) Key decorator improvements
Refactor some of the Beaker decorators to fix some bugs and improve user experience.
End state:
```python
# for user convenience, rather than having to import + use MethodConfig
OnCompleteActionName: TypeAlias = Literal[
"no_op",
"opt_in",
"close_out",
"clear_state",
"update_application",
"delete_application",
]
HandlerFunc: TypeAlias = Callable[..., Expr]
DecoratorFunc: TypeAlias = Callable[[HandlerFunc], HandlerFunc]
class Application:
# the main decorator, capable of handling both ABI and Bare method registration
def external(
self,
fn: HandlerFunc | None = None,
/,
*,
# note: retain existing behaviour of if method_config is None, default to no_op with CallConfig.CALL
method_config: MethodConfig | dict[OnCompleteActionName, CallConfig] | None = None,
name: str | None = None,
authorize: SubroutineFnWrapper | None = None,
bare: bool = False,
read_only: bool = False,
override: bool | None = False,
) -> HandlerFunc | DecoratorFunc:
...
# the below are just "shortcuts" to @external for simple/common use cases
def create(
self,
fn: HandlerFunc | None = None,
/,
*,
allow_call: bool = False,
name: str | None = None,
authorize: SubroutineFnWrapper | None = None,
bare: bool = False,
read_only: bool = False,
override: bool | None = False,
) -> HandlerFunc | DecoratorFunc:
...
def <delete|update|opt_in|clear_state|close_out|no_op>(
self,
fn: HandlerFunc | None = None,
/,
*,
allow_call: bool = True,
allow_create: bool = False,
name: str | None = None,
authorize: SubroutineFnWrapper | None = None,
bare: bool = False,
read_only: bool = False,
override: bool | None = False,
) -> HandlerFunc | DecoratorFunc:
...
```
For reference, the current state:
```python
def internal(
return_type_or_handler: TealType | HandlerFunc,
) -> HandlerFunc | DecoratorFunc:
...
def external(
func: HandlerFunc | None = None,
/,
*,
name: str | None = None,
authorize: SubroutineFnWrapper | None = None,
method_config: MethodConfig | None = None,
read_only: bool = False,
) -> HandlerFunc | DecoratorFunc:
...
def bare_external(
no_op: CallConfig | None = None,
opt_in: CallConfig | None = None,
clear_state: CallConfig | None = None,
delete_application: CallConfig | None = None,
update_application: CallConfig | None = None,
close_out: CallConfig | None = None,
) -> Callable[..., HandlerFunc]:
...
def create(
fn: HandlerFunc | None = None,
/,
*,
authorize: SubroutineFnWrapper | None = None,
method_config: Optional[MethodConfig] | None = None,
) -> HandlerFunc | DecoratorFunc:
...
def <delete|update|opt_in|clear_state|close_out|no_op>(
fn: HandlerFunc | None = None, /, *, authorize: SubroutineFnWrapper | None = None
) -> HandlerFunc | DecoratorFunc:
...
```
Changes:
- Remove `@internal`:
- if you don't pass a TealType parameter to it, i.e. intend to create an ABI internal routine, it actually just inlines the code currently due to a bug
- when passing in a TealType parameter to it, i.e. intent to create a normal subroutine, then in combination with (1) it will be unneeded since you can use `Subroutine` from PyTEAL (since the methods don't need to be artificially modified to remove `self` anymore)
- Add `bare: bool` option:
- Currently, this is not able to be controlled by the user - for `<create|delete|update|opt_in|clear_state|close_out|no_op>` decorators, they will create a bare method if the function takes no parameters other than maybe a `self` parameter. This has some down-sides:
1. The user might want an ABI method rather than a bare method. In this case, currently they could use `@external(method_config=...)`, but for simple cases this is not as easy to read/type and is not intuitive to discover in the first place.
2. The user might have more than one method that takes no parameters that is able to be called with a given `OnCompletionAction`, currently this would produce a `BareOverwriteError` in Beaker. Again, the work-around exists of calling `@external` instead, but it would be nicer and more intuitive to add a `bare` option to control this explicitly.
- The above Python methods have `bare: bool = False`. An alternative option would be to make this `bare: bool | None = None`, where `None` would retain the current behaviour of inspecting the method signature to see if it takes parameters or not.
- Remove `@bare_external`:
- Mostly unused, and doesn't provide the same options as the other decorators (e.g. `authorize`)
- Instead, we can replace the case of a single option being passed to it, with the equivalent named method: for example `@bare_external(opt_in=CallConfig.CALL)` becomes `@opt_in(bare=True)`
- For the multi-argument case: `@bare_external(no_op=CallConfig.CREATE, opt_in=CallConfig.CALL)` becomes `@external(method_config={"no_op": CallConfig.CREATE, "opt_in": CallConfig.CALL}, bare=True)`
* Add optional `name` option to all decorators, not just `@external`.
* Add `allow_call` and `allow_create` options to shortcut methods (except `@create` shortcut which should always allow `CallConfig.CREATE`).
* Remove `method_config` from `@create` shortcut - the default behaviour will remain unchanged, but any usages with `method_config` specified would be equivalent to just using `@external` directly.
* Add `override: bool | None = False` parameter.
- If `False` (the suggested default), an error will be raised if an ABI or Bare method would replace one already registered in the Application. For bare methods, this would be keyed on the `OnCompleteAction`, and for ABI methods should be based on the method signature (ie `ABIReturnSubroutine.method_signature()`). This is suggested as the default to prevent unexpected cases of overriding, especially when using blueprints/templates from the future Smart Contracts Library.
- If `True`, then an error will be raised if it _does not_ replace an already registered ABI or Bare method. This is similar to Java's `@Override` annotation, and can allow the user to be explicit and thus prevent unexpectedly _not_ replacing an existing method.
- If `None`, then methods will be overwritten if present, and no error will be raised if not already present. This option is here for maximum flexibility, but should perhaps be discouraged.
### (5) Beaker state refactor
Refactor of the `beaker.state` internal interfaces to simplify Beaker code base, make it easier to add new state wrappers, and to pave the way for future enhancements. This will have a side effect of allowing users to create their own state wrappers without having to modify `beaker` itself, although we recommend marking these interfaces as internal and subject to change - at least initially.
================================================
FILE: docs/architecture-decisions/2023-01-11_brew_install.md
================================================
# HomeBrew install strategy
- **Status**: Approved
- **Owner:** Daniel McGregor
- **Deciders**: Daniel McGregor, Rob Moore, John Woods, Alessandro Cappellato
- **Date created**: 2023-01-11
- **Date decided:** 2023-01-11
## Context
HomeBrew (brew) is a MacOS package manager, and is commonly used on MacOS systems to install applications and tools like AlgoKit. Brew offers two main installation methods.
* Formula - A source based install, this is typically recommended for open source and command line based applications. Formula can also be "bottled" to provide pre built packages for quick installs on supported MacOS platforms.
* Cask - A binary based install, this is typically recommended for closed source or GUI based applications.
Additionally there are also two options for how the brew install scripts could be distributed.
* Homebrew repository - This is the official repository for homebrew installs, and provides bottle support for all moderns MacOS platforms (MacOS 11+, Intel and ARM)
* Algorand hosted repository - A homebrew repository managed by Algorand Foundation.
Creating a HomeBrew Formula initially seemed like the best option for AlgoKit as it meets the [criteria](https://docs.brew.sh/Acceptable-Formulae) for a Formula. However there is a much higher maintenance cost with this approach as everything is built from source. We encountered an issue where one of our newly added python dependencies (pyclip) did not build from source [correctly](https://github.com/algorandfoundation/homebrew-tap/actions/runs/3884956190/jobs/6628201057#step:8:2871).
The alternative install method of a cask was then considered, and while AlgoKit does not meet the [criteria](https://docs.brew.sh/Acceptable-Casks) for a cask, it does remove the need for a source build on each MacOS platform and the additional maintenance overhead of the Formula approach.
## Requirements
- **Low maintenance**: The ongoing maintenance for supporting brew installs of AlgoKit should be low and not require manual effort for each release.
- **Fast and easy install experience**: The install experience for end users of AlgoKit should be easy and not require multiple complicated steps, additionally it should install in seconds, not minutes.
## Options
### Option 1: Formula on Official Homebrew Repo
This would be the preferred option except for the two notable issues. Firstly there is a high risk of ongoing maintenance overhead due to the need to support source building all the dependencies. Ideally this would not be an issue, but we have already hit a problem with a dependency (pyclip) early on in AlgoKit's development. Secondly inclusion into the official repo is subject to Homebrew's criteria, which AlgoKit won't reach until it is more mature.
**Pros**
* Most discoverable option for end users `brew install algokit`.
* Homebrew supports automatically bottling on all modern MacOS platforms (MacOS 11+ both Intel and ARM variants) meaning fast installs for users.
**Cons**
* Inclusion is subject to Homebrew's approval process, which algokit won't meet for now at least.
* Higher maintenance cost given the source build is more fragile and is likely to break and require investigation, plus build and install approach differs significantly from Chocolatey and pipx
* Longer build time on release
* Not possible to fully automate release, it relies on a Brew maintainer approving the pull request, so there's extra operational overhead to keep track of the release pull requests
### Option 2: Formula on Algorand Repo
This option is similar to Option 1, but allows Algorand to self publish the installer without meeting Homebrews formula criteria. However one issue is that Platform support is more limited, GitHub provides action runners for intel variants for MacOS 11 + 12, but [MacOS 13](https://github.com/github/roadmap/issues/620) and [ARM](https://github.com/github/roadmap/issues/528) support are not yet available. Additional platforms could be supported by using a combination of self-hosted runners and/or third party solutions. This means pre-built bottles aren't easy to build for ARM or MacOS 13 and installation on those environments will take 5+ minutes.
**Pros**
* Algorand Foundation has control over this process and it can be fully automated
* It's what we have already implemented and working today
* Easier to move to the official Brew core repository once AlgoKit is stable and demonstrably popular (thus meeting the constraints Brew place)
**Cons**
* Supporting all modern MacOS platforms may require use of a 3rd party service and more effort, in the meantime the installation experience on ARM and MacOS 13 is slow (5+ min install)
* Less discoverable install for end users `brew install algorandfoundation/algokit` (relies on them following documentation)
* Higher maintenance cost given the source build is more fragile and is likely to break and require investigation, plus build and install approach differs significantly from Chocolatey and pipx
* Longer build time on release
### Option 3: Cask on Algorand Repo
This option uses a cask which does not have the maintenance overhead of a formula, and can be hosted in an Algorand Foundation repo to get around the fact AlgoKit does not meet the normal cask criteria.
**Pros**
* Algorand Foundation has control over this process and it can be fully automated
* Lower maintenance cost as we do not need to support source builds of dependencies and it's consistent with how algokit cli is installed via Chocolatey and pipx
* Fast install for all MacOS platforms
* Fast build time on release
**Cons**
* Less discoverable install for end users `brew install algorandfoundation/algokit`
* AlgoKit does not meet the stated criteria for a cask and as such it would unlikely to be approved as a cask in the official Homebrew Repo if that was a desired future state
* More effort to implement a new way of installing via brew
### Option 4: Cask on Official Homebrew Repo
This is not a viable option as AlgoKit does not meet the criteria for an official cask.
## Preferred option
Option 1 because it would be the best end user experience.
## Selected option
Option 3 because Option 1 isn't possible right now and it's also a higher overhead to maintain. The install experience for end users is similar with option 3 (just with a bit more typing).
================================================
FILE: docs/architecture-decisions/2023-01-12_smart-contract-deployment.md
================================================
# Smart Contract Deployment
- **Status**: Approved
- **Owner:** Rob Moore
- **Deciders**: Anne Kenyon (Algorand Inc.), Alessandro Cappellato (Algorand Foundation), Fabrice Benhamouda (Algorand Foundation)
- **Date created**: 2023-01-12
- **Date decided:** 2023-02-04
- **Date updated**: 2023-02-04
## Context
AlgoKit will provide an end-to-end development and deployment experience that includes support for the end-to-end smart contract development lifecycle:
1. Development
1. **Write** smart contracts
2. **Transpile** smart contracts with development-time parameters to TEAL Templates
3. **Verify** the TEAL Templates maintain [output stability](../articles/output_stability.md) and any other static code quality checks
2. Deployment
1. **Substitute** deploy-time parameters into TEAL Templates to create final TEAL code
2. **Compile** the TEAL to create byte code using algod
3. **Deploy** the byte code to one or more Algorand networks (e.g. LocalNet, TestNet, MainNet) to create Deployed Application(s)
3. Runtime
1. **Validate** the deployed app via automated testing of the smart contracts to provide confidence in their correctness
2. **Call** deployed smart contract with runtime parameters to utilise it

The default Development experience that AlgoKit exposes will be via Beaker, however AlgoKit is modular and extensible so other tooling can also be used.
This decision record covers the different options and high level design for how AlgoKit aims to cover Deployment and Runtime.
## Requirements
- We support the different activities defined above under Deployment and Runtime: Substitute, Compile, Deploy, Validate and Call
- We support the ability to provide dev-time (e.g. static values that are passed into instances of a contract that get output), deploy-time (e.g. network specific addresses or IDs, etc.) and run-time (e.g. call arguments) values to smart contracts
- We support deploying smart contracts that have been output by any means (Beaker or otherwise) that creates TEAL templates (logic signature or approval & clear) and (for an app) an [ABI](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0004.md) and an [app spec](https://github.com/algorandfoundation/ARCs/pull/150)
- We support calling smart contracts with multiple languages / programming ecosystems (with AlgoKit providing Python and TypeScript implementations)
- We support generating type-safe smart contract clients based on the smart contract definition
- We support deploying smart contracts to AlgoKit LocalNet, TestNet and Mainnet
- We support deploying manually and via continuous deployment pipeline
## Principles
- [AlgoKit Guiding Principles](../../docs/algokit.md#Guiding-Principles) - specifically:
- **Cohesive developer tool suite**
- **Seamless onramp**
- **Secure by default**
- **Modular components**
- **Continuous Delivery** - support the ability for software developers to adopt a [Continuous Delivery](https://continuousdelivery.com/) approach to reduce risk, namely by supporting:
- [Deployment pipelines](https://continuousdelivery.com/implementing/patterns/#the-deployment-pipeline) that build once and deploy to similar environments (that bit is nicely facilitated by the blockchain!) consistently
- [Automated testing](https://continuousdelivery.com/implementing/architecture/)
- **Facilitate correctness** - smart contract development is higher risk than many other types of development, standard practice involves deploying an immutable contract that must be right from the beginning; AlgoKit should help developers fall into the pit of success and produce higher quality output that is more likely to be correct while having flexibility to opt-in to other behaviours as needed
## Decisions and design
The following design decisions need to be considered, and are discussed below:
- TEAL Templates and deploy-time parameter substitution
- Generated / Type-safe clients
- Deployment and development decoupling
- Upgradeable and deletable contracts
- Mnemonic storage and retrieval
- Contract identification
- Automated vs manual deployments
- Output stability testing
- Validation testing
### TEAL Templates and deploy-time parameter substitution
The above diagram includes a TEAL Templates step separate from the final TEAL that gets deployed. A fair question may be to ask if this extra step is really needed?
There are two key considerations to help answer this question:
1. Should development and deployment be decoupled from each other (i.e. happen at a separate time)?
- If we couple development and deployment together then it necessitates that at deploy time you have the same programming environment running that's needed for the smart contract development. So, if you (for instance) were building a smart contract in Python using PyTEAL or Beaker, but deploying the smart contract using TypeScript that means you need a deployment environment that supports both Node.js _and_ Python. This makes it harder to follow the Modular components principle.
- If development and deployment are coupled together it rules out using Continuous Delivery since it forces you to build the deployment artifact at the same time as you are deploying it. This means you miss out on the confidence and risk benefit of knowing that when you are deploying to (say) MainNet you are deploying the same artifact that was successfully deployed and tested on (say) TestNet and AlgoKit LocalNet (let alone passes any other checks you decide to run as part of Continuous Integration like automated tests, static code analysis, etc.).
- If development and deployment are coupled together it means we aren't perform an [output stability](../articles/output_stability.md) test so we don't get notified if we make a change that results in a different smart contract (which may then affect things like hashes for smart contract auditing review comparison, unintended introduction of security vulnerabilities, etc.).
- Based on all of this, decoupling development and deployment is a very helpful thing for a smart contract and aligns with all of the above-stated principles more closely.
2. Do we need to provide deploy-time parameters?
- When deploying a smart contract to a network (say MainNet), there are likely to be certain parameters that will be different from deploying to a different network (say TestNet), e.g.:
- If you are calling another smart contract, say an Oracle, then the application ID will change between networks.
- If you have standard prices you may decide to make them smaller on the TestNet contract given it's much harder to get access to a reasonable number of ALGOs on TestNet (without knowing the right people, or painfully clicking repeatedly on a CAPTCHA on one of the dispensers repeatedly to get 10 ALGOs at a time).
- If you are providing admin permissions for a statically defined account (hardcoded for security reasons) then it's likely you would use a different account address for MainNet vs TestNet so you don't expose a production mnemonic in test infrastructure.
- etc.
- Based on all of this, being able to provide deploy-time parameters is an important feature.
Because it makes sense to decouple development and deployment, but also important to be able to provide deploy-time parameters, that means it's necessary to support deploy-time parameter substitution and thus: TEAL that is output from the development stage should be considered a template that may have deploy-time substitutions performed on it.
Thankfully, this is supported as a first-class concept in PyTEAL via the [`Tmpl` feature](https://pyteal.readthedocs.io/en/stable/api.html?highlight=TMPL#pyteal.Tmpl) and could be similarly mimicked in any other TEAL transpilation language.
### Generated / Type-safe clients
Smart contract development results in an on-chain program that can be invoked from a "client". The development of the client itself has two broad options:
1. Hand-code the client for a given smart contract using basic primitives (such as being able to issue a smart contract call of a certain type with an array of arguments)
2. Generate the client based on the smart contract definition and then call methods on the client that correspond to methods in the smart contract
The second option, while more complex, results in an easier, faster, and safer developer experience:
- You don't need to understand as much about the underlying blockchain calls since they will be constructed for you so the frontends (e.g. dApps) don't have to be constructed by smart contract / web3 experts
- You can have type-safe / intellisensed client SDKs, in multiple programming languages with no extra effort beyond writing the smart contract - making the developer experience much easier and meeting devs where they are
- Using a typed client means that smart contract calls (against the same version of the smart contract the client was generated from) will always be correct and should succeed so the client code is more likely to be correct and can be statically checked for correctness
Because of this, the desired experience for AlgoKit is to encourage and directly support a generated / type-safe client experience. The intention is to drive this from a combination of [ARC-0004](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0004.md) and [ARC-0032](https://github.com/algorandfoundation/ARCs/pull/150).
To illustrate what the end result looks like consider the following Beaker smart contract:
```python
from beaker.application import Application
from beaker.decorators import Authorize, delete, external
from pyteal import Approve, Bytes, Concat, Expr, Global
from pyteal.ast import abi
class HelloWorld(Application):
@external(read_only=True)
def hello(self, name: abi.String, *, output: abi.String) -> Expr:
return output.set(Concat(Bytes("Hello, "), name.get()))
@delete(authorize=Authorize.only(Global.creator_address()))
def delete(self) -> Expr:
return Approve()
```
Let's say you wanted to deploy and interact with that smart contract using TypeScript; if you didn't have a client generated from that code then you would need to construct the method call:
```typescript
// Assume `appId`, `algod` and `senderAccount` are already in scope
const composer = new AtomicTransactionComposer();
composer.addMethodCall({
appID: appId,
method: new ABIMethod({
name: "hello",
args: [{ name: "name", type: "string" }],
returns: { type: "string" },
}), // Not type-safe, no intellisense
sender: senderAccount.addr,
signer: makeBasicAccountTransactionSigner(senderAccount),
suggestedParams: await algod.getTransactionParams().do(),
methodArgs: ["World!"], // Not type-safe, no intellisense
});
const result = await composer.execute(algod, 5);
console.log(result.methodResults[0].returnValue); // Hello, World!
```
If instead you generated a client you could having something like this, which gives you intellisense and is type-safe:
```typescript
// Assume `appId`, `algod` and `senderAccount` are already in scope
// HelloWorldAppClient is generated from the smart contract definition (ABI json and app spec json)
const app = new HelloWorldAppClient(appId, algod, senderAccount);
const result = app.hello({ name: "World!" }); // Type-safe and intellisense
console.log(result); // Hello, World!
```
To be fair, you could have a middle-ground and load the ABI json to populate the `method` parameter of the `addMethodCall` call, but the `methodArgs` are still problematic and there is still no intellisense.
The suggested implementation for AlgoKit v1 is to provide a basic type-safe TypeScript client (leveraging either the MakerX TypeScript generator or [beaker-ts](https://github.com/algorand-devrel/beaker-ts)) and leave Python with the semi-typed implementation that Beaker currently exposes (with implementing a fully typed Python client as a future implementation effort).
### Deployment and development decoupling
As discussed above, decoupling deployment and development of smart contracts is a useful technique.
One of the advantages is it allows you to use separate programming languages for the writing of a smart contract and the deployment and automated testing of it. Separate, but related, it also makes it easier to generate type-safe clients (per the previous point) because there is an intermediate output from the development stage that can then be used to generate a client, in a separate (or the same) programming language, before using that client to then deploy and interact with the smart contract (for an end user experience, a programmatic interaction or an automated test).
This helps us follow the "Meet devs where they are" principle and provide optionality for developers to select the programming environment they are most comfortable with for writing clients and automated tests.
### Upgradeable and deletable contracts
Smart contracts are a powerful capability that can be used for anything from locking billions of dollars of value to implementing the mechanics of a game's state storage. This means there are different risk profiles, rigour and functionality evolution characteristics in different circumstances.
These different risk profiles have an impact on the functionality that is exposed within a smart contract. Two key examples of this are:
- **Upgradeable smart contracts** - Whether or not a smart contract can be updated inline (and keep existing state and app ID / address characteristics) or they are immutable
- **Deletable smart contracts** - Whether or not a smart contract can be deleted or is permanent
Immutability and permanence are useful architectural properties in certain circumstances (similarly mutability and impermanence in others). For example:
- If you have a smart contract that locks billions of dollars of value, then allowing that smart contract to be upgradeable allows for the manager of the smart contract to make a change that lets them steal the value.
- If you have a smart contract that provides an Oracle service (say for betting odds), then allowing that smart contract to be deletable could break many other applications that are hard-coded to call that Oracle contract's app ID.
- If you have a smart contract that runs the mechanics of a game engine the players of said game may have a reasonable expectation that the game engine is evolved and enhanced over time, but they don't want to lose their state (so upgrading the smart contract is useful).
- If you have a smart contract that handles a one-off trade of value across a cross-chain bridge then it makes sense to delete it (only once trade has been concluded) to remove noise, potential confusion and operational overhead for the operators of said bridge.
All 4 scenarios above provide different situations where immutability and permanence are desired or undesired. If you choose incorrectly for your circumstance, particularly for high-risk scenarios, the consequences could be major.
If a contract is immutable, it does limit the ability to evolve the functionality over time based on user feedback and also discourages use of best practice software delivery techniques that encourage evolution and rapid deployment like Continuous Delivery.
Another consideration in favour of immutability is smart contract auditing. If a smart contract is audited for security, but then the smart contract is upgradeable or is changed between when the audit occurred and when the contract was deployed to MainNet then the smart contract audit is somewhat invalidated and certainly any hashes that are provided of the smart contract code in an audit report will no longer match.
There are techniques that can be used to allow for immutable smart contracts, but let them be evolved somewhat:
- You could release a new version of a smart contract and include an ability for that smart contract to communicate to/from the existing smart contract to migrate state.
- You could ensure that clients can dynamically find the latest smart contract so the application ID / address doesn't need to be hardcoded and the smart contract remains addressable.
- This could be done via some sort of on-chain or off-chain lookup, and/or by encoding information into the creation transaction note of the smart contract app.
- You could limit MainNet releases to major upgrades that happen infrequently and let users opt-in to whether or not they use the new version or not, and having a set of calls the user can sign to migrate their state/value from one contract to the next.
Lastly, it's worth noting that having fast development feedback loops during development and testing of smart contracts is likely a very useful feature to improve the development experience and speed. For this reason, allowing contracts to be upgraded or at the very least deleted (and then recreated) is likely very useful, but potentially when deployed to MainNet a switch could be made to disallow upgrading / deleting (as relevant).
The goal of AlgoKit is to create a development experience that is productive and easy, but also one that is secure by default and helps developers fall into the pit of success. For that reason, and given the consequences of getting this wrong the suggested approach AlgoKit takes is:
- All provided smart contract templates are by default immutable
- An immutability automated test is included by default to ensure that smart contracts can't be upgraded by the contract creator (this would have to be deleted by a developer, who is then opting in to the consequences of that)
- All provided smart contract templates are by default permanent when deployed to MainNet, but deletable elsewhere to facilitate an iterative development experience
- Client code will include mechanisms to dynamically find deployed applications in LocalNet and TestNet environments to support delete/recreate flows and improve the developer experience
- MainNet deployments will immediately (i.e. before any usage occurs) check that smart contracts are not upgradeable by the creator account by default (with an explicit opt-out option available for smart contracts that are meant to be upgradeable, which in turn will issue a warning to the developer to explain the implications)
- MainNet deployments will immediately (i.e. before any usage occurs) check that smart contracts are not deletable by the creator account by default (with an explicit opt-out option available for smart contracts that are meant to be deletable, which in turn will issue a warning to the developer to explain the implications)
### Mnemonic storage and retrieval
When deploying and interacting with a smart contract, you need to have access to the private key of an account. This is a secret and must be handled with care, as exposing a private key can be disastrous, and while [rekeying](https://developer.algorand.org/docs/get-details/accounts/rekey/) is possible if it's not done fast enough you can still lose assets, be victim to malicious calls and experience a painful user experience going forward (wallet support for rekeyed accounts is limited).
Another consideration is the network being deployed to / called. If you are interacting with the LocalNet network then mnemonics are all, but meaningless since you can simply reset the LocalNet and regenerate new accounts on the fly (and fund them with essentially unlimited ALGOs). If you are interacting with TestNet then mnemonics may hold TestNet ALGOs, which while difficult to get in large numbers, are more an inconvenience than a serious commercial problem to lose.
Finally, when interacting with LocalNet to create a smooth developer experience it's ideal to automatically generate and fund any accounts that are being used so the developer doesn't have to manually do this every time the LocalNet is reset. Even better, it's ideal if this can be done in a way that idempotently gets a consistently private key for a given "named account" so that subsequent calls use the same account (mimicking what happens in TestNet or MainNet when using a particular private key for a given "named account").
Given all of this, the suggested approach that AlgoKit takes is:
- LocalNet accounts are by default automatically and idempotently generated against a named account by using a named wallet via [Kmd](https://developer.algorand.org/docs/clis/kmd/) and are automatically funded using the LocalNet faucet account (the private key for which is automatically retrieved using Kmd).
- Wh
gitextract_vthf3g10/
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ ├── actions/
│ │ ├── build-binaries/
│ │ │ ├── linux/
│ │ │ │ └── action.yaml
│ │ │ ├── macos/
│ │ │ │ └── action.yaml
│ │ │ └── windows/
│ │ │ └── action.yaml
│ │ ├── install-apple-dev-id-cert/
│ │ │ └── action.yaml
│ │ └── setup-poetry/
│ │ └── action.yaml
│ ├── dependabot.yml
│ ├── pull_request_template.md
│ └── workflows/
│ ├── build-binaries.yaml
│ ├── build-python.yaml
│ ├── cd.yaml
│ ├── check-python.yaml
│ ├── clear-caches.yaml
│ ├── pr.yaml
│ └── publish-release-packages.yaml
├── .gitignore
├── .idea/
│ └── runConfigurations/
│ └── Run_AlgoKit_CLI.xml
├── .pre-commit-config.yaml
├── .vscode/
│ ├── extensions.json
│ ├── launch.json
│ └── settings.json
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── debug.py
├── docs/
│ ├── algokit.md
│ ├── architecture-decisions/
│ │ ├── 2022-11-14_sandbox-approach.md
│ │ ├── 2022-11-22_beaker-testing-strategy.md
│ │ ├── 2023-01-11_beaker_productionisation_review.md
│ │ ├── 2023-01-11_brew_install.md
│ │ ├── 2023-01-12_smart-contract-deployment.md
│ │ ├── 2023-06-06_frontend-templates.md
│ │ ├── 2023-07-19_advanced_generate_command.md
│ │ ├── 2024-01-13_native_binaries.md
│ │ ├── 2024-01-23_init-wizard-v2.md
│ │ ├── 2024-01-31_binary_distribution.md
│ │ └── 2024-03-06_local_dev_ui_packaging.md
│ ├── articles/
│ │ └── output_stability.md
│ ├── cli/
│ │ └── index.md
│ ├── features/
│ │ ├── compile.md
│ │ ├── completions.md
│ │ ├── config.md
│ │ ├── dispenser.md
│ │ ├── doctor.md
│ │ ├── explore.md
│ │ ├── generate.md
│ │ ├── goal.md
│ │ ├── init.md
│ │ ├── localnet.md
│ │ ├── project/
│ │ │ ├── bootstrap.md
│ │ │ ├── deploy.md
│ │ │ ├── link.md
│ │ │ ├── list.md
│ │ │ └── run.md
│ │ ├── project.md
│ │ ├── tasks/
│ │ │ ├── analyze.md
│ │ │ ├── ipfs.md
│ │ │ ├── mint.md
│ │ │ ├── nfd.md
│ │ │ ├── opt.md
│ │ │ ├── send.md
│ │ │ ├── sign.md
│ │ │ ├── transfer.md
│ │ │ ├── vanity_address.md
│ │ │ └── wallet.md
│ │ └── tasks.md
│ ├── sphinx/
│ │ ├── conf.py
│ │ └── index.rst
│ └── tutorials/
│ ├── algokit-template.md
│ ├── intro.md
│ └── smart-contracts.md
├── entitlements.xml
├── misc/
│ └── multiformats_config/
│ ├── multibase-table.json
│ └── multicodec-table.json
├── poetry.toml
├── pyproject.toml
├── scripts/
│ ├── package_mac.sh
│ ├── package_windows.bat
│ ├── snap/
│ │ └── create-snapcraft-yaml.sh
│ ├── update-brew-cask.sh
│ └── winget/
│ ├── build-installer.ps1
│ ├── installer/
│ │ ├── AppxManifest.xml
│ │ └── priconfig.xml
│ └── update-package.ps1
├── src/
│ └── algokit/
│ ├── __init__.py
│ ├── __main__.py
│ ├── cli/
│ │ ├── __init__.py
│ │ ├── codespace.py
│ │ ├── common/
│ │ │ ├── __init__.py
│ │ │ ├── constants.py
│ │ │ └── utils.py
│ │ ├── compile.py
│ │ ├── compilers/
│ │ │ ├── __init__.py
│ │ │ ├── python.py
│ │ │ └── typescript.py
│ │ ├── completions.py
│ │ ├── config.py
│ │ ├── dispenser.py
│ │ ├── doctor.py
│ │ ├── explore.py
│ │ ├── generate.py
│ │ ├── goal.py
│ │ ├── init/
│ │ │ ├── __init__.py
│ │ │ ├── command.py
│ │ │ ├── example.py
│ │ │ └── helpers.py
│ │ ├── localnet.py
│ │ ├── project/
│ │ │ ├── __init__.py
│ │ │ ├── bootstrap.py
│ │ │ ├── deploy.py
│ │ │ ├── link.py
│ │ │ ├── list.py
│ │ │ └── run.py
│ │ ├── task.py
│ │ ├── tasks/
│ │ │ ├── __init__.py
│ │ │ ├── analyze.py
│ │ │ ├── assets.py
│ │ │ ├── ipfs.py
│ │ │ ├── mint.py
│ │ │ ├── nfd.py
│ │ │ ├── send_transaction.py
│ │ │ ├── sign_transaction.py
│ │ │ ├── transfer.py
│ │ │ ├── utils.py
│ │ │ ├── vanity_address.py
│ │ │ └── wallet.py
│ │ └── tui/
│ │ ├── __init__.py
│ │ └── init/
│ │ ├── __init__.py
│ │ ├── example_selector.py
│ │ └── screens/
│ │ ├── __init__.py
│ │ └── example_selector_screen.py
│ ├── core/
│ │ ├── __init__.py
│ │ ├── _toml.py
│ │ ├── _vendor/
│ │ │ ├── __init__.py
│ │ │ └── auth0/
│ │ │ ├── __init__.py
│ │ │ └── authentication/
│ │ │ ├── __init__.py
│ │ │ └── token_verifier.py
│ │ ├── atomic_write.py
│ │ ├── codespace.py
│ │ ├── compilers/
│ │ │ ├── python.py
│ │ │ └── typescript.py
│ │ ├── conf.py
│ │ ├── config_commands/
│ │ │ ├── __init__.py
│ │ │ ├── container_engine.py
│ │ │ ├── js_package_manager.py
│ │ │ ├── py_package_manager.py
│ │ │ └── version_prompt.py
│ │ ├── dispenser.py
│ │ ├── doctor.py
│ │ ├── generate.py
│ │ ├── goal.py
│ │ ├── init.py
│ │ ├── log_handlers.py
│ │ ├── proc.py
│ │ ├── project/
│ │ │ ├── __init__.py
│ │ │ ├── bootstrap.py
│ │ │ ├── deploy.py
│ │ │ └── run.py
│ │ ├── questionary_extensions.py
│ │ ├── sandbox.py
│ │ ├── tasks/
│ │ │ ├── __init__.py
│ │ │ ├── analyze.py
│ │ │ ├── ipfs.py
│ │ │ ├── mint/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── mint.py
│ │ │ │ └── models.py
│ │ │ ├── nfd.py
│ │ │ ├── vanity_address.py
│ │ │ └── wallet.py
│ │ ├── typed_client_generation.py
│ │ └── utils.py
│ ├── py.typed
│ └── resources/
│ └── distribution-method
└── tests/
├── __init__.py
├── compile/
│ ├── __init__.py
│ ├── conftest.py
│ ├── test_python.py
│ ├── test_python.test_compile_py_help.approved.txt
│ ├── test_python.test_puyapy_is_installed_globally.approved.txt
│ ├── test_python.test_puyapy_is_installed_in_project.approved.txt
│ ├── test_python.test_puyapy_is_not_installed_anywhere.approved.txt
│ ├── test_python.test_specificed_puyapy_version_is_not_installed.approved.txt
│ ├── test_typescript.py
│ ├── test_typescript.test_compile_py_help.approved.txt
│ ├── test_typescript.test_puyats_is_installed_globally.approved.txt
│ ├── test_typescript.test_puyats_is_installed_in_project.approved.txt
│ ├── test_typescript.test_puyats_is_not_installed_anywhere.approved.txt
│ └── test_typescript.test_specificed_puyats_version_is_not_installed.approved.txt
├── completions/
│ ├── __init__.py
│ ├── test_completions.py
│ ├── test_completions.test_completions_help.approved.txt
│ ├── test_completions.test_completions_install_handles_config_outside_home.approved.txt
│ ├── test_completions.test_completions_install_handles_no_profile.approved.txt
│ ├── test_completions.test_completions_install_handles_unsupported_bash_gracefully.approved.txt
│ ├── test_completions.test_completions_install_is_idempotent.approved.txt
│ ├── test_completions.test_completions_installs_correctly_with_detected_shell.approved.txt
│ ├── test_completions.test_completions_installs_correctly_with_specified_shell.bash.approved.txt
│ ├── test_completions.test_completions_installs_correctly_with_specified_shell.zsh.approved.txt
│ ├── test_completions.test_completions_subcommands_help.install.approved.txt
│ ├── test_completions.test_completions_subcommands_help.uninstall.approved.txt
│ ├── test_completions.test_completions_subcommands_with_unknown_shell_fails_gracefully.install.approved.txt
│ ├── test_completions.test_completions_subcommands_with_unknown_shell_fails_gracefully.uninstall.approved.txt
│ ├── test_completions.test_completions_subcommands_with_unsupported_shell_fails_gracefully.install.approved.txt
│ ├── test_completions.test_completions_subcommands_with_unsupported_shell_fails_gracefully.uninstall.approved.txt
│ ├── test_completions.test_completions_uninstall_handles_no_profile.approved.txt
│ ├── test_completions.test_completions_uninstall_is_idempotent.approved.txt
│ ├── test_completions.test_completions_uninstalls_correctly.bash.approved.txt
│ └── test_completions.test_completions_uninstalls_correctly.zsh.approved.txt
├── config/
│ ├── __init__.py
│ ├── test_package_managers.py
│ ├── test_package_managers.test_js_package_manager_help.approved.txt
│ ├── test_package_managers.test_js_package_manager_invalid_argument.approved.txt
│ ├── test_package_managers.test_js_package_manager_set_npm.approved.txt
│ ├── test_package_managers.test_js_package_manager_set_pnpm.approved.txt
│ ├── test_package_managers.test_py_package_manager_help.approved.txt
│ ├── test_package_managers.test_py_package_manager_invalid_argument.approved.txt
│ ├── test_package_managers.test_py_package_manager_set_poetry.approved.txt
│ └── test_package_managers.test_py_package_manager_set_uv.approved.txt
├── conftest.py
├── dispenser/
│ ├── TestFundCommand.test_fund_command_address_invalid.approved.txt
│ ├── TestFundCommand.test_fund_command_alias_invalid.approved.txt
│ ├── TestFundCommand.test_fund_command_from_alias_successful.approved.txt
│ ├── TestFundCommand.test_fund_command_http_error.approved.txt
│ ├── TestFundCommand.test_fund_command_invalid_args.approved.txt
│ ├── TestFundCommand.test_fund_command_not_authenticated.approved.txt
│ ├── TestFundCommand.test_fund_command_success.False.False.approved.txt
│ ├── TestFundCommand.test_fund_command_success.False.True.approved.txt
│ ├── TestFundCommand.test_fund_command_success.True.False.approved.txt
│ ├── TestFundCommand.test_fund_command_success.True.True.approved.txt
│ ├── TestLimitCommand.test_limit_command_http_error.approved.txt
│ ├── TestLimitCommand.test_limit_command_not_authenticated.approved.txt
│ ├── TestLimitCommand.test_limit_command_success.False.False.approved.txt
│ ├── TestLimitCommand.test_limit_command_success.False.True.approved.txt
│ ├── TestLimitCommand.test_limit_command_success.True.False.approved.txt
│ ├── TestLimitCommand.test_limit_command_success.True.True.approved.txt
│ ├── TestLoginCommand.test_login_command_already_logged_in.approved.txt
│ ├── TestLoginCommand.test_login_command_cancelled_timeout.approved.txt
│ ├── TestLoginCommand.test_login_command_expired_token_refresh.False.approved.txt
│ ├── TestLoginCommand.test_login_command_expired_token_refresh.True.approved.txt
│ ├── TestLoginCommand.test_login_command_success_ci.file.None.approved.txt
│ ├── TestLoginCommand.test_login_command_success_ci.file.custom_file.txt.approved.txt
│ ├── TestLoginCommand.test_login_command_success_ci.stdout.None.approved.txt
│ ├── TestLoginCommand.test_login_command_success_user.approved.txt
│ ├── TestLogoutCommand.test_logout_command_already_logged_out.approved.txt
│ ├── TestLogoutCommand.test_logout_command_revoke_exception.approved.txt
│ ├── TestLogoutCommand.test_logout_command_success.approved.txt
│ ├── TestRefundCommand.test_refund_command_http_error.approved.txt
│ ├── TestRefundCommand.test_refund_command_invalid_args.approved.txt
│ ├── TestRefundCommand.test_refund_command_not_authenticated.approved.txt
│ ├── TestRefundCommand.test_refund_command_success.False.approved.txt
│ ├── TestRefundCommand.test_refund_command_success.True.approved.txt
│ └── test_dispenser.py
├── doctor/
│ ├── __init__.py
│ ├── test_doctor.py
│ ├── test_doctor.test_doctor_all_commands_bad_exit[linux].approved.txt
│ ├── test_doctor.test_doctor_all_commands_bad_exit[macOS].approved.txt
│ ├── test_doctor.test_doctor_all_commands_bad_exit[windows].approved.txt
│ ├── test_doctor.test_doctor_all_commands_not_found[linux].approved.txt
│ ├── test_doctor.test_doctor_all_commands_not_found[macOS].approved.txt
│ ├── test_doctor.test_doctor_all_commands_not_found[windows].approved.txt
│ ├── test_doctor.test_doctor_help.approved.txt
│ ├── test_doctor.test_doctor_successful[linux].approved.txt
│ ├── test_doctor.test_doctor_successful[macOS].approved.txt
│ ├── test_doctor.test_doctor_successful[windows].approved.txt
│ ├── test_doctor.test_doctor_with_copy.approved.txt
│ ├── test_doctor.test_doctor_with_docker_compose_version_gitpod.approved.txt
│ ├── test_doctor.test_doctor_with_docker_compose_version_unparseable.approved.txt
│ ├── test_doctor.test_doctor_with_docker_compose_version_warning.approved.txt
│ ├── test_doctor.test_doctor_with_weird_values_on_mac.approved.txt
│ ├── test_doctor.test_doctor_with_weird_values_on_windows.approved.txt
│ ├── test_doctor.test_new_algokit_version_available.approved.txt
│ ├── test_doctor.test_npm_permission_denied.approved.txt
│ ├── test_doctor.test_unexpected_exception_locating_executable.approved.txt
│ └── test_doctor.test_unparseable_python_version.approved.txt
├── explore/
│ ├── __init__.py
│ ├── test_explore.py
│ ├── test_explore.test_explore.localnet.approved.txt
│ ├── test_explore.test_explore.mainnet.approved.txt
│ └── test_explore.test_explore.testnet.approved.txt
├── generate/
│ ├── __init__.py
│ ├── app.arc32.json
│ ├── app.arc56.json
│ ├── application.json
│ ├── test_generate_client.py
│ ├── test_generate_client.test_generate_client_no_app_spec_found.approved.txt
│ ├── test_generate_client.test_generate_client_output_path_is_dir.approved.txt
│ ├── test_generate_client.test_generate_client_python[--output {contract_name}.py-hello_world_app.py].approved.txt
│ ├── test_generate_client.test_generate_client_python[-l python -v 1.1.0-hello_world_app_client.py].approved.txt
│ ├── test_generate_client.test_generate_client_python[-l python-hello_world_app_client.py].approved.txt
│ ├── test_generate_client.test_generate_client_python[-o client.py --language python --version 1.1.2-client.py].approved.txt
│ ├── test_generate_client.test_generate_client_python[-o client.py -p --mode minimal-client.py].approved.txt
│ ├── test_generate_client.test_generate_client_python[-o client.py-client.py].approved.txt
│ ├── test_generate_client.test_generate_client_python[-o client.ts --language python-client.ts].approved.txt
│ ├── test_generate_client.test_generate_client_python_arc32_filename.-o.client.py.approved.txt
│ ├── test_generate_client.test_generate_client_python_arc56_filename.-o.client.py.approved.txt
│ ├── test_generate_client.test_generate_client_python_multiple_app_specs_in_directory.-o.client.py.approved.txt
│ ├── test_generate_client.test_generate_client_recursive.approved.txt
│ ├── test_generate_client.test_generate_client_typescript[linux---output {contract_name}.ts-HelloWorldApp.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[linux--l typescript -v 2.6.0-HelloWorldAppClient.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[linux--l typescript-HelloWorldAppClient.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[linux--o client.py --language typescript-client.py].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[linux--o client.ts --language typescript --version 3.0.0-client.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[linux--o client.ts -pn --mode minimal-client.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[linux--o client.ts-client.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[macOS---output {contract_name}.ts-HelloWorldApp.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[macOS--l typescript -v 2.6.0-HelloWorldAppClient.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[macOS--l typescript-HelloWorldAppClient.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[macOS--o client.py --language typescript-client.py].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[macOS--o client.ts --language typescript --version 3.0.0-client.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[macOS--o client.ts -pn --mode minimal-client.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[macOS--o client.ts-client.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[windows---output {contract_name}.ts-HelloWorldApp.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[windows--l typescript -v 2.6.0-HelloWorldAppClient.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[windows--l typescript-HelloWorldAppClient.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[windows--o client.py --language typescript-client.py].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[windows--o client.ts --language typescript --version 3.0.0-client.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[windows--o client.ts -pn --mode minimal-client.ts].approved.txt
│ ├── test_generate_client.test_generate_client_typescript[windows--o client.ts-client.ts].approved.txt
│ ├── test_generate_client.test_generate_help.approved.txt
│ ├── test_generate_client.test_generate_no_options.approved.txt
│ ├── test_generate_client.test_npx_failed[linux].approved.txt
│ ├── test_generate_client.test_npx_failed[macOS].approved.txt
│ ├── test_generate_client.test_npx_failed[windows].approved.txt
│ ├── test_generate_client.test_npx_missing.approved.txt
│ ├── test_generate_client.test_pipx_missing.approved.txt
│ ├── test_generate_client.test_python_generator_is_installed_globally.approved.txt
│ ├── test_generate_client.test_python_generator_is_installed_in_project.approved.txt
│ ├── test_generate_client.test_python_generator_version_is_not_installed_anywhere.approved.txt
│ ├── test_generate_client.test_typescript_generator_is_installed_globally[linux].approved.txt
│ ├── test_generate_client.test_typescript_generator_is_installed_globally[macOS].approved.txt
│ ├── test_generate_client.test_typescript_generator_is_installed_globally[windows].approved.txt
│ ├── test_generate_client.test_typescript_generator_is_installed_in_project[linux].approved.txt
│ ├── test_generate_client.test_typescript_generator_is_installed_in_project[macOS].approved.txt
│ ├── test_generate_client.test_typescript_generator_is_installed_in_project[windows].approved.txt
│ ├── test_generate_client.test_typescript_generator_version_is_not_installed_anywhere[linux].approved.txt
│ ├── test_generate_client.test_typescript_generator_version_is_not_installed_anywhere[macOS].approved.txt
│ ├── test_generate_client.test_typescript_generator_version_is_not_installed_anywhere[windows].approved.txt
│ ├── test_generate_custom_generate_commands.py
│ ├── test_generate_custom_generate_commands.test_generate_custom_generate_command_missing_git_valid_generator.approved.txt
│ ├── test_generate_custom_generate_commands.test_generate_custom_generate_command_no_git_valid_generator.approved.txt
│ ├── test_generate_custom_generate_commands.test_generate_custom_generate_commands_invalid_generic_generator.approved.txt
│ ├── test_generate_custom_generate_commands.test_generate_custom_generate_commands_no_toml.approved.txt
│ ├── test_generate_custom_generate_commands.test_generate_custom_generate_commands_valid_generator.approved.txt
│ ├── test_generate_custom_generate_commands.test_generate_custom_generate_commands_valid_generator_invalid_path.approved.txt
│ ├── test_generate_custom_generate_commands.test_generate_custom_generate_commands_valid_generator_no_description.approved.txt
│ ├── test_generate_custom_generate_commands.test_generate_custom_generate_commands_valid_generator_run.approved.txt
│ └── test_generate_custom_generate_commands.test_generate_custom_generate_commands_valid_generator_run_with_python_path.approved.txt
├── goal/
│ ├── __init__.py
│ ├── test_goal.py
│ ├── test_goal.test_goal_complex_args.approved.txt
│ ├── test_goal.test_goal_compose_outdated.approved.txt
│ ├── test_goal.test_goal_console.approved.txt
│ ├── test_goal.test_goal_console_algod_not_created.approved.txt
│ ├── test_goal.test_goal_console_failed.approved.txt
│ ├── test_goal.test_goal_help.approved.txt
│ ├── test_goal.test_goal_no_args.approved.txt
│ ├── test_goal.test_goal_simple_args.approved.txt
│ ├── test_goal.test_goal_simple_args_on_named_localnet.approved.txt
│ ├── test_goal.test_goal_simple_args_with_input_file.approved.txt
│ ├── test_goal.test_goal_simple_args_with_input_output_files.approved.txt
│ ├── test_goal.test_goal_simple_args_with_input_output_files_with_dot_convention_name.approved.txt
│ ├── test_goal.test_goal_simple_args_with_multiple_input_output_files.approved.txt
│ ├── test_goal.test_goal_simple_args_with_output_file.approved.txt
│ ├── test_goal.test_goal_simple_args_without_file_error.approved.txt
│ ├── test_goal.test_goal_start_without_docker.approved.txt
│ └── test_goal.test_goal_start_without_docker_engine_running.approved.txt
├── init/
│ ├── __init__.py
│ ├── copier-helloworld.bundle
│ ├── example/
│ │ ├── __init__.py
│ │ ├── test_example.py
│ │ ├── test_example.test_example_command_help.approved.txt
│ │ ├── test_example.test_example_command_list_option.approved.txt
│ │ ├── test_example.test_example_command_tui_select_nothing.approved.txt
│ │ ├── test_example.test_example_command_tui_select_valid.approved.txt
│ │ ├── test_example.test_example_command_tui_select_valid_but_source_missing.approved.txt
│ │ ├── test_example.test_example_command_with_invalid_id.approved.txt
│ │ ├── test_example.test_example_command_with_valid_id.approved.txt
│ │ └── test_example.test_example_command_with_valid_id_source_not_exist.approved.txt
│ ├── test_init.py
│ ├── test_init.test_init_ask_about_git.approved.txt
│ ├── test_init.test_init_blessed_template_url_get_community_warning.approved.txt
│ ├── test_init.test_init_bootstrap_no.approved.txt
│ ├── test_init.test_init_bootstrap_yes.approved.txt
│ ├── test_init.test_init_do_not_use_existing_folder.approved.txt
│ ├── test_init.test_init_existing_filename_same_as_folder_name.approved.txt
│ ├── test_init.test_init_help.approved.txt
│ ├── test_init.test_init_input_template_url.approved.txt
│ ├── test_init.test_init_invalid_template_url.approved.txt
│ ├── test_init.test_init_minimal_interaction_required_no_git_no_network_no_bootstrap.approved.txt
│ ├── test_init.test_init_minimal_interaction_required_yes_git_no_network.approved.txt
│ ├── test_init.test_init_missing_git.approved.txt
│ ├── test_init.test_init_no_community_template.approved.txt
│ ├── test_init.test_init_no_interaction_required_defaults_no_git_no_network.approved.txt
│ ├── test_init.test_init_no_interaction_required_no_git_no_network.approved.txt
│ ├── test_init.test_init_no_interaction_required_no_git_no_network_with_no_ide.approved.txt
│ ├── test_init.test_init_no_interaction_required_no_git_no_network_with_vscode.approved.txt
│ ├── test_init.test_init_no_interaction_required_no_git_no_network_with_vscode_and_readme.approved.txt
│ ├── test_init.test_init_project_name.approved.txt
│ ├── test_init.test_init_project_name_not_empty.approved.txt
│ ├── test_init.test_init_project_name_reenter_folder_name.approved.txt
│ ├── test_init.test_init_template_selection.approved.txt
│ ├── test_init.test_init_template_url_and_template_name.approved.txt
│ ├── test_init.test_init_template_with_python_task_fails_on_missing_python.approved.txt
│ ├── test_init.test_init_template_with_python_task_works.approved.txt
│ ├── test_init.test_init_use_existing_folder.approved.txt
│ ├── test_init.test_init_with_any_template_url_get_community_warning.approved.txt
│ ├── test_init.test_init_with_any_template_url_get_community_warning_with_unsafe_tag.approved.txt
│ ├── test_init.test_init_with_custom_env.approved.txt
│ ├── test_init.test_init_with_official_template_name.approved.txt
│ ├── test_init.test_init_with_official_template_name_and_hash.approved.txt
│ ├── test_init.test_init_wizard_v2_append_to_vscode_workspace.approved.txt
│ ├── test_init.test_init_wizard_v2_flow.Custom Template.approved.txt
│ ├── test_init.test_init_wizard_v2_flow.DApp Frontend.approved.txt
│ ├── test_init.test_init_wizard_v2_flow.Full Stack.approved.txt
│ ├── test_init.test_init_wizard_v2_flow.Smart Contract.approved.txt
│ ├── test_init.test_init_wizard_v2_github_folder_no_workspace.approved.txt
│ ├── test_init.test_init_wizard_v2_github_folder_with_workspace.approved.txt
│ ├── test_init.test_invalid_name.approved.txt
│ ├── test_init_with_bootstrap.py
│ ├── test_init_with_bootstrap.test_init_bootstrap_broken_poetry.approved.txt
│ └── test_init_with_bootstrap.test_init_bootstrap_version_fail.approved.txt
├── localnet/
│ ├── __init__.py
│ ├── conftest.py
│ ├── test_localnet.py
│ ├── test_localnet.test_localnet_help.approved.txt
│ ├── test_localnet_codespace.py
│ ├── test_localnet_codespace.test_install_gh_not_installed_failed_install.approved.txt
│ ├── test_localnet_codespace.test_install_gh_unix.approved.txt
│ ├── test_localnet_codespace.test_install_gh_windows.approved.txt
│ ├── test_localnet_codespace.test_invalid_scope_auth.approved.txt
│ ├── test_localnet_console.py
│ ├── test_localnet_console.test_goal_console.approved.txt
│ ├── test_localnet_reset.py
│ ├── test_localnet_reset.test_localnet_reset_with_existing_sandbox_with_out_of_date_config.approved.txt
│ ├── test_localnet_reset.test_localnet_reset_with_existing_sandbox_with_up_to_date_config.approved.txt
│ ├── test_localnet_reset.test_localnet_reset_with_existing_sandbox_with_up_to_date_config_with_pull.approved.txt
│ ├── test_localnet_reset.test_localnet_reset_with_named_sandbox_config.approved.txt
│ ├── test_localnet_reset.test_localnet_reset_without_docker.approved.txt
│ ├── test_localnet_reset.test_localnet_reset_without_docker_compose.approved.txt
│ ├── test_localnet_reset.test_localnet_reset_without_docker_engine_running.approved.txt
│ ├── test_localnet_reset.test_localnet_reset_without_existing_sandbox.approved.txt
│ ├── test_localnet_start.py
│ ├── test_localnet_start.test_localnet_img_check_cmd_error.approved.txt
│ ├── test_localnet_start.test_localnet_start.approved.txt
│ ├── test_localnet_start.test_localnet_start_failure.approved.txt
│ ├── test_localnet_start.test_localnet_start_health_bad_status.approved.txt
│ ├── test_localnet_start.test_localnet_start_health_failure.approved.txt
│ ├── test_localnet_start.test_localnet_start_out_date.approved.txt
│ ├── test_localnet_start.test_localnet_start_out_of_date_definition.approved.txt
│ ├── test_localnet_start.test_localnet_start_out_of_date_definition_and_missing_config.approved.txt
│ ├── test_localnet_start.test_localnet_start_up_to_date_definition.approved.txt
│ ├── test_localnet_start.test_localnet_start_with_custom_config_dir.approved.txt
│ ├── test_localnet_start.test_localnet_start_with_gitpod_docker_compose_version.approved.txt
│ ├── test_localnet_start.test_localnet_start_with_name.approved.txt
│ ├── test_localnet_start.test_localnet_start_with_no_dev_mode.approved.txt
│ ├── test_localnet_start.test_localnet_start_with_old_docker_compose_version.approved.txt
│ ├── test_localnet_start.test_localnet_start_with_unparseable_docker_compose_version.approved.txt
│ ├── test_localnet_start.test_localnet_start_without_docker.approved.txt
│ ├── test_localnet_start.test_localnet_start_without_docker_compose.approved.txt
│ ├── test_localnet_start.test_localnet_start_without_docker_engine_running.approved.txt
│ ├── test_localnet_status.py
│ ├── test_localnet_status.test_localnet_status_docker_error.approved.txt
│ ├── test_localnet_status.test_localnet_status_failure.approved.txt
│ ├── test_localnet_status.test_localnet_status_http_error.approved.txt
│ ├── test_localnet_status.test_localnet_status_missing_service.approved.txt
│ ├── test_localnet_status.test_localnet_status_no_existing_definition.approved.txt
│ ├── test_localnet_status.test_localnet_status_service_not_started.approved.txt
│ ├── test_localnet_status.test_localnet_status_successful.approved.txt
│ ├── test_localnet_status.test_localnet_status_unexpected_port.approved.txt
│ ├── test_localnet_status.test_localnet_status_without_docker.approved.txt
│ ├── test_localnet_status.test_localnet_status_without_docker_compose.approved.txt
│ ├── test_localnet_status.test_localnet_status_without_docker_engine_running.approved.txt
│ ├── test_localnet_stop.py
│ ├── test_localnet_stop.test_localnet_stop.approved.txt
│ ├── test_localnet_stop.test_localnet_stop_failure.approved.txt
│ ├── test_localnet_stop.test_localnet_stop_no_existing_definition.approved.txt
│ ├── test_localnet_stop.test_localnet_stop_with_name.approved.txt
│ ├── test_localnet_stop.test_localnet_stop_without_docker.approved.txt
│ ├── test_localnet_stop.test_localnet_stop_without_docker_compose.approved.txt
│ ├── test_localnet_stop.test_localnet_stop_without_docker_engine_running.approved.txt
│ ├── test_sandbox.py
│ ├── test_sandbox.test_algod_network_template_json.approved.txt
│ ├── test_sandbox.test_get_conduit_yaml.approved.txt
│ ├── test_sandbox.test_get_config_json.approved.txt
│ └── test_sandbox.test_get_docker_compose_yml.approved.txt
├── portability/
│ └── test_pyinstaller_binary.py
├── project/
│ ├── __init__.py
│ ├── bootstrap/
│ │ ├── __init__.py
│ │ ├── test_bootstrap.py
│ │ ├── test_bootstrap.test_bootstrap_help.approved.txt
│ │ ├── test_bootstrap_all.py
│ │ ├── test_bootstrap_all.test_bootstrap_all_algokit_min_version.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_algokit_min_version_ignore_error.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_empty.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_env.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_npm[linux].approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_npm[macOS].approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_npm[windows].approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_poetry.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_poetry_via_pyproject.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_projects_filter.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_projects_filter_not_found.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_projects_name_filter.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_projects_name_filter_not_found.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_projects_type_filter.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_projects_type_filter_not_found.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_skip_dirs.approved.txt
│ │ ├── test_bootstrap_all.test_bootstrap_all_sub_dir.approved.txt
│ │ ├── test_bootstrap_env.py
│ │ ├── test_bootstrap_env.test_bootstrap_env_dotenv_different_prompt_scenarios.approved.txt
│ │ ├── test_bootstrap_env.test_bootstrap_env_dotenv_exists.approved.txt
│ │ ├── test_bootstrap_env.test_bootstrap_env_dotenv_missing_template_exists.approved.txt
│ │ ├── test_bootstrap_env.test_bootstrap_env_dotenv_with_values.approved.txt
│ │ ├── test_bootstrap_env.test_bootstrap_env_multiple_templates.approved.txt
│ │ ├── test_bootstrap_env.test_bootstrap_env_no_files.approved.txt
│ │ ├── test_bootstrap_env.test_bootstrap_network_prefixed_env_dotenv_exists.approved.txt
│ │ ├── test_bootstrap_env.test_bootstrap_network_prefixed_envs..env.approved.txt
│ │ ├── test_bootstrap_env.test_bootstrap_network_prefixed_envs..env.localnet.approved.txt
│ │ ├── test_bootstrap_env.test_bootstrap_network_prefixed_envs..env.localnet.template.approved.txt
│ │ ├── test_bootstrap_env.test_bootstrap_network_prefixed_envs..env.template.approved.txt
│ │ ├── test_bootstrap_npm.py
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_ci_mode_with_lock_file[linux].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_ci_mode_with_lock_file[macOS].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_ci_mode_with_lock_file[windows].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_ci_mode_without_lock_file[linux].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_ci_mode_without_lock_file[macOS].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_ci_mode_without_lock_file[windows].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_happy_path[linux].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_happy_path[macOS].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_happy_path[windows].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_without_npm[linux].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_without_npm[macOS].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_without_npm[windows].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_without_npm_and_package_file[linux].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_without_npm_and_package_file[macOS].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_without_npm_and_package_file[windows].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_without_package_file[linux].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_without_package_file[macOS].approved.txt
│ │ ├── test_bootstrap_npm.test_bootstrap_npm_without_package_file[windows].approved.txt
│ │ ├── test_bootstrap_package_manager_selection.py
│ │ ├── test_bootstrap_package_manager_selection.test_bootstrap_respects_configured_package_managers[linux].approved.txt
│ │ ├── test_bootstrap_package_manager_selection.test_bootstrap_respects_configured_package_managers[macOS].approved.txt
│ │ ├── test_bootstrap_package_manager_selection.test_bootstrap_respects_configured_package_managers[windows].approved.txt
│ │ ├── test_bootstrap_package_manager_selection.test_interactive_prompt_fallback_with_preference_saving.approved.txt
│ │ ├── test_bootstrap_package_manager_selection.test_project_override_takes_precedence_over_user_preference.approved.txt
│ │ ├── test_bootstrap_package_manager_selection.test_project_override_takes_precedence_over_user_preference[linux].approved.txt
│ │ ├── test_bootstrap_package_manager_selection.test_project_override_takes_precedence_over_user_preference[macOS].approved.txt
│ │ ├── test_bootstrap_package_manager_selection.test_project_override_takes_precedence_over_user_preference[windows].approved.txt
│ │ ├── test_bootstrap_package_manager_selection.test_smart_defaults_when_no_user_preference.approved.txt
│ │ ├── test_bootstrap_pnpm.py
│ │ ├── test_bootstrap_pnpm.test_bootstrap_pnpm_ci_mode_without_lock_file.approved.txt
│ │ ├── test_bootstrap_pnpm.test_bootstrap_pnpm_happy_path[linux].approved.txt
│ │ ├── test_bootstrap_pnpm.test_bootstrap_pnpm_happy_path[macOS].approved.txt
│ │ ├── test_bootstrap_pnpm.test_bootstrap_pnpm_happy_path[windows].approved.txt
│ │ ├── test_bootstrap_pnpm.test_bootstrap_pnpm_without_package_file.approved.txt
│ │ ├── test_bootstrap_poetry.py
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_with_poetry.approved.txt
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_without_poetry.approved.txt
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_without_poetry_failed_install.approved.txt
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_without_poetry_failed_poetry_path.approved.txt
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_without_poetry_or_pipx_path[no_system_pythons].approved.txt
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_without_poetry_or_pipx_path[python3_only].approved.txt
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_without_poetry_or_pipx_path[python_and_python3].approved.txt
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_without_poetry_or_pipx_path[python_only].approved.txt
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_without_poetry_or_pipx_path_failed_install.approved.txt
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_without_poetry_or_pipx_path_failed_poetry_path.approved.txt
│ │ ├── test_bootstrap_poetry.test_bootstrap_poetry_without_poetry_or_pipx_path_or_pipx_module.approved.txt
│ │ ├── test_bootstrap_translation.py
│ │ ├── test_bootstrap_uv.py
│ │ ├── test_bootstrap_uv.test_bootstrap_uv_happy_path.approved.txt
│ │ ├── test_bootstrap_uv.test_bootstrap_uv_poetry_project_migration_declined.approved.txt
│ │ ├── test_bootstrap_uv.test_bootstrap_uv_user_declines_install.approved.txt
│ │ └── test_precedence_hierarchy.py
│ ├── deploy/
│ │ ├── __init__.py
│ │ ├── test_deploy.py
│ │ ├── test_deploy.test_algokit_config_empty_array.approved.txt
│ │ ├── test_deploy.test_algokit_config_invalid_syntax.approved.txt
│ │ ├── test_deploy.test_algokit_config_name_no_base.approved.txt
│ │ ├── test_deploy.test_algokit_config_name_overrides.approved.txt
│ │ ├── test_deploy.test_algokit_deploy_only_base_deploy_config.approved.txt
│ │ ├── test_deploy.test_algokit_env_and_name_correct_set.approved.txt
│ │ ├── test_deploy.test_algokit_env_name_missing.approved.txt
│ │ ├── test_deploy.test_ci_flag_interactivity_mode_via_cli.approved.txt
│ │ ├── test_deploy.test_ci_flag_interactivity_mode_via_env.approved.txt
│ │ ├── test_deploy.test_command_bad_exit_code.approved.txt
│ │ ├── test_deploy.test_command_invocation_and_command_splitting.approved.txt
│ │ ├── test_deploy.test_command_not_executable.approved.txt
│ │ ├── test_deploy.test_command_not_found_and_no_config.approved.txt
│ │ ├── test_deploy.test_command_splitting_from_config.approved.txt
│ │ ├── test_deploy.test_command_without_splitting_from_config.approved.txt
│ │ ├── test_deploy.test_deploy_custom_project_dir.approved.txt
│ │ ├── test_deploy.test_deploy_dispenser_alias.deployer.approved.txt
│ │ ├── test_deploy.test_deploy_dispenser_alias.dispenser.approved.txt
│ │ ├── test_deploy.test_deploy_shutil_command_not_found.approved.txt
│ │ ├── test_deploy.test_deploy_windows_command_not_found.approved.txt
│ │ ├── test_deploy.test_deploy_with_extra_args.approved.txt
│ │ ├── test_deploy.test_deploy_with_extra_args_and_custom_command.approved.txt
│ │ └── test_deploy.test_secrets_prompting_via_stdin.approved.txt
│ ├── link/
│ │ ├── application.json
│ │ ├── test_link.py
│ │ ├── test_link.test_link_command_all_success.approved.txt
│ │ ├── test_link.test_link_command_by_name_success.approved.txt
│ │ ├── test_link.test_link_command_empty_folder.approved.txt
│ │ ├── test_link.test_link_command_multiple_names_no_specs_success.approved.txt
│ │ ├── test_link.test_link_command_multiple_names_success.approved.txt
│ │ ├── test_link.test_link_command_name_not_found.approved.txt
│ │ ├── test_link.test_link_runtime_error.approved.txt
│ │ └── test_link.test_list_command_from_workspace_success.approved.txt
│ ├── list/
│ │ ├── test_list.py
│ │ ├── test_list.test_list_command_from_empty_folder.approved.txt
│ │ ├── test_list.test_list_command_from_workspace_success.approved.txt
│ │ ├── test_list.test_list_command_no_args.approved.txt
│ │ ├── test_list.test_list_command_verbose_from_workspace_success.approved.txt
│ │ └── test_list.test_run_command_from_workspace_success.approved.txt
│ └── run/
│ ├── __init__.py
│ ├── test_run.py
│ ├── test_run.test_list_all_commands_in_workspace.approved.txt
│ ├── test_run.test_run_command_from_standalone.approved.txt
│ ├── test_run.test_run_command_from_standalone_execution_error.approved.txt
│ ├── test_run.test_run_command_from_standalone_pass_env.approved.txt
│ ├── test_run.test_run_command_from_standalone_resolution_error.approved.txt
│ ├── test_run.test_run_command_from_standalone_with_extra_args.approved.txt
│ ├── test_run.test_run_command_from_workspace_execution_error.approved.txt
│ ├── test_run.test_run_command_from_workspace_filtered.approved.txt
│ ├── test_run.test_run_command_from_workspace_filtered_no_project.approved.txt
│ ├── test_run.test_run_command_from_workspace_resolution_error.approved.txt
│ ├── test_run.test_run_command_from_workspace_sequential_success.approved.txt
│ ├── test_run.test_run_command_from_workspace_success.approved.txt
│ ├── test_run.test_run_command_from_workspace_with_extra_args.approved.txt
│ ├── test_run.test_run_command_from_workspace_with_extra_args_and_project_filter.approved.txt
│ └── test_run.test_run_command_help_works_without_path_resolution.approved.txt
├── tasks/
│ ├── TestAddAlias.test_wallet_add_account_successful.approved.txt
│ ├── TestAddAlias.test_wallet_add_address_successful.approved.txt
│ ├── TestAddAlias.test_wallet_add_alias_exists.approved.txt
│ ├── TestAddAlias.test_wallet_add_alias_generic_error.approved.txt
│ ├── TestAddAlias.test_wallet_add_alias_limit_error.approved.txt
│ ├── TestAddAlias.test_wallet_add_alias_mnemonic_differs.approved.txt
│ ├── TestAddAlias.test_wallet_add_invalid_address.approved.txt
│ ├── TestGetAlias.test_wallet_get_alias_not_found.approved.txt
│ ├── TestGetAlias.test_wallet_get_alias_successful.approved.txt
│ ├── TestIpfsLogin.test_ipfs_login_exists.approved.txt
│ ├── TestIpfsLogin.test_ipfs_login_successful.approved.txt
│ ├── TestIpfsLogout.test_ipfs_logout.approved.txt
│ ├── TestIpfsUpload.test_ipfs_upload_http_error.approved.txt
│ ├── TestIpfsUpload.test_ipfs_upload_successful.approved.txt
│ ├── TestListAliases.test_wallet_list_aliases_not_found.approved.txt
│ ├── TestListAliases.test_wallet_list_aliases_successful.approved.txt
│ ├── TestRemoveAlias.test_wallet_remove_alias_generic_error.approved.txt
│ ├── TestRemoveAlias.test_wallet_remove_alias_not_found.approved.txt
│ ├── TestRemoveAlias.test_wallet_remove_alias_successful.approved.txt
│ ├── TestResetAliases.test_wallet_reset_aliases_generic_error.approved.txt
│ ├── TestResetAliases.test_wallet_reset_aliases_not_found.approved.txt
│ ├── TestResetAliases.test_wallet_reset_aliases_successful.approved.txt
│ ├── __init__.py
│ ├── conftest.py
│ ├── test_analyze.py
│ ├── test_analyze.test_analyze_abort_disclaimer.approved.txt
│ ├── test_analyze.test_analyze_diff_flag.approved.txt
│ ├── test_analyze.test_analyze_diff_flag_missing_old_report.approved.txt
│ ├── test_analyze.test_analyze_error_in_tealer.approved.txt
│ ├── test_analyze.test_analyze_error_no_pipx.approved.txt
│ ├── test_analyze.test_analyze_multiple_files.approved.txt
│ ├── test_analyze.test_analyze_multiple_files_recursive.approved.txt
│ ├── test_analyze.test_analyze_single_file.approved.txt
│ ├── test_analyze.test_analyze_skipping_tmpl_vars.approved.txt
│ ├── test_analyze.test_exclude_vulnerabilities.approved.txt
│ ├── test_asset.py
│ ├── test_asset.test_opt_in_invalid_network.approved.txt
│ ├── test_asset.test_opt_in_no_args.approved.txt
│ ├── test_asset.test_opt_in_of_assets_from_account_alias_successful.approved.txt
│ ├── test_asset.test_opt_in_to_assets_from_account_address_failed.approved.txt
│ ├── test_asset.test_opt_in_to_assets_from_account_address_successful.approved.txt
│ ├── test_asset.test_opt_out_assets_from_account_address_failed.approved.txt
│ ├── test_asset.test_opt_out_invalid_network.approved.txt
│ ├── test_asset.test_opt_out_no_args.approved.txt
│ ├── test_asset.test_opt_out_of_all_assets_from_account_address_successful.approved.txt
│ ├── test_asset.test_opt_out_of_assets_from_account_address_successful.approved.txt
│ ├── test_asset.test_opt_out_of_assets_from_account_alias_successful.approved.txt
│ ├── test_ipfs.py
│ ├── test_mint.py
│ ├── test_mint.test_mint_token_acfg_token_metadata_mismatch.approved.txt
│ ├── test_mint.test_mint_token_generic_error.approved.txt
│ ├── test_mint.test_mint_token_no_pinata_jwt_error.approved.txt
│ ├── test_mint.test_mint_token_pinata_error.approved.txt
│ ├── test_mint.test_mint_token_successful.address.False.localnet.approved.txt
│ ├── test_mint.test_mint_token_successful.address.False.mainnet.approved.txt
│ ├── test_mint.test_mint_token_successful.address.False.testnet.approved.txt
│ ├── test_mint.test_mint_token_successful.alias.True.localnet.approved.txt
│ ├── test_mint.test_mint_token_successful.alias.True.mainnet.approved.txt
│ ├── test_mint.test_mint_token_successful.alias.True.testnet.approved.txt
│ ├── test_mint.test_mint_token_successful_on_decimals.decimals_given_params.approved.txt
│ ├── test_mint.test_mint_token_successful_on_decimals.no_decimals_given.approved.txt
│ ├── test_nfd_lookup.py
│ ├── test_nfd_lookup.test_nfd_lookup_by_address_success.approved.txt
│ ├── test_nfd_lookup.test_nfd_lookup_by_domain_success.approved.txt
│ ├── test_send_transaction.py
│ ├── test_send_transaction.test_decoding_error.approved.txt
│ ├── test_send_transaction.test_file_decoding_no_txn_error.approved.txt
│ ├── test_send_transaction.test_mutually_exclusive_options.approved.txt
│ ├── test_send_transaction.test_send_atomic_txn_group_successful.approved.txt
│ ├── test_send_transaction.test_send_from_file_successful.approved.txt
│ ├── test_send_transaction.test_send_from_piped_input_successful.approved.txt
│ ├── test_send_transaction.test_send_from_transaction_successful.approved.txt
│ ├── test_sign_transaction.py
│ ├── test_sign_transaction.test_file_decoding_errors.approved.txt
│ ├── test_sign_transaction.test_mutually_exclusive_options.approved.txt
│ ├── test_sign_transaction.test_sign_atomic_txn_group_successful.approved.txt
│ ├── test_sign_transaction.test_sign_from_stdin_with_address_successful.approved.txt
│ ├── test_sign_transaction.test_sign_from_stdin_with_alias_successful.approved.txt
│ ├── test_sign_transaction.test_sign_many_from_file_with_address_successful.approved.txt
│ ├── test_sign_transaction.test_sign_many_from_file_with_alias_successful.approved.txt
│ ├── test_sign_transaction.test_transaction_decoding_errors.approved.txt
│ ├── test_transfer.py
│ ├── test_transfer.test_transfer_algo_from_address_successful.approved.txt
│ ├── test_transfer.test_transfer_algo_from_alias_successful.approved.txt
│ ├── test_transfer.test_transfer_algo_successful.approved.txt
│ ├── test_transfer.test_transfer_asset_from_address_successful.approved.txt
│ ├── test_transfer.test_transfer_asset_from_address_to_alias_successful.approved.txt
│ ├── test_transfer.test_transfer_asset_from_alias_successful.approved.txt
│ ├── test_transfer.test_transfer_failed.approved.txt
│ ├── test_transfer.test_transfer_invalid_receiver_account.approved.txt
│ ├── test_transfer.test_transfer_invalid_sender_accoount.approved.txt
│ ├── test_transfer.test_transfer_invalid_sender_account.approved.txt
│ ├── test_transfer.test_transfer_no_amount.approved.txt
│ ├── test_transfer.test_transfer_no_args.approved.txt
│ ├── test_transfer.test_transfer_no_option.approved.txt
│ ├── test_transfer.test_transfer_on_mainnet.approved.txt
│ ├── test_transfer.test_transfer_on_testnet.approved.txt
│ ├── test_vanity_address.py
│ ├── test_vanity_address.test_vanity_address_invalid_input_on_alias.approved.txt
│ ├── test_vanity_address.test_vanity_address_invalid_input_on_file.approved.txt
│ ├── test_vanity_address.test_vanity_address_invalid_keyword.approved.txt
│ ├── test_vanity_address.test_vanity_address_no_options.approved.txt
│ └── test_wallet.py
├── test_root.py
├── test_root.test_help.approved.txt
├── utils/
│ ├── __init__.py
│ ├── app_dir_mock.py
│ ├── approvals.py
│ ├── click_invoker.py
│ ├── proc_mock.py
│ └── which_mock.py
└── version_check/
├── __init__.py
├── test_version_check.py
├── test_version_check.test_version_check_disable_version_check.approved.txt
├── test_version_check.test_version_check_enable_version_check.approved.txt
├── test_version_check.test_version_check_queries_github_when_cache_out_of_date.approved.txt
├── test_version_check.test_version_check_queries_github_when_no_cache.approved.txt
├── test_version_check.test_version_check_respects_disable_config.approved.txt
├── test_version_check.test_version_check_respects_skip_option.approved.txt
└── test_version_check.test_version_check_uses_cache.approved.txt
SYMBOL INDEX (1176 symbols across 128 files)
FILE: src/algokit/cli/__init__.py
class CustomGroup (line 24) | class CustomGroup(click.Group):
method get_command (line 25) | def get_command(self, ctx: click.Context, cmd_name: str) -> click.Comm...
function algokit (line 48) | def algokit(*, skip_version_check: bool) -> None:
FILE: src/algokit/cli/codespace.py
function _validate_run_timeout (line 26) | def _validate_run_timeout(_ctx: click.Context, _param: click.Parameter, ...
function codespace_command (line 88) | def codespace_command( # noqa: PLR0913
FILE: src/algokit/cli/common/constants.py
class StringEnum (line 9) | class StringEnum(str, Enum):
method __str__ (line 10) | def __str__(self) -> str:
method to_list (line 14) | def to_list(cls) -> list[str]:
class ExplorerEntityType (line 18) | class ExplorerEntityType(StringEnum):
class AlgorandNetwork (line 28) | class AlgorandNetwork(StringEnum):
FILE: src/algokit/cli/common/utils.py
class MutuallyExclusiveOption (line 13) | class MutuallyExclusiveOption(click.Option):
method __init__ (line 45) | def __init__(self, *args: t.Any, **kwargs: t.Any) -> None:
method handle_parse_result (line 54) | def handle_parse_result(
function get_explorer_url (line 88) | def get_explorer_url(identifier: str | int, network: str, entity_type: E...
function sanitize_extra_args (line 108) | def sanitize_extra_args(extra_args: t.Sequence[str]) -> tuple[str, ...]:
FILE: src/algokit/cli/compile.py
function compile_group (line 33) | def compile_group(context: click.Context, version: str | None) -> None:
FILE: src/algokit/cli/compilers/python.py
function invoke_puyapy (line 15) | def invoke_puyapy(context: click.Context, puyapy_args: list[str]) -> None:
function common_puyapy_command_options (line 39) | def common_puyapy_command_options(function: _AnyCallable) -> click.Command:
function python (line 52) | def python(context: click.Context, puyapy_args: list[str]) -> None:
function py (line 57) | def py(context: click.Context, puyapy_args: list[str]) -> None:
FILE: src/algokit/cli/compilers/typescript.py
function invoke_puyats (line 16) | def invoke_puyats(context: click.Context, puyats_args: list[str]) -> None:
function common_puyats_command_options (line 40) | def common_puyats_command_options(function: _AnyCallable) -> click.Command:
function typescript (line 53) | def typescript(context: click.Context, puyats_args: list[str]) -> None:
function ts (line 58) | def ts(context: click.Context, puyats_args: list[str]) -> None:
FILE: src/algokit/cli/completions.py
function completions_group (line 17) | def completions_group() -> None:
function install (line 31) | def install(shell: str | None) -> None:
function uninstall (line 43) | def uninstall(shell: str | None) -> None:
class ShellCompletion (line 51) | class ShellCompletion:
method __init__ (line 52) | def __init__(self, shell: str | None) -> None:
method install (line 60) | def install(self) -> None:
method uninstall (line 72) | def uninstall(self) -> None:
method source (line 80) | def source(self) -> str:
method _save_source (line 101) | def _save_source(self) -> None:
method _remove_source (line 107) | def _remove_source(self) -> None:
method _insert_profile_line (line 111) | def _insert_profile_line(self) -> bool:
method _remove_profile_line (line 126) | def _remove_profile_line(self) -> bool:
function _get_home_based_path (line 143) | def _get_home_based_path(path: Path) -> Path:
function _get_current_shell (line 153) | def _get_current_shell() -> str:
FILE: src/algokit/cli/config.py
function config_group (line 10) | def config_group() -> None:
FILE: src/algokit/cli/dispenser.py
class DispenserAsset (line 27) | class DispenserAsset:
class OutputMode (line 33) | class OutputMode(enum.Enum):
class DispenserAssetName (line 38) | class DispenserAssetName(enum.IntEnum):
function _handle_ci_token (line 55) | def _handle_ci_token(output_mode: str, output_filename: str, token_data:...
class DispenserGroup (line 72) | class DispenserGroup(click.Group):
method get_command (line 73) | def get_command(self, ctx: click.Context, cmd_name: str) -> click.Comm...
function dispenser_group (line 86) | def dispenser_group() -> None:
function logout_command (line 91) | def logout_command() -> None:
function login_command (line 129) | def login_command(*, ci: bool, output_mode: str, output_filename: str) -...
function fund_command (line 171) | def fund_command(*, receiver: str, amount: int, whole_units: bool) -> None:
function refund_command (line 205) | def refund_command(*, tx_id: str) -> None:
function get_fund_limit (line 226) | def get_fund_limit(*, whole_units: bool) -> None:
FILE: src/algokit/cli/doctor.py
function doctor_command (line 40) | def doctor_command(*, copy_to_clipboard: bool) -> None: # noqa: C901, P...
function _get_algokit_version_output (line 167) | def _get_algokit_version_output() -> DoctorResult:
function _get_production_dependencies (line 181) | def _get_production_dependencies() -> dict[str, str]:
FILE: src/algokit/cli/explore.py
class NetworkConfigurationRequired (line 14) | class NetworkConfigurationRequired(TypedDict):
class NetworkConfiguration (line 19) | class NetworkConfiguration(NetworkConfigurationRequired, total=False):
function get_algokit_url (line 79) | def get_algokit_url(network: str) -> str:
function get_explore_url (line 83) | def get_explore_url(network: str) -> str:
function explore_command (line 99) | def explore_command(network: str) -> None:
FILE: src/algokit/cli/generate.py
function _load_custom_generate_commands (line 15) | def _load_custom_generate_commands(project_dir: Path) -> dict[str, click...
class GeneratorGroup (line 86) | class GeneratorGroup(click.Group):
method get_command (line 87) | def get_command(self, ctx: click.Context, cmd_name: str) -> click.Comm...
method list_commands (line 96) | def list_commands(self, ctx: click.Context) -> list[str]:
function generate_group (line 105) | def generate_group() -> None:
function generate_client (line 149) | def generate_client(
function _is_help_flag (line 206) | def _is_help_flag(value: str | Path) -> bool:
FILE: src/algokit/cli/goal.py
function goal_command (line 38) | def goal_command(*, console: bool, interactive: bool, goal_args: list[st...
FILE: src/algokit/cli/init/__init__.py
function init_group (line 105) | def init_group( # noqa: PLR0913
FILE: src/algokit/cli/init/command.py
function _get_default_answers (line 53) | def _get_default_answers() -> dict[str, str]:
class TemplatePresetType (line 61) | class TemplatePresetType(str, Enum):
class ContractLanguage (line 72) | class ContractLanguage(Enum):
function _prevent_workspace_nesting (line 94) | def _prevent_workspace_nesting(*, workspace_path: Path | None, project_p...
function initialize_new_project (line 107) | def initialize_new_project( # noqa: PLR0913, C901, PLR0915
function _maybe_bootstrap (line 257) | def _maybe_bootstrap(
function _maybe_git_init (line 285) | def _maybe_git_init(project_path: Path, *, use_git: bool | None, commit_...
function _maybe_move_github_folder (line 290) | def _maybe_move_github_folder(*, project_path: Path, use_workspace: bool...
function _fail_and_bail (line 336) | def _fail_and_bail() -> NoReturn:
function _repo_url_is_valid (line 341) | def _repo_url_is_valid(url: str) -> bool:
class DirectoryNameValidator (line 354) | class DirectoryNameValidator(questionary.Validator):
method __init__ (line 355) | def __init__(self, base_path: Path) -> None:
method validate (line 358) | def validate(self, document: prompt_toolkit.document.Document) -> None:
function _get_project_path (line 372) | def _get_project_path(*, directory_name_option: str | None = None, force...
function _get_template (line 413) | def _get_template(
class GitRepoValidator (line 446) | class GitRepoValidator(questionary.Validator):
method validate (line 447) | def validate(self, document: prompt_toolkit.document.Document) -> None:
function _get_template_interactive (line 453) | def _get_template_interactive() -> TemplateSource:
function _should_attempt_git_init (line 516) | def _should_attempt_git_init(*, use_git_option: bool | None, project_pat...
function _git_init (line 539) | def _git_init(project_path: Path, commit_message: str) -> None:
function _resolve_workspace_project_path (line 556) | def _resolve_workspace_project_path(
function _init_base_template (line 601) | def _init_base_template(*, target_path: Path, is_blessed: bool) -> None:
FILE: src/algokit/cli/init/example.py
function example_command (line 19) | def example_command(example_id: str, *, list_examples: bool) -> None:
FILE: src/algokit/cli/init/helpers.py
class TemplateKey (line 9) | class TemplateKey(str, Enum):
class TemplateSource (line 23) | class TemplateSource:
method __str__ (line 31) | def __str__(self) -> str:
class BlessedTemplateSource (line 38) | class BlessedTemplateSource(TemplateSource):
method __eq__ (line 41) | def __eq__(self, other: object) -> bool:
method __hash__ (line 46) | def __hash__(self) -> int:
function _get_blessed_templates (line 51) | def _get_blessed_templates() -> dict[TemplateKey, BlessedTemplateSource]:
function _validate_dir_name (line 80) | def _validate_dir_name(context: click.Context, param: click.Parameter, v...
FILE: src/algokit/cli/localnet.py
function localnet_group (line 38) | def localnet_group(ctx: click.Context) -> None:
function config_command (line 94) | def config_command(*, engine: str | None, force: bool) -> None:
function start_localnet (line 169) | def start_localnet(
function stop_localnet (line 216) | def stop_localnet() -> None:
function reset_localnet (line 242) | def reset_localnet(*, update: bool, config_path: Path | None, check: boo...
function localnet_status (line 281) | def localnet_status(*, check: bool) -> None:
function localnet_console (line 330) | def localnet_console(context: click.Context) -> None:
function localnet_explore (line 336) | def localnet_explore(context: click.Context) -> None:
function localnet_logs (line 357) | def localnet_logs(ctx: click.Context, *, follow: bool, tail: str) -> None:
FILE: src/algokit/cli/project/__init__.py
function project_group (line 19) | def project_group() -> None:
FILE: src/algokit/cli/project/bootstrap.py
function bootstrap_group (line 28) | def bootstrap_group(ctx: click.Context, *, force: bool) -> None:
function bootstrap_all (line 72) | def bootstrap_all(*, interactive: bool, project_names: tuple[str], proje...
function env (line 91) | def env(*, interactive: bool) -> None:
function poetry (line 100) | def poetry() -> None:
function uv (line 109) | def uv() -> None:
function npm (line 122) | def npm(*, ci: bool) -> None:
function pnpm (line 136) | def pnpm(*, ci: bool) -> None:
FILE: src/algokit/cli/project/deploy.py
function _ensure_aliases (line 20) | def _ensure_aliases(
function _ensure_environment_secrets (line 54) | def _ensure_environment_secrets(
function _execute_deploy_command (line 83) | def _execute_deploy_command( # noqa: PLR0913
class _CommandParamType (line 135) | class _CommandParamType(click.types.StringParamType):
method convert (line 138) | def convert(
class _DeployCommand (line 152) | class _DeployCommand(click.Command):
method parse_args (line 153) | def parse_args(self, ctx: click.Context, args: list[str]) -> list[str]:
function deploy_command (line 254) | def deploy_command( # noqa: PLR0913
FILE: src/algokit/cli/project/link.py
class ContractArtifacts (line 19) | class ContractArtifacts:
function _is_frontend (line 31) | def _is_frontend(project_data: dict) -> bool:
function _get_contract_projects (line 43) | def _get_contract_projects() -> list[ContractArtifacts]:
function _link_projects (line 69) | def _link_projects(
function _prompt_contract_project (line 104) | def _prompt_contract_project() -> ContractArtifacts | None:
function _select_contract_projects_to_link (line 124) | def _select_contract_projects_to_link(
function link_command (line 199) | def link_command(
FILE: src/algokit/cli/project/list.py
function _is_workspace (line 20) | def _is_workspace(workspace_path: Path | None = None) -> bool:
function list_command (line 32) | def list_command(*, workspace_path: Path) -> None:
FILE: src/algokit/cli/project/run.py
function _load_project_commands (line 21) | def _load_project_commands(project_dir: Path) -> dict[str, click.Command]:
class RunCommandGroup (line 152) | class RunCommandGroup(click.Group):
method get_command (line 160) | def get_command(self, ctx: click.Context, cmd_name: str) -> click.Comm...
method list_commands (line 178) | def list_commands(self, ctx: click.Context) -> list[str]:
function run_group (line 196) | def run_group() -> None:
FILE: src/algokit/cli/task.py
class AliasedGroup (line 19) | class AliasedGroup(click.Group):
method get_command (line 20) | def get_command(self, ctx: click.Context, cmd_name: str) -> click.Comm...
function task_group (line 32) | def task_group() -> None:
FILE: src/algokit/cli/tasks/analyze.py
function display_analysis_summary (line 24) | def display_analysis_summary(analysis_results: dict) -> None:
function has_template_vars (line 48) | def has_template_vars(path: Path) -> bool:
function get_input_files (line 62) | def get_input_files(*, input_paths: tuple[Path], recursive: bool) -> lis...
function analyze (line 151) | def analyze( # noqa: PLR0913, C901
FILE: src/algokit/cli/tasks/assets.py
function _get_zero_balanced_assets (line 21) | def _get_zero_balanced_assets(
function opt_in_command (line 52) | def opt_in_command(asset_ids: tuple[int], account: str, network: Algoran...
function opt_out_command (line 108) | def opt_out_command(*, asset_ids: tuple[int], account: str, network: Alg...
FILE: src/algokit/cli/tasks/ipfs.py
function ipfs_group (line 25) | def ipfs_group() -> None:
function login_command (line 30) | def login_command() -> None:
function logout_command (line 45) | def logout_command() -> None:
function upload (line 72) | def upload(file_path: Path, name: str | None) -> None:
FILE: src/algokit/cli/tasks/mint.py
function _validate_supply (line 37) | def _validate_supply(total: int, decimals: int) -> None:
function _validate_unit_name (line 57) | def _validate_unit_name(context: click.Context, param: click.Parameter, ...
function _get_and_validate_asset_name (line 78) | def _get_and_validate_asset_name(context: click.Context, param: click.Pa...
function _get_creator_account (line 118) | def _get_creator_account(_: click.Context, __: click.Parameter, value: s...
function _get_and_validate_decimals (line 135) | def _get_and_validate_decimals(context: click.Context, _: click.Paramete...
function _validate_supply_for_nft (line 165) | def _validate_supply_for_nft(context: click.Context, _: click.Parameter,...
function mint (line 285) | def mint( # noqa: PLR0913
FILE: src/algokit/cli/tasks/nfd.py
function is_nfd (line 11) | def is_nfd(value: str) -> bool:
function is_algorand_address (line 15) | def is_algorand_address(value: str) -> bool:
function nfd_lookup (line 39) | def nfd_lookup(
FILE: src/algokit/cli/tasks/send_transaction.py
function _is_sign_task_output_txn (line 23) | def _is_sign_task_output_txn(item: dict) -> bool:
function _load_from_stdin (line 37) | def _load_from_stdin() -> list[SignedTransaction]:
function _get_signed_transactions (line 65) | def _get_signed_transactions(file: Path | None = None, transaction: str ...
function _send_transactions (line 102) | def _send_transactions(network: AlgorandNetwork, txns: list[SignedTransa...
function send (line 158) | def send(*, file: Path | None, transaction: str | None, network: Algoran...
FILE: src/algokit/cli/tasks/sign_transaction.py
class TransactionBytesEncoder (line 17) | class TransactionBytesEncoder(json.JSONEncoder):
method default (line 18) | def default(self, obj: Any) -> Any: # noqa: ANN401
function _validate_for_signed_txns (line 24) | def _validate_for_signed_txns(txns: list[Transaction]) -> None:
function _get_transactions (line 33) | def _get_transactions(file: Path | None, transaction: str | None) -> lis...
function _confirm_transaction (line 47) | def _confirm_transaction(txns: list[Transaction]) -> bool:
function _sign_and_output_transaction (line 67) | def _sign_and_output_transaction(txns: list[Transaction], private_key: s...
function sign (line 107) | def sign(*, account: str, file: Path | None, transaction: str | None, ou...
FILE: src/algokit/cli/tasks/transfer.py
function transfer (line 62) | def transfer( # noqa: PLR0913
FILE: src/algokit/cli/tasks/utils.py
function _validate_asset_balance (line 23) | def _validate_asset_balance(account_info: dict, asset_id: int, decimals:...
function _validate_algo_balance (line 37) | def _validate_algo_balance(account_info: dict, amount: int) -> None:
function get_private_key_from_mnemonic (line 46) | def get_private_key_from_mnemonic() -> str:
function load_algod_client (line 77) | def load_algod_client(network: AlgorandNetwork) -> algosdk.v2client.algo...
function get_asset_decimals (line 102) | def get_asset_decimals(asset_id: int, algod_client: algosdk.v2client.alg...
function validate_balance (line 134) | def validate_balance(
function validate_address (line 163) | def validate_address(address: str) -> None:
function get_account_with_private_key (line 181) | def get_account_with_private_key(address: str) -> SigningAccount:
function get_address (line 212) | def get_address(address: str) -> str:
function stdin_has_content (line 248) | def stdin_has_content() -> bool:
function validate_account_balance_to_opt_in (line 260) | def validate_account_balance_to_opt_in(
function get_account_info (line 294) | def get_account_info(algod_client: algosdk.v2client.algod.AlgodClient, a...
function run_callback_once (line 300) | def run_callback_once(callback: Callable) -> Callable:
FILE: src/algokit/cli/tasks/vanity_address.py
function _validate_inputs (line 14) | def _validate_inputs(
function _store_vanity_to_alias (line 32) | def _store_vanity_to_alias(*, alias: str, vanity_account: VanityAccount,...
function vanity_address (line 102) | def vanity_address( # noqa: PLR0913
FILE: src/algokit/cli/tasks/wallet.py
function _validate_alias_name (line 18) | def _validate_alias_name(alias_name: str) -> None:
function wallet (line 28) | def wallet() -> None:
function add (line 43) | def add(*, alias_name: str, address: str, use_mnemonic: bool, force: boo...
function get (line 80) | def get(alias: str) -> None:
function list_all (line 94) | def list_all() -> None:
function remove (line 120) | def remove(*, alias: str, force: bool) -> None:
function reset (line 145) | def reset(*, force: bool) -> None:
FILE: src/algokit/cli/tui/init/example_selector.py
class ExampleSelector (line 17) | class ExampleSelector(App):
method __init__ (line 28) | def __init__(self) -> None:
method on_mount (line 32) | def on_mount(self) -> None:
FILE: src/algokit/cli/tui/init/screens/example_selector_screen.py
class ChooseExampleScreen (line 15) | class ChooseExampleScreen(Screen):
method __init__ (line 31) | def __init__(self, examples_path: str) -> None:
method compose (line 37) | def compose(self) -> ComposeResult:
method handle_example_selection (line 54) | def handle_example_selection(self, event: ListView.Selected) -> None:
FILE: src/algokit/core/_toml.py
function loads (line 11) | def loads(data: str) -> dict[str, t.Any]:
FILE: src/algokit/core/_vendor/auth0/authentication/token_verifier.py
class TokenValidationError (line 19) | class TokenValidationError(Exception):
class SignatureVerifier (line 23) | class SignatureVerifier:
method __init__ (line 43) | def __init__(self, algorithm: str) -> None:
method _fetch_key (line 48) | def _fetch_key(self, key_id: str) -> str | RSAPublicKey:
method _get_kid (line 60) | def _get_kid(self, token: str) -> str | None:
method _decode_jwt (line 87) | def _decode_jwt(self, token: str, secret_or_certificate: str) -> dict[...
method verify_signature (line 109) | def verify_signature(self, token: str) -> dict[str, Any]:
class SymmetricSignatureVerifier (line 127) | class SymmetricSignatureVerifier(SignatureVerifier):
method __init__ (line 135) | def __init__(self, shared_secret: str, algorithm: str = "HS256") -> None:
method _fetch_key (line 139) | def _fetch_key(self, key_id: str = "") -> str:
class JwksFetcher (line 143) | class JwksFetcher:
method __init__ (line 154) | def __init__(self, jwks_url: str, cache_ttl: int = CACHE_TTL) -> None:
method _init_cache (line 158) | def _init_cache(self, cache_ttl: int) -> None:
method _cache_expired (line 164) | def _cache_expired(self) -> bool:
method _cache_jwks (line 172) | def _cache_jwks(self, jwks: dict[str, Any]) -> None:
method _fetch_jwks (line 182) | def _fetch_jwks(self, force: bool = False) -> dict[str, RSAPublicKey]:
method _parse_jwks (line 202) | def _parse_jwks(jwks: dict[str, Any]) -> dict[str, RSAPublicKey]:
method get_key (line 215) | def get_key(self, key_id: str) -> RSAPublicKey:
class AsymmetricSignatureVerifier (line 239) | class AsymmetricSignatureVerifier(SignatureVerifier):
method __init__ (line 248) | def __init__(
method _fetch_key (line 257) | def _fetch_key(self, key_id: str) -> RSAPublicKey:
class TokenVerifier (line 261) | class TokenVerifier:
method __init__ (line 273) | def __init__(
method verify (line 289) | def verify(
method _verify_payload (line 325) | def _verify_payload(
FILE: src/algokit/core/atomic_write.py
function atomic_write (line 9) | def atomic_write(file_contents: str, target_file_path: Path, mode: Liter...
function _copy_with_metadata (line 27) | def _copy_with_metadata(source: Path, target: Path) -> None:
FILE: src/algokit/core/codespace.py
function _is_port_in_use (line 33) | def _is_port_in_use(port: int) -> bool:
function _find_next_available_port (line 40) | def _find_next_available_port(start_port: int, ignore_ports: list[int]) ...
function _try_forward_ports_once (line 47) | def _try_forward_ports_once(ports: list[tuple[int, int]], codespace_name...
function _write_temp_script (line 74) | def _write_temp_script(script_content: str, script_extension: str) -> Path:
function _run_powershell_script (line 85) | def _run_powershell_script(script_path: Path) -> None:
function _run_unix_script (line 97) | def _run_unix_script(script_path: Path) -> None:
function _ensure_command_available (line 105) | def _ensure_command_available(command: list[str], error_message: str) ->...
function _find_available_shell (line 115) | def _find_available_shell() -> str:
function ensure_github_cli_installed (line 136) | def ensure_github_cli_installed() -> None:
function install_github_cli_via_webi (line 159) | def install_github_cli_via_webi() -> None:
function is_github_cli_authenticated (line 176) | def is_github_cli_authenticated() -> bool:
function authenticate_with_github (line 205) | def authenticate_with_github() -> bool:
function list_github_codespaces (line 222) | def list_github_codespaces() -> list[str]:
function forward_ports_for_codespace (line 239) | def forward_ports_for_codespace( # noqa: PLR0913
function delete_codespaces_with_prefix (line 303) | def delete_codespaces_with_prefix(codespaces: list[str], default_name: s...
function is_codespace_ready (line 316) | def is_codespace_ready(codespace_name: str) -> dict[str, Any]:
function delete_codespace (line 353) | def delete_codespace(*, codespace_data: dict[str, Any], force: bool) -> ...
function create_codespace (line 369) | def create_codespace(repo_url: str, codespace_name: str, machine: str, t...
FILE: src/algokit/core/compilers/python.py
function find_valid_puyapy_command (line 7) | def find_valid_puyapy_command(version: str | None) -> list[str]:
function _find_puyapy_command_at_version (line 11) | def _find_puyapy_command_at_version(version: str) -> list[str]:
function _find_puyapy_command (line 41) | def _find_puyapy_command() -> list[str]:
function _get_candidate_puyapy_commands (line 68) | def _get_candidate_puyapy_commands() -> Iterator[list[str]]:
FILE: src/algokit/core/compilers/typescript.py
function find_valid_puyats_command (line 7) | def find_valid_puyats_command(version: str | None) -> list[str]:
function _find_project_puyats_command (line 11) | def _find_project_puyats_command(
function _find_global_puyats_command (line 43) | def _find_global_puyats_command(
function _find_puyats_command (line 52) | def _find_puyats_command(version: str | None) -> list[str]:
FILE: src/algokit/core/conf.py
function get_app_config_dir (line 16) | def get_app_config_dir() -> Path:
function get_app_state_dir (line 28) | def get_app_state_dir() -> Path:
function _get_relative_app_path (line 42) | def _get_relative_app_path(base_dir: str) -> Path:
function get_current_package_version (line 50) | def get_current_package_version() -> str:
function get_algokit_config (line 54) | def get_algokit_config(*, project_dir: Path | None = None, verbose_valid...
FILE: src/algokit/core/config_commands/container_engine.py
class ContainerEngine (line 14) | class ContainerEngine(str, enum.Enum):
method __str__ (line 18) | def __str__(self) -> str:
function get_container_engine (line 22) | def get_container_engine() -> str:
function save_container_engine (line 28) | def save_container_engine(engine: str) -> None:
function container_engine_configuration_command (line 45) | def container_engine_configuration_command(*, engine: str | None, force:...
FILE: src/algokit/core/config_commands/js_package_manager.py
class JSPackageManager (line 13) | class JSPackageManager(str, enum.Enum):
method __str__ (line 17) | def __str__(self) -> str:
function _get_js_config_file (line 21) | def _get_js_config_file() -> Path:
function get_js_package_manager (line 25) | def get_js_package_manager() -> str | None:
function save_js_package_manager (line 36) | def save_js_package_manager(manager: str) -> None:
function js_package_manager_configuration_command (line 45) | def js_package_manager_configuration_command(*, package_manager: str | N...
FILE: src/algokit/core/config_commands/py_package_manager.py
class PyPackageManager (line 13) | class PyPackageManager(str, enum.Enum):
method __str__ (line 17) | def __str__(self) -> str:
function _get_py_config_file (line 21) | def _get_py_config_file() -> Path:
function get_py_package_manager (line 25) | def get_py_package_manager() -> str | None:
function save_py_package_manager (line 36) | def save_py_package_manager(manager: str) -> None:
function py_package_manager_configuration_command (line 45) | def py_package_manager_configuration_command(*, package_manager: str | N...
FILE: src/algokit/core/config_commands/version_prompt.py
function do_version_prompt (line 29) | def do_version_prompt() -> None:
function _get_version_sequence (line 64) | def _get_version_sequence(version: str) -> list[int | str]:
function get_latest_version_or_cached (line 71) | def get_latest_version_or_cached() -> str | None:
function get_latest_github_version (line 97) | def get_latest_github_version() -> str:
function _skip_version_prompt (line 112) | def _skip_version_prompt() -> bool:
function _get_distribution_method (line 117) | def _get_distribution_method() -> str | None:
function version_prompt_configuration_command (line 141) | def version_prompt_configuration_command(*, enable: str | None) -> None:
FILE: src/algokit/core/dispenser.py
class DispenserApiAudiences (line 35) | class DispenserApiAudiences(str, Enum):
class AccountKeyringData (line 41) | class AccountKeyringData:
class ApiConfig (line 48) | class ApiConfig:
class AuthConfig (line 52) | class AuthConfig:
class APIErrorCode (line 69) | class APIErrorCode:
function _get_dispenser_credential (line 84) | def _get_dispenser_credential(key: str) -> str:
function _get_dispenser_credentials (line 97) | def _get_dispenser_credentials() -> AccountKeyringData:
function _get_auth_token (line 112) | def _get_auth_token() -> str:
function _validate_jwt_id_token (line 128) | def _validate_jwt_id_token(id_token: str, audience: str) -> None:
function _get_access_token_rsa_pub_key (line 138) | def _get_access_token_rsa_pub_key(access_token: str) -> rsa.RSAPublicKey:
function _refresh_user_access_token (line 153) | def _refresh_user_access_token() -> None:
function _request_device_code (line 176) | def _request_device_code(api_audience: DispenserApiAudiences, custom_sco...
function _get_hours_until_reset (line 198) | def _get_hours_until_reset(resets_at: str) -> float:
function request_token (line 204) | def request_token(api_audience: DispenserApiAudiences, device_code: str)...
function process_dispenser_request (line 225) | def process_dispenser_request(*, url_suffix: str, data: dict | None = No...
function set_dispenser_credentials (line 271) | def set_dispenser_credentials(token_data: dict[str, str]) -> None:
function clear_dispenser_credentials (line 287) | def clear_dispenser_credentials() -> None:
function is_authenticated (line 298) | def is_authenticated() -> bool:
function revoke_refresh_token (line 338) | def revoke_refresh_token() -> None:
function get_oauth_tokens (line 362) | def get_oauth_tokens(api_audience: DispenserApiAudiences, custom_scopes:...
FILE: src/algokit/core/doctor.py
class DoctorResult (line 14) | class DoctorResult:
function check_dependency (line 20) | def check_dependency(
function _run_command (line 54) | def _run_command(
function _process_version (line 84) | def _process_version(
function _get_version_or_first_non_blank_line (line 123) | def _get_version_or_first_non_blank_line(output: str) -> str:
function _format_exception_only (line 133) | def _format_exception_only(ex: Exception) -> list[str]:
FILE: src/algokit/core/generate.py
class Generator (line 14) | class Generator:
function _format_generator_name (line 20) | def _format_generator_name(name: str) -> str:
function run_generator (line 30) | def run_generator(answers: dict, path: Path) -> None:
function load_generators (line 69) | def load_generators(project_dir: Path) -> list[Generator]:
FILE: src/algokit/core/goal.py
function get_volume_mount_path_docker (line 13) | def get_volume_mount_path_docker() -> Path:
function get_volume_mount_path_local (line 17) | def get_volume_mount_path_local(directory_name: str) -> Path:
function is_path_or_filename (line 28) | def is_path_or_filename(argument: str) -> bool:
function delete_files_from_volume_mount (line 33) | def delete_files_from_volume_mount(filename: str, volume_mount_path_dock...
function list_files_in_volume (line 40) | def list_files_in_volume(volume_path: Path) -> list[str]:
function preprocess_command_args (line 51) | def preprocess_command_args(
function post_process (line 85) | def post_process(input_files: list[Path], output_files: list[Path], volu...
FILE: src/algokit/core/init.py
function populate_default_answers (line 28) | def populate_default_answers(worker: Worker) -> None:
function get_git_user_info (line 58) | def get_git_user_info(param: str) -> str | None:
function is_valid_project_dir_name (line 74) | def is_valid_project_dir_name(value: str) -> bool:
function resolve_vscode_workspace_file (line 83) | def resolve_vscode_workspace_file(project_root: Path | None) -> Path | N...
function append_project_to_vscode_workspace (line 92) | def append_project_to_vscode_workspace(project_path: Path, workspace_pat...
function _load_vscode_workspace (line 125) | def _load_vscode_workspace(workspace_path: Path) -> dict[str, Any]:
function _save_vscode_workspace (line 133) | def _save_vscode_workspace(workspace_path: Path, workspace: dict) -> None:
function _fail_and_bail (line 139) | def _fail_and_bail() -> NoReturn:
function _manage_templates_repository (line 145) | def _manage_templates_repository() -> None:
function _open_ide (line 174) | def _open_ide(project_path: Path, readme_path: Path | None = None, *, op...
function _load_algokit_examples (line 204) | def _load_algokit_examples(examples_config_path: str) -> list[dict]:
FILE: src/algokit/core/log_handlers.py
class ClickHandler (line 23) | class ClickHandler(logging.Handler):
method emit (line 37) | def emit(self, record: logging.LogRecord) -> None:
class NoExceptionFormatter (line 54) | class NoExceptionFormatter(logging.Formatter):
method formatException (line 59) | def formatException(self, *_args: Any) -> str: # noqa: N802
method formatStack (line 62) | def formatStack(self, *_args: Any) -> str: # noqa: N802
class ManualExclusionFilter (line 76) | class ManualExclusionFilter(logging.Filter):
method __init__ (line 77) | def __init__(self, exclude_value: str):
method filter (line 81) | def filter(self, record: logging.LogRecord) -> bool:
function initialise_logging (line 85) | def initialise_logging() -> None:
function uncaught_exception_logging_handler (line 108) | def uncaught_exception_logging_handler(
function _set_verbose (line 119) | def _set_verbose(_ctx: click.Context, _param: click.Option, value: bool)...
function _set_force_styles_to (line 128) | def _set_force_styles_to(ctx: click.Context, _param: click.Option, value...
FILE: src/algokit/core/proc.py
class RunResult (line 17) | class RunResult:
function run (line 23) | def run( # noqa: PLR0913
function run_interactive (line 75) | def run_interactive(
FILE: src/algokit/core/project/__init__.py
class ProjectType (line 12) | class ProjectType(str, Enum):
function _get_subprojects_paths (line 29) | def _get_subprojects_paths(config: dict[str, Any], project_dir: Path) ->...
function get_project_configs (line 60) | def get_project_configs(
function get_project_dir_names_from_workspace (line 124) | def get_project_dir_names_from_workspace(project_dir: Path | None = None...
function get_workspace_project_path (line 148) | def get_workspace_project_path(
FILE: src/algokit/core/project/bootstrap.py
function _has_pyproject_toml (line 62) | def _has_pyproject_toml(project_dir: Path) -> bool:
function _get_py_package_manager_override (line 66) | def _get_py_package_manager_override(project_dir: Path) -> str | None:
function _get_js_package_manager_override (line 76) | def _get_js_package_manager_override(project_dir: Path) -> str | None:
function is_uv_project (line 86) | def is_uv_project(project_dir: Path) -> bool:
function _has_python_project (line 91) | def _has_python_project(project_dir: Path) -> bool:
function _has_javascript_project (line 98) | def _has_javascript_project(project_dir: Path) -> bool:
function _determine_python_package_manager (line 103) | def _determine_python_package_manager(project_dir: Path) -> str:
function _determine_javascript_package_manager (line 146) | def _determine_javascript_package_manager(project_dir: Path) -> str:
function _bootstrap_python_project (line 184) | def _bootstrap_python_project(project_dir: Path, manager: str) -> None:
function _bootstrap_javascript_project (line 194) | def _bootstrap_javascript_project(project_dir: Path, manager: str, *, ci...
function _translate_package_manager_in_toml (line 204) | def _translate_package_manager_in_toml(project_dir: Path, js_manager: st...
function _warn_incompatible_commands (line 240) | def _warn_incompatible_commands(cmd: str, js_manager: str | None, py_man...
function _translate_single_command (line 286) | def _translate_single_command(cmd: str, js_manager: str | None, py_manag...
function bootstrap_any (line 307) | def bootstrap_any(project_dir: Path, *, ci_mode: bool) -> None:
function bootstrap_any_including_subdirs (line 336) | def bootstrap_any_including_subdirs( # noqa: PLR0913
function bootstrap_env (line 371) | def bootstrap_env(project_dir: Path, *, ci_mode: bool) -> None:
function bootstrap_poetry (line 432) | def bootstrap_poetry(project_dir: Path) -> None:
function bootstrap_npm (line 478) | def bootstrap_npm(project_dir: Path, *, ci_mode: bool) -> None:
function bootstrap_pnpm (line 506) | def bootstrap_pnpm(project_dir: Path, *, ci_mode: bool) -> None:
function migrate_pyproject_to_uv (line 533) | def migrate_pyproject_to_uv(project_dir: Path) -> None:
function bootstrap_uv (line 545) | def bootstrap_uv(project_dir: Path) -> None: # noqa: C901
function get_min_algokit_version (line 631) | def get_min_algokit_version(project_dir: Path) -> str | None:
function project_minimum_algokit_version_check (line 645) | def project_minimum_algokit_version_check(project_dir: Path, *, ignore_v...
FILE: src/algokit/core/project/deploy.py
class _KnownEnvironments (line 23) | class _KnownEnvironments:
function load_deploy_env_files (line 56) | def load_deploy_env_files(name: str | None, project_dir: Path) -> dict[s...
class DeployConfig (line 77) | class DeployConfig:
function load_deploy_config (line 82) | def load_deploy_config(name: str | None, project_dir: Path) -> DeployCon...
FILE: src/algokit/core/project/run.py
class ProjectCommand (line 23) | class ProjectCommand:
class WorkspaceProjectCommand (line 44) | class WorkspaceProjectCommand:
function _load_commands_from_standalone (line 60) | def _load_commands_from_standalone(
function _load_commands_from_workspace (line 115) | def _load_commands_from_workspace(
function run_command (line 165) | def run_command(
function run_workspace_command (line 222) | def run_workspace_command(
function load_commands (line 281) | def load_commands(project_dir: Path) -> list[ProjectCommand] | list[Work...
FILE: src/algokit/core/questionary_extensions.py
class NonEmptyValidator (line 9) | class NonEmptyValidator(questionary.Validator):
method validate (line 10) | def validate(self, document: prompt_toolkit.document.Document) -> None:
class ChainedValidator (line 16) | class ChainedValidator(questionary.Validator):
method __init__ (line 17) | def __init__(self, *validators: questionary.Validator):
method validate (line 20) | def validate(self, document: prompt_toolkit.document.Document) -> None:
function prompt_confirm (line 25) | def prompt_confirm(message: str, *, default: bool) -> bool:
function prompt_text (line 37) | def prompt_text(
function prompt_select (line 58) | def prompt_select(
FILE: src/algokit/core/sandbox.py
class ContainerEngine (line 29) | class ContainerEngine(str, enum.Enum):
method __str__ (line 33) | def __str__(self) -> str:
class ComposeFileStatus (line 37) | class ComposeFileStatus(enum.Enum):
function get_min_compose_version (line 43) | def get_min_compose_version() -> str:
class ComposeSandbox (line 50) | class ComposeSandbox:
method __init__ (line 51) | def __init__(self, name: str = SANDBOX_BASE_NAME, config_path: Path | ...
method compose_file_path (line 63) | def compose_file_path(self) -> Path:
method conduit_file_path (line 67) | def conduit_file_path(self) -> Path:
method algod_config_file_path (line 71) | def algod_config_file_path(self) -> Path:
method algod_network_template_file_path (line 75) | def algod_network_template_file_path(self) -> Path:
method from_environment (line 79) | def from_environment(cls) -> ComposeSandbox | None:
method _extract_json_lines (line 103) | def _extract_json_lines(output: str) -> list[str]:
method _create_instance_from_data (line 116) | def _create_instance_from_data(cls, data: list[dict[str, Any]]) -> Com...
method set_algod_dev_mode (line 130) | def set_algod_dev_mode(self, *, dev_mode: bool) -> None:
method is_algod_dev_mode (line 136) | def is_algod_dev_mode(self) -> bool:
method compose_file_status (line 141) | def compose_file_status(self) -> ComposeFileStatus:
method write_compose_file (line 181) | def write_compose_file(self) -> None:
method _run_compose_command (line 187) | def _run_compose_command(
method up (line 200) | def up(self) -> None:
method stop (line 212) | def stop(self) -> None:
method down (line 217) | def down(self) -> None:
method pull (line 221) | def pull(self) -> None:
method logs (line 227) | def logs(self, *, follow: bool = False, no_color: bool = False, tail: ...
method ps (line 241) | def ps(self, service_name: str | None = None) -> list[dict[str, Any]]:
method _get_local_image_versions (line 259) | def _get_local_image_versions(self, image_name: str) -> list[str]:
method _get_latest_image_version (line 271) | def _get_latest_image_version(self, image_name: str) -> str | None:
method is_image_up_to_date (line 286) | def is_image_up_to_date(self, image_name: str) -> bool:
method check_docker_compose_for_new_image_versions (line 291) | def check_docker_compose_for_new_image_versions(self, *, force: bool =...
class ImageVersionCache (line 336) | class ImageVersionCache:
function _get_image_version_cache_path (line 343) | def _get_image_version_cache_path() -> Path:
function _get_image_version_cache (line 348) | def _get_image_version_cache() -> ImageVersionCache | None:
function _should_check_image_versions (line 365) | def _should_check_image_versions() -> bool:
function _update_image_version_cache (line 383) | def _update_image_version_cache(*, indexer_outdated: bool, algod_outdate...
function _wait_for_service (line 393) | def _wait_for_service(
function _wait_for_algod (line 419) | def _wait_for_algod() -> bool:
function _wait_for_indexer (line 430) | def _wait_for_indexer() -> bool:
function get_config_json (line 441) | def get_config_json() -> str:
function get_algod_network_template (line 449) | def get_algod_network_template() -> str:
function get_conduit_yaml (line 505) | def get_conduit_yaml() -> str:
function get_docker_compose_yml (line 557) | def get_docker_compose_yml(
function fetch_algod_status_data (line 626) | def fetch_algod_status_data(service_info: dict[str, Any]) -> dict[str, A...
function fetch_indexer_status_data (line 668) | def fetch_indexer_status_data(service_info: dict[str, Any]) -> dict[str,...
FILE: src/algokit/core/tasks/analyze.py
class TealerBlock (line 21) | class TealerBlock(BaseModel):
class TealerExecutionPath (line 26) | class TealerExecutionPath(BaseModel):
class TealerAnalysisReport (line 37) | class TealerAnalysisReport(BaseModel):
function _extract_line (line 43) | def _extract_line(block: list[str]) -> str:
function _extract_lines (line 47) | def _extract_lines(block: list[list[str]]) -> str:
function generate_report_filename (line 51) | def generate_report_filename(file: Path, duplicate_files: dict[str, int]...
function load_tealer_report (line 58) | def load_tealer_report(file_path: str) -> TealerAnalysisReport:
function prepare_artifacts_folders (line 73) | def prepare_artifacts_folders(output_dir: Path | None) -> None:
function ensure_tealer_installed (line 88) | def ensure_tealer_installed() -> None:
function generate_tealer_command (line 115) | def generate_tealer_command(cur_file: Path, report_output_path: Path, de...
function run_tealer (line 142) | def run_tealer(command: list[str]) -> RunResult:
function has_baseline_diff (line 163) | def has_baseline_diff(*, cur_file: Path, report_output_path: Path, old_r...
function generate_summaries (line 190) | def generate_summaries(reports: dict, detectors_to_exclude: list[str]) -...
FILE: src/algokit/core/tasks/ipfs.py
class PinataError (line 17) | class PinataError(Exception):
method __init__ (line 20) | def __init__(self, response: httpx.Response):
method __str__ (line 24) | def __str__(self) -> str:
class PinataBadRequestError (line 28) | class PinataBadRequestError(PinataError):
class PinataUnauthorizedError (line 32) | class PinataUnauthorizedError(PinataError):
class PinataForbiddenError (line 36) | class PinataForbiddenError(PinataError):
class PinataInternalServerError (line 40) | class PinataInternalServerError(PinataError):
class PinataHttpError (line 44) | class PinataHttpError(PinataError):
function get_pinata_jwt (line 48) | def get_pinata_jwt() -> str | None:
function set_pinata_jwt (line 70) | def set_pinata_jwt(jwt: str | None) -> None:
function upload_to_pinata (line 86) | def upload_to_pinata(file_path: Path, jwt: str, name: str | None = None)...
FILE: src/algokit/core/tasks/mint/mint.py
function _reserve_address_from_cid (line 22) | def _reserve_address_from_cid(cid: str) -> str:
function _create_url_from_cid (line 41) | def _create_url_from_cid(cid: str) -> str:
function _file_integrity (line 68) | def _file_integrity(filename: pathlib.Path) -> str:
function _file_mimetype (line 84) | def _file_mimetype(filename: pathlib.Path) -> str:
function _create_asset_txn (line 98) | def _create_asset_txn(
function mint_token (line 144) | def mint_token( # noqa: PLR0913
FILE: src/algokit/core/tasks/mint/models.py
class Properties (line 12) | class Properties:
class LocalizationIntegrity (line 17) | class LocalizationIntegrity:
class Localization (line 22) | class Localization:
class TokenMetadata (line 30) | class TokenMetadata:
method __post_init__ (line 48) | def __post_init__(self) -> None:
method to_json (line 59) | def to_json(self, indent: int | None = 4) -> str:
method to_file_path (line 65) | def to_file_path(self) -> Path:
method from_json_file (line 77) | def from_json_file(cls, file_path: Path | None, name: str, decimals: i...
class AssetConfigTxnParams (line 94) | class AssetConfigTxnParams:
method to_json (line 113) | def to_json(self, indent: int | None = 4) -> str:
FILE: src/algokit/core/tasks/nfd.py
class NFDMatchType (line 12) | class NFDMatchType(Enum):
function _process_get_request (line 18) | def _process_get_request(url: str) -> dict:
function nfd_lookup_by_address (line 46) | def nfd_lookup_by_address(address: str, view: NFDMatchType) -> str:
function nfd_lookup_by_domain (line 75) | def nfd_lookup_by_domain(domain: str, view: NFDMatchType) -> str:
FILE: src/algokit/core/tasks/vanity_address.py
class MatchType (line 21) | class MatchType(Enum):
class VanityAccount (line 37) | class VanityAccount:
class Counter (line 43) | class Counter:
method __init__ (line 44) | def __init__(self, initial_value: int = 0):
method increment (line 48) | def increment(self, value: int = 1) -> None:
method value (line 53) | def value(self) -> int:
function _log_progress (line 57) | def _log_progress(counter: Counter, start_time: float) -> None:
function _search_for_matching_address (line 78) | def _search_for_matching_address(keyword: str, match: MatchType, counter...
function generate_vanity_address (line 111) | def generate_vanity_address(keyword: str, match: MatchType) -> VanityAcc...
FILE: src/algokit/core/tasks/wallet.py
class WalletAliasKeyringData (line 20) | class WalletAliasKeyringData:
class WalletAliasingLimitError (line 26) | class WalletAliasingLimitError(Exception):
function _get_alias_keys (line 30) | def _get_alias_keys() -> list[str]:
function _update_alias_keys (line 46) | def _update_alias_keys(alias_keys: list[str]) -> None:
function _add_alias_key (line 54) | def _add_alias_key(alias_name: str) -> None:
function _remove_alias_key (line 66) | def _remove_alias_key(alias_name: str) -> None:
function add_alias (line 75) | def add_alias(alias_name: str, address: str, private_key: str | None) ->...
function get_alias (line 108) | def get_alias(alias_name: str) -> WalletAliasKeyringData | None:
function get_aliases (line 137) | def get_aliases() -> list[WalletAliasKeyringData]:
function remove_alias (line 160) | def remove_alias(alias_name: str) -> None:
FILE: src/algokit/core/typed_client_generation.py
function _snake_case (line 30) | def _snake_case(s: str) -> str:
class AppSpecType (line 37) | class AppSpecType(enum.Enum):
class AppSpecsNotFoundError (line 42) | class AppSpecsNotFoundError(Exception):
class ClientGenerator (line 46) | class ClientGenerator(abc.ABC):
method __init__ (line 54) | def __init__(self, version: str | None) -> None:
method __init_subclass__ (line 57) | def __init_subclass__(cls, language: str, extension: str) -> None:
method languages (line 64) | def languages(cls) -> list[str]:
method create_for_language (line 68) | def create_for_language(cls, language: str, version: str | None) -> "C...
method create_for_extension (line 72) | def create_for_extension(cls, extension: str, version: str | None) -> ...
method resolve_output_path (line 75) | def resolve_output_path(self, app_spec: Path, output_path_pattern: str...
method generate (line 98) | def generate(self, app_spec: Path, output: Path, args: list[str] | Non...
method show_help (line 101) | def show_help(self) -> None: ...
method default_output_pattern (line 105) | def default_output_pattern(self) -> str: ...
method find_generate_command (line 108) | def find_generate_command(self, version: str | None) -> list[str]: ...
method format_contract_name (line 110) | def format_contract_name(self, contract_name: str) -> str:
method generate_all (line 113) | def generate_all(
class PythonClientGenerator (line 152) | class PythonClientGenerator(ClientGenerator, language="python", extensio...
method generate (line 153) | def generate(self, app_spec: Path, output: Path, args: list[str] | Non...
method show_help (line 176) | def show_help(self) -> None:
method default_output_pattern (line 210) | def default_output_pattern(self) -> str:
method format_contract_name (line 213) | def format_contract_name(self, contract_name: str) -> str:
method find_project_generate_command (line 216) | def find_project_generate_command(self, version: str | None) -> list[s...
method find_global_generate_command (line 241) | def find_global_generate_command(self, pipx_command: list[str], versio...
method find_generate_command (line 265) | def find_generate_command(self, version: str | None) -> list[str]:
class TypeScriptClientGenerator (line 299) | class TypeScriptClientGenerator(ClientGenerator, language="typescript", ...
method generate (line 300) | def generate(self, app_spec: Path, output: Path, args: list[str] | Non...
method show_help (line 319) | def show_help(self) -> None:
method find_project_generate_command (line 334) | def find_project_generate_command(
method find_global_generate_command (line 362) | def find_global_generate_command(
method find_generate_command (line 367) | def find_generate_command(self, version: str | None) -> list[str]:
method default_output_pattern (line 406) | def default_output_pattern(self) -> str:
FILE: src/algokit/core/utils.py
function extract_version_triple (line 36) | def extract_version_triple(version_str: str) -> str:
function extract_semantic_version (line 43) | def extract_semantic_version(version_str: str) -> str:
function is_minimum_version (line 50) | def is_minimum_version(system_version: str, minimum_version: str) -> bool:
function is_network_available (line 56) | def is_network_available(host: str = "8.8.8.8", port: int = 53, timeout:...
function animate (line 69) | def animate(name: str, stop_event: threading.Event) -> None:
function run_with_animation (line 87) | def run_with_animation(
function find_valid_pipx_command (line 106) | def find_valid_pipx_command(error_message: str) -> list[str]:
function get_candidate_pipx_commands (line 121) | def get_candidate_pipx_commands() -> Iterator[list[str]]:
function get_npm_command (line 130) | def get_npm_command(error_message: str, *, is_npx: bool = False) -> list...
function get_python_paths (line 156) | def get_python_paths() -> Iterator[str]:
function get_base_python_path (line 165) | def get_base_python_path() -> str | None:
function is_binary_mode (line 195) | def is_binary_mode() -> bool:
function is_windows (line 203) | def is_windows() -> bool:
function is_wsl (line 207) | def is_wsl() -> bool:
function split_command_string (line 215) | def split_command_string(command: str) -> list[str]:
function resolve_command_path (line 230) | def resolve_command_path(
function load_env_file (line 265) | def load_env_file(path: Path | None) -> dict[str, str | None]:
function alphanumeric_sort_key (line 284) | def alphanumeric_sort_key(s: str) -> list[int | str]:
function get_algorand_client_for_network (line 293) | def get_algorand_client_for_network(network: AlgorandNetwork) -> Algoran...
FILE: tests/__init__.py
function get_combined_verify_output (line 1) | def get_combined_verify_output(stdout: str, additional_name: str, additi...
FILE: tests/compile/test_python.py
function _normalize_path (line 20) | def _normalize_path(path: Path) -> str:
function dummy_contract_path (line 25) | def dummy_contract_path() -> Path:
function cwd (line 30) | def cwd(tmp_path_factory: pytest.TempPathFactory) -> Path:
function output_path (line 35) | def output_path(cwd: Path) -> Path:
function test_compile_py_help (line 39) | def test_compile_py_help(mocker: MockerFixture) -> None:
function test_puyapy_is_not_installed_anywhere (line 51) | def test_puyapy_is_not_installed_anywhere(dummy_contract_path: Path, moc...
function test_specificed_puyapy_version_is_not_installed (line 69) | def test_specificed_puyapy_version_is_not_installed(dummy_contract_path:...
function test_puyapy_is_installed_in_project (line 88) | def test_puyapy_is_installed_in_project(dummy_contract_path: Path, mocke...
function test_puyapy_is_installed_globally (line 101) | def test_puyapy_is_installed_globally(dummy_contract_path: Path, mocker:...
function test_valid_contract (line 118) | def test_valid_contract(cwd: Path, output_path: Path) -> None:
function test_invalid_contract (line 131) | def test_invalid_contract(cwd: Path, output_path: Path) -> None:
FILE: tests/compile/test_typescript.py
function _normalize_path (line 21) | def _normalize_path(path: Path) -> str:
function _get_npm_command (line 25) | def _get_npm_command() -> str:
function _get_npx_command (line 29) | def _get_npx_command() -> str:
function _command_name_scrubber (line 33) | def _command_name_scrubber(output: str) -> str:
function dummy_contract_path (line 46) | def dummy_contract_path() -> Path:
function cwd (line 51) | def cwd(tmp_path_factory: pytest.TempPathFactory) -> Path:
function output_path (line 56) | def output_path(cwd: Path) -> Path:
function typescript_test_dir (line 61) | def typescript_test_dir(tmp_path_factory: pytest.TempPathFactory) -> Path:
function test_compile_py_help (line 91) | def test_compile_py_help(mocker: MockerFixture) -> None:
function test_puyats_is_not_installed_anywhere (line 108) | def test_puyats_is_not_installed_anywhere(dummy_contract_path: Path, moc...
function test_specificed_puyats_version_is_not_installed (line 129) | def test_specificed_puyats_version_is_not_installed(dummy_contract_path:...
function test_puyats_is_installed_in_project (line 160) | def test_puyats_is_installed_in_project(dummy_contract_path: Path, mocke...
function test_puyats_is_installed_globally (line 184) | def test_puyats_is_installed_globally(dummy_contract_path: Path, mocker:...
function test_valid_contract (line 212) | def test_valid_contract(typescript_test_dir: Path) -> None:
function test_invalid_contract (line 235) | def test_invalid_contract(typescript_test_dir: Path) -> None:
FILE: tests/completions/test_completions.py
function test_completions_help (line 16) | def test_completions_help() -> None:
function test_completions_subcommands_help (line 26) | def test_completions_subcommands_help(command: str) -> None:
function _mock_bash_version (line 35) | def _mock_bash_version(mocker: MockerFixture, version: str) -> None:
function _mock_default_bash_version (line 42) | def _mock_default_bash_version(mocker: MockerFixture) -> None:
class CompletionsTestContext (line 46) | class CompletionsTestContext:
method __init__ (line 47) | def __init__(self, expected_shell: str):
method run_command (line 63) | def run_command(self, command: str, shell: str | None = None) -> Click...
method profile_contents (line 73) | def profile_contents(self) -> str:
function test_completions_installs_correctly_with_specified_shell (line 78) | def test_completions_installs_correctly_with_specified_shell(shell: str)...
function test_completions_installs_correctly_with_detected_shell (line 94) | def test_completions_installs_correctly_with_detected_shell(mocker: Mock...
function test_completions_uninstalls_correctly (line 111) | def test_completions_uninstalls_correctly(shell: str) -> None:
function test_completions_subcommands_with_unknown_shell_fails_gracefully (line 130) | def test_completions_subcommands_with_unknown_shell_fails_gracefully(com...
function test_completions_subcommands_with_unsupported_shell_fails_gracefully (line 143) | def test_completions_subcommands_with_unsupported_shell_fails_gracefully...
function test_completions_install_is_idempotent (line 155) | def test_completions_install_is_idempotent() -> None:
function test_completions_uninstall_is_idempotent (line 171) | def test_completions_uninstall_is_idempotent() -> None:
function test_completions_install_handles_no_profile (line 189) | def test_completions_install_handles_no_profile() -> None:
function test_completions_uninstall_handles_no_profile (line 204) | def test_completions_uninstall_handles_no_profile() -> None:
function test_completions_install_handles_config_outside_home (line 220) | def test_completions_install_handles_config_outside_home() -> None:
function test_completions_install_handles_unsupported_bash_gracefully (line 242) | def test_completions_install_handles_unsupported_bash_gracefully(mocker:...
FILE: tests/config/test_package_managers.py
function test_js_package_manager_help (line 15) | def test_js_package_manager_help() -> None:
function test_py_package_manager_help (line 22) | def test_py_package_manager_help() -> None:
function test_js_package_manager_invalid_argument (line 29) | def test_js_package_manager_invalid_argument() -> None:
function test_py_package_manager_invalid_argument (line 36) | def test_py_package_manager_invalid_argument() -> None:
function test_js_package_manager_set_npm (line 44) | def test_js_package_manager_set_npm() -> None:
function test_js_package_manager_set_pnpm (line 52) | def test_js_package_manager_set_pnpm() -> None:
function test_py_package_manager_set_poetry (line 60) | def test_py_package_manager_set_poetry() -> None:
function test_py_package_manager_set_uv (line 68) | def test_py_package_manager_set_uv() -> None:
FILE: tests/conftest.py
function proc_mock (line 27) | def proc_mock(mocker: MockerFixture) -> ProcMock:
function _do_platform_mock (line 35) | def _do_platform_mock(platform_system: str, monkeypatch: pytest.MonkeyPa...
function mock_platform_system (line 49) | def mock_platform_system(request: pytest.FixtureRequest, monkeypatch: py...
function _mock_platform_system_marker (line 56) | def _mock_platform_system_marker(request: pytest.FixtureRequest, monkeyp...
function app_dir_mock (line 63) | def app_dir_mock(mocker: MockerFixture, tmp_path: Path) -> AppDirs:
function mock_questionary_input (line 68) | def mock_questionary_input() -> typing.Iterator[PipeInput]:
function _supress_copier_dependencies_debug_output (line 74) | def _supress_copier_dependencies_debug_output() -> None:
function intercept (line 83) | def intercept(
function _patch_questionary_prompts (line 95) | def _patch_questionary_prompts(monkeypatch: pytest.MonkeyPatch) -> None:
function mock_keyring (line 178) | def mock_keyring(mocker: MockerFixture) -> typing.Generator[dict[str, st...
function dummy_algokit_template_with_python_task (line 202) | def dummy_algokit_template_with_python_task(tmp_path_factory: pytest.Tem...
function _clear_caches (line 228) | def _clear_caches(mocker: MockerFixture) -> None:
function _always_check_image_versions (line 235) | def _always_check_image_versions(mocker: MockerFixture, request: pytest....
FILE: tests/dispenser/test_dispenser.py
function _mock_api_base_url (line 28) | def _mock_api_base_url(mocker: MockerFixture) -> None:
function _set_mock_keyring_credentials (line 32) | def _set_mock_keyring_credentials(
function cwd (line 42) | def cwd(tmp_path_factory: pytest.TempPathFactory) -> Path:
function test_no_internet_access (line 50) | def test_no_internet_access(command: str, mocker: MockerFixture) -> None:
class TestTokenRefresh (line 63) | class TestTokenRefresh:
method test_token_refresh_success (line 64) | def test_token_refresh_success(
method test_token_refresh_failure (line 92) | def test_token_refresh_failure(
class TestLogoutCommand (line 110) | class TestLogoutCommand:
method test_logout_command_already_logged_out (line 111) | def test_logout_command_already_logged_out(self, mocker: MockerFixture...
method test_logout_command_success (line 122) | def test_logout_command_success(
method test_logout_command_revoke_exception (line 138) | def test_logout_command_revoke_exception(
class TestLoginCommand (line 156) | class TestLoginCommand:
method test_login_command_already_logged_in (line 157) | def test_login_command_already_logged_in(self, mocker: MockerFixture) ...
method test_login_command_success_user (line 168) | def test_login_command_success_user(
method test_login_command_success_ci (line 213) | def test_login_command_success_ci(
method test_login_command_cancelled_timeout (line 252) | def test_login_command_cancelled_timeout(self, mocker: MockerFixture, ...
method test_login_command_expired_token_refresh (line 288) | def test_login_command_expired_token_refresh(
class TestFundCommand (line 326) | class TestFundCommand:
method test_fund_command_invalid_args (line 327) | def test_fund_command_invalid_args(
method test_fund_command_success (line 341) | def test_fund_command_success(
method test_fund_command_http_error (line 373) | def test_fund_command_http_error(
method test_fund_command_not_authenticated (line 412) | def test_fund_command_not_authenticated(
method test_fund_command_from_alias_successful (line 426) | def test_fund_command_from_alias_successful(
method test_fund_command_address_invalid (line 457) | def test_fund_command_address_invalid(self, mocker: MockerFixture, moc...
method test_fund_command_alias_invalid (line 469) | def test_fund_command_alias_invalid(self, mocker: MockerFixture, mock_...
class TestRefundCommand (line 482) | class TestRefundCommand:
method test_refund_command_invalid_args (line 483) | def test_refund_command_invalid_args(
method test_refund_command_success (line 497) | def test_refund_command_success(
method test_refund_command_http_error (line 526) | def test_refund_command_http_error(
method test_refund_command_not_authenticated (line 547) | def test_refund_command_not_authenticated(
class TestLimitCommand (line 563) | class TestLimitCommand:
method test_limit_command_success (line 568) | def test_limit_command_success(
method test_limit_command_http_error (line 598) | def test_limit_command_http_error(
method test_limit_command_not_authenticated (line 621) | def test_limit_command_not_authenticated(
FILE: tests/doctor/test_doctor.py
class VersionInfoType (line 20) | class VersionInfoType(typing.NamedTuple):
function _mock_doctor_dependencies (line 29) | def _mock_doctor_dependencies(mocker: MockerFixture) -> None:
function _mock_happy_values (line 49) | def _mock_happy_values(proc_mock: ProcMock) -> None:
function mock_shutil_which (line 64) | def mock_shutil_which(python_command_name: str) -> str:
function make_output_scrubber (line 72) | def make_output_scrubber(**extra_tokens: str) -> Scrubber:
function test_doctor_help (line 84) | def test_doctor_help() -> None:
function test_doctor_with_copy (line 93) | def test_doctor_with_copy(mocker: MockerFixture) -> None:
function test_doctor_successful (line 104) | def test_doctor_successful(request: pytest.FixtureRequest) -> None:
function test_doctor_with_docker_compose_version_warning (line 113) | def test_doctor_with_docker_compose_version_warning(proc_mock: ProcMock)...
function test_doctor_with_docker_compose_version_gitpod (line 124) | def test_doctor_with_docker_compose_version_gitpod(proc_mock: ProcMock) ...
function test_doctor_with_docker_compose_version_unparseable (line 135) | def test_doctor_with_docker_compose_version_unparseable(proc_mock: ProcM...
function test_doctor_all_commands_not_found (line 160) | def test_doctor_all_commands_not_found(request: pytest.FixtureRequest, p...
function test_doctor_all_commands_bad_exit (line 171) | def test_doctor_all_commands_bad_exit(request: pytest.FixtureRequest, pr...
function test_doctor_with_weird_values_on_mac (line 183) | def test_doctor_with_weird_values_on_mac(proc_mock: ProcMock) -> None:
function test_unparseable_python_version (line 194) | def test_unparseable_python_version(proc_mock: ProcMock) -> None:
function test_unexpected_exception_locating_executable (line 205) | def test_unexpected_exception_locating_executable(mocker: MockerFixture)...
function test_npm_permission_denied (line 219) | def test_npm_permission_denied(proc_mock: ProcMock) -> None:
function test_new_algokit_version_available (line 230) | def test_new_algokit_version_available(request: pytest.FixtureRequest, m...
function test_doctor_with_weird_values_on_windows (line 240) | def test_doctor_with_weird_values_on_windows(proc_mock: ProcMock) -> None:
function test_doctor_no_mocking (line 252) | def test_doctor_no_mocking() -> None:
FILE: tests/explore/test_explore.py
function test_explore (line 13) | def test_explore(command: str, mocker: MockerFixture) -> None:
function test_explore_wsl_exception (line 24) | def test_explore_wsl_exception(mocker: MockerFixture, caplog: pytest.Log...
function test_explore_webbrowser_exception (line 36) | def test_explore_webbrowser_exception(mocker: MockerFixture, caplog: pyt...
FILE: tests/generate/test_generate_client.py
function _normalize_output (line 25) | def _normalize_output(output: str) -> str:
function _get_npx_command (line 29) | def _get_npx_command() -> str:
function _get_npm_command (line 33) | def _get_npm_command() -> str:
function _get_python_generate_command (line 37) | def _get_python_generate_command(version: str | None, application_json: ...
function _get_typescript_generate_command (line 44) | def _get_typescript_generate_command(version: str | None, application_js...
function cwd (line 52) | def cwd(tmp_path_factory: TempPathFactory) -> Path:
function dir_with_app_spec_factory (line 57) | def dir_with_app_spec_factory() -> DirWithAppSpecFactory:
function application_json (line 69) | def application_json(cwd: Path, dir_with_app_spec_factory: DirWithAppSpe...
function arc32_json (line 74) | def arc32_json(cwd: Path, dir_with_app_spec_factory: DirWithAppSpecFacto...
function arc56_json (line 79) | def arc56_json(cwd: Path, dir_with_app_spec_factory: DirWithAppSpecFacto...
function which_mock (line 84) | def which_mock(mocker: MockerFixture) -> WhichMock:
function test_generate_help (line 93) | def test_generate_help() -> None:
function test_generate_no_options (line 100) | def test_generate_no_options(application_json: Path) -> None:
function test_generate_client_python (line 118) | def test_generate_client_python(
function test_python_generator_is_installed_in_project (line 143) | def test_python_generator_is_installed_in_project(application_json: Path...
function test_python_generator_is_installed_globally (line 156) | def test_python_generator_is_installed_globally(application_json: Path, ...
function test_python_generator_version_is_not_installed_anywhere (line 170) | def test_python_generator_version_is_not_installed_anywhere(application_...
function test_pipx_missing (line 189) | def test_pipx_missing(application_json: Path, mocker: MockerFixture, pro...
function test_generate_client_python_arc32_filename (line 204) | def test_generate_client_python_arc32_filename(
function test_generate_client_python_arc56_filename (line 224) | def test_generate_client_python_arc56_filename(
function test_generate_client_python_multiple_app_specs_in_directory (line 247) | def test_generate_client_python_multiple_app_specs_in_directory(
function test_generate_client_typescript (line 284) | def test_generate_client_typescript(
function test_typescript_generator_is_installed_in_project (line 311) | def test_typescript_generator_is_installed_in_project(
function test_typescript_generator_is_installed_globally (line 326) | def test_typescript_generator_is_installed_globally(
function test_typescript_generator_version_is_not_installed_anywhere (line 342) | def test_typescript_generator_version_is_not_installed_anywhere(
function test_npx_missing (line 364) | def test_npx_missing(application_json: Path, which_mock: WhichMock) -> N...
function test_npx_failed (line 373) | def test_npx_failed(
function test_generate_client_recursive (line 388) | def test_generate_client_recursive(
function test_generate_client_no_app_spec_found (line 409) | def test_generate_client_no_app_spec_found(cwd: Path) -> None:
function test_generate_client_output_path_is_dir (line 416) | def test_generate_client_output_path_is_dir(application_json: Path) -> N...
function test_snake_case (line 425) | def test_snake_case() -> None:
FILE: tests/generate/test_generate_custom_generate_commands.py
function cwd_with_custom_folder (line 17) | def cwd_with_custom_folder(tmp_path_factory: TempPathFactory) -> tuple[P...
function which_mock (line 25) | def which_mock(mocker: MockerFixture) -> WhichMock:
function test_generate_custom_generate_commands_no_toml (line 32) | def test_generate_custom_generate_commands_no_toml(tmp_path_factory: Tem...
function test_generate_custom_generate_commands_invalid_generic_generator (line 41) | def test_generate_custom_generate_commands_invalid_generic_generator(tmp...
function test_generate_custom_generate_commands_valid_generator (line 59) | def test_generate_custom_generate_commands_valid_generator(
function test_generate_custom_generate_command_missing_git_valid_generator (line 78) | def test_generate_custom_generate_command_missing_git_valid_generator(
function test_generate_custom_generate_commands_valid_generator_run (line 101) | def test_generate_custom_generate_commands_valid_generator_run(
function test_generate_custom_generate_commands_valid_generator_no_description (line 123) | def test_generate_custom_generate_commands_valid_generator_no_description(
function test_generate_custom_generate_commands_valid_generator_invalid_path (line 141) | def test_generate_custom_generate_commands_valid_generator_invalid_path(
function test_generate_custom_generate_commands_valid_generator_run_with_python_path (line 160) | def test_generate_custom_generate_commands_valid_generator_run_with_pyth...
FILE: tests/goal/test_goal.py
function _normalize_output (line 24) | def _normalize_output(output: str) -> str:
function _health_success (line 29) | def _health_success(httpx_mock: HTTPXMock) -> None:
function cwd (line 35) | def cwd(tmp_path_factory: pytest.TempPathFactory) -> Path:
function mocked_goal_mount_path (line 40) | def mocked_goal_mount_path(cwd: Path, monkeypatch: pytest.MonkeyPatch) -...
function _setup_latest_dummy_compose (line 48) | def _setup_latest_dummy_compose(app_dir_mock: AppDirs) -> None:
function _setup_input_files (line 56) | def _setup_input_files(cwd: Path, request: pytest.FixtureRequest) -> None:
function _mock_proc_with_running_localnet (line 69) | def _mock_proc_with_running_localnet(proc_mock: ProcMock) -> None:
function _mock_proc_with_algod_running_state (line 74) | def _mock_proc_with_algod_running_state(proc_mock: ProcMock) -> None:
function dump_file (line 81) | def dump_file(cwd: Path) -> None:
function dump_json_file (line 90) | def dump_json_file(cwd: Path) -> None:
function test_goal_help (line 99) | def test_goal_help() -> None:
function test_goal_no_args (line 113) | def test_goal_no_args(app_dir_mock: AppDirs) -> None:
function test_goal_console (line 128) | def test_goal_console(mocker: MockerFixture, app_dir_mock: AppDirs) -> N...
function test_goal_console_algod_not_created (line 142) | def test_goal_console_algod_not_created(app_dir_mock: AppDirs, proc_mock...
function test_goal_console_failed (line 163) | def test_goal_console_failed(app_dir_mock: AppDirs, mocker: MockerFixtur...
function test_goal_simple_args (line 183) | def test_goal_simple_args(app_dir_mock: AppDirs) -> None:
function test_goal_complex_args (line 199) | def test_goal_complex_args(app_dir_mock: AppDirs) -> None:
function test_goal_start_without_docker (line 208) | def test_goal_start_without_docker(proc_mock: ProcMock) -> None:
function test_goal_start_without_docker_engine_running (line 217) | def test_goal_start_without_docker_engine_running(proc_mock: ProcMock) -...
function test_goal_simple_args_with_input_file (line 234) | def test_goal_simple_args_with_input_file(
function test_goal_simple_args_with_output_file (line 271) | def test_goal_simple_args_with_output_file(proc_mock: ProcMock, cwd: Pat...
function test_goal_simple_args_with_input_output_files (line 316) | def test_goal_simple_args_with_input_output_files(
function test_goal_simple_args_with_multiple_input_output_files (line 370) | def test_goal_simple_args_with_multiple_input_output_files(
function test_goal_simple_args_without_file_error (line 414) | def test_goal_simple_args_without_file_error(
function test_goal_postprocess_of_command_args (line 436) | def test_goal_postprocess_of_command_args(
function test_goal_postprocess_of_single_output_arg_resulting_in_multiple_output_files (line 487) | def test_goal_postprocess_of_single_output_arg_resulting_in_multiple_out...
function test_goal_compose_outdated (line 529) | def test_goal_compose_outdated(
function test_goal_simple_args_on_named_localnet (line 550) | def test_goal_simple_args_on_named_localnet(app_dir_mock: AppDirs) -> None:
function test_goal_simple_args_with_input_output_files_with_dot_convention_name (line 569) | def test_goal_simple_args_with_input_output_files_with_dot_convention_name(
FILE: tests/init/example/test_example.py
function get_mock_user_dir (line 23) | def get_mock_user_dir(home_path: Path) -> Path:
function get_mock_templates_dir (line 27) | def get_mock_templates_dir(home_path: Path) -> Path:
function get_mock_examples_dir (line 31) | def get_mock_examples_dir(home_path: Path) -> Path:
function get_mock_examples_config_path (line 35) | def get_mock_examples_config_path(home_path: Path) -> Path:
function _setup_mocks (line 40) | def _setup_mocks(mocker: MockerFixture, tmp_path: Path) -> MagicMock:
function cwd (line 99) | def cwd(tmp_path: Path) -> Path:
function test_example_command_help (line 107) | def test_example_command_help() -> None:
function test_example_command_with_valid_id (line 113) | def test_example_command_with_valid_id(mocker: MockerFixture, cwd: Path)...
function test_example_command_with_invalid_id (line 130) | def test_example_command_with_invalid_id(mocker: MockerFixture, cwd: Pat...
function test_example_command_with_valid_id_source_not_exist (line 147) | def test_example_command_with_valid_id_source_not_exist(mocker: MockerFi...
function test_example_command_with_valid_id_target_exists (line 170) | def test_example_command_with_valid_id_target_exists(mocker: MockerFixtu...
function test_example_command_tui_select_valid (line 193) | def test_example_command_tui_select_valid(mocker: MockerFixture, cwd: Pa...
function test_example_command_tui_select_nothing (line 217) | def test_example_command_tui_select_nothing(mocker: MockerFixture, cwd: ...
function test_example_command_tui_select_valid_but_source_missing (line 237) | def test_example_command_tui_select_valid_but_source_missing(mocker: Moc...
function test_example_command_list_option (line 264) | def test_example_command_list_option(mocker: MockerFixture, cwd: Path) -...
FILE: tests/init/test_init.py
function _remove_git_hints (line 27) | def _remove_git_hints(output: str) -> str:
function _remove_project_paths (line 33) | def _remove_project_paths(output: str) -> str:
class MockPipeInput (line 44) | class MockPipeInput(str, Enum):
class MockQuestionaryAnswer (line 53) | class MockQuestionaryAnswer:
function make_output_scrubber (line 63) | def make_output_scrubber(*extra_scrubbers: Callable[[str], str], **extra...
function which_mock (line 78) | def which_mock(mocker: MockerFixture) -> WhichMock:
class ExtendedTemplateKey (line 85) | class ExtendedTemplateKey(str, Enum):
function _set_mocked_template_keys (line 99) | def _set_mocked_template_keys(monkeypatch: pytest.MonkeyPatch) -> None:
function _set_blessed_templates (line 104) | def _set_blessed_templates(mocker: MockerFixture) -> None:
function _override_bootstrap (line 143) | def _override_bootstrap(mocker: MockerFixture) -> None:
function test_init_help (line 150) | def test_init_help() -> None:
function test_init_missing_git (line 157) | def test_init_missing_git(which_mock: WhichMock) -> None:
function test_invalid_name (line 165) | def test_invalid_name() -> None:
function test_init_no_interaction_required_no_git_no_network (line 172) | def test_init_no_interaction_required_no_git_no_network(tmp_path_factory...
function test_init_no_interaction_required_no_git_no_network_with_vscode (line 192) | def test_init_no_interaction_required_no_git_no_network_with_vscode(
function test_init_no_interaction_required_no_git_no_network_with_vscode_and_readme (line 217) | def test_init_no_interaction_required_no_git_no_network_with_vscode_and_...
function test_init_no_interaction_required_no_git_no_network_with_no_ide (line 239) | def test_init_no_interaction_required_no_git_no_network_with_no_ide(
function test_init_no_interaction_required_defaults_no_git_no_network (line 266) | def test_init_no_interaction_required_defaults_no_git_no_network(tmp_pat...
function test_init_minimal_interaction_required_no_git_no_network_no_bootstrap (line 285) | def test_init_minimal_interaction_required_no_git_no_network_no_bootstrap(
function test_init_minimal_interaction_required_yes_git_no_network (line 307) | def test_init_minimal_interaction_required_yes_git_no_network(
function test_init_do_not_use_existing_folder (line 341) | def test_init_do_not_use_existing_folder(tmp_path_factory: TempPathFacto...
function test_init_use_existing_folder (line 357) | def test_init_use_existing_folder(tmp_path_factory: TempPathFactory, moc...
function test_init_existing_filename_same_as_folder_name (line 373) | def test_init_existing_filename_same_as_folder_name(
function test_init_template_selection (line 391) | def test_init_template_selection(tmp_path_factory: TempPathFactory, mock...
function test_init_invalid_template_url (line 402) | def test_init_invalid_template_url(tmp_path_factory: TempPathFactory, mo...
function test_init_project_name (line 415) | def test_init_project_name(tmp_path_factory: TempPathFactory, mock_quest...
function test_init_bootstrap_yes (line 436) | def test_init_bootstrap_yes(tmp_path_factory: TempPathFactory, mock_ques...
function test_init_bootstrap_no (line 449) | def test_init_bootstrap_no(tmp_path_factory: TempPathFactory, mock_quest...
function test_init_project_name_not_empty (line 462) | def test_init_project_name_not_empty(tmp_path_factory: TempPathFactory, ...
function test_init_project_name_reenter_folder_name (line 483) | def test_init_project_name_reenter_folder_name(
function test_init_ask_about_git (line 511) | def test_init_ask_about_git(tmp_path_factory: TempPathFactory, mock_ques...
function test_init_template_url_and_template_name (line 544) | def test_init_template_url_and_template_name(
function test_init_template_url_and_ref (line 560) | def test_init_template_url_and_ref(tmp_path_factory: TempPathFactory, mo...
function test_init_blessed_template_url_get_community_warning (line 577) | def test_init_blessed_template_url_get_community_warning(
function test_init_with_any_template_url_get_community_warning (line 594) | def test_init_with_any_template_url_get_community_warning(
function test_init_with_any_template_url_get_community_warning_with_unsafe_tag (line 621) | def test_init_with_any_template_url_get_community_warning_with_unsafe_ta...
function test_init_no_community_template (line 645) | def test_init_no_community_template(tmp_path_factory: TempPathFactory, m...
function test_init_input_template_url (line 658) | def test_init_input_template_url(tmp_path_factory: TempPathFactory, mock...
function test_init_with_official_template_name (line 675) | def test_init_with_official_template_name(tmp_path_factory: TempPathFact...
function test_init_with_official_template_name_and_hash (line 699) | def test_init_with_official_template_name_and_hash(tmp_path_factory: Tem...
function test_init_with_custom_env (line 720) | def test_init_with_custom_env(tmp_path_factory: TempPathFactory) -> None:
function test_init_template_with_python_task_fails_on_missing_python (line 750) | def test_init_template_with_python_task_fails_on_missing_python(
function test_init_template_with_python_task_works (line 780) | def test_init_template_with_python_task_works(dummy_algokit_template_wit...
function test_init_wizard_v2_flow (line 825) | def test_init_wizard_v2_flow(
function test_init_wizard_v2_workspace_nesting (line 850) | def test_init_wizard_v2_workspace_nesting(
function test_init_wizard_v2_github_folder_with_workspace (line 885) | def test_init_wizard_v2_github_folder_with_workspace(
function test_init_wizard_v2_github_folder_with_workspace_partial (line 909) | def test_init_wizard_v2_github_folder_with_workspace_partial(
function test_init_wizard_v2_github_folder_no_workspace (line 936) | def test_init_wizard_v2_github_folder_no_workspace(
function test_init_wizard_v2_append_to_vscode_workspace (line 987) | def test_init_wizard_v2_append_to_vscode_workspace(
function test_append_to_workspace_path_normalization (line 1087) | def test_append_to_workspace_path_normalization(
FILE: tests/init/test_init_with_bootstrap.py
function _remove_project_paths (line 19) | def _remove_project_paths(output: str) -> str:
function make_output_scrubber (line 30) | def make_output_scrubber(*extra_scrubbers: Callable[[str], str], **extra...
function test_init_bootstrap_broken_poetry (line 43) | def test_init_bootstrap_broken_poetry(
function test_init_bootstrap_version_fail (line 69) | def test_init_bootstrap_version_fail(
FILE: tests/localnet/conftest.py
function _algod_health_fast_timings (line 13) | def _algod_health_fast_timings(mocker: MockerFixture) -> None:
function _health_success (line 20) | def _health_success(httpx_mock: HTTPXMock) -> None:
function _localnet_up_to_date (line 26) | def _localnet_up_to_date(proc_mock: ProcMock, httpx_mock: HTTPXMock) -> ...
function _mock_proc_with_running_localnet (line 55) | def _mock_proc_with_running_localnet(proc_mock: ProcMock, app_dir_mock: ...
FILE: tests/localnet/test_localnet.py
function test_localnet_help (line 6) | def test_localnet_help() -> None:
FILE: tests/localnet/test_localnet_codespace.py
function test_install_gh_already_installed (line 13) | def test_install_gh_already_installed(mocker: MockerFixture, proc_mock: ...
function test_install_gh_not_installed_failed_install (line 20) | def test_install_gh_not_installed_failed_install(mocker: MockerFixture, ...
function test_install_gh_windows (line 31) | def test_install_gh_windows(
function test_install_gh_unix (line 65) | def test_install_gh_unix(
function test_invalid_scope_auth (line 88) | def test_invalid_scope_auth(
FILE: tests/localnet/test_localnet_console.py
function test_goal_console (line 16) | def test_goal_console(
FILE: tests/localnet/test_localnet_reset.py
function test_localnet_reset_without_existing_sandbox (line 14) | def test_localnet_reset_without_existing_sandbox(app_dir_mock: AppDirs) ...
function test_localnet_reset_with_existing_sandbox_with_out_of_date_config (line 30) | def test_localnet_reset_with_existing_sandbox_with_out_of_date_config(ap...
function test_localnet_reset_with_existing_sandbox_with_up_to_date_config (line 54) | def test_localnet_reset_with_existing_sandbox_with_up_to_date_config(app...
function test_localnet_reset_with_named_sandbox_config (line 69) | def test_localnet_reset_with_named_sandbox_config(proc_mock: ProcMock, a...
function test_localnet_reset_with_existing_sandbox_with_up_to_date_config_with_pull (line 95) | def test_localnet_reset_with_existing_sandbox_with_up_to_date_config_wit...
function test_localnet_reset_without_docker (line 110) | def test_localnet_reset_without_docker(proc_mock: ProcMock) -> None:
function test_localnet_reset_without_docker_compose (line 120) | def test_localnet_reset_without_docker_compose(proc_mock: ProcMock) -> N...
function test_localnet_reset_without_docker_engine_running (line 130) | def test_localnet_reset_without_docker_engine_running(proc_mock: ProcMoc...
FILE: tests/localnet/test_localnet_start.py
function _localnet_out_of_date (line 24) | def _localnet_out_of_date(proc_mock: ProcMock, httpx_mock: HTTPXMock) ->...
function _localnet_img_check_cmd_error (line 52) | def _localnet_img_check_cmd_error(
function test_localnet_start (line 72) | def test_localnet_start(app_dir_mock: AppDirs) -> None:
function test_localnet_start_with_name (line 88) | def test_localnet_start_with_name(app_dir_mock: AppDirs, proc_mock: Proc...
function test_localnet_start_health_failure (line 118) | def test_localnet_start_health_failure(app_dir_mock: AppDirs, httpx_mock...
function test_localnet_start_health_bad_status (line 135) | def test_localnet_start_health_bad_status(app_dir_mock: AppDirs, httpx_m...
function test_localnet_start_failure (line 152) | def test_localnet_start_failure(app_dir_mock: AppDirs, proc_mock: ProcMo...
function test_localnet_start_up_to_date_definition (line 164) | def test_localnet_start_up_to_date_definition(app_dir_mock: AppDirs) -> ...
function test_localnet_start_out_of_date_definition (line 179) | def test_localnet_start_out_of_date_definition(app_dir_mock: AppDirs, mo...
function test_localnet_start_out_of_date_definition_and_missing_config (line 208) | def test_localnet_start_out_of_date_definition_and_missing_config(app_di...
function test_localnet_start_without_docker (line 231) | def test_localnet_start_without_docker(proc_mock: ProcMock) -> None:
function test_localnet_start_without_docker_compose (line 241) | def test_localnet_start_without_docker_compose(proc_mock: ProcMock) -> N...
function test_localnet_start_without_docker_engine_running (line 251) | def test_localnet_start_without_docker_engine_running(proc_mock: ProcMoc...
function test_localnet_start_with_old_docker_compose_version (line 261) | def test_localnet_start_with_old_docker_compose_version(proc_mock: ProcM...
function test_localnet_start_with_unparseable_docker_compose_version (line 271) | def test_localnet_start_with_unparseable_docker_compose_version(app_dir_...
function test_localnet_start_with_gitpod_docker_compose_version (line 283) | def test_localnet_start_with_gitpod_docker_compose_version(app_dir_mock:...
function test_localnet_start_out_date (line 295) | def test_localnet_start_out_date(app_dir_mock: AppDirs) -> None:
function test_localnet_img_check_cmd_error (line 307) | def test_localnet_img_check_cmd_error(app_dir_mock: AppDirs) -> None:
function test_localnet_start_with_custom_config_dir (line 317) | def test_localnet_start_with_custom_config_dir(tmp_path_factory: pytest....
function test_localnet_start_with_no_dev_mode (line 331) | def test_localnet_start_with_no_dev_mode(app_dir_mock: AppDirs) -> None:
FILE: tests/localnet/test_localnet_status.py
function test_localnet_status_successful (line 16) | def test_localnet_status_successful(app_dir_mock: AppDirs, proc_mock: Pr...
function test_localnet_status_http_error (line 48) | def test_localnet_status_http_error(app_dir_mock: AppDirs, proc_mock: Pr...
function test_localnet_status_unexpected_port (line 78) | def test_localnet_status_unexpected_port(app_dir_mock: AppDirs, proc_moc...
function test_localnet_status_service_not_started (line 113) | def test_localnet_status_service_not_started(app_dir_mock: AppDirs, proc...
function test_localnet_status_docker_error (line 138) | def test_localnet_status_docker_error(app_dir_mock: AppDirs, proc_mock: ...
function test_localnet_status_missing_service (line 171) | def test_localnet_status_missing_service(app_dir_mock: AppDirs, proc_moc...
function test_localnet_status_failure (line 191) | def test_localnet_status_failure(app_dir_mock: AppDirs, proc_mock: ProcM...
function test_localnet_status_no_existing_definition (line 205) | def test_localnet_status_no_existing_definition(app_dir_mock: AppDirs) -...
function test_localnet_status_without_docker (line 215) | def test_localnet_status_without_docker(proc_mock: ProcMock) -> None:
function test_localnet_status_without_docker_compose (line 225) | def test_localnet_status_without_docker_compose(proc_mock: ProcMock) -> ...
function test_localnet_status_without_docker_engine_running (line 235) | def test_localnet_status_without_docker_engine_running(proc_mock: ProcMo...
class DockerServicePublisher (line 244) | class DockerServicePublisher(TypedDict):
class DockerServiceInfo (line 251) | class DockerServiceInfo(TypedDict):
FILE: tests/localnet/test_localnet_stop.py
function test_localnet_stop (line 12) | def test_localnet_stop(app_dir_mock: AppDirs) -> None:
function test_localnet_stop_with_name (line 25) | def test_localnet_stop_with_name(app_dir_mock: AppDirs, proc_mock: ProcM...
function test_localnet_stop_failure (line 52) | def test_localnet_stop_failure(app_dir_mock: AppDirs, proc_mock: ProcMoc...
function test_localnet_stop_no_existing_definition (line 67) | def test_localnet_stop_no_existing_definition(app_dir_mock: AppDirs) -> ...
function test_localnet_stop_without_docker (line 77) | def test_localnet_stop_without_docker(proc_mock: ProcMock) -> None:
function test_localnet_stop_without_docker_compose (line 87) | def test_localnet_stop_without_docker_compose(proc_mock: ProcMock) -> None:
function test_localnet_stop_without_docker_engine_running (line 97) | def test_localnet_stop_without_docker_engine_running(proc_mock: ProcMock...
FILE: tests/localnet/test_sandbox.py
function test_get_config_json (line 25) | def test_get_config_json() -> None:
function test_get_conduit_yaml (line 30) | def test_get_conduit_yaml() -> None:
function test_get_docker_compose_yml (line 35) | def test_get_docker_compose_yml() -> None:
function test_algod_network_template_json (line 40) | def test_algod_network_template_json() -> None:
function _mock_image_check_responses (line 46) | def _mock_image_check_responses(proc_mock: ProcMock, httpx_mock: HTTPXMo...
function test_check_docker_compose_for_new_image_versions_no_cache (line 69) | def test_check_docker_compose_for_new_image_versions_no_cache(proc_mock:...
function test_check_docker_compose_for_new_image_versions_cache_fresh_shows_warnings (line 85) | def test_check_docker_compose_for_new_image_versions_cache_fresh_shows_w...
function test_check_docker_compose_for_new_image_versions_cache_fresh_no_warnings_when_up_to_date (line 103) | def test_check_docker_compose_for_new_image_versions_cache_fresh_no_warn...
function test_check_docker_compose_for_new_image_versions_cache_expired (line 121) | def test_check_docker_compose_for_new_image_versions_cache_expired(proc_...
function test_get_image_version_cache_returns_stored_state (line 136) | def test_get_image_version_cache_returns_stored_state() -> None:
function test_check_docker_compose_for_new_image_versions_force_bypasses_cache (line 149) | def test_check_docker_compose_for_new_image_versions_force_bypasses_cach...
FILE: tests/portability/test_pyinstaller_binary.py
function command_str_to_list (line 15) | def command_str_to_list(command: str) -> list[str]:
function test_non_interactive_algokit_commands (line 27) | def test_non_interactive_algokit_commands(
function test_algokit_init_and_project_run (line 47) | def test_algokit_init_and_project_run(tmp_path_factory: pytest.TempPathF...
function test_algokit_init_with_template_url (line 65) | def test_algokit_init_with_template_url(
FILE: tests/project/bootstrap/test_bootstrap.py
function test_bootstrap_help (line 5) | def test_bootstrap_help() -> None:
FILE: tests/project/bootstrap/test_bootstrap_all.py
function _setup_workspace (line 13) | def _setup_workspace(cwd: Path) -> None:
function _setup_standalone_project (line 27) | def _setup_standalone_project(cwd: Path, project_name: str, project_type...
function test_bootstrap_all_empty (line 48) | def test_bootstrap_all_empty(tmp_path_factory: TempPathFactory) -> None:
function test_bootstrap_all_algokit_min_version (line 60) | def test_bootstrap_all_algokit_min_version(tmp_path_factory: TempPathFac...
function test_bootstrap_all_algokit_min_version_ignore_error (line 73) | def test_bootstrap_all_algokit_min_version_ignore_error(tmp_path_factory...
function test_bootstrap_all_env (line 86) | def test_bootstrap_all_env(tmp_path_factory: TempPathFactory) -> None:
function test_bootstrap_all_poetry (line 100) | def test_bootstrap_all_poetry(tmp_path_factory: TempPathFactory, mocker:...
function test_bootstrap_all_npm (line 117) | def test_bootstrap_all_npm(
function test_bootstrap_all_poetry_via_pyproject (line 136) | def test_bootstrap_all_poetry_via_pyproject(tmp_path_factory: TempPathFa...
function test_bootstrap_all_skip_dirs (line 152) | def test_bootstrap_all_skip_dirs(tmp_path_factory: TempPathFactory) -> N...
function test_bootstrap_all_sub_dir (line 176) | def test_bootstrap_all_sub_dir(tmp_path_factory: TempPathFactory, mocker...
function test_bootstrap_all_projects_name_filter (line 196) | def test_bootstrap_all_projects_name_filter(tmp_path_factory: TempPathFa...
function test_bootstrap_all_projects_name_filter_not_found (line 209) | def test_bootstrap_all_projects_name_filter_not_found(tmp_path_factory: ...
function test_bootstrap_all_projects_type_filter (line 219) | def test_bootstrap_all_projects_type_filter(tmp_path_factory: TempPathFa...
function test_bootstrap_all_projects_type_filter_not_found (line 238) | def test_bootstrap_all_projects_type_filter_not_found(tmp_path_factory: ...
FILE: tests/project/bootstrap/test_bootstrap_env.py
function make_output_scrubber (line 13) | def make_output_scrubber(**tokens: str) -> Scrubber:
function test_bootstrap_env_no_files (line 17) | def test_bootstrap_env_no_files(tmp_path_factory: TempPathFactory) -> None:
function test_bootstrap_env_dotenv_exists (line 29) | def test_bootstrap_env_dotenv_exists(tmp_path_factory: TempPathFactory) ...
function test_bootstrap_network_prefixed_envs (line 52) | def test_bootstrap_network_prefixed_envs(env_file_name: str, tmp_path_fa...
function test_bootstrap_env_multiple_templates (line 67) | def test_bootstrap_env_multiple_templates(tmp_path_factory: TempPathFact...
function test_bootstrap_env_dotenv_missing_template_exists (line 82) | def test_bootstrap_env_dotenv_missing_template_exists(tmp_path_factory: ...
function test_bootstrap_env_dotenv_with_values (line 96) | def test_bootstrap_env_dotenv_with_values(tmp_path_factory: TempPathFact...
function test_bootstrap_env_dotenv_different_prompt_scenarios (line 122) | def test_bootstrap_env_dotenv_different_prompt_scenarios(
FILE: tests/project/bootstrap/test_bootstrap_npm.py
function test_bootstrap_npm_without_npm (line 10) | def test_bootstrap_npm_without_npm(
function test_bootstrap_npm_without_package_file (line 27) | def test_bootstrap_npm_without_package_file(tmp_path_factory: TempPathFa...
function test_bootstrap_npm_without_npm_and_package_file (line 39) | def test_bootstrap_npm_without_npm_and_package_file(
function test_bootstrap_npm_happy_path (line 56) | def test_bootstrap_npm_happy_path(tmp_path_factory: TempPathFactory, req...
function test_bootstrap_npm_ci_mode_with_lock_file (line 70) | def test_bootstrap_npm_ci_mode_with_lock_file(
function test_bootstrap_npm_ci_mode_without_lock_file (line 87) | def test_bootstrap_npm_ci_mode_without_lock_file(
FILE: tests/project/bootstrap/test_bootstrap_package_manager_selection.py
function test_bootstrap_respects_configured_package_managers (line 15) | def test_bootstrap_respects_configured_package_managers(
FILE: tests/project/bootstrap/test_bootstrap_pnpm.py
function test_bootstrap_pnpm_happy_path (line 14) | def test_bootstrap_pnpm_happy_path(tmp_path_factory: TempPathFactory, re...
function test_bootstrap_pnpm_without_package_file (line 25) | def test_bootstrap_pnpm_without_package_file(tmp_path_factory: TempPathF...
function test_bootstrap_pnpm_ci_mode_without_lock_file (line 35) | def test_bootstrap_pnpm_ci_mode_without_lock_file(
FILE: tests/project/bootstrap/test_bootstrap_poetry.py
function python_base_executable (line 16) | def python_base_executable() -> str:
function system_python_paths (line 26) | def system_python_paths(request: FixtureRequest, mocker: MockerFixture) ...
function test_base_python_path (line 39) | def test_base_python_path(python_base_executable: str) -> None:
function test_bootstrap_poetry_with_poetry (line 46) | def test_bootstrap_poetry_with_poetry() -> None:
function test_bootstrap_poetry_without_poetry (line 53) | def test_bootstrap_poetry_without_poetry(proc_mock: ProcMock, mock_quest...
function test_bootstrap_poetry_without_poetry_failed_install (line 64) | def test_bootstrap_poetry_without_poetry_failed_install(proc_mock: ProcM...
function test_bootstrap_poetry_without_poetry_failed_poetry_path (line 76) | def test_bootstrap_poetry_without_poetry_failed_poetry_path(
function test_bootstrap_poetry_without_poetry_or_pipx_path (line 101) | def test_bootstrap_poetry_without_poetry_or_pipx_path(
function test_bootstrap_poetry_without_poetry_or_pipx_path_failed_install (line 119) | def test_bootstrap_poetry_without_poetry_or_pipx_path_failed_install(
function test_bootstrap_poetry_without_poetry_or_pipx_path_failed_poetry_path (line 135) | def test_bootstrap_poetry_without_poetry_or_pipx_path_failed_poetry_path(
function test_bootstrap_poetry_without_poetry_or_pipx_path_or_pipx_module (line 151) | def test_bootstrap_poetry_without_poetry_or_pipx_path_or_pipx_module(
FILE: tests/project/bootstrap/test_bootstrap_translation.py
function test_translate_single_command (line 51) | def test_translate_single_command(cmd: str, js_manager: str | None, py_m...
function test_translate_toml_file (line 56) | def test_translate_toml_file() -> None:
function test_translate_preserves_non_command_content (line 80) | def test_translate_preserves_non_command_content() -> None:
FILE: tests/project/bootstrap/test_bootstrap_uv.py
function test_bootstrap_uv_happy_path (line 16) | def test_bootstrap_uv_happy_path(tmp_path_factory: TempPathFactory, requ...
function test_bootstrap_uv_user_declines_install (line 27) | def test_bootstrap_uv_user_declines_install(
function test_bootstrap_uv_poetry_project_migration_declined (line 44) | def test_bootstrap_uv_poetry_project_migration_declined(
FILE: tests/project/bootstrap/test_precedence_hierarchy.py
function test_python_package_manager_precedence_hierarchy (line 12) | def test_python_package_manager_precedence_hierarchy(tmp_path: Path) -> ...
function test_javascript_package_manager_precedence_hierarchy (line 42) | def test_javascript_package_manager_precedence_hierarchy(tmp_path: Path)...
function test_interactive_prompt_saves_preference (line 72) | def test_interactive_prompt_saves_preference(tmp_path: Path) -> None:
FILE: tests/project/deploy/test_deploy.py
function which_mock (line 30) | def which_mock(mocker: MockerFixture) -> WhichMock:
function test_algokit_config_empty_array (line 36) | def test_algokit_config_empty_array(tmp_path_factory: TempPathFactory) -...
function test_algokit_config_invalid_syntax (line 51) | def test_algokit_config_invalid_syntax(tmp_path_factory: TempPathFactory...
function test_algokit_config_name_overrides (line 65) | def test_algokit_config_name_overrides(
function test_algokit_config_name_no_base (line 93) | def test_algokit_config_name_no_base(
function test_command_invocation_and_command_splitting (line 117) | def test_command_invocation_and_command_splitting(tmp_path: Path) -> None:
function test_command_splitting_from_config (line 136) | def test_command_splitting_from_config(tmp_path: Path) -> None:
function test_command_without_splitting_from_config (line 147) | def test_command_without_splitting_from_config(tmp_path: Path) -> None:
function test_command_not_found_and_no_config (line 159) | def test_command_not_found_and_no_config(tmp_path: Path) -> None:
function test_command_not_executable (line 166) | def test_command_not_executable(proc_mock: ProcMock, tmp_path: Path, whi...
function test_command_bad_exit_code (line 175) | def test_command_bad_exit_code(proc_mock: ProcMock, tmp_path: Path, whic...
function test_algokit_env_name_missing (line 184) | def test_algokit_env_name_missing(tmp_path_factory: TempPathFactory, whi...
function test_algokit_env_and_name_correct_set (line 200) | def test_algokit_env_and_name_correct_set(
function test_algokit_deploy_only_base_deploy_config (line 244) | def test_algokit_deploy_only_base_deploy_config(
function test_ci_flag_interactivity_mode_via_env (line 274) | def test_ci_flag_interactivity_mode_via_env(
function test_ci_flag_interactivity_mode_via_cli (line 308) | def test_ci_flag_interactivity_mode_via_cli(
function test_secrets_prompting_via_stdin (line 340) | def test_secrets_prompting_via_stdin(
function test_deploy_custom_project_dir (line 379) | def test_deploy_custom_project_dir(
function test_deploy_shutil_command_not_found (line 408) | def test_deploy_shutil_command_not_found(tmp_path_factory: TempPathFacto...
function test_deploy_dispenser_alias (line 433) | def test_deploy_dispenser_alias(
function test_deploy_with_extra_args (line 474) | def test_deploy_with_extra_args(tmp_path_factory: TempPathFactory, proc_...
function test_deploy_with_extra_args_and_custom_command (line 495) | def test_deploy_with_extra_args_and_custom_command(
FILE: tests/project/link/test_link.py
function which_mock (line 17) | def which_mock(mocker: MockerFixture) -> WhichMock:
function client_generator_mock (line 28) | def client_generator_mock(mocker: MockerFixture) -> MagicMock:
function _format_output (line 39) | def _format_output(output: str, replacements: list[tuple[str, str]]) -> ...
function _create_project_config (line 52) | def _create_project_config(
function _create_workspace_project (line 81) | def _create_workspace_project(
function _cwd_with_workspace (line 125) | def _cwd_with_workspace(
function test_link_command_by_name_success (line 162) | def test_link_command_by_name_success(
function test_link_command_all_success (line 176) | def test_link_command_all_success(
function test_link_command_multiple_names_success (line 195) | def test_link_command_multiple_names_success(
function test_link_command_multiple_names_no_specs_success (line 215) | def test_link_command_multiple_names_no_specs_success(
function test_link_command_name_not_found (line 237) | def test_link_command_name_not_found(
function test_link_command_empty_folder (line 255) | def test_link_command_empty_folder(
FILE: tests/project/list/test_list.py
function which_mock (line 14) | def which_mock(mocker: MockerFixture) -> WhichMock:
function _format_output (line 20) | def _format_output(output: str, replacements: list[tuple[str, str]], rem...
function _create_project_config (line 34) | def _create_project_config(
function _create_workspace_project (line 58) | def _create_workspace_project(
function _cwd_with_workspace (line 106) | def _cwd_with_workspace(
function test_list_command_from_workspace_success (line 135) | def test_list_command_from_workspace_success(
function test_list_command_from_empty_folder (line 156) | def test_list_command_from_empty_folder(
function test_list_command_no_args (line 181) | def test_list_command_no_args(
FILE: tests/project/run/test_run.py
function _format_output (line 21) | def _format_output(output: str) -> str:
function _disable_animation (line 39) | def _disable_animation(mocker: MockerFixture) -> None:
function which_mock (line 44) | def which_mock(mocker: MockerFixture) -> WhichMock:
function _create_project_config (line 50) | def _create_project_config(
function _create_workspace_project (line 74) | def _create_workspace_project(
function cwd_with_workspace_sequential (line 123) | def cwd_with_workspace_sequential(
function cwd_with_workspace (line 151) | def cwd_with_workspace(tmp_path_factory: TempPathFactory, which_mock: Wh...
function cwd_with_standalone (line 176) | def cwd_with_standalone(tmp_path_factory: TempPathFactory, which_mock: W...
function test_run_command_from_workspace_success (line 187) | def test_run_command_from_workspace_success(
function test_run_command_from_workspace_sequential_success (line 202) | def test_run_command_from_workspace_sequential_success(cwd_with_workspac...
function test_run_command_from_standalone (line 215) | def test_run_command_from_standalone(cwd_with_standalone: Path) -> None:
function test_run_command_from_workspace_filtered (line 228) | def test_run_command_from_workspace_filtered(cwd_with_workspace_sequenti...
function test_list_all_commands_in_workspace (line 241) | def test_list_all_commands_in_workspace(cwd_with_workspace_sequential: P...
function test_run_command_from_workspace_filtered_no_project (line 254) | def test_run_command_from_workspace_filtered_no_project(cwd_with_workspa...
function test_run_command_from_workspace_resolution_error (line 267) | def test_run_command_from_workspace_resolution_error(
function test_run_command_from_workspace_execution_error (line 298) | def test_run_command_from_workspace_execution_error(
function test_run_command_from_standalone_resolution_error (line 328) | def test_run_command_from_standalone_resolution_error(
function test_run_command_from_standalone_execution_error (line 358) | def test_run_command_from_standalone_execution_error(tmp_path_factory: p...
function test_run_command_from_workspace_partially_sequential (line 381) | def test_run_command_from_workspace_partially_sequential(
function test_run_command_from_standalone_pass_env (line 420) | def test_run_command_from_standalone_pass_env(
function test_run_command_help_works_without_path_resolution (line 446) | def test_run_command_help_works_without_path_resolution(
function test_run_command_from_workspace_with_sequential_flag (line 484) | def test_run_command_from_workspace_with_sequential_flag(
function test_run_command_from_workspace_with_order_and_sequential_flag (line 514) | def test_run_command_from_workspace_with_order_and_sequential_flag(
function test_run_command_from_standalone_with_extra_args (line 544) | def test_run_command_from_standalone_with_extra_args(
function test_run_command_from_workspace_with_extra_args (line 564) | def test_run_command_from_workspace_with_extra_args(
function test_run_command_from_workspace_with_extra_args_and_project_filter (line 594) | def test_run_command_from_workspace_with_extra_args_and_project_filter(c...
FILE: tests/tasks/test_analyze.py
function _format_snapshot (line 16) | def _format_snapshot(output: str, targets: list[str], replacement: str =...
function _normalize_path (line 34) | def _normalize_path(path: Path) -> str:
function _disable_animation (line 39) | def _disable_animation(mocker: MockerFixture) -> None:
function cwd (line 44) | def cwd(tmp_path_factory: pytest.TempPathFactory) -> Generator[Path, Non...
function generate_report_filename_mock (line 56) | def generate_report_filename_mock() -> Generator[MagicMock, None, None]:
function test_analyze_single_file (line 62) | def test_analyze_single_file(
function test_analyze_multiple_files (line 79) | def test_analyze_multiple_files(
function test_analyze_multiple_files_recursive (line 105) | def test_analyze_multiple_files_recursive(
function test_exclude_vulnerabilities (line 135) | def test_exclude_vulnerabilities(
function test_analyze_skipping_tmpl_vars (line 152) | def test_analyze_skipping_tmpl_vars(
function test_analyze_commented_tmpl_vars (line 166) | def test_analyze_commented_tmpl_vars(
function test_analyze_abort_disclaimer (line 179) | def test_analyze_abort_disclaimer(
function test_analyze_error_in_tealer (line 190) | def test_analyze_error_in_tealer(
function test_analyze_diff_flag (line 205) | def test_analyze_diff_flag(
function test_analyze_diff_flag_missing_old_report (line 223) | def test_analyze_diff_flag_missing_old_report(
function test_analyze_error_no_pipx (line 236) | def test_analyze_error_no_pipx(cwd: Path, mocker: MockerFixture, proc_mo...
FILE: tests/tasks/test_asset.py
function _generate_account (line 12) | def _generate_account() -> tuple[str, str]:
function _get_mnemonic_from_private_key (line 17) | def _get_mnemonic_from_private_key(private_key: str) -> str:
function test_opt_in_no_args (line 21) | def test_opt_in_no_args() -> None:
function test_opt_in_invalid_network (line 28) | def test_opt_in_invalid_network() -> None:
function test_opt_in_to_assets_from_account_address_successful (line 37) | def test_opt_in_to_assets_from_account_address_successful(mocker: Mocker...
function test_opt_in_of_assets_from_account_alias_successful (line 56) | def test_opt_in_of_assets_from_account_alias_successful(mocker: MockerFi...
function test_opt_in_to_assets_from_account_address_failed (line 85) | def test_opt_in_to_assets_from_account_address_failed(mocker: MockerFixt...
function test_opt_out_no_args (line 102) | def test_opt_out_no_args() -> None:
function test_opt_out_invalid_network (line 109) | def test_opt_out_invalid_network() -> None:
function test_opt_out_of_assets_from_account_address_successful (line 118) | def test_opt_out_of_assets_from_account_address_successful(mocker: Mocke...
function test_opt_out_of_all_assets_from_account_address_successful (line 136) | def test_opt_out_of_all_assets_from_account_address_successful(mocker: M...
function test_opt_out_of_assets_from_account_alias_successful (line 155) | def test_opt_out_of_assets_from_account_alias_successful(mocker: MockerF...
function test_opt_out_assets_from_account_address_failed (line 183) | def test_opt_out_assets_from_account_address_failed(mocker: MockerFixtur...
FILE: tests/tasks/test_ipfs.py
function _disable_animation (line 13) | def _disable_animation(mocker: MockerFixture) -> None:
class TestIpfsLogin (line 17) | class TestIpfsLogin:
method test_ipfs_login_exists (line 18) | def test_ipfs_login_exists(self, mock_keyring: dict[str, str]) -> None:
method test_ipfs_login_successful (line 27) | def test_ipfs_login_successful(self, mock_keyring: dict[str, str | Non...
class TestIpfsLogout (line 37) | class TestIpfsLogout:
method test_ipfs_logout (line 38) | def test_ipfs_logout(self, mock_keyring: dict[str, str | None]) -> None:
class TestIpfsUpload (line 48) | class TestIpfsUpload:
method test_ipfs_upload_successful (line 49) | def test_ipfs_upload_successful(
method test_ipfs_not_logged_in (line 63) | def test_ipfs_not_logged_in(
method test_ipfs_upload_http_error (line 76) | def test_ipfs_upload_http_error(
FILE: tests/tasks/test_mint.py
function test_mint_token_successful (line 21) | def test_mint_token_successful(
function test_mint_token_successful_on_decimals (line 91) | def test_mint_token_successful_on_decimals(
function test_mint_token_pure_fractional_nft_ft_validation (line 153) | def test_mint_token_pure_fractional_nft_ft_validation(
function test_mint_token_pinata_error (line 175) | def test_mint_token_pinata_error(
function test_mint_token_no_pinata_jwt_error (line 211) | def test_mint_token_no_pinata_jwt_error(
function test_mint_token_acfg_token_metadata_mismatch_on_name (line 239) | def test_mint_token_acfg_token_metadata_mismatch_on_name(
function test_mint_token_acfg_token_metadata_mismatch_on_decimals (line 270) | def test_mint_token_acfg_token_metadata_mismatch_on_decimals(
FILE: tests/tasks/test_nfd_lookup.py
function test_nfd_lookup_by_domain_success (line 8) | def test_nfd_lookup_by_domain_success(httpx_mock: HTTPXMock) -> None:
function test_nfd_lookup_by_address_success (line 28) | def test_nfd_lookup_by_address_success(httpx_mock: HTTPXMock) -> None:
function test_nfd_lookup_error (line 55) | def test_nfd_lookup_error(httpx_mock: HTTPXMock) -> None:
function test_nfd_lookup_invalid_input (line 71) | def test_nfd_lookup_invalid_input() -> None:
FILE: tests/tasks/test_send_transaction.py
function _generate_dummy_signed_txn (line 13) | def _generate_dummy_signed_txn(*, amount: int = 1, encode: bool = False)...
function _generate_dummy_signed_txn_group (line 25) | def _generate_dummy_signed_txn_group() -> list[transaction.SignedTransac...
function test_send_atomic_txn_group_successful (line 41) | def test_send_atomic_txn_group_successful(tmp_path_factory: pytest.TempP...
function test_send_from_transaction_successful (line 59) | def test_send_from_transaction_successful(mocker: MockerFixture) -> None:
function test_send_from_file_successful (line 73) | def test_send_from_file_successful(
function test_send_from_piped_input_successful (line 97) | def test_send_from_piped_input_successful(
function test_mutually_exclusive_options (line 120) | def test_mutually_exclusive_options() -> None:
function test_file_decoding_no_txn_error (line 131) | def test_file_decoding_no_txn_error(tmp_path_factory: pytest.TempPathFac...
function test_decoding_error (line 147) | def test_decoding_error(tmp_path_factory: pytest.TempPathFactory) -> None:
FILE: tests/tasks/test_sign_transaction.py
function _generate_dummy_txn (line 13) | def _generate_dummy_txn(sender: str, amount: int = 1) -> transaction.Pay...
function _get_mnemonic_from_private_key (line 17) | def _get_mnemonic_from_private_key(private_key: str) -> str:
function test_sign_atomic_txn_group_successful (line 21) | def test_sign_atomic_txn_group_successful(
function test_sign_from_stdin_with_alias_successful (line 50) | def test_sign_from_stdin_with_alias_successful(mock_keyring: dict[str, s...
function test_sign_from_stdin_with_address_successful (line 72) | def test_sign_from_stdin_with_address_successful() -> None:
function test_sign_many_from_file_with_alias_successful (line 88) | def test_sign_many_from_file_with_alias_successful(
function test_sign_many_from_file_with_address_successful (line 120) | def test_sign_many_from_file_with_address_successful(
function test_mutually_exclusive_options (line 147) | def test_mutually_exclusive_options() -> None:
function test_file_decoding_errors (line 162) | def test_file_decoding_errors(tmp_path_factory: pytest.TempPathFactory) ...
function test_transaction_decoding_errors (line 179) | def test_transaction_decoding_errors() -> None:
FILE: tests/tasks/test_transfer.py
class TransactionMock (line 13) | class TransactionMock:
method get_txid (line 14) | def get_txid(self) -> str:
function _generate_account (line 18) | def _generate_account() -> tuple[str, str]:
function _get_mnemonic_from_private_key (line 23) | def _get_mnemonic_from_private_key(private_key: str) -> str:
function test_transfer_no_args (line 27) | def test_transfer_no_args() -> None:
function test_transfer_invalid_sender_account (line 35) | def test_transfer_invalid_sender_account() -> None:
function test_transfer_invalid_receiver_account (line 48) | def test_transfer_invalid_receiver_account() -> None:
function test_transfer_no_amount (line 63) | def test_transfer_no_amount() -> None:
function test_transfer_algo_from_address_successful (line 79) | def test_transfer_algo_from_address_successful(mocker: MockerFixture) ->...
function test_transfer_algo_from_alias_successful (line 109) | def test_transfer_algo_from_alias_successful(mocker: MockerFixture, mock...
function test_transfer_asset_from_address_successful (line 149) | def test_transfer_asset_from_address_successful(mocker: MockerFixture) -...
function test_transfer_asset_from_address_to_alias_successful (line 179) | def test_transfer_asset_from_address_to_alias_successful(mocker: MockerF...
function test_transfer_asset_from_alias_successful (line 219) | def test_transfer_asset_from_alias_successful(mocker: MockerFixture, moc...
function test_transfer_failed (line 259) | def test_transfer_failed(mocker: MockerFixture, mock_keyring: dict[str, ...
function test_transfer_on_testnet (line 292) | def test_transfer_on_testnet(mocker: MockerFixture) -> None:
function test_transfer_on_mainnet (line 322) | def test_transfer_on_mainnet(mocker: MockerFixture) -> None:
FILE: tests/tasks/test_vanity_address.py
function test_vanity_address_no_options (line 12) | def test_vanity_address_no_options() -> None:
function test_vanity_address_invalid_keyword (line 19) | def test_vanity_address_invalid_keyword() -> None:
function test_vanity_address_invalid_input_on_file (line 26) | def test_vanity_address_invalid_input_on_file() -> None:
function test_vanity_address_invalid_input_on_alias (line 33) | def test_vanity_address_invalid_input_on_alias() -> None:
function test_vanity_address_on_default (line 40) | def test_vanity_address_on_default() -> None:
function test_vanity_address_on_anywhere_match (line 50) | def test_vanity_address_on_anywhere_match() -> None:
function test_vanity_address_on_file (line 60) | def test_vanity_address_on_file(tmp_path_factory: pytest.TempPathFactory...
function test_vanity_address_on_alias (line 79) | def test_vanity_address_on_alias(mock_keyring: dict[str, str]) -> None:
function test_vanity_address_on_existing_alias (line 89) | def test_vanity_address_on_existing_alias(mock_keyring: dict[str, str]) ...
FILE: tests/tasks/test_wallet.py
class TestAddAlias (line 12) | class TestAddAlias:
method test_wallet_add_address_successful (line 13) | def test_wallet_add_address_successful(self, mock_keyring: dict[str, s...
method test_wallet_add_account_successful (line 31) | def test_wallet_add_account_successful(self, mock_keyring: dict[str, s...
method test_wallet_add_invalid_address (line 46) | def test_wallet_add_invalid_address(self, mock_keyring: dict[str, str ...
method test_wallet_add_alias_exists (line 60) | def test_wallet_add_alias_exists(self, mock_keyring: dict[str, str | N...
method test_wallet_add_alias_mnemonic_differs (line 80) | def test_wallet_add_alias_mnemonic_differs(self, mock_keyring: dict[st...
method test_wallet_add_alias_limit_error (line 96) | def test_wallet_add_alias_limit_error(self, mock_keyring: dict[str, st...
method test_wallet_add_alias_generic_error (line 118) | def test_wallet_add_alias_generic_error(self, mocker: MockerFixture, m...
class TestGetAlias (line 134) | class TestGetAlias:
method test_wallet_get_address_alias_successful (line 135) | def test_wallet_get_address_alias_successful(self, mock_keyring: dict[...
method test_wallet_get_account_alias_successful (line 148) | def test_wallet_get_account_alias_successful(self, mock_keyring: dict[...
method test_wallet_get_alias_not_found (line 162) | def test_wallet_get_alias_not_found(
class TestListAliases (line 176) | class TestListAliases:
method test_wallet_list_aliases_successful (line 177) | def test_wallet_list_aliases_successful(self, mock_keyring: dict[str, ...
method test_wallet_list_aliases_not_found (line 200) | def test_wallet_list_aliases_not_found(self) -> None:
class TestRemoveAlias (line 211) | class TestRemoveAlias:
method test_wallet_remove_alias_successful (line 212) | def test_wallet_remove_alias_successful(self, mock_keyring: dict[str, ...
method test_wallet_remove_alias_not_found (line 229) | def test_wallet_remove_alias_not_found(self) -> None:
method test_wallet_remove_alias_generic_error (line 241) | def test_wallet_remove_alias_generic_error(self, mocker: MockerFixture...
class TestResetAliases (line 254) | class TestResetAliases:
method test_wallet_reset_aliases_successful (line 255) | def test_wallet_reset_aliases_successful(self, mock_keyring: dict[str,...
method test_wallet_reset_aliases_not_found (line 280) | def test_wallet_reset_aliases_not_found(self) -> None:
method test_wallet_reset_aliases_generic_error (line 290) | def test_wallet_reset_aliases_generic_error(
FILE: tests/test_root.py
function test_help (line 6) | def test_help() -> None:
function test_version (line 13) | def test_version() -> None:
FILE: tests/utils/app_dir_mock.py
class AppDirs (line 8) | class AppDirs:
function tmp_app_dir (line 13) | def tmp_app_dir(mocker: MockerFixture, tmp_path: Path) -> AppDirs:
FILE: tests/utils/approvals.py
function normalize_path (line 18) | def normalize_path(content: str, path: str, token: str) -> str:
function _normalize_platform_differences (line 26) | def _normalize_platform_differences(data: str, poetry_version: str = "99...
class TokenScrubber (line 57) | class TokenScrubber(Scrubber): # type: ignore[misc]
method __init__ (line 58) | def __init__(self, tokens: dict[str, str]):
method __call__ (line 61) | def __call__(self, data: str) -> str:
function verify (line 76) | def verify(
FILE: tests/utils/click_invoker.py
class ClickInvokeResult (line 17) | class ClickInvokeResult:
function invoke (line 23) | def invoke(
FILE: tests/utils/proc_mock.py
class PopenMock (line 7) | class PopenMock:
method __init__ (line 8) | def __init__(self, stdout: str, returncode: int = 0, min_poll_calls: i...
method __enter__ (line 13) | def __enter__(self) -> "PopenMock":
method __exit__ (line 16) | def __exit__(self, *args: object) -> None:
method returncode (line 22) | def returncode(self) -> int:
method stdout (line 26) | def stdout(self) -> IO[str] | None:
method wait (line 29) | def wait(self) -> int:
method poll (line 32) | def poll(self) -> int | None:
class CommandMockData (line 40) | class CommandMockData:
class PopenArgs (line 50) | class PopenArgs:
class ProcMock (line 55) | class ProcMock:
method __init__ (line 56) | def __init__(self) -> None:
method _add_mock_data (line 60) | def _add_mock_data(self, cmd: list[str] | str, data: CommandMockData) ...
method should_fail_on (line 76) | def should_fail_on(self, cmd: list[str] | str) -> None:
method should_deny_on (line 79) | def should_deny_on(self, cmd: list[str] | str) -> None:
method should_bad_exit_on (line 82) | def should_bad_exit_on(self, cmd: list[str] | str, exit_code: int = -1...
method set_output (line 93) | def set_output(
method popen (line 117) | def popen(self, cmd: list[str], env: dict[str, str] | None = None, *_a...
function sequence_starts_with (line 147) | def sequence_starts_with(seq: Sequence[T], test: Sequence[T]) -> bool:
FILE: tests/utils/which_mock.py
class WhichMock (line 1) | class WhichMock:
method __init__ (line 2) | def __init__(self) -> None:
method add (line 5) | def add(self, cmd: str, path: str | None = None) -> str:
method remove (line 10) | def remove(self, cmd: str) -> None:
method which (line 13) | def which(self, cmd: str) -> str | None:
FILE: tests/version_check/test_version_check.py
function make_scrubber (line 20) | def make_scrubber(app_dir_mock: AppDirs) -> Scrubber:
function _setup (line 30) | def _setup(mocker: MockerFixture, app_dir_mock: AppDirs) -> None:
function test_version_check_queries_github_when_no_cache (line 41) | def test_version_check_queries_github_when_no_cache(app_dir_mock: AppDir...
function test_version_check_only_warns_if_newer_version_is_found (line 79) | def test_version_check_only_warns_if_newer_version_is_found(
function test_version_check_uses_cache (line 95) | def test_version_check_uses_cache(app_dir_mock: AppDirs) -> None:
function test_version_check_queries_github_when_cache_out_of_date (line 104) | def test_version_check_queries_github_when_cache_out_of_date(app_dir_moc...
function test_version_check_respects_disable_config (line 117) | def test_version_check_respects_disable_config(app_dir_mock: AppDirs) ->...
function test_version_check_respects_skip_option (line 125) | def test_version_check_respects_skip_option(app_dir_mock: AppDirs) -> None:
function test_version_check_disable_version_check (line 132) | def test_version_check_disable_version_check(app_dir_mock: AppDirs) -> N...
function test_version_check_enable_version_check (line 141) | def test_version_check_enable_version_check(app_dir_mock: AppDirs) -> None:
function test_version_prompt_according_to_distribution_method (line 160) | def test_version_prompt_according_to_distribution_method(
Condensed preview — 755 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,028K chars).
[
{
"path": ".editorconfig",
"chars": 121,
"preview": "root=true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ninsert_final_newline = true\n\n[*.py]\nindent_size = 4"
},
{
"path": ".gitattributes",
"chars": 19,
"preview": "* text=auto eol=lf\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 400,
"preview": "---\nname: \"\\U0001F41C Bug report\"\nabout: Report a reproducible bug.\ntitle: ''\nlabels: bug\nassignees: ''\n---\n\n### Subject"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 565,
"preview": "---\nname: \"\\U0001F514 Feature Request\"\nabout: Suggestions for how we can improve the algorand platform.\ntitle: ''\nlabels"
},
{
"path": ".github/actions/build-binaries/linux/action.yaml",
"chars": 972,
"preview": "name: \"Build Linux Binary Artifacts\"\ndescription: \"Build Linux specific pyinstaller binary artifacts\"\ninputs:\n package_"
},
{
"path": ".github/actions/build-binaries/macos/action.yaml",
"chars": 2980,
"preview": "name: \"Build macOS Binary Artifacts\"\ndescription: \"Build macOS specific pyinstaller binary artifacts\"\ninputs:\n package_"
},
{
"path": ".github/actions/build-binaries/windows/action.yaml",
"chars": 5272,
"preview": "name: \"Build Windows Binary Artifacts\"\ndescription: \"Build Windows specific pyinstaller binary artifacts\"\ninputs:\n pack"
},
{
"path": ".github/actions/install-apple-dev-id-cert/action.yaml",
"chars": 1414,
"preview": "name: \"Install Apple Developer ID certificate\"\ndescription: \"Install Apple Developer ID certificate to macos-build keych"
},
{
"path": ".github/actions/setup-poetry/action.yaml",
"chars": 1192,
"preview": "name: \"Python Poetry Action\"\ndescription: \"An action to setup Poetry\"\nruns:\n using: \"composite\"\n steps:\n # A workar"
},
{
"path": ".github/dependabot.yml",
"chars": 274,
"preview": "version: 2\nupdates:\n - package-ecosystem: \"pip\"\n directory: \"/\"\n schedule:\n interval: \"weekly\"\n commit-me"
},
{
"path": ".github/pull_request_template.md",
"chars": 42,
"preview": "Fixes #\n\n## Proposed Changes\n\n -\n -\n -\n"
},
{
"path": ".github/workflows/build-binaries.yaml",
"chars": 6201,
"preview": "name: Build, Test and Publish Pyinstaller Binaries\n\non:\n workflow_call:\n inputs:\n production_release:\n r"
},
{
"path": ".github/workflows/build-python.yaml",
"chars": 2918,
"preview": "name: Build, Test and Publish Python\n\non: [workflow_call]\n\njobs:\n build-python:\n strategy:\n fail-fast: false\n "
},
{
"path": ".github/workflows/cd.yaml",
"chars": 5478,
"preview": "name: Continuous Delivery of Python package\n\non:\n push:\n branches:\n - main\n paths-ignore:\n - \"docs/**\"\n"
},
{
"path": ".github/workflows/check-python.yaml",
"chars": 1428,
"preview": "name: Check Python Code\n\non:\n workflow_call:\n\njobs:\n check-python:\n runs-on: \"ubuntu-latest\"\n steps:\n - nam"
},
{
"path": ".github/workflows/clear-caches.yaml",
"chars": 719,
"preview": "name: Clear Repository Caches\n\non:\n schedule:\n # Run every 5 days at 2 AM UTC\n - cron: \"0 2 */5 * *\"\n workflow_d"
},
{
"path": ".github/workflows/pr.yaml",
"chars": 691,
"preview": "name: Codebase validation\n\non:\n pull_request:\n paths-ignore:\n - \"README.md\"\n\n schedule:\n - cron: \"0 8 * * 1"
},
{
"path": ".github/workflows/publish-release-packages.yaml",
"chars": 4687,
"preview": "name: Publish packages to public repositories\n\non:\n workflow_call:\n inputs:\n artifactName:\n required: tr"
},
{
"path": ".gitignore",
"chars": 3049,
"preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packagi"
},
{
"path": ".idea/runConfigurations/Run_AlgoKit_CLI.xml",
"chars": 995,
"preview": "<component name=\"ProjectRunConfigurationManager\">\n <configuration default=\"false\" name=\"Run AlgoKit CLI\" type=\"PythonCo"
},
{
"path": ".pre-commit-config.yaml",
"chars": 976,
"preview": "repos:\n - repo: local\n hooks:\n - id: ruff-format\n name: ruff-format\n description: \"Run 'ruff form"
},
{
"path": ".vscode/extensions.json",
"chars": 230,
"preview": "{\n \"recommendations\": [\n \"esbenp.prettier-vscode\",\n \"ms-python.python\",\n \"ms-python.vscode-pylance\",\n \"char"
},
{
"path": ".vscode/launch.json",
"chars": 806,
"preview": "{\n // Use IntelliSense to learn about possible attributes.\n // Hover to view descriptions of existing attributes.\n //"
},
{
"path": ".vscode/settings.json",
"chars": 1490,
"preview": "{\n // General - see also /.editorconfig\n \"editor.formatOnSave\": true,\n \"editor.codeActionsOnSave\": {\n \"source.fixA"
},
{
"path": "CHANGELOG.md",
"chars": 55801,
"preview": "# Changelog\n\n<!--next-version-placeholder-->\n\n## v2.10.2 (2026-01-30)\n\n\n\n## v2.10.1 (2026-01-29)\n\n### Fix\n\n* Update vers"
},
{
"path": "CONTRIBUTING.md",
"chars": 5593,
"preview": "# AlgoKit CLI for contributors\n\n## Commits\n\nWe are using the [Conventional Commits](https://www.conventionalcommits.org/"
},
{
"path": "LICENSE",
"chars": 1081,
"preview": "MIT License\n\nCopyright (c) 2022-2023 Algorand Foundation\n\nPermission is hereby granted, free of charge, to any person ob"
},
{
"path": "README.md",
"chars": 17506,
"preview": "<div align=\"center\">\n<a href=\"https://github.com/algorandfoundation/algokit-cli\"><img src=\"https://raw.githubusercontent"
},
{
"path": "debug.py",
"chars": 1875,
"preview": "\"\"\"\nThis script is for invoking algokit from your IDE with a dynamic set of args,\ndefined in args.in (which is in .gitig"
},
{
"path": "docs/algokit.md",
"chars": 5334,
"preview": "# AlgoKit\n\nThe Algorand AlgoKit CLI is the one-stop shop tool for developers building on the Algorand network. The goal "
},
{
"path": "docs/architecture-decisions/2022-11-14_sandbox-approach.md",
"chars": 5194,
"preview": "# AlgoKit sandbox approach\n\n- **Status**: Approved\n- **Owner:** Rob Moore\n- **Deciders**: Anne Kenyon (Algorand Inc.), A"
},
{
"path": "docs/architecture-decisions/2022-11-22_beaker-testing-strategy.md",
"chars": 7168,
"preview": "# Beaker testing strategy\n\n- **Status**: Draft\n- **Owner:** Rob Moore\n- **Deciders**: Anne Kenyon (Algorand Inc.), Aless"
},
{
"path": "docs/architecture-decisions/2023-01-11_beaker_productionisation_review.md",
"chars": 25665,
"preview": "# Beaker productionisation review\n\n- **Status**: Approved\n- **Owners:** Rob Moore, Adam Chidlow\n- **Deciders**: Anne Ken"
},
{
"path": "docs/architecture-decisions/2023-01-11_brew_install.md",
"chars": 6354,
"preview": "# HomeBrew install strategy\n\n- **Status**: Approved\n- **Owner:** Daniel McGregor\n- **Deciders**: Daniel McGregor, Rob Mo"
},
{
"path": "docs/architecture-decisions/2023-01-12_smart-contract-deployment.md",
"chars": 36552,
"preview": "# Smart Contract Deployment\n\n- **Status**: Approved\n- **Owner:** Rob Moore\n- **Deciders**: Anne Kenyon (Algorand Inc.), "
},
{
"path": "docs/architecture-decisions/2023-06-06_frontend-templates.md",
"chars": 17972,
"preview": "# Frontend Templates\n\n- **Status**: Approved\n- **Owner:** Altynbek Orumbayev\n- **Deciders**: Rob Moore, Daniel McGregor,"
},
{
"path": "docs/architecture-decisions/2023-07-19_advanced_generate_command.md",
"chars": 13849,
"preview": "# Advanced `algokit generate` command\n\n- **Status**: Approved\n- **Owner:** Altynbek Orumbayev, Inaie Ignacio\n- **Decider"
},
{
"path": "docs/architecture-decisions/2024-01-13_native_binaries.md",
"chars": 10262,
"preview": "# AlgoKit CLI native binaries\n\n- **Status**: Approved\n- **Owner:** Altynbek Orumbayev (MakerX), Negar Abbasi (MakerX)\n- "
},
{
"path": "docs/architecture-decisions/2024-01-23_init-wizard-v2.md",
"chars": 13908,
"preview": "# AlgoKit Init Wizard Version 2 and Template Enhancements\n\n- **Status:** Proposed (Revision 2)\n- **Owner:** Altynbek Oru"
},
{
"path": "docs/architecture-decisions/2024-01-31_binary_distribution.md",
"chars": 15965,
"preview": "# AlgoKit CLI binary distribution\n\n- **Status**: Approved\n- **Owner:** Altynbek Orumbayev (MakerX)\n- **Deciders**: Aless"
},
{
"path": "docs/architecture-decisions/2024-03-06_local_dev_ui_packaging.md",
"chars": 8988,
"preview": "# Local dev UI packaging\n\n- **Status**: Draft\n- **Owner:** Patrick Dinh (MakerX), Negar Abbasi (MakerX)\n- **Deciders**: "
},
{
"path": "docs/articles/output_stability.md",
"chars": 1211,
"preview": "# Smart Contract Output Stability\n\nSmart contracts development is analogous to low level firmware software development; "
},
{
"path": "docs/cli/index.md",
"chars": 37941,
"preview": "# AlgoKit CLI Reference Documentation\n\n\n- [algokit](#algokit)\n - [Options](#options)\n - [--version](#--version)\n "
},
{
"path": "docs/features/compile.md",
"chars": 7697,
"preview": "# AlgoKit Compile\n\nThe AlgoKit Compile feature enables you to compile smart contracts (apps) and smart signatures (logic"
},
{
"path": "docs/features/completions.md",
"chars": 2010,
"preview": "# AlgoKit Completions\n\nAlgoKit supports shell completions for zsh and bash shells, e.g.\n\n**bash**\n\n```\n$ algokit <Press "
},
{
"path": "docs/features/config.md",
"chars": 2077,
"preview": "# AlgoKit Config\n\nThe `algokit config` command allows you to manage various global settings used by AlgoKit CLI. This fe"
},
{
"path": "docs/features/dispenser.md",
"chars": 3905,
"preview": "# AlgoKit TestNet Dispenser\n\nThe AlgoKit Dispenser feature allows you to interact with the AlgoKit TestNet Dispenser. Th"
},
{
"path": "docs/features/doctor.md",
"chars": 2799,
"preview": "# AlgoKit Doctor\n\nThe AlgoKit Doctor feature allows you to check your AlgoKit installation along with its dependencies. "
},
{
"path": "docs/features/explore.md",
"chars": 880,
"preview": "# AlgoKit explore\n\nAlgoKit provides a quick shortcut to [explore](../cli/index.md#explore) various Algorand networks usi"
},
{
"path": "docs/features/generate.md",
"chars": 8655,
"preview": "# AlgoKit Generate\n\nThe `algokit generate` [command](../cli/index.md#generate) is used to generate components used in an"
},
{
"path": "docs/features/goal.md",
"chars": 6170,
"preview": "# AlgoKit goal\n\nAlgoKit goal command provides the user with a mechanism to run [goal cli](https://dev.algorand.co/algoki"
},
{
"path": "docs/features/init.md",
"chars": 10406,
"preview": "# AlgoKit Init\n\nThe `algokit init` [command](../cli/index.md#init) is used to quickly initialize new projects using offi"
},
{
"path": "docs/features/localnet.md",
"chars": 15569,
"preview": "# AlgoKit LocalNet\n\nThe AlgoKit LocalNet feature allows you to manage (start, stop, reset, manage) a locally sandboxed p"
},
{
"path": "docs/features/project/bootstrap.md",
"chars": 11721,
"preview": "# AlgoKit Project Bootstrap\n\nThe AlgoKit Project Bootstrap feature allows you to bootstrap different project dependencie"
},
{
"path": "docs/features/project/deploy.md",
"chars": 10688,
"preview": "# AlgoKit Project Deploy\n\nDeploy your smart contracts effortlessly to various networks with the algokit project deploy f"
},
{
"path": "docs/features/project/link.md",
"chars": 3678,
"preview": "# AlgoKit Project Link Command\n\nThe `algokit project link` command is a powerful feature designed to streamline the inte"
},
{
"path": "docs/features/project/list.md",
"chars": 2127,
"preview": "# AlgoKit Project List Command\n\nThe `algokit project list` command is designed to enumerate all projects within an AlgoK"
},
{
"path": "docs/features/project/run.md",
"chars": 6939,
"preview": "# AlgoKit Project Run\n\nThe `algokit project run` command allows defining custom commands to execute at standalone projec"
},
{
"path": "docs/features/project.md",
"chars": 6812,
"preview": "# AlgoKit Project\n\n`algokit project` is a collection of commands and command groups useful for managing AlgoKit-complian"
},
{
"path": "docs/features/tasks/analyze.md",
"chars": 1812,
"preview": "# AlgoKit Task Analyze\n\nThe `analyze` task is a command-line utility that analyzes TEAL programs for common vulnerabilit"
},
{
"path": "docs/features/tasks/ipfs.md",
"chars": 2111,
"preview": "# AlgoKit Task IPFS\n\nThe AlgoKit IPFS feature allows you to interact with the IPFS [InterPlanetary File System](https://"
},
{
"path": "docs/features/tasks/mint.md",
"chars": 4311,
"preview": "# AlgoKit Task Mint\n\nThe AlgoKit Mint feature allows you to mint new fungible or non-fungible assets on the Algorand blo"
},
{
"path": "docs/features/tasks/nfd.md",
"chars": 1902,
"preview": "# AlgoKit Task NFD Lookup\n\nThe AlgoKit NFD Lookup feature allows you to perform a lookup via NFD domain or address, retu"
},
{
"path": "docs/features/tasks/opt.md",
"chars": 2436,
"preview": "# AlgoKit Task Asset opt-(in|out)\n\nAlgoKit Task Asset opt-(in|out) allows you to opt-in or opt-out of Algorand Asset(s)."
},
{
"path": "docs/features/tasks/send.md",
"chars": 2841,
"preview": "# AlgoKit Task Send\n\nThe AlgoKit Send feature allows you to send signed Algorand transaction(s) to a specified network u"
},
{
"path": "docs/features/tasks/sign.md",
"chars": 4211,
"preview": "# AlgoKit Task Sign\n\nThe AlgoKit Sign feature allows you to sign Algorand transaction(s) using the AlgoKit CLI. This fea"
},
{
"path": "docs/features/tasks/transfer.md",
"chars": 2222,
"preview": "# AlgoKit Task Transfer\n\nThe AlgoKit Transfer feature allows you to transfer algos and assets between two accounts.\n\n## "
},
{
"path": "docs/features/tasks/vanity_address.md",
"chars": 2330,
"preview": "# AlgoKit Task Vanity Address\n\nThe AlgoKit Vanity Address feature allows you to generate a vanity Algorand address. A va"
},
{
"path": "docs/features/tasks/wallet.md",
"chars": 4346,
"preview": "# AlgoKit Task Wallet\n\nManage your Algorand addresses and accounts effortlessly with the AlgoKit Wallet feature. This fe"
},
{
"path": "docs/features/tasks.md",
"chars": 1641,
"preview": "# AlgoKit Tasks\n\nAlgoKit Tasks are a collection of handy tasks that can be used to perform various operations on Algoran"
},
{
"path": "docs/sphinx/conf.py",
"chars": 732,
"preview": "# Configuration file for the Sphinx documentation builder.\n#\n# For the full list of built-in configuration values, see t"
},
{
"path": "docs/sphinx/index.rst",
"chars": 66,
"preview": ".. click:: algokit.cli:algokit\n :prog: algokit\n :nested: full\n"
},
{
"path": "docs/tutorials/algokit-template.md",
"chars": 14245,
"preview": "# Creating AlgoKit Templates\n\nThis README serves as a guide on how to create custom templates for AlgoKit, a tool for in"
},
{
"path": "docs/tutorials/intro.md",
"chars": 10700,
"preview": "# AlgoKit Quick Start Tutorial\n\nAlgoKit is the primary tool used by the Algorand community to develop smart contracts on"
},
{
"path": "docs/tutorials/smart-contracts.md",
"chars": 199,
"preview": "# Smart Contract Tutorial\n\n_TODO_\n\n[mental model image]\n\n- Lifecycle\n- Deploy-time immutability and permanence controls\n"
},
{
"path": "entitlements.xml",
"chars": 345,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "misc/multiformats_config/multibase-table.json",
"chars": 3757,
"preview": "[\n {\n \"name\": \"identity\",\n \"code\": \"0x00\",\n \"status\": \"reserved\",\n \"description\": \"(No ba"
},
{
"path": "misc/multiformats_config/multicodec-table.json",
"chars": 86992,
"preview": "[\n {\n \"name\": \"identity\",\n \"tag\": \"multihash\",\n \"code\": \"0x00\",\n \"status\": \"permanent\",\n "
},
{
"path": "poetry.toml",
"chars": 32,
"preview": "[virtualenvs]\nin-project = true\n"
},
{
"path": "pyproject.toml",
"chars": 7012,
"preview": "[tool.poetry]\nname = \"algokit\"\nversion = \"2.10.2\"\ndescription = \"Algorand development kit command-line interface\"\nauthor"
},
{
"path": "scripts/package_mac.sh",
"chars": 726,
"preview": "#!/bin/bash\n\nCMD=\"pyinstaller --clean --onedir --hidden-import jinja2_ansible_filters --hidden-import multiformats_confi"
},
{
"path": "scripts/package_windows.bat",
"chars": 302,
"preview": "@echo off\npyinstaller --clean --onedir --hidden-import jinja2_ansible_filters --hidden-import multiformats_config --copy"
},
{
"path": "scripts/snap/create-snapcraft-yaml.sh",
"chars": 1189,
"preview": "#!/bin/bash\n\n# Ensure the script fails on errors\nset -e\n\n# Check if the correct number of arguments are passed\nif [ \"$#\""
},
{
"path": "scripts/update-brew-cask.sh",
"chars": 4047,
"preview": "#!/bin/bash\n\n#script arguments\nwheel_files=( $1 )\nwheel_file=${wheel_files[0]}\narm_artifacts=( $2 )\narm_artifact=${arm_a"
},
{
"path": "scripts/winget/build-installer.ps1",
"chars": 1573,
"preview": "Param(\n [Parameter(Mandatory = $true)]\n [String]\n $binaryDir,\n\n [Parameter(Mandatory = $false)]\n [AllowEmptyString("
},
{
"path": "scripts/winget/installer/AppxManifest.xml",
"chars": 2164,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Package xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windows10\" "
},
{
"path": "scripts/winget/installer/priconfig.xml",
"chars": 1186,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<resources targetOsVersion=\"10.0.0\" majorVersion=\"1\">\n\t<packagin"
},
{
"path": "scripts/winget/update-package.ps1",
"chars": 903,
"preview": "Param(\n [Parameter(Mandatory = $true)]\n [String]\n $releaseVersion\n)\n\nFunction ThrowOnNonZeroExit {\n Param( [String]$"
},
{
"path": "src/algokit/__init__.py",
"chars": 1183,
"preview": "import platform\nimport sys\n\n# this isn't beautiful, but to avoid confusing user errors we need this check before we star"
},
{
"path": "src/algokit/__main__.py",
"chars": 104,
"preview": "from multiprocessing import freeze_support\n\nfrom algokit.cli import algokit\n\nfreeze_support()\nalgokit()\n"
},
{
"path": "src/algokit/cli/__init__.py",
"chars": 2427,
"preview": "import click\n\nfrom algokit.cli.compile import compile_group\nfrom algokit.cli.completions import completions_group\nfrom a"
},
{
"path": "src/algokit/cli/codespace.py",
"chars": 5120,
"preview": "import logging\nimport subprocess\nfrom time import time\nfrom typing import Any\n\nimport click\n\nfrom algokit.core import qu"
},
{
"path": "src/algokit/cli/common/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "src/algokit/cli/common/constants.py",
"chars": 796,
"preview": "# Common constants, variables and enums used by the CLI.\n\nfrom enum import Enum\n\n\n# >= Py 3.11, there is a built-in StrE"
},
{
"path": "src/algokit/cli/common/utils.py",
"chars": 6004,
"preview": "# Cli/Click related helper functions and classes\n\n\nimport typing as t\nfrom pathlib import Path\n\nimport click\n\nfrom algok"
},
{
"path": "src/algokit/cli/compile.py",
"chars": 1458,
"preview": "import logging\n\nimport click\n\nfrom algokit.cli.compilers.python import py, python\nfrom algokit.cli.compilers.typescript "
},
{
"path": "src/algokit/cli/compilers/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "src/algokit/cli/compilers/python.py",
"chars": 1789,
"preview": "import logging\nimport os\nfrom collections.abc import Callable\nfrom typing import Any\n\nimport click\n\nfrom algokit.core.co"
},
{
"path": "src/algokit/cli/compilers/typescript.py",
"chars": 1887,
"preview": "import logging\nimport os\nfrom collections.abc import Callable\nfrom typing import Any\n\nimport click\n\nfrom algokit.core.co"
},
{
"path": "src/algokit/cli/completions.py",
"chars": 6108,
"preview": "import logging\nfrom pathlib import Path\n\nimport click\nimport click.shell_completion\nimport shellingham # type: ignore[i"
},
{
"path": "src/algokit/cli/config.py",
"chars": 810,
"preview": "import click\n\nfrom algokit.core.config_commands.container_engine import container_engine_configuration_command\nfrom algo"
},
{
"path": "src/algokit/cli/dispenser.py",
"chars": 8296,
"preview": "import enum\nimport logging\nfrom dataclasses import dataclass\nfrom pathlib import Path\n\nimport click\n\nfrom algokit.cli.co"
},
{
"path": "src/algokit/cli/doctor.py",
"chars": 8014,
"preview": "import datetime as dt\nimport logging\nimport platform\nimport sys\n\nimport click\nimport pyclip # type: ignore[import-untyp"
},
{
"path": "src/algokit/cli/explore.py",
"chars": 4041,
"preview": "import logging\nimport os\nfrom typing import TypedDict\nfrom urllib.parse import urlencode\n\nimport click\n\nfrom algokit.cor"
},
{
"path": "src/algokit/cli/generate.py",
"chars": 6884,
"preview": "import logging\nimport shutil\nfrom functools import cache\nfrom pathlib import Path\n\nimport click\n\nfrom algokit.core.gener"
},
{
"path": "src/algokit/cli/goal.py",
"chars": 4558,
"preview": "import logging\n\nimport click\n\nfrom algokit.core import proc\nfrom algokit.core.config_commands.container_engine import ge"
},
{
"path": "src/algokit/cli/init/__init__.py",
"chars": 5207,
"preview": "import click\n\n# Import the core logic function from command.py\nfrom algokit.cli.init.command import initialize_new_proje"
},
{
"path": "src/algokit/cli/init/command.py",
"chars": 25723,
"preview": "import logging\nimport re\nimport shutil\nfrom collections.abc import Callable\nfrom enum import Enum\nfrom pathlib import Pa"
},
{
"path": "src/algokit/cli/init/example.py",
"chars": 2107,
"preview": "import shutil\nfrom pathlib import Path\n\nimport click\n\nfrom algokit.cli.tui.init.example_selector import ExampleSelector\n"
},
{
"path": "src/algokit/cli/init/helpers.py",
"chars": 3205,
"preview": "from dataclasses import dataclass\nfrom enum import Enum\n\nimport click\n\nfrom algokit.core.init import is_valid_project_di"
},
{
"path": "src/algokit/cli/localnet.py",
"chars": 14010,
"preview": "import logging\nimport os\nfrom pathlib import Path\n\nimport click\nimport questionary\n\nfrom algokit.cli.codespace import co"
},
{
"path": "src/algokit/cli/project/__init__.py",
"chars": 1239,
"preview": "import logging\nimport re\n\nimport click\n\nfrom algokit.cli.project.bootstrap import bootstrap_group\nfrom algokit.cli.proje"
},
{
"path": "src/algokit/cli/project/bootstrap.py",
"chars": 4429,
"preview": "import logging\nimport os\nfrom pathlib import Path\n\nimport click\n\nfrom algokit.core.project import ProjectType\nfrom algok"
},
{
"path": "src/algokit/cli/project/deploy.py",
"chars": 11588,
"preview": "import logging\nimport os\nimport typing as t\nfrom pathlib import Path\n\nimport click\nfrom algosdk.mnemonic import from_pri"
},
{
"path": "src/algokit/cli/project/link.py",
"chars": 7919,
"preview": "import logging\nimport typing\nfrom dataclasses import dataclass\nfrom pathlib import Path\n\nimport click\nimport questionary"
},
{
"path": "src/algokit/cli/project/list.py",
"chars": 2112,
"preview": "import logging\nfrom pathlib import Path\n\nimport click\n\nfrom algokit.core.conf import get_algokit_config\nfrom algokit.cor"
},
{
"path": "src/algokit/cli/project/run.py",
"chars": 8019,
"preview": "import logging\nfrom functools import cache\nfrom pathlib import Path\n\nimport click\n\nfrom algokit.cli.common.utils import "
},
{
"path": "src/algokit/cli/task.py",
"chars": 1434,
"preview": "import logging\n\nimport click\n\nfrom algokit.cli.tasks.analyze import analyze\nfrom algokit.cli.tasks.assets import opt_in_"
},
{
"path": "src/algokit/cli/tasks/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "src/algokit/cli/tasks/analyze.py",
"chars": 8363,
"preview": "import json\nimport logging\nimport re\nfrom pathlib import Path\n\nimport click\n\nfrom algokit.core.tasks.analyze import (\n "
},
{
"path": "src/algokit/cli/tasks/assets.py",
"chars": 6251,
"preview": "import logging\n\nimport click\nfrom algosdk import error\nfrom algosdk.v2client.algod import AlgodClient\n\nfrom algokit.cli."
},
{
"path": "src/algokit/cli/tasks/ipfs.py",
"chars": 3093,
"preview": "import logging\nfrom pathlib import Path\n\nimport click\n\nfrom algokit.core.tasks.ipfs import (\n MAX_FILE_SIZE,\n Pina"
},
{
"path": "src/algokit/cli/tasks/mint.py",
"chars": 11353,
"preview": "import json\nimport logging\nimport math\nfrom decimal import Decimal\nfrom pathlib import Path\n\nimport click\nfrom algokit_u"
},
{
"path": "src/algokit/cli/tasks/nfd.py",
"chars": 1430,
"preview": "import logging\n\nimport click\n\nfrom algokit.cli.tasks.utils import validate_address\nfrom algokit.core.tasks.nfd import NF"
},
{
"path": "src/algokit/cli/tasks/send_transaction.py",
"chars": 6572,
"preview": "import json\nimport logging\nfrom pathlib import Path\nfrom typing import TYPE_CHECKING, cast\n\nimport click\nfrom algosdk im"
},
{
"path": "src/algokit/cli/tasks/sign_transaction.py",
"chars": 4611,
"preview": "import base64\nimport json\nimport logging\nfrom pathlib import Path\nfrom typing import Any, cast\n\nimport click\nfrom algosd"
},
{
"path": "src/algokit/cli/tasks/transfer.py",
"chars": 4098,
"preview": "import logging\n\nimport click\nfrom algokit_utils import AlgoAmount, AssetTransferParams, PaymentParams, SendAtomicTransac"
},
{
"path": "src/algokit/cli/tasks/utils.py",
"chars": 11289,
"preview": "# AlgoKit Tasks related utility functions\n\nimport logging\nimport os\nimport stat\nimport sys\nfrom collections.abc import C"
},
{
"path": "src/algokit/cli/tasks/vanity_address.py",
"chars": 4804,
"preview": "import json\nimport logging\nimport re\nfrom pathlib import Path\n\nimport click\n\nfrom algokit.core.tasks.vanity_address impo"
},
{
"path": "src/algokit/cli/tasks/wallet.py",
"chars": 5209,
"preview": "import json\nimport re\n\nimport click\nfrom algosdk import account\n\nfrom algokit.cli.tasks.utils import get_private_key_fro"
},
{
"path": "src/algokit/cli/tui/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "src/algokit/cli/tui/init/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "src/algokit/cli/tui/init/example_selector.py",
"chars": 974,
"preview": "from pathlib import Path\nfrom typing import Any, ClassVar\n\nfrom textual.app import App\n\nfrom algokit.core.init import AL"
},
{
"path": "src/algokit/cli/tui/init/screens/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "src/algokit/cli/tui/init/screens/example_selector_screen.py",
"chars": 1901,
"preview": "from typing import TYPE_CHECKING\n\nfrom textual import on\nfrom textual.app import ComposeResult\nfrom textual.containers i"
},
{
"path": "src/algokit/core/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "src/algokit/core/_toml.py",
"chars": 300,
"preview": "from __future__ import annotations\n\nimport importlib\nimport sys\nimport typing as t\n\n_TOML_MODULE = \"tomllib\" if sys.vers"
},
{
"path": "src/algokit/core/_vendor/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "src/algokit/core/_vendor/auth0/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "src/algokit/core/_vendor/auth0/authentication/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "src/algokit/core/_vendor/auth0/authentication/token_verifier.py",
"chars": 17107,
"preview": "\"\"\"Token Verifier module\nCommit ref: https://github.com/auth0/auth0-python/commit/423f9b35faf0b673bfb2cd68d73717964080b5"
},
{
"path": "src/algokit/core/atomic_write.py",
"chars": 1329,
"preview": "import contextlib\nimport os\nimport shutil\nimport stat\nfrom pathlib import Path\nfrom typing import Literal\n\n\ndef atomic_w"
},
{
"path": "src/algokit/core/codespace.py",
"chars": 13866,
"preview": "import json\nimport logging\nimport subprocess\nimport tempfile\nimport time\nfrom datetime import datetime\nfrom functools im"
},
{
"path": "src/algokit/core/compilers/python.py",
"chars": 2440,
"preview": "from collections.abc import Iterator\n\nfrom algokit.core.proc import run\nfrom algokit.core.utils import extract_version_t"
},
{
"path": "src/algokit/core/compilers/typescript.py",
"chars": 3817,
"preview": "from algokit.core.proc import run\nfrom algokit.core.utils import extract_semantic_version, get_npm_command\n\nPUYATS_NPM_P"
},
{
"path": "src/algokit/core/conf.py",
"chars": 2787,
"preview": "import logging\nimport os\nimport platform\nimport typing as t\nfrom importlib import metadata\nfrom pathlib import Path\n\nfro"
},
{
"path": "src/algokit/core/config_commands/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "src/algokit/core/config_commands/container_engine.py",
"chars": 2470,
"preview": "import enum\nimport logging\n\nimport click\nimport questionary\n\nfrom algokit.core.conf import get_app_config_dir\n\nlogger = "
},
{
"path": "src/algokit/core/config_commands/js_package_manager.py",
"chars": 2177,
"preview": "import enum\nimport logging\nfrom pathlib import Path\n\nimport click\nimport questionary\n\nfrom algokit.core.conf import get_"
},
{
"path": "src/algokit/core/config_commands/py_package_manager.py",
"chars": 2157,
"preview": "import enum\nimport logging\nfrom pathlib import Path\n\nimport click\nimport questionary\n\nfrom algokit.core.conf import get_"
},
{
"path": "src/algokit/core/config_commands/version_prompt.py",
"chars": 6014,
"preview": "import importlib.resources as importlib_resources\nimport logging\nimport re\nfrom datetime import timedelta\nfrom time impo"
},
{
"path": "src/algokit/core/dispenser.py",
"chars": 13462,
"preview": "import base64\nimport contextlib\nimport logging\nimport os\nimport time\nfrom dataclasses import dataclass\nfrom datetime imp"
},
{
"path": "src/algokit/core/doctor.py",
"chars": 4711,
"preview": "import dataclasses\nimport logging\nimport re\nimport traceback\nfrom shutil import which\n\nfrom algokit.core import proc\nfro"
},
{
"path": "src/algokit/core/generate.py",
"chars": 3609,
"preview": "import dataclasses\nimport logging\nfrom pathlib import Path\n\nimport click\n\nfrom algokit.core.conf import ALGOKIT_CONFIG, "
},
{
"path": "src/algokit/core/goal.py",
"chars": 4113,
"preview": "import logging\nimport re\nimport shutil\nfrom pathlib import Path, PurePath\n\nfrom algokit.core.conf import get_app_config_"
},
{
"path": "src/algokit/core/init.py",
"chars": 8860,
"preview": "import json\nimport re\nimport shutil\nimport subprocess\nfrom logging import getLogger\nfrom pathlib import Path\nfrom subpro"
},
{
"path": "src/algokit/core/log_handlers.py",
"chars": 5150,
"preview": "import logging\nimport os\nimport sys\nfrom logging.handlers import RotatingFileHandler\nfrom types import TracebackType\nfro"
},
{
"path": "src/algokit/core/proc.py",
"chars": 3596,
"preview": "import dataclasses\nimport logging\nimport subprocess\nimport sys\nfrom pathlib import Path\nfrom subprocess import Popen\nfro"
},
{
"path": "src/algokit/core/project/__init__.py",
"chars": 6244,
"preview": "from enum import Enum\nfrom functools import cache\nfrom pathlib import Path\nfrom typing import Any\n\nfrom algokit.core.con"
},
{
"path": "src/algokit/core/project/bootstrap.py",
"chars": 27906,
"preview": "import logging\nimport os\nimport re\nfrom pathlib import Path\n\nimport click\nimport questionary\nfrom packaging import versi"
},
{
"path": "src/algokit/core/project/deploy.py",
"chars": 5174,
"preview": "import dataclasses\nimport logging\nfrom pathlib import Path\n\nimport click\nimport dotenv\nfrom algokit_utils import ClientM"
},
{
"path": "src/algokit/core/project/run.py",
"chars": 12021,
"preview": "import dataclasses\nimport logging\nimport os\nfrom concurrent.futures import ThreadPoolExecutor\nfrom pathlib import Path\nf"
},
{
"path": "src/algokit/core/questionary_extensions.py",
"chars": 1970,
"preview": "from collections.abc import Callable, Sequence\nfrom typing import Any\n\nimport prompt_toolkit.document\nimport questionary"
},
{
"path": "src/algokit/core/sandbox.py",
"chars": 25396,
"preview": "from __future__ import annotations\n\nimport dataclasses\nimport enum\nimport json\nimport logging\nimport re\nimport time\nfrom"
},
{
"path": "src/algokit/core/tasks/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "src/algokit/core/tasks/analyze.py",
"chars": 7513,
"preview": "import json\nimport logging\nimport os\nimport re\nfrom pathlib import Path\n\nfrom jsondiff import diff\nfrom pydantic import "
},
{
"path": "src/algokit/core/tasks/ipfs.py",
"chars": 4947,
"preview": "import json\nimport logging\nfrom pathlib import Path\n\nimport httpx\nimport keyring\n\nlogger = logging.getLogger(__name__)\n\n"
},
{
"path": "src/algokit/core/tasks/mint/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "src/algokit/core/tasks/mint/mint.py",
"chars": 8197,
"preview": "import base64\nimport hashlib\nimport json\nimport logging\nimport mimetypes\nimport pathlib\nimport re\nfrom dataclasses impor"
},
{
"path": "src/algokit/core/tasks/mint/models.py",
"chars": 4036,
"preview": "import json\nimport tempfile\nfrom dataclasses import asdict, dataclass\nfrom pathlib import Path\n\nfrom algosdk.transaction"
},
{
"path": "src/algokit/core/tasks/nfd.py",
"chars": 3863,
"preview": "import json\nimport logging\nfrom enum import Enum\n\nimport httpx\n\nlogger = logging.getLogger(__name__)\n\nNF_DOMAINS_API_URL"
},
{
"path": "src/algokit/core/tasks/vanity_address.py",
"chars": 5600,
"preview": "import logging\nimport multiprocessing\nimport signal\nimport time\nimport types\nimport typing\nfrom collections.abc import C"
},
{
"path": "src/algokit/core/tasks/wallet.py",
"chars": 4870,
"preview": "import json\nimport logging\nfrom dataclasses import dataclass\n\nimport keyring\n\nlogger = logging.getLogger(__name__)\n\nWALL"
},
{
"path": "src/algokit/core/typed_client_generation.py",
"chars": 15764,
"preview": "import abc\nimport enum\nimport json\nimport logging\nimport re\nimport shutil # noqa: F401\nfrom functools import reduce\nfro"
},
{
"path": "src/algokit/core/utils.py",
"chars": 10308,
"preview": "from __future__ import annotations\n\nimport os\nimport platform\nimport re\nimport shutil\nimport socket\nimport sys\nimport th"
},
{
"path": "src/algokit/py.typed",
"chars": 0,
"preview": ""
},
{
"path": "src/algokit/resources/distribution-method",
"chars": 0,
"preview": ""
},
{
"path": "tests/__init__.py",
"chars": 271,
"preview": "def get_combined_verify_output(stdout: str, additional_name: str, additional_output: str) -> str:\n \"\"\"Simple way to g"
},
{
"path": "tests/compile/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "tests/compile/conftest.py",
"chars": 1272,
"preview": "VALID_ALGORAND_PYTHON_CONTRACT_FILE_CONTENT = \"\"\"\nfrom algopy import Contract, Txn, log\n\n\nclass HelloWorldContract(Contr"
},
{
"path": "tests/compile/test_python.py",
"chars": 5263,
"preview": "import logging\nimport os\nimport sys\nfrom pathlib import Path\n\nimport pytest\nfrom pytest_mock import MockerFixture\n\nfrom "
},
{
"path": "tests/compile/test_python.test_compile_py_help.approved.txt",
"chars": 216,
"preview": "DEBUG: Running 'poetry run puyapy --version' in '{current_working_directory}'\nDEBUG: poetry: puyapy 1.0.0\nDEBUG: Running"
},
{
"path": "tests/compile/test_python.test_puyapy_is_installed_globally.approved.txt",
"chars": 347,
"preview": "DEBUG: Running 'poetry run puyapy --version' in '{current_working_directory}'\nDEBUG: poetry: Puyapy not found\nDEBUG: Run"
},
{
"path": "tests/compile/test_python.test_puyapy_is_installed_in_project.approved.txt",
"chars": 259,
"preview": "DEBUG: Running 'poetry run puyapy --version' in '{current_working_directory}'\nDEBUG: poetry: puyapy 1.0.0\nDEBUG: Running"
},
{
"path": "tests/compile/test_python.test_puyapy_is_not_installed_anywhere.approved.txt",
"chars": 487,
"preview": "DEBUG: Running 'poetry run puyapy --version' in '{current_working_directory}'\nDEBUG: poetry: Puyapy not found\nDEBUG: Run"
},
{
"path": "tests/compile/test_python.test_specificed_puyapy_version_is_not_installed.approved.txt",
"chars": 490,
"preview": "DEBUG: Running 'poetry run puyapy --version' in '{current_working_directory}'\nDEBUG: poetry: puyapy 1.0.0\nDEBUG: Running"
},
{
"path": "tests/compile/test_typescript.py",
"chars": 8842,
"preview": "import logging\nimport os\nimport subprocess\nfrom pathlib import Path\n\nimport pytest\nfrom pytest_mock import MockerFixture"
},
{
"path": "tests/compile/test_typescript.test_compile_py_help.approved.txt",
"chars": 349,
"preview": "DEBUG: Running 'npm ls --no-unicode' in '{current_working_directory}'\nDEBUG: npm: STDOUT\nDEBUG: npm: STDERR\nDEBUG: Runni"
},
{
"path": "tests/compile/test_typescript.test_puyats_is_installed_globally.approved.txt",
"chars": 555,
"preview": "DEBUG: Running 'npm ls --no-unicode' in '{current_working_directory}'\nDEBUG: npm: STDOUT\nDEBUG: npm: STDERR\nDEBUG: Runni"
},
{
"path": "tests/compile/test_typescript.test_puyats_is_installed_in_project.approved.txt",
"chars": 438,
"preview": "DEBUG: Running 'npm ls --no-unicode' in '{current_working_directory}'\nDEBUG: npm: └── @algorandfoundation/puya-ts@1.0.0\n"
},
{
"path": "tests/compile/test_typescript.test_puyats_is_not_installed_anywhere.approved.txt",
"chars": 428,
"preview": "DEBUG: Running 'npm ls --no-unicode' in '{current_working_directory}'\nDEBUG: npm: STDOUT\nDEBUG: npm: STDERR\nDEBUG: Runni"
},
{
"path": "tests/compile/test_typescript.test_specificed_puyats_version_is_not_installed.approved.txt",
"chars": 458,
"preview": "DEBUG: Running 'npm ls --no-unicode' in '{current_working_directory}'\nDEBUG: npm: └── @algorandfoundation/puya-ts@1.0.0\n"
},
{
"path": "tests/completions/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "tests/completions/test_completions.py",
"chars": 8597,
"preview": "from pathlib import Path\nfrom tempfile import TemporaryDirectory\n\nimport pytest\nfrom approvaltests.namer import NamerFac"
},
{
"path": "tests/completions/test_completions.test_completions_help.approved.txt",
"chars": 198,
"preview": "Usage: algokit completions [OPTIONS] COMMAND [ARGS]...\n\nOptions:\n -h, --help Show this message and exit.\n\nCommands:\n "
},
{
"path": "tests/completions/test_completions.test_completions_install_handles_config_outside_home.approved.txt",
"chars": 310,
"preview": "DEBUG: Writing source script {config}/algokit/.algokit-completions.bash\nDEBUG: Appending completion source to {home}/.ba"
},
{
"path": "tests/completions/test_completions.test_completions_install_handles_no_profile.approved.txt",
"chars": 294,
"preview": "DEBUG: Writing source script {home}/.config/algokit/.algokit-completions.bash\nDEBUG: Appending completion source to {hom"
},
{
"path": "tests/completions/test_completions.test_completions_install_handles_unsupported_bash_gracefully.approved.txt",
"chars": 188,
"preview": "DEBUG: Failed to generate completion source. Shell completion is not supported for Bash versions older than 4.4.\nERROR: "
},
{
"path": "tests/completions/test_completions.test_completions_install_is_idempotent.approved.txt",
"chars": 275,
"preview": "DEBUG: Writing source script {home}/.config/algokit/.algokit-completions.bash\n{home}/.bashrc already contains completion"
},
{
"path": "tests/completions/test_completions.test_completions_installs_correctly_with_detected_shell.approved.txt",
"chars": 317,
"preview": "DEBUG: Writing source script {home}/.config/algokit/.algokit-completions.bash\nDEBUG: Appending completion source to {hom"
}
]
// ... and 555 more files (download for full content)
About this extraction
This page contains the full source code of the algorandfoundation/algokit-cli GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 755 files (1.8 MB), approximately 492.9k tokens, and a symbol index with 1176 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.