diff --git a/.github/workflows/packages.yml b/.github/workflows/packages.yml index 4aed9bb..d434245 100644 --- a/.github/workflows/packages.yml +++ b/.github/workflows/packages.yml @@ -30,9 +30,9 @@ jobs: timeout-minutes: 20 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v7 with: node-version: 24 cache: npm @@ -54,7 +54,7 @@ jobs: run: npm run build:bundle - name: Upload production bundle - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: goodbuddy-production-bundle path: out @@ -90,15 +90,15 @@ jobs: timeout-minutes: 75 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v7 with: node-version: 24 cache: npm - name: Cache packaging toolsets - uses: actions/cache@v4 + uses: actions/cache@v6 with: path: | ${{ runner.temp }}/electron @@ -112,7 +112,7 @@ jobs: ELECTRON_CACHE: ${{ runner.temp }}/electron - name: Download production bundle - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: goodbuddy-production-bundle path: out @@ -124,7 +124,7 @@ jobs: ELECTRON_BUILDER_CACHE: ${{ runner.temp }}/electron-builder - name: Upload release packages - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: goodbuddy-${{ matrix.platform }}-${{ matrix.arch }} path: dist/release/${{ matrix.platform }}-${{ matrix.arch }} @@ -143,11 +143,11 @@ jobs: actions: read steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v7 with: fetch-depth: 0 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v7 with: node-version: 24 @@ -160,19 +160,19 @@ jobs: test "$(git rev-parse "refs/tags/$GITHUB_REF_NAME^{commit}")" = "$GITHUB_SHA" - name: Download Windows packages - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: pattern: goodbuddy-windows-* path: dist/release-downloads - name: Download macOS packages - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: pattern: goodbuddy-macos-* path: dist/release-downloads - name: Download Linux packages - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: pattern: goodbuddy-linux-* path: dist/release-downloads diff --git a/AGENTS.md b/AGENTS.md index 6f22540..31685ce 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -76,8 +76,9 @@ Keep Electron security boundaries intact: - `build/build-release.cjs` verifies the unpacked application, `app.asar`, bundled Continue and OpenCode runtimes, executable architecture, and package signatures before atomically replacing a release directory. -- Keep electron-builder invocations on `--publish never`. Current CI uploads - 30-day GitHub Actions artifacts and does not create GitHub Release assets. +- Keep electron-builder invocations on `--publish never`. Main-branch builds + upload 30-day GitHub Actions artifacts. Version-tag builds additionally + verify and aggregate packages before publishing GitHub Release assets. Signing and macOS notarization are not configured. - Keep `ELECTRON_CACHE` and `ELECTRON_BUILDER_CACHE` under `${{ runner.temp }}` in step-level workflow contexts. A cache beneath the diff --git a/package-lock.json b/package-lock.json index 9cfd80e..6710c8d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "goodbuddy", - "version": "0.8.0", + "version": "0.8.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "goodbuddy", - "version": "0.8.0", + "version": "0.8.1", "license": "UNLICENSED", "dependencies": { "@modelcontextprotocol/sdk": "^1.30.0", diff --git a/package.json b/package.json index 00da38d..bb161b8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "goodbuddy", - "version": "0.8.0", + "version": "0.8.1", "private": true, "description": "Secure desktop AI workspace with controlled Agent Runtimes", "desktopName": "GoodBuddy", diff --git a/sites/README.md b/sites/README.md index 604d9cd..6cf57ed 100644 --- a/sites/README.md +++ b/sites/README.md @@ -24,17 +24,20 @@ node --check sites/site.config.js ## Release 配置 -未来 v0.8.0 Release 地址集中在 `site.config.js`: +当前版本的 Release 地址集中在 `site.config.js`,版本号必须与根目录 +`package.json` 保持一致: ```js window.GOODBUDDY_SITE_CONFIG = Object.freeze({ - version: "0.8.0", - releasePublished: false, - releaseUrl: "https://github.com/mesalogo/goodbuddy/releases/tag/v0.8.0", + version: "0.8.1", + releasePublished: true, + releaseUrl: "https://github.com/mesalogo/goodbuddy/releases/tag/v0.8.1", }); ``` -正式 Release 确认发布后,将 `releasePublished` 改为 `true`,页面上的下载入口才会指向 Release 页面。官网不配置或猜测具体安装资产名称。 +准备尚未发布的版本时,将 `releasePublished` 暂时设为 `false`;正式 +Release 确认发布后改回 `true`,页面上的下载入口才会指向 Release +页面。官网不配置或猜测具体安装资产名称。 ## 文件 diff --git a/sites/app.js b/sites/app.js index 6ab8919..748a32f 100644 --- a/sites/app.js +++ b/sites/app.js @@ -48,12 +48,16 @@ const configureReleaseLinks = () => { const releaseLinks = document.querySelectorAll("[data-release-link]"); + const hasValidVersion = + typeof config?.version === "string" && + /^\d+\.\d+\.\d+$/.test(config.version); + const expectedReleaseUrl = hasValidVersion + ? `https://github.com/mesalogo/goodbuddy/releases/tag/v${config.version}` + : ""; const isReady = config?.releasePublished === true && typeof config.releaseUrl === "string" && - /^https:\/\/github\.com\/mesalogo\/goodbuddy\/releases\/tag\/v0\.8\.0$/.test( - config.releaseUrl, - ); + config.releaseUrl === expectedReleaseUrl; releaseLinks.forEach((link) => { if (!isReady) { diff --git a/sites/index.html b/sites/index.html index 0d30fe8..75003e5 100644 --- a/sites/index.html +++ b/sites/index.html @@ -5,7 +5,7 @@ GoodBuddy|安全可控的桌面智能助手 @@ -91,7 +91,7 @@
- GoodBuddy 0.8.0 即将发布 + GoodBuddy 0.8.1 已发布

把 AI 放在桌面,
也把控制权留在手中。

@@ -384,7 +384,7 @@

准备好,在你的设备上运行

- v0.8.0 Release 尚未发布。下载入口将在发布后统一开放,目前不提供虚构的资产名称或下载地址。 + v0.8.1 Release 提供经过校验的跨平台安装包与哈希清单,下载入口统一指向 GitHub Release。

@@ -484,7 +484,7 @@
-

GoodBuddy 0.8.0

+

GoodBuddy 0.8.1

一个更能做事,也更懂边界的桌面伙伴。

关注 Release,第一时间获取正式版本、校验信息与完整更新说明。

diff --git a/sites/scripts/validate.mjs b/sites/scripts/validate.mjs index f1ce67d..01fda3f 100644 --- a/sites/scripts/validate.mjs +++ b/sites/scripts/validate.mjs @@ -3,6 +3,7 @@ import path from "node:path"; import { fileURLToPath } from "node:url"; const siteRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); +const repositoryRoot = path.resolve(siteRoot, ".."); const errors = []; const requiredFiles = [ @@ -46,6 +47,14 @@ const [html, css, appJs, configJs] = await Promise.all([ readSiteFile("app.js"), readSiteFile("site.config.js"), ]); +let packageVersion = ""; +try { + packageVersion = JSON.parse( + await readFile(path.join(repositoryRoot, "package.json"), "utf8"), + ).version; +} catch { + errors.push("无法读取 package.json 版本"); +} for (const [relativePath, content] of [ ["index.html", html], @@ -87,23 +96,27 @@ for (const copy of requiredCopy) { } report( - /version:\s*"0\.8\.0"/.test(configJs), - "site.config.js 必须集中配置 0.8.0 版本", + configJs.includes(`version: "${packageVersion}"`), + `site.config.js 版本必须与 package.json 的 ${packageVersion} 一致`, ); report( /releasePublished:\s*true/.test(configJs), - "v0.8.0 Release 发布后 releasePublished 必须为 true", + `v${packageVersion} Release 发布后 releasePublished 必须为 true`, ); report( - /releaseUrl:\s*"https:\/\/github\.com\/mesalogo\/goodbuddy\/releases\/tag\/v0\.8\.0"/.test( - configJs, + configJs.includes( + `releaseUrl: "https://github.com/mesalogo/goodbuddy/releases/tag/v${packageVersion}"`, ), - "v0.8.0 Release URL 配置不正确", + `v${packageVersion} Release URL 配置不正确`, ); report( appJs.includes("config?.releasePublished === true"), "下载链接必须受 releasePublished 配置保护", ); +report( + appJs.includes("config.releaseUrl === expectedReleaseUrl"), + "下载链接必须与配置版本对应的 GitHub Release 地址一致", +); const ids = [...html.matchAll(/\sid="([^"]+)"/g)].map((match) => match[1]); const duplicateIds = ids.filter((id, index) => ids.indexOf(id) !== index); diff --git a/sites/site.config.js b/sites/site.config.js index ad01824..3260599 100644 --- a/sites/site.config.js +++ b/sites/site.config.js @@ -1,5 +1,5 @@ window.GOODBUDDY_SITE_CONFIG = Object.freeze({ - version: "0.8.0", + version: "0.8.1", releasePublished: true, - releaseUrl: "https://github.com/mesalogo/goodbuddy/releases/tag/v0.8.0", + releaseUrl: "https://github.com/mesalogo/goodbuddy/releases/tag/v0.8.1", }); diff --git a/tests/packages-workflow.test.ts b/tests/packages-workflow.test.ts new file mode 100644 index 0000000..27a1da5 --- /dev/null +++ b/tests/packages-workflow.test.ts @@ -0,0 +1,31 @@ +import { readFileSync } from 'node:fs' +import { join } from 'node:path' +import { describe, expect, it } from 'vitest' +import { parse } from 'yaml' + +const workflow = readFileSync( + join(process.cwd(), '.github', 'workflows', 'packages.yml'), + 'utf8' +) + +describe('packages workflow', () => { + it('uses valid YAML and Node.js 24 GitHub Actions', () => { + expect(() => parse(workflow)).not.toThrow() + + const references = [ + ...workflow.matchAll( + /uses:\s+(actions\/(?:checkout|setup-node|cache|upload-artifact|download-artifact)@v\d+)/gu + ) + ].map((match) => match[1]) + + expect(new Set(references)).toEqual( + new Set([ + 'actions/checkout@v7', + 'actions/setup-node@v7', + 'actions/cache@v6', + 'actions/upload-artifact@v7', + 'actions/download-artifact@v8' + ]) + ) + }) +})