diff --git a/ai-plan/public/documentation-governance-and-refresh/todos/documentation-governance-and-refresh-tracking.md b/ai-plan/public/documentation-governance-and-refresh/todos/documentation-governance-and-refresh-tracking.md index e4bc6226..384b5e24 100644 --- a/ai-plan/public/documentation-governance-and-refresh/todos/documentation-governance-and-refresh-tracking.md +++ b/ai-plan/public/documentation-governance-and-refresh/todos/documentation-governance-and-refresh-tracking.md @@ -7,7 +7,7 @@ ## 当前恢复点 -- 恢复点编号:`DOCUMENTATION-GOVERNANCE-REFRESH-RP-015` +- 恢复点编号:`DOCUMENTATION-GOVERNANCE-REFRESH-RP-016` - 当前阶段:`Phase 3` - 当前焦点: - 已建立统一公开 skill:`.agents/skills/gframework-doc-refresh/` @@ -15,15 +15,16 @@ - `docs/zh-CN/godot/index.md` 已改成源码优先的模块 landing page,不再把 `GetNodeX`、`CreateSignalBuilder`、`InstallGodotModule(...)` 写成默认入口 - `docs/zh-CN/godot/architecture.md` 已改成当前锚点生命周期、模块挂接顺序和接口边界说明,不再沿用旧版 `.Wait()` 叙述 - `docs/zh-CN/godot/scene.md` 与 `docs/zh-CN/godot/ui.md` 已按当前 factory / registry / root / source-generator wiring 重写完成 - - 下一轮高优先级页面转为 `docs/zh-CN/godot/signal.md` 与 `docs/zh-CN/godot/extensions.md` + - `docs/zh-CN/godot/signal.md` 已按当前 `Signal(...)` / `SignalBuilder` / `[BindNodeSignal]` 分工重写完成 + - `docs/zh-CN/godot/extensions.md` 已按当前 `GodotPathExtensions`、`NodeExtensions`、`SignalFluentExtensions` 与 `UnRegisterExtension` 重写完成 + - 下一轮高优先级页面转为 `docs/zh-CN/godot/logging.md` ## 当前状态摘要 - 文档治理规则已收口到仓库规范,README、站点入口与采用链路不再依赖旧文档自证 - 高优先级模块入口、`core` 关键专题页与 `tutorials/godot-integration.md` 已回到“以源码 / 测试 / README 为准”的状态 - `docs/zh-CN/godot/index.md`、`architecture.md`、`scene.md` 与 `ui.md` 已完成当前实现收口 -- 当前主题仍是 active topic,因为 `docs/zh-CN/godot/signal.md` 与 `docs/zh-CN/godot/extensions.md` 仍可能保留旧 - `SignalBuilder` / 大而全扩展层叙述,Godot 文档链路尚未完全收口 +- 当前主题仍是 active topic,因为 `docs/zh-CN/godot/logging.md` 及其与运行时扩展页的交叉引用仍需复核,Godot 文档链路尚未完全收口 ## 当前活跃事实 @@ -85,6 +86,13 @@ 输入与暂停边界”的结构,明确当前没有 `GodotUiRouter`,且 `GodotUiFactory` 仍强制要求 `IUiPageBehaviorProvider` - 本轮已执行 `bash .agents/skills/gframework-doc-refresh/scripts/validate-all.sh docs/zh-CN/godot/scene.md` 与 `bash .agents/skills/gframework-doc-refresh/scripts/validate-all.sh docs/zh-CN/godot/ui.md`,两页聚焦校验通过 +- `docs/zh-CN/godot/signal.md` 已改成“当前公开入口、动态绑定最小接入路径、与 `[BindNodeSignal]` 的分工、当前边界”的结构, + 不再沿用旧 `CreateSignalBuilder(...)` / builder-pattern 教程式长篇叙述 +- `docs/zh-CN/godot/extensions.md` 已改成“真实扩展分组、Node 辅助成员表、`UnRegisterWhenNodeExitTree(...)` 生命周期边界、 + 当前边界”的结构,不再把扩展层写成覆盖所有 Godot 开发动作的万能工具箱 +- 本轮已执行 `bash .agents/skills/gframework-doc-refresh/scripts/validate-all.sh docs/zh-CN/godot/signal.md` 与 + `bash .agents/skills/gframework-doc-refresh/scripts/validate-all.sh docs/zh-CN/godot/extensions.md`,两页聚焦校验通过 +- 本轮再次执行 `cd docs && bun run build` 通过,当前 Godot signal / extensions 页面改动没有破坏站点构建 - `.agents/skills/gframework-doc-refresh/SKILL.md` 已改成标准 YAML frontmatter skill,并明确支持模块输入、证据顺序、输出优先级与验证步骤 - `.agents/skills/gframework-doc-refresh/SKILL.md` 的 `description` 已加引号,修复 `Recommended command:` 中冒号导致的 invalid YAML skill 加载警告 @@ -105,10 +113,10 @@ `godot-project-generator.md`、`get-node-generator.md`、`bind-node-signal-generator.md` 与 `auto-register-exported-collections-generator.md` 已完成收口; 继续按源码、测试、`*.csproj` 与 `ai-libs/` 下已验证参考实现核对剩余 Godot 相关页面,不把旧文档当事实来源 -- Godot signal / extensions 专题页失真风险:`docs/zh-CN/godot/signal.md` 与 `docs/zh-CN/godot/extensions.md` 仍可能保留 - `SignalBuilder` 或“大而全扩展层”叙述,重新把已经收口的入口页带偏 - - 缓解措施:`scene.md` 与 `ui.md` 已完成收口;下一轮优先按当前 `Signal(...)` fluent API、`NodeExtensions` 实际成员与 - `ai-libs/CoreGrid` 的使用方式重写 `signal.md`、`extensions.md` +- Godot logging 专题页失真风险:`docs/zh-CN/godot/logging.md` 仍可能沿用旧扩展页引用和过时运行时说明,把已经收口的 + signal / extensions / index 页重新带偏 + - 缓解措施:`signal.md` 与 `extensions.md` 已完成收口;下一轮优先按当前日志 API、Godot 运行时边界与真实交叉链接复核 + `logging.md` - 采用路径误导风险:根聚合包与模块边界若再次被写错,会继续误导消费者的包选择 - 缓解措施:保持“源码与包关系优先”的证据顺序,改动采用说明时同步核对包依赖与生成器 wiring - 模块映射不全风险:统一 skill 若遗漏模块别名、测试项目或 docs 栏目映射,会让后续扫描阶段直接失焦 @@ -160,11 +168,13 @@ - `bash .agents/skills/gframework-doc-refresh/scripts/validate-all.sh docs/zh-CN/godot/architecture.md` - `bash .agents/skills/gframework-doc-refresh/scripts/validate-all.sh docs/zh-CN/godot/scene.md` - `bash .agents/skills/gframework-doc-refresh/scripts/validate-all.sh docs/zh-CN/godot/ui.md` +- `bash .agents/skills/gframework-doc-refresh/scripts/validate-all.sh docs/zh-CN/godot/signal.md` +- `bash .agents/skills/gframework-doc-refresh/scripts/validate-all.sh docs/zh-CN/godot/extensions.md` - `rg -n "GodotSceneRouter|GodotUiRouter|CreateSignalBuilder|GetNodeX|InstallGodotModule\(" docs/zh-CN/godot -S` - `cd docs && bun run build` ## 下一步 -1. 优先重写 `docs/zh-CN/godot/signal.md` 与 `docs/zh-CN/godot/extensions.md`,清掉旧 `SignalBuilder` / 大而全扩展层叙述 -2. 视 `signal.md` / `extensions.md` 收口结果,决定是否同步复核 `docs/zh-CN/godot/logging.md` +1. 优先复核 `docs/zh-CN/godot/logging.md`,确认它不会把已收口的 signal / extensions / runtime 边界重新写偏 +2. 视 `logging.md` 复核结果,决定是否可以把 Godot 栏目的 active 恢复点收口并准备归档本阶段历史 3. 下一次推送后重新执行 `$gframework-pr-review`,确认 PR #268 的 CodeRabbit / Greptile open thread 是否按预期收敛 diff --git a/ai-plan/public/documentation-governance-and-refresh/traces/documentation-governance-and-refresh-trace.md b/ai-plan/public/documentation-governance-and-refresh/traces/documentation-governance-and-refresh-trace.md index 6c2e5440..7d38599e 100644 --- a/ai-plan/public/documentation-governance-and-refresh/traces/documentation-governance-and-refresh-trace.md +++ b/ai-plan/public/documentation-governance-and-refresh/traces/documentation-governance-and-refresh-trace.md @@ -2,7 +2,7 @@ ## 2026-04-22 -### 当前恢复点:RP-015 +### 当前恢复点:RP-016 - 本轮从 PR #268 的最新 review 数据恢复,未发现失败检查;CTRF 报告显示 2139 个测试全部通过 - 本轮复核确认当前 PR 的 latest-head open thread 同时来自 `coderabbitai[bot]` 与 `greptile-apps[bot]` @@ -36,8 +36,12 @@ `IUiPageBehaviorProvider` 与 `[AutoUiPage]` 的真实关系、输入与暂停边界”,不再继续虚构 `GodotUiRouter` - 本轮额外确认 Godot Scene / UI 的关键差异:`GodotSceneFactory` 在 provider 缺失时会回退到 `SceneBehaviorFactory`, 而 `GodotUiFactory` 仍会在缺失 `IUiPageBehaviorProvider` 时直接抛异常;这已写入两页文档,避免继续把两者描述成同一种接入模型 -- 本轮检索确认 Godot 栏目新的高优先级页面转为 `docs/zh-CN/godot/signal.md` 与 `docs/zh-CN/godot/extensions.md`: - 两页仍保留 `SignalBuilder` / 大而全扩展层叙述,应作为 scene / ui 之后的下一轮收口对象 +- 本轮已重写 `docs/zh-CN/godot/signal.md`,把内容收口为“当前公开入口、动态绑定最小接入路径、与 `[BindNodeSignal]` + 的分工、当前边界”,明确当前入口是 `Signal(...)` 而不是旧 `CreateSignalBuilder(...)` +- 本轮已重写 `docs/zh-CN/godot/extensions.md`,把内容收口为“真实扩展分组、`NodeExtensions` 实际成员、`UnRegisterWhenNodeExitTree(...)` + 生命周期边界、当前边界”,不再继续宣称存在覆盖所有 Godot 场景的万能扩展层 +- 本轮复核 `ai-libs/CoreGrid` 的动态绑定用法后,明确把 fluent API 定位为“动态对象 / 动态 signal 的运行时连接”,而把静态控件绑定继续归到 + `[BindNodeSignal]` 生成器链路 ### 当前决策 @@ -55,8 +59,10 @@ `GFramework.Godot` 运行时 - `ui.md` 已明确记录 `Page` 必须走 `PushAsync` / `ReplaceAsync`,`Show(..., UiLayer.Page)` 在当前实现中会抛异常; 后续不要再把所有 UI 入口重新写回统一 `Show(...)` -- `signal.md` 与 `extensions.md` 的下一轮收口应以 `Signal(...)` fluent API 与 `NodeExtensions` 的当前成员表为准, - 不再继续复刻旧版 `SignalBuilder` 教程和泛化扩展层叙述 +- `signal.md` 已明确为 `Signal(...)` / `SignalBuilder` 的轻量 fluent 包装说明页,不再继续混入生成器职责 +- `extensions.md` 已明确限制在 `GodotPathExtensions`、`NodeExtensions`、`SignalFluentExtensions` 与 `UnRegisterExtension` + 这四组当前存在的扩展 +- Godot 栏目的下一轮优先级转为 `logging.md`;后续如果它仍复用旧扩展页话术,会重新污染已收口的入口页 ### 验证 @@ -79,11 +85,13 @@ - `bash .agents/skills/gframework-doc-refresh/scripts/validate-all.sh docs/zh-CN/godot/architecture.md` - `bash .agents/skills/gframework-doc-refresh/scripts/validate-all.sh docs/zh-CN/godot/scene.md` - `bash .agents/skills/gframework-doc-refresh/scripts/validate-all.sh docs/zh-CN/godot/ui.md` +- `bash .agents/skills/gframework-doc-refresh/scripts/validate-all.sh docs/zh-CN/godot/signal.md` +- `bash .agents/skills/gframework-doc-refresh/scripts/validate-all.sh docs/zh-CN/godot/extensions.md` - `rg -n "GodotSceneRouter|GodotUiRouter|CreateSignalBuilder|GetNodeX|InstallGodotModule\(" docs/zh-CN/godot -S` - `cd docs && bun run build` ### 下一步 -1. 优先重写 `docs/zh-CN/godot/signal.md` 与 `docs/zh-CN/godot/extensions.md`,清掉旧 `SignalBuilder` / 大而全扩展层叙述 -2. 视 `signal.md` / `extensions.md` 收口结果,决定是否同步复核 `docs/zh-CN/godot/logging.md` +1. 优先复核 `docs/zh-CN/godot/logging.md`,确认它的 API 说明与交叉链接不会把 signal / extensions / runtime 边界重新写偏 +2. 视 `logging.md` 复核结果,决定是否可以把当前 Godot 栏目恢复点收口并迁入 archive 3. 下一次推送后重新执行 `$gframework-pr-review`,确认 PR #268 的 CodeRabbit / Greptile open thread 是否关闭或减少 diff --git a/docs/zh-CN/godot/extensions.md b/docs/zh-CN/godot/extensions.md index e7426b13..8f006692 100644 --- a/docs/zh-CN/godot/extensions.md +++ b/docs/zh-CN/godot/extensions.md @@ -1,328 +1,181 @@ -# Godot 扩展方法 (Godot Extensions) +--- +title: Godot 扩展方法 +description: 以当前 GFramework.Godot.Extensions 源码为准,说明路径、Node、signal 和 unregister 扩展的真实成员与边界。 +--- -## 概述 +# Godot 扩展方法 -Godot 扩展方法模块为 Godot 引擎提供了丰富的便捷扩展方法集合。这些扩展方法简化了常见的 Godot -开发任务,提高了代码的可读性和开发效率。该模块遵循流畅接口设计原则,支持链式调用。 +`GFramework.Godot.Extensions` 当前并不是“覆盖所有 Godot 节点操作”的万能层。按源码看,它实际公开的扩展主要只有四组: -## 模块结构 +- `GodotPathExtensions` +- `NodeExtensions` +- `SignalFluentExtensions` +- `UnRegisterExtension` -```mermaid -graph TD - A[Extensions] --> B[GodotPathExtensions] - A --> C[NodeExtensions] - A --> D[SignalFluentExtensions] - A --> E[UnRegisterExtension] - D --> F[SignalBuilder] - - B --> G[路径判断扩展] - C --> H[节点生命周期] - C --> I[节点查询] - C --> J[场景树操作] - C --> K[输入控制] - C --> L[调试工具] - D --> M[信号连接系统] - E --> N[事件管理] -``` +这页的重点应该是识别这些扩展各自解决什么问题,以及哪些旧文档里的“大而全能力”现在并不存在。 -## 扩展模块详解 +## 当前公开入口 -### 1. 路径扩展 (GodotPathExtensions) +### `GodotPathExtensions` -提供 Godot 虚拟路径的判断和识别功能。 +这组扩展只负责判断 Godot 虚拟路径前缀: -**主要方法:** +- `IsUserPath(this string path)` +- `IsResPath(this string path)` +- `IsGodotPath(this string path)` -- `IsUserPath()` - 判断是否为 `user://` 路径 -- `IsResPath()` - 判断是否为 `res://` 路径 -- `IsGodotPath()` - 判断是否为 Godot 虚拟路径 - -**使用示例:** +它们不做文件访问,也不解析目录结构,只是用字符串前缀判断 `user://` 和 `res://`。 ```csharp -string savePath = "user://save.dat"; -string configPath = "res://config.json"; -string logPath = "C:/logs/debug.log"; +using GFramework.Godot.Extensions; -if (savePath.IsUserPath()) Console.WriteLine("用户数据路径"); -if (configPath.IsResPath()) Console.WriteLine("资源路径"); -if (logPath.IsGodotPath()) Console.WriteLine("Godot 虚拟路径"); -else Console.WriteLine("文件系统路径"); -``` - -### 2. 节点扩展 (NodeExtensions) - -最丰富的扩展模块,提供全面的节点操作功能。 - -#### 节点生命周期管理 - -```csharp -// 安全释放节点 -node.QueueFreeX(); // 延迟释放 -node.FreeX(); // 立即释放 - -// 等待节点就绪 -await node.WaitUntilReadyAsync(); - -// 检查节点有效性 -if (node.IsValidNode()) Console.WriteLine("节点有效"); -if (node.IsInvalidNode()) Console.WriteLine("节点无效"); -``` - -#### 节点查询操作 - -```csharp -// 查找子节点 -var sprite = node.FindChildX("Sprite"); -var parent = node.GetParentX(); - -// 获取或创建节点 -var panel = parent.GetOrCreateNode("MainPanel"); - -// 遍历子节点 -node.ForEachChild(sprite => { - sprite.Modulate = Colors.White; -}); -``` - -#### 场景树操作 - -```csharp -// 获取根节点 -var root = node.GetRootNodeX(); - -// 异步添加子节点 -await parent.AddChildXAsync(childNode); - -// 设置场景树暂停状态 -node.Paused(true); // 暂停 -node.Paused(false); // 恢复 -``` - -#### 输入控制 - -```csharp -// 标记输入事件已处理 -node.SetInputAsHandled(); - -// 禁用/启用输入 -node.DisableInput(); -node.EnableInput(); -``` - -#### 调试工具 - -```csharp -// 打印节点路径 -node.LogNodePath(); - -// 打印节点树 -node.PrintTreeX(); - -// 安全延迟调用 -node.SafeCallDeferred("UpdateUI"); -``` - -#### 类型转换 - -```csharp -// 安全的类型转换 -var button = node.OfType