jarvis-ai-assistant 0.3.18__tar.gz → 0.3.19__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.
- {jarvis_ai_assistant-0.3.18/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.3.19}/PKG-INFO +1 -1
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/pyproject.toml +1 -1
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/setup.py +1 -1
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/__init__.py +1 -1
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/__init__.py +21 -10
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/edit_file_handler.py +8 -13
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/memory_manager.py +4 -4
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/task_analyzer.py +4 -3
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/task_manager.py +6 -6
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/tool_executor.py +2 -2
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_agent/code_agent.py +21 -29
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/code_review.py +2 -4
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_git_utils/git_commiter.py +17 -18
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_methodology/main.py +12 -12
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_platform/base.py +14 -13
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_platform/kimi.py +13 -13
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_platform/tongyi.py +17 -15
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_platform/yuanbao.py +11 -11
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_rag/cli.py +36 -32
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_rag/embedding_manager.py +11 -6
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_rag/llm_interface.py +6 -5
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_rag/rag_pipeline.py +9 -8
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_rag/reranker.py +3 -2
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_rag/retriever.py +18 -8
- jarvis_ai_assistant-0.3.19/src/jarvis/jarvis_smart_shell/main.py +490 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_stats/stats.py +40 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_stats/storage.py +220 -9
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_tools/clear_memory.py +0 -11
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_tools/cli/main.py +18 -17
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_tools/edit_file.py +4 -4
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_tools/execute_script.py +5 -1
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_tools/file_analyzer.py +6 -6
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_tools/generate_new_tool.py +6 -17
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_tools/read_code.py +3 -6
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_tools/read_webpage.py +4 -4
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_tools/registry.py +8 -28
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_tools/retrieve_memory.py +5 -16
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_tools/rewrite_file.py +0 -4
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_tools/save_memory.py +2 -10
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_tools/search_web.py +5 -8
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_tools/virtual_tty.py +22 -40
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_utils/clipboard.py +3 -3
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_utils/input.py +67 -27
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_utils/methodology.py +3 -3
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_utils/output.py +1 -7
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_utils/utils.py +35 -58
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
- jarvis_ai_assistant-0.3.18/src/jarvis/jarvis_smart_shell/main.py +0 -230
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/LICENSE +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/MANIFEST.in +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/README.md +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/setup.cfg +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/agent_manager.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/config_editor.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/file_methodology_manager.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/jarvis.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/main.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/methodology_share_manager.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/output_handler.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/prompt_builder.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/prompts.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/protocols.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/session_manager.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/share_manager.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/tool_share_manager.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_agent/lint.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_data/config_schema.json +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_git_squash/main.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_mcp/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_memory_organizer/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_memory_organizer/memory_organizer.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_multi_agent/main.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_platform/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_platform/ai8.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_platform/human.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_platform/openai.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_platform/registry.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_platform_manager/main.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_platform_manager/service.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_rag/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_rag/cache.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_rag/query_rewriter.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_stats/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_stats/cli.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_stats/visualizer.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_tools/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_tools/ask_user.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_tools/base.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_tools/methodology.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_utils/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_utils/config.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_utils/embedding.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_utils/file_processors.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_utils/git_utils.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_utils/globals.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_utils/http.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_utils/tag.py +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
- {jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "jarvis-ai-assistant"
|
7
|
-
version = "0.3.
|
7
|
+
version = "0.3.19"
|
8
8
|
description = "Jarvis: An AI assistant that uses tools to interact with the system"
|
9
9
|
readme = "README.md"
|
10
10
|
authors = [{ name = "skyfire", email = "skyfireitdiy@hotmail.com" }]
|
@@ -3,7 +3,7 @@ from setuptools import setup, find_packages # type: ignore
|
|
3
3
|
|
4
4
|
setup(
|
5
5
|
name="jarvis-ai-assistant",
|
6
|
-
version="0.3.
|
6
|
+
version="0.3.19",
|
7
7
|
author="skyfire",
|
8
8
|
author_email="skyfireitdiy@hotmail.com",
|
9
9
|
description="An AI assistant that uses various tools to interact with the system",
|
{jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/__init__.py
RENAMED
@@ -413,6 +413,19 @@ class Agent:
|
|
413
413
|
"""Sets the flag to run input handlers on the next turn."""
|
414
414
|
self.run_input_handlers_next_turn = value
|
415
415
|
|
416
|
+
def _multiline_input(self, tip: str, print_on_empty: bool) -> str:
|
417
|
+
"""
|
418
|
+
Safe wrapper for multiline input to optionally suppress empty-input notice.
|
419
|
+
If the configured multiline_inputer supports 'print_on_empty' keyword, pass it;
|
420
|
+
otherwise, fall back to calling with a single argument for compatibility.
|
421
|
+
"""
|
422
|
+
try:
|
423
|
+
# Try to pass the keyword for enhanced input handler
|
424
|
+
return self.multiline_inputer(tip, print_on_empty=print_on_empty) # type: ignore
|
425
|
+
except TypeError:
|
426
|
+
# Fallback for custom handlers that only accept one argument
|
427
|
+
return self.multiline_inputer(tip) # type: ignore
|
428
|
+
|
416
429
|
def set_after_tool_call_cb(self, cb: Callable[[Any], None]): # type: ignore
|
417
430
|
"""设置工具调用后回调函数。
|
418
431
|
|
@@ -527,17 +540,17 @@ class Agent:
|
|
527
540
|
注意:
|
528
541
|
仅生成摘要,不修改对话状态
|
529
542
|
"""
|
530
|
-
|
543
|
+
|
531
544
|
try:
|
532
545
|
if not self.model:
|
533
546
|
raise RuntimeError("Model not initialized")
|
534
547
|
summary = self.model.chat_until_success(
|
535
548
|
self.session.prompt + "\n" + SUMMARY_REQUEST_PROMPT
|
536
549
|
) # type: ignore
|
537
|
-
|
550
|
+
|
538
551
|
return summary
|
539
552
|
except Exception as e:
|
540
|
-
print("
|
553
|
+
PrettyOutput.print("总结对话历史失败", OutputType.ERROR)
|
541
554
|
return ""
|
542
555
|
|
543
556
|
def _summarize_and_clear_history(self) -> str:
|
@@ -559,7 +572,7 @@ class Agent:
|
|
559
572
|
"""
|
560
573
|
# 在清理历史之前,提示用户保存重要记忆
|
561
574
|
if self.force_save_memory:
|
562
|
-
print("
|
575
|
+
PrettyOutput.print("对话历史即将被总结和清理,请先保存重要信息...", OutputType.INFO)
|
563
576
|
self.memory_manager.prompt_memory_save()
|
564
577
|
|
565
578
|
if self._should_use_file_upload():
|
@@ -634,12 +647,12 @@ class Agent:
|
|
634
647
|
self._check_and_organize_memory()
|
635
648
|
|
636
649
|
if self.need_summary:
|
637
|
-
|
650
|
+
|
638
651
|
self.session.prompt = self.summary_prompt
|
639
652
|
if not self.model:
|
640
653
|
raise RuntimeError("Model not initialized")
|
641
654
|
ret = self.model.chat_until_success(self.session.prompt) # type: ignore
|
642
|
-
|
655
|
+
|
643
656
|
return ret
|
644
657
|
|
645
658
|
return "任务完成"
|
@@ -789,7 +802,7 @@ class Agent:
|
|
789
802
|
return None
|
790
803
|
|
791
804
|
set_interrupt(False)
|
792
|
-
user_input = self.
|
805
|
+
user_input = self._multiline_input("模型交互期间被中断,请输入用户干预信息:", False)
|
793
806
|
|
794
807
|
self.run_input_handlers_next_turn = True
|
795
808
|
|
@@ -814,9 +827,7 @@ class Agent:
|
|
814
827
|
返回:
|
815
828
|
str: "continue" 或 "complete"
|
816
829
|
"""
|
817
|
-
user_input = self.
|
818
|
-
f"{self.name}: 请输入,或输入空行来结束当前任务:"
|
819
|
-
)
|
830
|
+
user_input = self._multiline_input(f"{self.name}: 请输入,或输入空行来结束当前任务:", False)
|
820
831
|
|
821
832
|
if user_input:
|
822
833
|
self.session.prompt = user_input
|
@@ -68,7 +68,7 @@ class EditFileHandler(OutputHandler):
|
|
68
68
|
{"SEARCH": diff["SEARCH"], "REPLACE": diff["REPLACE"]} for diff in diffs
|
69
69
|
]
|
70
70
|
|
71
|
-
|
71
|
+
|
72
72
|
success, result = self._fast_edit(file_path, file_patches)
|
73
73
|
|
74
74
|
if success:
|
@@ -208,7 +208,7 @@ class EditFileHandler(OutputHandler):
|
|
208
208
|
modified_content = modified_content.replace(
|
209
209
|
exact_search, replace_text, 1
|
210
210
|
)
|
211
|
-
|
211
|
+
|
212
212
|
found = True
|
213
213
|
else:
|
214
214
|
# 如果匹配不到,并且search与replace块的首尾都是换行,尝试去掉第一个和最后一个换行
|
@@ -224,7 +224,7 @@ class EditFileHandler(OutputHandler):
|
|
224
224
|
modified_content = modified_content.replace(
|
225
225
|
stripped_search, stripped_replace, 1
|
226
226
|
)
|
227
|
-
|
227
|
+
|
228
228
|
found = True
|
229
229
|
|
230
230
|
if not found:
|
@@ -253,9 +253,7 @@ class EditFileHandler(OutputHandler):
|
|
253
253
|
modified_content = modified_content.replace(
|
254
254
|
indented_search, indented_replace, 1
|
255
255
|
)
|
256
|
-
|
257
|
-
f"✅ 补丁 #{patch_count} 应用成功 (自动增加 {space_count} 个空格缩进)"
|
258
|
-
)
|
256
|
+
|
259
257
|
found = True
|
260
258
|
break
|
261
259
|
|
@@ -263,10 +261,7 @@ class EditFileHandler(OutputHandler):
|
|
263
261
|
successful_patches += 1
|
264
262
|
else:
|
265
263
|
error_msg = "搜索文本在文件中不存在"
|
266
|
-
|
267
|
-
f"{error_msg}:\n{search_text}",
|
268
|
-
output_type=OutputType.WARNING,
|
269
|
-
)
|
264
|
+
|
270
265
|
failed_patches.append({"patch": patch, "error": error_msg})
|
271
266
|
|
272
267
|
# 写入修改后的内容
|
@@ -284,12 +279,12 @@ class EditFileHandler(OutputHandler):
|
|
284
279
|
f"失败: {len(failed_patches)}/{patch_count}.\n"
|
285
280
|
f"失败详情:\n" + "\n".join(error_details)
|
286
281
|
)
|
287
|
-
print(
|
282
|
+
PrettyOutput.print(summary, OutputType.ERROR)
|
288
283
|
return False, summary
|
289
284
|
|
290
|
-
|
285
|
+
|
291
286
|
return True, modified_content
|
292
287
|
|
293
288
|
except Exception as e:
|
294
|
-
print(f"
|
289
|
+
PrettyOutput.print(f"文件修改失败: {str(e)}", OutputType.ERROR)
|
295
290
|
return False, f"文件修改失败: {str(e)}"
|
{jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/memory_manager.py
RENAMED
@@ -74,7 +74,7 @@ class MemoryManager:
|
|
74
74
|
if "save_memory" not in tool_names:
|
75
75
|
return
|
76
76
|
|
77
|
-
|
77
|
+
|
78
78
|
|
79
79
|
# 构建提示词,让大模型自己判断并保存记忆
|
80
80
|
prompt = """请回顾本次任务的整个过程,判断是否有值得长期记忆或项目记忆的信息。
|
@@ -97,12 +97,12 @@ class MemoryManager:
|
|
97
97
|
|
98
98
|
# 根据响应判断是否保存了记忆
|
99
99
|
if "save_memory" in response:
|
100
|
-
print("
|
100
|
+
PrettyOutput.print("已自动保存有价值的信息到记忆系统", OutputType.SUCCESS)
|
101
101
|
else:
|
102
|
-
print("
|
102
|
+
PrettyOutput.print("本次任务没有特别需要记忆的信息", OutputType.INFO)
|
103
103
|
|
104
104
|
except Exception as e:
|
105
|
-
print(f"
|
105
|
+
PrettyOutput.print(f"记忆分析失败: {str(e)}", OutputType.ERROR)
|
106
106
|
|
107
107
|
def add_memory_prompts_to_addon(self, addon_prompt: str, tool_registry) -> str:
|
108
108
|
"""在附加提示中添加记忆相关提示"""
|
{jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/task_analyzer.py
RENAMED
@@ -8,6 +8,7 @@ from typing import Optional
|
|
8
8
|
from jarvis.jarvis_utils.globals import get_interrupt, set_interrupt
|
9
9
|
from jarvis.jarvis_utils.input import user_confirm
|
10
10
|
from jarvis.jarvis_agent.prompts import TASK_ANALYSIS_PROMPT
|
11
|
+
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
11
12
|
|
12
13
|
|
13
14
|
class TaskAnalyzer:
|
@@ -24,7 +25,7 @@ class TaskAnalyzer:
|
|
24
25
|
|
25
26
|
def analysis_task(self, satisfaction_feedback: str = ""):
|
26
27
|
"""分析任务并生成方法论"""
|
27
|
-
|
28
|
+
|
28
29
|
try:
|
29
30
|
# 准备分析提示
|
30
31
|
self.agent.session.prompt = self._prepare_analysis_prompt(
|
@@ -37,9 +38,9 @@ class TaskAnalyzer:
|
|
37
38
|
# 循环处理工具调用,直到没有工具调用为止
|
38
39
|
self._process_analysis_loop()
|
39
40
|
|
40
|
-
|
41
|
+
|
41
42
|
except Exception as e:
|
42
|
-
print("
|
43
|
+
PrettyOutput.print("分析失败", OutputType.ERROR)
|
43
44
|
|
44
45
|
def _prepare_analysis_prompt(self, satisfaction_feedback: str) -> str:
|
45
46
|
"""准备分析提示"""
|
{jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/task_manager.py
RENAMED
@@ -29,7 +29,7 @@ class TaskManager:
|
|
29
29
|
data_dir = get_data_dir()
|
30
30
|
pre_command_path = os.path.join(data_dir, "pre-command")
|
31
31
|
if os.path.exists(pre_command_path):
|
32
|
-
print(f"
|
32
|
+
PrettyOutput.print(f"从{pre_command_path}加载预定义任务...", OutputType.INFO)
|
33
33
|
try:
|
34
34
|
with open(
|
35
35
|
pre_command_path, "r", encoding="utf-8", errors="ignore"
|
@@ -39,15 +39,15 @@ class TaskManager:
|
|
39
39
|
for name, desc in user_tasks.items():
|
40
40
|
if desc:
|
41
41
|
tasks[str(name)] = str(desc)
|
42
|
-
print(f"
|
42
|
+
PrettyOutput.print(f"预定义任务加载完成 {pre_command_path}", OutputType.SUCCESS)
|
43
43
|
except (yaml.YAMLError, OSError):
|
44
|
-
print(f"
|
44
|
+
PrettyOutput.print(f"预定义任务加载失败 {pre_command_path}", OutputType.ERROR)
|
45
45
|
|
46
46
|
# Check .jarvis/pre-command in current directory
|
47
47
|
pre_command_path = ".jarvis/pre-command"
|
48
48
|
if os.path.exists(pre_command_path):
|
49
49
|
abs_path = os.path.abspath(pre_command_path)
|
50
|
-
print(f"
|
50
|
+
PrettyOutput.print(f"从{abs_path}加载预定义任务...", OutputType.INFO)
|
51
51
|
try:
|
52
52
|
with open(
|
53
53
|
pre_command_path, "r", encoding="utf-8", errors="ignore"
|
@@ -57,9 +57,9 @@ class TaskManager:
|
|
57
57
|
for name, desc in local_tasks.items():
|
58
58
|
if desc:
|
59
59
|
tasks[str(name)] = str(desc)
|
60
|
-
print(f"
|
60
|
+
PrettyOutput.print(f"预定义任务加载完成 {pre_command_path}", OutputType.SUCCESS)
|
61
61
|
except (yaml.YAMLError, OSError):
|
62
|
-
print(f"
|
62
|
+
PrettyOutput.print(f"预定义任务加载失败 {pre_command_path}", OutputType.ERROR)
|
63
63
|
|
64
64
|
return tasks
|
65
65
|
|
{jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_agent/tool_executor.py
RENAMED
@@ -42,9 +42,9 @@ def execute_tool_call(response: str, agent: "Agent") -> Tuple[bool, Any]:
|
|
42
42
|
f"需要执行{tool_to_execute.name()}确认执行?", True
|
43
43
|
):
|
44
44
|
try:
|
45
|
-
|
45
|
+
|
46
46
|
result = tool_to_execute.handle(response, agent)
|
47
|
-
|
47
|
+
|
48
48
|
return result
|
49
49
|
except Exception as e:
|
50
50
|
PrettyOutput.print(f"工具执行失败: {str(e)}", OutputType.ERROR)
|
{jarvis_ai_assistant-0.3.18 → jarvis_ai_assistant-0.3.19}/src/jarvis/jarvis_code_agent/code_agent.py
RENAMED
@@ -205,11 +205,11 @@ class CodeAgent:
|
|
205
205
|
返回:
|
206
206
|
str: git根目录路径
|
207
207
|
"""
|
208
|
-
|
208
|
+
|
209
209
|
curr_dir = os.getcwd()
|
210
210
|
git_dir = find_git_root_and_cd(curr_dir)
|
211
211
|
self.root_dir = git_dir
|
212
|
-
|
212
|
+
|
213
213
|
return git_dir
|
214
214
|
|
215
215
|
def _update_gitignore(self, git_dir: str) -> None:
|
@@ -218,33 +218,30 @@ class CodeAgent:
|
|
218
218
|
参数:
|
219
219
|
git_dir: git根目录路径
|
220
220
|
"""
|
221
|
-
|
221
|
+
|
222
222
|
gitignore_path = os.path.join(git_dir, ".gitignore")
|
223
223
|
jarvis_ignore = ".jarvis"
|
224
224
|
|
225
225
|
if not os.path.exists(gitignore_path):
|
226
226
|
with open(gitignore_path, "w", encoding="utf-8") as f:
|
227
227
|
f.write(f"{jarvis_ignore}\n")
|
228
|
-
print(f"
|
228
|
+
PrettyOutput.print(f"已创建 .gitignore 并添加 '{jarvis_ignore}'", OutputType.SUCCESS)
|
229
229
|
else:
|
230
230
|
with open(gitignore_path, "r+", encoding="utf-8") as f:
|
231
231
|
content = f.read()
|
232
232
|
if jarvis_ignore not in content.splitlines():
|
233
233
|
f.write(f"\n{jarvis_ignore}\n")
|
234
|
-
print(
|
235
|
-
|
236
|
-
|
234
|
+
PrettyOutput.print(
|
235
|
+
f"已更新 .gitignore,添加 '{jarvis_ignore}'", OutputType.SUCCESS
|
236
|
+
)
|
237
237
|
|
238
238
|
def _handle_git_changes(self, prefix: str, suffix: str) -> None:
|
239
239
|
"""处理git仓库中的未提交修改"""
|
240
|
-
|
240
|
+
|
241
241
|
if has_uncommitted_changes():
|
242
|
-
|
242
|
+
|
243
243
|
git_commiter = GitCommitTool()
|
244
244
|
git_commiter.execute({"prefix": prefix, "suffix": suffix})
|
245
|
-
print("✅ 未提交修改已处理完成")
|
246
|
-
else:
|
247
|
-
print("✅ 没有未提交的修改")
|
248
245
|
|
249
246
|
def _init_env(self, prefix: str, suffix: str) -> None:
|
250
247
|
"""初始化环境,组合以下功能:
|
@@ -253,13 +250,12 @@ class CodeAgent:
|
|
253
250
|
3. 处理未提交的修改
|
254
251
|
4. 配置git对换行符变化不敏感
|
255
252
|
"""
|
256
|
-
|
253
|
+
|
257
254
|
git_dir = self._find_git_root()
|
258
255
|
self._update_gitignore(git_dir)
|
259
256
|
self._handle_git_changes(prefix, suffix)
|
260
257
|
# 配置git对换行符变化不敏感
|
261
258
|
self._configure_line_ending_settings()
|
262
|
-
print("✅ 环境初始化完成")
|
263
259
|
|
264
260
|
def _configure_line_ending_settings(self) -> None:
|
265
261
|
"""配置git对换行符变化不敏感,只在当前设置与目标设置不一致时修改"""
|
@@ -285,17 +281,17 @@ class CodeAgent:
|
|
285
281
|
need_change = True
|
286
282
|
|
287
283
|
if not need_change:
|
288
|
-
|
284
|
+
|
289
285
|
return
|
290
286
|
|
291
287
|
PrettyOutput.print(
|
292
288
|
"⚠️ 正在修改git换行符敏感设置,这会影响所有文件的换行符处理方式",
|
293
289
|
OutputType.WARNING,
|
294
290
|
)
|
295
|
-
print("将进行以下设置:")
|
291
|
+
PrettyOutput.print("将进行以下设置:", OutputType.INFO)
|
296
292
|
for key, value in target_settings.items():
|
297
293
|
current = current_settings.get(key, "未设置")
|
298
|
-
print(f"
|
294
|
+
PrettyOutput.print(f"{key}: {current} -> {value}", OutputType.INFO)
|
299
295
|
|
300
296
|
# 直接执行设置,不需要用户确认
|
301
297
|
for key, value in target_settings.items():
|
@@ -305,7 +301,7 @@ class CodeAgent:
|
|
305
301
|
if sys.platform.startswith("win"):
|
306
302
|
self._handle_windows_line_endings()
|
307
303
|
|
308
|
-
print("
|
304
|
+
PrettyOutput.print("git换行符敏感设置已更新", OutputType.SUCCESS)
|
309
305
|
|
310
306
|
def _handle_windows_line_endings(self) -> None:
|
311
307
|
"""在Windows系统上处理换行符问题,提供建议而非强制修改"""
|
@@ -319,10 +315,8 @@ class CodeAgent:
|
|
319
315
|
if any(keyword in content for keyword in ["text=", "eol=", "binary"]):
|
320
316
|
return
|
321
317
|
|
322
|
-
print(
|
323
|
-
|
324
|
-
)
|
325
|
-
print("这可以防止仅因换行符不同而导致整个文件被标记为修改。")
|
318
|
+
PrettyOutput.print("提示:在Windows系统上,建议配置 .gitattributes 文件来避免换行符问题。", OutputType.INFO)
|
319
|
+
PrettyOutput.print("这可以防止仅因换行符不同而导致整个文件被标记为修改。", OutputType.INFO)
|
326
320
|
|
327
321
|
if user_confirm("是否要创建一个最小化的.gitattributes文件?", False):
|
328
322
|
# 最小化的内容,只影响特定类型的文件
|
@@ -341,20 +335,18 @@ class CodeAgent:
|
|
341
335
|
if not os.path.exists(gitattributes_path):
|
342
336
|
with open(gitattributes_path, "w", encoding="utf-8", newline="\n") as f:
|
343
337
|
f.write(minimal_content)
|
344
|
-
print("
|
338
|
+
PrettyOutput.print("已创建最小化的 .gitattributes 文件", OutputType.SUCCESS)
|
345
339
|
else:
|
346
|
-
print("
|
347
|
-
print(minimal_content)
|
340
|
+
PrettyOutput.print("将以下内容追加到现有 .gitattributes 文件:", OutputType.INFO)
|
341
|
+
PrettyOutput.print(minimal_content, OutputType.CODE, lang="text")
|
348
342
|
if user_confirm("是否追加到现有文件?", True):
|
349
343
|
with open(
|
350
344
|
gitattributes_path, "a", encoding="utf-8", newline="\n"
|
351
345
|
) as f:
|
352
346
|
f.write("\n" + minimal_content)
|
353
|
-
print("
|
347
|
+
PrettyOutput.print("已更新 .gitattributes 文件", OutputType.SUCCESS)
|
354
348
|
else:
|
355
|
-
print(
|
356
|
-
"ℹ️ 跳过.gitattributes文件创建。如果遇到换行符问题,可以手动创建此文件。"
|
357
|
-
)
|
349
|
+
PrettyOutput.print("跳过 .gitattributes 文件创建。如遇换行符问题,可手动创建此文件。", OutputType.INFO)
|
358
350
|
|
359
351
|
def _record_code_changes_stats(self, diff_text: str) -> None:
|
360
352
|
"""记录代码变更的统计信息。
|
@@ -286,7 +286,6 @@ class CodeReviewTool:
|
|
286
286
|
diff_output = ""
|
287
287
|
|
288
288
|
# Build git diff command based on review type
|
289
|
-
print("📊 正在获取代码变更...")
|
290
289
|
|
291
290
|
if review_type == "commit":
|
292
291
|
if "commit_sha" not in args:
|
@@ -458,7 +457,6 @@ class CodeReviewTool:
|
|
458
457
|
diff_output = review_info + diff_output
|
459
458
|
|
460
459
|
PrettyOutput.print(diff_output, OutputType.CODE, lang="diff")
|
461
|
-
print("✅ 代码变更获取完成")
|
462
460
|
|
463
461
|
system_prompt = """<code_review_guide>
|
464
462
|
<role>
|
@@ -753,10 +751,10 @@ class CodeReviewTool:
|
|
753
751
|
"stdout": "",
|
754
752
|
"stderr": "代码差异太大,无法处理",
|
755
753
|
}
|
756
|
-
|
754
|
+
|
757
755
|
upload_success = agent.model.upload_files([temp_file_path])
|
758
756
|
if upload_success:
|
759
|
-
|
757
|
+
pass
|
760
758
|
else:
|
761
759
|
return {
|
762
760
|
"success": False,
|
@@ -82,11 +82,11 @@ class GitCommitTool:
|
|
82
82
|
|
83
83
|
def _stage_changes(self) -> None:
|
84
84
|
"""Stage all changes for commit"""
|
85
|
-
|
85
|
+
|
86
86
|
subprocess.Popen(
|
87
87
|
["git", "add", "."], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL
|
88
88
|
).wait()
|
89
|
-
|
89
|
+
|
90
90
|
|
91
91
|
def execute(self, args: Dict) -> Dict[str, Any]:
|
92
92
|
"""Execute automatic commit process with support for multi-line messages and special characters"""
|
@@ -107,11 +107,11 @@ class GitCommitTool:
|
|
107
107
|
if not has_uncommitted_changes():
|
108
108
|
return {"success": True, "stdout": "No changes to commit", "stderr": ""}
|
109
109
|
|
110
|
-
|
110
|
+
|
111
111
|
self._stage_changes()
|
112
112
|
|
113
113
|
# 获取差异
|
114
|
-
|
114
|
+
|
115
115
|
# 获取文件列表
|
116
116
|
files_cmd = ["git", "diff", "--cached", "--name-only"]
|
117
117
|
process = subprocess.Popen(
|
@@ -128,11 +128,11 @@ class GitCommitTool:
|
|
128
128
|
stderr=subprocess.PIPE,
|
129
129
|
)
|
130
130
|
diff = process.communicate()[0].decode(errors="ignore")
|
131
|
-
|
131
|
+
|
132
132
|
try:
|
133
133
|
temp_diff_file_path = None
|
134
134
|
# 生成提交信息
|
135
|
-
print("
|
135
|
+
PrettyOutput.print("正在生成提交消息...", OutputType.INFO)
|
136
136
|
|
137
137
|
# 准备提示信息
|
138
138
|
custom_prompt = get_git_commit_prompt()
|
@@ -224,13 +224,13 @@ commit信息
|
|
224
224
|
|
225
225
|
if is_large_content:
|
226
226
|
if not platform.support_upload_files():
|
227
|
-
print("
|
227
|
+
PrettyOutput.print("差异文件太大,无法处理", OutputType.ERROR)
|
228
228
|
return {
|
229
229
|
"success": False,
|
230
230
|
"stdout": "",
|
231
231
|
"stderr": "错误:差异文件太大,无法处理",
|
232
232
|
}
|
233
|
-
|
233
|
+
|
234
234
|
# 创建临时文件并写入差异内容
|
235
235
|
with tempfile.NamedTemporaryFile(
|
236
236
|
mode="w", suffix=".diff", delete=False
|
@@ -238,12 +238,12 @@ commit信息
|
|
238
238
|
temp_diff_file_path = temp_diff_file.name
|
239
239
|
temp_diff_file.write(diff)
|
240
240
|
temp_diff_file.flush()
|
241
|
-
|
241
|
+
|
242
242
|
upload_success = platform.upload_files([temp_diff_file_path])
|
243
243
|
if upload_success:
|
244
|
-
|
244
|
+
pass
|
245
245
|
else:
|
246
|
-
print("
|
246
|
+
PrettyOutput.print("上传代码差异文件失败", OutputType.ERROR)
|
247
247
|
return {
|
248
248
|
"success": False,
|
249
249
|
"stdout": "",
|
@@ -252,7 +252,6 @@ commit信息
|
|
252
252
|
# 根据上传状态准备完整的提示
|
253
253
|
if is_large_content:
|
254
254
|
# 尝试生成提交信息
|
255
|
-
print("✨ 正在生成提交消息...")
|
256
255
|
# 使用上传的文件
|
257
256
|
prompt = (
|
258
257
|
base_prompt
|
@@ -299,10 +298,10 @@ commit信息
|
|
299
298
|
{ct("COMMIT_MESSAGE")}
|
300
299
|
"""
|
301
300
|
commit_message = platform.chat_until_success(prompt)
|
302
|
-
|
301
|
+
|
303
302
|
|
304
303
|
# 执行提交
|
305
|
-
|
304
|
+
|
306
305
|
# Windows 兼容性:使用 delete=False 避免权限错误
|
307
306
|
tmp_file = tempfile.NamedTemporaryFile(mode="w", delete=False)
|
308
307
|
tmp_file_path = tmp_file.name
|
@@ -310,7 +309,7 @@ commit信息
|
|
310
309
|
tmp_file.write(commit_message)
|
311
310
|
tmp_file.close() # Windows 需要先关闭文件才能被其他进程读取
|
312
311
|
|
313
|
-
|
312
|
+
|
314
313
|
commit_cmd = ["git", "commit", "-F", tmp_file_path]
|
315
314
|
process = subprocess.Popen(
|
316
315
|
commit_cmd,
|
@@ -328,7 +327,7 @@ commit信息
|
|
328
327
|
)
|
329
328
|
raise Exception(f"Git commit failed: {error_msg}")
|
330
329
|
|
331
|
-
|
330
|
+
|
332
331
|
finally:
|
333
332
|
# 手动删除临时文件
|
334
333
|
try:
|
@@ -337,7 +336,7 @@ commit信息
|
|
337
336
|
pass
|
338
337
|
|
339
338
|
commit_hash = self._get_last_commit_hash()
|
340
|
-
|
339
|
+
|
341
340
|
finally:
|
342
341
|
# 清理临时差异文件
|
343
342
|
if temp_diff_file_path is not None and os.path.exists(
|
@@ -346,7 +345,7 @@ commit信息
|
|
346
345
|
try:
|
347
346
|
os.unlink(temp_diff_file_path)
|
348
347
|
except Exception as e:
|
349
|
-
print(f"
|
348
|
+
PrettyOutput.print(f"无法删除临时文件: {str(e)}", OutputType.WARNING)
|
350
349
|
|
351
350
|
PrettyOutput.print(
|
352
351
|
f"提交哈希: {commit_hash}\n提交消息: {commit_message}",
|