# 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` 标签。 未指明 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.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 ` ## CAD 查看器 Viewer 随 `cadgen` 包分发(服务端 + 预构建客户端)。启动: ```bash cd /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 ` 可校验版本匹配。 - 详细手册(启动契约、复用、目录扫描陷阱)见 `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)。