automation-sandbox-post-copy-config-generate
automation-sandbox-post-copy-config-generate について
顧客の Salesforce サンドボックス更新後の SOP を、後処理自動化ツール向けの JSON 配列に変換するスキルです。記載された操作を 4 種類の設定に対応づけ、具体的な値がない操作は除外します。
主な機能
- 01対応形式の SOP の解析
- 02操作を 4 種類の設定に分類
- 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 を開いて読み、各アクションについて、テンプレートのエントリをコピーしてください。出力の各エントリは、次の 4 種類のいずれかの形式に厳密に従う必要があります。トップレベルキーは 5 個で、それ以外はなく、ラッパーオブジェクトもありません。
[
{
"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のいずれかを正確に指定します。これらは有効な値の唯一の 4 種類であり、複数形/パスカルケースです(単数形のOutboundMessage、Type/Name/Operationは使用しません)。Fields内のフィールドキーは、記載どおりパスカルケースで指定します: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(3 つすべて必須)。Flows のFields:FlowApiNameとAction(両方必須)。Actionは"Activate"または"Deactivate"を正確に指定します。VersionNumberは任意で、正の整数を指定します。意味を持つのはActivateの場合のみです。 ExecutionOrderは行ごとのカウンターではなく、フェーズ番号です。上のテンプレートの1、2、3、4は、各例が異なるエントリタイプだから異なっているだけです。同じタイプの複数エントリに依存関係がなければ、同じ番号を指定します。たとえば、互いに独立した 3 つの 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 に記載されていない値の推測や捏造。アクションに具体的な URL/値が SOP に記載されていない場合、そのアクションはスキップしてください。
出力するすべてのエントリで、すべての Field に、顧客のソースに実在する値を設定する必要があります。 空文字列、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、カタログ、テンプレート、スキーマの読み込み)は書き込みの前提条件です。書き込み手順に進むために、これらを省略してはいけません。assets/config_template.json と references/configuration_catalog.md を読まずに JSON を出力しようとしていることに気づいたら、戻って先に読み込んでください。
-
提供されている 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:
-
コピー後のアクションを特定する — 散文の指示(「Outbound Message のエンドポイント X を URL Y に更新する」など)を構造化されたアクションレコードに変換するためのヒューリスティックについては、
references/sop_parsing_patterns.mdを読んでください。 -
各アクションを
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 ファイルを書き込む — 2 スペースのインデントで整形した JSON を出力します。
ルール/制約
| 制約 | 理由 |
|---|---|
| 最上位の出力は JSON 配列にする(ラッパーキーを持つオブジェクトではない) | コピー後のツールは配列を直接処理します |
各エントリに、必須のキーを5つすべて含める:ConfigurationName、Label、Fields、IsActive、ExecutionOrder | キーが欠けているとツールは即座にエラーになり、不完全なエントリは黙って受け入れられません |
ConfigurationName にはカタログにある値を指定する | 未知の値を指定するとランタイムのマッパーでエラーが発生します。カタログを更新せずに新しい型を作成してはいけません |
Fields のキーには、対象メタデータに実在する API フィールド名を指定する | キー名が誤っていると、ツールはランタイムにフィールドを特定できません |
Fields の値には、SOP に記載された具体的な値(実際の URL、名前など)を指定する | コピー後のツールは値をそのまま適用します。プレースホルダーはランタイムに解決されません |
| SOP にアクション名は記載されているものの、具体的な値(URL など)がない場合は、そのエントリを完全に省略し、レスポンスに記載する | 実際の値がないエントリを生成すると、ランタイムに何も起きないか、デプロイエラーが発生します |
出力するすべてのエントリのすべての Field に、顧客の SOP または顧客が提供した補足シートにある実際の値を指定する。""、null、<from-backup>/TBD/TODO などのプレースホルダーマーカーは決して出力しない | 顧客は JSON をそのまま使用します。空のフィールドやプレースホルダーフィールドは不備のある出力として顧客に表示され、ランタイムでもエラーになります |
| 値がないことを理由に OBM/RemoteSite を省略する前に、提供されたワークブック内のすべてのタブ/シート、および提供されたすべてのファイルで、その名前をキーとするエンドポイントテーブルを検索する | 顧客の SOP では、アクション一覧と URL テーブルが別々のシートに記載されていることがよくあります(例:Michelin UAT Refresh Planner では、OBM は Integration タブに記載されていますが、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 から直接コピーしてください。最上位の5つのキー
(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)に登場する | 環境ごとに1つのエントリーを出力します。Label に接尾辞を付けるか、SOP に記載されている環境固有の Label を使用します |
OutboundMessages では、異なる Object を対象とする各エントリーに同じ Label を正当に指定できます(例:Account 用の OBM と Contact 用の OBM が1つずつある)。 | まとめないでください。Object ごとに1つのエントリーを出力します。異なるのは Label ではなく、Object の値です(IR_Account_OBM_PROD のような OBM 名から Account と推測します)。 |
| SOP で複数の Custom Labels が1つの表にまとめられている | 表の各行につき1つのエントリーを作成します。1つの一括エントリーにまとめないでください |
| アクションの対象がカタログにない設定(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 を参照してください。 |
| SOP が複数のファイル(例:PDF、付属の xlsx、スクリーンショットフォルダー)で提供されている、または値が複数のタブ/ページに分散している | エントリーをスキップする前に、提供されたファイルをすべて最初から最後まで確認してください。アクション一覧と URL の表が別々のファイルにあることがよくあります。複数シートのソースに関する上記のルールを参照してください。 |
出力要件
納品物:
- コピー後のアクションエントリーを含む、最上位が配列の単一 JSON ファイル(既定では
post-copy-config.json)。 - 回答には、エントリーの合計数、
ConfigurationNameごとの件数、カタログに対応しないためにスキップしたアクション、SOP に具体的な値が記載されていないためにスキップしたアクションを含む短い概要を記載してください。
出力ファイルの構造は assets/json_schema.json に準拠します。
スキル間の連携
| 必要な作業 | 委任先 |
|---|---|
| Custom Label/Named Credential/Remote Site などの実際の 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/画像)ごとの正確な抽出手順と、データを含む画像と説明用画像を判別するヒューリスティック |
examples/sample_sop_to_config.json | ステップ 7 — 出力形式が想定どおりであることを確認する |
examples/sample_sop_excerpt.md | ステップ 7 — サンプル JSON の生成元となった、代表的な SOP の抜粋を確認する |