Skip to content

Commit d7f4105

Browse files
committed
feat: Tauri 桌面版(Windows/macOS)+ 三端 .sh 支持 + bat 全量改造为 sh
- desktop/: Tauri 2 + Rust 桌面应用,Rust 后端 1:1 移植 main.py(config/scanner/runner),命令返回与 Flask 端点同构 JSON;前端经 scripts/sync-ui.mjs 从 templates/+static/ 生成(fetch→invoke) - Windows 运行 .sh 走 Git Bash 新控制台(cmd /C start 中转修复 GUI 父进程 stdio 闪退),脚本后保留交互 bash;macOS 走 Terminal.app - convert_bat_to_sh.py: 扫描根 74 个 .bat 批量改造为 .sh(规则翻译 + 9 个手写移植),原件备份于扫描根 .bat-sh-backup/ - main.py: Flask 版同步支持 .sh 扫描与运行;扫描优先级统一 vbs > bat > sh - 前端: 目录树点击改为平滑滚动定位(不再筛选) - CI: .github/workflows/desktop-build.yml 自动打包 Windows NSIS/MSI + macOS App/Dmg(arm64/x64) - 文档: README/AGENTS/desktop README 同步更新
1 parent 2c9fb5b commit d7f4105

85 files changed

Lines changed: 9458 additions & 40 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
name: Desktop Build
2+
3+
on:
4+
workflow_dispatch:
5+
push:
6+
branches: [master]
7+
paths:
8+
- "desktop/**"
9+
- "templates/**"
10+
- "static/**"
11+
- ".github/workflows/desktop-build.yml"
12+
13+
jobs:
14+
build:
15+
strategy:
16+
fail-fast: false
17+
matrix:
18+
include:
19+
- os: windows-latest
20+
label: windows-x64
21+
- os: macos-latest
22+
label: macos-arm64
23+
- os: macos-13
24+
label: macos-x64
25+
runs-on: ${{ matrix.os }}
26+
defaults:
27+
run:
28+
working-directory: desktop
29+
steps:
30+
- uses: actions/checkout@v4
31+
32+
- name: 安装 Node
33+
uses: actions/setup-node@v4
34+
with:
35+
node-version: 22
36+
37+
- name: 安装 Rust
38+
uses: dtolnay/rust-toolchain@stable
39+
40+
- name: Rust 缓存
41+
uses: swatinem/rust-cache@v2
42+
with:
43+
workspaces: desktop/src-tauri
44+
45+
- name: 同步 UI(从 templates/ + static/ 生成)
46+
run: node scripts/sync-ui.mjs
47+
48+
- name: 安装前端依赖
49+
run: npm install --no-fund --no-audit
50+
51+
- name: 构建(Windows 出 NSIS/MSI,macOS 出 App/Dmg)
52+
run: npm run tauri build
53+
54+
- name: 上传安装包
55+
uses: actions/upload-artifact@v4
56+
with:
57+
name: ScriptDeck-${{ matrix.label }}
58+
path: |
59+
desktop/src-tauri/target/release/bundle/**/*.exe
60+
desktop/src-tauri/target/release/bundle/**/*.msi
61+
desktop/src-tauri/target/release/bundle/**/*.dmg
62+
desktop/src-tauri/target/release/bundle/**/*.app.tar.gz
63+
if-no-files-found: error

‎.gitignore‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,9 @@ Thumbs.db
3131
temp/
3232
screenshots/
3333
!static/screenshots/
34+
35+
# Node / Tauri
36+
node_modules/
37+
38+
# 本地 agent 协作状态
39+
.zcode/

‎AGENTS.md‎

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,39 @@
66

77
并非局限于 Python 脚本——任何能通过 `.bat` / `.vbs` 启动的项目都能接入。
88

9+
## 桌面版(desktop/)
10+
11+
仓库同时包含 Tauri 2 + Rust 桌面版(`desktop/`),与 Python/Flask 版共存:
12+
13+
- **后端**:`desktop/src-tauri/src/` 下 `config.rs` / `scanner.rs` / `runner.rs` / `main.rs`,是 `main.py` 逻辑的 1:1 移植,命令返回与 Flask 端点**同构的 JSON**
14+
- **前端**:`desktop/ui/` 由 `desktop/scripts/sync-ui.mjs` 从根目录 `templates/` + `static/` 生成(去 Jinja、fetch→`window.__TAURI__.core.invoke`),**不要手改 `ui/`**,改根目录源文件后跑 `npm run sync-ui`
15+
- **脚本类型**:三端统一扫描 `.bat`/`.vbs`/`.sh`(`# title:` 元数据);`.sh` 运行 Windows 走 Git Bash 新控制台窗口、macOS 走 Terminal.app
16+
- **配置**:存系统应用数据目录(`%APPDATA%\com.scriptdeck.app\config.json`),首次启动自动从旧版根目录 `config.json` 迁移
17+
- 开发 `npm run dev`,打包 `npm run build`;macOS 构建需在 mac 上(或走 `.github/workflows/desktop-build.yml`),详见 `desktop/README.md`
18+
- 一致性回归:`cd desktop/src-tauri && SCAN_ROOT="D:\project" cargo test -- --nocapture` 可与 `main.py` 的扫描输出做逐行对比
19+
920
## 脚本接入规范
1021

1122
ScriptDeck 扫描目录时**只收集同时满足以下两点的子目录**:
1223

13-
1. 目录下至少有一个 `.bat` 或 `.vbs` 文件
24+
1. 目录下至少有一个 `.bat` / `.vbs` / `.sh` 文件
1425
2. 目录下存在 `readme.md` 文件
1526

16-
**VBS 优先规则**:当同一目录同时存在 `.vbs` 和 `.bat` 时,只提取 `.vbs` 文件。
27+
**脚本优先规则**:当同一目录同时存在多种脚本时,只保留优先级最高的一类:vbs > bat > sh(历史迁移顺序)。
1728

18-
`.bat` 文件建议使用绝对路径(含 Python 解释器路径),避免依赖系统环境变量。`.vbs` 文件使用 `WScript.Shell` 启动目标程序。`readme.md` 第一行作为脚本标题、第二行作为简要描述。
29+
`.bat` 文件建议使用绝对路径(含 Python 解释器路径),避免依赖系统环境变量。`.vbs` 文件使用 `WScript.Shell` 启动目标程序。`.sh` 文件 Windows 上经 Git Bash 在新控制台窗口运行(脚本结束后保留交互 bash),macOS 上在 Terminal.app 中运行。`readme.md` 第一行作为脚本标题、第二行作为简要描述。
1930

2031
### 内嵌元数据(可选)
2132

2233
脚本文件头部支持内嵌元数据,优先级高于 readme 推导:
2334

2435
- `.bat`:`@echo off` 之后用 `:: title:` / `:: desc:`(或 `REM` 风格)注释
2536
- `.vbs`:用 `' title:` / `' desc:` 单引号注释(VBS 标准注释风格)
37+
- `.sh`:用 `# title:` / `# desc:` 注释
38+
39+
### bat → sh 批量改造
40+
41+
`convert_bat_to_sh.py` 将扫描根下全部 `.bat` 一次性转换为 `.sh`(简单脚本规则翻译、复杂脚本内嵌手写移植、元数据同步转换、LF 行尾),原 `.bat` 移入 `<扫描根>/.bat-sh-backup/` 备份(`.` 开头目录不会被扫描)。已于 2026-09-07 执行完毕,扫描根内现仅存 `.sh`(1 个 `.vbs`)。
2642

2743
## 快速启动
2844

@@ -53,7 +69,7 @@ python main.py
5369
- `scan_directory()` — 递归扫描 `scan_root`,收集每子目录下的 `.bat` / `.vbs` 和 `readme.md`;同目录同时存在时只保留 `.vbs`(VBS 优先)
5470
- `parse_bat_metadata()` — 解析 `.bat` 头部的 `:: title:` / `:: desc:` 元数据
5571
- `parse_vbs_metadata()` — 解析 `.vbs` 头部的 `' title:` / `' desc:` 元数据
56-
- 执行脚本:`.bat` 用 `subprocess.Popen` + `cmd /k chcp 65001` 确保 UTF-8 不乱码;`.vbs` 用 `wscript.exe` 执行
72+
- 执行脚本:`.bat` 用 `subprocess.Popen` + `cmd /k chcp 65001` 确保 UTF-8 不乱码;`.vbs` 用 `wscript.exe` 执行;`.sh` 用 Git Bash 在新控制台窗口执行(`CREATE_NEW_CONSOLE` + `exec bash --login` 保持窗口)
5773

5874
API 路由:
5975
| 路由 | 方法 | 说明 |
@@ -63,7 +79,7 @@ API 路由:
6379
| `/api/set-root` | POST | 修改扫描根目录 |
6480
| `/api/exclude-bats` | GET/POST | 查询/更新脚本文件名排除规则 |
6581
| `/api/exclude-script` | POST | 添加/移除脚本排除 |
66-
| `/api/run-bat` | POST | 执行脚本(.bat 在新 cmd 窗口 / .vbs 通过 wscript.exe) |
82+
| `/api/run-bat` | POST | 执行脚本(.bat 新 cmd 窗口 / .vbs 用 wscript.exe / .sh 用 Git Bash 新窗口) |
6783
| `/api/open-folder` | POST | 在资源管理器中打开文件夹 |
6884

6985
### 前端
@@ -110,7 +126,8 @@ API 路由:
110126

111127
## 平台限制
112128

113-
- **仅 Windows**:依赖 `.bat`、`.vbs`(`wscript.exe`)、`cmd`、`explorer.exe`
129+
- **旧 Flask 版仅 Windows**:依赖 `.bat`、`.vbs`(`wscript.exe`)、`cmd`、`explorer.exe`;`.sh` 需 Git Bash
130+
- **桌面版**:Windows + macOS;macOS 上 `.bat`/`.vbs` 无法运行,请使用 `.sh`
114131
- 路径使用反斜杠,经 `os.path.normpath` 标准化
115132

116133
## 开发笔记

‎README.md‎

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,34 @@
11
# ScriptDeck(脚本中台)
22

3-
> 给你的 Python 脚本一个家 —— 自动扫描目录中的 `.bat` / `.vbs` 和 README 文档,在漂亮的浏览器界面中一键查找、预览、启动。不只 Python,任何能用 .bat / .vbs 跑起来的项目都行。
3+
> 给你的 Python 脚本一个家 —— 自动扫描目录中的 `.bat` / `.vbs` / `.sh` 和 README 文档,在漂亮的浏览器界面中一键查找、预览、启动。不只 Python,任何能跑起来的项目都行。
44
55
![Python](https://img.shields.io/badge/Python-3.8+-blue?logo=python)
66
![Platform](https://img.shields.io/badge/Platform-Windows-lightgrey?logo=windows)
77
![Flask](https://img.shields.io/badge/Flask-3.1-orange?logo=flask)
88

99
---
1010

11+
## 🖥️ 桌面版(Windows / macOS)
12+
13+
项目同时提供基于 **Tauri 2 + Rust** 的桌面应用,位于 [`desktop/`](desktop/):
14+
浏览器界面原样复用,后端用 Rust 重写,打包为独立安装包(Windows NSIS/MSI、macOS .dmg),
15+
macOS 上额外支持 `.sh` 脚本(在 Terminal 中运行)。详见 [desktop/README.md](desktop/README.md)。
16+
17+
```bash
18+
cd desktop
19+
npm install && npm run dev # 开发调试
20+
npm run build # 打包安装程序
21+
```
22+
23+
---
24+
1125
## 💡 工作原理
1226

13-
ScriptDeck 不关心你的脚本是什么语言。它只看一件事:**你指定的目录下,哪些子目录同时有脚本文件(`.bat` 或 `.vbs`)和 `readme.md` 文件。**
27+
ScriptDeck 不关心你的脚本是什么语言。它只看一件事:**你指定的目录下,哪些子目录同时有脚本文件(`.bat` / `.vbs` / `.sh`)和 `readme.md` 文件。**
1428

1529
找到后,自动整理成卡片界面 —— 脚本文件负责启动,readme 负责说明。点一下"运行",脚本就在新窗口中跑起来了。
1630

17-
> 💡 **VBS 优先**:当同一目录同时存在 `.vbs` 和 `.bat` 时,只提取 `.vbs` 文件。
31+
> 💡 **脚本优先级**:同一目录同时存在多种脚本时,只提取优先级最高的一类:vbs > bat > sh(历史迁移顺序)。
1832
1933
### 接入一个新脚本,只需三步
2034

@@ -162,7 +176,7 @@ ScriptDeck 启动中...
162176
| `/api/set-root` | POST | 修改扫描根目录 |
163177
| `/api/exclude-bats` | GET/POST | 查询或更新脚本排除规则 |
164178
| `/api/exclude-script` | POST | 添加/移除脚本排除 |
165-
| `/api/run-bat` | POST | 运行脚本(.bat 在新 cmd 窗口 / .vbs 通过 wscript.exe) |
179+
| `/api/run-bat` | POST | 运行脚本(.bat 新 cmd 窗口 / .vbs 用 wscript.exe / .sh 用 Git Bash 新窗口) |
166180
| `/api/open-folder` | POST | 在资源管理器中打开文件夹 |
167181

168182
---
@@ -176,7 +190,7 @@ ScriptDeck 启动中...
176190
| 图标 | Lucide Icons(CDN) |
177191
| Markdown | Marked.js(CDN) |
178192
| 设计 | CSS 自定义属性 + Glassmorphism |
179-
| 运行环境 | 仅 Windows(依赖 .bat / .vbs / cmd) |
193+
| 运行环境 | 仅 Windows(依赖 .bat / .vbs / cmd / Git Bash);桌面版另支持 macOS |
180194

181195
---
182196

‎add_startup.reg‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Windows Registry Editor Version 5.00
2+
3+
; ScriptDeck 开机自启 - 直接注册到注册表 Run 键
4+
; 双击此文件合并后,系统登录时自动在后台启动 Flask 服务器
5+
6+
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
7+
"ScriptDeck"="C:\\ProgramData\\anaconda3\\envs\\python\\pythonw.exe C:\\project\\tool\\ScriptDeck_Script_Manager\\main.py"

‎config.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"scan_root": "C:\\project",
2+
"scan_root": "D:\\project",
33
"exclude_dirs": [
44
"node_modules",
55
".git",

0 commit comments

Comments
 (0)