Skip to content

Commit 23e54d6

Browse files
committed
chore: update gitignore and add GUI renovation guide
1 parent 3cba974 commit 23e54d6

26 files changed

Lines changed: 2249 additions & 2978 deletions

.gitignore

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ docs/
1212
# Rust / Cargo #
1313
###############
1414
target/
15+
target_*/
1516
**/*.rs.bk
1617
Cargo.lock.bk
1718

@@ -49,4 +50,16 @@ logs/
4950
.env
5051
.env.*
5152
.env.local
52-
*.local.yaml
53+
*.local.yaml
54+
55+
########################
56+
# Temporary / Junk #
57+
########################
58+
debug_*/
59+
tmp/
60+
temp/
61+
nul
62+
*.tmp
63+
*.bak
64+
implementation_plan.md
65+
task.md

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ tauri-build = { version = "2.0.0", features = [] }
3030
winres = "0.1"
3131

3232
[dependencies]
33+
service = { path = "./service" }
3334
serde = { version = "1.0", features = ["derive"] }
3435
serde_json = "1.0"
3536
serde_yaml = "0.9"

DEEP_TEARDOWN_REPORT.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# PromptKey Deep Teardown & Recovery Report
2+
3+
## 1. 核心问题扫描 (Problem Audit)
4+
5+
在实现 **PromptWheel** 的过程中,系统出现了严重的失稳,主要表现为:
6+
1. **Service 启动即崩溃**:日志显示 `os error 2`
7+
2. **GUI 启动 Sidecar 失败**:出现 `os error 50`
8+
3. **构建流程锁死**`cargo build` 频繁提示“拒绝访问”。
9+
10+
## 2. 深度拆解分析 (Architectural Root Causes)
11+
12+
### A. 命名管道服务端误用 (The IPC Socket Bug)
13+
- **现象**:Service 无法创建 `promptkey_inject` 管道。
14+
- **原因**:在将异步代码同步化的过程中,代码错误地使用了 `std::fs::OpenOptions`。在 Windows 上,`std::fs` 只能作为管道客户端,尝试打开一个不存在的管道服务端会导致 `os error 2` 或崩溃。
15+
- **影响**:后端注入功能彻底瘫痪,服务线程陷入死循环或退出。
16+
17+
### B. Sidecar 加载链路脆弱 (Path Resolution Fragility)
18+
- **现象**:GUI 报 `os error 50` (不支持该操作)。
19+
- **原因**`resolve_service_exe_path` 返回的是相对路径,且在 `Command::spawn` 时没有进行绝对路径转换。当 GUI 和 CWD 不一致时,路径失效。此外,`CREATE_NO_WINDOW` 标志在路径失效或二进制文件损坏时会抛出混淆的系统错误。
20+
- **影响**:GUI 无法可靠地拉起后端引擎。
21+
22+
### C. 僵尸进程与构建冲突 (Zombie Process Interference)
23+
- **现象**:构建报错 `Access Denied`
24+
- **原因**:之前的 Service 进程虽然逻辑崩溃,但句柄未释放,导致产生的 `.exe` 文件被锁定。连续的增量构建尝试在文件锁争用下失败。
25+
26+
## 3. 修复方案 (The Recovery Strategy)
27+
28+
1. **重构 IPC 服务端**:放弃原生 Win32 API 调用(易错),改用 `tokio` 的命名管道服务端,但在 Service 内部通过专用线程运行本地运行时。这保证了**服务端能力**的同时维持了主循环的**同步简洁性**
29+
2. **绝对化路径管理**:在 GUI 中引入 `std::fs::canonicalize`,确保传递给系统的命令路径永远是**绝对路径**
30+
3. **环境深度清理**:通过强制任务管理器级的 `taskkill`,扫除所有残留的 `promptkey``service` 实例。
31+
32+
## 4. 当前状态与后续建议
33+
34+
- **状态**:Service 编译已通过。GUI 正在进行最后的 Link 阶段。
35+
- **建议**
36+
- 启动时务必确认没有旧版图标留在托盘。
37+
- 使用 `Ctrl + Alt + Q` 作为轮盘唤起热键,避免与常用软件冲突。
38+
- 定期清理 `target` 目录以保持构建产物的纯净。

GUI_RENOVATION_GUIDE.md

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
# PromptKey GUI Renovation & Evolution Guide
2+
3+
## 1. 演进总结 (Evolution Summary)
4+
5+
我们从一个基础的 **"CRUD 管理后台"** 进化为了一个 **"现代化桌面生态系统"**
6+
7+
| 维度 | V1 初始状态 | V2 当前目标状态 | 核心差异 |
8+
| :--- | :--- | :--- | :--- |
9+
| **设计语言** | 通用 Admin 风格 (Light Theme, 朴素) | **Zinc/Slate 深色工业风** (匹配 PromptWheel) | 需要引入 `wheel.css` 中的 Zinc 色板变量,保证视觉一致性。 |
10+
| **数据结构** | 简单的 `name`, `content` | **复杂元数据** (`tags` 数组, `app_scopes`, `version`) | 前端表单需要支持 JSON 序列化和标签输入组件。 |
11+
| **交互模式** | 基础表单提交 | **富交互** (Tag 芯片, 应用范围选择器) | 需要更高级的 UI 组件来处理复杂字段。 |
12+
| **定位** | 简单的数据库编辑器 | **Prompt 工程控制台** | 界面需要体现"配置"和"规则"的专业感。 |
13+
14+
---
15+
16+
## 2. 视觉重构规范 (Visual Renovation)
17+
18+
主窗口 (`index.html`) 不需要像轮盘那样完全透明异形,但必须共享 **"PromptKey Design System"**
19+
20+
### 2.1 共享色板 (Shared Palette)
21+
请在 `styles.css` 中定义以下核心变量(提取自 `wheel.css`):
22+
23+
```css
24+
:root {
25+
/* Zinc Scale (Dark Mode Base) */
26+
--pk-bg-base: #09090b; /* Zinc 950 */
27+
--pk-bg-surface: #18181b; /* Zinc 900 */
28+
--pk-border: #27272a; /* Zinc 800 */
29+
--pk-text-primary: #fafafa; /* Zinc 50 */
30+
--pk-text-secondary: #a1a1aa;/* Zinc 400 */
31+
32+
/* Brand Colors */
33+
--pk-accent: #3b82f6; /* Modern Blue */
34+
--pk-danger: #ef4444;
35+
}
36+
37+
body {
38+
background-color: var(--pk-bg-base);
39+
color: var(--pk-text-primary);
40+
font-family: 'Inter', system-ui, sans-serif;
41+
}
42+
```
43+
44+
### 2.2 组件风格
45+
* **卡片/面板**:使用 subtle border (`1px solid var(--pk-border)`) 代替沉重的阴影。
46+
* **按钮**:扁平化,Hover 时轻微背景色变化,避免 3D/拟物感。
47+
* **输入框**:深色背景 (`--pk-bg-surface`),去边框或仅保留底部边框。
48+
49+
---
50+
51+
## 3. 功能模块改造 (Feature Updates)
52+
53+
根据 `service/src/db.rs` 的最新结构,**"管理提示词" (Prompts Panel)** 需要重大升级。
54+
55+
### 3.1 提示词数据结构变更
56+
后端 `Prompt` 结构已更新,前端必须同步适配:
57+
58+
| 字段名 | 旧版处理 | **新版需求 (V2)** | 前端改造点 |
59+
| :--- | :--- | :--- | :--- |
60+
| `tags` | 文本字符串 | **`Vec<String>` (JSON)** | **Tags Input 组件**:输入回车生成 Tag 芯片,提交时序列化为 `["tag1", "tag2"]`|
61+
| `app_scopes_json` || **`Option<String>` (JSON)** | **应用范围选择器**:允许用户输入目标 App 名称(如 `notepad.exe`),支持多选。 |
62+
| `inject_order` || **`Option<String>`** | **排序权重输入**:允许设置权重 (如 "10")。 |
63+
| `version` || **`i32`** | 只读展示,每次编辑自动 +1。 |
64+
65+
### 3.2 新增/编辑模态框 (Modal Renovation)
66+
现有的简单表单必须重写,布局建议:
67+
68+
* **Header**: 标题 + 快捷操作。
69+
* **Body (双栏布局)**:
70+
* **左栏 (Content)**: 大面积的 `textarea`,支持语法高亮(未来),用于编辑 Prompt 内容。
71+
* **右栏 (Metadata)**:
72+
* **Name**: 提示词名称。
73+
* **Tags**: 交互式 Tag 输入。
74+
* **App Scopes**: "生效应用" (如 `chrome.exe`)。
75+
* **Variables**: 变量定义 (JSON)。
76+
* **Footer**: 取消/保存按钮。
77+
78+
---
79+
80+
## 4. 前端助手任务清单 (Tasks for Frontend Assistant)
81+
82+
请将此清单交给前端助手执行:
83+
84+
1. **样式同步 (`styles.css`)**:
85+
- [ ] 废弃旧的 `theme-light`,全面切换到 **Zinc Dark Theme**
86+
- [ ] 引入 `wheel.css` 中的变量,确保主窗口和轮盘视觉一致。
87+
2. **JS 逻辑升级 (`main_simple.js`)**:
88+
- [ ] 更新 `fetchPrompts``savePrompt` 逻辑,处理 Rust 后端新的 JSON 字段 (`tags`, `app_scopes_json`)。
89+
- [ ] 如果 `tags` 从后端拿到是 JSON string,前端需要 `JSON.parse()` 转为数组显示。
90+
3. **UI 组件开发**:
91+
- [ ] 实现一个轻量级的 **Tags Input** (输入文本 -> 回车 -> 生成可删除的 `<span>` 标签)。
92+
- [ ] 优化列表页展示:在列表中显示 Tags 芯片,而不仅仅是文本。
93+
94+
---
95+
96+
**核心口号**:让管理后台配得上那个漂亮的轮盘。

STARTUP_GUIDE.md

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
# PromptKey 启动与调试指南
2+
3+
## 🚀 正确启动步骤(确保使用最新构建)
4+
5+
### 方案 A:完整重新构建(推荐)
6+
```bash
7+
# 1. 先杀掉所有旧进程
8+
taskkill /F /IM service.exe 2>nul
9+
taskkill /F /IM promptkey.exe 2>nul
10+
11+
# 2. 重新构建 Service
12+
cd d:\PROJECTALL\Workflow\PromptKey
13+
cargo build --release -p service
14+
15+
# 3. 复制到 sidecar(供 GUI 启动用)
16+
cp target/release/service.exe sidecar/service-x86_64-pc-windows-msvc.exe
17+
18+
# 4. 构建并运行 GUI
19+
cargo run --release
20+
```
21+
22+
### 方案 B:快速测试(分开运行,便于看日志)
23+
```bash
24+
# Terminal 1: 单独运行 Service(可以看到详细日志)
25+
cd d:\PROJECTALL\Workflow\PromptKey
26+
$env:RUST_LOG="info"
27+
./target/release/service.exe
28+
29+
# Terminal 2: 运行 GUI(注释掉 src/main.rs 中的 ServiceState 启动代码)
30+
cargo run --release
31+
```
32+
33+
## 🔍 诊断检查清单
34+
35+
### 1. 确认 Service 版本正确
36+
运行 Service 后查看日志开头,应该看到:
37+
```
38+
[INFO] Configuration loaded successfully
39+
[WARN] ⚠️ Configured hotkey 'Ctrl+Shift+H' conflicts with Selector Panel. Resetting...
40+
```
41+
42+
如果看到这个警告,说明配置自愈生效了!
43+
44+
### 2. 确认 IPC 通道建立
45+
运行 GUI 后查看日志,应该看到:
46+
```
47+
[IPC] Starting listener on \\.\pipe\promptkey_selector
48+
```
49+
50+
### 3. 测试热键
51+
按下 `Ctrl+Shift+H`,Service 日志应该显示:
52+
```
53+
[INFO] Selector hotkey detected (ID=3), sending IPC to GUI
54+
[INFO] IPC: Sent SHOW_SELECTOR to GUI via \\.\pipe\promptkey_selector
55+
```
56+
57+
GUI 日志应该显示:
58+
```
59+
[IPC] Received: SHOW_SELECTOR
60+
[IPC] Selector window shown via IPC
61+
```
62+
63+
## 🐛 如果还是"直接粘贴"
64+
65+
### 问题1:配置冲突未解决
66+
**症状**:日志显示 `Injection hotkey detected (ID=1 or 2)`
67+
**原因**`%APPDATA%\PromptKey\config.yaml``hotkey: Ctrl+Shift+H`
68+
**解决**
69+
```bash
70+
# 删除配置文件,强制重新生成
71+
del "%APPDATA%\PromptKey\config.yaml"
72+
```
73+
74+
### 问题2:旧 Service 进程未杀干净
75+
**症状**:重启后行为没变化
76+
**检查**
77+
```bash
78+
tasklist | findstr service
79+
```
80+
**解决**
81+
```bash
82+
taskkill /F /IM service.exe
83+
```
84+
85+
### 问题3:IPC 通道未建立
86+
**症状**:日志有 "Failed to send selector IPC" 或 "Failed to open named pipe"
87+
**原因**:GUI 的 IPC Listener 未启动或崩溃
88+
**检查**:GUI 日志中搜索 "[IPC]"
89+
**解决**:确认 `src/ipc_listener.rs` 存在并在 `src/main.rs` 中正确注册
90+
91+
## 📝 当前状态
92+
93+
**已完成**
94+
- IPC Listener 已实现(`src/ipc_listener.rs`
95+
- 配置自愈已添加(`service/src/main.rs`
96+
- Service 二进制已更新(09:08 构建)
97+
- Sidecar 已更新
98+
99+
**待验证**
100+
- 确认新 Service 进程启动
101+
- 确认 IPC 通道连接成功
102+
- 确认 `Ctrl+Shift+H` 触发 Selector
103+
104+
## 🎯 预期行为
105+
106+
正确配置后:
107+
1. **Ctrl+Alt+Space** → 直接粘贴当前选中的 Prompt(注入模式)
108+
2. **Ctrl+Shift+H** → 弹出选择面板(新功能)
109+
110+
## 📊 日志级别设置
111+
112+
如果需要更详细的调试日志:
113+
```bash
114+
# Service
115+
$env:RUST_LOG="debug"
116+
./target/release/service.exe
117+
118+
# GUI (在 .cargo/config.toml 或环境变量)
119+
$env:RUST_LOG="debug"
120+
cargo run --release
121+
```
122+
123+
---
124+
125+
**最后提醒**:每次修改代码后,必须:
126+
1. 重新 `cargo build --release -p service`
127+
2. 复制到 `sidecar/`
128+
3. 杀掉旧 `service.exe` 进程
129+
4. 重新运行 `cargo run --release`

0 commit comments

Comments
 (0)