mcpField
A
automation-sandbox-post-copy-config-generate

automation-sandbox-post-copy-config-generate

github.com/forcedotcom云与 DevOps1.1k2.3k 次安装1 天前更新
代码仓库

关于 automation-sandbox-post-copy-config-generate

将客户的 Salesforce 沙盒刷新或复制后 SOP 转换为供自动化工具使用的 JSON 数组。它把文档中的操作映射到四种受支持的配置类型,并跳过缺少具体来源值的操作。

主要功能

  1. 01解析支持格式的 SOP
  2. 02将操作映射到四种配置类型
  3. 03生成符合结构的 JSON 数组
  4. 04分配执行阶段
  5. 05跳过缺少具体值的操作

适用场景

  1. 01将沙盒刷新 SOP 转换为自动化配置
  2. 02汇总多个文件中的操作和端点信息
  3. 03整理需后续处理的不支持操作

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/forcedotcom/sf-skills --skill automation-sandbox-post-copy-config-generate

安装后在 Claude Code 中输入/automation-sandbox-post-copy-config-generate确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

assets/
config_template.json
json_schema.json
examples/
sample_sop_excerpt.md
sample_sop_to_config.json
references/
configuration_catalog.md
sop_parsing_patterns.md
source_format_handling.md

详细介绍

自动化:沙盒复制后配置生成

将客户的沙盒刷新/复制后 SOP 转换为结构化 JSON 数组,供复制后自动化工具使用。每个条目都是一条声明式指令:要更新哪项 Salesforce 配置、涉及哪些字段、是否启用,以及运行顺序。

停止——写入任何 JSON 前,请先执行此操作

不要凭记忆编写输出。写入文件前,必须打开并阅读 assets/config_template.json,并从中复制一个条目作为每项操作的模板。每个输出条目必须严格采用以下四种结构之一——恰好包含五个顶层键,不得有其他键,也不得使用包装对象:

[
  {
    "ConfigurationName": "OutboundMessages",
    "Label": "IR_Account_OBM_PROD",
    "Fields": { "EndpointUrl": "https://uat.example.com/services/account", "Object": "Account" },
    "IsActive": true,
    "ExecutionOrder": 1
  },
  {
    "ConfigurationName": "RemoteSiteSettings",
    "Label": "R12_Remote_Site",
    "Fields": { "RemoteSiteUrl": "https://uat.example.com" },
    "IsActive": true,
    "ExecutionOrder": 2
  },
  {
    "ConfigurationName": "ScheduledApex",
    "Label": "Nightly Data Sync",
    "Fields": { "ApexClassName": "NightlyDataSyncScheduler", "CronExpression": "0 0 2 * * ?", "JobName": "Nightly Data Sync" },
    "IsActive": true,
    "ExecutionOrder": 3
  },
  {
    "ConfigurationName": "Flows",
    "Label": "Deactivate Nightly Sync Flow",
    "Fields": { "FlowApiName": "Nightly_Sync_Flow", "Action": "Deactivate" },
    "IsActive": true,
    "ExecutionOrder": 4
  }
]
  • ConfigurationName:只能是 OutboundMessages、RemoteSiteSettings、ScheduledApex 或 Flows——这四个值是唯一有效值,且必须使用复数/PascalCase(不能用单数 OutboundMessage,也不能用 Type/Name/Operation)。
  • Fields 中的字段键必须原样使用 PascalCase:EndpointUrl、Object、RemoteSiteUrl、ApexClassName、CronExpression、JobName、FlowApiName、Action、VersionNumber——不能使用小写形式(如 endpointUrl),也不能在顶层重复(isActive/Label 不得放在 Fields 中——它们已位于条目的顶层)。
  • OBM 的 Fields:EndpointUrl + Object(两者必填)。RemoteSite 的 Fields:仅 RemoteSiteUrl——不能用 Url/RemoteSiteURL。ScheduledApex 的 Fields:ApexClassName + CronExpression + JobName(三者均必填)。Flows 的 Fields:FlowApiName + Action(两者必填);Action 只能是 "Activate" 或 "Deactivate";可选的 VersionNumber(正整数)仅在 Activate 时有意义。
  • ExecutionOrder 是阶段编号,不是逐行递增的计数器。上方模板中的 1, 2, 3, 4 之所以不同,只是因为每个示例属于不同的条目类型。同一类型的多个条目若彼此无依赖,则使用相同编号——例如,三个彼此独立的 OBM 都填写 ExecutionOrder: 1。
  • 顶层必须是 JSON 数组。不得使用 steps/actions/records 包装。输出中不得残留任何 <…> 或 REPLACE_WITH_… 占位符。

如果你在尚未阅读模板和目录时宣布“我现在将写入……”,请停下来,先阅读它们——凭记忆猜测会产生错误的键,并导致运行时失败。

范围

  • 范围内:读取任意受支持格式的客户 SOP(PDF、xlsx、csv、JSON、docx、Markdown、纯文本、粘贴的摘录,或包含数据表格的图片——例如包含端点 URL 的 Outbound Messages 列表截图),识别复制后/刷新后的操作,将每项操作映射到受支持的 ConfigurationName,并输出规范的 JSON 数组。
  • 范围外:生成 Salesforce 元数据 XML(委派给 generating-* 技能)、向组织部署任何内容、运行复制后工具、推断或编造 SOP 中未提供的值——如果 SOP 未为某项操作提供具体 URL/值,则跳过该操作。

**每个输出条目都必须为所有字段填入客户来源中的真实值。**不得使用空字符串、null、<from-backup>/TBD/TODO 等占位符。输出中绝不能让客户看到未填写的字段——如果找不到某个值,就跳过该条目并说明情况。请参阅下方对应规则。


必需输入

生成前,请收集或推断以下信息:

  • SOP 来源:一个或多个路径(或粘贴的内容),格式可以是: PDF、xlsx、csv、JSON、docx、Markdown、纯文本或图片 (.png/.jpg/.jpeg/.tiff/.bmp)。通常会涉及多个文件——操作 列表和端点表有时分别位于不同文件中。请读取用户提供的 每个文件。
  • 目标输出路径:JSON 配置的写入位置。除非用户另有说明,否则 默认写入当前目录下的 post-copy-config.json。
  • 范围筛选条件(可选):如果 SOP 涵盖多个环境 (例如 fcQA、fcUAT 或多个沙盒),请确认用户希望在输出中包含哪些环境。

如果用户提供了明确的 SOP 和目标路径,请立即生成,无需提出不必要的问题。


工作流

所有步骤均按顺序执行。步骤 1–5(阅读 SOP、目录、模板和架构)是编写前提——不得跳过直接进入编写步骤。如果你发现自己准备输出 JSON,却还没有读取 assets/config_template.json 和 references/configuration_catalog.md,请返回并先阅读这两个文件。

  1. 定位并阅读所有提供的 SOP 来源——阅读 references/source_format_handling.md,了解每种格式(PDF、xlsx、csv、JSON、docx、图像)的具体提取方法。简要说明:

    • PDF:使用 pypdf 提取文本(文本层);如果文本层为空,则使用 pytesseract 对基于图像的页面进行 OCR。
    • xlsx:使用 openpyxl 读取每张工作表(data_only=True),扫描所有列,包括默认可见范围之外的列,并检查单元格批注和嵌入媒体。
    • csv / JSON / Markdown / text:直接读取。
    • docx:使用 python-docx 提取段落和表格。
    • 图像(.png/.jpg/...):使用 Read 工具查看,然后判断图像是否包含数据(例如端点 URL 表格、显示待采集值的设置截图),还是仅用于说明(例如架构图、流程图)。只从包含数据的图像中提取值。请参阅 references/source_format_handling.md 中的图像处理规则。
    • 对于非常大的 SOP(超过 50 页/超过 20 张工作表),重点查看标题为“Post Refresh”、“Post-Copy”、“Post-Refresh Steps”、“Update …”或类似内容的章节或工作表。
  2. 识别复制后的操作——阅读 references/sop_parsing_patterns.md,了解如何使用启发式方法将“将 Outbound Message 端点 X 更新为 URL Y”这类说明转换为结构化操作记录。

  3. 将每项操作映射到一个 ConfigurationName——加载 references/configuration_catalog.md。当前目录支持 OutboundMessages、RemoteSiteSettings、ScheduledApex 和 Flows。任何针对其他配置类型的操作均不在范围内:跳过,并在回复中列出,以便用户之后扩展目录。

  4. 读取 JSON 模板——加载 assets/config_template.json。该文件展示了一个 OutboundMessages 条目、一个 RemoteSiteSettings 条目、一个 ScheduledApex 条目和一个 Flows 条目的确切必需结构,并包含 <…> 占位符槽位。复制一个条目,将每个 <…> 槽位替换为具体的 SOP 值,并保留确切的顶层键(ConfigurationName、Label、Fields、IsActive、ExecutionOrder)——切勿将其重命名为 Type、Name、Operation 等。切勿输出仍包含 <…> 占位符的条目;如果无法填入某个槽位,请跳过该条目(参见规则)。

  5. 根据架构验证——加载 assets/json_schema.json。每个条目都必须符合要求:ConfigurationName 必须是目录中的值之一,Fields 必须是对象,IsActive 必须是布尔值,ExecutionOrder 必须是正整数。

  6. 按阶段分组条目,然后分配 ExecutionOrder——ExecutionOrder 是阶段编号,不是逐行计数器。可以并行运行(彼此无依赖关系)的条目应使用相同的值。不同的 ConfigurationName 类型通常属于不同阶段;同一阶段内的所有条目使用相同编号。请参阅 references/sop_parsing_patterns.md 中的排序启发式方法。

  7. 与示例比较——写入前,根据 examples/sample_sop_to_config.json 验证输出结构。

  8. 写入 JSON 文件——输出经过美化的 JSON(缩进 2 个空格)。


规则 / 约束

约束原因
顶层输出为 JSON 数组(而不是带包装键的对象)复制后工具直接使用数组
每个条目都包含全部五个必需键:ConfigurationName、Label、Fields、IsActive、ExecutionOrder工具会在缺少键时立即报错;不接受静默忽略不完整条目
ConfigurationName 必须是目录中的值未知值会导致运行时映射器报错——切勿发明新类型,除非同时更新目录
Fields 的键必须是目标元数据中的实际 API 字段名称键名错误会导致工具在运行时无法找到字段
Fields 的值必须是 SOP 中的具体值(字面 URL、名称等)复制后工具会原样应用该值;运行时不会解析占位符
如果 SOP 指定了某个操作,但未提供具体值(如 URL),则完全跳过该条目并在响应中列出在没有实际值的情况下生成条目,会导致静默无操作或运行时部署错误
每个输出条目中的每个字段都必须是来自客户 SOP 或其提供的补充表格的真实值。绝不要输出 ""、null 或 <from-backup> / TBD / TODO 等占位标记客户会直接使用 JSON;空字段或占位字段会造成错误输出,也会在运行时失败
因缺少值而跳过 OBM / RemoteSite 前,请搜索所提供工作簿的每个标签页 / 工作表(以及每个所提供的文件),查找以该名称为键的端点表客户 SOP 经常将操作列表和 URL 表拆分到不同工作表中(例如,Michelin UAT Refresh Planner 在 Integration 标签页中列出 OBM,而 URL 表位于 Evolution SFA 标签页)
已由其他字段记录的信息不得在 Fields 中重复(例如,RemoteSiteName 位于 Label 中,IsActive 位于顶层——两者都不应放入 Fields)重复的键会使条目含义模糊,并浪费工具随后需要协调的字节
对于 OutboundMessages,Fields 必须同时包含 EndpointUrl 和 Object(目标 SObject,例如 Account、Contact、Asset、Lead 等)相同的 Label 可能适用于多个仅实体不同的 OBM;Object 可在运行时区分它们
对于 RemoteSiteSettings,URL 键必须准确拼写为 RemoteSiteUrl——绝不能写成 Url、RemoteSiteURL、SiteUrl 或 EndpointUrl复制后工具会按准确的 API 名称匹配字段;任何其他拼写都会导致工具找不到字段,并在运行时静默地不执行该条目
对于 Flows,Fields 必须包含 FlowApiName(流程的 DeveloperName,在所有 Flows 中唯一)和 Action(必须严格为 "Activate" 或 "Deactivate",区分大小写)。Fields.VersionNumber(正整数)为可选项,且仅当 Action 为 "Activate" 时有意义;如果 Activate 时省略此项,应用端技能会解析为最新保存的版本。FlowApiName 是 FlowDefinition.DeveloperName 上的唯一查找键;Action 是固定的指令动词(不是 Salesforce 字段名称),应用端技能会按精确字符串匹配。流程标签并不唯一——切勿将其用作查找键。
ExecutionOrder 是阶段编号——彼此没有依赖关系的条目使用相同的值复制后工具会并行运行所有 ExecutionOrder 相同的条目;只有操作之间存在依赖关系时才需要排序
IsActive: false 的条目仍须保留在输出中(不要删除)客户会按环境启用它们;删除会导致无法追溯
当 SOP 将某项操作标记为必需时,IsActive 默认为 true大多数 SOP 步骤都是必需的;明确选择不启用的情况除外
标准条目格式

请参阅上方 STOP 部分中的条目格式,或直接复制 assets/config_template.json。不要将五个顶层键 (ConfigurationName、Label、Fields、IsActive、ExecutionOrder)重命名为 Type、Name、Operation、apiName 等,也不要将数组包装在带有 steps / actions / records 键的对象中。


注意事项

问题解决方法
SOP 步骤要求“删除所有端点”,而不是“将 X 更新为 Y”输出一个条目,其中 ConfigurationName: "OutboundMessages",Label 描述删除目标,并在 Fields 中添加备注({"Action": "Delete"});目录中记录了 Delete 模式
同一个 Label 出现在多个环境中(fcQA + fcUAT)每个环境输出一个条目;为 Label 添加环境后缀,或使用 SOP 中对应环境的 Label
对于 OutboundMessages,当每个条目指向不同的 Object 时(例如,一个 OBM 用于 Account,一个用于 Contact),同一个 Label 合理地适用于多个条目。不要合并这些条目——每个 Object 输出一个条目。用于区分它们的是 Object 值(根据 OBM 名称推断,例如 IR_Account_OBM_PROD → Account),而不是 Label。
SOP 在一个表格中将多个 Custom Labels 归为一组每行输出一个条目——不要合并为单个批量条目
操作目标是目录之外的设置(CustomLabels、ConnectedApps、NamedCredentials、SSO、CustomSettings 等)跳过该操作,不要虚构新的 ConfigurationName;在响应中列出所有跳过的操作,让用户知道之后需要将它们添加到目录中
SOP 将刷新前步骤与刷新后步骤混在一起筛除刷新前的步骤——输出中只包含刷新后 / 复制后的操作
SOP 指定要更新的出站消息 / 远程站点,但未提供新 URL跳过该条目。在响应中列出跳过的项目,以便用户提供 URL 或修改 SOP
SOP 的 URL 中包含机密(例如,https://USER:TOKEN@host/...)原样嵌入——工具会直接使用该值——但需在响应中提醒用户,JSON 现在包含机密,应妥善存储 / 分享
用户的 SOP 使用非英语语言或格式复杂(表格、提示框)先提取正文并规范空白,再进行解析——无需在 JSON 中保留格式痕迹
SOP 中包含屏幕截图 / 图片。有些图片仅用于说明(架构图、流程图、“设置界面示例”);另一些则包含数据(真实 Outbound Messages 列表的截图、截取的 Remote Site 表格)。将说明性图片视为范围之外——不要从中提取值。对于包含数据的图片(周围文本提到“下方显示的值”/“如上方截图所示”/可见真实 Endpoint URL),使用 OCR 识别并采用其中的值。判定方法请参阅 references/source_format_handling.md。
用户提供多个文件(例如,PDF + 配套的 xlsx + 截图文件夹),或值分散在多个选项卡 / 页面中跳过任何条目前,完整读取每个提供的文件。操作列表和 URL 表经常位于不同文件中——另请参阅上方有关多工作表来源的规则。

输出要求

交付内容:

  • 一个 JSON 文件(默认名为 post-copy-config.json),其中包含一个顶层数组,数组元素为复制后操作条目。
  • 在响应中简要总结:条目总数、每个 ConfigurationName 的数量、因无法映射到目录而跳过的操作,以及因 SOP 未提供具体值而跳过的操作。

输出文件结构应符合 assets/json_schema.json。


跨技能集成

需求委派给
为自定义标签 / 命名凭据 / 远程站点等生成实际的 Salesforce 元数据 XML对应的 generating-* 技能
将生成的元数据部署到组织,或针对组织运行后复制工具deploying-metadata 技能
将 SOP 与 UDD 中定义的实体进行比较udd:research-entities

参考文件索引

文件何时阅读
assets/config_template.json步骤 4——JSON 输出的起始结构
assets/json_schema.json步骤 5——验证每个输出条目
references/configuration_catalog.md步骤 3——将 SOP 操作映射到 ConfigurationName,并获取规范的 Field 键
references/sop_parsing_patterns.md步骤 2 和步骤 6——从文本中提取操作并排列顺序的启发式方法
references/source_format_handling.md步骤 1——针对每种输入格式(PDF / xlsx / csv / JSON / docx / image)的精确提取流程,以及图像中承载数据与仅作说明的判别启发式方法
examples/sample_sop_to_config.json步骤 7——验证输出结构是否符合预期格式
examples/sample_sop_excerpt.md步骤 7——查看生成示例 JSON 的代表性 SOP 摘录

评论

支持 Markdown