diff --git a/codeflash/cli_cmds/cmd_init.py b/codeflash/cli_cmds/cmd_init.py
index d4da0ed04..f90297b51 100644
--- a/codeflash/cli_cmds/cmd_init.py
+++ b/codeflash/cli_cmds/cmd_init.py
@@ -43,7 +43,7 @@
from argparse import Namespace
-def init_codeflash() -> None:
+def init_codeflash(non_interactive: bool = False) -> None:
try:
welcome_panel = Panel(
Text(
@@ -62,7 +62,7 @@ def init_codeflash() -> None:
project_language = detect_project_language()
if project_language == ProjectLanguage.JAVA:
- init_java_project()
+ init_java_project(non_interactive=non_interactive)
return
if project_language in (ProjectLanguage.JAVASCRIPT, ProjectLanguage.TYPESCRIPT):
diff --git a/codeflash/cli_cmds/init_java.py b/codeflash/cli_cmds/init_java.py
index eb01002fa..1ae213a49 100644
--- a/codeflash/cli_cmds/init_java.py
+++ b/codeflash/cli_cmds/init_java.py
@@ -147,7 +147,7 @@ def detect_java_test_framework(project_root: Path) -> str:
return "junit5" # Default to JUnit 5
-def init_java_project() -> None:
+def init_java_project(non_interactive: bool = False) -> None:
"""Initialize Codeflash for a Java project."""
from codeflash.cli_cmds.github_workflow import install_github_actions
from codeflash.cli_cmds.init_auth import install_github_app, prompt_api_key
@@ -164,17 +164,25 @@ def init_java_project() -> None:
did_add_new_key = prompt_api_key()
- should_modify, _config = should_modify_java_config()
-
- # Default git remote
- git_remote = "origin"
-
- if should_modify:
- setup_info = collect_java_setup_info()
+ if non_interactive:
+ # Use auto-detected defaults without any interactive prompts
+ setup_info = JavaSetupInfo()
git_remote = setup_info.git_remote or "origin"
configured = configure_java_project(setup_info)
if not configured:
apologize_and_exit()
+ else:
+ should_modify, _config = should_modify_java_config()
+
+ # Default git remote
+ git_remote = "origin"
+
+ if should_modify:
+ setup_info = collect_java_setup_info()
+ git_remote = setup_info.git_remote or "origin"
+ configured = configure_java_project(setup_info)
+ if not configured:
+ apologize_and_exit()
install_github_app(git_remote)
diff --git a/codeflash/main.py b/codeflash/main.py
index da0d83db6..4dd5498e6 100644
--- a/codeflash/main.py
+++ b/codeflash/main.py
@@ -62,7 +62,7 @@ def main() -> None:
elif args.command == "init":
from codeflash.cli_cmds.cmd_init import init_codeflash
- init_codeflash()
+ init_codeflash(non_interactive=getattr(args, "yes", False))
elif args.command == "init-actions":
from codeflash.cli_cmds.github_workflow import install_github_actions
diff --git a/tests/test_init_java.py b/tests/test_init_java.py
new file mode 100644
index 000000000..002f53541
--- /dev/null
+++ b/tests/test_init_java.py
@@ -0,0 +1,73 @@
+"""Tests for Java project initialization."""
+
+from __future__ import annotations
+
+from pathlib import Path
+from unittest.mock import MagicMock, patch
+
+
+class TestInitJavaNonInteractive:
+ """Test that non_interactive=True makes Java init fully non-interactive."""
+
+ def test_non_interactive_skips_prompts_and_uses_auto_detected(self, tmp_path: Path) -> None:
+ project_dir = (tmp_path / "java-project").resolve()
+ project_dir.mkdir()
+ (project_dir / "pom.xml").write_text("", encoding="utf-8")
+ (project_dir / "src" / "main" / "java").mkdir(parents=True)
+ (project_dir / "src" / "test" / "java").mkdir(parents=True)
+
+ with (
+ patch("codeflash.cli_cmds.init_java.Path.cwd", return_value=project_dir),
+ patch("codeflash.cli_cmds.init_auth.prompt_api_key", return_value=False),
+ patch("codeflash.cli_cmds.init_auth.install_github_app"),
+ patch("codeflash.cli_cmds.github_workflow.install_github_actions"),
+ patch("codeflash.cli_cmds.init_java.configure_java_project", return_value=True) as mock_configure,
+ patch("codeflash.cli_cmds.init_java.ph"),
+ patch("codeflash.cli_cmds.init_java.console"),
+ patch("codeflash.cli_cmds.init_java.sys") as mock_sys,
+ ):
+ mock_sys.exit = MagicMock(side_effect=SystemExit(0))
+
+ from codeflash.cli_cmds.init_java import JavaSetupInfo, init_java_project
+
+ try:
+ init_java_project(non_interactive=True)
+ except SystemExit:
+ pass
+
+ mock_configure.assert_called_once()
+ setup_info = mock_configure.call_args[0][0]
+ assert isinstance(setup_info, JavaSetupInfo)
+ assert setup_info.module_root_override is None
+ assert setup_info.test_root_override is None
+ assert setup_info.formatter_override is None
+ assert setup_info.git_remote == "origin"
+
+ def test_non_interactive_skips_should_modify_check(self, tmp_path: Path) -> None:
+ project_dir = (tmp_path / "java-project").resolve()
+ project_dir.mkdir()
+ (project_dir / "pom.xml").write_text("", encoding="utf-8")
+ (project_dir / "src" / "main" / "java").mkdir(parents=True)
+ (project_dir / "src" / "test" / "java").mkdir(parents=True)
+
+ with (
+ patch("codeflash.cli_cmds.init_java.Path.cwd", return_value=project_dir),
+ patch("codeflash.cli_cmds.init_auth.prompt_api_key", return_value=False),
+ patch("codeflash.cli_cmds.init_auth.install_github_app"),
+ patch("codeflash.cli_cmds.github_workflow.install_github_actions"),
+ patch("codeflash.cli_cmds.init_java.configure_java_project", return_value=True),
+ patch("codeflash.cli_cmds.init_java.should_modify_java_config") as mock_should_modify,
+ patch("codeflash.cli_cmds.init_java.ph"),
+ patch("codeflash.cli_cmds.init_java.console"),
+ patch("codeflash.cli_cmds.init_java.sys") as mock_sys,
+ ):
+ mock_sys.exit = MagicMock(side_effect=SystemExit(0))
+
+ from codeflash.cli_cmds.init_java import init_java_project
+
+ try:
+ init_java_project(non_interactive=True)
+ except SystemExit:
+ pass
+
+ mock_should_modify.assert_not_called()