Filmsmith 是做什么的?
十种用代码拍摄影片的方式。根据需求制作一部短技术影片——技术演示、技术报告或解说、技术产品发布——时长根据内容计算,无人出镜:选择一个模式,复制其模板,填写 content.js,然后渲染。每一帧画面都由代码绘制,每一段声音都由代码合成(生成的音乐轨道可替换背景音轨),因此一部影片只需要一个能运行 shell 命令的编码智能体。该技能建立在一种品味理论(基础)之上,以及由此理论和所有者评判衍生出的十项核心原则、一个共享的系统(涵盖颜色、字体、空间和运动),以及应用这些原则的十种模式,每种模式对应一种视觉语言。
所有模式的统一风格:明快、直接、干净——大约在每个节拍上都有变化,每次变化只带来一个新事物,观众无需等待影片——并且干净并非平淡:元素虽少,但每个元素的流动都足够流畅以吸引目光(原则 4–6)。
要求
- 任何能运行 shell 命令的编码智能体。下面的
SKILL_ROOT是包含此SKILL.md的文件夹。 - 需要在 PATH 中的 Node 22 或更新版本、
ffmpeg和ffprobe。new-film脚本会检查它们,如果缺失则停止并显示消息。 - 在影片搭建和渲染期间需要网络连接:从固定的 google/fonts 提交和固定的 GSAP 构建(均存储在影片文件夹中)获取字体,首次运行
npx [email protected](也会获取其无头 Chrome),以及在渲染时,HyperFrames 编译器也可能从 Google Fonts 获取字体。离线渲染未经验证。请保持模板锁定的 hyperframes 版本;不要在影片内部升级它。 - 此版本中的屏幕文本为英语;当用户要求中文或其他文字时,请说明模板尚未支持。
模式
| 模式 | 中文名称 | 视觉风格 | 形态变体 | 适用场景 |
|---|---|---|---|---|
| thread | 一线 | 一条线变成一切,无切换 | thread:均匀规则或膨胀线条 | 视频、动画或渲染工具链的展示片 |
| ink | 落墨 | 每个节拍上猛击的厚重字体,一个墨点绽放成色彩 | typeWidth:压缩或扩展字体 | 名称揭示、启动片头、单行标语 |
| plakat | 招贴 | 动态的国际风格海报,一种信号色 | form:方形或对角区域 | 一个主张加上步骤和决定者 |
| blueprint | 蓝图 | 一张逐张绘制的工程图纸,琥珀色印章 | linework:墨水或铅笔 | 带有部件和签核的系统与工作流 |
| phosphor | 荧屏 | 夜间终端,一种磷光强调色,启动 HUD | screen:CRT 光栅或平面 | CLI 和开发工具 |
| tally | 算筹 | 每项一个方块,在图表间重新分组 | mark:方块、点或 Isotype 图形 | 计数、份额、数据集故事 |
| trace | 演算 | 算法状态的深色实时图表 | stroke:矢量或草图 | 机制或算法的工作原理 |
| morph | 一笔 | 一种墨色形状攀爬 点→线→面→实体→界面→标记,无切换 | corners:圆角或直角 | 开发工具和界面产品:一个源头变成所有表面 |
| halftone | 网点 | 双墨水印刷:标记的一部分保持静止,而每个世界围绕它打印,然后收回整个标记 | dot:圆形、方形或线形网屏 | 模型和产品发布:少数功能,一个数字,名称 |
| pulse | 节拍 | 一个以查询形式表演的问题:一个词一个节拍,背景沿一个色相翻转,一次白色闪屏作为答案 | aperture:切角或圆形 | 版本发布和基准测试结果:一个经过测量的结论 |
每种模式都有颜色预设(在其卡片上)和一个形态变体,两者都在 content.js 中设置;默认渲染与之前相同。每张卡片都列出了其用例及一个工作示例,并标记了最佳匹配。2026-10-19 之前的名称(thread-reel、ink-beat、swiss-poster、blueprint-drafting、terminal-launch、unit-data、diagram-explainer)在 new-film 中仍然有效。
选择规则和模式卡片格式:references/modes/README.md。模式不可混用。主题(按影片类型划分的叙事骨架和规则):tech-product-launch 适用于 thread、ink、plakat、blueprint、phosphor、morph、halftone 和 pulse 模式;tech-explainer 适用于 tally 和 trace 模式。
工作流程
1. 澄清
跳过用户已提供的信息;询问其余部分,首先确定模式。以平实的对话提问,一次最多三个问题;当某个缺口不妨碍开始时,进行假设并告知用户。所有影片均为 16:9,1920×1080,用于横向全屏播放;当被要求制作竖屏或方形影片时,请说明该技能无法制作。
| # | 问题 | 原因 |
|---|---|---|
| 1 | 内容是什么:一个工具、一个带有步骤的主张、一个系统、一个名字、一个展示片、数字、一个机制? | 决定模式(选择表);提出一个并解释原因 |
| 2 | 事实来源于哪里(仓库、文档、数据集、算法)? | 屏幕上的每个事实都来源于此;每个数字都从此计算得出 |
| 3 | 平台,以及目标时长(如果有的话)? | 时长根据内容计算(原则 5);目标时长会在模式范围内调整节奏,然后场景会被裁剪或添加 |
| 4 | 哪个调色板预设? | 仅限预设,在模式卡片上列出;不接受自定义十六进制值 |
| 5 | 硬约束(必须显示、不得显示、URL、名称)? | 避免返工 |
| 6 | 音乐:这个智能体能否调用音乐生成 API? | 如果可以,则使用与影片节奏匹配的生成背景音轨替换合成音轨(系统);如果不能,则使用合成背景音轨,并在交接中说明 |
当模式、来源和预设已命名,音乐来源已知,并且目标时长(如果有的话)已确定时,此步骤完成。
2. 搭建脚手架
node <SKILL_ROOT>/scripts/new-film.mjs <mode> <film-dir> --palette <id>
此命令检查 Node 和 FFmpeg,复制模板,添加共享运行时作为 lib/(带有 lib/VERSION 时间戳),写入 PLAN.md 骨架,从固定的 google/fonts 提交和固定的 GSAP 构建中下载模板 fonts.json 中列出的字体到 lib/vendor/;如果任何步骤失败,则停止,因此影片永远不会使用回退字体渲染或依赖 CDN。需要可变字体轴的模板在 fonts.json 中声明其轴(weight 和 stretch 范围,请参阅 CONTRACT.md)。然后完整阅读模式卡片和文件夹的 TEMPLATE.md:场景注册表、每个槽位的字符限制和固定的编排逻辑都在那里。当你能说出该模式提供的每种场景类型时,此步骤完成。
3. 概念和节拍计划
new-film 已在影片文件夹中写入了 PLAN.md 骨架。在接触 content.js 之前填写它;没有计划的影片不会被渲染(原则 10):
- 概念句,格式为“在这部影片中,[该产品独有的东西]变成了[该模式的标志性手法]”,以及竞争对手测试:将最接近的竞争对手放入句子中,它必须不再成立。然后是贯穿线(引导观众从第一帧看到最后一帧的对象或框架)。
- 禁止列表:从模式卡片的“出厂默认值”和 ai-tells.md 开始;添加任何与最接近的参考影片过于相似的内容。
- 最接近的参考和母题表:命名最接近的参考影片并列出该影片与之共享的母题;在具有已知参考的模式中,超过一半的共享母题会导致违反 P1。
- 节拍计划:每个场景一行——场景类型、屏幕文案及其哪些是主要文本或扫视文本、事实来源、此场景在下一个场景中变成什么,以及音乐中断用于阅读或下降用于关键时刻的位置。不选择时长:将场景写入
content.js并运行npm run fit,该命令打印每个场景的开始时间、节拍、阅读需求、切换前的填充及其在短语四舍五入中的份额、影片时长,将renders/timing.json写入文件,并将表格复制到PLAN.md的fit标记之间。当PLAN.md缺失时npm run fit会停止,并且在其仍有未填充的<!-- fill -->部分时发出警告。
在编写文案之前,阅读模式的 TEMPLATE.md 中的时长表:它说明了每个场景的哪些槽位算作主要文本以及它们如何进入,因此每个状态都可以被预算而不是被发现。当每个场景类型都在注册表中,每个字符串都符合其字符限制,每个数字都命名了计算它的代码,并且 npm run fit 报告没有错误时,此步骤完成。字符限制只是第一道过滤器:一个槽位的宽度可能取决于其邻居,因此像素检查是步骤 4 中的红色横幅。对于规则声明了时序 API 3 的模板,错误意味着影片违反了变化的四个层级之一(原则 5):一次进入的主要文本超过五个词(对于主张是八个词,需在标记的暂停中阅读),着陆后保持超过两个节拍,构图超过 6 秒,超过四个节拍没有变化的间隔,或者表达性过渡和高峰的数量或位置错误。首先将长行拆分成依次进入的短语,然后使重复的标签成为扫视文本,然后拆分场景;切勿缩小字体或加速到阅读底线以下。在时序表下方,npm run fit 打印层级度量;仍在使用 API 2 的模板保留其页面限制(十二个主要词,一步保持一个小节,最后一步一个半小节,一个页面四个小节),并在 INFO 注释中显示层级。
4. 首先填充和取景
编辑 content.js(以及 data/ 或 run.js,如果模式使用它们的话);切勿输入 duration 或场景 bars 以达到某个时长。然后渲染关键帧的静态图并在动画化之前查看它们(脚本首先运行 fit,因此静态图使用当前时长):
npm run snapshot -- --at <t1>,<t2>,<t3>
静态图上的红色横幅表示某个槽位的文本宽度超出其盒子:缩短该文本。修复任何违反核心原则或模式原则的帧:信息文本低于 25 px、文本无法阅读、超过三个类型层级、两个主角、第二种强调色、剪裁或溢出的副本、任何来自 ai-tells.md 的内容。当每个关键帧都通过模式卡片的 P0 检查时,此步骤完成。
5. 渲染
npm run film # fit → audio → check → render, writes renders/film.mp4
npm run check 必须报告 0 个错误。其警告根据检查清单进行判断:仅对仍在进入(正在输入、淡入)且着陆后只读取一次的文本,对比度警告是可接受的;任何其他警告都会被修复或列在“已知问题”下。声音遵循与 content.js 相同的节拍网格;要改用生成的音乐,请以影片适配的节奏和时长(renders/timing.json)渲染它,将其保存到 assets/audio/,并设置 content.bed = { file, offset }(请参阅模式的 TEMPLATE.md)。
6. 测量和审查
node <SKILL_ROOT>/scripts/check-film.mjs renders/film.mp4 --film-dir .
sh <SKILL_ROOT>/scripts/contact-sheet.sh renders/film.mp4 renders/contact-sheet.jpg 20
check-film 读取 renders/timing.json 并根据它测量渲染结果:格式和时长、响度(含短期和瞬时跳动)、黑帧、按面积计算的闪光、节拍上的关键事件(2 帧内,伴随图片事件和声音起始 [≥ 3 dB 在 1 帧内])、每个场景内内容掩码下的静止伸展(相对于颗粒感知噪底层)、节奏(没有长时间近乎静止的节拍运行,不超过一半的影片是近乎静止的)、保持稳定、交接、等长场景的运行,以及声明事件上的四个变化层级(T0 间距、T1 构图长度、T2 表达性过渡、T3 高峰、保持长度),这些仅对时序 API 3 的模板判定 FAIL;画面起始、大面积变化和最响亮时刻是它们旁边的像素和信号估计。最小文本、文本对比度、类型层级、强调色面积、八度平衡、四小节重复和限制是像素或信号估计,报告为 INFO。没有可测量项的项目报告 N/A,而不是 PASS;--json 提供每个结果及其对应的检查清单项目。
然后浏览 references/checklist.md 和模式卡片的检查项:从金字塔底部向上检查 P0,然后从上到下判断(合适度、新鲜度、质感)。在改变任何内容之前进行测量;修复原因,然后重新测量。当每个 P0 都通过,并且每个 P1/P2 的缺失都已修复或写在影片 README 的“已知问题”下时,此步骤完成。
7. 交接
提供 MP4 路径、联系表以及一份 README,内容包含计划、模式和预设、音乐来源(合成或生成)、命令、check-film 报告和已知问题;除非有人听过,否则说明“尚未通过听觉确认”。请求用户的评判,并逐字引用回用户(附上日期);当用户不可用时,写入“等待评判”并停止。
维护者:从评判到规则
仅限维护此技能源的人使用;影片制作者在步骤 7 停止。评判不会直接编辑模式卡片或原则。首先将其放在金字塔的一个层级上,并对照 foundations.md 进行检查:在层级 1-2,由标准决定;在层级 3-4,由领域共识决定,除非偏离项写明了理由;在层级 5-6,由所有者在理论认为同样好的候选者之间选择。一个趋势在两个一致的评判后成为规则。
[此处截断,原文完整内容已省略,但保留了所有其余部分]