infra-cli 0.1.6__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (524) hide show
  1. {infra_cli-0.1.6 → infra_cli-0.3.0}/PKG-INFO +3 -1
  2. {infra_cli-0.1.6 → infra_cli-0.3.0}/pyproject.toml +3 -1
  3. infra_cli-0.3.0/src/infra/VERSION +5 -0
  4. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/commands/__init__.py +7 -0
  5. infra_cli-0.3.0/src/infra/commands/docker.py +65 -0
  6. infra_cli-0.3.0/src/infra/commands/github.py +103 -0
  7. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/commands/options.py +1 -3
  8. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/commands/setup.py +3 -1
  9. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/context.py +2 -0
  10. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/doctor.py +12 -6
  11. infra_cli-0.3.0/src/infra/plugins/aws/describe_run.py +236 -0
  12. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/ec2_cves.py +164 -60
  13. infra_cli-0.3.0/src/infra/plugins/aws/ec2_describe.py +179 -0
  14. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/ec2_login.py +233 -17
  15. infra_cli-0.3.0/src/infra/plugins/aws/ec2_tag.py +205 -0
  16. infra_cli-0.3.0/src/infra/plugins/aws/ec2_volumes.py +369 -0
  17. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/ecr_cves.py +130 -51
  18. infra_cli-0.3.0/src/infra/plugins/aws/ecr_describe.py +81 -0
  19. infra_cli-0.3.0/src/infra/plugins/aws/ecs_describe.py +88 -0
  20. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/ecs_list_clusters.py +22 -1
  21. infra_cli-0.3.0/src/infra/plugins/aws/ecs_list_container_instances.py +356 -0
  22. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/ecs_list_tasks.py +71 -21
  23. infra_cli-0.3.0/src/infra/plugins/aws/eks_describe.py +105 -0
  24. infra_cli-0.3.0/src/infra/plugins/aws/eks_list_clusters.py +199 -0
  25. infra_cli-0.3.0/src/infra/plugins/aws/eks_nodes.py +191 -0
  26. infra_cli-0.3.0/src/infra/plugins/aws/elasticache_auth.py +198 -0
  27. infra_cli-0.3.0/src/infra/plugins/aws/elasticache_describe.py +176 -0
  28. infra_cli-0.3.0/src/infra/plugins/aws/elasticache_rbac.py +760 -0
  29. infra_cli-0.3.0/src/infra/plugins/aws/export.py +348 -0
  30. infra_cli-0.3.0/src/infra/plugins/aws/firewall_describe.py +268 -0
  31. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/inventory/common.py +306 -47
  32. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/inventory/ec2.py +42 -3
  33. infra_cli-0.3.0/src/infra/plugins/aws/inventory/ecr_repositories.py +161 -0
  34. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/inventory/elasticache.py +20 -8
  35. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/inventory/elasticache_usage.py +25 -12
  36. infra_cli-0.3.0/src/infra/plugins/aws/inventory/firewall.py +561 -0
  37. infra_cli-0.3.0/src/infra/plugins/aws/inventory/msk.py +411 -0
  38. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/inventory/opensearch.py +9 -2
  39. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/inventory/rds.py +9 -2
  40. infra_cli-0.3.0/src/infra/plugins/aws/inventory/ssm_parameters.py +135 -0
  41. infra_cli-0.3.0/src/infra/plugins/aws/inventory/vpc.py +205 -0
  42. infra_cli-0.3.0/src/infra/plugins/aws/inventory/vpc_network.py +725 -0
  43. infra_cli-0.3.0/src/infra/plugins/aws/msk_describe.py +173 -0
  44. infra_cli-0.3.0/src/infra/plugins/aws/msk_topics.py +1298 -0
  45. infra_cli-0.3.0/src/infra/plugins/aws/opensearch_describe.py +136 -0
  46. infra_cli-0.3.0/src/infra/plugins/aws/rds_describe.py +170 -0
  47. infra_cli-0.3.0/src/infra/plugins/aws/rds_users.py +1124 -0
  48. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/runtime.py +135 -6
  49. infra_cli-0.3.0/src/infra/plugins/aws/services/ec2.py +611 -0
  50. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/services/ecr.py +103 -6
  51. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/services/ecs.py +213 -22
  52. infra_cli-0.3.0/src/infra/plugins/aws/services/eks.py +219 -0
  53. infra_cli-0.3.0/src/infra/plugins/aws/services/elasticache.py +346 -0
  54. infra_cli-0.3.0/src/infra/plugins/aws/services/elasticache_access.py +431 -0
  55. infra_cli-0.3.0/src/infra/plugins/aws/services/firewall.py +411 -0
  56. infra_cli-0.3.0/src/infra/plugins/aws/services/msk.py +536 -0
  57. infra_cli-0.3.0/src/infra/plugins/aws/services/opensearch.py +166 -0
  58. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/services/options.py +174 -21
  59. infra_cli-0.3.0/src/infra/plugins/aws/services/rds.py +180 -0
  60. infra_cli-0.3.0/src/infra/plugins/aws/services/rds_users.py +372 -0
  61. infra_cli-0.3.0/src/infra/plugins/aws/services/ssm.py +888 -0
  62. infra_cli-0.3.0/src/infra/plugins/aws/services/vpc.py +181 -0
  63. infra_cli-0.3.0/src/infra/plugins/aws/services/vpc_network.py +350 -0
  64. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/ssm_audit.py +87 -32
  65. infra_cli-0.3.0/src/infra/plugins/aws/ssm_command.py +422 -0
  66. infra_cli-0.3.0/src/infra/plugins/aws/ssm_describe.py +82 -0
  67. infra_cli-0.3.0/src/infra/plugins/aws/ssm_document.py +366 -0
  68. infra_cli-0.3.0/src/infra/plugins/aws/ssm_param.py +403 -0
  69. infra_cli-0.3.0/src/infra/plugins/aws/vpc_describe.py +147 -0
  70. infra_cli-0.3.0/src/infra/plugins/aws/vpc_network_describe.py +153 -0
  71. infra_cli-0.3.0/src/infra/plugins/docker_ps.py +80 -0
  72. infra_cli-0.3.0/src/infra/plugins/github_pr.py +393 -0
  73. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/naming/model.py +13 -12
  74. infra_cli-0.3.0/src/infra/plugins/oci/cli.py +386 -0
  75. infra_cli-0.3.0/src/infra/plugins/oci/compartment_cleanup.py +1789 -0
  76. infra_cli-0.3.0/src/infra/plugins/oci/compartment_plan.py +861 -0
  77. infra_cli-0.3.0/src/infra/plugins/oci/landing_zones.py +224 -0
  78. infra_cli-0.3.0/src/infra/plugins/oci/login.py +256 -0
  79. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/oci/logout.py +21 -3
  80. infra_cli-0.3.0/src/infra/plugins/oci/options.py +172 -0
  81. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/oci/profiles.py +11 -0
  82. infra_cli-0.3.0/src/infra/plugins/oci/profiles_cmd.py +102 -0
  83. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/oci/runtime.py +15 -0
  84. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/dbtools/redis/service.py +15 -3
  85. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/setup/plan.py +15 -10
  86. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/setup/plugin.py +44 -26
  87. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/setup/profiles.py +15 -4
  88. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/setup/verify.py +2 -3
  89. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/tencent/login.py +2 -6
  90. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/terraform/cleanup.py +7 -1
  91. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/terraform/scaffold.py +3 -1
  92. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/terragrunt/paths.py +2 -6
  93. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/terragrunt/plugin.py +2 -11
  94. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/terragrunt/scaffold.py +1 -3
  95. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/work/ai/doctor.py +6 -2
  96. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/work/ai/redact.py +18 -4
  97. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/work/ai/resolve.py +1 -3
  98. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/work/cli.py +3 -1
  99. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/work/connectors.py +10 -0
  100. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/work/context_pack.py +4 -2
  101. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/work/mcp_stdio.py +14 -4
  102. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/work/planner.py +3 -1
  103. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/shell/completer.py +44 -21
  104. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/README.md +2 -0
  105. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/callback_plugins/infra_journal.py +6 -2
  106. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/README.md +1 -0
  107. infra_cli-0.3.0/src/infra/templates/ansible/roles/common/tasks/kafka.yml +99 -0
  108. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/main.yml +7 -0
  109. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/config/config.yml +1 -0
  110. infra_cli-0.3.0/src/infra/templates/kafka/README.md +123 -0
  111. infra_cli-0.3.0/src/infra/templates/kafka/conf/client.iam.properties.example +15 -0
  112. infra_cli-0.3.0/src/infra/templates/kafka/conf/client.plaintext.properties.example +6 -0
  113. infra_cli-0.3.0/src/infra/templates/kafka/conf/client.scram.properties.example +14 -0
  114. infra_cli-0.3.0/src/infra/templates/kafka/conf/client.ssl.properties.example +12 -0
  115. infra_cli-0.3.0/src/infra/templates/kafka/kafka +490 -0
  116. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/setup/README.md +3 -0
  117. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/work/skills/inventory-snapshot.yml +3 -1
  118. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/config.py +67 -6
  119. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/fmt.py +4 -3
  120. infra_cli-0.3.0/src/infra/utils/ui.py +209 -0
  121. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra_cli.egg-info/SOURCES.txt +51 -0
  122. infra_cli-0.1.6/src/infra/VERSION +0 -5
  123. infra_cli-0.1.6/src/infra/commands/github.py +0 -48
  124. infra_cli-0.1.6/src/infra/plugins/aws/export.py +0 -116
  125. infra_cli-0.1.6/src/infra/plugins/aws/services/ec2.py +0 -237
  126. infra_cli-0.1.6/src/infra/plugins/aws/services/elasticache.py +0 -198
  127. infra_cli-0.1.6/src/infra/plugins/aws/services/opensearch.py +0 -102
  128. infra_cli-0.1.6/src/infra/plugins/aws/services/rds.py +0 -111
  129. infra_cli-0.1.6/src/infra/plugins/aws/services/ssm.py +0 -328
  130. infra_cli-0.1.6/src/infra/plugins/oci/cli.py +0 -102
  131. infra_cli-0.1.6/src/infra/plugins/oci/login.py +0 -158
  132. infra_cli-0.1.6/src/infra/plugins/oci/options.py +0 -52
  133. infra_cli-0.1.6/src/infra/plugins/oci/profiles_cmd.py +0 -68
  134. infra_cli-0.1.6/src/infra/utils/ui.py +0 -113
  135. {infra_cli-0.1.6 → infra_cli-0.3.0}/LICENSE +0 -0
  136. {infra_cli-0.1.6 → infra_cli-0.3.0}/MANIFEST.in +0 -0
  137. {infra_cli-0.1.6 → infra_cli-0.3.0}/README.md +0 -0
  138. {infra_cli-0.1.6 → infra_cli-0.3.0}/setup.cfg +0 -0
  139. {infra_cli-0.1.6 → infra_cli-0.3.0}/setup.py +0 -0
  140. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/__init__.py +0 -0
  141. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/__main__.py +0 -0
  142. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/buildinfo.py +0 -0
  143. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/cli.py +0 -0
  144. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/commands/ansible.py +0 -0
  145. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/commands/config_cmds.py +0 -0
  146. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/commands/packer.py +0 -0
  147. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/commands/slack.py +0 -0
  148. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/commands/terraform.py +0 -0
  149. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/commands/terragrunt.py +0 -0
  150. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/execute.py +0 -0
  151. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/__init__.py +0 -0
  152. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/alibaba/__init__.py +0 -0
  153. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/alibaba/cli.py +0 -0
  154. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/alibaba/landing_zones.py +0 -0
  155. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/alibaba/login.py +0 -0
  156. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/alibaba/options.py +0 -0
  157. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/alibaba/profiles.py +0 -0
  158. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/alibaba/profiles_cmd.py +0 -0
  159. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/alibaba/runtime.py +0 -0
  160. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/alibaba/site.py +0 -0
  161. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/ansible.py +0 -0
  162. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/__init__.py +0 -0
  163. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/cli.py +0 -0
  164. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/inventory/__init__.py +0 -0
  165. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/inventory/match.py +0 -0
  166. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/landing_zones.py +0 -0
  167. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/login.py +0 -0
  168. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/logout.py +0 -0
  169. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/options.py +0 -0
  170. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/profiles.py +0 -0
  171. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/profiles_cmd.py +0 -0
  172. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/services/__init__.py +0 -0
  173. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/services/cost.py +0 -0
  174. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/ssm_copy.py +0 -0
  175. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/ssm_search.py +0 -0
  176. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/sso_discovery.py +0 -0
  177. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/aws/token_info.py +0 -0
  178. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/base.py +0 -0
  179. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/config.py +0 -0
  180. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/cost/__init__.py +0 -0
  181. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/cost/actions.py +0 -0
  182. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/cost/cli.py +0 -0
  183. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/cost/models.py +0 -0
  184. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/cost/plugin.py +0 -0
  185. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/eol/__init__.py +0 -0
  186. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/eol/cache.py +0 -0
  187. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/eol/cli.py +0 -0
  188. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/eol/render.py +0 -0
  189. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/github.py +0 -0
  190. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/macos/__init__.py +0 -0
  191. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/macos/cli.py +0 -0
  192. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/macos/debug.py +0 -0
  193. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/macos/power.py +0 -0
  194. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/naming/__init__.py +0 -0
  195. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/naming/cli.py +0 -0
  196. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/naming/scaffold.py +0 -0
  197. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/oci/__init__.py +0 -0
  198. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/packer.py +0 -0
  199. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/__init__.py +0 -0
  200. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/app_factory.py +0 -0
  201. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/cli.py +0 -0
  202. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/dbtools/__init__.py +0 -0
  203. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/dbtools/deps.py +0 -0
  204. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/dbtools/features.py +0 -0
  205. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/dbtools/http_util.py +0 -0
  206. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/dbtools/mongo/__init__.py +0 -0
  207. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/dbtools/mongo/routes.py +0 -0
  208. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/dbtools/mongo/service.py +0 -0
  209. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/dbtools/mongo/ui.py +0 -0
  210. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/dbtools/mount.py +0 -0
  211. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/dbtools/mysql/__init__.py +0 -0
  212. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/dbtools/mysql/routes.py +0 -0
  213. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/dbtools/mysql/service.py +0 -0
  214. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/dbtools/mysql/ui.py +0 -0
  215. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/dbtools/redis/__init__.py +0 -0
  216. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/dbtools/redis/routes.py +0 -0
  217. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/dbtools/redis/ui.py +0 -0
  218. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/dbtools/session.py +0 -0
  219. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/dbtools/shell.py +0 -0
  220. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/dbtools/sql_guard.py +0 -0
  221. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/html.py +0 -0
  222. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/web/__init__.py +0 -0
  223. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/web/assets.py +0 -0
  224. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/web/charts.py +0 -0
  225. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/web/components.py +0 -0
  226. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/web/db_common.py +0 -0
  227. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/web/db_page.py +0 -0
  228. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/server/web/layout.py +0 -0
  229. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/setup/__init__.py +0 -0
  230. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/setup/cli_upgrade.py +0 -0
  231. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/setup/journal.py +0 -0
  232. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/setup/ollama_models.py +0 -0
  233. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/slack.py +0 -0
  234. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/tencent/__init__.py +0 -0
  235. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/tencent/cli.py +0 -0
  236. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/tencent/landing_zones.py +0 -0
  237. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/tencent/logout.py +0 -0
  238. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/tencent/options.py +0 -0
  239. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/tencent/profiles.py +0 -0
  240. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/tencent/profiles_cmd.py +0 -0
  241. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/tencent/runtime.py +0 -0
  242. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/tencent/site.py +0 -0
  243. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/terraform/__init__.py +0 -0
  244. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/terraform/args.py +0 -0
  245. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/terraform/paths.py +0 -0
  246. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/terraform/plugin.py +0 -0
  247. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/terragrunt/__init__.py +0 -0
  248. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/terragrunt/args.py +0 -0
  249. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/windows/__init__.py +0 -0
  250. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/windows/cli.py +0 -0
  251. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/windows/guide.py +0 -0
  252. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/windows/power.py +0 -0
  253. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/work/__init__.py +0 -0
  254. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/work/ai/__init__.py +0 -0
  255. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/work/ai/audit.py +0 -0
  256. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/work/ai/client.py +0 -0
  257. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/work/ai/models.py +0 -0
  258. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/work/ai/registry.py +0 -0
  259. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/work/ai/sources.py +0 -0
  260. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/work/ai/url_safety.py +0 -0
  261. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/work/explain.py +0 -0
  262. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/work/models.py +0 -0
  263. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/work/runner.py +0 -0
  264. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/plugins/work/skills.py +0 -0
  265. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/shell/__init__.py +0 -0
  266. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/shell/builtins.py +0 -0
  267. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/shell/context.py +0 -0
  268. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/shell/pipe.py +0 -0
  269. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/shell/repl.py +0 -0
  270. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/.ansible-lint +0 -0
  271. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/ansible.cfg +0 -0
  272. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/callback_plugins/infra_minimal.py +0 -0
  273. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/inventory.ini +0 -0
  274. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/requirements.yml +0 -0
  275. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/defaults/main.yml +0 -0
  276. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/meta/main.yml +0 -0
  277. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/README.md +0 -0
  278. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/ai.yml +0 -0
  279. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/ai_darwin.yml +0 -0
  280. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/ai_debian.yml +0 -0
  281. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/aliyun.yml +0 -0
  282. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/aliyun_darwin.yml +0 -0
  283. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/aliyun_debian.yml +0 -0
  284. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/aws.yml +0 -0
  285. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/aws_darwin.yml +0 -0
  286. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/aws_debian.yml +0 -0
  287. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/cli_ux.yml +0 -0
  288. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/cli_ux_darwin.yml +0 -0
  289. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/cli_ux_debian.yml +0 -0
  290. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/db_clients.yml +0 -0
  291. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/db_clients_darwin.yml +0 -0
  292. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/db_clients_debian.yml +0 -0
  293. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/deploy_user_config.yml +0 -0
  294. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/desktop_apps.yml +0 -0
  295. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/desktop_apps_darwin.yml +0 -0
  296. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/desktop_apps_debian.yml +0 -0
  297. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/developer.yml +0 -0
  298. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/developer_darwin.yml +0 -0
  299. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/developer_debian.yml +0 -0
  300. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/dnsmasq.yml +0 -0
  301. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/dnsmasq_darwin.yml +0 -0
  302. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/dnsmasq_debian.yml +0 -0
  303. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/docker.yml +0 -0
  304. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/docker_darwin.yml +0 -0
  305. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/docker_debian.yml +0 -0
  306. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/download_url.yml +0 -0
  307. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/fetch_uri.yml +0 -0
  308. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/frontend.yml +0 -0
  309. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/fzf.yml +0 -0
  310. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/fzf_darwin.yml +0 -0
  311. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/fzf_debian.yml +0 -0
  312. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/git.yml +0 -0
  313. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/git_darwin.yml +0 -0
  314. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/git_debian.yml +0 -0
  315. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/gpg.yml +0 -0
  316. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/gpg_darwin.yml +0 -0
  317. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/gpg_debian.yml +0 -0
  318. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/http_clients.yml +0 -0
  319. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/install_github_tarball.yml +0 -0
  320. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/iterm2.yml +0 -0
  321. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/iterm2_darwin.yml +0 -0
  322. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/iterm2_debian.yml +0 -0
  323. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/java.yml +0 -0
  324. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/java_darwin.yml +0 -0
  325. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/java_debian.yml +0 -0
  326. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/k8s.yml +0 -0
  327. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/k8s_darwin.yml +0 -0
  328. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/k8s_debian.yml +0 -0
  329. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/kind.yml +0 -0
  330. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/kind_darwin.yml +0 -0
  331. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/kind_debian.yml +0 -0
  332. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/linux_tune.yml +0 -0
  333. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/linux_tune_debian.yml +0 -0
  334. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/merge_editor_settings.yml +0 -0
  335. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/micromamba.yml +0 -0
  336. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/micromamba_darwin.yml +0 -0
  337. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/micromamba_debian.yml +0 -0
  338. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/minikube.yml +0 -0
  339. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/minikube_darwin.yml +0 -0
  340. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/minikube_debian.yml +0 -0
  341. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/mise.yml +0 -0
  342. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/mise_darwin.yml +0 -0
  343. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/mise_debian.yml +0 -0
  344. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/neovim.yml +0 -0
  345. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/neovim_darwin.yml +0 -0
  346. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/neovim_debian.yml +0 -0
  347. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/neteasy.yml +0 -0
  348. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/neteasy_darwin.yml +0 -0
  349. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/neteasy_debian.yml +0 -0
  350. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/oci.yml +0 -0
  351. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/oci_darwin.yml +0 -0
  352. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/oci_debian.yml +0 -0
  353. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/ollama.yml +0 -0
  354. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/ollama_darwin.yml +0 -0
  355. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/ollama_debian.yml +0 -0
  356. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/openresty.yml +0 -0
  357. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/openresty_darwin.yml +0 -0
  358. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/openresty_debian.yml +0 -0
  359. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/os_setup_darwin.yml +0 -0
  360. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/os_setup_debian.yml +0 -0
  361. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/packer.yml +0 -0
  362. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/packer_darwin.yml +0 -0
  363. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/packer_debian.yml +0 -0
  364. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/python.yml +0 -0
  365. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/python_debian.yml +0 -0
  366. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/qa.yml +0 -0
  367. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/qa_darwin.yml +0 -0
  368. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/qa_debian.yml +0 -0
  369. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/resolve_github_latest.yml +0 -0
  370. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/ssh.yml +0 -0
  371. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/ssh_darwin.yml +0 -0
  372. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/ssh_debian.yml +0 -0
  373. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/sshd_tune.yml +0 -0
  374. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/sshd_tune_debian.yml +0 -0
  375. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/supply_chain.yml +0 -0
  376. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/supply_chain_darwin.yml +0 -0
  377. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/supply_chain_debian.yml +0 -0
  378. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/task.yml +0 -0
  379. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/task_darwin.yml +0 -0
  380. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/task_debian.yml +0 -0
  381. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/tccli.yml +0 -0
  382. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/terraform.yml +0 -0
  383. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/terraform_darwin.yml +0 -0
  384. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/terraform_debian.yml +0 -0
  385. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/tmux.yml +0 -0
  386. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/tmux_darwin.yml +0 -0
  387. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/tmux_debian.yml +0 -0
  388. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/trivy.yml +0 -0
  389. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/trivy_darwin.yml +0 -0
  390. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/trivy_debian.yml +0 -0
  391. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/vim.yml +0 -0
  392. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/vim_darwin.yml +0 -0
  393. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/vim_debian.yml +0 -0
  394. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/zsh.yml +0 -0
  395. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/zsh_darwin.yml +0 -0
  396. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/tasks/zsh_debian.yml +0 -0
  397. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/templates/mise.toml.j2 +0 -0
  398. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/templates/ollama-launchagent.plist.j2 +0 -0
  399. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/templates/ollama-launchctl-env.sh.j2 +0 -0
  400. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/templates/ollama-systemd-override.conf.j2 +0 -0
  401. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/roles/common/templates/setup_user_env.sh.j2 +0 -0
  402. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/setup.yml +0 -0
  403. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ansible/vars.yml +0 -0
  404. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/aws/config +0 -0
  405. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/aws/credentials +0 -0
  406. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/aws_sso/config.ini +0 -0
  407. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/bat/config +0 -0
  408. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/claude/CLAUDE.APP.md +0 -0
  409. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/claude/CLAUDE.md +0 -0
  410. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/claude/README.md +0 -0
  411. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/claude/config.json +0 -0
  412. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/codex/config.toml +0 -0
  413. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/config/pypirc +0 -0
  414. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/copilot/settings.json +0 -0
  415. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/curl/curlrc +0 -0
  416. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/cursor/settings.json +0 -0
  417. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/desktop/README.md +0 -0
  418. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/developer/README.md +0 -0
  419. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/direnv/direnv.toml +0 -0
  420. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/direnv/envrc.example +0 -0
  421. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/dnsmasq/dnsmasq-local.conf +0 -0
  422. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/docker/config.json +0 -0
  423. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/docker/config.json.j2 +0 -0
  424. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/editorconfig/editorconfig +0 -0
  425. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/frontend/README.md +0 -0
  426. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/gemini/config.yaml +0 -0
  427. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/gh/config.yml +0 -0
  428. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/git/README.md +0 -0
  429. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/git/attributes +0 -0
  430. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/git/cpr.sh +0 -0
  431. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/git/gitconfig +0 -0
  432. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/git/ignore +0 -0
  433. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/git/mailmap +0 -0
  434. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/git/message +0 -0
  435. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/github/README.md +0 -0
  436. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/gpg/README.md +0 -0
  437. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/iterm2/README.md +0 -0
  438. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/iterm2/infra.json +0 -0
  439. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/k8s/README.md +0 -0
  440. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/mamba/mambarc +0 -0
  441. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/mongodb/README.md +0 -0
  442. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/mongodb/mongod-local.conf +0 -0
  443. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/mongodb/mongoshrc.js +0 -0
  444. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/mysql/README.md +0 -0
  445. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/mysql/my.cnf +0 -0
  446. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/mysql/mysqld-local.cnf +0 -0
  447. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/naming/README.md +0 -0
  448. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/nginx/README.md +0 -0
  449. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/nginx/nginx-local.conf +0 -0
  450. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/nvim/init.lua +0 -0
  451. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ollama/README.md +0 -0
  452. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/openresty/openresty-local.conf +0 -0
  453. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/packer/packer.pkrvars.hcl +0 -0
  454. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/python/README.md +0 -0
  455. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/python/pypirc +0 -0
  456. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/redis/README.md +0 -0
  457. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/redis/redis-local.conf +0 -0
  458. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/redis/redisclirc +0 -0
  459. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ripgrep/config +0 -0
  460. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/setup/setup.conf +0 -0
  461. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/setup/setup.overlay.example.yml +0 -0
  462. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/setup/setup.team.overlay.example.yml +0 -0
  463. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/shell/README.md +0 -0
  464. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/shell/aliases.sh +0 -0
  465. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ssh/README.md +0 -0
  466. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ssh/conf.d/1password.conf +0 -0
  467. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ssh/conf.d/github.conf +0 -0
  468. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/ssh/config +0 -0
  469. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/task/README.md +0 -0
  470. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/task/Taskfile.yml +0 -0
  471. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terraform/.terraform-docs.yml +0 -0
  472. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terraform/README.md +0 -0
  473. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terraform/repo/terraform/.gitignore +0 -0
  474. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terraform/repo/terraform/README.md +0 -0
  475. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terraform/repo/terraform/modules/README.md +0 -0
  476. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terraform/repo/terraform/sites/README.md +0 -0
  477. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terraform/repo/terraform/sites/stg/platform/example/main.tf +0 -0
  478. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terraform/repo/terraform/sites/stg/platform/example/outputs.tf +0 -0
  479. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terraform/repo/terraform/sites/stg/platform/example/variables.tf +0 -0
  480. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terraform/repo/terraform/sites/stg/platform/example/versions.tf +0 -0
  481. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terraform/terraform.env +0 -0
  482. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terraform/terraformrc +0 -0
  483. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terragrunt/repo/_envcommon/stack.hcl +0 -0
  484. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terragrunt/repo/account.hcl +0 -0
  485. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terragrunt/repo/env.hcl +0 -0
  486. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terragrunt/repo/leaf/terragrunt.hcl +0 -0
  487. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terragrunt/repo/region.hcl +0 -0
  488. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terragrunt/repo/root.hcl +0 -0
  489. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terragrunt/repo/terragrunt.hcl +0 -0
  490. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terragrunt/terragrunt.env +0 -0
  491. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/terragrunt/terragrunt.hcl +0 -0
  492. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/tmux/README.md +0 -0
  493. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/tmux/tmux.conf +0 -0
  494. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/vim/vimrc +0 -0
  495. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/vscode/settings.json +0 -0
  496. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/wget/wgetrc +0 -0
  497. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/work/README.md +0 -0
  498. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/work/skills/cost-review.yml +0 -0
  499. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/work/skills/eol-scan.yml +0 -0
  500. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/work/skills/iac-plan-check.yml +0 -0
  501. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/work/skills/security-pass.yml +0 -0
  502. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/templates/work/skills/workstation-health.yml +0 -0
  503. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/__init__.py +0 -0
  504. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/aws.py +0 -0
  505. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/backoff.py +0 -0
  506. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/best_practices/__init__.py +0 -0
  507. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/best_practices/ansible.py +0 -0
  508. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/best_practices/aws.py +0 -0
  509. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/best_practices/ci.py +0 -0
  510. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/best_practices/docker.py +0 -0
  511. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/best_practices/models.py +0 -0
  512. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/best_practices/naming.py +0 -0
  513. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/best_practices/packer.py +0 -0
  514. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/best_practices/task.py +0 -0
  515. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/best_practices/terraform.py +0 -0
  516. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/best_practices/terragrunt.py +0 -0
  517. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/catalog.py +0 -0
  518. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/docker.py +0 -0
  519. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/duration.py +0 -0
  520. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/env.py +0 -0
  521. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/logger.py +0 -0
  522. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/naming.py +0 -0
  523. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/stack_paths.py +0 -0
  524. {infra_cli-0.1.6 → infra_cli-0.3.0}/src/infra/utils/ui_select.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: infra-cli
3
- Version: 0.1.6
3
+ Version: 0.3.0
4
4
  Summary: Pluggable Infrastructure CLI as a wrapper around DevOps tools.
5
5
  Author-email: Youqing Han <ihanyouqing@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -27,6 +27,8 @@ Requires-Dist: requests>=2.28.0
27
27
  Provides-Extra: aws
28
28
  Requires-Dist: zxcvbn>=4.4.28; extra == "aws"
29
29
  Requires-Dist: openpyxl>=3.1.0; extra == "aws"
30
+ Requires-Dist: PyMySQL>=1.1.0; extra == "aws"
31
+ Requires-Dist: pg8000>=1.31.0; extra == "aws"
30
32
  Provides-Extra: server
31
33
  Requires-Dist: fastapi>=0.100.0; extra == "server"
32
34
  Requires-Dist: uvicorn>=0.20.0; extra == "server"
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "infra-cli"
7
- version = "0.1.6"
7
+ version = "0.3.0"
8
8
  description = "Pluggable Infrastructure CLI as a wrapper around DevOps tools."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -40,6 +40,8 @@ dependencies = [
40
40
  aws = [
41
41
  "zxcvbn>=4.4.28",
42
42
  "openpyxl>=3.1.0",
43
+ "PyMySQL>=1.1.0",
44
+ "pg8000>=1.31.0",
43
45
  ]
44
46
  server = [
45
47
  "fastapi>=0.100.0",
@@ -0,0 +1,5 @@
1
+ package=0.3.0
2
+ build_date=2026-10-27T14:15:55Z
3
+ commit=3da48c814f6ae9c9d0d71f8d63560db32b57c7c8
4
+ commit_time=2026-10-27T22:14:36+08:00
5
+ dirty=false
@@ -2,6 +2,7 @@ import typer
2
2
 
3
3
  from .ansible import ansible_app, ansible_callback
4
4
  from .config_cmds import config_app
5
+ from .docker import docker_app
5
6
  from .github import github_app
6
7
  from .packer import packer_app, packer_callback
7
8
  from .setup import setup_app
@@ -28,6 +29,12 @@ def register_commands(app: typer.Typer) -> None:
28
29
  app.add_typer(packer_app, name="packer", callback=packer_callback)
29
30
  app.add_typer(ansible_app, name="ansible", callback=ansible_callback)
30
31
  app.add_typer(setup_app, name="setup")
32
+ app.add_typer(docker_app, name="docker")
31
33
  app.add_typer(github_app, name="github")
34
+ app.add_typer(
35
+ github_app,
36
+ name="gh",
37
+ help="Alias for `github`.",
38
+ )
32
39
  app.add_typer(slack_app, name="slack")
33
40
  app.add_typer(config_app, name="config")
@@ -0,0 +1,65 @@
1
+ from typing import Annotated
2
+
3
+ import typer
4
+
5
+ from ..context import state
6
+ from ..plugins.docker_ps import run_docker_ps
7
+
8
+ docker_app = typer.Typer(
9
+ help=(
10
+ "Local Docker containers. With no verb, `ps` lists every container "
11
+ "(including stopped) with id, name, created time, and status."
12
+ ),
13
+ no_args_is_help=False,
14
+ rich_markup_mode=None,
15
+ context_settings={"help_option_names": ["-h", "--help"]},
16
+ )
17
+
18
+ SudoOpt = Annotated[
19
+ bool,
20
+ typer.Option(
21
+ "--sudo",
22
+ help="Run `sudo docker ps -a` (root docker.sock). Works before or after ps.",
23
+ ),
24
+ ]
25
+
26
+
27
+ def _ps(sudo: bool) -> None:
28
+ raise typer.Exit(code=run_docker_ps(sudo=sudo, dry_run=state.dry_run))
29
+
30
+
31
+ @docker_app.callback(invoke_without_command=True)
32
+ def docker_group(ctx: typer.Context, sudo: SudoOpt = False) -> None:
33
+ """List containers. Same columns as `docker ps -a` with a fixed format.
34
+
35
+ Examples:
36
+
37
+ infra docker ps
38
+
39
+ infra docker ps --sudo
40
+
41
+ infra docker --sudo
42
+ """
43
+ state.docker_sudo = sudo
44
+ if ctx.invoked_subcommand is None:
45
+ _ps(sudo)
46
+
47
+
48
+ @docker_app.command("ps")
49
+ def docker_ps(sudo: SudoOpt = False) -> None:
50
+ """List all containers: id, name, created time, and status.
51
+
52
+ Runs `docker ps -a --format` with columns ID, Names, CreatedAt, and
53
+ Status. `--sudo` is `sudo docker ps -a` for a root-owned docker.sock.
54
+ Without `--sudo`, Colima or Docker Desktop is used when DOCKER_HOST
55
+ is unset.
56
+
57
+ Examples:
58
+
59
+ infra docker ps
60
+
61
+ infra docker ps --sudo
62
+
63
+ infra docker --sudo ps
64
+ """
65
+ _ps(sudo or state.docker_sudo)
@@ -0,0 +1,103 @@
1
+ import sys
2
+
3
+ import typer
4
+
5
+ from ..context import state
6
+ from ..execute import execute_plugin
7
+ from ..plugins.github_pr import approve_pull_requests, merge_pull_requests
8
+ from .options import ExtraArgs
9
+
10
+ github_app = typer.Typer(
11
+ help=(
12
+ "Scaffold GitHub files and wrap `gh` for repo/PR tasks. `infra gh` is an alias."
13
+ ),
14
+ no_args_is_help=True,
15
+ rich_markup_mode=None,
16
+ context_settings={"help_option_names": ["-h", "--help"]},
17
+ )
18
+
19
+
20
+ @github_app.command(name="scaffold")
21
+ def github_scaffold() -> None:
22
+ """Write GitHub workflow/issue templates into this repository.
23
+
24
+ Examples:
25
+
26
+ infra github scaffold
27
+ """
28
+ state.subcommand = "scaffold"
29
+ execute_plugin("github")
30
+
31
+
32
+ @github_app.command(name="repo")
33
+ def github_repo(args: ExtraArgs = None) -> None:
34
+ """Manage GitHub repositories (forwards to `gh repo`).
35
+
36
+ Examples:
37
+
38
+ infra github repo view
39
+ """
40
+ state.subcommand = "repo"
41
+ execute_plugin("github", extra_args=args)
42
+
43
+
44
+ def _pr_parts(args: list[str] | None) -> list[str]:
45
+ parts = list(args or [])
46
+ if not parts or parts[0] not in {"approve", "merge"} or sys.stdin.isatty():
47
+ return parts
48
+ text = sys.stdin.read()
49
+ if not text.strip():
50
+ return parts
51
+ return [*parts, text]
52
+
53
+
54
+ @github_app.command(
55
+ name="pr",
56
+ context_settings={
57
+ "allow_extra_args": True,
58
+ "ignore_unknown_options": True,
59
+ "help_option_names": ["-h", "--help"],
60
+ },
61
+ )
62
+ def github_pr(ctx: typer.Context, args: ExtraArgs = None) -> None:
63
+ """Manage GitHub pull requests (forwards to `gh pr`).
64
+
65
+ ``approve`` runs ``gh pr review NUMBER --repo ORG/REPO --approve`` for
66
+ each pull request. ``merge`` runs ``gh pr merge NUMBER --repo ORG/REPO``.
67
+ Separate values with commas, spaces, or newlines. A bare number uses
68
+ the current directory's ``origin`` remote. A URL, ``org/repo#N``, or
69
+ ``org/repo/N`` selects the repo. The local checkout of
70
+ ``git@github.com:ORG/REPO.git`` is ``~/github.com/ORG/REPO``. A
71
+ symlink at that path, or in a parent directory, is followed.
72
+
73
+ ``merge`` accepts ``--squash``, ``--merge``, ``--rebase``,
74
+ ``--delete-branch`` (``-d``), ``--admin``, and ``--auto``. Pass a
75
+ merge method for non-interactive shells.
76
+
77
+ Other verbs are forwarded to ``gh pr``.
78
+
79
+ Examples:
80
+
81
+ infra gh pr approve 123
82
+
83
+ infra gh pr approve 123,456
84
+
85
+ infra gh pr approve acme/app#12 acme/web#34
86
+
87
+ infra gh pr approve https://github.com/acme/app/pull/12
88
+
89
+ infra gh pr merge 123 --squash
90
+
91
+ infra gh pr merge 123,456 --squash --delete-branch
92
+
93
+ infra gh pr merge acme/app#12 acme/web#34 --squash
94
+
95
+ infra github pr list
96
+ """
97
+ parts = _pr_parts([*(args or []), *list(ctx.args or [])])
98
+ if parts[:1] == ["approve"]:
99
+ raise typer.Exit(code=approve_pull_requests(parts[1:], dry_run=state.dry_run))
100
+ if parts[:1] == ["merge"]:
101
+ raise typer.Exit(code=merge_pull_requests(parts[1:], dry_run=state.dry_run))
102
+ state.subcommand = "pr"
103
+ execute_plugin("github", extra_args=parts or None)
@@ -4,9 +4,7 @@ import typer
4
4
 
5
5
  from ..utils.env import ENV_OPTION_HELP
6
6
 
7
- EnvOpt = Annotated[
8
- str | None, typer.Option("-e", "--env", help=ENV_OPTION_HELP)
9
- ]
7
+ EnvOpt = Annotated[str | None, typer.Option("-e", "--env", help=ENV_OPTION_HELP)]
10
8
  # Kept for packer / ansible; Terragrunt encodes account inside -s/-ss.
11
9
  ProjOpt = Annotated[
12
10
  str | None,
@@ -417,7 +417,9 @@ def _make_component_command(name: str, tags: tuple[str, ...]) -> None:
417
417
 
418
418
 
419
419
  # Reserved verbs stay as first-class commands above; components fill the rest.
420
- _RESERVED = frozenset({"run", "list", "doctor", "verify", "apply-team", "scaffold", "upgrade-cli"})
420
+ _RESERVED = frozenset(
421
+ {"run", "list", "doctor", "verify", "apply-team", "scaffold", "upgrade-cli"}
422
+ )
421
423
  for _name, _tags in COMPONENT_COMMANDS.items():
422
424
  if _name in _RESERVED:
423
425
  continue
@@ -10,8 +10,10 @@ class InfraContext:
10
10
  self.aws_hidden: bool = False
11
11
  self.aws_profile: str | None = None
12
12
  self.aws_region: str | None = None
13
+ self.aws_all_accounts: bool = False
13
14
  self.dry_run: bool = False
14
15
  self.verbose: bool = False
16
+ self.docker_sudo: bool = False
15
17
  self.extra_args: list[str] = []
16
18
  self.subcommand: str | None = None
17
19
  self.setup_profile: str = "core"
@@ -44,9 +44,7 @@ def _report_deps(section: str, deps: dict[str, str | None]) -> bool:
44
44
  print_stat(tool, path, color=typer.colors.GREEN)
45
45
  else:
46
46
  print_error(
47
- f"{tool}: not installed"
48
- if tool == "boto3"
49
- else f"{tool}: missing"
47
+ f"{tool}: not installed" if tool == "boto3" else f"{tool}: missing"
50
48
  )
51
49
  hint = setup_hint_for(tool)
52
50
  if hint:
@@ -55,7 +53,9 @@ def _report_deps(section: str, deps: dict[str, str | None]) -> bool:
55
53
  return ok
56
54
 
57
55
 
58
- def _plugin_enabled(full_config: dict[str, Any], name: str, *, default: bool = True) -> bool:
56
+ def _plugin_enabled(
57
+ full_config: dict[str, Any], name: str, *, default: bool = True
58
+ ) -> bool:
59
59
  block = full_config.get(name)
60
60
  if not isinstance(block, dict):
61
61
  return default
@@ -188,7 +188,9 @@ def _brew_fallback() -> str | None:
188
188
  return None
189
189
 
190
190
 
191
- def _collect_component_deps(full_config: dict[str, Any]) -> dict[str, dict[str, str | None]]:
191
+ def _collect_component_deps(
192
+ full_config: dict[str, Any],
193
+ ) -> dict[str, dict[str, str | None]]:
192
194
  """Build doctor sections for enabled ``setup.components``."""
193
195
  sections: dict[str, dict[str, str | None]] = {}
194
196
  system = platform.system().lower()
@@ -199,7 +201,11 @@ def _collect_component_deps(full_config: dict[str, Any]) -> dict[str, dict[str,
199
201
  continue
200
202
  deps: dict[str, str | None] = {}
201
203
  for display_key, kind, target in checks:
202
- if kind == "path" and target.startswith("/Applications/") and system != "darwin":
204
+ if (
205
+ kind == "path"
206
+ and target.startswith("/Applications/")
207
+ and system != "darwin"
208
+ ):
203
209
  continue
204
210
  if kind == "path" and target.startswith("/etc/") and system != "linux":
205
211
  continue
@@ -0,0 +1,236 @@
1
+ """Single-account describe runner shared by ``infra aws <service> describe``.
2
+
3
+ The current profile and that profile's region are the only scope. A target
4
+ may match more than one resource; every match is printed. JSON goes to
5
+ stdout. Human text and the Field/Value table go to the terminal.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import ipaddress
11
+ import json
12
+ from collections.abc import Callable, Sequence
13
+ from typing import Any
14
+
15
+ import typer
16
+ from botocore.config import Config
17
+ from botocore.exceptions import BotoCoreError, ClientError
18
+ from rich.console import Console
19
+ from rich.table import Table
20
+
21
+ from ...utils.ui import (
22
+ echo_styled,
23
+ format_profile_region,
24
+ hl,
25
+ hl_profile,
26
+ hl_region,
27
+ print_error,
28
+ print_warning,
29
+ )
30
+ from .inventory.match import address_matches, lookup_host_ips
31
+ from .profiles import resolve_cached_profile
32
+ from .runtime import open_boto3_session
33
+
34
+ FETCH_TIMEOUT = 15
35
+ VALID_OUTPUT = frozenset({"table", "json"})
36
+
37
+ Collect = Callable[[Any, str], list[dict[str, Any]]]
38
+ Display = Callable[[dict[str, Any], str], Any]
39
+
40
+
41
+ def tags_dict(tags: list[dict[str, Any]] | None) -> dict[str, str]:
42
+ found: dict[str, str] = {}
43
+ for tag in tags or []:
44
+ key = str(tag.get("Key") or tag.get("key") or "")
45
+ if key:
46
+ found[key] = str(tag.get("Value") or tag.get("value") or "")
47
+ return found
48
+
49
+
50
+ def num_str(value: Any) -> str:
51
+ if value is None:
52
+ return ""
53
+ return str(value)
54
+
55
+
56
+ def display_value(value: Any) -> str:
57
+ if isinstance(value, dict):
58
+ return ", ".join(f"{key}={item}" for key, item in value.items())
59
+ if isinstance(value, list):
60
+ parts: list[str] = []
61
+ for item in value:
62
+ if isinstance(item, dict):
63
+ text = " ".join(f"{key}={item[key]}" for key in item if item[key])
64
+ if text:
65
+ parts.append(text)
66
+ elif item:
67
+ parts.append(str(item))
68
+ return ", ".join(parts)
69
+ return str(value or "")
70
+
71
+
72
+ def host_hit(hosts: Sequence[str], target: str) -> bool:
73
+ """True when ``target`` is a hostname or the IPv4 it resolves to."""
74
+ wanted = target.strip().rstrip(".").lower()
75
+ if not wanted:
76
+ return False
77
+ cleaned = [host.strip().rstrip(".") for host in hosts if host and str(host).strip()]
78
+ for host in cleaned:
79
+ if host.lower() == wanted:
80
+ return True
81
+ try:
82
+ is_ipv4 = ipaddress.ip_address(wanted).version == 4
83
+ except ValueError:
84
+ return False
85
+ if not is_ipv4:
86
+ return False
87
+ return address_matches(cleaned, [wanted], lookup_host_ips)
88
+
89
+
90
+ def _render_table(
91
+ details: list[dict[str, Any]],
92
+ *,
93
+ label: str,
94
+ profile: str,
95
+ region: str,
96
+ fields: tuple[tuple[str, str], ...],
97
+ id_key: str,
98
+ name_key: str,
99
+ display: Display,
100
+ ) -> None:
101
+ from rich.markup import escape
102
+ from rich.text import Text
103
+
104
+ console = Console(width=200)
105
+ for detail in details:
106
+ id_val = str(detail.get(id_key) or "")
107
+ title = f"{label} describe [cyan bold]{escape(id_val)}[/]"
108
+ name = str(detail.get(name_key) or "") if name_key else ""
109
+ if name and name != id_val:
110
+ title += f" [cyan]{escape(name)}[/]"
111
+ title += (
112
+ f" profile=[yellow bold]{escape(profile)}[/] "
113
+ f"region=[blue bold]{escape(region)}[/]"
114
+ )
115
+ table = Table(title=title, show_header=True)
116
+ table.add_column("Field", style="cyan")
117
+ table.add_column("Value", overflow="fold")
118
+ for key, field_label in fields:
119
+ cell = display(detail, key)
120
+ if key == id_key and isinstance(cell, str) and cell:
121
+ cell = Text(cell, style="cyan bold")
122
+ elif key == name_key and isinstance(cell, str) and cell and cell != id_val:
123
+ cell = Text(cell, style="yellow bold")
124
+ table.add_row(field_label, cell)
125
+ console.print(table)
126
+
127
+
128
+ def _print_api_failure(
129
+ exc: BaseException, profile_name: str, label: str, noun: str
130
+ ) -> None:
131
+ msg = str(exc)
132
+ print_error(f"{label} describe failed: {msg}")
133
+ if "SSO Token" in msg or "Token for" in msg or "ExpiredToken" in msg:
134
+ print_warning(f" Run: infra aws login --profile {profile_name}")
135
+ elif "NotFound" in msg or "does not exist" in msg or "InvalidInstanceID" in msg:
136
+ print_warning(
137
+ f"Profile '{profile_name}' needs a valid {noun} in this region. "
138
+ f"Run: infra aws login --profile {profile_name}"
139
+ )
140
+
141
+
142
+ def run_resource_describe(
143
+ target: str,
144
+ *,
145
+ profile: str | None,
146
+ region: str | None,
147
+ output: str,
148
+ client_name: str,
149
+ label: str,
150
+ noun: str,
151
+ many_label: str,
152
+ missing_target: str,
153
+ dry_run_api: str,
154
+ fields: tuple[tuple[str, str], ...],
155
+ collect: Collect,
156
+ id_key: str,
157
+ name_key: str = "name",
158
+ display: Display | None = None,
159
+ dry_run: bool = False,
160
+ ) -> int:
161
+ show = display or (lambda detail, key: display_value(detail.get(key)))
162
+ out_fmt = (output or "table").strip().lower()
163
+ if out_fmt not in VALID_OUTPUT:
164
+ print_error(f"Unknown --format: {output}. Use table or json.")
165
+ return 1
166
+ text = (target or "").strip()
167
+ if not text:
168
+ print_error(missing_target)
169
+ return 1
170
+
171
+ profile_name = resolve_cached_profile(profile)
172
+ if not profile_name:
173
+ print_warning(
174
+ "No AWS profile selected. Run `infra aws select` or pass --profile."
175
+ )
176
+ return 1
177
+
178
+ from ...utils.aws import resolve_aws_region
179
+
180
+ session = open_boto3_session(profile_name, region_name=region)
181
+ if session is None:
182
+ return 1
183
+
184
+ region_name = resolve_aws_region(region, session.region_name)
185
+ if not region_name:
186
+ print_error(
187
+ "Pass --region, set AWS_DEFAULT_REGION / AWS_REGION, or set aws.region."
188
+ )
189
+ return 1
190
+
191
+ if dry_run:
192
+ echo_styled(
193
+ f"ℹ️ [DRY-RUN] {dry_run_api} "
194
+ f"target={hl(text, fg=typer.colors.YELLOW)} "
195
+ f"{format_profile_region(profile_name, region_name)}"
196
+ )
197
+ return 0
198
+
199
+ boto_cfg = Config(
200
+ connect_timeout=FETCH_TIMEOUT,
201
+ read_timeout=FETCH_TIMEOUT,
202
+ retries={"max_attempts": 3},
203
+ )
204
+ client = session.client(client_name, region_name=region_name, config=boto_cfg)
205
+ try:
206
+ details = collect(client, text)
207
+ except (ClientError, BotoCoreError) as exc:
208
+ _print_api_failure(exc, profile_name, label, noun)
209
+ return 1
210
+
211
+ if len(details) > 1:
212
+ echo_styled(
213
+ f"ℹ️ {len(details)} {many_label} matched "
214
+ f"{hl(text, fg=typer.colors.YELLOW)}.",
215
+ err=True,
216
+ )
217
+ if out_fmt == "json":
218
+ typer.echo(json.dumps(details, indent=2))
219
+ elif details:
220
+ _render_table(
221
+ details,
222
+ label=label,
223
+ profile=profile_name,
224
+ region=region_name,
225
+ fields=fields,
226
+ id_key=id_key,
227
+ name_key=name_key,
228
+ display=show,
229
+ )
230
+ else:
231
+ echo_styled(
232
+ f"⚠️ No {noun} matched {hl(text, fg=typer.colors.YELLOW)} "
233
+ f"(profile={hl_profile(profile_name)}, region={hl_region(region_name)}).",
234
+ err=True,
235
+ )
236
+ return 0 if details else 1