附.在电脑上使用编写模板写卡#

打开这一章节, 意味着你已经阅读了解了青空莉的

开始编写#

如果你还没有变量结构脚本#

其实你已经能够使用编写模板一键写卡.

例如, 让我们打开某个 AI 编程助手 (目前推荐使用 Claude Code、Codex), 然后输入:

请参考`初始模板/角色卡`和`示例/角色卡示例`, 为我在`src/夏霖`文件夹中新建一张 mvu 角色卡,它应该有夏霖孤独感、物品栏等变量,并有扁平化的状态栏
../../../../_images/%E8%BE%93%E5%85%A5.png

等 AI 执行完成, 正常情况下 AI 已经帮你写好变量结构脚本、initvar、变量更新命令、变量列表、变量输出格式、状态栏等了!

提示

为了泛用, 编写模板里并没有内置人设模板之类的x, 你可以参考咩咩的 Gemini CLI 全自动写卡工作流之类的, 自己给 VSCode/Cursor 添加 "世界书" (说白了把提示词发给 AI 就行了, 或者加入到 "全局世界书" 里始终发给 AI).

如果你已经有变量结构脚本#

你依然可以直接像上面没有变量结构脚本那样操作, 只是在和 AI 对话时把变量结构脚本发给它.

如果你还想更多手动操作……可以手动去初始模板/角色卡里复制新建为src文件夹中的文件夹src文件夹中, 重命名成你想要的名字, 然后打开里面的 schema.ts 文件, 清空内容, 把你自己的变量结构脚本粘贴进去. 如:

import { registerMvuSchema } from 'https://testingcf.jsdelivr.net/gh/StageDog/tavern_resource/dist/util/mvu_zod.js';

export const Schema = z.object({
  好感度: z.coerce.number().transform(value => _.clamp(0, 100));
});

$(() => {
  registerMvuSchema(Schema);
});

然后, 删除开头的 import 行和尾部的 $(() => ...):

export const Schema = z.object({
  好感度: z.coerce.number().transform(value => _.clamp(0, 100));
});

这样以后, AI 就能知道角色卡的变量结构是什么样的, 你也可以继续在你重命名了的文件夹/世界书/变量文件夹中让 AI 或自行完成 initvar 和其他变量提示词.

实际使用#

之前在实时编写前端界面或脚本中, 我们是直接在 src 文件夹下新建脚本或前端界面.
但 MVU 角色卡写起来有所不同, 为了更好地组织它, 青空莉为它写的初始模板是这样的:

../../../../_images/%E8%A7%92%E8%89%B2%E5%8D%A1%E5%88%9D%E5%A7%8B%E6%A8%A1%E6%9D%BF%E7%BB%93%E6%9E%84.png

脚本、界面和世界书#

可以看到, 角色卡初始模板文件夹里直接包括了四个文件夹:

  • 界面脚本文件夹: 在这两个文件夹里面, 你可以像实时编写前端界面或脚本那样写前端界面或脚本, 并在 dist 中得到打包出的代码——变量结构脚本也应该用 dist 中打包出的结果;

  • 第一条消息世界书文件夹: 在这亮个文件夹里面, 你可以像实时编写角色卡、世界书或预设那样写角色卡——当然别忘了填写 tavern_helper.yaml 文件.

变量结构及变量结构脚本#

另外还有个 schema.ts 文件, 这其实就是变量结构脚本……的主要部分.

为什么说是主要部分呢? 因为 schema.ts 只包含变量结构脚本的 export const Schema 部分:

export const Schema = z.object({
  ...
});
export type Schema = z.output<typeof Schema>;

而没有变量结构脚本开头的 import 和结尾的 $(() => ...)——它们被放在了 脚本/变量结构/index.ts 中:

import { registerMvuSchema } from 'https://testingcf.jsdelivr.net/gh/StageDog/tavern_resource/dist/util/mvu_zod.js';
import { Schema } from '../../schema';

$(() => {
  registerMvuSchema(Schema);
});

原本门之主写卡助手所写的变量结构脚本有两个功能:

  • export const Schema 规定了我们角色卡的 MVU 变量结构是什么;

  • 而开头的 import 和结尾的 $(() => ...) 把这个变量结构实际注册给 MVU.

而编写模板将这两个功能拆分:

  • schema.ts 规定了我们角色卡的 MVU 变量结构是什么;

  • 脚本/变量结构/index.ts 把这个变量结构实际注册给 MVU.

既然 脚本/变量结构/index.ts 是脚本, 你自然可以实时修改它. 但为什么要拆分出 schema.ts 呢? 因为变量结构并不只有变量结构脚本需要:

  • 状态栏等界面也需要了解变量结构, 才能正常显示变量;

  • 世界书中的 [initvar] 条目也需要基于变量结构编写. 不同于在酒馆里我们只能祈祷 AI 生成别犯错, 在 VSCode/Cursor 中我们可以让软件检查 [initvar] 有没有错!

也就是说, 不止变量结构脚本需要用到 schema.ts, 因此青空莉选择了把它拆分出来, 让其他脚本、界面乃至世界书能直接使用它; 而变量结构脚本只负责将它实际注册给 MVU.

利用 schema.ts 编写 initvar#

如果你已经复制初始模板到 src 文件夹中, 并运行了 pnpm buildpnpm watch, 会发现 schema.ts 旁边多了一个 schema.json 文件:

../../../../_images/schema_json.png

这个文件可以辅助 AI 或我们手写 initvar.

很简单! 让我们打开 世界书/变量/initvar.yaml 文件, 就会发现开头有一句 # yaml-language-server: $schema=../../schema.json. 这一句意思就是这个 YAML 文件必须满足 schema.json 的规定——我们的变量结构规定!

好吧, 如果你已经创建了变量结构, 其实也不需要我废话了w 你打开 世界书/变量/initvar.yaml 时应该已经看到了一个报错:

../../../../_images/%E7%BC%96%E5%86%99initvar.png

这个报错告诉我, 我的变量结构里规定了要有世界变量, 但我 initvar 里没有写, 于是我加上 世界: {}; 然后软件又告诉我我缺了另一个变量……你就可以这样一个个填写变量直到 initvar 文件不再报错! 当然也可以依旧让 AI 写x

更多使用说明#

更多使用说明也请参考青空莉的文档哦:

不过, 如果你对实时编写前端界面或脚本实时编写角色卡、世界书或预设里的操作还有印象, 那应该能想起来它们启用实时监听的命令是不同的qwq:

  • 实时编写前端界面或脚本是在终端执行 pnpm watch;

  • 实时编写角色卡、世界书或预设是在终端执行 node tavern_sync.mjs watch 所有 -f.

编写模板统一了这两个命令, 你只需要在终端执行 pnpm watch 就可以啦! (当然别忘了修改 tavern_sync.yaml, 还有酒馆那边也要开启对应开关x)

另外, 编写模板也统一了打包命令, 你只需要在终端执行 pnpm build 就可以打包所有角色卡、世界书、预设、脚本、界面了!