Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 12 additions & 7 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

中文 | [English](AGENTS.en.md)

本文件是所有人工开发者和 AI 代理必须遵守的项目级规则。开始修改前先阅读 [文档索引](docs/README.md) [AI 与开发自动工作流](docs/agent-workflow.md),再按任务风险阅读相关行为契约。普通任务不得遍历 `docs/archive/` 或历史更新日志归档。
本文件是所有人工开发者和 AI 代理必须遵守的项目级规则。每个连续需求首次开始修改前阅读 [文档索引](docs/README.md);只有 D2/D3、发布、性能或架构任务才加载 [AI 与开发自动工作流](docs/agent-workflow.md) 的对应章节,再按任务风险阅读相关行为契约。连续 Debug 不重复读取已经确认的规则,也不得遍历 `docs/archive/` 或历史更新日志归档。

## 文档语言边界

Expand Down Expand Up @@ -30,13 +30,14 @@

## dev.X 开发中

- 每个需求优先完成可体验实现;修改后最多进行一轮最低必要检查,然后立即交给用户体验。
- 默认运行 `pnpm check:dev -- <本任务文件...>`,开发模式必须显式传入文件列表,不允许回退扫描整个工作树。纯文档、文案、CSS 和视觉布局可以不运行应用测试。
- 普通 TypeScript(包括一般 Core、Store、Shared Debug)只运行类型检查和本次变更文件的定向模块边界检查;只有坐标、选区、撤销、文件格式、持久化、平台安全、共享核心算法,以及曾复发或难以人工发现的 Bug 使用 `pnpm check:dev -- --risk=high <源文件...> <相关测试文件...>`,并强制只运行显式列出的测试;Rust 与缩略图代码运行对应 `cargo check`。
- 每个需求优先完成可体验实现并尽快交给用户。D0、D1 和普通连续 Debug 不以自动测试或 `check:dev` 作为默认收尾动作;D2 只在实现稳定、准备结束本次需求时进行一轮最低检查;D3 在交付可能影响文档数据或核心语义的实现前进行一次最小安全检查。
- 开发检查按 D0-D3 分层:文档、文案和纯 CSS 为 D0,不运行应用检查;普通组件、菜单、弹窗、低频交互和简单显隐 Debug 为 D1,默认由用户直接验收,只有新增跨模块依赖或明确需要类型确认时才运行定向边界检查或 `--strict`;一般 Core、Store、Shared 和快捷键逻辑为 D2,稳定后最多运行一次相关 TypeScript 项目检查,不默认运行行为测试;坐标、选区、撤销、文件格式、持久化、平台安全、共享核心算法,以及曾复发或难以人工发现的 Bug 为 D3,使用 `pnpm check:dev -- --risk=high <源文件...> <直接相关测试文件...>`。Rust 与缩略图代码运行对应 `cargo check`。
- 开发期定向测试只用于 D3、明确复发问题、共享核心算法或用户明确要求测试的任务。默认只列出一个最直接的测试文件;只有改动同时跨越互相独立的高风险契约时才允许增加,不得为了“更放心”追加相邻的大型测试文件、完整测试或广泛回归。
- 同一需求的连续 Debug 复用已完成的风险判断、文档上下文和检查结果。D0-D2 中间轮次不重复检查,等用户确认现象解决或实现准备结束时再做唯一一次必要检查;除非出现确定的编译或测试错误、改动范围扩大或风险等级升级,否则不得重跑同一门禁。
- 用户负责布局、手感、动画、视觉和需求符合度的主观验收。除非用户明确要求,不运行浏览器自动点击、截图对比、桌面自动验收或完整构建。
- 开发期间不运行 `check:maintenance`、完整测试、完整 CI、性能基准,不更新发布日志、性能历史或一般回归矩阵,也不为每个问题提交、推送或打包。
- 只有任务触及组件写文档、撤销模型、工程编解码、恢复、Core 依赖或根 Store 职责时,才在本轮最低检查中追加一次 `pnpm check:architecture`;普通 UI、文案和连续 Debug 不运行该全仓静态门禁。
- 日常 D0/D1 只读本文件、中文文档索引和直接相关的中文契约;发布、性能、历史审计、ADR 和英文镜像只在任务确实触及时读取。
- 日常 D0/D1 只读本文件、中文文档索引和直接相关的中文契约,不加载完整工作流;发布、性能、历史审计、ADR 和英文镜像只在任务确实触及时读取。首次进入需求时检查一次 `git status`;连续 Debug 只检查本次目标文件的现有差异,避免反复扫描整棵工作树
- 有确定的编译或测试错误时可以修复后重跑;没有确定证据时不得继续猜测式修改。连续两轮仍未解决,必须报告现象、根因判断和下一步,不得自行扩大调查或重构。

## dev.X 发布
Expand All @@ -57,6 +58,7 @@
- 优先复用 `NumberInput`、`ThemedSelect`、`ColorPicker`、现有按钮、弹窗、栏目和分段控件。
- 新增可复用组件时,必须加入 `COMPONENT_LIBRARY_ENTRIES` 并在 `previewRenderers` 提供可交互预览。
- 预览应覆盖默认、选中、禁用和交互状态。
- 生产界面的操作、状态、工具和导航图标只能使用组件库已登记的像素图标组件或像素资产,严禁新增或继续使用 `lucide-react` 等矢量图标库、任意内联矢量图标、图标字体或 Emoji 图标。组件库缺少所需图标时,必须先新增像素图标、登记条目并补齐预览,再在业务界面使用;不得用矢量图标临时代替。修改已有界面时,触及范围内的既有矢量图标也必须替换为组件库像素图标。
- UI 容器保持直角,主要选中和操作颜色统一使用 `#2979FF`。
- 1024 x 640 及主要桌面尺寸的最终视觉检查由用户完成;只有用户明确要求时才自动截图验收。

Expand All @@ -80,10 +82,13 @@
## 命令入口

```powershell
# 连续开发:只检查本次文件
# D2 实现稳定后:只检查本次文件,不默认运行行为测试
pnpm check:dev -- <本任务文件...>

# 高风险开发:只运行显式列出的定向测试
# D1 只有明确需要类型确认时才使用 --strict
pnpm check:dev -- --strict <本次实际修改文件...>

# D3 高风险开发:类型检查 + 最小直接回归测试
pnpm check:dev -- --risk=high <源文件...> <相关测试文件...>

# 仅在触及受保护架构边界时追加
Expand Down
3 changes: 1 addition & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,11 @@

### 修复

- Tauri 桌面冒烟检查改为解析 CSP 的 `connect-src` URL,并仅接受精确的 `ipc.localhost` 主机,避免路径或子域名伪装通过安全校验。

## 版本索引

| 版本 | 完整记录 |
| --- | --- |
| `1.0.0-beta.1` | [查看 1.0.0-beta.1 完整更新记录](docs/changelog/1.0.0-beta.1.md) |
| `DEV.6` | [查看 DEV.6 完整更新记录](docs/changelog/DEV.6.md) |
| `DEV.5` | [查看 DEV.5 完整更新记录](docs/changelog/DEV.5.md) |
| `DEV.4` | [查看 DEV.4 完整更新记录](docs/changelog/DEV.4.md) |
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

MoonSprite 是面向 Windows 的原创源码可见像素画工作台,使用 Tauri 2、React、TypeScript、Zustand 和 Canvas 构建。项目与 Aseprite 无隶属关系,也不使用其源码、品牌或视觉资产。

当前开发通道为 `DEV.6`,内部版本为 `0.1.0-dev.6`。
当前 Beta 通道与最近一次已打包版本均为 `1.0.0-beta.1`。

## 当前能力

Expand Down
48 changes: 48 additions & 0 deletions THIRD_PARTY_NOTICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,51 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

### OpenToonz TAutocloser

MoonSprite's smart line-gap closure is adapted from the topology-preserving
skeleton and oriented-endpoint pipeline used by OpenToonz `TAutocloser` at
https://github.com/opentoonz/opentoonz (reviewed at commit
`a7c0ae37905e7390b94e36193406d2c417ee5161`).

OpenToonz

All contributions by DWANGO:
Copyright (c) 2016 - 2026, DWANGO Co., Ltd.
All rights reserved.

All other contributions:
Copyright (c) 2016 - 2026, the respective contributors.
All rights reserved.

Each contributor holds copyright over their respective contributions.
The project versioning (Git) records all such contribution source information.

BSD 3-Clause "New" or "Revised" License

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

3. Neither the name of the copyright holder nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
2 changes: 1 addition & 1 deletion docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
- [状态与历史](architecture/state-history.md):会话、dirty、撤销和视图状态。
- [坐标与渲染](architecture/coordinates-rendering.md):屏幕、视图、画布和图层坐标。
- [多语言架构](architecture/localization.md):语言资源、回退、持久化和新增语言门禁。
- [文件格式](file-format.md):`.moonsprite` v17 容器。
- [文件格式](file-format.md):`.moonsprite` v18 容器。

## 交互契约

Expand Down
8 changes: 4 additions & 4 deletions docs/adr/0005-project-metadata-and-timelapse.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,19 @@

## 背景

重新打开工程后,网格可见性必须继续跟随对应工程,而缩放和平移等导航状态必须仅存在于会话中。工程统计与缩时录制也需要在保存和恢复后保留,但不能进入文档撤销栈。记录原始指针事件会让回放依赖工具实现细节;保存原始尺寸的完整快照则会让工程体积失去实际上限
重新打开工程后,网格可见性必须继续跟随对应工程,而缩放和平移等导航状态必须仅存在于会话中。工程统计与缩时录制也需要在保存和恢复后保留,但不能进入文档撤销栈。记录原始指针事件会让回放依赖工具实现细节;缩时快照应使用压缩后的合成图像,并接受工程体积随记录数量增长

## 决策

- 仅将像素网格可见性、自定义网格可见性和自定义网格几何作为工程显示元数据持久化。缩放、平移、旋转和镜像保留在会话中。
- 持久化已提交操作数、绘制笔划数和活动绘制时长的规范化计数器。
- 启用缩时录制时,在文档操作提交边界捕获一张合成 PNG。视图操作和栏目操作不触发捕获。
- 将缩时 PNG 文件保存在 `timelapse/` 下,并在清单中保存其元数据。活动快照列表最多保留 600 项;达到上限时对较旧项降采样
- 启用缩时录制时,在文档操作提交边界捕获合成 PNG。视图操作和栏目操作不触发捕获。录制方式为“全程录制”时每次操作都保留;为“智能裁剪”时按已保留快照数量分级采样:达到约 120 帧后将采样间隔翻倍,并把已有快照按二分之一频率抽样,之后每次再次达到约 120 帧都重复该过程
- 将已保留的缩时 PNG 文件保存在 `timelapse/` 下,并在清单中保存其元数据。全程录制不设置固定快照数量上限;智能裁剪在约 60–120 帧的分级采样区间内控制记录量,只压缩后续达到档位边界时的已有快照,切换方式不删除已有快照,导出时再按目标时长或帧率进行采样
- 通过 Renderer 的 `MediaRecorder` 支持将记录的快照导出为真实视频。MP4 与 WebM 独立提供;编码前使用 `MediaRecorder.isTypeSupported()` 检查所选容器。若运行环境不能提供请求的编码器,则显示明确错误,不生成扩展名与内容不匹配的文件。

## 结果

网格选择可以按工程保存,同时不会序列化临时导航状态。缩时录制只在明确启用时增加 CPU 工作和工程体积。基于快照的录制不依赖撤销内部结构和未来工具实现,但无法重建两次已提交编辑之间的中间指针移动。
网格选择可以按工程保存,同时不会序列化临时导航状态。缩放和平移等导航状态不会进入文档历史。全程录制的体积随完整快照历史增长,智能裁剪通过逐级降低采样频率和重采样历史快照控制增长。基于快照的录制不依赖撤销内部结构和未来工具实现,但无法重建两次已提交编辑之间的中间指针移动。

## 替代方案

Expand Down
2 changes: 1 addition & 1 deletion docs/adr/0016-free-tile-source-and-instances.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Tilemap 以固定单元格保存瓦片引用,不能表达互相重叠或位于
- 用户可以像普通图层一样移动和设置自由瓦片图层,同时在任意像素位置重复使用并重叠同一源瓦片。
- 修改一个源瓦片会稳定更新当前图层全部帧中的引用,且不会把重复像素写入每个实例。
- 所有修改自由瓦片内容的路径都必须先更新源数据再重建缓存;直接把自由瓦片 surface 当普通像素写入会破坏可编辑性,必须拒绝或显式转换为普通图层。
- 每个自由瓦片图层复制或跨文档粘贴时必须复制全部源 Tileset,并为源生成新 ID 后重映射所有实例;两个图层不得共享同一个源或 Tileset
- 自由瓦片源与实例的分离保持不变;图层之间的源所有权规则已由 [ADR 0022](0022-shared-free-tile-sets.md) 扩展为显式 `freeTileSetId` 集合共享。复制或跨文档粘贴仍必须为粘贴批次创建新的集合身份,不得引用来源工程资源

## 替代方案

Expand Down
2 changes: 1 addition & 1 deletion docs/adr/0017-shared-tilemap-tilesets.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
- 新建 Tilemap 图层弹窗默认选择新增 Tileset,也可选择当前工程已有的 Tilemap Tileset。
- 选择已有 Tileset 后,图层网格尺寸采用该 Tileset 的 `tileWidth` 与 `tileHeight`,创建只增加空白 Tilemap cel,不复制 Tileset。
- 多个 Tilemap 图层可以共享同一个 Tileset;共享 Tileset 的像素、槽位和瓦片引用修改由现有 Tileset 领域命令统一重绘全部引用。
- 自由瓦片源的单瓦片 Tileset 所有权保持独占,不允许通过 Tilemap 创建器选择自由瓦片源 Tileset
- 自由瓦片源的单瓦片 Tileset 不允许通过 Tilemap 创建器选择;自由瓦片图层之间的集合级共享由 [ADR 0022](0022-shared-free-tile-sets.md) 定义
- 共享 Tileset 不跟随任意单独图层改名;只有唯一 Tilemap 引用者才保持旧的名称同步行为。删除引用图层时,只在无其他所有者或格子引用时清理 Tileset。
- 该关系使用现有 `tilemapTilesetId` 字段,不提升工程 schema 版本;旧工程格式仍按原验证规则读取。

Expand Down
Loading
Loading