Skip to content

任务卡(codex 执行单元)

Roadmap 给出阶段与验收;本目录把阶段拆成可独立执行、独立验收的任务卡。 一张卡 ≈ 一个聚焦的 PR。codex 一次领一张,做完跑通「验收」再领下一张。

卡片约定

每张卡固定字段:

  • Phase / ID:所属阶段与编号(如 P0-03)。
  • Depends on:前置卡(没有则写 )。
  • Files:预计触碰的文件(指路,不是硬约束)。
  • Effort:S(<0.5d)/ M(~1d)/ L(>1d)。
  • Context:为什么做、背景。
  • Steps:有序步骤。
  • Acceptance:可勾选、尽量可自动化的验收项。
  • Out of scope:明确不在本卡内做的事(防止范围蔓延)。

通用规则(同 AGENTS.md):

  • 一次只做一张卡;保持 examples/vueexamples/react、site /shodo 可运行。
  • 收尾前跑 pnpm lint + pnpm typecheck
  • 决策与维护者意图冲突 → 先问。
  • 非请勿 commit。

P0 — Pixi v8 迁移 + 测试地基

目标:让 createPainter() 在 v8 真正跑起来 + 建测试地基。

现实校正(已验证):v8 依赖已就位且 build:lib 能过;v7 的 beginFill 等在 v8 是 deprecated 垫片(能跑)唯一阻断运行的是 Application async-init。所以 P0 硬核 = P0-02 + P0-06,其余多为可选 / 延后清理。

✅ 已完成(M1 达成):P0-02 + P0-04 迁 v8 并验证;P0-05 extract API v8 兼容;P0-06 测试地基(pnpm test vitest 5 + pnpm test:e2e examples/site);P0-07 examples/vue · site · react 均在 v8 跑通。P0-03(brush/eraser Graphics)按设计跳过——P1 用 raster 引擎删除这两文件。

ID卡片状态Depends onEffort
P0-01盘点并分类 v7 风格调用(🔴/🟡/⚪)建议先做S
P0-02Application async-init 修复(唯一运行阻断)🔴 必做P0-01M
P0-03Graphics:brush + eraser⚪ 可选(P1 会删)P0-02M
P0-04Graphics / name→label:canvas + board + layers🟡 可延后清理P0-02M
P0-05extract / 导出 API 核对🟡 低优先P0-02S
P0-06测试地基(vitest + headless 像素断言)🔴 必做P0-02M
P0-07回归:examples + demo 冒烟必做P0-02, 06S

P0 出口(里程碑 M1)✅ 已达成build:lib / build:react / typecheck / test(vitest 5) / test:e2e(examples + site) 全绿;examples/vue · site · react 均在 v8 运行。

P1 — RasterLayer + RenderTexture 后端 + 真橡皮(架构分水岭)

目标:笔迹从「Graphics 累加」→「戳印进图层 RenderTexture」;引入栅格图层、真橡皮、bbox 区域撤销。落两个新包 @saier/core无 Pixi)+ @saier/pixi

依赖链:01 → 02 →(03,04,07)05 → 06(pixi 侧);08 汇合 03/04/05/06/07;09 验收。core 侧(02/03/04/07)纯 TS,可与 pixi 侧(05/06)并行。

ID卡片Depends onEffort
P1-01脚手架 core + pixi 两包bothM
P1-02核心契约 types + 几何core01M
P1-03SimpleBrushEngine(spacing + 圆 dab)core02M
P1-04Document / RasterLayer / UndoManagercore02M
P1-05RenderTextureBackend(normal + 撤销)pixi02L
P1-06真橡皮(erase 合成)pixi05M
P1-07headless controller 表面(D7)core04S
P1-08集成进 pixi-painter(切绘画管线)pixi-painter03,04,05,06,07L
P1-09验收:分水岭三断言 + 冒烟test08M

P1 出口(里程碑 M2):5000 dab 节点数不增长 + 真橡皮 alpha=0 + undo 像素一致,三断言自动化通过;demo「能当线稿工具用」。

P2 — TiledSurface + tile undo(条件性)

目标:图层像素从「一张 RenderTexture」→「256×256 CPU tile」;绘制改 CPU 光栅化(为 P7 混色铺路);撤销改 tile patch;脏 tile 每帧批量上传。D1 下 P2 是条件性的——RenderTexture(P1)够用就先不做,要做大画布 / 混色 / 低内存撤销时再上。

依赖链:core 侧 01 → 0201 + P1-04 → 03;pixi 侧 01 + P1-05 → 04 → 0506 切换 + 验收。

ID卡片Depends onEffort
P2-01TiledSurface / Tile / dirty 模型coreP1-02M
P2-02CPU dab 光栅器(AA + 累积 + erase)coreP2-01L
P2-03tile 撤销(TilePatch)coreP2-01, P1-04M
P2-04PixiTileTextureBackend(显示)pixiP2-01, P1-05L
P2-05脏 tile 批量上传(rAF)pixiP2-04M
P2-06切后端 + 大画布 / 内存验收pixi-painterP2-03,04,05M

P2 出口(里程碑 M3 起步):tile 后端下 P1 三断言 parity;4096² 内存平稳;撤销只触脏 tile;每帧合并上传。

P3 — 输入质感:跟手(可与 P1 / P2 并行)

目标:让线条「跟手、顺、压感舒服」——这类工具的灵魂。core 侧输入层 + 收割 shodo。可与 P1/P2 并行,建议提前 spike 在现有管线先验手感。

依赖链:01 → 0201 + P1-03 → 0302,03 → 0405 触屏(并行);06 验收。

ID卡片Depends onEffort
P3-01PointerSampler + coalesced + 压感归一coreP1-02M
P3-02Stabilizer(moving avg → exp → lazy/rope)coreP3-01M
P3-03PressureCurve + 动态(size/opacity/taper)coreP1-03M
P3-04收割 shodo → CalligraphyEnginecoreP3-02,03M
P3-05触屏 / 手势(双指缩放 vs 单指画)pixiviewportM
P3-06跟手验收:确定性回放 + 延迟 + 基准testP3-02,03,04M

P3 出口:stabilizer 四档可量化区分;慢速圆无抖;确定性回放像素一致;触屏单指画 / 双指缩放分得清;真机手感留档。

P4 — 笔刷家族

目标:≥4 种笔刷(pen / pencil / marker / airbrush)+ shodo 毛笔,统一 BrushEngine 接口、统一 UI 切换。建立在 P1-03 引擎 + P3-03 动态之上。

ID卡片Depends onEffort
P4-01BrushPreset 模型 + 注册表coreP1-03, P3-03M
P4-02笔尖 / 戳印系统(两后端渲染)core+pixiP1-05, P2-02M
P4-03pen / pencil / marker 预设coreP4-01,02M
P4-04airbrush(时间累积流量)coreP4-01,02M
P4-05笔刷 UI(预设切换 + 参数)vueP1-07, P4-01M
P4-06笔刷家族验收testP4-03,04,05S

P4 出口:≥4 笔刷 UI 可切;airbrush 停驻累积、marker 单笔不发黑;golden 通过。

后续阶段(P5+)

P5–P9 的任务卡按需续写(P5-01-*.md …),参照同一格式与依赖链。优先级与取舍见 RoadmapRisks

Released under the MPL-2.0 License.