imbytecat
27e5f3c76f
chore(vite): remove server block (no need to pin port 3000 strict)
...
vite default already binds 3000 if available; no real requirement to
strict-port. AGENTS.md / README.md synced.
2026-04-25 17:19:27 +08:00
imbytecat
4a78ba2882
refactor(db): UUIDv7 \u751f\u6210\u4e0b\u63a8\u5230 PG18 \u539f\u751f uuidv7()\uff0c\u8005\u53ea\u6539 schema
...
\u53ea\u6539 schema \u5c42\u9762\uff1a
- src/server/db/fields.ts:
$defaultFn(() => Bun.randomUUIDv7()) \u2192 default(sql`uuidv7()`)
- AGENTS.md Stack & runtime: \u52a0 PG18+ \u786c\u7ea6\u675f
- AGENTS.md Drizzle \u8282\u8bf4\u660e DB-side uuidv7\uff08\u5355\u8c03\u3001\u4f7f\u7528 DB \u65f6\u949f\uff09
- AGENTS.md Bun-native \u539f\u5219\u533a\u5206 app-code UUIDv7 \u4e0e DB PK
- AGENTS.md Don'ts \u9996\u6761\u52a0 "AI \u4e0d\u80fd\u8dd1 db:generate"
\u4f9d\u7136\u9700\u8981\u4f60\u624b\u52a8\u8dd1 `bun run db:generate` \u4ee5\uff1a
1) \u751f\u6210\u65b0 migration\uff08\u5e94\u8be5\u662f DROP \u8001\u8868 + CREATE \u65b0\u8868\uff0c
\u6216\u4f60\u624b\u5199 ALTER COLUMN id SET DEFAULT uuidv7()\uff09
2) \u91cd\u751f migrations.gen.ts
\u672c commit \u72b6\u6001\u4e0b\u8fd0\u884c\u65f6\u5c1a\u4e0d\u53ef\u7528\uff08\u8001 migration \u672a\u8bbe DEFAULT\uff0c
\u63d2\u5165\u4f1a\u62a5 NOT NULL \u9519\uff09\uff1bdb:generate \u540e\u91cd\u65b0 build/compile/deploy \u624d\u662f
\u5b8c\u6574\u72b6\u6001\u3002fix / typecheck / test 3/3 \u5747\u8fc7\uff08\u9759\u6001\u68c0\u67e5\u4e0d\u4f9d\u8d56 migration\uff09\u3002
2026-04-25 17:12:06 +08:00
imbytecat
fafe02bdbd
refactor: 主动审计修复多处可观测性、依赖、代码质量缺口
...
通过并行 explore + librarian + 自查发现并修复:
代码缺陷
- shutdown.ts: db.$client.end().finally(...) 静默吞错——关闭失败会
谎报 "DB pool closed" 后照常 exit 0。改用 await + try/catch
分别记录成功/失败,setTimeout 也换成 Bun.sleep。
- interceptors.ts: 两条 instanceof ORPCError && instanceof
ValidationError 重复检查,改用 early return + 单 if 分支区分 code。
- types.ts: 移除从未被引用的 RouterInputs 死代码(仅 RouterOutputs
被 TodoItem 用到)。
Bun 原生 API(删/换 Node 兼容层)
- fields.ts: uuid v7 → Bun.randomUUIDv7(),删除 uuid 依赖
- migrate.ts: node:crypto.createHash → Bun.CryptoHasher.hash,
少一个 Promise.all 项 + 一个 import
- shutdown.ts: setTimeout → Bun.sleep(顺带)
Biome 2.4 规则补强
- domains.types: "all"——开启类型感知规则集(noFloatingPromises /
noMisusedPromises / useAwaitThenable / noUnnecessaryConditions
等 Promise/异步陷阱)
- domains.drizzle: "recommended"、domains.react: "recommended"
- 显式开启 suspicious.noImportCycles(2.4 已 promote)
文档
- AGENTS.md 在 Stack & runtime 段加 "Prefer Bun-native APIs"
原则,列出 UUIDv7/SHA-256/sleep/Bun.file 的优先路径
- AGENTS.md 在 Code style (Biome) 段记录本次启用的 lint domain
与 noImportCycles 规则
验证:fix / typecheck / test 3/3 / build 568ms / compile 117M /
docker compose 全套(migrate JSON 日志 ✓、UUIDv7 写入 ✓、SIGTERM
shutdown 正确序列化 ✓)
2026-04-25 17:06:22 +08:00
imbytecat
815ee31f95
refactor(layout): 根目录脚本归位 src/ 与 scripts/,sql.d.ts 下沉到 db/
...
- bin.ts → src/bin.ts (生产入口归并到 src/,import 改用 #package + @/cli/*)
- compile.ts → scripts/compile.ts (开发期工具)
- embed-migrations.ts → scripts/embed-migrations.ts (codegen)
- src/sql.d.ts → src/server/db/sql.d.ts (与唯一消费者 migrations.gen.ts 共址)
效果:项目根从 3 个零散 .ts 减为 0 个,src/ 是完整应用源码,scripts/
明确区分开发期工具。所有 package.json scripts、AGENTS.md layout/CLI 章节、
compile.ts ENTRYPOINT 与 .js.map 清理路径同步更新。
验证:fix / typecheck / test 3/3 / build 570ms / compile 117M / docker
compose 全套(migrate 干净的 logger=cli.migrate JSON 日志、app /health
200、POST /api/todo/create 成功)。
2026-04-25 16:50:48 +08:00
imbytecat
f8af18cff5
fix(docker): 移除 stale COPY patches 行修复 docker build
...
d9210b3 升级 TanStack Start 至 1.167.48 时删除了 patches/ 目录
(upstream PR #7249 已修),但漏掉同步更新 Dockerfile,导致
docker build 报 "/patches": not found 失败。
验证:docker compose build app 通过。
2026-04-25 16:37:43 +08:00
imbytecat
34d2cbb1cd
refactor(logging): 二次审计修复 oracle 漏掉的可观测性缺口与占位符冗余
...
二次深度审计发现:
1. shutdown.ts SIGINT/SIGTERM 路径完全沉默——生产环境 k8s pod 终止时
操作者在日志里看不到任何痕迹。补 getLogger(['shutdown']) 三条日志:
- "Draining for shutdown" {signal, graceMs} (优雅关停起点)
- "Forcing exit on repeated signal" {signal} (二次信号强制退出)
- "DB pool closed, exiting" (干净退出确认)
2. interceptors.ts 与 shutdown.ts 的 {error}/{signal} 占位符在 JSON 模式
下导致 message 字段重复 inspect 转义 properties 里的同一份内容
(Error/对象会被 JSON.stringify 内联进 message,引号被反斜杠转义)。
规则收敛:占位符仅用于"想要内联渲染"的基本类型(id、count、duration),
对象/Error 直接放 properties,message 保持人类可读短句。
3. AGENTS.md Logging 段更新示例与规则,反映实际最佳实践。
端到端验证(compose + Postgres 18-alpine):
- /api/rpc/todo/list 成功 → logger=db level=INFO 输出 SQL ✓
- /api/rpc/todo/create 校验失败 → logger=api level=ERROR
message="Unhandled error in ORPC handler" 干净,properties.error
完整保留 code/status/message/data 字段 ✓
- SIGTERM → 三条 shutdown logger 事件按预期输出 ✓
- typecheck / test 3/3 / build / compile 117M 全绿 ✓
2026-04-25 16:24:00 +08:00
imbytecat
ce39faf778
refactor(logging): 接受 oracle 审计建议打磨三处不够极致的细节
...
1. configureSync 用 getConfig() === null 守卫幂等初始化。原写法
reset: true 在 ESM 缓存正常时多余、HMR 重复求值时会反复
resetSync() + 累积 process.on('exit') 监听器。
2. ['logtape','meta'] logger 加 parentSinks: 'override'。原配置
它既挂自己的 console sink、又继承 root sink,meta 的 warning/
error/fatal 会被打印两次。
3. DrizzleLogger 显式传 'info' level。原默认 'debug' 与 LOG_LEVEL
默认 'info' 形成隐形依赖:用户必须同时设两个变量才能看到 SQL。
现在 LOG_DB=true 单开关即生效,符合"开关即可用"审美。
附带:删除未消费的 export type { LogLevel };getLogger 改成直接
re-export from '@logtape/logtape',少一层本地 import 间接。
端到端验证(compose + Postgres 18-alpine):
- LOG_DB=true 默认 LOG_LEVEL=info 下 SQL 以 level=INFO logger=db 输出 ✓
- meta logger 不再重复 sink ✓
- typecheck / test 3/3 / build / compile 117M 全绿 ✓
Oracle 审计 ses_23c5090efffe1jzPR5fVVm1y6m,KISS 评分由 8/10 升至 9.2/10。
2026-04-25 16:14:30 +08:00
imbytecat
cc3a5dc5ad
feat(logging): 引入 LogTape 替换 console.* 为结构化日志
...
为什么选 LogTape(2026 实测):
- pino 在 bun build --compile 编译产物里因 worker_threads + 动态 require 在
/\$bunfs/ 虚拟文件系统中崩溃,与单二进制部署核心目标冲突;
- LogTape 零依赖(5.3KB)、零 worker、纯 ESM、原生 Bun 导出条件,runtime
agnostic,配合 configureSync 完美兼容 --bytecode 模式(无裸 top-level await);
- 一等公民集成:@logtape/drizzle-orm(SQL 查询日志)、@logtape/otel(后续
OpenTelemetry sink 留扩展点)。
变更:
- src/server/logger.ts: configureSync 引导 + getLogger 重导出。format 默认
process.stdout.isTTY ? pretty : json,可经 LOG_FORMAT 显式覆盖(绕开 Bun
bundler 把 process.env.NODE_ENV 在 --minify 时 inline 成字面量的特殊处理)。
- src/server/api/interceptors.ts: logError 改用 getLogger(['api']).error(...) +
结构化 properties,弃 logger.error 顶层 API。
- src/cli/migrate.ts: 所有 console.log 改走 getLogger(['cli','migrate']),logger
在 run() 内 lazy-import 以保持 citty subcommand 模块体 side-effect-free。
- src/server/db/index.ts: env.LOG_DB=true 时挂 DrizzleLogger 适配器,SQL 查询
按类别 ['db'] 在 debug 级输出(含 query/params/formattedQuery 三字段)。
新增 env 旋钮(t3-oss 校验):
- LOG_LEVEL: trace|debug|info|warning|error|fatal,默认 info
- LOG_FORMAT: pretty|json,默认 TTY 自动选
- LOG_DB: stringbool,默认 false
端到端验证(compose + Postgres 18-alpine):
- TTY 终端:pretty 输出含 ✨ 图标 + ANSI 彩色 + 类别·路径 ✓
- 管道/Docker:JSON Lines 一行一条,含 @timestamp/level/logger/properties ✓
- LOG_FORMAT=pretty 强制覆盖 ✓
- ./server migrate 应用 migration 并经 logger 输出 ✓
- ./server serve + RPC round-trip:interceptor logError 与 drizzle SQL 日志
在生产 JSON 模式下结构化输出 ✓
- fix / typecheck / test 3/3 / build / compile 117M 二进制全绿
2026-04-25 16:04:31 +08:00
imbytecat
d206a3315f
docs(readme): 重写为面向人类用户的版本
...
原版本以工程术语堆砌(强约定 / 契约优先 / 不变量等)开篇,对新人不友好。重写以"是什么 → 为什么 → 怎么跑 → 怎么扩 → 怎么部署 → 参考"为线索:
- 开篇一句话讲清单二进制部署的核心卖点
- 新增"为什么用这个"突出 4 条价值点
- 新增"目录结构"帮助导航
- "加功能"步骤补充粗体小标题,每步意图一目了然
- 部署、脚本、端点全部表格化,便于扫读
- 删除对 AGENTS.md 的引用(人类读者无关)
2026-04-25 15:34:48 +08:00
imbytecat
c6027590a7
docs(readme): 全文中文化
...
保持原结构与技术准确性,仅做语言切换。技术术语(RPC、OpenAPI、migrate、Drizzle Studio 等)保留英文。
2026-04-25 15:30:36 +08:00
imbytecat
dd1facd240
refactor(imports): #nitro 重命名为 #server,imports 字段 ASCII 排序
...
命名上避开实现耦合:被指向的 .output/server/index.mjs 本质是"编译后的 HTTP 服务器入口",与 nitro(构建器)无关;包装器 _serve-nitro.mjs 仍持"nitro"。未来即便切换至 hono / vite-ssr / h3,#server 名字仍准确。
字段排序改为 ASCII 升序:#drizzle/*.sql < #package < #server,便于 sort-package-json 与人眼对账。
端到端验证(compose + Postgres 18):
- ./server migrate ✓ (embedded SQL)
- /health = ok ✓
- /api/spec.json title=fullstack-starter version=1.0.0 ✓ (#package)
- RPC todo create+list 完整 round-trip ✓ (#server 解析 nitro 产物)
- biome/typecheck/test/build/compile 全绿
2026-04-25 15:28:04 +08:00
imbytecat
5174cff3c5
refactor(cli): _serve-nitro 改用 #nitro subpath import
...
src/cli/_serve-nitro.mjs 原本用 ../../.output/server/index.mjs 跨边界导入 nitro 构建产物,与 #package / #drizzle/* 同属 "src/ 跳出根目录" 场景。统一改为 #nitro。
新增 package.json#imports:
"#nitro": "./.output/server/index.mjs"
端到端验证(compose + Postgres 18):
- 编译二进制内嵌 nitro serve() 入口 ✓
- ./server migrate:embedded SQL 应用成功 ✓
- ./server 运行:/health、/api/spec.json (title/version)、RPC create+list 全 OK ✓
- Stack trace 印证 #nitro 由 Bun 正确解析到 .output/server/index.mjs ✓
- biome/typecheck/test/build/compile 全绿
2026-04-25 15:23:05 +08:00
imbytecat
2209ab0b27
chore: 推荐 sort-package-json/gitignore 扩展并排序 package.json 键
2026-04-25 15:20:28 +08:00
imbytecat
7f4cfc8973
refactor: 跨边界导入改用 Node # subpath imports(package.json + drizzle SQL)
...
业务代码沿用 @/* (shadcn 等生态约定);仅"跳出 src/"的真实跨边界场景采用 Node 标准 #name:
- #package → ./package.json:替换 @/../package.json (2 处) 这种用 alias 跳出根目录的 hack
- #drizzle/*.sql → ./drizzle/*.sql:让 codegen 输出的 migrations.gen.ts 不再走 ../../../
效果:
- tsconfig.paths 与 vite.resolve.tsconfigPaths 维持,业务代码 0 改动
- 配置仅新增 package.json#imports 4 行
- Bun runtime / Vite 8 / TS bundler / 编译产物均原生支持
端到端验证:
- 编译二进制:CREATE TABLE 和 'fullstack-starter' 内嵌 ✓
- ./server migrate:应用嵌入式迁移成功 ✓
- ./server 运行:/health、/api/spec.json (title/version)、RPC create+list、OpenAPI create、Scalar /api/docs 全部 OK ✓
- bun run dev:Vite SSR <title>fullstack-starter</title> 注入 ✓
- fix/typecheck/test/build/compile 全绿
2026-04-25 15:15:20 +08:00
imbytecat
afc8b0b077
chore(deps): 升级 nitro-nightly 至 20260424 构建
...
全量依赖审计:bun outdated 已 0 项;package.json ^ 范围内所有包均解析至 latest(react 19.2.5、vite 8.0.10、TS 6.0.3、tailwind 4.2.4、tanstack 1.168.x、orpc 1.14.0、biome 2.4.13 等)。仅 nitro-nightly 因日构建版本号锁定到具体哈希需手动 bump。drizzle-orm/kit 维持 0.x 最新(0.45.2 / 0.31.10),未跟进 1.0 beta(AGENTS.md 政策)。
2026-04-25 14:57:59 +08:00
imbytecat
d9210b3b0b
chore(deps): 升级 TanStack Start 至 1.167.48,移除 start-plugin-core patch
...
upstream 已修(PR #7249,1.169.4 拆分 vite/rsbuild subpath,
@rsbuild/core 列为 optional peer),patches/ 不再必要。
- @tanstack/react-start ^1.167.43 → ^1.167.48
- @tanstack/react-router ^1.168.23 → ^1.168.24
(react-start@1.167.48 exact 依赖,避免 lockfile 双版本)
- 删除 patches/@tanstack%2Fstart-plugin-core@1.168 .0.patch
- 删除 package.json patchedDependencies 块
- AGENTS.md 移除 patches/ layout 说明
验证:fix / typecheck / test / build / compile 均通过;
start-plugin-core@1.169 .4 dist 不再静态 import rsbuild。
2026-04-25 14:52:15 +08:00
imbytecat
4f414014a8
refactor(codegen): embed-migrations 校验 journal tag/idx/when
...
防止手改 _journal.json 时 tag 字符串混入路径或注入 codegen import 语句;
同时锁紧 idx/when 为非负整数。
2026-04-25 14:50:36 +08:00
imbytecat
ed257fe4e6
refactor: 应用 Oracle round-4 复核,硬化 migrator 与默认安全值
...
- migrate: 校验已应用 migration 的 SHA-256,拒绝 schema drift;
split 后 trim + skip empty,避免空 statement 触发 SQL 错误
- todo.contract: update 拒绝空 patch
- env: DATABASE_URL 限定 postgres(ql):// scheme,配置错误更早失败
- compile: autoloadDotenv: false,二进制部署不再吞 cwd 的 .env
- Error.tsx: 生产环境隐藏 error.message,避免内部错误泄露
- AGENTS: 同步 generatedFieldKeys / migrator 行为新描述
2026-04-25 14:38:44 +08:00
imbytecat
695e826dcf
refactor(types): 消除非必要 as 逃逸,锁紧 strict 政策
...
按 Oracle 复核处置全仓 5 处类型断言:
- fields.ts: as const → satisfies Record<GeneratedFieldKey, true>
- compile.ts: as readonly string[] → ReadonlySet<string>.has()
- embed-migrations.ts: JSON.parse as Journal → Zod schema 运行时校验,JSON.parse 显式 unknown
- interceptors.ts: 唯一保留的跨包断言(ORPC→Zod)注释扩写为完整背景
- router.tsx: satisfies 非 cast,保留
biome.json 增配 noExplicitAny / noTsIgnore / noNonNullAssertion,防止后续漂移。
2026-04-25 14:23:08 +08:00
imbytecat
f520b54ca5
docs(agents): 同步 embed-migrations 与 sql.d.ts,修陈旧描述
...
- CLI 帮助块与 Layout migrate.ts 注释从 "from ./drizzle" 改为 "embedded migrations"
- 补 src/sql.d.ts(with { type: 'text' } SQL 导入的载体)到 Layout
- 补 patches/(patchedDependencies 用途)到 Layout
2026-04-25 14:11:21 +08:00
imbytecat
7e27640a26
feat(deploy): migrations 嵌入二进制,实现真单文件部署
...
- embed-migrations.ts:扫 ./drizzle/meta/_journal.json,生成 src/server/db/migrations.gen.ts,每条 SQL 通过 `import sql_<idx> from '../../../drizzle/<tag>.sql' with { type: 'text' }` 在 bun build --compile 时被静态嵌入二进制
- migrate.ts 重写:runtime 用 createHash('sha256') 计算迁移哈希,仅用 db.execute(sql) + db.transaction() 公开 API 写入 drizzle.__drizzle_migrations 簿记表(不依赖 @internal 的 db.dialect/db.session)
- db:generate 链 db:embed,保证 SQL 改动总是同步到 migrations.gen.ts
- Dockerfile 删 COPY drizzle/,binary 是部署唯一 artifact
- 同步 README / AGENTS / biome.json
2026-04-25 14:05:58 +08:00
imbytecat
e28fe9dc7b
perf(compile): 启用 bytecode + minify + inline sourcemap
...
- Bun 官方 bytecode caching:中型应用 startup ~2x(docs.bun.sh/docs/bundler/bytecode)
- minify:减小 bytecode 体积,二进制仅 +2MB sourcemap
- sourcemap inline:嵌入二进制,保证错误堆栈可读,并在 compile.ts 清理 bundler 残留的 *.js.map
2026-04-25 14:05:35 +08:00
imbytecat
20104a6d53
docs(readme): 补 test 脚本与 query helper 步骤
...
- scripts 表加 `bun run test`
- Add a feature 拆出 `src/client/queries/<feature>.ts` 步骤,与 AGENTS.md 对齐
2026-04-25 13:37:05 +08:00
imbytecat
a3a62c24b9
docs: 新增 README,AGENTS 同步至当前架构
...
- README: 用户向 quick-start、scripts 表、add-a-feature checklist、deploy 流程
- AGENTS:
- 修订 stale 文案(VITE_APP_TITLE/experimental_defaults/.gitkeep/route 组件风格)
- 新增 Testing 段(bun test 约定)和 Endpoints 段(/, /health, /api/*)
- Layout 补 logger.ts、health.ts、components/、styles.css、根 drizzle/
- 追加 10 条 room-to-grow 纪律(client query / middleware / interceptor / 测试等扩展边界)
2026-04-25 13:31:45 +08:00
imbytecat
6dc7f9f791
test: 启用 bun test 并补 todo contract 示例
...
- package.json 加 "test": "bun test"
- todo.contract.test.ts 给 starter 一个可复制的 colocated 测试样板
覆盖 valid input / missing field / wrong type 三种 case
2026-04-25 13:31:34 +08:00
imbytecat
8f7744ca0d
feat(server): 新增统一 logger 入口与 /health liveness 端点
...
- src/server/logger.ts 包一层 console.*,给后续 pino/otel 迁移留单点
- interceptors.ts 的 logError 改走 logger.error,业务侧禁止直接 console.*
- /health 返回 'ok',纯 liveness(不查 DB),DB 挂时探活仍绿
2026-04-25 13:31:25 +08:00
imbytecat
830c908712
refactor(arch): 移除 experimental_defaults,提炼 useInvalidateTodos,闭环若干悬挂配置
...
- orpc.ts: 改为纯 createTanstackQueryUtils,不再依赖 experimental_ API
- 抽出 src/client/queries/todo.ts 的 useInvalidateTodos,避免 query key 散落页面
- shutdown: setTimeout 内 db.$client.end() 失败也走 process.exit
- 删除 db/index.ts 未被使用的 DB 类型导出
- 删除 env.ts 未被消费的 VITE_APP_TITLE,根 title 改为 package.json name
- 清理 routes/index.tsx 的 JSX 区段注释、compose.yaml 注释掉的端口块、robots.txt URL 注释
2026-04-25 13:31:16 +08:00
imbytecat
2c5bceb826
fix(deploy): 端到端跑通编译二进制 + docker compose
...
端到端验证时发现 4 处细节,一起补上:
1. bin.ts 漏了 default: 'serve'——CMD ["./server"] 会直接吐 help 而
不是起服务(在 compose 里 app 立刻 exit)。citty 原生支持 default
2. Dockerfile 在 bun install 之前就要 COPY patches/,否则 package.json
的 patchedDependencies 找不到补丁文件,install 失败
3. drizzle/ 目录在仓库里必须存在(带 .gitkeep),否则 Dockerfile 末尾
COPY drizzle/ 到运行镜像会失败
4. migrate.ts 之前只检查 ./drizzle 目录是否存在就跳过——空目录时仍会
进到 drizzle 的 readMigrationFiles,报 Can't find meta/_journal.json。
改成检查 meta/_journal.json 是否存在,更准确地区分"还没生成过迁移"
与"有迁移待应用"
验证路径:
- docker compose up -d --build → migrate 完成退出 → app 健康
- curl /api/spec.json → 200,OpenAPI 文档含 todo.{list,create,update,remove}
2026-04-24 20:43:36 +08:00
imbytecat
5dd54ec9e9
docs(agents): 同步架构简化后的规约
...
- DB:module-level const db(删掉 getDB/closeDB 的描述),说明为什么
不需要兼容 Cloudflare Workers 的 lazy init
- Routers 直接 import db,不再过 middleware;只在真正需要 per-request
上下文时才新建 middlewares/
- Layout 刷新 db/ 与 api/ 目录的注释;Don'ts 补上不要回退到 lazy DB 单例
2026-04-24 20:38:51 +08:00
imbytecat
22ac02cbc6
refactor(db): 精简 generatedFields,删三分支 PK 策略与泛型 keys 工具
...
- PK 策略原本给了 native(PG18)/extension/app-side 三条路,对 base 项目
是 YAGNI。全部落到最稳妥的 $defaultFn(uuidv7):任意 PG 版本都能跑,
不依赖扩展或 18+ 的 uuidv7() 原生函数
- createGeneratedFieldKeys 泛型 reduce 只为了生成 { id: true, createdAt:
true, updatedAt: true } 这三项,直接手写 as const 更直观
- 删掉 pk/id/createdAt/updatedAt 的独立 helper 导出——没人引用,它们
只是 generatedFields 的内部组合
2026-04-24 20:37:51 +08:00
imbytecat
2678a53034
refactor(api): 删掉 db ORPC middleware,handler 直接用 db
...
db middleware 的存在只是为了把 db 注入到 ORPC context——这是 Cloudflare
Workers / 多租户场景的模式(db 依赖 per-request 的 env binding)。在
Bun 单进程 + 模块级 const db 下,这层中间件是纯粹的仪式:一行 import
直接拿到 db,反而更清晰。
- 删除 src/server/api/middlewares/ 整个目录(不留空脚手架,KISS)
- context.ts 去掉 DBContext 与示例注释,只留 BaseContext { headers }
作为未来 auth/tenant 等 middleware 的扩展点
- routers/todo.router.ts 不再 .use(db),handler 内直接 db.query / db.insert
需要 per-request 上下文(auth、tenant、rate-limit)时再按 ORPC 的
os.middleware 模式新增,不在此预先铺陈。
2026-04-24 20:37:11 +08:00
imbytecat
d15b22ad1b
refactor(db): 去掉 lazy singleton,改为模块级 const db
...
getDB/closeDB + 可空单例是 Cloudflare Workers 场景的模式——每个请求独
立上下文、不允许模块加载期副作用。在 Bun 单进程长驻服务下这些都是冗余
的仪式,徒增心智。
改为模块级 const db:
- src/server/db/index.ts 直接 export drizzle(...) 实例
- shutdown 插件用 db.$client.end() 收尾
- db.middleware.ts 跟随内部重命名以避免同名遮蔽(本身的去留放到下一
次提交)
2026-04-24 20:36:16 +08:00
imbytecat
f6b6edee23
fix(deps): 补丁绕过 @tanstack/start-plugin-core 误引 @rsbuild/core
...
@tanstack/start-plugin-core@1.168 .0 的 dist/esm/index.js 在 Vite 场景
下也会静态导入 ./rsbuild/planning.js,而后者硬依赖被标为 optional peer
的 @rsbuild/core,导致 vite build 启动阶段 ERR_MODULE_NOT_FOUND。
引入 bun patch 只保留 vite 相关导出(删掉 RSBUILD_ENVIRONMENT_NAMES
和 tanStackStartRsbuild),不安装 rsbuild 全家桶(rspack 很重)。
等上游修复再移除本补丁。
2026-04-24 20:35:22 +08:00
imbytecat
19e60d358f
feat(cli): 引入 citty CLI,迁移改为显式 ./server migrate
...
- 顶层新增 bin.ts 作为编译入口,citty 懒加载 src/cli/ 下子命令
- src/cli/serve.ts 通过 _serve-nitro.mjs 桥接启动 Nitro(规避
.output/server/index.mjs 顶层 serve(...) 的副作用导入)
- src/cli/migrate.ts 显式跑 drizzle migrate;env / drizzle 都在 run()
里 await import,避免 citty --help 遍历 subCommands 时触发 env 校验
- compile.ts 入口切到 bin.ts;移除 src/server/plugins/migrate.ts
与 vite.config.ts 中的启动时自动迁移
- compose.yaml 新增一次性 migrate 服务,app depends_on
service_completed_successfully,保证迁移先行再起服
- tsconfig 排除 .output / out;AGENTS.md 补充 CLI 与部署规约
2026-04-24 20:32:32 +08:00
imbytecat
4518a63959
docs(agents): 同步 drizzle 0.x 降级后的指引
...
修正 AGENTS.md 里与 1.0 beta 相关的过时条目(drizzle-orm/zod、
defineRelations、RQB v2 对象语法等),改为记录当前真实用法:
drizzle-zod 包、`drizzle({ schema })`、RQB v1 回调写法。顺手裁掉
通用的 Biome/TS 说明,补上几条仓库特有的坑(Nitro 插件在 vite.config
里注册、distroless cc 变体、无 CI/pre-commit 等)。
2026-04-24 20:13:56 +08:00
imbytecat
75c77159b4
refactor(db): 适配 drizzle-orm 0.x API 并引入 drizzle-zod
...
drizzle-orm 从 1.0 beta 降级到 0.45 后,1.0 的 defineRelations、drizzle-orm/zod
子路径以及 RQB v2 的 orderBy 对象语法均不可用。改用 schema 作为 drizzle()
入参、从独立的 drizzle-zod 包导入 schema 生成器,并将 orderBy 改回 0.x 的
回调写法。同时删除因降级而失效的旧迁移。
2026-04-24 20:08:41 +08:00
imbytecat
f9847e6f6e
chore: 移除 opencode.jsonc 配置文件
2026-04-24 20:02:01 +08:00
imbytecat
ac58950853
chore: 为 TanStack MCP 配置 Authorization 鉴权头
2026-04-24 19:51:48 +08:00
imbytecat
02757226f7
chore(deps): 锁定 Bun 版本并升级依赖
...
- Dockerfile 与 mise.toml 固定 bun 至 1.3.13
- 升级 ORPC/TanStack/Biome/Vite/TypeScript 等依赖
- drizzle-orm 与 drizzle-kit 回退至稳定版
2026-04-24 19:50:17 +08:00
imbytecat
934ba80c94
chore(deps): 升级 TanStack Router/Start 及 @types/bun 依赖
2026-04-11 20:53:34 +08:00
imbytecat
15118e8aa2
chore(deps): 升级 ORPC、React 与 Vite 相关依赖
2026-04-10 10:34:31 +08:00
imbytecat
1af5d4e3c0
fix: 修复编译二进制 Ctrl+C 无法退出的问题
2026-04-02 07:48:25 +08:00
imbytecat
6795730485
refactor(db): 暴露 closeDB() 函数以支持连接池清理
2026-04-02 07:48:16 +08:00
imbytecat
c20cf02d9f
chore: update Docker Compose configuration
...
- Use postgres:18-alpine image
- Update environment variable format
- Rename volume from pgdata to postgres_data
- Increase healthcheck interval to 10s
2026-04-02 03:49:38 +08:00
imbytecat
341315a01b
chore: upgrade PostgreSQL to v18 and restructure compose.yaml
2026-04-02 03:43:37 +08:00
imbytecat
77b3484415
refactor: 改用 Nitro 插件实现启动时数据库迁移
2026-04-02 03:42:45 +08:00
imbytecat
5de4d5f940
chore: upgrade PostgreSQL to v18 and restructure compose.yaml
2026-04-02 02:45:00 +08:00
imbytecat
ed770909ef
chore: 添加 Docker 打包和 Compose 编排支持
2026-04-02 02:43:21 +08:00
imbytecat
9175909033
chore: 更新依赖
2026-04-02 00:57:49 +08:00
imbytecat
5f5f6c469a
chore: remove unused shadcn MCP
2026-04-02 00:53:30 +08:00