agent-starter-pack 0.0.1b0__py3-none-any.whl → 0.0.3b0__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.

Potentially problematic release.


This version of agent-starter-pack might be problematic. Click here for more details.

@@ -1,18 +1,18 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-starter-pack
3
- Version: 0.0.1b0
3
+ Version: 0.0.3b0
4
4
  Summary: CLI tool to create GCP-based AI agent projects from templates
5
5
  Author-email: Google LLC <agent-starter-pack@google.com>
6
6
  License: Apache-2.0
7
7
  License-File: LICENSE
8
8
  Requires-Python: >=3.10
9
- Requires-Dist: click>=8.1.7
10
- Requires-Dist: cookiecutter>=2.5.0
11
- Requires-Dist: google-cloud-aiplatform>=1.38.1
12
- Requires-Dist: inquirer>=3.1.3
13
- Requires-Dist: pyyaml>=6.0.1
14
- Requires-Dist: rich>=13.7.0
15
- Requires-Dist: uv>=0.1.0
9
+ Requires-Dist: click~=8.1.7
10
+ Requires-Dist: cookiecutter~=2.5.0
11
+ Requires-Dist: google-cloud-aiplatform~=1.81.0
12
+ Requires-Dist: inquirer~=3.1.3
13
+ Requires-Dist: pyyaml~=6.0.1
14
+ Requires-Dist: rich~=13.7.0
15
+ Requires-Dist: uv~=0.6.3
16
16
  Provides-Extra: jupyter
17
17
  Requires-Dist: ipykernel>=6.29.5; extra == 'jupyter'
18
18
  Requires-Dist: jupyter; extra == 'jupyter'
@@ -34,7 +34,7 @@ It accelerates development by providing a holistic, production-ready solution, a
34
34
 
35
35
  | ⚡️ Launch | 🧪 Experiment | ✅ Deploy | 🛠️ Customize |
36
36
  |---|---|---|---|
37
- | Pre-built agent templates (ReAct, RAG, multi-agent, Live Multimodal API). | Vertex AI evaluation and an interactive playground. | Production-ready infrastructure with monitoring, observability, and CI/CD. | Extend and customize templates. |
37
+ | [Pre-built agent templates](./agents/) (ReAct, RAG, multi-agent, Live Multimodal API). | [Vertex AI evaluation]() and an interactive playground. | Production-ready infra with [monitoring](./docs/monitoring.md), [observability](./docs/observability.md), and [CI/CD](./docs/deployment.md) on [Cloud Run](https://cloud.google.com/run) or [Agent Engine](https://cloud.google.com/vertex-ai/generative-ai/docs/reasoning-engine/overview). | Extend and customize templates according to your needs. |
38
38
 
39
39
  ---
40
40
 
@@ -43,10 +43,13 @@ It accelerates development by providing a holistic, production-ready solution, a
43
43
  Ready to build your AI agent? Simply run this command:
44
44
 
45
45
  ```bash
46
- # 1. Install the Agent Starter Pack CLI
46
+ # Create and activate a Python virtual environment
47
+ python -m venv venv && source venv/bin/activate
48
+
49
+ # Install the agent starter pack
47
50
  pip install agent-starter-pack
48
51
 
49
- # 2. Create a new agent project (choose from available templates)
52
+ # Create a new agent project
50
53
  agent-starter-pack create my-awesome-agent
51
54
  ```
52
55
 
@@ -105,7 +108,6 @@ This project represents the next evolution of the [e2e-gen-ai-app-starter-pack](
105
108
 
106
109
  - Python 3.10+
107
110
  - [Google Cloud SDK](https://cloud.google.com/sdk/docs/install)
108
- - [uv](https://github.com/astral-sh/uv)
109
111
  - [Terraform](https://developer.hashicorp.com/terraform/downloads) (for deployment)
110
112
 
111
113
 
@@ -31,7 +31,7 @@ agents/multimodal_live_api/tests/unit/test_server.py,sha256=_TjlgQgNkjerIaBGnu8P
31
31
  src/base_template/.gitignore,sha256=mJKTZIcVdAFiIUQicRfPNGUg6WvwcfTEC2xbmAaU34g,2579
32
32
  src/base_template/Makefile,sha256=YQXymaikoFP3r7MN1EiNbQv8VZKjrVzeRoksIPHNX0E,1568
33
33
  src/base_template/README.md,sha256=LS07ZhCLj2SXew3j3xEWaaXwsf3aIjyvQpkp0S0l8nA,4194
34
- src/base_template/pyproject.toml,sha256=PUixwwwf-4_3HfyE54yjUtIYqva9f3HZo1pKunbLiUU,2777
34
+ src/base_template/pyproject.toml,sha256=Yyk30u_QBtwHmFaEC40PyJe3Smt6snzSZxd5usoO9tA,2777
35
35
  src/base_template/app/utils/tracing.py,sha256=ovp6tgwgo_tqibpbhhHl8cWIqqUWVYfV0AL7XPDEPpM,5661
36
36
  src/base_template/app/utils/typing.py,sha256=UUFm74qiKGtT8pLuE_3yRpcmntRCt91wH_Q-LKdjQuQ,3194
37
37
  src/base_template/deployment/README.md,sha256=8AorSeF2Aj0kvPmuQLFrmAAUWVbdTzg0S-rVBbfdirQ,4835
@@ -53,17 +53,17 @@ src/base_template/deployment/terraform/dev/log_sinks.tf,sha256=SPse4k-L8f6-vEYMt
53
53
  src/base_template/deployment/terraform/dev/providers.tf,sha256=DoRNfVxdpwnTHTxQ97-cguBCeeRDYz7EPKsy0-f_t1I,878
54
54
  src/base_template/deployment/terraform/dev/storage.tf,sha256=bjpZ5WzO0w6wGAIT_Ye61aS1sTlO128uayIvcgqGMoA,2965
55
55
  src/base_template/deployment/terraform/dev/variables.tf,sha256=wMgDgp1E-piGhcF1WbwHFSj2NJseB7eZzAjup6bBhEQ,4063
56
- src/base_template/deployment/terraform/dev/vars/env.tfvars,sha256=nNd6gf_2_wNdS-ysRnQzVutdJ4dFrLQYaKmZk_yp-ms,919
57
- src/base_template/deployment/terraform/vars/env.tfvars,sha256=oO6FdMUJ7IEsup6pPFW4E7eaaGo-CFhvm-TtBjK8Xp4,1630
56
+ src/base_template/deployment/terraform/dev/vars/env.tfvars,sha256=xz5cYG29ZIgqM1K-0o-RB10oBTDKNIhHMY7qrmjHk8I,922
57
+ src/base_template/deployment/terraform/vars/env.tfvars,sha256=2dxWRDzeolN2f7eKSHXcBiBt9fRcIMO6VH-2MAZevLQ,1633
58
58
  src/base_template/tests/unit/test_utils/test_tracing_exporter.py,sha256=JAb0vIB7wNFPm_kaDaHcxtPKNReypDHjdsMQyzpuePQ,4687
59
59
  src/cli/main.py,sha256=134KpcOQlexr_vR-KT3D3B1jKh1Y6S3qHGJ-9uD9Kkg,950
60
- src/cli/commands/create.py,sha256=E5wLFxVwCrrjUakW0oT4oVAZtBouwmdmAImEMRc-15c,19305
61
- src/cli/commands/setup_cicd.py,sha256=IN1fcmhQMiiOchxWxUH_1pSVkt4nLsz-KIpdhpdSjzA,27859
60
+ src/cli/commands/create.py,sha256=y2Zw6Zx6tACWvgBnba55laYHZGGaQ1NGXd6H3iTOuJ8,19717
61
+ src/cli/commands/setup_cicd.py,sha256=EgVkDdA94npDHHPTuYDmWNIiRscnsXtN7CbTuelrTVU,28347
62
62
  src/cli/utils/__init__.py,sha256=x-k6jfcv68_zYS88LrA1mr0yB5y5SekJ0nc5Tvt6iDA,1064
63
- src/cli/utils/cicd.py,sha256=ZKDTxmn_VPnCGunhdjLHmwYv4ordR7DpkZ2OXqqhs5g,23369
64
- src/cli/utils/gcp.py,sha256=_YniVgiORtZddrYpt0ebjiq-3wHsR9i70NgyYDlT1tw,4198
63
+ src/cli/utils/cicd.py,sha256=x-8PKp4aevkUwAmtbEZVwu0UlrA6ifXGbouxICu1D0o,25664
64
+ src/cli/utils/gcp.py,sha256=zs7JJP79IAO5zvUe4Ttwr_qlTC0jtBK87AP6Ug8Nj4Y,4164
65
65
  src/cli/utils/logging.py,sha256=0lHe4EPi1A8sOx9xkA7gS4UNl0GsIyp2ahydkkuCzLY,1570
66
- src/cli/utils/template.py,sha256=G3DI7-6W13ROlsI00dLHh8qveYTePDIy3KXciH3d6-0,25383
66
+ src/cli/utils/template.py,sha256=p7uKv5yHkXIOWo8EJJ0IjUh57lOSDL7kYHA9OZ7j-z4,25447
67
67
  src/data_ingestion/README.md,sha256=QlomTIZINvZxf2ftCkm2_QVozlivJqAfFKyfiGMZDpY,4217
68
68
  src/data_ingestion/pyproject.toml,sha256=ArworDzIofX4oTU6iVol1PA-Z3qClLsFGsO8FnmwrdI,397
69
69
  src/data_ingestion/uv.lock,sha256=HzSD6_IxS2urt49EefD9MvVxBwxW_bJ-k0XltTDT3Vc,144223
@@ -142,21 +142,21 @@ src/frontends/streamlit/frontend/utils/multimodal_utils.py,sha256=v6YbCkz_YcnEo-
142
142
  src/frontends/streamlit/frontend/utils/stream_handler.py,sha256=J7MMsOR2GvDEsyJbsv8VQeZbMs7mNySrclZNfuzsZD4,11578
143
143
  src/frontends/streamlit/frontend/utils/title_summary.py,sha256=JtFnPzS3JcEcZRrRmFVz5wZacORVLtN86MEjCTqP-wA,2405
144
144
  src/resources/containers/data_processing/Dockerfile,sha256=uXjqDiSrr7YpoX-vtzaIJIVXZ2qeUpu1Nzju9qWZ9oI,859
145
- src/resources/locks/uv-agentic_rag_vertexai_search-agent_engine.lock,sha256=CUBt7sc4IfCio22lHBN0LUnoI5YPh-eb9gixMONO6ps,460306
146
- src/resources/locks/uv-agentic_rag_vertexai_search-cloud_run.lock,sha256=9rOeKo0qFqDVOvEKpFDZPrg026uMSTW0JgnDT5I9mvw,756546
147
- src/resources/locks/uv-crewai_coding_crew-agent_engine.lock,sha256=jcBQawFeqsc1T6CNKuyTYJ3ap6c5DFMB_aRUolew0ho,554915
148
- src/resources/locks/uv-crewai_coding_crew-cloud_run.lock,sha256=82t_NHxI3We6vKbAO6JKGqwob4p9kpe1ZdGyrlJeXH4,878385
149
- src/resources/locks/uv-langgraph_base_react-agent_engine.lock,sha256=qZ-lhnVkIWE4D-DpWvmEs_t0HMwaKVpARWXhpIeaBnI,455449
150
- src/resources/locks/uv-langgraph_base_react-cloud_run.lock,sha256=Y58_wSYdU2nH4SRwijrHUkEwkXArQAAOXZ6rQM1_VfQ,751689
151
- src/resources/locks/uv-multimodal_live_api-cloud_run.lock,sha256=XV3ZZ2HdSLctex_sp4sBIX1MDbsxLNEGf2sv9A9tUGk,751284
145
+ src/resources/locks/uv-agentic_rag_vertexai_search-agent_engine.lock,sha256=6muWlgt4dduqGDiGUvTg-d2zzY5rgW9zP9DbDnt3krc,474353
146
+ src/resources/locks/uv-agentic_rag_vertexai_search-cloud_run.lock,sha256=ViUzp35RGWZiiQvvVi6ntFTT-bEbHg4_HDDQznD4ML8,756574
147
+ src/resources/locks/uv-crewai_coding_crew-agent_engine.lock,sha256=TOICJcW3ajjycUfK-bzY6hEZaMRiGf521z1e9n0BwQI,568962
148
+ src/resources/locks/uv-crewai_coding_crew-cloud_run.lock,sha256=FUwOcG2_RzxKvKHSxA833EXkVC4P8geVYH-3GWI2QXI,878413
149
+ src/resources/locks/uv-langgraph_base_react-agent_engine.lock,sha256=DihpnjNFvnfPP9k-YmQVpEHWbE0Zx-aYbiqjZNi0LU0,469496
150
+ src/resources/locks/uv-langgraph_base_react-cloud_run.lock,sha256=nMsiSn0weaVWrMxrH8-SnNtuKAEe3byvMOjrQ-UcS4I,751717
151
+ src/resources/locks/uv-multimodal_live_api-cloud_run.lock,sha256=gLLVXP01wVom5fnvpFoYmue6Ynx3qiFbb1FOfDDQy34,751312
152
152
  src/resources/setup_cicd/cicd_variables.tf,sha256=OHNKglkpN2TSTnfgpd-fM-eNUbWhs6grNwBIKHoLyfU,1097
153
153
  src/resources/setup_cicd/github.tf,sha256=g7gMQqPZI69XteCSruNfiT00GBGawuXANHj-F0fc-GE,2727
154
154
  src/resources/setup_cicd/providers.tf,sha256=Km4z6IJt7x7PLaa0kyZbBrO2m3lpuIJZFD5jB7QBfF0,1122
155
155
  src/utils/generate_locks.py,sha256=xu5IAhGGBPkVQGSJX4kk7_JNDwWJUEaXAHbmaQIohbg,4386
156
156
  src/utils/lock_utils.py,sha256=plw3vWkRViCMxBK3IrLRHtF_I0kbbP043T9KIYxcb20,2423
157
157
  src/utils/watch_and_rebuild.py,sha256=IdbTLReYknTXXu5KWPz3sc7Zg5HTEMS5UVlMSnuhs5E,6067
158
- agent_starter_pack-0.0.1b0.dist-info/METADATA,sha256=AggOledwBGT6EWTo6e0cWTC-LZirPznbA9DTQHnyduI,6538
159
- agent_starter_pack-0.0.1b0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
160
- agent_starter_pack-0.0.1b0.dist-info/entry_points.txt,sha256=U7uCxR7YulIhZ0L8R8Hui0Bsy6J7oyESBeDYJYMrQjA,56
161
- agent_starter_pack-0.0.1b0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
162
- agent_starter_pack-0.0.1b0.dist-info/RECORD,,
158
+ agent_starter_pack-0.0.3b0.dist-info/METADATA,sha256=qWWhxf8uhoeWK6SYIgWnYzCqm2aOhl79T5jCBe4E_c8,6805
159
+ agent_starter_pack-0.0.3b0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
160
+ agent_starter_pack-0.0.3b0.dist-info/entry_points.txt,sha256=U7uCxR7YulIhZ0L8R8Hui0Bsy6J7oyESBeDYJYMrQjA,56
161
+ agent_starter_pack-0.0.3b0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
162
+ agent_starter_pack-0.0.3b0.dist-info/RECORD,,
@@ -6,7 +6,7 @@ region = "us-central1"
6
6
 
7
7
  telemetry_bigquery_dataset_id = "telemetry_genai_app_sample_sink"
8
8
  telemetry_sink_name = "telemetry_logs_genai_app_sample"
9
- telemetry_logs_filter = "jsonPayload.attributes.\"traceloop.association.properties.log_type\"=\"tracing\" jsonPayload.resource.attributes.\"service.name\"=\"Sample Chatbot Application\""
9
+ telemetry_logs_filter = "jsonPayload.attributes.\"traceloop.association.properties.log_type\"=\"tracing\" jsonPayload.resource.attributes.\"service.name\"=\"{{cookiecutter.project_name}}\""
10
10
 
11
11
  feedback_bigquery_dataset_id = "feedback_genai_app_sample_sink"
12
12
  feedback_sink_name = "feedback_logs_genai_app_sample"
@@ -22,7 +22,7 @@ cloud_run_app_sa_name = "{{cookiecutter.project_name}}-cr"
22
22
 
23
23
  telemetry_bigquery_dataset_id = "telemetry_genai_app_sample_sink"
24
24
  telemetry_sink_name = "telemetry_logs_genai_app_sample"
25
- telemetry_logs_filter = "jsonPayload.attributes.\"traceloop.association.properties.log_type\"=\"tracing\" jsonPayload.resource.attributes.\"service.name\"=\"Sample Chatbot Application\""
25
+ telemetry_logs_filter = "jsonPayload.attributes.\"traceloop.association.properties.log_type\"=\"tracing\" jsonPayload.resource.attributes.\"service.name\"=\"{{cookiecutter.project_name}}\""
26
26
 
27
27
  feedback_bigquery_dataset_id = "feedback_genai_app_sample_sink"
28
28
  feedback_sink_name = "feedback_logs_genai_app_sample"
@@ -14,11 +14,11 @@ dependencies = [
14
14
  "traceloop-sdk~=0.38.7",
15
15
  "google-cloud-logging~=3.11.4",
16
16
  {%- if cookiecutter.deployment_target == 'cloud_run' %}
17
- "google-cloud-aiplatform[evaluation]~=1.80.0",
17
+ "google-cloud-aiplatform[evaluation]~=1.81.0",
18
18
  "fastapi~=0.115.8",
19
19
  "uvicorn~=0.34.0"
20
20
  {%- elif cookiecutter.deployment_target == 'agent_engine' %}
21
- "google-cloud-aiplatform[evaluation,langchain,reasoningengine]~=1.77.0"
21
+ "google-cloud-aiplatform[evaluation,langchain,reasoningengine]~=1.81.0"
22
22
  {%- endif %}
23
23
  ]
24
24
  {% if cookiecutter.deployment_target == 'cloud_run' %}
@@ -149,11 +149,16 @@ def create(
149
149
  logging.debug(f"Selected deployment target: {final_deployment}")
150
150
 
151
151
  # Data pipeline selection
152
- include_data_ingestion = include_data_ingestion or prompt_data_ingestion(final_agent)
152
+ include_data_ingestion = include_data_ingestion or prompt_data_ingestion(
153
+ final_agent
154
+ )
153
155
  if debug:
154
156
  logging.debug(f"Include data pipeline: {include_data_ingestion}")
155
157
  # Region confirmation (if not explicitly passed)
156
- if not auto_approve and ctx.get_parameter_source("region") != ParameterSource.COMMANDLINE:
158
+ if (
159
+ not auto_approve
160
+ and ctx.get_parameter_source("region") != ParameterSource.COMMANDLINE
161
+ ):
157
162
  region = prompt_region_confirmation(region)
158
163
  if debug:
159
164
  logging.debug(f"Selected region: {region}")
@@ -197,11 +202,11 @@ def create(
197
202
  Prompt.ask(
198
203
  f"\n> You are logged in with account '{creds_info['account']}' "
199
204
  f"and using project '{creds_info['project']}'. "
200
- "Do you wish to change this?",
201
- choices=["y", "n"],
202
- default="n",
205
+ "Is this correct?",
206
+ choices=["Y", "n"],
207
+ default="Y",
203
208
  ).lower()
204
- == "y"
209
+ == "n"
205
210
  )
206
211
 
207
212
  if change_creds:
@@ -215,27 +220,32 @@ def create(
215
220
  # Check for uv installation
216
221
  console.print("> Checking for uv installation...")
217
222
  check_and_install_uv()
223
+
224
+ # Test Vertex AI connection
225
+ console.print("> Testing GCP and Vertex AI Connection...")
226
+ try:
227
+ verify_vertex_connection(
228
+ project_id=creds_info["project"],
229
+ location=region,
230
+ )
231
+ console.print(
232
+ f"> ✓ Successfully verified connection to Vertex AI in project {creds_info['project']}"
233
+ )
234
+ except Exception as e:
235
+ console.print(
236
+ f"> ✗ Failed to connect to Vertex AI: {e!s}\n"
237
+ f"> Please check your authentication settings and permissions. "
238
+ f"Visit https://cloud.google.com/vertex-ai/docs/authentication for help.",
239
+ style="bold red"
240
+ )
218
241
  else:
219
242
  if debug:
220
243
  logging.debug("Skipping verification checks due to --skip-checks flag")
221
244
  console.print("> Skipping verification checks", style="yellow")
222
245
  # Set a default creds_info when skipping checks
223
- creds_info = {"project": gcp_project} if gcp_project else {"project": "unknown"}
224
-
225
- console.print("> Testing GCP and Vertex AI Connection...")
226
- try:
227
- verify_vertex_connection(
228
- project_id=creds_info["project"],
229
- location=region,
230
- )
231
- console.print(
232
- f"> ✓ Successfully verified connection to Vertex AI in project {creds_info['project']}"
233
- )
234
- except Exception as e:
235
- console.print(
236
- f"> ✗ Failed to connect to Vertex AI: {e!s}", style="bold red"
246
+ creds_info = (
247
+ {"project": gcp_project} if gcp_project else {"project": "unknown"}
237
248
  )
238
- raise
239
249
 
240
250
  # Process template
241
251
  template_path = get_template_path(final_agent, debug=debug)
@@ -263,10 +273,14 @@ def create(
263
273
  console.print("\n> 👍 Done. Execute the following command to get started:")
264
274
  if output_dir:
265
275
  # If output_dir was specified, use the absolute path
266
- console.print(f"cd {project_path} && make install && make playground")
276
+ console.print(
277
+ f"[bold bright_green]cd {project_path} && make install && make playground[/]"
278
+ )
267
279
  else:
268
280
  # If no output_dir specified, just use project name
269
- console.print(f"cd {project_name} && make install && make playground")
281
+ console.print(
282
+ f"[bold bright_green]cd {project_name} && make install && make playground[/]"
283
+ )
270
284
 
271
285
  # Replace region in all files if a different region was specified
272
286
  if region != "us-central1":
@@ -475,11 +489,7 @@ def check_and_install_uv() -> None:
475
489
  try:
476
490
  # Use shell=True for Windows compatibility and add timeout
477
491
  process = subprocess.run(
478
- "uv --version",
479
- shell=True,
480
- capture_output=True,
481
- text=True,
482
- timeout=10
492
+ "uv --version", shell=True, capture_output=True, text=True, timeout=10
483
493
  )
484
494
  if process.returncode == 0:
485
495
  logging.debug("uv is already installed")
@@ -512,7 +522,7 @@ def check_and_install_uv() -> None:
512
522
  install_command,
513
523
  shell=True,
514
524
  check=True,
515
- timeout=60 # Give installation more time
525
+ timeout=60, # Give installation more time
516
526
  )
517
527
  console.print("> uv installed successfully!", style="green")
518
528
  except subprocess.TimeoutExpired:
@@ -31,6 +31,8 @@ from src.cli.utils.cicd import (
31
31
  create_github_connection,
32
32
  create_github_repository,
33
33
  ensure_apis_enabled,
34
+ handle_github_authentication,
35
+ is_github_authenticated,
34
36
  print_cicd_summary,
35
37
  run_command,
36
38
  )
@@ -84,7 +86,7 @@ def setup_git_repository(config: ProjectConfig) -> str:
84
86
 
85
87
  # Initialize git if not already initialized
86
88
  if not (Path.cwd() / ".git").exists():
87
- run_command(["git", "init"])
89
+ run_command(["git", "init", "-b", "main"])
88
90
  console.print("✅ Git repository initialized")
89
91
 
90
92
  # Get current GitHub username for the remote URL
@@ -470,6 +472,14 @@ def setup_cicd(
470
472
  if not git_provider:
471
473
  git_provider = prompt_for_git_provider()
472
474
 
475
+ # Check GitHub authentication if GitHub is selected
476
+ if git_provider == "github" and not (github_pat and github_app_installation_id):
477
+ if not is_github_authenticated():
478
+ console.print("\n⚠️ Not authenticated with GitHub CLI", style="yellow")
479
+ handle_github_authentication()
480
+ else:
481
+ console.print("✅ GitHub CLI authentication verified")
482
+
473
483
  # Only prompt for repository details if not provided via CLI
474
484
  if not (repository_name and repository_owner):
475
485
  repository_name, repository_owner = prompt_for_repository_details(
@@ -676,7 +686,7 @@ def setup_cicd(
676
686
 
677
687
  # Initialize git if not already initialized
678
688
  if not (Path.cwd() / ".git").exists():
679
- run_command(["git", "init"])
689
+ run_command(["git", "init", "-b", "main"])
680
690
  console.print("✅ Git repository initialized")
681
691
 
682
692
  # Get current GitHub username for the remote URL
src/cli/utils/cicd.py CHANGED
@@ -22,6 +22,7 @@ from dataclasses import dataclass
22
22
  from enum import Enum
23
23
  from pathlib import Path
24
24
 
25
+ import click
25
26
  from rich.console import Console
26
27
  from rich.prompt import IntPrompt, Prompt
27
28
 
@@ -407,6 +408,7 @@ def run_command(
407
408
  cwd: Path | None = None,
408
409
  capture_output: bool = False,
409
410
  shell: bool = False,
411
+ input: str | None = None,
410
412
  ) -> subprocess.CompletedProcess:
411
413
  """Run a command and display it to the user"""
412
414
  # Format command for display
@@ -417,7 +419,13 @@ def run_command(
417
419
 
418
420
  # Run the command
419
421
  result = subprocess.run(
420
- cmd, check=check, cwd=cwd, capture_output=capture_output, text=True, shell=shell
422
+ cmd,
423
+ check=check,
424
+ cwd=cwd,
425
+ capture_output=capture_output,
426
+ text=True,
427
+ shell=shell,
428
+ input=input,
421
429
  )
422
430
 
423
431
  # Display output if captured
@@ -429,6 +437,63 @@ def run_command(
429
437
  return result
430
438
 
431
439
 
440
+ def is_github_authenticated() -> bool:
441
+ """Check if the user is authenticated with GitHub CLI.
442
+
443
+ Returns:
444
+ bool: True if authenticated, False otherwise
445
+ """
446
+ try:
447
+ # Try to get the current user, which will fail if not authenticated
448
+ result = run_command(["gh", "auth", "status"], check=False, capture_output=True)
449
+ return result.returncode == 0
450
+ except Exception:
451
+ return False
452
+
453
+
454
+ def handle_github_authentication() -> None:
455
+ """Handle GitHub CLI authentication interactively."""
456
+ console.print("\n🔑 GitHub Authentication Required", style="bold yellow")
457
+ console.print("You need to authenticate with GitHub CLI to continue.")
458
+ console.print("Choose an authentication method:")
459
+ console.print("1. Login with browser")
460
+ console.print("2. Login with token")
461
+
462
+ choice = click.prompt(
463
+ "Select authentication method", type=click.Choice(["1", "2"]), default="1"
464
+ )
465
+
466
+ try:
467
+ if choice == "1":
468
+ # Browser-based authentication
469
+ run_command(["gh", "auth", "login", "--web"])
470
+ else:
471
+ # Token-based authentication
472
+ token = click.prompt(
473
+ "Enter your GitHub Personal Access Token", hide_input=True
474
+ )
475
+ # Use a subprocess with pipe to avoid showing the token in process list
476
+ process = subprocess.Popen(
477
+ ["gh", "auth", "login", "--with-token"],
478
+ stdin=subprocess.PIPE,
479
+ stdout=subprocess.PIPE,
480
+ stderr=subprocess.PIPE,
481
+ text=True,
482
+ )
483
+ stdout, stderr = process.communicate(input=token + "\n")
484
+
485
+ if process.returncode != 0:
486
+ console.print(f"❌ Authentication failed: {stderr}", style="bold red")
487
+ raise subprocess.CalledProcessError(
488
+ process.returncode, ["gh", "auth", "login"], stdout, stderr
489
+ )
490
+
491
+ console.print("✅ Successfully authenticated with GitHub", style="green")
492
+ except subprocess.CalledProcessError as e:
493
+ console.print(f"❌ Authentication failed: {e}", style="bold red")
494
+ raise click.Abort() from e
495
+
496
+
432
497
  def create_github_repository(repository_owner: str, repository_name: str) -> None:
433
498
  """Create GitHub repository if it doesn't exist.
434
499
 
src/cli/utils/gcp.py CHANGED
@@ -64,7 +64,7 @@ def verify_vertex_connection(
64
64
  api_endpoint=f"{location}-aiplatform.googleapis.com"
65
65
  ),
66
66
  client_info=get_client_info(),
67
- transport=initializer.global_config._api_transport,
67
+ transport="rest",
68
68
  )
69
69
  request = get_dummy_request(project_id=project_id, location=location)
70
70
  client.generate_content(request=request)
src/cli/utils/template.py CHANGED
@@ -344,7 +344,9 @@ def process_template(
344
344
  requires_data_ingestion = template_config.get("settings", {}).get(
345
345
  "requires_data_ingestion", False
346
346
  )
347
- should_include_data_ingestion = include_data_ingestion or requires_data_ingestion
347
+ should_include_data_ingestion = (
348
+ include_data_ingestion or requires_data_ingestion
349
+ )
348
350
 
349
351
  if should_include_data_ingestion:
350
352
  logging.debug("3. Including data processing files")
@@ -400,7 +402,9 @@ def process_template(
400
402
  requires_data_ingestion = template_config.get("settings", {}).get(
401
403
  "requires_data_ingestion", False
402
404
  )
403
- should_include_data_ingestion = include_data_ingestion or requires_data_ingestion
405
+ should_include_data_ingestion = (
406
+ include_data_ingestion or requires_data_ingestion
407
+ )
404
408
 
405
409
  if should_include_data_ingestion:
406
410
  logging.debug(