1.0 Release Candidate
这页是 1.0.0-rc.0 的发布前检查单。目标是确认当前 main 可以作为 1.0 候选版本对外验证,而不是在 release prep 阶段继续扩大功能范围。
当前 package 版本:1.0.0-rc.0 下一候选版本:1.0.0-rc.1 npm prerelease dist-tag:rc
1.0 Definition
1.0.0 定义为 stable contract release,而不是继续扩大功能范围或对外打 raw performance 对比的版本。
稳定承诺:
- 基础 terminal UI 能力、包入口、browser/CLI/headless 运行边界。
- 核心组件行为、renderer capability、安全默认值和发布验证流程。
- Public entrypoint 的文档化 API 在 1.x patch/minor 中不做 breaking change。
不承诺:
TVirtualList、TLogView、agent console 聚合入口的全部 API 细节。- 与 OpenTUI、
@opentui/solid或其他 renderer 的性能优势,除非有同机器、同 terminal、同场景的公开 benchmark 报告。 - experimental API 在 1.x 内的 SemVer 稳定性。
对外表述应聚焦:Vue 生态、browser DOM / CLI stdout / headless 三目标、明确 package contract、安全默认值,以及 logs / markdown / agent console 场景的高吞吐基础设施。不要写“比 OpenTUI 更快”“性能优于 Solid”“native 级性能”这类没有同场景数据支撑的结论。
Scope
- 从最新
main准备 release candidate;未合并 feature PR 不写进 release notes。 - 不把 experimental API 提升到 root entrypoint。
- 不新增 renderer、持久化层或外部 LLM API 集成。
- rc.0 发布前冻结会改变 Node 支持范围、bundler 输出或 publish 流程的 toolchain 更新;除非该更新修复当前 release gate 的明确失败。
- 保持 root、core、runtime、renderer/dom、observability、vue、cli、markdown、experimental entrypoint 的边界清晰。
- API maturity、renderer capability、browser ARIA 和 terminal permission contract 以 API Maturity 与 Platform Contracts 为准。
Stability
1.0 RC 的稳定面:
@simon_he/vue-tui@simon_he/vue-tui/core@simon_he/vue-tui/renderer/dom@simon_he/vue-tui/cli@simon_he/vue-tui/markdown
集成层入口:
@simon_he/vue-tui/vue@simon_he/vue-tui/runtime@simon_he/vue-tui/observability
仍然实验性:
@simon_he/vue-tui/experimentalTLogViewstackTVirtualListstack
RC 阶段可以在 rc.0 -> rc.1 修正 release blocker,包括必要的破坏性调整。1.0.0 stable 发布后,Public entrypoint 的文档化 API 不在 patch/minor 中做 breaking change。Experimental API 不属于 stable 兼容性承诺。
RC Adoption
RC 用户使用 rc dist-tag 安装:
pnpm add @simon_he/vue-tui@rc vue只从公开 entrypoint 引入:
import { TBox } from "@simon_he/vue-tui";
import { createTerminalApp } from "@simon_he/vue-tui/cli";不要 deep import:
import { TBox } from "@simon_he/vue-tui/dist/index.js";Migration Notes
TListwheel scrolling 现在只代表 viewport scroll,不再把 wheel 作为 selection commit。TListEnter / double click 通过change表示确认选择;update:modelValue只表示 selection change。TRenderPlane.planemount 后按 immutable 处理;需要迁移 plane 时使用:keyremount。scheduler.queueFrameTask()可能返回false;producer 必须在被拒绝时清理自己的 pending state。- 高吞吐组件继续从
@simon_he/vue-tui/experimental引入,应用代码应把这些 imports 隔离在少量边界文件内。 - root entrypoint 迁移表见 Migration to 1.0.0-rc.0。
- root entrypoint 收窄为稳定 browser-safe API;
TAnchor、TFlow、TInputBox、TPathPicker、TJsonEditor、TRenderPlane、TRenderLayer、TTransition、router/composables 改从@simon_he/vue-tui/vue引入。 - root entrypoint 只导出 browser-safe 的
createTInputHostPlugin();Node-aware 的createDefaultTInputHostAdapter()/defaultTInputHostPlugin继续从@simon_he/vue-tui/cli引入。 - 自定义
TLogViewsource 仍应通过version或getLineKey(index)表达内容变化,避免复用 stale line cache。
完整行为变更列表以 CHANGELOG 的 1.0.0-rc.0 为准。
Package Exports
发布前确认:
package.json的files仍只发布dist。- README 的 entrypoint 表必须覆盖
package.json的全部公开 subpath export。 - root entrypoint 不导出
TVirtualList、TLogView、log companion 或 markdown-only 组件。 @simon_he/vue-tui/core承载 terminal core、ANSI/theme/path/hyperlink helpers。@simon_he/vue-tui/renderer/dom承载 DOM renderer factory 和 renderer capabilities。@simon_he/vue-tui/vue承载扩展 Vue 组件、composables、router helpers 和 Vue runtime internals。@simon_he/vue-tui/runtime承载 runtime wiring、selection helpers 和 clipboard abstraction。@simon_he/vue-tui/observability承载 frame perf、profiler 和 trace helpers。@simon_he/vue-tui/cli承载 stdout renderer、stdin driver、headless app、Node providers 和 recording。@simon_he/vue-tui/markdown只承载 markdown parser / renderer API。@simon_he/vue-tui/experimental承载TVirtualList、TLogView、search/link/minimap companions 和 log plugins。- ESM、CJS、types 三套 built export 都通过
test:package-exports验证。
Publish Tags
- Prerelease 版本必须用
rcdist-tag 发布,例如1.0.0-rc.0。 - Stable 版本必须用
latestdist-tag 发布。 - GitHub Release workflow 的
npm_tag输入默认为rc,只允许next、rc、beta、latest,并会阻止 prerelease 使用latest或 stable 使用非latesttag。 - 首选真实发布路径是 GitHub Release workflow,它会发布 workflow 验证过的 tarball:
npm publish "$TARBALL" --access public --provenance --tag "$NPM_TAG"。 - 如果 workflow token 或 provenance 不可用,本地 fallback 是先跑
pnpm run release:local:dry-run,确认 npm dry-run 通过后再跑pnpm run release:local。本地 fallback 发布.release/*.tgz,固定使用rcdist-tag,不生成 npm provenance。
GitHub Release Template
Stable 1.0.0 的 release handoff 草稿见 1.0.0 Release Notes Draft Checklist。RC release 使用下面模板;stable 发布时不要保留 rc dist-tag、RC wording 或未填写的 validation placeholders。
Title:
v1.0.0-rc.0Body:
## Summary
- 复制 CHANGELOG 中该版本的用户可见变更。
- 明确这是 1.0 release candidate,npm dist-tag 是 `rc`。
- 说明 `/experimental` 仍是 preview,不属于 stable 兼容性承诺。
- 说明 `/vue`、`/runtime`、`/observability` 是 Advanced entrypoint,soft-stable 但不等同于 root-level SemVer 承诺。
## Known boundaries
- 不要 deep import `dist` 或内部源文件。
- emoji、CJK 和 ambiguous width 仍受 terminal / font 组合影响。
- OSC8 links 默认经过 sanitizer;OSC52 clipboard provider 必须显式 opt-in。
- `/experimental` API 可以在 RC 阶段继续调整,应用代码应把这些 imports 隔离在少量边界文件内。
## Validation
- Local release dry-run: `<pass/fail>` (`pnpm run release:dry-run`, run date, Node version)
- GitHub Release workflow dry-run: `<pass/fail>` (`dry_run=true`, `npm_tag=rc`, run URL)
- Authenticated npm dry-run: `<pass/fail>` (`NPM_TOKEN` configured; `npm publish --dry-run --provenance --tag rc` ran)
- Tarball SHA256: `<sha256> <tarball>`
- Node/Vue runtime matrix: `<pass/fail>` (Node 16.17.1 / 18 / 20 / 22 / 24 with Vue 3.3.0 / 3.5.33)
- Packed smoke: `<pass/fail>` (package contract, pnpm/npm consumer smoke, packed type smoke, browser Vite smoke)
- Benchmark report: `<pass/fail>` ([Benchmarks](/benchmarks), run date, Node version, behavior gate result, timing-review result if run)
- Post-publish dist-tag verification: `<pass/fail>` (`npm view @simon_he/vue-tui@rc version`, `npm dist-tag ls @simon_he/vue-tui`)
- npm new-project install: `<pass/fail>` (`npm install @simon_he/vue-tui@rc vue`)
## Manual terminal validation
| Target | Result | Evidence |
| ------------------------------- | ----------- | --------------------------------------------- |
| macOS Terminal 或 iTerm2 | pass / fail | terminal、OS、Node version |
| Linux xterm-compatible terminal | pass / fail | terminal、distro、Node version |
| Windows Terminal 或 WSL | pass / fail | terminal、Windows / WSL version、Node version |
| Resize | pass / fail | demo command |
| Ctrl+C cleanup | pass / fail | demo command |
| Keyboard input | pass / fail | demo command |
| OSC8 links | pass / fail | sanitized / disabled by default |
| OSC52 clipboard | pass / fail | explicit opt-in only |
## RC feedback format
- OS and terminal:
- Node version:
- Vue version:
- Package version:
- Import entrypoint:
- Renderer: CLI stdout / browser DOM / both
- Reproduction:Validation
快捷入口:
pnpm run release:dry-run
pnpm run release:check
pnpm run release:bench
pnpm run release:smoke
pnpm run release:pack-smoke
pnpm run release:local:dry-run
pnpm run test:ssr-import:packagerelease:dry-run 是发布前最后一道本地 gate。它会跑 release:check、release:bench、release:smoke 和 packed package install smoke,确认当前构建可以从 .tgz 安装到外部项目后使用。实际发布首选 GitHub Release workflow;如果 CI token 或 provenance 不可用,可以用 release:local:dry-run / release:local 发布同一个本地验证过的 tarball。
展开命令:
pnpm run check:hidden-unicode
pnpm run format:check
pnpm run lint
pnpm run typecheck
pnpm run test
pnpm run test:package-exports
pnpm run test:package-contract
pnpm run release:pack-smoke
pnpm run bench:baseline
pnpm run docs:buildtest:package-contract 会对 packed tarball 跑 publint 和 ATTW package type analysis。release:pack-smoke 会把当前 tarball 安装到临时外部项目,并用 pnpm 和 npm 分别运行 root/cli/experimental 的真实 consumer 组合 smoke;它不是只检查 import 是否存在。packed smoke 还会输出 tarball size、unpacked size、largest JS 和 largest d.ts,作为 RC 体积基线。
SSR/import-only smoke 会用 packed tarball 创建一个 Vite SSR consumer,导入 root、core、runtime、renderer/dom、observability、vue、markdown 和 experimental entrypoint,确认这些入口不会在 import-time 触发 document / window。
Benchmark gate 策略:
release:bench跑行为稳定的 baseline 检查,是 release gate。- timing budget 只通过
bench:baseline:timing手动确认,不作为默认 release gate,避免 CI timing 波动阻断行为正确的 RC。 - 公开 benchmark 口径见 Benchmarks。release notes 必须说明测试日期、Node 版本、机器/OS、tarball digest、行为 gate 是否通过,以及 timing 是否手动复核。没有同场景横向报告时,不写竞品性能结论。
示例 smoke:
pnpm run example:tlog-view-lab
pnpm run example:agent-console:smoke
pnpm run example:agent-console:terminal:smoke真实终端交互验证按需手动跑,并在 release notes 里记录 terminal / OS:
pnpm run run:basic:terminal
pnpm run run:tlog-view-lab
pnpm run run:agent-console:terminalManual Terminal Validation
RC 发布记录至少说明这些手工验收结果,不要只保留 checklist:
发布前把表格填成真实结果;空白结果表示当前 RC 还不能发布。
| Target | Result | Evidence |
|---|---|---|
| macOS Terminal 或 iTerm2 | ||
| Linux xterm-compatible terminal | ||
| Windows Terminal 或 WSL | ||
| resize | ||
| Ctrl+C cleanup | ||
| keyboard input | ||
| OSC8 links disabled/sanitized by default | ||
| OSC52 provider requires explicit opt-in |
Release Handoff
- 合并目标 feature / fix PR 后,从
main创建 release candidate 分支。 - Bump
package.json、CHANGELOG.md和这页的目标版本。 - 确认 Examples Index 中的 browser、terminal、smoke 路径仍能运行。
- 跑
pnpm run release:dry-run。 - 如果
docs:build更新 generated API,提交 generated docs;否则保持工作区干净。 - GitHub Release title 使用
v1.0.0-rc.0;body 摘录CHANGELOG.md的同版本内容,并保留 Experimental API 不稳定说明。 - 跑 GitHub Release workflow dry-run;仓库必须配置
NPM_TOKEN,否则 workflow 会失败,避免跳过 authenticatednpm publish --dry-run。 - 如果 GitHub Release workflow 可用,只在发布验证完成后通过 workflow 发布已验证的 tarball;prerelease 的
npm_tag保持rc。 - 如果 workflow token 或 provenance 不可用,确认
pnpm run release:local:dry-run通过后跑pnpm run release:local。本地发布使用当前 npm 登录态;如果账号开启 publish 2FA,用NPM_CONFIG_OTP=<code> pnpm run release:local。 - 发布后验证
npm view @simon_he/vue-tui@rc version、npm dist-tag ls @simon_he/vue-tui,并在临时新项目里用 npm 安装一次@simon_he/vue-tui@rc。 - 如果发布错 tag,先用
npm dist-tag add @simon_he/vue-tui@<stable-version> latest修正默认 tag;如果 tarball 本身有问题,deprecate 该版本并发布新的 RC。
pnpm run release:ci 只做 dry-run 验证。pnpm run release:local:dry-run 和 pnpm run release:local 是本地 fallback 发布路径;pnpm run release 和 pnpm run release:workflow-only 仍会阻止裸发布入口。
Rollback / Deprecate
不要覆盖已发布版本;npm package version 是不可变的。
如果只是 dist-tag 错误:
npm dist-tag add @simon_he/vue-tui@<stable-version> latest
npm dist-tag add @simon_he/vue-tui@<rc-version> rc
npm dist-tag ls @simon_he/vue-tui如果 tarball 本身有问题:
npm deprecate @simon_he/vue-tui@<bad-version> "Deprecated release candidate; use @simon_he/vue-tui@rc"然后修复问题、发布新的 RC 版本,并在 GitHub Release notes 里说明替代版本。