nexforge-cli 0.1.0__tar.gz → 0.1.1__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.
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/.gitignore +1 -0
- nexforge_cli-0.1.1/INSTALL.md +82 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/PKG-INFO +1 -1
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/pyproject.toml +1 -1
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/ui/widgets/messages.py +5 -5
- nexforge_cli-0.1.0/PyPI-Recovery-Codes-NexTech_2026-2026-07-11T08_45_53.599616.txt +0 -8
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/= +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/README.md +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/assets/icons/agent.svg +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/assets/icons/cost.svg +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/assets/icons/edit.svg +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/assets/icons/err.svg +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/assets/icons/file.svg +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/assets/icons/model.svg +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/assets/icons/ok.svg +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/assets/icons/read.svg +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/assets/icons/running.svg +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/assets/icons/search.svg +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/assets/icons/shell.svg +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/assets/icons/thinking.svg +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/assets/icons/web.svg +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/assets/icons/write.svg +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/config.example.toml +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/devlog/2026-07-07.md +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/doc//344/274/232/350/257/235/347/256/241/347/220/206.md" +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/doc//345/221/275/344/273/244/344/270/216/345/277/253/346/215/267/351/224/256.md" +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/doc//345/256/211/350/243/205/344/270/216/351/205/215/347/275/256.md" +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/doc//345/267/245/345/205/267/345/217/202/350/200/203.md" +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/doc//346/200/273/350/247/210.md" +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/doc//346/235/203/351/231/220/347/263/273/347/273/237.md" +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/doc//350/256/241/345/210/222/346/250/241/345/274/217.md" +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/doc//351/253/230/347/272/247/345/212/237/350/203/275.md" +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/scripts/publish.sh +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/scripts/smoke_provider.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/scripts/smoke_tui.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/__init__.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/__main__.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/app.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/cli.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/config.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/core/__init__.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/core/agent.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/core/jobs.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/core/permissions.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/core/router.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/core/session.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/core/types.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/icons.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/mcp/__init__.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/provider/__init__.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/provider/balance.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/provider/deepseek.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/skills/loader.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/store/__init__.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/store/plan_store.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/store/session_store.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/theme.tcss +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/tools/__init__.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/tools/_paths.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/tools/background.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/tools/base.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/tools/edit_file.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/tools/fs_ops.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/tools/git.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/tools/list_dir.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/tools/multi_edit.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/tools/read_file.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/tools/registry.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/tools/search_content.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/tools/search_files.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/tools/shell.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/tools/web.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/tools/write_file.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/ui/__init__.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/ui/screens/__init__.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/ui/screens/chat.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/ui/widgets/__init__.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/ui/widgets/apikey_modal.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/ui/widgets/banner.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/ui/widgets/confirm_modal.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/ui/widgets/diff_modal.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/ui/widgets/mode_warning.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/ui/widgets/multiline_modal.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/ui/widgets/multiline_prompt.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/ui/widgets/plan_sidebar.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/ui/widgets/sidebar.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/ui/widgets/statusbar.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/web/__init__.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/web/server.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/src/nexforge/web/static/index.html +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/tests/test_approval.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/tests/test_config.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/tests/test_icons.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/tests/test_m2_tools.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/tests/test_sidebar.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/tests/test_sidebar_actions.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/tests/test_tools.py +0 -0
- {nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/tests/test_tui.py +0 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# NexForgeCLI 安装指南
|
|
2
|
+
|
|
3
|
+
## 环境要求
|
|
4
|
+
|
|
5
|
+
- Python **3.11+**
|
|
6
|
+
- 终端:Windows Terminal / macOS Terminal / Linux 任意终端
|
|
7
|
+
- 网络:需能访问 `api.deepseek.com`
|
|
8
|
+
- 可选:Git(仅 git 安装方式需要)
|
|
9
|
+
|
|
10
|
+
## 方式一:Pip 安装(推荐)
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
pip install nexforge-cli
|
|
14
|
+
nexforge
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
安装后运行 `nexforge`(或简写 `nf`)。
|
|
18
|
+
|
|
19
|
+
## 方式二:Pip 安装开发版
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pip install git+https://gitee.com/Lighthorn/nexforgecli.git
|
|
23
|
+
nexforge
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## 方式三:源码安装
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
git clone https://gitee.com/Lighthorn/nexforgecli.git
|
|
30
|
+
cd nexforgecli
|
|
31
|
+
pip install -e .
|
|
32
|
+
nexforge
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## 配置 API Key
|
|
36
|
+
|
|
37
|
+
### 首次启动自动配置
|
|
38
|
+
|
|
39
|
+
运行 `nexforge` 后会弹出 API Key 输入面板,直接粘贴 `sk-…` 即可。
|
|
40
|
+
|
|
41
|
+
### 手动配置
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# 环境变量(每次有效)
|
|
45
|
+
export DEEPSEEK_API_KEY="sk-你的密钥"
|
|
46
|
+
|
|
47
|
+
# 或启动后在输入框输入
|
|
48
|
+
/key sk-你的密钥
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
API Key 获取:[platform.deepseek.com/api_keys](https://platform.deepseek.com/api_keys)
|
|
52
|
+
|
|
53
|
+
## 验证安装
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
nexforge --help
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
看到 NexForgeCLI 配置信息即为安装成功。
|
|
60
|
+
|
|
61
|
+
## 升级
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
pip install --upgrade nexforge-cli
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## 卸载
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
pip uninstall nexforge-cli -y
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
配置文件和数据保留在 `~/.nexforge/` 和项目 `.nexforge/` 目录下,需手动删除。
|
|
74
|
+
|
|
75
|
+
## 常见问题
|
|
76
|
+
|
|
77
|
+
| 问题 | 解决 |
|
|
78
|
+
|------|------|
|
|
79
|
+
| `nexforge: command not found` | Python Scripts 目录不在 PATH 中,用 `python -m nexforge` 代替 |
|
|
80
|
+
| `No module named 'nexforge'` | pip 安装未成功,检查 Python 版本 ≥3.11 |
|
|
81
|
+
| `ProviderError: 未找到 API Key` | 未配置 API Key,用 `/key` 或环境变量设置 |
|
|
82
|
+
| Windows 终端乱码 | 使用 Windows Terminal 或 Git Bash,避免 PowerShell |
|
|
@@ -17,14 +17,14 @@ class SystemNote(Static):
|
|
|
17
17
|
|
|
18
18
|
sym = icon("err") if error else icon("running")
|
|
19
19
|
color = "red" if error else "#22D3EE"
|
|
20
|
-
super().__init__(f"[{color}]{sym}[/] {escape(text)}")
|
|
20
|
+
super().__init__(f"[{color}]{sym}[/] {escape(text).replace("]", r"]")}")
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
class UserMessage(Static):
|
|
24
24
|
def __init__(self, text: str) -> None:
|
|
25
25
|
from nexforge.icons import icon
|
|
26
26
|
|
|
27
|
-
super().__init__(f"[b #6D5EF5]{icon('user')}[/] {escape(text)}")
|
|
27
|
+
super().__init__(f"[b #6D5EF5]{icon('user')}[/] {escape(text).replace("]", r"]")}")
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
class ToolCard(Static):
|
|
@@ -39,7 +39,7 @@ class ToolCard(Static):
|
|
|
39
39
|
from nexforge.icons import icon
|
|
40
40
|
|
|
41
41
|
ic = icon(self._icon)
|
|
42
|
-
self.update(f"[#22D3EE]{ic}[/] {escape(self._preview)} [dim]执行中…[/]")
|
|
42
|
+
self.update(f"[#22D3EE]{ic}[/] {escape(self._preview).replace("]", r"]")} [dim]执行中…[/]")
|
|
43
43
|
|
|
44
44
|
def set_result(self, ok: bool, summary: str) -> None:
|
|
45
45
|
from nexforge.icons import icon
|
|
@@ -47,8 +47,8 @@ class ToolCard(Static):
|
|
|
47
47
|
mark = icon("ok") if ok else icon("err")
|
|
48
48
|
color = "green" if ok else "red"
|
|
49
49
|
self.update(
|
|
50
|
-
f"[{color}]{mark}[/] [#22D3EE]{escape(self._preview)}[/] "
|
|
51
|
-
f"[dim]{escape(summary)}[/]"
|
|
50
|
+
f"[{color}]{mark}[/] [#22D3EE]{escape(self._preview).replace("]", r"]")}[/] "
|
|
51
|
+
f"[dim]{escape(summary).replace("]", r"]")}[/]"
|
|
52
52
|
)
|
|
53
53
|
|
|
54
54
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/doc//344/274/232/350/257/235/347/256/241/347/220/206.md"
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/doc//345/267/245/345/205/267/345/217/202/350/200/203.md"
RENAMED
|
File without changes
|
|
File without changes
|
{nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/doc//346/235/203/351/231/220/347/263/273/347/273/237.md"
RENAMED
|
File without changes
|
{nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/doc//350/256/241/345/210/222/346/250/241/345/274/217.md"
RENAMED
|
File without changes
|
{nexforge_cli-0.1.0 → nexforge_cli-0.1.1}/doc//351/253/230/347/272/247/345/212/237/350/203/275.md"
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|