cli-jaw 2.17.61 → 2.17.62
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.
- package/README.ja.md +376 -339
- package/README.ko.md +338 -393
- package/README.md +163 -508
- package/README.zh-CN.md +365 -376
- package/dist/server.js +3 -0
- package/dist/server.js.map +1 -1
- package/dist/src/agent/pi-runtime.js +37 -18
- package/dist/src/agent/pi-runtime.js.map +1 -1
- package/dist/src/agent/runtime/acp/permissions.js +2 -3
- package/dist/src/agent/runtime/acp/permissions.js.map +1 -1
- package/dist/src/agent/runtime/pi-turn.js +7 -0
- package/dist/src/agent/runtime/pi-turn.js.map +1 -1
- package/dist/src/agent/spawn/line-buffer.js +84 -13
- package/dist/src/agent/spawn/line-buffer.js.map +1 -1
- package/dist/src/agent/spawn.js +26 -15
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/code-mode/host.js +34 -5
- package/dist/src/code-mode/host.js.map +1 -1
- package/dist/src/code-mode/manager.js +24 -7
- package/dist/src/code-mode/manager.js.map +1 -1
- package/dist/src/code-mode/providers/provider-live-models.js +3 -1
- package/dist/src/code-mode/providers/provider-live-models.js.map +1 -1
- package/dist/src/code-mode/store.js +31 -6
- package/dist/src/code-mode/store.js.map +1 -1
- package/dist/src/core/config.js +119 -17
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/runtime-settings.js +7 -1
- package/dist/src/core/runtime-settings.js.map +1 -1
- package/dist/src/core/settings-merge.js +9 -0
- package/dist/src/core/settings-merge.js.map +1 -1
- package/dist/src/core/settings-watch.js +19 -1
- package/dist/src/core/settings-watch.js.map +1 -1
- package/dist/src/discord/bot.js +6 -4
- package/dist/src/discord/bot.js.map +1 -1
- package/dist/src/discord/send-only-client.js +37 -3
- package/dist/src/discord/send-only-client.js.map +1 -1
- package/dist/src/manager/memory/embedding/sync.js +6 -0
- package/dist/src/manager/memory/embedding/sync.js.map +1 -1
- package/dist/src/manager/routes/dashboard-memory.js +20 -7
- package/dist/src/manager/routes/dashboard-memory.js.map +1 -1
- package/dist/src/manager/server.js +8 -0
- package/dist/src/manager/server.js.map +1 -1
- package/dist/src/manager/shutdown.js +29 -3
- package/dist/src/manager/shutdown.js.map +1 -1
- package/dist/src/manager/worker-events.js +70 -8
- package/dist/src/manager/worker-events.js.map +1 -1
- package/dist/src/routes/code-native.js +23 -3
- package/dist/src/routes/code-native.js.map +1 -1
- package/dist/src/routes/events.js +4 -0
- package/dist/src/routes/events.js.map +1 -1
- package/dist/src/routes/settings.js +45 -1
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/routes/sse-connections.js +31 -0
- package/dist/src/routes/sse-connections.js.map +1 -0
- package/dist/src/shared/permissions.js +47 -0
- package/dist/src/shared/permissions.js.map +1 -0
- package/package.json +1 -1
- package/public/dist/.vite/manifest.json +31 -31
- package/public/dist/assets/AdvancedExport-B7h_ZvBu.js +1 -0
- package/public/dist/assets/Agent-DnbZJP7b.js +1 -0
- package/public/dist/assets/{ChannelEnablementControl-B2tq8Ji4.js → ChannelEnablementControl-Dl0uYx38.js} +5 -5
- package/public/dist/assets/ChannelSetupEntry-DxtOrN01.js +1 -0
- package/public/dist/assets/ChannelsDiscord-BEGGwd_3.js +1 -0
- package/public/dist/assets/{ChannelsSlack-B9FV0ftr.js → ChannelsSlack-BryC2Ahr.js} +1 -1
- package/public/dist/assets/ChannelsTelegram-CGSpaImJ.js +1 -0
- package/public/dist/assets/CodeCanvas-DpkFi5Au.js +2 -0
- package/public/dist/assets/Permissions-BwiMEoTV.js +1 -0
- package/public/dist/assets/Permissions-CodIW-Yd.js +1 -0
- package/public/dist/assets/{manager-C5cU1joU.js → manager-Bi_xw7TW.js} +2 -2
- package/public/dist/assets/{settings-CA2LQDGh.js → settings-W4KG9ivu.js} +1 -1
- package/public/dist/assets/{settings-embedding-oGvFayh-.js → settings-embedding-BfWzWKMM.js} +1 -1
- package/public/dist/manager/index.html +1 -1
- package/public/dist/settings/index.html +1 -1
- package/public/js/features/settings-discord.ts +39 -5
- package/public/js/features/settings-telegram.ts +38 -4
- package/public/js/features/settings-types.ts +2 -0
- package/public/locales/en.json +2 -0
- package/public/locales/ja.json +2 -0
- package/public/locales/ko.json +2 -0
- package/public/locales/zh.json +2 -0
- package/public/manager/src/App.tsx +4 -1
- package/public/manager/src/code/code-controller-runtime.ts +13 -6
- package/public/manager/src/code/code-session-client.ts +1 -1
- package/public/manager/src/code/session-order.ts +6 -7
- package/public/manager/src/dashboard-url-state.ts +8 -0
- package/public/manager/src/settings/pages/AdvancedExport.tsx +2 -0
- package/public/manager/src/settings/pages/Agent.tsx +13 -5
- package/public/manager/src/settings/pages/ChannelsDiscord.tsx +27 -4
- package/public/manager/src/settings/pages/ChannelsTelegram.tsx +26 -4
- package/public/manager/src/settings/pages/Permissions.tsx +50 -27
- package/public/manager/src/settings/pages/components/ChannelSetupEntry.tsx +4 -3
- package/public/manager/src/settings/pages/components/agent/PermissionQuickSection.tsx +10 -2
- package/public/dist/assets/AdvancedExport-BNMjYkw6.js +0 -1
- package/public/dist/assets/Agent-D4g8TPjm.js +0 -1
- package/public/dist/assets/ChannelSetupEntry-zKYImWXx.js +0 -1
- package/public/dist/assets/ChannelsDiscord-CWRKV-Zl.js +0 -1
- package/public/dist/assets/ChannelsTelegram-BdK-fTPI.js +0 -1
- package/public/dist/assets/CodeCanvas-D5jp8-t5.js +0 -2
- package/public/dist/assets/Permissions-Bh947tUG.js +0 -1
- package/public/dist/assets/Permissions-DzNJCt8K.js +0 -1
package/README.zh-CN.md
CHANGED
|
@@ -1,19 +1,80 @@
|
|
|
1
|
-
<
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="docs/assets/readme/banner.jpg" alt="CLI-JAW — 你的个人 AI 助手。每个 AI CLI,一个仪表盘。" width="100%">
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
<p align="center"><b>一个助手、一份记忆、一个仪表盘,统一你已经在付费的 AI 编码 CLI。</b><br>
|
|
6
|
+
Claude、Codex、Cursor、Grok、Copilot、OpenCode、Kiro、Antigravity 和 Pi — 像一支团队那样协作。</p>
|
|
4
7
|
|
|
5
|
-
|
|
8
|
+
<p align="center">
|
|
9
|
+
<a href="https://npmjs.com/package/cli-jaw"><img src="https://img.shields.io/npm/v/cli-jaw?color=cb3837&label=npm&logo=npm" alt="npm version"></a>
|
|
10
|
+
<a href="https://github.com/lidge-jun/cli-jaw/releases/latest"><img src="https://img.shields.io/github/v/release/lidge-jun/cli-jaw?label=release" alt="latest release"></a>
|
|
11
|
+
<img src="https://img.shields.io/badge/node-%3E%3D22.4-339933?logo=node.js&logoColor=white" alt="Node.js 22.4+">
|
|
12
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT license"></a>
|
|
13
|
+
</p>
|
|
6
14
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
15
|
+
```bash
|
|
16
|
+
# 现有用户想要最小改动:JAW_SAFE=1 npm install -g cli-jaw
|
|
17
|
+
npm install -g cli-jaw
|
|
18
|
+
jaw dashboard
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
<p align="center">
|
|
22
|
+
<a href="https://github.com/lidge-jun/cli-jaw/releases/latest"><img src="https://img.shields.io/badge/macOS-.dmg-24292f?logo=apple&logoColor=white" alt="Download for macOS (.dmg)"></a>
|
|
23
|
+
<a href="https://github.com/lidge-jun/cli-jaw/releases/latest"><img src="https://img.shields.io/badge/Windows-.exe-24292f?logo=windows&logoColor=white" alt="Download for Windows (.exe)"></a>
|
|
24
|
+
<a href="https://github.com/lidge-jun/cli-jaw/releases/latest"><img src="https://img.shields.io/badge/Linux-.AppImage-24292f?logo=linux&logoColor=white" alt="Download for Linux (.AppImage)"></a>
|
|
25
|
+
</p>
|
|
26
|
+
|
|
27
|
+
<table>
|
|
28
|
+
<tr>
|
|
29
|
+
<td width="50%" valign="middle">
|
|
30
|
+
|
|
31
|
+
### 每个 agent 都在一处
|
|
32
|
+
|
|
33
|
+
在管理面板里启动、停止并预览每个正在运行的实例。
|
|
34
|
+
|
|
35
|
+
</td>
|
|
36
|
+
<td width="50%"><img src="docs/screenshots/manager-dashboard-light.png" alt="CLI-JAW 管理面板" width="100%"></td>
|
|
37
|
+
</tr>
|
|
38
|
+
<tr>
|
|
39
|
+
<td width="50%" valign="middle">
|
|
40
|
+
|
|
41
|
+
### 为工作准备的看板
|
|
42
|
+
|
|
43
|
+
看板泳道、优先级矩阵和提醒,跟踪每个会话正在做什么。
|
|
44
|
+
|
|
45
|
+
</td>
|
|
46
|
+
<td width="50%"><img src="docs/screenshots/dashboard-kanban.png" alt="agent 会话的看板" width="100%"></td>
|
|
47
|
+
</tr>
|
|
48
|
+
<tr>
|
|
49
|
+
<td width="50%" valign="middle">
|
|
50
|
+
|
|
51
|
+
### agent 能读的笔记
|
|
13
52
|
|
|
14
|
-
|
|
53
|
+
内置的 Markdown 工作区,支持所见即所得编辑、数学公式和 Mermaid 图表。
|
|
15
54
|
|
|
16
|
-
</
|
|
55
|
+
</td>
|
|
56
|
+
<td width="50%"><img src="docs/screenshots/notes-wysiwyg.png" alt="笔记编辑器" width="100%"></td>
|
|
57
|
+
</tr>
|
|
58
|
+
</table>
|
|
59
|
+
|
|
60
|
+
<p align="center">
|
|
61
|
+
<a href="README.md">English</a> · <a href="README.ko.md">한국어</a> · <b>中文</b> · <a href="README.ja.md">日本語</a> · 📖 <a href="https://lidge-jun.github.io/cli-jaw/"><b>官网</b></a> · <a href="https://lidge-jun.github.io/cli-jaw/dev/">文档</a>
|
|
62
|
+
</p>
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## CLI-JAW 是什么?
|
|
67
|
+
|
|
68
|
+
CLI-JAW 把你已经在用的 AI 编码 CLI 统一成**一个助手、一份记忆、一个仪表盘**。你的主 CLI(“Boss”)把其他 CLI 当作“员工”调用,于是你不用再在多个应用之间复制粘贴,在一个地方就能下达指令。
|
|
69
|
+
|
|
70
|
+
- **无需 API 密钥** — 通过你已经在付费的订阅路由
|
|
71
|
+
- **无按 token 计费** — 月费固定,和你现有的订阅一样
|
|
72
|
+
- **本地运行** — 你的代码不会离开本机
|
|
73
|
+
- **随处可用** — Web、桌面应用、终端、Telegram、Discord 或 Slack
|
|
74
|
+
|
|
75
|
+
原生 Code API(`/api/code`)提供隔离的 Codex、Claude、Cursor 和 Grok 会话,具备持久 transcript 和原生 resume。参见 [native Code sessions](structure/runtime-integration.md#native-code-sessions)。
|
|
76
|
+
|
|
77
|
+
---
|
|
17
78
|
|
|
18
79
|
## 安装
|
|
19
80
|
|
|
@@ -23,7 +84,7 @@
|
|
|
23
84
|
```bash
|
|
24
85
|
# macOS / Linux
|
|
25
86
|
JAW_SAFE=1 npm install -g cli-jaw # skips optional tool/runtime setup
|
|
26
|
-
jaw init #
|
|
87
|
+
jaw init # interactive setup later when you're ready
|
|
27
88
|
```
|
|
28
89
|
|
|
29
90
|
|
|
@@ -55,18 +116,61 @@ jaw.cmd doctor
|
|
|
55
116
|
|
|
56
117
|
<!-- windows-support:end -->
|
|
57
118
|
|
|
119
|
+
无论走哪条路径,cli-jaw 现在都能把两者精确区分开:`jaw doctor --json` 会把
|
|
120
|
+
`platform` 报告为 `windows-native` 或 `wsl`,两者各有独立诊断。原生
|
|
121
|
+
Windows 不会再仅仅因为机器上配置了 WSL interop 就收到“在 WSL 里重新安装”
|
|
122
|
+
的建议。
|
|
123
|
+
|
|
58
124
|
</details>
|
|
59
125
|
|
|
60
126
|
```bash
|
|
61
|
-
# macOS / Linux / WSL
|
|
127
|
+
# macOS / Linux / WSL with Node.js 22+ already installed
|
|
62
128
|
npm install -g cli-jaw
|
|
63
129
|
jaw dashboard
|
|
64
130
|
```
|
|
65
131
|
|
|
132
|
+
> **npm 12+?** npm 现在默认阻止依赖的安装脚本。如果看到 `npm warn allow-scripts`,请批准脚本后再安装:
|
|
133
|
+
>
|
|
134
|
+
> ```bash
|
|
135
|
+
> npm install -g cli-jaw --allow-scripts=cli-jaw
|
|
136
|
+
> ```
|
|
137
|
+
|
|
138
|
+
<details>
|
|
139
|
+
<summary><b>Windows npm 安装恢复</b> — npm 12+ 阻止了脚本,或 PowerShell 执行策略限制</summary>
|
|
140
|
+
|
|
141
|
+
npm 12+ 可能完成全局安装,同时阻止 CLI-JAW 的依赖
|
|
142
|
+
`postinstall`。只批准这一个包然后重新安装,或把批准保存下来供
|
|
143
|
+
以后升级使用:
|
|
144
|
+
|
|
145
|
+
```powershell
|
|
146
|
+
npm install -g cli-jaw --allow-scripts=cli-jaw
|
|
147
|
+
npm config set allow-scripts=cli-jaw --location=user
|
|
148
|
+
jaw doctor
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
如果 PowerShell 报告 `jaw.ps1` 无法加载,因为脚本执行
|
|
152
|
+
已被禁用,请在下列受控变通方案中选择一个:
|
|
153
|
+
|
|
154
|
+
```powershell
|
|
155
|
+
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
|
|
156
|
+
jaw.cmd doctor
|
|
157
|
+
node "$(npm prefix -g)\node_modules\cli-jaw\dist\bin\cli-jaw.js" doctor
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
`jaw.ps1` 是 PowerShell 的 npm shim,受执行策略约束;
|
|
161
|
+
`jaw.cmd` 是等价的 cmd shim,不走该策略。直接使用
|
|
162
|
+
`node` 的形式会绕过两个 shim。`jaw doctor` 会报告被阻止或过期的安装、
|
|
163
|
+
残留的 npm 暂存目录,以及当前 PowerShell 策略;它还会
|
|
164
|
+
打印对应的恢复指引。
|
|
165
|
+
|
|
166
|
+
</details>
|
|
167
|
+
|
|
66
168
|
完成。打开 **http://localhost:24576** 进入管理仪表盘。单个 agent Web UI 在运行 `jaw serve` 时仍从 **http://localhost:3457** 提供。需要 [Node.js 22.4+](https://nodejs.org)。
|
|
67
169
|
|
|
68
170
|
> **第一次用?** 默认 npm 安装会初始化 CLI-JAW,并尝试配置原生 Claude。其他 AI CLI 是可选项;在 macOS/Linux 上如需安装全部工具,可运行 `CLI_JAW_INSTALL_CLI_TOOLS=1 npm install -g cli-jaw`。Windows 请使用下方 WSL 安装路径。
|
|
69
171
|
|
|
172
|
+
> **已退役的 runtime。** Claude E(`claude-e`)和 AI-E multiplexer(`ai-e`)已被移除。已保存的选择会以已退役状态显示,且无法执行;请选择一个可用的 runtime。详情:[runtime integration](structure/runtime-integration.md)。
|
|
173
|
+
|
|
70
174
|
<details>
|
|
71
175
|
<summary><b>macOS 一键安装</b> — 没有 Node.js?用这个</summary>
|
|
72
176
|
|
|
@@ -82,14 +186,14 @@ bash "$(npm root -g)/cli-jaw/scripts/verify-fresh-install.sh"
|
|
|
82
186
|
<summary><b>Windows(WSL — Windows 子系统 Linux)</b> — 从零一键安装</summary>
|
|
83
187
|
|
|
84
188
|
```powershell
|
|
85
|
-
# 1.
|
|
189
|
+
# 1. Install WSL (PowerShell as Admin)
|
|
86
190
|
wsl --install
|
|
87
191
|
```
|
|
88
192
|
|
|
89
193
|
重启后打开 **Ubuntu**,然后:
|
|
90
194
|
|
|
91
195
|
```bash
|
|
92
|
-
# 2.
|
|
196
|
+
# 2. Install CLI-JAW + all dependencies
|
|
93
197
|
curl -fsSL https://raw.githubusercontent.com/lidge-jun/cli-jaw/main/scripts/install-wsl.sh | bash
|
|
94
198
|
source ~/.bashrc
|
|
95
199
|
jaw dashboard
|
|
@@ -105,7 +209,101 @@ wsl.exe -d Ubuntu -- bash -lc "jaw dashboard"
|
|
|
105
209
|
</details>
|
|
106
210
|
|
|
107
211
|
<details>
|
|
108
|
-
<summary><b
|
|
212
|
+
<summary><b>原生 Windows(PowerShell beta)</b> — 分离的服务器日志</summary>
|
|
213
|
+
|
|
214
|
+
`jaw serve` 会保留它继承的 stdout 和 stderr 流,并把
|
|
215
|
+
两个流都追加到 `<JAW_HOME>\logs\serve.log`。启动时,已经达到 5 MiB 的文件
|
|
216
|
+
会被轮转一次为 `serve.log.1`。原生 Windows 仍然没有注册的
|
|
217
|
+
`jaw service` 日志后端。PowerShell 的
|
|
218
|
+
`Start-Process -RedirectStandardOutput/-RedirectStandardError` 会在每次启动时创建或
|
|
219
|
+
截断目标文件,所以不要把这两个选项指向
|
|
220
|
+
实例自有的 `serve.log`。
|
|
221
|
+
|
|
222
|
+
如果需要独立的、由运维方拥有的 stdout/stderr 文件,请改为在子 PowerShell 进程
|
|
223
|
+
内部做重定向。下面的示例把它们追加到
|
|
224
|
+
`<JAW_HOME>\logs` 下,同时避开 `Start-Process` 的截断默认行为:
|
|
225
|
+
|
|
226
|
+
```powershell
|
|
227
|
+
$jawHome = 'C:\jaw\worker-a'
|
|
228
|
+
$port = 3458
|
|
229
|
+
$logDir = Join-Path $jawHome 'logs'
|
|
230
|
+
$outLog = Join-Path $logDir 'serve.out.log'
|
|
231
|
+
$errLog = Join-Path $logDir 'serve.err.log'
|
|
232
|
+
New-Item -ItemType Directory -Force -Path $logDir -ErrorAction Stop | Out-Null
|
|
233
|
+
foreach ($path in @($outLog, $errLog)) {
|
|
234
|
+
# OpenOrCreate preserves existing content while proving that the child can append.
|
|
235
|
+
$probe = [IO.File]::Open($path, 'OpenOrCreate', 'Write', 'ReadWrite')
|
|
236
|
+
$probe.Dispose()
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
$jaw = (Get-Command jaw.cmd -ErrorAction Stop).Source
|
|
240
|
+
$childCommand = "& '$jaw' --home '$jawHome' serve --port $port --no-open 1>> '$outLog' 2>> '$errLog'"
|
|
241
|
+
$encoded = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($childCommand))
|
|
242
|
+
Start-Process -FilePath powershell.exe -ArgumentList '-NoProfile', '-EncodedCommand', $encoded -WindowStyle Hidden | Out-Null
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
请在各自独立的 PowerShell 终端里读取每个流(`Get-Content -Wait`
|
|
246
|
+
会占用该终端)。这些命令使用显式路径,因为启动终端里的变量
|
|
247
|
+
在新的 PowerShell 会话中不可用:
|
|
248
|
+
|
|
249
|
+
```powershell
|
|
250
|
+
# Terminal 1
|
|
251
|
+
Get-Content -LiteralPath 'C:\jaw\worker-a\logs\serve.out.log' -Tail 100 -Wait
|
|
252
|
+
|
|
253
|
+
# Terminal 2
|
|
254
|
+
Get-Content -LiteralPath 'C:\jaw\worker-a\logs\serve.err.log' -Tail 100 -Wait
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
生命周期命令以 home 为作用域,在发送信号前会校验
|
|
258
|
+
`<JAW_HOME>\jaw.pid.json`:
|
|
259
|
+
|
|
260
|
+
```powershell
|
|
261
|
+
& $jaw --home $jawHome service stop --port $port
|
|
262
|
+
& $jaw --home $jawHome service restart --port $port
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
单独运行 `service restart` 会以分离方式安全重启实例,但
|
|
266
|
+
无法重现运维方的文件重定向。要保留文件捕获,请
|
|
267
|
+
`stop`、可选地轮转已关闭的日志,然后重新运行上面的启动块:
|
|
268
|
+
|
|
269
|
+
```powershell
|
|
270
|
+
$pidFile = Join-Path $jawHome 'jaw.pid.json'
|
|
271
|
+
$serverProcess = $null
|
|
272
|
+
if (Test-Path -LiteralPath $pidFile -PathType Leaf) {
|
|
273
|
+
$record = Get-Content -LiteralPath $pidFile -Raw -ErrorAction Stop | ConvertFrom-Json
|
|
274
|
+
$serverProcess = Get-Process -Id ([int]$record.pid) -ErrorAction SilentlyContinue
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
& $jaw --home $jawHome service stop --port $port
|
|
278
|
+
if ($LASTEXITCODE -ne 0) {
|
|
279
|
+
throw "jaw service stop failed with exit code $LASTEXITCODE"
|
|
280
|
+
}
|
|
281
|
+
if ($serverProcess) {
|
|
282
|
+
try {
|
|
283
|
+
if (-not $serverProcess.WaitForExit(5000)) {
|
|
284
|
+
throw "jaw serve pid $($serverProcess.Id) did not exit within 5000ms"
|
|
285
|
+
}
|
|
286
|
+
} finally {
|
|
287
|
+
$serverProcess.Dispose()
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
$stamp = Get-Date -Format 'yyyyMMdd-HHmmss'
|
|
292
|
+
foreach ($path in @($outLog, $errLog)) {
|
|
293
|
+
if (Test-Path -LiteralPath $path) {
|
|
294
|
+
Move-Item -LiteralPath $path -Destination "$path.$stamp" -ErrorAction Stop
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
# Run the Start-Process launch block above again.
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
不要使用 `Get-Process node | Stop-Process`;它可能终止无关的
|
|
301
|
+
cli-jaw 实例和 AI runtime 进程。
|
|
302
|
+
|
|
303
|
+
</details>
|
|
304
|
+
|
|
305
|
+
<details>
|
|
306
|
+
<summary><b>全新机器证据</b> — 维护者发布检查</summary>
|
|
109
307
|
|
|
110
308
|
发布安装器变更前,请在干净 VM 上运行此流程。collector 会把环境快照、installer 日志、实际运行的 collector/installer/verifier 脚本及其 SHA-256 哈希、verifier 日志和新 shell PATH probe 写入 `~/cli-jaw-fresh-install-evidence-*`。
|
|
111
309
|
|
|
@@ -117,104 +315,91 @@ bash "$COLLECTOR" --target macos
|
|
|
117
315
|
|
|
118
316
|
# Ubuntu inside WSL
|
|
119
317
|
COLLECTOR=/tmp/cli-jaw-collect-fresh-install-evidence.sh
|
|
120
|
-
curl -fsSL https://raw.githubusercontent.com/lidge-jun/cli-jaw/main/scripts/collect-fresh-install-evidence.sh -o "$COLLECTOR"
|
|
121
318
|
bash "$COLLECTOR" --target wsl
|
|
122
319
|
```
|
|
123
320
|
|
|
124
|
-
从 Windows PowerShell
|
|
321
|
+
从 Windows PowerShell 进入受支持的 WSL 路径:
|
|
125
322
|
|
|
126
323
|
```powershell
|
|
127
324
|
wsl.exe -d Ubuntu -- bash -lc 'COLLECTOR=/tmp/cli-jaw-collect-fresh-install-evidence.sh; curl -fsSL https://raw.githubusercontent.com/lidge-jun/cli-jaw/main/scripts/collect-fresh-install-evidence.sh -o "$COLLECTOR"; bash "$COLLECTOR" --target wsl'
|
|
128
325
|
```
|
|
129
326
|
|
|
130
|
-
|
|
327
|
+
如果 collector 报告 WSL 内没有 `powershell.exe`,请在审计前从 Windows PowerShell 运行:
|
|
328
|
+
|
|
329
|
+
```powershell
|
|
330
|
+
wsl.exe -d Ubuntu -- bash -lc 'EVIDENCE_DIR="$(ls -dt ~/cli-jaw-fresh-install-evidence-* | head -1)"; { echo "command=wsl.exe -d Ubuntu -- bash -lc jaw --version"; jaw --version; } | tee "$EVIDENCE_DIR/33-powershell-to-wsl-probe.log"'
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
对于未合并的分支或本地 VM 检出,请显式传入本地安装器和 verifier:
|
|
334
|
+
|
|
335
|
+
```bash
|
|
336
|
+
bash scripts/collect-fresh-install-evidence.sh --target macos --install-script scripts/install.sh --verifier-script scripts/verify-fresh-install.sh
|
|
337
|
+
bash scripts/collect-fresh-install-evidence.sh --target wsl --install-script scripts/install-wsl.sh --verifier-script scripts/verify-fresh-install.sh
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
在把收集到的每个目录当作目标证据之前,请先审计:
|
|
131
341
|
|
|
132
342
|
```bash
|
|
133
343
|
EVIDENCE_DIR="$(ls -dt ~/cli-jaw-fresh-install-evidence-* | head -1)"
|
|
134
344
|
AUDITOR="$(npm root -g)/cli-jaw/scripts/audit-fresh-install-evidence.mjs"
|
|
135
345
|
node "$AUDITOR" "$EVIDENCE_DIR" --target macos
|
|
136
346
|
node "$AUDITOR" "$EVIDENCE_DIR" --target wsl
|
|
347
|
+
|
|
348
|
+
# For a local checkout, audit with the checkout's auditor:
|
|
349
|
+
node scripts/audit-fresh-install-evidence.mjs "$EVIDENCE_DIR" --target macos
|
|
350
|
+
node scripts/audit-fresh-install-evidence.mjs "$EVIDENCE_DIR" --target wsl
|
|
137
351
|
```
|
|
138
352
|
|
|
139
|
-
|
|
353
|
+
发布安装器变更前,请用两个严格的 evidence 目录运行 matrix gate:
|
|
140
354
|
|
|
141
355
|
```bash
|
|
142
356
|
GATE="$(npm root -g)/cli-jaw/scripts/verify-release-evidence.mjs"
|
|
143
357
|
node "$GATE" --macos /path/to/macos-evidence --wsl /path/to/wsl-evidence
|
|
358
|
+
|
|
359
|
+
# For a local checkout:
|
|
360
|
+
node scripts/verify-release-evidence.mjs --macos /path/to/macos-evidence --wsl /path/to/wsl-evidence
|
|
144
361
|
```
|
|
145
362
|
|
|
146
|
-
|
|
363
|
+
matrix gate 会拒绝用过期 collector、installer 或 verifier 脚本收集到的证据;归档的证据脚本必须与运行该 gate 的当前包或检出匹配。
|
|
147
364
|
|
|
148
|
-
|
|
149
|
-
<summary><b>Docker</b></summary>
|
|
365
|
+
当 `scripts/promote-to-main.sh`、`scripts/release-preview.sh` 或 `npm publish` 检测到自上一个 tag 以来有安装器敏感变更时,它会在任何 git push 或 npm publish 之前运行同一个 matrix gate。请在开始发布前设置证据目录:
|
|
150
366
|
|
|
151
367
|
```bash
|
|
152
|
-
|
|
368
|
+
CLI_JAW_MACOS_EVIDENCE_DIR=/path/to/macos-evidence \
|
|
369
|
+
CLI_JAW_WSL_EVIDENCE_DIR=/path/to/wsl-evidence \
|
|
370
|
+
bash scripts/promote-to-main.sh
|
|
153
371
|
```
|
|
154
372
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
|
-
## CLI-JAW 是什么?
|
|
160
|
-
|
|
161
|
-
CLI-JAW 是一个开源平台,将你已经在用的 AI 编码 CLI — Pi、Antigravity、Claude、Codex、Codex App、Cursor、Gemini、Grok、Kiro、OpenCode、Copilot — 统一成**一个助手、一份记忆、一个仪表盘**。
|
|
162
|
-
|
|
163
|
-
你的主 CLI(Boss)调度其他 CLI 作为"员工"。不用在各种应用之间来回切换,直接在一个地方下达指令。
|
|
164
|
-
|
|
165
|
-
- **无需 API 密钥** — 通过你已有的订阅路由
|
|
166
|
-
- **无按 token 计费** — 和你现在的月费一样
|
|
167
|
-
- **本地运行** — 代码不会离开你的机器
|
|
168
|
-
|
|
169
|
-
<div align="center">
|
|
170
|
-
|
|
171
|
-

|
|
172
|
-
|
|
173
|
-
</div>
|
|
174
|
-
|
|
175
|
-
### 桌面应用
|
|
373
|
+
`scripts/promote-to-main.sh` 只提升**已经通过认证的 `preview` head**。除非存在针对该精确 `preview` SHA 的成功 `test.yml` push run,否则它拒绝启动。不带参数时,它提升当前的 `origin/preview` head;可选的 SHA 参数必须等于同一个 head,因此它起断言作用,而不是用来提升更旧的提交。
|
|
176
374
|
|
|
177
|
-
|
|
375
|
+
脚本会派发 npm publish,然后不检查发布是否成功就退出,之后也无法再次运行。对于部分完成的发布——npm publish 缺失、GitHub release 缺失、`latest` 上的版本不对,或 `main` 上的红色提交——的恢复方法记录在 [`structure/infra.md` § 릴리스 파이프라인과 부분 실패 복구](structure/infra.md#릴리스-파이프라인과-부분-실패-복구-preview--main--npm)。
|
|
178
376
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
- **macOS**:下载 DMG,把 CLI-JAW 拖到 Applications 后启动。当前工作流生成的版本使用 Developer ID 签名,并经过 Apple 公证与 ticket stapling 验证。
|
|
182
|
-
- **Windows**:下载 NSIS installer。它包含同一个 sidecar server,并把打包的 `jaw` shim 加入 PATH。Windows artifact 目前仍未签名,可能触发 SmartScreen。
|
|
183
|
-
- **Linux**:下载 AppImage,赋予执行权限后运行。
|
|
184
|
-
|
|
185
|
-
首次启动后,接受 **Install CLI command** 提示即可从 bundled sidecar 创建终端 `jaw` 命令。如果跳过了提示,之后可在 tray menu 使用 **Install CLI to Terminal**。这个路径不要求为打包应用或终端 shim 进行全局 npm 安装。
|
|
186
|
-
|
|
187
|
-
已安装的 macOS 应用会在后台检查对应的 GitHub Release channel,也可使用 **CLI-JAW → Check for Updates…**。preview 版本只跟随 preview release,stable 版本只跟随 stable release;下载和重启安装都需要用户明确确认。旧的未签名应用无法安全地自动迁移到新的信任链,因此首个签名版 DMG 需要手动安装一次,之后的签名版本可在应用内更新。
|
|
377
|
+
</details>
|
|
188
378
|
|
|
189
|
-
|
|
379
|
+
<details>
|
|
380
|
+
<summary><b>Docker</b></summary>
|
|
190
381
|
|
|
191
382
|
```bash
|
|
192
|
-
#
|
|
193
|
-
npm install && npm --prefix electron install
|
|
194
|
-
|
|
195
|
-
npm run electron:dev # hot reload 开发
|
|
196
|
-
npm run electron:dist:mac # 构建包含 bundled sidecar 的 macOS arm64 .dmg + .zip
|
|
383
|
+
docker compose up -d # → http://localhost:3457
|
|
197
384
|
```
|
|
198
385
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
本地 Developer ID 构建需配置签名与公证凭据后运行 `npm run electron:dist:mac:signed`;普通 `electron:dist:mac` 仍是 ad-hoc 本地构建。正式 GitHub Actions 路径会验证 Team `U9ATA49N28` 的 Developer ID 签名、Apple 公证与 stapling,以及更新 ZIP metadata/SHA-512,任一失败都会阻止发布。
|
|
386
|
+
</details>
|
|
202
387
|
|
|
203
388
|
---
|
|
204
389
|
|
|
205
390
|
## 认证
|
|
206
391
|
|
|
207
|
-
|
|
392
|
+
你只需要**一个**。选择你已有的订阅:
|
|
208
393
|
|
|
209
394
|
```bash
|
|
210
|
-
#
|
|
211
|
-
copilot login # GitHub Copilot
|
|
212
|
-
opencode # OpenCode —
|
|
213
|
-
kiro # AWS Kiro
|
|
214
|
-
|
|
215
|
-
#
|
|
216
|
-
claude auth login # Anthropic Claude Pro
|
|
217
|
-
codex login # OpenAI ChatGPT Pro
|
|
395
|
+
# Free options (no credit card needed)
|
|
396
|
+
copilot login # GitHub Copilot (free tier available)
|
|
397
|
+
opencode # OpenCode — free models available
|
|
398
|
+
kiro # AWS Kiro (free tier with AWS account)
|
|
399
|
+
|
|
400
|
+
# Paid (monthly subscription you already pay for)
|
|
401
|
+
claude auth login # Anthropic Claude Pro or higher
|
|
402
|
+
codex login # OpenAI ChatGPT Pro or higher
|
|
218
403
|
cursor-agent login # Cursor
|
|
219
404
|
grok login --oauth # xAI Grok / Grok Heavy
|
|
220
405
|
```
|
|
@@ -235,7 +420,7 @@ grok login --oauth # xAI Grok / Grok Heavy
|
|
|
235
420
|
✅ Copilot CLI installed
|
|
236
421
|
✅ Database jaw.db OK
|
|
237
422
|
✅ Skills 29 active, 238 reference
|
|
238
|
-
✅ MCP
|
|
423
|
+
✅ MCP (plugins) 3 servers configured
|
|
239
424
|
✅ Memory structured/ exists
|
|
240
425
|
✅ Server port 3457 available
|
|
241
426
|
```
|
|
@@ -244,319 +429,148 @@ grok login --oauth # xAI Grok / Grok Heavy
|
|
|
244
429
|
|
|
245
430
|
---
|
|
246
431
|
|
|
247
|
-
##
|
|
248
|
-
|
|
249
|
-
仪表盘是你的指挥中心:`jaw dashboard` 会在 `http://localhost:24576` 启动管理器;单个 agent Web UI 由 `jaw serve` 在 `http://localhost:3457` 及相邻 managed ports 提供。
|
|
250
|
-
Web/TUI 实时更新使用 SSE-first `GET /api/events` 通道;WebSocket 只作为旧服务器在 SSE 从未打开时的 fallback。
|
|
251
|
-
|
|
252
|
-
### 实例管理器
|
|
432
|
+
## 你能得到什么
|
|
253
433
|
|
|
254
|
-
|
|
434
|
+
### 员工:你的 CLI 调用其他 CLI
|
|
255
435
|
|
|
256
|
-
|
|
436
|
+
你只和一个 AI(“Boss”)对话。当它需要专业工作时,会把任务分派给员工——每个员工运行自己的 CLI 和模型——并在回答你之前审查它们的输出。
|
|
257
437
|
|
|
258
|
-
|
|
438
|
+
```text
|
|
439
|
+
You: "Fix the frontend styling and update the API endpoint"
|
|
259
440
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
<div align="center">
|
|
267
|
-
|
|
268
|
-

|
|
269
|
-
|
|
270
|
-
</div>
|
|
271
|
-
|
|
272
|
-
### 优先级矩阵
|
|
273
|
-
|
|
274
|
-
艾森豪威尔矩阵管理你的任务和提醒。优先处理重要的事。
|
|
275
|
-
|
|
276
|
-
<div align="center">
|
|
277
|
-
|
|
278
|
-

|
|
279
|
-
|
|
280
|
-
</div>
|
|
441
|
+
Boss (Claude)
|
|
442
|
+
├── Frontend employee (OpenCode) → "Fix the CSS grid layout in dashboard.tsx"
|
|
443
|
+
├── Backend employee (Codex) → "Update /api/users to return pagination metadata"
|
|
444
|
+
└── Synthesizes both results for you
|
|
445
|
+
```
|
|
281
446
|
|
|
282
|
-
|
|
447
|
+
```bash
|
|
448
|
+
jaw dispatch --agent "Backend" --task "Run read-only verification" --watch
|
|
449
|
+
jaw dispatch --virtual "security" --task "Review this branch for auth and secret leaks" --watch
|
|
450
|
+
```
|
|
283
451
|
|
|
284
|
-
|
|
452
|
+
### PABCD:计划、审计、构建、检查、完成
|
|
285
453
|
|
|
286
|
-
|
|
454
|
+
对于复杂任务,CLI-JAW 运行结构化工作流。每一次转换都由你批准;只读工作者验证计划和结果。
|
|
287
455
|
|
|
288
|
-
|
|
456
|
+
| 阶段 | 会发生什么 |
|
|
457
|
+
|---|---|
|
|
458
|
+
| **P — Plan** | Boss 写出 diff 级别的计划,然后停下等你审查 |
|
|
459
|
+
| **A — Audit** | 只读工作者检查计划是否可行 |
|
|
460
|
+
| **B — Build** | Boss 实现;只读工作者进行验证 |
|
|
461
|
+
| **C — Check** | 类型检查、文档更新、一致性检查 |
|
|
462
|
+
| **D — Done** | 汇总所有变更,回到空闲状态 |
|
|
289
463
|
|
|
290
|
-
|
|
464
|
+
状态在重启后保留。用 `jaw orchestrate` 或 `/pabcd` 开始,用 `/continue` 恢复,用 `/goal` 让长期目标保持存活。参见 [PABCD](https://lidge-jun.github.io/cli-jaw/dev/concepts/pabcd.html)。
|
|
291
465
|
|
|
292
|
-
###
|
|
466
|
+
### 记忆、技能和 MCP
|
|
293
467
|
|
|
294
|
-
|
|
468
|
+
- **三层记忆** — 最近的会话历史、从对话中沉淀出来的结构化笔记,以及可搜索的 soul/task 快照:`jaw memory search "how did we set up the API auth?"`
|
|
469
|
+
- **200+ 技能** — 办公文档(PDF、DOCX、XLSX、PPTX、HWP)、浏览器和桌面自动化、媒体、GitHub、Notion 和开发指南:`jaw skill install <name>`
|
|
470
|
+
- **所有引擎共用一份 MCP 配置** — `jaw mcp install @anthropic/context7` 会一次同步 Claude、Codex、Kiro、OpenCode、Copilot 和 Antigravity
|
|
295
471
|
|
|
296
|
-
|
|
472
|
+
### 浏览器和桌面自动化
|
|
297
473
|
|
|
298
|
-
|
|
474
|
+
通过 DevTools Protocol 驱动 Chrome;用 `jaw browser vision-click "Login button"` 按描述点击;在 macOS 和 Windows 上通过 Codex Computer Use 控制桌面应用;用 `jaw browser web-ai` 询问 ChatGPT、Gemini 或 Grok 的 Web UI。
|
|
299
475
|
|
|
300
|
-
|
|
476
|
+
### 消息
|
|
301
477
|
|
|
302
|
-
|
|
478
|
+
从 **Telegram**(语音消息、论坛主题、定时 heartbeat 任务)、**Discord** 和 **Slack**(Socket Mode、线程、文件中继、mention 监听)与你的 agent 聊天。可以同时启用多个渠道;home 渠道会接收主动发送的内容。
|
|
303
479
|
|
|
304
|
-
|
|
480
|
+
<details>
|
|
481
|
+
<summary>Telegram 设置(3 步)</summary>
|
|
305
482
|
|
|
306
|
-
|
|
483
|
+
1. 给 [@BotFather](https://t.me/BotFather) 发消息 → `/newbot` → 复制 token
|
|
484
|
+
2. `jaw init --telegram-token YOUR_TOKEN`,或使用 Web UI 设置
|
|
485
|
+
3. 给 bot 发送任意消息。Chat ID 会在第一条消息时自动保存
|
|
307
486
|
|
|
308
|
-
|
|
487
|
+
</details>
|
|
309
488
|
|
|
310
|
-
|
|
311
|
-
|
|
489
|
+
<details>
|
|
490
|
+
<summary>Slack 设置(引导式向导)</summary>
|
|
312
491
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
├── 分派到 Backend 员工(Codex) → "更新 /api/users 以返回分页元数据"
|
|
316
|
-
└── 综合两方结果返回给你
|
|
317
|
-
```
|
|
492
|
+
1. `jaw slack setup` — 打印 app manifest、打开 Slack 应用页面、实时校验两个 token,并写入设置
|
|
493
|
+
2. 在 bot 需要读取的每个频道执行 `/invite @cli-jaw`,然后重启 `jaw serve`
|
|
318
494
|
|
|
319
|
-
|
|
320
|
-
# 底层就是一条命令:
|
|
321
|
-
jaw dispatch --agent "Frontend" --task "修复 dashboard.tsx 中的 CSS grid 布局"
|
|
322
|
-
jaw dispatch --agent "Backend" --task "运行只读验证" --watch
|
|
323
|
-
jaw worker status Backend
|
|
324
|
-
```
|
|
495
|
+
群组 DM 需要 `message.mpim` 事件和 `mpim:history` scope。在容器中,`SLACK_BOT_TOKEN`、`SLACK_APP_TOKEN`、`SLACK_TEAM_ID` 和 `SLACK_CHANNEL_IDS` 在运行时拥有各自的字段。详情:[Slack tools](docs/slack-tools.md)。
|
|
325
496
|
|
|
326
|
-
|
|
497
|
+
</details>
|
|
327
498
|
|
|
328
|
-
###
|
|
499
|
+
### 桌面应用
|
|
329
500
|
|
|
330
|
-
|
|
501
|
+
Electron 应用会启动管理面板,随包提供内置的 Node.js sidecar,并常驻你的菜单栏。请从 [GitHub Releases](https://github.com/lidge-jun/cli-jaw/releases/latest) 下载:
|
|
331
502
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
| **何时用** | 跨不同代码库或领域的多专家协作 | 内部研究、文件读取、并行分析 |
|
|
336
|
-
| **如何用** | `jaw dispatch --agent "Name" --task "..."` | 自动——CLI 在内部生成 |
|
|
503
|
+
- **macOS(Apple Silicon)** — 打开 DMG,把 CLI-JAW 拖入 Applications。构建产物经过 Developer ID 签名、公证和 stapling,并支持应用内更新。
|
|
504
|
+
- **Windows(x64)** — 运行 Setup `.exe`。它没有签名,因此 SmartScreen 可能会要求你确认。
|
|
505
|
+
- **Linux(x64)** — 给 AppImage 添加执行权限后运行。
|
|
337
506
|
|
|
338
|
-
|
|
507
|
+
首次启动后,接受 **Install CLI command**(或使用托盘项 **Install CLI to Terminal**),即可在终端中得到 `jaw`,无需全局 npm 安装。
|
|
339
508
|
|
|
340
509
|
---
|
|
341
510
|
|
|
342
511
|
## AI 运行时
|
|
343
512
|
|
|
344
|
-
无按 token 的 API
|
|
513
|
+
无按 token 的 API 计费。通过你已经在付费的订阅路由。
|
|
345
514
|
|
|
346
515
|
| CLI | 默认模型 | 认证 | 费用 |
|
|
347
516
|
|---|---|---|---|
|
|
348
|
-
| **Pi** | `grok-composer-2.5-fast` | Settings profile API key、local proxy,或 `PI_CODING_AGENT_BIN` |
|
|
517
|
+
| **Pi** | `grok-composer-2.5-fast` | Settings profile API key、local proxy,或 `PI_CODING_AGENT_BIN` | 通过隔离 profile 连接 local/API endpoint |
|
|
349
518
|
| **Claude** | `claude-opus-4-8` | `claude auth login` | Claude Pro 或更高订阅 |
|
|
350
|
-
| **Antigravity** | AGY-selected | 由 `agy` 在运行时检查 |
|
|
519
|
+
| **Antigravity** | AGY-selected | 由 `agy` 在运行时检查 | 实验性 print-mode runtime |
|
|
351
520
|
| **Codex** | `gpt-5.5` | `codex login` | ChatGPT Pro 或更高订阅 |
|
|
352
521
|
| **Codex App** | `gpt-5.5` | `codex login` | ChatGPT Pro 或更高订阅 |
|
|
353
|
-
| **Cursor** | `composer-2.5` | `cursor-agent login` 或 `CURSOR_API_KEY` | Cursor
|
|
354
|
-
| **Grok** | `grok-build` | `grok login --oauth` | Grok
|
|
522
|
+
| **Cursor** | `composer-2.5` | `cursor-agent login` 或 `CURSOR_API_KEY` | Cursor 订阅 |
|
|
523
|
+
| **Grok** | `grok-build` | `grok login --oauth` | Grok 订阅 |
|
|
355
524
|
| **Kiro** | registry-selected | `kiro` | AWS Kiro 免费层 |
|
|
356
|
-
| **OpenCode** | `opencode-go/kimi-k2.6` | `opencode` |
|
|
357
|
-
| **Copilot** | `claude-sonnet-4.6` | `copilot login` |
|
|
358
|
-
|
|
359
|
-
GPT 5.5 和 Claude Opus 4.8 从 Pro 订阅及以上开放。自 6 月起,如果要使用订阅计划赠送的 Claude 用量,请选择 `claude` runtime。
|
|
525
|
+
| **OpenCode** | `opencode-go/kimi-k2.6` | `opencode` | 有免费模型可用 |
|
|
526
|
+
| **Copilot** | `claude-sonnet-4.6` | `copilot login` | 有免费层可用 |
|
|
360
527
|
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
**回退链**:当一个引擎被限速时,下一个自动接上。用 `/fallback [cli1 cli2...]` 配置。
|
|
364
|
-
|
|
365
|
-
**OpenCode 通配符**:连接任意模型端点——OpenRouter、本地 LLM(大语言模型)、任何 OpenAI 兼容 API。
|
|
366
|
-
|
|
367
|
-
> 切换引擎:`/cli codex`。切换模型:`/model gpt-5.5`。Web、终端、Telegram 或 Discord 均可。
|
|
368
|
-
|
|
369
|
-
---
|
|
370
|
-
|
|
371
|
-
## PABCD 编排(Plan → Audit → Build → Check → Done)
|
|
372
|
-
|
|
373
|
-
对于复杂任务,CLI-JAW 使用结构化的 5 阶段工作流。每次转换都需要你的批准——没有你的确认什么都不会发布。
|
|
374
|
-
|
|
375
|
-
```
|
|
376
|
-
P (Plan) → A (Audit) → B (Build) → C (Check) → D (Done) → IDLE
|
|
377
|
-
⛔ ⛔ ⛔ auto auto
|
|
378
|
-
```
|
|
379
|
-
|
|
380
|
-
| 阶段 | 发生什么 |
|
|
381
|
-
|---|---|
|
|
382
|
-
| **P — Plan** | Boss AI 编写 diff 级别的计划。停下等你审查 |
|
|
383
|
-
| **A — Audit** | 只读工作者验证计划是否可行(imports 存在、签名匹配) |
|
|
384
|
-
| **B — Build** | Boss 实现。只读工作者验证结果 |
|
|
385
|
-
| **C — Check** | 类型检查(`tsc --noEmit`)、文档更新、一致性检查 |
|
|
386
|
-
| **D — Done** | 汇总所有变更。返回空闲状态 |
|
|
387
|
-
|
|
388
|
-
状态持久化在数据库中,服务器重启后仍然保留。工作者不能修改文件——只能验证。用 `jaw orchestrate`、`/orchestrate` 或 `/pabcd` 启动,并用 `/continue` 显式恢复进行中的 worklog。阶段前进需要证据 attestation,例如 `jaw orchestrate B --attest '{"from":"A","to":"B","did":"<what you did>"}'`(C→D 还需粘贴 `checkOutput` 和 `exitCode`)。Workflow helper slash commands 包括 `/plan`、`/interview`、`/deliberate`、`/planaudit`、`/review`、`/search`、`/goal`、`/goalplan`、`/team`、`/task`、`/fork`、`/gd`;`/plan` 是说明“这就是 PABCD P”的兼容指南,不会创建第二套计划模式。`/search <query>` 通过 active search skill 路由搜索意图。Bounded automation 用 `/goal run ...` 表达,没有单独的 `/autopilot`。Durable goal(`/goal <objective>` 加 `update`/`done`/`cancel`/`pause`/`resume`)在重启后仍保留,goal 恢复会在 Web/CLI 等所有界面重新触发工作。AI `goal pause --agent --audit` 使用两步审计 gate(`goal_pause_gate_pending` 抑制自动 continuation)。`/gd` 是 `/goal done --force` 的简写(跳过完成证据 gate)。`/goal run`(`preflight`/`start`/`stop`/`status`)是需通过 preflight 的仅跟踪预览,记录 turn/dispatch 预算(强制尚未落地)。
|
|
528
|
+
如果某个引擎被限速,下一个会接上(`/fallback`)。用 `/cli codex` 实时切换引擎,用 `/model gpt-5.5` 切换模型 — 可在 Web、终端、Telegram、Discord 或 Slack 中使用。
|
|
389
529
|
|
|
390
530
|
---
|
|
391
531
|
|
|
392
|
-
##
|
|
393
|
-
|
|
394
|
-
三个层次,各覆盖不同的回忆范围。
|
|
395
|
-
|
|
396
|
-
| 层 | 存储内容 | 工作方式 |
|
|
397
|
-
|---|---|---|
|
|
398
|
-
| **History Block** | 近期会话上下文 | 最近 10 个会话,最多 8000 字符,按工作目录限定范围。注入到提示开头 |
|
|
399
|
-
| **Memory Flush** | 从对话中提取的结构化知识 | 达到阈值后触发(默认 10 轮)。提取为事件记录、每日日志、语义笔记,保存为 markdown |
|
|
400
|
-
| **Soul + Task Snapshot** | 身份和语义检索 | 核心价值观、语调、边界。全文搜索索引每次提示返回最多 4 条语义相关结果 |
|
|
401
|
-
|
|
402
|
-
三层全部自动注入系统提示。记忆可搜索:
|
|
532
|
+
## CLI
|
|
403
533
|
|
|
404
534
|
```bash
|
|
405
|
-
|
|
535
|
+
# Core
|
|
536
|
+
jaw dashboard # launch manager dashboard
|
|
537
|
+
jaw serve # start an agent server (http://localhost:3457)
|
|
538
|
+
jaw chat # terminal chat UI
|
|
539
|
+
jaw ask "question" # one prompt, one answer — no TTY needed
|
|
540
|
+
jaw doctor # installation and runtime diagnostics
|
|
541
|
+
|
|
542
|
+
# Instances
|
|
543
|
+
jaw clone ~/project # clone instance to new directory
|
|
544
|
+
jaw --home ~/project serve --port 3458 # run a second instance
|
|
545
|
+
jaw service install # auto-start on boot (macOS launchd / Linux systemd)
|
|
546
|
+
jaw --home ~/project service restart --port 3458 # restart only this instance
|
|
547
|
+
|
|
548
|
+
# Agents and workflow
|
|
549
|
+
jaw employee list
|
|
550
|
+
jaw dispatch --agent "Backend" --task "..." --watch
|
|
551
|
+
jaw orchestrate # PABCD workflow
|
|
552
|
+
jaw goal status # persistent goals
|
|
553
|
+
|
|
554
|
+
# Skills, MCP, memory, browser
|
|
555
|
+
jaw skill list
|
|
556
|
+
jaw mcp install <package>
|
|
557
|
+
jaw memory search <query>
|
|
558
|
+
jaw browser fetch "https://example.com" --json
|
|
406
559
|
```
|
|
407
560
|
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
## 技能
|
|
411
|
-
|
|
412
|
-
200+ 参考技能和活跃运行时技能覆盖开发工作流、办公文档、自动化、媒体和内容写作。
|
|
413
|
-
|
|
414
|
-
| 分类 | 技能 | 覆盖范围 |
|
|
415
|
-
|---|---|---|
|
|
416
|
-
| **办公** | `jaw-pdf`, `jaw-docx`, `jaw-xlsx`, `jaw-pptx`, `jaw-hwp` | 读取、创建、编辑文档。HWP/HWPX(韩国文字处理器格式)原生支持 |
|
|
417
|
-
| **自动化** | `jaw-browser`, `vision-click`, `jaw-screen-capture`, `jaw-desktop-control` | Chrome DevTools Protocol(CDP)浏览器控制、AI 坐标点击、macOS 截屏、Computer Use |
|
|
418
|
-
| **媒体** | `jaw-video`, `imagegen`, `lecture-stt`, `tts` | Remotion 视频、OpenAI 图像生成、讲座转录、文字转语音 |
|
|
419
|
-
| **集成** | `jaw-github`, `notion`, `jaw-telegram-send`, `jaw-memory` | Issues/PRs/CI、Notion 页面、Telegram 媒体发送、持久记忆 |
|
|
420
|
-
| **可视化** | `jaw-diagram` | 在聊天中渲染 SVG 图表、图形、交互式可视化 |
|
|
421
|
-
| **内容/写作** | `k-writing` | 韩语推广/内容写作:thread、Instagram 卡片新闻、LinkedIn、网站/博客和润色输出,包含强制搜索、钩子评分和去 AI 痕迹校验 |
|
|
422
|
-
| **开发指南** | `jaw-dev`, `jaw-dev-frontend`, `jaw-dev-backend`, `jaw-dev-data`, `jaw-dev-testing`, `jaw-dev-pabcd` | 注入代理提示的工程指南 |
|
|
423
|
-
|
|
424
|
-
参考技能位于 `skills_ref/`,按需安装到活跃运行时。
|
|
425
|
-
|
|
426
|
-
```bash
|
|
427
|
-
jaw skill install <name> # 激活参考技能
|
|
428
|
-
jaw skill list # 查看可用技能
|
|
429
|
-
```
|
|
561
|
+
用 `jaw clone` 创建的每个实例都有自己的设置、记忆、数据库和 MCP 配置,管理面板可以看到全部。远程和无头主机:[structure/remote-headless.md](structure/remote-headless.md)。完整命令参考:[CLI docs](https://lidge-jun.github.io/cli-jaw/dev/reference/cli.html)。
|
|
430
562
|
|
|
431
563
|
---
|
|
432
564
|
|
|
433
|
-
##
|
|
565
|
+
## 文档
|
|
434
566
|
|
|
435
|
-
|
|
|
567
|
+
| 主题 | 位置 |
|
|
436
568
|
|---|---|
|
|
437
|
-
|
|
|
438
|
-
|
|
|
439
|
-
|
|
|
440
|
-
|
|
|
441
|
-
|
|
|
442
|
-
|
|
443
|
-
Computer Use 让你用自然语言控制任何 macOS 应用——Finder、Safari、系统设置、Xcode。
|
|
444
|
-
|
|
445
|
-
---
|
|
446
|
-
|
|
447
|
-
## 消息
|
|
448
|
-
|
|
449
|
-
### Telegram
|
|
450
|
-
|
|
451
|
-
```
|
|
452
|
-
📱 Telegram ←→ 🦈 CLI-JAW ←→ 🤖 AI Engines
|
|
453
|
-
```
|
|
454
|
-
|
|
455
|
-
文字聊天、语音消息(通过多供应商 STT——语音转文字 自动转录)、文件/照片上传、斜杠命令(51 个已注册;workflow helper:`/plan`、`/interview`、`/review`、`/search`、`/goal`、`/orchestrate`、`/task`、`/fork`、`/gd`;CLI/Web 动态 `/skill:<id>`)、论坛主题路由与 **Dashboard Telegram Hub**(`/setthread`、`/threads`、`/hubhelp`、Manager UI 中按主题的 `model`/`systemPrompt` override)、定时任务(`every`/`cron` heartbeat)结果自动送达。
|
|
456
|
-
|
|
457
|
-
<details>
|
|
458
|
-
<summary>设置(3 步)</summary>
|
|
459
|
-
|
|
460
|
-
1. 给 [@BotFather](https://t.me/BotFather) 发消息 → `/newbot` → 复制 token
|
|
461
|
-
2. `jaw init --telegram-token YOUR_TOKEN` 或在 Web UI 设置中输入
|
|
462
|
-
3. 给 bot 发送任意消息。Chat ID 首次消息时自动保存
|
|
463
|
-
|
|
464
|
-
</details>
|
|
465
|
-
|
|
466
|
-
### Discord
|
|
467
|
-
|
|
468
|
-
与 Telegram 功能相同——文字、文件、命令。频道/线程路由、规范 `/api/channel/send`、代理结果广播转发器。通过 Web UI 设置配置。
|
|
469
|
-
|
|
470
|
-
### 语音 & STT
|
|
471
|
-
|
|
472
|
-
语音输入支持 Web(麦克风按钮)、Telegram(语音消息)和 Discord。供应商:OpenAI 兼容、Google Vertex AI 或任意自定义端点。
|
|
473
|
-
|
|
474
|
-
---
|
|
475
|
-
|
|
476
|
-
## MCP(Model Context Protocol)
|
|
477
|
-
|
|
478
|
-
[MCP](https://modelcontextprotocol.io) 是一个让 AI 工具共享能力的标准——就像 AI 代理的插件。CLI-JAW 用一个文件管理所有引擎的 MCP 配置。
|
|
479
|
-
|
|
480
|
-
```bash
|
|
481
|
-
jaw mcp install @anthropic/context7
|
|
482
|
-
# → 同步到 Claude、Codex、Gemini、Kiro、OpenCode、Copilot、Antigravity 的配置文件
|
|
483
|
-
```
|
|
484
|
-
|
|
485
|
-
不用再分别编辑多个 JSON 文件。安装一次,每个 MCP 感知引擎都会获得配置。Grok CLI 是标准运行时,但在 Grok 暴露兼容配置面之前不计为 MCP 同步对象。Antigravity MCP 同步是独立的 config target,不等同于 `agy` runtime registry entry。
|
|
486
|
-
|
|
487
|
-
```bash
|
|
488
|
-
jaw mcp sync # 手动编辑后重新同步
|
|
489
|
-
```
|
|
490
|
-
|
|
491
|
-
---
|
|
492
|
-
|
|
493
|
-
## CLI 命令
|
|
494
|
-
|
|
495
|
-
```bash
|
|
496
|
-
# 核心
|
|
497
|
-
jaw dashboard # 启动管理仪表盘
|
|
498
|
-
jaw serve # 启动服务器(http://localhost:3457)
|
|
499
|
-
jaw chat # 终端聊天 UI
|
|
500
|
-
jaw chat search "query" # 搜索聊天历史
|
|
501
|
-
jaw doctor # 安装和运行时诊断
|
|
502
|
-
|
|
503
|
-
# 实例
|
|
504
|
-
jaw clone ~/project # 克隆实例到新目录
|
|
505
|
-
jaw --home ~/project serve --port 3458 # 运行第二个实例
|
|
506
|
-
jaw service install # 开机自启(macOS/Linux)
|
|
507
|
-
jaw project set ~/repo # 为 review/orchestration 设置 projectDirs
|
|
508
|
-
jaw lock # 保护当前实例不被 stop-all 流程停止
|
|
509
|
-
|
|
510
|
-
# AI 和编排
|
|
511
|
-
jaw employee list # 列出已配置员工 + static 员工
|
|
512
|
-
jaw dispatch --agent "Backend" --task "..." # 分派员工
|
|
513
|
-
jaw dispatch --agent "Backend" --task "..." --watch # 分派并流式查看安全进度
|
|
514
|
-
jaw worker status Backend # 查看当前/上一轮员工进度
|
|
515
|
-
jaw orchestrate # 进入/控制 PABCD 工作流
|
|
516
|
-
jaw goal status # 持久 goal 生命周期
|
|
517
|
-
jaw task list # 代理原生任务清单
|
|
518
|
-
# 聊天中:/continue # 显式恢复 worklog/PABCD
|
|
519
|
-
|
|
520
|
-
# 技能和 MCP
|
|
521
|
-
jaw skill install <name> # 激活技能
|
|
522
|
-
jaw skill list # 列出可用技能
|
|
523
|
-
jaw mcp install <package> # 安装 MCP → 同步支持的 MCP 感知引擎
|
|
524
|
-
jaw mcp sync # 重新同步 MCP 配置
|
|
525
|
-
|
|
526
|
-
# 记忆
|
|
527
|
-
jaw memory search <query> # 跨所有记忆层搜索
|
|
528
|
-
jaw memory save <file> <content> # 保存到结构化记忆
|
|
529
|
-
|
|
530
|
-
# 浏览器
|
|
531
|
-
jaw browser start # 启动 Chrome 自动化
|
|
532
|
-
jaw browser fetch "https://example.com" --json --trace # 自适应 URL 读取
|
|
533
|
-
jaw browser snapshot # 捕获页面状态
|
|
534
|
-
jaw browser vision-click "Login" # AI 驱动的点击
|
|
535
|
-
jaw browser web-ai status # ChatGPT/Gemini/Grok web-AI 会话工具
|
|
536
|
-
jaw browser web-ai code --vendor chatgpt --model thinking --effort heavy --prompt "Build an MVP" --output-zip ./result.zip
|
|
537
|
-
|
|
538
|
-
# 仪表盘连接器
|
|
539
|
-
jaw dashboard memory search "query" # 只读跨实例记忆搜索
|
|
540
|
-
jaw dashboard chat search "query" # 跨实例聊天搜索
|
|
541
|
-
jaw connector board add --title "Fix docs"
|
|
542
|
-
jaw reminders add "Follow up tomorrow"
|
|
543
|
-
|
|
544
|
-
# 维护
|
|
545
|
-
jaw reset # 完全重置
|
|
546
|
-
```
|
|
547
|
-
|
|
548
|
-
---
|
|
549
|
-
|
|
550
|
-
## 多实例
|
|
551
|
-
|
|
552
|
-
运行互相隔离的独立实例,各有独立的设置、记忆和数据库:
|
|
553
|
-
|
|
554
|
-
```bash
|
|
555
|
-
jaw clone ~/my-project
|
|
556
|
-
jaw --home ~/my-project serve --port 3458
|
|
557
|
-
```
|
|
558
|
-
|
|
559
|
-
每个实例完全独立——不同的工作目录、记忆、MCP 配置。管理仪表盘可以看到全部。
|
|
569
|
+
| 官网和快速上手 | [lidge-jun.github.io/cli-jaw](https://lidge-jun.github.io/cli-jaw/) |
|
|
570
|
+
| 指南、概念、参考 | [Developer docs](https://lidge-jun.github.io/cli-jaw/dev/) |
|
|
571
|
+
| 架构 | [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) · [structure/](structure/) |
|
|
572
|
+
| Slack 工具和本地 API | [docs/slack-tools.md](docs/slack-tools.md) |
|
|
573
|
+
| Runtime 集成(含已退役 runtime) | [structure/runtime-integration.md](structure/runtime-integration.md) |
|
|
560
574
|
|
|
561
575
|
---
|
|
562
576
|
|
|
@@ -565,67 +579,42 @@ jaw --home ~/my-project serve --port 3458
|
|
|
565
579
|
```bash
|
|
566
580
|
npm run build # tsc → dist/
|
|
567
581
|
npm run build:frontend # vite → public/dist/
|
|
568
|
-
npm run dev # tsx server.ts
|
|
569
|
-
npm test #
|
|
570
|
-
npm run gate:all #
|
|
571
|
-
|
|
582
|
+
npm run dev # tsx server.ts (hot-reload)
|
|
583
|
+
npm test # node:test driver (tests/run.mts)
|
|
584
|
+
npm run gate:all # release/docs parity gates
|
|
585
|
+
npm run electron:dev # desktop app with hot reload
|
|
572
586
|
```
|
|
573
587
|
|
|
574
|
-
架构详情:[ARCHITECTURE.md](docs/ARCHITECTURE.md) · 测试覆盖:[TESTS.md](TESTS.md) · 内部结构文档:[structure/](structure/)
|
|
575
|
-
|
|
576
|
-
---
|
|
577
|
-
|
|
578
|
-
## 对比
|
|
579
|
-
|
|
580
|
-
| | CLI-JAW 2.x | Hermes Agent | Claude Code |
|
|
581
|
-
|---|---|---|---|
|
|
582
|
-
| **模型接入** | Pi、Antigravity、Claude、Codex、Codex App、Cursor、Gemini、Grok、Kiro、OpenCode 和 Copilot(通过厂商/原生认证) | API 密钥(OpenRouter 200+、Nous Portal) | 仅 Anthropic |
|
|
583
|
-
| **费用模型** | 你已经在付的月订阅 | 按 token API 计费 | Anthropic 订阅 |
|
|
584
|
-
| **主 UI** | 管理仪表盘 + Web 应用 + Mac 应用 + 终端 UI | 仅终端 | CLI + IDE 插件 |
|
|
585
|
-
| **仪表盘** | 多实例管理器、看板、笔记工作区 | 无 | 无 |
|
|
586
|
-
| **消息** | Telegram(语音)+ Discord | Telegram/Discord/Slack/WhatsApp/Signal | 无 |
|
|
587
|
-
| **记忆** | 3 层(History/Flush/Soul)+ 全文搜索 | 自我改进循环 + Honcho | 文件型自动记忆 |
|
|
588
|
-
| **多代理** | 员工系统(分派其他 CLI)+ PABCD | 子代理生成 | Task 工具 |
|
|
589
|
-
| **浏览器自动化** | Chrome DevTools + vision-click + Computer Use | 有限 | 通过 MCP |
|
|
590
|
-
| **运行环境** | 本地 + Docker | 本地/Docker/SSH/Daytona/Modal | 本地 |
|
|
591
|
-
| **技能** | 200+ 参考技能 + 活跃运行时技能 | 自动创建 + agentskills.io | 用户配置 |
|
|
592
|
-
| **多语言** | 英语、韩语、中文、日语 | 英语 | 英语 |
|
|
593
|
-
|
|
594
588
|
---
|
|
595
589
|
|
|
596
590
|
## 故障排查
|
|
597
591
|
|
|
598
592
|
| 问题 | 解决办法 |
|
|
599
593
|
|---|---|
|
|
600
|
-
| `cli-jaw: command not found` |
|
|
594
|
+
| `cli-jaw: command not found` | 再运行一次 `npm install -g cli-jaw`。macOS/Linux/WSL:检查 `~/.local/bin` 或 `npm prefix -g` + `/bin` 是否在 `$PATH` 中。从 Windows PowerShell 调用 WSL 时,请通过 login shell:`wsl.exe -d Ubuntu -- bash -lc "jaw dashboard"`。 |
|
|
595
|
+
| `npm warn allow-scripts ...` | npm >= 12 会阻止依赖安装脚本:`npm install -g cli-jaw --allow-scripts=cli-jaw`,或用 `npm config set allow-scripts=cli-jaw --location=user` 持久保存。已经装过了?`jaw init` 会完成设置。 |
|
|
596
|
+
| pnpm/bun 阻止了构建脚本 | pnpm 11+:`pnpm add -g --allow-build=cli-jaw cli-jaw`。bun:`bun add -g --trust cli-jaw`。 |
|
|
597
|
+
| 全新安装的 verifier 失败 | 修复报告出的 PATH 或可执行位问题,然后重新运行 `bash "$(npm root -g)/cli-jaw/scripts/verify-fresh-install.sh"`。 |
|
|
601
598
|
| `Error: node version` | 升级到 Node.js 22.4+:`nvm install 22` |
|
|
602
|
-
| `NODE_MODULE_VERSION` mismatch | `npm run ensure:native
|
|
603
|
-
| `EADDRINUSE: port 3457` | 另一个实例正在运行。使用 `--port 3458`
|
|
604
|
-
| Telegram / Discord 认证失败 | 运行 `jaw doctor`,检查 token,重启 `jaw serve` |
|
|
605
|
-
| 浏览器命令失败 | 安装 Chrome/Chromium。先运行 `jaw browser start` |
|
|
599
|
+
| `NODE_MODULE_VERSION` mismatch | `npm run ensure:native` |
|
|
600
|
+
| `EADDRINUSE: port 3457` | 另一个实例正在运行。使用 `--port 3458` 或先停止它 |
|
|
601
|
+
| Telegram / Discord / Slack 认证失败 | 运行 `jaw doctor`,检查 token,重启 `jaw serve` |
|
|
606
602
|
| 员工分派挂起 | 运行 `jaw employee list`,确认员工 CLI 已认证(`jaw doctor`),然后用 `jaw dispatch --watch` 重试 |
|
|
607
|
-
| 员工分派返回 non-JSON 或 HTML | 服务器可能过旧或缺少 route。运行 `npm run build`,或重启 manager/dashboard 进程 |
|
|
608
|
-
| Computer Use 不工作 | 仅限 macOS。需要 Codex CLI。在系统设置中检查自动化权限 |
|
|
609
603
|
|
|
610
604
|
---
|
|
611
605
|
|
|
612
606
|
## 参与贡献
|
|
613
607
|
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
上传前请完成[本地 pre-push 设置和检查](CONTRIBUTING.md#local-private-path-check)。CI 是上传后的补充检查,无法阻止首次泄露。
|
|
608
|
+
公开代码和产品文档保存在这里。私有规划和历史只保存在独立的同级克隆 [cli-jaw-internal](https://github.com/lidge-jun/cli-jaw-internal) 中;请通过 [issue](https://github.com/lidge-jun/cli-jaw/issues) 申请访问权限。不要在本检出中创建私有记录,包括 `devlog`、`_plan`、`_fin` 或 `.jwc` 别名,也不要在公开文档或源码中包含私有记录路径。上传变更前,请先完成[本地 pre-push 设置和检查](CONTRIBUTING.md#local-private-path-check)。
|
|
617
609
|
|
|
618
610
|
1. 从 `dev` Fork 并创建分支
|
|
619
611
|
2. `npm run build && npm run build:frontend && npm test`
|
|
620
|
-
3.
|
|
612
|
+
3. 对发布敏感的变更,还要运行 `npm run gate:all`
|
|
621
613
|
4. 提交 PR
|
|
622
614
|
|
|
623
|
-
Bug 报告和功能建议:[Open an issue](https://github.com/lidge-jun/cli-jaw/issues)
|
|
624
|
-
|
|
625
615
|
---
|
|
626
616
|
|
|
627
|
-
<
|
|
617
|
+
<p align="center"><a href="LICENSE"><b>MIT License</b></a> · 由受够了在 AI 应用之间来回切标签的开发者们打造。</p>
|
|
618
|
+
|
|
628
619
|
|
|
629
|
-
**[MIT License](LICENSE)** · 由受够了在 AI 应用间切换标签的开发者们打造。
|
|
630
620
|
|
|
631
|
-
</div>
|