# 将已有项目迁移到 Hypit 0.3
[English](0.3.md)
当为 0.2.x 或更早的开发版编写的项目需要在 0.3 上运行时,请使用本指南。
本文采用的具体目标版本是 `@hypit/hypit@0.3.1`。
新项目应直接使用当前的创作参考文档,不要重新采用下文中的旧写法。
| 当前项目的起点 | 需要检查的内容 |
| --- | --- |
| 0.2.x 或更早的源码检出版本 | 本指南中的文件头、创作关系、项目组件、Runtime 选择和可复用 Output;随后检查 0.3.1 的 SDK 变化 |
| 正式发布的 0.3.0 | [0.3.1 的导入与依赖变化](0.3.1.zh-CN.md);不要默认整份作品都需要重写 |
| 版本或来源不明 | 确认实际使用的可执行程序,检查报错指向的具体文件或导入 |
本指南说明主要的迁移边界,并不是适用于所有历史包的自动转换器。
有些变化只是精确替换标识符,有些则需要根据具体作品保留原有含义。只迁移作品实际使用的功能。
## 1. 确认并保留作品
修改正常工作的安装之前,保留 Sources、Recipes、Runs、项目包、`package.json`、lockfile、
Runtime Profile、素材和 Results。为即将编辑的文件保留可恢复的副本。
不要仅仅为了升级就覆盖凭据或替换已经接受的媒体素材。
从项目目录确认实际使用的可执行程序:
```sh
hypit version
hypit paths
```
如果已有项目本地的 npm 安装,使用 `npm exec --no -- hypit version`。
如果采用本指南中的 npx 安装方式,使用 `npx @hypit/hypit@0.3.1 version`。
这些是不同的启动方式,不是三个安装步骤。同时检查项目显式声明的依赖:
选择新的可执行程序,并不会更新项目中的旧组件包或 lockfile。
[安装参考](../skills/hypit/references/environment/distribution.md)说明可执行程序、Skill 和项目各自独立的生命周期。
如果 Agent 从旧 Skill 学到了过时语法,请通过该 Skill 自己的安装渠道更新它,并阅读当前说明。
## 2. 安装缺失包之前,先检查文档的语法入口
文件第一行选择语言解析器。文件后缀仍然是 `.svml`、`.svs` 或 `.svrun`。
| 文档 | 旧文件头 | 0.3.0 和 0.3.1 的文件头 |
| --- | --- | --- |
| SVML Author | `` | 不变 |
| SVRun | `` | `` |
| 普通 SVS Recipe sheet | `` | `` |
| 文字模板 SVS | `` | 不变;TextTemplate sheet 继续使用 Text 的解析器 |
这些是解析器的逻辑身份,不是 npm 包名与版本声明。官方 Distribution 已包含这些解析器。
不要尝试安装旧解析器名称来解决解析问题。修改 sheet 的文件头只是选择解析器;
还需要根据接收组件的当前接口检查 Recipe 属性。
### `cannot locate installed package @hypit/run-markup`
遇到此错误时,先只修改 Run 的文件头。例如,以 `take.video` 为目标的 Run 应写成:
```xml
```
保留实际的 Author 路径、Targets,以及已有的 Candidate 和复用声明。然后检查:
```sh
npx @hypit/hypit@0.3.1 check swap8.svrun
```
这里 `npx` 选择可执行程序,`@0.3.1` 固定 npm 发行版本,`check` 检查 Source 和依赖图,不提交生成请求。
Run 文件头解析成功,并不代表其 Author、所选包或 Targets 都有效;如果出现下一条具体诊断,请继续处理。
这次解析器变更发生在正式发布 0.3.0 之前,并不是仅在 0.3.1 中漏发了一个包。
API 凭据不影响解析器的查找。`hypit cli use` 选择已安装的命令贡献,不选择文档解析器;
`hypit packages install` 不是当前支持的命令。
如果确实缺少外部能力包,请使用项目的普通包管理器安装。
Ranking 等可选组件和合作 Provider 不随默认安装提供。请在项目中安装所选包,
例如 `npm install @hypit/ranking@^0.1.0` 或 `npm install @hypit/provider-hiapi`;
仓库中带 lockfile 的示例按其 README 执行 `npm ci`。
## 3. 迁移作品中的关系,而不只是标签名称
较大的 0.2 作品可能在修复文件头后成功解析,随后才暴露过时的 Surface 或输入。
使用下表定位作品中负责相应功能的部分。这些条目不是全局查找替换规则。
| 项目中的旧写法 | 现在需要表达的关系 | 当前用法 |
| --- | --- | --- |
| Program Space 声明或导入 | 显式声明 Clock、Timeline 和 Canvas;在选定的空间边界内构造 Frame | [Timeline](../skills/hypit/references/production/timeline.md)、[空间](../skills/hypit/references/production/spatial.md) |
| 用语义 `Take` 条目装配 Timeline | 构造带有可解析 `end` 的 Timeline;规范化媒体的 Extent 可以决定具名 Window 的时长 | [Timeline 构造](../skills/hypit/references/production/timeline.md) |
| 组件直接消费 Script Selection/Moment | 选择 Projection,发布具名绝对 Window/Instant,再把该值传给组件 | [时间](../skills/hypit/references/production/timing.md) |
| Performance/Sound Track 隐式呈现 Timeline 中的素材 | 在 Visual Clip 和 Audio Clip 中显式放置规范化媒体,保留原有的画面与声音选择 | [Visual Clip](../skills/hypit/references/production/visual-clips.md)、[Audio Clip](../skills/hypit/references/production/audio-clips.md) |
| Media Track 的 `Item`、呈现或播放预设 | 使用 Visual Track 的 Clip、Frame 和源时间采样重新表达这次素材呈现;检查原本想要的适配、裁切、截取、重复或停帧行为 | [Visual Clip](../skills/hypit/references/production/visual-clips.md) |
| Media Pipeline 导入 | 使用 Media Operations 完成规范化和处理;检查每个 Surface 的输入和导出值 | [媒体](../skills/hypit/references/production/media.md) |
| Caption 只接收 Script 内容和 Timeline | 通过显式绑定与 Projection 产生绝对 CaptionTiming,再向 Caption 组件提供文档和时间 | [字幕呈现](../skills/hypit/references/production/caption-presentation.md) |
| Typography Track 及其旧 Recipe | 使用 Fine Text 或项目自己的文字组件;保留原有文字、Frame、样式和具名时间输入 | [字体与文字](../skills/hypit/references/production/fonts-and-text.md) |
| Fonts Open 内置的字体家族名称 | 选择实际的 npm 字体依赖或本地字体文件,保留字体、字重、样式和所需字符覆盖 | [字体](../skills/hypit/references/production/fonts-and-text.md) |
| Render Hyperframes | 通过 `@hypit/html-video@1` 将 Film 装配为 HtmlProgram/视频,并选择本地 HTML Provider 执行 | [渲染](../skills/hypit/references/production/rendering.md) |
例如,语义段落不再是组件隐式解释的时间输入:
```xml
```
消费者随后使用 `during={proof-window}`。这里 `semantic` 导入 `@hypit/narrative-temporal@1`,
`story-time` 是显式 Projection,`story` 是拥有该 Selection 的 Script。
Projection Map 将已对齐的局部时间域连接到等长的 Timeline Window;这些 Map 不放置画面或声音,
画面和声音分别由 Visual Clip 与 Audio Clip 放置。
如果原有意图就是直接编写时间,请继续将其保留为直接声明的具名时间值。
对于从 Script 派生的字幕,时间适配器使用 Script 已经产生的数据:
```xml
```
这里 `narrative-caption` 导入 `@hypit/narrative-caption@1`。
将 `{story.caption}` 和 `{story-captions}` 分别传给当前 Caption 组件的 `document` 和 `timing`。
不要把 Script 再抄写成第二份字幕文档。保留作者写出的 `||` Cue 边界和显示文字与口播文字的对应关系;
所需的 Unit 时间必须能通过所选 Projection 获取。
[小型作品示例](../skills/hypit/references/production/examples/production.svml)展示了当前素材、Clock/Canvas、
规范化、Timeline、Projection、Visual/Audio、Film 和视频输出的完整连接。
用它理解连接方式,不要用它替换已有作品的创作结构或重新生成已经接受的素材。
通过 `hypit vocabulary ` 和所属包的 README 查看实际安装版本中精确的 Surface 与输出名称。
## 4. 更新项目组件及其导入
有些 0.2 SDK 不仅改了名称,也调整了职责。
如果组件导入了 `author-kit`、`component-kit`、`endpoint-kit`、`runtime-kit`、`visual-ir`、
`program-space` 或 `studio-adapter`,不能假定只替换前缀就能完成迁移。
- 作者组件使用[组件创作](../skills/hypit/references/production/track-authoring.md)中说明的窄公共 API:
Author、Producer、Admission 和 Markup。
- 视觉和音频值使用 Composition 及相关领域包。HTML 组件使用当前的 HtmlVisual/HtmlProgram 接口,
不再使用旧 Hyperframes API。
- Provider 使用 [Endpoint SDK](../packages/endpoint/README.md)及其实际的领域依赖。
- 编辑器行为属于组件自己的 Companion,使用 [Studio Companion](../packages/studio-companion/README.md)。
历史上的独立 `*-studio` 导入需要对照当前所属包的导出检查,不要猜测包名并安装。
如果目标是 0.3.1,请应用精确的[领域 SDK 导入映射](0.3.1.zh-CN.md#仅迁移领域-sdk-导入)和依赖说明。
修改组件所属的源码与 manifest,再重新构建它声明的 JavaScript 入口。
保留现有包管理器,并审查 lockfile 的更新。
对于第三方组件,选择已发布的迁移版本,或与用户明确约定源码修复;
不要悄悄修改已安装的副本,就宣称项目已完成迁移。
## 5. 分清项目选择、已安装代码与执行配置
项目通过显式指定,或通过祖先目录中带有 `hypit.project: true` 的 `package.json` 选择。
Run 的位置不会选择另一个项目。`hypit paths` 会报告当前使用的路径。
通过 `hypit runtime use ` 或命令的 `--runtime ` 使用原本打算采用的 Profile。
如果项目没有 Profile,`hypit runtime init` 可以创建起始配置;
不要仅仅为了升级就用起始配置替换作品正常工作的配置。
[Profile 参考](../skills/hypit/references/environment/profile.md)说明当前配置。
检查旧 Profile 中的包名和适配器专属选项。本地执行使用 Runtime Local;
HTML 渲染使用 `@hypit/provider-html-local`;本地媒体执行使用 `@hypit/media-local`;
凭据选择使用本地或环境变量 Credential Store。
在适用的情况下保留所选服务、账号和存储位置。
历史上将存储与传输拆开的配置,不能直接当作当前本地 Profile 的配置使用。
只有所选 Store/Provider 读取对应环境变量时,它们才会提供凭据。
`.env` 文件或某个 API key 变量不能解决过时的 Source 导入。
先处理语法和包错误,再根据所选 Provider 的实际配置诊断服务访问。
## 6. 保留可用结果并验证实际作品
不要重写旧 Result 文档,让它们看起来像是新类型。
已有媒体文件通常可以复用,但旧的结构化媒体、对齐、字幕或编排值可能需要从保留的输入重新计算。
决定如何处理之前,先检查它们的实际类型和数据。
使用当前的 [Run Candidate](../skills/hypit/references/production/runs.md)选择兼容的已完成 Output。
如果只能保留原始视频、音频或图片,就通过当前媒体路径接入实际文件,
并执行新消费者所需的规范化或对齐。
保留原始 Result 及其资源文件;不要复制 manifest 后就丢弃它们。
不要因为名称相似,就假定所有旧 Blob 类型或结构化 `@1` 值都兼容。
付费重新生成是单独的决定,不是迁移的默认步骤。
使用作品选定的启动方式,逐步扩大验证范围:
1. 使用各组件自己的构建命令,构建修改过的项目组件。
2. 对实际 Source 和 Run 执行 `hypit check`,解决具体的包、Surface、引用和类型错误。
3. 执行 `hypit plan --runtime `,检查剩余请求和显式复用选择。
4. 在 Studio 中打开实际 Run,检查时长、画面、声音、字幕和一个有代表性的片段。
5. 只构建或导出用户指令授权的工作,并检查生成的视频。
修改依赖或 Profile 后,留意[进程生命周期](../skills/hypit/references/environment/profile.md#know-when-a-change-takes-effect)。
不要为了重启所有助手而打断正在进行的制作。
如果迁移受阻,保留已知可用的可执行程序、依赖、lockfile 和原始作品;
报告具体缺少的能力,不要承诺文件头检查成功就代表迁移完成。