From 8f4ab2b233223e3d8d658800a0394f4458b04e39 Mon Sep 17 00:00:00 2001 From: Connor Date: Fri, 5 Jun 2026 23:42:10 +0800 Subject: [PATCH 1/5] Add MeteorTest release deployment track Add Tencent main/release deployment workflow, release docs, and release policy metadata. --- .github/workflows/ci.yml | 2 + .github/workflows/deploy-tencent.yml | 75 ++++++++++++++++++++++++ AGENTS.md | 8 +++ PROGRESS.md | 9 +++ README.md | 11 ++++ README.zh-CN.md | 11 ++++ docs/README.md | 1 + docs/README.zh-CN.md | 1 + docs/tencent-release-deployment.md | 64 ++++++++++++++++++++ docs/tencent-release-deployment.zh-CN.md | 64 ++++++++++++++++++++ 10 files changed, 246 insertions(+) create mode 100644 .github/workflows/deploy-tencent.yml create mode 100644 docs/tencent-release-deployment.md create mode 100644 docs/tencent-release-deployment.zh-CN.md diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 64a959e..898510b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,9 +4,11 @@ on: pull_request: branches: - main + - release push: branches: - main + - release - "dev/v-peq/**" jobs: diff --git a/.github/workflows/deploy-tencent.yml b/.github/workflows/deploy-tencent.yml new file mode 100644 index 0000000..605566d --- /dev/null +++ b/.github/workflows/deploy-tencent.yml @@ -0,0 +1,75 @@ +name: Deploy Tencent + +on: + push: + branches: + - main + - release + workflow_dispatch: + +concurrency: + group: deploy-tencent-${{ github.ref }} + cancel-in-progress: false + +jobs: + deploy: + name: Deploy Web + runs-on: [self-hosted, linux, x64, tencent, meteortest] + environment: tencent + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Resolve target + id: target + shell: bash + run: | + if [ "${GITHUB_REF_NAME}" = "release" ]; then + echo "app_dir=/srv/meteortest-release" >> "$GITHUB_OUTPUT" + echo "pm2_name=meteortest-release" >> "$GITHUB_OUTPUT" + echo "port=3300" >> "$GITHUB_OUTPUT" + else + echo "app_dir=/srv/meteortest" >> "$GITHUB_OUTPUT" + echo "pm2_name=meteortest-web" >> "$GITHUB_OUTPUT" + echo "port=3301" >> "$GITHUB_OUTPUT" + fi + + - name: Deploy + shell: bash + run: | + retry() { + local attempts="$1" + local delay="$2" + shift 2 + + local attempt=1 + until "$@"; do + if [ "$attempt" -ge "$attempts" ]; then + return 1 + fi + + echo "Command failed. Retrying in ${delay}s (${attempt}/${attempts})..." + sleep "$delay" + attempt=$((attempt + 1)) + done + } + + mkdir -p '${{ steps.target.outputs.app_dir }}' + rsync -a --delete \ + --exclude '.git' \ + --exclude 'apps/web/.next' \ + --exclude 'apps/web/node_modules' \ + ./ '${{ steps.target.outputs.app_dir }}/' + + cd '${{ steps.target.outputs.app_dir }}/apps/web' + retry 3 15 npm ci + set -a + . /etc/meteortest/meteortest-web.env + set +a + retry 2 15 npm run build + + pm2 delete '${{ steps.target.outputs.pm2_name }}' || true + unset RUNNER_TRACKING_ID + pm2 start npm --name '${{ steps.target.outputs.pm2_name }}' -- run start -- --hostname 127.0.0.1 --port '${{ steps.target.outputs.port }}' + pm2 save + retry 12 5 curl -fsS 'http://127.0.0.1:${{ steps.target.outputs.port }}/' >/dev/null diff --git a/AGENTS.md b/AGENTS.md index 3262647..3a3b2c7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -281,6 +281,14 @@ git pull origin main git switch -c dev/v-peq/changeName ``` +Release policy: + +- `main` is the integration and Tencent preview deployment branch. +- `release` is the Tencent production deployment branch. +- Keep feature work flowing into `main` first, then promote `main` to `release` through a PR after validation. +- Do not cherry-pick selectively into `release` unless the user explicitly requests an emergency hotfix; sync any hotfix back to `main`. +- Tencent deployment mapping is documented in `docs/tencent-release-deployment.md`. + Branch names should use: ```text diff --git a/PROGRESS.md b/PROGRESS.md index 2dd8336..ac27e14 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -12,6 +12,7 @@ - Supabase 执行手册:`docs/supabase-account-data-runbook.zh-CN.md` - Local Agent 运维:`docs/local-agent-operations.zh-CN.md` - 公网预览部署:`docs/vercel-public-preview.zh-CN.md` +- 腾讯云 Release 部署:`docs/tencent-release-deployment.zh-CN.md` - 私有 Agent 闭环验证:`docs/private-agent-preview-loop.zh-CN.md` - 内部 ID / DTO 边界:`docs/internal-id-exposure-hardening.zh-CN.md` @@ -30,6 +31,13 @@ MeteorTest 当前是早期 Beta 形态的通用自动化测试平台,已经跑 公网 Web 预览地址:`https://meteortest.jcmeteor.com/` +腾讯云部署已拆分为 main 预发和 release 生产: + +```text +main -> mt-pre.jcmeteor.com +release -> meteortest.jcmeteor.com +``` + 公网 Web 只作为控制台入口;Local Agent 继续在私有机器或可信 runner 上主动轮询后端,不暴露到公网。 ## 已完成能力 @@ -44,6 +52,7 @@ MeteorTest 当前是早期 Beta 形态的通用自动化测试平台,已经跑 - 账号级数据:用户偏好、AI 会话历史、平台级 webhook 通知配置。 - 安全边界:public preview 禁止公网启动本机 Agent;浏览器侧逐步使用 DTO 和公开引用,避免暴露内部 UUID。 - Web 体验:多语言、主题、响应式基础布局、设置页、执行器页和本地预览脚本。 +- 发布体系:`release` 分支、`Protect release` ruleset、`v0.1.0` 初始发布基线、腾讯云 self-hosted runner 和 main/release 自动部署入口。 ## 当前主线 diff --git a/README.md b/README.md index e5961ad..6b53bd1 100644 --- a/README.md +++ b/README.md @@ -242,6 +242,17 @@ MeteorTest Web needs a host that can run Next.js server routes. GitHub Pages is Public preview deployment steps live in `docs/vercel-public-preview.md`. Public Web plus private Agent validation lives in `docs/private-agent-preview-loop.md`. +## Tencent Release Deployment + +Tencent deployment uses `main` for preview and `release` for production: + +```text +main -> mt-pre.jcmeteor.com +release -> meteortest.jcmeteor.com +``` + +The detailed runner, branch, ruleset, environment, and port mapping lives in `docs/tencent-release-deployment.md`. + ## Recommended Validation Flow 1. Run Supabase migrations. diff --git a/README.zh-CN.md b/README.zh-CN.md index 10a680d..594f76e 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -242,6 +242,17 @@ MeteorTest Web 需要能运行 Next.js 服务端路由的托管平台。GitHub P 公网预览部署步骤统一见 `docs/vercel-public-preview.zh-CN.md`。公网 Web + 私有 Agent 的联通验证统一见 `docs/private-agent-preview-loop.zh-CN.md`。 +## 腾讯云 Release 部署 + +腾讯云部署使用 `main` 作为预发分支,`release` 作为生产分支: + +```text +main -> mt-pre.jcmeteor.com +release -> meteortest.jcmeteor.com +``` + +runner、分支、ruleset、环境变量和端口映射详见 `docs/tencent-release-deployment.zh-CN.md`。 + ## 推荐验证流程 1. 执行 Supabase 迁移。 diff --git a/docs/README.md b/docs/README.md index bc7ceb0..7e6805f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -23,6 +23,7 @@ This is the single entry point for MeteorTest documentation. Start here for new | Supabase runbook | `supabase-account-data-runbook.md` / `supabase-account-data-runbook.zh-CN.md` | Auth/RLS, preferences, AI history, display refs SQL execution and verification. | | Local Agent operations | `local-agent-operations.md` / `local-agent-operations.zh-CN.md` | Agent daemon, check interval, heartbeat, logs, OpenClaw checks. | | Public preview deployment | `vercel-public-preview.md` / `vercel-public-preview.zh-CN.md` | Vercel public preview deployment and safety checks. | +| Tencent release deployment | `tencent-release-deployment.md` / `tencent-release-deployment.zh-CN.md` | Tencent main/release deployment, runner, branch, and port mapping. | | Private Agent loop | `private-agent-preview-loop.md` / `private-agent-preview-loop.zh-CN.md` | Validation flow for public Web plus private Agent execution. | | Data exposure boundary | `internal-id-exposure-hardening.md` / `internal-id-exposure-hardening.zh-CN.md` | Internal UUIDs, public refs, DTO/View Model rules. | | UI validation | `webui-visual-checklist.md` / `webui-visual-checklist.zh-CN.md` | Theme, layout, responsive, screenshot checklist. | diff --git a/docs/README.zh-CN.md b/docs/README.zh-CN.md index cbd029f..23db1f8 100644 --- a/docs/README.zh-CN.md +++ b/docs/README.zh-CN.md @@ -23,6 +23,7 @@ | Supabase 手册 | `supabase-account-data-runbook.zh-CN.md` / `supabase-account-data-runbook.md` | Auth/RLS、账号偏好、AI 历史、display refs 的 SQL 执行与验证。 | | Local Agent 运维 | `local-agent-operations.zh-CN.md` / `local-agent-operations.md` | Agent 常驻、检查频率、心跳、日志、OpenClaw 巡检。 | | 公网预览部署 | `vercel-public-preview.zh-CN.md` / `vercel-public-preview.md` | Vercel 公网预览部署和安全检查。 | +| 腾讯云 Release 部署 | `tencent-release-deployment.zh-CN.md` / `tencent-release-deployment.md` | 腾讯云 main/release 部署、runner、分支和端口映射。 | | 私有 Agent 闭环 | `private-agent-preview-loop.zh-CN.md` / `private-agent-preview-loop.md` | 私有 Agent 连接公网 Web 后端的验证流程。 | | 数据暴露边界 | `internal-id-exposure-hardening.zh-CN.md` / `internal-id-exposure-hardening.md` | 内部 UUID、公开引用、DTO/View Model 规则。 | | UI 验收 | `webui-visual-checklist.zh-CN.md` / `webui-visual-checklist.md` | WebUI 主题、布局、响应式和截图验收清单。 | diff --git a/docs/tencent-release-deployment.md b/docs/tencent-release-deployment.md new file mode 100644 index 0000000..c5b6785 --- /dev/null +++ b/docs/tencent-release-deployment.md @@ -0,0 +1,64 @@ +# Tencent Release Deployment + +MeteorTest uses two server-side Tencent deployments: + +```text +release branch -> /srv/meteortest-release -> 127.0.0.1:3300 -> meteortest.jcmeteor.com / mt-cn.jcmeteor.com +main branch -> /srv/meteortest -> 127.0.0.1:3301 -> mt-pre.jcmeteor.com / mt-pre-cn.jcmeteor.com +``` + +The public Nginx entry point is port `80`. App ports are bound to `127.0.0.1` only and must not be opened in the Tencent security group. + +## GitHub Setup + +- Branches: + - `main`: integration and preview deployment branch. + - `release`: production release branch. +- Rulesets: + - `Protect main`: existing main protection. + - `Protect release`: requires the `CI` status check and prevents deletion/non-fast-forward updates. +- Runner: + - Repository runner: `tencent-meteortest` + - Labels: `self-hosted`, `linux`, `x64`, `tencent`, `meteortest` +- Workflow: + - `.github/workflows/ci.yml`: validates `main`, `release`, and `dev/v-peq/**`. + - `.github/workflows/deploy-tencent.yml`: deploys `main` and `release`. + +## Server Environment + +Runtime environment variables live on the Tencent server: + +```text +/etc/meteortest/meteortest-web.env +``` + +Do not commit real values. The deploy workflow sources this file before building and starting the Next.js app. + +## Release Flow + +1. Merge feature work into `main`. +2. Let `main` deploy to the preview endpoint: + ```text + mt-pre.jcmeteor.com + mt-pre-cn.jcmeteor.com + ``` +3. Open a PR from `main` into `release`. +4. Wait for `CI`. +5. Merge into `release`. +6. The Tencent deploy workflow updates: + ```text + /srv/meteortest-release + meteortest-release + 127.0.0.1:3300 + ``` +7. Create a GitHub Release tag from `release`. + +## Current Baseline + +The first release baseline is: + +```text +v0.1.0 +``` + +It marks the initial release branch baseline before the dedicated production deployment diverges from main. diff --git a/docs/tencent-release-deployment.zh-CN.md b/docs/tencent-release-deployment.zh-CN.md new file mode 100644 index 0000000..342874a --- /dev/null +++ b/docs/tencent-release-deployment.zh-CN.md @@ -0,0 +1,64 @@ +# 腾讯云 Release 部署 + +MeteorTest 在腾讯云上使用两套服务端部署: + +```text +release 分支 -> /srv/meteortest-release -> 127.0.0.1:3300 -> meteortest.jcmeteor.com / mt-cn.jcmeteor.com +main 分支 -> /srv/meteortest -> 127.0.0.1:3301 -> mt-pre.jcmeteor.com / mt-pre-cn.jcmeteor.com +``` + +公网 Nginx 入口只开放 `80`。应用端口只绑定 `127.0.0.1`,不要在腾讯云安全组中开放。 + +## GitHub 配置 + +- 分支: + - `main`:集成和预发部署分支。 + - `release`:生产发布分支。 +- Rulesets: + - `Protect main`:已有 main 保护。 + - `Protect release`:要求 `CI` 状态检查,禁止删除和非快进更新。 +- Runner: + - 仓库 runner:`tencent-meteortest` + - 标签:`self-hosted`、`linux`、`x64`、`tencent`、`meteortest` +- Workflow: + - `.github/workflows/ci.yml`:验证 `main`、`release` 和 `dev/v-peq/**`。 + - `.github/workflows/deploy-tencent.yml`:部署 `main` 和 `release`。 + +## 服务器环境变量 + +运行时环境变量放在腾讯云服务器: + +```text +/etc/meteortest/meteortest-web.env +``` + +不要提交真实值。部署 workflow 会在构建和启动 Next.js 前读取这个文件。 + +## 发布流程 + +1. 功能变更先合入 `main`。 +2. `main` 自动部署到预发入口: + ```text + mt-pre.jcmeteor.com + mt-pre-cn.jcmeteor.com + ``` +3. 从 `main` 向 `release` 开 PR。 +4. 等待 `CI` 通过。 +5. 合入 `release`。 +6. 腾讯云部署 workflow 更新: + ```text + /srv/meteortest-release + meteortest-release + 127.0.0.1:3300 + ``` +7. 从 `release` 创建 GitHub Release tag。 + +## 当前基线 + +第一个 release 基线是: + +```text +v0.1.0 +``` + +它标记 release 分支建立时的初始生产基线。 From 77fc40790172496d9de12f45ce87d78d9bead78c Mon Sep 17 00:00:00 2001 From: Connor Date: Fri, 5 Jun 2026 23:51:15 +0800 Subject: [PATCH 2/5] Update release baseline version docs Clarify v0.1.0 as the initial branch baseline and v0.1.1 as the Tencent deployment baseline. --- docs/tencent-release-deployment.md | 14 +++++++++++--- docs/tencent-release-deployment.zh-CN.md | 14 +++++++++++--- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/docs/tencent-release-deployment.md b/docs/tencent-release-deployment.md index c5b6785..3967ec6 100644 --- a/docs/tencent-release-deployment.md +++ b/docs/tencent-release-deployment.md @@ -53,12 +53,20 @@ Do not commit real values. The deploy workflow sources this file before building ``` 7. Create a GitHub Release tag from `release`. -## Current Baseline +## Release Baselines -The first release baseline is: +The first branch baseline is: ```text v0.1.0 ``` -It marks the initial release branch baseline before the dedicated production deployment diverges from main. +It marks the initial release branch creation point. + +The current Tencent deployment baseline is: + +```text +v0.1.1 +``` + +It includes the protected release branch, self-hosted Tencent runner deployment, and production/preview split. diff --git a/docs/tencent-release-deployment.zh-CN.md b/docs/tencent-release-deployment.zh-CN.md index 342874a..630a72d 100644 --- a/docs/tencent-release-deployment.zh-CN.md +++ b/docs/tencent-release-deployment.zh-CN.md @@ -53,12 +53,20 @@ main 分支 -> /srv/meteortest -> 127.0.0.1:3301 -> mt-pre.jcmeteor.c ``` 7. 从 `release` 创建 GitHub Release tag。 -## 当前基线 +## Release 基线 -第一个 release 基线是: +第一个分支基线是: ```text v0.1.0 ``` -它标记 release 分支建立时的初始生产基线。 +它标记 release 分支建立时的初始位置。 + +当前腾讯云部署基线是: + +```text +v0.1.1 +``` + +它包含受保护的 release 分支、腾讯云 self-hosted runner 部署,以及生产/预发拆分。 From 41e33afbb30553e3487ca886c0053f1f30400002 Mon Sep 17 00:00:00 2001 From: Connor Date: Sat, 6 Jun 2026 00:35:15 +0800 Subject: [PATCH 3/5] Fix security scan alerts --- .github/workflows/ci.yml | 3 + .github/workflows/deploy-tencent.yml | 3 + apps/web/app/api/ai/chat/route.ts | 8 +- apps/web/package-lock.json | 205 ++++++++++++--------------- apps/web/package.json | 8 +- 5 files changed, 114 insertions(+), 113 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 898510b..31ed4a8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,8 @@ name: CI +permissions: + contents: read + on: pull_request: branches: diff --git a/.github/workflows/deploy-tencent.yml b/.github/workflows/deploy-tencent.yml index 605566d..603b882 100644 --- a/.github/workflows/deploy-tencent.yml +++ b/.github/workflows/deploy-tencent.yml @@ -1,5 +1,8 @@ name: Deploy Tencent +permissions: + contents: read + on: push: branches: diff --git a/apps/web/app/api/ai/chat/route.ts b/apps/web/app/api/ai/chat/route.ts index 865e21a..5540c53 100644 --- a/apps/web/app/api/ai/chat/route.ts +++ b/apps/web/app/api/ai/chat/route.ts @@ -99,6 +99,10 @@ function uniqueSuggestions(suggestions: Suggestion[]) { }).slice(0, 6) } +function includesAny(text: string, keywords: string[]) { + return keywords.some(keyword => text.includes(keyword)) +} + function relationLabel(value: NamedRelation) { const item = Array.isArray(value) ? value[0] : value return item?.name ?? item?.key ?? item?.suite_key ?? '' @@ -237,7 +241,9 @@ function buildSuggestions(message: string, reply: string, snapshot: { projects: ] } - if (/(最近|latest|recent|列表|list|列出|查看).*(任务|task)|任务.*(列表|list|最近|latest|recent)/.test(currentText)) { + const asksForTaskList = includesAny(currentText, ['最近', 'latest', 'recent', '列表', 'list', '列出', '查看']) + && includesAny(currentText, ['任务', 'task']) + if (asksForTaskList) { return buildTaskListSuggestions(snapshot, copy) } diff --git a/apps/web/package-lock.json b/apps/web/package-lock.json index 3eb84ee..327f107 100644 --- a/apps/web/package-lock.json +++ b/apps/web/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@supabase/ssr": "^0.10.2", "@supabase/supabase-js": "^2.105.1", - "next": "16.2.4", + "next": "^16.2.7", "openai": "^6.35.0", "react": "19.2.4", "react-dom": "19.2.4" @@ -1054,9 +1054,9 @@ } }, "node_modules/@next/env": { - "version": "16.2.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.4.tgz", - "integrity": "sha512-dKkkOzOSwFYe5RX6y26fZgkSpVAlIOJKQHIiydQcrWH6y/97+RceSOAdjZ14Qa3zLduVUy0TXcn+EiM6t4rPgw==", + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.7.tgz", + "integrity": "sha512-tMJizPlj6ZYpBMMdK8S0LJufrP4QTdR6pcv9KQ/bVETPAmg0j1mlHE9G2c38UyGHxoBapgwuj7XjbGJ2RcDFOg==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { @@ -1070,9 +1070,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "16.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.4.tgz", - "integrity": "sha512-OXTFFox5EKN1Ym08vfrz+OXxmCcEjT4SFMbNRsWZE99dMqt2Kcusl5MqPXcW232RYkMLQTy0hqgAMEsfEd/l2A==", + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.7.tgz", + "integrity": "sha512-vm1EDI/pVaBNNiychmxk3fft+OhQPVD9cIM/tReLZIQ3TfQ4kqI9DwKk00dzuS1ulC7icbrzCFrmRRlk9PfNdw==", "cpu": [ "arm64" ], @@ -1086,9 +1086,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "16.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.4.tgz", - "integrity": "sha512-XhpVnUfmYWvD3YrXu55XdcAkQtOnvaI6wtQa8fuF5fGoKoxIUZ0kWPtcOfqJEWngFF/lOS9l3+O9CcownhiQxQ==", + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.7.tgz", + "integrity": "sha512-O3IRSv1ZBL1zs0WrIgefTEcTKFVn+ryxBNe54erJ6KsD+2f/Mmt7g2jOYh8PSBdUwPtKQJuCsTMlZ7tIu2AcsQ==", "cpu": [ "x64" ], @@ -1102,12 +1102,15 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.4.tgz", - "integrity": "sha512-Mx/tjlNA3G8kg14QvuGAJ4xBwPk1tUHq56JxZ8CXnZwz1Etz714soCEzGQQzVMz4bEnGPowzkV6Xrp6wAkEWOQ==", + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.7.tgz", + "integrity": "sha512-Re6PZtjBDd0aMU+VcZcC/PrIvj4WhrjDYtMhhCVQamWN4L90EVP0pcEOBQD25prSlw7OzNw5QpHLWMilRLsRNw==", "cpu": [ "arm64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1118,12 +1121,15 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.4.tgz", - "integrity": "sha512-iVMMp14514u7Nup2umQS03nT/bN9HurK8ufylC3FZNykrwjtx7V1A7+4kvhbDSCeonTVqV3Txnv0Lu+m2oDXNg==", + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.7.tgz", + "integrity": "sha512-qyogG9QtBzWxgJfeGBvOEHI3851gTfCF3wLZ5RDLTBJGAmE9p1qDwKCOdrBrvBzRvYDT+gUDp72pzlSEfAXgNA==", "cpu": [ "arm64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1134,12 +1140,15 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.4.tgz", - "integrity": "sha512-EZOvm1aQWgnI/N/xcWOlnS3RQBk0VtVav5Zo7n4p0A7UKyTDx047k8opDbXgBpHl4CulRqRfbw3QrX2w5UOXMQ==", + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.7.tgz", + "integrity": "sha512-Vhe4ZDuBpmMogrGi5D4R2Kq4JAQlj6+wvgaFYy31zfES0zPmt6TLA+cuYpM/OLrPZjo2MYQTHVqNUSCR6+fDZQ==", "cpu": [ "x64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1150,12 +1159,15 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "16.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.4.tgz", - "integrity": "sha512-h9FxsngCm9cTBf71AR4fGznDEDx1hS7+kSEiIRjq5kO1oXWm07DxVGZjCvk0SGx7TSjlUqhI8oOyz7NfwAdPoA==", + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.7.tgz", + "integrity": "sha512-srvian89JahFLw1YLBEuhvPJ0DO5lpUeJQMXy4xYo7g628ZlNgXdNkqoxSAv9OYrBfByh6vxISMwW/mRbzCY+g==", "cpu": [ "x64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1166,9 +1178,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.4.tgz", - "integrity": "sha512-3NdJV5OXMSOeJYijX+bjaLge3mJBlh4ybydbT4GFoB/2hAojWHtMhl3CYlYoMrjPuodp0nzFVi4Tj2+WaMg+Ow==", + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.7.tgz", + "integrity": "sha512-GX3wvLpULFuRFJzwHaKfm7QZJ18F4ZSuxlPJ96BoBglCzBmdSjyeBKF+ZhWhvL/ckxNfLnNa7bsObO2ipYpszw==", "cpu": [ "arm64" ], @@ -1182,9 +1194,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.2.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.4.tgz", - "integrity": "sha512-kMVGgsqhO5YTYODD9IPGGhA6iprWidQckK3LmPeW08PIFENRmgfb4MjXHO+p//d+ts2rpjvK5gXWzXSMrPl9cw==", + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.7.tgz", + "integrity": "sha512-J4WlM72NMk076Qsg0jTdK3SNXatlSdnjW7L7oNGLst1tAGjHrJh/FYi+pw9wyIjEtGRKDNzD0zuiY16oWYWVaw==", "cpu": [ "x64" ], @@ -1895,29 +1907,6 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "10.2.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", @@ -2558,11 +2547,14 @@ } }, "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/baseline-browser-mapping": { "version": "2.10.24", @@ -2577,14 +2569,16 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/braces": { @@ -5055,6 +5049,24 @@ "node": "*" } }, + "node_modules/minimatch/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/minimatch/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -5073,9 +5085,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -5114,12 +5126,12 @@ "license": "MIT" }, "node_modules/next": { - "version": "16.2.4", - "resolved": "https://registry.npmjs.org/next/-/next-16.2.4.tgz", - "integrity": "sha512-kPvz56wF5frc+FxlHI5qnklCzbq53HTwORaWBGdT0vNoKh1Aya9XC8aPauH4NJxqtzbWsS5mAbctm4cr+EkQ2Q==", + "version": "16.2.7", + "resolved": "https://registry.npmjs.org/next/-/next-16.2.7.tgz", + "integrity": "sha512-eMJxgjRzBaj3olkP4cBamHDXL79A8FC6u1GcsO1D1Tsx8bw/LLXUJCaoajVxtnhD3A1IJqIT8IcRJjgBIPJq4w==", "license": "MIT", "dependencies": { - "@next/env": "16.2.4", + "@next/env": "16.2.7", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.9.19", "caniuse-lite": "^1.0.30001579", @@ -5133,14 +5145,14 @@ "node": ">=20.9.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "16.2.4", - "@next/swc-darwin-x64": "16.2.4", - "@next/swc-linux-arm64-gnu": "16.2.4", - "@next/swc-linux-arm64-musl": "16.2.4", - "@next/swc-linux-x64-gnu": "16.2.4", - "@next/swc-linux-x64-musl": "16.2.4", - "@next/swc-win32-arm64-msvc": "16.2.4", - "@next/swc-win32-x64-msvc": "16.2.4", + "@next/swc-darwin-arm64": "16.2.7", + "@next/swc-darwin-x64": "16.2.7", + "@next/swc-linux-arm64-gnu": "16.2.7", + "@next/swc-linux-arm64-musl": "16.2.7", + "@next/swc-linux-x64-gnu": "16.2.7", + "@next/swc-linux-x64-musl": "16.2.7", + "@next/swc-win32-arm64-msvc": "16.2.7", + "@next/swc-win32-x64-msvc": "16.2.7", "sharp": "^0.34.5" }, "peerDependencies": { @@ -5166,34 +5178,6 @@ } } }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/node-exports-info": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", @@ -5502,10 +5486,9 @@ } }, "node_modules/postcss": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz", - "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==", - "dev": true, + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", "funding": [ { "type": "opencollective", @@ -5522,7 +5505,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -6699,9 +6682,9 @@ } }, "node_modules/ws": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", - "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "license": "MIT", "engines": { "node": ">=10.0.0" diff --git a/apps/web/package.json b/apps/web/package.json index 0261c85..59f27b7 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -14,7 +14,7 @@ "dependencies": { "@supabase/ssr": "^0.10.2", "@supabase/supabase-js": "^2.105.1", - "next": "16.2.4", + "next": "^16.2.7", "openai": "^6.35.0", "react": "19.2.4", "react-dom": "19.2.4" @@ -30,5 +30,11 @@ "js-yaml": "^4.1.1", "tailwindcss": "^4", "typescript": "^5" + }, + "overrides": { + "minimatch@10.2.5": { + "brace-expansion": "5.0.6" + }, + "postcss": "8.5.15" } } From 79f96ec30f50a62ce8d3284f0f5334775f6ac562 Mon Sep 17 00:00:00 2001 From: ConnorQi Date: Sat, 6 Jun 2026 15:40:42 +0800 Subject: [PATCH 4/5] Align Tencent deploy ports --- .github/workflows/deploy-tencent.yml | 4 ++-- docs/tencent-release-deployment.md | 6 +++--- docs/tencent-release-deployment.zh-CN.md | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/deploy-tencent.yml b/.github/workflows/deploy-tencent.yml index 603b882..0414690 100644 --- a/.github/workflows/deploy-tencent.yml +++ b/.github/workflows/deploy-tencent.yml @@ -30,11 +30,11 @@ jobs: if [ "${GITHUB_REF_NAME}" = "release" ]; then echo "app_dir=/srv/meteortest-release" >> "$GITHUB_OUTPUT" echo "pm2_name=meteortest-release" >> "$GITHUB_OUTPUT" - echo "port=3300" >> "$GITHUB_OUTPUT" + echo "port=3200" >> "$GITHUB_OUTPUT" else echo "app_dir=/srv/meteortest" >> "$GITHUB_OUTPUT" echo "pm2_name=meteortest-web" >> "$GITHUB_OUTPUT" - echo "port=3301" >> "$GITHUB_OUTPUT" + echo "port=3201" >> "$GITHUB_OUTPUT" fi - name: Deploy diff --git a/docs/tencent-release-deployment.md b/docs/tencent-release-deployment.md index 3967ec6..5ffb365 100644 --- a/docs/tencent-release-deployment.md +++ b/docs/tencent-release-deployment.md @@ -3,8 +3,8 @@ MeteorTest uses two server-side Tencent deployments: ```text -release branch -> /srv/meteortest-release -> 127.0.0.1:3300 -> meteortest.jcmeteor.com / mt-cn.jcmeteor.com -main branch -> /srv/meteortest -> 127.0.0.1:3301 -> mt-pre.jcmeteor.com / mt-pre-cn.jcmeteor.com +release branch -> /srv/meteortest-release -> 127.0.0.1:3200 -> meteortest.jcmeteor.com / mt-cn.jcmeteor.com +main branch -> /srv/meteortest -> 127.0.0.1:3201 -> mt-pre.jcmeteor.com / mt-pre-cn.jcmeteor.com ``` The public Nginx entry point is port `80`. App ports are bound to `127.0.0.1` only and must not be opened in the Tencent security group. @@ -49,7 +49,7 @@ Do not commit real values. The deploy workflow sources this file before building ```text /srv/meteortest-release meteortest-release - 127.0.0.1:3300 + 127.0.0.1:3200 ``` 7. Create a GitHub Release tag from `release`. diff --git a/docs/tencent-release-deployment.zh-CN.md b/docs/tencent-release-deployment.zh-CN.md index 630a72d..b697845 100644 --- a/docs/tencent-release-deployment.zh-CN.md +++ b/docs/tencent-release-deployment.zh-CN.md @@ -3,8 +3,8 @@ MeteorTest 在腾讯云上使用两套服务端部署: ```text -release 分支 -> /srv/meteortest-release -> 127.0.0.1:3300 -> meteortest.jcmeteor.com / mt-cn.jcmeteor.com -main 分支 -> /srv/meteortest -> 127.0.0.1:3301 -> mt-pre.jcmeteor.com / mt-pre-cn.jcmeteor.com +release 分支 -> /srv/meteortest-release -> 127.0.0.1:3200 -> meteortest.jcmeteor.com / mt-cn.jcmeteor.com +main 分支 -> /srv/meteortest -> 127.0.0.1:3201 -> mt-pre.jcmeteor.com / mt-pre-cn.jcmeteor.com ``` 公网 Nginx 入口只开放 `80`。应用端口只绑定 `127.0.0.1`,不要在腾讯云安全组中开放。 @@ -49,7 +49,7 @@ main 分支 -> /srv/meteortest -> 127.0.0.1:3301 -> mt-pre.jcmeteor.c ```text /srv/meteortest-release meteortest-release - 127.0.0.1:3300 + 127.0.0.1:3200 ``` 7. 从 `release` 创建 GitHub Release tag。 From d19410a019efe6795f94fb53754c610408d3a383 Mon Sep 17 00:00:00 2001 From: ConnorQi Date: Sat, 6 Jun 2026 15:53:51 +0800 Subject: [PATCH 5/5] Prepare v0.1.2 release --- PROGRESS.md | 2 +- apps/web/package-lock.json | 4 +-- apps/web/package.json | 2 +- docs/releases/v0.1.2.md | 39 ++++++++++++++++++++++++ docs/tencent-release-deployment.md | 4 +-- docs/tencent-release-deployment.zh-CN.md | 4 +-- 6 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 docs/releases/v0.1.2.md diff --git a/PROGRESS.md b/PROGRESS.md index ac27e14..0c562d8 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -52,7 +52,7 @@ release -> meteortest.jcmeteor.com - 账号级数据:用户偏好、AI 会话历史、平台级 webhook 通知配置。 - 安全边界:public preview 禁止公网启动本机 Agent;浏览器侧逐步使用 DTO 和公开引用,避免暴露内部 UUID。 - Web 体验:多语言、主题、响应式基础布局、设置页、执行器页和本地预览脚本。 -- 发布体系:`release` 分支、`Protect release` ruleset、`v0.1.0` 初始发布基线、腾讯云 self-hosted runner 和 main/release 自动部署入口。 +- 发布体系:`release` 分支、`Protect release` ruleset、`v0.1.0` 初始发布基线、`v0.1.2` 腾讯云部署基线、腾讯云 self-hosted runner 和 main/release 自动部署入口。 ## 当前主线 diff --git a/apps/web/package-lock.json b/apps/web/package-lock.json index 327f107..dd2ea5f 100644 --- a/apps/web/package-lock.json +++ b/apps/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "meteortest-web", - "version": "0.1.0", + "version": "0.1.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "meteortest-web", - "version": "0.1.0", + "version": "0.1.2", "dependencies": { "@supabase/ssr": "^0.10.2", "@supabase/supabase-js": "^2.105.1", diff --git a/apps/web/package.json b/apps/web/package.json index 59f27b7..618ce9d 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "meteortest-web", - "version": "0.1.0", + "version": "0.1.2", "private": true, "scripts": { "dev": "next dev", diff --git a/docs/releases/v0.1.2.md b/docs/releases/v0.1.2.md new file mode 100644 index 0000000..0d4e04c --- /dev/null +++ b/docs/releases/v0.1.2.md @@ -0,0 +1,39 @@ +# Release Notes + +Release focus: Tencent release deployment track, security scan fixes, and server port alignment. + +## Highlights + +- Added the Tencent release deployment track for `main` preview and `release` production. +- Added release deployment documentation in English and Chinese. +- Fixed security scan alerts in the Web/API code path and dependency overrides. +- Aligned Tencent server ports with the shared deployment plan: + - `release` / production: `127.0.0.1:3200` + - `main` / preview: `127.0.0.1:3201` +- Updated CI and deployment workflow configuration for the release branch. + +## Deployment + +Current Tencent deployment mapping: + +```text +release branch -> /srv/meteortest-release -> 127.0.0.1:3200 -> meteortest.jcmeteor.com / mt-cn.jcmeteor.com +main branch -> /srv/meteortest -> 127.0.0.1:3201 -> mt-pre.jcmeteor.com / mt-pre-cn.jcmeteor.com +``` + +App ports are bound to `127.0.0.1` only. Public traffic should go through Nginx on HTTPS. + +## Versioning + +- Web version: `0.1.2` +- Release tag: `v0.1.2` + +## Validation + +Before publishing: + +```bash +cd apps/web +npm run lint +npm run build +``` diff --git a/docs/tencent-release-deployment.md b/docs/tencent-release-deployment.md index 5ffb365..da724ea 100644 --- a/docs/tencent-release-deployment.md +++ b/docs/tencent-release-deployment.md @@ -66,7 +66,7 @@ It marks the initial release branch creation point. The current Tencent deployment baseline is: ```text -v0.1.1 +v0.1.2 ``` -It includes the protected release branch, self-hosted Tencent runner deployment, and production/preview split. +It includes the protected release branch, self-hosted Tencent runner deployment, production/preview split, and the `3200/3201` MeteorTest port alignment. diff --git a/docs/tencent-release-deployment.zh-CN.md b/docs/tencent-release-deployment.zh-CN.md index b697845..a34f7d1 100644 --- a/docs/tencent-release-deployment.zh-CN.md +++ b/docs/tencent-release-deployment.zh-CN.md @@ -66,7 +66,7 @@ v0.1.0 当前腾讯云部署基线是: ```text -v0.1.1 +v0.1.2 ``` -它包含受保护的 release 分支、腾讯云 self-hosted runner 部署,以及生产/预发拆分。 +它包含受保护的 release 分支、腾讯云 self-hosted runner 部署、生产/预发拆分,以及 MeteorTest `3200/3201` 端口对齐。