Skip to content

Commit c838bd0

Browse files
committed
docs: add maintenance workflow guide
1 parent 542cae1 commit c838bd0

3 files changed

Lines changed: 207 additions & 0 deletions

File tree

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
选型框架见:
3232

3333
- `docs/selection-framework.md`
34+
- `docs/maintenance-workflow.md`
3435
- `packs.manifest.json`
3536
- `upstreams.lock.json`
3637

@@ -44,6 +45,7 @@
4445
- `scripts/verify_toolbox_layout.sh`:校验工具箱布局
4546
- `docs/plugin-catalog.md`:插件目录与建议
4647
- `docs/plugin-integration-standard.md`:插件接入标准
48+
- `docs/maintenance-workflow.md`:维护、导入、升级、组装与验证手册
4749
- `docs/selection-framework.md`:选型框架与当前归类理由
4850
- `docs/research/similar-projects.md`:外部参考项目速记
4951
- `upstreams.lock.json`:上游来源与版本锁定

docs/maintenance-workflow.md

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
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+
这样可以把选型错误、版本错误、路径错误和验证错误尽量提前暴露。

scripts/verify_toolbox_layout.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ required_paths=(
77
"README.md"
88
"docs/plugin-catalog.md"
99
"docs/plugin-integration-standard.md"
10+
"docs/maintenance-workflow.md"
1011
"docs/selection-framework.md"
1112
"scripts/bootstrap_toolbox_project.sh"
1213
"scripts/import_plugin_from_upstream.sh"

0 commit comments

Comments
 (0)