关于 automation-sandbox-post-copy-config-generate
将客户的 Salesforce 沙盒刷新或复制后 SOP 转换为供自动化工具使用的 JSON 数组。它把文档中的操作映射到四种受支持的配置类型,并跳过缺少具体来源值的操作。
主要功能
- 01解析支持格式的 SOP
- 02将操作映射到四种配置类型
- 03生成符合结构的 JSON 数组
- 04分配执行阶段
- 05跳过缺少具体值的操作
适用场景
- 01将沙盒刷新 SOP 转换为自动化配置
- 02汇总多个文件中的操作和端点信息
- 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.jsonjson_schema.jsonexamples/sample_sop_excerpt.mdsample_sop_to_config.jsonreferences/configuration_catalog.mdsop_parsing_patterns.mdsource_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,请返回并先阅读这两个文件。
-
定位并阅读所有提供的 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 …”或类似内容的章节或工作表。
- PDF:使用
-
识别复制后的操作——阅读
references/sop_parsing_patterns.md,了解如何使用启发式方法将“将 Outbound Message 端点 X 更新为 URL Y”这类说明转换为结构化操作记录。 -
将每项操作映射到一个
ConfigurationName——加载references/configuration_catalog.md。当前目录支持OutboundMessages、RemoteSiteSettings、ScheduledApex和Flows。任何针对其他配置类型的操作均不在范围内:跳过,并在回复中列出,以便用户之后扩展目录。 -
读取 JSON 模板——加载
assets/config_template.json。该文件展示了一个OutboundMessages条目、一个RemoteSiteSettings条目、一个ScheduledApex条目和一个Flows条目的确切必需结构,并包含<…>占位符槽位。复制一个条目,将每个<…>槽位替换为具体的 SOP 值,并保留确切的顶层键(ConfigurationName、Label、Fields、IsActive、ExecutionOrder)——切勿将其重命名为Type、Name、Operation等。切勿输出仍包含<…>占位符的条目;如果无法填入某个槽位,请跳过该条目(参见规则)。 -
根据架构验证——加载
assets/json_schema.json。每个条目都必须符合要求:ConfigurationName必须是目录中的值之一,Fields必须是对象,IsActive必须是布尔值,ExecutionOrder必须是正整数。 -
按阶段分组条目,然后分配
ExecutionOrder——ExecutionOrder是阶段编号,不是逐行计数器。可以并行运行(彼此无依赖关系)的条目应使用相同的值。不同的ConfigurationName类型通常属于不同阶段;同一阶段内的所有条目使用相同编号。请参阅references/sop_parsing_patterns.md中的排序启发式方法。 -
与示例比较——写入前,根据
examples/sample_sop_to_config.json验证输出结构。 -
写入 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 摘录 |