用途
本技能用于创建和配置一个 Salesforce Custom Application,用于在 Lightning Experience 中承载 React UI bundle。它生成 CustomApplication 元数据,使该应用出现在 Lightning App Launcher 中,并可供内部用户访问。
Custom Application 与 Experience Site 不同:它们不需要 Networks、CustomSite、DigitalExperienceConfig 或 DigitalExperienceBundle 元数据。Custom Application 充当一个轻量级启动入口,将渲染委托给由 uiBundle 引用的 React UI bundle。
主要能力
- 解析并生成承载 UI bundle 所需的 CustomApplication 元数据。
- 根据目标组织的 API 版本,确定应使用
<uiBundle>还是<webApplication>字段。 - 在 API 版本支持时,为现有 UIBundle meta XML 就地添加
<target>CustomApplication</target>。
必需属性
在生成任何元数据之前,需要先解析所有属性。每个属性都有回退链,按顺序逐一尝试直到找到值。
- appName:格式为 lowercamelcase(例如 myInternalApp)。解析方式为使用来自 uiBundles/<name>/ 目录的 UI bundle 名称。
- appNamespace:字符串。解析顺序为 sfdx-project.json 中的 namespace → 运行
sf data query -q "SELECT NamespacePrefix FROM Organization" --target-org ${usernameOrAlias}→ 默认 c。 - appLabel:人类可读字符串。由用户提供,或从 appName 通过 camelCase 转 Title Case 派生。
appNamespace 和 appName 将 Custom Application 连接到正确的 React UI bundle。在较新的 API 版本中使用 <uiBundle>{appNamespace}__{appName}</uiBundle>;在较旧版本中使用 <webApplication>{appName}</webApplication>。若设置错误,应用启动器条目会存在但显示空白页面。工作流第 2 步决定使用哪个字段。
使用方式
第 1 步:解析所有必需属性
在构建任何内容前,先为上表中的所有属性确定值,使用各自的解析策略。
第 2 步:查询 API 上下文(版本感知的字段发现)
调用 salesforce-api-context MCP 工具,发现目标组织 API 版本存在哪些字段。这确保生成的元数据与用户的 Salesforce 版本兼容。
必需调用(使用与所示完全一致的 metadataType 参数,不要替换为 detail 参数或其他形式;metadataType 是该工具唯一接受的参数):
get_metadata_type_fields({ "metadataType": "CustomApplication" })— 检查响应字段列表中是否存在 uiBundle 字段。get_metadata_type_fields({ "metadataType": "UIBundle" })— 检查响应字段列表中是否存在 target 字段。
基于 API 响应的字段解析:
- CustomApplication.uiBundle 存在时:使用
<uiBundle>{appNamespace}__{appName}</uiBundle>;不存在(较旧 API 版本)时:使用<webApplication>{appName}</webApplication>(无命名空间)。 - UIBundle.target 存在时:使用
<target>CustomApplication</target>;不存在时:完全省略<target>元素。
如果实际尝试后 salesforce-api-context 不可用,则回退到较新的字段名(uiBundle + target)。
第 3 步:创建项目结构
创建尚不存在的文件和目录。CustomApplication 的路径为 <sourceDir>/applications/{appName}.app-meta.xml。
注意:<sourceDir> 由 sfdx-project.json 确定。读取 packageDirectories[] 并使用 "default": true 的条目;完整源目录为 <path>/main/default。若未设置默认值,则使用第一个条目。通常为 force-app/main/default,但此路径可配置。
第 4 步:填充所有元数据字段
使用下方文档中的默认模板。{braces} 中的值为已解析属性的引用,用第 1 步的实际值替换。应用第 2 步的字段解析决定使用哪些 XML 元素。
CustomApplication 模板参考:configure-metadata-custom-application.md
第 4 步执行说明:加载并使用该文档。Agent 在尝试填充元数据字段之前,必须完整读取第 4 步引用的 references/*.md 文件内容。完整读取文件,将占位符(如 {appName})替换为已解析的值,然后使用展开后的模板填充元数据 XML 内容。若第 2 步确定适用较旧的字段名,则在生成输出中将 <uiBundle> 替换为 <webApplication>。
第 5 步:更新 UI Bundle Meta XML
此步骤编辑一个已存在的文件,绝不创建新文件。UIBundle 是 bundle 式元数据类型:其 meta XML 通常位于自身文件夹内,路径为 uiBundles/{appName}/{appName}.uibundle-meta.xml,与 bundle 的其他源文件(如 index.html、src/)并列。某些较旧或手工编写的项目可能将其放在扁平路径 uiBundles/{appName}.uibundle-meta.xml(无子文件夹)。
运行 node scripts/resolve-uibundle-path.mjs "{appName}" — 它会打印现有 meta XML 的路径(优先嵌套布局,回退到扁平布局)。始终通过 node 调用(绝不作为裸可执行文件),以便在 Windows 及 macOS/Linux 上都能工作。就地编辑该确切文件;不要在其他路径创建第二个文件,也不要作为此技能的一部分将其迁移到不同布局。
若第 2 步确认 UIBundle 上存在 target 字段,则在该文件的现有 <UIBundle> 元素内添加 <target>CustomApplication</target>,保留所有其他现有元素和值不变(若目标组织的 API 版本不存在该字段,则完全跳过此步骤 — 不要创建文件或添加 <target>)。
禁止事项:
- 创建新的 .uibundle-meta.xml 文件。
- 当已存在 .uibundle-meta.xml(嵌套或扁平)时,在不同路径创建第二个文件 — 就地编辑已有的那个,无论它在哪。
- 在别处添加
<target>的同时,不修改原始的 uiBundles/{appName}/{appName}.uibundle-meta.xml(或 uiBundles/{appName}.uibundle-meta.xml,如果那是现有布局)。
此技能产生或修改的唯一文件是 applications/{appName}.app-meta.xml(新建)和现有的 {appName}.uibundle-meta.xml(就地编辑,仅在适用 <target> 时)。输出中出现的任何其他 UI-bundle 相关文件都是 bug。
完全更新后文件示例(位于 uiBundles/{appName}/{appName}.uibundle-meta.xml,或现有布局对应的扁平路径)— 这仅展示现有文件的最终状态,而非要创建的新文件:
<?xml version="1.0" encoding="UTF-8"?>
<UIBundle xmlns="http://soap.sforce.com/2006/04/metadata">
<masterLabel>{appName}</masterLabel>
<description>A Salesforce UI Bundle.</description>
<isActive>true</isActive>
<version>1</version>
<target>CustomApplication</target>
</UIBundle>
第 6 步:不要修改非模板化属性
不要修改 CustomApplication 元数据中任何未以 {braces} 包裹的变量形式表达的默认属性值。
验证清单
部署前确认:
- 所有必需属性已解析。
- 已查询 API 上下文以确定可用字段(第 2 步)。
- applications/{appName}.app-meta.xml 存在且内容正确。
- bundle 引用字段与组织 API 版本匹配(
<uiBundle>或<webApplication>)。 - 若支持 target 字段:现有 {appName}.uibundle-meta.xml(嵌套于 uiBundles/{appName}/,或扁平位于 uiBundles/,以已存在者为准)含有
<target>CustomApplication</target>。 - 未创建额外的 .uibundle-meta.xml 文件 — 恰好存在一个 {appName}.uibundle-meta.xml,位于其原本所在路径。
- 部署验证成功:
sf project deploy validate --metadata CustomApplication UIBundle --target-org ${usernameOrAlias}。
适用场景
当项目包含 uiBundles/*/src/ 目录,且任务涉及创建或配置承载 UI bundle 的 Custom Application 时使用。
限制
- 资源中未提供具体的收费、价格或平台支持信息。
- 技能依赖 salesforce-api-context MCP 工具;若不可用则回退到较新字段名。