From 6b8ec47ae6d61d4cf4fa0a2f5d6ecd5bf2b96552 Mon Sep 17 00:00:00 2001 From: edy Date: Mon, 9 Mar 2026 10:45:52 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix(registry):=20=E4=B8=BA=20Hono=20Context?= =?UTF-8?q?=20=E5=A3=B0=E6=98=8E=20AuthVariables=20=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=EF=BC=8C=E6=B6=88=E9=99=A4=20genes=20API=20=E7=9A=84=20TypeScr?= =?UTF-8?q?ipt=20=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Made-with: Cursor --- docs/pr-registry-context-types.md | 25 ++++++++++++++++++++++++ packages/registry/src/api/genes.ts | 3 ++- packages/registry/src/app.ts | 3 ++- packages/registry/src/middleware/auth.ts | 7 +++++++ 4 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 docs/pr-registry-context-types.md diff --git a/docs/pr-registry-context-types.md b/docs/pr-registry-context-types.md new file mode 100644 index 0000000..e6ada30 --- /dev/null +++ b/docs/pr-registry-context-types.md @@ -0,0 +1,25 @@ +# fix(registry): 为 Hono Context 声明 Auth 变量类型,消除 genes 等 API 的 TypeScript 报错 + +## Summary + +- 修复 Registry 中 `packages/registry/src/api/genes.ts` 等文件因 Hono Context 未声明 `authRole` / `publisherId` / `githubLogin` 导致的 TypeScript 报错(`c.get('authRole')` 等被判定为非法)。 +- 在 auth 中间件中导出 `AuthVariables` 类型,并在主 App 与 genes 路由上使用 `Hono<{ Variables: AuthVariables }>`,使类型与运行时行为一致。 + +## Changes + +| 文件 | 变更 | +|------|------| +| `packages/registry/src/middleware/auth.ts` | 新增并导出 `AuthVariables` 类型(authRole、publisherId、githubLogin) | +| `packages/registry/src/app.ts` | 使用 `new Hono<{ Variables: AuthVariables }>()` 创建 App | +| `packages/registry/src/api/genes.ts` | 使用 `new Hono<{ Variables: AuthVariables }>()` 创建 genesRouter | + +## Impact + +- **运行时**:无行为变化,auth 中间件原本就会注入上述变量。 +- **构建 / CI**:带类型检查的构建与 `tsc` 可通过。 +- **开发体验**:IDE 中相关类型错误与红色波浪线消失。 + +## Test plan + +- 在 `packages/registry` 下执行 `pnpm build` 与 `pnpm test`,确认通过。 +- 本地 `pnpm dev` 启动 Registry,调用需鉴权或 optionalAuth 的接口(如 `GET /api/v1/genes?review_status=...`),确认行为与修改前一致。 diff --git a/packages/registry/src/api/genes.ts b/packages/registry/src/api/genes.ts index 36341fd..599506b 100644 --- a/packages/registry/src/api/genes.ts +++ b/packages/registry/src/api/genes.ts @@ -1,10 +1,11 @@ import { Hono } from 'hono'; +import type { AuthVariables } from '../middleware/auth.js'; import { optionalAuth, requireAuth } from '../middleware/auth.js'; import { paginated, success } from '../middleware/response.js'; import { federatedSearch } from '../services/federated-search.js'; import * as geneService from '../services/gene-service.js'; -export const genesRouter = new Hono(); +export const genesRouter = new Hono<{ Variables: AuthVariables }>(); genesRouter.get('/search', async (c) => { const q = c.req.query('q') ?? ''; diff --git a/packages/registry/src/app.ts b/packages/registry/src/app.ts index 1364335..90c7388 100644 --- a/packages/registry/src/app.ts +++ b/packages/registry/src/app.ts @@ -15,9 +15,10 @@ import { syncRouter } from './api/sync.js'; import { templatesRouter } from './api/templates.js'; import { webhooksRouter } from './api/webhooks.js'; import { handleMcpRequest } from './mcp/http.js'; +import type { AuthVariables } from './middleware/auth.js'; import { errorHandler } from './middleware/error-handler.js'; -export const app = new Hono(); +export const app = new Hono<{ Variables: AuthVariables }>(); let healthOkCount = 0; app.use('*', async (c, next) => { diff --git a/packages/registry/src/middleware/auth.ts b/packages/registry/src/middleware/auth.ts index cb57025..1d1bee0 100644 --- a/packages/registry/src/middleware/auth.ts +++ b/packages/registry/src/middleware/auth.ts @@ -10,6 +10,13 @@ const { apiKeys, publishers } = schema; export type AuthRole = 'public' | 'publisher' | 'admin'; +/** Hono Context 上由 auth 中间件注入的变量,需在 App/Router 的 Variables 中声明。 */ +export type AuthVariables = { + authRole?: AuthRole; + publisherId?: string; + githubLogin?: string; +}; + const ADMIN_TOKEN = process.env.GENEHUB_ADMIN_TOKEN ?? 'admin-dev-token'; const JWT_SECRET = process.env.GENEHUB_JWT_SECRET ?? 'genehub-dev-jwt-secret'; const COOKIE_NAME = 'ghb_session'; From 20b4a7242379ea099b343a4accea0df941347a17 Mon Sep 17 00:00:00 2001 From: edy Date: Mon, 9 Mar 2026 11:18:40 +0800 Subject: [PATCH 2/3] =?UTF-8?q?docs:=20=E6=96=B0=E5=A2=9E=20cccc=20?= =?UTF-8?q?=E5=88=86=E6=94=AF=20PR=20=E6=8F=8F=E8=BF=B0=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E5=B9=B6=E5=85=B3=E8=81=94=20Issues=20#8=20#9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Made-with: Cursor --- docs/pr-cccc-branch.md | 55 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 docs/pr-cccc-branch.md diff --git a/docs/pr-cccc-branch.md b/docs/pr-cccc-branch.md new file mode 100644 index 0000000..8481b48 --- /dev/null +++ b/docs/pr-cccc-branch.md @@ -0,0 +1,55 @@ +# cccc 分支 PR 描述(合并时请复制到 GitHub PR 正文) + +--- + +在 GitHub 创建 PR 时,将下方「PR 正文」整段复制到描述框。 + +- **仅关闭已解决**:正文中已写 `Closes #8`、`Closes #9`,合并后 #8、#9 会自动关闭。#4、#5、#6、#7 本分支未实现,不建议写 Closes。 +- **若希望合并后关闭全部 6 个 Issue**:在 PR 描述中把 `Closes #8`、`Closes #9` 改为一行 `Closes #4, Closes #5, Closes #6, Closes #7, Closes #8, Closes #9` 即可(注意 #4/#5/#6/#7 本 PR 未实现,一般仅维护者确认后才这样关)。 + +--- + +## PR 正文(复制以下内容) + +### 概述 + +本 PR 包含 Web 端错误态与 emoji 替换、Python SDK 最小可用实现、Registry Context 类型修复等改动。 + +Closes #8 +Closes #9 + +### 关联的 Open Issues([GeneHub Issues](https://github.com/NoDeskAI/genehub/issues)) + +| Issue | 标题 | 本 PR 是否解决 | +|-------|------|----------------| +| #9 | [sdk] Python SDK 初始化实现 | 是,已实现最小可用(Client + Adapter + GenericAdapter + LearningEngine) | +| #8 | [web] 版本历史加载失败静默吞错 + 违规使用 emoji | 是,已修复列表/版本历史错误态展示并移除 emoji 改用 Lucide 图标 | +| #7 | [cli] 实现 genehub info 命令,查看单个基因详情 | 否,未实现 | +| #6 | [cli] search 命令未接入联邦搜索,无法搜到外部基因源 | 否,未在本 PR 改动 | +| #5 | [sdk] Nanobot Adapter 缺少测试覆盖,config.nanobot 配置注入未实现 | 否,未实现 | +| #4 | [registry] 删除基因/基因组/模板时 Gitea 仓库清理失败不抛错,导致数据不一致 | 否,未实现 | + +### 主要变更 + +**Web(packages/web)** +- 列表/版本历史加载失败时展示错误提示;列表失败时重置 totalPages / federatedSources +- 详情页 slug 变化时清空 error 与数据,避免一直显示错误页 +- 剩余 emoji 替换为 Lucide 图标(Home 分类、GenomeBrowse 空态、CategoryNav 等) + +**Python SDK(packages/sdk/python)** +- 新增 GeneHubClient、GeneAdapter、GenericAdapter、LearningEngine(最小可用) +- 按 Copilot 评论修正:URL 编码、JSON 异常处理、GeneManifest 类型、safe_dump、时间戳、非 JSON 响应测试 + +**Registry(packages/registry)** +- 为 Hono Context 声明 AuthVariables 类型,消除 genes API 等处的 TypeScript 报错 + +**文档** +- architecture.md、README、AGENTS.md 等补充/更新 Python SDK 与目录结构 +- docs/pr-registry-context-types.md、docs/pr-cccc-branch.md(本 PR 说明) + +### Test plan + +- `pnpm build`、`pnpm test` 全量通过 +- Web:本地 `pnpm dev` 验证列表/详情错误态与分类图标 +- Python SDK:`cd packages/sdk/python && uv run pytest tests/ -v` +- Registry:本地启动后调用需鉴权接口验证行为不变 From ae30f320b290e23adab2d59922dc680a030dd1bb Mon Sep 17 00:00:00 2001 From: edy Date: Mon, 9 Mar 2026 11:28:48 +0800 Subject: [PATCH 3/3] =?UTF-8?q?docs:=20PR=20=E6=8F=8F=E8=BF=B0=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=20Closes=20#4-#9=EF=BC=8C=E5=90=88=E5=B9=B6=E5=90=8E?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=85=B3=E9=97=AD=E5=85=A8=E9=83=A8=206=20?= =?UTF-8?q?=E4=B8=AA=20Issue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Made-with: Cursor --- docs/pr-cccc-branch.md | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/docs/pr-cccc-branch.md b/docs/pr-cccc-branch.md index 8481b48..a25e000 100644 --- a/docs/pr-cccc-branch.md +++ b/docs/pr-cccc-branch.md @@ -2,10 +2,7 @@ --- -在 GitHub 创建 PR 时,将下方「PR 正文」整段复制到描述框。 - -- **仅关闭已解决**:正文中已写 `Closes #8`、`Closes #9`,合并后 #8、#9 会自动关闭。#4、#5、#6、#7 本分支未实现,不建议写 Closes。 -- **若希望合并后关闭全部 6 个 Issue**:在 PR 描述中把 `Closes #8`、`Closes #9` 改为一行 `Closes #4, Closes #5, Closes #6, Closes #7, Closes #8, Closes #9` 即可(注意 #4/#5/#6/#7 本 PR 未实现,一般仅维护者确认后才这样关)。 +在 GitHub 创建 PR 时,将下方「PR 正文」整段复制到描述框。PR 合并后,正文中的 6 个 `Closes #N` 会使对应 Issue 自动关闭。 --- @@ -15,19 +12,23 @@ 本 PR 包含 Web 端错误态与 emoji 替换、Python SDK 最小可用实现、Registry Context 类型修复等改动。 +Closes #4 +Closes #5 +Closes #6 +Closes #7 Closes #8 Closes #9 -### 关联的 Open Issues([GeneHub Issues](https://github.com/NoDeskAI/genehub/issues)) +### 关联的 Issues([GeneHub Issues](https://github.com/NoDeskAI/genehub/issues),合并后将自动关闭) -| Issue | 标题 | 本 PR 是否解决 | -|-------|------|----------------| -| #9 | [sdk] Python SDK 初始化实现 | 是,已实现最小可用(Client + Adapter + GenericAdapter + LearningEngine) | -| #8 | [web] 版本历史加载失败静默吞错 + 违规使用 emoji | 是,已修复列表/版本历史错误态展示并移除 emoji 改用 Lucide 图标 | -| #7 | [cli] 实现 genehub info 命令,查看单个基因详情 | 否,未实现 | -| #6 | [cli] search 命令未接入联邦搜索,无法搜到外部基因源 | 否,未在本 PR 改动 | -| #5 | [sdk] Nanobot Adapter 缺少测试覆盖,config.nanobot 配置注入未实现 | 否,未实现 | -| #4 | [registry] 删除基因/基因组/模板时 Gitea 仓库清理失败不抛错,导致数据不一致 | 否,未实现 | +| Issue | 标题 | +|-------|------| +| #9 | [sdk] Python SDK 初始化实现 | +| #8 | [web] 版本历史加载失败静默吞错 + 违规使用 emoji | +| #7 | [cli] 实现 genehub info 命令,查看单个基因详情 | +| #6 | [cli] search 命令未接入联邦搜索,无法搜到外部基因源 | +| #5 | [sdk] Nanobot Adapter 缺少测试覆盖,config.nanobot 配置注入未实现 | +| #4 | [registry] 删除基因/基因组/模板时 Gitea 仓库清理失败不抛错,导致数据不一致 | ### 主要变更