# 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 | `` | | 横向溢出 | 全站禁止出现横向滚动条;`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` - 纯序号的表(分集总表、榜单落点)→ ``,避免白白浪费横向空间 - `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 / 网络字体 / 外链资源(离线可用) - 单文件交付,`