agent-starter-pack 0.3.3__py3-none-any.whl → 0.21.0__py3-none-any.whl

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 (255) hide show
  1. agent_starter_pack/agents/README.md +7 -0
  2. agents/langgraph_base_react/template/.templateconfig.yaml → agent_starter_pack/agents/adk_a2a_base/.template/templateconfig.yaml +5 -10
  3. agent_starter_pack/agents/adk_a2a_base/README.md +37 -0
  4. src/deployment_targets/cloud_run/Dockerfile → agent_starter_pack/agents/adk_a2a_base/app/__init__.py +2 -14
  5. agent_starter_pack/agents/adk_a2a_base/app/agent.py +70 -0
  6. agent_starter_pack/agents/adk_a2a_base/notebooks/adk_a2a_app_testing.ipynb +583 -0
  7. agents/crewai_coding_crew/notebooks/evaluating_crewai_agent.ipynb → agent_starter_pack/agents/adk_a2a_base/notebooks/evaluating_adk_agent.ipynb +163 -199
  8. {agents/adk_base → agent_starter_pack/agents/adk_a2a_base}/tests/integration/test_agent.py +2 -2
  9. agents/adk_base/template/.templateconfig.yaml → agent_starter_pack/agents/adk_base/.template/templateconfig.yaml +4 -1
  10. {agents → agent_starter_pack/agents}/adk_base/README.md +1 -1
  11. agent_starter_pack/agents/adk_base/app/__init__.py +17 -0
  12. {agents → agent_starter_pack/agents}/adk_base/app/agent.py +5 -2
  13. {agents → agent_starter_pack/agents}/adk_base/notebooks/adk_app_testing.ipynb +128 -82
  14. agents/langgraph_base_react/notebooks/evaluating_langgraph_agent.ipynb → agent_starter_pack/agents/adk_base/notebooks/evaluating_adk_agent.ipynb +181 -207
  15. agent_starter_pack/agents/adk_base/tests/integration/test_agent.py +58 -0
  16. agents/crewai_coding_crew/template/.templateconfig.yaml → agent_starter_pack/agents/adk_live/.template/templateconfig.yaml +5 -9
  17. agent_starter_pack/agents/adk_live/README.md +32 -0
  18. agent_starter_pack/agents/adk_live/app/__init__.py +17 -0
  19. agent_starter_pack/agents/adk_live/app/agent.py +51 -0
  20. agent_starter_pack/agents/adk_live/tests/unit/test_dummy.py +38 -0
  21. agents/agentic_rag/template/.templateconfig.yaml → agent_starter_pack/agents/agentic_rag/.template/templateconfig.yaml +7 -3
  22. {agents → agent_starter_pack/agents}/agentic_rag/README.md +1 -1
  23. agent_starter_pack/agents/agentic_rag/app/__init__.py +17 -0
  24. {agents → agent_starter_pack/agents}/agentic_rag/app/agent.py +8 -4
  25. {agents → agent_starter_pack/agents}/agentic_rag/notebooks/adk_app_testing.ipynb +128 -82
  26. agent_starter_pack/agents/agentic_rag/notebooks/evaluating_adk_agent.ipynb +1535 -0
  27. {agents → agent_starter_pack/agents}/agentic_rag/tests/integration/test_agent.py +3 -3
  28. agent_starter_pack/agents/langgraph_base/.template/templateconfig.yaml +31 -0
  29. agent_starter_pack/agents/langgraph_base/README.md +30 -0
  30. agent_starter_pack/agents/langgraph_base/app/__init__.py +17 -0
  31. agent_starter_pack/agents/langgraph_base/app/agent.py +34 -0
  32. {agents/crewai_coding_crew → agent_starter_pack/agents/langgraph_base}/notebooks/evaluating_langgraph_agent.ipynb +30 -17
  33. {agents/langgraph_base_react → agent_starter_pack/agents/langgraph_base}/tests/integration/test_agent.py +2 -2
  34. {src → agent_starter_pack}/base_template/.gitignore +5 -3
  35. agent_starter_pack/base_template/GEMINI.md +5 -0
  36. agent_starter_pack/base_template/Makefile +339 -0
  37. agent_starter_pack/base_template/README.md +267 -0
  38. agent_starter_pack/base_template/deployment/README.md +11 -0
  39. {src → agent_starter_pack}/base_template/deployment/terraform/apis.tf +2 -2
  40. {src → agent_starter_pack}/base_template/deployment/terraform/dev/apis.tf +6 -1
  41. {src → agent_starter_pack}/base_template/deployment/terraform/dev/iam.tf +12 -11
  42. {src → agent_starter_pack}/base_template/deployment/terraform/dev/providers.tf +5 -1
  43. {src → agent_starter_pack}/base_template/deployment/terraform/dev/storage.tf +1 -1
  44. {src → agent_starter_pack}/base_template/deployment/terraform/dev/variables.tf +10 -10
  45. agent_starter_pack/base_template/deployment/terraform/dev/{% if cookiecutter.is_adk %}telemetry.tf{% else %}unused_telemetry.tf{% endif %} +193 -0
  46. agent_starter_pack/base_template/deployment/terraform/github.tf +337 -0
  47. {src → agent_starter_pack}/base_template/deployment/terraform/iam.tf +20 -41
  48. {src → agent_starter_pack}/base_template/deployment/terraform/locals.tf +10 -3
  49. {src/resources/setup_cicd → agent_starter_pack/base_template/deployment/terraform}/providers.tf +8 -1
  50. {src → agent_starter_pack}/base_template/deployment/terraform/service_accounts.tf +7 -8
  51. agent_starter_pack/base_template/deployment/terraform/sql/completions.sql +138 -0
  52. {src → agent_starter_pack}/base_template/deployment/terraform/storage.tf +7 -16
  53. {src → agent_starter_pack}/base_template/deployment/terraform/variables.tf +61 -28
  54. {src → agent_starter_pack}/base_template/deployment/terraform/vars/env.tfvars +6 -1
  55. agent_starter_pack/base_template/deployment/terraform/{% if cookiecutter.cicd_runner == 'github_actions' %}wif.tf{% else %}unused_wif.tf{% endif %} +43 -0
  56. src/base_template/deployment/terraform/build_triggers.tf → agent_starter_pack/base_template/deployment/terraform/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}build_triggers.tf{% else %}unused_build_triggers.tf{% endif %} +55 -38
  57. agent_starter_pack/base_template/deployment/terraform/{% if cookiecutter.is_adk %}telemetry.tf{% else %}unused_telemetry.tf{% endif %} +206 -0
  58. {src → agent_starter_pack}/base_template/pyproject.toml +24 -37
  59. agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/deploy-to-prod.yaml +132 -0
  60. agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/pr_checks.yaml +65 -0
  61. agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/staging.yaml +259 -0
  62. src/base_template/deployment/cd/deploy-to-prod.yaml → agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/deploy-to-prod.yaml +38 -30
  63. src/base_template/deployment/ci/pr_checks.yaml → agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/pr_checks.yaml +5 -5
  64. agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/staging.yaml +322 -0
  65. agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/telemetry.py +96 -0
  66. {src/base_template/app/utils → agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils}/typing.py +7 -9
  67. agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_a2a and cookiecutter.agent_name == 'langgraph_base' %}converters{% else %}unused_converters{% endif %}/__init__.py +25 -0
  68. agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_a2a and cookiecutter.agent_name == 'langgraph_base' %}converters{% else %}unused_converters{% endif %}/part_converter.py +138 -0
  69. agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_a2a and cookiecutter.agent_name == 'langgraph_base' %}executor{% else %}unused_executor{% endif %}/__init__.py +13 -0
  70. agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_a2a and cookiecutter.agent_name == 'langgraph_base' %}executor{% else %}unused_executor{% endif %}/a2a_agent_executor.py +265 -0
  71. agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_a2a and cookiecutter.agent_name == 'langgraph_base' %}executor{% else %}unused_executor{% endif %}/task_result_aggregator.py +152 -0
  72. agent_starter_pack/cli/commands/create.py +1256 -0
  73. agent_starter_pack/cli/commands/enhance.py +611 -0
  74. agent_starter_pack/cli/commands/list.py +203 -0
  75. agent_starter_pack/cli/commands/register_gemini_enterprise.py +1070 -0
  76. agent_starter_pack/cli/commands/setup_cicd.py +862 -0
  77. {src → agent_starter_pack}/cli/main.py +10 -2
  78. {src → agent_starter_pack}/cli/utils/cicd.py +139 -48
  79. agent_starter_pack/cli/utils/gcp.py +263 -0
  80. agent_starter_pack/cli/utils/logging.py +103 -0
  81. agent_starter_pack/cli/utils/remote_template.py +677 -0
  82. agent_starter_pack/cli/utils/template.py +1466 -0
  83. {src → agent_starter_pack}/data_ingestion/data_ingestion_pipeline/components/process_data.py +1 -1
  84. {src → agent_starter_pack}/data_ingestion/data_ingestion_pipeline/submit_pipeline.py +20 -6
  85. {src → agent_starter_pack}/data_ingestion/pyproject.toml +1 -0
  86. {src → agent_starter_pack}/data_ingestion/uv.lock +602 -494
  87. agent_starter_pack/deployment_targets/agent_engine/tests/integration/test_agent_engine_app.py +484 -0
  88. agent_starter_pack/deployment_targets/agent_engine/tests/load_test/README.md +84 -0
  89. agent_starter_pack/deployment_targets/agent_engine/tests/load_test/load_test.py +424 -0
  90. agent_starter_pack/deployment_targets/agent_engine/tests/{% if cookiecutter.is_a2a %}helpers.py{% else %}unused_helpers.py{% endif %} +138 -0
  91. agent_starter_pack/deployment_targets/agent_engine/{{cookiecutter.agent_directory}}/agent_engine_app.py +263 -0
  92. agent_starter_pack/deployment_targets/agent_engine/{{cookiecutter.agent_directory}}/app_utils/deploy.py +414 -0
  93. agent_starter_pack/deployment_targets/agent_engine/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_adk_live %}expose_app.py{% else %}unused_expose_app.py{% endif %} +519 -0
  94. agent_starter_pack/deployment_targets/cloud_run/Dockerfile +51 -0
  95. agent_starter_pack/deployment_targets/cloud_run/deployment/terraform/dev/service.tf +243 -0
  96. agent_starter_pack/deployment_targets/cloud_run/deployment/terraform/service.tf +417 -0
  97. agent_starter_pack/deployment_targets/cloud_run/tests/integration/test_server_e2e.py +705 -0
  98. agent_starter_pack/deployment_targets/cloud_run/tests/load_test/.results/.placeholder +321 -0
  99. agent_starter_pack/deployment_targets/cloud_run/tests/load_test/README.md +165 -0
  100. agent_starter_pack/deployment_targets/cloud_run/tests/load_test/load_test.py +329 -0
  101. agent_starter_pack/deployment_targets/cloud_run/{{cookiecutter.agent_directory}}/fast_api_app.py +556 -0
  102. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/package-lock.json +79 -1044
  103. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/package.json +1 -9
  104. agent_starter_pack/frontends/adk_live_react/frontend/src/App.tsx +65 -0
  105. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/components/logger/Logger.tsx +8 -3
  106. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/components/logger/logger.scss +26 -0
  107. agent_starter_pack/frontends/adk_live_react/frontend/src/components/side-panel/SidePanel.tsx +516 -0
  108. agent_starter_pack/frontends/adk_live_react/frontend/src/components/side-panel/side-panel.scss +563 -0
  109. agent_starter_pack/frontends/adk_live_react/frontend/src/components/transcription-preview/TranscriptionPreview.tsx +106 -0
  110. agent_starter_pack/frontends/adk_live_react/frontend/src/components/transcription-preview/transcription-preview.scss +150 -0
  111. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/hooks/use-live-api.ts +8 -2
  112. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/multimodal-live-types.ts +40 -2
  113. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/audio-recorder.ts +1 -1
  114. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/audio-streamer.ts +1 -1
  115. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/multimodal-live-client.ts +210 -24
  116. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/utils.ts +27 -5
  117. agent_starter_pack/resources/docs/adk-cheatsheet.md +1628 -0
  118. agent_starter_pack/resources/locks/uv-adk_a2a_base-agent_engine.lock +4966 -0
  119. agent_starter_pack/resources/locks/uv-adk_a2a_base-cloud_run.lock +5011 -0
  120. agent_starter_pack/resources/locks/uv-adk_base-agent_engine.lock +4946 -0
  121. agent_starter_pack/resources/locks/uv-adk_base-cloud_run.lock +4991 -0
  122. agent_starter_pack/resources/locks/uv-adk_live-agent_engine.lock +4963 -0
  123. agent_starter_pack/resources/locks/uv-adk_live-cloud_run.lock +5006 -0
  124. agent_starter_pack/resources/locks/uv-agentic_rag-agent_engine.lock +5487 -0
  125. agent_starter_pack/resources/locks/uv-agentic_rag-cloud_run.lock +5532 -0
  126. agent_starter_pack/resources/locks/uv-langgraph_base-agent_engine.lock +5788 -0
  127. agent_starter_pack/resources/locks/uv-langgraph_base-cloud_run.lock +5811 -0
  128. {src → agent_starter_pack}/utils/generate_locks.py +15 -12
  129. {src → agent_starter_pack}/utils/lock_utils.py +4 -7
  130. {src → agent_starter_pack}/utils/watch_and_rebuild.py +2 -2
  131. agent_starter_pack-0.21.0.dist-info/METADATA +182 -0
  132. agent_starter_pack-0.21.0.dist-info/RECORD +171 -0
  133. agent_starter_pack-0.21.0.dist-info/entry_points.txt +2 -0
  134. llm.txt +362 -0
  135. agent_starter_pack-0.3.3.dist-info/METADATA +0 -164
  136. agent_starter_pack-0.3.3.dist-info/RECORD +0 -176
  137. agent_starter_pack-0.3.3.dist-info/entry_points.txt +0 -2
  138. agents/crewai_coding_crew/README.md +0 -34
  139. agents/crewai_coding_crew/app/agent.py +0 -86
  140. agents/crewai_coding_crew/app/crew/config/agents.yaml +0 -39
  141. agents/crewai_coding_crew/app/crew/config/tasks.yaml +0 -37
  142. agents/crewai_coding_crew/app/crew/crew.py +0 -71
  143. agents/crewai_coding_crew/tests/integration/test_agent.py +0 -47
  144. agents/langgraph_base_react/README.md +0 -9
  145. agents/langgraph_base_react/app/agent.py +0 -73
  146. agents/live_api/README.md +0 -37
  147. agents/live_api/app/agent.py +0 -78
  148. agents/live_api/app/server.py +0 -196
  149. agents/live_api/app/templates.py +0 -51
  150. agents/live_api/app/vector_store.py +0 -55
  151. agents/live_api/template/.templateconfig.yaml +0 -29
  152. agents/live_api/tests/integration/test_server_e2e.py +0 -254
  153. agents/live_api/tests/load_test/load_test.py +0 -40
  154. agents/live_api/tests/unit/test_server.py +0 -143
  155. src/base_template/Makefile +0 -72
  156. src/base_template/README.md +0 -208
  157. src/base_template/app/__init__.py +0 -3
  158. src/base_template/app/utils/tracing.py +0 -155
  159. src/base_template/deployment/README.md +0 -126
  160. src/base_template/deployment/cd/staging.yaml +0 -216
  161. src/base_template/deployment/terraform/dev/log_sinks.tf +0 -63
  162. src/base_template/deployment/terraform/log_sinks.tf +0 -70
  163. src/base_template/deployment/terraform/providers.tf +0 -37
  164. src/cli/commands/create.py +0 -664
  165. src/cli/commands/setup_cicd.py +0 -829
  166. src/cli/utils/gcp.py +0 -117
  167. src/cli/utils/logging.py +0 -51
  168. src/cli/utils/template.py +0 -737
  169. src/deployment_targets/agent_engine/app/agent_engine_app.py +0 -336
  170. src/deployment_targets/agent_engine/notebooks/intro_agent_engine.ipynb +0 -1025
  171. src/deployment_targets/agent_engine/tests/integration/test_agent_engine_app.py +0 -183
  172. src/deployment_targets/agent_engine/tests/load_test/README.md +0 -42
  173. src/deployment_targets/agent_engine/tests/load_test/load_test.py +0 -107
  174. src/deployment_targets/cloud_run/app/server.py +0 -154
  175. src/deployment_targets/cloud_run/tests/integration/test_server_e2e.py +0 -249
  176. src/deployment_targets/cloud_run/tests/load_test/.results/.placeholder +0 -0
  177. src/deployment_targets/cloud_run/tests/load_test/README.md +0 -83
  178. src/deployment_targets/cloud_run/tests/load_test/load_test.py +0 -118
  179. src/deployment_targets/cloud_run/uv.lock +0 -6952
  180. src/frontends/live_api_react/frontend/src/App.tsx +0 -205
  181. src/frontends/live_api_react/frontend/src/components/control-tray/ControlTray.tsx +0 -217
  182. src/frontends/live_api_react/frontend/src/components/control-tray/control-tray.scss +0 -201
  183. src/frontends/live_api_react/frontend/src/components/side-panel/SidePanel.tsx +0 -161
  184. src/frontends/live_api_react/frontend/src/components/side-panel/side-panel.scss +0 -285
  185. src/frontends/streamlit/frontend/side_bar.py +0 -214
  186. src/frontends/streamlit/frontend/streamlit_app.py +0 -265
  187. src/frontends/streamlit/frontend/style/app_markdown.py +0 -37
  188. src/frontends/streamlit/frontend/utils/chat_utils.py +0 -67
  189. src/frontends/streamlit/frontend/utils/local_chat_history.py +0 -125
  190. src/frontends/streamlit/frontend/utils/message_editing.py +0 -59
  191. src/frontends/streamlit/frontend/utils/multimodal_utils.py +0 -217
  192. src/frontends/streamlit/frontend/utils/stream_handler.py +0 -301
  193. src/frontends/streamlit/frontend/utils/title_summary.py +0 -94
  194. src/frontends/streamlit_adk/frontend/side_bar.py +0 -214
  195. src/frontends/streamlit_adk/frontend/streamlit_app.py +0 -314
  196. src/frontends/streamlit_adk/frontend/style/app_markdown.py +0 -37
  197. src/frontends/streamlit_adk/frontend/utils/chat_utils.py +0 -84
  198. src/frontends/streamlit_adk/frontend/utils/local_chat_history.py +0 -110
  199. src/frontends/streamlit_adk/frontend/utils/message_editing.py +0 -61
  200. src/frontends/streamlit_adk/frontend/utils/multimodal_utils.py +0 -223
  201. src/frontends/streamlit_adk/frontend/utils/stream_handler.py +0 -311
  202. src/frontends/streamlit_adk/frontend/utils/title_summary.py +0 -129
  203. src/resources/containers/data_processing/Dockerfile +0 -27
  204. src/resources/containers/e2e-tests/Dockerfile +0 -19
  205. src/resources/idx/.idx/dev.nix +0 -57
  206. src/resources/idx/idx-template.json +0 -21
  207. src/resources/idx/idx-template.nix +0 -26
  208. src/resources/locks/uv-adk_base-agent_engine.lock +0 -5338
  209. src/resources/locks/uv-adk_base-cloud_run.lock +0 -5930
  210. src/resources/locks/uv-agentic_rag-agent_engine.lock +0 -5528
  211. src/resources/locks/uv-agentic_rag-cloud_run.lock +0 -6120
  212. src/resources/locks/uv-crewai_coding_crew-agent_engine.lock +0 -6231
  213. src/resources/locks/uv-crewai_coding_crew-cloud_run.lock +0 -6839
  214. src/resources/locks/uv-langgraph_base_react-agent_engine.lock +0 -5233
  215. src/resources/locks/uv-langgraph_base_react-cloud_run.lock +0 -5862
  216. src/resources/locks/uv-live_api-cloud_run.lock +0 -5832
  217. src/resources/setup_cicd/cicd_variables.tf +0 -41
  218. src/resources/setup_cicd/github.tf +0 -87
  219. {agents → agent_starter_pack/agents}/agentic_rag/app/retrievers.py +0 -0
  220. {agents → agent_starter_pack/agents}/agentic_rag/app/templates.py +0 -0
  221. {src → agent_starter_pack}/base_template/deployment/terraform/dev/vars/env.tfvars +0 -0
  222. {src → agent_starter_pack}/base_template/tests/unit/test_dummy.py +0 -0
  223. {src/deployment_targets/agent_engine/app/utils → agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils}/gcs.py +0 -0
  224. {src → agent_starter_pack}/cli/utils/__init__.py +0 -0
  225. {src → agent_starter_pack}/cli/utils/datastores.py +0 -0
  226. {src → agent_starter_pack}/cli/utils/version.py +0 -0
  227. {src → agent_starter_pack}/data_ingestion/README.md +0 -0
  228. {src → agent_starter_pack}/data_ingestion/data_ingestion_pipeline/components/ingest_data.py +0 -0
  229. {src → agent_starter_pack}/data_ingestion/data_ingestion_pipeline/pipeline.py +0 -0
  230. {src → agent_starter_pack}/deployment_targets/agent_engine/deployment_metadata.json +0 -0
  231. {src → agent_starter_pack}/deployment_targets/agent_engine/tests/load_test/.results/.placeholder +0 -0
  232. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/public/favicon.ico +0 -0
  233. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/public/index.html +0 -0
  234. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/public/robots.txt +0 -0
  235. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/App.scss +0 -0
  236. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/App.test.tsx +0 -0
  237. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/components/audio-pulse/AudioPulse.tsx +0 -0
  238. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/components/audio-pulse/audio-pulse.scss +0 -0
  239. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/components/logger/mock-logs.ts +0 -0
  240. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/contexts/LiveAPIContext.tsx +0 -0
  241. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/hooks/use-media-stream-mux.ts +0 -0
  242. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/hooks/use-screen-capture.ts +0 -0
  243. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/hooks/use-webcam.ts +0 -0
  244. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/index.css +0 -0
  245. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/index.tsx +0 -0
  246. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/react-app-env.d.ts +0 -0
  247. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/reportWebVitals.ts +0 -0
  248. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/setupTests.ts +0 -0
  249. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/audioworklet-registry.ts +0 -0
  250. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/store-logger.ts +0 -0
  251. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/worklets/audio-processing.ts +0 -0
  252. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/worklets/vol-meter.ts +0 -0
  253. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/tsconfig.json +0 -0
  254. {agent_starter_pack-0.3.3.dist-info → agent_starter_pack-0.21.0.dist-info}/WHEEL +0 -0
  255. {agent_starter_pack-0.3.3.dist-info → agent_starter_pack-0.21.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,829 +0,0 @@
1
- # Copyright 2025 Google LLC
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- import json
16
- import logging
17
- import re
18
- import shutil
19
- import subprocess
20
- import sys
21
- import tempfile
22
- import time
23
- from pathlib import Path
24
-
25
- import backoff
26
- import click
27
- from rich.console import Console
28
-
29
- from src.cli.utils.cicd import (
30
- E2EDeployment,
31
- ProjectConfig,
32
- create_github_connection,
33
- create_github_repository,
34
- ensure_apis_enabled,
35
- handle_github_authentication,
36
- is_github_authenticated,
37
- print_cicd_summary,
38
- run_command,
39
- )
40
-
41
- console = Console()
42
-
43
-
44
- def display_intro_message() -> None:
45
- """Display introduction and warning messages about the setup-cicd command."""
46
- console.print(
47
- "\n⚠️ WARNING: The setup-cicd command is experimental and may have unexpected behavior.",
48
- style="bold yellow",
49
- )
50
- console.print("Please report any issues you encounter.\n")
51
-
52
- console.print("\n📋 About this command:", style="bold blue")
53
- console.print(
54
- "This command helps set up a basic CI/CD pipeline for development and testing purposes."
55
- )
56
- console.print("It will:")
57
- console.print("- Create a GitHub repository and connect it to Cloud Build")
58
- console.print("- Set up development environment infrastructure")
59
- console.print("- Configure basic CI/CD triggers for PR checks and deployments")
60
- console.print(
61
- "- Configure remote Terraform state in GCS (use --local-state to use local state instead)"
62
- )
63
-
64
-
65
- def display_production_note() -> None:
66
- """Display important note about production setup."""
67
- console.print("\n⚡ Setup Note:", style="bold yellow")
68
- console.print("For maximum flexibility, we recommend following")
69
- console.print("the manual setup instructions in deployment/README.md")
70
- console.print("This will give you more control over:")
71
- console.print("- Security configurations")
72
- console.print("- Custom deployment workflows")
73
- console.print("- Environment-specific settings")
74
- console.print("- Advanced CI/CD pipeline customization\n")
75
-
76
-
77
- def setup_git_repository(config: ProjectConfig) -> str:
78
- """Set up Git repository and remote.
79
-
80
- Args:
81
- config: Project configuration containing repository details
82
-
83
- Returns:
84
- str: GitHub username of the authenticated user
85
- """
86
- console.print("\n🔧 Setting up Git repository...")
87
-
88
- # Initialize git if not already initialized
89
- if not (Path.cwd() / ".git").exists():
90
- run_command(["git", "init", "-b", "main"])
91
- console.print("✅ Git repository initialized")
92
-
93
- # Get current GitHub username for the remote URL
94
- result = run_command(["gh", "api", "user", "--jq", ".login"], capture_output=True)
95
- github_username = result.stdout.strip()
96
-
97
- # Add remote if it doesn't exist
98
- try:
99
- run_command(
100
- ["git", "remote", "get-url", "origin"], capture_output=True, check=True
101
- )
102
- console.print("✅ Git remote already configured")
103
- except subprocess.CalledProcessError:
104
- remote_url = (
105
- f"https://github.com/{github_username}/{config.repository_name}.git"
106
- )
107
- run_command(["git", "remote", "add", "origin", remote_url])
108
- console.print(f"✅ Added git remote: {remote_url}")
109
-
110
- console.print(
111
- "\n💡 Tip: Don't forget to commit and push your changes to the repository!"
112
- )
113
- return github_username
114
-
115
-
116
- def prompt_for_git_provider() -> str:
117
- """Interactively prompt user for git provider selection."""
118
- providers = ["github"] # Currently only GitHub is supported
119
- console.print("\n🔄 Git Provider Selection", style="bold blue")
120
- for i, provider in enumerate(providers, 1):
121
- console.print(f"{i}. {provider}")
122
-
123
- while True:
124
- choice = click.prompt(
125
- "\nSelect git provider",
126
- type=click.Choice(["1"]), # Only allow '1' since GitHub is the only option
127
- default="1",
128
- )
129
- return providers[int(choice) - 1]
130
-
131
-
132
- def validate_working_directory() -> None:
133
- """Ensure we're in the project root directory."""
134
- if not Path("pyproject.toml").exists():
135
- raise click.UsageError(
136
- "This command must be run from the project root directory containing pyproject.toml. "
137
- "Make sure you are in the folder created by agent-starter-pack."
138
- )
139
-
140
-
141
- def update_build_triggers(tf_dir: Path) -> None:
142
- """Update build triggers configuration."""
143
- build_triggers_path = tf_dir / "build_triggers.tf"
144
- if build_triggers_path.exists():
145
- with open(build_triggers_path) as f:
146
- content = f.read()
147
-
148
- # Add repository dependency to all trigger resources
149
- modified_content = content.replace(
150
- "depends_on = [resource.google_project_service.cicd_services, resource.google_project_service.shared_services]",
151
- "depends_on = [resource.google_project_service.cicd_services, resource.google_project_service.shared_services, google_cloudbuildv2_repository.repo]",
152
- )
153
-
154
- # Update repository reference in all triggers
155
- modified_content = modified_content.replace(
156
- 'repository = "projects/${var.cicd_runner_project_id}/locations/${var.region}/connections/${var.host_connection_name}/repositories/${var.repository_name}"',
157
- "repository = google_cloudbuildv2_repository.repo.id",
158
- )
159
-
160
- with open(build_triggers_path, "w") as f:
161
- f.write(modified_content)
162
-
163
- console.print("✅ Updated build triggers with repository dependency")
164
-
165
-
166
- def prompt_for_repository_details(
167
- repository_name: str | None = None, repository_owner: str | None = None
168
- ) -> tuple[str, str, bool]:
169
- """Interactive prompt for repository details with option to use existing repo."""
170
- # Get current GitHub username as default owner
171
- result = run_command(["gh", "api", "user", "--jq", ".login"], capture_output=True)
172
- default_owner = result.stdout.strip()
173
- repository_exists = False
174
-
175
- if not (repository_name and repository_owner):
176
- console.print("\n📦 Repository Configuration", style="bold blue")
177
- console.print("Choose an option:")
178
- console.print("1. Create new repository")
179
- console.print("2. Use existing empty repository")
180
-
181
- choice = click.prompt(
182
- "Select option", type=click.Choice(["1", "2"]), default="1"
183
- )
184
-
185
- if choice == "1":
186
- # New repository
187
- if not repository_name:
188
- repository_name = click.prompt(
189
- "Enter new repository name", default=f"genai-app-{int(time.time())}"
190
- )
191
- if not repository_owner:
192
- repository_owner = click.prompt(
193
- "Enter repository owner", default=default_owner
194
- )
195
- else:
196
- # Existing repository
197
- repository_exists = True
198
- while True:
199
- repo_url = click.prompt(
200
- "Enter existing repository URL (e.g., https://github.com/owner/repo)"
201
- )
202
- # Extract owner and name from URL
203
- match = re.match(r"https://github\.com/([^/]+)/([^/]+)", repo_url)
204
- if match:
205
- repository_owner = match.group(1)
206
- repository_name = match.group(2)
207
-
208
- # Verify repository exists and is empty
209
- try:
210
- result = run_command(
211
- [
212
- "gh",
213
- "repo",
214
- "view",
215
- f"{repository_owner}/{repository_name}",
216
- "--json",
217
- "isEmpty",
218
- ],
219
- capture_output=True,
220
- )
221
- if not json.loads(result.stdout).get("isEmpty", False):
222
- if not click.confirm(
223
- "Repository is not empty. Are you sure you want to use it?",
224
- default=False,
225
- ):
226
- continue
227
- break
228
- except subprocess.CalledProcessError:
229
- console.print(
230
- "❌ Repository not found or not accessible",
231
- style="bold red",
232
- )
233
- continue
234
- else:
235
- console.print("❌ Invalid repository URL format", style="bold red")
236
-
237
- if repository_name is None or repository_owner is None:
238
- raise ValueError("Repository name and owner must be provided")
239
- return repository_name, repository_owner, repository_exists
240
-
241
-
242
- def setup_terraform_backend(
243
- tf_dir: Path, project_id: str, region: str, repository_name: str
244
- ) -> None:
245
- """Setup terraform backend configuration with GCS bucket"""
246
- console.print("\n🔧 Setting up Terraform backend...")
247
-
248
- bucket_name = f"{project_id}-terraform-state"
249
-
250
- # Ensure bucket exists
251
- try:
252
- result = run_command(
253
- ["gsutil", "ls", "-b", f"gs://{bucket_name}"],
254
- check=False,
255
- capture_output=True,
256
- )
257
-
258
- if result.returncode != 0:
259
- console.print(f"\n📦 Creating Terraform state bucket: {bucket_name}")
260
- # Create bucket
261
- run_command(
262
- ["gsutil", "mb", "-p", project_id, "-l", region, f"gs://{bucket_name}"]
263
- )
264
-
265
- # Enable versioning
266
- run_command(["gsutil", "versioning", "set", "on", f"gs://{bucket_name}"])
267
- except subprocess.CalledProcessError as e:
268
- console.print(f"\n❌ Failed to setup state bucket: {e}")
269
- raise
270
-
271
- # Create backend.tf in both root and dev directories
272
- tf_dirs = [
273
- tf_dir, # Root terraform directory
274
- tf_dir / "dev", # Dev terraform directory
275
- ]
276
-
277
- for dir_path in tf_dirs:
278
- if dir_path.exists():
279
- # Use different state prefixes for dev and prod
280
- is_dev_dir = str(dir_path).endswith("/dev")
281
- state_prefix = f"{repository_name}/{(is_dev_dir and 'dev') or 'prod'}"
282
-
283
- backend_file = dir_path / "backend.tf"
284
- backend_content = f'''terraform {{
285
- backend "gcs" {{
286
- bucket = "{bucket_name}"
287
- prefix = "{state_prefix}"
288
- }}
289
- }}
290
- '''
291
- with open(backend_file, "w") as f:
292
- f.write(backend_content)
293
-
294
- console.print(
295
- f"✅ Terraform backend configured in {dir_path} to use bucket: {bucket_name} with prefix: {state_prefix}"
296
- )
297
-
298
-
299
- def create_or_update_secret(secret_id: str, secret_value: str, project_id: str) -> None:
300
- """Create or update a secret in Google Cloud Secret Manager.
301
-
302
- Args:
303
- secret_id: The ID of the secret to create/update
304
- secret_value: The value to store in the secret
305
- project_id: The Google Cloud project ID
306
-
307
- Raises:
308
- subprocess.CalledProcessError: If secret creation/update fails
309
- """
310
- with tempfile.NamedTemporaryFile(mode="w") as temp_file:
311
- temp_file.write(secret_value)
312
- temp_file.flush()
313
-
314
- # First try to add a new version to existing secret
315
- try:
316
- run_command(
317
- [
318
- "gcloud",
319
- "secrets",
320
- "versions",
321
- "add",
322
- secret_id,
323
- "--data-file",
324
- temp_file.name,
325
- f"--project={project_id}",
326
- ]
327
- )
328
- console.print("✅ Updated existing GitHub PAT secret")
329
- except subprocess.CalledProcessError:
330
- # If adding version fails (secret doesn't exist), try to create it
331
- try:
332
- run_command(
333
- [
334
- "gcloud",
335
- "secrets",
336
- "create",
337
- secret_id,
338
- "--data-file",
339
- temp_file.name,
340
- f"--project={project_id}",
341
- "--replication-policy",
342
- "automatic",
343
- ]
344
- )
345
- console.print("✅ Created new GitHub PAT secret")
346
- except subprocess.CalledProcessError as e:
347
- console.print(
348
- f"❌ Failed to create/update GitHub PAT secret: {e!s}",
349
- style="bold red",
350
- )
351
- raise
352
-
353
-
354
- console = Console()
355
-
356
-
357
- @click.command()
358
- @click.option("--dev-project", help="Development project ID")
359
- @click.option("--staging-project", help="Staging project ID")
360
- @click.option("--prod-project", help="Production project ID")
361
- @click.option(
362
- "--cicd-project", help="CICD project ID (defaults to prod project if not specified)"
363
- )
364
- @click.option("--region", default="us-central1", help="GCP region")
365
- @click.option("--repository-name", help="Repository name (optional)")
366
- @click.option(
367
- "--repository-owner",
368
- help="Repository owner (optional, defaults to current GitHub user)",
369
- )
370
- @click.option("--host-connection-name", help="Host connection name (optional)")
371
- @click.option("--github-pat", help="GitHub Personal Access Token for programmatic auth")
372
- @click.option(
373
- "--github-app-installation-id",
374
- help="GitHub App Installation ID for programmatic auth",
375
- )
376
- @click.option(
377
- "--git-provider",
378
- type=click.Choice(["github"]),
379
- help="Git provider to use (currently only GitHub is supported)",
380
- )
381
- @click.option(
382
- "--local-state",
383
- is_flag=True,
384
- default=False,
385
- help="Use local Terraform state instead of remote GCS backend (defaults to remote)",
386
- )
387
- @click.option("--debug", is_flag=True, help="Enable debug logging")
388
- @click.option(
389
- "--auto-approve",
390
- is_flag=True,
391
- help="Skip confirmation prompts and proceed automatically",
392
- )
393
- @click.option(
394
- "--repository-exists",
395
- is_flag=True,
396
- default=False,
397
- help="Flag indicating if the repository already exists",
398
- )
399
- @backoff.on_exception(
400
- backoff.expo,
401
- (subprocess.CalledProcessError, click.ClickException),
402
- max_tries=3,
403
- jitter=backoff.full_jitter,
404
- )
405
- def setup_cicd(
406
- dev_project: str | None,
407
- staging_project: str | None,
408
- prod_project: str | None,
409
- cicd_project: str | None,
410
- region: str,
411
- repository_name: str | None,
412
- repository_owner: str | None,
413
- host_connection_name: str | None,
414
- github_pat: str | None,
415
- github_app_installation_id: str | None,
416
- git_provider: str | None,
417
- local_state: bool,
418
- debug: bool,
419
- auto_approve: bool,
420
- repository_exists: bool,
421
- ) -> None:
422
- """Set up CI/CD infrastructure using Terraform."""
423
-
424
- # Check if we're in the root folder by looking for pyproject.toml
425
- if not Path("pyproject.toml").exists():
426
- raise click.UsageError(
427
- "This command must be run from the project root directory containing pyproject.toml. "
428
- "Make sure you are in the folder created by agent-starter-pack."
429
- )
430
-
431
- # Prompt for staging and prod projects if not provided
432
- if staging_project is None:
433
- staging_project = click.prompt(
434
- "Enter your staging project ID (where tests will be run)", type=str
435
- )
436
-
437
- if prod_project is None:
438
- prod_project = click.prompt("Enter your production project ID", type=str)
439
-
440
- # If cicd_project is not provided, default to prod_project
441
- if cicd_project is None:
442
- cicd_project = prod_project
443
- console.print(f"Using production project '{prod_project}' for CI/CD resources")
444
-
445
- console.print(
446
- "\n⚠️ WARNING: The setup-cicd command is experimental and may have unexpected behavior.",
447
- style="bold yellow",
448
- )
449
- console.print("Please report any issues you encounter.\n")
450
-
451
- console.print("\n📋 About this command:", style="bold blue")
452
- console.print(
453
- "This command helps set up a basic CI/CD pipeline for development and testing purposes."
454
- )
455
- console.print("It will:")
456
- console.print("- Create a GitHub repository and connect it to Cloud Build")
457
- console.print("- Set up development environment infrastructure")
458
- console.print("- Configure basic CI/CD triggers for PR checks and deployments")
459
- console.print(
460
- "- Configure remote Terraform state in GCS (use --local-state to use local state instead)"
461
- )
462
-
463
- console.print("\n⚡ Production Setup Note:", style="bold yellow")
464
- console.print(
465
- "For production deployments and maximum flexibility, we recommend following"
466
- )
467
- console.print("the manual setup instructions in deployment/README.md")
468
- console.print("This will give you more control over:")
469
- console.print("- Security configurations")
470
- console.print("- Custom deployment workflows")
471
- console.print("- Environment-specific settings")
472
- console.print("- Advanced CI/CD pipeline customization\n")
473
-
474
- # Add the confirmation prompt
475
- if not auto_approve:
476
- if not click.confirm("\nDo you want to continue with the setup?", default=True):
477
- console.print("\n🛑 Setup cancelled by user", style="bold yellow")
478
- return
479
- console.print(
480
- "This command helps set up a basic CI/CD pipeline for development and testing purposes."
481
- )
482
- console.print("It will:")
483
- console.print("- Create a GitHub repository and connect it to Cloud Build")
484
- console.print("- Set up development environment infrastructure")
485
- console.print("- Configure basic CI/CD triggers for PR checks and deployments")
486
- console.print(
487
- "- Configure remote Terraform state in GCS (use --local-state to use local state instead)"
488
- )
489
-
490
- console.print("\n⚡ Production Setup Note:", style="bold yellow")
491
- console.print(
492
- "For production deployments and maximum flexibility, we recommend following"
493
- )
494
- console.print("the manual setup instructions in deployment/README.md")
495
- console.print("This will give you more control over:")
496
- console.print("- Security configurations")
497
- console.print("- Custom deployment workflows")
498
- console.print("- Environment-specific settings")
499
- console.print("- Advanced CI/CD pipeline customization\n")
500
-
501
- if debug:
502
- logging.basicConfig(level=logging.DEBUG)
503
- console.print("> Debug mode enabled")
504
-
505
- # Set git provider through prompt if not provided
506
- if not git_provider:
507
- git_provider = prompt_for_git_provider()
508
-
509
- # Check GitHub authentication if GitHub is selected
510
- if git_provider == "github" and not (github_pat and github_app_installation_id):
511
- if not is_github_authenticated():
512
- console.print("\n⚠️ Not authenticated with GitHub CLI", style="yellow")
513
- handle_github_authentication()
514
- else:
515
- console.print("✅ GitHub CLI authentication verified")
516
-
517
- # Only prompt for repository details if not provided via CLI
518
- if not (repository_name and repository_owner):
519
- repository_name, repository_owner, repository_exists = (
520
- prompt_for_repository_details(repository_name, repository_owner)
521
- )
522
- # Set default host connection name if not provided
523
- if not host_connection_name:
524
- host_connection_name = f"git-{repository_name}"
525
- # Check and enable required APIs regardless of auth method
526
- required_apis = ["secretmanager.googleapis.com", "cloudbuild.googleapis.com"]
527
- ensure_apis_enabled(cicd_project, required_apis)
528
-
529
- # Create GitHub connection and repository if not using PAT authentication
530
- oauth_token_secret_id = None
531
-
532
- # Determine if we're in programmatic or interactive mode based on provided credentials
533
- detected_mode = (
534
- "programmatic" if github_pat and github_app_installation_id else "interactive"
535
- )
536
-
537
- if git_provider == "github" and detected_mode == "interactive":
538
- # First create the repository since we're in interactive mode
539
- create_github_repository(repository_owner, repository_name)
540
-
541
- # Then create the connection
542
- oauth_token_secret_id, github_app_installation_id = create_github_connection(
543
- project_id=cicd_project,
544
- region=region,
545
- connection_name=host_connection_name,
546
- repository_name=repository_name,
547
- repository_owner=repository_owner,
548
- )
549
- repository_exists = True
550
- elif git_provider == "github" and detected_mode == "programmatic":
551
- oauth_token_secret_id = "github-pat"
552
-
553
- if github_pat is None:
554
- raise ValueError("GitHub PAT is required for programmatic mode")
555
-
556
- # Create the GitHub PAT secret if provided
557
- console.print("\n🔐 Creating/updating GitHub PAT secret...")
558
- create_or_update_secret(
559
- secret_id=oauth_token_secret_id,
560
- secret_value=github_pat,
561
- project_id=cicd_project,
562
- )
563
-
564
- else:
565
- # Unsupported git provider
566
- console.print("⚠️ Only GitHub is currently supported.", style="bold yellow")
567
- raise ValueError("Unsupported git provider")
568
-
569
- console.print("\n📦 Starting CI/CD Infrastructure Setup", style="bold blue")
570
- console.print("=====================================")
571
-
572
- config = ProjectConfig(
573
- dev_project_id=dev_project,
574
- staging_project_id=staging_project,
575
- prod_project_id=prod_project,
576
- cicd_project_id=cicd_project,
577
- region=region,
578
- repository_name=repository_name,
579
- repository_owner=repository_owner,
580
- host_connection_name=host_connection_name,
581
- agent="", # Not needed for CICD setup
582
- deployment_target="", # Not needed for CICD setup
583
- github_pat=github_pat,
584
- github_app_installation_id=github_app_installation_id,
585
- git_provider=git_provider,
586
- repository_exists=repository_exists,
587
- )
588
-
589
- tf_dir = Path("deployment/terraform")
590
-
591
- # Copy CICD terraform files
592
- cicd_utils_path = Path(__file__).parent.parent.parent / "resources" / "setup_cicd"
593
-
594
- for tf_file in cicd_utils_path.glob("*.tf"):
595
- shutil.copy2(tf_file, tf_dir)
596
- console.print("✅ Copied CICD terraform files")
597
-
598
- # Setup Terraform backend if not using local state
599
- if not local_state:
600
- console.print("\n🔧 Setting up remote Terraform backend...")
601
- setup_terraform_backend(
602
- tf_dir=tf_dir,
603
- project_id=cicd_project,
604
- region=region,
605
- repository_name=repository_name,
606
- )
607
- console.print("✅ Remote Terraform backend configured")
608
- else:
609
- console.print("\n📝 Using local Terraform state (remote backend disabled)")
610
-
611
- # Update terraform variables using existing function
612
- deployment = E2EDeployment(config)
613
- deployment.update_terraform_vars(
614
- Path.cwd(), is_dev=False
615
- ) # is_dev=False for prod/staging setup
616
-
617
- # Update env.tfvars with additional variables
618
- env_vars_path = tf_dir / "vars" / "env.tfvars"
619
-
620
- # Read existing content
621
- existing_content = ""
622
- if env_vars_path.exists():
623
- with open(env_vars_path) as f:
624
- existing_content = f.read()
625
-
626
- # Prepare new variables
627
- new_vars = {}
628
- if not config.repository_owner:
629
- result = run_command(
630
- ["gh", "api", "user", "--jq", ".login"], capture_output=True
631
- )
632
- new_vars["repository_owner"] = result.stdout.strip()
633
- else:
634
- new_vars["repository_owner"] = config.repository_owner
635
-
636
- # Use the app installation ID from the connection if available, otherwise use the provided one
637
- new_vars["github_app_installation_id"] = github_app_installation_id
638
- # Use the OAuth token secret ID if available, otherwise use default PAT secret ID
639
- new_vars["github_pat_secret_id"] = oauth_token_secret_id
640
- # Set connection_exists based on whether we created a new connection
641
- new_vars["connection_exists"] = (
642
- "true" if detected_mode == "interactive" else "false"
643
- )
644
- new_vars["repository_exists"] = "true" if config.repository_exists else "false"
645
-
646
- # Update or append variables
647
- with open(env_vars_path, "w") as f:
648
- # Write existing content excluding lines with variables we're updating
649
- for line in existing_content.splitlines():
650
- if not any(line.startswith(f"{var} = ") for var in new_vars.keys()):
651
- f.write(line + "\n")
652
-
653
- # Write new/updated variables
654
- for var_name, var_value in new_vars.items():
655
- if var_value in ("true", "false"): # For boolean values
656
- f.write(f"{var_name} = {var_value}\n")
657
- else: # For string values
658
- f.write(f'{var_name} = "{var_value}"\n')
659
-
660
- console.print("✅ Updated env.tfvars with additional variables")
661
-
662
- # Update dev environment vars
663
- dev_tf_vars_path = tf_dir / "dev" / "vars" / "env.tfvars"
664
- if (
665
- dev_tf_vars_path.exists() and dev_project
666
- ): # Only update if dev_project is provided
667
- with open(dev_tf_vars_path) as f:
668
- dev_content = f.read()
669
-
670
- # Update dev project ID
671
- dev_content = re.sub(
672
- r'dev_project_id\s*=\s*"[^"]*"',
673
- f'dev_project_id = "{dev_project}"',
674
- dev_content,
675
- )
676
-
677
- with open(dev_tf_vars_path, "w") as f:
678
- f.write(dev_content)
679
-
680
- console.print("✅ Updated dev env.tfvars with project configuration")
681
-
682
- # Update build triggers configuration
683
- update_build_triggers(tf_dir)
684
-
685
- # First initialize and apply dev terraform
686
- dev_tf_dir = tf_dir / "dev"
687
- if dev_tf_dir.exists() and dev_project: # Only deploy if dev_project is provided
688
- with console.status("[bold blue]Setting up dev environment..."):
689
- if local_state:
690
- run_command(["terraform", "init", "-backend=false"], cwd=dev_tf_dir)
691
- else:
692
- run_command(["terraform", "init"], cwd=dev_tf_dir)
693
-
694
- try:
695
- run_command(
696
- [
697
- "terraform",
698
- "apply",
699
- "-auto-approve",
700
- "--var-file",
701
- "vars/env.tfvars",
702
- ],
703
- cwd=dev_tf_dir,
704
- )
705
- except subprocess.CalledProcessError as e:
706
- if "Error acquiring the state lock" in str(e):
707
- console.print(
708
- "[yellow]State lock error detected, retrying without lock...[/yellow]"
709
- )
710
- run_command(
711
- [
712
- "terraform",
713
- "apply",
714
- "-auto-approve",
715
- "--var-file",
716
- "vars/env.tfvars",
717
- "-lock=false",
718
- ],
719
- cwd=dev_tf_dir,
720
- )
721
- else:
722
- raise
723
-
724
- console.print("✅ Dev environment Terraform configuration applied")
725
- elif dev_tf_dir.exists():
726
- console.print("ℹ️ Skipping dev environment setup (no dev project provided)")
727
-
728
- # Then apply prod terraform to create GitHub repo
729
- with console.status(
730
- "[bold blue]Setting up Prod/Staging Terraform configuration..."
731
- ):
732
- if local_state:
733
- run_command(["terraform", "init", "-backend=false"], cwd=tf_dir)
734
- else:
735
- run_command(["terraform", "init"], cwd=tf_dir)
736
-
737
- try:
738
- run_command(
739
- [
740
- "terraform",
741
- "apply",
742
- "-auto-approve",
743
- "--var-file",
744
- "vars/env.tfvars",
745
- ],
746
- cwd=tf_dir,
747
- )
748
- except subprocess.CalledProcessError as e:
749
- if "Error acquiring the state lock" in str(e):
750
- console.print(
751
- "[yellow]State lock error detected, retrying without lock...[/yellow]"
752
- )
753
- run_command(
754
- [
755
- "terraform",
756
- "apply",
757
- "-auto-approve",
758
- "--var-file",
759
- "vars/env.tfvars",
760
- "-lock=false",
761
- ],
762
- cwd=tf_dir,
763
- )
764
- else:
765
- raise
766
-
767
- console.print("✅ Prod/Staging Terraform configuration applied")
768
-
769
- # Now we can set up git since the repo exists
770
- if git_provider == "github":
771
- console.print("\n🔧 Setting up Git repository...")
772
-
773
- # Initialize git if not already initialized
774
- if not (Path.cwd() / ".git").exists():
775
- run_command(["git", "init", "-b", "main"])
776
- console.print("✅ Git repository initialized")
777
-
778
- # Get current GitHub username for the remote URL
779
- result = run_command(
780
- ["gh", "api", "user", "--jq", ".login"], capture_output=True
781
- )
782
- github_username = result.stdout.strip()
783
-
784
- # Add remote if it doesn't exist
785
- try:
786
- run_command(
787
- ["git", "remote", "get-url", "origin"], capture_output=True, check=True
788
- )
789
- console.print("✅ Git remote already configured")
790
- except subprocess.CalledProcessError:
791
- remote_url = (
792
- f"https://github.com/{github_username}/{config.repository_name}.git"
793
- )
794
- run_command(["git", "remote", "add", "origin", remote_url])
795
- console.print(f"✅ Added git remote: {remote_url}")
796
-
797
- console.print(
798
- "\n💡 Tip: Don't forget to commit and push your changes to the repository!"
799
- )
800
-
801
- console.print("\n✅ CICD infrastructure setup complete!")
802
- if not local_state:
803
- console.print(
804
- f"📦 Using remote Terraform state in bucket: {cicd_project}-terraform-state"
805
- )
806
- else:
807
- console.print("📝 Using local Terraform state")
808
-
809
- try:
810
- # Print success message with useful links
811
- result = run_command(
812
- ["gh", "api", "user", "--jq", ".login"], capture_output=True
813
- )
814
- github_username = result.stdout.strip()
815
-
816
- repo_url = f"https://github.com/{github_username}/{config.repository_name}"
817
- cloud_build_url = f"https://console.cloud.google.com/cloud-build/builds?project={config.cicd_project_id}"
818
- # Sleep to allow resources to propagate
819
- console.print("\n⏳ Waiting for resources to propagate...")
820
- time.sleep(10)
821
-
822
- # Print final summary
823
- print_cicd_summary(config, github_username, repo_url, cloud_build_url)
824
-
825
- except Exception as e:
826
- if debug:
827
- logging.exception("An error occurred:")
828
- console.print(f"\n❌ Error: {e!s}", style="bold red")
829
- sys.exit(1)