@salesforce/afv-skills 1.54.0 → 1.56.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 (244) hide show
  1. package/package.json +1 -1
  2. package/skills/agentforce-generate/SKILL.md +8 -0
  3. package/skills/agentforce-generate/references/actions-reference.md +2 -2
  4. package/skills/agentforce-generate/references/voice-modality-reference.md +51 -15
  5. package/skills/agentforce-generate/references/voice-telephony-cli.md +193 -0
  6. package/skills/agentforce-observe/SKILL.md +13 -9
  7. package/skills/agentforce-observe/references/ahm-alerts.md +193 -14
  8. package/skills/automation-sandbox-post-copy-config-generate/SKILL.md +24 -15
  9. package/skills/automation-sandbox-post-copy-config-generate/assets/config_template.json +11 -0
  10. package/skills/automation-sandbox-post-copy-config-generate/assets/json_schema.json +33 -1
  11. package/skills/automation-sandbox-post-copy-config-generate/references/configuration_catalog.md +32 -1
  12. package/skills/automation-sandbox-post-copy-configure/SKILL.md +75 -71
  13. package/skills/automation-sandbox-post-copy-configure/assets/scheduled_apex_template.apex +13 -0
  14. package/skills/automation-sandbox-post-copy-configure/examples/sample_scheduled_apex_config.json +13 -0
  15. package/skills/automation-sandbox-post-copy-configure/references/scheduled_apex_path.md +155 -0
  16. package/skills/automation-sandbox-post-copy-configure/scripts/build-scheduled-apex.mjs +62 -0
  17. package/skills/automation-sandbox-post-copy-configure/scripts/soql-escape-job-name.mjs +28 -0
  18. package/skills/consumer-goods-accruals-datakit-deploy/SKILL.md +383 -0
  19. package/skills/consumer-goods-accruals-datakit-deploy/scripts/setup.js +324 -0
  20. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/00-check-prerequisites.js +63 -0
  21. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/01-download-static-resource.js +100 -0
  22. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/02-replace-org-id.js +46 -0
  23. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/03-deploy-metadata.js +46 -0
  24. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/04-deploy-engine.js +198 -0
  25. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/05-deploy-tpm-accruals.js +231 -0
  26. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/06-create-dataspace.js +82 -0
  27. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/07-deploy-accruals-reports.js +517 -0
  28. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/08-deploy-ui.js +416 -0
  29. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/09-completion.js +44 -0
  30. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/utils.js +514 -0
  31. package/skills/consumer-goods-sync-management-configure/SKILL.md +137 -0
  32. package/skills/consumer-goods-sync-management-configure/examples/scenarios.md +294 -0
  33. package/skills/consumer-goods-sync-management-configure/references/act1-setup-sync.md +333 -0
  34. package/skills/consumer-goods-sync-management-configure/references/act2-assign-users.md +324 -0
  35. package/skills/consumer-goods-sync-management-configure/references/act3-plan-verify.md +113 -0
  36. package/skills/consumer-goods-sync-management-configure/references/readiness-and-enablement.md +164 -0
  37. package/skills/consumer-goods-sync-management-configure/references/sync-management-app-install-backbone.md +159 -0
  38. package/skills/consumer-goods-sync-management-configure/references/transports-and-namespace.md +220 -0
  39. package/skills/consumer-goods-sync-management-configure/references/verify-and-smoke.md +175 -0
  40. package/skills/dx-org-analyze/README.md +310 -0
  41. package/skills/dx-org-analyze/SKILL.md +260 -0
  42. package/skills/dx-org-analyze/references/collection-details.md +88 -0
  43. package/skills/dx-org-analyze/references/report-format.md +67 -0
  44. package/skills/dx-org-analyze/scripts/collect_org_data.py +823 -0
  45. package/skills/dx-org-analyze/scripts/compute_diff.py +1101 -0
  46. package/skills/dx-org-analyze/scripts/introspect_org.py +400 -0
  47. package/skills/dx-org-analyze/tests/README.md +46 -0
  48. package/skills/dx-org-analyze/tests/fixtures/org_a.json +76 -0
  49. package/skills/dx-org-analyze/tests/fixtures/org_b.json +70 -0
  50. package/skills/dx-org-analyze/tests/test_compute_diff.sh +284 -0
  51. package/skills/dx-org-analyze/tests/test_consistency.sh +428 -0
  52. package/skills/dx-org-manage/SKILL.md +6 -50
  53. package/skills/dx-org-manage/examples/README.md +10 -16
  54. package/skills/dx-org-manage/references/scratch-org-create.md +1 -1
  55. package/skills/dx-org-manage/references/scratch-org-operations.md +1 -1
  56. package/skills/dx-org-shape-manage/SKILL.md +4 -3
  57. package/skills/education-cloud-domain-configure/references/gotchas-extended.md +1 -0
  58. package/skills/experience-accessibility-validate/SKILL.md +8 -5
  59. package/skills/experience-accessibility-validate/references/reviewers/sc-1-1-1-non-text-content.md +1 -4
  60. package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-i-lists.md +0 -4
  61. package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-ii-tables.md +20 -85
  62. package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-iii-form-labels.md +4 -4
  63. package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-iv-regions.md +0 -4
  64. package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-v-groups.md +2 -4
  65. package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-5-identify-input.md +0 -4
  66. package/skills/experience-accessibility-validate/references/reviewers/sc-1-4-3-contrast.md +4 -14
  67. package/skills/experience-accessibility-validate/references/reviewers/sc-2-1-1-keyboard.md +9 -5
  68. package/skills/experience-accessibility-validate/references/reviewers/sc-2-4-4-link-purpose.md +1 -4
  69. package/skills/experience-accessibility-validate/references/reviewers/sc-2-4-6-headings-labels.md +0 -4
  70. package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-1-pointer-gestures.md +0 -4
  71. package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-2-pointer-cancellation.md +0 -4
  72. package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-3-label-in-name.md +0 -4
  73. package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-7-dragging-movement.md +0 -4
  74. package/skills/experience-accessibility-validate/references/reviewers/sc-3-2-1-on-focus.md +0 -4
  75. package/skills/experience-accessibility-validate/references/reviewers/sc-3-2-2-on-input.md +1 -4
  76. package/skills/experience-accessibility-validate/references/reviewers/sc-3-3-1-error-identification.md +1 -4
  77. package/skills/experience-accessibility-validate/references/reviewers/sc-3-3-2-labels-instructions.md +1 -4
  78. package/skills/experience-accessibility-validate/references/reviewers/sc-3-3-3-error-suggestion.md +1 -4
  79. package/skills/experience-accessibility-validate/references/reviewers/sc-4-1-2-i-name.md +4 -5
  80. package/skills/experience-accessibility-validate/references/reviewers/sc-4-1-2-ii-role.md +1 -4
  81. package/skills/experience-accessibility-validate/references/reviewers/sc-4-1-2-iii-value.md +0 -4
  82. package/skills/experience-design-validate/SKILL.md +163 -0
  83. package/skills/experience-design-validate/references/ai.md +54 -0
  84. package/skills/experience-design-validate/references/components.md +61 -0
  85. package/skills/experience-design-validate/references/craft.md +158 -0
  86. package/skills/experience-design-validate/references/data.md +59 -0
  87. package/skills/experience-design-validate/references/forms-flows.md +57 -0
  88. package/skills/experience-design-validate/references/interaction.md +53 -0
  89. package/skills/experience-design-validate/references/navigation.md +51 -0
  90. package/skills/experience-design-validate/references/performance.md +56 -0
  91. package/skills/experience-design-validate/references/records.md +60 -0
  92. package/skills/experience-design-validate/references/responsive.md +48 -0
  93. package/skills/experience-design-validate/references/scoring-rubric.md +257 -0
  94. package/skills/experience-design-validate/references/state.md +53 -0
  95. package/skills/experience-design-validate/references/trust.md +47 -0
  96. package/skills/experience-design-validate/references/usability.md +35 -0
  97. package/skills/experience-design-validate/references/visual-system.md +183 -0
  98. package/skills/experience-lwc-accessibility-jest-run/SKILL.md +104 -25
  99. package/skills/experience-lwc-accessibility-jest-run/assets/jest.config.js +4 -0
  100. package/skills/experience-lwc-accessibility-jest-run/assets/sa11y-jest-setup.js +5 -0
  101. package/skills/experience-ui-bundle-app-coordinate/SKILL.md +5 -5
  102. package/skills/experience-ui-bundle-features-generate/SKILL.md +65 -36
  103. package/skills/experience-ui-bundle-features-generate/references/angular/features.md +74 -0
  104. package/skills/experience-ui-bundle-features-generate/references/react/features.md +59 -0
  105. package/skills/experience-ui-bundle-features-generate/scripts/detect-framework.sh +73 -0
  106. package/skills/experience-ui-bundle-frontend-generate/SKILL.md +2 -2
  107. package/skills/experience-ui-bundle-metadata-generate/SKILL.md +26 -14
  108. package/skills/experience-ui-bundle-metadata-generate/references/angular-metadata-generate.md +37 -0
  109. package/skills/experience-ui-bundle-metadata-generate/references/react-metadata-generate.md +32 -0
  110. package/skills/experience-ui-bundle-metadata-generate/scripts/detect-framework.sh +73 -0
  111. package/skills/experience-ui-bundle-metadata-generate/scripts/verify-bundle-location.sh +30 -8
  112. package/skills/field-service-data-capture-migrate/SKILL.md +391 -0
  113. package/skills/field-service-data-capture-migrate/assets/sample-legacy-flow.flow-meta.xml +163 -0
  114. package/skills/field-service-data-capture-migrate/references/architecture-notes.md +40 -0
  115. package/skills/field-service-data-capture-migrate/references/component-mapping.md +278 -0
  116. package/skills/field-service-data-capture-migrate/references/converter-builder-contract.md +183 -0
  117. package/skills/field-service-data-capture-migrate/references/dc-platform-rules.md +130 -0
  118. package/skills/field-service-data-capture-migrate/references/fsm-dc-capability-catalog.md +215 -0
  119. package/skills/field-service-data-capture-migrate/references/known-deploy-errors.md +36 -0
  120. package/skills/field-service-data-capture-migrate/references/migration-checklist.md +121 -0
  121. package/skills/field-service-data-capture-migrate/references/transformer-rules.md +132 -0
  122. package/skills/field-service-data-capture-migrate/scripts/analyze_flow.py +277 -0
  123. package/skills/field-service-data-capture-migrate/scripts/convert_to_dc_spec.py +1311 -0
  124. package/skills/field-service-data-capture-migrate/scripts/cud_analysis.py +402 -0
  125. package/skills/field-service-data-capture-migrate/scripts/deploy_flow.sh +230 -0
  126. package/skills/field-service-data-capture-migrate/scripts/discover_subflow_tree.py +230 -0
  127. package/skills/field-service-data-capture-migrate/scripts/flow_input.py +186 -0
  128. package/skills/field-service-data-capture-migrate/scripts/flow_xml_utils.py +39 -0
  129. package/skills/field-service-data-capture-migrate/scripts/fsm_dc_catalog.py +413 -0
  130. package/skills/field-service-data-capture-migrate/scripts/generate_summary.py +199 -0
  131. package/skills/field-service-data-capture-migrate/scripts/json_to_flow_xml.py +146 -0
  132. package/skills/field-service-data-capture-migrate/scripts/manual_review_flags.py +42 -0
  133. package/skills/field-service-data-capture-migrate/scripts/retrieve_flow_rest.sh +155 -0
  134. package/skills/field-service-data-capture-migrate/scripts/subflow_names.py +49 -0
  135. package/skills/field-service-data-capture-migrate/scripts/transform_flow.py +1661 -0
  136. package/skills/field-service-data-capture-migrate/scripts/validate_flow.sh +147 -0
  137. package/skills/field-service-data-capture-migrate/scripts/vendor/build_flow.py +1258 -0
  138. package/skills/life-sciences-fieldsalesrep-coordinate/SKILL.md +1 -1
  139. package/skills/life-sciences-fieldsalesrep-coordinate/references/orchestration-flow.md +1 -1
  140. package/skills/life-sciences-kam-coordinate/references/stage-5-data-and-plan-templates-overview.md +14 -1
  141. package/skills/mobile-apps-create/SKILL.md +1 -1
  142. package/skills/{platform-agentsetup-categories-fetch → platform-agenticsetup-categories-get}/SKILL.md +7 -7
  143. package/skills/platform-sandbox-configure/SKILL.md +108 -133
  144. package/skills/platform-sandbox-configure/references/api-response-shapes.md +39 -0
  145. package/skills/platform-sandbox-configure/references/definition-file-approach.md +73 -0
  146. package/skills/platform-widget-generate/SKILL.md +26 -18
  147. package/skills/platform-widget-generate/examples/formulas.json +191 -0
  148. package/skills/platform-widget-generate/references/widget-formulas.md +123 -0
  149. package/skills/platform-widget-generate/references/widget-meta-directives.md +4 -4
  150. package/skills/sales-call-scoring-configure/SKILL.md +318 -0
  151. package/skills/sales-call-scoring-configure/assets/best-practice-competencies.json +67 -0
  152. package/skills/sales-call-scoring-configure/assets/ootb-competencies.json +58 -0
  153. package/skills/sales-call-scoring-configure/references/admin-communication.md +79 -0
  154. package/skills/sales-call-scoring-configure/references/competency-crud.md +130 -0
  155. package/skills/sales-call-scoring-configure/scripts/create-competency.sh +166 -0
  156. package/skills/sales-call-scoring-configure/scripts/create-custom-competency.sh +166 -0
  157. package/skills/sales-call-scoring-configure/scripts/edit-competency.sh +185 -0
  158. package/skills/sales-call-scoring-configure/scripts/edit-custom-competency.sh +190 -0
  159. package/skills/sales-call-scoring-configure/scripts/enable-call-scoring.sh +436 -0
  160. package/skills/sales-call-scoring-configure/scripts/get-competency.sh +72 -0
  161. package/skills/sales-call-scoring-configure/scripts/get-custom-competency.sh +78 -0
  162. package/skills/sales-call-scoring-configure/scripts/install-best-practice-competencies.sh +223 -0
  163. package/skills/sales-call-scoring-configure/scripts/install-ootb-competencies.sh +237 -0
  164. package/skills/sales-call-scoring-configure/scripts/list-competencies.sh +99 -0
  165. package/skills/sales-call-scoring-configure/scripts/shared/auth.sh +116 -0
  166. package/skills/sales-call-scoring-configure/scripts/shared/cap.sh +86 -0
  167. package/skills/sales-call-scoring-configure/scripts/shared/soap.sh +267 -0
  168. package/skills/sales-call-scoring-configure/scripts/shared/soql.sh +25 -0
  169. package/skills/sales-call-scoring-configure/scripts/toggle-competency.sh +112 -0
  170. package/skills/sales-call-scoring-configure/scripts/toggle-custom-competency.sh +125 -0
  171. package/skills/sales-call-scoring-configure/scripts/verify-ootb-competencies.sh +116 -0
  172. package/skills/service-concierge-portal-generate/references/portal-deploy-runbook.md +1 -0
  173. package/skills/service-de-channel-activate/SKILL.md +6 -5
  174. package/skills/service-de-channel-create/SKILL.md +3 -3
  175. package/skills/service-de-channel-routing-configure/SKILL.md +3 -3
  176. package/skills/service-de-channel-settings-configure/SKILL.md +195 -0
  177. package/skills/service-de-channel-settings-configure/references/channel-settings-facets.md +152 -0
  178. package/skills/{service-de-channel-consent-configure → service-de-channel-settings-configure}/references/gotchas.md +3 -3
  179. package/skills/{service-de-channel-consent-configure → service-de-channel-settings-configure}/references/language-keywords.md +4 -4
  180. package/skills/{service-de-channel-consent-configure → service-de-channel-settings-configure}/references/worked-examples.md +14 -14
  181. package/skills/service-de-headless-channel-configure/SKILL.md +6 -6
  182. package/skills/service-de-headless-channel-configure/references/worked-examples.md +1 -1
  183. package/skills/service-helpagent-coordinate/SKILL.md +3 -2
  184. package/skills/service-helpagent-coordinate/references/channel-voice.md +15 -4
  185. package/skills/service-itsm-agentic-setup-agentforce-coordinate/SKILL.md +49 -31
  186. package/skills/service-itsm-agentic-setup-agentforce-coordinate/examples/output-templates.md +71 -6
  187. package/skills/service-itsm-agentic-setup-agentforce-coordinate/scripts/verify-child-verdict.mjs +26 -4
  188. package/skills/service-itsm-agentic-setup-cmdb-access-assign/SKILL.md +35 -10
  189. package/skills/service-itsm-agentic-setup-cmdb-access-assign/references/mcp-invocation.md +25 -5
  190. package/skills/service-itsm-agentic-setup-cmdb-bundle-deploy/SKILL.md +1 -1
  191. package/skills/service-itsm-agentic-setup-cmdb-configure/SKILL.md +5 -5
  192. package/skills/service-itsm-agentic-setup-cmdb-configure/references/mcp-invocation.md +1 -1
  193. package/skills/service-itsm-agentic-setup-cmdb-coordinate/SKILL.md +2 -2
  194. package/skills/service-itsm-agentic-setup-cmdb-coordinate/examples/output-templates.md +1 -1
  195. package/skills/service-itsm-agentic-setup-cmdb-discovery-configure/SKILL.md +25 -15
  196. package/skills/service-itsm-agentic-setup-employee-agent-configure/SKILL.md +8 -5
  197. package/skills/service-itsm-agentic-setup-employee-agent-configure/references/report-format.md +4 -2
  198. package/skills/service-itsm-agentic-setup-employee-agent-configure/references/workflow-detail.md +1 -1
  199. package/skills/service-itsm-agentic-setup-employee-agent-configure/scripts/render-report.mjs +29 -16
  200. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/SKILL.md +8 -5
  201. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/report-format.md +4 -2
  202. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/workflow-detail.md +1 -1
  203. package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/render-report.mjs +29 -16
  204. package/skills/service-itsm-agentic-setup-incident-management/SKILL.md +138 -68
  205. package/skills/service-itsm-agentic-setup-incident-management/examples/output-templates.md +31 -15
  206. package/skills/service-itsm-agentic-setup-incident-management/references/incident-persona-psg.md +156 -0
  207. package/skills/service-itsm-agentic-setup-incident-management/references/incident-preferences.md +148 -0
  208. package/skills/service-itsm-agentic-setup-incident-management/references/major-incident-management.md +162 -0
  209. package/skills/service-itsm-agentic-setup-incident-management/references/service-mgmt-privilege.md +149 -0
  210. package/skills/service-itsm-agentic-setup-incident-sla-configure/SKILL.md +103 -89
  211. package/skills/service-itsm-agentic-setup-incident-sla-configure/assets/attach-milestone.json +2 -2
  212. package/skills/service-itsm-agentic-setup-incident-sla-configure/assets/predefined-incident-policy.json +21 -39
  213. package/skills/service-itsm-agentic-setup-incident-sla-configure/examples/milestone-patterns.md +3 -3
  214. package/skills/service-itsm-agentic-setup-incident-sla-configure/examples/output-templates.md +18 -1
  215. package/skills/service-itsm-agentic-setup-incident-sla-configure/references/mcp-invocation.md +63 -37
  216. package/skills/service-omni-attribute-routing-configure/SKILL.md +53 -0
  217. package/skills/service-omni-attribute-routing-configure/references/api-notes.md +7 -0
  218. package/skills/service-omni-attribute-routing-configure/scripts/configure-and-report.sh +224 -0
  219. package/skills/service-omni-attribute-routing-configure/scripts/tests/test_attribute_routing_contracts.py +137 -0
  220. package/skills/service-omni-channel-inventory-analyze/SKILL.md +96 -0
  221. package/skills/service-omni-channel-inventory-analyze/references/api-notes.md +52 -0
  222. package/skills/service-omni-channel-inventory-analyze/scripts/analyze.sh +185 -0
  223. package/skills/service-omni-channel-inventory-analyze/scripts/tests/_bootstrap.py +84 -0
  224. package/skills/service-omni-channel-inventory-analyze/scripts/tests/test_inventory_analyze_contracts.py +141 -0
  225. package/skills/service-omni-channel-limits-analyze/SKILL.md +70 -0
  226. package/skills/service-omni-channel-limits-analyze/references/api-notes.md +22 -0
  227. package/skills/service-omni-channel-limits-analyze/scripts/analyze.sh +159 -0
  228. package/skills/service-omni-channel-limits-analyze/scripts/tests/_bootstrap.py +87 -0
  229. package/skills/service-omni-channel-limits-analyze/scripts/tests/test_limits_analyze_contracts.py +99 -0
  230. package/skills/service-omni-channel-setup-coordinate/SKILL.md +12 -20
  231. package/skills/service-omni-channel-setup-coordinate/scripts/integration-driver.sh +55 -5
  232. package/skills/service-omni-channel-setup-coordinate/scripts/tests/test_omni_contracts.py +38 -0
  233. package/skills/service-omni-command-center-analyze/SKILL.md +2 -2
  234. package/skills/service-omni-command-center-analyze/scripts/analyze.sh +3 -3
  235. package/skills/dx-org-manage/examples/snapshots/error_output.json +0 -9
  236. package/skills/dx-org-manage/examples/snapshots/success_output.json +0 -15
  237. package/skills/dx-org-manage/references/cli_flags.md +0 -67
  238. package/skills/dx-org-manage/references/creating-snapshot.md +0 -103
  239. package/skills/dx-org-manage/references/snapshot_usage.md +0 -74
  240. package/skills/experience-accessibility-validate/scripts/contrast-ratio.py +0 -153
  241. package/skills/experience-lwc-accessibility-jest-run/references/running-sa11y-jest-tests.md +0 -205
  242. package/skills/experience-ui-bundle-features-generate/scripts/verify-react-bundle.sh +0 -14
  243. /package/skills/experience-ui-bundle-features-generate/references/{conflict-resolution-schema.json → common/conflict-resolution-schema.json} +0 -0
  244. /package/skills/{platform-agentsetup-categories-fetch → platform-agenticsetup-categories-get}/references/api-response-schema.md +0 -0
@@ -0,0 +1,428 @@
1
+ #!/usr/bin/env bash
2
+ # Consistency tests for dx-org-analyze SKILL.md and scripts.
3
+ # Verifies skill structure, script references, and report contract.
4
+ #
5
+ # Usage: bash tests/test_consistency.sh
6
+ # Exit 0 on all-pass, 1 on any failure.
7
+
8
+ set -u
9
+
10
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
+ SKILL_FILE="$SCRIPT_DIR/../SKILL.md"
12
+ SCRIPTS_DIR="$SCRIPT_DIR/../scripts"
13
+
14
+ if [[ ! -f "$SKILL_FILE" ]]; then
15
+ echo "FAIL: SKILL.md not found at $SKILL_FILE"
16
+ exit 1
17
+ fi
18
+
19
+ PASS=0
20
+ FAIL=0
21
+
22
+ pass() { echo " PASS: $1"; PASS=$((PASS + 1)); }
23
+ fail() { echo " FAIL: $1"; FAIL=$((FAIL + 1)); }
24
+
25
+ # ============================================================
26
+ echo "=== Test 1: YAML frontmatter is well-formed ==="
27
+ # ============================================================
28
+
29
+ if head -1 "$SKILL_FILE" | grep -q "^---$"; then
30
+ CLOSE_LINE=$(awk 'NR>1 && /^---$/ {print NR; exit}' "$SKILL_FILE")
31
+ if [[ -n "$CLOSE_LINE" ]]; then
32
+ pass "YAML frontmatter opens and closes (line $CLOSE_LINE)"
33
+ else
34
+ fail "YAML frontmatter has no closing ---"
35
+ fi
36
+ else
37
+ fail "SKILL.md does not start with ---"
38
+ fi
39
+
40
+ # ============================================================
41
+ echo ""
42
+ echo "=== Test 2: Required frontmatter fields ==="
43
+ # ============================================================
44
+
45
+ CLOSE_LINE=$(awk 'NR>1 && /^---$/ {print NR; exit}' "$SKILL_FILE")
46
+ if [[ -n "$CLOSE_LINE" ]]; then
47
+ FRONTMATTER=$(sed -n "1,${CLOSE_LINE}p" "$SKILL_FILE")
48
+ for field in "name:" "description:" "metadata:"; do
49
+ if echo "$FRONTMATTER" | grep -q "$field"; then
50
+ pass "Frontmatter has '$field'"
51
+ else
52
+ fail "Frontmatter missing '$field'"
53
+ fi
54
+ done
55
+ SKILL_NAME=$(echo "$FRONTMATTER" | grep "^name:" | awk '{print $2}')
56
+ EXPECTED_NAME=$(basename "$(cd "$SCRIPT_DIR/.." && pwd)")
57
+ if [[ "$SKILL_NAME" == "$EXPECTED_NAME" ]]; then
58
+ pass "Skill name '$SKILL_NAME' matches directory name"
59
+ else
60
+ fail "Skill name '$SKILL_NAME' doesn't match directory name '$EXPECTED_NAME'"
61
+ fi
62
+ if echo "$FRONTMATTER" | grep -q "version:"; then
63
+ pass "Frontmatter has 'metadata.version'"
64
+ else
65
+ fail "Frontmatter missing 'metadata.version'"
66
+ fi
67
+ fi
68
+
69
+ # ============================================================
70
+ echo ""
71
+ echo "=== Test 3: SKILL.md references both scripts ==="
72
+ # ============================================================
73
+
74
+ if grep -qF "collect_org_data.py" "$SKILL_FILE"; then
75
+ pass "References collect_org_data.py"
76
+ else
77
+ fail "Missing reference to collect_org_data.py"
78
+ fi
79
+
80
+ if grep -qF "compute_diff.py" "$SKILL_FILE"; then
81
+ pass "References compute_diff.py"
82
+ else
83
+ fail "Missing reference to compute_diff.py"
84
+ fi
85
+
86
+ # ============================================================
87
+ echo ""
88
+ echo "=== Test 4: Scripts exist and are executable ==="
89
+ # ============================================================
90
+
91
+ for script in "collect_org_data.py" "compute_diff.py"; do
92
+ SPATH="$SCRIPTS_DIR/$script"
93
+ if [[ -f "$SPATH" ]]; then
94
+ pass "Script exists: $script"
95
+ else
96
+ fail "Script missing: $script"
97
+ fi
98
+ if [[ -x "$SPATH" ]]; then
99
+ pass "Script is executable: $script"
100
+ else
101
+ fail "Script not executable: $script"
102
+ fi
103
+ if head -1 "$SPATH" | grep -q "python3"; then
104
+ pass "Script has python3 shebang: $script"
105
+ else
106
+ fail "Script missing python3 shebang: $script"
107
+ fi
108
+ done
109
+
110
+ # ============================================================
111
+ echo ""
112
+ echo "=== Test 5: Scripts accept --help ==="
113
+ # ============================================================
114
+
115
+ for script in "collect_org_data.py" "compute_diff.py"; do
116
+ if python3 "$SCRIPTS_DIR/$script" --help >/dev/null 2>&1; then
117
+ pass "$script --help exits 0"
118
+ else
119
+ fail "$script --help failed"
120
+ fi
121
+ done
122
+
123
+ # ============================================================
124
+ echo ""
125
+ echo "=== Test 6: collect_org_data.py has required flags ==="
126
+ # ============================================================
127
+
128
+ HELP_COLLECT=$(python3 "$SCRIPTS_DIR/collect_org_data.py" --help 2>&1)
129
+ for flag in "org-alias" "output" "skip-deep-data"; do
130
+ if echo "$HELP_COLLECT" | grep -qF -- "--$flag"; then
131
+ pass "collect_org_data.py supports --$flag"
132
+ else
133
+ fail "collect_org_data.py missing flag: --$flag"
134
+ fi
135
+ done
136
+
137
+ # ============================================================
138
+ echo ""
139
+ echo "=== Test 7: compute_diff.py has required flags ==="
140
+ # ============================================================
141
+
142
+ HELP_DIFF=$(python3 "$SCRIPTS_DIR/compute_diff.py" --help 2>&1)
143
+ for flag in "org-a" "org-b" "output" "format" "org-a-label" "org-b-label"; do
144
+ if echo "$HELP_DIFF" | grep -qF -- "--$flag"; then
145
+ pass "compute_diff.py supports --$flag"
146
+ else
147
+ fail "compute_diff.py missing flag: --$flag"
148
+ fi
149
+ done
150
+
151
+ # ============================================================
152
+ echo ""
153
+ echo "=== Test 8: SF CLI authentication documented ==="
154
+ # ============================================================
155
+
156
+ if grep -qF "sf org list" "$SKILL_FILE"; then
157
+ pass "Documents 'sf org list' for listing authenticated orgs"
158
+ else
159
+ fail "Missing: sf org list"
160
+ fi
161
+
162
+ if grep -qF "sf data query" "$SKILL_FILE"; then
163
+ pass "Documents 'sf data query' for validating connectivity"
164
+ else
165
+ fail "Missing: sf data query"
166
+ fi
167
+
168
+ if grep -qF "sf org login web" "$SKILL_FILE"; then
169
+ pass "Documents 'sf org login web' for authentication"
170
+ else
171
+ fail "Missing: sf org login web"
172
+ fi
173
+
174
+ # ============================================================
175
+ echo ""
176
+ echo "=== Test 9: Drift score constants in compute_diff.py ==="
177
+ # ============================================================
178
+
179
+ DIFF_SCRIPT="$SCRIPTS_DIR/compute_diff.py"
180
+ for term in "WEIGHT_METADATA" "WEIGHT_PERMISSION" "WEIGHT_PROFILE" "DRIFT_LEVELS"; do
181
+ if grep -qF "$term" "$DIFF_SCRIPT"; then
182
+ pass "Drift constant '$term' in compute_diff.py"
183
+ else
184
+ fail "Missing drift constant: '$term'"
185
+ fi
186
+ done
187
+
188
+ if grep -qF "0.6" "$DIFF_SCRIPT" && grep -qF "0.3" "$DIFF_SCRIPT" && grep -qF "0.1" "$DIFF_SCRIPT"; then
189
+ pass "Weights are 0.6 / 0.3 / 0.1"
190
+ else
191
+ fail "Drift weights don't match expected 0.6 / 0.3 / 0.1"
192
+ fi
193
+
194
+ for level in "LOW" "MODERATE" "HIGH" "CRITICAL"; do
195
+ if grep -qF "\"$level\"" "$DIFF_SCRIPT"; then
196
+ pass "Severity level '$level' defined"
197
+ else
198
+ fail "Missing severity level: '$level'"
199
+ fi
200
+ done
201
+
202
+ # ============================================================
203
+ echo ""
204
+ echo "=== Test 10: System permissions support ==="
205
+ # ============================================================
206
+
207
+ COLLECT_SCRIPT="$SCRIPTS_DIR/collect_org_data.py"
208
+
209
+ if grep -qF "collect_system_permissions" "$COLLECT_SCRIPT"; then
210
+ pass "collect_org_data.py has collect_system_permissions function"
211
+ else
212
+ fail "collect_org_data.py missing collect_system_permissions"
213
+ fi
214
+
215
+ if grep -qF "PermissionsXxx" "$COLLECT_SCRIPT" || grep -qF "Permissions" "$COLLECT_SCRIPT" && grep -qF "PermissionSet" "$COLLECT_SCRIPT"; then
216
+ pass "collect_org_data.py queries PermissionsXxx fields on PermissionSet"
217
+ else
218
+ fail "Missing PermissionsXxx/PermissionSet query"
219
+ fi
220
+
221
+ if grep -qF "system_permissions" "$COLLECT_SCRIPT"; then
222
+ pass "collect_org_data.py outputs system_permissions in result"
223
+ else
224
+ fail "Missing system_permissions in output"
225
+ fi
226
+
227
+ DIFF_SCRIPT="$SCRIPTS_DIR/compute_diff.py"
228
+
229
+ if grep -qF "diff_system_permissions" "$DIFF_SCRIPT"; then
230
+ pass "compute_diff.py has diff_system_permissions function"
231
+ else
232
+ fail "compute_diff.py missing diff_system_permissions"
233
+ fi
234
+
235
+ if grep -qF "System Permissions" "$DIFF_SCRIPT"; then
236
+ pass "compute_diff.py renders System Permissions section in report"
237
+ else
238
+ fail "Missing System Permissions section in markdown report"
239
+ fi
240
+
241
+ # ============================================================
242
+ echo ""
243
+ echo "=== Test 11: collect_org_data.py uses SF CLI and public APIs ==="
244
+ # ============================================================
245
+
246
+ COLLECT_SCRIPT="$SCRIPTS_DIR/collect_org_data.py"
247
+
248
+ if grep -qF "sf org list metadata-types" "$COLLECT_SCRIPT" || grep -qF "metadata-types" "$COLLECT_SCRIPT"; then
249
+ pass "Uses sf CLI metadata-types for type discovery"
250
+ else
251
+ fail "Missing sf CLI metadata type discovery"
252
+ fi
253
+
254
+ if grep -qF "sf org list metadata" "$COLLECT_SCRIPT" || grep -qF "list metadata" "$COLLECT_SCRIPT"; then
255
+ pass "Uses sf CLI to list metadata components"
256
+ else
257
+ fail "Missing sf CLI metadata listing"
258
+ fi
259
+
260
+ if grep -qF "OrganizationSettingsDetail" "$COLLECT_SCRIPT"; then
261
+ pass "Uses OrganizationSettingsDetail for org settings (public API)"
262
+ else
263
+ fail "Missing OrganizationSettingsDetail — must use public API for settings"
264
+ fi
265
+
266
+ if grep -qF "/limits/" "$COLLECT_SCRIPT"; then
267
+ pass "Uses REST /limits/ endpoint for org limits"
268
+ else
269
+ fail "Missing /limits/ endpoint — must use public API for org limits"
270
+ fi
271
+
272
+ if grep -q "exit(2)\|sys.exit(2)" "$COLLECT_SCRIPT"; then
273
+ pass "Exits 2 on session expiry"
274
+ else
275
+ fail "Missing exit code 2 for session expiry"
276
+ fi
277
+
278
+ # Verify internal tools are NOT present
279
+ if grep -qF "hoseMyOrgPlease" "$COLLECT_SCRIPT"; then
280
+ fail "Still references hoseMyOrgPlease (internal-only tool, must be removed)"
281
+ else
282
+ pass "No references to hoseMyOrgPlease (internal tool removed)"
283
+ fi
284
+
285
+ # ============================================================
286
+ echo ""
287
+ echo "=== Test 12: Core rules in SKILL.md ==="
288
+ # ============================================================
289
+
290
+ RULES=("Read-only" "never deploy" "session expired")
291
+
292
+ for rule in "${RULES[@]}"; do
293
+ if grep -qiF "$rule" "$SKILL_FILE"; then
294
+ pass "Core rule/concept present: '$rule'"
295
+ else
296
+ fail "Missing: '$rule'"
297
+ fi
298
+ done
299
+
300
+ # ============================================================
301
+ echo ""
302
+ echo "=== Test 13: No hardcoded metadata type tiers ==="
303
+ # ============================================================
304
+
305
+ HARDCODED_TIERS=$(grep -cE "^\*\*Tier [0-9]" "$SKILL_FILE" || true)
306
+ if [[ "$HARDCODED_TIERS" -eq 0 ]]; then
307
+ pass "No hardcoded tier lists in SKILL.md"
308
+ else
309
+ fail "Found $HARDCODED_TIERS hardcoded tier lists — use describeMetadata instead"
310
+ fi
311
+
312
+ # ============================================================
313
+ echo ""
314
+ echo "=== Test 14: No internal-only references in SKILL.md ==="
315
+ # ============================================================
316
+
317
+ if grep -qF "hoseMyOrgPlease" "$SKILL_FILE"; then
318
+ fail "SKILL.md still references hoseMyOrgPlease (internal-only)"
319
+ else
320
+ pass "No hoseMyOrgPlease references in SKILL.md"
321
+ fi
322
+
323
+ if grep -qF "SOAP Partner API" "$SKILL_FILE" || grep -qF "SOAP Login" "$SKILL_FILE"; then
324
+ fail "SKILL.md still references SOAP login (removed for external use)"
325
+ else
326
+ pass "No SOAP login references in SKILL.md"
327
+ fi
328
+
329
+ if grep -qF "Web Login" "$SKILL_FILE" && grep -qF "sid cookie" "$SKILL_FILE"; then
330
+ fail "SKILL.md still references web login with sid cookie (removed for external use)"
331
+ else
332
+ pass "No web login/cookie references in SKILL.md"
333
+ fi
334
+
335
+ # ============================================================
336
+ echo ""
337
+ echo "=== Test 15: introspect_org.py exists and is executable ==="
338
+ # ============================================================
339
+
340
+ INTROSPECT_SCRIPT="$SCRIPTS_DIR/introspect_org.py"
341
+ if [[ -f "$INTROSPECT_SCRIPT" ]]; then
342
+ pass "Script exists: introspect_org.py"
343
+ else
344
+ fail "Script missing: introspect_org.py"
345
+ fi
346
+ if [[ -x "$INTROSPECT_SCRIPT" ]]; then
347
+ pass "Script is executable: introspect_org.py"
348
+ else
349
+ fail "Script not executable: introspect_org.py"
350
+ fi
351
+ if head -1 "$INTROSPECT_SCRIPT" | grep -q "python3"; then
352
+ pass "Script has python3 shebang: introspect_org.py"
353
+ else
354
+ fail "Script missing python3 shebang: introspect_org.py"
355
+ fi
356
+
357
+ # ============================================================
358
+ echo ""
359
+ echo "=== Test 16: introspect_org.py --help and flags ==="
360
+ # ============================================================
361
+
362
+ if python3 "$INTROSPECT_SCRIPT" --help >/dev/null 2>&1; then
363
+ pass "introspect_org.py --help exits 0"
364
+ else
365
+ fail "introspect_org.py --help failed"
366
+ fi
367
+
368
+ HELP_INTROSPECT=$(python3 "$INTROSPECT_SCRIPT" --help 2>&1)
369
+ for flag in "org" "output" "format" "label"; do
370
+ if echo "$HELP_INTROSPECT" | grep -qF -- "--$flag"; then
371
+ pass "introspect_org.py supports --$flag"
372
+ else
373
+ fail "introspect_org.py missing flag: --$flag"
374
+ fi
375
+ done
376
+
377
+ # ============================================================
378
+ echo ""
379
+ echo "=== Test 17: SKILL.md documents introspect workflow ==="
380
+ # ============================================================
381
+
382
+ if grep -qF "introspect_org.py" "$SKILL_FILE"; then
383
+ pass "SKILL.md references introspect_org.py"
384
+ else
385
+ fail "SKILL.md missing reference to introspect_org.py"
386
+ fi
387
+
388
+ if grep -qiF "Introspect Workflow" "$SKILL_FILE"; then
389
+ pass "SKILL.md has Introspect Workflow section"
390
+ else
391
+ fail "SKILL.md missing Introspect Workflow section"
392
+ fi
393
+
394
+ if grep -qiF "single-org" "$SKILL_FILE" || grep -qiF "single org" "$SKILL_FILE"; then
395
+ pass "SKILL.md mentions single-org mode"
396
+ else
397
+ fail "SKILL.md missing single-org mode documentation"
398
+ fi
399
+
400
+ if grep -qiF "introspect" "$SKILL_FILE"; then
401
+ pass "SKILL.md mentions introspect in description"
402
+ else
403
+ fail "SKILL.md description missing introspect trigger phrases"
404
+ fi
405
+
406
+ # ============================================================
407
+ echo ""
408
+ echo "=== Test 18: introspect_org.py report sections ==="
409
+ # ============================================================
410
+
411
+ for section in "Metadata Inventory" "Installed Packages" "Org Settings" "Org Limits" "Licenses" "System Permissions" "Deep Data"; do
412
+ if grep -qF "$section" "$INTROSPECT_SCRIPT"; then
413
+ pass "introspect_org.py renders '$section' section"
414
+ else
415
+ fail "introspect_org.py missing '$section' section"
416
+ fi
417
+ done
418
+
419
+ # ============================================================
420
+ echo ""
421
+ echo "================================================"
422
+ echo "Results: $PASS passed, $FAIL failed"
423
+ echo "================================================"
424
+
425
+ if [[ $FAIL -gt 0 ]]; then
426
+ exit 1
427
+ fi
428
+ exit 0
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: dx-org-manage
3
- description: "INVOKE this skill to execute Salesforce org operations: create scratch orgs, list/display/resume/delete scratch orgs, create org snapshots, open orgs in browser. This skill EXECUTES operations immediately - it does NOT generate scripts or code files. ALWAYS invoke this skill (do not execute SF CLI commands directly) when user requests to: create a scratch org (from edition, definition file (.json), snapshot, or org shape), list/display/resume/delete scratch orgs, create an org snapshot, or open a Salesforce org. Trigger phrases include: 'create a snapshot', 'take a snapshot', 'create scratch org', 'new scratch org', 'spin up an org', 'create 5 scratch orgs', 'create org from snapshot', 'scratch-def.json', 'project-scratch-def.json', 'list scratch orgs', 'display org', 'delete scratch org', 'resume scratch org', 'open my Salesforce org', 'open org in browser'. Do NOT use for switching default org (use dx-org-switch) or deploying metadata (use platform-metadata-deploy)."
3
+ description: "Use to EXECUTE Salesforce org operations immediately via the sf CLI (this skill runs them, it does NOT generate scripts): create scratch orgs (from edition, definition file, snapshot, or org shape), list/display/resume/delete scratch orgs, open orgs in browser. Trigger: 'create scratch org', 'create org from snapshot', 'delete scratch org', 'open my org'. Do NOT use for switching the default org (use dx-org-switch), deploying metadata (use platform-metadata-deploy), or creating/checking/listing/deleting org snapshots (use dx-org-snapshot-manage)."
4
4
  metadata:
5
- version: "1.2"
5
+ version: "1.3"
6
6
  domains: ["Developer Experience"]
7
7
  minApiVersion: "60.0"
8
8
  relatedSkills:
@@ -19,7 +19,7 @@ metadata:
19
19
 
20
20
  **Tool constraint:** Use the Bash tool for all `sf` CLI commands. Always include `--json` for structured output. Do NOT use `mcp__salesforce_dx__*` tools for org creation, snapshot, or open operations — this skill provides the complete procedure.
21
21
 
22
- **Output artifacts for eval/testing:** ALWAYS write the command's JSON response to a file when an output directory is available. Do NOT ask the user what file to write — this skill defines the filenames. After executing the command: (1) if the user specified an output path (e.g. "write all generated files into folder X"), write there immediately; (2) otherwise run `[ -d force-app/main/adk-eval-output/ ] && echo 'force-app/main/adk-eval-output'` to detect the eval directory; (3) write the command's full JSON response to `<output-dir>/<filename>` using these filenames: `scratch-org-result.json` for org creation (for a batch of N orgs, `scratch-org-result-1.json` … `scratch-org-result-N.json`), `scratch-org-list-result.json` for list, `org-display-result.json` for display, `scratch-org-resume-result.json` for resume, `scratch-org-delete-result.json` for delete, or `snapshot-result.json` for snapshot creation. This is the generated output — write it without asking. (Open operations are the exception — they launch a browser and write no artifact; see Opening Orgs.)
22
+ **Output artifacts for eval/testing:** ALWAYS write the command's JSON response to a file when an output directory is available. Do NOT ask the user what file to write — this skill defines the filenames. After executing the command: (1) if the user specified an output path (e.g. "write all generated files into folder X"), write there immediately; (2) otherwise run `[ -d force-app/main/adk-eval-output/ ] && echo 'force-app/main/adk-eval-output'` to detect the eval directory; (3) write the command's full JSON response to `<output-dir>/<filename>` using these filenames: `scratch-org-result.json` for org creation (for a batch of N orgs, `scratch-org-result-1.json` … `scratch-org-result-N.json`), `scratch-org-list-result.json` for list, `org-display-result.json` for display, `scratch-org-resume-result.json` for resume, or `scratch-org-delete-result.json` for delete. This is the generated output — write it without asking. (Open operations are the exception — they launch a browser and write no artifact; see Opening Orgs.)
23
23
 
24
24
  ---
25
25
 
@@ -118,7 +118,7 @@ Write the extracted org-list entry (the resolved org record), NOT the raw creati
118
118
  - For the complete creation workflow (AUTO MODE, STATE A/B, batch, definition-file authoring) → load `references/scratch-org-create.md`; for list/display/resume/delete → load `references/scratch-org-operations.md`
119
119
  - For available features, settings, and definition file structure → load `references/definition_file_options.md`
120
120
  - For edition selection guidance and comparison → load `references/edition_types.md`
121
- - For snapshot workflow and post-creation usage → load `references/snapshot_usage.md`
121
+ - To create/check/list/delete the snapshot itself before referencing it here → use the `dx-org-snapshot-manage` skill
122
122
 
123
123
  ---
124
124
 
@@ -182,47 +182,6 @@ sf org delete scratch --target-org <alias> --no-prompt --json
182
182
 
183
183
  ---
184
184
 
185
- ## Creating Snapshots
186
-
187
- **REQUIRED steps — execute in order:**
188
-
189
- **Step 1. Get inputs:**
190
- - Source org: scratch org ID or alias (from user)
191
- - Snapshot name: unique name (from user)
192
- - Description: optional (from user)
193
-
194
- **Step 2. Determine Dev Hub:** resolve to a concrete value and pass it explicitly via `--target-dev-hub` in Step 3 (same order as scratch-org creation — never guess a name):
195
- 1. A Dev Hub the user named → use it verbatim.
196
- 2. Else the default: non-empty `result[0].value` from `sf config get target-dev-hub --json`.
197
- 3. Else the single authenticated Dev Hub — run **this exact all-bucket command** (do NOT hand-write a single-bucket filter, which misses hubs that land in `devHubs`/`nonScratchOrgs`):
198
- ```bash
199
- sf org list --json | jq -r '[.result.devHubs[]?, .result.nonScratchOrgs[]?, .result.other[]?, .result.sandboxes[]?, .result.scratchOrgs[]?] | map(select(.isDevHub == true).username) | unique | .[]'
200
- ```
201
- Exactly one → use it. Zero → **do NOT run the snapshot command at all**; advise `sf org login web --set-default-dev-hub` and stop. Two or more → ask the user which.
202
-
203
- Never fabricate a placeholder alias (e.g. `eval-target`, `my-dev-hub`) and never run the command with no `--target-dev-hub` flag — the CLI rejects a bad name with `NotADevHubError` and a missing default with `NoDefaultDevHubError`. If no hub resolves, that is a hard stop, not a value to guess.
204
-
205
- **Step 3. Execute:**
206
- ```bash
207
- sf org create snapshot --source-org <orgId-or-alias> --name <SnapshotName> --target-dev-hub <devHub> --json
208
- ```
209
-
210
- With description:
211
- ```bash
212
- sf org create snapshot --source-org <orgId-or-alias> --name <SnapshotName> --description "<desc>" --target-dev-hub <devHub> --json
213
- ```
214
-
215
- **Step 4. Report result:** Returns JSON with SnapshotId and Status. If an output directory is available (per the output artifacts rule above), write the JSON response to `<output-dir>/snapshot-result.json`.
216
-
217
- **Error handling:** surface the CLI's own error unchanged. For example:
218
- - "Snapshot name already exists" → use a different unique name
219
-
220
- **When you need more detail:**
221
- - For complete snapshot creation workflow and flag reference → load `references/creating-snapshot.md`
222
- - For CLI flag reference → load `references/cli_flags.md`
223
-
224
- ---
225
-
226
185
  ## Opening Orgs
227
186
 
228
187
  **REQUIRED steps — execute in order:**
@@ -264,11 +223,10 @@ Load these reference files for detailed guidance:
264
223
  | `references/scratch-org-operations.md` | Operating on existing orgs: list, display, resume, delete — plus shared lifecycle rules and troubleshooting |
265
224
  | `references/definition_file_options.md` | User needs to configure org features, settings, or advanced definition file options beyond basic org creation |
266
225
  | `references/edition_types.md` | User asks which edition to choose or needs to understand edition differences |
267
- | `references/snapshot_usage.md` | User wants to use snapshots in definition files or needs post-snapshot workflow guidance |
268
- | `references/cli_flags.md` | User needs complete snapshot CLI flag reference |
269
- | `references/creating-snapshot.md` | Troubleshooting snapshot creation failures or need detailed snapshot workflow |
270
226
  | `references/opening-org.md` | User needs to navigate to specific setup paths, open metadata files, or use advanced open flags |
271
227
 
228
+ To create/check/list/delete a snapshot itself (rather than just consuming one), use the `dx-org-snapshot-manage` skill.
229
+
272
230
  ## Example Files
273
231
 
274
232
  Example command outputs for testing and troubleshooting:
@@ -285,5 +243,3 @@ Example command outputs for testing and troubleshooting:
285
243
  | `examples/scratch-orgs/display_output.json` | `sf org display --json` output (wrapped, tokens redacted) |
286
244
  | `examples/scratch-orgs/resume_output.json` | `sf org resume scratch --json` output (completed org) |
287
245
  | `examples/scratch-orgs/delete_output.json` | `sf org delete scratch --json` output |
288
- | `examples/snapshots/success_output.json` | Successful snapshot creation |
289
- | `examples/snapshots/error_output.json` | Common snapshot error scenario (duplicate name) |
@@ -1,20 +1,21 @@
1
1
  # Examples Directory
2
2
 
3
- This directory contains example outputs for the three workflows supported by the `dx-org-manage` skill.
3
+ This directory contains example outputs for the workflows supported by the `dx-org-manage` skill.
4
+
5
+ Snapshot lifecycle examples (create/get/list/delete the snapshot itself) live in the `dx-org-snapshot-manage` skill's `examples/` directory — this skill only *consumes* an existing snapshot (see `success_snapshot.json` below).
4
6
 
5
7
  ## Structure
6
8
 
7
9
  ```text
8
10
  examples/
9
11
  ├── README.md # This file
10
- ├── scratch-orgs/ # Scratch org creation examples
11
- │ ├── success_definition_file.json
12
- │ ├── success_edition.json
13
- │ ├── error_no_devhub.json
14
- │ └── error_timeout.json
15
- └── snapshots/ # Snapshot creation examples
16
- ├── success_output.json
17
- └── error_output.json
12
+ └── scratch-orgs/ # Scratch org creation examples
13
+ ├── success_definition_file.json
14
+ ├── success_edition.json
15
+ ├── success_snapshot.json
16
+ ├── success_shape.json
17
+ ├── error_no_devhub.json
18
+ └── error_timeout.json
18
19
  ```
19
20
 
20
21
  ## scratch-orgs/
@@ -27,13 +28,6 @@ Examples of `sf org create scratch` command outputs for all four creation method
27
28
  - **error_no_devhub.json** - Error when Dev Hub not authenticated
28
29
  - **error_timeout.json** - Timeout error (exit code 69)
29
30
 
30
- ## snapshots/
31
-
32
- Examples of `sf org create snapshot` command outputs.
33
-
34
- - **success_output.json** - Successful snapshot creation
35
- - **error_output.json** - Common error scenario (duplicate snapshot name)
36
-
37
31
  ## Usage
38
32
 
39
33
  These examples help illustrate:
@@ -300,4 +300,4 @@ user-supplied name — the CLI auto-populates the org name.
300
300
  - `scratch-org-operations.md` — list, display, resume, delete
301
301
  - `definition_file_options.md` — features, settings, and definition-file schema
302
302
  - `edition_types.md` — edition selection and the CLI-flag-vs-definition-file format distinction
303
- - `snapshot_usage.md` — using snapshots in definition files and post-snapshot workflow
303
+ - `dx-org-snapshot-manage` skill — create/check/list/delete a snapshot before referencing it here; this file only covers consuming an existing, `Active` snapshot via `--snapshot`/the `snapshot` definition-file field
@@ -132,4 +132,4 @@ sf org delete scratch --target-org <alias> --no-prompt --json
132
132
  AUTO MODE, STATE A/B, batch create, and definition-file authoring
133
133
  - `definition_file_options.md` — features, settings, and definition-file schema
134
134
  - `edition_types.md` — edition selection and the CLI-flag-vs-definition-file format distinction
135
- - `snapshot_usage.md` — using snapshots in definition files and post-snapshot workflow
135
+ - `dx-org-snapshot-manage` skill — create/check/list/delete a snapshot before referencing it here; this file only covers consuming an existing, `Active` snapshot via `--snapshot`/the `snapshot` definition-file field
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: dx-org-shape-manage
3
- description: "ALWAYS USE THIS SKILL to create, list, or delete org shapes. An org shape is a captured baseline configuration (features, limits, edition, and Metadata API settings) of a source org, without its data or metadata. Use when the user asks to create/make/take an org shape, capture or replicate an org's configuration/edition/limits, list/show/view existing org shapes (including INACTIVE/superseded ones) or their IDs and status, or delete/remove org shapes for a source org. Requires a source org with Dev Hub and Org Shape for Scratch Orgs enabled. DO NOT TRIGGER for creating snapshots or scratch orgs (use dx-org-manage)."
3
+ description: "ALWAYS USE THIS SKILL to create, list, or delete org shapes. An org shape is a captured baseline configuration (features, limits, edition, and Metadata API settings) of a source org, without its data or metadata. Use when the user asks to create/make/take an org shape, capture or replicate an org's configuration/edition/limits, list/show/view existing org shapes (including INACTIVE/superseded ones) or their IDs and status, or delete/remove org shapes for a source org. Requires a source org with Dev Hub and Org Shape for Scratch Orgs enabled. DO NOT TRIGGER for creating/checking/listing/deleting snapshots (use dx-org-snapshot-manage) or for creating scratch orgs (use dx-org-manage)."
4
4
  metadata:
5
5
  version: "1.0"
6
6
  domains: ["Developer Experience"]
@@ -33,7 +33,7 @@ Coordinates the full lifecycle of Salesforce org shapes — **create**, **list**
33
33
  ## Scope
34
34
 
35
35
  - **In scope**: Creating (`sf org create shape`), listing (`sf org list shape`), listing including inactive shapes for a specific source org (SOQL against `ShapeRepresentation`), and deleting (`sf org delete shape`) org shapes
36
- - **Out of scope**: Creating snapshots, creating scratch orgs (use `dx-org-manage`)
36
+ - **Out of scope**: Creating/checking/listing/deleting snapshots (use `dx-org-snapshot-manage`), creating scratch orgs (use `dx-org-manage`)
37
37
 
38
38
  ---
39
39
 
@@ -136,7 +136,8 @@ See the example files referenced below for full response structures.
136
136
 
137
137
  | Need | Delegate to |
138
138
  |------|-------------|
139
- | Create a scratch org, or create/use a snapshot | `dx-org-manage` skill |
139
+ | Create a scratch org, or create/use a snapshot to make one | `dx-org-manage` skill |
140
+ | Create, check status of, list, or delete a snapshot itself | `dx-org-snapshot-manage` skill |
140
141
 
141
142
  ---
142
143
 
@@ -21,3 +21,4 @@ Lower-frequency gotchas and toggle-write failure classes, split out of `SKILL.md
21
21
  | **Failure class — settings type invisible to Tooling/EntityDefinition but still MDAPI-writable** (e.g. Omnistudio Metadata, `OmniStudioSettings`, `fullName: OmniStudio`) | Metadata PUT write succeeds, but no GET/verify path exists via Tooling API — UI-confirmed only; if you encounter one of these, note it as write-succeeds-zero-verify-path rather than assuming failure |
22
22
  | **Failure class — type-level UPDATE block** (e.g. Timeline `TimelineSettings`, Video Calls `VideoCallsSettings`) | PUT returns HTTP 400 `UNSUPPORTED_OPERATION: "MetadataCrud does not support UPDATE on type: X"` — block is on the whole type, no `fullName` variant fixes it; manual UI only |
23
23
  | **Pattern — org preference API, not `IndustriesSettings`** (confirmed on Einstein Generative AI, `EinsteinGPTCopilotEnabled`) | Some toggles are Setup-Connect org preferences, not `IndustriesSettings` metadata fields — no `type`/`fullName`/`xmlRep`. Shape: `GET /services/data/v68.0/setup/org/preferences/<PrefName>` → `{"isPreferenceEnabled": bool}`; `PATCH` same path with `{"desiredState": true}` → response echoes post-write state. If a metadata PUT returns `FIELD_INTEGRITY_EXCEPTION: invalid at this location` for a plausible-looking element name, the field may not be on `IndustriesSettings` at all — try this org-preference path next before assuming manual-UI-only |
24
+ | **Failure class — write-enabled `dispatch` MCP tool not connected/loaded** | Fall back to the `sf api request rest` CLI (via Bash) for the exact same READ/WRITE/cold-VERIFY calls before giving up to manual Setup UI — confirmed working in the same run where other datasets hit this identical MCP gap. Never report a toggle's state as "assumed default" or "pending admin confirmation" without trying this fallback first |
@@ -11,7 +11,7 @@ metadata:
11
11
  - "design-systems-slds-validate"
12
12
  - "experience-lwc-generate"
13
13
  ---
14
- <!-- adk-managed-skill -->
14
+ <!-- a11y-expert-managed-skill -->
15
15
 
16
16
  # Web Component Accessibility
17
17
 
@@ -47,16 +47,19 @@ Key Review Criteria:
47
47
  4. Component Library Usage
48
48
 
49
49
  - Assume that well-known component libraries (e.g., Salesforce Lightning, Material UI, Chakra UI) are accessible out of the box when correctly implemented. Unless they are used specifically in conflict with WCAG, library-provided components can be ignored for this review, as they are implemented in an accessible way beneath the abstraction.
50
+ - Lightning base components (`lightning-input`, `lightning-combobox`, `lightning-textarea`, `lightning-icon`, and similar components) provide accessible labeling, ARIA, and error handling through dedicated attributes such as `label` and `alternative-text`. A `label` remains programmatic even with `variant="label-hidden"`; do not require a sibling or wrapper `<label>` to target the component. Navigation, button-icon, and other self-labeling base components likewise expose supplied label text as their accessible name and treat their internal icon as decorative. Do not report a missing association merely because that implementation is hidden inside the component.
51
+ - The same self-labeling logic applies to **imported or custom control components in any framework** (React/JSX, Angular, Vue, Web Components), not only Lightning. A capitalized or imported component tag (`<Input>`, `<TextField>`, `<Button>`, `<Select>`, `<Checkbox>`, `<SearchField>`, and design-system wrappers from Material UI, Chakra, Radix, or an internal library) is **not** a bare HTML element — assume it renders its own accessible label, ARIA, and error handling beneath the abstraction (see the component-library grounding rule). When such a component is given a labeling prop — `label`, `aria-label`, `aria-labelledby`, `title`, or visible child text/`children` — treat it as already programmatically labeled and do **not** flag it for a missing `<label>`, a missing `for`/`id` association, or a missing accessible name. Only flag when **no** labeling prop or text is supplied, or the supplied value is clearly empty or nonsensical. Do not demand a native `<label for>` for a component whose internal control you cannot see.
52
+ - Resolve dynamic `id` / `htmlFor` / `for` expressions before judging a label association. When a `<label htmlFor={X}>` (or `for={X}`) and its control's `id={X}` are bound to the **same expression** — the same variable, prop, `useId()` value, or template literal (e.g. both `htmlFor` and `id` set to the same interpolation such as `${id}-email`) — treat the association as **matching**, even though the literal string cannot be resolved at review time. A dynamic `id`/`htmlFor` pair is a mismatch only when the two expressions are demonstrably different. Do **not** flag identical dynamic `id`/`htmlFor` expressions as unmatched or mismatched labels.
50
53
 
51
- **Focus**: Provide actionable feedback to ensure the component meets the necessary WCAG accessibility requirements, avoiding extraneous feedback unrelated to the prompt's scope. Identify issues in code only if there is an immediate fix. You MUST conduct the review, and subsequently suggest the code fix that solves this issue.
54
+ 5. Source Interpretation
52
55
 
56
+ - Resolve expressions according to the framework's binding semantics before judging them. Trace a dynamic value to every source available in that context. In React/JSX, an expression may reference local variables, props, hook results, or imported bindings; Vue, Svelte, and Astro expose their own template or script scopes. In an LWC template specifically, `{someValue}` resolves to a field, property, or getter on the component class (`.js` or `.ts`), including `@api` properties; module-level imported constants are not directly bindable. In Aura markup, follow the expression's value provider, such as `v.` or `c.`, to the corresponding component attribute or controller logic. Do not conclude that a value is undefined, empty, or missing until you have inspected the applicable source. In a diff, verify which side contains the corrected code rather than assuming that the change introduced the problem.
53
57
 
58
+ **Focus**: Provide actionable feedback to ensure the component meets the necessary WCAG accessibility requirements, avoiding extraneous feedback unrelated to the prompt's scope. Identify issues in code only if there is an immediate fix. You MUST conduct the review, and subsequently suggest the code fix that solves this issue.
54
59
 
55
60
  ## Success Criteria Reviewers
56
61
 
57
- Identify which Success Criteria apply to the code under review, then open the reference files relevant to that code. Each reference is a
58
- self-contained reviewer with analysis framework, examples, and remediation
59
- guidance.
62
+ Identify which Success Criteria apply to the code under review, then open the reference files relevant to that code. Each reference supplies criterion-specific analysis, examples, and remediation guidance; the review-wide rules above continue to apply.
60
63
 
61
64
  ### Perceivable
62
65