docs: 清理过程文档,CHANGELOG 补齐 0.3.8–0.3.14

- 删除 docs/plan 下 00–18 的计划、评审、验收、发布记录与升级证据,docs/spikes 与 spikes 验证代码
  (保留 spikes/movieclaw-src 本地克隆),以及 4 份一次性审查 / 调研;全部可在 ceb66f8 查到
- MP 对照移到 docs/porting/moviepilot-v3-comparison.md;经验教训改为 docs/plan/lessons.md(补第 25 条)
- docs/plan/README.md:文档放哪、当前状态、待办
- 引用改写:代码注释指向在维护的文档,其余注明已删除与 git 位置;清掉原有 6 个失效链接
- README 开头改为当前状态与入口;CHANGELOG 补齐 0.3.8–0.3.14 与工程变更

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-10-02 16:08:09 +08:00
1 parent 11ca2f01ff
commit b343dddbf6
36 files changed
+156 -76

No files matched your search

+1 -1
View File
@@ -3,7 +3,7 @@
> **Superseded by [ADR-004](ADR-004-deno-runtime.md)**(2026-09-27,W1.5 已迁移到 Deno 2.9.7 + TypeScript 7.0.2)。以下内容仅作历史记录。
- 状态:已被 ADR-004 取代(2026-09-27);原状态:已采纳(2026-09-27)
- 关联:REQ §9(技术架构选择)、docs/plan/00-first-version-plan.md §1
- 关联:REQ §9(技术架构选择)、`00-first-version-plan`(已删除,见 git `ceb66f8`) §1
## 背景
+1 -1
View File
@@ -1,7 +1,7 @@
# ADR-002:持久任务引擎采用 OpenWorkflow 0.10.1(锁版本),封装在 `TaskEngine` 端口之后
- 状态:已采纳(2026-09-27,W0-B spike 后)
- 关联:REQ §11、docs/plan/00-first-version-plan.md §1 与 §3.1-8、验证记录 `docs/spikes/w0b-openworkflow.md`、代码 `spikes/openworkflow/`
- 关联:REQ §11、`00-first-version-plan`(已删除,见 git `ceb66f8`) §1 与 §3.1-8、验证记录 spike `w0b-openworkflow`(已删除,见 git `ceb66f8`)、代码 `spikes/openworkflow/`(已删除,见 git `ceb66f8`)
## 决定
+2 -2
View File
@@ -1,7 +1,7 @@
# ADR-003:Pi 接入采用 pi-agent-core `AgentHarness`,封装在 `AgentRuntimePort` 之后
- 状态:已采纳(2026-09-27,W0-B spike 后)
- 关联:REQ §10、§11.4;plan §1、§3.1-9;验证记录 `docs/spikes/w0b-pi.md`;代码 `spikes/pi/`
- 关联:REQ §10、§11.4;plan §1、§3.1-9;验证记录 spike `w0b-pi`(已删除,见 git `ceb66f8`);代码 `spikes/pi/`(已删除,见 git `ceb66f8`)
## 决定
@@ -86,7 +86,7 @@ faux.setResponses([
## 已知限制
- 0.x 版本,存储格式 4 仍是 WIP,可能原地改变。锁精确版本,升级前重跑 `spikes/pi`。
- 0.x 版本,存储格式 4 仍是 WIP,可能原地改变。锁精确版本,升级后跑 agent 与 server 的 Pi 相关测试(`deno task test:all`)。
- 没有子代理,没有 PG 会话存储,`watchSession` 未实现。
- Pi 不提供权限系统(REQ §10.2)。进程、容器、网络白名单要在部署层落实。
- 模型流中途崩溃后按"合成 error + 重试"恢复,只读了规范,未实测;v0.1 的 e2e 要补上。
+1 -1
View File
@@ -1,7 +1,7 @@
# ADR-004:运行时切换为 Deno 2.9.7(锁定)+ TypeScript 7.0.2
- 状态:提议(2026-09-27,Deno 准入 spike 完成后)。采纳后替代 ADR-001,ADR-001 的状态措辞由协调者修改。
- 关联:REQ §9、§10.2;plan §1;验证记录 `docs/spikes/deno-2.9.7.md`;代码 `spikes/deno/`
- 关联:REQ §9、§10.2;plan §1;验证记录 spike `deno-2.9.7`(已删除,见 git `ceb66f8`);代码 `spikes/deno/`(已删除,见 git `ceb66f8`)
## 背景
+1 -1
View File
@@ -1,6 +1,6 @@
# BrowserProvider 合同与 camofox-browser 适配
对应 REQ v0.7 §4.4、§4.7.2–4.7.4、§12.1 浏览器实体、附录 S18–S20;计划 `docs/plan/00-first-version-plan.md` §3.2:v0.1 只落接口,浏览器接入与原站视图在 M2。
对应 REQ v0.7 §4.4、§4.7.2–4.7.4、§12.1 浏览器实体、附录 S18–S20;计划 `00-first-version-plan`(已删除,见 git `ceb66f8`) §3.2:v0.1 只落接口,浏览器接入与原站视图在 M2。
代码位置:
+2 -2
View File
@@ -265,7 +265,7 @@
### 6.4 遗留
- ~~"没有匹配 / 查询失败"的待识别资源不生成待处理事项~~:W8-A 已为这两类开 `identity_unresolved` 事项(手动指定 TMDB ID / 选本地作品 / 忽略),见 `docs/plan/08-v0.2-closeout.md`。
- ~~"没有匹配 / 查询失败"的待识别资源不生成待处理事项~~:W8-A 已为这两类开 `identity_unresolved` 事项(手动指定 TMDB ID / 选本地作品 / 忽略),见 `08-v0.2-closeout`(已删除,见 git `ceb66f8`)。
- ~~`agent-conversation.tsx` 仍链到 `/console/tasks/:下载任务ID`~~:W8-A 已改为 `/console/downloads/:id`。
- `components/agent/quick-goals.ts` 里的"待识别池"文案(W7-B 范围)。
- 原站视图仍是占位。
@@ -291,7 +291,7 @@
## 7. IA-3 已实施对照(FE-1,2026-09-28)
依据 `docs/plan/00-first-version-plan.md` §8"IA-3 最终定稿"。定稿文字写"共 12 项",逐项清单是 14 项,按清单实施。
依据 `00-first-version-plan`(已删除,见 git `ceb66f8`) §8"IA-3 最终定稿"。定稿文字写"共 12 项",逐项清单是 14 项,按清单实施。
### 7.1 侧栏(`components/console/nav.ts`,5 组 14 项)
+1 -1
View File
@@ -1,6 +1,6 @@
# 文件管理 v2(对照 MP 逐功能 + 按我们的逻辑重整前端)
> 基础:`docs/plan/06-file-manager-spec.md`(下称"规格 06",后端 17 个 `/files` 端点已实现);行为账本 `docs/porting/moviepilot-filemanager.md`(痛点 P1–P12)。
> 基础:`06-file-manager-spec`(已删除,见 git `ceb66f8`)(下称"规格 06",后端 17 个 `/files` 端点已实现);行为账本 `docs/porting/moviepilot-filemanager.md`(痛点 P1–P12)。
> 上游:MoviePilot-Frontend `17b9d51` —— `views/reorganize/FileBrowserView.vue`、`components/filebrowser/{FileBrowser,FileToolbar,FileNavigator,FileList}.vue`、`components/dialog/{ReorganizeDialog,FileRenameDialog,ScrapeDialog,MediaInfoDialog,FileNewFolderDialog,ProgressDialog}.vue`、`cards/MediaInfoCard.vue`、`cards/DirectoryCard.vue`(覆盖模式)、`locales/zh-CN.ts`。只参考行为,不抄源码/模板/文案(GPLv3)。
> 本文只改前端信息架构与交互,加少量后端缺口(§15)。IA-3 已取消"身份与元数据"页,这直接影响整理向导(§6.1)。
+1 -1
View File
@@ -101,4 +101,4 @@
- 侧栏的选中项由滑块(`seg-thumb`)承担主要形态,导航文字与 hover 保持清晰;分组展开、滚动和路由变化都会影响滑块位置。
- 改支付界面的样式时,要覆盖确认、二维码、错误与返回路径。套餐的优惠金额从价格推导,不写死。交易摘要用现有的 RemarkText 展示,不为排版改写后端摘要的含义。
主动使用 Taste 的触发条件和项目适配见[前端规范](../architecture.md)。
主动使用 Taste 的触发条件和项目适配见前端规范。
+1 -1
View File
@@ -1,6 +1,6 @@
# 整理命名模板(对标 MoviePilot 重命名格式)
> 需求来源:`docs/plan/00-first-version-plan.md` §8 第 5 条。行为对照:`docs/porting/moviepilot-transfer.md` §2.4。上游 `jxxghp/MoviePilot` v3 @ `e6820a8`,只记录行为,不复制源码(GPLv3)。
> 需求来源:`00-first-version-plan`(已删除,见 git `ceb66f8`) §8 第 5 条。行为对照:`docs/porting/moviepilot-transfer.md` §2.4。上游 `jxxghp/MoviePilot` v3 @ `e6820a8`,只记录行为,不复制源码(GPLv3)。
> 现状:`packages/domain/src/path/{template,binding,sanitize}.ts`。模板语法是自研的 `{var}` + `[[可选段]]`;模板集 `DEFAULT_TEMPLATES` 在 `services/organize.ts:434` 写死,没有设置项、没有预览,变量只有 16 个,名字和 MP 对不上。
## 1. MP 怎么做(结论)
@@ -1,7 +1,7 @@
# OpenWorkflow 面板调研 → `/console/engine` 复刻方案
- 调研对象:本机锁定版本 `[email protected]`(`spikes/openworkflow/node_modules/openworkflow`,`node_modules/.pnpm/[email protected]*`)+ GitHub `openworkflowdev/openworkflow`(main 分支源码,含 `apps/dashboard`、`apps/cli`)+ `npm view`。
- 关联:ADR-002(`docs/adr/ADR-002-task-engine.md`)、`docs/spikes/w0b-openworkflow.md`。
- 关联:ADR-002(`docs/adr/ADR-002-task-engine.md`)、spike 记录 `w0b-openworkflow`(已删除,见 git `ceb66f8`)。
- 结论先说:**核心库(Apache-2.0)不含任何面板代码**;面板是两个独立、**无开源许可**的 npm 包;面板架构极简(2 个页面、无 workers 表、无鉴权、无手动重试原语);我们要做的是"参考信息架构 + 直连同一份 schema + 用自己的组件重写",不是"抄源码"。
## 1. 面板怎么来的、技术栈、鉴权现状
+1 -1
View File
@@ -1,6 +1,6 @@
# Pi 模型上游与订阅登录(pi-ai / pi-coding-agent 0.87.1)
> 2026-10-01 升级补充:当前接入目标已更新为 pi-agent-core/pi-ai 0.99.2,执行结果见 [全面升级记录](../plan/17-full-upgrade.md)。下文保留 0.87.1 的研究基线,不用历史计数验收新版。
> 2026-10-01 升级补充:当前接入目标已更新为 pi-agent-core/pi-ai 0.99.2,执行结果见 全面升级记录(已删除,见 git `ceb66f8`)。下文保留 0.87.1 的研究基线,不用历史计数验收新版。
>
> 新版实际目录为 42 个内置 provider(新增 TypeSafe 分类服务),合同和目录回归已同步;TypeSafe 没有 Agent 聊天模型,目录说明已标明。OAuth 共 9 个 provider:新增 `openai` 原生 Sign in with ChatGPT,浏览器流程与回调端口 1455;现有 `openai-codex` 仍保留 device/browser 两种模式。新版 `openai` 是动态注册的公开客户端流程,没有照搬旧 Codex 客户端身份提示。来源:[0.99.2 OpenAI provider](https://github.com/earendil-works/pi/blob/v0.99.2/packages/ai/src/providers/openai.ts)、[原生 ChatGPT OAuth](https://github.com/earendil-works/pi/blob/v0.99.2/packages/ai/src/auth/oauth/openai-chatgpt.ts)。
>
+1 -1
View File
@@ -1,6 +1,6 @@
# 站点中心与仪表盘调整(v0.2.1)
> 依据:`docs/plan/00-first-version-plan.md` §8(用户 2026-09-28 上午)。状态:待审阅。只读调研 + 规格,不含代码改动。
> 依据:`00-first-version-plan`(已删除,见 git `ceb66f8`) §8(用户 2026-09-28 上午)。状态:待审阅。只读调研 + 规格,不含代码改动。
> 参考:MoviePilot v3(`/opt/moviepilot-plus/upstream`)、MovieClaw v0.27.0(`spikes/movieclaw-src/repo`)。
## 1. 用户要求(原文要点)
+2 -2
View File
@@ -1,7 +1,7 @@
# 订阅重做 + 规则页(对标 MoviePilot v3)
> 需求来源:`docs/plan/00-first-version-plan.md` §8 第 3、4 条(订阅重做、收录策略 + 偏好标签合一)。命名模板另见 `naming-template.md`。
> 上游行为账本:`docs/porting/moviepilot-subscribe.md`;差距清单:`docs/plan/05-subscription-gap.md`;规则关键字核对:`docs/porting/mp-rust-logic-parity.md` §6。上游 `jxxghp/MoviePilot` v3 @ `e6820a8`,只记行为,不复制源码。
> 需求来源:`00-first-version-plan`(已删除,见 git `ceb66f8`) §8 第 3、4 条(订阅重做、收录策略 + 偏好标签合一)。命名模板另见 `naming-template.md`。
> 上游行为账本:`docs/porting/moviepilot-subscribe.md`;差距清单:`05-subscription-gap`(已删除,见 git `ceb66f8`);规则关键字核对:`docs/porting/mp-rust-logic-parity.md` §6。上游 `jxxghp/MoviePilot` v3 @ `e6820a8`,只记行为,不复制源码。
## 0. MP 要点与我们的现状
+3 -3
View File
@@ -20,7 +20,7 @@
两边的底、边、字色、投影都引用 `--mat-pill-*`,改外观只改参数。调用处只给布局(宽度、高度、间距、定位),不改圆角、底色、边框、投影和字色;不是 `<button>` 的元素(`Link`、`a`)用 `buttonVariants()` 拿同一套类名。分段标签、菜单行、列表行不算按钮,按各自控件规范;分页当前页、角标、选中的季 / 集 / 选项、日历选中日用静态的 `pill-selected`,不借主按钮样式;分段控件(侧栏、SegmentedTabs、求片页的分段)的滑块用 `seg-thumb`。放胶囊或分段控件的横向滚动容器加 `scroll-bleed`:`overflow-x-auto` 会连带裁掉纵向溢出,不加的话胶囊的阴影和描边会被切成直边。
右上角账户模块全站共用 [`account-popover.tsx`](../../apps/web/app/components/account-popover.tsx):用户中心用头像 + 名字的胶囊,流媒体与测速用圆头像;菜单里是另外两块的跳转(当前所在的不列,流媒体与测速需有生效订阅)与退出登录。
右上角账户模块全站共用 `account-popover.tsx`:用户中心用头像 + 名字的胶囊,流媒体与测速用圆头像;菜单里是另外两块的跳转(当前所在的不列,流媒体与测速需有生效订阅)与退出登录。
其余控件仍分两处实现:门户原语在 `app/components/ui/`(shadcn 语义 token),流媒体控件在 `app/routes/stream/_sub/`、`app/routes/stream/player/controls.tsx`(浏览页 `content` / `wash`,播放器 `on-media` 族)。需要相同行为时各自实现。
@@ -46,7 +46,7 @@
## 大写小标签
`SectionLabel`([section-label.tsx](../../apps/web/app/components/section-label.tsx)),三种口味:`portal`(门户表单字段名与分组,`text-xs font-semibold uppercase text-muted-foreground`)、`page`(浏览页,`text-label uppercase tracking-[0.18em] text-content-muted`)、`media`(播放器弹层,同上换 on-media)。`as` 指定元素(label / span / p)。
`SectionLabel`(section-label.tsx),三种口味:`portal`(门户表单字段名与分组,`text-xs font-semibold uppercase text-muted-foreground`)、`page`(浏览页,`text-label uppercase tracking-[0.18em] text-content-muted`)、`media`(播放器弹层,同上换 on-media)。`as` 指定元素(label / span / p)。
还有几种写法没收进来,值不同、收进来就是像素变化,待设计决定:门户里 `text-xs font-medium uppercase tracking-wider`(团队订单弹窗)、`text-micro … tracking-[0.15em]`(侧栏分组、邀请页)、`tracking-widest` 一处;落地页 hero 的 `tracking-[0.32em] text-white/45` 与分区标题的 `text-meta font-bold tracking-[.22em] text-brand-strong` 是刻意的装饰用法,单列为 hero kicker 与 section kicker。
@@ -59,4 +59,4 @@
- 同一份 class 串出现在两处以上就抽原语,抽的时候 class 串逐字不改,渲染不变。
- 参数只到必要:尺寸档、是否激活、标签、图标;不把整页状态传给控件。
- 只有一处用的局部组件留在页面文件里,不为了"以后复用"提前抽。
- 两个页面展示同一种信息时共用零件:套餐卡用 [plan-card-parts.tsx](../../apps/web/app/components/plan-card-parts.tsx)(名称价格、规格表、线路提醒、共有权益),电影与剧集详情用 [DetailExtras.tsx](../../apps/web/app/routes/stream/_sub/DetailExtras.tsx)(规格徽章、影片信息、可播放版本、更多推荐)。
- 两个页面展示同一种信息时共用零件:套餐卡用 plan-card-parts.tsx(名称价格、规格表、线路提醒、共有权益),电影与剧集详情用 DetailExtras.tsx(规格徽章、影片信息、可播放版本、更多推荐)。
+1 -1
View File
@@ -25,7 +25,7 @@
| 渲染 | 有 GPU 时 EGL/DMABUF 零拷贝;无 GPU 用 Pixman + Mesa llvmpipe[W1] |
| 传输 | 缺省 **WebSocket**(`SELKIES_MODE=websockets`);WebRTC 为可选,才需要 STUN/TURN[W3] |
| 编码 | `SELKIES_ENCODER` 缺省 `h264enc,h265enc,vp8enc,vp9enc,av1enc,jpeg`;`SELKIES_USE_CPU` 强制软编;VAAPI/NVENC 需 `/dev/dri` 或 NVIDIA 运行时[W3] |
| 性能 | 官方演示:N97 迷你机 1080p/60fps 多应用[W1](有核显);**纯 CPU 下 1080p 帧率未见官方数据,需 P0 实测** |
| 性能 | 官方演示:N97 迷你机 1080p/60fps 多应用W1;**纯 CPU 下 1080p 帧率未见官方数据,需 P0 实测** |
| 端口 | 3000 HTTP(只给反代)、3001 HTTPS 自签;Selkies 进程在容器内 `localhost:8082`,nginx 反代 `SUBFOLDER` 与 `SUBFOLDERapi`[W2][W7] |
| 变体 | webtop `latest`=Alpine XFCE;Wayland 支持的 Debian 变体只有 `debian-i3`(sway);`debian-xfce/kde/mate` 不支持 Wayland[W2] |
| 底座 | baseimage-selkies `master` 分支 = tag `debiantrixie`,Selkies 2.0.0、pixelflux 2.1.0,**已装 `fonts-noto-cjk`、labwc、xwayland**;`HOME=/config`、运行用户 `abc`(PUID/PGID)[W7] |
+36
View File
@@ -0,0 +1,36 @@
# 计划与待办
这里只放**正在推进**的计划和待办。做完的计划、验收和发布记录直接删除,版本变化只记在 CHANGELOG;需要追溯时查 git 历史(2026-10-02 清理前的全部过程文档在 `ceb66f8`)。
## 文档放哪
| 内容 | 位置 |
| --- | --- |
| 需求基线 | [media_automation_requirements_architecture_v0.7.md](../../media_automation_requirements_architecture_v0.7.md) |
| 架构决策 | [docs/adr/](../adr/) |
| 设计规范(界面、领域) | [docs/design/](../design/) |
| 怎么用、怎么运维 | [docs/runbook/](../runbook/)(开发环境见 [dev.md](../runbook/dev.md),部署见 [deploy.md](../runbook/deploy.md)) |
| 与 MoviePilot 的业务对照(持续维护) | [docs/porting/moviepilot-v3-comparison.md](../porting/moviepilot-v3-comparison.md) 及同目录各移植文档 |
| 版本变化 | 仓库根 [CHANGELOG.md](../../CHANGELOG.md),每个版本几行;发布前必须写好(`deno task release` 会检查) |
| 经验教训 | [lessons.md](lessons.md) |
| 证据、截图、构建日志 | `.local/`(不进 git) |
## 当前状态
- 版本 v0.3.14(`ceb66f8`),本机测试环境已部署。此前 v0.3.8~v0.3.13 由未提交工作区部署,源码已在 v0.3.14 统一提交。
- 开发与发布约定见仓库根 [CLAUDE.md](../../CLAUDE.md)。
## 待办
按需要再挑,挑中后在这里写清:从哪触发、最终看到什么、哪些失败需要人工处理、用什么样本验收。
### 工程
- 任务恢复的三处边界:升级前未结束任务的版本处置(发布前查在途任务版本,没有在途旧任务就不保留旧处理器);业务结果提交、run 关联、事件派发三个时点分别注入失败确认最终状态;引擎查询异常时只记录并跳过本轮,仅在明确查无 run 或终态时补投。
- 生产模块装配的处理器来源断言(防止漏注册的任务静默回显 todo),下次改任务注册时补。
- 大文件拆分候选,改到相关功能时顺手拆,不单独重构:`packages/contracts/src/api.ts`(~2700 行)、`acquisition-organize/services/organize.ts`(~2600)、`browser/service.ts`(~2400)、`web/app/components/organize-wizard/organize-wizard.tsx`。
### 业务
- 与 MP 对照里仍未定的项,见 [对照 §6.4/6.5](../porting/moviepilot-v3-comparison.md#64-用户反馈与后续讨论2026-10-02)。
- 需求里仍是"部分实现"的:R06 通用 HTTP 失败转浏览器、真实 Cloudflare 挑战验收;R21 缓存阈值里未纳管占用的专项验收;四站与真实下载、媒体服务器的完整验收。
+3
View File
@@ -35,3 +35,6 @@
22. 清理脚本 `--apply` 前没看 dry-run 清单(子代理的 dry-run 只在测试库跑过)→ 在用户库删了 92 个"孤立单元",其中含 TMDB 季集账本单元,需回刷恢复 → **规则**:任何对真实库的删除类脚本,先对真实库跑 dry-run 并由协调者逐类目过目再 `--apply`,即使用户授权"直接干";删除判定必须按来源区分(临时 vs 元数据来源),默认只删临时数据。
23. **主工作区跑过 `deno install` 后先 `git status`**:宿主机 `deno install` 会把 `deno.lock` 改写(删掉一批 npm 条目),而镜像构建 `COPY . .` 带着工作区里的锁文件跑 `deno install --frozen`,直接失败。构建前 `git checkout deno.lock`(或确认工作区干净)再 `docker compose build`。(v0.3.2 发布时遇到)
24. **主工作区不留常驻进程**:子代理在主工作区起的 `deno task dev`(--watch)结束后没停,挂了两三天,每次改文件都重写 `deno.lock`(即 #23 的根因)。派活时要求子代理结束前 `pkill` 自己起的 dev 进程;协调者发布前 `pgrep -a deno` 看一眼。
## 发布与检查(2026-10-02 补充)
25. v0.3.8~v0.3.13 六个版本都由未提交工作区构建部署,发布记录写"检查通过",实际 agent / db / contracts 测试与类型检查一直是红的:`deno task test` 在第一个失败的包就停、后面的包根本没跑;连不上库时数据库用例静默跳过也算通过;开发库落后 9 个迁移没人发现 → **规则**:发布只走 `deno task release`(工作区不干净直接拒绝,tag 即镜像版本);检查只认 `deno task test:all` 的汇总(逐包跑完、连不上库即失败);拉代码后 `deno task dev:up`。
+1 -1
View File
@@ -30,7 +30,7 @@
## 2. 本项目的迁移边界
任务书 `docs/plan/00-first-version-plan.md` §1 规定:"MoviePilot:GPLv3,**只做行为对照与 TS 重写,不复制文件**"。REQ §14.1 允许"以具体实现为参考迁移业务逻辑"。两条放在一起执行时,按下表办。
任务书 `00-first-version-plan`(已删除,见 git `ceb66f8`) §1 规定:"MoviePilot:GPLv3,**只做行为对照与 TS 重写,不复制文件**"。REQ §14.1 允许"以具体实现为参考迁移业务逻辑"。两条放在一起执行时,按下表办。
| 允许 | 不允许 |
| --- | --- |
+1 -1
View File
@@ -1,7 +1,7 @@
# MoviePilot v3 文件管理:行为对照记录
> 格式:REQ §14.1.2 迁移交付规范。只记录行为、接口形状和交互,**不复制 MP 源码或前端模板**(MP 后端 GPLv3、前端同属 jxxghp 组织,按 `license-and-provenance.md` 一律"只参考行为")。
> 对应规格:`docs/plan/06-file-manager-spec.md`;需求:REQ §2.1、§7.1/§7.1.1、§8.2/§8.3。
> 对应规格:`06-file-manager-spec`(已删除,见 git `ceb66f8`);需求:REQ §2.1、§7.1/§7.1.1、§8.2/§8.3。
## 0. 上游版本与核验范围
+1 -1
View File
@@ -1,7 +1,7 @@
# MoviePilot 订阅业务逻辑:迁移对照记录
> 格式:REQ §14.1.2 迁移交付规范。只记录行为对照与 TS 重写建议,**不复制 MP 源码**(GPLv3,见 `license-and-provenance.md`)。
> 对应需求:REQ §5.4(本地集账本)、§5.5(正片完整性)、§6.1–6.8(Slot/升级/三模式/预算/选片追踪/偏好/优先级)。任务书:`docs/plan/00-first-version-plan.md` §3.1 第 5 条。差距与实施清单见 `docs/plan/05-subscription-gap.md`。
> 对应需求:REQ §5.4(本地集账本)、§5.5(正片完整性)、§6.1–6.8(Slot/升级/三模式/预算/选片追踪/偏好/优先级)。任务书:`00-first-version-plan`(已删除,见 git `ceb66f8`) §3.1 第 5 条。差距与实施清单见 `05-subscription-gap`(已删除,见 git `ceb66f8`)。
## 0. 上游版本与核验范围
+1 -1
View File
@@ -1,7 +1,7 @@
# MoviePilot 视频文件转移入库:迁移对照记录
> 格式:REQ §14.1.2 迁移交付规范。本文件只记录行为对照和 TS 重写建议,**不复制 MP 源码**(MP 为 GPLv3,见 `license-and-provenance.md`)。
> 对应需求:REQ §7.1 / §7.1.1(稳定路径)、§8.3(Copy/Move 与缓存清理)、§8.4(qB 标签接管)、§14.1.1(多文件/整季包/目标冲突/中断恢复/源数据清理专项)、§14.1.3(转移入库优先专项)。任务书:`docs/plan/00-first-version-plan.md` §3.1 第 7、8 条。
> 对应需求:REQ §7.1 / §7.1.1(稳定路径)、§8.3(Copy/Move 与缓存清理)、§8.4(qB 标签接管)、§14.1.1(多文件/整季包/目标冲突/中断恢复/源数据清理专项)、§14.1.3(转移入库优先专项)。任务书:`00-first-version-plan`(已删除,见 git `ceb66f8`) §3.1 第 7、8 条。
## 0. 上游版本与核验范围
+7 -7
View File
@@ -2,7 +2,7 @@
继续开发前,先逐项核对现有业务与 MoviePilot v3 的处理逻辑。每项同时说明业务结果、失败边界、本项目差异和需要补的证据;完成对照后再讨论实现调整。本文是当前对照记录,尚未完成的项目明确列为待核对。
日期:2026-10-01。本项目业务代码基线:`8013196e3f5e6a8c4ea0cd26cf77294a82a13ddd`,`v0.3.7`。前置材料:[开发情况基线](13-development-baseline.md)、[工程检查](14-engineering-review.md)。初始对照阶段只读源码并更新文档;后续用户授权的实现状态见第 4、5 节。
日期:2026-10-01。本项目业务代码基线:`8013196e3f5e6a8c4ea0cd26cf77294a82a13ddd`,`v0.3.7`。前置材料:开发情况基线(已删除,见 git `ceb66f8`)、工程检查(已删除,见 git `ceb66f8`)。初始对照阶段只读源码并更新文档;后续用户授权的实现状态见第 4、5 节。
## 1 参考基线和判定方法
@@ -12,12 +12,12 @@
| 参考发布版本 | `v3.0.10-1`,提交 [`0aa857173f77de31c7c8d9d2e12052d99f37bcc1`](https://github.com/jxxghp/MoviePilot/tree/0aa857173f77de31c7c8d9d2e12052d99f37bcc1),2026-09-28;`version.py` 已核对 |
| 分支查询 | 本轮只读查询时 `v3` 分支为 `5741d3c56d761d87868d4f2d0515ac5c498f94d6`;本报告采用上面的发布标签,后续逐项核对不随分支移动 |
| 本地参考位置 | `/tmp/umt-moviepilot-v3-review-20261001`,独立浅克隆,未改上游源码 |
| 旧资料 | [既有移植文档](../porting/moviepilot-transfer.md)使用 `e6820a8`/早期 v3.0.0;原参考仓库保持不变,旧样本结论不直接升级为本轮结论 |
| 旧资料 | [既有移植文档](moviepilot-transfer.md)使用 `e6820a8`/早期 v3.0.0;原参考仓库保持不变,旧样本结论不直接升级为本轮结论 |
| 证据范围 | 阅读当前源码、迁移和测试断言;没有启动 MP 服务或运行上游测试,也没有对本项目新增故障注入 |
MP 是优先采用的业务参考;用户已确认尽量复用其成熟业务逻辑和实现,存在明确需求差异时再讨论调整。最终行为仍由本项目需求和用户确认决定。两边使用不同任务和数据机制,只比较同一场景的业务结果,不因模块名字相近就认定能力相同。已有 MP 差分样本、运行记录和有意偏离登记继续保留,按各自提交解释。
每项记录五件事:触发场景;MP 的明确处理分支;本项目正式调用路径;差异属于实现缺口、验收缺口、有意调整还是暂不适用;拟采用的规则及最小验证场景。源码结论、未复现影响和讨论建议分开。参考行为与来源登记沿用 [移植规范](../porting/license-and-provenance.md)。
每项记录五件事:触发场景;MP 的明确处理分支;本项目正式调用路径;差异属于实现缺口、验收缺口、有意调整还是暂不适用;拟采用的规则及最小验证场景。源码结论、未复现影响和讨论建议分开。参考行为与来源登记沿用 [移植规范](license-and-provenance.md)。
## 2 顺序和进度
@@ -57,7 +57,7 @@ MP 是优先采用的业务参考;用户已确认尽量复用其成熟业务
升级兼容也有明确范围:MP 的分类检查点 v1→v2 迁移遇到已有执行状态、执行载荷或步骤证据时不重写旧计划,继续使用已知旧版本解码路径。这支持「保留已经产生的执行证据」的规则,不能据此承诺任意旧 handler 都能继续执行。见 [检查点迁移](https://github.com/jxxghp/MoviePilot/blob/0aa857173f77de31c7c8d9d2e12052d99f37bcc1/database/versions/d8f2b6a4c1e7_3_0_28.py#L290)。
本项目刮削双写控制流已确认,但本轮没有故障注入证明实际受影响。上一轮线上只读检查未发现未结束的旧版刮削 run,也没有 `scrape_record` 记录;该时点结论不代替升级策略。见 [工程检查 §2](14-engineering-review.md#2-建议优先核对的恢复边界)。
本项目刮削双写控制流已确认,但本轮没有故障注入证明实际受影响。上一轮线上只读检查未发现未结束的旧版刮削 run,也没有 `scrape_record` 记录;该时点结论不代替升级策略。见 工程检查 §2(已删除,见 git `ceb66f8`)。
### 3.2 精确来源
@@ -112,7 +112,7 @@ MP 还在 [test_transfer_planning_checkpoint.py](https://github.com/jxxghp/Movie
目录接管参考 MP `app/application/transfer/monitor/snapshot.py`、`poller.py`:先快照现状,再比对新增/变化;完整存量作为单独手动操作。我们采用数据库持久快照、已有识别与整理计划,一条配置一个来源路径。同分类可配置多条不同来源,综艺归 tv;只有复制与移动。qB 标签继续使用现有任务管理和实例范围。
当前源码已接入分类编辑和测试、来源选择、自动/固定分类、qB 配置标签、快照与存量向导。已有路径绑定保留,不按新规则迁移旧库;源离线保留基线,已知 qB 任务不被目录扫描重复接管。具体入口和分批限制见 [整理手册](../runbook/organize.md)。测试使用本项目临时目录与隔离 PG,不是运行 MP 服务;未完成浏览器截图审查;后续 v0.3.9 已发布,见 [发布记录](18-organize-release.md)。
当前源码已接入分类编辑和测试、来源选择、自动/固定分类、qB 配置标签、快照与存量向导。已有路径绑定保留,不按新规则迁移旧库;源离线保留基线,已知 qB 任务不被目录扫描重复接管。具体入口和分批限制见 [整理手册](../runbook/organize.md)。测试使用本项目临时目录与隔离 PG,不是运行 MP 服务;未完成浏览器截图审查;后续 v0.3.9 已发布,见 发布记录(已删除,见 git `ceb66f8`)。
其他主题仍按第 2 节逐项讨论。这轮只补齐与已讨论整理功能有关的分类、标签与目录接管行为,不宣称整个下载隔离、清理、订阅和智能体业务对照已完成。
@@ -228,11 +228,11 @@ MP 手动添加入口识别失败时返回 `requires_confirmation`;前端 `Add
- 用本机 Chromium 与真实 React 组件验证单旧版默认选择、无选择禁用洗版、勾选洗版、切回正常、未知资源二次确认、串流外按钮交接;API 为 fixture,未产生真实下载,页面无未捕获异常。
- web production build、server compile 与空环境二进制模块自检通过。局部证据存于本机 `.local/manual-download-ui/`。
以上业务回归主要为源码与隔离环境验证。随后于 2026-10-01 发布 v0.3.10,线上 `0060` 迁移、HTTP/HTTPS、管理员接口及 6 个生产页面冒烟通过,未触发真实下载或媒体整理;镜像、备份与验证证据见 [发布记录](18-organize-release.md#v0310-手动下载与入库发布)。
以上业务回归主要为源码与隔离环境验证。随后于 2026-10-01 发布 v0.3.10,线上 `0060` 迁移、HTTP/HTTPS、管理员接口及 6 个生产页面冒烟通过,未触发真实下载或媒体整理;镜像、备份与验证证据见 发布记录(已删除,见 git `ceb66f8`)。
### 5.7 v0.3.11 体验修复
搜索资源标题接入与站点工作台同一详情抽屉与读取接口,复用按需详情抓取和缓存,不增加第二套解析器。详情抽屉仍提供下载选项、库存和 Agent 入口。桌面浏览器的最大化规则修复后,上下黑边消失。已部署并经过组件交互、生产真实缓存详情接口与 HTTPS 页面验证,范围和证据见 [发布记录](18-organize-release.md#v0311-搜索详情与桌面黑边修复)。
搜索资源标题接入与站点工作台同一详情抽屉与读取接口,复用按需详情抓取和缓存,不增加第二套解析器。详情抽屉仍提供下载选项、库存和 Agent 入口。桌面浏览器的最大化规则修复后,上下黑边消失。已部署并经过组件交互、生产真实缓存详情接口与 HTTPS 页面验证,范围和证据见 发布记录(已删除,见 git `ceb66f8`)。
## 6 整理使用方式与文件管理器专项研究(2026-10-02)
+3 -3
View File
@@ -484,7 +484,7 @@ camofox 容器重启(`docker compose up -d` 重建、OOM、手动 restart)后,
同一个站点账号的登录态在浏览器(camofox / Firefox)和 HTTP 端(Deno)之间互注(§9),所以两端要**看起来是同一台设备**:
同一个 UA、稳定的指纹、同一个出口 IP。用户决定(2026-09-30):对外伪装 **Windows**;全实例**一套固定指纹**;
浏览器与 HTTP **按站点统一出口**。调研见 `docs/design/browser-ua-research.md`。
浏览器与 HTTP **按站点统一出口**。调研见 `browser-ua-research`(已删除,见 git `ceb66f8`)。
代码:插件 `docker/browser-desktop/root/opt/camofox/plugins/umt-cookies/{index.js,identity.js}`;
`apps/server/src/modules/sources-identity/{runtime.ts,service/user-agent.ts,service/credentials.ts,service/account.ts}`;
@@ -695,8 +695,8 @@ camofox 按 **API 调用**判断活动,有三道空闲回收(`docker-compose.yml
用生产 profile 与桌面配置的独立副本验证了鉴权、原身份保持、Cookie 正常重启落盘、上下文/页面、evaluate、快照、PNG、选择器与可信坐标点击、profile 隔离。现有真实 BrowserService/Agent 能力核验脚本 `scripts/browser-verify/verify.ts` 的 setup/a/b/idle/c/d 共 25 项严格通过,包含登录、脱敏、提取、下载文件哈希及资源关联、正常重启与空闲回收自动重连、旧引用拒绝、SIGKILL 未落盘登录丢失识别。适配器能力表现已登记 1.18.0 的原十项能力,未知版本不继承核验结果。
完整执行与恢复/清理状态见 [升级记录](../plan/17-full-upgrade.md),机器可读结果见 [验证证据](../plan/evidence/2026-10-01-dependencies/upgrade-verification.json)。这些检查不增加真实 PT 挑战、ARM64 或精确 URL 恢复的验收声明。SIGKILL/OOM 后仅能使用上次落盘状态的限制继续保留。
完整执行与恢复/清理状态见 升级记录(已删除,见 git `ceb66f8`),机器可读结果见 验证证据(已删除,见 git `ceb66f8`)。这些检查不增加真实 PT 挑战、ARM64 或精确 URL 恢复的验收声明。SIGKILL/OOM 后仅能使用上次落盘状态的限制继续保留。
### 桌面上下黑边排查记录
2026-10-01 已修复底座初始化脚本生成无效 labwc XML 的问题;部署镜像为 `umt-browser-desktop:1.18.0-umt.1`。初始化在 `init-selkies-config` 完成后写入完整 XML,浏览器窗口自动最大化。实际视频尺寸与前端 iframe 同为 1280×900;前后串流截图确认上下黑边消失。若需要调整桌面尺寸,可改 `BROWSER_DESKTOP_WIDTH/HEIGHT`,不要以拉伸或裁剪视频修正窗口布局。证据见 [发布记录](../plan/18-organize-release.md#v0311-搜索详情与桌面黑边修复)。
2026-10-01 已修复底座初始化脚本生成无效 labwc XML 的问题;部署镜像为 `umt-browser-desktop:1.18.0-umt.1`。初始化在 `init-selkies-config` 完成后写入完整 XML,浏览器窗口自动最大化。实际视频尺寸与前端 iframe 同为 1280×900;前后串流截图确认上下黑边消失。若需要调整桌面尺寸,可改 `BROWSER_DESKTOP_WIDTH/HEIGHT`,不要以拉伸或裁剪视频修正窗口布局。证据见 发布记录(已删除,见 git `ceb66f8`)。
+1 -1
View File
@@ -1,6 +1,6 @@
# 文件管理(`/files`,W5-A)
实现:`apps/server/src/modules/file-manager/`(路由 `routes.ts`,服务按操作分文件),契约 `packages/contracts/src/files.ts`(端点登记在 `api.ts` 的 `Api.files`),迁移 `0024_trash`。规格见 `docs/plan/06-file-manager-spec.md`。
实现:`apps/server/src/modules/file-manager/`(路由 `routes.ts`,服务按操作分文件),契约 `packages/contracts/src/files.ts`(端点登记在 `api.ts` 的 `Api.files`),迁移 `0024_trash`。规格见 `06-file-manager-spec`(已删除,见 git `ceb66f8`)。
复用 acquisition-organize 的服务导出(`planImport`、`sourceGuard`、`authorizeMove`、`hnrBlockForMove`、`managedTasksUnder`、`emitRecord`、H&R 判定)。W5-A2 给 `planImport` 加了可选参数(`fileOverrides` / `targetDir` / `slotId` / `transfer`,老调用不变),原样搬运的计划与终态在 `acquisition-organize/services/organize-transfer.ts`(`planTransfer` / `finalizeTransfer` / `relocate`)。
## 根与路径
+2 -2
View File
@@ -24,7 +24,7 @@
## 来源、分类与存量整理
设置 → 媒体库与目录中维护分类 YAML 和整理来源。新功能已于 2026-10-01 部署为 v0.3.9,迁移 `0059_organize_source_snapshot` 已执行,见 [发布记录](../plan/18-organize-release.md)。
设置 → 媒体库与目录中维护分类 YAML 和整理来源。新功能已于 2026-10-01 部署为 v0.3.9,迁移 `0059_organize_source_snapshot` 已执行,见 发布记录(已删除,见 git `ceb66f8`)。
- 一条来源配置选一个来源目录、一个媒体库目标目录、复制或移动方式。通过弹窗浏览已登记的目录选择,不需要填写宿主机任意路径。不同来源可以使用相同分类,规则只维护一次。
- 分类一级固定为 `movie` / `tv`。规则按顺序首次匹配;同一规则的字段同时满足,同字段逗号值为任一匹配,`!` 排除。`release_year` 支持年份或区间;原始 TMDB 详情的一级字段也可使用。
@@ -50,7 +50,7 @@
洗版在本次冻结计划中保存选中的旧文件。新文件核验登记成功后才清理所选旧版本,剧集只处理成功对应的季集与 Part;覆盖不完整的合并集保留。相同目标路径会先暂存旧文件,失败后恢复。旧版的私有字幕等随之清理,共享 NFO/图片、未选版本及下载缓存保留;按现有文件替换设置移入回收站或删除。
关联迁移 `0060_manual_acquisition`,已于 2026-10-01 随 v0.3.10 发布执行。业务依据与验收见 [MP 对照 §5.6](../plan/15-moviepilot-v3-comparison.md#56-本轮实现与验收已部署-v0310)。
关联迁移 `0060_manual_acquisition`,已于 2026-10-01 随 v0.3.10 发布执行。业务依据与验收见 [MP 对照 §5.6](../porting/moviepilot-v3-comparison.md#56-本轮实现与验收已部署-v0310)。
## 与 MP 的对照
+2 -2
View File
@@ -4,7 +4,7 @@
`packages/domain/src/{slot/overview.ts, acquisition/fill.ts}`、contracts `policy.ts`(`SubscriptionOverviewItem` `SubscriptionCoverage` `SubscriptionCalendar` `SubscriptionResetResult` 等)、迁移 `0035_subscriptions_v2`、`0036_subscription_private_rules`;
集播出日期写入在 `sources-identity/service/metadata-totals.ts`(`applyEpisodeAirDates`),关键词检索在 `sources-identity/tasks.ts`(`searchSubscription`)。
前端:`apps/web/app/routes/console/subscriptions.tsx`(`?view=calendar`)、`components/subscriptions/{calendar.tsx, actions.tsx, subscription-form.tsx, model.ts}`。
设计:`docs/design/subscriptions.md` §1–§3、§5;规则组见 `docs/runbook/rules.md`;W5-C 账本/完成/搜索见 `docs/plan/05-subscription-gap.md` §4。
设计:`docs/design/subscriptions.md` §1–§3、§5;规则组见 `docs/runbook/rules.md`;W5-C 账本/完成/搜索见 `05-subscription-gap`(已删除,见 git `ceb66f8`) §4。
## 入口(SEARCH-2)
@@ -184,4 +184,4 @@ PATCH `status` 仍可直接改(旧行为),完成写 `subscription_history` 的
普通订阅按下载器确认接收和目标覆盖判断完成,完成原因 `download_accepted`;Slot 与下载/整理任务仍继续记录实际下载、核验和入库状态。多目标必须全部满足,剧集只有明确季集范围才能计覆盖,未知总集数不按整个季的通配预留伪造完成。洗版订阅仍按入库结果判断。
手动搜索、工作台和原站详情下载独立于订阅,不创建假订阅,也不会占用原订阅 Slot。要对现有订阅补全仍使用上面的 Slot 补全或自动评估入口。来源与验证见 [MP 对照 §5](../plan/15-moviepilot-v3-comparison.md#5-下载入口与浏览器详情页交接讨论记录)。
手动搜索、工作台和原站详情下载独立于订阅,不创建假订阅,也不会占用原订阅 Slot。要对现有订阅补全仍使用上面的 Slot 补全或自动评估入口。来源与验证见 [MP 对照 §5](../porting/moviepilot-v3-comparison.md#5-下载入口与浏览器详情页交接讨论记录)。