@yufengtadian/freedom-cli 1.13.1 → 1.13.3

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 (76) hide show
  1. package/LICENSE +40 -0
  2. package/README.md +119 -15
  3. package/lib/agents.js +448 -0
  4. package/lib/build.js +189 -45
  5. package/lib/cli.js +258 -9
  6. package/lib/config.js +20 -1
  7. package/lib/desktop.js +133 -0
  8. package/lib/dev.js +149 -0
  9. package/lib/mcp.js +217 -0
  10. package/lib/release.js +90 -0
  11. package/lib/security.js +113 -54
  12. package/lib/shell.js +170 -63
  13. package/lib/toolchain.js +339 -0
  14. package/lib/tui.js +37 -1
  15. package/lib/utils.js +51 -0
  16. package/lib/verify.js +48 -12
  17. package/lib/webkit.js +45 -0
  18. package/package.json +3 -2
  19. package/shell/darwin-arm64/freedom-shell +0 -0
  20. package/shell/linux-x64/freedom-shell +0 -0
  21. package/shell/win-x64/freedom-shell.exe +0 -0
  22. package/skill/freedom/SKILL.md +159 -0
  23. package/templates/desktop/app.html +559 -0
  24. package/templates/desktop/backend/desktop.mjs +327 -0
  25. package/templates/desktop/freedom.config.js +32 -0
  26. package/templates/desktop/icon.ico +0 -0
  27. package/templates/go/go.mod +3 -0
  28. package/templates/go/pkg/freedom/anti_debug_linux.go +69 -0
  29. package/templates/go/pkg/freedom/anti_debug_other.go +5 -3
  30. package/templates/go/pkg/freedom/anti_debug_windows.go +238 -11
  31. package/templates/go/pkg/freedom/assets/freedom.js +3 -0
  32. package/templates/go/pkg/freedom/assets_embed.go +1 -0
  33. package/templates/go/pkg/freedom/backend_proc.go +5 -5
  34. package/templates/go/pkg/freedom/events_windows.go +5 -5
  35. package/templates/go/pkg/freedom/freedom.go +64 -10
  36. package/templates/go/pkg/freedom/msgwindow_windows.go +8 -8
  37. package/templates/go/pkg/freedom/resources.go +119 -14
  38. package/templates/go/pkg/freedom/securetemp.go +61 -0
  39. package/templates/go/pkg/freedom/securetemp_other.go +20 -0
  40. package/templates/go/pkg/freedom/securetemp_windows.go +25 -0
  41. package/templates/go/pkg/freedom/security.go +293 -64
  42. package/templates/go/pkg/freedom/shutdown.go +55 -0
  43. package/templates/go/pkg/freedom/shutdown_windows.go +47 -0
  44. package/templates/go/pkg/freedom/store.go +11 -3
  45. package/templates/go/pkg/freedom/syscap_windows.go +33 -33
  46. package/templates/go/pkg/freedom/sysint_windows.go +2 -2
  47. package/templates/go/pkg/freedom/tray_windows.go +18 -18
  48. package/templates/go/pkg/freedom/updater.go +3 -3
  49. package/templates/go/pkg/freedom/window_other.go +7 -1
  50. package/templates/go/pkg/freedom/window_windows.go +185 -17
  51. package/templates/go/third_party/webview_go/CHANGELOG.md +15 -0
  52. package/templates/go/third_party/webview_go/FREEDOM-PATCH.md +32 -0
  53. package/templates/go/third_party/webview_go/LICENSE +22 -0
  54. package/templates/go/third_party/webview_go/README.md +50 -0
  55. package/templates/go/third_party/webview_go/glue.c +36 -0
  56. package/templates/go/third_party/webview_go/go.mod +3 -0
  57. package/templates/go/third_party/webview_go/go.sum +0 -0
  58. package/templates/go/third_party/webview_go/libs/mswebview2/LICENSE +27 -0
  59. package/templates/go/third_party/webview_go/libs/mswebview2/include/WebView2.h +23568 -0
  60. package/templates/go/third_party/webview_go/libs/mswebview2/include/vendor.go +2 -0
  61. package/templates/go/third_party/webview_go/libs/mswebview2/vendor.go +2 -0
  62. package/templates/go/third_party/webview_go/libs/mswebview2/version.txt +1 -0
  63. package/templates/go/third_party/webview_go/libs/webview/LICENSE +22 -0
  64. package/templates/go/third_party/webview_go/libs/webview/include/vendor.go +2 -0
  65. package/templates/go/third_party/webview_go/libs/webview/include/webview.h +3598 -0
  66. package/templates/go/third_party/webview_go/libs/webview/vendor.go +2 -0
  67. package/templates/go/third_party/webview_go/libs/webview/version.txt +1 -0
  68. package/templates/go/third_party/webview_go/webkit2_40.go +21 -0
  69. package/templates/go/third_party/webview_go/webkit2_41.go +8 -0
  70. package/templates/go/third_party/webview_go/webview.cc +1 -0
  71. package/templates/go/third_party/webview_go/webview.go +332 -0
  72. package/templates/installer/app.nsi +43 -0
  73. package/templates/project/freedom.config.js +14 -0
  74. package/templates/project/freedom.d.ts +77 -0
  75. package/templates/project-minimal/freedom.config.js +14 -0
  76. package/templates/project-minimal/freedom.d.ts +77 -0
package/LICENSE ADDED
@@ -0,0 +1,40 @@
1
+ Freedom —— 专有软件许可(Proprietary License)
2
+
3
+ Copyright (c) 2026 YUfeng12TA(邮箱与 GitHub 账号见仓库 https://github.com/YUfeng12TA/freedom )
4
+
5
+ 本仓库(下称「本软件」)为闭源专有软件:**不适用 MIT、Apache、GPL 等任何开源许可**。
6
+ 本文件同时随 npm 包 `@yufengtadian/freedom-cli` 分发(包目录内 `LICENSE` 与本文件同文)。
7
+
8
+ ## 1. 授权范围(你可以做什么)
9
+
10
+ - 安装与使用本软件(CLI、Freedom Desktop、预编译壳)于任意数量的个人 / 团队 / 商用设备。
11
+ - 用本软件打包、签名、分发、销售**你自己的应用**:你的前端代码、后端代码、`resources/`
12
+ 内容与应用数据归你所有,无需就产物向许可方付费、开源或署名。
13
+ - 出于自身部署、审计与安全研究目的**阅读**随包分发的源码(见第 4 条的边界)。
14
+
15
+ ## 2. 限制(未经许可方书面同意不得做什么)
16
+
17
+ - 再分发本软件源码、预编译壳、npm 包内容物,或任何衍生 / 修改版本(第 4 条的第三方组件除外)。
18
+ - 移除、遮盖或改动版权声明、许可文本与完整性校验信息。
19
+ - 将本软件或其副本作为独立产品对外销售、托管、转许可或用于构建竞争性打包工具。
20
+ - 绕过 FRDM2 加密容器与反调试机制,对他人分发的产物提取源码,或将该成果对外发布
21
+ (安全研究请走 `SECURITY.md` 的披露通道)。
22
+
23
+ ## 3. 第三方组件不受本文件改写
24
+
25
+ - `third_party/webview_go/`(及其在 `freedom-cli/templates/go/` 下的镜像副本)为
26
+ [webview_go](https://github.com/webview/webview_go) 的上游补丁副本,沿用其 **MIT** 许可
27
+ (原文见该目录 `LICENSE`),改动记录见同目录 `FREEDOM-PATCH.md`。
28
+ - Go、Node.js、WebView2 SDK、WebKitGTK/GTK、NSIS、rcedit 等各自按其许可证使用。
29
+ - 本文件不对这些组件施加任何额外限制。
30
+
31
+ ## 4. 免责与无担保
32
+
33
+ 本软件按「现状」提供,不含任何明示或暗示的担保。FRDM2 容器、完整性清单与反调试检测的设计
34
+ 目标是**提高逆向成本**,不是可信执行环境,不构成「不可逆向」的承诺(详见 `SECURITY.md`)。
35
+ 在适用法律允许的最大范围内,许可方不对因使用或无法使用本软件造成的任何损害承担责任。
36
+
37
+ ## 5. 条款变更与联系
38
+
39
+ 许可条款可能在新版本中调整,以你所获得版本随附的本文件为准。商用授权、白标或源码买断等
40
+ 需求,请通过仓库 GitHub Issues 与许可方联系。
package/README.md CHANGED
@@ -1,16 +1,18 @@
1
1
  # freedom-cli
2
2
 
3
- Freedom 桌面壳打包工具:把你的 Web 前端一键打包成跨平台桌面应用(v1.13.1)。
3
+ Freedom 桌面壳打包工具:把你的 Web 前端一键打包成跨平台桌面应用(v1.13.3)。
4
4
 
5
5
  基于自研 Freedom WebView 壳层(对标 Wails / Tauri):前端完全自由、后端可任意语言、渲染复用系统 WebView(Windows WebView2 / macOS WKWebView / Linux WebKitGTK),产物为单个可执行文件 + resources 目录,前端页面内存加载,不占本地端口。
6
6
 
7
7
  **v1.13.x 框架线回归 + 稳定性收口**(v1.13.0 功能,v1.13.1 为文档勘误发布):
8
8
  - **freedom-cli 源码回归主仓库**:本 CLI 与框架源码同仓维护(`freedom-cli/` 目录,`templates/go` 为框架源码快照),npm 包与 GitHub Release 一一对应,历史"源码丢失停在 1.12.18"的断档已修复;
9
9
  - **三平台通用壳经 tag CI 自动发布**:推送 `vX.Y.Z` tag 即由 `build.yml` 在 win / mac(Apple Silicon)/ linux runner 上编译通用壳并自动创建 GitHub Release,资产命名 `freedom-shell-<plat>`;`freedom shell download <plat>` 直接拉取对应版本资产(默认定位 `v<包版本>`,可用 `FREEDOM_SHELL_TAG` 覆盖),包内另自带三平台壳兜底,均随包分发;
10
- - **运行时资源层回归**:壳从 exe 同目录 `resources/` 读取 `config.json`(窗口 / 后端配置覆盖)与前端页面,high 模式下为加密 `app.bin`(FRDM1 容器)+ `.integrity` 清单;JS 侧构建加密 → Go 壳内存解密已有跨语言黄金向量与端到端互验(改名 / 篡改即拒绝运行);
10
+ - **运行时资源层回归**:壳从 exe 同目录 `resources/` 读取 `config.json`(窗口 / 后端配置覆盖)与前端页面,high 模式下前端页面、配置与 **`backend/**` 后端源码**统一封进加密 `app.bin`(FRDM2 容器:构建期随机盐 + PBKDF2 60 万次派生 + Encrypt-then-MAC 覆盖头部)+ `.integrity` 清单,磁盘不留明文后端源码;JS 侧构建加密 → Go 壳内存解密已有跨语言黄金向量与端到端互验(改名 / 篡改 / 整体替换即拒绝运行);
11
11
  - **多窗口(M2)随 v1.13.0 壳可用**:前端 `window.freedom.window.create / close / list / focus` 开二级窗口,Go 侧 `App.NewWindow / Window.Close`;次级窗口独立消息泵、页面源支持内联 HTML / URL;
12
12
  - **销毁竞态收口**:修复 webview2 在 `Destroy` 中泵出滞留 dispatch 回调导致的随机崩溃(0xc0000005,多窗口 / 快速关闭场景),回收后所有排队回调按拆除旗标自我作废,并配套红绿回归测试;
13
13
  - **v1.13.1**:文档同步(本 README 更新至 v1.13.x 真实现状、壳 CI 章节勘误),无功能与壳二进制变更。
14
+ - **v1.13.2 反逆向加固(FRDM2)**:容器升 FRDM2(构建期随机盐 + PBKDF2 60 万次 + enc/mac 域分离 + MAC 覆盖容器头部),主密钥改为掩码表运行时组装(壳二进制 `strings` 直取不到),`backend/**` 后端源码一并入容器并在运行期解密到私有临时目录(退出即删、崩溃残留按 PID 回收),前端产物 `sourceMappingURL` 构建期抹除,anti-debug 扩到六道信号,本地与 CI 壳统一 `-trimpath -s -w`。**旧版本 CLI 产出的 FRDM1 资源包在新壳上明确拒绝运行(不静默降级),须重新 `freedom build`**;三平台壳随本版本经 CI 重编发布。
15
+ - **v1.13.3 内置工具链扩展 + 加固与健壮性收口**:新增 `freedom toolchain status|install|optimize|clear`,探测 / 安装 / 优化 C++(MSVC / MinGW / clang)、Rust、Go 三条工具链并按平台映射到 winget / brew / apt;探测结论缓存(绑 PATH 指纹 + 7 天 TTL)**只缓存成功**,即「检测到配置好就不再实探」,刚装好的工具当场可识别,`install` 默认只打印命令、`--apply` 才执行。同轮收口:Windows 第七道反调试信号(`DR0–DR3` 硬件断点)、SIGTERM / `CTRL_CLOSE_EVENT` 退出清扫通道(临时目录不再等下次启动回收)、`.integrity` 缺失即拒绝启动、Linux WebKitGTK 4.1 构建路径自动注入 `-tags=webkit2_41`、`shell build` / `shell download` 成功却非零退出的退出码修正、产物自检不再把 `.integrity` 大小说成 0 B。许可改为闭源专有许可(详见根 `LICENSE`)。
14
16
 
15
17
  **v1.12.17 安全模式全面落地**:三档安全模式 `freedom security <none|basic|high>` 正式随包分发——high 档把 resources 加密为 `app.bin`(AES-256-CTR + HMAC-SHA256 + PBKDF2 密钥派生),配合 `.integrity` 完整性校验、anti-debug 与进程隐藏,磁盘无明文、篡改即拒运行;三平台预编译壳经 CI 重建分发,补齐 v1.12.16 仅重编 win-x64 壳的缺口。
16
18
 
@@ -137,6 +139,13 @@ mac 用户解压 `.app.zip` 即得 `.app`,拖入 `/Applications` 即可直接
137
139
 
138
140
  **预编译壳的来源与 CI**:`webview_go` 依赖各系统自带 WebView 框架,**无法交叉编译**,三平台壳必须在对应平台本机编译。自 v1.13.0 起由仓库 `.github/workflows/build.yml` 统一承担:推送 `vX.Y.Z` tag → 三平台 runner 编译通用壳 → `release` job 自动创建 GitHub Release 并上传资产 `freedom-shell-<plat>`,供 `freedom shell download` 按「`v<包版本>` tag + 同名资产」拉取(Intel Mac 已不支持,见 `nativePlatform()` 的明确报错)。发版顺序:先推 GitHub tag、等 Release 资产就绪,再 `npm publish` 同版本——保证 shell 下载默认源始终可用(紧急时可设 `FREEDOM_SHELL_TAG` 指向既有 tag)。
139
141
 
142
+ **平台名写法与下载回退**:`--platform` 与 `freedom shell download/build` 接受别名与架构后缀——
143
+ `win` / `windows` / `mac` / `macos` / `osx` / `ubuntu` / `linux-x86_64` / `mac-arm64` 等统一归一到
144
+ `win-x64` / `darwin-arm64` / `linux-x64`;无法支持的组合(`win-x86`、`darwin-x64`、`plan9`)直接报「未知平台」并给出可选值,不做猜测。
145
+ 下载有两条路径:先试直连 `releases/download`,不通(超时 / 代理 / 网络策略)时自动回退 GitHub Release API 资产端点;
146
+ 两条都不通则错误信息分别给出两端点与手工放置目录(`FREEDOM_SHELL_DIR` 可覆写壳目录,私有镜像另见 `FREEDOM_SHELL_REPO` / `FREEDOM_SHELL_BASE` / `FREEDOM_GITHUB_API`),
147
+ GitHub 限流时可带 `FREEDOM_GITHUB_TOKEN`。
148
+
140
149
  产物目录可在 `freedom.config.js` 的 `outDir` 中调整:默认 `'dist'`,设为 `'.'` 则直接输出到项目根目录(dist 的上级),设为任意相对 / 绝对路径亦可。输出到项目根目录时会自动跳过 `index.html` 副本,避免覆盖项目源文件。
141
150
 
142
151
  ```bash
@@ -169,6 +178,14 @@ export default {
169
178
  icon: undefined, // 应用图标:Windows 用 .ico(推荐多尺寸),macOS 用 .icns
170
179
  outDir: 'dist', // 产物目录:'dist'(默认)| '.'(项目根目录)| 任意路径
171
180
  // backend: { command: 'node', args: ['backend/main.mjs'] }, // 任意语言后端进程
181
+ // staticHtml: 'app.html', // 跳过 npm/vite,直接内嵌该单文件 HTML(零网络;纯静态页与 freedom 自举界面用)
182
+ // singleInstance: true, // 二次启动转发参数给已运行实例后退出(前端收 app.secondInstance)
183
+ // dev: { command: 'npm run dev' }, // freedom dev 拉起的前端 dev server 命令
184
+ // updater: { // 应用自更新(freedom keygen 生成密钥,公钥填这里)
185
+ // manifestURL: 'https://your.host/latest.json',
186
+ // publicKey: '<freedom keygen 输出的 base64 公钥>',
187
+ // requireSignature: false, // true 时产物还须通过平台代码签名复核(仅 Windows)
188
+ // },
172
189
  };
173
190
  ```
174
191
 
@@ -185,7 +202,7 @@ export default {
185
202
  | --- | --- | --- | --- |
186
203
  | `none` | 明文 `index.html` + `config.json`(默认,兼容历史产物) | 解包即读 | 公开页面 / 调试 / 快速分发 |
187
204
  | `basic` | 同上明文,构建时额外输出加固建议 | 低 | 需要提示、暂不加密 |
188
- | `high` | 整体加密为 `resources/app.bin` + `.integrity`,磁盘**无任何明文** HTML/配置 | 高(需逆向壳 + 还原派生密钥) | 防源码提取、防资源篡改的正式分发 |
205
+ | `high` | 前端 HTML + 配置 + **后端源码**整体加密为 `resources/app.bin` + `.integrity`,磁盘**无任何明文** | 高(需逆向壳 + 还原派生密钥) | 防源码提取、防资源篡改的正式分发 |
189
206
 
190
207
  **切换方式**(二选一,`--security` 可临时覆盖配置文件):
191
208
 
@@ -195,16 +212,21 @@ freedom build --security high # 单次构建生效(不改配置)
195
212
  freedom build # 读取配置中的 security 值
196
213
  ```
197
214
 
198
- **high 模式原理**:
199
- - 构建时:前端 HTML + 配置序列化后,用 **AES-256-CTR** 加密为 `app.bin`(容器头 `FRDM1` + 16B IV + 16B 认证标签),并生成 `.integrity` 完整性清单(`app.bin` 与 `backend/**` 各文件的 HMAC-SHA256);
200
- - 加密密钥由 **PBKDF2-HMAC-SHA256**(6 万次迭代)按「应用可执行文件名」派生,不同应用密钥不同,暴力破解成本高;
201
- - 壳启动时:先校验 `.integrity`(防整体替换 / 篡改 / exe 改名),再恒定时间比对 HMAC 认证标签(Encrypt-then-MAC),最后内存中解密加载——**磁盘始终无明文**;
202
- - 解密 / 校验失败即拒绝运行(不静默回退明文,防降级攻击);
203
- - 另内置 **anti-debug**(`IsDebuggerPresent` / `CheckRemoteDebuggerPresent` 命中即退出)与进程隐藏加固。
215
+ **high 模式原理(FRDM2 容器)**:
216
+ - 容器布局:`FRDM2`(5B) + `salt`(16B,**每次构建随机**) + `iv`(16B) + `tag`(16B) + 密文;密钥 = **PBKDF2-HMAC-SHA256**(60 万次迭代,主密钥经字节表掩码内置于壳与 CLI)按「应用可执行文件名 + 容器随机盐」派生,再由固定标签做 **HMAC 域分离**得到独立的加密钥与认证钥;
217
+ - 认证为 **Encrypt-then-MAC 且覆盖容器头部**(magic/salt/iv 参与计算),故改盐、改 IV、翻转任意一字节都会认证失败;`.integrity` 清单绑定同一盐值,**整体替换成另一个合法容器**同样拒绝运行;
218
+ - **后端源码不再明文落盘**:`backend/**`(含 POSIX 权限位)作为条目进入容器,磁盘上不再有 `resources/backend/`;壳启动解密到仅属主可访问的一次性临时目录(0700 / 文件 0600,执行位按容器记录还原)供子进程执行,进程退出即删除;若被强杀或崩溃来不及删,**下次启动会按目录名内嵌的 PID 自动回收残留**;
219
+ - 构建期抹除前端产物中的 `sourceMappingURL` 引用(防 source map 还原源码),壳二进制一律 `-trimpath -ldflags "-s -w"`(Windows 另加 `-H windowsgui`);
220
+ - 解密 / 校验失败即拒绝运行(不静默回退明文,防降级攻击;旧版 `FRDM1` 容器明确报"版本不支持");
221
+ - 另内置 **anti-debug**:`IsDebuggerPresent`、`CheckRemoteDebuggerPresent`、直读 `PEB.BeingDebugged`、`NtQueryInformationProcess` 的 `ProcessDebugPort` / `ProcessDebugObjectHandle` / `ProcessDebugFlags` 共六道独立信号,任一确证即静默退出(退出码 77),在资源解密前后各检测一次;所有探测遵循"取不到即视为未命中",杜绝误杀;
222
+ - 进程隐藏加固(`-H windowsgui`,无控制台窗口)。
204
223
 
205
- **加固上限说明**:`high` 大幅提高破解门槛,但**任何客户端可执行程序都无法做到绝对不可破解**——密钥最终存在于壳二进制与运行时内存中。更高强度建议:壳编译时设置 `-ldflags "-s -w"` 剥离符号表(CI 编译壳时已可选开启)、对核心业务保留服务端校验。若需"怎么都解不开",请把真正敏感的密钥 / 逻辑放到你的后端。
224
+ **加固上限说明**:`high` 大幅提高破解门槛,但**任何客户端可执行程序都无法做到绝对不可破解**——密钥最终存在于壳二进制与运行时内存中,反调试只抬升动态分析成本、不是不可绕过的墙。真正敏感的密钥与业务逻辑仍应留在服务端。**误报可关**:反调试在 CI、自动化测试、远程桌面、部分虚拟化环境可能把正常运行判成被附加调试器
225
+ (命中即静默退出,码 77)。这类场景设 `FREEDOM_DISABLE_ANTIDEBUG=1`,或在壳层源码里 `Config{DisableAntiDebug: true}`
226
+ 后 `freedom shell build`——只关探测,容器解密与 `.integrity` 完整性校验照旧生效(那两道才是源码保护的本体)。
227
+ `resources/config.json` 里刻意不提供此开关:打包产物里的配置运行期可被第三方替换,给开关等于递刀。
206
228
 
207
- **互斥规则**:切换安全模式重新构建时,CLI 会自动清理另一模式的遗留产物(`app.bin`/`.integrity` 与明文 `index.html`/`config.json` 只能存其一),避免壳误加载旧资源。
229
+ **互斥规则**:切换安全模式重新构建时,CLI 会自动清理另一模式的遗留产物(`app.bin`/`.integrity` 与明文 `index.html`/`config.json`/`backend/` 只能存其一),避免壳误加载旧资源。
208
230
 
209
231
  ## 前端
210
232
 
@@ -220,27 +242,103 @@ window.freedom.window.minimize(); // 窗口控制
220
242
 
221
243
  - Node.js >= 18
222
244
  - 不需要 Go 工具链(壳层为随包分发的预编译二进制)
223
- - 可选:`freedom shell build` 需本机 Go(含 CGO,Windows 需 MSVC 编译环境),仅用于亲自编译壳
245
+ - 可选:`freedom shell build` 需本机 Go(含 CGO,Windows 需 MSVC 编译环境),仅用于亲自编译壳。
246
+ Linux 侧需 WebKitGTK + GTK3 开发库,`4.0` 与 `4.1` 二选一(Ubuntu 24.04+/Debian 13+ 只有 4.1:
247
+ `sudo apt install libgtk-3-dev libwebkit2gtk-4.1-dev libayatana-appindicator3-dev`);
248
+ 仅有 4.1 时 `freedom shell build` 会自动为编译加 `-tags webkit2_41`,无需手工干预(探测见 `lib/webkit.js`)。
224
249
  - `.dmg` 打包需在 macOS 上执行(依赖系统 hdiutil);`.app.zip` 在任意平台均可直接产出
225
250
 
226
251
  ## 命令
227
252
 
228
253
  ```
229
- freedom tui # 交互式终端界面
254
+ freedom # 选择显示方式:终端 TUI / Freedom Desktop(图形界面)
255
+ freedom tui # 直达交互式终端界面
256
+ freedom desktop [--rebuild] [--no-launch] # 直达 Freedom Desktop(图形界面,由 freedom 自身打包)
230
257
  freedom init <目录> [--force]
231
- freedom build [--platform win-x64|darwin-arm64|linux-x64|all] [--no-cache] [--security none|basic|high]
258
+ freedom dev [--port <n>|--url <u>] [--command <cmd>] # 热更开发流:拉起 vite 并把壳窗口指到 dev server
259
+ freedom build [--platform win-x64|darwin-arm64|linux-x64|all] [--no-cache] [--security none|basic|high] [--installer]
232
260
  freedom titlebar <native|frameless>
233
261
  freedom security <none|basic|high> # 设置安全模式(写入配置)
234
262
  freedom icon <path> # 设置应用图标(Windows 用 .ico,macOS 用 .icns)
235
263
  freedom config [get|set]
236
264
  freedom shell list|download <platform>|build <platform>
265
+ freedom toolchain status [--refresh] [--home <dir>] # 探测 Go / Rust / C++ 工具链(成功结论才缓存,绑 PATH 指纹)
266
+ freedom toolchain install [go,rust,cpp|missing] [--apply] # 默认只打印安装命令,加 --apply 才执行
267
+ freedom toolchain optimize [--apply] # 国内网络迹象下换 Go/Rust 镜像源(改配置前留 .bak)
268
+ freedom toolchain clear # 清空探测缓存(~/.freedom/toolchain-cache.json)
237
269
  freedom dmg [--platform <plat>] # 在 macOS 上把 .app 打包为 .dmg
270
+ freedom keygen [--force] # 生成应用自更新 ed25519 密钥对(私钥留 .freedom/keys/,公钥进配置)
271
+ freedom manifest --artifact <产物> --url <下载地址> [--version x] [--notes txt] # 产出签名更新清单 dist/latest.json
272
+ freedom agents [--home <dir>] # Agent 集成支持矩阵(本机磁盘证据判定「是否安装 + 目标文件状态」)
273
+ freedom agents install --what <mcp|skill> --agent <key|all> # 等价于下面两条
274
+ freedom skill install --agent <key|all> [--dry-run] [--force] [--skills-dir <path>]
275
+ freedom mcp install --agent <key|all> [--dry-run] [--force] [--config <path> --format json|toml|toml-aot|yaml]
276
+ freedom mcp serve # stdio MCP 服务本体(一般由 agent 自动拉起)
238
277
  freedom version # 显示版本并检测最新版本
239
278
  freedom update # 检查新版本并给出升级命令(同 check-update)
240
279
  freedom tutorial
241
280
  freedom help
242
281
  ```
243
282
 
283
+ ## 两种显示:终端 TUI 与 Freedom Desktop
284
+
285
+ 裸跑 `freedom` 会先让你选显示方式:
286
+
287
+ - **终端 TUI** —— 零依赖 ANSI 界面(`freedom tui` 直达),新建 / 打包 / 配置 / 壳管理。
288
+ - **Freedom Desktop** —— 图形窗口(`freedom desktop` 直达)。它是 **freedom 自己打包出来的产品**:
289
+ 模板在包内 `templates/desktop/`,首次运行同步到 `~/.freedom/desktop/`,再走与用户项目**同一条
290
+ `freedom build` 代码路径**产出 `freedom-desktop.exe`(壳 + `resources/`),随后拉起它。
291
+ 前端是零构建的单文件页面(配置项 `staticHtml` 直通,**不跑 npm / vite,零网络**),
292
+ 后端是零依赖 Node 进程(`resources/backend/desktop.mjs`,NDJSON/stdio),它再以子进程调起 `freedom` CLI——
293
+ 因此**界面能力恒等于 CLI 能力**,CLI 升级界面即升级。
294
+ CLI 版本或模板内容变化时(stamp = CLI 版本 + 模板哈希)自动重打包,未变化则复用产物;
295
+ `--rebuild` 强制重建(需先关闭已开窗口,Windows 会锁定运行中的 exe),`--no-launch` 只准备产物。
296
+
297
+ 界面分区:概览 / 项目 / 打包 / 配置 / 壳与后端 / 发布 / Agent 集成,底部输出区实时滚动 CLI 与 dev server 日志。
298
+
299
+ ## Agent 集成:把 Freedom 交给编码 Agent
300
+
301
+ - `freedom skill install --agent <key|all>`:把 `skill/freedom/SKILL.md`(框架架构、配置键表、SDK 面、
302
+ NDJSON 协议、CLI 命令、坑清单)复制进各 agent 的 skills 目录。
303
+ - `freedom mcp install --agent <key|all>`:把 `freedom mcp serve` 注册进各 agent 的 MCP 配置。
304
+ MCP 工具面:`freedom_build / init / verify / config / shell / release / agents / guide`。
305
+ - `freedom agents [--home <dir>]`:打印支持矩阵。**安装检测门(v1.13.2 起)**——只有本机检出该
306
+ agent 的**安装足迹**(配置文件在 / 注册表声明的专属目录在 / PATH 里有它的可执行)才允许写入;
307
+ 未检出即 `not-installed`,只输出可粘贴片段,**绝不新建目录、绝不凭记忆造路径**。
308
+ 「父目录存在」不算证据(HOME 与 `AppData/Roaming` 恒在,据此写入=往没装的东西里写)。
309
+ `--home` 换一棵家目录树预览取证结果。
310
+ - 逃生通道两条:`--force`(明知该 agent 装着但足迹未被覆盖,强行写入并显式告警)、
311
+ `--config <真实路径>` / `--skills-dir <真实目录>`(按你指定的路径写,绕开候选路径推断)。
312
+ - `freedom agents install --what <mcp|skill> --agent <key|all>`:上面两条安装入口的合并写法,
313
+ 不带 `--what` 时默认 `mcp`;`agents <其它子命令>` 直接报错退出,不会静默回落成矩阵。
314
+ - 写入是**幂等合并**:保留既有其它 server 条目,二次安装原地替换不产生重复;改前留 `<file>.bak` 备份;
315
+ `--dry-run` 只预览不落盘。
316
+ - 已登记的 agent(17 个):Claude Code / Claude Desktop / Codex CLI / Qoder / CodeBuddy / Zcode / Cursor /
317
+ Hermes(YAML)/ Tianshu / Pi / WorkBuddy / OpenCode / Gemini CLI / DeepSeek Harness / Oh My Pi / Trae /
318
+ **Reasonix**。其中 **Reasonix** 的 MCP 配置是 TOML **数组表** `[[plugins]]`(按 `name = "freedom"` 定位条目,
319
+ 与既有 `computer-use` 等插件共存),格式取自本机 `%APPDATA%/reasonix/config.toml` 实况;
320
+ 技能装在 `~/.reasonix/skills/freedom`。未被登记或无足迹的布局用 `--format <json|toml|toml-aot|yaml>` 覆写。
321
+
322
+ ## 开发热更(freedom dev)
323
+
324
+ `freedom dev` 对标 `tauri dev` / `wails dev`:它拉起项目自己的前端 dev server(默认 `npm run dev`,可用配置 `dev.command` 或 `--command` 覆盖),
325
+ 从其输出里解析 `http://localhost:<port>`(也可用 `--port` / `--url` 直接指定),把随包通用壳复制到 `.freedom/dev/` 并写入
326
+ `url` 模式的 `resources/config.json`(默认开开发者工具),随后拉起壳窗口——改代码由 vite HMR 直接反映到窗口里,不必反复重打包。
327
+ `.freedom/dev/` 是开发临时目录,与正式产物 `dist/` 互不影响;配置了 `backend/` 时会一并镜像复制,任意语言后端同样能在 dev 流里联调。
328
+ `Ctrl-C` 退出时会树杀 dev server 与壳进程(Windows 走 `taskkill /T /F`,不留孤儿子进程)。
329
+
330
+ ## 安装包与自更新发布环
331
+
332
+ - `freedom build --installer`:每个目标平台额外产出 `<应用名>-<平台>-portable.zip`(解压即用的便携包);
333
+ Windows 再产出已填充的 NSIS 脚本 `<应用名>-setup-<版本>.nsi`,本机装有 NSIS(`makensis` 在 PATH)时直接编译出
334
+ `<应用名>-setup-<版本>.exe`,否则给出指引让你在装有 NSIS 的机器上一条命令编译(缺 makensis 属环境能力而非产物缺陷)。
335
+ - 应用自更新(对标 electron-updater / tauri updater)三步:
336
+ 1. `freedom keygen` 生成 ed25519 密钥对,私钥存 `.freedom/keys/update_ed25519`(发布方资产,勿入库 / 勿分发);
337
+ 2. 公钥写入 `freedom.config.js` 的 `updater.publicKey`(连同 `manifestURL`),`freedom build` 会透传进产物的 `config.json`;
338
+ 3. 发版时 `freedom manifest --artifact dist/<产物> --url https://.../<产物>` 产出签名清单 `dist/latest.json`,上传到 `manifestURL` 即可。
339
+ 运行时前端用 `freedom.update.check()` / `freedom.update.install()`,清单验签(payload `freedom-update-v1\n<version>\n<url>\n<sha256>`)
340
+ 与 sha256 校验都在壳内完成(`updater.go`),签名与 Go 侧验签有跨语言回归测试守着。
341
+
244
342
  ## 任意语言后端
245
343
 
246
344
  壳与后端进程通过 stdin/stdout 的 NDJSON/JSON-RPC 桥接(协议语言无关),因此后端可用任意语言实现(Node / Python / Rust / Go / C#…)。
@@ -262,5 +360,11 @@ export default {
262
360
 
263
361
  ## License
264
362
 
265
- MIT
363
+ 本工具与其源码为**闭源专有软件**,完整条款见包内 `LICENSE`(不适用 MIT)。要点:
364
+
365
+ - 你可以自由安装使用,并用它打包 / 销售你自己的应用——**你的前端、后端与产物归你所有**,无需开源或署名;
366
+ - 未经许可方书面同意,不得再分发本包内容物、源码或衍生版本,也不得移除版权与许可声明;
367
+ - 唯一沿用开源许可的部分是内嵌第三方 `webview_go`(MIT,见 `templates/go/third_party/webview_go/LICENSE`)。
368
+
369
+ 商用授权与定制需求请通过仓库 GitHub Issues 联系。
266
370