diff --git a/aider/main.py b/aider/main.py index 8eaefeedd..dc2053491 100644 --- a/aider/main.py +++ b/aider/main.py @@ -377,6 +377,12 @@ def main(argv=None, input=None, output=None, force_git_root=None): metavar="COMMAND", help="Specify a single message to send GPT, process reply then exit (disables chat mode)", ) + other_group.add_argument( + "--message-file", + "-f", + metavar="MESSAGE_FILE", + help="Specify a file containing the message to send GPT, process reply, then exit (disables chat mode)", + ) other_group.add_argument( "--encoding", default="utf-8", @@ -568,8 +574,20 @@ def main(argv=None, input=None, output=None, force_git_root=None): io.tool_error(f"Git working dir: {git_root}") if args.message: + io.add_to_input_history(args.message) io.tool_output() coder.run(with_message=args.message) + elif args.message_file: + try: + message_from_file = io.read_text(args.message_file) + io.tool_output() + coder.run(with_message=message_from_file) + except FileNotFoundError: + io.tool_error(f"Message file not found: {args.message_file}") + return 1 + except IOError as e: + io.tool_error(f"Error reading message file: {e}") + return 1 else: coder.run() diff --git a/tests/test_main.py b/tests/test_main.py index d16e1672d..b61de9d90 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -182,6 +182,19 @@ class TestMain(TestCase): _, kwargs = MockCoder.call_args assert kwargs["dirty_commits"] is True + def test_message_file_flag(self): + message_file_content = "This is a test message from a file." + message_file_path = tempfile.mktemp() + with open(message_file_path, 'w', encoding='utf-8') as message_file: + message_file.write(message_file_content) + + with patch("aider.main.Coder.create") as MockCoder: + MockCoder.return_value.run = MagicMock() + main(["--yes", "--message-file", message_file_path], input=DummyInput(), output=DummyOutput()) + MockCoder.return_value.run.assert_called_once_with(with_message=message_file_content) + + os.remove(message_file_path) + def test_encodings_arg(self): fname = "foo.py" @@ -196,3 +209,13 @@ class TestMain(TestCase): MockSend.side_effect = side_effect main(["--yes", fname, "--encoding", "iso-8859-15"]) + @patch("aider.main.InputOutput") + @patch("openai.ChatCompletion.create") + def test_main_message_adds_to_input_history(self, mock_chat_completion, MockInputOutput): + test_message = "test message" + mock_io_instance = MockInputOutput.return_value + mock_chat_completion.return_value = MagicMock(choices=[{"text": "mocked response"}]) + + main(["--message", test_message], input=DummyInput(), output=DummyOutput()) + + mock_io_instance.add_to_input_history.assert_called_once_with(test_message)