155 lines
7.6 KiB
Markdown
155 lines
7.6 KiB
Markdown
# AGENTS.md · 漫剧小说项目协作规则
|
||
|
||
本项目为 **50 集古装武侠复仇 AI 漫剧**的策划与创作工作区。所有设定、分集、正文均在此迭代。
|
||
|
||
---
|
||
|
||
## 一、最高优先级:先读设定,再动笔
|
||
|
||
任何涉及剧情、人物、设定的动作之前,**必须先读**:
|
||
|
||
- `.workbuddy/memory/MEMORY.md` —— 已确认的全部设定(**用户确认过的条目,不得擅自更改**)
|
||
- `.workbuddy/memory/YYYY-MM-DD.md` —— 当日工作日志(按日期读最新的)
|
||
- `50集分集总表.md` —— 当前分集总表(工作底稿)
|
||
|
||
若 MEMORY.md 与总表内容冲突,**以 MEMORY.md 为准**,并主动提醒用户总表需要同步。
|
||
|
||
---
|
||
|
||
## 二、协作模式(用户明确要求)
|
||
|
||
> **用户先落笔写正文,我负责优化、接顺剧情、把埋下的钩子收拢。不由我代写正文。**
|
||
|
||
- 用户写一段 → 我改一段,输出可直接用的版本
|
||
- 改稿时可以给出**示范性台词/段落**,但必须标明「这是示范,不是代写」
|
||
- 用户偏好:**在现有方案上给增强建议**,表达简短精炼,认可后即推进
|
||
- 发现设定漏洞要**直说**,并给出修改方案 + 理由;不要为了迎合而放过硬伤
|
||
- 每次设定变更后,同步更新 MEMORY.md **和**总表(md + html 两份)
|
||
|
||
---
|
||
|
||
## 三、HTML 交付物规范(硬性要求 · 手机优先)
|
||
|
||
**本项目交付的任何 HTML 文件,必须在手机上可正常浏览。** 用户主要在手机上查看总表,桌面端只是次要场景。
|
||
|
||
### 3.1 必须满足的基线
|
||
|
||
| 项 | 要求 |
|
||
|---|---|
|
||
| viewport | `<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">` |
|
||
| 横向溢出 | 全站禁止出现横向滚动条;`body{overflow-x:hidden}`,长文本加 `word-break:break-word` |
|
||
| 正文字号 | 桌面 ≥14px,**移动端 ≥15px**(不要为了塞内容缩字号) |
|
||
| 安全区 | 底部留白加 `env(safe-area-inset-bottom,0px)`,适配全面屏 |
|
||
| 点击目标 | 可点击元素最小高度 ≥32px,移动端 ≥40px |
|
||
| 字号锁定 | `html{-webkit-text-size-adjust:100%}` 防 iOS 横屏自动放大 |
|
||
|
||
### 3.2 表格必须「响应式降级」
|
||
|
||
本项目大量使用宽表格(分集总表 5 列、人物表 5 列)。**禁止让表格在手机上横向滚动或挤压。**
|
||
|
||
标准做法 —— **表格转卡片流**(`≤768px` 生效):
|
||
|
||
1. 每个 `td` 加 `data-l="列名"` 属性
|
||
2. 移动端 `thead{display:none}`,`tr{display:block}` 变卡片,`td{display:block}` 变字段行
|
||
3. `td::before{content:attr(data-l); display:block}` —— **列名标签独占一行,内容整行铺满**。
|
||
⚠️ 不要用 `td{display:grid; grid-template-columns:64px 1fr}`:标签列会吃掉约 30% 宽度,手机上正文被挤得很窄。**标签上、内容下**才是手机端的正解。
|
||
4. **每卡首列**(`td:first-child`)作为卡片头:整行铺底色、加粗、隐藏 `::before`,可加 `box-shadow:inset 3px 0 0` 左侧色条
|
||
5. `colspan` 单元格单独处理:`display:block` + 行内列名
|
||
6. 极窄屏(`≤360px`)只收 padding,不再改布局
|
||
|
||
> 参考实现见 `50集分集总表.html` 的 `@media (max-width:768px)` 段落,可直接复用。
|
||
|
||
### 3.2.1 首列宽度(本项目踩过坑)
|
||
|
||
**禁止给首列写死像素宽度 + `white-space:nowrap`** —— 长内容("序章第 4 拍「幼子尸首没找到」"、"榜二 · 自负剑客")会被挤爆或撑破表格。
|
||
|
||
正确做法:**用 CSS 变量统一控制,按表覆盖**
|
||
|
||
```css
|
||
table{--ep-w:12em} /* 默认 ≈12 个汉字 */
|
||
th:first-child,
|
||
td.ep{width:var(--ep-w); min-width:var(--ep-w); white-space:normal}
|
||
td.ep.num{white-space:nowrap} /* 纯序号列(集号)例外,防 "5-7" 折行 */
|
||
```
|
||
|
||
- 内容长的表(人物、暗线道具、榜单人物)→ 用默认 `12em`
|
||
- 纯序号的表(分集总表、榜单落点)→ `<table style="--ep-w:6em">`,避免白白浪费横向空间
|
||
- `th` 默认 `white-space:nowrap`,`th:first-child` 必须改回 `normal`,否则长表头不换行
|
||
|
||
### 3.2.2 空字段在手机上折叠
|
||
|
||
分集总表有大量内容为「—」的单元格,在卡片流里会变成一整行占位,非常浪费。用脚本打标记后由 CSS 隐藏:
|
||
|
||
```js
|
||
// 移动端:内容为「—」的字段行折叠,并重算卡片最后一条可见行的边框
|
||
var t = (td.textContent || '').replace(/[\s\u00a0]/g, '');
|
||
td.classList.toggle('is-empty', mq.matches && (t === '—' || t === '-' || t === ''));
|
||
```
|
||
|
||
```css
|
||
table td.is-empty{display:none}
|
||
table tr td.last-vis{border-bottom:none} /* 可见的最后一行要去边框,否则卡片底部双线 */
|
||
```
|
||
|
||
- 标记必须随 `matchMedia` 变化重算(横竖屏切换 / 转桌面宽度)
|
||
- 首列(卡片头)内容不会为空,不受影响
|
||
- 本次共折叠 71 个空字段行,分集总表每卡从 5 行降到 3-4 行
|
||
|
||
### 3.3 导航与浏览体验
|
||
|
||
- **顶部 sticky 章节导航**:移动端横向滚动的 chip 条(`overflow-x:auto; scrollbar-width:none`),桌面端换行常驻
|
||
- 每个 `h2` 加 `id` 与 `scroll-margin-top`(避开吸顶栏)
|
||
- 右下角**回到顶部**悬浮按钮:滚动超过 60% 屏高才出现,避开安全区
|
||
- 导航点击用 `scrollIntoView({behavior:'smooth'})`
|
||
|
||
### 3.4 其他约定
|
||
|
||
- 颜色**全部走 CSS 变量**,禁止硬编码色值(暗色模式靠覆盖 `:root` 变量实现,成本极低)
|
||
- 必须适配 `@media (prefers-color-scheme: dark)`
|
||
- 保留 `@media print` 样式,打印时隐藏导航与按钮
|
||
- 中文引号:代码里只用 ASCII 直引号;正文自然语言用中文引号
|
||
- 不使用任何外部 CDN / 网络字体 / 外链资源(离线可用)
|
||
- 单文件交付,`<style>` 与 `<script>` 内联
|
||
|
||
### 3.5 交付检查清单
|
||
|
||
产出 HTML 后逐条自检:
|
||
|
||
- [ ] 手机竖屏(375px)下无横向滚动
|
||
- [ ] 表格在窄屏已转为卡片流,**列名标签独占一行、正文整行铺满**(不是 64px + 内容的栅格)
|
||
- [ ] 首列宽度用 `--ep-w` 变量控制,无写死像素宽度 + nowrap 的长内容列
|
||
- [ ] 内容为「—」的空字段行在手机上已折叠,卡片底部无双线
|
||
- [ ] 顶部导航可横向滑动,点击能跳转
|
||
- [ ] 深色模式下文字与背景对比度正常
|
||
- [ ] 底部内容不被悬浮按钮遮挡
|
||
- [ ] 断网状态下打开无缺失样式
|
||
|
||
---
|
||
|
||
## 四、文件与产物约定
|
||
|
||
| 文件 | 用途 | 更新规则 |
|
||
|---|---|---|
|
||
| `50集分集总表.md` | 分集总表**工作底稿**,用户可直接改 | 设定变更即同步 |
|
||
| `50集分集总表.html` | 分集总表**一屏总览**,手机浏览用 | 与 md 同步,遵循第三节规范 |
|
||
| `.workbuddy/memory/MEMORY.md` | 长期设定(用户已确认的部分) | Edit 工具**原地改**,不覆盖 |
|
||
| `.workbuddy/memory/YYYY-MM-DD.md` | 当日工作日志 | **只追加**(append-only) |
|
||
|
||
- 正文文件命名:`第XX集.md` 或按用户指定
|
||
- 交付后用 `present_files` 呈现,**HTML 放第一位**(自动打开预览)
|
||
|
||
---
|
||
|
||
## 五、写作铁律(详见总表第六节,共 20 条)
|
||
|
||
核心几条,落笔前必看:
|
||
|
||
1. 闪回必须由「现在」的某个东西**扎进去**,不许写"他想起了八年前"
|
||
2. 每次闪回只补一块,且必须**翻案**——不是加信息,是改写上一块的意思
|
||
3. 不写「原谅」、不写「冤冤相报何时了」——放过 = 自厌,不是慈悲
|
||
4. 化名不能姓沈
|
||
5. 女二父亲**只能废,不能杀**(他必须活到 41 集交付下落)
|
||
6. 一夜覆灭只能是男主一个人——**师门只做加成,绝不代打**
|
||
7. 榜单不能充当男主的实力证明,他真正的实力必须自己打出来
|
||
8. 发病是配额化的:动一次真气有代价,丹药只够撑一夜
|