Skip to content

Commit bdb25a0

Browse files
committed
Initial commit: ScriptDeck script manager
0 parents  commit bdb25a0

12 files changed

Lines changed: 3470 additions & 0 deletions

File tree

‎.codebuddy/settings.local.json‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"enabledPlugins": {
3+
"modern-webapp@cb_teams_marketplace": true
4+
}
5+
}

‎.gitignore‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Python
2+
__pycache__/
3+
*.py[cod]
4+
*.pyo
5+
*.egg-info/
6+
dist/
7+
.venv/
8+
venv/
9+
10+
# OS
11+
.DS_Store
12+
Thumbs.db
13+
14+
# IDE
15+
.idea/
16+
.vscode/
17+
*.swp
18+
*.swo
19+
20+
# WorkBuddy
21+
.workbuddy/
22+
23+
# Backups
24+
*.bak
25+
26+
# Screenshots (项目截图保留在 static/screenshots/)
27+
# 个人截图不提交
28+
temp/
29+
screenshots/
30+
!static/screenshots/

‎AGENTS.md‎

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
# AGENTS.md — ScriptDeck(脚本中台)
2+
3+
## 项目定位
4+
5+
一个轻量级 Windows 脚本启动台。扫描指定目录下所有同时包含 `.bat` 和 `readme.md` 的子目录,在浏览器中提供现代化的查找、预览和一键启动体验。
6+
7+
并非局限于 Python 脚本——任何能通过 `.bat` 启动的项目都能接入。
8+
9+
## 脚本接入规范
10+
11+
ScriptDeck 扫描目录时**只收集同时满足以下两点的子目录**:
12+
13+
1. 目录下至少有一个 `.bat` 文件
14+
2. 目录下存在 `readme.md` 文件
15+
16+
`.bat` 文件建议使用绝对路径(含 Python 解释器路径),避免依赖系统环境变量。`readme.md` 第一行作为脚本标题、第二行作为简要描述。
17+
18+
## 快速启动
19+
20+
```bash
21+
pip install flask
22+
python main.py
23+
```
24+
25+
访问 `http://127.0.0.1:5000`
26+
27+
## 配置
28+
29+
`config.json`:
30+
31+
| 字段 | 说明 |
32+
|------|------|
33+
| `scan_root` | 扫描根目录,默认 `C:\project` |
34+
| `exclude_dirs` | 排除的文件夹名 |
35+
| `exclude_bats` | 排除的 bat 文件名(支持 `*` `?` `%` 通配符) |
36+
| `exclude_scripts` | 按完整路径排除的脚本 |
37+
| `host` / `port` | Flask 监听地址和端口 |
38+
39+
## 架构
40+
41+
### 后端 (`main.py`)
42+
43+
单文件 Flask 应用。核心逻辑:
44+
- `scan_directory()` — 递归扫描 `scan_root`,收集每子目录下的 `.bat` 和 `readme.md`
45+
- 执行 bat 时用 `subprocess.Popen` + `cmd /k chcp 65001` 确保 UTF-8 不乱码
46+
47+
API 路由:
48+
| 路由 | 方法 | 说明 |
49+
|------|------|------|
50+
| `/` | GET | 渲染主页面 |
51+
| `/api/scan` | GET | 扫描并返回所有脚本数据 |
52+
| `/api/set-root` | POST | 修改扫描根目录 |
53+
| `/api/exclude-bats` | GET/POST | 查询/更新 bat 排除规则 |
54+
| `/api/exclude-script` | POST | 添加/移除脚本排除 |
55+
| `/api/run-bat` | POST | 在新建 cmd 窗口中执行 .bat |
56+
| `/api/open-folder` | POST | 在资源管理器中打开文件夹 |
57+
58+
### 前端
59+
60+
- `templates/index.html` — 主界面 Jinja2 模板
61+
- `static/css/app.css` — 完整样式表(~1560 行),CSS 自定义属性驱动的 glassmorphism 设计系统
62+
- `static/js/app.js` — 客户端逻辑:渲染、搜索、收藏、最近运行、详情面板、小火箭按钮
63+
- 图标:Lucide Icons(CDN),Markdown 渲染:Marked.js(CDN)
64+
65+
### API 返回结构
66+
67+
```json
68+
{
69+
"scan_root": "C:\\project",
70+
"items": [
71+
{
72+
"folder": "ai/bacth_ai",
73+
"folder_name": "bacth_ai",
74+
"parent": "ai",
75+
"bats": [{"name": "xxx.bat", "path": "C:\\..."}],
76+
"readme": {"name": "readme.md", "path": "...", "content": "..."}
77+
}
78+
],
79+
"total": 1
80+
}
81+
```
82+
83+
## UI 特性
84+
85+
- **Hero** — 居中渐变标题 + 环境光晕背景
86+
- **侧边栏** — 品牌区、搜索框、全部/收藏/最近标签、可折叠目录树
87+
- **脚本卡片** — 渐变 Lucide 图标(按关键词自动匹配)、标题、路径、README 摘要、BAT/README 徽章、运行/收藏按钮
88+
- **详情面板** — 点击卡片右侧展示:完整路径、操作按钮、README 渲染、同目录脚本列表
89+
- **小火箭** — 滚动超过 10px 显示,点击触发升空动画后回到顶部
90+
- **收藏 / 最近运行** — `localStorage` 持久化
91+
92+
## 设计系统
93+
94+
- CSS 变量驱动的紫蓝渐变配色:`--accent: #6C5CE7`,`--accent-2: #0984E3`
95+
- Glassmorphism:`rgba` 背景 + `backdrop-filter: blur`
96+
- 字体:PingFang SC → Noto Sans SC → system-ui 逐级回退
97+
- 网格:`repeat(auto-fill, minmax(250px, 1fr))`
98+
- 布局:`.sidebar` 固定,`.content` 独立滚动(`overflow-y: auto`)
99+
100+
## 平台限制
101+
102+
- **仅 Windows**:依赖 `.bat`、`cmd`、`explorer.exe`
103+
- 路径使用反斜杠,经 `os.path.normpath` 标准化
104+
105+
## 开发笔记
106+
107+
- 无测试、Linter、CI
108+
- Flask `debug=False`(默认)
109+
- 模板修改需重启服务器;CSS/JS 热重载无需重启
110+
- Lucide 图标名在 `app.js` 的 `iconFor()` 中配置
111+
112+
## 文件结构
113+
114+
```
115+
ScriptDeck/
116+
├── main.py # Flask 后端(单文件)
117+
├── config.json # 运行时配置
118+
├── requirements.txt # 依赖(仅 Flask)
119+
├── templates/
120+
│ ├── index.html # 主界面模板
121+
│ └── logo.png # 品牌 Logo
122+
└── static/
123+
├── screenshots/
124+
│ └── index.png # 界面截图
125+
├── css/
126+
│ └── app.css # 完整样式表
127+
└── js/
128+
└── app.js # 前端逻辑
129+
```

‎README.md‎

Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,216 @@
1+
# ScriptDeck(脚本中台)
2+
3+
> 给你的 Python 脚本一个家 —— 自动扫描目录中的 `.bat` 和 README 文档,在漂亮的浏览器界面中一键查找、预览、启动。不只 Python,任何能用 .bat 跑起来的项目都行。
4+
5+
![Python](https://img.shields.io/badge/Python-3.8+-blue?logo=python)
6+
![Platform](https://img.shields.io/badge/Platform-Windows-lightgrey?logo=windows)
7+
![Flask](https://img.shields.io/badge/Flask-3.1-orange?logo=flask)
8+
9+
---
10+
11+
## 💡 工作原理
12+
13+
ScriptDeck 不关心你的脚本是什么语言。它只看一件事:**你指定的目录下,哪些子目录同时有 `.bat` 文件和 `readme.md` 文件。**
14+
15+
找到后,自动整理成卡片界面 —— bat 负责启动,readme 负责说明。点一下"运行",脚本就在新窗口中跑起来了。
16+
17+
### 接入一个新脚本,只需三步
18+
19+
```
20+
你的脚本项目/
21+
├── run.bat ← 用绝对路径调用脚本(含 Python 解释器路径)
22+
└── readme.md ← 第一行标题,第二行描述
23+
```
24+
25+
举个例子 —— 假设你有一个 `analysis` 脚本,它的 `run.bat` 长这样:
26+
27+
```bat
28+
@echo off
29+
chcp 65001 >nul
30+
C:\Users\WIN11\.workbuddy\binaries\python\versions\3.13.12\python.exe C:\project\tool\analysis\main.py
31+
```
32+
33+
> ⚠️ **注意**:多 Python 环境下,bat 文件里**必须用绝对路径**指定 Python 解释器,避免跑到系统默认版本。
34+
35+
`readme.md` 长这样:
36+
37+
```md
38+
数据报表分析
39+
读取 Excel 数据并生成周报图表
40+
```
41+
42+
ScriptDeck 会把第一行作为卡片标题,第二行作为描述摘要。后面的内容会完整渲染在详情面板里。
43+
44+
---
45+
46+
## 📸 界面预览
47+
48+
![脚本中台界面截图](static/screenshots/index.png)
49+
50+
---
51+
52+
## ✨ 功能特性
53+
54+
| 特性 | 说明 |
55+
|------|------|
56+
| 🔍 **实时搜索** | 输入即搜,按脚本名或文件夹路径快速过滤 |
57+
| 📁 **目录树导航** | 左侧边栏展示文件夹层级,点击即筛选 |
58+
| ⭐ **收藏夹** | 常用脚本一键收藏,跨会话持久保存 |
59+
| 🕐 **最近运行** | 自动记录最近执行的 5 个脚本 |
60+
| 📄 **README 预览** | 选中脚本后右侧展示 README 内容(Markdown 渲染) |
61+
| 🚀 **一键启动** | 点击"运行"在新 CMD 窗口中启动脚本 |
62+
| 🎨 **现代 UI** | Glassmorphism 毛玻璃设计,紫蓝渐变配色,Lucide 图标 |
63+
| ⬆️ **回到顶部** | 小火箭按钮,带升空动画 |
64+
65+
---
66+
67+
## 🚀 快速开始
68+
69+
### 1. 装依赖
70+
71+
```bash
72+
pip install flask
73+
```
74+
75+
### 2. 启动
76+
77+
```bash
78+
python main.py
79+
```
80+
81+
终端输出:
82+
83+
```
84+
ScriptDeck 启动中...
85+
扫描目录:C:\project
86+
访问地址:http://127.0.0.1:5000
87+
按 Ctrl+C 停止
88+
```
89+
90+
### 3. 使用
91+
92+
- 搜脚本 → 搜索框输入关键词
93+
- 跑脚本 → 点击卡片上的「运行」
94+
- 收藏 → 点卡片上的 ⭐
95+
- 看详情 → 点卡片,右侧面板展开
96+
97+
---
98+
99+
## ⚙️ 配置
100+
101+
`config.json`:
102+
103+
```json
104+
{
105+
"scan_root": "C:\\project",
106+
"exclude_dirs": [
107+
"node_modules", ".git", "__pycache__", "venv", ".idea"
108+
],
109+
"exclude_bats": ["副本", "start_*"],
110+
"exclude_scripts": [],
111+
"host": "127.0.0.1",
112+
"port": 5000
113+
}
114+
```
115+
116+
| 字段 | 说明 |
117+
|------|------|
118+
| `scan_root` | 扫描根目录,改成你自己放脚本的目录 |
119+
| `exclude_dirs` | 跳过这些文件夹 |
120+
| `exclude_bats` | 跳过这些 bat 文件(支持 `*` `?` 通配符) |
121+
| `exclude_scripts` | 按完整路径跳过特定脚本 |
122+
| `host` | 默认 `127.0.0.1`,想局域网访问改成 `0.0.0.0` |
123+
| `port` | 默认 `5000` |
124+
125+
---
126+
127+
## 🖥️ 界面介绍
128+
129+
```
130+
┌─────────────────────────────────────────────────────┐
131+
│ Hero 区域(标题 + 副标题) │
132+
├────────────┬────────────────────────────────────────┤
133+
│ 侧边栏 │ 主内容区(脚本卡片网格) │
134+
│ 🔍 搜索 │ │
135+
│ 全部/收藏 │ │
136+
│ /最近 │ │
137+
│ 📁 目录树 │ │
138+
├────────────┴────────────────────────────────────────┤
139+
│ ⬆️ 小火箭(滚动时显示) │
140+
└─────────────────────────────────────────────────────┘
141+
```
142+
143+
---
144+
145+
## 📡 API 接口
146+
147+
| 接口 | 方法 | 说明 |
148+
|------|------|------|
149+
| `/api/scan` | GET | 重新扫描目录 |
150+
| `/api/set-root` | POST | 修改扫描根目录 |
151+
| `/api/exclude-bats` | GET/POST | 查询或更新 bat 排除规则 |
152+
| `/api/exclude-script` | POST | 添加/移除脚本排除 |
153+
| `/api/run-bat` | POST | 运行指定 bat 脚本 |
154+
| `/api/open-folder` | POST | 在资源管理器中打开文件夹 |
155+
156+
---
157+
158+
## 🛠️ 技术栈
159+
160+
| 类别 | 技术 |
161+
|------|------|
162+
| 后端 | Python 3.8+, Flask 3.1 |
163+
| 前端 | 原生 JavaScript,零框架 |
164+
| 图标 | Lucide Icons(CDN) |
165+
| Markdown | Marked.js(CDN) |
166+
| 设计 | CSS 自定义属性 + Glassmorphism |
167+
| 运行环境 | 仅 Windows(依赖 .bat / cmd) |
168+
169+
---
170+
171+
## ❓ 常见问题
172+
173+
**Q:bat 运行后窗口出现乱码?**
174+
A:ScriptDeck 启动 bat 时会自动执行 `chcp 65001` 切换到 UTF-8。如果仍有乱码,检查 bat 文件本身的编码。
175+
176+
**Q:怎么让局域网其他电脑也能访问?**
177+
A:把 `config.json` 里的 `host` 改成 `"0.0.0.0"`,重启后用 `http://你电脑IP:5000` 访问。
178+
179+
**Q:改了 HTML 页面没变化?**
180+
A:Flask 模板有缓存,需要重启 `python main.py`。CSS 和 JS 的修改刷新浏览器即可生效。
181+
182+
**Q:怎么排除某个文件夹下所有脚本?**
183+
A:把文件夹名加到 `config.json` 的 `exclude_dirs` 里,重启。
184+
185+
**Q:能自定义脚本图标吗?**
186+
A:当前根据脚本名关键词自动匹配 Lucide 图标。改 `static/js/app.js` 里的 `iconFor()` 函数就行。
187+
188+
**Q:为什么我的脚本没出现在页面上?**
189+
A:检查两点:① 文件夹下是否同时有 `.bat` 和 `readme.md` ② 文件夹是否在 `scan_root` 下且没被 `exclude_dirs` 排除。
190+
191+
---
192+
193+
## 📁 文件结构
194+
195+
```
196+
ScriptDeck/
197+
├── main.py # Flask 后端
198+
├── config.json # 运行时配置
199+
├── requirements.txt # 依赖
200+
├── AGENTS.md # AI 项目上下文
201+
├── README.md # 你正在看的这份文档
202+
├── templates/
203+
│ ├── index.html # 主界面模板
204+
│ └── logo.png # 品牌 Logo
205+
└── static/
206+
├── screenshots/
207+
│ └── index.png # 界面截图
208+
├── css/
209+
│ └── app.css # 样式表
210+
└── js/
211+
└── app.js # 前端逻辑
212+
```
213+
214+
---
215+
216+
> 用 ❤️ 和 Flask 制作 · 有问题欢迎反馈

0 commit comments

Comments
 (0)