@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.
- package/package.json +1 -1
- package/skills/agentforce-generate/SKILL.md +8 -0
- package/skills/agentforce-generate/references/actions-reference.md +2 -2
- package/skills/agentforce-generate/references/voice-modality-reference.md +51 -15
- package/skills/agentforce-generate/references/voice-telephony-cli.md +193 -0
- package/skills/agentforce-observe/SKILL.md +13 -9
- package/skills/agentforce-observe/references/ahm-alerts.md +193 -14
- package/skills/automation-sandbox-post-copy-config-generate/SKILL.md +24 -15
- package/skills/automation-sandbox-post-copy-config-generate/assets/config_template.json +11 -0
- package/skills/automation-sandbox-post-copy-config-generate/assets/json_schema.json +33 -1
- package/skills/automation-sandbox-post-copy-config-generate/references/configuration_catalog.md +32 -1
- package/skills/automation-sandbox-post-copy-configure/SKILL.md +75 -71
- package/skills/automation-sandbox-post-copy-configure/assets/scheduled_apex_template.apex +13 -0
- package/skills/automation-sandbox-post-copy-configure/examples/sample_scheduled_apex_config.json +13 -0
- package/skills/automation-sandbox-post-copy-configure/references/scheduled_apex_path.md +155 -0
- package/skills/automation-sandbox-post-copy-configure/scripts/build-scheduled-apex.mjs +62 -0
- package/skills/automation-sandbox-post-copy-configure/scripts/soql-escape-job-name.mjs +28 -0
- package/skills/consumer-goods-accruals-datakit-deploy/SKILL.md +383 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/setup.js +324 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/00-check-prerequisites.js +63 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/01-download-static-resource.js +100 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/02-replace-org-id.js +46 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/03-deploy-metadata.js +46 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/04-deploy-engine.js +198 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/05-deploy-tpm-accruals.js +231 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/06-create-dataspace.js +82 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/07-deploy-accruals-reports.js +517 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/08-deploy-ui.js +416 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/09-completion.js +44 -0
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/utils.js +514 -0
- package/skills/consumer-goods-sync-management-configure/SKILL.md +137 -0
- package/skills/consumer-goods-sync-management-configure/examples/scenarios.md +294 -0
- package/skills/consumer-goods-sync-management-configure/references/act1-setup-sync.md +333 -0
- package/skills/consumer-goods-sync-management-configure/references/act2-assign-users.md +324 -0
- package/skills/consumer-goods-sync-management-configure/references/act3-plan-verify.md +113 -0
- package/skills/consumer-goods-sync-management-configure/references/readiness-and-enablement.md +164 -0
- package/skills/consumer-goods-sync-management-configure/references/sync-management-app-install-backbone.md +159 -0
- package/skills/consumer-goods-sync-management-configure/references/transports-and-namespace.md +220 -0
- package/skills/consumer-goods-sync-management-configure/references/verify-and-smoke.md +175 -0
- package/skills/dx-org-analyze/README.md +310 -0
- package/skills/dx-org-analyze/SKILL.md +260 -0
- package/skills/dx-org-analyze/references/collection-details.md +88 -0
- package/skills/dx-org-analyze/references/report-format.md +67 -0
- package/skills/dx-org-analyze/scripts/collect_org_data.py +823 -0
- package/skills/dx-org-analyze/scripts/compute_diff.py +1101 -0
- package/skills/dx-org-analyze/scripts/introspect_org.py +400 -0
- package/skills/dx-org-analyze/tests/README.md +46 -0
- package/skills/dx-org-analyze/tests/fixtures/org_a.json +76 -0
- package/skills/dx-org-analyze/tests/fixtures/org_b.json +70 -0
- package/skills/dx-org-analyze/tests/test_compute_diff.sh +284 -0
- package/skills/dx-org-analyze/tests/test_consistency.sh +428 -0
- package/skills/dx-org-manage/SKILL.md +6 -50
- package/skills/dx-org-manage/examples/README.md +10 -16
- package/skills/dx-org-manage/references/scratch-org-create.md +1 -1
- package/skills/dx-org-manage/references/scratch-org-operations.md +1 -1
- package/skills/dx-org-shape-manage/SKILL.md +4 -3
- package/skills/education-cloud-domain-configure/references/gotchas-extended.md +1 -0
- package/skills/experience-accessibility-validate/SKILL.md +8 -5
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-1-1-non-text-content.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-i-lists.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-ii-tables.md +20 -85
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-iii-form-labels.md +4 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-iv-regions.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-1-v-groups.md +2 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-3-5-identify-input.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-1-4-3-contrast.md +4 -14
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-1-1-keyboard.md +9 -5
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-4-4-link-purpose.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-4-6-headings-labels.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-1-pointer-gestures.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-2-pointer-cancellation.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-3-label-in-name.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-2-5-7-dragging-movement.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-3-2-1-on-focus.md +0 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-3-2-2-on-input.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-3-3-1-error-identification.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-3-3-2-labels-instructions.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-3-3-3-error-suggestion.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-4-1-2-i-name.md +4 -5
- package/skills/experience-accessibility-validate/references/reviewers/sc-4-1-2-ii-role.md +1 -4
- package/skills/experience-accessibility-validate/references/reviewers/sc-4-1-2-iii-value.md +0 -4
- package/skills/experience-design-validate/SKILL.md +163 -0
- package/skills/experience-design-validate/references/ai.md +54 -0
- package/skills/experience-design-validate/references/components.md +61 -0
- package/skills/experience-design-validate/references/craft.md +158 -0
- package/skills/experience-design-validate/references/data.md +59 -0
- package/skills/experience-design-validate/references/forms-flows.md +57 -0
- package/skills/experience-design-validate/references/interaction.md +53 -0
- package/skills/experience-design-validate/references/navigation.md +51 -0
- package/skills/experience-design-validate/references/performance.md +56 -0
- package/skills/experience-design-validate/references/records.md +60 -0
- package/skills/experience-design-validate/references/responsive.md +48 -0
- package/skills/experience-design-validate/references/scoring-rubric.md +257 -0
- package/skills/experience-design-validate/references/state.md +53 -0
- package/skills/experience-design-validate/references/trust.md +47 -0
- package/skills/experience-design-validate/references/usability.md +35 -0
- package/skills/experience-design-validate/references/visual-system.md +183 -0
- package/skills/experience-lwc-accessibility-jest-run/SKILL.md +104 -25
- package/skills/experience-lwc-accessibility-jest-run/assets/jest.config.js +4 -0
- package/skills/experience-lwc-accessibility-jest-run/assets/sa11y-jest-setup.js +5 -0
- package/skills/experience-ui-bundle-app-coordinate/SKILL.md +5 -5
- package/skills/experience-ui-bundle-features-generate/SKILL.md +65 -36
- package/skills/experience-ui-bundle-features-generate/references/angular/features.md +74 -0
- package/skills/experience-ui-bundle-features-generate/references/react/features.md +59 -0
- package/skills/experience-ui-bundle-features-generate/scripts/detect-framework.sh +73 -0
- package/skills/experience-ui-bundle-frontend-generate/SKILL.md +2 -2
- package/skills/experience-ui-bundle-metadata-generate/SKILL.md +26 -14
- package/skills/experience-ui-bundle-metadata-generate/references/angular-metadata-generate.md +37 -0
- package/skills/experience-ui-bundle-metadata-generate/references/react-metadata-generate.md +32 -0
- package/skills/experience-ui-bundle-metadata-generate/scripts/detect-framework.sh +73 -0
- package/skills/experience-ui-bundle-metadata-generate/scripts/verify-bundle-location.sh +30 -8
- package/skills/field-service-data-capture-migrate/SKILL.md +391 -0
- package/skills/field-service-data-capture-migrate/assets/sample-legacy-flow.flow-meta.xml +163 -0
- package/skills/field-service-data-capture-migrate/references/architecture-notes.md +40 -0
- package/skills/field-service-data-capture-migrate/references/component-mapping.md +278 -0
- package/skills/field-service-data-capture-migrate/references/converter-builder-contract.md +183 -0
- package/skills/field-service-data-capture-migrate/references/dc-platform-rules.md +130 -0
- package/skills/field-service-data-capture-migrate/references/fsm-dc-capability-catalog.md +215 -0
- package/skills/field-service-data-capture-migrate/references/known-deploy-errors.md +36 -0
- package/skills/field-service-data-capture-migrate/references/migration-checklist.md +121 -0
- package/skills/field-service-data-capture-migrate/references/transformer-rules.md +132 -0
- package/skills/field-service-data-capture-migrate/scripts/analyze_flow.py +277 -0
- package/skills/field-service-data-capture-migrate/scripts/convert_to_dc_spec.py +1311 -0
- package/skills/field-service-data-capture-migrate/scripts/cud_analysis.py +402 -0
- package/skills/field-service-data-capture-migrate/scripts/deploy_flow.sh +230 -0
- package/skills/field-service-data-capture-migrate/scripts/discover_subflow_tree.py +230 -0
- package/skills/field-service-data-capture-migrate/scripts/flow_input.py +186 -0
- package/skills/field-service-data-capture-migrate/scripts/flow_xml_utils.py +39 -0
- package/skills/field-service-data-capture-migrate/scripts/fsm_dc_catalog.py +413 -0
- package/skills/field-service-data-capture-migrate/scripts/generate_summary.py +199 -0
- package/skills/field-service-data-capture-migrate/scripts/json_to_flow_xml.py +146 -0
- package/skills/field-service-data-capture-migrate/scripts/manual_review_flags.py +42 -0
- package/skills/field-service-data-capture-migrate/scripts/retrieve_flow_rest.sh +155 -0
- package/skills/field-service-data-capture-migrate/scripts/subflow_names.py +49 -0
- package/skills/field-service-data-capture-migrate/scripts/transform_flow.py +1661 -0
- package/skills/field-service-data-capture-migrate/scripts/validate_flow.sh +147 -0
- package/skills/field-service-data-capture-migrate/scripts/vendor/build_flow.py +1258 -0
- package/skills/life-sciences-fieldsalesrep-coordinate/SKILL.md +1 -1
- package/skills/life-sciences-fieldsalesrep-coordinate/references/orchestration-flow.md +1 -1
- package/skills/life-sciences-kam-coordinate/references/stage-5-data-and-plan-templates-overview.md +14 -1
- package/skills/mobile-apps-create/SKILL.md +1 -1
- package/skills/{platform-agentsetup-categories-fetch → platform-agenticsetup-categories-get}/SKILL.md +7 -7
- package/skills/platform-sandbox-configure/SKILL.md +108 -133
- package/skills/platform-sandbox-configure/references/api-response-shapes.md +39 -0
- package/skills/platform-sandbox-configure/references/definition-file-approach.md +73 -0
- package/skills/platform-widget-generate/SKILL.md +26 -18
- package/skills/platform-widget-generate/examples/formulas.json +191 -0
- package/skills/platform-widget-generate/references/widget-formulas.md +123 -0
- package/skills/platform-widget-generate/references/widget-meta-directives.md +4 -4
- package/skills/sales-call-scoring-configure/SKILL.md +318 -0
- package/skills/sales-call-scoring-configure/assets/best-practice-competencies.json +67 -0
- package/skills/sales-call-scoring-configure/assets/ootb-competencies.json +58 -0
- package/skills/sales-call-scoring-configure/references/admin-communication.md +79 -0
- package/skills/sales-call-scoring-configure/references/competency-crud.md +130 -0
- package/skills/sales-call-scoring-configure/scripts/create-competency.sh +166 -0
- package/skills/sales-call-scoring-configure/scripts/create-custom-competency.sh +166 -0
- package/skills/sales-call-scoring-configure/scripts/edit-competency.sh +185 -0
- package/skills/sales-call-scoring-configure/scripts/edit-custom-competency.sh +190 -0
- package/skills/sales-call-scoring-configure/scripts/enable-call-scoring.sh +436 -0
- package/skills/sales-call-scoring-configure/scripts/get-competency.sh +72 -0
- package/skills/sales-call-scoring-configure/scripts/get-custom-competency.sh +78 -0
- package/skills/sales-call-scoring-configure/scripts/install-best-practice-competencies.sh +223 -0
- package/skills/sales-call-scoring-configure/scripts/install-ootb-competencies.sh +237 -0
- package/skills/sales-call-scoring-configure/scripts/list-competencies.sh +99 -0
- package/skills/sales-call-scoring-configure/scripts/shared/auth.sh +116 -0
- package/skills/sales-call-scoring-configure/scripts/shared/cap.sh +86 -0
- package/skills/sales-call-scoring-configure/scripts/shared/soap.sh +267 -0
- package/skills/sales-call-scoring-configure/scripts/shared/soql.sh +25 -0
- package/skills/sales-call-scoring-configure/scripts/toggle-competency.sh +112 -0
- package/skills/sales-call-scoring-configure/scripts/toggle-custom-competency.sh +125 -0
- package/skills/sales-call-scoring-configure/scripts/verify-ootb-competencies.sh +116 -0
- package/skills/service-concierge-portal-generate/references/portal-deploy-runbook.md +1 -0
- package/skills/service-de-channel-activate/SKILL.md +6 -5
- package/skills/service-de-channel-create/SKILL.md +3 -3
- package/skills/service-de-channel-routing-configure/SKILL.md +3 -3
- package/skills/service-de-channel-settings-configure/SKILL.md +195 -0
- package/skills/service-de-channel-settings-configure/references/channel-settings-facets.md +152 -0
- package/skills/{service-de-channel-consent-configure → service-de-channel-settings-configure}/references/gotchas.md +3 -3
- package/skills/{service-de-channel-consent-configure → service-de-channel-settings-configure}/references/language-keywords.md +4 -4
- package/skills/{service-de-channel-consent-configure → service-de-channel-settings-configure}/references/worked-examples.md +14 -14
- package/skills/service-de-headless-channel-configure/SKILL.md +6 -6
- package/skills/service-de-headless-channel-configure/references/worked-examples.md +1 -1
- package/skills/service-helpagent-coordinate/SKILL.md +3 -2
- package/skills/service-helpagent-coordinate/references/channel-voice.md +15 -4
- package/skills/service-itsm-agentic-setup-agentforce-coordinate/SKILL.md +49 -31
- package/skills/service-itsm-agentic-setup-agentforce-coordinate/examples/output-templates.md +71 -6
- package/skills/service-itsm-agentic-setup-agentforce-coordinate/scripts/verify-child-verdict.mjs +26 -4
- package/skills/service-itsm-agentic-setup-cmdb-access-assign/SKILL.md +35 -10
- package/skills/service-itsm-agentic-setup-cmdb-access-assign/references/mcp-invocation.md +25 -5
- package/skills/service-itsm-agentic-setup-cmdb-bundle-deploy/SKILL.md +1 -1
- package/skills/service-itsm-agentic-setup-cmdb-configure/SKILL.md +5 -5
- package/skills/service-itsm-agentic-setup-cmdb-configure/references/mcp-invocation.md +1 -1
- package/skills/service-itsm-agentic-setup-cmdb-coordinate/SKILL.md +2 -2
- package/skills/service-itsm-agentic-setup-cmdb-coordinate/examples/output-templates.md +1 -1
- package/skills/service-itsm-agentic-setup-cmdb-discovery-configure/SKILL.md +25 -15
- package/skills/service-itsm-agentic-setup-employee-agent-configure/SKILL.md +8 -5
- package/skills/service-itsm-agentic-setup-employee-agent-configure/references/report-format.md +4 -2
- package/skills/service-itsm-agentic-setup-employee-agent-configure/references/workflow-detail.md +1 -1
- package/skills/service-itsm-agentic-setup-employee-agent-configure/scripts/render-report.mjs +29 -16
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/SKILL.md +8 -5
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/report-format.md +4 -2
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/references/workflow-detail.md +1 -1
- package/skills/service-itsm-agentic-setup-fulfiller-agent-configure/scripts/render-report.mjs +29 -16
- package/skills/service-itsm-agentic-setup-incident-management/SKILL.md +138 -68
- package/skills/service-itsm-agentic-setup-incident-management/examples/output-templates.md +31 -15
- package/skills/service-itsm-agentic-setup-incident-management/references/incident-persona-psg.md +156 -0
- package/skills/service-itsm-agentic-setup-incident-management/references/incident-preferences.md +148 -0
- package/skills/service-itsm-agentic-setup-incident-management/references/major-incident-management.md +162 -0
- package/skills/service-itsm-agentic-setup-incident-management/references/service-mgmt-privilege.md +149 -0
- package/skills/service-itsm-agentic-setup-incident-sla-configure/SKILL.md +103 -89
- package/skills/service-itsm-agentic-setup-incident-sla-configure/assets/attach-milestone.json +2 -2
- package/skills/service-itsm-agentic-setup-incident-sla-configure/assets/predefined-incident-policy.json +21 -39
- package/skills/service-itsm-agentic-setup-incident-sla-configure/examples/milestone-patterns.md +3 -3
- package/skills/service-itsm-agentic-setup-incident-sla-configure/examples/output-templates.md +18 -1
- package/skills/service-itsm-agentic-setup-incident-sla-configure/references/mcp-invocation.md +63 -37
- package/skills/service-omni-attribute-routing-configure/SKILL.md +53 -0
- package/skills/service-omni-attribute-routing-configure/references/api-notes.md +7 -0
- package/skills/service-omni-attribute-routing-configure/scripts/configure-and-report.sh +224 -0
- package/skills/service-omni-attribute-routing-configure/scripts/tests/test_attribute_routing_contracts.py +137 -0
- package/skills/service-omni-channel-inventory-analyze/SKILL.md +96 -0
- package/skills/service-omni-channel-inventory-analyze/references/api-notes.md +52 -0
- package/skills/service-omni-channel-inventory-analyze/scripts/analyze.sh +185 -0
- package/skills/service-omni-channel-inventory-analyze/scripts/tests/_bootstrap.py +84 -0
- package/skills/service-omni-channel-inventory-analyze/scripts/tests/test_inventory_analyze_contracts.py +141 -0
- package/skills/service-omni-channel-limits-analyze/SKILL.md +70 -0
- package/skills/service-omni-channel-limits-analyze/references/api-notes.md +22 -0
- package/skills/service-omni-channel-limits-analyze/scripts/analyze.sh +159 -0
- package/skills/service-omni-channel-limits-analyze/scripts/tests/_bootstrap.py +87 -0
- package/skills/service-omni-channel-limits-analyze/scripts/tests/test_limits_analyze_contracts.py +99 -0
- package/skills/service-omni-channel-setup-coordinate/SKILL.md +12 -20
- package/skills/service-omni-channel-setup-coordinate/scripts/integration-driver.sh +55 -5
- package/skills/service-omni-channel-setup-coordinate/scripts/tests/test_omni_contracts.py +38 -0
- package/skills/service-omni-command-center-analyze/SKILL.md +2 -2
- package/skills/service-omni-command-center-analyze/scripts/analyze.sh +3 -3
- package/skills/dx-org-manage/examples/snapshots/error_output.json +0 -9
- package/skills/dx-org-manage/examples/snapshots/success_output.json +0 -15
- package/skills/dx-org-manage/references/cli_flags.md +0 -67
- package/skills/dx-org-manage/references/creating-snapshot.md +0 -103
- package/skills/dx-org-manage/references/snapshot_usage.md +0 -74
- package/skills/experience-accessibility-validate/scripts/contrast-ratio.py +0 -153
- package/skills/experience-lwc-accessibility-jest-run/references/running-sa11y-jest-tests.md +0 -205
- package/skills/experience-ui-bundle-features-generate/scripts/verify-react-bundle.sh +0 -14
- /package/skills/experience-ui-bundle-features-generate/references/{conflict-resolution-schema.json → common/conflict-resolution-schema.json} +0 -0
- /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: "
|
|
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.
|
|
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
|
|
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
|
-
-
|
|
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
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
- `
|
|
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
|
-
- `
|
|
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
|
-
<!--
|
|
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
|
-
|
|
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
|
|
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
|
|