核心问题: 在根清单仍是 private 的 0.0.0 版本时,“时空可组合性”模型是否值得纳入你的 TypeScript 架构?
RepoDaily 采用评分
RepoDaily 将该项目的采用分评为 87/100(强):分数来自文章来源、安装路径、生产风险、差异化、许可证清晰度以及 AI/Agent 适配度。
包含 4 个来源、覆盖 3 类来源;如有 RepoDaily 独有模块,会进一步提高证据分。
检测到 6 个工作流步骤、5 个下一步动作,以及 2 个命令/安装信号。
趋势热度为 +719 stars;如内容中有 release、issue 或维护信号,会提高维护可信度。
采纳风险标记为 medium,并包含 4 条安全说明与 3 条跳过条件。
3 个机会视角、4 个替代方案,以及 4 个类型化模块支撑差异化判断。
文章中包含许可证来源或许可证表述。
文章正文和元数据中检测到 2 个 AI/Agent 相关信号。
项目概览
cordiverse/cordis 在 2026-08-17 这期榜单上以 719 颗新增星排在第 3 位,而它的一句话简介——“Meta-Framework of Spatiotemporal Composability”(时空可组合性元框架)——几乎承担了全部宣传任务。这个定位说明 cordis 不是普通的应用框架,而是更底层的“用来搭建框架的框架”。“时空可组合性”暗示其基本单元同时沿结构与生命周期两个维度组合。值得注意的是,根 README 并未展开,全部内容只有一行路径 './packages/core/README.md'。
许可证毫无歧义:MIT,版权声明为 2021-present Shigma,即至少五年的持续版权记录。MIT 条款允许使用、复制、修改、合并、发布、分发、再许可与销售,唯一条件是保留版权与许可声明。对愿意直接读源码的人来说这就是通行证:可以放心地 fork、研读并做衍生。
结构上这是一个 Yarn 单仓库。根 package.json 名为 @root/cordis,标记 private: true,版本钉在 0.0.0,并声明了 packages/* 与 external/* 两个 workspace 目录。根目录本身没有可安装的产物,真正可消费的部分定义在各子包里,README 点名的是 core。packageManager 字段锁定 [email protected],同时清单把 “type” 设为 “module”,整棵源码树以 ESM 为先。
工具链相当新:TypeScript ^5.9.3、vitest ^4.1.5 配 @vitest/coverage-v8 做覆盖率、esbuild ^0.28.0 与 vite ^7.3.2、eslint ^8.57.1 配共享的 @cordisjs/eslint-config ^1.1.1,再由 yakumo ^3.2.1 统一编排各子包任务。一个细节值得注意:tsx 并非 npm 原版,而是钉死的 Cordiverse fork——npm:@cordiverse/[email protected],任何跑测试的人都会继承这个依赖。
为什么现在变热
- 本期 719 颗新增星、当日排名第 3,全站只有两个仓库排在它前面。
- 口号本身就是引流点:“时空可组合性元框架”足够少见,而根 README 只留一行指路,反而添了神秘感而非消除它。
- Shigma 自 2021 年起持有的 MIT 许可,让读码、fork 与代码借用的法律成本几乎为零。
- 依赖清单显示工具链很新——TypeScript ^5.9.3、vitest ^4.1.5、esbuild ^0.28.0、vite ^7.3.2——代码面向的是当下的运行时而非遗留环境。
- packages/* 与 external/* 的目录划分暗示“一模块一包”的组织方式,正是框架读者喜欢拆解的布局。
解决什么问题
- 一次构建多个互相依赖的包:`yarn build` 经 yakumo 分发,先跑 esbuild 产出打包结果,再跑 tsc 生成类型声明。
- 免预编译直接跑 TypeScript 重型 CLI:`yarn yakumo` 通过 `node --expose-internals --import tsx --import @cordisjs/unyaml` 启动。
- 按消费者需要的形态输出覆盖率:`test:text`、`test:json`、`test:html` 各自先用 shx 清空 coverage 目录,再以指定 reporter 重跑。
- 让 lint 在所有子仓库保持一致:`yarn lint` 执行 `eslint --cache`,规则来自共享的 @cordisjs/eslint-config ^1.1.1。
- 让每个贡献者的安装可复现:`packageManager: [email protected]` 把 Yarn 版本直接钉在清单里。
工作原理
- 根 package.json 声明两个 workspace 通配——`external/*` 与 `packages/*`——Yarn 4.14.1 会把这两个目录下的每个文件夹都当作同一依赖图里的包。
- 文档被下放:根 README.md 只含 './packages/core/README.md' 一行,packages/core 因此成为框架的文档入口。
- `yarn build` 依次执行 `yakumo esbuild` 与 `yakumo tsc`,为每个子包产出打包结果与 TypeScript 声明。
- `yarn test` 执行 `yakumo vitest --import tsx`;三个包装脚本(`test:text`、`test:json`、`test:html`)借助 @vitest/coverage-v8 ^4.1.5 重建文本、JSON 或 HTML 覆盖率。
- `yarn yakumo` 直接用 `node --expose-internals` 启动 yakumo ^3.2.1 的 CLI,加载 tsx 处理 TypeScript、@cordisjs/unyaml ^2.0.3 处理 YAML 配置。
- 整棵树是 ESM:根清单把 “type” 设为 “module”,tsx 依赖则钉在 Cordiverse fork(`npm:@cordiverse/[email protected]`)上。
架构细读:文件树说明了什么
- 根清单:名称 `@root/cordis`、`private: true`、`version 0.0.0`、“type” 为 “module”——根目录只是构建枢纽,不是发布产物。
- 两个 workspace 通配按角色分代码:`packages/*` 放仓内包(按 README 指引,core 在这里),`external/*` 放刻意保持距离的外部代码。
- yakumo ^3.2.1 负责单仓库任务编排;yakumo-esbuild ^3.0.2 与 yakumo-tsc ^3.0.1 分别承担两个构建阶段,yakumo-vitest ^1.3.3 接管测试。
- 根级直接运行时依赖:零。15 个根级条目全部是 devDependencies,框架真实的依赖面定义在各子包的清单里,而不在这里。
命令面:根清单里的每一条脚本
- `yarn lint` → `eslint --cache`,全仓库统一检查
- `yarn yakumo` → `node --expose-internals --import tsx --import @cordisjs/unyaml node_modules/yakumo/lib/cli.js`,直接拉起 yakumo CLI
- `yarn build` → `yarn yakumo esbuild && yarn yakumo tsc`,两阶段构建
- `yarn test` → `yarn yakumo vitest --import tsx`,经 tsx 加载运行
- `yarn test:text` / `test:json` / `test:html` → 各自先 `shx rm -rf coverage`,再 `yarn test --coverage --coverage.reporter <格式>`,输出三种报告形态
维护风险:0.0.0 的问题
- 根清单是 `private: true` 且 `version 0.0.0`——从这份文件看,根目录本身不按版本发布;使用者依赖的是单独发布的子包。
- 根 README 只有一行('./packages/core/README.md'),任何进入仓库的人都得再下潜一层才能找到解释。
- 源包里的裸链分支不一致:README 来自 `master`,LICENSE 与 package.json 来自 `main`——固定任何提交前先确认默认分支。
- tsx 钉在 Cordiverse fork `npm:@cordiverse/[email protected]` 上,每次测试运行都依赖这个 fork 跟上上游变化。
- eslint 停在 ^8.57.1 这条线,而 TypeScript 已是 ^5.9.3;确认共享的 @cordisjs/eslint-config ^1.1.1 是否仍解析新语法。
采用前的核对清单
- 确认你实际消费的是哪个 `packages/*` 子包,并查看它自己的清单与版本号。
- 跑一遍 `yarn test:html` 并打开覆盖率报告,看测试套件真正覆盖了哪些模块。
- 从头到尾读 packages/core/README.md——它是根 README 唯一点名的文档。
- 把 MIT 条款(版权 2021-present Shigma)记入第三方许可清单。
谁适合关注
适合关注
- 想在设计自己的框架前,先研究 ESM 优先、重度使用 workspace 的仓库布局的 TypeScript 项目。
- 想要一份可运行的 yakumo 多包构建参考(esbuild 与 tsc 两阶段分开跑)的维护者。
- 许可必须落在 MIT、且偏好读源码而非宣传页的选型者。
- 正在研究 TypeScript 上下文与可组合性模型、愿意直接读 packages/core 的工程师。
可以先跳过
- 现在就需要可安装、有版本号包的项目——根清单是 private 的 0.0.0。
- 期待顶层 README 提供快速上手的读者——根 README 只有一行。
- 非 TypeScript 代码库——工具链(tsx、tsc、vitest)从头到尾假设 TypeScript。
风险与注意事项
MIT 许可、可从干净克隆完成构建与测试,但可安装面定义在根清单之外的子包里,测试加载器是 fork,根 README 没有任何说明。
- 根 `version 0.0.0` 加 `private: true`,仓库根本身不发布任何东西。
- 文档在下一层的 packages/core/README.md,不在仓库入口。
- `tsx` 解析到 `npm:@cordiverse/[email protected]`,跑测试套件就会继承这个 fork。
- README 由 `master` 提供,而 LICENSE 与 package.json 来自 `main`——依赖任一分支前先核实默认分支。
- 许可证为 MIT,版权 (c) 2021-present Shigma:保留声明即可商用、修改与再分发。
- 许可证带标准 “AS IS” 条款——不做任何担保,安全审查责任在使用方。
- 根级 15 个依赖全部是 devDependencies(构建与测试工具);各子包的运行时依赖需另行审计。
- 源包中没有出现安全策略、审计输出或 CI 徽章,安全姿态应视为未验证。
替代方案比较
| 方案 | 适用场景 | 代价 |
|---|---|---|
Vue core(@vue/runtime-core 响应式) | 需要久经考验、文档完善的可组合性与响应式模型。 | 要接受 Vue 的组件渲染模型,而非独立元框架。 |
NestJS | 需要结构化、自带模块体系与依赖注入的服务端 TypeScript 框架。 | 运行时更重、约定更强,围绕装饰器与固定模块体系构建。 |
InversifyJS | 只需要一个 IoC/DI 容器来组合 TypeScript 服务。 | 需配置装饰器元数据(experimentalDecorators、emitDecoratorMetadata)。 |
tsyringe | 想要微软出品、配置极简的轻量依赖注入解析器。 | 功能面远小于完整框架。 |
这个趋势说明了什么
门面上的文档缺口
根 README 只有一行 './packages/core/README.md'。谁写一个真正的落地页——安装片段加一张 packages/* 与 external/* 划分示意——就能消掉 719 颗新星面对的最大摩擦。
打开根 README 数行数(一行),再计时:新人从 packages/core/README.md 出发要走多久才能碰到第一条可执行指令。
可照抄的单仓库蓝图
yakumo 流水线(`yakumo esbuild && yakumo tsc`、三种覆盖率报告、`eslint --cache`、钉死的 [email protected])是一套完整可用的 TypeScript 单仓库参考。
fork 仓库后运行 `yarn build && yarn test:html`,打开 coverage/index.html;能通过,蓝图即可迁移。
给 tsx fork 降险
测试以 npm:@cordiverse/[email protected] 导入 tsx。把修复推上游、或写清 fork 存在的原因,能替所有跑测试的人移除一个隐性依赖。
把 fork 与上游 tsx 4.19.3 的包做 diff,再换成上游包跑 `yarn test`,看是否仍然通过。
RepoDaily 判断
Cordis 是一个 MIT 许可、ESM 优先的 TypeScript 单仓库,根目录只是围绕 packages/core 的构建枢纽;口号足够勾人,工具链可验证地新,尽调路径也短——构建它、测试它、读 packages/core。