diff --git a/README.md b/README.md
index a70e463..524ff98 100644
--- a/README.md
+++ b/README.md
@@ -56,7 +56,14 @@ npm run build
```bash
wails3 dev
-wails3 package
+wails3 build
+```
+
+Windows 下也可以直接运行:
+
+```powershell
+.\dev.bat
+.\build.bat
```
## 维护约定
diff --git a/build.bat b/build.bat
new file mode 100644
index 0000000..9d09536
--- /dev/null
+++ b/build.bat
@@ -0,0 +1 @@
+@for /f "delims=" %%G in ('go env GOPATH') do @set "PATH=%%G\bin;%PATH%" && wails3 build
diff --git a/build/windows/info.json b/build/windows/info.json
new file mode 100644
index 0000000..3d0a6fd
--- /dev/null
+++ b/build/windows/info.json
@@ -0,0 +1,15 @@
+{
+ "fixed": {
+ "file_version": "1.0.0.0"
+ },
+ "info": {
+ "0000": {
+ "ProductVersion": "1.0.0.0",
+ "CompanyName": "cmbone",
+ "FileDescription": "cmbone desktop application",
+ "LegalCopyright": "(c) 2026 cmbone",
+ "ProductName": "cmbone",
+ "Comments": "Reusable Wails desktop application template"
+ }
+ }
+}
diff --git a/build/windows/wails.exe.manifest b/build/windows/wails.exe.manifest
new file mode 100644
index 0000000..61c827f
--- /dev/null
+++ b/build/windows/wails.exe.manifest
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+ true/pm
+ permonitorv2,permonitor
+
+
+
diff --git a/dev.bat b/dev.bat
new file mode 100644
index 0000000..69b7539
--- /dev/null
+++ b/dev.bat
@@ -0,0 +1 @@
+@for /f "delims=" %%G in ('go env GOPATH') do @set "PATH=%%G\bin;%PATH%" && wails3 dev
diff --git a/docs/03-tech-stack.md b/docs/03-tech-stack.md
index 024efd5..0a7dabc 100644
--- a/docs/03-tech-stack.md
+++ b/docs/03-tech-stack.md
@@ -94,12 +94,27 @@ go build -o bin\cmbone.exe .
wails3 dev
```
-打包:
+Wails 构建:
```powershell
-wails3 package
+wails3 build
```
+Windows 快捷脚本:
+
+```powershell
+.\dev.bat
+.\build.bat
+```
+
+Windows build 资源:
+
+- `build/windows/wails.exe.manifest`
+- `build/windows/info.json`
+- `build/windows/icon.ico`
+
+`wails3 build` 会重新生成 `frontend/bindings`,当前 CLI 生成的是 `.js` bindings。
+
## 版本升级规则
- 升级 Go 前,先确认 Wails v3 alpha、SQLite 和热键库的兼容性。
diff --git a/docs/06-tasks.md b/docs/06-tasks.md
index f063494..1da019a 100644
--- a/docs/06-tasks.md
+++ b/docs/06-tasks.md
@@ -50,6 +50,7 @@
| T-031 | 文档化 Wails bindings 生成流程 | T-012 | README 或技术栈文档说明 `wails3 generate bindings` 的使用、失败处理和版本要求 | TODO |
| T-032 | 补充 Windows 打包验证文档 | T-031 | `wails3 package` 前置条件、输出目录和常见失败处理写入 README 或 docs | TODO |
| T-033 | 完成一次模板 smoke 清单 | T-023 | 登录、设置、业务样例、日志、统计、组件示例、托盘、热键都按清单验证并记录结果 | TODO |
+| T-034 | 添加 Windows Wails 快捷脚本 | T-001 | `dev.bat` 一行把 Go bin 加入当前进程 PATH 并运行 `wails3 dev`;`build.bat` 一行把 Go bin 加入当前进程 PATH 并运行 `wails3 build`;README、技术栈、当前状态和执行流水已同步 | DONE |
## Backlog
diff --git a/docs/api.md b/docs/api.md
index 300b7f6..dd59b5f 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -123,6 +123,8 @@ MVP 可以先用本地模拟 provider,后续再接真实 AI 后端。
绑定目录:`frontend/bindings/cmbone/internal/services`
+当前 Wails v3 CLI 会生成 `.js` bindings。前端源码使用无扩展名 import,允许 Vite 解析到这些 `.js` 文件。
+
服务签名变化后优先执行:
```powershell
diff --git a/docs/current-state.md b/docs/current-state.md
index 8b84ee3..13b8705 100644
--- a/docs/current-state.md
+++ b/docs/current-state.md
@@ -22,6 +22,7 @@
- Wails 版本:`v3.0.0-alpha.9`
- 前端 runtime:`@wailsio/runtime 3.0.0-alpha.66`
- 前端框架:Vue 3、Vite、TypeScript、Tailwind CSS、Ant Design Vue
+- 当前 Wails 前端 bindings:由 `wails3 build` / `wails3 generate bindings` 生成的 `.js` 文件。
- 本地数据库:SQLite,用户配置目录下 `cmbone/cmbone.db`
- 当前主窗口路由:`/#/`,已保留为主应用入口,不再自动跳转到第二窗口。
- 当前第二窗口路由:`/#/second`
@@ -53,6 +54,9 @@ Wails CLI:
```powershell
go install github.com/wailsapp/wails/v3/cmd/wails3@v3.0.0-alpha.9
wails3 dev
+wails3 build
+.\dev.bat
+.\build.bat
```
## 已知风险
@@ -65,6 +69,7 @@ wails3 dev
- bindings 生成依赖本机安装的 `wails3`。
- `npm install` 当前报告 3 个 moderate audit findings,后续如做依赖治理应单独开任务。
- 前端构建当前有 Browserslist 数据过期和 chunk 大小警告,不阻塞生产构建。
+- Windows 快捷脚本依赖 `go env GOPATH` 下的 `bin\wails3.exe`,如果未安装 Wails CLI,先按 README 安装固定版本。
## 最近验证
@@ -91,6 +96,15 @@ wails3 dev
- `go build -o bin\cmbone.exe .` 通过。
- `bin\cmbone.exe` 启动 6 秒 smoke 通过。
+同日新增 Windows Wails 快捷脚本:
+
+- `dev.bat` 一行把 Go bin 加入当前进程 PATH 并运行 `wails3 dev`。
+- `build.bat` 一行把 Go bin 加入当前进程 PATH 并运行 `wails3 build`。
+- 已补齐 `build/windows/wails.exe.manifest` 和 `build/windows/info.json`,使 `wails3 build` 的 Windows syso 生成步骤可运行。
+- `cmd /c build.bat` 通过。
+- 使用同样 PATH 逻辑执行 `wails3 dev -help` 通过。
+- `.\init.ps1` 通过。
+
## 下一步
从 [`06-tasks.md`](06-tasks.md) 领取第一个 `TODO` 任务。目前建议先做 `T-012`:搭建主应用路由骨架。
diff --git a/frontend/bindings/cmbone/internal/models/index.ts b/frontend/bindings/cmbone/internal/models/index.js
similarity index 73%
rename from frontend/bindings/cmbone/internal/models/index.ts
rename to frontend/bindings/cmbone/internal/models/index.js
index ed870e6..580fb67 100644
--- a/frontend/bindings/cmbone/internal/models/index.ts
+++ b/frontend/bindings/cmbone/internal/models/index.js
@@ -1,6 +1,5 @@
+// @ts-check
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT
-export {
- Hotkey
-} from "./models.js";
+export * from "./models.js";
diff --git a/frontend/bindings/cmbone/internal/models/models.js b/frontend/bindings/cmbone/internal/models/models.js
new file mode 100644
index 0000000..1aad08d
--- /dev/null
+++ b/frontend/bindings/cmbone/internal/models/models.js
@@ -0,0 +1,52 @@
+// @ts-check
+// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
+// This file is automatically generated. DO NOT EDIT
+
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-ignore: Unused imports
+import {Create as $Create} from "@wailsio/runtime";
+
+export class Hotkey {
+ /**
+ * Creates a new Hotkey instance.
+ * @param {Partial} [$$source = {}] - The source object to create the Hotkey.
+ */
+ constructor($$source = {}) {
+ if (!("id" in $$source)) {
+ /**
+ * 热键ID
+ * @member
+ * @type {number}
+ */
+ this["id"] = 0;
+ }
+ if (!("keycode" in $$source)) {
+ /**
+ * 键码
+ * @member
+ * @type {number}
+ */
+ this["keycode"] = 0;
+ }
+ if (!("modifiers" in $$source)) {
+ /**
+ * 修饰键
+ * @member
+ * @type {number}
+ */
+ this["modifiers"] = 0;
+ }
+
+ Object.assign(this, $$source);
+ }
+
+ /**
+ * Creates a new Hotkey instance from a string or object.
+ * @param {any} [$$source = {}]
+ * @returns {Hotkey}
+ */
+ static createFrom($$source = {}) {
+ let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source;
+ return new Hotkey(/** @type {Partial} */($$parsedSource));
+ }
+}
diff --git a/frontend/bindings/cmbone/internal/models/models.ts b/frontend/bindings/cmbone/internal/models/models.ts
deleted file mode 100644
index 04230f7..0000000
--- a/frontend/bindings/cmbone/internal/models/models.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
-// This file is automatically generated. DO NOT EDIT
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-ignore: Unused imports
-import { Create as $Create } from "@wailsio/runtime";
-
-export class Hotkey {
- /**
- * 热键ID
- */
- "id": number;
-
- /**
- * 键码
- */
- "keycode": number;
-
- /**
- * 修饰键
- */
- "modifiers": number;
-
- /** Creates a new Hotkey instance. */
- constructor($$source: Partial = {}) {
- if (!("id" in $$source)) {
- this["id"] = 0;
- }
- if (!("keycode" in $$source)) {
- this["keycode"] = 0;
- }
- if (!("modifiers" in $$source)) {
- this["modifiers"] = 0;
- }
-
- Object.assign(this, $$source);
- }
-
- /**
- * Creates a new Hotkey instance from a string or object.
- */
- static createFrom($$source: any = {}): Hotkey {
- let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source;
- return new Hotkey($$parsedSource as Partial);
- }
-}
diff --git a/frontend/bindings/cmbone/internal/services/appconfigservice.js b/frontend/bindings/cmbone/internal/services/appconfigservice.js
new file mode 100644
index 0000000..f80c987
--- /dev/null
+++ b/frontend/bindings/cmbone/internal/services/appconfigservice.js
@@ -0,0 +1,47 @@
+// @ts-check
+// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
+// This file is automatically generated. DO NOT EDIT
+
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-ignore: Unused imports
+import {Call as $Call, Create as $Create} from "@wailsio/runtime";
+
+/**
+ * 根据key获取配置项
+ * @param {string} key
+ * @returns {Promise & { cancel(): void }}
+ */
+export function GetAppConfig(key) {
+ let $resultPromise = /** @type {any} */($Call.ByID(4279572935, key));
+ return $resultPromise;
+}
+
+/**
+ * 获取应用语言
+ * @returns {Promise & { cancel(): void }}
+ */
+export function GetLanguage() {
+ let $resultPromise = /** @type {any} */($Call.ByID(2277729644));
+ return $resultPromise;
+}
+
+/**
+ * 设置或更新配置项
+ * @param {string} key
+ * @param {string} value
+ * @returns {Promise & { cancel(): void }}
+ */
+export function SetAppConfig(key, value) {
+ let $resultPromise = /** @type {any} */($Call.ByID(2391832275, key, value));
+ return $resultPromise;
+}
+
+/**
+ * 设置应用语言
+ * @param {string} lang
+ * @returns {Promise & { cancel(): void }}
+ */
+export function SetLanguage(lang) {
+ let $resultPromise = /** @type {any} */($Call.ByID(538150432, lang));
+ return $resultPromise;
+}
diff --git a/frontend/bindings/cmbone/internal/services/appconfigservice.ts b/frontend/bindings/cmbone/internal/services/appconfigservice.ts
deleted file mode 100644
index 719dbf0..0000000
--- a/frontend/bindings/cmbone/internal/services/appconfigservice.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
-// This file is automatically generated. DO NOT EDIT
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-ignore: Unused imports
-import { Call as $Call, CancellablePromise as $CancellablePromise } from "@wailsio/runtime";
-
-/**
- * 根据key获取配置项
- */
-export function GetAppConfig(key: string): $CancellablePromise {
- return $Call.ByName("cmbone/internal/services.AppConfigService.GetAppConfig", key);
-}
-
-/**
- * 获取应用语言
- */
-export function GetLanguage(): $CancellablePromise {
- return $Call.ByName("cmbone/internal/services.AppConfigService.GetLanguage");
-}
-
-/**
- * 设置或更新配置项
- */
-export function SetAppConfig(key: string, value: string): $CancellablePromise {
- return $Call.ByName("cmbone/internal/services.AppConfigService.SetAppConfig", key, value);
-}
-
-/**
- * 设置应用语言
- */
-export function SetLanguage(lang: string): $CancellablePromise {
- return $Call.ByName("cmbone/internal/services.AppConfigService.SetLanguage", lang);
-}
diff --git a/frontend/bindings/cmbone/internal/services/appservice.js b/frontend/bindings/cmbone/internal/services/appservice.js
new file mode 100644
index 0000000..9e3f1b8
--- /dev/null
+++ b/frontend/bindings/cmbone/internal/services/appservice.js
@@ -0,0 +1,24 @@
+// @ts-check
+// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
+// This file is automatically generated. DO NOT EDIT
+
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-ignore: Unused imports
+import {Call as $Call, Create as $Create} from "@wailsio/runtime";
+
+/**
+ * @returns {Promise & { cancel(): void }}
+ */
+export function OpenSecondWindow() {
+ let $resultPromise = /** @type {any} */($Call.ByID(3768296744));
+ return $resultPromise;
+}
+
+/**
+ * @param {string} lang
+ * @returns {Promise & { cancel(): void }}
+ */
+export function SetLanguage(lang) {
+ let $resultPromise = /** @type {any} */($Call.ByID(3062168746, lang));
+ return $resultPromise;
+}
diff --git a/frontend/bindings/cmbone/internal/services/appservice.ts b/frontend/bindings/cmbone/internal/services/appservice.ts
deleted file mode 100644
index 1cf38a0..0000000
--- a/frontend/bindings/cmbone/internal/services/appservice.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
-// This file is automatically generated. DO NOT EDIT
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-ignore: Unused imports
-import { Call as $Call, CancellablePromise as $CancellablePromise } from "@wailsio/runtime";
-
-export function OpenSecondWindow(): $CancellablePromise {
- return $Call.ByName("cmbone/internal/services.AppService.OpenSecondWindow");
-}
-
-/**
- * 更新应用语言设置并刷新菜单显示
- */
-export function SetLanguage(lang: string): $CancellablePromise {
- return $Call.ByName("cmbone/internal/services.AppService.SetLanguage", lang);
-}
diff --git a/frontend/bindings/cmbone/internal/services/hotkeyservice.js b/frontend/bindings/cmbone/internal/services/hotkeyservice.js
new file mode 100644
index 0000000..eb6afe2
--- /dev/null
+++ b/frontend/bindings/cmbone/internal/services/hotkeyservice.js
@@ -0,0 +1,38 @@
+// @ts-check
+// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
+// This file is automatically generated. DO NOT EDIT
+
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-ignore: Unused imports
+import {Call as $Call, Create as $Create} from "@wailsio/runtime";
+
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-ignore: Unused imports
+import * as models$0 from "../models/models.js";
+
+/**
+ * @returns {Promise & { cancel(): void }}
+ */
+export function GetHotkeys() {
+ let $resultPromise = /** @type {any} */($Call.ByID(925491794));
+ let $typingPromise = /** @type {any} */($resultPromise.then(($result) => {
+ return $$createType1($result);
+ }));
+ $typingPromise.cancel = $resultPromise.cancel.bind($resultPromise);
+ return $typingPromise;
+}
+
+/**
+ * @param {number} id
+ * @param {number} key
+ * @param {number} modifier
+ * @returns {Promise & { cancel(): void }}
+ */
+export function UpHotkey(id, key, modifier) {
+ let $resultPromise = /** @type {any} */($Call.ByID(881898498, id, key, modifier));
+ return $resultPromise;
+}
+
+// Private type creation functions
+const $$createType0 = models$0.Hotkey.createFrom;
+const $$createType1 = $Create.Array($$createType0);
diff --git a/frontend/bindings/cmbone/internal/services/hotkeyservice.ts b/frontend/bindings/cmbone/internal/services/hotkeyservice.ts
deleted file mode 100644
index 96f155c..0000000
--- a/frontend/bindings/cmbone/internal/services/hotkeyservice.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
-// This file is automatically generated. DO NOT EDIT
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-ignore: Unused imports
-import { Call as $Call, CancellablePromise as $CancellablePromise, Create as $Create } from "@wailsio/runtime";
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-ignore: Unused imports
-import * as models$0 from "../models/models.js";
-
-export function GetHotkeys(): $CancellablePromise {
- return $Call.ByName("cmbone/internal/services.HotkeyService.GetHotkeys").then(($result: any) => {
- return $$createType1($result);
- });
-}
-
-/**
- * 快捷键修改
- */
-export function UpHotkey(id: number, key: number, modifier: number): $CancellablePromise {
- return $Call.ByName("cmbone/internal/services.HotkeyService.UpHotkey", id, key, modifier);
-}
-
-// Private type creation functions
-const $$createType0 = models$0.Hotkey.createFrom;
-const $$createType1 = $Create.Array($$createType0);
diff --git a/frontend/bindings/cmbone/internal/services/index.ts b/frontend/bindings/cmbone/internal/services/index.js
similarity index 91%
rename from frontend/bindings/cmbone/internal/services/index.ts
rename to frontend/bindings/cmbone/internal/services/index.js
index 296e84d..7bb1b23 100644
--- a/frontend/bindings/cmbone/internal/services/index.ts
+++ b/frontend/bindings/cmbone/internal/services/index.js
@@ -1,3 +1,4 @@
+// @ts-check
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT
@@ -13,7 +14,3 @@ export {
OCRService,
SystemInfo
};
-
-export {
- SuiStore
-} from "./models.js";
diff --git a/frontend/bindings/cmbone/internal/services/models.ts b/frontend/bindings/cmbone/internal/services/models.ts
deleted file mode 100644
index 9d9f93a..0000000
--- a/frontend/bindings/cmbone/internal/services/models.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
-// This file is automatically generated. DO NOT EDIT
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-ignore: Unused imports
-import { Create as $Create } from "@wailsio/runtime";
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-ignore: Unused imports
-import * as sql$0 from "../../../database/sql/models.js";
-
-export class SuiStore {
- "DB": sql$0.DB | null;
-
- /** Creates a new SuiStore instance. */
- constructor($$source: Partial = {}) {
- if (!("DB" in $$source)) {
- this["DB"] = null;
- }
-
- Object.assign(this, $$source);
- }
-
- /**
- * Creates a new SuiStore instance from a string or object.
- */
- static createFrom($$source: any = {}): SuiStore {
- const $$createField0_0 = $$createType1;
- let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source;
- if ("DB" in $$parsedSource) {
- $$parsedSource["DB"] = $$createField0_0($$parsedSource["DB"]);
- }
- return new SuiStore($$parsedSource as Partial);
- }
-}
-
-// Private type creation functions
-const $$createType0 = sql$0.DB.createFrom;
-const $$createType1 = $Create.Nullable($$createType0);
diff --git a/frontend/bindings/cmbone/internal/services/ocrservice.js b/frontend/bindings/cmbone/internal/services/ocrservice.js
new file mode 100644
index 0000000..251c11a
--- /dev/null
+++ b/frontend/bindings/cmbone/internal/services/ocrservice.js
@@ -0,0 +1,17 @@
+// @ts-check
+// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
+// This file is automatically generated. DO NOT EDIT
+
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-ignore: Unused imports
+import {Call as $Call, Create as $Create} from "@wailsio/runtime";
+
+/**
+ * 识别Base64图片(data:image/png;base64,...)
+ * @param {string} base64str
+ * @returns {Promise & { cancel(): void }}
+ */
+export function RecognizeImageBase64(base64str) {
+ let $resultPromise = /** @type {any} */($Call.ByID(1021755169, base64str));
+ return $resultPromise;
+}
diff --git a/frontend/bindings/cmbone/internal/services/ocrservice.ts b/frontend/bindings/cmbone/internal/services/ocrservice.ts
deleted file mode 100644
index 21c3d3f..0000000
--- a/frontend/bindings/cmbone/internal/services/ocrservice.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-// This file is kept small because wails3 is not available in this environment.
-// Regenerate bindings with `wails3 generate bindings` when the CLI is installed.
-
-import { Call as $Call, CancellablePromise as $CancellablePromise } from "@wailsio/runtime";
-
-export function RecognizeImageBase64(base64str: string): $CancellablePromise {
- return $Call.ByName("cmbone/internal/services.OCRService.RecognizeImageBase64", base64str);
-}
diff --git a/frontend/bindings/cmbone/internal/services/systeminfo.js b/frontend/bindings/cmbone/internal/services/systeminfo.js
new file mode 100644
index 0000000..745cac6
--- /dev/null
+++ b/frontend/bindings/cmbone/internal/services/systeminfo.js
@@ -0,0 +1,15 @@
+// @ts-check
+// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
+// This file is automatically generated. DO NOT EDIT
+
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-ignore: Unused imports
+import {Call as $Call, Create as $Create} from "@wailsio/runtime";
+
+/**
+ * @returns {Promise & { cancel(): void }}
+ */
+export function GetOS() {
+ let $resultPromise = /** @type {any} */($Call.ByID(1831744513));
+ return $resultPromise;
+}
diff --git a/frontend/bindings/cmbone/internal/services/systeminfo.ts b/frontend/bindings/cmbone/internal/services/systeminfo.ts
deleted file mode 100644
index 9592d98..0000000
--- a/frontend/bindings/cmbone/internal/services/systeminfo.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
-// This file is automatically generated. DO NOT EDIT
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-ignore: Unused imports
-import { Call as $Call, CancellablePromise as $CancellablePromise } from "@wailsio/runtime";
-
-export function GetOS(): $CancellablePromise {
- return $Call.ByName("cmbone/internal/services.SystemInfo.GetOS");
-}
diff --git a/frontend/bindings/database/sql/index.ts b/frontend/bindings/database/sql/index.ts
deleted file mode 100644
index a30b177..0000000
--- a/frontend/bindings/database/sql/index.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
-// This file is automatically generated. DO NOT EDIT
-
-export {
- DB
-} from "./models.js";
diff --git a/frontend/bindings/database/sql/models.ts b/frontend/bindings/database/sql/models.ts
deleted file mode 100644
index 8b2eeda..0000000
--- a/frontend/bindings/database/sql/models.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
-// This file is automatically generated. DO NOT EDIT
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-ignore: Unused imports
-import { Create as $Create } from "@wailsio/runtime";
-
-/**
- * DB is a database handle representing a pool of zero or more
- * underlying connections. It's safe for concurrent use by multiple
- * goroutines.
- *
- * The sql package creates and frees connections automatically; it
- * also maintains a free pool of idle connections. If the database has
- * a concept of per-connection state, such state can be reliably observed
- * within a transaction ([Tx]) or connection ([Conn]). Once [DB.Begin] is called, the
- * returned [Tx] is bound to a single connection. Once [Tx.Commit] or
- * [Tx.Rollback] is called on the transaction, that transaction's
- * connection is returned to [DB]'s idle connection pool. The pool size
- * can be controlled with [DB.SetMaxIdleConns].
- */
-export class DB {
-
- /** Creates a new DB instance. */
- constructor($$source: Partial = {}) {
-
- Object.assign(this, $$source);
- }
-
- /**
- * Creates a new DB instance from a string or object.
- */
- static createFrom($$source: any = {}): DB {
- let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source;
- return new DB($$parsedSource as Partial);
- }
-}
diff --git a/frontend/bindings/embed/index.ts b/frontend/bindings/embed/index.ts
deleted file mode 100644
index 8a1384c..0000000
--- a/frontend/bindings/embed/index.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
-// This file is automatically generated. DO NOT EDIT
-
-export {
- FS
-} from "./models.js";
diff --git a/frontend/bindings/embed/models.ts b/frontend/bindings/embed/models.ts
deleted file mode 100644
index 95c5db1..0000000
--- a/frontend/bindings/embed/models.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
-// This file is automatically generated. DO NOT EDIT
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-ignore: Unused imports
-import { Create as $Create } from "@wailsio/runtime";
-
-/**
- * An FS is a read-only collection of files, usually initialized with a //go:embed directive.
- * When declared without a //go:embed directive, an FS is an empty file system.
- *
- * An FS is a read-only value, so it is safe to use from multiple goroutines
- * simultaneously and also safe to assign values of type FS to each other.
- *
- * FS implements fs.FS, so it can be used with any package that understands
- * file system interfaces, including net/http, text/template, and html/template.
- *
- * See the package documentation for more details about initializing an FS.
- */
-export class FS {
-
- /** Creates a new FS instance. */
- constructor($$source: Partial = {}) {
-
- Object.assign(this, $$source);
- }
-
- /**
- * Creates a new FS instance from a string or object.
- */
- static createFrom($$source: any = {}): FS {
- let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source;
- return new FS($$parsedSource as Partial);
- }
-}
diff --git a/frontend/bindings/github.com/wailsapp/wails/v3/pkg/application/index.ts b/frontend/bindings/github.com/wailsapp/wails/v3/pkg/application/index.ts
deleted file mode 100644
index b8aaea1..0000000
--- a/frontend/bindings/github.com/wailsapp/wails/v3/pkg/application/index.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
-// This file is automatically generated. DO NOT EDIT
-
-export {
- App,
- BrowserManager,
- ClipboardManager,
- ContextMenuManager,
- DialogManager,
- EnvironmentManager,
- EventManager,
- KeyBindingManager,
- MenuManager,
- ScreenManager,
- SystemTrayManager,
- WindowManager
-} from "./models.js";
diff --git a/frontend/bindings/github.com/wailsapp/wails/v3/pkg/application/models.ts b/frontend/bindings/github.com/wailsapp/wails/v3/pkg/application/models.ts
deleted file mode 100644
index bf9925b..0000000
--- a/frontend/bindings/github.com/wailsapp/wails/v3/pkg/application/models.ts
+++ /dev/null
@@ -1,369 +0,0 @@
-// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
-// This file is automatically generated. DO NOT EDIT
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-ignore: Unused imports
-import { Create as $Create } from "@wailsio/runtime";
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-ignore: Unused imports
-import * as slog$0 from "../../../../../../log/slog/models.js";
-
-export class App {
- /**
- * Manager pattern for organized API
- */
- "Window": WindowManager | null;
- "ContextMenu": ContextMenuManager | null;
- "KeyBinding": KeyBindingManager | null;
- "Browser": BrowserManager | null;
- "Env": EnvironmentManager | null;
- "Dialog": DialogManager | null;
- "Event": EventManager | null;
- "Menu": MenuManager | null;
- "Screen": ScreenManager | null;
- "Clipboard": ClipboardManager | null;
- "SystemTray": SystemTrayManager | null;
- "Logger": slog$0.Logger | null;
-
- /** Creates a new App instance. */
- constructor($$source: Partial = {}) {
- if (!("Window" in $$source)) {
- this["Window"] = null;
- }
- if (!("ContextMenu" in $$source)) {
- this["ContextMenu"] = null;
- }
- if (!("KeyBinding" in $$source)) {
- this["KeyBinding"] = null;
- }
- if (!("Browser" in $$source)) {
- this["Browser"] = null;
- }
- if (!("Env" in $$source)) {
- this["Env"] = null;
- }
- if (!("Dialog" in $$source)) {
- this["Dialog"] = null;
- }
- if (!("Event" in $$source)) {
- this["Event"] = null;
- }
- if (!("Menu" in $$source)) {
- this["Menu"] = null;
- }
- if (!("Screen" in $$source)) {
- this["Screen"] = null;
- }
- if (!("Clipboard" in $$source)) {
- this["Clipboard"] = null;
- }
- if (!("SystemTray" in $$source)) {
- this["SystemTray"] = null;
- }
- if (!("Logger" in $$source)) {
- this["Logger"] = null;
- }
-
- Object.assign(this, $$source);
- }
-
- /**
- * Creates a new App instance from a string or object.
- */
- static createFrom($$source: any = {}): App {
- const $$createField0_0 = $$createType1;
- const $$createField1_0 = $$createType3;
- const $$createField2_0 = $$createType5;
- const $$createField3_0 = $$createType7;
- const $$createField4_0 = $$createType9;
- const $$createField5_0 = $$createType11;
- const $$createField6_0 = $$createType13;
- const $$createField7_0 = $$createType15;
- const $$createField8_0 = $$createType17;
- const $$createField9_0 = $$createType19;
- const $$createField10_0 = $$createType21;
- const $$createField11_0 = $$createType23;
- let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source;
- if ("Window" in $$parsedSource) {
- $$parsedSource["Window"] = $$createField0_0($$parsedSource["Window"]);
- }
- if ("ContextMenu" in $$parsedSource) {
- $$parsedSource["ContextMenu"] = $$createField1_0($$parsedSource["ContextMenu"]);
- }
- if ("KeyBinding" in $$parsedSource) {
- $$parsedSource["KeyBinding"] = $$createField2_0($$parsedSource["KeyBinding"]);
- }
- if ("Browser" in $$parsedSource) {
- $$parsedSource["Browser"] = $$createField3_0($$parsedSource["Browser"]);
- }
- if ("Env" in $$parsedSource) {
- $$parsedSource["Env"] = $$createField4_0($$parsedSource["Env"]);
- }
- if ("Dialog" in $$parsedSource) {
- $$parsedSource["Dialog"] = $$createField5_0($$parsedSource["Dialog"]);
- }
- if ("Event" in $$parsedSource) {
- $$parsedSource["Event"] = $$createField6_0($$parsedSource["Event"]);
- }
- if ("Menu" in $$parsedSource) {
- $$parsedSource["Menu"] = $$createField7_0($$parsedSource["Menu"]);
- }
- if ("Screen" in $$parsedSource) {
- $$parsedSource["Screen"] = $$createField8_0($$parsedSource["Screen"]);
- }
- if ("Clipboard" in $$parsedSource) {
- $$parsedSource["Clipboard"] = $$createField9_0($$parsedSource["Clipboard"]);
- }
- if ("SystemTray" in $$parsedSource) {
- $$parsedSource["SystemTray"] = $$createField10_0($$parsedSource["SystemTray"]);
- }
- if ("Logger" in $$parsedSource) {
- $$parsedSource["Logger"] = $$createField11_0($$parsedSource["Logger"]);
- }
- return new App($$parsedSource as Partial);
- }
-}
-
-/**
- * BrowserManager manages browser-related operations
- */
-export class BrowserManager {
-
- /** Creates a new BrowserManager instance. */
- constructor($$source: Partial = {}) {
-
- Object.assign(this, $$source);
- }
-
- /**
- * Creates a new BrowserManager instance from a string or object.
- */
- static createFrom($$source: any = {}): BrowserManager {
- let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source;
- return new BrowserManager($$parsedSource as Partial);
- }
-}
-
-/**
- * ClipboardManager manages clipboard operations
- */
-export class ClipboardManager {
-
- /** Creates a new ClipboardManager instance. */
- constructor($$source: Partial = {}) {
-
- Object.assign(this, $$source);
- }
-
- /**
- * Creates a new ClipboardManager instance from a string or object.
- */
- static createFrom($$source: any = {}): ClipboardManager {
- let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source;
- return new ClipboardManager($$parsedSource as Partial);
- }
-}
-
-/**
- * ContextMenuManager manages all context menu operations
- */
-export class ContextMenuManager {
-
- /** Creates a new ContextMenuManager instance. */
- constructor($$source: Partial = {}) {
-
- Object.assign(this, $$source);
- }
-
- /**
- * Creates a new ContextMenuManager instance from a string or object.
- */
- static createFrom($$source: any = {}): ContextMenuManager {
- let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source;
- return new ContextMenuManager($$parsedSource as Partial);
- }
-}
-
-/**
- * DialogManager manages dialog-related operations
- */
-export class DialogManager {
-
- /** Creates a new DialogManager instance. */
- constructor($$source: Partial = {}) {
-
- Object.assign(this, $$source);
- }
-
- /**
- * Creates a new DialogManager instance from a string or object.
- */
- static createFrom($$source: any = {}): DialogManager {
- let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source;
- return new DialogManager($$parsedSource as Partial);
- }
-}
-
-/**
- * EnvironmentManager manages environment-related operations
- */
-export class EnvironmentManager {
-
- /** Creates a new EnvironmentManager instance. */
- constructor($$source: Partial = {}) {
-
- Object.assign(this, $$source);
- }
-
- /**
- * Creates a new EnvironmentManager instance from a string or object.
- */
- static createFrom($$source: any = {}): EnvironmentManager {
- let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source;
- return new EnvironmentManager($$parsedSource as Partial);
- }
-}
-
-/**
- * EventManager manages event-related operations
- */
-export class EventManager {
-
- /** Creates a new EventManager instance. */
- constructor($$source: Partial = {}) {
-
- Object.assign(this, $$source);
- }
-
- /**
- * Creates a new EventManager instance from a string or object.
- */
- static createFrom($$source: any = {}): EventManager {
- let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source;
- return new EventManager($$parsedSource as Partial);
- }
-}
-
-/**
- * KeyBindingManager manages all key binding operations
- */
-export class KeyBindingManager {
-
- /** Creates a new KeyBindingManager instance. */
- constructor($$source: Partial = {}) {
-
- Object.assign(this, $$source);
- }
-
- /**
- * Creates a new KeyBindingManager instance from a string or object.
- */
- static createFrom($$source: any = {}): KeyBindingManager {
- let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source;
- return new KeyBindingManager($$parsedSource as Partial);
- }
-}
-
-/**
- * MenuManager manages menu-related operations
- */
-export class MenuManager {
-
- /** Creates a new MenuManager instance. */
- constructor($$source: Partial = {}) {
-
- Object.assign(this, $$source);
- }
-
- /**
- * Creates a new MenuManager instance from a string or object.
- */
- static createFrom($$source: any = {}): MenuManager {
- let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source;
- return new MenuManager($$parsedSource as Partial);
- }
-}
-
-export class ScreenManager {
-
- /** Creates a new ScreenManager instance. */
- constructor($$source: Partial = {}) {
-
- Object.assign(this, $$source);
- }
-
- /**
- * Creates a new ScreenManager instance from a string or object.
- */
- static createFrom($$source: any = {}): ScreenManager {
- let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source;
- return new ScreenManager($$parsedSource as Partial);
- }
-}
-
-/**
- * SystemTrayManager manages system tray-related operations
- */
-export class SystemTrayManager {
-
- /** Creates a new SystemTrayManager instance. */
- constructor($$source: Partial = {}) {
-
- Object.assign(this, $$source);
- }
-
- /**
- * Creates a new SystemTrayManager instance from a string or object.
- */
- static createFrom($$source: any = {}): SystemTrayManager {
- let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source;
- return new SystemTrayManager($$parsedSource as Partial);
- }
-}
-
-/**
- * WindowManager manages all window-related operations
- */
-export class WindowManager {
-
- /** Creates a new WindowManager instance. */
- constructor($$source: Partial = {}) {
-
- Object.assign(this, $$source);
- }
-
- /**
- * Creates a new WindowManager instance from a string or object.
- */
- static createFrom($$source: any = {}): WindowManager {
- let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source;
- return new WindowManager($$parsedSource as Partial);
- }
-}
-
-// Private type creation functions
-const $$createType0 = WindowManager.createFrom;
-const $$createType1 = $Create.Nullable($$createType0);
-const $$createType2 = ContextMenuManager.createFrom;
-const $$createType3 = $Create.Nullable($$createType2);
-const $$createType4 = KeyBindingManager.createFrom;
-const $$createType5 = $Create.Nullable($$createType4);
-const $$createType6 = BrowserManager.createFrom;
-const $$createType7 = $Create.Nullable($$createType6);
-const $$createType8 = EnvironmentManager.createFrom;
-const $$createType9 = $Create.Nullable($$createType8);
-const $$createType10 = DialogManager.createFrom;
-const $$createType11 = $Create.Nullable($$createType10);
-const $$createType12 = EventManager.createFrom;
-const $$createType13 = $Create.Nullable($$createType12);
-const $$createType14 = MenuManager.createFrom;
-const $$createType15 = $Create.Nullable($$createType14);
-const $$createType16 = ScreenManager.createFrom;
-const $$createType17 = $Create.Nullable($$createType16);
-const $$createType18 = ClipboardManager.createFrom;
-const $$createType19 = $Create.Nullable($$createType18);
-const $$createType20 = SystemTrayManager.createFrom;
-const $$createType21 = $Create.Nullable($$createType20);
-const $$createType22 = slog$0.Logger.createFrom;
-const $$createType23 = $Create.Nullable($$createType22);
diff --git a/frontend/bindings/log/slog/index.ts b/frontend/bindings/log/slog/index.ts
deleted file mode 100644
index 28f9022..0000000
--- a/frontend/bindings/log/slog/index.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
-// This file is automatically generated. DO NOT EDIT
-
-export {
- Logger
-} from "./models.js";
diff --git a/frontend/bindings/log/slog/models.ts b/frontend/bindings/log/slog/models.ts
deleted file mode 100644
index ef606c6..0000000
--- a/frontend/bindings/log/slog/models.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
-// This file is automatically generated. DO NOT EDIT
-
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-ignore: Unused imports
-import { Create as $Create } from "@wailsio/runtime";
-
-/**
- * A Logger records structured information about each call to its
- * Log, Debug, Info, Warn, and Error methods.
- * For each call, it creates a [Record] and passes it to a [Handler].
- *
- * To create a new Logger, call [New] or a Logger method
- * that begins "With".
- */
-export class Logger {
-
- /** Creates a new Logger instance. */
- constructor($$source: Partial = {}) {
-
- Object.assign(this, $$source);
- }
-
- /**
- * Creates a new Logger instance from a string or object.
- */
- static createFrom($$source: any = {}): Logger {
- let $$parsedSource = typeof $$source === 'string' ? JSON.parse($$source) : $$source;
- return new Logger($$parsedSource as Partial);
- }
-}
diff --git a/progress.md b/progress.md
index 2cf352a..9c6ec5e 100644
--- a/progress.md
+++ b/progress.md
@@ -99,3 +99,24 @@
- `npm install` 仍报告 3 个 moderate audit findings。
- 前端构建仍提示 Browserslist 数据过期。
- Vite 仍提示生产 chunk 大于 500 kB。
+
+### 添加 Windows Wails 快捷脚本
+
+- 任务:完成 `T-034`,新增一行 bat 脚本运行 Wails dev 和 build 命令。
+- 结果:
+ - 新增 `dev.bat`,通过 `go env GOPATH` 把 Go bin 加入当前进程 PATH 并运行 `wails3 dev`。
+ - 新增 `build.bat`,通过 `go env GOPATH` 把 Go bin 加入当前进程 PATH 并运行 `wails3 build`。
+ - 补齐 `build/windows/wails.exe.manifest` 和 `build/windows/info.json`,满足 Windows syso 生成步骤。
+ - `wails3 build` 按当前 CLI 重新生成 `frontend/bindings`,当前绑定文件形态为 `.js`。
+ - 更新 README、技术栈、API、当前状态和任务看板。
+- 验证:
+ - `wails3.exe version` 通过,版本为 `v3.0.0-alpha.9`。
+ - 使用 bat 中同样 PATH 逻辑执行 `wails3 dev -help` 通过。
+ - `cmd /c build.bat` 通过。
+ - `.\init.ps1` 通过。
+ - `git diff --check` 通过。
+- 非阻塞警告:
+ - `wails3 build` 提示 `wails3 build` 是 `wails3 task` 的 alias。
+ - `npm install` 仍报告 3 个 moderate audit findings。
+ - 前端构建仍提示 Browserslist 数据过期。
+ - Vite 仍提示生产 chunk 大于 500 kB。