|
| 1 | +# Maintenance Workflow |
| 2 | + |
| 3 | +## Purpose |
| 4 | + |
| 5 | +这份文档定义 `godot-toolbox` 的维护流程,目标是让模板、插件、pack、脚本和验证都围绕同一套步骤演进,而不是靠记忆维持。 |
| 6 | + |
| 7 | +## Scope |
| 8 | + |
| 9 | +这份流程覆盖 5 类活动: |
| 10 | + |
| 11 | +1. 评估一个新模板或插件是否值得纳入 |
| 12 | +2. 首次把一个上游插件导入工具箱 |
| 13 | +3. 升级一个已经纳入的插件 |
| 14 | +4. 用工具箱组装一个新项目 |
| 15 | +5. 验证本次改动是否维持了工具箱闭环 |
| 16 | + |
| 17 | +## Source Of Truth |
| 18 | + |
| 19 | +维护时优先以这些文件为准: |
| 20 | + |
| 21 | +- `docs/selection-framework.md` |
| 22 | +- `docs/plugin-integration-standard.md` |
| 23 | +- `packs.manifest.json` |
| 24 | +- `upstreams.lock.json` |
| 25 | + |
| 26 | +如果实际行为发生变化,这四处内容必须同步。 |
| 27 | + |
| 28 | +## A. 评估适配度 |
| 29 | + |
| 30 | +引入新模板或插件前,先回答这些问题: |
| 31 | + |
| 32 | +1. 它解决的是 `base` 问题还是场景化 `pack` 问题? |
| 33 | +2. 它是否适合脚本化、headless、CI 和 agent 调用? |
| 34 | +3. 它是否强绑定某个项目的玩法、文案或业务真相? |
| 35 | +4. 它的升级与维护成本是否可控? |
| 36 | +5. 它是否能通过本地脚本验证,而不是只能靠编辑器手工点击? |
| 37 | + |
| 38 | +结论只有 4 种: |
| 39 | + |
| 40 | +- 进入 `base` |
| 41 | +- 进入某个 `pack` |
| 42 | +- 只保留为外部参考 |
| 43 | +- 暂不纳入 |
| 44 | + |
| 45 | +### 进入 `base` |
| 46 | + |
| 47 | +必须同时满足: |
| 48 | + |
| 49 | +- 自动化价值高 |
| 50 | +- 复用面广 |
| 51 | +- 领域耦合低 |
| 52 | +- 有稳定的本地验证路径 |
| 53 | +- 不依赖重度人工编辑器操作 |
| 54 | + |
| 55 | +### 进入 `pack` |
| 56 | + |
| 57 | +满足以下大部分即可: |
| 58 | + |
| 59 | +- 在一个明确主题内价值高 |
| 60 | +- 不适合所有项目默认启用 |
| 61 | +- 可以按项目需要叠加 |
| 62 | +- 不会接管项目核心真相 |
| 63 | + |
| 64 | +## B. 首次导入上游插件 |
| 65 | + |
| 66 | +首次导入时,按下面流程执行: |
| 67 | + |
| 68 | +1. 确认 upstream 来源和版本可固定 |
| 69 | +2. 决定它进入 `base` 还是某个 `pack` |
| 70 | +3. 运行导入脚本 |
| 71 | +4. 更新 lock / manifest / 文档 |
| 72 | +5. 跑验证 |
| 73 | + |
| 74 | +### 导入命令 |
| 75 | + |
| 76 | +```bash |
| 77 | +./scripts/import_plugin_from_upstream.sh \ |
| 78 | + --id=<plugin_id> \ |
| 79 | + --repo=<git_url> \ |
| 80 | + --target=<repo_relative_target_dir> \ |
| 81 | + --pack=<base|validation|debug|stateful|juice> \ |
| 82 | + --version=<display_version> |
| 83 | +``` |
| 84 | + |
| 85 | +必要时补充: |
| 86 | + |
| 87 | +- `--ref=<git_ref>` |
| 88 | +- `--source-subdir=<path_inside_upstream>` |
| 89 | +- `--note=<text>` |
| 90 | +- `--dry-run` |
| 91 | + |
| 92 | +### 导入后必须确认 |
| 93 | + |
| 94 | +- 目标目录下有 `plugin.cfg` |
| 95 | +- `upstreams.lock.json` 写入了正确条目 |
| 96 | +- `packs.manifest.json` 中 pack 与插件归属一致 |
| 97 | +- README 或相关文档反映了这个新能力 |
| 98 | + |
| 99 | +## C. 升级已纳入插件 |
| 100 | + |
| 101 | +升级时,优先基于 lock 文件,而不是手工复制 vendor 目录。 |
| 102 | + |
| 103 | +### 升级命令 |
| 104 | + |
| 105 | +```bash |
| 106 | +./scripts/update_plugin_from_upstream.sh --id=<entry_id> --version=<display_version> |
| 107 | +``` |
| 108 | + |
| 109 | +建议先预演: |
| 110 | + |
| 111 | +```bash |
| 112 | +./scripts/update_plugin_from_upstream.sh --id=<entry_id> --version=<display_version> --dry-run |
| 113 | +``` |
| 114 | + |
| 115 | +### 升级时的原则 |
| 116 | + |
| 117 | +- 如果只是验证能否切到某个版本,先用 `--dry-run` |
| 118 | +- 如果显式传了 `--version`,应优先按新版本解析 ref |
| 119 | +- 无效版本应直接报错,而不是回退默认分支 |
| 120 | +- `tool-only` 条目只更新 lock metadata,不自动改写目标文件 |
| 121 | + |
| 122 | +### 升级后必须确认 |
| 123 | + |
| 124 | +- `upstreams.lock.json` 中的 `version/ref` 与实际 checkout 一致 |
| 125 | +- vendor 目录或 tool metadata 没有意外回退 |
| 126 | +- 所有验证仍通过 |
| 127 | + |
| 128 | +## D. 组装一个新项目 |
| 129 | + |
| 130 | +组装入口是: |
| 131 | + |
| 132 | +```bash |
| 133 | +./scripts/bootstrap_toolbox_project.sh /path/to/new-project --packs=validation,debug |
| 134 | +``` |
| 135 | + |
| 136 | +组装过程是: |
| 137 | + |
| 138 | +1. 复制 `templates/base/` |
| 139 | +2. 叠加所选 `packs/<pack>/` |
| 140 | +3. 从 `packs.manifest.json` 读取 `base_template.default_enabled_plugins` 和 `packs[].plugins` |
| 141 | +4. 生成目标项目的 `godot/project.godot` |
| 142 | +5. 写入 `.toolbox-packs` |
| 143 | + |
| 144 | +### 组装时的原则 |
| 145 | + |
| 146 | +- `bootstrap` 不在脚本里硬编码 `pack -> plugin.cfg` |
| 147 | +- pack 是否存在,以 `packs.manifest.json` 为准 |
| 148 | +- pack 在 manifest 中存在但目录缺失,应立即报错 |
| 149 | + |
| 150 | +## E. 验证闭环 |
| 151 | + |
| 152 | +每次维护至少跑下面三层: |
| 153 | + |
| 154 | +### 1. 静态检查 |
| 155 | + |
| 156 | +```bash |
| 157 | +bash -n scripts/*.sh templates/base/scripts/*.sh |
| 158 | +python3 -m json.tool packs.manifest.json >/dev/null |
| 159 | +python3 -m json.tool upstreams.lock.json >/dev/null |
| 160 | +``` |
| 161 | + |
| 162 | +### 2. 布局检查 |
| 163 | + |
| 164 | +```bash |
| 165 | +./scripts/verify_toolbox_layout.sh |
| 166 | +``` |
| 167 | + |
| 168 | +### 3. 真实产物检查 |
| 169 | + |
| 170 | +```bash |
| 171 | +tmpdir=$(mktemp -d) |
| 172 | +./scripts/bootstrap_toolbox_project.sh "$tmpdir" --packs=validation,debug,stateful,juice |
| 173 | +godot --headless --editor --quit-after 1 --path "$tmpdir/godot" --import |
| 174 | +GODOT_BIN="$(command -v godot)" bash "$tmpdir/scripts/gdunit4_smoke.sh" |
| 175 | +rm -rf "$tmpdir" |
| 176 | +``` |
| 177 | + |
| 178 | +如果本轮改动涉及 `import/update`,还应补: |
| 179 | + |
| 180 | +```bash |
| 181 | +./scripts/import_plugin_from_upstream.sh ... --dry-run |
| 182 | +./scripts/update_plugin_from_upstream.sh --id=<entry_id> --dry-run |
| 183 | +``` |
| 184 | + |
| 185 | +## F. 提交前检查 |
| 186 | + |
| 187 | +提交前至少确认: |
| 188 | + |
| 189 | +- `git status --short` 里只有本轮相关文件 |
| 190 | +- 改动的行为和文档一致 |
| 191 | +- 如果调整了选型或归类,相关 manifest 和文档已同步 |
| 192 | +- 如果加入了新 pack 或新插件,README 至少有入口说明 |
| 193 | + |
| 194 | +## G. 推荐节奏 |
| 195 | + |
| 196 | +日常维护建议按这个顺序: |
| 197 | + |
| 198 | +1. 先评估适配度 |
| 199 | +2. 再 dry-run 导入或升级 |
| 200 | +3. 再执行真实导入或升级 |
| 201 | +4. 再做 bootstrap + import + smoke 验证 |
| 202 | +5. 最后提交并推送 |
| 203 | + |
| 204 | +这样可以把选型错误、版本错误、路径错误和验证错误尽量提前暴露。 |
0 commit comments