gsd-core 的 ADR-457 收尾:bin/lib TypeScript 迁移如何退役 checkJs 补丁并规范化构建产物
【免费下载链接】gsd-coreGit. Ship. Done - Core项目地址https://gitcode.com/gh_mirrors/ge/gsd-core点击查看免费下载本篇围绕 migration-finalize-ts.md 这条变更记录展开它是 gsd-coreGit. Ship. Done - Core中 ADR-457「bin/libTypeScript 迁移」的最终收口动作。读完你能掌握这次收尾的三项核心变更——退役tsconfig.lint.json的checkJs临时方案、把 tsc 生成的config-types.cjs降级为 gitignore 构建产物、以及package-identity.cjs如何以 value-baked 例外长期保留——并能结合tsconfig.build.json与package.json的构建脚本链理解「TS 源码为唯一真源、.cjs为发布期产物」这一模型在仓库中的完整落地方式。一、这条 Changeset 记录了什么migration-finalize-ts.md 的 frontmatter 声明这是一条type: Changed的变更记录关联 PR #537。正文一句话概括了三个动作退役tsconfig.lint.json的checkJs临时方案——前提是每一个手写的bin/lib/*.cjs都已收敛collapsed为src/*.cts唯一真源把 tsc 生成的config-types.cjs视为 gitignore 的构建产物——与其余 tsc 输出同等对待package-identity.cjs保持 value-baked 状态——其类型契约通过src/package-identity.d.cts显式声明。变更记录尾部附有一条docs-exempt注释说明了免写文档的理由内部 ADR-457 的 build-at-publish 迁移收尾移除一个未使用的 stopgap tsconfig并将一个生成产物加入 gitignore无用户侧可见变更。这条注释本身就点出了收尾动作的性质纯内部工程动作不改变任何用户可感知的行为因此不触发文档强制要求。二、背景ADR-457 为什么选择「发布时构建」要理解这次收尾先看 ADR-457。该 ADR 解决的核心问题是bin/lib手写运行时代码的类型安全长期是「二等公民」——类型错误只能以 lint 发现的形式如果有的话出现而不是编译错误同时 lint 配置里存在一个并未真正接线的tsconfig.lint.jsonallowJscheckJs注释宣称「Type-aware via parserOptions.project」实际 ESLint 配置中并没有parser和parserOptions.project文件是在无类型信息的状态下被 lint 的。ADR-457 评估了三种「TS 源码与.cjs产物并存」的模型模型做法ADR 结论1. 双入库.ts源码与.cjs输出都提交进 git永久引入「两份副本必须一致」的不变量需要 parity 测试、双提交、drift gate而运行时收益为零。被否决2. 发布时构建build-at-publish.cjs是 gitignore 的构建产物由 tsc 从 TSsrc/树生成npm 发布构建输出采纳。无 drift 不变量、无 parity 测试、无双提交代价是本地开发和 CI 必须在运行前构建3. 安装时构建用户安装时编译被否决跨 Node 版本/平台脆弱且拖慢每次安装ADR 同时明确了一个关键区分value baking值烘焙与 transpilation转译是两种完全不同的「生成」技术。package-identity.cjs必须烘焙因为安装后的目录树里没有带.name的package.json相关 bug #378运行时根本读不到这些坐标值而bin/lib逻辑的 TS→CJS 转译删除后「什么都不回来」其全部价值在于编写期与 CI 的类型检查。因此 ADR 的决策第 5 条规定只有在最后一个手写.cjs消失时才退役tsconfig.lint.json——这正是本次 Changeset 执行的时机。三、收尾动作的仓库证据3.1tsconfig.lint.json已退役checkJs不再存在在当前仓库中find全库 tsconfig 只剩两个文件tsconfig.json 与 tsconfig.build.jsontsconfig.lint.json已经不存在。两者的分工被tsconfig.json顶部的注释写得很清楚{ //: Default editor/CI typecheck config. The emitting publish build stays in tsconfig.build.json., extends: ./tsconfig.build.json, compilerOptions: { noEmit: true }, include: [src/**/*.cts] }也就是说编辑器和 CI 的类型检查直接复用发布构建配置并叠加noEmit不再需要任何针对.cjs的allowJs/checkJs路径——因为已经没有手写.cjs需要检查了。类型感知 lint 也完成了从「假接线」到「真接线」的切换。eslint.config.mjs 中对src/**/*.cts的 lint 块现在使用tseslint.configs.recommendedTypeChecked并通过parserOptions.project: ./tsconfig.build.json把真实的 TS 工程喂给规则集。全库搜索已无任何checkJs或tsconfig.lint引用临时方案被彻底拆除。3.2 tsc 生成的.cjs一律是 gitignore 的构建产物tsconfig.build.json 是整个模型的工程载体其头部注释直接标注了出处{ //: ADR-457 build-at-publish: compile TS runtime sources in src/ to gitignored .cjs artifacts under gsd-core/bin/lib/. Source uses the .cts extension so tsc emits .cjs natively. As modules migrate, they move from hand-written bin/lib/*.cjs into src/*.cts here., compilerOptions: { rootDir: src, outDir: gsd-core/bin/lib, module: nodenext, moduleResolution: nodenext, target: ES2022, lib: [ES2022, ES2025.RegExp], types: [node], strict: true, esModuleInterop: true, noEmitOnError: true, incremental: true, tsBuildInfoFile: tsconfig.build.tsbuildinfo }, include: [src/**/*.cts] }几个关键设计点src/**/*.cts→gsd-core/bin/lib/*.cjs源码用.cts扩展名tsc 在nodenext解析模式下原生输出.cjs与require()消费方仓库没有type: module完全兼容strict: truenoEmitOnError: true编译错误会直接阻断产物输出保证进入bin/lib的.cjs必然来自一次通过类型检查的构建incrementaltsBuildInfoFile迁移期大量模块反复构建增量编译控制反馈延迟。config-types.cjs正是这种产物的一个实例其真源是 src/config-types.cts而.gitignore第 139 行显式列出/gsd-core/bin/lib/config-types.cjs。.gitignore中对这类产物甚至留有维护约定例如针对其他模块的注释# #4145: emitted artifact of src/pristine-baseline.cts — never edited.即「这是某个.cts的输出产物永远不要手改」。本次 Changeset 把config-types.cjs归入同一类统一了「生成产物不入库」的处理口径。3.3package-identity.cjs唯一长期 value-baked 的例外ADR-457 决策第 2 条要求「value baking 单独保留」本次收尾在类型层面完成了配套src/package-identity.d.cts 为这个不迁移的模块提供类型声明使严格模式下的src/*.cts源码能在nodenext模块解析下合法地导入它/** * Type declaration for package-identity.cjs — permanently hand-written, * not migrated per ADR-457. This .d.cts file allows strict TypeScript * sources (src/*.cts) to import it under nodenext moduleResolution. * ... */ export declare const packageName: string; export declare const PACKAGE_NAME: string; export declare const binName: string; export declare const repoSlug: string; export declare const repoUrl: string; export declare const changelogRawUrl: string; export declare function manualInstallCommand(opts?: { scope?: string; runtime?: string }): string;注意措辞是「permanently hand-written」——这与 ADR 的「deletion test」论证一致gsd-core/bin/lib/package-identity.cjs 顶部标注// generated by scripts/generate-package-identity.cjs from package.json — DO NOT EDIT.它由 scripts/generate-package-identity.cjs 从package.json读取并烘焙字面量坐标。之所以必须烘焙而非运行时读取是因为安装树中不存在带.name的真实package.jsonbug #378 的根因require(package.json).name在可解析处返回undefined、在不可解析处抛MODULE_NOT_FOUND。围绕这个唯一例外的防腐化机制有三层均可在仓库中验证parity 测试tests/package-identity.test.cjs 从package.json重新生成并断言提交的产物未过期drift lintscripts/lint-package-identity-drift.cjs 以check:identity-drift脚本暴露且该文件把「seam 文件、生成器、lint 脚本」三者绑定在一起做一致性校验生成检查lint:generated-sync链中包含node scripts/generate-package-identity.cjs --check保证 CI 能发现烘焙产物漂移。四、收尾后的构建与验证链路收尾之后「编辑src/*.cts→ 运行bin/lib/*.cjs」之间始终隔着一次构建这条链在 package.json 中被完整接线脚本命令作用build:libtsc -p tsconfig.build.json从src/**/*.cts编译出 gitignored 的gsd-core/bin/lib/*.cjsprepare/prepacknpm run build:lib本地npm installlink 场景与打 npm 包前自动构建覆盖 ADR「未构建 checkout 中消费者」的 open questionprepublishOnlynpm run build:lib npm run build:hooks发布前构建 TS 产物与 hooks 产物正是 ADR-457 选定的 build-at-publish 钩子pretestnpm run build:lib npm run lint:skill-deps落实 ADR「For testing」一节的结论测试依赖bin/lib/*.cjs必须先构建build串联generate:identity、build:lib、各gen:*与build:hooks完整构建入口先烘焙 identity再 tsc再生成其余注册表产物其中prepare与pretest两个钩子正是 ADR 后果分析中「成本」一侧的直接实现——本地开发与 CI 都在运行前构建从而彻底消灭了模型 1 需要维护的「双副本一致」问题产物从不入库就不存在漂移。五、收尾后的bin/lib现状与验证方式从当前仓库状态看gsd-core/bin/lib/下只剩 9 个.cjs文件capability-command-router.cjs、capability-registry.cjs、capability-validator.cjs、exit-code-registry.cjs、legacy-cleanup.cjs、loop-host-contract.cjs、package-identity.cjs、profile-pipeline-command-router.cjs、stale-bake-guard.cjs而src/目录已有约 210 个.cts真源文件。这些残留的.cjs分别属于两类非 tsc 场景注册表/契约类生成器产物如capability-registry.cjs由gen:capability-registry生成甚至在version脚本中被显式git add、exit-code-registry.cjsgen-exit-code-registry、loop-host-contract.cjsgen:loop-host-contract——它们由专用 Node 脚本生成而非 tsc 转译.gitignore中也以「emitted artifact, never edited」类注释标注value-baked 例外package-identity.cjs按前述 ADR-457 决策永久保留。这意味着 Changeset 中「每一个手写bin/lib/*.cjs已收敛为src/*.cts」的表述与仓库现状吻合需要checkJs去检查的手写 JS 面已经归零剩下的.cjs全部有各自的生成器或例外声明。验证这次收尾是否到位只需在仓库中执行npm run build:lib # tsc -p tsconfig.build.json确认 src 全量类型通过并产出 bin/lib npm run pretest # build:lib lint:skill-deps确认测试链路依赖构建 npm run lint # eslint .确认类型感知规则走 tsconfig.build.json无 checkJs 残留build:lib的noEmitOnError保证任何类型错误都会直接失败退出lint:generated-sync则持续守护烘焙产物与生成注册表的同步。六、小结这条看起来只有几句话的 Changeset实际上是一座「迁移完成度」的验收碑拆除tsconfig.lint.json与checkJs在最后一个手写.cjs消失的时点被移除符合 ADR-457 决策第 5 条预设的退役条件类型感知 lint 改接真实的tsconfig.build.json工程。归类tsc 生成的.cjs如config-types.cjs统一成为 gitignore 的构建产物「源码入库、产物不入库」的口径在.gitignore中逐一落实。保留package-identity.cjs作为 value-baked 的深 seam 被显式豁免迁移并通过src/package-identity.d.cts声明、parity 测试与 drift lint 三重机制锁住其一致性。其方法论价值在于当一个「生成管线」只服务于编写期收益类型检查而非运行时收益时把产物变成构建期垃圾而非入库资产可以整片消灭 drift 治理机制——这正是 ADR-457 用「build-at-publish」换取「无 parity 测试、无双提交」的核心取舍而本次收尾让它从纸面决策变成了仓库里可复现的事实。赞分享【免费下载链接】gsd-coreGit. Ship. Done - Core项目地址https://gitcode.com/gh_mirrors/ge/gsd-core点击查看免费下载相关推荐gsd-core ADR-457 TypeScript 源码迁移实录10 个运行时模块从手写 CommonJS 到 tsc 构建产物gsd core ADR 457 TypeScript 源码迁移实录10 个运行时模块从手写 CommonJS 到 tsc 构建产物 本篇以归档 changegsd-core 的 ADR-457 构建即发布实践commands 与 state 枢纽模块的 TypeScript 迁移Batch 14gsd core 的 ADR 457 构建即发布实践commands 与 state 枢纽模块的 TypeScript 迁移Batch 14 本文以 gsgsd-core ADR-457 构建期迁移实战第 6 批五个运行时模块如何从手写 CommonJS 收敛为 TypeScript 单一真源gsd core ADR 457 构建期迁移实战第 6 批五个运行时模块如何从手写 CommonJS 收敛为 TypeScript 单一真源 本文以归档变更集上一篇Huihui-GLM-5.2-abliterated-GGUF常见问题解答从下载到运行的10个实用技巧下一篇最完整的React Native Firebase数据分析实战从埋点到驱动产品决策的全流程指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Humanizer 流式日期 API 深度解析:On.September 类参考与实现原理

Humanizer 流式日期 API 深度解析:On.September 类参考与实现原理

开发工具 【免费下载链接】Humanizer Humanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities 项目地址: https://gitcode.com/gh_mirrors/hu/Humanizer 点击查看 免费下载 On.Se…

2026/9/25 3:13:39 阅读更多 →
ctf-wiki 堆利用基础:深入剖析 ptmalloc2 的 unlink 宏与 malloc_printerr 错误处理机制

ctf-wiki 堆利用基础:深入剖析 ptmalloc2 的 unlink 宏与 malloc_printerr 错误处理机制

文档网络安全教程 【免费下载链接】ctf-wiki Come and join us, we need you! 项目地址: https://gitcode.com/gh_mirrors/ct/ctf-wiki 点击查看 免费下载 本文以 ctf-wiki 仓库中《ptmalloc2 实现 - 基礎操作》文档为核心,结合 glibc malloc 的源码级实…

2026/9/25 3:13:39 阅读更多 →
oh-my-opencode-slim 领域文档消费协议:Agent 探索代码库前必须遵循的术语、ADR 与 codemap 纪律

oh-my-opencode-slim 领域文档消费协议:Agent 探索代码库前必须遵循的术语、ADR 与 codemap 纪律

人工智能AI AgentAgent 编排AI 技能 【免费下载链接】oh-my-opencode-slim Lean, fine tuned Opencode multi agent suite Mix any models Auto delegate tasks 项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-opencode-slim 点击查看 免费下载 导读 本文系…

2026/9/25 3:13:39 阅读更多 →

最新新闻

深入理解 Sinon 的 `spyCall.firstArg`:读取单次调用首个参数的正确姿势

深入理解 Sinon 的 `spyCall.firstArg`:读取单次调用首个参数的正确姿势

测试开发工具 【免费下载链接】sinon Test spies, stubs and mocks for JavaScript. 项目地址: https://gitcode.com/gh_mirrors/si/sinon 点击查看 免费下载 spyCall.firstArg 是 Sinon 中 spy call 对象的一个核心只读属性,用于获取某一次函数调用传入…

2026/9/25 4:57:52 阅读更多 →
腾讯云WorkBuddy Enterprise企业级AI Agent平台架构与实操指南

腾讯云WorkBuddy Enterprise企业级AI Agent平台架构与实操指南

1. 从零理解 WorkBuddy Enterprise 的定位与核心价值1.1 这个平台到底解决什么问题WorkBuddy Enterprise 是腾讯云推出的一套企业级 AI 平台与 Agent 生态产品。说白了,它要解决的核心问题是:企业想用 AI,但不知道怎么把 AI 能力安全、可控、…

2026/9/25 4:57:52 阅读更多 →
Endnote在Word中消失?COM加载项排查与修复指南

Endnote在Word中消失?COM加载项排查与修复指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 4:57:52 阅读更多 →
Java图书管理系统SWT实战:从环境搭建到避坑指南

Java图书管理系统SWT实战:从环境搭建到避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 4:57:52 阅读更多 →
GDS版图从入门到精通:层次结构、生成流程与-uniquifycellnames避坑指南

GDS版图从入门到精通:层次结构、生成流程与-uniquifycellnames避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 4:57:52 阅读更多 →
Navicat免安装版深度解析:依赖库、配置与MySQL连接排查指南

Navicat免安装版深度解析:依赖库、配置与MySQL连接排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 4:56:51 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →