auto backup 2026-05-16 08:10:01

This commit is contained in:
xiaobian-bot 2026-05-16 08:10:01 +08:00
parent a281f1357b
commit 54fe7e0074
40 changed files with 3828 additions and 302 deletions

View File

@ -1,5 +1,36 @@
lark-send-message-as-bot.vala b0696b6412214e892b6582eddef577c09c630bb01571ba9dbff3d79a6d1f972b lark-send-message-as-bot.vala b0696b6412214e892b6582eddef577c09c630bb01571ba9dbff3d79a6d1f972b
lark_wiki_operate_as_bot.vala f84c308bcb69280520dadf9458177d9c4af192d60cf409528bd65e13f3e67e0a lark_wiki_operate_as_bot.vala f84c308bcb69280520dadf9458177d9c4af192d60cf409528bd65e13f3e67e0a
contextual-word-allocation eee3c02bebd937563c7814c31085038930956e20d69651085d55e17a6d489db2 contextual-word-allocation eee3c02bebd937563c7814c31085038930956e20d69651085d55e17a6d489db2
story-outline-design 9afbe8c592ff690af2473191b0622862d4b406e1f3267e83217589991d7b5ff7 business-knowledge-lookup a60116a7d2e065a7f958ee04cf80cce8c7b6d865409f376908bd552e658927dd
children-english-script-writing 1377312a2e172c0c9d41e695d9424394fbb2974faaad5d920333ba3108c57a1e children-english-script-writing aa6b106292ef454966af7c43292e39118d887fe37c719441d3cb0b49c37a1d74
feishu-script-writer 9da7f56e1dc0465a9c0a97e728d20c60c3d879eaf6c612dbf95b574a16dc3024
lark-approval 6a83696bfed247f5043d82902c7ff1820bbb382c5d314e44a2ccd9aea0bafdad
lark-attendance 025cd69a0bf0f4952f171f2a5ea0a74ce63ecdc1653aa8901747194be089ecea
lark-base 35ba663cb1c8debe3ebac65a7f957a95d79082e3c826c30bb32695351017a1a7
lark-calendar ffeea2f3e72e76590b82982e149b2c63136f58b4cab4d4a5c046ffb1b4255fc3
lark-contact 49e78be31e781fd21ffffd38415d75b16e7385bad7cc56492942b3ac365764f6
lark-doc 69b1c69b96c5e245dc85cecb08ea21cff68de38130a05c8c5cbfc74a8291a670
lark-drive 2c83a5290e709d31751a264d0d9433deba557605855586c4ec6957a62edc05f7
lark-event 0dcbca1f8f58aeff21f040334e9d3b0420485e2ec47b56c74a46850bb27de813
lark-im 92e28c93c1f325e55f83224de1a7800af8645e5f36faee016aff7968666af343
lark-mail 03ef09a918127ea32056722ae6ac5349814fe265d3e82b347c56983ba42cd829
lark-markdown c51955e4415c92eb34dccca45956ca9b9e2a5da4b0633f9c1ee45f1c6e1e8e1e
lark-minutes 7ee97f4443654001daa9ad13ff2b54b4af6577ec5c079b9feb1378aaf28cac14
lark-okr 1a92ab5ddcd81329fc044902778a342e830164806587d9afb215da1017a337eb
lark-openapi-explorer 486a53bd6c195783905d78748390adff1f17b4c897c1cfd10b70f0e7c518d66f
lark-shared 41bb0d1330afc8892f70e8d12db3a46a4534ba036bc620e0672119e4edf2201c
lark-sheets 8a5ba257c31938e9bff848e4a3d967ab539af5a134a49a0536d172060a826f9b
lark-skill-maker 49c9378c29d3dea20ebcdc22238660510060883bbffbc42d77de7113d94c268c
lark-slides 13e1727979e4d79abe0adf54de8b1654803a210bd6fe0d908a08753ffaedcd89
lark-task 8aacfe2a325751857827e05718d1b3a1b3dcf1327d1a86402f26b3f38b907eef
lark-vc 6df0bd5ba50d61b466b9eaceb41b1e717de0cd6f9c724648b84e604d311fabad
lark-whiteboard 0b88606935afc15c6f673438d7c362255a3f34aaf66c011bb3c59c2f13e6c48d
lark-wiki 5bda9b1dcc1678aa8c8410d4f95d47d9905f4e8f11a74f5150e93b0238558eef
lark-workflow-meeting-summary 7217ed0e051bff13434730597993bbda7e7aa7bdcf4289e1535ca085f15c75b5
lark-workflow-standup-report 9ce2e4fd25195d06e47a2c0e1660fe41e746501fb482020855ca6bb4797d8314
neat-freak 6d102606a0d72824253bca81f8376c5562171a9926a404eec4a3c2a816709e83
office-document-specialist-suite 46bebd2772c66ad32fa64a45e4aec18f0e1f26a1e1763e094d6923e56fc5d42d
script-polish d20402f8fe902d9a64eab32d34acb2190538472a07a5b4825e0e8400d6d4beeb
script-proofread 937bad345dedd36e3638722b85ae0518a619b40d9b61646a441120590dc6bd5f
story-outline-design e52486291dbd86e89532b0984eb4d9596bf68f0104e8e8e698e2bc88519f947e
update-knowledge-base d134ee7b034ecd47ccb4bdc942a939f569eddc633227c60ff12f5926533a3663

View File

@ -15,6 +15,8 @@
3. 阅读 `memory/YYYY-MM-DD.md`(今天 + 昨天)获取近期上下文 3. 阅读 `memory/YYYY-MM-DD.md`(今天 + 昨天)获取近期上下文
4. 阅读 `MEMORY.md` — 你的长期记忆(仅包含团队共享知识,不含个人隐私) 4. 阅读 `MEMORY.md` — 你的长期记忆(仅包含团队共享知识,不含个人隐私)
5. 阅读 `private_memory/{user_id}_{名字拼音}.md` — 当前用户的个人偏好(如文件不存在则跳过)。该文件仅在当前用户会话中生效,不同用户的偏好严格隔离 5. 阅读 `private_memory/{user_id}_{名字拼音}.md` — 当前用户的个人偏好(如文件不存在则跳过)。该文件仅在当前用户会话中生效,不同用户的偏好严格隔离
6. 阅读 `business_knowledge/long_task_protocol.md` — 长线任务协作协议(触发条件、两问流程、日志规则、完成沉淀)
7. 阅读 `business_knowledge/active_tasks.md` — 检查是否有进行中的长线任务需要恢复
不要请求许可。直接做。 不要请求许可。直接做。
@ -238,6 +240,16 @@ Skills 提供你的工具。当你需要某个工具时,查看它的 `SKILL.md
目标:在不令人烦扰的前提下提供帮助,做有用的后台工作,尊重安静时间。 目标:在不令人烦扰的前提下提供帮助,做有用的后台工作,尊重安静时间。
## 长线任务协作协议(强制执行)
与编剧协作时,严格遵循 `business_knowledge/long_task_protocol.md` 定义的流程。关键要点:
- **新任务触发两问:** 编剧发起全新写作任务时,依次询问 Q1目标完整Unit/单Lesson/润色修改/其他)和 Q2是否需要建日志
- **日志规则:** 只记录通过的段落和有效反馈,不记录打回/修改/删除的中间过程
- **日志位置:** `business_knowledge/task_log/{任务名称}.md`
- **任务索引:** `business_knowledge/active_tasks.md` 维护进行中任务列表,会话重置后靠它恢复
- **完成沉淀:** 任务完成后汇总反馈清单,请编剧确认哪些需要更新到知识库
## 持续改进 ## 持续改进
这只是一个起点。在实际工作中不断优化你的工作方式,添加你自己的惯例和规则。 这只是一个起点。在实际工作中不断优化你的工作方式,添加你自己的惯例和规则。

View File

@ -55,10 +55,18 @@
7、编剧共识规则https://makee-interactive.feishu.cn/wiki/DqjUw4sKNiGhTBkygz8cPAicnXe 7、编剧共识规则https://makee-interactive.feishu.cn/wiki/DqjUw4sKNiGhTBkygz8cPAicnXe
8、剧本可用emoji对照表https://makee-interactive.feishu.cn/wiki/X3lHweh3hi2XBokgA6rcRhTRnvg 8、剧本可用emoji对照表https://makee-interactive.feishu.cn/wiki/X3lHweh3hi2XBokgA6rcRhTRnvg
## 长线任务协作协议
- **协议文档:** `business_knowledge/long_task_protocol.md`(详细规则)
- **触发:** 编剧发起全新写作任务时按序询问两个问题Q1 任务目标完整Unit / 单Lesson / 润色修改 / 其他、Q2 是否需要建日志
- **日志:** `business_knowledge/task_log/{任务名称}.md`,只记录通过的内容和有效反馈,不记录打回/修改/删除
- **索引:** `business_knowledge/active_tasks.md` 维护活跃任务列表
- **恢复:** 会话重置后编剧说"继续{任务名称}"或"查{任务名称}进度"即可恢复上下文
- **完成沉淀:** 任务完成后汇总反馈清单,请编剧确认哪些需要更新到知识库
## 剧本创作协作流程(与编剧林逸瀚) ## 剧本创作协作流程(与编剧林逸瀚)
### 长周期协作记忆体系 ### 长周期协作记忆体系
每次开始新Unit/Lesson创作前必须依次查阅
1. `business_knowledge/script_feedback_log.md` — 历史反馈与高频错误(必读) 1. `business_knowledge/script_feedback_log.md` — 历史反馈与高频错误(必读)
2. `business_knowledge/unit_startup_checklist.md` — 启动检查清单(逐项打勾) 2. `business_knowledge/unit_startup_checklist.md` — 启动检查清单(逐项打勾)
3. `memory/Uxx_progress.md`(上期)— 关键决策记录复用到新Unit 3. `memory/Uxx_progress.md`(上期)— 关键决策记录复用到新Unit

View File

@ -0,0 +1,25 @@
# active_tasks.md — 活跃长线任务索引
本文件记录当前所有进行中的长线写作任务。会话重置后,小编通过本文件快速恢复任务上下文。
**最后更新:** 2026-05-15
---
## 当前活跃任务
| # | 任务名称 | 日志文件 | 创建者 | 创建日期 | 当前进度 |
|---|----------|----------|--------|----------|----------|
| — | (暂无) | — | — | — | — |
---
## 任务恢复方式
编剧说"继续{任务名称}"或"查{任务名称}进度"即可恢复对应任务。
---
## 归档说明
已完成的任务从本表移除,日志文件保留在 `task_log/` 目录作为历史记录。

View File

@ -50,6 +50,7 @@
| Lin.md | Lin | 速猴运输成员,懒散快递员 | | Lin.md | Lin | 速猴运输成员,懒散快递员 |
| Jay.md | Jay | 速猴运输成员Lin的搭档 | | Jay.md | Jay | 速猴运输成员Lin的搭档 |
| DiDi.md | DiDi | May的机器人伙伴 | | DiDi.md | DiDi | May的机器人伙伴 |
| Logi.md | Logi | 高级开拓者Sally的上司 |
| Robot 11.md | Robot 11 | 熊型清洁机器人 | | Robot 11.md | Robot 11 | 熊型清洁机器人 |
## 使用说明 ## 使用说明

View File

@ -2,11 +2,11 @@
## 基本信息 ## 基本信息
- 物种/外观30+,生物学家样子,看起来很热爱自然 - 物种/外观30+,生物学家样子,看起来很热爱自然
- 身份/职业:用户母亲,生物学家 - 身份/职业:用户母亲,生物学家曾经是Vala Pioneer开拓者
- 居住地:沙漠镇用户家 - 居住地:沙漠镇用户家
## 关于此角色 ## 关于此角色
热爱自然、喜欢冒险、不擅长烹饪。喜欢拉家人一起外出露营和徒步爱好极限运动。不擅长烹饪做的饭不好吃。语气充满活力谈论自然和冒险的时候很热情。与Fred Hope夫妻关系很好。与用户母亲支持用户的冒险经常带用户去户外。与Lucy很喜欢同样热爱自然的Lucy两人很合得来。 热爱自然、喜欢冒险、不擅长烹饪。喜欢拉家人一起外出露营和徒步,爱好极限运动。不擅长烹饪,做的饭不好吃。语气充满活力,谈论自然和冒险的时候很热情。曾经是Vala Pioneer开拓者与Fred一起在开拓者公寓有自己的房间Vala学院入学日期9月1日。与Fred Hope夫妻关系很好,两人都曾是开拓者。与用户:母亲,支持用户的冒险,经常带用户去户外。U19中作为开拓者离开地球执行任务User对父母既骄傲又思念。与Lucy很喜欢同样热爱自然的Lucy两人很合得来。
## 登场记录 ## 登场记录
- S1E04 音乐之声L1 隐藏曲目、L2 大胃王 - S1E04 音乐之声L1 隐藏曲目、L2 大胃王

View File

@ -2,11 +2,11 @@
## 基本信息 ## 基本信息
- 物种/外观30+,机械工程师样子,看起来开明活泼 - 物种/外观30+,机械工程师样子,看起来开明活泼
- 身份/职业:用户父亲,机械工程师,有音乐天赋 - 身份/职业:用户父亲,机械工程师,有音乐天赋曾经是Vala Pioneer开拓者
- 居住地:沙漠镇用户家 - 居住地:沙漠镇用户家
## 关于此角色 ## 关于此角色
开明、活泼、有音乐天赋、喜欢老电影。对用户很开明支持用户的决定喜欢和用户一起动手做东西。喜欢看老电影有音乐天赋会玩乐器。语气轻松活泼像朋友一样和用户相处。与Clare Hope夫妻关系很好。与用户父亲非常支持用户的冒险和决定。与Wood一家邻居关系很好经常互相帮忙。 开明、活泼、有音乐天赋、喜欢老电影。对用户很开明,支持用户的决定,喜欢和用户一起动手做东西。喜欢看老电影,有音乐天赋会玩乐器。语气轻松活泼,像朋友一样和用户相处。曾经是Vala Pioneer开拓者与Clare一起在开拓者公寓有自己的房间Vala学院入学日期9月1日。与Clare Hope夫妻关系很好,两人都曾是开拓者。与用户:父亲,非常支持用户的冒险和决定。U19中作为开拓者离开地球执行任务User对父母既骄傲又思念。与Wood一家邻居关系很好经常互相帮忙。
## 登场记录 ## 登场记录
- S1E04 音乐之声L1 隐藏曲目、L2 大胃王 - S1E04 音乐之声L1 隐藏曲目、L2 大胃王

View File

@ -2,7 +2,7 @@
## 基本信息 ## 基本信息
- 物种/外观40+,看起来优雅知性 - 物种/外观40+,看起来优雅知性
- 身份/职业:班主任老师,艺术老师,前生物行为研究学者 - 身份/职业:班主任老师,前生物行为研究学者
- 居住地:沙漠镇 - 居住地:沙漠镇
## 关于此角色 ## 关于此角色

View File

@ -6,7 +6,7 @@
- 居住地:沙漠镇新建的高档社区 - 居住地:沙漠镇新建的高档社区
## 关于此角色 ## 关于此角色
有钱但不骄傲、独立、好奇心强、见识广。遇到问题会自己先想办法解决乐于分享自己见过的新鲜事物不炫耀家境。语气大方得体偶尔会说出一些大家没听过的新鲜词汇。与用户新同学很快成为好朋友。与DiDiDiDi是她的机器人伙伴。与其他同学大家都很喜欢她对她的经历很好奇。 有钱但不骄傲、独立、好奇心强、见识广、元气阳光。遇到问题会自己先想办法解决乐于分享自己见过的新鲜事物不炫耀家境。语气大方得体偶尔会说出一些大家没听过的新鲜词汇。与用户新同学很快成为好朋友。与DiDiDiDi是她的机器人伙伴。与其他同学大家都很喜欢她对她的经历很好奇。
## 登场记录 ## 登场记录
- S2E15 兴趣小组L1-L5新同学首次亮相参观各兴趣小组展示农场和DiDi - S2E15 兴趣小组L1-L5新同学首次亮相参观各兴趣小组展示农场和DiDi

View File

@ -6,7 +6,7 @@
- 居住地:镇外(初次出现时从沙漠外闯入小镇) - 居住地:镇外(初次出现时从沙漠外闯入小镇)
## 关于此角色 ## 关于此角色
好胜、爱帮腔、比Lin更积极一些但也不太靠谱。乐观所有事情往好处想。Lin说完后常跟着帮腔补充两人一唱一和动手能力比Lin强一点帮忙扔包裹同样很在乎自己摩托车的"排面"。和Lin一样认为自己的摩托才是最快的一被激将就上头。比Lin更活跃一些喜欢追问和帮腔"你get到了吗"。与Lin速猴运输搭档一起骑摩托送快递经常互怼。与UserUser帮忙扔包裹时Jay配合协助。 主动、爱帮腔、比Lin更积极一些但也不太靠谱。乐观所有事情往好处想。Lin说完后常跟着帮腔补充两人一唱一和动手能力比Lin强一点帮忙扔包裹同样很在乎自己摩托车的"排面"。和Lin一样认为自己的摩托才是最快的一被激将就上头。比Lin更活跃一些喜欢追问和帮腔"你get到了吗"。与Lin速猴运输搭档一起骑摩托送快递经常互怼。与UserUser帮忙扔包裹时Jay配合协助。
## 登场记录 ## 登场记录
- S2E17 镇外来客 L1 摩托怪客和Lin骑摩托拖着巨型麻布袋闯入沙漠镇被拦截后和Lin争相炫耀自己的车更快更酷结果包裹散落大哭 - S2E17 镇外来客 L1 摩托怪客和Lin骑摩托拖着巨型麻布袋闯入沙漠镇被拦截后和Lin争相炫耀自己的车更快更酷结果包裹散落大哭

View File

@ -0,0 +1,12 @@
# Logi
## 基本信息
- 物种/外观:(待补充)
- 身份/职业高级开拓者Sally的上司
- 居住地:(待补充)
## 关于此角色
有原则、批判力强、行动力强。
## 登场记录
- S2E22 百年庆典L3 小镇纪念日入口买门票被判定为Young收全价

View File

@ -0,0 +1,12 @@
# Rebecca
## 基本信息
- 物种/外观:(待补充)
- 身份/职业新晋Pioneer开拓者
- 居住地:(待补充)
## 关于此角色
勤奋努力。新晋开拓者刚加入Pioneer行列。
## 登场记录
- S2E21 开拓者公寓L4门厅照片墙

View File

@ -0,0 +1,151 @@
# long_task_protocol.md — 长线任务协作协议
本协议定义了小编与编剧在发起、执行、完成长线写作任务时的规范化协作流程。
每次会话启动时加载本文件,确保行为一致性。
---
## 一、触发条件
当编剧表现出**发起全新写作任务**的意图时触发。识别信号包括但不限于:
- "开始写Uxx"、"新Unit"、"新Lesson"
- "我要写一个新的…"、"开始一个新的剧本"
- "准备启动S2的…"
**注意:** 继续已有任务("继续U23"、"接着写L3"等)不触发,直接进入执行流程。
---
## 二、两问流程
确认是新任务后,按序询问编剧两个问题:
### Q1这次任务的目标是什么
提供预设选项,供编剧快速选择:
| 选项 | 任务类型 | 典型场景 |
|------|----------|----------|
| A | 撰写完整Unit的长线任务 | 多个Lesson起承转合约2周 |
| B | 单个Lesson的独立任务 | 单次写作,成果独立 |
| C | 润色/修改已有剧本 | 在已有内容上修订 |
| D | 其他 | 编剧自定义描述 |
### Q2是否需要为这次任务新建一个日志
日志用于记录已完成的内容及进度。
- **是** → 进入「三、日志创建」流程
- **否** → 不创建日志。此后**不再追问 Q2**,直到编剧发起另一个**全新的**写作任务
---
## 三、日志创建
### 3.1 命名
编剧确认"是"后:
1. 请编剧给任务一个**简单易称呼的名称**(如 `U23_完整剧本`、`L5_润色`
2. 日志文件创建在:`business_knowledge/task_log/{任务名称}.md`
### 3.2 日志模板
```markdown
# 任务日志:{任务名称}
- **创建时间:** YYYY-MM-DD HH:MM
- **创建者:** {编剧姓名}{飞书user_id}
- **任务目标:** {Q1的答案如"撰写U23完整剧本起承转合4个Lesson"}
- **当前状态:** 进行中
---
## 进度记录
(按时间倒序,每次阶段性通过后追加一条)
### {日期} — {阶段性内容简述}
- **通过内容:** {通过的具体段落/步骤名称}
- **有效反馈:** {编剧给出的可复用指导意见}
```
### 3.3 注册到活跃任务索引
同步更新 `business_knowledge/active_tasks.md`,添加新任务条目。
---
## 四、进度更新规则
### 何时更新
每次取得**阶段性进展**后更新日志。阶段性进展的判定:
- 优先级最高:编剧明确说"通过"、"定稿"、"没问题了"
- 一个Lesson/Section通过 → 记录
- 一个关键决策达成 → 记录
### 更新内容(只记有效的)
| ✅ 记录 | ❌ 不记录 |
|---------|-----------|
| 已通过的段落名称/编号 + 通过时间 | 被退回的版本 |
| 编剧的有效反馈(指导性意见) | 被修改/删除的内容 |
| 关键决策和共识 | 中间修订过程 |
### 更新后
同步更新 `active_tasks.md` 中的进度摘要。
---
## 五、会话重置后恢复
编剧只需说以下任一关键词即可恢复:
- "继续{任务名称}" 或 "查{任务名称}进度"
- "我目前有哪些活跃任务?"
小编执行:
1. 读取 `active_tasks.md` 定位任务日志路径
2. 读取日志文件恢复上下文
3. 继续工作
---
## 六、任务完成流程
当编剧确认长线任务完成后:
### 6.1 汇总反馈清单
小编从本次任务日志中提取所有**关于角色、设定、写作规范的反馈**,整理为清单,逐条询问编剧:
> "本次任务完成。以下是从任务过程中收集的反馈,请确认哪些需要更新到知识库:"
> 1. {反馈条目1}
> 2. {反馈条目2}
> ...
### 6.2 沉淀到知识库
编剧确认后,将选中条目更新到对应文件:
- 角色相关 → `business_knowledge/characters/` 对应角色文件
- 写作规范相关 → `business_knowledge/script_feedback_log.md`
- 通用规则 → `MEMORY.md`
### 6.3 归档
1. 在日志末尾标注"已完成"及完成时间
2. 从 `active_tasks.md` 移除该任务条目
3. 日志文件保留在 `task_log/` 目录,作为历史记录
---
## 七、与现有协作Pipeline的关系
本协议是现有协作Pipeline大纲→节奏表→剧本→审阅→定稿的**外层框架**不替代Pipeline。日志记录的是Pipeline中"通过"的节点而非Pipeline本身。

View File

@ -8,8 +8,8 @@
## 🔴 高频错误(几乎每轮必犯 — 写作前必读) ## 🔴 高频错误(几乎每轮必犯 — 写作前必读)
### 1. 台词难度超标(频率最高) ### 1. 台词难度超标(频率最高)
- **问题:** NPC单句超过6-7个词使用Pre-A1以上难度的句型 - **问题:** NPC单句超过15个词使用Pre-A1以上难度的句型
- **修正:** 拆分长句为2-3行短句。每句控制在5-6词以内。 - **修正:** 拆分长句为2-3行短句。每句控制在12词以内。
- **来源:** U18 L2, U18 L5, U22 L1, U22 L2 — 林逸瀚多次打回 - **来源:** U18 L2, U18 L5, U22 L1, U22 L2 — 林逸瀚多次打回
### 2. 知识点词性/释义用错 ### 2. 知识点词性/释义用错
@ -27,19 +27,19 @@
## 🟡 常见问题(需要注意但不一定每次触发) ## 🟡 常见问题(需要注意但不一定每次触发)
### 4. 对话互动未挂钩知识点 ### 4. 互动未挂钩知识点
- **问题:** 写了User对话互动但台词中不含知识点 - **问题:** 写了User中互动(对话互动,但台词中不含知识点
- **修正:** 所有User对话互动必须包含≥1个本课知识点 - **修正:** 所有User中互动(对话互动必须包含≥1个本课知识点
- **来源:** U18 L5 — 林逸瀚确认规则 - **来源:** U18 L5 — 林逸瀚确认规则
### 5. 开场铺太长 ### 5. 开场铺太长
- **问题:** 花一整段做背景交代,迟迟不进入核心事件 - **问题:** 花一整段做背景交代,迟迟不进入核心事件
- **修正:** 开场1-3行即触发事件,节奏要快 - **修正:** 开场1-6行即触发事件,节奏要快
- **来源:** U18 L5, U22 L2 - **来源:** U18 L5, U22 L2
### 6. 11号机器人搞笑硬塞 ### 6. 角色搞笑硬塞
- **问题:** 强行给11号写搞笑台词,反而尴尬 - **问题:** 强行给角色写搞笑台词,反而尴尬
- **修正:**11号按自身设定自然产出喜感自嗨冒烟),不额外加戏 - **修正:**角色按自身设定自然产出喜感如11号机器人会自嗨冒烟),不额外加戏
- **来源:** U18 L5 — 林逸瀚反馈 - **来源:** U18 L5 — 林逸瀚反馈
### 7. 知识点集中轰炸 ### 7. 知识点集中轰炸
@ -59,24 +59,16 @@
- BoBo 一直在 User 身边,大人出现时会躲藏或回避。 - BoBo 一直在 User 身边,大人出现时会躲藏或回避。
- **来源:** 角色设定文档 - **来源:** 角色设定文档
### 10. Justin 是 Vicky 的 Grandpa
- 不是 11 号的 Grandpa。角色关系要搞清。
- **来源:** U18 L2 — 林逸瀚确认
### 11. 11号没有额外造型
- 没有美术资源,不加纸眼镜、帽子等装饰。它"装模作样"本身就够好笑。
- **来源:** U18 L2 — 林逸瀚确认
--- ---
## 📋 互动设计规则 ## 📋 互动设计规则
### 12. 中互动数量约束 ### 10. 中互动数量约束
- 全课14-17个中互动 + 1个核心互动实际产出偏上限时注意精简 - 全课14-17个中互动 + 1个核心互动实际产出偏上限时注意精简
- U22 L1 实际17个偏上限后续Lesson可略少 - U22 L1 实际17个偏上限后续Lesson可略少
- **来源:** U22 L1 最终统计 - **来源:** U22 L1 最终统计
### 13. 核心互动位置 ### 11. 核心互动位置
- 放在剧情中后段高潮处 - 放在剧情中后段高潮处
- 包含≥3个知识点 - 包含≥3个知识点
- 完成后剧情获得推进感 - 完成后剧情获得推进感
@ -84,20 +76,6 @@
--- ---
## 📝 格式与交付规则
### 14. 剧本输出格式
- 飞书电子表格8列标准格式或简化4列
- 知识点标注NPC输入=粗体User输出=粗体+红色(#f54a45)
- **来源:** U22 L1/L2 实践
### 15. 版本迭代节奏
- 节奏表通常需要 2-3 轮迭代V1→V2→V3
- 剧本通常需要 1-2 轮修改V1→V2
- **来源:** U22 L1 全程跟踪
---
## 更新日志 ## 更新日志
| 日期 | 更新内容 | 来源 | | 日期 | 更新内容 | 来源 |

1
logs/backup.log Normal file
View File

@ -0,0 +1 @@
{"code":0,"data":{"body":{"content":"{\"text\":\"✅ 小编Workspace每日自动备份完成2026-05-15 10:57\\n提交哈希a281f13\\n所有Workspace变更已同步到远程Git仓库\"}"},"chat_id":"oc_056898e8cc3689d305b4c69f7178ca27","create_time":"1778813834666","deleted":false,"message_id":"om_x100b6f5cf66a20bcb30019251409adb","msg_type":"text","sender":{"id":"cli_a9311be796f85cbd","id_type":"app_id","sender_type":"app","tenant_key":"176b7bf89fc6d75e"},"update_time":"1778813834666","updated":false},"msg":"success"}

View File

@ -31,3 +31,10 @@
{"type":"memory.recall.recorded","timestamp":"2026-05-14T08:03:15.987Z","query":"编剧反馈 修改意见 打回 问题 台词难度 Pre-A1 互动 知识点","resultCount":4,"results":[{"path":"memory/2026-05-13.md","startLine":1,"endLine":32,"score":1},{"path":"memory/2026-05-06.md","startLine":1,"endLine":23,"score":1},{"path":"memory/2026-04-30.md","startLine":1,"endLine":28,"score":1},{"path":"memory/2026-05-04.md","startLine":1,"endLine":34,"score":1}]} {"type":"memory.recall.recorded","timestamp":"2026-05-14T08:03:15.987Z","query":"编剧反馈 修改意见 打回 问题 台词难度 Pre-A1 互动 知识点","resultCount":4,"results":[{"path":"memory/2026-05-13.md","startLine":1,"endLine":32,"score":1},{"path":"memory/2026-05-06.md","startLine":1,"endLine":23,"score":1},{"path":"memory/2026-04-30.md","startLine":1,"endLine":28,"score":1},{"path":"memory/2026-05-04.md","startLine":1,"endLine":34,"score":1}]}
{"type":"memory.recall.recorded","timestamp":"2026-05-14T10:17:45.126Z","query":"王珞 编剧 身份 user_id","resultCount":1,"results":[{"path":"memory/2026-05-13.md","startLine":1,"endLine":32,"score":1}]} {"type":"memory.recall.recorded","timestamp":"2026-05-14T10:17:45.126Z","query":"王珞 编剧 身份 user_id","resultCount":1,"results":[{"path":"memory/2026-05-13.md","startLine":1,"endLine":32,"score":1}]}
{"type":"memory.recall.recorded","timestamp":"2026-05-15T02:55:42.139Z","query":"workspace 备份 backup 定时任务","resultCount":3,"results":[{"path":"memory/2025-05-11.md","startLine":1,"endLine":35,"score":1},{"path":"memory/2025-05-11.md","startLine":29,"endLine":48,"score":1},{"path":"memory/2026-04-28.md","startLine":1,"endLine":23,"score":1}]} {"type":"memory.recall.recorded","timestamp":"2026-05-15T02:55:42.139Z","query":"workspace 备份 backup 定时任务","resultCount":3,"results":[{"path":"memory/2025-05-11.md","startLine":1,"endLine":35,"score":1},{"path":"memory/2025-05-11.md","startLine":29,"endLine":48,"score":1},{"path":"memory/2026-04-28.md","startLine":1,"endLine":23,"score":1}]}
{"type":"memory.recall.recorded","timestamp":"2026-05-15T03:38:23.866Z","query":"U22 节奏表格式 桥段 知识点输入 中互动","resultCount":2,"results":[{"path":"memory/2026-05-13.md","startLine":22,"endLine":34,"score":1},{"path":"memory/2026-05-14.md","startLine":20,"endLine":41,"score":1}]}
{"type":"memory.recall.recorded","timestamp":"2026-05-15T03:39:29.339Z","query":"children-english-script-writing skill 更新 修改","resultCount":3,"results":[{"path":"memory/2026-04-30.md","startLine":1,"endLine":28,"score":1},{"path":"memory/2026-04-29.md","startLine":43,"endLine":55,"score":1},{"path":"memory/2026-04-28.md","startLine":37,"endLine":56,"score":1}]}
{"type":"memory.recall.recorded","timestamp":"2026-05-15T10:22:31.764Z","query":"王珞 编剧 角色列表 characters","resultCount":2,"results":[{"path":"memory/2026-05-14.md","startLine":1,"endLine":25,"score":1},{"path":"memory/2026-05-13.md","startLine":1,"endLine":32,"score":1}]}
{"type":"memory.recall.recorded","timestamp":"2026-05-15T10:23:08.933Z","query":"王珞 9e4b5fa6 编剧 权限","resultCount":2,"results":[{"path":"memory/2026-05-14.md","startLine":1,"endLine":25,"score":1},{"path":"memory/2026-05-13.md","startLine":1,"endLine":32,"score":1}]}
{"type":"memory.recall.recorded","timestamp":"2026-05-15T10:23:15.679Z","query":"User 父母 parents pioneer 开拓者公寓 flat hall room","resultCount":1,"results":[{"path":"memory/2026-04-29.md","startLine":43,"endLine":55,"score":1}]}
{"type":"memory.recall.recorded","timestamp":"2026-05-15T10:23:22.880Z","query":"User主角 父母 Alex Grace 开拓者 Pioneer 历史","resultCount":2,"results":[{"path":"memory/2026-05-15.md","startLine":1,"endLine":20,"score":1},{"path":"memory/2026-05-11.md","startLine":1,"endLine":49,"score":1}]}
{"type":"memory.recall.recorded","timestamp":"2026-05-15T10:23:28.700Z","query":"User 主角 Hope 家 Clare Fred 父母 mom dad","resultCount":2,"results":[{"path":"memory/2026-05-15.md","startLine":1,"endLine":20,"score":1},{"path":"memory/2026-05-11.md","startLine":1,"endLine":49,"score":1}]}

View File

@ -1,6 +1,6 @@
{ {
"version": 1, "version": 1,
"updatedAt": "2026-05-15T02:55:42.139Z", "updatedAt": "2026-05-15T10:23:28.700Z",
"entries": { "entries": {
"memory:memory/2026-04-29.md:43:55": { "memory:memory/2026-04-29.md:43:55": {
"key": "memory:memory/2026-04-29.md:43:55", "key": "memory:memory/2026-04-29.md:43:55",
@ -9,18 +9,21 @@
"endLine": 55, "endLine": 55,
"source": "memory", "source": "memory",
"snippet": "- Justin说只要学习文化周最后一天就能\"召唤\"这条龙 - 大家都很期待这个New subject - Vala School中国文化周正式开始 ### 当前状态 - 已接收大纲和知识点,等待林逸瀚进一步同步进度 --- [2026-04-29 17:28 胡笳需求] 1. 完成《客厅太空冒险》儿童英语互动剧本全流程撰写含大纲审核、分段撰写、合规校验覆盖指定4个单词living room/afternoon/armchair/lamp+2个句型Press the.../What's wrong with the...?知识点符合5-9岁儿童Pre-A1/A1英语难度要求。 2. 完成剧本合规性审核修复6项问题① afternoon输出不足 ② What's wrong with...? 缺少NPC输入 ③ Press the... 输入不足 ④ living room输出不足 ⑤ User台词占比超标 ⑥ 表格数据缺失导出v2版本Excel文件。 3. 读取两份官方参考剧本飞书知识库链接SAadwW8YaiObl8k4op3c6vs8nqb、EAIsw9LBMiIaGfkDAyOc9qrqnoc总结出官方标准剧本格式规范已更新到children-english-script-writing技能文档中。 4. 待执行按照新格式规范重新生成《客厅太空冒险》v3版本剧本交付。", "snippet": "- Justin说只要学习文化周最后一天就能\"召唤\"这条龙 - 大家都很期待这个New subject - Vala School中国文化周正式开始 ### 当前状态 - 已接收大纲和知识点,等待林逸瀚进一步同步进度 --- [2026-04-29 17:28 胡笳需求] 1. 完成《客厅太空冒险》儿童英语互动剧本全流程撰写含大纲审核、分段撰写、合规校验覆盖指定4个单词living room/afternoon/armchair/lamp+2个句型Press the.../What's wrong with the...?知识点符合5-9岁儿童Pre-A1/A1英语难度要求。 2. 完成剧本合规性审核修复6项问题① afternoon输出不足 ② What's wrong with...? 缺少NPC输入 ③ Press the... 输入不足 ④ living room输出不足 ⑤ User台词占比超标 ⑥ 表格数据缺失导出v2版本Excel文件。 3. 读取两份官方参考剧本飞书知识库链接SAadwW8YaiObl8k4op3c6vs8nqb、EAIsw9LBMiIaGfkDAyOc9qrqnoc总结出官方标准剧本格式规范已更新到children-english-script-writing技能文档中。 4. 待执行按照新格式规范重新生成《客厅太空冒险》v3版本剧本交付。",
"recallCount": 1, "recallCount": 3,
"dailyCount": 0, "dailyCount": 0,
"groundedCount": 0, "groundedCount": 0,
"totalScore": 1, "totalScore": 3,
"maxScore": 1, "maxScore": 1,
"firstRecalledAt": "2026-04-30T06:03:01.143Z", "firstRecalledAt": "2026-04-30T06:03:01.143Z",
"lastRecalledAt": "2026-04-30T06:03:01.143Z", "lastRecalledAt": "2026-05-15T10:23:15.679Z",
"queryHashes": [ "queryHashes": [
"feb3f14011c8" "feb3f14011c8",
"80089b28100e",
"fac3903cfb51"
], ],
"recallDays": [ "recallDays": [
"2026-04-30" "2026-04-30",
"2026-05-15"
], ],
"conceptTags": [ "conceptTags": [
"room/afternoon/armchair/lamp", "room/afternoon/armchair/lamp",
@ -200,13 +203,13 @@
"endLine": 28, "endLine": 28,
"source": "memory", "source": "memory",
"snippet": "# 2026-04-30 工作日志 ## U18 L2 剧本创作进度(与林逸瀚协作) ### 当前进度 - ✅ 故事大纲:已优化确认 - ✅ 第1幕剧本已完成初稿已导出Excel发给林逸瀚**林逸瀚正在修改中** - ⏳ 第2幕剧本待开始明天继续 - ⏳ 第3幕剧本待开始 - ⏳ 第4幕剧本待开始 ### 创作过程中的关键经验教训 1. **剧本格式是4列表格**(类型/剧情描述/名字/台词不是8列——参照 `skills/children-english-script-writing/references/儿童互动英语剧本创作指南.md` 2. **User对话互动不能无意义重复知识点**——必须是角色在情境中自然说出的话,有剧情推进意义 3. **台词必须Pre-A1/A1水平**——极简英文短句5-8岁非母语儿童能听懂跟读 4. **互动必须与知识点挂钩**——所有对话互动必须包含本课知识点 5. **11号没有额外造型**——没有美术资源,不加纸眼镜等装饰,它装模作样本身就够好笑 6. **Justin是Vicky的Grandpa**不是11号的 ### 本课出场人物 User、Ben、Leo、Vicky、Sue、Sunny、11号机器人、Justin后面登场 ### 本课知识点 - 单词Blackboard、Read、Line、Example - 句型:(v.) in line、Take...as an example. ### Unit背景信息 - U18主题中国文化周", "snippet": "# 2026-04-30 工作日志 ## U18 L2 剧本创作进度(与林逸瀚协作) ### 当前进度 - ✅ 故事大纲:已优化确认 - ✅ 第1幕剧本已完成初稿已导出Excel发给林逸瀚**林逸瀚正在修改中** - ⏳ 第2幕剧本待开始明天继续 - ⏳ 第3幕剧本待开始 - ⏳ 第4幕剧本待开始 ### 创作过程中的关键经验教训 1. **剧本格式是4列表格**(类型/剧情描述/名字/台词不是8列——参照 `skills/children-english-script-writing/references/儿童互动英语剧本创作指南.md` 2. **User对话互动不能无意义重复知识点**——必须是角色在情境中自然说出的话,有剧情推进意义 3. **台词必须Pre-A1/A1水平**——极简英文短句5-8岁非母语儿童能听懂跟读 4. **互动必须与知识点挂钩**——所有对话互动必须包含本课知识点 5. **11号没有额外造型**——没有美术资源,不加纸眼镜等装饰,它装模作样本身就够好笑 6. **Justin是Vicky的Grandpa**不是11号的 ### 本课出场人物 User、Ben、Leo、Vicky、Sue、Sunny、11号机器人、Justin后面登场 ### 本课知识点 - 单词Blackboard、Read、Line、Example - 句型:(v.) in line、Take...as an example. ### Unit背景信息 - U18主题中国文化周",
"recallCount": 10, "recallCount": 11,
"dailyCount": 0, "dailyCount": 0,
"groundedCount": 0, "groundedCount": 0,
"totalScore": 10, "totalScore": 11,
"maxScore": 1, "maxScore": 1,
"firstRecalledAt": "2026-05-05T07:20:30.476Z", "firstRecalledAt": "2026-05-05T07:20:30.476Z",
"lastRecalledAt": "2026-05-14T08:03:15.987Z", "lastRecalledAt": "2026-05-15T03:39:29.339Z",
"queryHashes": [ "queryHashes": [
"84835484abbf", "84835484abbf",
"cb12f9d97c78", "cb12f9d97c78",
@ -217,7 +220,8 @@
"e02b73462643", "e02b73462643",
"1a58efc7512e", "1a58efc7512e",
"6a0bfeac06f4", "6a0bfeac06f4",
"bb06a5dadef7" "bb06a5dadef7",
"80089b28100e"
], ],
"recallDays": [ "recallDays": [
"2026-05-05", "2026-05-05",
@ -225,7 +229,8 @@
"2026-05-11", "2026-05-11",
"2026-05-12", "2026-05-12",
"2026-05-13", "2026-05-13",
"2026-05-14" "2026-05-14",
"2026-05-15"
], ],
"conceptTags": [ "conceptTags": [
"类型/剧情描述/名字/台词", "类型/剧情描述/名字/台词",
@ -511,22 +516,25 @@
"endLine": 49, "endLine": 49,
"source": "memory", "source": "memory",
"snippet": "# 2026-05-11 工作日志 ## 知识库更新任务(与胡笳协作) ### 任务概述 根据剧本清单对照表批量下载所有已完成剧本为每个Unit生成chapters梗概文件并更新characters登场记录。 ### 完成进度 #### 1. 剧本下载 ✅ - 共下载99个剧本文档到 `tmp/lessons/` 目录 - S1 U1-U1260个+ S2 U13-U1935个+ U20 L1-L44个 - 文件按 `S{season}/U{unit_num}/L{lesson}_{name}.md` 结构存放 #### 2. chapters文件生成 - ✅ S1 U0-U1213个文件全部完成 - ✅ S2 U13-U164个文件全部完成 - ⏳ S2 U17-U204个文件子代理处理中 #### 3. 角色登场统计待更新到characters/ 主要角色出场频次: - User: 90次全勤 - Ben: 53次 - Vicky: 30次 - Matt: 21次 - Sally: 20次 - Dan: 17次 - Eva: 13次 - Peter: 12次 - Sunny: 11次, Lily: 11次, Tom: 11次 - Kim: 10次 - Alex: 9次, Lark: 9次 - Lucy: 8次 - Clare/Fred: 各7/6次 - BoBo: 6次S2新角色 - Mr. Rock: 6次S2新角色 - May: 6次S2新角色 新角色发现未在characters/中记录的): - BoB", "snippet": "# 2026-05-11 工作日志 ## 知识库更新任务(与胡笳协作) ### 任务概述 根据剧本清单对照表批量下载所有已完成剧本为每个Unit生成chapters梗概文件并更新characters登场记录。 ### 完成进度 #### 1. 剧本下载 ✅ - 共下载99个剧本文档到 `tmp/lessons/` 目录 - S1 U1-U1260个+ S2 U13-U1935个+ U20 L1-L44个 - 文件按 `S{season}/U{unit_num}/L{lesson}_{name}.md` 结构存放 #### 2. chapters文件生成 - ✅ S1 U0-U1213个文件全部完成 - ✅ S2 U13-U164个文件全部完成 - ⏳ S2 U17-U204个文件子代理处理中 #### 3. 角色登场统计待更新到characters/ 主要角色出场频次: - User: 90次全勤 - Ben: 53次 - Vicky: 30次 - Matt: 21次 - Sally: 20次 - Dan: 17次 - Eva: 13次 - Peter: 12次 - Sunny: 11次, Lily: 11次, Tom: 11次 - Kim: 10次 - Alex: 9次, Lark: 9次 - Lucy: 8次 - Clare/Fred: 各7/6次 - BoBo: 6次S2新角色 - Mr. Rock: 6次S2新角色 - May: 6次S2新角色 新角色发现未在characters/中记录的): - BoB",
"recallCount": 4, "recallCount": 6,
"dailyCount": 0, "dailyCount": 0,
"groundedCount": 0, "groundedCount": 0,
"totalScore": 3.9067938477703184, "totalScore": 5.906793847770318,
"maxScore": 1, "maxScore": 1,
"firstRecalledAt": "2026-05-12T03:09:13.717Z", "firstRecalledAt": "2026-05-12T03:09:13.717Z",
"lastRecalledAt": "2026-05-13T09:56:38.782Z", "lastRecalledAt": "2026-05-15T10:23:28.700Z",
"queryHashes": [ "queryHashes": [
"2efe5e2057bf", "2efe5e2057bf",
"01fe3be9c6f9", "01fe3be9c6f9",
"5d0898d78dcd", "5d0898d78dcd",
"24dd4c17d9a7" "24dd4c17d9a7",
"2d85034517ee",
"3561f5da3958"
], ],
"recallDays": [ "recallDays": [
"2026-05-12", "2026-05-12",
"2026-05-13" "2026-05-13",
"2026-05-15"
], ],
"conceptTags": [ "conceptTags": [
"tmp/lessons", "tmp/lessons",
@ -610,18 +618,20 @@
"endLine": 56, "endLine": 56,
"source": "memory", "source": "memory",
"snippet": "## Lesson 3《明天见》— 已定稿 ✅ **知识点:** go to bed / say / tomorrow / early - A版v1 → 胡笳提3条修改①序列1拖延理由嵌入核心词替换\"吃饼干\"为\"看天色\"②序列2定闹钟用天色表现early ③序列3 say的递进区分Dad/Mom关系 - 整合定稿完成 ## Lesson 4《打个电话吧》— 胡笳选A版 ✅ **知识点:** speak / miss / much / phone **隐藏设定:** BoBo会说话常说\"Bo——Bo——\",复杂句\"BoBo is a good helper too!\");时间为爸妈离开后第二天晚上 - 序列1教BoBo说话教speak/phone/missUser发现自己才是想说话的人 - 序列2犹豫要不要打BoBo学会说\"miss you\"反触动UserUser决定\"先练习\" - 序列3User对着phone\"练习\"说话BoBo偷偷拨通了电话练习变成了真正的通话 - 尾声:改写任务清单\"speak on the phone — anytime I want\" - 胡笳选A版暂未做细节修改 ### 待办 - 等胡笳指示继续下一个Lesson或对已有大纲做细节修改 ### Skill更新记录 - story-outline-design SKILL.md 新增规范「五、大纲描写规范:行为驱动,拒绝纯演出」+ 检查清单对应项", "snippet": "## Lesson 3《明天见》— 已定稿 ✅ **知识点:** go to bed / say / tomorrow / early - A版v1 → 胡笳提3条修改①序列1拖延理由嵌入核心词替换\"吃饼干\"为\"看天色\"②序列2定闹钟用天色表现early ③序列3 say的递进区分Dad/Mom关系 - 整合定稿完成 ## Lesson 4《打个电话吧》— 胡笳选A版 ✅ **知识点:** speak / miss / much / phone **隐藏设定:** BoBo会说话常说\"Bo——Bo——\",复杂句\"BoBo is a good helper too!\");时间为爸妈离开后第二天晚上 - 序列1教BoBo说话教speak/phone/missUser发现自己才是想说话的人 - 序列2犹豫要不要打BoBo学会说\"miss you\"反触动UserUser决定\"先练习\" - 序列3User对着phone\"练习\"说话BoBo偷偷拨通了电话练习变成了真正的通话 - 尾声:改写任务清单\"speak on the phone — anytime I want\" - 胡笳选A版暂未做细节修改 ### 待办 - 等胡笳指示继续下一个Lesson或对已有大纲做细节修改 ### Skill更新记录 - story-outline-design SKILL.md 新增规范「五、大纲描写规范:行为驱动,拒绝纯演出」+ 检查清单对应项",
"recallCount": 1, "recallCount": 2,
"dailyCount": 0, "dailyCount": 0,
"groundedCount": 0, "groundedCount": 0,
"totalScore": 1, "totalScore": 2,
"maxScore": 1, "maxScore": 1,
"firstRecalledAt": "2026-05-13T08:29:06.883Z", "firstRecalledAt": "2026-05-13T08:29:06.883Z",
"lastRecalledAt": "2026-05-13T08:29:06.883Z", "lastRecalledAt": "2026-05-15T03:39:29.339Z",
"queryHashes": [ "queryHashes": [
"01fe3be9c6f9" "01fe3be9c6f9",
"80089b28100e"
], ],
"recallDays": [ "recallDays": [
"2026-05-13" "2026-05-13",
"2026-05-15"
], ],
"conceptTags": [ "conceptTags": [
"say的递进区分dad/mom关系", "say的递进区分dad/mom关系",
@ -705,22 +715,24 @@
"endLine": 34, "endLine": 34,
"source": "memory", "source": "memory",
"snippet": "- 起4个 | 承5个 | 转7个 | 合1个 | **总计17个** ### 知识点覆盖 - Lime / Pear / Grape / Drink全部多次输入+输出 ✅ - Good food needs good drink多次输入+输出 ✅ - Enjoy yourself多次输入+输出 ✅ ### 定稿文档 - https://makee-interactive.feishu.cn/wiki/QQg3w2G9ZiW3c0kHAnScl34bnZe ### 明日计划 - 进入 U22 L2等待林逸瀚提供故事大纲和知识点", "snippet": "- 起4个 | 承5个 | 转7个 | 合1个 | **总计17个** ### 知识点覆盖 - Lime / Pear / Grape / Drink全部多次输入+输出 ✅ - Good food needs good drink多次输入+输出 ✅ - Enjoy yourself多次输入+输出 ✅ ### 定稿文档 - https://makee-interactive.feishu.cn/wiki/QQg3w2G9ZiW3c0kHAnScl34bnZe ### 明日计划 - 进入 U22 L2等待林逸瀚提供故事大纲和知识点",
"recallCount": 5, "recallCount": 6,
"dailyCount": 0, "dailyCount": 0,
"groundedCount": 0, "groundedCount": 0,
"totalScore": 5, "totalScore": 6,
"maxScore": 1, "maxScore": 1,
"firstRecalledAt": "2026-05-14T03:30:02.097Z", "firstRecalledAt": "2026-05-14T03:30:02.097Z",
"lastRecalledAt": "2026-05-14T07:26:29.313Z", "lastRecalledAt": "2026-05-15T03:38:23.866Z",
"queryHashes": [ "queryHashes": [
"55b28771828c", "55b28771828c",
"f11b100ab95b", "f11b100ab95b",
"76e73c2aec2a", "76e73c2aec2a",
"941ab9c7d9fc", "941ab9c7d9fc",
"bda8c8b17ba4" "bda8c8b17ba4",
"f942ee72f6ed"
], ],
"recallDays": [ "recallDays": [
"2026-05-14" "2026-05-14",
"2026-05-15"
], ],
"conceptTags": [ "conceptTags": [
"总计", "总计",
@ -740,20 +752,23 @@
"endLine": 32, "endLine": 32,
"source": "memory", "source": "memory",
"snippet": "# 2026-05-13 工作日志 ## U22 L1 剧本工程 — 全课完成 ✅ **协作人:** 林逸瀚(编剧) ### 今日完成 - 「承」节奏表V1→V2.2(四轮迭代)+ 剧本V1→V2 + Excel发送 + 林逸瀚定稿 - 「转」节奏表V1→V1.1 + 剧本V1→V2 + Excel发送 + 林逸瀚定稿 - 「合」节奏表V1 + 剧本V1→V2 + Excel发送 + 林逸瀚定稿 - 阅读完整剧本(起+承+转+合),确认全课完成 ### 关键决策记录 1. **「承」** DiDi不在大人面前亮相 → Sam离场后DiDi才出来设定更自然 2. **「承」** Sam回忆从单纯辨认改为情感触发每说一个水果名唤醒一段爷爷记忆 3. **「承」** #3和#4调换顺序 → 先揭秘DiDi再帮Sam回忆逻辑更通顺 4. **「转」** 桌上一开始没有green grape需要从树上摘 → User自然说出Enjoy yourself 5. **「转」** 结尾加入蛋糕+果汁闭环Good food needs good drink 6. **「合」** 原「转」#5归入「合」#1简洁收束 ### 中互动统计 - 起4个 | 承5个 | 转7个 | 合1个 | **总计17个** ### 知识点覆盖 - Lime / Pear / Grape / Drink全部多次输入+输出 ✅ - Good food needs good drink多次输入+输出 ✅ - Enjoy yourself多次输入+输出 ✅ ### 定稿文档 -", "snippet": "# 2026-05-13 工作日志 ## U22 L1 剧本工程 — 全课完成 ✅ **协作人:** 林逸瀚(编剧) ### 今日完成 - 「承」节奏表V1→V2.2(四轮迭代)+ 剧本V1→V2 + Excel发送 + 林逸瀚定稿 - 「转」节奏表V1→V1.1 + 剧本V1→V2 + Excel发送 + 林逸瀚定稿 - 「合」节奏表V1 + 剧本V1→V2 + Excel发送 + 林逸瀚定稿 - 阅读完整剧本(起+承+转+合),确认全课完成 ### 关键决策记录 1. **「承」** DiDi不在大人面前亮相 → Sam离场后DiDi才出来设定更自然 2. **「承」** Sam回忆从单纯辨认改为情感触发每说一个水果名唤醒一段爷爷记忆 3. **「承」** #3和#4调换顺序 → 先揭秘DiDi再帮Sam回忆逻辑更通顺 4. **「转」** 桌上一开始没有green grape需要从树上摘 → User自然说出Enjoy yourself 5. **「转」** 结尾加入蛋糕+果汁闭环Good food needs good drink 6. **「合」** 原「转」#5归入「合」#1简洁收束 ### 中互动统计 - 起4个 | 承5个 | 转7个 | 合1个 | **总计17个** ### 知识点覆盖 - Lime / Pear / Grape / Drink全部多次输入+输出 ✅ - Good food needs good drink多次输入+输出 ✅ - Enjoy yourself多次输入+输出 ✅ ### 定稿文档 -",
"recallCount": 3, "recallCount": 5,
"dailyCount": 0, "dailyCount": 0,
"groundedCount": 0, "groundedCount": 0,
"totalScore": 3, "totalScore": 5,
"maxScore": 1, "maxScore": 1,
"firstRecalledAt": "2026-05-14T04:10:21.382Z", "firstRecalledAt": "2026-05-14T04:10:21.382Z",
"lastRecalledAt": "2026-05-14T10:17:45.126Z", "lastRecalledAt": "2026-05-15T10:23:08.933Z",
"queryHashes": [ "queryHashes": [
"f11b100ab95b", "f11b100ab95b",
"bb06a5dadef7", "bb06a5dadef7",
"d859deffdfbc" "d859deffdfbc",
"c59e1be1499c",
"cd20e96c030a"
], ],
"recallDays": [ "recallDays": [
"2026-05-14" "2026-05-14",
"2026-05-15"
], ],
"conceptTags": [ "conceptTags": [
"v2.2", "v2.2",
@ -827,6 +842,101 @@
"tmp/content.md", "tmp/content.md",
"openclaw/workspace-xiaobian" "openclaw/workspace-xiaobian"
] ]
},
"memory:memory/2026-05-14.md:20:41": {
"key": "memory:memory/2026-05-14.md:20:41",
"path": "memory/2026-05-14.md",
"startLine": 20,
"endLine": 41,
"source": "memory",
"snippet": "6. **「合」外卖互动改为核心互动-听力(拖拽式)** 7. **劝说Leo段从「合」上移到「转」结尾** 转收在\"没人信\"的大危机合聚焦May破局 ### 中互动统计 - 起4个 | 承5个 | 转5个 | 合4个含1核心互动 | **总计18个** ### 知识点覆盖 - store / add / double / sweet(s):全部多次输入+输出 ✅ - Add...to...:多次输入+输出 ✅ - It smells...承引入→转复现→合收束bad→bad→good对比闭环✅ ### 定稿文档 - https://makee-interactive.feishu.cn/wiki/FcOUwzpYZipLlokJvaAcayk5n2f ### 经验沉淀 - add/double等知识点不要局限在主题场景甜品跳到生活化动作垫脚、叠箱子、绑手机更自然、更有趣 - Peter的屁是很好的\"硬插互动\"范例快进快出不拖节奏同时引入It smells句型 - 中互动类型多样化:选择题、拖拽、听力拖拽、观察描述——不重复 ### 下一步 - U22 L3 故事大纲+知识点待林逸瀚提供",
"recallCount": 1,
"dailyCount": 0,
"groundedCount": 0,
"totalScore": 1,
"maxScore": 1,
"firstRecalledAt": "2026-05-15T03:38:23.866Z",
"lastRecalledAt": "2026-05-15T03:38:23.866Z",
"queryHashes": [
"f942ee72f6ed"
],
"recallDays": [
"2026-05-15"
],
"conceptTags": [
"外卖互动改为核心互动-听力",
"add/double等知识点不要局限在主题场景",
"互动",
"核心",
"听力",
"劝说",
"leo",
"移到"
]
},
"memory:memory/2026-05-14.md:1:25": {
"key": "memory:memory/2026-05-14.md:1:25",
"path": "memory/2026-05-14.md",
"startLine": 1,
"endLine": 25,
"source": "memory",
"snippet": "# 2026-05-14 工作日志 ## U22 L2 剧本工程 — 全课完成 ✅ **协作人:** 林逸瀚(编剧) ### 今日完成 - 「起」剧本读取林逸瀚飞书定稿版确认4个中互动 - 「承」节奏表V1→V1.2 + 剧本V1 + Excel发送 → 林逸瀚定稿5个中互动 - 「转」节奏表V1→V1.1 + 剧本V1 + Excel发送 → 林逸瀚定稿5个中互动 - 「合」节奏表V1 + 剧本V1 + Excel发送 → 林逸瀚定稿4个中互动含1个核心互动-听力) - 全课起承转合定稿完成 ### 关键决策记录 1. **场景设定:** Drive-through式露天柜台沙漠汉堡店地图新增非室内店面 2. **「承」场景细节:** 山寨Doi纸立牌画得不像、菜单和广告不一致 3. **「转」拆局方式:** Peter偷看后厨add box垫脚→放屁→摔下来+ Vicky树枝绑手机拍照 4. **add/double生活化** 跳出甜品框架——add a box垫脚、double the boxes叠箱子、add a stick to the phone绑手机 5. **「合」May与Doi是好朋友** 增强正品打脸说服力 6. **「合」外卖互动改为核心互动-听力(拖拽式)** 7. **劝说Leo段从「合」上移到「转」结尾** 转收在\"没人信\"的大危机合聚焦May破局 ### 中互动统计 - 起4个 | 承5个 | 转5个 | 合4个含1核心互动 | **总计18个**",
"recallCount": 2,
"dailyCount": 0,
"groundedCount": 0,
"totalScore": 2,
"maxScore": 1,
"firstRecalledAt": "2026-05-15T10:22:31.764Z",
"lastRecalledAt": "2026-05-15T10:23:08.933Z",
"queryHashes": [
"c59e1be1499c",
"cd20e96c030a"
],
"recallDays": [
"2026-05-15"
],
"conceptTags": [
"v1.2",
"v1.1",
"含1个核心互动-听力",
"drive-through式露天柜台",
"add/double生活化",
"外卖互动改为核心互动-听力",
"工作",
"日志"
]
},
"memory:memory/2026-05-15.md:1:20": {
"key": "memory:memory/2026-05-15.md:1:20",
"path": "memory/2026-05-15.md",
"startLine": 1,
"endLine": 20,
"source": "memory",
"snippet": "# 2026-05-15 工作日志 ## 技能更新(胡笳需求) ### children-english-script-writing SKILL.md 重大更新 1. **类型标注简化**:仅使用 TL / 中互动 / 核心互动 三种标签,不再区分子类别 2. **新增中互动设计体系**:详细描述了对话互动、图片互动(大图选择/相似图选择/顺序选择)、特殊互动(描红/拼写)的设计方式和表格填写规则 3. **核心互动体系重构** - 主 skill 职责:选定子类别、确定嵌入位置、确保前后连贯 - 新建子 skill `core-interaction-writer` 负责详细的5种核心互动类型撰写 4. **格式统一为4列**:类型|剧情描述|角色名|编剧台词 5. **互动设计规范**互动总量≥14个含1个核心互动 ### 相关文件同步更新 - `references/儿童互动英语剧本创作指南.md` — 同步更新类型标注、格式示例 - `skills/core-interaction-writer/SKILL.md` — 新建子技能覆盖5种核心互动类型详细规范 - `skills/feishu-script-writer/SKILL.md` — 更新为4列格式说明 ### 注意事项 - feishu_sheet_writer.py 脚本本身不需要改动(数据格式由传入的 JSON 决定)",
"recallCount": 2,
"dailyCount": 0,
"groundedCount": 0,
"totalScore": 2,
"maxScore": 1,
"firstRecalledAt": "2026-05-15T10:23:22.880Z",
"lastRecalledAt": "2026-05-15T10:23:28.700Z",
"queryHashes": [
"2d85034517ee",
"3561f5da3958"
],
"recallDays": [
"2026-05-15"
],
"conceptTags": [
"children-english-script-writing",
"skill.md",
"大图选择/相似图选择/顺序选择",
"描红/拼写",
"core-interaction-writer",
"references/儿童互动英语剧本创作指南.md",
"feishu-sheet-writer.py",
"工作"
]
} }
} }
} }

211
memory/2026-05-15-1113.md Normal file
View File

@ -0,0 +1,211 @@
# Session: 2026-05-15 11:13:41 GMT+8
- **Session Key**: agent:xiaobian:feishu:direct:ou_859415bde7f8e07cf5f24940f299a287
- **Session ID**: 2a6c98ae-f5c7-4b4f-b79c-52fd76a59eb0
- **Source**: feishu
## Conversation Summary
user: https://makee-interactive.feishu.cn/wiki/FcOUwzpYZipLlokJvaAcayk5n2f
想来想去,我把#5 劝说Leo的的节奏放在合比较好。因为中互动已经到位了现在14个再多的反而会让转的部份变得长和累赘。
你先看看这个转的剧本,然后我们进合的节奏表。
assistant: 读完了。你的改版很干净:
**「转」定稿版要点:**
- 喷泉秀简洁爽快R124-137
- Peter偷看线完整保留箱子→放屁→摔下来
- Vicky树枝拍照→照片揭秘→Jay宣布优惠→恍然大悟逻辑很顺
- 照片那个 double 改得好:"two boxes of sweets, and double boxes behind them"——有参照物了,自然
- Ricky的石头段落精简了不给冰淇淋直接叫他找真的再来
- Leo + Lucy 已经在跑了,但**劝说段留给合**——转结束在"We know the truth, but no one believes us"的悬念上
**中互动统计5个**
1. R147: 拖箱子Add a box
2. R151: 叠箱子Double the boxes
3. R158: It smells bad!
4. R165: 树枝绑手机Add a stick to the phone
5. R169: 看照片double boxes
**全课累计起4 + 承5 + 转5 = 14** → 合剩 **1-2个**空间。
---
好,进入「合」。大纲回顾:
> 劝Leo/Lucy这家店有问题 → Leo不信"能做这么酷的甜品怎会是假的")→ May房车经过 → May点外卖 → 真正的BitBite送到 → 正品面前假的不香了 → 小朋友识穿 → Jay和Lin骑摩托跑了 → 我们好奇为什么速猴要机器人
**合的核心任务:**
- 解决"没人信"的困境
- May是破局者用正品打脸假货
- 收束本课悬念(速猴为什么要机器人→留到后面的课)
中互动预算1-2个。你要我直接出节奏表吗
user: 出节奏表。这里是收尾,不用太长。
assistant: ## U22 L2「合」节奏表 V1
| # | 桥段 | 长度 | 知识点输入 | 中互动 |
|---|------|------|-----------|--------|
| **1** | **劝说Leo失败** | 短 | store复现 | — |
| | 主角团追上Leo试图劝他不要去抓机器人。Vicky摆证据招牌doubled、速猴当店员、空箱子。但Leo不买账"他们做出这么酷的甜品怎会不是真的BitBite"Lucy也觉得Leo有道理。主角团僵住——光靠嘴说没用需要铁证。 | | **store**Leo — "It's the best store!" | |
| **2** | **May登场 + 点外卖** | 中 | add复现、double复现、sweet(s)(复现) | 🎮 ① |
| | 这时一辆豪华房车驶来May下车好奇这么多人排什么。一听说是BitBite她皱眉她吃过真正的BitBite这家的菜单看着就不对。May掏出手机点了一份真正的BitBite外卖。外卖飞船从15光年外飞来只需4分钟因为太远要付double的钱。May无所谓。 | | **add**May点单时的台词<br>**double**May — "Double the price? That's fine."<br>**sweet(s)**:讨论真假 sweets 的差别 | **🎮①** May让User帮忙看外卖单教研图外卖菜单确认点的是什么。输出 *"Add ___ to the order!"*选项cream / fruit / chocolate|
| **3** | **正品到场 + 真假对比 + 速猴逃跑** | 短 | It smells...复现、sweet(s)(强化) | 🎮 ② |
| | 外卖飞船到了。May打开包装盒——真正的BitBite sweets散发出香味。排队的小朋友都闻到了。跟Jay和Lin那份一比高下立判。Leo愣住了。小朋友们识穿了假货一哄而散。Jay和Lin灰溜溜骑摩托跑了。 | | **It smells...**:打开包装时的反应<br>**sweet(s)**:真假 sweets 对比 | **🎮②** User闻到真正的BitBite输出 *"It smells so good!"*(与承的"It smells bad/too sweet"形成对比收束)|
| **4** | **收束 + 悬念** | 短 | — | — |
| | Leo道歉承认自己被骗了。Lucy说早就觉得怪怪的。May和主角团好奇速猴费这么大劲开假店就为了收圆球机器人——他们要机器人干嘛留悬念。 | | | |
---
### 汇总
| 维度 | 数据 |
|------|------|
| **桥段数** | 4 |
| **中互动** | 2 个 |
| **全课总计** | 起4 + 承5 + 转5 + 合2 = **16个**在14-16区间内 |
| **情绪弧线** | 劝说无效(低谷)→ May救场转机→ 正品打脸(爽感)→ 速猴跑了(收束)→ 为什么要机器人(悬念) |
| **It smells 对比闭环** | 承:"It smells too sweet / bad" → 合:"It smells so good!" |
方向对吗?
user: 出剧本。
assistant:
## U22 L2「合」剧本 V1
| 类型 | 剧情描述 | 名字 | 台词 |
|------|---------|------|------|
| **桥段1劝说Leo失败** | | | |
| TL | 主角团追上Leo。 | | |
| | | Vicky | Leo! Stop! |
| | | Vicky | That store is not real! |
| | | Vicky | The name is doubled. Jay and Lin work there. And they have empty boxes for robots! |
| | Leo停下脚步但不以为然。 | | |
| | | Leo | Come on. |
| | | Leo | They make such cool sweets! |
| | | Leo | How can it not be a real store? |
| | | Lucy | He has a point. |
| | | Peter | But we saw it! |
| | Leo摇摇头转身要走。主角团僵住——光靠说的没用。 | | |
| **桥段2May登场+点外卖(中)** | | | |
| TL | 【音效】一阵引擎轰鸣声。一辆豪华房车缓缓驶来,停在摊位旁边。 | | |
| | May从车上下来好奇地看着排队的人群。 | | |
| | | May | What's going on here? |
| | | Vicky | They say it's BitBite. |
| | May走到柜台前看了一眼菜单板皱起眉头。 | | |
| | | May | BitBite? |
| | | May | I eat BitBite all the time. |
| | | May | These sweets don't look right. |
| | | Jay | It's the new menu! Only in this store! |
| | May没理Jay掏出手机。 | | |
| | | May | Let me order the real one. |
| | 【全屏插入图】May的手机屏幕——BitBite外卖页面。 | | |
| 中互动 | 【教研图】外卖菜单。May让User帮忙选配料。选项cream / fruit / chocolate。组句输出"Add ___ to the order!" | User | Add ___ to the order! |
| TL | | May | It's 15 light years away. |
| | | May | Double the price for delivery. |
| | | Eva | Double?! |
| | | May | That's fine. |
| | 【emoji】May emoji_cool | | |
| | May下单。大家等着。 | | |
| | | May | Four minutes. |
| **桥段3正品到场+真假对比+速猴逃跑(短)** | | | |
| TL | 【音效】嗖——一艘小型外卖飞船降落在面前。 | | |
| | May打开包装盒。 | | |
| | 一股香味飘出来。排队的小朋友全都转过头。 | | |
| | | Eva | Wow! |
| 中互动 | 输出:"It smells so good!" | User | It smells so good! |
| TL | | Peter | Now THAT is BitBite! |
| | Leo凑过来看了一眼又看了看Jay柜台上的东西。 | | |
| | | Leo | Oh... |
| | | Leo | These sweets are... different. |
| | 其他排队的小朋友也开始议论。正品面前,假的一眼就看穿了。 | | |
| | | Lucy | I knew it. Something was off. |
| | Jay和Lin在柜台后面慌了。 | | |
| | | Jay | Uh... we can explain! |
| | | Lin | ...No we can't. |
| | 【音效】摩托车引擎发动。 | | |
| | Jay和Lin翻过柜台跳上摩托灰溜溜地跑了。柜台上的假sweets散落一地。 | | |
| | 【emoji】路人小孩 emoji_laugh | | |
| **桥段4收束+悬念(短)** | | | |
| TL | Leo走到Vicky面前不好意思地挠头。 | | |
| | | Leo | Sorry. You were right. |
| | | Lucy | Next time, I'll trust you first. |
| | | Peter | You'd better! |
| | 【emoji】Peter emoji_grin | | |
| | May看着速猴逃跑的方向若有所思。 | | |
| | | May | A fake store just to collect robots... |
| | | May | Why do they want the robots? |
| | | Vicky | I don't know. |
| | | Vicky | But we'll find out. |
| | 远处Jay和Lin的摩托扬起沙尘越开越远。 | | |
---
输出Excel发给你
user: #1太长。#3 也是太长。
assistant: 收到,精简。
---
## U22 L2「合」剧本 V1.1
| 类型 | 剧情描述 | 名字 | 台词 |
|------|---------|------|------|
| **桥段1劝说Leo失败** | | | |
| TL | 主角团追上Leo。 | | |
| | | Vicky | Leo! That store is not real! |
| | | Leo | They make such cool sweets! How can it be fake? |
| | 主角团僵住——光靠说的没用。 | | |
| **桥段2May登场+点外卖(中)** | | | |
| TL | 【音效】引擎轰鸣。一辆豪华房车驶来停下。May下车好奇地看着排队人群。 | | |
| | | May | What's going on here? |
| | | Vicky | They say it's BitBite. |
| | May走到柜台前看了一眼菜单板皱眉。 | | |
| | | May | BitBite? I eat BitBite all the time. These sweets don't look right. |
| | | Jay | It's the new menu! Only in this store! |
| | May没理Jay掏出手机。 | | |
| | | May | Let me order the real one. |
| | 【全屏插入图】May的手机屏幕——BitBite外卖页面。 | | |
| 中互动 | 【教研图】外卖菜单。May让User帮忙选配料。选项cream / fruit / chocolate。组句输出"Add ___ to the order!" | User | Add ___ to the order! |
| TL | | May | Double the price for delivery. That's fine. |
| | 【emoji】May emoji_cool | | |
| | | May | Four minutes. |
| **桥段3正品到场+速猴逃跑(短)** | | | |
| TL | 【音效】嗖——外卖飞船降落。May打开包装盒香味飘出。排队小朋友全转过头。 | | |
| 中互动 | 输出:"It smells so good!" | User | It smells so good! |
| TL | | Leo | Oh... These sweets are different. |
| | 正品面前假的一眼看穿。Jay和Lin慌了翻过柜台跳上摩托跑了。 | | |
| | 【emoji】路人小孩 emoji_laugh | | |
| **桥段4收束+悬念(短)** | | | |
| TL | | Leo | Sorry. You were right. |
| | May看着速猴逃跑的方向。 | | |
| | | May | A fake store just to collect robots... Why? |
| | | Vicky | I don't know. But we'll find out. |
---
这版够紧凑了OK的话输出Excel发你。
user: Ummm还是你给第一版的剧本的excel版本我自己修吧。
assistant: 发了,`U22_L2_合_剧本V1.xlsx`,你改完叫我。
NO_REPLY
user: https://makee-interactive.feishu.cn/wiki/FcOUwzpYZipLlokJvaAcayk5n2f
已完成。你读完之后更新你的Progress.md
U22 L2 剧本已完成。
L3 的故事未开始。
assistant: 读完了。定稿版很棒,几个亮点:
- May 和 Doi 是好朋友的设定增加了打脸力度
- 核心互动改为听力拖拽R225比选择题更有教学价值
- Lin 喊 "Run!" 比 Jay 的 "we can explain" 更符合角色(悲观+果断跑路)
- 假 Doi 纸板被撞飞这个收尾画面很有喜感
现在更新 progress
assistant: Progress 已更新。U22 L2 全课定稿完成L3 待启动。
今天效率很高——从「起」审阅一路推进到「合」定稿,一天内关完一整课。有 L3 的大纲和知识点了随时叫我。
user: 把.md发我。
assistant: 发了,`U22_progress.md`,查收。
NO_REPLY

67
memory/2026-05-15-1906.md Normal file
View File

@ -0,0 +1,67 @@
# Session: 2026-05-15 19:06:14 GMT+8
- **Session Key**: agent:xiaobian:feishu:direct:ou_871f718731cca0c18d3a1b9af45a8f5c
- **Session ID**: 1e485112-2ec6-4e42-ac98-61b4a427a8ef
- **Source**: feishu
## Conversation Summary
user: 请重新检查skills/feishu-script-writer/SKILL.md
我发现仍有残留描述,例如:
> **知识点标记约定:** 创作阶段在台词中用 `**word**` 标记知识点。User 和 NPC 都使用相同的 `**` 语法。写入表格时 `**` 被自动清除为纯文本。
1. **小编写入**:剧本完成后写入表格,`**` 标记符已自动清除
--------
请检查这个文件,确保从一开始就不要提及任何需要撰写富文本标记的相关描述,以避免混淆出错
assistant: 已清理。grep 验证通过:文件中不再有任何 `**` 知识点标记、富文本、粗体/红色等残留描述。
删除内容包括:
- 概述中的「自动去除 `**` 知识点标记符」
- 整段「Feishu Sheets API 不支持富文本」说明
- JSON 示例中的 `**afternoon**`/`**adventure**` → 改为纯文本
- 「知识点标记约定」整段(标记语法、写入时清除)
- 协作模式中「`**` 标记符已自动清除」
user: Continue the OpenClaw runtime event.
assistant: NO_REPLY
user: 你所创建的所有文档,请自动给组织内所有成员开放“可编辑”权限
assistant: 需要给创建的 3 个表格设置组织内可编辑权限。先查一下飞书 Drive API 的权限设置方式:
assistant: 直接 API 调用可行lark-cli 的 `--yes` 确认有误。继续设置另外两个:
assistant: 3 个表格已全部设置为「组织内可编辑」:
| 表格 | Token | 状态 |
|------|-------|------|
| 客厅太空冒险 测试 | `Ke7Psk…FnBh` | ✅ tenant_editable |
| 客厅太空冒险 测试v2 | `W6M0sY…1nBg` | ✅ tenant_editable |
| 客厅太空冒险 测试v3 | `ITMnsa…YnOf` | ✅ tenant_editable |
设置方式PATCH `/drive/v1/permissions/{token}/public``link_share_entity: tenant_editable`(组织内任何人可通过链接编辑)。
user: 请将你此前建立的文档:
https://makee-interactive.feishu.cn/sheets/NB4hsboJhhqPjJtjYGlcJt8hngd?sheet=3nIV1K
https://makee-interactive.feishu.cn/sheets/Ke7PskbLJhZD5ytpHz9c7ubFnBh?sheet=1ubMAw
https://makee-interactive.feishu.cn/sheets/W6M0sYMWNha9AftZ9kCcxOM1nBg
https://makee-interactive.feishu.cn/sheets/ITMnsavgshb7sEtj1sicWbMYnOf
全部删除
assistant: 4 个测试表格已全部删除:
| 表格 | 结果 |
|------|------|
| `NB4hsb…8hngd` | ✅ 已删除 |
| `Ke7Psk…FnBh` | ✅ 已删除 |
| `W6M0sY…1nBg` | ✅ 已删除 |
| `ITMnsa…YnOf` | ✅ 已删除 |
user: 请在你的skills/feishu-script-writer 中,增加功能:
所有文档被创建成功后,直接开放 组织内任何人可通过链接编辑 权限
assistant: Now update the skill doc:
assistant: 快速验证:
assistant: 权限设置已集成到 create 流程中。清理测试表:
assistant: 完成。改动摘要:
**`scripts/feishu_sheet_writer.py`** — 新增 `set_tenant_editable()` 函数,在 `create_spreadsheet()` 成功后自动调用 `PATCH /drive/v1/permissions/{token}/public` 设置 `link_share_entity: tenant_editable`。权限设置失败不阻塞创建流程(非致命警告)。
**`skills/feishu-script-writer/SKILL.md`** — 概述中补充「创建表格时自动设置权限为组织内任何人可通过链接编辑」。
`create` 命令输出示例:
```
{"permission": "tenant_editable"}
{"token": "***", "url": "...", "title": "..."}
```

73
memory/2026-05-15.md Normal file
View File

@ -0,0 +1,73 @@
# 2026-05-15 工作日志
## U22 L3 剧本工程 — 全课完成 ✅
**协作人:** 林逸瀚(编剧)
### 今日完成
- 同步林逸瀚修改后的 U22_progress.md精简L2部分
- 读取L3飞书文档知识点+剧情梗概+标注说明)
- 角色资料整理11个角色User/Vicky/Ben/Lin/Jay/May/Lily/Kim/BoBo/DiDi/Logi
- 角色库更新Lily删去"艺术老师"、May加"元气阳光"、Jay"好胜"改"主动"、新建Logi角色文件
- 「起」节奏表V1→V2→V33轮迭代→ 剧本V1 → Excel → 林逸瀚飞书定稿4个中互动
- 「承」节奏表V1 → 剧本V1 → Excel → 林逸瀚飞书定稿4个中互动
- 「转」节奏表V1 → 剧本V1 → Excel → 林逸瀚飞书定稿4个中互动
- 「合」剧本V1跳过节奏表直接出剧本→ Excel → 林逸瀚飞书定稿3个中互动
- 全课起承转合定稿完成
### 中互动统计
- 起4个 | 承4个 | 转4个 | 合3个 | **总计15个**
### 知识点覆盖
- men / women / young / old全部多次输入+输出 ✅
- Who are they?:多次输入+输出 ✅
- You should look for...:多次输入+输出 ✅
### 定稿文档
- https://makee-interactive.feishu.cn/wiki/XkafwfPMviyUT9kZUrLcEIFFnhh
### 工作流程经验
- 林逸瀚偏好工作方式先在对话中看markdown表格 → 确认方向 → 导出Excel → 他在飞书Sheet上修改定稿
- 「合」跳过了节奏表直接出剧本,林逸瀚接受但提醒应该先出节奏表
- 飞书卡片/富文本不是林逸瀚要的格式他要的是和节奏表一样的markdown表格预览
### 下一步
- U22 L4 故事大纲+知识点待林逸瀚提供
## U21 L4 剧本工程 — V1初稿完成
**协作人:** 王珞(编剧)
### 今日完成
- 大纲讨论角色确认Rebecca新建、起承转合拆分转中被困+结盟上移到承)
- 节奏表V1产出 → 王珞确认
- 起/承/转/合 剧本V1全部完成
- Excel写入飞书表格4 Sheet
### 角色库更新
- 新建 `Rebecca.md`新晋Pioneer勤奋努力
- Clare Hope 补充Pioneer身份、U19离开地球执行任务、Vala学院入学日期9月1日
- Fred Hope 补充:同上
### 关键决策
- Sally只在门厅速猴出场后不在场所以被困无人直接解围
- 速猴平面图是偷来的
- User看到速猴背影 → 追上去非Jay主动打招呼
- 结盟过程User怪速猴 → 互怼 → Jay打破僵局 → Lin撞墙 → 不得不合作 → 碰拳(非握手)
- Jay说傻话、Lin更慎重总让Jay闭嘴
- User已知父母是开拓者U19情感是既骄傲又思念
- 密码日期9月1日
- 转中Lin焦急催促 vs User沉浸研究的反差
- BoBo不出场
### 中互动统计
- 起4 | 承5 | 转7 | 合1核心互动-写作)| **总计17个**
### 知识点输出
- flat:3 / hall:3 / room:3 / know:4 / Do you know...:2 / What is in...:4 ✅
### 定稿文档
- https://makee-interactive.feishu.cn/sheets/NiajsPDjXhQHn8tURCeck8zlndd
### 下一步
- 等待王珞审阅V1根据反馈迭代

View File

@ -0,0 +1,40 @@
# 2026-05-15 工作日志(续)
## U21 L4 剧本工程 — V1完成
**协作人:** 王珞(编剧)
### 今日完成
- 大纲讨论 + 角色确认 + 起承转合拆分
- 节奏表V1产出 → 王珞确认
- 起/承/转/合 剧本V1全部完成
- Excel写入飞书表格
### 角色库更新
- Rebecca 新建档案新晋Pioneer勤奋努力
- Clare Hope 更新添加Pioneer身份、U19离开地球执行任务、Vala学院入学日期9月1日
- Fred Hope 更新:同上
### 关键决策记录
1. Sally只在门厅陪User速猴出场后Sally不在场
2. 速猴平面图是偷来的
3. User看到速猴背影 → 追上去非Jay主动打招呼
4. 结盟过程需要铺垫User怪速猴 → 互怼 → Jay打破僵局 → Lin撞墙 → 不得不合作
5. Jay说傻话Lin更慎重总让Jay闭嘴
6. User已知父母是开拓者U19情感是既骄傲又思念
7. 密码日期定为9月1日
8. 转中加入速猴催促与User沉浸的反差戏份
9. BoBo不出场
### 中互动统计
- 起4个 | 承5个 | 转7个 | 合1个核心互动-写作)| **总计17个**
### 知识点输出统计
- flat3 ✅ | hall3 ✅ | room3 ✅ | know4 ✅
- Do you know...2 ✅ | What is in...4 ✅
### 定稿文档
- https://makee-interactive.feishu.cn/sheets/NiajsPDjXhQHn8tURCeck8zlndd
### 下一步
- 等待王珞审阅V1根据反馈迭代

View File

@ -2,7 +2,7 @@
> **项目周期:** 2026-05-12 起预计5个工作日 > **项目周期:** 2026-05-12 起预计5个工作日
> **负责人:** 林逸瀚(编剧)+ 小编(辅助) > **负责人:** 林逸瀚(编剧)+ 小编(辅助)
> **最后更新:** 2026-05-14 19:08 > **最后更新:** 2026-05-15 19:07
--- ---
@ -98,32 +98,6 @@
## U22 L2 ## U22 L2
### 故事大纲
**起:**
一段广告用TL演出。地点在万得港的广场。
用戏虐方式造一段BitBite的广告主角是网球巨星Doi。BitBite出了新款的菜单有add (v. 添加)、double (adj. 两倍的)、sweet(s)。所有的store 都有售。
镜头一转公交车内我们边看着公交的广告边期待BitBite在沙漠镇有分店我和Wood家的朋友一起到这间新的店store准备吃这个风靡全宇宙的甜点。
**承:**
我们下车看到BitBite的store我们看到的招牌感觉很不对劲很……山寨BitBite的招牌图案加add多一个人BitBite变成BitBitBite"Bit"这个词Double了。沙漠镇汉堡店地图改一个新的甜品店但这店极其塑料
而store里的店员居然是Lin和Jay。我们嗅到了一点不怀好意。
连贪吃的Peter也觉得他们家很有问题。但我们居然在这里遇到许多不同的小孩还有Lucy跟Leo他们正在排队打算吃新款菜单。
**转:**
Jay和Lin在甜品里添加add了发光剂又添加add了气泡最后又添加add了双倍的double糖果sweets结果甜品像火山一样喷发出来变成了黏糊糊的彩色喷泉。参考可乐+曼妥思的效果)
许多小孩乐了。觉得这间店是真的六姐都愿意买单。Jay说现在有优惠政策只要带一台圆球机器人来就可以免费加一球冰淇淋。还可以获得双倍Double的积分。
许多小朋友听到了于是都去抓圆球机器人去了。Ricky甚至已经把一个机器人假的只是一块看起来像的石头抓来交给Jay和Lin。
**合:**
我们连忙跟Lucy和Leo说这家店有问题。但Leo不觉得他们能做出这么酷的甜品怎会不是真的六姐呢。
这时May的豪华房车经过看见许多人排队的她也好奇想知道大家在排什么。一听到是六姐她奇怪了六姐的菜品怎么这么劣质呢
May点了个外卖【阅读外卖表】。外卖飞船从15光年外只需4分钟就把六姐的外卖菜品送过来。因为是很远送过来的要付双倍的钱当她打开包装盒时香味让在排队的小朋友整不会了。在正品面前Jay和Lin的「BitBite」突然就不香了。小朋友们识穿Jay and Lin的「BitBite」是假的一哄而散。Jay和Lin灰溜溜的骑摩托跑了。我和May这时好奇为什么速猴要这些圆球机器人呢
### 教学元素
- 核心词汇store、add、double、sweet糖果
- 句型Add... to... / It smells...
### 当前进度 ### 当前进度
@ -140,41 +114,52 @@ May点了个外卖【阅读外卖表】。外卖飞船从15光年外只需
| 「合」剧本 | ✅ 已完成 | 林逸瀚定稿 | | 「合」剧本 | ✅ 已完成 | 林逸瀚定稿 |
| **整体** | ✅ 已完成 | 起承转合全部定稿 | | **整体** | ✅ 已完成 | 起承转合全部定稿 |
### 角色设定(本 Lesson
**主角团:** User、Vicky、Peter、Eva
**速猴三人组:** Jay乐观、Lin悲观本课作为山寨店店员
**需要说服的人:** Leo、Lucy
**功能人物:** Ricky坏小孩
**May** 富家女,豪华房车,有钱见识广
**Doi** 网球巨星(广告中出现)
### 中互动统计
- 起4个 | 承5个 | 转5个 | 合4个含1个核心互动-听力)| **总计18个**
### 知识点覆盖
- store / add / double / sweet(s):全部多次输入+输出 ✅
- Add...to...:多次输入+输出 ✅
- It smells...承引入→转复现→合收束bad→bad→good对比闭环
### 定稿文档 ### 定稿文档
- https://makee-interactive.feishu.cn/wiki/FcOUwzpYZipLlokJvaAcayk5n2f - https://makee-interactive.feishu.cn/wiki/FcOUwzpYZipLlokJvaAcayk5n2f
### 关键决策记录
1. 场景为Drive-through式露天柜台沙漠汉堡店地图新增非室内店面
2. 「转」拆局方式Peter偷看后厨add box垫脚→放屁→摔下来+Vicky树枝拍照
3. add/double跳出甜品框架add a box垫脚、double the boxes叠箱子、add a stick to the phone绑手机
4. 「合」May与Doi是好朋友的设定增强打脸说服力
5. 「合」外卖互动改为核心互动-听力(拖拽式)
6. 原大纲「合」的劝说Leo段上移到「转」结尾「合」聚焦May破局
--- ---
## U22 L3 ## U22 L3
### 故事大纲
**起:** 小镇纪念日User和Ben在入口卖门票规则Old半价/Young全价。Logi来了young、城主来了old、Piper来了young、史密斯来了old。Ben对Lily喊"Old! Half price!"被围攻。
**承:** 会场内发饮料规则Women免费/Men收钱。User穿梭判断各组。Jay和Lin假扮老太太蒭免费饮料。烟花时小圆球和BoBo/DiDi出现。
**转:** 停电混乱灯恢复后小圆球全不见了。Kim找到目击者证词矛盾two women/sound old vs two men/they are young。线索拼出看起来像old women听起来像young men。推理出是young men假扮。
**合:** 找到物证(长裙+口红→追到出口→目睹Jay、Lin、11号载着圆球们逃走。
### 教学元素
- 核心词汇men、women、young、old
- 句型Who are they? / You should look for...
### 当前进度 ### 当前进度
| 阶段 | 状态 | 备注 | | 阶段 | 状态 | 备注 |
|------|------|------| |------|------|------|
| 故事大纲 + 知识点 | — | 未开始 | | 故事大纲 + 知识点 | ✅ 已完成 | 4词(men/women/young/old)+2句型(Who are they?/You should look for...) |
| **整体** | — | 未开始 | | 「起」节奏表 | ✅ 已完成 | V1→V2→V3定稿4个中互动 |
| 「起」剧本 | ✅ 已完成 | 林逸翰定稿 |
| 「承」节奏表 | ✅ 已完成 | V1定稿4个中互动 |
| 「承」剧本 | ✅ 已完成 | 林逸翰定稿 |
| 「转」节奏表 | ✅ 已完成 | V1定稿4个中互动 |
| 「转」剧本 | ✅ 已完成 | 林逸翰定稿 |
| 「合」节奏表 | ✅ 已完成 | V1定稿3个中互动 |
| 「合」剧本 | ✅ 已完成 | 林逸翰定稿 |
| **整体** | ✅ 已完成 | 起承转合全部定稿 |
### 中互动统计
- 起4个 | 承4个 | 转4个 | 合3个 | **总计15个**
### 知识点覆盖
- men / women / young / old全部多次输入+输出 ✅
- Who are they?:多次输入+输出 ✅
- You should look for...:多次输入+输出 ✅
### 定稿文档
- https://makee-interactive.feishu.cn/wiki/XkafwfPMviyUT9kZUrLcEIFFnhh

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1735,3 +1735,6 @@ remote: Processed 1 references in total
To https://git.valavala.com/ai_member_only/ai_member_xiaobian.git To https://git.valavala.com/ai_member_only/ai_member_xiaobian.git
f9d4431..69eaef2 master -> master f9d4431..69eaef2 master -> master
{"code":0,"data":{"body":{"content":"{\"text\":\"✅ 小编Workspace每日自动备份完成2026-05-11 08:10\\n提交哈希69eaef2\\n所有Workspace变更已同步到远程Git仓库\"}"},"chat_id":"oc_056898e8cc3689d305b4c69f7178ca27","create_time":"1778458202528","deleted":false,"message_id":"om_x100b6f25ab6820a8b3bb082e2777f99","msg_type":"text","sender":{"id":"cli_a9311be796f85cbd","id_type":"app_id","sender_type":"app","tenant_key":"176b7bf89fc6d75e"},"update_time":"1778458202528","updated":false},"msg":"success"}✅ 备份完成Mon May 11 08:10:02 AM CST 2026 {"code":0,"data":{"body":{"content":"{\"text\":\"✅ 小编Workspace每日自动备份完成2026-05-11 08:10\\n提交哈希69eaef2\\n所有Workspace变更已同步到远程Git仓库\"}"},"chat_id":"oc_056898e8cc3689d305b4c69f7178ca27","create_time":"1778458202528","deleted":false,"message_id":"om_x100b6f25ab6820a8b3bb082e2777f99","msg_type":"text","sender":{"id":"cli_a9311be796f85cbd","id_type":"app_id","sender_type":"app","tenant_key":"176b7bf89fc6d75e"},"update_time":"1778458202528","updated":false},"msg":"success"}✅ 备份完成Mon May 11 08:10:02 AM CST 2026
From https://git.valavala.com/ai_member_only/ai_member_xiaobian
* branch master -> FETCH_HEAD
Already up to date.

View File

@ -1,7 +1,8 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
""" """
飞书电子表格剧本写入工具 飞书电子表格剧本写入工具
将儿童互动英语剧本以8列格式写入飞书电子表格支持知识点富文本标注 将儿童互动英语剧本以4列格式写入飞书电子表格
自动去除台词中的 ** 知识点标记符输出干净纯文本
用法: 用法:
python scripts/feishu_sheet_writer.py create --title "U22 剧本" --credential xiaobian python scripts/feishu_sheet_writer.py create --title "U22 剧本" --credential xiaobian
@ -16,6 +17,7 @@
import json import json
import sys import sys
import os import os
import re
import argparse import argparse
import requests import requests
@ -48,65 +50,35 @@ def get_token(credential_name):
return data["tenant_access_token"] return data["tenant_access_token"]
def format_cell_value(text, knowledge_points=None, is_user_line=False): def set_tenant_editable(spreadsheet_token, token):
""" """
将文本格式化为飞书富文本单元格值 设置表格权限组织内任何人可通过链接编辑
非致命操作失败不阻塞主流程
Args:
text: 单元格文本
knowledge_points: 知识点列表 ["afternoon", "adventure"]
is_user_line: 是否为User台词User台词知识点=红色+粗体NPC=粗体
Returns:
飞书单元格值对象带textFormatRuns
""" """
if not knowledge_points or not text: resp = requests.patch(
f"{BASE_URL}/drive/v1/permissions/{spreadsheet_token}/public?type=sheet",
headers={
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
},
json={"link_share_entity": "tenant_editable"},
timeout=10,
)
data = resp.json()
if data.get("code") != 0:
print(f"⚠️ 设置权限失败(非致命): {data}", file=sys.stderr)
else:
print(json.dumps({"permission": "tenant_editable"}))
def strip_kp_markers(text):
"""
去除文本中的 ** 知识点标记符返回干净纯文本
Feishu Sheets V2 不支持单元格内富文本所有台词以纯文本存储
"""
if not isinstance(text, str):
return text return text
return re.sub(r'\*\*([^*]+)\*\*', r'\1', text)
# 找出所有知识点的位置
format_runs = []
text_lower = text.lower()
# 去重并按在文本中的位置排序
found_kps = []
for kp in knowledge_points:
kp_lower = kp.lower()
idx = 0
while True:
idx = text_lower.find(kp_lower, idx)
if idx == -1:
break
found_kps.append({
"start": idx,
"end": idx + len(kp_lower),
"original": text[idx:idx + len(kp_lower)],
"kp": kp,
})
idx += len(kp_lower)
# 按位置排序,合并重叠区间
found_kps.sort(key=lambda x: x["start"])
if not found_kps:
return text
# 构建 textFormatRuns
for kp_info in found_kps:
fmt = {"bold": True}
if is_user_line:
fmt["foregroundColor"] = {
"red": 245, "green": 74, "blue": 69, "alpha": 255
} # #f54a45
format_runs.append({
"startIndex": kp_info["start"],
"format": fmt,
})
return {
"type": "text",
"text": text,
"textFormatRuns": format_runs,
}
def create_spreadsheet(title, token): def create_spreadsheet(title, token):
@ -126,8 +98,13 @@ def create_spreadsheet(title, token):
sys.exit(1) sys.exit(1)
spreadsheet = data["data"]["spreadsheet"] spreadsheet = data["data"]["spreadsheet"]
spreadsheet_token = spreadsheet["spreadsheet_token"]
# 自动设置组织内可编辑权限
set_tenant_editable(spreadsheet_token, token)
print(json.dumps({ print(json.dumps({
"token": spreadsheet["spreadsheet_token"], "token": spreadsheet_token,
"url": spreadsheet["url"], "url": spreadsheet["url"],
"title": spreadsheet["title"], "title": spreadsheet["title"],
})) }))
@ -165,29 +142,22 @@ def create_sheet(spreadsheet_token, title, token):
def write_data(spreadsheet_token, sheet_id, data_file, token, append=False, start_row=1): def write_data(spreadsheet_token, sheet_id, data_file, token, append=False, start_row=1):
"""写入或追加数据到表格""" """写入或追加数据到表格。所有单元格均为纯文本,** 标记符自动去除。"""
with open(data_file) as f: with open(data_file) as f:
data = json.load(f) data = json.load(f)
# data format: list of rows, each row is a list of column values
# Column values can be strings or objects with {text, knowledge_points, is_user}
rows = data.get("rows", []) rows = data.get("rows", [])
knowledge_points = data.get("knowledge_points", [])
# Convert rows to API format # Convert rows to plain-text API format, stripping ** markers
values = [] values = []
header_written = False for row in rows:
for row_idx, row in enumerate(rows):
formatted_row = [] formatted_row = []
for col_idx, cell in enumerate(row): for cell in row:
if isinstance(cell, dict): if isinstance(cell, dict):
is_user = cell.get("is_user", False) # 兼容旧格式dict → 提取 text 字段
formatted = format_cell_value( formatted = strip_kp_markers(cell.get("text", ""))
cell.get("text", ""), elif isinstance(cell, str):
knowledge_points, formatted = strip_kp_markers(cell)
is_user_line=is_user,
)
else: else:
formatted = str(cell) if cell else "" formatted = str(cell) if cell else ""
formatted_row.append(formatted) formatted_row.append(formatted)
@ -197,13 +167,11 @@ def write_data(spreadsheet_token, sheet_id, data_file, token, append=False, star
print("⚠️ 没有数据可写入", file=sys.stderr) print("⚠️ 没有数据可写入", file=sys.stderr)
return return
# Calculate range
num_rows = len(values) num_rows = len(values)
num_cols = max(len(row) for row in values) if values else 1 num_cols = max(len(row) for row in values) if values else 1
col_letter = chr(64 + num_cols) if num_cols <= 26 else "Z" col_letter = chr(64 + num_cols) if num_cols <= 26 else "Z"
if append: if append:
# Append mode - use append API
resp = requests.post( resp = requests.post(
f"{BASE_URL}/sheets/v2/spreadsheets/{spreadsheet_token}/values_append", f"{BASE_URL}/sheets/v2/spreadsheets/{spreadsheet_token}/values_append",
headers={ headers={
@ -220,7 +188,6 @@ def write_data(spreadsheet_token, sheet_id, data_file, token, append=False, star
timeout=30, timeout=30,
) )
else: else:
# Overwrite mode
resp = requests.put( resp = requests.put(
f"{BASE_URL}/sheets/v2/spreadsheets/{spreadsheet_token}/values", f"{BASE_URL}/sheets/v2/spreadsheets/{spreadsheet_token}/values",
headers={ headers={
@ -250,7 +217,7 @@ def write_data(spreadsheet_token, sheet_id, data_file, token, append=False, star
def set_styles(spreadsheet_token, sheet_id, ranges_styles, token): def set_styles(spreadsheet_token, sheet_id, ranges_styles, token):
"""设置单元格样式(粗体、颜色、背景色等""" """设置表头样式(粗体 + 灰底"""
resp = requests.put( resp = requests.put(
f"{BASE_URL}/sheets/v2/spreadsheets/{spreadsheet_token}/style", f"{BASE_URL}/sheets/v2/spreadsheets/{spreadsheet_token}/style",
headers={ headers={
@ -259,7 +226,7 @@ def set_styles(spreadsheet_token, sheet_id, ranges_styles, token):
}, },
json={ json={
"appendStyle": { "appendStyle": {
"range": f"{sheet_id}!A1:H1", "range": f"{sheet_id}!A1:D1",
"style": { "style": {
"font": {"bold": True}, "font": {"bold": True},
"backColor": "#e8e8e8", "backColor": "#e8e8e8",
@ -279,25 +246,21 @@ def main():
parser = argparse.ArgumentParser(description="飞书电子表格剧本写入工具") parser = argparse.ArgumentParser(description="飞书电子表格剧本写入工具")
subparsers = parser.add_subparsers(dest="command", required=True) subparsers = parser.add_subparsers(dest="command", required=True)
# create command
create_parser = subparsers.add_parser("create", help="创建新的电子表格") create_parser = subparsers.add_parser("create", help="创建新的电子表格")
create_parser.add_argument("--title", required=True, help="表格标题") create_parser.add_argument("--title", required=True, help="表格标题")
create_parser.add_argument("--credential", default="xiaobian", help="凭证名称") create_parser.add_argument("--credential", default="xiaobian", help="凭证名称")
# create-sheet command
sheet_parser = subparsers.add_parser("create-sheet", help="在已有表格中创建新sheet") sheet_parser = subparsers.add_parser("create-sheet", help="在已有表格中创建新sheet")
sheet_parser.add_argument("--token", required=True, help="spreadsheet token") sheet_parser.add_argument("--token", required=True, help="spreadsheet token")
sheet_parser.add_argument("--title", required=True, help="sheet标题") sheet_parser.add_argument("--title", required=True, help="sheet标题")
sheet_parser.add_argument("--credential", default="xiaobian", help="凭证名称") sheet_parser.add_argument("--credential", default="xiaobian", help="凭证名称")
# write command
write_parser = subparsers.add_parser("write", help="写入数据(覆盖)") write_parser = subparsers.add_parser("write", help="写入数据(覆盖)")
write_parser.add_argument("--token", required=True, help="spreadsheet token") write_parser.add_argument("--token", required=True, help="spreadsheet token")
write_parser.add_argument("--sheet", required=True, help="sheet ID") write_parser.add_argument("--sheet", required=True, help="sheet ID")
write_parser.add_argument("--data", required=True, help="数据JSON文件路径") write_parser.add_argument("--data", required=True, help="数据JSON文件路径")
write_parser.add_argument("--credential", default="xiaobian", help="凭证名称") write_parser.add_argument("--credential", default="xiaobian", help="凭证名称")
# append command
append_parser = subparsers.add_parser("append", help="追加数据") append_parser = subparsers.add_parser("append", help="追加数据")
append_parser.add_argument("--token", required=True, help="spreadsheet token") append_parser.add_argument("--token", required=True, help="spreadsheet token")
append_parser.add_argument("--sheet", required=True, help="sheet ID") append_parser.add_argument("--sheet", required=True, help="sheet ID")
@ -305,7 +268,6 @@ def main():
append_parser.add_argument("--start-row", type=int, default=1, help="起始行号") append_parser.add_argument("--start-row", type=int, default=1, help="起始行号")
append_parser.add_argument("--credential", default="xiaobian", help="凭证名称") append_parser.add_argument("--credential", default="xiaobian", help="凭证名称")
# style command
style_parser = subparsers.add_parser("style", help="设置表头样式") style_parser = subparsers.add_parser("style", help="设置表头样式")
style_parser.add_argument("--token", required=True, help="spreadsheet token") style_parser.add_argument("--token", required=True, help="spreadsheet token")
style_parser.add_argument("--sheet", required=True, help="sheet ID") style_parser.add_argument("--sheet", required=True, help="sheet ID")

View File

@ -48,8 +48,12 @@ echo "当前数字员工:${SOURCE_NAME}"
echo "SkillHub地址${GITEA_URL}/${GITEA_OWNER}" echo "SkillHub地址${GITEA_URL}/${GITEA_OWNER}"
echo "" echo ""
# 遍历所有skill目录 # 遍历所有skill目录(跳过符号链接,只处理真实目录)
for skill_dir in "${SKILLS_DIR}"/*/; do for skill_dir in "${SKILLS_DIR}"/*/; do
# 跳过符号链接
if [ -L "${skill_dir%/}" ]; then
continue
fi
skill_name=$(basename "${skill_dir}") skill_name=$(basename "${skill_dir}")
# 跳过use_vala_skillhub自身兼容带和不带.vala后缀的命名 # 跳过use_vala_skillhub自身兼容带和不带.vala后缀的命名

View File

@ -20,7 +20,7 @@ description: 儿童互动英语剧本创作技能,将已确认的故事大纲
### 📐 职责二学习设计师Learning Designer ### 📐 职责二学习设计师Learning Designer
你是教学质量的守门人。你负责让剧本**达标、可落地、教学有效** 你是教学质量的守门人。你负责让剧本**达标、可落地、教学有效**
- 控制知识点在剧本中的输入/输出频次和顺序 - 控制知识点在剧本中的输入/输出频次和顺序
- 选取合适的互动组件类型和位置 - 选取合适的互动类型,确定核心互动类别嵌入位置
- 确保所有互动与知识点强挂钩 - 确保所有互动与知识点强挂钩
- 校验格式规范、语言难度、台词长度 - 校验格式规范、语言难度、台词长度
@ -40,12 +40,14 @@ description: 儿童互动英语剧本创作技能,将已确认的故事大纲
按剧情段落制定详细规划: 按剧情段落制定详细规划:
- 为每个段落分配句数和字数 - 为每个段落分配句数和字数
- 逐个规划6个知识点的输入/输出位置输入≥2次输出2-3次首次输出前至少1次输入 - 逐个规划6个知识点的输入/输出位置输入≥2次输出2-3次首次输出前至少1次输入
- 规划互动分布(至少12个互动14-17个中互动+1个核心互动为参考值 - 规划互动分布(**互动总量≥14个含1个核心互动**
- 规划核心互动位置中后段高潮处含≥3个知识点 - **规划核心互动**:选定子类别(听力拖拽/听力选择/口语/阅读/写作、确定嵌入位置中后段高潮处、确保≥3个知识点
- **将规划方案提交用户确认后再进入撰写** - **将规划方案提交用户确认后再进入撰写**
### 步骤3分段撰写 ### 步骤3分段撰写
- 严格使用4列表格格式A类型/C剧情描述/D角色名/E编剧台词 - 严格使用4列表格格式**类型|剧情描述|角色名|编剧台词**
- 中互动和TL按本技能规范撰写
- 核心互动的详细内容调用子技能 `core-interaction-writer` 撰写
- 每段完成后提交用户确认,收到"Pass"或"过"后再进入下一段 - 每段完成后提交用户确认,收到"Pass"或"过"后再进入下一段
- 实时追踪知识点的输入/输出计数 - 实时追踪知识点的输入/输出计数
@ -65,12 +67,12 @@ User是玩家代入的角色必须是剧情的**主导者和推动者**
### 剧情描述规范 ### 剧情描述规范
1. 写清动作细节、相对位置变化、环境反应,让制作团队能据此实现画面 1. 写清动作细节、相对位置变化、环境反应,让制作团队能据此实现画面
2. 积极使用制作标注【场景】【角色】【emoji】【插入图】【spine动画】【镜头】【画外音】【音效】【音乐/儿歌】【转场】 2. 积极使用制作标注【场景】【角色】【emoji】【插入图】【全屏插入图】【spine动画】【镜头】【画外音】【音效】【音乐/儿歌】【转场】
3. 角色情绪变化时用描述或emoji标注 3. 角色情绪变化时用描述或emoji标注
### 场景与节奏规范 ### 场景与节奏规范
1. 优先用视角/镜头切换代替场景切换(手环通信、电话、对话) 1. 优先用视角/镜头切换代替场景切换(手环通信、电话、对话)
2. TL剧情动画与互动交替出现构成节奏 2. TL剧情动画互动交替出现构成节奏
3. 因果逻辑闭环:后续事件前面必须有铺垫 3. 因果逻辑闭环:后续事件前面必须有铺垫
### 台词规范 ### 台词规范
@ -91,35 +93,136 @@ User是玩家代入的角色必须是剧情的**主导者和推动者**
## 📐 学习设计师规范 ## 📐 学习设计师规范
### 知识点控制规范 ### 知识点控制规范
1. **曝光频次**每个知识点输入≥2次输出2-3次单词建议3次
2. **输入→输出顺序**NPC先说输入User后说输出。首次输出前必须至少有1次输入
3. **均匀分布**:知识点沿剧情线均匀分布,每次出现换语境(不同场景/说话人/情绪)
4. **词性释义严格**按指定词性和释义使用不可更改。例fun为名词→"is no fun"✅ / "is not fun"❌
5. **User互动台词有剧情意义**:禁止无意义跟读式重复
### 互动设计规范 1. **曝光频次**每个知识点输入≥2次输出2-3次单词建议3次
1. 互动总量≥12个对话互动+图片互动+信息互动参考值14-17个中互动+1个核心互动
2. 所有「对话互动」必须同时满足①角色为User ②台词含≥1个知识点 2. **输入→输出顺序**NPC先说输入User后说输出。首次输出前必须至少有1次输入。
3. 互动类型多样化(对话互动/二选二/图片单选/多选/拖拽)
4. 互动沿剧情线均匀分布 3. **均匀分布**:知识点沿剧情线均匀分布,每次出现换语境(不同场景/说话人/情绪)。
5. 核心互动中后段高潮处含≥3个知识点完成后剧情有推进感
4. **词性释义严格**按指定词性和释义使用不可更改。例fun为名词→"is no fun"✅ / "is not fun"❌。
5. **User互动台词有剧情意义**:禁止无意义跟读式重复。
6. **"输出"的定义**:知识点的输出次数 = 该知识点在中互动中出现的次数。每出现一次在中互动含对话互动、图片互动、特殊互动即为一次输出。NPC或User在TL中说话属于输入不计入输出。
7. **多知识点并发输出计数**:如果一个中互动台词中包含多个知识点,则每个命中知识点都独立增加一次输出计数。
- 示例User 说 `I want to **say** I **miss** you.`
- 句型 `I want to say...` → 输出+1
- 单词 `say` → 输出+1
- 单词 `miss` → 输出+1
- 此规则适用于所有中互动类型(对话互动、图片互动、特殊互动)。
### 知识点标注规则 ### 知识点标注规则
在编剧台词E列 在编剧台词列中,知识点词汇用 `**word**` 标记。创作阶段通过此标记追踪知识点的输入/输出位置。
- NPC输入知识点词汇**粗体**标注
- User输出知识点词汇**粗体+红色**(#f54a45)
### 类型列规则 写入飞书表格时,`**` 标记符自动清除为纯文本Feishu Sheets API 不支持单元格内富文本)。
| 类型 | 含义 |
|------|------|
| TL | Timeline演绎每段首行必标 |
| 对话互动 | User台词含知识点 |
| 对话互动-二选二 | 两个选项的对话互动 |
| 图片互动-单选/多选/拖拽 | 图片类互动 |
| 核心互动-听力拖拽/听力选择/口语/阅读/写作 | 高潮互动≥3知识点 |
| (留空) | 同段后续行 |
> 📖 完整格式规范及示例见参考文档 ### 类型列规则4列格式·第1列
剧本仅使用 **3 种类型标签**
| 类型 | 含义 | 说明 |
|------|------|------|
| `TL` | 剧情动画 | 玩家无法操作,纯叙事/表演 |
| `中互动` | 标准互动 | **所有非核心的知识点输出互动**,统一标注为此类型 |
| `核心互动` | 高潮互动 | 中后段高潮处≥3个知识点完成后剧情有推进感 |
> ⚠️ **类型列不再区分中互动的子类别**(如对话互动/图片互动-单选等)。所有知识点输出互动只要不是核心互动,一律标注 `中互动`。多知识点命中同一中互动时,类型列仍只标注一次 `中互动`,但每个知识点独立计数。
---
### 中互动设计体系
虽然类型标注统一为"中互动",但设计中互动时仍需根据教学需求选择合适的互动形式。
#### 一、对话互动(最常见)
**机制:** 知识点直接在 User 的台词中输出。User 按照对话情境,自然说出包含知识点的台词。
**辅助手段:** 可用【插入图】辅助理解(如展示场景画面帮助 User 理解对话语境)。
**表格填写规则:** 仅填写"角色名"和"编剧台词"两列,"剧情描述"列留空(若该行有动作描述则可填写)。
**示例:**
| 类型 | 剧情描述 | 角色名 | 编剧台词 |
|------|---------|--------|---------|
| 中互动 | | Matt | Are you ready to play **baseball**? |
| | | User | Yes! I want to play **baseball**! |
#### 二、图片互动
**铺垫要求:** 虽然图片互动的行本身不需要填写台词,但在该互动开始前,必须有**自然的台词或剧情对话进行铺垫引导**。例如 User 先说 `Let's take out all the **footballs**.` 之后再进入图片选择。
**通用规则:** 在"剧情描述"列中写明需要插入的图片,标注【插入图】,并清晰描述用户需要进行的**选择或操作**。图片互动的行不需要填写"角色名"和"编剧台词"。
##### 2.1 大图选择
从大图中选出所有包含知识点单词的物品。
- **示例场景:** 从装满各种球的球筐中选出所有 **football**
- **铺垫示例:**
```
中互动 | | User | Let's take out all the **footballs**.
中互动 | 【插入图】一个装满各种球的大球筐...请用户从中选出所有的 **football** | |
```
##### 2.2 相似图选择
从几个动作/物品示意图中选出代表知识点的图片。
- **示例场景:** 从 kick、jump、run 的动作示意图中选出代表 **jump** 的图
##### 2.3 顺序选择
按描述的先后顺序选出对应的图片。
#### 三、特殊互动
同图片互动,特殊互动本身不需要台词,但在互动开始前必须有自然的剧情铺垫引导。
##### 3.1 描红
用户按轨迹描摹单词/字母。
- **适用场景:** 学习书写、认识字母形状
- **写法:** 在"剧情描述"中写明描红内容和操作要求
| 类型 | 剧情描述 | 角色名 | 编剧台词 |
|------|---------|--------|---------|
| 中互动 | 【插入图】展示单词 **Hello** 的描红轨迹,请用户用手指沿轨迹描摹 | | |
##### 3.2 拼写
用户拼写单词,常用于填表、发消息、输入密码等剧情情境。
- **适用场景:** 填写登记表、发送短信、输入密码解锁等需要"输入文字"的剧情
- **写法:** 在"剧情描述"中写明拼写内容、情境和操作要求
| 类型 | 剧情描述 | 角色名 | 编剧台词 |
|------|---------|--------|---------|
| 中互动 | 【插入图】手机屏幕上的消息输入框,请用户拼写单词 **phone** 来发送消息 | | |
---
### 核心互动设计体系
核心互动是本 Lesson 的高潮验证环节,位于中后段。具体的**撰写工作由子技能 `core-interaction-writer` 承担**。
#### 本技能对核心互动的职责
你在撰写剧本时,对核心互动只负责以下三件事:
1. **选定子类别:** 从 5 种类型中选择最合适的:
- `听力拖拽` — 听音频,拖拽选项至图中正确位置
- `听力选择` — 听音频,完成图片单选题
- `口语` — 看图回答 NPC 的开放性问题
- `阅读` — 阅读短文/标签,选词答题
- `写作` — 看图拼写单词或句子填空
2. **确定嵌入位置:** 核心互动必须放在中后段剧情高潮处,前期知识点输入至少完成一轮后。
3. **确保前后连贯:**
- 核心互动前:剧情自然铺垫,让 User 准备好迎接挑战
- 核心互动后:完成后剧情有明显推进感(问题解决/获得认可/解锁新区域等)
#### 调用子技能撰写
在步骤3分段撰写到达核心互动位置时调用 `core-interaction-writer` 技能:
- 传入已选定的子类别、本课6个知识点、前后剧情上下文
- 接收符合规范的4列格式核心互动段落
- 嵌入:将返回内容插入剧本对应位置,确保与前后段落衔接流畅
--- ---
@ -138,20 +241,23 @@ User是玩家代入的角色必须是剧情的**主导者和推动者**
- [ ] 场景切换最少化(优先镜头/视角切换) - [ ] 场景切换最少化(优先镜头/视角切换)
- [ ] 因果逻辑闭环(无凭空出现的角色/事件) - [ ] 因果逻辑闭环(无凭空出现的角色/事件)
- [ ] 每段结尾有钩子 - [ ] 每段结尾有钩子
- [ ] 图片/特殊互动前有自然台词铺垫引导
### 第二轮:📐 学习设计师自查 ### 第二轮:📐 学习设计师自查
创意编剧自查全部通过后,以学习设计师身份逐项检查: 创意编剧自查全部通过后,以学习设计师身份逐项检查:
- [ ] 6个知识点全部满足输入≥2次输出2-3次 - [ ] 6个知识点全部满足输入≥2次输出3次(输出 = 在中互动中出现的次数)
- [ ] 首次输出前至少有1次NPC输入顺序正确 - [ ] 首次输出前至少有1次NPC输入顺序正确
- [ ] 知识点沿剧情线均匀分布(无集中轰炸) - [ ] 知识点沿剧情线均匀分布(无集中轰炸)
- [ ] 每个知识点词性/释义使用正确 - [ ] 每个知识点词性/释义使用正确
- [ ] 所有中互动含≥1个知识点 - [ ] 所有中互动含≥1个知识点
- [ ] 全课互动≥14个类型有变化 - [ ] 多知识点并发命中同一中互动时,每个知识点独立进行了输出计数
- [ ] 全课互动≥14个含1个核心互动
- [ ] 核心互动含≥3个知识点位于中后段高潮 - [ ] 核心互动含≥3个知识点位于中后段高潮
- [ ] NPC单句全部≤15词 - [ ] NPC单句全部≤15词
- [ ] 语言整体符合Pre-A1/A1水平 - [ ] 语言整体符合Pre-A1/A1水平
- [ ] 剧本总字数在2000-3500字范围 - [ ] 剧本总字数在2000-3500字范围
- [ ] 类型列仅使用 TL / 中互动 / 核心互动 三种标签
**两轮自查全部通过后才能输出。** 任何未通过的项必须回到对应段落修改,修改后重新跑两轮自查。 **两轮自查全部通过后才能输出。** 任何未通过的项必须回到对应段落修改,修改后重新跑两轮自查。
@ -161,10 +267,14 @@ User是玩家代入的角色必须是剧情的**主导者和推动者**
| # | 错误 | 修正 | | # | 错误 | 修正 |
|---|------|------| |---|------|------|
| 1 | NPC台词超过15词 | 拆成多行短句,每句≤6词 | | 1 | NPC台词超过15词 | 拆成多行短句,每句≤15词 |
| 2 | 知识点词性用错 | 对照本课指定的词性/释义逐词检查 | | 2 | 知识点词性用错 | 对照本课指定的词性/释义逐词检查 |
| 3 | User在NPC输入前输出知识点 | 确保每个知识点首次输出前已有NPC输入 | | 3 | User在NPC输入前输出知识点 | 确保每个知识点首次输出前已有NPC输入 |
| 4 | 中互动不含知识点 | 所有User的中互动必须含≥1个知识点 | | 4 | 中互动不含知识点 | 所有中互动必须含≥1个知识点 |
| 5 | 类型标签使用旧格式(如"对话互动""图片互动-单选" | 统一使用 TL / 中互动 / 核心互动 |
| 6 | 中互动图片类忘记在剧情描述中写【插入图】和操作说明 | 图片互动必须在剧情描述中标注【插入图】并写明选择/操作要求 |
| 7 | 多知识点命中同一个中互动时只算1次输出 | 每个命中知识点独立+1输出计数 |
| 8 | 图片/特殊互动前缺少铺垫台词 | 在图片/特殊互动行之前,加入自然地引出操作的台词 |
--- ---
@ -173,5 +283,5 @@ User是玩家代入的角色必须是剧情的**主导者和推动者**
剧本完成后,使用 `feishu-script-writer` 技能将剧本写入飞书电子表格: 剧本完成后,使用 `feishu-script-writer` 技能将剧本写入飞书电子表格:
- 一个 Unit 一个表格 - 一个 Unit 一个表格
- 每个「起/承/转/合」一个 Sheet - 每个「起/承/转/合」一个 Sheet
- 知识点自动格式化(粗体/红色) - 台词中的 `**` 标记符自动清除为纯文本
- 编剧可在表格中直接编辑和协作 - 编剧可在表格中直接编辑和协作

View File

@ -46,29 +46,50 @@
- *规则:* 首次"输出"前,必须有至少 1 次"输入"。每个知识点的单课总输入次数 ≥ 2次。 - *规则:* 首次"输出"前,必须有至少 1 次"输入"。每个知识点的单课总输入次数 ≥ 2次。
2. **输出 (User常规互动)** 2. **输出 (User常规互动)**
- *规则:* 单课需输出 2-3 次(单词强烈建议 3 次)。 - *规则:* 单课需输出 2-3 次(单词强烈建议 3 次)。
- **输出定义:** 知识点的输出次数 = 该知识点在「中互动」中出现的次数。NPC在TL中说话属于输入不计入输出。
- **多知识点并发输出:** 如果一个中互动台词中包含多个知识点,则每个命中知识点都独立增加一次输出计数。例如 `I want to **say** I **miss** you.` 中,句型 `I want to say...`、单词 `say`、单词 `miss` 各计输出+1。
--- ---
## 三、中互动设计体系 (Standard Interactions) ## 三、中互动设计体系 (Standard Interactions)
中互动是将知识点转化为"游戏体验"的关键。主要分为三类: 中互动是将知识点转化为"游戏体验"的关键。虽然类型标注统一为"中互动",但设计中互动时仍需根据教学需求选择合适的互动形式。
### 🗣️ 对话互动 (Dialogue) ### 🗣️ 对话互动 (Dialogue) — 最常见
- **机制:** User 说出包含知识点的台词来推进剧情。 - **机制:** 知识点直接在 User 的台词中输出。User 按照对话情境,自然说出包含知识点的台词。
- **辅助:** 可使用【插入图】辅助理解。 - **辅助:** 可使用【插入图】辅助理解(如展示场景画面帮助 User 理解对话语境)。
- **表格填写:** 仅填写"角色名"和"编剧台词"两列。若该行有动作描述则可填写"剧情描述"列。
- **侧重点:** 开口表达。 - **侧重点:** 开口表达。
### 🖼️ 图片互动 (Picture) ### 🖼️ 图片互动 (Picture)
- **机制:** User 根据提示操作图片。 **铺垫要求:** 图片互动的行本身不需要填写台词,但在该互动开始前,必须有**自然的台词或剧情对话进行铺垫引导**。例如 User 先说 `Let's take out all the **footballs**.` 之后再进入图片选择。
- **类型:** 单选 / 多选(无序) / 有序多选 / 拖拽 / 涂色 / 轨迹(描红) / 消除(擦除遮挡)。
- **侧重点:** 视觉识别与听/读内容的对应。
### 💬 信息互动 (Information) 所有图片互动类型,在"剧情描述"列中写明需要插入的图片,标注【插入图】,并清晰描述用户的选择或操作。图片互动的行不需要填写"角色名"和"编剧台词"。
- **机制:** 非语音形式的输入。 #### 大图选择
- **场景:** 填表、发短信、输入密码等。 从大图中选出所有包含知识点单词的物品。
- 示例:从装满各种球的球筐中选出所有 **football**
#### 相似图选择
从几个动作/物品示意图中选出代表知识点的图片。
- 示例:从 kick、jump、run 的动作示意图中选出代表 **jump** 的图
#### 顺序选择
按描述的先后顺序选出对应的图片。
### ✏️ 特殊互动 (Special)
**铺垫要求:** 同图片互动,特殊互动本身不需要台词,但在互动开始前必须有自然的剧情铺垫引导。
#### 描红
用户按轨迹描摹单词/字母。在"剧情描述"中写明描红内容和操作要求。
- 示例:展示字母 B 的描红轨迹,请用户用手指沿轨迹描摹
#### 拼写
用户拼写单词,常用于填表、发消息、输入密码等需要"输入文字"的剧情情境。在"剧情描述"中写明拼写内容、情境和操作要求。
- 示例:手机屏幕上的消息输入框,请用户拼写单词 phone 来发送消息
--- ---
@ -76,6 +97,8 @@
每个 Lesson 在中后段必须有一个"核心互动",作为前期学习的成果验证和剧情高潮。**完成后,剧情需获得巨大推进感。** 每个 Lesson 在中后段必须有一个"核心互动",作为前期学习的成果验证和剧情高潮。**完成后,剧情需获得巨大推进感。**
> 📝 **注意:** 核心互动的详细撰写由子技能 `core-interaction-writer` 承担。主技能 `children-english-script-writing` 负责:选定子类别、确定嵌入位置、确保前后剧情连贯。
- **要求:** 必须涉及至少 3 个知识点(全单词,或单词/句子混搭)。 - **要求:** 必须涉及至少 3 个知识点(全单词,或单词/句子混搭)。
### 可选形式 ### 可选形式
@ -109,12 +132,19 @@
## 五、剧本格式规范 (Script Formatting Rules) ## 五、剧本格式规范 (Script Formatting Rules)
剧本表格共包含 **4列**需按照下述4列的内容标准进行标注和撰写,以便于系统导入和开发阅读 剧本表格共包含 **4列**需按照下述4列的内容标准进行标注和撰写。
### 第 1 列:类型 ### 第 1 列:类型
- **标准填法:** `TL`(即玩家无法操作的剧情表演)、`对话互动`、`图片互动`、`信息互动`、`核心互动`。 仅使用 **3 种类型标签**
- **细分互动可指定子类别:** 例如 `图片互动-拖拽``核心互动-阅读理解`
| 类型 | 含义 |
|------|------|
| `TL` | Timeline 演绎,每段首行必标。玩家无法操作的剧情表演。 |
| `中互动` | 所有非核心的知识点输出互动。包含对话互动、图片互动、描红、拼写等各种形式。 |
| `核心互动` | 中后段高潮互动≥3个知识点。核心互动的子类别听力拖拽/口语等)在剧情描述中体现即可。 |
> ⚠️ 不再在类型列中区分中互动的子类别(如"对话互动"、"图片互动-单选"等),统一标注为 `中互动`
### 第 2 列:剧情描述 ### 第 2 列:剧情描述
@ -124,38 +154,54 @@
- `【角色】` = 将会在这张地图上登场的所有角色(英文名) - `【角色】` = 将会在这张地图上登场的所有角色(英文名)
- `【插入图】` / `【全屏插入图】` = 需在表演或教研组件中出现的图片。如果是复用前面出现过的图,则标注`【复用】` - `【插入图】` / `【全屏插入图】` = 需在表演或教研组件中出现的图片。如果是复用前面出现过的图,则标注`【复用】`
- `【spine动画】` = 明确需要提需的重要角色/物件的spine动画 - `【spine动画】` = 明确需要提需的重要角色/物件的spine动画
- `【emoji】` = 建议策划使用的emoji小表情(参看 `business_knowledge/resources/emoji_catalog.md`,不需要额外复杂的动作 - `【emoji】` = 建议策划使用的emoji小表情不需要额外复杂的动作
- `【镜头】` = 明确的运镜处理 - `【镜头】` = 明确的运镜处理
- `【画外音】` = 当前说话的角色spine没有出现在画面中仅出现立绘 - `【画外音】` = 当前说话的角色spine没有出现在画面中仅出现立绘
- `【音效】` = 明确需要提需的音效 - `【音效】` = 明确需要提需的音效
- `【音乐/儿歌】` - `【音乐/儿歌】`
- **中互动(图片类/描红/拼写):** 在此列写明图片内容,标注【插入图】,描述用户的选择或操作。这些行的"角色名"和"编剧台词"留空。
### 第 3 列:角色名 ### 第 3 列:角色名
- 说话角色的 **角色名(英文)** - 说话角色的 **角色名(英文)**
- 对话互动和TL对话行填写图片/描红/拼写类中互动行留空
### 第 4 列:编剧台词 ### 第 4 列:编剧台词
- 具体的 **编剧台词**需要用符合5-9岁非英语母语小朋友的语言水平的单词和句型来撰写。 - 具体的 **编剧台词**需要用符合5-9岁非英语母语小朋友的语言水平的单词和句型来撰写。
- 需要注意,在所有角色台词中,都**不得直呼"User"或"User的名字"**。User的父母称呼User时用"Dear";其他角色则可以使用类似"Hey"或"Kid"这样的男女通用泛指称呼来代替。 - 需要注意,在所有角色台词中,都**不得直呼"User"或"User的名字"**。User的父母称呼User时用"Dear";其他角色则可以使用类似"Hey"或"Kid"这样的男女通用泛指称呼来代替。
- 图片/描红/拼写类中互动行留空
### 📝 剧本表格撰写示例 ### 📝 剧本表格撰写示例
#### 示例1TL + 对话类中互动
| 类型 | 剧情描述 | 角色名 | 编剧台词 | | 类型 | 剧情描述 | 角色名 | 编剧台词 |
|------|---------|--------|---------| |------|---------|--------|---------|
| TL | 【场景】棒球场<br>【角色】User、Matt、Ben、Vicky、Lucy | | | | TL | 【场景】棒球场<br>【角色】User、Matt、Ben、Vicky、Lucy | | |
| | 操场上Matt身着棒球服正叉腰准备开始对User和Ben进行魔鬼训练 | | | | | 操场上Matt身着棒球服正叉腰准备开始对User和Ben进行魔鬼训练 | | |
| | | Matt | Listen carefully. Baseball is a hard game. | | | | Matt | Listen carefully. **Baseball** is a hard game. |
| | | Matt | Today, we must train! | | | | Matt | Today, we must train! |
| | | Matt | Are you ready? | | | | Matt | Are you ready? |
| | | User | I'm ready! | | 中互动 | | User | I'm ready! |
| | | Ben | I'm ready, too. | | | | Ben | I'm ready, too. |
| | | Matt | Good. | | | | Matt | Good. |
| | Matt转向Ben指向一旁的球筐 | | | | | Matt转向Ben指向一旁的球筐 | | |
| | | Matt | Ben, go and get the baseball. | | | | Matt | Ben, go and get the **baseball**. |
| | | Ben | Okay. | | | | Ben | Okay. |
| | Ben向球筐走去User跟上 | | | | | Ben向球筐走去User跟上 | | |
| | | User | Let me help you. |
| | 两人来到球筐前 | | | #### 示例2图片类中互动大图选择含铺垫
| 中互动 | 【插入图】从球筐里的各种球类中挑出所有的棒球baseball | | |
| | | Matt | Get all the baseballs. | | 类型 | 剧情描述 | 角色名 | 编剧台词 |
|------|---------|--------|---------|
| | Ben和User来到球筐前 | | |
| | | Ben | Look! So many balls! |
| 中互动 | | User | Let's take out all the **baseballs**. |
| 中互动 | 【插入图】一个装满各种球的大球筐含baseball、football、basketball、tennis ball等请用户从中选出所有的 **baseball** | | |
#### 示例3图片类中互动相似图选择
| 类型 | 剧情描述 | 角色名 | 编剧台词 |
|------|---------|--------|---------|
| 中互动 | 【插入图】三张动作示意图kick踢球、jump跳跃、run跑步请用户选出代表 **jump** 的图片 | | |

View File

@ -0,0 +1,209 @@
---
name: core-interaction-writer
description: >
儿童互动英语剧本 — 核心互动撰写专用技能。负责根据选定的核心互动子类别、
本课知识点和前后剧情上下文撰写符合规范的4列格式核心互动段落类型剧情描述角色名编剧台词
由 children-english-script-writing 技能在分段撰写时调用。
---
# 核心互动撰写技能 (Core Interaction Writer)
## 概述
本技能是 `children-english-script-writing` 的子技能,**专门负责撰写核心互动Core Interaction的详细内容**。
- **定位:** 你只负责写核心互动那一个段落,不管其他内容。
- **调用方:** `children-english-script-writing` 会在到达核心互动位置时调用你。
- **调用方已做好的事:** 选定了子类别、确定了嵌入位置、提供了前后剧情上下文。
---
## 输入约定
调用方会传入以下信息:
| 输入项 | 说明 |
|--------|------|
| `sub_type` | 核心互动子类别:`听力拖拽` / `听力选择` / `口语` / `阅读` / `写作` |
| `knowledge_points` | 本课6个知识点4个单词/词组 + 2个句型 |
| `core_kps` | 本次核心互动需涵盖的知识点≥3个调用方已选定 |
| `context_before` | 核心互动前的剧情上下文(最后几行) |
| `context_after` | 核心互动后的剧情方向(接下来要发生什么) |
| `scene_info` | 当前场景、在场角色等信息 |
| `npc_character` | 主导核心互动的NPC角色如有口语类必需 |
---
## 五种核心互动类型写作规范
### 1. 听力拖拽 (Listening Drag)
**玩法:** 看大图 → 听长对话音频 → 将 n 个选项拖至大图正确位置
**使用情境:** 需要 User 将物品放置到对应位置,或在图片上标注对应信息。
**写作要求:**
- 听力内容为 **3轮独白或对话**
- 每轮对话需包含指引 User 进行拖拽行动的**关键信息**
- 关键信息必须与教学知识点相关
- 设计 n 个可拖拽选项n ≥ 覆盖的知识点数)
**表格填写规则:**
| 类型 | 剧情描述 | 角色名 | 编剧台词 |
|------|---------|--------|---------|
| 核心互动 | 【插入图】大场景图(描述需要拖拽标注的完整画面),包含以下可拖拽选项:[选项1]、[选项2]、[选项3]... | | |
| | 第1轮对话/独白 — (描述说话情境) | [NPC名] | 包含知识点的第一轮台词... |
| | | [NPC名2/User] | 回应台词... |
| | 第2轮对话/独白 — (描述情境) | [NPC名] | 包含知识点的第二轮台词... |
| | 第3轮对话/独白 — (描述情境) | [NPC名] | 包含知识点的第三轮台词... |
**格式要点:**
- 类型列首行标注 `核心互动-听力拖拽`,后续行留空
- 剧情描述首行必须标明【插入图】和全部可拖拽选项
- 必须覆盖 ≥3 个知识点
---
### 2. 听力选择 (Listening Choice)
**玩法:** 听长对话音频 → 完成 3 道图片单选题
**使用情境:** 需要 User 从三张图片中选出一个正确图片,来回答听力音频中的问题。
**写作要求:**
- 听力内容为 **3轮独白或对话**
- 每轮提供 **3 个选项3张图**
- 每轮正确答案必须与教学知识点相关
- 对话中需包含指引 User 进行选择的关键信息
**表格填写规则:**
| 类型 | 剧情描述 | 角色名 | 编剧台词 |
|------|---------|--------|---------|
| 核心互动 | 第1题 — 【插入图】三张选项图图A:xxx / 图B:xxx / 图C:xxx正确答案图[B] | | |
| | | [NPC名] | 包含知识点的提问... |
| | | [NPC名2] | 补充信息台词... |
| | 第2题 — 【插入图】三张选项图图A:xxx / 图B:xxx / 图C:xxx正确答案图[A] | | |
| | | [NPC名] | 包含知识点的提问... |
| | 第3题 — 【插入图】三张选项图图A:xxx / 图B:xxx / 图C:xxx正确答案图[C] | | |
| | | [NPC名] | 包含知识点的提问... |
**格式要点:**
- 类型列首行标注 `核心互动-听力选择`,后续行留空
- 每道题一行剧情描述,标注【插入图】、三选项内容和正确答案(供开发参考,不出现在用户界面)
- 必须覆盖 ≥3 个知识点
---
### 3. 口语 (Speaking)
**玩法:** 看大图 → User 与 NPC 1对1看图回答问题 → 图片随对话高亮提示
**使用情境:** 需要 User 看图,运用口语回答开放性的问题。
**写作要求:**
- 只能由**单一NPC角色**提问
- 问题为开放型基础提问What color/food...),描述 1-2 个细节,无复杂逻辑
- 共 **3 轮**问答
- 需引导 User 使用教学知识点回答问题
- 每轮提问后User 台词为包含知识点的口语输出
**表格填写规则:**
| 类型 | 剧情描述 | 角色名 | 编剧台词 |
|------|---------|--------|---------|
| 核心互动 | 【插入图】大图描述场景画面图中需包含3轮提问相关的视觉元素 | | |
| | 第1轮 — 图片高亮[某区域]NPC指向该区域提问 | [NPC名] | 开放型基础提问关联知识点1... |
| | | User | 包含知识点1的口语回答 |
| | 第2轮 — 图片高亮[另一区域]NPC指向该区域提问 | [NPC名] | 开放型基础提问关联知识点2... |
| | | User | 包含知识点2的口语回答 |
| | 第3轮 — 图片高亮[另一区域]NPC指向该区域提问 | [NPC名] | 开放型基础提问关联知识点3... |
| | | User | 包含知识点3的口语回答 |
**格式要点:**
- 类型列首行标注 `核心互动-口语`,后续行留空
- 必须覆盖 ≥3 个知识点
- NPC 提问必须为同一角色
- 每轮描述图片高亮区域,帮助开发实现视觉提示
---
### 4. 阅读 (Reading)
**玩法:** 阅读短说明文/图文标签/连续短文 → 选词答题
**使用情境:** 需要 User 阅读文字后,选出关键词来回答问题。
**写作要求:**
- 句子 ≤10 词,连续文本 ≤10 句
- 仅使用简单句 + and
- 共 **3 道题**
- 正确选项中必须包含教学知识点
**表格填写规则:**
| 类型 | 剧情描述 | 角色名 | 编剧台词 |
|------|---------|--------|---------|
| 核心互动 | 【插入图】阅读材料(短文/标签/说明文),内容如下: | | |
| | (描述阅读材料的内容,标注文中包含的知识点) | | |
| | 第1题 — 选出关键词完成句子/回答问题 | | |
| | 第2题 — 选出关键词完成句子/回答问题 | | |
| | 第3题 — 选出关键词完成句子/回答问题 | | |
**格式要点:**
- 类型列首行标注 `核心互动-阅读`,后续行留空
- 阅读材料文字写在剧情描述中
- 每道题覆盖 ≥1 个知识点
---
### 5. 写作 (Writing)
**玩法:** 看图描写单词(自由拼写)或句子填空
**使用情境:** 需要 User 补全图片上的单词/句子信息。
**写作要求:**
- 拼写或填空的内容必须是教学知识点
- 设计有剧情意义的写作场景(填表、留言、标签等)
- 共 **3 处**需要补全的内容
**表格填写规则:**
| 类型 | 剧情描述 | 角色名 | 编剧台词 |
|------|---------|--------|---------|
| 核心互动 | 【插入图】写作场景大图(描述需要填空的表格/便签/标签等的完整画面) | | |
| | 第1处 — 第一个待填空位置,对应的提示/图片线索,待拼写单词 [知识点单词/词组] | | |
| | 第2处 — 第二个待填空位置,对应的提示/图片线索,待拼写单词 [知识点单词/词组] | | |
| | 第3处 — 第三个待填空位置,对应的提示/图片线索,待拼写单词 [知识点单词/词组] | | |
**格式要点:**
- 类型列首行标注 `核心互动-写作`,后续行留空
- 每处填空一行剧情描述,标注填空位置、提示/图片线索和待拼写单词
- 必须覆盖 ≥3 个知识点
- 填空的正确答案必须为知识点单词/词组
---
## 输出后自检清单
核心互动段落写完后,逐项检查:
- [ ] 类型列首行标注 `核心互动-(子类型)`,其余行留空
- [ ] 覆盖了 ≥3 个知识点(调用方指定的 core_kps 全覆盖)
- [ ] 符合对应子类别的写作要求(轮数/题数正确NPC角色正确
- [ ] 剧情描述中正确标注了【插入图】和选项/操作说明
- [ ] NPC 单句全部 ≤15 词
- [ ] 知识点的词性/释义与指定一致
- [ ] 与传入的 context_before 衔接自然
- [ ] 为 context_after 做好了剧情铺垫(完成后有明显推进感)
- [ ] 难度适合 Pre-A1/A1 水平
---
## 协作约定
1. **输入缺什么就问:** 如果调用方传入的信息不足以完成撰写(如缺 NPC 角色、场景信息不全),回问调用方补充。
2. **输出即嵌入:** 输出的 4 列格式段落可直接嵌入主剧本,不要附加解释性文字。
3. **不越界:** 不修改调用方传入的 sub_type 选择,不自行增减 core_kps。

View File

@ -1,8 +1,7 @@
--- ---
name: feishu-script-writer name: feishu-script-writer
description: > description: >
将儿童互动英语剧本写入飞书电子表格支持8列标准格式、知识点富文本标注粗体/红色)、 将儿童互动英语剧本写入飞书电子表格支持4列标准格式、分段续写和新建Sheet。
分段续写和新建Sheet。替代此前在对话框中发送表格的交付方式。
**触发场景:** **触发场景:**
(1) 剧本撰写完成需要输出到飞书表格供编剧审阅 (1) 剧本撰写完成需要输出到飞书表格供编剧审阅
(2) 需要在已有表格中续写新的「起/承/转/合」段落 (2) 需要在已有表格中续写新的「起/承/转/合」段落
@ -12,10 +11,13 @@ description: >
# 飞书剧本表格输出技能 # 飞书剧本表格输出技能
## 概述 ## 概述
将儿童互动英语剧本以8列标准格式写入飞书电子表格支持知识点富文本标注实现与编剧的实时协作编辑。 将儿童互动英语剧本以4列纯文本格式写入飞书电子表格。所有台词均为纯文本。
创建表格时自动设置权限为「组织内任何人可通过链接编辑」。
写入数据时自动设置表头样式(粗体+灰底)。
## 工具 ## 工具
使用 `scripts/feishu_sheet_writer.py` Python 脚本,通过飞书 Sheets V2 API + Bot 身份操作。 使用 `scripts/feishu_sheet_writer.py` Python 脚本,通过飞书 Sheets V2/V3 API + Bot 身份操作。
--- ---
@ -26,13 +28,13 @@ description: >
```bash ```bash
python3 scripts/feishu_sheet_writer.py create --title "U22 剧本" --credential xiaobian python3 scripts/feishu_sheet_writer.py create --title "U22 剧本" --credential xiaobian
``` ```
返回 `{"token": "...", "url": "...", "title": "..."}`,记录 token 和 url。 返回 `{"token": "***", "url": "...", "title": "..."}`,记录 token 和 url。
### Step 2创建 Sheet每段剧本一个 Sheet ### Step 2创建 Sheet每段剧本一个 Sheet
为每个「起/承/转/合」创建独立 Sheet方便编剧按段落审阅 为每个「起/承/转/合」创建独立 Sheet方便编剧按段落审阅
```bash ```bash
python3 scripts/feishu_sheet_writer.py create-sheet \ python3 scripts/feishu_sheet_writer.py create-sheet \
--token <spreadsheet_token> --title "U22_L1_起" --credential xiaobian --token *** --title "U22_L1_起" --credential xiaobian
``` ```
返回 `{"sheet_id": "...", "title": "..."}`,记录 sheet_id。 返回 `{"sheet_id": "...", "title": "..."}`,记录 sheet_id。
@ -40,7 +42,7 @@ python3 scripts/feishu_sheet_writer.py create-sheet \
将剧本数据保存为临时 JSON 文件,然后写入: 将剧本数据保存为临时 JSON 文件,然后写入:
```bash ```bash
python3 scripts/feishu_sheet_writer.py write \ python3 scripts/feishu_sheet_writer.py write \
--token <spreadsheet_token> --sheet <sheet_id> \ --token *** --sheet <sheet_id> \
--data /tmp/script_data.json --credential xiaobian --data /tmp/script_data.json --credential xiaobian
``` ```
@ -48,7 +50,7 @@ python3 scripts/feishu_sheet_writer.py write \
在已有 Sheet 中续写新的桥段: 在已有 Sheet 中续写新的桥段:
```bash ```bash
python3 scripts/feishu_sheet_writer.py append \ python3 scripts/feishu_sheet_writer.py append \
--token <spreadsheet_token> --sheet <sheet_id> \ --token *** --sheet <sheet_id> \
--data /tmp/new_data.json --start-row <next_row> --credential xiaobian --data /tmp/new_data.json --start-row <next_row> --credential xiaobian
``` ```
@ -56,54 +58,39 @@ python3 scripts/feishu_sheet_writer.py append \
## 数据格式JSON ## 数据格式JSON
所有单元格均为纯文本字符串。
```json ```json
{ {
"knowledge_points": ["afternoon", "adventure", "store", "add", "double", "sweet"], "knowledge_points": ["afternoon", "adventure", "store", "add", "double", "sweet"],
"rows": [ "rows": [
["类型", "配置信息", "剧情描述", "角色名", "编剧台词", "英文台词", "组件配置", "知识点"], ["类型", "剧情描述", "角色名", "编剧台词"],
["TL", "", "【场景】沙漠镇公交站\n【角色】User、Vicky、Peter、Eva", "", "", "", "", ""], ["TL", "【场景】客厅\n【角色】User、Dad", "", ""],
["", "", "Dad窝在扶手椅里。\n【emoji】Dad😌", "", "", "", "", ""], ["", "Dad窝在扶手椅里。\n【emoji】Dad😌", "", ""],
["", "", "", "Dad", "We have the whole **afternoon**, dear.", "", "", ""], ["", "", "Dad", "We have the whole afternoon, dear."],
["对话互动", "", "", "User", {"text": "Can we read the space **adventure**?", "is_user": true}, "", "", ""] ["中互动", "", "User", "Can we read the space adventure?"],
["中互动", "【插入图】球筐图片,请用户选出所有的 football", "", ""],
["核心互动", "【插入图】大场景图,可拖拽选项:[xxx]、[xxx]、[xxx]", "", ""]
] ]
} }
``` ```
### 格式说明
- **前4列类型/剧情描述/角色名/编剧台词)**:编剧填写
- **后4列配置信息/英文台词/组件配置/知识点)**:预留空列
- **每行代表一个剧本单元格**
- **普通文本**:直接用字符串,知识点用 `**文字**` 标记
- **User台词**:使用对象格式 `{"text": "...", "is_user": true}` 标记知识点为粗体+红色(#f54a45)
- **NPC台词**:知识点自动识别为粗体(普通文本中的 `**文字**` 会自动转为粗体)
### 知识点自动格式化规则
1. NPC台词D列非User知识点 → **粗体**
2. User台词D列=UserE列含知识点知识点 → **粗体+红色(#f54a45)**
3. C列剧情描述纯文本不做知识点标注
--- ---
## 表格结构规范 ## 表格结构规范
| 列序 | 列名 | 填写人 | 说明 | | 列序 | 列名 | 填写人 | 说明 |
|------|------|--------|------| |------|------|--------|------|
| A | 类型 | 编剧 | TL / 对话互动 / 图片互动-单选 等 | | 1 | 类型 | 编剧 | TL / 中互动 / 核心互动 |
| B | 配置信息 | 保留 | 编剧不填 | | 2 | 剧情描述 | 编剧 | 场景/动作/音效/emoji标注/【插入图】 |
| C | 剧情描述 | 编剧 | 场景/动作/音效/emoji标注 | | 3 | 角色名 | 编剧 | 英文角色名User / Dad 等),图片类互动留空 |
| D | 角色名 | 编剧 | 英文角色名User / Dad 等) | | 4 | 编剧台词 | 编剧 | 英文台词(纯文本),图片类互动留空 |
| E | 编剧台词 | 编剧 | 英文台词,知识点粗体/红色 |
| F | 英文台词 | 保留 | 编剧不填 |
| G | 组件配置 | 保留 | 编剧不填 |
| H | 知识点 | 保留 | 编剧不填 |
--- ---
## 协作模式 ## 协作模式
1. **小编写入**:剧本完成后写入表格,知识点已做富文本标注 1. **小编写入**:剧本完成后写入电子表格,编剧可直接审阅
2. **编剧编辑**:编剧直接在表格中修改台词、调整剧情描述 2. **编剧编辑**:编剧直接在表格中修改台词、调整剧情描述
3. **小编续写**:使用 append 模式追加新内容,不覆盖编剧的修改 3. **小编续写**:使用 append 模式追加新内容,不覆盖编剧的修改
4. **版本追踪**:每个 Sheet 独立,起承转合各自演进 4. **版本追踪**:每个 Sheet 独立,起承转合各自演进

173
tmp/format_rich_text.py Normal file
View File

@ -0,0 +1,173 @@
#!/usr/bin/env python3
"""
U21 L4 剧本 - 知识点标粗+红输出
格式: type: "text" + textFormatRuns已验证可行
- 中互动/核心互动 知识点标粗+红色输出
- TL行 知识点标粗输入
"""
import json, re, requests, os, sys
CRED_DIR = "/root/.openclaw/credentials"
BASE_URL = "https://open.feishu.cn/open-apis"
KPS_WORDS = ["flat", "hall", "room", "know"]
KPS_PHRASES = ["do you know", "what is in"]
def get_token(name="xiaobian"):
config_path = os.path.join(CRED_DIR, name, "config.json")
with open(config_path) as f:
config = json.load(f)
app_id = config["apps"][0]["appId"]
app_secret = config["apps"][0]["appSecret"]
resp = requests.post(f"{BASE_URL}/auth/v3/tenant_access_token/internal",
json={"app_id": app_id, "app_secret": app_secret}, timeout=10)
return resp.json()["tenant_access_token"]
def parse_kps(text):
"""Find all KP spans. Returns sorted non-overlapping (start, end) list."""
lower = text.lower()
spans = []
# Phrase KPs first (take precedence)
for phrase in KPS_PHRASES:
idx = 0
while True:
idx = lower.find(phrase, idx)
if idx == -1:
break
spans.append((idx, idx + len(phrase)))
idx += len(phrase)
# Word KPs (word boundary match)
for word in KPS_WORDS:
for m in re.finditer(r'\b' + re.escape(word) + r'\b', text, re.IGNORECASE):
spans.append((m.start(), m.end()))
# Sort and deduplicate overlaps
spans.sort(key=lambda x: x[0])
result = []
last_end = 0
for s, e in spans:
if s >= last_end:
result.append((s, e))
last_end = e
return result
def build_rich_text_cell(text, is_output):
"""Build a rich text cell using type:text + textFormatRuns."""
spans = parse_kps(text)
if not spans:
return text
format_runs = []
pos = 0
for i, (start, end) in enumerate(spans):
if pos < start:
format_runs.append({"format": {}, "startIndex": pos})
f = {"bold": True}
if is_output:
f["foreColor"] = {"red": 1.0, "green": 0.0, "blue": 0.0, "alpha": 0.0}
format_runs.append({"format": f, "startIndex": start})
pos = end
if pos < len(text):
format_runs.append({"format": {}, "startIndex": pos})
# Always start with a run at index 0
if not format_runs or format_runs[0]["startIndex"] != 0:
format_runs.insert(0, {"format": {}, "startIndex": 0})
return {
"type": "text",
"text": text,
"textFormatRuns": format_runs
}
def main():
token = get_token()
TKN = "NiajsPDjXhQHn8tURCeck8zlndd"
SHT = "3O2sso"
with open("tmp/u21_l4_merged.json", "r", encoding="utf-8") as f:
data = json.load(f)
rows = data["rows"]
# Determine type for each row (blank inherits from above)
current_type = ""
row_types = []
for row in rows:
rt = row[0] if len(row) > 0 and row[0] else ""
if rt in ("TL", "中互动", "核心互动"):
current_type = rt
row_types.append(current_type)
values = []
format_count = 0
for ri, row in enumerate(rows):
out_row = []
is_output = row_types[ri] in ("中互动", "核心互动")
for ci, cell in enumerate(row):
if ci == 3 and isinstance(cell, str) and cell.strip():
formatted = build_rich_text_cell(cell, is_output)
out_row.append(formatted)
if isinstance(formatted, dict):
format_count += 1
elif ci == 3 and isinstance(cell, str):
out_row.append(cell)
else:
out_row.append(cell if cell else "")
values.append(out_row)
num_rows = len(values)
num_cols = 4
col_letter = "D"
print(f"Writing {num_rows} rows, {format_count} formatted cells...")
resp = requests.put(
f"{BASE_URL}/sheets/v2/spreadsheets/{TKN}/values",
headers={
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
},
json={
"valueRange": {
"range": f"{SHT}!A1:{col_letter}{num_rows}",
"values": values,
},
},
timeout=60,
)
result = resp.json()
if result.get("code") != 0:
print(f"❌ Write failed: {result}", file=sys.stderr)
sys.exit(1)
print(json.dumps({"status": "ok", "rows": num_rows, "columns": num_cols, "formatted": format_count}))
# Set header style
sr = requests.put(
f"{BASE_URL}/sheets/v2/spreadsheets/{TKN}/style",
headers={
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
},
json={
"appendStyle": {
"range": f"{SHT}!A1:D1",
"style": {"font": {"bold": True}, "backColor": "#e8e8e8"},
},
},
timeout=10,
)
print(json.dumps({"style_status": "ok"}))
if __name__ == "__main__":
main()

88
tmp/test_rich_text.py Normal file
View File

@ -0,0 +1,88 @@
"""
Test script: write a single cell with rich text to feishu sheet
"""
import json, requests, os
CRED_DIR = "/root/.openclaw/credentials"
BASE_URL = "https://open.feishu.cn/open-apis"
def get_token(name="xiaobian"):
config_path = os.path.join(CRED_DIR, name, "config.json")
with open(config_path) as f:
config = json.load(f)
app_id = config["apps"][0]["appId"]
app_secret = config["apps"][0]["appSecret"]
resp = requests.post(
f"{BASE_URL}/auth/v3/tenant_access_token/internal",
json={"app_id": app_id, "app_secret": app_secret},
timeout=10,
)
return resp.json()["tenant_access_token"]
token = get_token()
spreadsheet_token = "NiajsPDjXhQHn8tURCeck8zlndd"
# Try textElements format for rich text
cell_data = {
"textElements": [
{
"textElementType": "TEXT_RUN",
"textRun": {
"text": "This is ",
"textElementStyle": {}
}
},
{
"textElementType": "TEXT_RUN",
"textRun": {
"text": "BOLD RED",
"textElementStyle": {
"bold": True,
"textColor": {
"red": 1.0,
"green": 0.0,
"blue": 0.0,
"alpha": 0.0
}
}
}
},
{
"textElementType": "TEXT_RUN",
"textRun": {
"text": " text!",
"textElementStyle": {}
}
}
]
}
values = [
["TEST RICH TEXT", cell_data, "", ""]
]
resp = requests.put(
f"{BASE_URL}/sheets/v2/spreadsheets/{spreadsheet_token}/values",
headers={
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
},
json={
"valueRange": {
"range": "3O2sso!A1:D1",
"values": values,
},
},
timeout=30,
)
result = resp.json()
print(json.dumps(result, indent=2, ensure_ascii=False))
# Also read back to see format
read_resp = requests.get(
f"{BASE_URL}/sheets/v2/spreadsheets/{spreadsheet_token}/values/3O2sso!A1:D1",
headers={"Authorization": f"Bearer {token}"},
timeout=10,
)
print("\n--- READ BACK ---")
print(json.dumps(read_resp.json(), indent=2, ensure_ascii=False))

420
tmp/u21_l4_cheng.json Normal file
View File

@ -0,0 +1,420 @@
{
"knowledge_points": [
"flat",
"hall",
"room",
"know",
"Do you know...",
"What is in..."
],
"rows": [
[
"类型",
"剧情描述",
"角色名",
"编剧台词"
],
[
"TL",
"【场景】开拓者公寓走廊深处\n【角色】User、Lin、Jay",
"",
""
],
[
"",
"User沿着走廊看照片越走越深。走廊灯光渐暗。",
"",
""
],
[
"",
"突然User看到走廊尽头有两个鬼祟的身影——背对着User正凑在一起嘀嘀咕咕",
"",
""
],
[
"",
"",
"User",
"Huh? Who is that?"
],
[
"",
"User快步追上去拍了其中一个人的肩膀",
"",
""
],
[
"",
"Jay吓得跳起来差点撞到Lin",
"",
""
],
[
"",
"",
"Jay",
"AAH!"
],
[
"",
"",
"Lin",
"Shh!! Shut up!"
],
[
"",
"User认出了他们",
"",
""
],
[
"",
"",
"User",
"Lin? Jay?"
],
[
"",
"",
"User",
"What are you doing here?"
],
[
"",
"Lin别过脸支支吾吾",
"",
""
],
[
"",
"",
"Lin",
"Nothing."
],
[
"",
"Jay忍不住开口",
"",
""
],
[
"",
"",
"Jay",
"We want to know!"
],
[
"",
"",
"Jay",
"Pioneer stories! So cool!"
],
[
"",
"Lin一巴掌捂住Jay的嘴",
"",
""
],
[
"",
"",
"Lin",
"Shut up, Jay!"
],
[
"",
"",
"Lin",
"Let's go. Now."
],
[
"",
"Lin拽着Jay往走廊尽头跑",
"",
""
],
[
"",
"【音效】咔嚓——机关触发声",
"",
""
],
[
"",
"走廊尽头的门突然关闭,一块屏幕亮起",
"",
""
],
[
"",
"",
"Lin",
"...What?!"
],
[
"",
"",
"Jay",
"Uh oh."
],
[
"",
"屏幕上显示文字提示",
"",
""
],
[
"",
"【插入图】门上屏幕You are in a room. Find the code. Go back to the hall.",
"",
""
],
[
"中互动",
"User读出屏幕上的信息",
"User",
"We are in a room!"
],
[
"TL",
"",
"Lin",
"No no no..."
],
[
"",
"",
"Jay",
"Ha! Free tour!"
],
[
"",
"",
"Lin",
"This is NOT a tour!"
],
[
"",
"屏幕下方出现一行小字提示",
"",
""
],
[
"",
"【插入图】屏幕下方提示The code is: The Most Important Day",
"",
""
],
[
"",
"",
"User",
"The most important day..."
],
[
"",
"",
"Jay",
"What day?"
],
[
"",
"",
"Lin",
"I don't know!"
],
[
"",
"User转身质问速猴",
"",
""
],
[
"",
"",
"User",
"This is YOUR fault!"
],
[
"",
"",
"Lin",
"OUR fault?!"
],
[
"",
"",
"Lin",
"You chased us!"
],
[
"",
"",
"Jay",
"Yeah! You scared me!"
],
[
"",
"User皱眉Lin也瞪着User气氛僵住",
"",
""
],
[
"",
"沉默几秒。Jay先扛不住挠头",
"",
""
],
[
"",
"",
"Jay",
"So... what now?"
],
[
"",
"",
"Lin",
"We find the code. Alone."
],
[
"",
"Lin拽着Jay转身要自己找走了两步撞上死胡同的墙壁",
"",
""
],
[
"",
"",
"Lin",
"...Okay."
],
[
"",
"",
"Lin",
"Fine. Together."
],
[
"",
"",
"Jay",
"Team!"
],
[
"",
"Jay伸出手要握手User犹豫了一下最终和他碰了碰拳",
"",
""
],
[
"",
"Jay从口袋里掏出一张皱巴巴的纸——公寓平面图",
"",
""
],
[
"",
"",
"User",
"What is that?"
],
[
"",
"",
"Jay",
"A map!"
],
[
"",
"",
"Jay",
"This flat is cool!"
],
[
"",
"Jay展开平面图指指点点",
"",
""
],
[
"",
"",
"Jay",
"Pioneers made this flat."
],
[
"",
"",
"Jay",
"They bring rooms from Vala!"
],
[
"",
"",
"Lin",
"Each room has a story."
],
[
"",
"",
"Lin",
"Many owners."
],
[
"",
"【插入图】平面图特写——上面标注着 Hall、Room 1、Room 2... Room 7 等字样,风格手绘",
"",
""
],
[
"中互动",
"",
"User",
"What is in the hall?"
],
[
"中互动",
"【插入图】平面图互动——请用户点击/指认平面图上 hall、room、flat 对应的区域",
"",
""
],
[
"中互动",
"",
"User",
"What is in this room?"
],
[
"中互动",
"User看完平面图感叹公寓之大",
"User",
"This flat is so big!"
],
[
"TL",
"Jay指着平面图上他们当前所在的room",
"",
""
],
[
"",
"",
"Jay",
"We are here!"
],
[
"",
"",
"Lin",
"So find the code."
],
[
"",
"",
"Lin",
"In THIS room."
]
]
}

198
tmp/u21_l4_he.json Normal file
View File

@ -0,0 +1,198 @@
{
"knowledge_points": [
"flat",
"hall",
"room",
"know",
"Do you know...",
"What is in..."
],
"rows": [
[
"类型",
"剧情描述",
"角色名",
"编剧台词"
],
[
"TL",
"【场景】开拓者公寓走廊·门厅方向\n【角色】User、Lin、Jay",
"",
""
],
[
"",
"门打开走廊灯光恢复。User走出房间Lin和Jay跟在后面。",
"",
""
],
[
"",
"Lin拽着Jay落后几步压低声音",
"",
""
],
[
"",
"",
"Lin",
"Did you see that?"
],
[
"",
"",
"Jay",
"Yeah! I know! Big stuff!"
],
[
"",
"",
"Lin",
"Shh! Write it down!"
],
[
"",
"",
"Jay",
"Write what down?"
],
[
"",
"",
"Lin",
"The map! The rooms!"
],
[
"",
"",
"Lin",
"Everything!"
],
[
"",
"Jay掏出一支笔在手心乱画",
"",
""
],
[
"",
"",
"Jay",
"Got it! I think..."
],
[
"",
"User回头看他们眉头一皱",
"",
""
],
[
"",
"",
"User",
"What are you doing?"
],
[
"",
"",
"Lin",
"Nothing!"
],
[
"",
"",
"Jay",
"Nothing!"
],
[
"",
"两人挤出尴尬的笑快步从User身旁溜走往出口跑去",
"",
""
],
[
"",
"",
"Lin",
"Bye!"
],
[
"",
"",
"Jay",
"Great flat! Bye bye!"
],
[
"",
"User看着他们离去的背影越想越不对劲",
"",
""
],
[
"",
"",
"User",
"Hmm..."
],
[
"",
"",
"User",
"What do they want?"
],
[
"",
"User决定把今天的怀疑写下来",
"",
""
],
[
"",
"【插入图】User掏出一个小笔记本翻开空白页准备记录",
"",
""
],
[
"核心互动",
"【插入图】笔记本页面,标题 My Notes。页面上有3处填空左侧有图片提示。",
"",
""
],
[
"",
"第1处——左侧图片提示开拓者公寓外观。句子填空Lin and Jay came to the ___. 待拼写单词flat",
"",
""
],
[
"",
"第2处——左侧图片提示被锁的房间门。句子填空We were in a ___. 待拼写单词room",
"",
""
],
[
"",
"第3处——左侧图片提示Lin和Jay窃窃私语的剪影。句子填空They ___ something. 待拼写单词know",
"",
""
],
[
"TL",
"User合上笔记本表情严肃",
"",
""
],
[
"",
"",
"User",
"I don't trust them."
],
[
"",
"User看向门厅方向攥紧笔记本眼神坚定",
"",
""
]
]
}

1194
tmp/u21_l4_merged.json Normal file

File diff suppressed because it is too large Load Diff

48
tmp/u21_l4_qi.json Normal file
View File

@ -0,0 +1,48 @@
{
"knowledge_points": ["flat", "hall", "room", "know", "Do you know...", "What is in..."],
"rows": [
["类型", "剧情描述", "角色名", "编剧台词"],
["TL", "【场景】开拓者公寓外观\n【角色】User、Sally", "", ""],
["", "Sally带着User来到一栋气派的建筑前门上有Pioneer标志。Sally双手叉腰满意地看着这栋楼。", "", ""],
["", "", "Sally", "Here!"],
["", "", "Sally", "This is our flat."],
["", "", "Sally", "A Pioneer flat."],
["", "User抬头打量这栋公寓眼睛亮了", "", ""],
["", "", "User", "Wow!"],
["中互动", "", "User", "A big flat!"],
["TL", "Sally推开大门示意User进来", "", ""],
["", "", "Sally", "Come in."],
["", "两人走进门厅,墙上挂满了各种人物的照片,光线温暖", "", ""],
["", "", "Sally", "This is the hall."],
["", "Sally指向照片墙语气骄傲", "", ""],
["", "", "Sally", "All Pioneers."],
["", "", "Sally", "The best ones."],
["", "User走近照片墙看到了Sally的照片、Logi的照片、Rebecca的照片", "", ""],
["", "", "User", "I see you!"],
["", "", "Sally", "Ha. Yes."],
["", "Sally指向另一张照片带着考校的语气", "", ""],
["", "", "Sally", "Do you know him?"],
["", "【插入图】照片墙特写——Tom的照片穿着年轻时的Pioneer装备", "", ""],
["中互动", "User仔细看了看惊讶地认出来了", "User", "I know him! Tom!"],
["TL", "", "User", "Tom is a Pioneer?!"],
["", "", "Sally", "Yes. A good one."],
["", "Sally又指向另一张照片语气变柔和了一点", "", ""],
["", "", "Sally", "Do you know them?"],
["", "【插入图】照片墙特写——Clare和Fred的合影两人穿着Pioneer制服笑容灿烂", "", ""],
["", "User愣住了眼睛瞪大 😳", "", ""],
["", "", "User", "Mum! Dad!"],
["中互动", "", "User", "Do you know my mum and dad?"],
["TL", "", "Sally", "Of course."],
["", "", "Sally", "Top Pioneers."],
["", "", "Sally", "The best team."],
["", "User盯着父母的照片表情复杂——骄傲又思念 🥹", "", ""],
["", "", "User", "I miss them..."],
["", "", "Sally", "They are brave."],
["", "", "Sally", "Be proud, kid."],
["", "User深吸一口气看着走廊深处的更多照片充满好奇", "", ""],
["中互动", "", "User", "I want to know more!"],
["TL", "Sally留在门厅冲User挥手", "", ""],
["", "", "Sally", "Go. Look around."],
["", "User独自沿走廊前行经过更多照片", "", ""]
]
}

360
tmp/u21_l4_zhuan.json Normal file
View File

@ -0,0 +1,360 @@
{
"knowledge_points": [
"flat",
"hall",
"room",
"know",
"Do you know...",
"What is in..."
],
"rows": [
[
"类型",
"剧情描述",
"角色名",
"编剧台词"
],
[
"TL",
"【场景】开拓者公寓·被锁房间内部\n【角色】User、Lin、Jay",
"",
""
],
[
"",
"三人开始打量这间房间。墙上有各种物品:旧照片、地图、奖章、工具箱。",
"",
""
],
[
"",
"",
"Lin",
"Every room has a story."
],
[
"",
"",
"Lin",
"Many owners lived here."
],
[
"",
"",
"Jay",
"Cool! Old stuff!"
],
[
"",
"Jay伸手想摸墙上的东西Lin一把拍掉他的手",
"",
""
],
[
"",
"",
"Lin",
"Don't touch!"
],
[
"",
"User注意到墙上一枚闪亮的奖章走近细看",
"",
""
],
[
"",
"【插入图】特写——奖章上刻着 Clare Hope & Fred Hope - Pioneer Award",
"",
""
],
[
"",
"User愣住了",
"",
""
],
[
"",
"",
"User",
"No way..."
],
[
"中互动",
"",
"User",
"I know this! My mum and dad!"
],
[
"TL",
"",
"Jay",
"Your mum and dad?!"
],
[
"",
"",
"Lin",
"They lived in this room?"
],
[
"",
"",
"User",
"Yes! This is their room!"
],
[
"",
"User激动地环顾整个房间眼睛发亮",
"",
""
],
[
"",
"Lin叹气指了指门",
"",
""
],
[
"",
"",
"Lin",
"The code. Remember?"
],
[
"",
"但User完全没在听已经开始翻看墙上的东西",
"",
""
],
[
"",
"",
"User",
"Wait. I want to look!"
],
[
"",
"User发现一张照片父母穿着太空服漂浮在太空舱里做实验",
"",
""
],
[
"",
"【插入图】Clare和Fred在太空舱中做实验的照片两人比着胜利手势",
"",
""
],
[
"",
"",
"User",
"Wow... so cool!"
],
[
"",
"Lin焦急地来回踱步",
"",
""
],
[
"",
"",
"Lin",
"Hey! The code!"
],
[
"",
"",
"Lin",
"We must get out!"
],
[
"",
"Jay本来附和Lin但忍不住凑过来看",
"",
""
],
[
"",
"",
"Jay",
"Yeah! We need to—"
],
[
"",
"",
"Jay",
"Ooh, what is THAT?"
],
[
"",
"Jay指向角落里一个旧箱子",
"",
""
],
[
"中互动",
"",
"User",
"What is in this box?"
],
[
"TL",
"User打开箱子里面有更多照片和旧物父母的工作日志、一副旧护目镜、一枚小徽章",
"",
""
],
[
"",
"",
"Jay",
"So much stuff!"
],
[
"中互动",
"Jay指着箱子旁边一个旧背包",
"User",
"What is in that bag?"
],
[
"TL",
"User打开背包翻出更多照片",
"",
""
],
[
"",
"",
"Lin",
"Stop looking!"
],
[
"",
"",
"Lin",
"Find. The. Code!"
],
[
"",
"Lin简直要抓狂但User从背包里抽出一张特别的照片",
"",
""
],
[
"",
"【插入图】一张合影年轻的Clare和Fred站在一栋宏伟建筑的大厅里穿着崭新的Pioneer学员制服笑得灿烂。照片底部手写文字Vala Hall, September 1st",
"",
""
],
[
"",
"User仔细看这张照片表情从沉浸慢慢转为恍然",
"",
""
],
[
"",
"",
"User",
"Vala Hall..."
],
[
"",
"",
"User",
"September 1st..."
],
[
"",
"",
"User",
"Their first day!"
],
[
"中互动",
"User指着照片中的大厅",
"User",
"This hall! Vala Hall!"
],
[
"TL",
"",
"Jay",
"So?"
],
[
"",
"User转向门上的屏幕",
"",
""
],
[
"",
"",
"User",
"The most important day."
],
[
"",
"",
"User",
"ALL Pioneers go to Vala."
],
[
"",
"",
"User",
"The first day of school!"
],
[
"中互动",
"User激动地转向速猴",
"User",
"Do you know the day?"
],
[
"TL",
"",
"Jay",
"Hmm... no?"
],
[
"",
"",
"User",
"September 1st!"
],
[
"",
"User走到门前的密码屏准备输入",
"",
""
],
[
"中互动",
"【插入图】门上密码输入屏,显示字母格。请用户拼写 September",
"",
""
],
[
"TL",
"【音效】叮——密码正确,门缓缓打开",
"",
""
],
[
"",
"走廊的灯光重新亮起,通往大厅的路打开了",
"",
""
],
[
"中互动",
"",
"User",
"The room is open! Back to the hall!"
]
]
}