@salesforce/afv-skills 1.33.0 → 1.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/package.json +1 -1
  2. package/skills/agentforce-architecture-analyze/SKILL.md +8 -0
  3. package/skills/agentforce-bot-upgrade/SKILL.md +0 -2
  4. package/skills/agentforce-d360-analyze/SKILL.md +8 -0
  5. package/skills/agentforce-observe/SKILL.md +3 -0
  6. package/skills/agentforce-test/SKILL.md +3 -0
  7. package/skills/automation-flow-generate/SKILL.md +1 -0
  8. package/skills/automation-sandbox-post-copy-config-generate/SKILL.md +239 -0
  9. package/skills/automation-sandbox-post-copy-config-generate/assets/config_template.json +21 -0
  10. package/skills/automation-sandbox-post-copy-config-generate/assets/json_schema.json +90 -0
  11. package/skills/automation-sandbox-post-copy-config-generate/examples/sample_sop_excerpt.md +31 -0
  12. package/skills/automation-sandbox-post-copy-config-generate/examples/sample_sop_to_config.json +50 -0
  13. package/skills/automation-sandbox-post-copy-config-generate/references/configuration_catalog.md +76 -0
  14. package/skills/automation-sandbox-post-copy-config-generate/references/sop_parsing_patterns.md +157 -0
  15. package/skills/automation-sandbox-post-copy-config-generate/references/source_format_handling.md +230 -0
  16. package/skills/commerce-b2b-open-code-components-integrate/SKILL.md +8 -0
  17. package/skills/commerce-b2b-open-code-components-replace/SKILL.md +2 -0
  18. package/skills/commerce-b2b-store-create/SKILL.md +4 -1
  19. package/skills/data360-activate/SKILL.md +12 -0
  20. package/skills/data360-code-extension-generate/SKILL.md +6 -6
  21. package/skills/data360-connect/SKILL.md +11 -0
  22. package/skills/data360-harmonize/SKILL.md +11 -0
  23. package/skills/data360-orchestrate/SKILL.md +30 -0
  24. package/skills/data360-prepare/SKILL.md +14 -0
  25. package/skills/data360-query/SKILL.md +10 -0
  26. package/skills/data360-schema-get/SKILL.md +7 -0
  27. package/skills/data360-segment/SKILL.md +11 -0
  28. package/skills/design-systems-slds-validate/SKILL.md +8 -0
  29. package/skills/design-systems-slds2-migrate/SKILL.md +3 -0
  30. package/skills/dx-apexguru-scan/SKILL.md +403 -0
  31. package/skills/dx-apexguru-scan/examples/README.md +54 -0
  32. package/skills/dx-apexguru-scan/examples/sample-decoded-summary.json +176 -0
  33. package/skills/dx-apexguru-scan/examples/sample-full-no-runtime-response.json +26 -0
  34. package/skills/dx-apexguru-scan/examples/sample-succeeded-response.json +15 -0
  35. package/skills/dx-apexguru-scan/references/api-reference.md +81 -0
  36. package/skills/dx-apexguru-scan/references/authentication.md +134 -0
  37. package/skills/dx-apexguru-scan/references/error-handling.md +56 -0
  38. package/skills/dx-apexguru-scan/references/violation-catalog.md +28 -0
  39. package/skills/dx-apexguru-scan/scripts/build-zip.sh +87 -0
  40. package/skills/dx-apexguru-scan/scripts/decode-report.js +389 -0
  41. package/skills/dx-apexguru-scan/scripts/resolve-token.sh +151 -0
  42. package/skills/dx-apexguru-scan/scripts/run-scan.sh +153 -0
  43. package/skills/dx-apexguru-scan/scripts/scan.sh +96 -0
  44. package/skills/dx-apexguru-scan/scripts/validate-token.js +121 -0
  45. package/skills/dx-app-analytics-query/SKILL.md +5 -0
  46. package/skills/dx-code-analyzer-configure/SKILL.md +5 -5
  47. package/skills/dx-code-analyzer-custom-rule-create/SKILL.md +3 -1
  48. package/skills/dx-code-analyzer-run/SKILL.md +10 -2
  49. package/skills/dx-devops-pipeline-manage/SKILL.md +263 -0
  50. package/skills/dx-devops-pipeline-manage/examples/common-workflows.md +177 -0
  51. package/skills/dx-devops-pipeline-manage/references/cli-commands.md +298 -0
  52. package/skills/dx-devops-pipeline-manage/references/parsing-patterns.md +134 -0
  53. package/skills/dx-devops-pipeline-manage/scripts/check-activation-ready.sh +34 -0
  54. package/skills/dx-devops-pipeline-manage/scripts/validate-org-type.sh +17 -0
  55. package/skills/dx-devops-pipeline-manage/scripts/verify-operation.sh +82 -0
  56. package/skills/dx-devops-promote/SKILL.md +214 -0
  57. package/skills/dx-devops-promote/examples/promotion-workflows.md +212 -0
  58. package/skills/dx-devops-promote/references/cli-commands.md +303 -0
  59. package/skills/dx-devops-test-failures-analyze/SKILL.md +8 -0
  60. package/skills/dx-devops-test-pipeline-configure/SKILL.md +7 -0
  61. package/skills/dx-devops-test-suite-assignments-configure/SKILL.md +9 -0
  62. package/skills/dx-devops-test-suite-run/SKILL.md +8 -0
  63. package/skills/dx-org-switch/SKILL.md +3 -0
  64. package/skills/experience-lwc-base-components-integrate/SKILL.md +176 -0
  65. package/skills/experience-lwc-base-components-integrate/references/lbc-expert-guidance.md +127 -0
  66. package/skills/experience-lwc-base-components-integrate/references/lightning-component-index.md +179 -0
  67. package/skills/experience-lwc-base-components-integrate/references/lightning-components.md +5429 -0
  68. package/skills/experience-lwc-base-components-integrate/scripts/extract-component-docs.sh +61 -0
  69. package/skills/experience-lwc-generate/SKILL.md +18 -0
  70. package/skills/experience-lwc-rtl-validate/SKILL.md +149 -0
  71. package/skills/experience-lwc-rtl-validate/references/rtl-expert.md +892 -0
  72. package/skills/experience-lwc-rtl-validate/scripts/scan-rtl-css.sh +206 -0
  73. package/skills/experience-lwc-typescript-migrate/SKILL.md +207 -0
  74. package/skills/experience-lwc-typescript-migrate/assets/dts-template.ts +15 -0
  75. package/skills/experience-lwc-typescript-migrate/assets/type-patterns.ts +44 -0
  76. package/skills/experience-lwc-typescript-migrate/scripts/find-consumers.sh +128 -0
  77. package/skills/experience-lwr-site-generate/SKILL.md +1 -1
  78. package/skills/experience-ui-bundle-agentforce-client-generate/SKILL.md +5 -2
  79. package/skills/experience-ui-bundle-custom-app-generate/SKILL.md +1 -1
  80. package/skills/experience-ui-bundle-file-upload-generate/SKILL.md +5 -0
  81. package/skills/experience-ui-bundle-localize/SKILL.md +323 -0
  82. package/skills/experience-ui-bundle-localize/references/gotchas.md +249 -0
  83. package/skills/experience-ui-bundle-localize/references/i18n-setup.md +169 -0
  84. package/skills/experience-ui-bundle-localize/references/interpolation.md +311 -0
  85. package/skills/experience-ui-bundle-localize/references/label-xml.md +282 -0
  86. package/skills/experience-ui-bundle-localize/references/verifying.md +219 -0
  87. package/skills/experience-ui-bundle-localize/scripts/check-i18n-wired.sh +195 -0
  88. package/skills/experience-ui-bundle-localize/scripts/check-manifest-registered.sh +100 -0
  89. package/skills/experience-ui-bundle-localize/scripts/check-org-api-version.sh +40 -0
  90. package/skills/experience-ui-bundle-localize/scripts/detect-bundle-type.sh +57 -0
  91. package/skills/experience-ui-bundle-metadata-generate/SKILL.md +1 -1
  92. package/skills/experience-ui-bundle-project-generate/SKILL.md +4 -4
  93. package/skills/experience-ui-bundle-salesforce-data-access/SKILL.md +11 -0
  94. package/skills/external-diagram-mermaid-generate/SKILL.md +21 -0
  95. package/skills/integration-connectivity-generate/SKILL.md +17 -0
  96. package/skills/integration-eventing-cdc-configure/SKILL.md +9 -0
  97. package/skills/integration-eventing-subscription-configure/SKILL.md +7 -0
  98. package/skills/mobile-apps-create/SKILL.md +5 -0
  99. package/skills/mobile-platform-native-capabilities-integrate/SKILL.md +3 -0
  100. package/skills/mobile-platform-offline-validate/SKILL.md +9 -0
  101. package/skills/omnistudio-callable-apex-generate/SKILL.md +14 -0
  102. package/skills/omnistudio-datamapper-generate/SKILL.md +13 -0
  103. package/skills/omnistudio-datapacks-deploy/SKILL.md +18 -0
  104. package/skills/omnistudio-dependencies-analyze/SKILL.md +12 -0
  105. package/skills/omnistudio-epc-catalog-generate/SKILL.md +15 -0
  106. package/skills/omnistudio-flexcard-generate/SKILL.md +11 -0
  107. package/skills/omnistudio-integration-procedure-generate/SKILL.md +11 -0
  108. package/skills/omnistudio-omniscript-generate/SKILL.md +9 -0
  109. package/skills/platform-agentexchange-partner-offers-configure/SKILL.md +8 -0
  110. package/skills/platform-agentsetup-categories-fetch/SKILL.md +3 -0
  111. package/skills/platform-apex-generate/SKILL.md +5 -0
  112. package/skills/platform-apex-logs-debug/SKILL.md +12 -0
  113. package/skills/platform-apex-test-generate/SKILL.md +5 -0
  114. package/skills/platform-apex-test-run/SKILL.md +14 -0
  115. package/skills/platform-custom-application-generate/SKILL.md +1 -0
  116. package/skills/platform-custom-field-generate/SKILL.md +1 -1
  117. package/skills/platform-custom-lightning-type-generate/SKILL.md +3 -0
  118. package/skills/platform-custom-lightning-type-generate/assets/primitive-types-and-constraints.md +1 -1
  119. package/skills/platform-custom-tab-generate/SKILL.md +1 -0
  120. package/skills/platform-data-manage/SKILL.md +15 -0
  121. package/skills/platform-dataspace-access-configure/SKILL.md +2 -2
  122. package/skills/platform-flexipage-generate/SKILL.md +3 -0
  123. package/skills/platform-lightning-app-coordinate/SKILL.md +18 -1
  124. package/skills/platform-mcp-tool-widget-coordinate/SKILL.md +250 -0
  125. package/skills/platform-mcp-tool-widget-coordinate/examples/action-name-source-prompt.md +74 -0
  126. package/skills/platform-mcp-tool-widget-coordinate/examples/apex-invocable-source-prompt.md +90 -0
  127. package/skills/platform-mcp-tool-widget-coordinate/examples/nested-object-source-prompt.md +191 -0
  128. package/skills/platform-mcp-tool-widget-coordinate/examples/pasted-tool-output-prompt.md +85 -0
  129. package/skills/platform-mcp-tool-widget-coordinate/references/build-plan-format.md +74 -0
  130. package/skills/platform-mcp-tool-widget-coordinate/references/mcp-tool-output-discovery.md +184 -0
  131. package/skills/platform-mcp-tool-widget-coordinate/references/two-clt-modeling.md +128 -0
  132. package/skills/platform-mcp-tool-widget-coordinate/references/validation-gates.md +181 -0
  133. package/skills/platform-metadata-api-context-get/SKILL.md +6 -2
  134. package/skills/platform-metadata-retrieve/SKILL.md +5 -0
  135. package/skills/platform-models-api-configure/SKILL.md +10 -0
  136. package/skills/platform-permission-set-generate/SKILL.md +1 -2
  137. package/skills/platform-policy-rule-generate/SKILL.md +2 -0
  138. package/skills/platform-report-generate/SKILL.md +1 -1
  139. package/skills/platform-sharing-rules-generate/SKILL.md +1 -1
  140. package/skills/platform-soql-query/SKILL.md +13 -0
  141. package/skills/platform-tracing-agentforce-configure/SKILL.md +5 -1
  142. package/skills/platform-tracing-configure/SKILL.md +4 -1
  143. package/skills/platform-trust-archive-manage/SKILL.md +3 -0
  144. package/skills/platform-validation-rule-generate/SKILL.md +1 -0
  145. package/skills/platform-widget-generate/SKILL.md +2 -1
  146. package/skills/sales-agentforce-pipeline-management-configure/SKILL.md +3 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/afv-skills",
3
- "version": "1.33.0",
3
+ "version": "1.35.0",
4
4
  "description": "Salesforce skills for Agentforce Vibes",
5
5
  "license": "CC-BY-NC-4.0",
6
6
  "files": [
@@ -3,6 +3,14 @@ name: agentforce-architecture-analyze
3
3
  description: "Declared architecture snapshot for one Agentforce agent: planner, topics, actions, flows, Apex, prompt templates, and NGA plugins. Renders a human-readable architecture document and Mermaid invocation graph from design-time metadata (not runtime audit rows). TRIGGER when user asks to describe, diagram, inventory, audit, document, or diff (e.g. v3 vs v5) the architecture / action tree / topic structure / tool inventory of a specific agent by agent API name in a specific org. DO NOT TRIGGER for runtime session traces, conversation transcripts, generation timings, or gateway audit chains — this skill reads design-time metadata only (use agentforce-d360-analyze for session traces)."
4
4
  metadata:
5
5
  version: "1.0"
6
+ minApiVersion: "64.0"
7
+ relatedSkills:
8
+ - "agentforce-d360-analyze"
9
+ cliTools:
10
+ - tool: ["sf"]
11
+ semver: ">=2.136.8"
12
+ - tool: ["python3"]
13
+ semver: ">=3.10.0"
6
14
  ---
7
15
 
8
16
  # agentforce-architecture-analyze — declared architecture snapshot
@@ -7,8 +7,6 @@ metadata:
7
7
  minApiVersion: "63.0"
8
8
  relatedSkills:
9
9
  - "agentforce-generate"
10
- - "agentforce-test"
11
- - "agentforce-observe"
12
10
  cliTools:
13
11
  - tool: ["sf"]
14
12
  semver: ">=2.0.0"
@@ -2,7 +2,15 @@
2
2
  name: agentforce-d360-analyze
3
3
  description: "Data Cloud 360° view of a single Agentforce session. TRIGGER when user asks to trace, inspect, summarize, or describe a specific Agentforce session by session id (Agent Session UUID `019d…` or MessagingSession id `0Mw…`). Also triggers on session discovery — find/list/search sessions by time, agent, channel, outcome, or conversation text — when the user has no session id yet. DO NOT TRIGGER for design-time architecture questions (use agentforce-architecture-analyze instead) or for runtime perf/latency/SLO questions that require platform telemetry beyond Data Cloud."
4
4
  metadata:
5
+ cliTools:
6
+ - tool: ["python3"]
7
+ semver: ">=3.10.0"
8
+ - tool: ["sf"]
9
+ semver: ">=2.0.0"
10
+ relatedSkills:
11
+ - "agentforce-architecture-analyze"
5
12
  version: "1.0"
13
+ minApiVersion: "66.0"
6
14
  ---
7
15
 
8
16
  # agentforce-d360-analyze — Data Cloud 360° session view
@@ -3,6 +3,9 @@ name: agentforce-observe
3
3
  description: "Analyze production Agentforce agent behavior using session traces and Data Cloud. TRIGGER when: user queries STDM session data or Data Cloud trace records; investigates production agent failures, regressions, or performance issues; asks about session traces, conversation logs, or agent metrics; wants to reproduce a reported production issue in preview; runs findSessions or trace analysis queries. DO NOT TRIGGER when: user creates, modifies, or debugs .agent files during development (use agentforce-generate); writes or runs test specs (use agentforce-test); uses sf agent preview for local development iteration; deploys or publishes agents."
4
4
  allowed-tools: Bash Read Write Edit Glob Grep
5
5
  metadata:
6
+ relatedSkills:
7
+ - "agentforce-generate"
8
+ - "agentforce-test"
6
9
  version: "0.8"
7
10
  cliTools:
8
11
  - tool: ["git"]
@@ -3,6 +3,9 @@ name: agentforce-test
3
3
  description: "Write, run, and analyze structured test suites for Agentforce agents — functional AND security. TRIGGER when: user writes or modifies test spec YAML (AiEvaluationDefinition); runs sf agent test create, run, run-eval, or results commands; asks about test coverage strategy, metric selection, or custom evaluations; interprets test results or diagnoses test failures; asks about batch testing, regression suites, or CI/CD test integration; requests security testing, OWASP LLM Top 10, red-teaming, penetration testing, prompt-injection tests, a security grade, or a vulnerability assessment of an agent. DO NOT TRIGGER when: user creates, modifies, previews, or debugs .agent files (use agentforce-generate); deploys or publishes agents; writes Agent Script code; uses sf agent preview for development iteration; analyzes production session traces (use agentforce-observe); performs a static safety review of .agent file content (use agentforce-generate Section 15)."
4
4
  allowed-tools: Bash Read Write Edit Glob Grep
5
5
  metadata:
6
+ relatedSkills:
7
+ - "agentforce-generate"
8
+ - "agentforce-observe"
6
9
  version: "0.8"
7
10
  cliTools:
8
11
  - tool: ["curl"]
@@ -3,6 +3,7 @@ name: automation-flow-generate
3
3
  description: "Generate Salesforce Flows using the MCP tool execute_metadata_action. Use when the user asks to create, build, or generate a flow — including Screen, Autolaunched, Record-Triggered (before/after-save), Scheduled. Also trigger for flow-like requests such as \"when a record is created\", \"trigger daily at\", \"send an email when\", \"update the field when\", \"automate\", \"workflow\", or \"flow XML/metadata\". This is the only skill for Salesforce Flow generation."
4
4
  metadata:
5
5
  version: "1.0"
6
+ minApiVersion: "60.0"
6
7
  ---
7
8
 
8
9
  ## Goal
@@ -0,0 +1,239 @@
1
+ ---
2
+ name: automation-sandbox-post-copy-config-generate
3
+ description: "Generate the JSON config file that the Salesforce sandbox post-copy automation tool consumes, from a customer SOP in any format (PDF, xlsx, csv, JSON, docx, Markdown, plain text, or a screenshot of an endpoint table). Use when the user asks to create, build, generate, produce, or convert a post-copy or post-refresh automation config — turning a sandbox-refresh SOP into a JSON array of OutboundMessages and RemoteSiteSettings entries with ConfigurationName, Label, Fields, IsActive, and ExecutionOrder. Also trigger for phrasings like \"post-copy config\", \"post-refresh automation JSON\", \"update the outbound message (OBM) endpoints after refresh\", \"convert this SOP to config\", \"remote site settings JSON\", \"refresh planner to JSON\", or \"sandbox refresh config\". DO NOT TRIGGER when: user wants to deploy the generated config to an org (use platform-metadata-deploy) or execute/run the post-copy automation tool. This is the only skill for Salesforce sandbox post-copy config generation."
4
+ metadata:
5
+ version: "1.0"
6
+ ---
7
+
8
+ # Automation: Sandbox Post-Copy Config Generate
9
+
10
+ Convert a customer's sandbox-refresh / post-copy SOP into a structured JSON
11
+ array that the post-copy automation tool consumes. Each entry is a
12
+ declarative instruction: which Salesforce configuration to update, which
13
+ fields are involved, whether it is active, and what order it runs in.
14
+
15
+ ## STOP — do this before writing any JSON
16
+
17
+ Do **not** compose the output from memory. Before you write the file, you
18
+ MUST open and read `assets/config_template.json` and copy an entry from it
19
+ for each action. Every output entry is exactly one of these two shapes —
20
+ five top-level keys, no others, no wrapper object:
21
+
22
+ ```json
23
+ [
24
+ {
25
+ "ConfigurationName": "OutboundMessages",
26
+ "Label": "IR_Account_OBM_PROD",
27
+ "Fields": { "EndpointUrl": "https://uat.example.com/services/account", "Object": "Account" },
28
+ "IsActive": true,
29
+ "ExecutionOrder": 1
30
+ },
31
+ {
32
+ "ConfigurationName": "RemoteSiteSettings",
33
+ "Label": "R12_Remote_Site",
34
+ "Fields": { "RemoteSiteUrl": "https://uat.example.com" },
35
+ "IsActive": true,
36
+ "ExecutionOrder": 2
37
+ }
38
+ ]
39
+ ```
40
+
41
+ - `ConfigurationName`: exactly `OutboundMessages` or `RemoteSiteSettings` — never `Type`, `Name`, or `Operation`.
42
+ - OBM `Fields`: `EndpointUrl` + `Object` (both required). RemoteSite `Fields`: `RemoteSiteUrl` only — never `Url`/`RemoteSiteURL`.
43
+ - Top level is a JSON array. No `steps`/`actions`/`records` wrapper. No `<…>` or `REPLACE_WITH_…` placeholder ever survives into the output.
44
+
45
+ If you announce "I will now write …" without having read the template and
46
+ catalog, stop and read them first — a from-memory guess produces the wrong
47
+ keys and fails at runtime.
48
+
49
+ ## Scope
50
+
51
+ - **In scope**: Reading a customer SOP in any of the supported formats
52
+ (PDF, xlsx, csv, JSON, docx, Markdown, plain text, pasted excerpt, or
53
+ images containing data tables — e.g., a screenshot of an
54
+ Outbound Messages list with endpoint URLs), identifying post-copy /
55
+ post-refresh actions, mapping each action to a supported
56
+ `ConfigurationName`, emitting the canonical JSON array.
57
+ - **Out of scope**: Generating Salesforce metadata XML (delegate to
58
+ `generating-*` skills), deploying anything to an org, running the
59
+ post-copy tool, inferring or fabricating values not present in the SOP —
60
+ if the SOP does not give a concrete URL/value for an action, skip the
61
+ action.
62
+
63
+ **Every emitted entry must have every Field populated with a real value
64
+ from the customer source.** No empty strings, no `null`, no
65
+ `<from-backup>` / `TBD` / `TODO` placeholders. Customers should never
66
+ see an unpopulated field in the output — if a value cannot be located,
67
+ skip the entry and surface it. See the corresponding rule below.
68
+
69
+ ---
70
+
71
+ ## Required Inputs
72
+
73
+ Gather or infer before generating:
74
+
75
+ - **SOP source(s)**: One or more paths (or pasted content) in any of:
76
+ PDF, xlsx, csv, JSON, docx, Markdown, plain text, or images
77
+ (.png/.jpg/.jpeg/.tiff/.bmp). Multiple files are common — the action
78
+ list and the endpoint table sometimes live in different files. Read
79
+ every file the user supplies.
80
+ - **Target output path**: Where the JSON config should be written. Default
81
+ to `post-copy-config.json` in the current directory unless specified.
82
+ - **Scope filter** (optional): If the SOP covers many environments
83
+ (e.g., fcQA, fcUAT, multiple sandboxes), confirm which subset the user
84
+ wants in the output.
85
+
86
+ If the user provides a clear SOP and target, generate immediately without
87
+ asking unnecessary questions.
88
+
89
+ ---
90
+
91
+ ## Workflow
92
+
93
+ All steps are sequential. Steps 1–5 (reading the SOP, the catalog, the
94
+ template, and the schema) are **prerequisites to writing** — you may not
95
+ skip to the write step. If you catch yourself about to emit JSON without
96
+ having read `assets/config_template.json` and
97
+ `references/configuration_catalog.md`, go back and read them first.
98
+
99
+ 1. **Locate and read every supplied SOP source** — read
100
+ `references/source_format_handling.md` for the exact extraction
101
+ recipe per format (PDF, xlsx, csv, JSON, docx, image). At a glance:
102
+ - **PDF**: extract text with `pypdf` (text layer) and OCR
103
+ image-based pages with `pytesseract` if the text layer is empty.
104
+ - **xlsx**: read every sheet with `openpyxl` (`data_only=True`),
105
+ scan all columns including ones outside the visible default
106
+ range, check cell comments and embedded media.
107
+ - **csv / JSON / Markdown / text**: read directly.
108
+ - **docx**: extract paragraphs and tables with `python-docx`.
109
+ - **Images** (.png/.jpg/...): use the `Read` tool to view, then
110
+ decide if the image carries data (a table of endpoint URLs, a
111
+ setup screenshot showing values to capture) or is purely
112
+ illustrative (architecture diagram, flow chart). Extract values
113
+ only from data-bearing images. See the image-handling rules in
114
+ `references/source_format_handling.md`.
115
+ - For very large SOPs (>50 pages / >20 sheets), focus on sections
116
+ or sheets titled "Post Refresh", "Post-Copy", "Post-Refresh
117
+ Steps", "Update …", or equivalent.
118
+
119
+ 2. **Identify post-copy actions** — read
120
+ `references/sop_parsing_patterns.md` for the heuristics that turn prose
121
+ instructions ("Update Outbound Message endpoint X to URL Y") into
122
+ structured action records.
123
+
124
+ 3. **Map each action to a `ConfigurationName`** — load
125
+ `references/configuration_catalog.md`. The catalog currently supports
126
+ only `OutboundMessages` and `RemoteSiteSettings`. Any action that
127
+ targets a different configuration type is out of scope: skip it and
128
+ list it in the response so the user can extend the catalog later.
129
+
130
+ 4. **Read the JSON template** — load `assets/config_template.json`. It
131
+ shows the exact required shape of one `OutboundMessages` entry and one
132
+ `RemoteSiteSettings` entry, with `<…>` placeholder slots. Copy an
133
+ entry, replace every `<…>` slot with the concrete SOP value, and keep
134
+ the exact top-level keys (`ConfigurationName`, `Label`, `Fields`,
135
+ `IsActive`, `ExecutionOrder`) — never rename them to `Type`, `Name`,
136
+ `Operation`, etc. Never emit an entry that still contains a `<…>`
137
+ placeholder; if you cannot fill a slot, skip the entry (see Rules).
138
+
139
+ 5. **Validate against the schema** — load `assets/json_schema.json`. Every
140
+ entry must conform: `ConfigurationName` is one of the catalog values,
141
+ `Fields` is an object, `IsActive` is boolean, `ExecutionOrder` is a
142
+ positive integer.
143
+
144
+ 6. **Group entries by phase, then assign `ExecutionOrder`** —
145
+ `ExecutionOrder` is a phase number, not a per-row counter. Entries that
146
+ can run in parallel (no dependency between them) share the same value.
147
+ Different `ConfigurationName` types typically get different phases; all
148
+ entries within one phase share its number. See the ordering heuristic
149
+ in `references/sop_parsing_patterns.md`.
150
+
151
+ 7. **Compare against the example** — verify the output shape against
152
+ `examples/sample_sop_to_config.json` before writing.
153
+
154
+ 8. **Write the JSON file** — emit pretty-printed JSON (2-space indent).
155
+
156
+ ---
157
+
158
+ ## Rules / Constraints
159
+
160
+ | Constraint | Rationale |
161
+ |-----------|-----------|
162
+ | Output is a JSON array at the top level (not an object with a wrapper key) | The post-copy tool consumes an array directly |
163
+ | Every entry has all five required keys: `ConfigurationName`, `Label`, `Fields`, `IsActive`, `ExecutionOrder` | The tool fails fast on missing keys; partial entries are not silently accepted |
164
+ | `ConfigurationName` is one of the catalog values | Unknown values cause the runtime mapper to error out — never invent a new type without updating the catalog |
165
+ | `Fields` keys are the actual API field names on the target metadata | Wrong key names mean the tool can't locate the field at runtime |
166
+ | `Fields` values are the concrete values from the SOP (literal URLs, names, etc.) | The post-copy tool applies the value as-is; placeholders are not resolved at runtime |
167
+ | If the SOP names an action but no concrete value (URL, etc.) is provided, **skip the entry** entirely and list it in the response | Generating an entry without a real value would produce a silent no-op or a deployment error at runtime |
168
+ | Every Field in every emitted entry must be a real value sourced from the customer's SOP or a supplemental sheet they provided. Never emit `""`, `null`, or placeholder markers like `<from-backup>` / `TBD` / `TODO` | Customers consume the JSON directly — empty / placeholder fields surface to them as broken output and would also fail at runtime |
169
+ | Before skipping an OBM / RemoteSite for missing values, **search every tab / sheet of the supplied workbook (and every supplied file)** for an endpoint table keyed by that name | Customer SOPs frequently split the action list and the URL table across different sheets (e.g., the Michelin UAT Refresh Planner lists OBMs in the Integration tab but the URL table lives in the Evolution SFA tab) |
170
+ | Information already captured by another field is **not** repeated in `Fields` (e.g., `RemoteSiteName` lives in `Label`, `IsActive` lives at the top level — neither belongs in `Fields`) | Duplicate keys make the entry ambiguous and waste bytes the tool then has to reconcile |
171
+ | For `OutboundMessages`, `Fields` MUST include both `EndpointUrl` and `Object` (the target SObject — `Account`, `Contact`, `Asset`, `Lead`, etc.) | Same Label can apply to multiple OBMs differing only by entity; `Object` disambiguates them at runtime |
172
+ | For `RemoteSiteSettings`, the URL key MUST be spelled exactly `RemoteSiteUrl` — never `Url`, `RemoteSiteURL`, `SiteUrl`, or `EndpointUrl` | The post-copy tool matches the field by exact API name; any other spelling means it can't locate the field and the entry silently no-ops at runtime |
173
+ | `ExecutionOrder` is a phase number — entries with no dependency on each other share the same value | The post-copy tool runs all entries with the same `ExecutionOrder` in parallel; sequencing is only needed where one action depends on another |
174
+ | `IsActive: false` entries remain in the output (do not delete them) | The customer toggles them on per-environment; deleting loses traceability |
175
+ | Default `IsActive` to `true` when the SOP marks an action as required | Most SOP steps are required; explicit opt-out is the exception |
176
+
177
+ ### Canonical entry shape
178
+
179
+ See the entry shapes shown in the STOP section above, or copy directly from
180
+ `assets/config_template.json`. Do **not** rename the five top-level keys
181
+ (`ConfigurationName`, `Label`, `Fields`, `IsActive`, `ExecutionOrder`) to
182
+ `Type`, `Name`, `Operation`, `apiName`, etc., and do **not** wrap the array
183
+ in an object with a `steps` / `actions` / `records` key.
184
+
185
+ ---
186
+
187
+ ## Gotchas
188
+
189
+ | Issue | Resolution |
190
+ |-------|------------|
191
+ | SOP step says "delete all endpoints" rather than "update X to Y" | Emit an entry with `ConfigurationName: "OutboundMessages"`, `Label` describing the deletion target, and a note in `Fields` (`{"Action": "Delete"}`); the catalog documents the Delete pattern |
192
+ | Same Label appears for multiple environments (fcQA + fcUAT) | Emit one entry per environment; suffix the Label or use the environment-specific Label as it appears in the SOP |
193
+ | For OutboundMessages, the same Label can legitimately apply to multiple entries when each targets a different `Object` (e.g., one OBM for Account, one for Contact). | Do not collapse them — emit one entry per Object. The `Object` value (inferred from the OBM name like `IR_Account_OBM_PROD` → `Account`) is what distinguishes them, not the Label. |
194
+ | SOP groups many Custom Labels together in a single table | One entry per row of the table — do not collapse into a single bulk entry |
195
+ | Action targets a setting outside the catalog (CustomLabels, ConnectedApps, NamedCredentials, SSO, CustomSettings, etc.) | Skip the action, do NOT invent a new `ConfigurationName`; list every skipped action in the response so the user knows what to add to the catalog later |
196
+ | SOP includes pre-refresh steps interleaved with post-refresh | Filter out pre-refresh — only post-refresh / post-copy actions belong in the output |
197
+ | SOP names an outbound message / remote site to update but does not include the new URL | Skip the entry. List the skipped item in the response so the user can supply the URL or amend the SOP |
198
+ | SOP includes secrets in URLs (e.g., `https://USER:TOKEN@host/...`) | Embed them verbatim — the tool consumes the value as-is — but flag in the response so the user is aware the JSON now contains a secret and should be stored / shared accordingly |
199
+ | User's SOP is in a non-English language or has heavy formatting (tables, callouts) | Extract the prose first, normalize whitespace, then parse — formatting artifacts do not need to survive into the JSON |
200
+ | The SOP includes screenshots / images. Some are illustrative (architecture diagrams, flow charts, "this is what the setup screen looks like" examples); others are data-bearing (a screenshot of a real Outbound Messages list, a captured Remote Site table). | Treat illustrative images as out-of-scope — do NOT extract values from them. For data-bearing images (the surrounding text refers to "the values shown below" / "as captured in the screenshot above" / a real Endpoint URL is visible), OCR them and use the values. See `references/source_format_handling.md` for the heuristic. |
201
+ | The SOP is supplied as multiple files (e.g., a PDF + a companion xlsx + a screenshot folder), or values are split across tabs / pages | Read every supplied file end-to-end before skipping any entry. The action list and the URL table are frequently in different files — see the rule above about multi-sheet sources. |
202
+
203
+ ---
204
+
205
+ ## Output Expectations
206
+
207
+ Deliverables:
208
+ - A single JSON file (default `post-copy-config.json`) containing a
209
+ top-level array of post-copy action entries.
210
+ - A short summary in your response listing: total entries, count per
211
+ `ConfigurationName`, actions skipped because they did not map to the
212
+ catalog, and actions skipped because the SOP did not include a concrete
213
+ value.
214
+
215
+ The output file structure conforms to `assets/json_schema.json`.
216
+
217
+ ---
218
+
219
+ ## Cross-Skill Integration
220
+
221
+ | Need | Delegate to |
222
+ |------|-------------|
223
+ | Generate the actual Salesforce metadata XML for a Custom Label / Named Credential / Remote Site / etc. | The matching `generating-*` skill |
224
+ | Deploy generated metadata or run the post-copy tool against an org | `deploying-metadata` skill |
225
+ | Compare an SOP against entities defined in UDD | `udd:research-entities` |
226
+
227
+ ---
228
+
229
+ ## Reference File Index
230
+
231
+ | File | When to read |
232
+ |------|-------------|
233
+ | `assets/config_template.json` | Step 4 — starting structure for the JSON output |
234
+ | `assets/json_schema.json` | Step 5 — validate every emitted entry |
235
+ | `references/configuration_catalog.md` | Step 3 — to map an SOP action to a `ConfigurationName` and get the canonical Field keys |
236
+ | `references/sop_parsing_patterns.md` | Step 2 and step 6 — heuristics for extracting actions from prose and ordering them |
237
+ | `references/source_format_handling.md` | Step 1 — exact extraction recipe per input format (PDF / xlsx / csv / JSON / docx / image) and the data-bearing-vs-illustrative image heuristic |
238
+ | `examples/sample_sop_to_config.json` | Step 7 — verify output shape matches expected format |
239
+ | `examples/sample_sop_excerpt.md` | Step 7 — see a representative SOP excerpt that produced the sample JSON |
@@ -0,0 +1,21 @@
1
+ [
2
+ {
3
+ "ConfigurationName": "OutboundMessages",
4
+ "Label": "<OBM DeveloperName exactly as in the SOP>",
5
+ "Fields": {
6
+ "EndpointUrl": "<literal post-refresh URL from the SOP>",
7
+ "Object": "<target SObject, e.g. Account / Contact / Asset>"
8
+ },
9
+ "IsActive": true,
10
+ "ExecutionOrder": 1
11
+ },
12
+ {
13
+ "ConfigurationName": "RemoteSiteSettings",
14
+ "Label": "<Remote Site name exactly as in the SOP>",
15
+ "Fields": {
16
+ "RemoteSiteUrl": "<literal post-refresh URL from the SOP>"
17
+ },
18
+ "IsActive": true,
19
+ "ExecutionOrder": 2
20
+ }
21
+ ]
@@ -0,0 +1,90 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "Post-Copy Automation Config",
4
+ "description": "Array of declarative post-copy actions consumed by the Salesforce post-copy automation tool.",
5
+ "type": "array",
6
+ "items": {
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "required": [
10
+ "ConfigurationName",
11
+ "Label",
12
+ "Fields",
13
+ "IsActive",
14
+ "ExecutionOrder"
15
+ ],
16
+ "allOf": [
17
+ {
18
+ "if": {
19
+ "properties": { "ConfigurationName": { "const": "RemoteSiteSettings" } }
20
+ },
21
+ "then": {
22
+ "properties": {
23
+ "Fields": {
24
+ "type": "object",
25
+ "additionalProperties": false,
26
+ "required": ["RemoteSiteUrl"],
27
+ "properties": {
28
+ "RemoteSiteUrl": {
29
+ "description": "The exact API field name for a Remote Site Setting URL. Must be spelled RemoteSiteUrl — Url, RemoteSiteURL, SiteUrl, and EndpointUrl are all invalid.",
30
+ "type": "string",
31
+ "minLength": 1
32
+ }
33
+ }
34
+ }
35
+ }
36
+ }
37
+ },
38
+ {
39
+ "if": {
40
+ "properties": { "ConfigurationName": { "const": "OutboundMessages" } }
41
+ },
42
+ "then": {
43
+ "properties": {
44
+ "Fields": {
45
+ "type": "object",
46
+ "required": ["Object"],
47
+ "anyOf": [
48
+ { "type": "object", "required": ["EndpointUrl"] },
49
+ { "type": "object", "required": ["Action"] }
50
+ ]
51
+ }
52
+ }
53
+ }
54
+ }
55
+ ],
56
+ "properties": {
57
+ "ConfigurationName": {
58
+ "description": "Salesforce configuration / metadata type. Must be one of the values listed in references/configuration_catalog.md.",
59
+ "type": "string",
60
+ "enum": [
61
+ "OutboundMessages",
62
+ "RemoteSiteSettings"
63
+ ]
64
+ },
65
+ "Label": {
66
+ "description": "The metadata Label or DeveloperName of the specific record being updated, exactly as it appears in the SOP.",
67
+ "type": "string",
68
+ "minLength": 1
69
+ },
70
+ "Fields": {
71
+ "description": "Map of API field name -> concrete value taken verbatim from the SOP. Do not include fields that are duplicated by Label (RemoteSiteName) or by the top-level IsActive flag.",
72
+ "type": "object",
73
+ "minProperties": 1,
74
+ "additionalProperties": {
75
+ "type": ["string", "number", "boolean"]
76
+ },
77
+ "$comment": "Per-ConfigurationName key constraints are enforced by the allOf/if-then blocks above."
78
+ },
79
+ "IsActive": {
80
+ "description": "Whether the post-copy tool should execute this action. Default true.",
81
+ "type": "boolean"
82
+ },
83
+ "ExecutionOrder": {
84
+ "description": "Phase number. Entries with no dependency on each other share the same value and run in parallel; lower numbers run before higher.",
85
+ "type": "integer",
86
+ "minimum": 1
87
+ }
88
+ }
89
+ }
90
+ }
@@ -0,0 +1,31 @@
1
+ # Sample SOP Excerpt
2
+
3
+ This is a representative slice of a customer SOP — the type of input the
4
+ skill receives. The matching expected output is in
5
+ `sample_sop_to_config.json`.
6
+
7
+ ---
8
+
9
+ ## Post Refresh Steps – Update Outbound Messages Endpoints
10
+
11
+ Update the Outbound Messaging Endpoints after the refresh. Navigate to
12
+ Setup > Process Automation > Workflow Actions > Outbound Messages.
13
+
14
+ | Outbound Message | Post-refresh endpoint URL |
15
+ |------------------------|-------------------------------------------------|
16
+ | `IR_Account_OBM_PROD` | `https://uat.example.com/services/account` |
17
+ | `IR_Contact_OBM_PROD` | `https://uat.example.com/services/contact` |
18
+ | `IR_Asset_OBM_PROD` | `https://uat.example.com/services/asset` |
19
+
20
+ The OBM names embed the target SObject (`Account`, `Contact`, `Asset`),
21
+ which becomes the mandatory `Object` field on each generated entry.
22
+
23
+ ## Post Refresh Steps – Remote Site Settings
24
+
25
+ Update the Remote Site Settings under Setup > Security > Remote Site
26
+ Settings. Both should remain Active.
27
+
28
+ | Remote Site Name | Post-refresh URL |
29
+ |--------------------|----------------------------------------|
30
+ | `R12_Remote_Site` | `https://uat.example.com` |
31
+ | `Tavant_API` | `https://tavant.uat.example.com` |
@@ -0,0 +1,50 @@
1
+ [
2
+ {
3
+ "ConfigurationName": "OutboundMessages",
4
+ "Label": "IR_Account_OBM_PROD",
5
+ "Fields": {
6
+ "EndpointUrl": "https://uat.example.com/services/account",
7
+ "Object": "Account"
8
+ },
9
+ "IsActive": true,
10
+ "ExecutionOrder": 1
11
+ },
12
+ {
13
+ "ConfigurationName": "OutboundMessages",
14
+ "Label": "IR_Contact_OBM_PROD",
15
+ "Fields": {
16
+ "EndpointUrl": "https://uat.example.com/services/contact",
17
+ "Object": "Contact"
18
+ },
19
+ "IsActive": true,
20
+ "ExecutionOrder": 1
21
+ },
22
+ {
23
+ "ConfigurationName": "OutboundMessages",
24
+ "Label": "IR_Asset_OBM_PROD",
25
+ "Fields": {
26
+ "EndpointUrl": "https://uat.example.com/services/asset",
27
+ "Object": "Asset"
28
+ },
29
+ "IsActive": true,
30
+ "ExecutionOrder": 1
31
+ },
32
+ {
33
+ "ConfigurationName": "RemoteSiteSettings",
34
+ "Label": "R12_Remote_Site",
35
+ "Fields": {
36
+ "RemoteSiteUrl": "https://uat.example.com"
37
+ },
38
+ "IsActive": true,
39
+ "ExecutionOrder": 2
40
+ },
41
+ {
42
+ "ConfigurationName": "RemoteSiteSettings",
43
+ "Label": "Tavant_API",
44
+ "Fields": {
45
+ "RemoteSiteUrl": "https://tavant.uat.example.com"
46
+ },
47
+ "IsActive": true,
48
+ "ExecutionOrder": 2
49
+ }
50
+ ]
@@ -0,0 +1,76 @@
1
+ # Configuration Catalog
2
+
3
+ The fixed catalog of supported `ConfigurationName` values for the post-copy
4
+ automation config. **Never invent a new value** — if an SOP step does not
5
+ fit a row below, raise it to the user.
6
+
7
+ The catalog currently covers two types only:
8
+
9
+ 1. `OutboundMessages`
10
+ 2. `RemoteSiteSettings`
11
+
12
+ Anything else (Custom Labels, Connected Apps, Named Credentials, SSO, etc.)
13
+ is out of scope for this skill at present — surface them to the user and
14
+ recommend a follow-up to extend the catalog.
15
+
16
+ ## How to use this catalog
17
+
18
+ For each post-copy action extracted from the SOP:
19
+
20
+ 1. Find the row whose **SOP signal** phrases match the action.
21
+ 2. Use the `ConfigurationName` from that row.
22
+ 3. Use one of the listed **Field keys** in your entry's `Fields` object.
23
+ 4. Put the **concrete value** from the SOP (literal URL, name, etc.) as
24
+ the value. If the SOP does not state a concrete value, **skip the
25
+ entry** entirely and list it in the response.
26
+
27
+ ## Catalog
28
+
29
+ ### OutboundMessages
30
+
31
+ - **SOP signal phrases**: "outbound message", "OBM", "endpoint URL",
32
+ "Workflow Actions > Outbound Messages".
33
+ - **Field keys** (both required for non-delete entries):
34
+ - `EndpointUrl` — value is the literal post-refresh URL the SOP gives
35
+ for that outbound message.
36
+ - `Object` — the SObject the outbound message targets (e.g., `Account`,
37
+ `Contact`, `Asset`, `Lead`). This is mandatory because the same
38
+ `Label` may apply to multiple OBMs that differ only by entity, and
39
+ the post-copy tool needs the Object to disambiguate. Infer from the
40
+ OBM name (e.g., `IR_Account_OBM_PROD` → `Account`,
41
+ `IR_Contact_OBM_PROD` → `Contact`) or from explicit text in the SOP.
42
+ If the entity is genuinely ambiguous and the SOP gives no signal,
43
+ skip the entry and surface it.
44
+ - **Skip when**: the SOP only names the outbound message but does not
45
+ give a new endpoint URL, OR the target Object cannot be determined.
46
+ - **Special action**: deletion. When the SOP says "delete all endpoints",
47
+ use `Fields: { "Action": "Delete", "Object": "<entity>" }`. (`"Delete"`
48
+ is a literal instruction the tool understands, not a placeholder.)
49
+
50
+ ### RemoteSiteSettings
51
+
52
+ - **SOP signal phrases**: "remote site setting", "remote site", "trusted
53
+ URL", "Setup > Security > Remote Site Settings".
54
+ - **Field keys**:
55
+ - `RemoteSiteUrl` — value is the literal post-refresh URL. The key must
56
+ be spelled **exactly** `RemoteSiteUrl`. Do **not** use `Url`,
57
+ `RemoteSiteURL`, `SiteUrl`, or `EndpointUrl` (that last one is the OBM
58
+ key, not the remote-site key). The post-copy tool matches the field by
59
+ exact API name, so any other spelling silently no-ops at runtime.
60
+ - **Do NOT add**:
61
+ - `RemoteSiteName` — the name lives in the top-level `Label` field.
62
+ - `IsActive` — the active flag lives at the top level of the entry.
63
+ Putting either inside `Fields` duplicates information the tool already
64
+ has and creates ambiguity.
65
+ - **Skip when**: the SOP names the remote site but does not give a new
66
+ URL.
67
+
68
+ ## Adding a new ConfigurationName
69
+
70
+ If a customer SOP introduces a configuration type not in the list above,
71
+ **stop and ask the user**. Adding a new value requires:
72
+
73
+ 1. Update the `enum` in `assets/json_schema.json`.
74
+ 2. Add a new section to this file.
75
+ 3. Update `examples/sample_sop_to_config.json` if relevant.
76
+ 4. Update the description in `SKILL.md` to include the new type.