From dev-gui-plugin
Atom Game GUI pipeline 第 2 阶段。生成 MVVM 代码(Panel.lua + View.cs + 如需的 ViewModel)。 自包含的 MVVM 指引。在 gui-plan 产出 GUI_PRD.md 后使用。控制代码 实现漂移(相对需求规格)。
How this skill is triggered — by the user, by Claude, or both
Slash command
/dev-gui-plugin:gui-draftThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
**职责**:自包含的 MVVM 代码生成。**控制:代码实现漂移。**
职责:自包含的 MVVM 代码生成。控制:代码实现漂移。
输入:GUI_PRD.md + 两库 query_pack(私有 ${CLAUDE_PLUGIN_DATA}/gui-knowledge/query_pack.md
${CLAUDE_PROJECT_DIR}/.claude/dev-gui-knowledge/query_pack.md,后者存在则读;矛盾以公共库为准)。动手前先读
${CLAUDE_PLUGIN_ROOT}/shared-references/mvvm-contract.md。
*_viewmodel.lua / *ViewModel.cs / AtomViewModelFactory.cs / ui_viewmodel_define.lua:
能用工具导出就不手改;仅当工具导出失败/不可用时才允许手改补齐(加 TODO(模拟导出) + 记 HUMAN_REVIEW.md,见 mvvm-contract §3)。<PanelName>Panel.lua 继承 UIBasePanel;View:<PanelName>View.cs 继承 BaseView。AtomUIText/AtomUIImage/AtomUIButton)。仍先读目标目录同类现有 panel 对齐命名/惯例。生命周期钩子与 API 见 mvvm-contract §4-§7。
-- Panel(Model 层)
local enum = require("framework.utils.enum")
local uiBasePanel = jn_require_ex("framework.ui.ui_base_panel")
local PanelNamePanel = DefineClass("PanelNamePanel", uiBasePanel.UIBasePanel)
UIMessageId = enum "UIMessageId" { "OnConfirmClick" } -- 与 C# enum 同步(从 1)
local panelMessageHandler = { [UIMessageId.OnConfirmClick] = "onConfirmClick" }
function PanelNamePanel:getPanelMessageHandler() return panelMessageHandler end
function PanelNamePanel:prepareViewModel(panelData)
self.rootViewModel.SomeProperty = panelData.someValue -- 只写 ViewModel
end
function PanelNamePanel:onPanelClose()
-- 取消 timer / 移除监听 / dispose 创建的 Lib(清理是你的责任)
end
function PanelNamePanel:onConfirmClick() end
// View(表现层)
public class PanelNameView : BaseView
{
private enum UIMessageId { OnConfirmClick = 1 } // 与 Lua enum 完全一致
[SerializeField] private AtomUIButton m_BtnConfirm;
[SerializeField] private AtomUIText m_TxtTitle;
private PanelNameViewModel m_VM;
public override void Initialize(BaseViewModel viewModel)
{
if (viewModel is not PanelNameViewModel vm) return;
m_VM = vm;
InitializeView();
InitializeEvents();
}
private void InitializeView()
{
m_TxtTitle.SetText(m_VM.SomeProperty.ToString());
}
private void InitializeEvents()
{
m_VM.RegisterPropertyChangeHandler<string>(PanelNameViewModel.SOMEPROPERTY, OnSomeChange);
m_BtnConfirm.OnClick = OnBtnConfirmClick; // 非 onClick.AddListener
}
private void OnSomeChange(string v) { m_TxtTitle.SetText(v); }
private void OnBtnConfirmClick() { SendUIMessage((int)UIMessageId.OnConfirmClick); }
// 普通 View 无需 override Destroy() 退订——框架自动清理 PropertyChangeHandler
}
shared-references/patterns/(决策树见 patterns/README.md)。python3 "${CLAUDE_PLUGIN_ROOT}/tools/gui_run_state.py" set "${CLAUDE_PROJECT_DIR}" <panelId> gui-draft done
TODO(模拟导出) 标记并记入 HUMAN_REVIEW.md。→ 进入 gui-prefab。
npx claudepluginhub avatarganymede/dev-gui-plugin --plugin dev-gui-pluginCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.