feat(drivers): driver-turso 迁回本仓公开发布,五个 IDataDriver 统一收进 packages/drivers/ (#4645 Phase A) - #5618
Merged
Merged
Conversation
…aDriver packages under packages/drivers/ (#4645) Phase A of the maintainer-ruled two-repo migration (objectstack half). - git mv packages/plugins/driver-{memory,mongodb,sql,sqlite-wasm} -> packages/drivers/* (content unchanged; only repository.directory follows the move) - new packages/drivers/driver-turso, migrated from objectstack-ai/cloud @ bc372e3b, published Apache-2.0 / access: public. multi-tenant routing and vector-poc stay in cloud. - pnpm-workspace glob, check-driver-conformance DRIVERS_DIR, both CI workflows, liveness evidence paths, adr-anchors, docs and source comments follow the move - driver-turso enters the conformance matrix with 3 measured DEBT cells (#5590) - CLI turso refusal message no longer claims the package ships elsewhere (#5602) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WyvqvKMG6asi9aXjKE6xtx
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
…vers-dir-turso-migration
This was referenced Aug 5, 2026
…at packages/drivers/driver-sql (#4645) `like-pattern.ts` arrived with origin/main (#5567) naming `packages/plugins/driver-sql/src/sql-driver.ts` — the pre-#4645 path. The merge was textually clean because the file is new on main and the move is on this branch, which is the jointly-wrong shape AGENTS.md §10 warns about: nothing conflicts, and the cross-reference the header leans on lands nowhere. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WyvqvKMG6asi9aXjKE6xtx
Contributor
📓 Docs Drift CheckThis PR changes 9 package(s): 121 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
|
…vers-dir-turso-migration
… the migrated tests (#4645) The 15 turso test files arrived from cloud, which predates this repo's `query-options/no-any-erasure` rule (#5600, landed on main after the first merge), and added 52 sites — test surface 267 -> 319. Every one is inside `packages/drivers/driver-turso/src/*.test.ts`; nothing outside turso moved. Both dispositions the rule names, chosen per site, with no assertion touched: - 14 sites TYPED. Ordinary on-contract reads whose only defect was the missing required `QueryAST.object` key (`driver.count('users', { where: { age: 17 } })`, the TEMPORAL_CASES/TEMPORAL_TIME_CASES conformance reads, and the `$not`/`$or` spellings the transport is asserted to ANSWER). Declaring `object` is what driver-memory's conformance suite already does, and it puts `where` back under tsc. - 38 sites `as unknown as QueryAST`. Deliberately off-contract input: values flowing through the suites' `unknown`-typed helpers (`compile`, `refusalOf`, `ids`) and inline literals whose whole point is refusal — `where: 42`, `[]`, `''`, a class instance, bare AST arrays, `{ $or: [null] }`, `{ $not: null }`, non-boolean `$null` comparands. These assert the transport REJECTS them, so the type must be bypassed by name rather than erased. Baseline untouched: 267 is met, not raised. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WyvqvKMG6asi9aXjKE6xtx
os-zhuang
marked this pull request as ready for review
August 5, 2026 21:38
This was referenced Aug 5, 2026
This was referenced Aug 6, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of #4645 (Phase A: objectstack half)
Fixes—— 本单要等 Phase B(cloud 半边:pin 前移 + 14 条link:改指)落地才关。做了什么
维护者 2026-08-05 裁定:turso 核心迁回本仓、公开 Apache-2.0 发布;五个
IDataDriver实现统一收进新的packages/drivers/。本 PR 是这个方案的 objectstack 半边,一次做完。1. 四个存量 driver 平移(内容零改动)
git mv packages/plugins/driver-{memory,mongodb,sql,sqlite-wasm}→packages/drivers/*,rename 检测保住了全部历史。唯一的内容改动是各自package.json的repository.directory,包名、版本、入口、导出面、依赖、行为一字未动 —— 消费者不需要改任何 import。深度没变(
packages/plugins/X与packages/drivers/X都是三层),所以每个包里的tsup --config ../../../tsup.config.ts、extends: ../../../tsconfig.json、vitest.config.ts里的path.resolve(__dirname, '../../spec/src/...')别名全部仍然解析到同一个目标,一处都不用改。⛔ 按 #5499 冻结令,driver-memory / driver-mongodb 只平移,没有顺手修任何缺陷。#5538 的 mongod 门随包平移,默认跑仍是 7 条响亮 SKIP、零下载(见下方验证输出)。
2.
packages/drivers/driver-turso—— 自 cloud 迁入迁移源:
objectstack-ai/cloud@bc372e3b(当前 origin/main,含立单后的 #1117/#1116/#1080/#1078/#1074/#1071 六个语义修复)。用git archive origin/main packages/driver-turso导出,⛔ cloud 检出上零写操作。迁入清单(22 个文件)
src/turso-driver.ts、src/remote-transport.ts、src/index.tssrc/libsql-sqlite-stub.testkit.tssrc/spec/turso.zod.tssrc/turso-driver.test.ts、src/spec/turso.test.ts、src/turso-temporal-conformance.test.ts、src/turso-remote-temporal-conformance.test.ts、src/date-bucket-parity.test.ts、src/remote-read-coercion.test.ts、src/remote-transport-{bare-date-routing,boolean-identity,comparand-refusal,not-operator,null-comparand-refusal,null-where,text-predicates,top-level-where,unknown-select}.test.tsCHANGELOG.md、README.md、package.json、tsconfig.json、LICENSE⛔ 未迁入(留 cloud)
src/multi-tenant.ts+src/multi-tenant.test.ts—— 维护者决策 2,按租户路由是云产品差异化能力src/vector-poc.test.ts—— 维护者决策 3,已核实与驱动零耦合src/spec/turso-multi-tenant.zod.ts+src/spec/turso-multi-tenant.test.ts—— 已裁定 A:不迁入(PM 2026-08-05;维护者可否决)。依据与实测见文末。3. 迁移适配(逐条)
package.jsonversion6.9.0(cloud 版本线)17.0.0-rc.2check:changeset-fixed要求公开包全部入组publishConfig.accessrestrictedpublicrepositoryobjectstack-ai/cloud/packages/driver-tursoobjectstack-ai/objectstack/packages/drivers/driver-tursolink:../../../objectstack/...link:workspace:*nanoid^5.1.11^6.0.0^6.0.0);nanoid具名导出两个大版本都有better-sqlite3(peer + dev)^12.x^13.0.2^13.0.2;onlyBuiltDependencies里只能有一份@types/node/vitest^25.9.1/^4.1.7^26.1.2/^4.1.10engines.node>=18.0.0>=22.0.0files["dist","README.md"]CHANGELOG.mdcheck:published-files的 COMPLETE 不变量强制要求scriptstsup/ 无 typechecktsup --config ../../../tsup.config.ts+typecheck: tsc --noEmitcheck:type-check-coverage要求新包到场即覆盖tsconfig.jsonextends ../../tsconfig.json,exclude含**/*.test.tsextends ../../../tsconfig.json,不排除测试tsc --noEmit。实测不需要任何 TEST_DEBT —— 含测试的全量 typecheck 直接绿tsup.config.tsLICENSEpackage.json写着Apache-2.0而LICENSE文件是 BSL-1.1,两者本来就不一致 —— 那是 cloud 侧的事,本 PR 不碰src/index.tscreateMultiTenantRouter/MultiTenantConfig/MultiTenantRouter/ 多租户 schemaREADME.md4. 全仓路径清扫
git grep -n 'packages/plugins/driver'的每一处命中都已处理:已更新(活指针):
pnpm-workspace.yaml(新增packages/drivers/*glob)、scripts/check-driver-conformance.mjs(DRIVERS_DIR+ 三处注释)、scripts/adr-anchors.json(3 条,check:adr-anchors会验)、packages/spec/liveness/{field,object,query}.json(实测 11 处,与立单读数一致)、.github/workflows/ci.yml(capability 包遍历循环 —— 立单说 :866,当前是 :962)、.github/workflows/lint.yml(嵌套包说明 —— 立单说 :424,当前是 :603)、四个 driver 的package.json、README.md、ARCHITECTURE.md、content/docs/plugins/packages.mdx、content/docs/protocol/objectql/{index,query-syntax}.mdx、examples/app-crm/README.md、examples/app-showcase/test/external-datasource.test.ts、packages/rest/src/rest-server.ts、packages/drivers/driver-memory/src/persistence/persistence.test.ts、五个 ADR 正文里的路径串、docs/plans/external-datasource-federation-impl.md、.claude/skills/pm-dispatch/SKILL.md(domain:drivers文件面)。合入 main 后又补一处:
packages/services/service-analytics/src/like-pattern.ts(详见文末「合入 main」段)。turbo.json、vitest workspace 配置里没有 driver 路径(已核,无需改)。⛔ 故意保留(历史记录):
CHANGELOG.md(含 :2053 记载 turso 当年迁出的那条)、packages/*/CHANGELOG.md、.changeset/既有条目 —— 历史,一律不改RELEASE_NOTES.md—— 已发布的版本记录docs/audits/2026-06-*.md(3 处)—— 带日期的证据快照,"当时读数"就是它的价值docs/design/driver-turso.md:469—— Status: Proposal 的设计提案(2026-02-15),描述的是一个从未落地的包结构(turso-schema-driver.ts、query-compiler.ts之类都不存在)。它是提案,不是活指针.changeset/date-bucket-parity-gate.md:34里的 "cloud'sdriver-turso" —— 别人 PR 的待发布 changeset,不动他人在飞文件5. 两处被本次迁移"证伪"的陈述(真话修复,行为零改动)
迁移让下面这些话变成假的,所以改的是说法,不是行为:
packages/cli/src/utils/storage-driver.ts——UnsupportedDriverError的信息原文说 turso "ships with the ObjectStack cloud / enterprise distribution, not the open-core CLI"。这句现在是假的。改成"不是 CLI 从 URL 构造的 driver,请显式注册"。⛔ 抛错行为一字未改:libsql://依然响亮拒收、依然 exit 1。toMatch(/cloud|enterprise/i)—— 那正是被证伪的那句 —— 改成断言信息里有包名、有"显式注册"这条出路、有可用替代清单,并明确断言不再出现cloud|enterprise。这条 pin 从"锁一句话"变成"锁这条信息可操作"。libsql://要不要真的构造TursoDriver)是公共契约决策,⛔ 本 PR 不做,已立 turso 迁回本仓后,CLI 的 URL→driver 解析仍对libsql://抛 UnsupportedDriverError —— runtime 的 provisioning 却把 turso 排在偏好第一位,两处口径相反 #5602。content/docs/data-modeling/drivers.mdx/deployment/self-hosting.mdx/deployment/environment-variables.mdx/getting-started/glossary.mdx—— "开源框架不支持 Turso / 那个 driver 在 Cloud" 改成"URL 不推断,需显式注册"。结论没变(今天libsql://依然不通),变的是理由。docs/adr/0119-...md:31有一句 "There is no Turso driver here"。ADR 是决策记录,⛔ 不改原文;加了一条带日期的编者注说明前提已变,并点明该 ADR 的决策不受影响(Turso extends SqlDriver,继承同一套beginTransaction/commit/rollback)。如果认为连编者注都不该加,说一声我撤掉。6. conformance gate:22 covered + 3 measured DEBT
turso 落盘即入矩阵(gate 从磁盘发现,本来就该如此)。TEMPORAL 两格真绿:local 与 remote 双面套件都驱动共享 case-set。另外三格按 gate 自己写明的规则记 measured DEBT —— ⛔ 没有为凑绿动过任何判定逻辑(
DRIVERS_DIR常量与三处注释是路径跟随,LEDGER从空数组变成三条实测条目,判定函数一行未改)。记 DEBT 而非 EXEMPT 的理由写进了 ledger:remote 传输不走 Knex,
remote-transport.ts自带buildWhereSQL(组合子嵌套、算子词表、比较值拒收)和自己的ORDER BY/LIMIT/OFFSET—— 这是独立的第 N 个后端,正是 #3774 / #4363 设这些共享 case-set 要压住的东西。"继承所以没问题"恰恰是这些套件存在来证伪的假设(driver-sqlite-wasm 当年也是这个理由记的 DEBT,最后是用套件清掉的)。补齐跟踪在 #5590。covered 从 20 → 22,未低于现值。
cloud 侧的预期断裂(方案内状态)
A 合并、B 未落地这段窗口里,cloud 会断 —— 这是维护者裁定方案的预期内状态,不是回归:
link:specifier 分布在 7 个package.json(packages/driver-turso自身 3 条、apps/cloud2 条、apps/objectos3 条、apps/ee-authz-showcase1 条、apps/objectos-ee1 条,等等)指向../../../objectstack/packages/plugins/driver-sql这类路径 —— 本 PR 落地后这些路径不存在了packages/driver-turso会与本仓新包同名同版本线,Phase B 需要按残包收尾方案处理(改名tenant-router之类,见 driver-turso 住在闭源 cloud 仓,却是开源 runtime 点名偏好的默认 driver — 建议把核心迁回本仓 #4645 评论)Phase B 在本 PR 合并后紧随派发,⛔ 本 PR 不碰 cloud 一个字节。
验证(全部真实输出)
pnpm install(lockfile 重生)五个 driver 包测试
#5538 的 mongod 门(默认关,7 条响亮 SKIP、零下载) —— 平移后行为不变:
turso 测试 hermetic —— 15 个文件全部走包内
libsql-sqlite-stub.testkit.ts的 sqlite stub 或:memory:,不需要网络、不需要凭据、无需任何 opt-in 门,默认 CI 直接跑。全仓 typecheck(含新的嵌套 glob)
仓库级守卫
liveness evidence 路径守卫 —— 反向验证(结果与预设方向不同,如实记)
读
packages/spec/liveness/*.json的是pnpm --filter @objectstack/spec check:liveness(scripts/liveness/check-liveness.mts的checkEvidence)。改完后:反向验证:把
query.json的 5 处路径改回packages/plugins/driver-sql,gate 确实按名指出每一条:但它是
⚠警告,不是✗,退出码两种情况下都是 0。 派发词预设的是"路径失效即判红"—— 实测没有判红,只是响亮地说了出来。证据链确实会断,只是今天没有 gate 挡着;如实记在这里而不是让下一个人踩。(顺带一提:那行摘要里的 "330 resolved" 统计的是 local 路径总数而非解析成功数 —— 改坏 5 条之后它仍然是 330。)其余: 变更文件 eslint 全绿;
check:regen-pending无输出(干净)。packages/cli的doctor-ledger-read-failure.test.ts整块 7 条在origin/main上就是红的。已证伪因果 —— 把本 PR 碰过的三个 CLI 文件git checkout origin/main --回去再跑,7 条依旧全红,一条未变。已另立 #5612。合入 main(
73580e701)—— 一处「干净合并、联合出错」git merge origin/main零冲突,lockfile / workspace glob / conformance gate 三处均未被动。rename 检测工作正常:main 对sql-driver.ts的改动(#5489 / #5567)自动落到了packages/drivers/driver-sql/src/sql-driver.ts。但按 AGENTS.md §10「干净的合并不等于可用的合并」复查后抓到一处:main 侧 #5567 新增的
packages/services/service-analytics/src/like-pattern.ts,其头注释指向packages/plugins/driver-sql/src/sql-driver.ts—— 前 #4645 的路径。文本上不冲突(文件在 main 上是新增的,改名在本分支上),所以 git 一声不吭;而那句交叉引用正是这个"第二实现"存在理由的锚点,指到空处就废了。已在7f3834198修正为packages/drivers/driver-sql/...。合并后收缩验证集重跑(全部真实输出):
一处合并副产物已剔除:本地跑 spec 构建会让
gen:schema把packages/spec/authorable-surface.base.json的baseRev重锚到当前 main tip。那是 authorable-surface 删除门的锚点,不该由一个功能 PR 顺手重锚 —— 已git checkout还原,本 PR 不含该文件。边界裁定:多租户 schema 留 cloud(已裁定 A —— PM 2026-08-05,维护者可否决)
派发词写的是"⛔ 剔除
multi-tenant.ts、multi-tenant.test.ts、vector-poc.test.ts"三个文件,issue 正文的迁移清单里spec/turso*.{test,zod}.ts这个 glob 则会把spec/turso-multi-tenant.{zod,test}.ts一起带走。结论:不带走(A 案),三条依据:TursoMultiTenantConfigSchema/TenantResolverStrategySchema/TursoGroupSchema/TenantDatabaseLifecycleSchema四个 schema + 四个类型会成为本包的公开 API 面,而实现(createMultiTenantRouter)不在包里 —— 这正是 Prime Directive chore: version packages #10 说的"不广告运行时不交付的能力"。git grep全 cloud,除了index.ts的 barrel 再导出之外没有任何 import:multi-tenant.ts自己都不用它(它有自己的MultiTenantConfigTS interface,只 import./turso-driver.js)。一个零消费的声明面,按启动期"能力扩张要有真实业务拉力"的口径,不该借这次迁移进入开源公共契约。代价也不对称:现在不迁,将来要迁只是复制两个文件;现在迁了要撤,就是公开包的 breaking API 移除,得过 api-surface gate。而且 #4645 评论里已经建议 Phase B 把 cloud 残包改名成
tenant-router—— schema 跟着 router 走,那个包才是自洽的。维护者否决窗口保留:若认为应当按 glob 字面迁走这两个文件,说一声,一条 commit 的事。
🤖 Generated with Claude Code
https://claude.ai/code/session_01WyvqvKMG6asi9aXjKE6xtx