Files
triplestone 156bce0183 chore: 删除 matx-case 与 engine-case
自有机箱只保留 modular-case。文档中的当前模型清单同步去掉这两项。
2026-10-12 14:39:34 +09:00

192 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AGENTS.md
本仓库是用于开发 CAD 相关智能体技能的工作台。将 `skills/` 视为产品目录,
将 `models/` 视为自有设计与共享夹具目录。框架来自
[earthtojake/text-to-cad](https://github.com/earthtojake/text-to-cad)
(0.7.19 基线,2026-10-09 跟进合并);三端同步与框架跟进操作手册见 `GIT_SYNC.md`。
## 分支与目录布局
- 本仓库(fork)唯一工作分支是 `master`:Windows 与 fnnas 两端直接在 master 上
工作,origin 指向 fnnas Gitea(唯一允许 push 的远端),GitHub upstream 物理禁推。
- 向上游贡献时遵循上游规则:`main` 是唯一长线分支,从 `main` 拉分支、
PR 回 `main`,不直接推送 `main`。
- 0.5.0 起不再有 develop 符号链接布局——树中每个路径都是真实文件;
不要引用或重建 `scripts/dev/setup-symlinks.sh` 一类机制(已随上游移除)。
## 发布流程
日常开发期间,不要修改根目录 `VERSION` 中的规范发布版本(仓库根就是
插件包,根部 `plugin.json`、`mcp.json`、`*.mcp.json`、`skills.sh.json` 等
清单与 MCP 配置齐全,规范版本号从
`plugins/cad/VERSION` 移到根 `VERSION`)。发布只能通过 GitHub Actions 的
`Prepare Release` + `Publish Release` 两个工作流在 `main` 上进行:前者开并合入
版本号 PR(连同 `VERSION`、派生元数据和所有 skill 的 `cadgen==` 锁定),后者在
该合并推送上构建 `cadgen` wheel、发布 PyPI、部署文档并打 `v<VERSION>` 标签。
未指明 patch/minor/major 或确切版本时,先询问再触发。`target=build-test` 是
流水线演练,仅在明确要求测试 CI/CD 时使用,绝不是正式发布。本 fork 托管在
Gitea、不运行这些工作流;完整流程、恢复路径与本地后备方案见 `CONTRIBUTING.md`
的 Releases 章节。
开发环境安装 `requirements-dev.txt`,不要单独安装某个 skill 的
`requirements.txt`(那会从 PyPI 拉上一个正式版 cadgen)。
## 仓库目录
- `skills/`:智能体技能及其参考资料和脚本。
- 根部 `plugin.json`、`mcp.json`、`claude.mcp.json`、`codex.mcp.json`、
`cursor.mcp.json`、`gemini-extension.json`、`skills.sh.json`:智能体插件清单与
MCP 配置;仓库根本身即插件包(上游 0.7 起不再有 `.claude-plugin/` 等子目录)。
- `models/`:示例及长期保留的 CAD/机器人描述夹具;其中 `modular-case`、
`modular-drawer`、`smart-farm`、`toast-inner-core`、`freecad`
为本仓自有设计(只入库设计源码,产物由 `.gitignore` 的 models 规则忽略)。
- `apps/web/`:CAD Viewer 的 React 客户端(其后端是 `cadgen.viewer`);
`apps/api/`:版本发布页 API;`apps/mcp/`:CAD app 的 MCP host。
- `packages/cadgen/`:发布的发行版——STEP/GLB/拓扑生成、skill CLI 解析器、
Viewer 后端与客户端及其运行时。
- `packages/core/`:共享的 JS CAD、渲染及运行时核心(不依赖 React),打进
cadgen 运行时与各 app;`packages/ui/`:共享 React UI 组件与渲染器。
- `apps/docs/`:文档站点。
- `tests/`:由仓库根目录管理的技能、软件包、Viewer 服务及仓库级策略测试套件。
- `scripts/`:按用途分组、可长期维护的仓库命令。
## 仓库规则
- 根目录指南保持简短。领域工作流、CLI 细节和验证策略放在相应的
`skills/<skill>/SKILL.md` 或 `references/` 文件中;各包边界与设计法则见
`packages/cadgen/README.md`、`packages/core/README.md`、`packages/ui/README.md`、
`apps/web/README.md` 与 `apps/docs/README.md`。
- `packages/cadgen` 必须可脱离本仓库独立运行(ships-alone),其文档不得引用
包外路径(`tests/python/global/test_package_boundaries.py` 强制)。
- 行为、命令或仓库布局发生变化时,同步更新相关 Markdown 文档,但不要让
`AGENTS.md` 过度膨胀;该文件只保留长期有效的仓库级规则和指引。
- 在提交、变基、解决生成文件冲突或更新发布版本前,先阅读 `CONTRIBUTING.md`。
- 每个技能在运行时必须自包含且相互独立,不得引用、导入或依赖其他技能、
`skills/` 根目录或仓库根目录模块,也不得把仓库路径加入运行时查找路径。
共享运行时辅助工具以 `packages/` 下的代码为事实来源,再植入或生成到各
消费方的技能运行时中。
- 使用限定路径的搜索和验证命令,并检查 `git status`;除非任务需要,避免
广泛扫描生成的 CAD/LFS 产物。
- 根 `VERSION` 是规范发布版本。不要手动修改软件包、锁文件或 Python
`pyproject.toml` 中的重复版本;发布准备流程和 `scripts/bundle/bundle.sh`
会根据规范版本写入这些值。
- 生成运行时或插件包相关源码变更时,用主打包封装脚本
`scripts/bundle/bundle.sh` 刷新或检查。
- `packages/core` 必须保持可复用且不依赖 React;React UI 放在 `packages/ui`,
应用 UI 和工作流状态放在 `apps/web|api|mcp` 中。
- 模型脚本只依赖 build123d;总装标签与着色用各模型自含的 `AssemblyHelper`,
不导入相邻模型目录,也不依赖仓库自维护的 Python 包。
- `models/` 只入库设计源码(`.py`/`.md`/配置),STEP/STL/GLB/DXF/URDF/G-code
等生成产物一律不入库,在目标端按需重新生成。
- `scripts/` 仅用于可长期维护的仓库命令;一次性脚本放 `tmp/`。
- 不要提交 `.venv/`、`node_modules/`、缓存、`tmp/`、本地凭据或打印机配置。
## 环境
- 进行 CAD Python 工作时,优先使用 `./.venv/bin/python`(Windows 为
`.venv/Scripts/python.exe`):`py -3.12 -m venv .venv`、
`pip install build123d==0.11.1`,再装 `requirements-dev.txt`。已知坑:
build123d 0.11.1 导入扫描系统字体,
`C:\Windows\Fonts\msttc.ttf` 非标准 TTF 会崩;重建 venv 后需重打
text.py 的 register_font try/except 补丁。
- Viewer 运行时随 `cadgen` Python 包分发,运行时无需 Node;仅修改 Viewer
或 core/ui 源码时才需要 Node 工具链(仓库根 `npm install`,workspace 布局)。
- 只安装当前变更工作流所需的依赖。
- 仅当用户提出要求或任务针对 `models/` 下特定文件时才物化 LFS 对象;
`.lfsconfig` 默认排除 `assets/**`、`models/**` 的 fetch。
## 检查
运行能够覆盖变更的最小范围、路径定向检查。修改共享功能或交付前,使用覆盖
范围更广的封装命令:
- 代码测试:`scripts/test/test.sh`
- 定向测试运行器:`scripts/test/test-js.sh`、`scripts/test/test-docs.sh`、
`scripts/test/test-python.sh`、`scripts/test/test-global.sh`
- 规范发布版本:`scripts/release/check-version.sh`
- 生成运行时新鲜度:`scripts/bundle/bundle.sh --check`
- CAD Viewer、`packages/core`、`packages/ui`:`npm --prefix packages/core test`、
`npm --prefix packages/ui test`、`npm --prefix apps/web run test`、
`npm --prefix apps/web run build`。
Viewer 后端套件在 `tests/python/packages/cadgen/viewer`,由
`scripts/test/test-python.sh` 覆盖;改 `cadgen/viewer/` 必须跑它。
- 文档站点:`npm --prefix apps/docs run check`
- 定向 Python 测试:`./.venv/bin/python -m unittest <changed test paths>`
## CAD 查看器
Viewer 随 `cadgen` 包分发(服务端 + 预构建客户端)。启动:
```bash
cd <repo>/models && cadgen viewer --host 127.0.0.1 --json --detach
```
- `--detach` 必带:前台 viewer 永不退出,detach 后台运行并立即返回 JSON。
- 启动目录(cwd)就是被服务的目录,也是实例复用键——务必从 `models/` 启动,
不要在 skill 目录内启动。
- 命令总是返回一个可用 URL(`action: started|reused`);端口从 3245 起自动
递增,不要手动选端口或停止他人启动的实例。
- `cadgen` 在开发环境来自 `requirements-dev.txt` 的 editable 安装(版本须与
根 `VERSION` 一致,`cadgen doctor` 可校验);
`cadgen doctor <skill 目录>` 可校验版本匹配。
- 详细手册(启动契约、复用、目录扫描陷阱)见 `skills/cad/SKILL.md`
与 `apps/web/README.md`。
## `models/modular-case` 当前模型
该模型是 175×225×254 mm 的直立塔式 mATX 机箱,目标主板为 Intel B75 / LGA1155
Micro-ATX(24.4×17.5 cm)。统一使用世界坐标:X 为左右宽度
(左板 X=0、右板 X=size_x;PSU 仓在左、主板仓在右)、Y 为前后深度(前面板 Y=0)、
Z 为垂直高度。组件、面板、骨架和总装公共入口都必须直接返回最终方向;
旧顶层 `config.py`、`core_skeleton.py`、`modular_case/specs.py` 和 `modular_case/coordinates.py` 已删除,不得恢复双坐标系。
设计数据(外购件规格、标定、尺寸、布局、跨件接口)唯一定义在 `modular_case/config.py`,
尺寸按世界轴命名(`size_x/size_y/size_z`、`*_xz` 等),其他文件只引用不另存。
- 骨架在 Z=127 mm 拆为上下两段,通过 15 mm 搭接区和 6 颗 M3 贯穿螺栓连接
(两段均为 Ø3.3 过孔 + 垫片螺母锁紧,合拢对正由螺栓孔承担);上段基体
在搭接区让位,与下段舌板贴合互锁,打印件两两不得实体交叠
(`test/test_printed_interference.py` 强制)。中板有
5 个胶囊减重窗及 37 mm 前部走线通道。快速模式顶底盖板为实心板;详细模式(打印导出用)
底板为纵向直槽梯格(2.2 mm 槽、三段式、中板带 18 mm 实心脊),顶板为斜分区的三角孔/
斜槽/直槽并带主板仓后部两段式出风槽。
- 前上板默认使用斜向百叶,可显式选择蜂窝版本;前下板只开圆形凹面开机键(实测无锁
微动的两段式开关仓:前段与前下板一体——帽头行程孔 + 托板 + 多头内螺纹筒,后段为
外螺纹杯 part.button_chamber_rear;按钮为插柱式——颈端十字插孔、开关可 90° 任意
旋转安装,帽从机箱外压装在按柱插头上、由开关弹簧定位回弹;开关先放入杯内
(引脚占本体背面上半部、朝上,焊线从杯底上半开口穿出)随杯一起从机箱内拧入,
杯口沿抵托板背面压紧,拧到底时方腔回正、杯尾对位刻线朝上),从机箱内拧螺丝固定。
左右板、后板及所有内部组件均为独立可引用部件。
- 后板主板 IO 区为打印式开孔(原装金属挡片弃用):`IO_PORTS.openings` 为实测接口
壳体外廓(板局部坐标),开孔每边外扩 `IO_PORTS.hole_clearance`;外侧凹槽由开孔
外包加 `IO_PORTS.groove_margin` 派生(`IO_GROOVE_XZ`),机箱侧只经
`LAYOUT.motherboard` 平移;接口前端面与凹槽底面同平面(`IO_PORT_FACE_Y`)。
后板下沿保留 `IO_PORTS.bottom_rim`(2.4 mm)完整底边,凹槽下沿与开孔切刀都裁在
该边之上,底盖后缘不设让位。`IO_PORTS.offset_x`、`IO_PORTS.offset_z`、
`IO_PORTS.scale_z` 留给 `io_plate_coupon` 回写。标定流程见
models/modular-case/README.md 与 calibration/README.md。
- 总装默认使用快速模式,不生成面板蜂窝、mesh 等高成本细节;只有单面板预览或显式
`--detailed` 才完整生成。默认配色为黑色,可选蓝白、红黄主题。
- 紧固件默认采用 M3 成形攻丝;方形角柱可扩孔安装热熔铜柱。骨架搭接区为
6 颗贯穿螺栓配垫片螺母。
主板安装例外:6+4 铜柱旋入中板成形攻丝孔(PCB 背面 X=105,底孔 Ø3.0 暂定、待
`standoff_tap_coupon` 标定);完整总装默认选件为
前板蜂窝、左右板 `panel.left.slanted`/`panel.right.slanted`,快速/完整模式默认不变。
- 详细设计、命令和当前风险见 `models/modular-case/README.md`。当前测试全部通过;遗留项均
标状态管理(前板留缝只针对旧打印件,当前斜接不得留缝;硬盘笼运输防滑、SATA 转接背板推迟;按钮仓键控
宽牙与左板 PSU 进风已按试装闭环;PCIe 嵌板 P1 推迟),清单与触发条件以 README「遗留问题与建议」
为准,打印与装配顺序同样以 README 为准。
## Git 与大文件存储
本仓树只保存代码与小型文本夹具(2026-09-13 决策):上游 0.5.0 合并带入的
LFS 指针夹具(assets 3 个演示 GIF、`models/drawings/DXF/imported/` 9 个 DXF、
`models/thang010146/STEP/imported/` 3 个 STEP)已全部从树中移除,二进制一律
不入库;后续合并上游若再带回这些路径,按删除解决。例外:15KB 的
`models/examples/imported/import-smoke.step` 为 viewer 启动测试引用的文本
夹具,保留。`.gitattributes` 的 LFS 规则保留作防线(误加二进制时退化为指针
而非巨型 blob)。执行 `git add`、提交或其他写入对象的操作时,绝不能禁用
LFS 过滤器;纯源码提交普通 `git push` 即可,仅当提交携带 LFS 指针文件且被
pre-push 拦截时才允许 `--no-verify`(Gitea LFS 端点 502,见 GIT_SYNC.md)。
本地钩子位于 `.githooks`,并通过 `scripts/git-hooks/pre-commit` 委托构建
检查。强推只允许指向 origin(Gitea)。