@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
@@ -0,0 +1,157 @@
1
+ # SOP Parsing Patterns
2
+
3
+ Heuristics for turning SOP prose into post-copy action records.
4
+
5
+ ## Identify the Post-Copy / Post-Refresh section
6
+
7
+ SOPs are typically structured as:
8
+
9
+ 1. Pre-Refresh Steps (or Pre-Copy)
10
+ 2. Refresh / Copy Steps (the act of cloning)
11
+ 3. **Post-Refresh Steps** (or Post-Copy) — this is the section that
12
+ produces actions. Everything else is filtered out.
13
+
14
+ Section markers to look for (case-insensitive):
15
+
16
+ - `Post Refresh Steps` / `Post-Refresh Steps`
17
+ - `Post Copy Steps` / `Post-Copy Steps`
18
+ - `After Refresh`
19
+ - `After Copy`
20
+
21
+ If the SOP has no such section, ask the user which sections are post-copy.
22
+
23
+ ## Action signal patterns
24
+
25
+ Each post-copy action in the JSON output corresponds to one SOP instruction
26
+ that **also includes a concrete value** (URL, etc.). If the value is
27
+ missing, skip the action.
28
+
29
+ ### Pattern 1 — "Update X to Y" (Outbound Messages)
30
+
31
+ > "Update the OBM Messages endpoint for `IR_Account_OBM_PROD` to
32
+ > `https://uat.example.com/account`."
33
+
34
+ - One entry per outbound message named in the SOP.
35
+ - `ConfigurationName: "OutboundMessages"`,
36
+ `Fields: { "EndpointUrl": "<literal URL from SOP>", "Object": "<entity>" }`.
37
+ - `Label` = the outbound message Name as it appears in the SOP.
38
+ - `Object` is **mandatory** — infer from the OBM name
39
+ (`IR_Account_OBM_PROD` → `Account`, `IR_Contact_OBM_PROD` → `Contact`,
40
+ `IR_Asset_OBM_PROD` → `Asset`) or from explicit text in the SOP.
41
+ The same Label may apply to two OBMs that differ only by entity, so
42
+ the post-copy tool relies on `Object` to disambiguate.
43
+
44
+ If the SOP names the outbound message but does not state the new
45
+ endpoint URL ("Update the OBM endpoints" with no table or list of
46
+ URLs), **skip** and list the omission in the response. If the target
47
+ Object cannot be inferred from the OBM name or surrounding text,
48
+ also skip and surface it.
49
+
50
+ ### Pattern 2 — Tabular updates with explicit URL columns
51
+
52
+ > A table with columns: `Remote Site Name`, `Prod URL`, `UAT URL`,
53
+ > `Difference found`.
54
+
55
+ - One entry per row whose `Difference found` (or equivalent) flag
56
+ indicates the URL changed.
57
+ - `ConfigurationName: "RemoteSiteSettings"`,
58
+ `Fields: { "RemoteSiteUrl": "<UAT URL from row>" }`.
59
+ - `Label` = the Remote Site Name from the row.
60
+ - Skip rows where Prod and UAT URLs are identical (no update needed).
61
+ - Do **not** add `RemoteSiteName` to `Fields` (lives in `Label`).
62
+ - Do **not** add `IsActive` to `Fields` (lives at the top level).
63
+
64
+ ### Pattern 3 — "Delete all X"
65
+
66
+ > "Delete all integration endpoints in the OBM Messages setup."
67
+
68
+ - A single entry with `Fields: { "Action": "Delete" }` and a Label
69
+ describing the deletion target ("All OBM Endpoints" or similar).
70
+ `"Delete"` here is a literal instruction the tool understands.
71
+
72
+ ### Pattern 4 — Sequential / phased instructions
73
+
74
+ > "First, update the OBM endpoints. Then, update the Remote Site Settings."
75
+
76
+ - Use the order in `ExecutionOrder`. See "Ordering heuristic" below.
77
+
78
+ ### Pattern 5 — Conditional / environment-specific
79
+
80
+ > "If you are refreshing fcUAT, do X. For all other sandboxes, do Y."
81
+
82
+ - Emit both entries. Mark the conditional one with `IsActive: false` so
83
+ the customer can toggle it per-environment, and surface the
84
+ conditionality in your response message.
85
+
86
+ ## Ordering heuristic — `ExecutionOrder` is a phase number
87
+
88
+ Treat `ExecutionOrder` like a phase / wave number, not a per-row index.
89
+ **Entries that have no dependency on each other share the same number.**
90
+ The post-copy tool runs all entries with the same number in parallel.
91
+
92
+ Default phasing (use unless the SOP explicitly says otherwise):
93
+
94
+ | Phase | Type | Why |
95
+ |-------|------|-----|
96
+ | 1 | OutboundMessages | Endpoint URLs the rest of the system depends on; no inter-OBM dependency |
97
+ | 2 | RemoteSiteSettings | Trusted URLs subsequent integrations need; no inter-site dependency |
98
+
99
+ Within a single `ConfigurationName`, every entry shares the same phase
100
+ number — there is no inter-row dependency among OBMs or among remote
101
+ sites. Across types, run OBMs before remote sites unless the SOP says
102
+ otherwise.
103
+
104
+ If the SOP states explicit dependencies ("Step 5 must finish before
105
+ Step 6"), break the dependent entry into a later phase.
106
+
107
+ ## Locating values across multi-sheet sources
108
+
109
+ Customer SOPs often split the **action list** from the **endpoint
110
+ table**:
111
+
112
+ - The "Post Refresh / Post Copy" section names which OBMs / Remote
113
+ Sites need updating, but only by name.
114
+ - A separate sheet (or appendix) holds a Prod URL → UAT URL table.
115
+
116
+ Before skipping an entry for "missing value", search **every tab /
117
+ sheet of every file the user supplied** for a row keyed by the same
118
+ OBM / RemoteSite / Configuration name. Look for column headers like
119
+ `Prod Endpoint URL`, `UAT Endpoint URL`, `Post-refresh URL`, or
120
+ `Endpoint`. The post-refresh value is the one to emit.
121
+
122
+ If after searching every supplied source the value is still not
123
+ present, **skip the entry** and list it in the response. Never emit
124
+ empty strings, `null`, or placeholder markers (`<from-backup>`, `TBD`,
125
+ `TODO`) — customers consume the JSON directly and unpopulated fields
126
+ break the tool.
127
+
128
+ ## Filter rules
129
+
130
+ Skip these — they are not post-copy automation actions:
131
+
132
+ - Manual ServiceNow ticket creation (process / ops, not metadata).
133
+ - "Email the SSO team" / human notifications.
134
+ - "Schedule a meeting" / calendar actions.
135
+ - "Click Save" / UI navigation breadcrumbs.
136
+ - Pre-refresh data collection ("copy the endpoints to a spreadsheet").
137
+ - Verification / test steps with no metadata write.
138
+ - Any action that targets a configuration type **not** in
139
+ `configuration_catalog.md` (Custom Labels, Connected Apps, Named
140
+ Credentials, SSO, etc.) — list these in your response message so the
141
+ user knows what was filtered and can prioritize extending the catalog.
142
+ - Any action where the SOP names the metadata but does not give a
143
+ concrete value (URL, etc.). List these too in the response.
144
+
145
+ If a section is mostly process and not configuration, note in your
146
+ response message that the section was skipped and why.
147
+
148
+ ## Disambiguating Label vs. DeveloperName
149
+
150
+ When the SOP shows an Outbound Message or Remote Site name like
151
+ `R12_Remote_Site`, use that as the `Label` field — this is the
152
+ DeveloperName, which is what the post-copy tool resolves at runtime.
153
+
154
+ When the SOP shows a UI Label like "TK Marine Parts Store Online", that's
155
+ ambiguous. Ask the user or pick the most likely API name based on the
156
+ surrounding context (the SOP usually shows the API name in setup
157
+ breadcrumbs).
@@ -0,0 +1,230 @@
1
+ # Source Format Handling
2
+
3
+ The customer SOP can arrive in any of the formats below — sometimes
4
+ several at once. This file gives the exact extraction recipe per
5
+ format so action records and endpoint values can be located reliably,
6
+ and explains how to decide whether an embedded image carries data or
7
+ is illustrative.
8
+
9
+ > **Rule of thumb**: the action list (which OBM / Remote Site to
10
+ > update) and the endpoint table (the actual URL values) are
11
+ > frequently in **different files or different tabs / pages**. Always
12
+ > read every source the user supplies before deciding a value is
13
+ > missing. If a value still cannot be located after exhausting every
14
+ > source, skip the entry — never emit empty / placeholder fields.
15
+
16
+ ---
17
+
18
+ ## PDF (`.pdf`)
19
+
20
+ ```python
21
+ import pypdf
22
+ reader = pypdf.PdfReader(path)
23
+ for i, page in enumerate(reader.pages):
24
+ text = page.extract_text()
25
+ ```
26
+
27
+ - Many enterprise SOPs are slide decks exported to PDF — the text
28
+ layer is usually present, but tables may flatten oddly. Inspect the
29
+ raw extracted text rather than trusting visual alignment.
30
+ - For section navigation, search case-insensitively for: "Post
31
+ Refresh", "Post-Refresh", "Post Copy", "Post-Copy", "After
32
+ Refresh", "Update <X>".
33
+ - If `extract_text()` returns empty or near-empty for a page, the
34
+ page is likely an embedded image. OCR it:
35
+
36
+ ```python
37
+ import pdfplumber, pytesseract
38
+ with pdfplumber.open(path) as pdf:
39
+ for page in pdf.pages:
40
+ if not (page.extract_text() or "").strip():
41
+ img = page.to_image(resolution=200).original
42
+ text = pytesseract.image_to_string(img)
43
+ ```
44
+
45
+ - If `pytesseract` is unavailable, fall back to `pdftotext -layout`
46
+ (Poppler) and `tesseract` CLI.
47
+
48
+ ## xlsx (`.xlsx`)
49
+
50
+ ```python
51
+ import openpyxl
52
+ wb = openpyxl.load_workbook(path, data_only=True)
53
+ for sname in wb.sheetnames:
54
+ ws = wb[sname]
55
+ for row in ws.iter_rows(values_only=False):
56
+ for cell in row:
57
+ ...
58
+ ```
59
+
60
+ - **Always read every sheet.** Customer planners routinely split the
61
+ task list and the URL table across tabs (real example: Michelin UAT
62
+ Refresh Planner — task list in `Integration (Indus)`, URL table in
63
+ `Evolution SFA` columns K/L/M).
64
+ - Iterate **every column** up to `ws.max_column`. Some sheets have
65
+ data far past column M (e.g., column index 10000+) that the visible
66
+ layout hides.
67
+ - Read with `data_only=True` so cached formula values are returned.
68
+ - Check `cell.comment` for free-text annotations that often contain
69
+ the post-refresh value.
70
+ - Look for canonical column headers: `Outbound Message`, `Remote
71
+ Site`, `Object`, `Endpoint`, `Endpoint URL`, `Prod Endpoint URL`,
72
+ `UAT Endpoint URL`, `Post-refresh URL`. The post-refresh value is
73
+ the one to emit.
74
+ - For embedded images on a sheet, use `ws._images` (or unzip the
75
+ xlsx and inspect `xl/media/`) — see the image rules below.
76
+
77
+ ## csv (`.csv`)
78
+
79
+ ```python
80
+ import csv
81
+ with open(path, newline="") as f:
82
+ reader = csv.DictReader(f)
83
+ for row in reader:
84
+ ...
85
+ ```
86
+
87
+ - Treat the same way as a single xlsx sheet — look for the canonical
88
+ column headers above.
89
+
90
+ ## JSON (`.json`)
91
+
92
+ - If the customer already supplies a JSON document, scan every key
93
+ for the canonical names (`outboundMessage`, `endpointUrl`, `object`,
94
+ `remoteSiteUrl`, `label`, `name`). Be tolerant of casing
95
+ (`endpointURL`, `EndpointUrl`, `endpoint_url`).
96
+ - Customer JSON might already be partially in the target shape; do
97
+ not blindly copy it through — re-validate every entry against
98
+ `assets/json_schema.json` and the catalog.
99
+
100
+ ## docx (`.docx`)
101
+
102
+ ```python
103
+ from docx import Document
104
+ doc = Document(path)
105
+ for p in doc.paragraphs:
106
+ ...
107
+ for tbl in doc.tables:
108
+ for row in tbl.rows:
109
+ for cell in row.cells:
110
+ ...
111
+ ```
112
+
113
+ - Extract both paragraph text and table cells. Word tables
114
+ frequently hold the endpoint table.
115
+ - Inline images (`doc.inline_shapes`) follow the image rules below.
116
+
117
+ ## Markdown / plain text (`.md`, `.txt`)
118
+
119
+ - Read directly with the `Read` tool. Tables in pipe-delimited
120
+ Markdown are easy to parse — split on `|`.
121
+
122
+ ## Pasted excerpts in the conversation
123
+
124
+ - The user may paste content directly. Treat it as plain text.
125
+ - If they paste an image (drag-drop), use the `Read` tool on the
126
+ image path and follow the image rules below.
127
+
128
+ ---
129
+
130
+ ## Images (`.png`, `.jpg`, `.jpeg`, `.tiff`, `.bmp`)
131
+
132
+ Two kinds of image arrive in customer SOPs:
133
+
134
+ | Kind | Examples | What to do |
135
+ |------|----------|------------|
136
+ | **Data-bearing** | screenshot of the Outbound Messages list page showing real Names + Endpoint URLs; captured Remote Site Settings table with real URLs; spreadsheet snippet pasted as a screenshot; configuration page where the endpoint values are visible | OCR and treat the values as authoritative for the entries they cover |
137
+ | **Illustrative** | "this is what the setup screen looks like" with placeholder values; architecture diagram showing system topology; UI flow chart; redacted/blurred values; screenshot whose surrounding text says "for example" / "as shown below your values will look like this" | Do NOT extract values — the image is documentation, not data |
138
+
139
+ ### Heuristic — is this image data-bearing?
140
+
141
+ Yes (use the values), if any of:
142
+
143
+ - The surrounding paragraph references it as the source of truth:
144
+ "the values listed below", "as captured in the spreadsheet
145
+ above", "copy these into the post-refresh setup", "the URLs you
146
+ copied before the refresh".
147
+ - The image shows a Salesforce setup table (Outbound Messages list,
148
+ Remote Site Settings list, Custom Metadata Type list) with real
149
+ values for known catalog types.
150
+ - Real endpoint URLs are visible (full domain, not redacted, not
151
+ obviously a placeholder like `https://example.com/...`).
152
+ - The image directly precedes or follows a "Post Refresh Steps"
153
+ heading and lists the entities named in that step.
154
+
155
+ No (skip the image), if any of:
156
+
157
+ - Surrounding text says "for example", "as a sample", "this is what
158
+ it will look like", "your real values will differ".
159
+ - The values shown are placeholders (`PROD_URL`, `<your domain>`,
160
+ `username/password`, all-`x` or all-`*` redaction).
161
+ - The image is a flowchart / arch diagram / sequence diagram.
162
+ - The image is a UI walkthrough screenshot whose purpose is to show
163
+ *where* to click, not *what* to enter.
164
+ - The image is a stock screenshot of the Salesforce Help / Setup
165
+ interface unrelated to the customer's actual values.
166
+
167
+ ### OCR recipe
168
+
169
+ ```python
170
+ from PIL import Image
171
+ import pytesseract
172
+ img = Image.open(image_path)
173
+ text = pytesseract.image_to_string(img)
174
+ ```
175
+
176
+ For higher accuracy on tables:
177
+
178
+ ```python
179
+ text = pytesseract.image_to_string(img, config="--psm 6")
180
+ ```
181
+
182
+ `--psm 6` treats the image as a single uniform block of text (good
183
+ for tables). Try `--psm 4` for column-of-text layouts.
184
+
185
+ If `pytesseract` is unavailable, **read the image with the `Read`
186
+ tool and transcribe the visible values into a temporary text
187
+ buffer** — the multimodal `Read` reliably picks up table contents
188
+ in screenshots.
189
+
190
+ ### After OCR
191
+
192
+ - Normalise whitespace, strip trailing zero-width chars.
193
+ - Fix common OCR confusions in URLs: `0`/`O`, `1`/`l`/`I`, `:`/`;`,
194
+ `/`/`\`, `_`/`—`. Cross-check with surrounding text where possible.
195
+ - If two URL columns are present (Prod / UAT), use the
196
+ **post-refresh** column.
197
+ - Treat OCR'd values like any other extracted value — if the text
198
+ is unreadable or ambiguous, skip the entry and surface it. Do
199
+ NOT guess to fill a field.
200
+
201
+ ---
202
+
203
+ ## Multi-source merge
204
+
205
+ When the user supplies multiple files:
206
+
207
+ 1. Read every file end-to-end first; build an internal map of
208
+ "named entity → values found".
209
+ 2. Identify the action list source (which OBMs / Remote Sites need
210
+ updating) — usually the file with "Post Refresh Steps".
211
+ 3. For each named action, look up the value in the map. If found in
212
+ any source, use it. If not found anywhere, skip and surface.
213
+ 4. Emit one entry per (configuration, label) pair — do not duplicate
214
+ when the same OBM appears in multiple sources.
215
+
216
+ ---
217
+
218
+ ## Failure modes to surface in the response
219
+
220
+ When you skip an entry, list it explicitly so the customer can
221
+ correct the source. Use one of these labels in the response:
222
+
223
+ - **Missing value** — the entity is named but no concrete value was
224
+ found in any supplied source.
225
+ - **Out of catalog** — the action targets a configuration type not
226
+ yet supported (Custom Labels, Connected Apps, etc.).
227
+ - **Unreadable image** — an image was data-bearing but OCR returned
228
+ unintelligible output.
229
+ - **Ambiguous Object (OutboundMessages only)** — the OBM name does
230
+ not reveal the target SObject and no supplemental table provides it.
@@ -3,7 +3,15 @@ name: commerce-b2b-open-code-components-integrate
3
3
  description: "Integrate Salesforce B2B Commerce open source components from GitHub into B2B Commerce stores. Use when users mention \"integrate open code components\", \"open source B2B commerce\", \"add open code components\", \"forcedotcom/b2b-commerce-open-source-components\", or want to add open source commerce components to their store. Copies all components and labels so they become available in Experience Builder."
4
4
  allowed-tools: Bash(git clone:*) Bash(cp:*) Read
5
5
  metadata:
6
+ cliTools:
7
+ - tool: ["git"]
8
+ semver: ">=2.0.0"
9
+ - tool: ["sf"]
10
+ semver: ">=2.0.0"
11
+ relatedSkills:
12
+ - "commerce-b2b-store-create"
6
13
  version: "1.0"
14
+ minApiVersion: "56.0"
7
15
  ---
8
16
 
9
17
  ## When to Use This Skill
@@ -3,6 +3,8 @@ name: commerce-b2b-open-code-components-replace
3
3
  description: "Replace OOTB (out-of-the-box) B2B Commerce components with open source equivalents in site metadata content.json files, or look up the equivalent open code `site:` component for OOTB definitions. Use when users mention \"replace OOTB components\", \"replace commerce components with open code\", \"swap OOTB for open source\", \"replace commerce_builder:\", \"replace OOTB in site\", \"replace component in site metadata\", \"replace component definition\", \"find open code equivalent\", \"equivalent open code component\", \"OOTB to open code mapping\", \"what is the site component for\", components \"in this view\" or \"for a given view\", or a specific list of component names — and want to update or only discover mappings in their store metadata."
4
4
  allowed-tools: Bash(grep:*) Bash(ls:*) Read Write
5
5
  metadata:
6
+ relatedSkills:
7
+ - "commerce-b2b-open-code-components-integrate"
6
8
  version: "1.0"
7
9
  ---
8
10
 
@@ -4,7 +4,10 @@ description: "Interactive workflow to create Commerce B2B Stores and retrieve st
4
4
  compatibility: "Requires Commerce licenses, Experience Cloud, Salesforce CLI"
5
5
  metadata:
6
6
  version: "1.0"
7
- category: "commerce"
7
+ minApiVersion: "56.0"
8
+ cliTools:
9
+ - tool: ["sf"]
10
+ semver: ">=2.0.0"
8
11
  ---
9
12
 
10
13
  # Commerce B2B Storefront Creation
@@ -3,6 +3,18 @@ name: data360-activate
3
3
  description: "Salesforce Data Cloud Act phase. Use this skill when the user manages activations, activation targets, data actions, or downstream delivery of Data Cloud audiences and data. TRIGGER when: user manages activations, activation targets, data actions, or downstream delivery of Data Cloud audiences and data. DO NOT TRIGGER when: the task is segment creation (use data360-segment), data retrieval/search work (use data360-query), or STDM/session tracing (use agentforce-observe)."
4
4
  compatibility: "Requires an external community sf data360 CLI plugin and a Data Cloud-enabled org"
5
5
  metadata:
6
+ cliTools:
7
+ - tool: ["node"]
8
+ semver: ">=18.0.0"
9
+ - tool: ["sf"]
10
+ semver: ">=2.0.0"
11
+ relatedSkills:
12
+ - "agentforce-observe"
13
+ - "data360-connect"
14
+ - "data360-orchestrate"
15
+ - "data360-prepare"
16
+ - "data360-query"
17
+ - "data360-segment"
6
18
  version: "1.0"
7
19
  ---
8
20
 
@@ -6,15 +6,15 @@ metadata:
6
6
  relatedSkills:
7
7
  - "data360-schema-get"
8
8
  cliTools:
9
- - tool: ["sf"]
10
- semver: ">=2.0.0"
9
+ - tool: ["docker"]
10
+ semver: ">=20.0.0"
11
11
  - tool: ["pip"]
12
- semver: ">=21.0.0"
12
+ semver: ">=23.0.0"
13
+ - tool: ["python"]
14
+ semver: ">=3.11.0"
13
15
  - tool: ["python3"]
14
16
  semver: ">=3.11.0"
15
- - tool: ["docker"]
16
- semver: ">=20.0.0"
17
- - tool: ["git"]
17
+ - tool: ["sf"]
18
18
  semver: ">=2.0.0"
19
19
  ---
20
20
 
@@ -3,6 +3,17 @@ name: data360-connect
3
3
  description: "Salesforce Data Cloud Connect phase. Use this skill when the user manages Data Cloud connections, connectors, or sets up a new source system. TRIGGER when: user manages Data Cloud connections, connectors, connector metadata, tests a connection, browses source objects or databases, or sets up a new source system. DO NOT TRIGGER when: the task is about data streams or DLOs (use data360-prepare), DMOs or identity resolution (use data360-harmonize), retrieval/search (use data360-query), or STDM telemetry (use agentforce-observe)."
4
4
  compatibility: "Requires the sf data360 CLI plugin and a Data Cloud-enabled org"
5
5
  metadata:
6
+ cliTools:
7
+ - tool: ["node"]
8
+ semver: ">=18.0.0"
9
+ - tool: ["sf"]
10
+ semver: ">=2.0.0"
11
+ relatedSkills:
12
+ - "agentforce-observe"
13
+ - "data360-harmonize"
14
+ - "data360-orchestrate"
15
+ - "data360-prepare"
16
+ - "data360-query"
6
17
  version: "1.0"
7
18
  ---
8
19
 
@@ -3,6 +3,17 @@ name: data360-harmonize
3
3
  description: "Salesforce Data Cloud Harmonize phase. Use this skill when the user works with DMOs, mappings, relationships, identity resolution, unified profiles, data graphs, or universal IDs. TRIGGER when: user works with DMOs, mappings, relationships, identity resolution, unified profiles, data graphs, or universal IDs. DO NOT TRIGGER when: the task is only about streams/DLOs (use data360-prepare), segments/insights (use data360-segment), retrieval/search (use data360-query), or STDM/session tracing (use agentforce-observe)."
4
4
  compatibility: "Requires an external community sf data360 CLI plugin and a Data Cloud-enabled org"
5
5
  metadata:
6
+ cliTools:
7
+ - tool: ["node"]
8
+ semver: ">=18.0.0"
9
+ - tool: ["sf"]
10
+ semver: ">=2.0.0"
11
+ relatedSkills:
12
+ - "agentforce-observe"
13
+ - "data360-orchestrate"
14
+ - "data360-prepare"
15
+ - "data360-query"
16
+ - "data360-segment"
6
17
  version: "1.0"
7
18
  ---
8
19
 
@@ -3,6 +3,36 @@ name: data360-orchestrate
3
3
  description: "Salesforce Data Cloud product orchestrator for connect→prepare→harmonize→segment→act workflows. Use this skill when the user needs a multi-step Data Cloud pipeline, cross-phase troubleshooting, or data space and data kit management. TRIGGER when: user needs a multi-step Data Cloud pipeline, asks to set up or troubleshoot Data Cloud across phases, manages data spaces or data kits, or wants a cross-phase sf data360 workflow. DO NOT TRIGGER when: work is isolated to a single phase (use the matching phase-specific skill), the task is STDM/session tracing/parquet telemetry (use agentforce-observe), standard CRM SOQL (use platform-soql-query), or Apex implementation (use platform-apex-generate)."
4
4
  compatibility: "Requires an external community sf data360 CLI plugin and a Data Cloud-enabled org"
5
5
  metadata:
6
+ cliTools:
7
+ - tool: ["curl"]
8
+ semver: ">=7.0.0"
9
+ - tool: ["git"]
10
+ semver: ">=2.0.0"
11
+ - tool: ["node"]
12
+ semver: ">=18.0.0"
13
+ - tool: ["npx"]
14
+ semver: ">=9.0.0"
15
+ - tool: ["python3"]
16
+ semver: ">=3.10.0"
17
+ - tool: ["sf"]
18
+ semver: ">=2.0.0"
19
+ - tool: ["yarn"]
20
+ semver: ">=1.22.0"
21
+ relatedSkills:
22
+ - "agentforce-observe"
23
+ - "automation-flow-generate"
24
+ - "data360-activate"
25
+ - "data360-connect"
26
+ - "data360-harmonize"
27
+ - "data360-prepare"
28
+ - "data360-query"
29
+ - "data360-segment"
30
+ - "platform-apex-generate"
31
+ - "platform-custom-field-generate"
32
+ - "platform-custom-object-generate"
33
+ - "platform-data-manage"
34
+ - "platform-metadata-deploy"
35
+ - "platform-soql-query"
6
36
  version: "1.0"
7
37
  ---
8
38
 
@@ -3,6 +3,20 @@ name: data360-prepare
3
3
  description: "Salesforce Data Cloud Prepare phase. Use this skill when the user creates or manages Data Cloud data streams, DLOs, transforms, or Document AI configurations. TRIGGER when: user creates or manages Data Cloud data streams, DLOs, transforms, or Document AI configurations, or asks about ingestion into Data Cloud. DO NOT TRIGGER when: the task is connection setup only (use data360-connect), DMOs and identity resolution (use data360-harmonize), or query/search work (use data360-query)."
4
4
  compatibility: "Requires an external community sf data360 CLI plugin and a Data Cloud-enabled org"
5
5
  metadata:
6
+ cliTools:
7
+ - tool: ["node"]
8
+ semver: ">=18.0.0"
9
+ - tool: ["pip"]
10
+ semver: ">=21.0"
11
+ - tool: ["python3"]
12
+ semver: ">=3.10.0"
13
+ - tool: ["sf"]
14
+ semver: ">=2.0.0"
15
+ relatedSkills:
16
+ - "data360-connect"
17
+ - "data360-harmonize"
18
+ - "data360-orchestrate"
19
+ - "data360-query"
6
20
  version: "1.0"
7
21
  ---
8
22
 
@@ -3,6 +3,16 @@ name: data360-query
3
3
  description: "Salesforce Data Cloud Retrieve phase. Use this skill when the user runs Data Cloud SQL, async queries, vector search, search-index workflows, or metadata introspection for Data Cloud objects. TRIGGER when: user runs Data Cloud SQL, describe, async queries, vector search, search-index workflows, or metadata introspection for Data Cloud objects. DO NOT TRIGGER when: the task is standard CRM SOQL (use platform-soql-query), segment creation or calculated insight design (use data360-segment), or STDM/session tracing/parquet analysis (use agentforce-observe)."
4
4
  compatibility: "Requires an external community sf data360 CLI plugin and a Data Cloud-enabled org"
5
5
  metadata:
6
+ cliTools:
7
+ - tool: ["node"]
8
+ semver: ">=18.0.0"
9
+ - tool: ["sf"]
10
+ semver: ">=2.0.0"
11
+ relatedSkills:
12
+ - "agentforce-observe"
13
+ - "data360-orchestrate"
14
+ - "data360-segment"
15
+ - "platform-soql-query"
6
16
  version: "1.0"
7
17
  ---
8
18
 
@@ -2,6 +2,13 @@
2
2
  name: data360-schema-get
3
3
  description: "Retrieve Data Lake Object (DLO) and Data Model Object (DMO) schema information from Salesforce Data Cloud using REST APIs. Use this skill when you need to inspect DLO or DMO field definitions, data types, or metadata. Takes org alias and optional DLO/DMO name as parameters."
4
4
  metadata:
5
+ cliTools:
6
+ - tool: ["pip"]
7
+ semver: ">=23.0.0"
8
+ - tool: ["python3"]
9
+ semver: ">=3.10.0"
10
+ - tool: ["sf"]
11
+ semver: ">=2.0.0"
5
12
  version: "1.0"
6
13
  ---
7
14
 
@@ -3,6 +3,17 @@ name: data360-segment
3
3
  description: "Salesforce Data Cloud Segment phase. Use this skill when the user creates or publishes segments, manages calculated insights, or troubleshoots audience SQL in Data Cloud. TRIGGER when: user creates or publishes segments, manages calculated insights, inspects segment counts or membership, or troubleshoots audience SQL in Data Cloud. DO NOT TRIGGER when: the task is DMO/mapping/identity-resolution work (use data360-harmonize), activation work (use data360-activate), query/search-index work (use data360-query), or Standard Data Model (STDM)/session tracing (use agentforce-observe)."
4
4
  compatibility: "Requires an external community sf data360 CLI plugin and a Data Cloud-enabled org"
5
5
  metadata:
6
+ cliTools:
7
+ - tool: ["node"]
8
+ semver: ">=18.0.0"
9
+ - tool: ["sf"]
10
+ semver: ">=2.0.0"
11
+ relatedSkills:
12
+ - "agentforce-observe"
13
+ - "data360-activate"
14
+ - "data360-harmonize"
15
+ - "data360-orchestrate"
16
+ - "data360-query"
6
17
  version: "1.0"
7
18
  ---
8
19
 
@@ -2,6 +2,14 @@
2
2
  name: design-systems-slds-validate
3
3
  description: "Audit Lightning Web Components for SLDS compliance and produce a scored quality report. Runs the SLDS linter, analyzes CSS for theming hook usage and pairing, checks HTML for accessibility attributes, and scores findings across categories into an overall grade. Use when asked to \"score my component\", \"SLDS scorecard\", \"quality report\", \"audit SLDS compliance\", \"how good is my SLDS\", \"check component quality\", \"rate my component\", \"evaluate my component\", \"is this component ready to ship?\", \"look at my LWC for issues\", \"audit this before I submit\", \"review my component before code review\", or any time a user wants a quality assessment or production-readiness check on an LWC or SLDS component. Not for fixing violations (use design-systems-slds2-migrate) or building new components (use design-systems-slds-apply)."
4
4
  metadata:
5
+ cliTools:
6
+ - tool: ["node"]
7
+ semver: ">=18.0.0"
8
+ - tool: ["npx"]
9
+ semver: ">=7.0.0"
10
+ relatedSkills:
11
+ - "design-systems-slds-apply"
12
+ - "design-systems-slds2-migrate"
5
13
  version: "1.0"
6
14
  ---
7
15
 
@@ -2,6 +2,9 @@
2
2
  name: design-systems-slds2-migrate
3
3
  description: "Migrate Lightning Web Components from SLDS 1 to SLDS 2 by running the SLDS linter and fixing violations. Use this skill whenever users mention SLDS 2, SLDS uplift, linter violations, LWC token migration, class overrides, hardcoded CSS values that need SLDS hook replacement, or styling hook selection. Covers all styling hook categories — color, spacing, sizing, typography, borders, radius, and shadows. Also use when users mention no-hardcoded-values, no-slds-class-overrides, lwc-to-slds-hooks, no-deprecated-tokens-slds1, or ask about SLDS component migration — even if they don't explicitly say \"uplift\" or \"migration\"."
4
4
  metadata:
5
+ cliTools:
6
+ - tool: ["npx"]
7
+ semver: ">=7.0.0"
5
8
  version: "1.0"
6
9
  ---
7
10