关于 generating-lightning-app
将自然语言需求转化为可部署的 Salesforce Lightning Experience 应用及配套元数据的技能。它规划组件与依赖关系,并指导按依赖顺序生成,同时检查 API 上下文。
主要功能
- 01从自然语言规划应用需求
- 02按类型协调元数据技能
- 03按依赖顺序构建组件
- 04根据 API 上下文检查元数据
- 05组装 SFDX 文件和 package.xml
适用场景
- 01构建多对象项目管理应用
- 02生成含页面和权限的 Lightning 应用
- 03生成前规划元数据依赖关系
- 04准备 Salesforce CLI 部署产物
MCP 相关
除 Flow 外,工作流要求在生成前调用 salesforce-api-context 工具检查元数据类型;Flow 使用 metadata-experts 流程。内容提到 API 上下文检查,但未说明 MCP 服务连接方式。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ forcedotcom/ sf-skills --skill generating-lightning-app安装后在 Claude Code 中输入/generating-lightning-app确认已加载。
详细介绍
生成 Lightning 应用
概述
根据自然语言描述,通过定义 Lightning 自定义应用,并按正确的依赖顺序编排其依赖的元数据类型,构建完整且可部署的 Salesforce Lightning Experience 应用。有专用元数据技能时调用该技能;没有对应技能时直接生成元数据。
何时使用此技能
适用情况:
- 用户请求“Lightning 应用”或“端到端解决方案”
- 用户说“构建应用”“创建应用”或“构建一个[类型]应用”(例如项目管理、跟踪等)
- 工作内容会生成自定义应用(CustomApplication)和支持元数据,而不是单独生成一个对象、页面或选项卡
应触发此技能的示例:
- “构建一个包含 Tasks、Resources 和 Supplies 对象的项目管理 Lightning 应用”
- “创建一个用于跟踪车辆的 LEX 应用,包含 Lightning 页面和权限集”
- “我需要一个包含多个对象和关系的空间站管理系统”
- “构建一个包含自定义 Lightning 记录页面的员工入职 Lightning 应用”
不适用情况:
- 创建单个元数据组件(应改用对应的专用元数据技能)
- 排查或调试现有元数据
- 构建 Salesforce Classic 应用(而非 Lightning Experience)
- 用户只要求一个对象、一个页面或一个权限集(没有其他内容)
- 用户只需创建或配置应用容器(将现有选项卡分组),不需要其他元数据;请改用
generating-custom-application
元数据类型注册表
下表列出了 Lightning Experience 应用通常需要的元数据类型、对应技能是否可用,以及 API 上下文要求。
| 元数据类型 | 技能名称 | API 上下文 | 使用规则 |
|---|---|---|---|
| 自定义对象 | generating-custom-object | salesforce-api-context | 必须加载技能并调用 API 上下文 |
| 自定义字段 | generating-custom-field | salesforce-api-context | 必须加载技能并调用 API 上下文 |
| 自定义选项卡 | generating-custom-tab | salesforce-api-context | 必须加载技能并调用 API 上下文 |
| FlexiPage | generating-flexipage | salesforce-api-context | 必须加载技能并调用 API 上下文 |
| 自定义应用 | generating-custom-application | salesforce-api-context | 必须加载技能并调用 API 上下文 |
| 列表视图 | generating-list-view | salesforce-api-context | 必须加载技能并调用 API 上下文(如有请求) |
| 验证规则 | generating-validation-rule | salesforce-api-context | 必须加载技能并调用 API 上下文(如有请求) |
| Flow | generating-flow | metadata-experts pipeline | 必须加载技能并运行 pipeline。不需要 salesforce-api-context。 |
| 权限集 | generating-permission-set | salesforce-api-context | 必须加载技能并调用 API 上下文 |
使用规则
技能规则:如果某个元数据类型有对应技能,必须加载该技能。未先加载技能时,不得直接生成元数据。
API 上下文规则:对于每种元数据类型(Flow 除外),生成前必须调用 salesforce-api-context 工具。未先调用 API 上下文时,不得生成元数据。技能提供结构和规则;API 上下文则确认当前 API 版本支持的有效内容。两者缺一不可。
回退规则:需要的元数据类型没有对应技能时,请依据对 Salesforce Metadata API 和最佳实践的了解直接生成元数据。仍然需要 API 上下文。
原因:技能包含经过验证的模式和限制。API 上下文提供特定版本的准确性。两者结合可避免部署失败。
依赖关系图与构建顺序
阶段 1:数据模型(基础)
Custom Objects (no dependencies)
↓
Custom Fields (depends on: Objects exist)
↓
Relationships (depends on: Both parent and child objects + fields exist)
本阶段的元数据类型:
generating-custom-object— 一次,包含所有对象generating-custom-field— 一次,包含所有字段(包括主从关系、查找关系、汇总汇总字段)
阶段 2:业务逻辑(可选 — 仅在用户提出要求时)
Validation Rules (depends on: Fields exist)
↓
Flows (depends on: Objects, Fields exist)
本阶段的元数据类型(仅在用户提出要求时):
generating-validation-rule— 一次,仅在提及验证要求时generating-flow— 一次,仅在提及自动化/工作流要求时
阶段 3:用户界面
List Views (depends on: Objects, Fields exist)
↓
Custom Tabs (depends on: Objects exist)
↓
FlexiPages (depends on: Objects, Tabs exist)
本阶段的元数据类型:
generating-list-view— 一次,用于筛选记录视图(如有要求)generating-custom-tab— 一次,包含所有对象标签页generating-flexipage— 一次,包含所有记录/主页/应用页面
阶段 4:应用组装
Custom Application (depends on: Tabs exist)
本阶段的元数据类型:
generating-custom-application— 一次,用于创建 Lightning 应用容器
阶段 5:安全与访问权限
Permission Sets (depends on: Objects, Fields, Tabs, App exist)
本阶段的元数据类型:
generating-permission-set— 一次,包含所有权限集,以及以下访问权限:- 对象(读取、创建、编辑、删除)
- 字段(读取、编辑)
- 标签页(可见)
- 自定义应用(可见)
执行工作流
步骤 1:需求分析与规划
操作:
- 解析用户的自然语言请求
- 提取业务实体(成为自定义对象)
- 提取属性/特性(成为自定义字段)
- 识别关系(主从关系、查找关系)
- 检测验证要求(成为验证规则)
- 检测自动化要求(成为流程)
- 识别用户角色(为权限集提供依据)
输出:构建计划
生成一份结构化计划,列出:
Lightning App Build Plan: [App Name]
DATA MODEL:
- Custom Objects: [list with object names]
- Custom Fields: [list grouped by object]
- Relationships: [list M-D and Lookup relationships]
BUSINESS LOGIC (if applicable):
- Validation Rules: [list with object and rule name]
- Flows: [list with flow name and type]
USER INTERFACE:
- List Views (if requested): [list with object and view name]
- Custom Tabs: [list with object]
- FlexiPages: [list with page name and type]
- Custom Application: [app name]
SECURITY:
- Permission Sets: [list with purpose]
PER-TYPE EXECUTION (skill + API context for each):
- CustomObject: load generating-custom-object + call salesforce-api-context
- CustomField: load generating-custom-field + call salesforce-api-context
- ValidationRule: load generating-validation-rule + call salesforce-api-context (if requested)
- Flow: load generating-flow + run metadata-experts pipeline (if requested)
- ListView: load generating-list-view + call salesforce-api-context (if requested)
- CustomTab: load generating-custom-tab + call salesforce-api-context
- FlexiPage: load generating-flexipage + call salesforce-api-context
- CustomApplication: load generating-custom-application + call salesforce-api-context
- PermissionSet: load generating-permission-set + call salesforce-api-context
STATUS LINES TO EMIT BEFORE FILE WRITES:
- `type=<Type> skill=complete mcp=complete|unavailable mcp_tools=<tool-list|none>`
- Flow exception: `type=Flow skill=complete pipeline=complete`
DEPENDENCY ORDER:
1. Phase 1: Data Model (Objects -> Fields)
2. Phase 2: Business Logic (Validation Rules -> Flows)
3. Phase 3: User Interface (List Views -> Tabs -> Pages)
4. Phase 4: App Assembly (Application)
5. Phase 5: Security (Permission Sets)
步骤 2:按类型执行
对每种元数据类型逐一执行以下四个步骤。完成当前类型的全部四个步骤后,再继续处理下一种类型。请勿跳过任何步骤。
| 步骤 | 操作 | 原因 |
|---|---|---|
| ① 加载技能 | 搜索并阅读该类型的 SKILL.md | 提供 XML 结构、必需元素、命名规则和验证约束 |
| ② 调用 API 上下文 | 使用以下一个或多个工具,为此元数据类型调用 salesforce-api-context:get_metadata_type_sections、get_metadata_type_context、get_metadata_type_fields、get_metadata_type_fields_properties、search_metadata_types | 提供当前有效值 — 允许的枚举值、必填字段与可选字段,以及此 API 版本的子类型。技能文件提供结构;API 上下文提供特定版本的准确性。 |
| ③ 记录状态 | 输出:type=<Type> skill=complete mcp=complete|unavailable mcp_tools=<tool-list|none> | 确认在写入任何文件之前已尝试上述两个步骤,并记录使用了哪些 API 上下文工具 |
| ④ 生成文件 | 为此类型生成所有文件,然后建立检查点 | 仅在完成 ①②③ 后执行。验证后再继续处理下一种类型。 |
请勿将 ① 和 ② 合并为一个操作,也勿在完成 ① 后跳过 ②。 这是两个独立步骤,作用各不相同。加载技能后,你可能会觉得已经可以开始生成 — 请先停下并执行 ②。
如果经过实际尝试后 salesforce-api-context 仍不可用,请记录 mcp=unavailable,并仅使用技能知识进行生成。完全不尝试 ② 属于错误。
1. 自定义对象
- ① 加载技能:阅读
generating-custom-objectSKILL.md - ② API 上下文:针对 CustomObject 调用
salesforce-api-context - ③ 状态:
type=CustomObject skill=complete mcp=complete|unavailable mcp_tools=<tool-list|none> - ④ 生成 + 建立检查点:生成所有自定义对象文件,然后继续执行 #2 2. 自定义字段
- ① 加载技能:阅读
generating-custom-fieldSKILL.md - ② API 上下文:针对 CustomField 调用
salesforce-api-context - ③ 状态:
type=CustomField skill=complete mcp=complete|unavailable mcp_tools=<tool-list|none> - ④ 生成 + 检查点:生成所有自定义字段文件,然后继续执行 #3
3. 验证规则(仅在请求时)
- ① 加载技能:阅读
generating-validation-ruleSKILL.md - ② API 上下文:针对 ValidationRule 调用
salesforce-api-context - ③ 状态:
type=ValidationRule skill=complete mcp=complete|unavailable mcp_tools=<tool-list|none> - ④ 生成 + 检查点:生成所有验证规则文件,然后继续执行 #4
4. 流(仅在请求时)
- ① 加载技能:阅读
generating-flowSKILL.md - ② 流水线:运行
metadata-experts/execute_metadata_action三步流水线(无需执行salesforce-api-context) - ③ 状态:
type=Flow skill=complete pipeline=complete - ④ 生成 + 检查点:通过流水线生成所有 Flow 文件,然后继续执行 #5
5. 列表视图(仅在请求时)
- ① 加载技能:阅读
generating-list-viewSKILL.md - ② API 上下文:针对 ListView 调用
salesforce-api-context - ③ 状态:
type=ListView skill=complete mcp=complete|unavailable mcp_tools=<tool-list|none> - ④ 生成 + 检查点:生成所有列表视图文件,然后继续执行 #6
6. 自定义选项卡
- ① 加载技能:阅读
generating-custom-tabSKILL.md - ② API 上下文:针对 CustomTab 调用
salesforce-api-context - ③ 状态:
type=CustomTab skill=complete mcp=complete|unavailable mcp_tools=<tool-list|none> - ④ 生成 + 检查点:生成所有自定义选项卡文件,然后继续执行 #7
7. FlexiPages
- ① 加载技能:阅读
generating-flexipageSKILL.md - ② API 上下文:针对 FlexiPage 调用
salesforce-api-context - ③ 状态:
type=FlexiPage skill=complete mcp=complete|unavailable mcp_tools=<tool-list|none> - ④ 生成 + 检查点:生成所有 FlexiPage 文件,然后继续执行 #8
8. 自定义应用程序
- ① 加载技能:阅读
generating-custom-applicationSKILL.md - ② API 上下文:针对 CustomApplication 调用
salesforce-api-context - ③ 状态:
type=CustomApplication skill=complete mcp=complete|unavailable mcp_tools=<tool-list|none> - ④ 生成 + 检查点:生成自定义应用程序文件,然后继续执行 #9
9. 权限集
- ① 加载技能:阅读
generating-permission-setSKILL.md - ② API 上下文:针对 PermissionSet 调用
salesforce-api-context - ③ 状态:
type=PermissionSet skill=complete mcp=complete|unavailable mcp_tools=<tool-list|none> - ④ 生成 + 检查点:生成所有权限集文件 — 所有类型均已完成
第 3 步:最终制品组装
所有阶段完成后,将输出整合为可供部署的结构。
输出
完成构建后将生成:
-
Salesforce DX 项目目录,包含所有生成的元数据
- 按标准 SFDX 结构组织:
force-app/main/default/
- 按标准 SFDX 结构组织:
-
元数据文件 — 每个组件对应一个文件,并按类型组织:
force-app/main/default/ ├── objects/ # Custom Objects (.object-meta.xml) ├── fields/ # Custom Fields (.field-meta.xml) ├── tabs/ # Custom Tabs (.tab-meta.xml) ├── flexipages/ # Lightning Pages (.flexipage-meta.xml) ├── applications/ # Custom Applications (.app-meta.xml) ├── permissionsets/ # Permission Sets (.permissionset-meta.xml) ├── flows/ # Flows (.flow-meta.xml) - if applicable └── objects/.../validationRules/ # Validation Rules (.validationRule-meta.xml) - if applicable -
部署清单(
package.xml)- 列出所有组件,并指定正确的 API 版本
- 按依赖顺序以元数据类型分类组织
- 可用于 Salesforce CLI 部署或 Metadata API 部署
-
构建摘要报告 — 一个 Markdown 文件,列出:
- 创建的每个组件
- 组件类型和 API 名称
- 文件路径
- 依赖关系
- 任何警告或建议
摘要结构示例:
Lightning App Build Complete: Project Management App
METADATA GENERATED:
1 Custom Objects
- Project__c -> force-app/main/default/objects/Project__c/Project__c.object-meta.xml
- Task__c -> force-app/main/default/objects/Task__c/Task__c.object-meta.xml
- Resource__c -> force-app/main/default/objects/Resource__c/Resource__c.object-meta.xml
2 Custom Fields
- Project__c.Name -> force-app/main/default/objects/Project__c/fields/Name.field-meta.xml
- Project__c.Status__c -> force-app/main/default/objects/Project__c/fields/Status__c.field-meta.xml
[... etc ...]
3 Custom Tabs
- Project__c -> force-app/main/default/tabs/Project__c.tab-meta.xml
[... etc ...]
4 Lightning Record Pages
- Project_Record_Page -> force-app/main/default/flexipages/Project_Record_Page.flexipage-meta.xml
[... etc ...]
5 Custom Application
- Project_Management -> force-app/main/default/applications/Project_Management.app-meta.xml
6 Permission Sets
- Project_Manager -> force-app/main/default/permissionsets/Project_Manager.permissionset-meta.xml
- Project_User -> force-app/main/default/permissionsets/Project_User.permissionset-meta.xml
WARNINGS: None
验证
向用户提交已完成的构建之前,请验证跨组件完整性:
- 对象与选项卡覆盖情况:每个自定义对象至少有一个自定义选项卡
- 关系完整性:关系中引用的每个自定义对象(父对象或子对象)都存在于构建中
- 页面中的字段引用:FlexiPage 中引用的每个字段都存在于相应对象上
- 应用中的选项卡引用:自定义应用中引用的每个选项卡都已成功创建
- 权限集完整性:权限集已授予对所有生成的对象、字段、选项卡和应用的访问权限
- 无孤立组件:没有缺少对象的选项卡、没有缺少对应选项卡的页面、没有缺少选项卡的应用
- 部署清单完整性:
package.xml按正确的依赖顺序包含所有生成的组件
验证失败处理(类别 2):
- 如果验证失败,请在构建摘要报告的
VALIDATION WARNINGS部分列出未通过的检查 - 这些属于生成后的问题——不要因此阻止交付构建,但要清楚说明哪些内容需要人工审查或修正
- 针对每项未通过的验证检查,提供具体的修复步骤
注意:单个组件的验证(保留字、名称长度、字段类型等)由专门的元数据技能处理,无需在此重新验证。
错误处理
类别 1:停止并询问用户
遇到以下情况时,停止执行并请求用户澄清:
- 用户请求过于模糊,无法提取任何对象或字段
- 检测到相互冲突的要求(例如,“设为私有”+“所有人都应能看到”)
- 检测到无效的 Salesforce 命名(如
Order、Group等保留字)
类别 2:生成后警告(记录警告,继续执行)
遇到以下情况时,记录警告并继续执行:
- 跨组件验证检查未通过(例如,FlexiPage 中引用的字段在对象上不存在)
- 可选组件生成失败(例如,列表视图生成存在轻微问题)
- 验证规则或 Flow 的输出存在轻微问题
警告格式:
Warning: [Component Type] generation encountered issue
Component: [Name]
Issue: [Description]
Impact: [What won't work]
Recommendation: [How to fix manually]
Continuing with remaining components...
最佳实践
1. 始终遵循依赖顺序
切勿按错误顺序调用技能。字段需要对象,页面需要选项卡,应用需要选项卡。
2. 有可用技能时使用技能
不要重复造轮子。专用技能具有针对字段的验证,可避免部署错误。
3. 生成合理的默认值
用户未指定详细信息时:
- 对实体使用 Text 类型的名称字段
- 对交易使用 AutoNumber
- 为面向用户的对象启用 Search 和 Reports
- 根据关系设置 sharingModel
4. 构建前进行验证
检查以下内容:
- API 名称中是否包含保留字
- 关系限制(每个对象最多 2 个主从关系)
- 名称长度限制
- 重复名称