nexforge-cli 0.2.3__tar.gz → 0.2.4__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.
Files changed (98) hide show
  1. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/PKG-INFO +1 -1
  2. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/pyproject.toml +1 -1
  3. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/ui/widgets/messages.py +19 -13
  4. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/.gitignore +0 -0
  5. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/= +0 -0
  6. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/INSTALL.md +0 -0
  7. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/README.md +0 -0
  8. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/assets/icons/agent.svg +0 -0
  9. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/assets/icons/cost.svg +0 -0
  10. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/assets/icons/edit.svg +0 -0
  11. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/assets/icons/err.svg +0 -0
  12. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/assets/icons/file.svg +0 -0
  13. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/assets/icons/model.svg +0 -0
  14. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/assets/icons/ok.svg +0 -0
  15. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/assets/icons/read.svg +0 -0
  16. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/assets/icons/running.svg +0 -0
  17. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/assets/icons/search.svg +0 -0
  18. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/assets/icons/shell.svg +0 -0
  19. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/assets/icons/thinking.svg +0 -0
  20. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/assets/icons/web.svg +0 -0
  21. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/assets/icons/write.svg +0 -0
  22. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/config.example.toml +0 -0
  23. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/devlog/2026-07-07.md +0 -0
  24. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/doc//344/274/232/350/257/235/347/256/241/347/220/206.md" +0 -0
  25. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/doc//345/221/275/344/273/244/344/270/216/345/277/253/346/215/267/351/224/256.md" +0 -0
  26. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/doc//345/256/211/350/243/205/344/270/216/351/205/215/347/275/256.md" +0 -0
  27. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/doc//345/257/271/346/257/224/345/210/206/346/236/220.md" +0 -0
  28. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/doc//345/267/245/345/205/267/345/217/202/350/200/203.md" +0 -0
  29. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/doc//346/200/273/350/247/210.md" +0 -0
  30. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/doc//346/235/203/351/231/220/347/263/273/347/273/237.md" +0 -0
  31. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/doc//350/256/241/345/210/222/346/250/241/345/274/217.md" +0 -0
  32. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/doc//351/253/230/347/272/247/345/212/237/350/203/275.md" +0 -0
  33. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/scripts/publish.sh +0 -0
  34. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/scripts/smoke_provider.py +0 -0
  35. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/scripts/smoke_tui.py +0 -0
  36. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/__init__.py +0 -0
  37. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/__main__.py +0 -0
  38. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/app.py +0 -0
  39. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/cli.py +0 -0
  40. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/config.py +0 -0
  41. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/core/__init__.py +0 -0
  42. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/core/agent.py +0 -0
  43. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/core/jobs.py +0 -0
  44. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/core/permissions.py +0 -0
  45. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/core/router.py +0 -0
  46. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/core/session.py +0 -0
  47. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/core/types.py +0 -0
  48. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/icons.py +0 -0
  49. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/mcp/__init__.py +0 -0
  50. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/provider/__init__.py +0 -0
  51. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/provider/balance.py +0 -0
  52. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/provider/deepseek.py +0 -0
  53. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/skills/loader.py +0 -0
  54. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/store/__init__.py +0 -0
  55. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/store/plan_store.py +0 -0
  56. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/store/session_store.py +0 -0
  57. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/theme.tcss +0 -0
  58. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/tools/__init__.py +0 -0
  59. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/tools/_paths.py +0 -0
  60. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/tools/background.py +0 -0
  61. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/tools/base.py +0 -0
  62. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/tools/edit_file.py +0 -0
  63. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/tools/fs_ops.py +0 -0
  64. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/tools/git.py +0 -0
  65. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/tools/list_dir.py +0 -0
  66. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/tools/multi_edit.py +0 -0
  67. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/tools/read_file.py +0 -0
  68. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/tools/registry.py +0 -0
  69. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/tools/search_content.py +0 -0
  70. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/tools/search_files.py +0 -0
  71. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/tools/shell.py +0 -0
  72. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/tools/web.py +0 -0
  73. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/tools/write_file.py +0 -0
  74. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/ui/__init__.py +0 -0
  75. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/ui/screens/__init__.py +0 -0
  76. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/ui/screens/chat.py +0 -0
  77. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/ui/widgets/__init__.py +0 -0
  78. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/ui/widgets/apikey_modal.py +0 -0
  79. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/ui/widgets/banner.py +0 -0
  80. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/ui/widgets/confirm_modal.py +0 -0
  81. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/ui/widgets/diff_modal.py +0 -0
  82. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/ui/widgets/mode_warning.py +0 -0
  83. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/ui/widgets/multiline_modal.py +0 -0
  84. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/ui/widgets/multiline_prompt.py +0 -0
  85. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/ui/widgets/plan_sidebar.py +0 -0
  86. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/ui/widgets/sidebar.py +0 -0
  87. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/ui/widgets/statusbar.py +0 -0
  88. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/web/__init__.py +0 -0
  89. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/web/server.py +0 -0
  90. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/src/nexforge/web/static/index.html +0 -0
  91. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/tests/test_approval.py +0 -0
  92. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/tests/test_config.py +0 -0
  93. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/tests/test_icons.py +0 -0
  94. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/tests/test_m2_tools.py +0 -0
  95. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/tests/test_sidebar.py +0 -0
  96. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/tests/test_sidebar_actions.py +0 -0
  97. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/tests/test_tools.py +0 -0
  98. {nexforge_cli-0.2.3 → nexforge_cli-0.2.4}/tests/test_tui.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nexforge-cli
3
- Version: 0.2.3
3
+ Version: 0.2.4
4
4
  Summary: NexForgeCLI — 一个面向 DeepSeek V4 的终端智能体(TUI + CLI 双模式)
5
5
  Project-URL: Homepage, https://gitee.com/Lighthorn/nexforgecli
6
6
  Author: NexForge
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "nexforge-cli"
7
- version = "0.2.3"
7
+ version = "0.2.4"
8
8
  description = "NexForgeCLI — 一个面向 DeepSeek V4 的终端智能体(TUI + CLI 双模式)"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -2,16 +2,11 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from rich.markup import escape
6
5
  from textual.app import ComposeResult
7
6
  from textual.containers import Vertical
8
7
  from textual.widgets import Collapsible, Static
9
8
  from rich.markdown import Markdown as RichMarkdown
10
-
11
-
12
- def _esc(text: str) -> str:
13
- """Rich markup safe escape: [ -> \\[ , ] -> \\]."""
14
- return escape(text).replace("]", r"\]")
9
+ from rich.text import Text
15
10
 
16
11
 
17
12
  class SystemNote(Static):
@@ -22,14 +17,20 @@ class SystemNote(Static):
22
17
 
23
18
  sym = icon("err") if error else icon("running")
24
19
  color = "red" if error else "#22D3EE"
25
- super().__init__(f"[{color}]{sym}[/] {_esc(text)}")
20
+ t = Text()
21
+ t.append(f"{sym} ", style=color)
22
+ t.append(text)
23
+ super().__init__(t)
26
24
 
27
25
 
28
26
  class UserMessage(Static):
29
27
  def __init__(self, text: str) -> None:
30
28
  from nexforge.icons import icon
31
29
 
32
- super().__init__(f"[b #6D5EF5]{icon('user')}[/] {_esc(text)}")
30
+ t = Text()
31
+ t.append(f"{icon('user')} ", style="bold #6D5EF5")
32
+ t.append(text)
33
+ super().__init__(t)
33
34
 
34
35
 
35
36
  class ToolCard(Static):
@@ -44,17 +45,22 @@ class ToolCard(Static):
44
45
  from nexforge.icons import icon
45
46
 
46
47
  ic = icon(self._icon)
47
- self.update(f"[#22D3EE]{ic}[/] {_esc(self._preview)} [dim]执行中…[/]")
48
+ t = Text()
49
+ t.append(f"{ic} ", style="#22D3EE")
50
+ t.append(self._preview)
51
+ t.append(" 执行…", style="dim")
52
+ self.update(t)
48
53
 
49
54
  def set_result(self, ok: bool, summary: str) -> None:
50
55
  from nexforge.icons import icon
51
56
 
52
57
  mark = icon("ok") if ok else icon("err")
53
58
  color = "green" if ok else "red"
54
- self.update(
55
- f"[{color}]{mark}[/] [#22D3EE]{_esc(self._preview)}[/] "
56
- f"[dim]{_esc(summary)}[/]"
57
- )
59
+ t = Text()
60
+ t.append(f"{mark} ", style=color)
61
+ t.append(f"{self._preview} ", style="#22D3EE")
62
+ t.append(summary, style="dim")
63
+ self.update(t)
58
64
 
59
65
 
60
66
  class AssistantTurn(Vertical):
File without changes
File without changes
File without changes
File without changes