diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..770189e --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,59 @@ +# AGENTS.md + +> Codex / AI coding agent 的仓库级入口。进入本仓库后,先读本文,再进入 `docs/00-ai-start-here.md`。 + +## 项目定位 + +`cmbone` 是从 `SuiDemo` 迁移而来的 Wails v3 本地桌面项目。当前目标不是继续堆功能,而是保持一个简单、清晰、初级程序员可维护的 Wails + Vue + SQLite 应用骨架。 + +项目当前已具备: + +- Wails v3 桌面壳和前端嵌入。 +- Vue 3 设置页、多语言、主题切换。 +- 本地 SQLite 配置和热键表。 +- 托盘菜单、快捷键、OCR 示例窗口。 + +## 必读顺序 + +每次开始工作前,按顺序读取: + +1. `README.md`:了解项目运行、构建和维护约定。 +2. `docs/README.md`:了解 Harness Coding 文档导航。 +3. `docs/00-ai-start-here.md`:进入固定开工流程。 +4. `docs/05-coding-rules.md`:确认编码纪律。 +5. `docs/current-state.md`:确认当前真实状态。 +6. `progress.md`:查看最近验证结果和决策。 +7. 与当前任务相关的具体文档。 + +## 工作规则 + +- 只做当前任务要求的改动,不夹带重构、依赖升级或产品扩展。 +- 保持 Go `1.23.0`、Wails `v3.0.0-alpha.9`、`@wailsio/runtime 3.0.0-alpha.66` 的兼容关系;不要直接升级到 latest。 +- 不提交 `bin/`、`frontend/dist/`、`frontend/node_modules/` 等构建产物或依赖目录。 +- 后端服务方法变更后,优先使用 `wails3 generate bindings` 重新生成 `frontend/bindings`;如果本机没有 CLI,只允许小范围手动修正并在 `progress.md` 记录原因。 +- 涉及存储结构时,同步更新 `docs/04-architecture.md`、`docs/api.md`、`docs/current-state.md` 和相关任务验收。 +- 提交前至少运行 `go test ./...`、`cd frontend && npm run build`、`go build -o bin/cmbone.exe .`。 + +## 风格 + +- 文档默认中文,代码标识符默认英文。 +- 优先复用现有服务、组件和工具函数。 +- 错误必须处理,不吞错。 +- 注释只解释不明显的原因,不复述代码。 +- 新增抽象必须能减少真实复杂度,否则保持直接实现。 + +## 验证入口 + +Windows 原生 PowerShell 使用: + +```powershell +.\init.ps1 +``` + +Git Bash / WSL / macOS / Linux 使用: + +```bash +./init.sh +``` + +脚本会安装前端依赖、运行后端测试、构建前端、编译后端,并打印开发启动命令。 diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..1d32ddf --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,13 @@ +# CLAUDE.md + +本仓库的 AI coding agent 规则以 [`AGENTS.md`](AGENTS.md) 为准。 + +开始任何任务前,先读取: + +1. `AGENTS.md` +2. `docs/00-ai-start-here.md` +3. `docs/05-coding-rules.md` +4. `docs/current-state.md` +5. `progress.md` + +不要绕过这些文件直接修改代码。 diff --git a/README.md b/README.md index 4d15a08..bea5b8b 100644 --- a/README.md +++ b/README.md @@ -62,3 +62,19 @@ wails3 package - 当前依赖按系统 Go 1.23.0 锁定,升级 Go 前不要随意升级 Wails、SQLite 或热键库。 - 修改后端服务后,优先使用 `wails3 generate bindings` 重新生成 `frontend/bindings`;如果本机没有 CLI,只做小范围手动绑定。 - 提交前至少运行 `go test ./...` 和 `npm run build`。 + +## Harness Coding 文档 + +本项目已接入 Harness Coding 文档,用于让后续维护者和 AI coding agent 快速恢复上下文、领取任务并验证改动。 + +- [`AGENTS.md`](AGENTS.md):仓库级 agent 入口。 +- [`docs/00-ai-start-here.md`](docs/00-ai-start-here.md):固定开工流程。 +- [`docs/current-state.md`](docs/current-state.md):当前真实状态和命令。 +- [`docs/06-tasks.md`](docs/06-tasks.md):任务看板。 +- [`progress.md`](progress.md):执行流水和验证证据。 + +统一验证入口: + +```powershell +.\init.ps1 +``` diff --git a/docs/00-ai-start-here.md b/docs/00-ai-start-here.md new file mode 100644 index 0000000..e58cfa1 --- /dev/null +++ b/docs/00-ai-start-here.md @@ -0,0 +1,95 @@ +# AI 开发入口 + +> 给 AI coding agent 的项目入口。硬性编码规则见 [`05-coding-rules.md`](05-coding-rules.md)。 + +## 一句话定位 + +`cmbone` 是一个 Wails v3 + Vue 3 + SQLite 的本地桌面应用骨架,当前重点是保持可运行、可构建、可维护。 + +第一版 MVP 只做:桌面主窗口、设置页、多语言、主题、本地配置、热键、托盘和 OCR 示例窗口的稳定闭环。 + +## 必读顺序 + +每次开始写代码前,按这个顺序建立上下文: + +1. [`01-vision.md`](01-vision.md):为什么做、为谁做、什么不做。 +2. [`02-requirements.md`](02-requirements.md):MVP 要什么、怎么算达成。 +3. [`03-tech-stack.md`](03-tech-stack.md):既定技术选型。 +4. [`04-architecture.md`](04-architecture.md):系统结构、职责划分、数据模型和关键难点。 +5. [`05-coding-rules.md`](05-coding-rules.md):写代码前必须遵守的规则。 +6. [`06-tasks.md`](06-tasks.md):领取本轮唯一任务。 +7. [`../progress.md`](../progress.md):历史执行记录、验证结果、阻塞点和关键决策。 +8. [`current-state.md`](current-state.md):当前代码现实、可运行命令、下一步任务。 + +仓库根目录的 `AGENTS.md` 和 `CLAUDE.md` 是仓库级规则,优先级高于本目录中的建议。 + +## 固定开工流程 + +1. `pwd`:确认在 `D:\chengma\cmbone` 或对应克隆目录。 +2. 读 [`../progress.md`](../progress.md) 和 [`current-state.md`](current-state.md):恢复已验证状态、下一步和当前 blocker。 +3. `git log --oneline -5`:看清最近发生了什么。 +4. 运行 `.\init.ps1`,Git Bash / WSL 用 `./init.sh`。 +5. 如果基线失败,先修基线,不在坏的起点上叠新功能。 +6. 基线绿了,再从 [`06-tasks.md`](06-tasks.md) 领取唯一任务。 + +## 当前阶段 + +当前项目处于:MVP 基线整理与文档接入阶段。 + +优先路径: + +1. Phase 0:保持可运行、可测试、可构建。 +2. Phase 1:收敛 Wails 服务、前端绑定和本地存储边界。 +3. Phase 2:完善主窗口和第二窗口的真实用户流程。 +4. Phase 3:补齐最小测试和发布文档。 + +## 领取任务规则 + +- 只领取第一个状态为 `TODO` 且依赖均为 `DONE` 的任务。 +- 开始前把该任务状态改为 `DOING`。 +- 本轮只完成这一个任务。 +- 验收通过后把状态改为 `DONE`。 +- 完成后把执行记录追加到 [`../progress.md`](../progress.md),并覆盖更新 [`current-state.md`](current-state.md) 的当前快照。 +- 结束会话前过一遍 [`clean-state-checklist.md`](clean-state-checklist.md)。 + +## MVP 边界 + +MVP 只做: + +- 主窗口能启动并展示设置、快捷键、标签、关于等基础页面。 +- 本地 SQLite 能初始化并保存配置和热键。 +- 托盘菜单、语言切换、主题切换、快捷键和第二窗口能按现有设计工作。 +- 前端构建、后端测试和后端编译保持通过。 + +MVP 不做: + +- 云端账号、同步、付费和远程 API。 +- 复杂任务管理或业务工作流。 +- 未确认产品方向前的大型 UI 重构。 +- 未验证兼容性的 Wails / Go / Vite 大版本升级。 + +## 常见任务该看哪里 + +做页面 / UI:先看 [`02-requirements.md`](02-requirements.md)、[`routes.md`](routes.md),再看现有 Vue 组件。 + +做后端服务:先看 [`api.md`](api.md)、[`04-architecture.md`](04-architecture.md),再看 `internal/services/`。 + +做数据模型:先看 [`04-architecture.md`](04-architecture.md),改 schema 后必须同步更新相关文档和测试。 + +做运行 / 打包:先看 [`03-tech-stack.md`](03-tech-stack.md) 和 [`current-state.md`](current-state.md)。 + +## 验证命令 + +```powershell +.\init.ps1 +``` + +等价拆分命令: + +```powershell +go test ./... +cd frontend +npm run build +cd .. +go build -o bin\cmbone.exe . +``` diff --git a/docs/01-vision.md b/docs/01-vision.md new file mode 100644 index 0000000..03e65da --- /dev/null +++ b/docs/01-vision.md @@ -0,0 +1,39 @@ +# 项目愿景 + +## 项目目标 + +`cmbone` 的目标是提供一个简单、可维护的 Wails v3 桌面应用基础工程,让后续功能可以在稳定的 Go 后端、Vue 前端和本地 SQLite 存储上继续演进。 + +当前最重要的结果是: + +- 新成员能按 README 和 Harness Coding 文档启动项目。 +- 初级程序员能看懂目录职责和常用命令。 +- 每次改动都有明确任务、验证命令和提交记录。 + +## 目标用户 + +- 项目维护者:需要快速判断当前状态、任务边界和验证方式。 +- 初级前端 / 后端程序员:需要沿着清晰模块做小范围改动。 +- AI coding agent:需要稳定的上下文入口、任务看板和质量规则。 + +## 产品方向 + +短期方向是桌面工具壳和设置中心: + +- 主窗口负责常驻设置、快捷键和信息展示。 +- 第二窗口用于快捷打开轻量功能,如 OCR 示例。 +- 后端服务负责平台能力、本地配置和数据持久化。 + +## 非目标 + +- 现在不做云端账号、远程同步、复杂权限、支付或 SaaS 化。 +- 现在不把项目改造成大型前端单页应用。 +- 现在不引入 Electron、Tauri 或其他桌面框架替代 Wails。 +- 现在不追逐 latest 依赖版本,优先保持当前 Go 1.23.0 可构建。 + +## 成功标准 + +- 文档、目录、命令和代码事实一致。 +- `.\init.ps1` 可以完成依赖安装、测试、前端构建和后端编译。 +- 新增功能能落在明确模块内,不需要跨多层猜测。 +- 提交历史能看出每次改动的意图和验证结果。 diff --git a/docs/02-requirements.md b/docs/02-requirements.md new file mode 100644 index 0000000..abc80a6 --- /dev/null +++ b/docs/02-requirements.md @@ -0,0 +1,45 @@ +# 需求说明 + +## MVP 范围 + +### P0 · 必须保持 + +- 应用能启动 Wails 主窗口,并加载嵌入的 `frontend/dist` 资源。 +- 主窗口包含 Dashboard、General、Shortcut、Tags、About 等现有区域。 +- 多语言资源能从 `frontend/src/locales/*.json` 加载,并能通过 UI / 服务切换。 +- 主题配置能保存到本地 SQLite 并在前端生效。 +- 快捷键配置能从数据库读取、更新,并注册到系统热键层。 +- 托盘菜单能执行显示、隐藏、语言切换和退出等基础动作。 +- 第二窗口能通过热键或服务打开,承载 OCR 示例页面。 +- `go test ./...`、`npm run build`、`go build -o bin/cmbone.exe .` 通过。 + +### P1 · 近期增强 + +- 明确主窗口默认大小、最大化策略和自适应布局规则。 +- 补齐热键服务、配置服务、存储迁移的边界测试。 +- OCR 失败时给出可理解的前端反馈。 +- 文档化 Wails bindings 生成流程。 + +### P2 · 后续再做 + +- 发布安装包和自动更新。 +- 更完整的系统通知能力。 +- 可配置插件或更多工具模块。 +- 业务化功能闭环。 + +## 验收标准 + +每个任务完成前至少满足: + +- 相关代码已格式化。 +- 相关单元测试或构建命令通过。 +- 前端页面在目标窗口尺寸下没有明显溢出或不可用控件。 +- 文档中的命令、版本、接口和当前代码一致。 +- `progress.md` 记录了本次验证命令和结果。 + +## 约束 + +- 当前 Go 版本为 `1.23.0`。 +- Wails 版本固定为 `v3.0.0-alpha.9`。 +- 前端 runtime 固定为 `@wailsio/runtime 3.0.0-alpha.66`。 +- 不提交 `node_modules`、`dist`、`bin`、本地数据库或用户配置。 diff --git a/docs/03-tech-stack.md b/docs/03-tech-stack.md new file mode 100644 index 0000000..5d4cf14 --- /dev/null +++ b/docs/03-tech-stack.md @@ -0,0 +1,96 @@ +# 技术栈 + +## 后端 + +- Go:`1.23.0` +- 桌面框架:`github.com/wailsapp/wails/v3 v3.0.0-alpha.9` +- 本地数据库:`modernc.org/sqlite v1.38.2` +- 系统热键:`golang.design/x/hotkey v0.4.1` + +Wails CLI 安装命令: + +```powershell +go install github.com/wailsapp/wails/v3/cmd/wails3@v3.0.0-alpha.9 +``` + +不要直接安装 `wails3@latest`,避免 CLI、Go SDK 和前端 runtime 版本不匹配。 + +## 前端 + +- Vue:`^3.2.45` +- TypeScript:`^4.9.3` +- Vite:`^8.1.3` +- Wails runtime:`@wailsio/runtime 3.0.0-alpha.66` +- UI:Ant Design Vue `^4.2.6` +- 样式:Tailwind CSS `^3.4.1` +- 国际化:Vue I18n `^11.1.5` + +## 目录职责 + +```text +. +├── main.go # Wails 应用入口、服务注册、资源嵌入 +├── internal/ +│ ├── models/ # 数据模型 +│ └── services/ # Wails 服务、配置、数据库、热键、OCR +├── platform/ # Windows / macOS 平台差异实现 +├── frontend/ +│ ├── src/ # Vue 源码 +│ ├── bindings/ # Wails 生成的前端绑定 +│ └── dist/ # 前端构建产物,git 忽略 +├── build/ # Wails 打包配置 +└── docs/ # Harness Coding 文档 +``` + +## 常用命令 + +安装前端依赖: + +```powershell +cd frontend +npm install +``` + +后端测试: + +```powershell +go test ./... +``` + +前端构建: + +```powershell +cd frontend +npm run build +``` + +后端编译: + +```powershell +go build -o bin\cmbone.exe . +``` + +统一验证入口: + +```powershell +.\init.ps1 +``` + +开发启动: + +```powershell +wails3 dev +``` + +打包: + +```powershell +wails3 package +``` + +## 版本升级规则 + +- 升级 Go 前,先确认 Wails v3 alpha、SQLite 和热键库的兼容性。 +- 升级 Wails 后,同时检查 `@wailsio/runtime` 和 `frontend/bindings`。 +- 升级 Vite / TypeScript 后,必须跑 `npm run build`。 +- 依赖升级必须单独提交,不和业务功能混在一起。 diff --git a/docs/04-architecture.md b/docs/04-architecture.md new file mode 100644 index 0000000..9348697 --- /dev/null +++ b/docs/04-architecture.md @@ -0,0 +1,97 @@ +# 架构设计 + +## 总览 + +```text +main.go + ├─ Wails application + ├─ embedded frontend/dist + ├─ embedded frontend/src/locales/*.json + └─ services + ├─ AppService + ├─ AppConfigService + ├─ HotkeyService + ├─ SystemInfo + └─ OCRService + +frontend/src + ├─ router + ├─ components + ├─ pages + ├─ utils + └─ locales +``` + +前端通过 `frontend/bindings` 调用 Wails 暴露的 Go 服务。后端服务访问本地 SQLite、平台热键和系统能力。 + +## 后端边界 + +- `main.go`:只负责应用组装、资源嵌入、服务注册和启动。 +- `internal/models/`:定义数据库和服务返回的结构体。 +- `internal/services/store.go`:负责 SQLite 连接、迁移和基础读写。 +- `internal/services/appservice.go`:负责窗口、托盘、语言资源和应用生命周期。 +- `internal/services/appconfig_service.go`:负责配置读写的 Wails 服务边界。 +- `internal/services/hotkey_service.go`:负责热键读取、更新和重新注册。 +- `internal/services/ocr_service.go`:负责 OCR 服务入口。 +- `platform/`:隔离 Windows / macOS 热键和系统能力差异。 + +服务之间不要互相绕过边界直接操作平台实现。新增平台能力时,优先放在 `platform/`,再由 `internal/services/` 暴露稳定方法。 + +## 前端边界 + +- `frontend/src/router/index.ts`:只维护页面路由。 +- `frontend/src/components/Main/Index.vue`:主窗口布局入口。 +- `frontend/src/components/Setting/`:设置项和通用设置控件。 +- `frontend/src/components/Shortcut/`:快捷键设置。 +- `frontend/src/pages/Home/Index.vue`:第二窗口 / OCR 页面。 +- `frontend/src/utils/`:国际化、主题、OS 和热键工具函数。 +- `frontend/bindings/`:由 Wails 生成或按 Wails 合约维护,不写业务逻辑。 + +## 数据模型 + +SQLite 数据库位于用户配置目录下的 `cmbone/cmbone.db`,不进入 git。 + +当前核心表: + +```sql +hotkeys( + id INTEGER PRIMARY KEY, + keycode INTEGER, + modifiers INTEGER, + description TEXT, + target TEXT +) +``` + +```sql +appconfig( + id INTEGER PRIMARY KEY, + key TEXT, + type TEXT, + value TEXT, + description TEXT, + state INTEGER +) +``` + +迁移要求: + +- 初始化必须幂等。 +- 新字段必须有默认值或迁移逻辑。 +- schema 变化必须同步 `store_test.go`、`api.md` 和 `current-state.md`。 + +## 窗口与事件 + +- 主窗口路由:`/#/` +- 第二窗口路由:`/#/second` +- 托盘菜单由 `AppService` 配置。 +- 热键触发目标当前包含打开第二窗口。 + +窗口策略应保持简单:主窗口负责配置和信息,第二窗口负责轻量快捷功能。不要把长期复杂流程塞入第二窗口。 + +## 关键风险 + +- Wails v3 仍是 alpha,CLI、Go 模块和 runtime 必须保持匹配。 +- bindings 若与 Go 服务签名不一致,前端会在运行时失败。 +- OCR 和热键依赖平台能力,跨平台修改必须分别验证。 +- Vite 构建可能出现 chunk size warning,警告不等于失败,但需要避免无节制增加前端体积。 diff --git a/docs/05-coding-rules.md b/docs/05-coding-rules.md new file mode 100644 index 0000000..5623abc --- /dev/null +++ b/docs/05-coding-rules.md @@ -0,0 +1,63 @@ +# 编码规则 + +> 每次写代码前先读完本文件。与技术细节冲突时,以 [`03-tech-stack.md`](03-tech-stack.md) 和 [`04-architecture.md`](04-architecture.md) 为准。 + +## 黄金法则 + +1. 不臆造:字段、接口、依赖和文件必须来自当前代码或文档。 +2. 守范围:只做当前任务,不顺手加后续功能。 +3. 照架构:使用既有 Wails、Vue、SQLite、平台模块边界。 +4. 小步改:一次解决一个问题,不夹带无关重构。 +5. 可验证:完成前必须测试或构建通过。 + +## 动手前 + +- 先读 `AGENTS.md`、`00-ai-start-here.md`、`current-state.md` 和当前任务。 +- 查找现有函数、组件、工具和测试,复用优先。 +- 需求不清或会影响架构时,先说明问题再决定。 +- 不确定 Wails API 时,优先看本项目现有代码和已锁版本,不直接按最新文档改。 + +## 代码规范 + +- Go 代码用 `gofmt`。 +- TypeScript / Vue 保持当前项目风格。 +- 错误必须返回或展示,不静默吞掉。 +- 后端服务方法签名变化必须同步前端 bindings。 +- 前端 UI 文案走现有 i18n 体系,避免新增硬编码中文/英文。 +- 新依赖必须说明必要性;能用标准库或现有依赖解决时不新增。 + +## 模块规则 + +- `main.go` 不写业务逻辑。 +- SQLite 读写集中在 store 或明确服务层,不散落到多个模块。 +- 平台差异放在 `platform/`。 +- 前端 bindings 不承载业务逻辑。 +- 通用 UI 组件保持小而直接,不为未来需求提前抽象。 + +## 验证要求 + +代码改动完成前至少运行相关命令: + +```powershell +go test ./... +cd frontend +npm run build +cd .. +go build -o bin\cmbone.exe . +``` + +推荐直接运行: + +```powershell +.\init.ps1 +``` + +验证失败时,不要标记任务完成。无法运行时,必须在回复和 `progress.md` 里写清原因。 + +## 绝不 + +- 不提交密钥、token、密码、本地数据库或用户配置。 +- 不提交 `node_modules`、`frontend/dist`、`bin`。 +- 不用删除测试、降低断言的方式制造通过。 +- 不擅自 reset、checkout 或删除用户未要求删除的文件。 +- 不把依赖升级和功能改动混在同一个任务里。 diff --git a/docs/06-tasks.md b/docs/06-tasks.md new file mode 100644 index 0000000..4e75f81 --- /dev/null +++ b/docs/06-tasks.md @@ -0,0 +1,51 @@ +# 任务看板 + +> 单 agent / 小项目使用本文件。多 agent 并发时,改用 [`tasks/README.md`](tasks/README.md) 的一任务一文件规则。 + +## 使用规则 + +1. 一次只做一个任务:领取第一个状态为 `TODO` 且依赖均为 `DONE` 的任务。 +2. 开始后把状态改为 `DOING`。 +3. 完成并验证后把状态改为 `DONE`。 +4. 任务完成必须在 [`../progress.md`](../progress.md) 写入验证命令和结果。 +5. 完成后更新 [`current-state.md`](current-state.md),并过一遍 [`clean-state-checklist.md`](clean-state-checklist.md)。 + +## 状态图例 + +`TODO` 待开始 · `DOING` 进行中 · `DONE` 已完成并验收 · `BLOCKED` 受阻 + +## Phase 0 · 基线 + +| ID | 任务 | 依赖 | 验收要点 | 状态 | +| --- | --- | --- | --- | --- | +| T-000 | 接入 Harness Coding 文档 | - | `AGENTS.md`、`docs/`、`progress.md`、`init.ps1`、`init.sh` 已创建;README 已登记入口;统一验证通过 | DONE | +| T-001 | 验证迁移后构建基线 | T-000 | `go test ./...`、`npm run build`、`go build -o bin/cmbone.exe .` 通过 | DONE | + +## Phase 1 · 近期维护 + +| ID | 任务 | 依赖 | 验收要点 | 状态 | +| --- | --- | --- | --- | --- | +| T-010 | 梳理主窗口最大化与自适应布局策略 | T-001 | 明确是否默认最大化;主内容区域能填满空余空间;移动/小窗口尺寸下无明显溢出;更新 `routes.md` 或架构说明 | TODO | +| T-011 | 文档化 Wails bindings 生成流程 | T-001 | README 或技术栈文档说明 `wails3 generate bindings` 的使用、失败处理和版本要求 | TODO | +| T-012 | 增加前端最小质量检查 | T-001 | 前端至少保留 `npm run build`;如新增 lint/test,命令写入 `package.json` 和文档 | TODO | + +## Phase 2 · 服务边界 + +| ID | 任务 | 依赖 | 验收要点 | 状态 | +| --- | --- | --- | --- | --- | +| T-020 | 补强 SQLite 初始化测试 | T-001 | `store_test.go` 覆盖默认配置和热键初始化;`go test ./...` 通过 | TODO | +| T-021 | 收敛热键服务错误处理 | T-020 | 注册失败、更新失败和重复注册路径有明确错误返回或日志 | TODO | +| T-022 | 完善 OCR 失败反馈 | T-001 | OCR 失败时前端能展示可理解提示;后端错误不被吞掉 | TODO | + +## Phase 3 · 发布准备 + +| ID | 任务 | 依赖 | 验收要点 | 状态 | +| --- | --- | --- | --- | --- | +| T-030 | 补充 Windows 打包验证文档 | T-011 | `wails3 package` 前置条件、输出目录和常见失败处理写入 README 或 docs | TODO | +| T-031 | 完成一次人工 smoke 清单 | T-010 | 主窗口、第二窗口、语言、主题、热键、托盘都按清单验证并记录结果 | TODO | + +## Backlog + +- 梳理应用真实产品方向和名称。 +- 评估是否需要 Playwright / Vitest 覆盖前端关键页面。 +- 评估是否需要平台能力降级策略。 diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..b723577 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,27 @@ +# Harness Coding 文档导航 + +本目录用于让后续 AI coding agent 和初级维护者快速恢复上下文、领取任务、验证改动。 + +## 必读入口 + +- [`00-ai-start-here.md`](00-ai-start-here.md):AI 开发入口和固定开工流程。 +- [`01-vision.md`](01-vision.md):产品目标、用户和非目标。 +- [`02-requirements.md`](02-requirements.md):MVP 范围和验收标准。 +- [`03-tech-stack.md`](03-tech-stack.md):真实技术栈、版本和命令。 +- [`04-architecture.md`](04-architecture.md):模块边界、数据流和风险点。 +- [`05-coding-rules.md`](05-coding-rules.md):编码规则和验证纪律。 +- [`06-tasks.md`](06-tasks.md):当前任务看板。 + +## 辅助文档 + +- [`api.md`](api.md):Wails 服务方法和本地模块合约。 +- [`routes.md`](routes.md):前端路由和页面职责。 +- [`current-state.md`](current-state.md):当前可运行状态、命令和下一步。 +- [`clean-state-checklist.md`](clean-state-checklist.md):交接前清理检查。 +- [`method-map.md`](method-map.md):关键方法和文件索引。 +- [`quality-document.md`](quality-document.md):质量分层和风险登记。 +- [`evaluator-rubric.md`](evaluator-rubric.md):评估标准。 +- [`adoption-checklist.md`](adoption-checklist.md):Harness Coding 接入检查。 +- [`tasks/README.md`](tasks/README.md):多 agent 时的一任务一文件规则。 + +根目录 [`../progress.md`](../progress.md) 记录历史执行流水和验证证据。 diff --git a/docs/adoption-checklist.md b/docs/adoption-checklist.md new file mode 100644 index 0000000..1d36be5 --- /dev/null +++ b/docs/adoption-checklist.md @@ -0,0 +1,19 @@ +# Harness Coding 接入检查 + +## 已完成 + +- [x] 添加 `AGENTS.md` 作为仓库级 AI 入口。 +- [x] 添加 `CLAUDE.md` 指向仓库级规则。 +- [x] 添加 `docs/00-ai-start-here.md` 作为固定开工流程。 +- [x] 添加愿景、需求、技术栈、架构、编码规则和任务看板。 +- [x] 添加 API、路由、当前状态、质量、评估和清理检查文档。 +- [x] 添加 `progress.md` 执行流水。 +- [x] 添加 `init.ps1` 和 `init.sh` 统一验证入口。 +- [x] README 已登记 Harness Coding 文档入口。 + +## 后续维护 + +- [ ] 每次任务完成后更新 `progress.md`。 +- [ ] 每次状态变化后更新 `docs/current-state.md`。 +- [ ] 每次接口、路由、schema 改动后同步相关文档。 +- [ ] 每次提交前确认 `git status --short` 只包含本任务文件。 diff --git a/docs/api.md b/docs/api.md new file mode 100644 index 0000000..e137e9a --- /dev/null +++ b/docs/api.md @@ -0,0 +1,71 @@ +# API 与模块合约 + +> 本项目没有远程 HTTP API。这里记录 Wails 暴露给前端的 Go 服务方法和本地模块约定。 + +## AppService + +文件:`internal/services/appservice.go` + +- `OpenSecondWindow()`:打开或显示第二窗口。 +- `SetLanguage(lang string) error`:切换应用语言,并刷新相关菜单/状态。 + +约束: + +- 窗口创建、显示、隐藏和托盘菜单逻辑集中在 `AppService`。 +- 语言资源来自 `frontend/src/locales/*.json` 的嵌入文件。 + +## AppConfigService + +文件:`internal/services/appconfig_service.go` + +- `GetAppConfig(key string) (string, error)`:读取配置值。 +- `SetAppConfig(key string, value string) error`:保存配置值。 +- `GetLanguage() string`:读取当前语言。 +- `SetLanguage(lang string) error`:保存当前语言。 + +约束: + +- 配置持久化走 SQLite `appconfig` 表。 +- 新增配置项时,必须有默认值和迁移逻辑。 + +## HotkeyService + +文件:`internal/services/hotkey_service.go` + +- `GetHotkeys() ([]models.Hotkey, error)`:读取热键配置。 +- `UpHotkey(id int, key int, modifier int) error`:更新热键配置并重新注册。 + +约束: + +- 热键数据来自 SQLite `hotkeys` 表。 +- 平台注册通过 `platform/` 实现,服务层不直接写平台细节。 +- 更新失败时必须返回错误,不只打印日志。 + +## SystemInfo + +文件:`internal/services/systeminfo.go` + +- `GetOS() string`:返回当前系统标识。 + +## OCRService + +文件:`internal/services/ocr_service.go` + +- `RecognizeImageBase64(base64str string) (string, error)`:识别 base64 图片内容。 + +约束: + +- 失败时返回错误给前端。 +- 平台依赖或能力缺失时,不应导致主窗口不可启动。 + +## 前端绑定 + +绑定目录:`frontend/bindings/cmbone/internal/services` + +服务签名变化后优先执行: + +```powershell +wails3 generate bindings +``` + +如果本地无法生成 bindings,只允许根据现有绑定模式做最小修正,并在 `progress.md` 写清原因和验证结果。 diff --git a/docs/clean-state-checklist.md b/docs/clean-state-checklist.md new file mode 100644 index 0000000..b14d677 --- /dev/null +++ b/docs/clean-state-checklist.md @@ -0,0 +1,30 @@ +# Clean State Checklist + +每轮结束前检查,确保下一位维护者可以直接接手。 + +## 代码与文档 + +- [ ] 当前任务只改了必要文件。 +- [ ] 没有夹带依赖升级或无关重构。 +- [ ] README、docs、API、路由、架构和实际代码一致。 +- [ ] 任务状态已更新。 +- [ ] `progress.md` 已记录验证命令和结果。 +- [ ] `current-state.md` 已更新当前状态和下一步。 + +## 构建与测试 + +- [ ] `go test ./...` 通过,或已记录失败原因。 +- [ ] `cd frontend && npm run build` 通过,或已记录失败原因。 +- [ ] `go build -o bin/cmbone.exe .` 通过,或已记录失败原因。 +- [ ] 涉及 UI 时,已人工检查目标窗口尺寸。 + +## Git + +- [ ] `git status --short` 中只包含本任务相关文件。 +- [ ] 未提交 `bin/`、`frontend/dist/`、`frontend/node_modules/`。 +- [ ] 提交信息能说明本次任务意图。 + +## 运行 + +- [ ] 如改动影响启动,已确认应用能打开主窗口。 +- [ ] 如改动影响热键、托盘或 OCR,已记录人工 smoke 结果。 diff --git a/docs/current-state.md b/docs/current-state.md new file mode 100644 index 0000000..06d1e28 --- /dev/null +++ b/docs/current-state.md @@ -0,0 +1,75 @@ +# 当前状态 + +更新时间:2026-07-08 + +## 当前阶段 + +项目处于迁移后基线稳定和 Harness Coding 文档接入阶段。当前主要任务是保持 Wails/Vue/SQLite 工程简单、可构建、可维护。 + +## 已确认事实 + +- Go 模块名:`cmbone` +- Go 版本:`1.23.0` +- Wails 版本:`v3.0.0-alpha.9` +- 前端 runtime:`@wailsio/runtime 3.0.0-alpha.66` +- 前端框架:Vue 3、Vite、TypeScript、Tailwind CSS、Ant Design Vue +- 本地数据库:SQLite,用户配置目录下 `cmbone/cmbone.db` +- 主窗口路由:`/#/` +- 第二窗口路由:`/#/second` + +## 当前命令 + +统一验证: + +```powershell +.\init.ps1 +``` + +拆分验证: + +```powershell +go test ./... +cd frontend +npm run build +cd .. +go build -o bin\cmbone.exe . +``` + +Wails CLI: + +```powershell +go install github.com/wailsapp/wails/v3/cmd/wails3@v3.0.0-alpha.9 +wails3 dev +``` + +## 已知风险 + +- Wails v3 alpha 版本需要保持 CLI、Go 模块和前端 runtime 匹配。 +- OCR 和热键依赖平台实现,跨平台修改需要分别验证。 +- 当前前端以构建检查为主,暂未引入专门的前端单元测试。 +- bindings 生成依赖本机安装的 `wails3`。 +- `npm install` 当前报告 3 个 moderate audit findings,后续如做依赖治理应单独开任务。 +- 前端构建当前有 Browserslist 数据过期和 chunk 大小警告,不阻塞生产构建。 + +## 最近验证 + +2026-07-08 已运行: + +```powershell +.\init.ps1 +``` + +结果: + +- `npm install` 通过。 +- `go test ./...` 通过。 +- `npm run build` 通过。 +- `go build -o bin\cmbone.exe .` 通过。 + +## 下一步 + +从 [`06-tasks.md`](06-tasks.md) 领取第一个 `TODO` 任务。目前建议先做 `T-010`:梳理主窗口最大化与自适应布局策略。 + +## 当前 blocker + +无。 diff --git a/docs/evaluator-rubric.md b/docs/evaluator-rubric.md new file mode 100644 index 0000000..45ac195 --- /dev/null +++ b/docs/evaluator-rubric.md @@ -0,0 +1,38 @@ +# 评估标准 + +用于 code review、交接和 AI 输出自检。 + +## 必须满足 + +- 能说明本次改动对应哪个任务。 +- 没有超出任务范围。 +- 版本、命令、路径和当前代码事实一致。 +- 相关构建或测试命令已运行并记录结果。 +- 没有提交构建产物、依赖目录或本地配置。 + +## 代码质量 + +| 等级 | 标准 | +| --- | --- | +| A | 改动小、边界清楚、测试充分、文档同步、无明显维护风险 | +| B | 功能正确、构建通过、文档基本同步,仍有少量后续优化空间 | +| C | 可运行但边界或错误处理薄弱,需要安排后续任务 | +| D | 构建失败、范围失控、接口不一致或缺少关键验证 | + +## UI 质量 + +| 等级 | 标准 | +| --- | --- | +| A | 布局稳定、信息密度合适、窗口尺寸变化时无溢出 | +| B | 主要路径可用,局部样式可继续优化 | +| C | 功能可用但有明显布局问题或交互不清 | +| D | 关键控件不可用、文本重叠或页面无法加载 | + +## 文档质量 + +| 等级 | 标准 | +| --- | --- | +| A | 文档能直接指导新维护者执行任务和验证 | +| B | 主要事实正确,少量细节需要补充 | +| C | 有导航但缺少真实命令或验收标准 | +| D | 文档与代码冲突,可能误导维护者 | diff --git a/docs/method-map.md b/docs/method-map.md new file mode 100644 index 0000000..1c3b6c3 --- /dev/null +++ b/docs/method-map.md @@ -0,0 +1,45 @@ +# 方法地图 + +> 维护者查找入口时先看这里,再进入具体文件。 + +## 应用启动 + +| 文件 | 方法 / 内容 | 说明 | +| --- | --- | --- | +| `main.go` | `main()` | 创建 Wails app、注册服务、嵌入资源、启动应用 | +| `internal/services/appservice.go` | `ConfigureAppService` | 配置窗口、托盘、语言资源和生命周期 | + +## 存储 + +| 文件 | 方法 / 内容 | 说明 | +| --- | --- | --- | +| `internal/services/store.go` | `NewSuiStore` | 打开 SQLite 并执行初始化 | +| `internal/services/store.go` | migration / CRUD 方法 | 初始化 `hotkeys`、`appconfig` 并提供基础读写 | +| `internal/services/store_test.go` | store 测试 | 覆盖存储初始化和关键读写 | + +## 配置 + +| 文件 | 方法 / 内容 | 说明 | +| --- | --- | --- | +| `internal/services/appconfig_service.go` | `GetAppConfig` / `SetAppConfig` | 前端配置读写入口 | +| `internal/services/appconfig_service.go` | `GetLanguage` / `SetLanguage` | 语言配置读写入口 | + +## 热键 + +| 文件 | 方法 / 内容 | 说明 | +| --- | --- | --- | +| `internal/services/hotkey_service.go` | `GetHotkeys` | 返回当前热键配置 | +| `internal/services/hotkey_service.go` | `UpHotkey` | 更新热键并重新注册 | +| `platform/hotkey_windows.go` | Windows 热键实现 | Windows 平台注册逻辑 | +| `platform/hotkey_darwin.go` | macOS 热键实现 | macOS 平台注册逻辑 | + +## 前端 + +| 文件 | 方法 / 内容 | 说明 | +| --- | --- | --- | +| `frontend/src/main.ts` | Vue 入口 | 注册应用、路由和国际化 | +| `frontend/src/router/index.ts` | routes | `#/` 和 `#/second` 路由 | +| `frontend/src/components/Main/Index.vue` | 主窗口入口 | 设置页面总布局 | +| `frontend/src/pages/Home/Index.vue` | 第二窗口入口 | OCR 示例页面 | +| `frontend/src/utils/ThemeManager.ts` | 主题工具 | 主题切换和持久化协作 | +| `frontend/src/utils/i18n.ts` | 国际化工具 | 语言资源和切换 | diff --git a/docs/quality-document.md b/docs/quality-document.md new file mode 100644 index 0000000..3443106 --- /dev/null +++ b/docs/quality-document.md @@ -0,0 +1,36 @@ +# 质量文档 + +## 当前质量概览 + +| 领域 | 当前等级 | 说明 | +| --- | --- | --- | +| 项目结构 | B | 已从模板整理为普通工程,目录职责基本清楚 | +| 后端服务 | B | 服务边界清晰,但热键和 OCR 的错误路径仍可加强 | +| 本地存储 | B | SQLite 初始化和基础测试已存在,后续可补更多迁移测试 | +| 前端结构 | B | Vue 组件按功能拆分,主窗口布局策略仍需明确 | +| 构建验证 | B | Go 测试、前端构建、后端编译可运行 | +| 文档 | B | Harness Coding 文档已接入,后续随代码继续维护 | + +## 主要风险 + +- Wails v3 alpha 版本兼容性风险。 +- bindings 与 Go 服务签名不一致的运行时风险。 +- 热键和 OCR 跨平台行为不完全一致。 +- 前端缺少专门单元测试,主要依赖构建和人工 smoke。 + +## 质量门槛 + +每个代码任务至少达到: + +- Go 代码 `gofmt`。 +- `go test ./...` 通过。 +- 涉及前端时 `npm run build` 通过。 +- 涉及后端启动时 `go build -o bin/cmbone.exe .` 通过。 +- 涉及 UI 时完成对应窗口的人工检查。 + +## 改进方向 + +- 为存储迁移、配置服务、热键服务补充更细测试。 +- 为主窗口最大化和自适应布局建立明确规则。 +- 为 OCR 失败、热键注册失败补充用户可理解反馈。 +- 为 Wails bindings 生成流程补充完整操作说明。 diff --git a/docs/routes.md b/docs/routes.md new file mode 100644 index 0000000..19fdadf --- /dev/null +++ b/docs/routes.md @@ -0,0 +1,29 @@ +# 前端路由 + +路由定义文件:`frontend/src/router/index.ts` + +当前使用 hash history,适配 Wails 桌面窗口。 + +## 路由表 + +| 路由 | 组件 | 窗口 | 职责 | +| --- | --- | --- | --- | +| `#/` | `frontend/src/components/Main/Index.vue` | 主窗口 | 设置中心、导航、主题、语言、快捷键、标签、关于等 | +| `#/second` | `frontend/src/pages/Home/Index.vue` | 第二窗口 | OCR 示例和轻量快捷功能 | + +## 主窗口区域 + +主窗口当前由 `Main/Index.vue` 组织以下区域: + +- Dashboard:概览。 +- General:通用设置。 +- Shortcut:快捷键设置。 +- Tags:标签相关展示。 +- About:关于信息。 + +## 页面规则 + +- 新增页面必须先确认是否属于主窗口长期功能,还是第二窗口轻量功能。 +- 主窗口应优先使用可维护的设置布局,不做营销式首页。 +- 第二窗口保持小而聚焦,不承载复杂流程。 +- 路由变化必须同步本文和相关任务验收。 diff --git a/docs/tasks/README.md b/docs/tasks/README.md new file mode 100644 index 0000000..b78a8e2 --- /dev/null +++ b/docs/tasks/README.md @@ -0,0 +1,18 @@ +# 一任务一文件规则 + +默认情况下,本项目使用 [`../06-tasks.md`](../06-tasks.md) 作为单文件任务看板。 + +当多人或多个 agent 并发工作时,为避免抢改同一个看板,改用本目录的一任务一文件方式: + +1. 新任务复制 [`_template.md`](_template.md)。 +2. 文件命名为 `T-<编号>-<短名称>.md`。 +3. 状态写在文件 frontmatter。 +4. 执行记录写入该任务文件的 `## 执行记录`。 +5. 不再逐任务追加根目录 `progress.md`,只在里程碑或交接时同步摘要。 + +## 状态 + +- `TODO`:待开始。 +- `DOING`:进行中。 +- `DONE`:完成并通过验收。 +- `BLOCKED`:受阻,需要明确原因。 diff --git a/docs/tasks/_template.md b/docs/tasks/_template.md new file mode 100644 index 0000000..03319e3 --- /dev/null +++ b/docs/tasks/_template.md @@ -0,0 +1,27 @@ +--- +id: T-000 +title: 任务标题 +status: TODO +depends_on: [] +owner: "" +--- + +# 任务标题 + +## 背景 + +说明为什么要做这个任务。 + +## 范围 + +- 做什么。 +- 不做什么。 + +## 验收标准 + +- [ ] 可观察、可执行的验收点。 +- [ ] 相关测试或构建命令通过。 + +## 执行记录 + +尚未开始。 diff --git a/init.ps1 b/init.ps1 new file mode 100644 index 0000000..3b04bd2 --- /dev/null +++ b/init.ps1 @@ -0,0 +1,49 @@ +#!/usr/bin/env pwsh + +$ErrorActionPreference = "Stop" +Set-Location -Path $PSScriptRoot + +$InstallCmds = @( + "Push-Location frontend; npm install; Pop-Location" +) + +$VerifyCmds = @( + "go test ./...", + "Push-Location frontend; npm run build; Pop-Location", + "New-Item -ItemType Directory -Force -Path bin | Out-Null; go build -o bin\cmbone.exe ." +) + +$StartCmd = "wails3 dev" + +function Invoke-ProjectCommand { + param([string]$Command) + + Write-Host " $Command" + Invoke-Expression $Command + if ($LASTEXITCODE -ne 0) { + throw "Command failed with exit code ${LASTEXITCODE}: $Command" + } +} + +Write-Host "==> 当前目录: $($PWD.Path)" + +Write-Host "==> 同步依赖" +foreach ($cmd in $InstallCmds) { + Invoke-ProjectCommand $cmd +} + +Write-Host "==> 运行基础验证" +foreach ($cmd in $VerifyCmds) { + Invoke-ProjectCommand $cmd +} + +Write-Host "==> 启动命令" +Write-Host " $StartCmd" + +if ($env:RUN_START_COMMAND -eq "1") { + Write-Host "==> 启动应用" + Invoke-ProjectCommand $StartCmd +} else { + Write-Host "如需直接启动应用,请设置 RUN_START_COMMAND=1。" + Write-Host "基础验证失败时,先修复基线,再继续功能开发。" +} diff --git a/init.sh b/init.sh new file mode 100644 index 0000000..867b6fd --- /dev/null +++ b/init.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd "$(dirname "$0")" + +INSTALL_CMDS=( + "cd frontend && npm install" +) + +BIN_OUTPUT="bin/cmbone" +case "$(uname -s)" in + MINGW*|MSYS*|CYGWIN*) BIN_OUTPUT="bin/cmbone.exe" ;; +esac + +VERIFY_CMDS=( + "go test ./..." + "cd frontend && npm run build" + "mkdir -p bin && go build -o ${BIN_OUTPUT} ." +) + +START_CMD="wails3 dev" + +run_cmd() { + local cmd="$1" + echo " ${cmd}" + bash -lc "${cmd}" +} + +echo "==> 当前目录: $(pwd)" + +echo "==> 同步依赖" +for cmd in "${INSTALL_CMDS[@]}"; do + run_cmd "${cmd}" +done + +echo "==> 运行基础验证" +for cmd in "${VERIFY_CMDS[@]}"; do + run_cmd "${cmd}" +done + +echo "==> 启动命令" +echo " ${START_CMD}" + +if [[ "${RUN_START_COMMAND:-0}" == "1" ]]; then + echo "==> 启动应用" + run_cmd "${START_CMD}" +else + echo "如需直接启动应用,请设置 RUN_START_COMMAND=1。" + echo "基础验证失败时,先修复基线,再继续功能开发。" +fi diff --git a/progress.md b/progress.md new file mode 100644 index 0000000..b41bbca --- /dev/null +++ b/progress.md @@ -0,0 +1,31 @@ +# 执行流水 + +> 记录已经完成的任务、验证命令、结果和关键决策。任务完成必须有可执行证据,不只写“已完成”。 + +## 2026-07-08 + +### 基线整理 + +- 任务:从 `SuiDemo` 迁移并整理为 `cmbone` Wails v3 项目。 +- 结果:完成项目结构整理、README 维护、`.gitignore` 更新和初始提交。 +- 已知验证: + - `go test ./...` 通过。 + - `cd frontend && npm run build` 通过。 + - `go build -o bin/cmbone.exe .` 通过。 + - 启动 `bin/cmbone.exe` 后 Wails/WebView2 可初始化并加载前端资源。 + +### 接入 Harness Coding 文档 + +- 任务:参考 `D:\github\harness_coding_docs` 的模板,在本项目生成 Harness Coding 文档。 +- 决策:保留模板的 `AGENTS.md`、`docs/00-ai-start-here.md`、任务看板、当前状态、质量清单和初始化脚本结构;内容改为本项目真实技术栈和命令。 +- 结果:新增仓库级 agent 入口、文档导航、需求/架构/API/路由/质量/任务文档和 `init.ps1` / `init.sh`。 +- 验证: + - `.\init.ps1` 通过。 + - 脚本内 `npm install` 通过。 + - 脚本内 `go test ./...` 通过。 + - 脚本内 `cd frontend && npm run build` 通过。 + - 脚本内 `go build -o bin\cmbone.exe .` 通过。 +- 非阻塞警告: + - `npm install` 报告 3 个 moderate audit findings,本次文档任务未处理依赖审计。 + - 前端构建提示 Browserslist 数据过期。 + - Vite 提示生产 chunk 大于 500 kB。