该技能面向游戏 Mod 项目的启动、恢复和整理,重点解决一个常见问题:Mod 项目并不只是一个文件夹,其中至少包含源码、打包、发布和状态四类内容,一旦混放,安装器可能失效,项目也难以安全修复。资料强调,FOMOD 包可以是合法的包根目录,但它不等于项目根目录,更不应存放缓存、旧快照或笔记。使用前应先参考 workspace-organization 中的 WORKSPACE_OWNERSHIP.md,明确唯一负责人和发布边界,本技能在此基础上补充 Mod 专用布局和安全修复流程。
标准布局
资料给出的规范结构包含:WORKSPACE_OWNERSHIP.md(负责人与发布意图)、README.md(公开页面)、CHANGELOG.md、LICENSE、.gitignore;VERSION 或 .uabs/state.json 作为当前版本来源;src/ 存放 ESP 源码、Papyrus、C++ 和脚本;assets/ 存放美术、音频、纹理、网格和 blend 源文件;package/ 存放干净的安装树,如 fomod/、00 Core/、01 ...;docs/ 存放笔记、计划、决策和展示材料;dist/ 存放发布压缩包(应被 git 忽略);.uabs/ 存放状态、构建回执和备份(应被 git 忽略);tools/ 存放项目本地构建与打包脚本。小型 Mod 可以把包放在项目根目录,即 fomod/、00 Core/、01 ... 与 src/、docs/、dist/、.uabs/ 并列,但前提是根目录包就是当前包,且没有其他杂物堆在那里。版本快照、缓存和旧包应放在 dist/versions/、dist/archive/ 或项目之外。
先分类再移动
资料按类型给出规则:source(src/、source/、scripts/、C++/Papyrus 源码)保留并在此编辑;package(fomod/、00 Core/、01 ...、meshes/、textures/、skse/、seq/)按安装方式原样发布,不得重命名;release(publication/、release/、dist/、压缩包)是生成物,不能当作源码编辑;state(STATE.md、PLAN.md、DECISIONS.md、VALIDATION.md、CURRENT.txt、VERSION、.manifest.json)只保留一个版本来源,状态不是发布;research(RECOVERY/、RESEARCH/、ghidra-、pseudocode/、notes)放在包外,归档到 research/;cache(build/、obj/、vcpkg/、extern/、ForgeVault/、ForgeWorkspaces/、.venv/、node_modules/)应忽略或迁移,绝不能随包发布。
版本来源只能有一个。资料指出,CURRENT.txt、VERSION、fomod/info.xml 和 publication/<ver> 是四个来源,它们迟早会互相矛盾。应保留一个 VERSION 或 .uabs/state.json 作为权威,让 FOMOD 和发布产物继承它;只有检查引用后,才能把旧包放到 dist/versions/<ver>/。
FOMOD 路径依赖
fomod/ModuleConfig.xml 指向 00 Core/、01 ... 和具体文件名。移动或重命名这些文件夹会破坏安装器,即使文件仍然存在。因此 FOMOD 根目录必须视为路径依赖,不能随意移动。
分析与修复
在重新整理前应先运行分析器:python TOOLS/workspace_doctor.py <project>,或使用 --json <plan>.json --markdown <plan>.md 输出报告。它会按类型报告条目,标记过期的根 FOMOD(例如根目录为 2.0.4 而 CURRENT.txt 写 3.0.0),统计版本快照数量,查找嵌套缓存如 github-repo/build 或 TOOLS/vcpkg,并检查候选文件是否被文本引用。--apply 的行为刻意保守:只移动高置信度、未被引用的零散媒体、笔记和文档;在 .uabs/workspace-backup/<timestamp>/ 写入备份清单;不删除任何内容;不移动 FOMOD 根、版本快照、嵌套 Git 仓库、.esp/.esm/.esl/.bsa/.ba2/.nif/.dds/.hkx/.pex/.dll 资产或路径依赖文件;目标已存在时跳过而不是覆盖。因此安全流程是:分析,然后阅读复核清单,再移动明显杂物,随后有意归档旧快照,最后重新运行分析器。不要强迫工具“修复”路径依赖的包。
工作区已经很乱时
先读 WORKSPACE_OWNERSHIP.md 和 CURRENT.txt/VERSION,负责人记录优先于文件夹名称。运行 workspace_doctor.py 并阅读警告,过期的根 FOMOD 是发布阻断项,不能当作表面问题。选择 FOMOD 版本与 CURRENT.txt 匹配的当前包;如果都不匹配,先停下并核对版本,再移动任何东西。只有在项目中检索过旧快照名称后,才能把它们归档到 dist/versions/<ver>/;如果脚本或 README 引用了旧路径,就保留它并记录依赖。把缓存移出包外或加入 .gitignore,绝不能发布 build/、vcpkg/、ForgeVault/ 或 Ghidra 缓存。之后重新运行分析器和 Mod 发布检查。资料明确提醒:一个破坏 FOMOD 的更整洁目录,比原本的杂乱更糟。
完成标准
资料给出的完成状态包括:只有一个当前版本来源,且 FOMOD/发布产物与之一致;只有一个当前包根,旧快照已归档而非散落;源码、包、发布和状态相互分离;缓存被忽略或位于包外;workspace_doctor.py 不再显示过期根警告,也没有未复核的路径依赖移动;WORKSPACE_OWNERSHIP.md 和 STATE.md 写明负责人、当前版本和下一步。资料还提示,公开展示使用 mod-presentation;Skyrim 的版本文件夹规范使用 skyrim-versioned-workspace;含 ! 或 junction 的路径使用 windows-workspace-ops。