@salesforce/b2c-dx-mcp 3.2.1 → 3.4.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/bin/run.js +5 -9
- package/content/guidance/b2c/b2c-hooks/references/ORDER-HOOK-LIFECYCLE.md +1 -1
- package/content/guidance/b2c/b2c-onboarding/SKILL.md +4 -4
- package/content/guidance/b2c/b2c-ordering/SKILL.md +2 -2
- package/content/guidance/b2c/b2c-querying-data/SKILL.md +2 -2
- package/content/guidance/b2c/b2c-scapi-admin/SKILL.md +3 -3
- package/content/guidance/b2c/b2c-scapi-admin/references/CLIENT-EXAMPLES.md +4 -4
- package/content/guidance/b2c/b2c-scapi-shopper/SKILL.md +6 -6
- package/content/guidance/b2c/b2c-scapi-shopper/references/CLIENT-EXAMPLES.md +8 -9
- package/content/guidance/b2c-cli/b2c-cip/SKILL.md +3 -3
- package/content/guidance/b2c-cli/b2c-cip/references/SALES_ANALYSIS.md +1 -1
- package/content/guidance/b2c-cli/b2c-config/SKILL.md +54 -25
- package/content/guidance/b2c-cli/b2c-content/SKILL.md +1 -1
- package/content/guidance/b2c-cli/b2c-debug/SKILL.md +1 -1
- package/content/guidance/b2c-cli/b2c-docs/SKILL.md +23 -2
- package/content/guidance/b2c-cli/b2c-ecdn/SKILL.md +2 -0
- package/content/guidance/b2c-cli/b2c-ecdn/references/ADVANCED.md +1 -1
- package/content/guidance/b2c-cli/b2c-job/SKILL.md +9 -3
- package/content/guidance/b2c-cli/b2c-job/references/IMPORT.md +1 -1
- package/content/guidance/b2c-cli/b2c-job/references/RUN-AND-MONITOR.md +35 -6
- package/content/guidance/b2c-cli/b2c-metrics/SKILL.md +1 -1
- package/content/guidance/b2c-cli/b2c-mrt/SKILL.md +3 -3
- package/content/guidance/b2c-cli/b2c-scapi-custom/SKILL.md +1 -1
- package/content/guidance/b2c-cli/b2c-scapi-schemas/SKILL.md +6 -2
- package/content/guidance/b2c-cli/b2c-site-import-export/SKILL.md +1 -1
- package/content/guidance/b2c-cli/b2c-sites/SKILL.md +1 -1
- package/content/guidance/b2c-cli/b2c-slas/SKILL.md +1 -1
- package/content/guidance/b2c-ops/b2c-checkout-triage/SKILL.md +2 -2
- package/content/guidance/b2c-ops/b2c-edge-traffic-triage/SKILL.md +69 -0
- package/content/guidance/b2c-ops/b2c-job-health/SKILL.md +13 -8
- package/content/guidance/b2c-ops/b2c-order-failure-triage/SKILL.md +1 -1
- package/content/guidance/b2c-ops/b2c-order-failure-triage/references/order-evidence.md +2 -2
- package/content/guidance/b2c-ops/b2c-production-triage/SKILL.md +5 -4
- package/content/guidance/index.json +981 -259
- package/content/guidance/mcp/{cip → b2c-mcp-cip}/SKILL.md +10 -8
- package/content/guidance/mcp/{b2c-config → b2c-mcp-config}/SKILL.md +10 -9
- package/content/guidance/mcp/{debugger → b2c-mcp-debugger}/SKILL.md +9 -8
- package/content/guidance/mcp/b2c-mcp-scapi/SKILL.md +98 -0
- package/content/guidance/mcp/b2c-mcp-scapi/references/authentication.md +34 -0
- package/content/guidance/mcp/b2c-mcp-scapi/references/compose-verify.md +25 -0
- package/content/guidance/mcp/b2c-mcp-scapi/references/confirmation.md +30 -0
- package/content/guidance/mcp/b2c-mcp-scapi/references/discover.md +94 -0
- package/content/guidance/mcp/b2c-mcp-scapi/references/jobs.md +72 -0
- package/content/guidance/mcp/b2c-mcp-scapi/references/workflows.md +28 -0
- package/content/guidance/mcp/{server → b2c-mcp-server}/SKILL.md +52 -25
- package/content/guidance/storefront-next/sfnext-accessibility/SKILL.md +103 -0
- package/content/guidance/storefront-next/sfnext-accessibility/references/checklist.md +64 -0
- package/content/guidance/storefront-next/sfnext-analytics-consent/SKILL.md +91 -0
- package/content/guidance/storefront-next/sfnext-analytics-consent/references/CUSTOM-ADAPTER.md +49 -0
- package/content/guidance/storefront-next/sfnext-authentication/SKILL.md +86 -79
- package/content/guidance/storefront-next/sfnext-authentication/references/COOKIES.md +39 -0
- package/content/guidance/storefront-next/sfnext-authentication/references/LOGIN-FLOWS.md +59 -0
- package/content/guidance/storefront-next/sfnext-commerce-features/SKILL.md +67 -0
- package/content/guidance/storefront-next/sfnext-commerce-features/references/FEATURE-PREREQUISITES.md +37 -0
- package/content/guidance/storefront-next/sfnext-components/SKILL.md +98 -136
- package/content/guidance/storefront-next/sfnext-components/references/COMPONENT-AUTHORING.md +118 -0
- package/content/guidance/storefront-next/sfnext-components/references/SHAPE-TOKENS.md +51 -0
- package/content/guidance/storefront-next/sfnext-components/references/STORYBOOK.md +54 -0
- package/content/guidance/storefront-next/sfnext-components/references/TOKEN-SYSTEM.md +53 -0
- package/content/guidance/storefront-next/sfnext-components/references/TROUBLESHOOTING.md +19 -0
- package/content/guidance/storefront-next/sfnext-configuration/SKILL.md +116 -113
- package/content/guidance/storefront-next/sfnext-configuration/references/ENV-VARIABLES.md +55 -0
- package/content/guidance/storefront-next/sfnext-configuration/references/MULTI-SITE-URLS.md +137 -0
- package/content/guidance/storefront-next/sfnext-data-fetching/SKILL.md +100 -150
- package/content/guidance/storefront-next/sfnext-data-fetching/references/ACTIONS.md +53 -0
- package/content/guidance/storefront-next/sfnext-data-fetching/references/API-CLIENTS.md +34 -0
- package/content/guidance/storefront-next/sfnext-data-fetching/references/LOADERS.md +73 -0
- package/content/guidance/storefront-next/sfnext-data-fetching/references/SCAPI-FETCHER.md +23 -77
- package/content/guidance/storefront-next/sfnext-deployment/SKILL.md +83 -97
- package/content/guidance/storefront-next/sfnext-deployment/references/MRT-DEPLOYMENT.md +37 -68
- package/content/guidance/storefront-next/sfnext-extensions/SKILL.md +73 -97
- package/content/guidance/storefront-next/sfnext-extensions/references/ACTION-HOOKS.md +57 -0
- package/content/guidance/storefront-next/sfnext-extensions/references/BASE-AUDIT.md +47 -44
- package/content/guidance/storefront-next/sfnext-extensions/references/CLI-AND-INSTALL.md +58 -0
- package/content/guidance/storefront-next/sfnext-extensions/references/EXTENSION-EXAMPLES.md +49 -86
- package/content/guidance/storefront-next/sfnext-hybrid-storefronts/SKILL.md +59 -114
- package/content/guidance/storefront-next/sfnext-hybrid-storefronts/references/HYBRID-PROXY-CONFIG.md +53 -90
- package/content/guidance/storefront-next/sfnext-i18n/SKILL.md +96 -131
- package/content/guidance/storefront-next/sfnext-i18n/references/locale-config.md +35 -0
- package/content/guidance/storefront-next/sfnext-overview/SKILL.md +101 -0
- package/content/guidance/storefront-next/sfnext-page-designer/SKILL.md +152 -131
- package/content/guidance/storefront-next/sfnext-page-designer/references/BUSINESS-MANAGER.md +46 -0
- package/content/guidance/storefront-next/sfnext-page-designer/references/COMPONENT-REGISTRY.md +86 -53
- package/content/guidance/storefront-next/sfnext-page-designer/references/DECORATOR-PATTERNS.md +119 -131
- package/content/guidance/storefront-next/sfnext-page-designer/references/REVIEW-CHECKLIST.md +83 -0
- package/content/guidance/storefront-next/sfnext-page-designer/references/TROUBLESHOOTING.md +35 -0
- package/content/guidance/storefront-next/sfnext-performance/SKILL.md +75 -105
- package/content/guidance/storefront-next/sfnext-performance/references/PERFORMANCE-REVIEW-CHECKLIST.md +85 -0
- package/content/guidance/storefront-next/sfnext-performance/references/SUSPENSE-AND-STREAMING.md +58 -0
- package/content/guidance/storefront-next/sfnext-project-setup/SKILL.md +103 -116
- package/content/guidance/storefront-next/sfnext-project-setup/references/PROJECT-STRUCTURE.md +61 -99
- package/content/guidance/storefront-next/sfnext-project-setup/references/SCRIPTS.md +47 -0
- package/content/guidance/storefront-next/sfnext-project-setup/references/SFNEXT-CLI.md +63 -0
- package/content/guidance/storefront-next/sfnext-quality-gates/SKILL.md +70 -0
- package/content/guidance/storefront-next/sfnext-quality-gates/references/lint-and-budgets.md +39 -0
- package/content/guidance/storefront-next/sfnext-revalidation/SKILL.md +121 -0
- package/content/guidance/storefront-next/sfnext-revalidation/references/POLICIES-AND-TAGS.md +55 -0
- package/content/guidance/storefront-next/sfnext-routing/SKILL.md +86 -143
- package/content/guidance/storefront-next/sfnext-routing/references/ROUTE-CONVENTIONS.md +51 -51
- package/content/guidance/storefront-next/sfnext-routing/references/URLS-AND-SEO-ROUTES.md +22 -0
- package/content/guidance/storefront-next/sfnext-scapi/SKILL.md +126 -0
- package/content/guidance/storefront-next/sfnext-scapi/references/WORKED-EXAMPLE.md +39 -0
- package/content/guidance/storefront-next/sfnext-security/SKILL.md +129 -0
- package/content/guidance/storefront-next/sfnext-security/references/COOKIE-DOMAIN.md +39 -0
- package/content/guidance/storefront-next/sfnext-security/references/TURNSTILE.md +43 -0
- package/content/guidance/storefront-next/sfnext-seo/SKILL.md +95 -0
- package/content/guidance/storefront-next/sfnext-seo/references/MULTI-DOMAIN-BASE-PATH.md +17 -0
- package/content/guidance/storefront-next/sfnext-seo/references/SEO-ROUTES.md +31 -0
- package/content/guidance/storefront-next/sfnext-state-management/SKILL.md +80 -89
- package/content/guidance/storefront-next/sfnext-state-management/references/PATTERNS.md +45 -0
- package/content/guidance/storefront-next/sfnext-testing/SKILL.md +105 -138
- package/content/guidance/storefront-next/sfnext-testing/references/E2E.md +38 -0
- package/content/guidance/storefront-next/sfnext-testing/references/STORYBOOK-PATTERNS.md +73 -94
- package/content/guidance/storefront-next/sfnext-testing/references/UNIT-AND-ROUTE-TESTS.md +60 -0
- package/content/guidance/storefront-next/sfnext-theming/SKILL.md +104 -0
- package/content/guidance/storefront-next/sfnext-theming/references/REBRAND-CHECKLIST.md +29 -0
- package/dist/commands/mcp.d.ts +8 -2
- package/dist/commands/mcp.js +54 -20
- package/dist/guidance.d.ts +4 -1
- package/dist/guidance.js +23 -5
- package/dist/registry.d.ts +2 -1
- package/dist/registry.js +3 -3
- package/dist/server.d.ts +10 -0
- package/dist/server.js +21 -0
- package/dist/skill-references.js +5 -5
- package/dist/tools/cartridges/index.js +1 -0
- package/dist/tools/cip/index.js +6 -3
- package/dist/tools/diagnostics/debug-capture-at-breakpoint.js +1 -1
- package/dist/tools/diagnostics/debug-set-breakpoints.js +1 -1
- package/dist/tools/diagnostics/debug-start-session.js +1 -1
- package/dist/tools/docs/docs-read.js +4 -2
- package/dist/tools/docs/docs-search.js +10 -8
- package/dist/tools/docs/topics.d.ts +5 -0
- package/dist/tools/docs/topics.js +5 -0
- package/dist/tools/scapi/index.d.ts +4 -1
- package/dist/tools/scapi/index.js +4 -2
- package/dist/tools/scapi/scapi-code.d.ts +2 -2
- package/dist/tools/scapi/scapi-code.js +106 -81
- package/dist/tools/scapi/scapi-schemas-list.js +93 -56
- package/dist/utils/types.d.ts +6 -0
- package/node_modules/@salesforce/b2c-agent-plugins/CHANGELOG.md +32 -0
- package/node_modules/@salesforce/b2c-agent-plugins/README.md +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/.codex-plugin/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-hooks/references/ORDER-HOOK-LIFECYCLE.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-onboarding/SKILL.md +4 -4
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-ordering/SKILL.md +2 -2
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-querying-data/SKILL.md +2 -2
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-scapi-admin/SKILL.md +3 -3
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-scapi-admin/references/CLIENT-EXAMPLES.md +4 -4
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-scapi-shopper/SKILL.md +6 -6
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-scapi-shopper/references/CLIENT-EXAMPLES.md +8 -9
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/.codex-plugin/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-cip/SKILL.md +3 -3
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-cip/references/SALES_ANALYSIS.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-config/SKILL.md +54 -25
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-content/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-debug/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-docs/SKILL.md +23 -2
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-ecdn/SKILL.md +2 -0
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-ecdn/references/ADVANCED.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-job/SKILL.md +9 -3
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-job/references/IMPORT.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-job/references/RUN-AND-MONITOR.md +35 -6
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-metrics/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-mrt/SKILL.md +3 -3
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-scapi-custom/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-scapi-schemas/SKILL.md +6 -2
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-site-import-export/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-sites/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-slas/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/.codex-plugin/plugin.json +4 -3
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/README.md +1 -0
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/plugin.json +4 -3
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/skills/b2c-checkout-triage/SKILL.md +2 -2
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/skills/b2c-edge-traffic-triage/SKILL.md +69 -0
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/skills/b2c-job-health/SKILL.md +13 -8
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/skills/b2c-order-failure-triage/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/skills/b2c-order-failure-triage/references/order-evidence.md +2 -2
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/skills/b2c-production-triage/SKILL.md +5 -4
- package/node_modules/@salesforce/b2c-agent-plugins/figma-to-sfnext-pagedesigner/README.md +4 -4
- package/node_modules/@salesforce/b2c-agent-plugins/figma-to-sfnext-pagedesigner/skills/figma-to-sfnext-pagedesigner/SKILL.md +76 -73
- package/node_modules/@salesforce/b2c-agent-plugins/figma-to-sfnext-pagedesigner/skills/figma-to-sfnext-pagedesigner/evals/trigger-evals.json +12 -10
- package/node_modules/@salesforce/b2c-agent-plugins/figma-to-sfnext-pagedesigner/skills/figma-to-sfnext-pagedesigner/references/PAGE-DESIGNER-SFN.md +49 -74
- package/node_modules/@salesforce/b2c-agent-plugins/package.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/.codex-plugin/plugin.json +9 -6
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/README.md +43 -22
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/plugin.json +9 -6
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-accessibility/SKILL.md +103 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-accessibility/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-accessibility/references/checklist.md +64 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-analytics-consent/SKILL.md +91 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-analytics-consent/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-analytics-consent/references/CUSTOM-ADAPTER.md +49 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-authentication/SKILL.md +86 -79
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-authentication/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-authentication/references/COOKIES.md +39 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-authentication/references/LOGIN-FLOWS.md +59 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-commerce-features/SKILL.md +67 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-commerce-features/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-commerce-features/references/FEATURE-PREREQUISITES.md +37 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/SKILL.md +98 -136
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/references/COMPONENT-AUTHORING.md +118 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/references/SHAPE-TOKENS.md +51 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/references/STORYBOOK.md +54 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/references/TOKEN-SYSTEM.md +53 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/references/TROUBLESHOOTING.md +19 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-configuration/SKILL.md +116 -113
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-configuration/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-configuration/references/ENV-VARIABLES.md +55 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-configuration/references/MULTI-SITE-URLS.md +137 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/SKILL.md +100 -150
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/references/ACTIONS.md +53 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/references/API-CLIENTS.md +34 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/references/LOADERS.md +73 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/references/SCAPI-FETCHER.md +23 -77
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-deployment/SKILL.md +83 -97
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-deployment/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-deployment/references/MRT-DEPLOYMENT.md +37 -68
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-extensions/SKILL.md +73 -97
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-extensions/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-extensions/references/ACTION-HOOKS.md +57 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-extensions/references/BASE-AUDIT.md +47 -44
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-extensions/references/CLI-AND-INSTALL.md +58 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-extensions/references/EXTENSION-EXAMPLES.md +49 -86
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-hybrid-storefronts/SKILL.md +59 -114
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-hybrid-storefronts/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-hybrid-storefronts/references/HYBRID-PROXY-CONFIG.md +53 -90
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-i18n/SKILL.md +96 -131
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-i18n/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-i18n/references/locale-config.md +35 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-overview/SKILL.md +101 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-overview/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/SKILL.md +152 -131
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/references/BUSINESS-MANAGER.md +46 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/references/COMPONENT-REGISTRY.md +86 -53
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/references/DECORATOR-PATTERNS.md +119 -131
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/references/REVIEW-CHECKLIST.md +83 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/references/TROUBLESHOOTING.md +35 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-performance/SKILL.md +75 -105
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-performance/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-performance/references/PERFORMANCE-REVIEW-CHECKLIST.md +85 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-performance/references/SUSPENSE-AND-STREAMING.md +58 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-project-setup/SKILL.md +103 -116
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-project-setup/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-project-setup/references/PROJECT-STRUCTURE.md +61 -99
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-project-setup/references/SCRIPTS.md +47 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-project-setup/references/SFNEXT-CLI.md +63 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-quality-gates/SKILL.md +70 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-quality-gates/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-quality-gates/references/lint-and-budgets.md +39 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-revalidation/SKILL.md +121 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-revalidation/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-revalidation/references/POLICIES-AND-TAGS.md +55 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-routing/SKILL.md +86 -143
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-routing/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-routing/references/ROUTE-CONVENTIONS.md +51 -51
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-routing/references/URLS-AND-SEO-ROUTES.md +22 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-scapi/SKILL.md +126 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-scapi/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-scapi/references/WORKED-EXAMPLE.md +39 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-security/SKILL.md +129 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-security/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-security/references/COOKIE-DOMAIN.md +39 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-security/references/TURNSTILE.md +43 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-seo/SKILL.md +95 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-seo/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-seo/references/MULTI-DOMAIN-BASE-PATH.md +17 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-seo/references/SEO-ROUTES.md +31 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-state-management/SKILL.md +80 -89
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-state-management/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-state-management/references/PATTERNS.md +45 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-testing/SKILL.md +105 -138
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-testing/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-testing/references/E2E.md +38 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-testing/references/STORYBOOK-PATTERNS.md +73 -94
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-testing/references/UNIT-AND-ROUTE-TESTS.md +60 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-theming/SKILL.md +104 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-theming/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-theming/references/REBRAND-CHECKLIST.md +29 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next-figma/skills/sfnext-create-figma-kit/SKILL.md +3 -3
- package/oclif.manifest.json +21 -4
- package/package.json +4 -4
- package/content/guidance/mcp/scapi/SKILL.md +0 -203
- package/content/guidance/mcp/scapi/references/jobs.md +0 -30
- package/content/guidance/storefront-next/sfnext-create-component/SKILL.md +0 -195
- package/content/guidance/storefront-next/sfnext-create-component/references/COMPONENT-AUTHORING.md +0 -206
- package/content/guidance/storefront-next/sfnext-create-component/references/PROJECT-STRUCTURE.md +0 -43
- package/content/guidance/storefront-next/sfnext-create-component/references/TOKEN-SYSTEM.md +0 -130
- package/content/guidance/storefront-next/sfnext-create-component/references/TROUBLESHOOTING.md +0 -34
- package/content/guidance/storefront-next/sfnext-create-vertical/SKILL.md +0 -135
- package/content/guidance/storefront-next/sfnext-create-vertical/references/COMPONENT-AUTHORING.md +0 -206
- package/content/guidance/storefront-next/sfnext-create-vertical/references/PROJECT-STRUCTURE.md +0 -43
- package/content/guidance/storefront-next/sfnext-create-vertical/references/TOKEN-SYSTEM.md +0 -130
- package/content/guidance/storefront-next/sfnext-create-vertical/references/TROUBLESHOOTING.md +0 -34
- package/content/guidance/storefront-next/sfnext-custom-apis/SKILL.md +0 -221
- package/content/guidance/storefront-next/sfnext-custom-apis/references/WORKFLOW-EXAMPLES.md +0 -294
- package/content/guidance/storefront-next/sfnext-data-fetching/references/LOADER-PATTERNS.md +0 -102
- package/content/guidance/storefront-next/sfnext-project-setup/references/ENV-VARIABLES.md +0 -82
- package/content/guidance/storefront-next/sfnext-scapi-management/SKILL.md +0 -203
- package/content/guidance/storefront-next/sfnext-scapi-management/references/CLI-COMMANDS.md +0 -122
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-component/SKILL.md +0 -195
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-component/evals/trigger-evals.json +0 -12
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-component/references/COMPONENT-AUTHORING.md +0 -206
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-component/references/PROJECT-STRUCTURE.md +0 -43
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-component/references/TOKEN-SYSTEM.md +0 -130
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-component/references/TROUBLESHOOTING.md +0 -34
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-vertical/SKILL.md +0 -135
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-vertical/evals/trigger-evals.json +0 -12
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-vertical/references/COMPONENT-AUTHORING.md +0 -206
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-vertical/references/PROJECT-STRUCTURE.md +0 -43
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-vertical/references/TOKEN-SYSTEM.md +0 -130
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-vertical/references/TROUBLESHOOTING.md +0 -34
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-custom-apis/SKILL.md +0 -221
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-custom-apis/evals/trigger-evals.json +0 -12
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-custom-apis/references/WORKFLOW-EXAMPLES.md +0 -294
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/references/LOADER-PATTERNS.md +0 -102
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-project-setup/references/ENV-VARIABLES.md +0 -82
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-scapi-management/SKILL.md +0 -203
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-scapi-management/evals/trigger-evals.json +0 -12
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-scapi-management/references/CLI-COMMANDS.md +0 -122
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/custom-apis.md +0 -0
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/custom-properties.md +0 -0
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/products.md +0 -0
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/promotions.md +0 -0
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/saving.md +0 -0
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/snippets.md +0 -0
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/tokens.md +0 -0
- /package/content/guidance/mcp/{server → b2c-mcp-server}/references/files.md +0 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sfnext-theming
|
|
3
|
+
description: >-
|
|
4
|
+
Re-brand and re-skin a Storefront Next storefront: change the color palette, corner radius and shadows (shape tokens), header and footer colors, typography and web fonts, logo, favicon, hero scrims, and brand copy, with WCAG contrast checks. Use when asked to rebrand or restyle the storefront, change the primary color, swap the font, make the header dark, make cards rounded or flat, replace the logo, edit src/theme, core.css, header.css, brand.css, tailwind.css, base.css, or src/lib/fonts.ts, or verify a theme change in the Design System Storybook stories. Do not use for building or styling an individual component (use `storefront-next:sfnext-components`), Figma kit sync (use `storefront-next-figma:sfnext-create-figma-kit`), or site configuration (use `storefront-next:sfnext-configuration`).
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Theming a Storefront Next Storefront
|
|
8
|
+
|
|
9
|
+
Your storefront has exactly one theme, in `src/theme/`, and it is yours to edit. Rebranding is mostly value changes in a few CSS files; components pick the new look up through token classes. Choose a starting look with `sfnext create-storefront --vertical <id>` (a starter theme) and then customize it as below.
|
|
10
|
+
|
|
11
|
+
## Where things live
|
|
12
|
+
|
|
13
|
+
| Concern | File |
|
|
14
|
+
|---|---|
|
|
15
|
+
| Entry point and Tailwind `@source` scoping | `src/theme/index.css` (imports `shared.css`, which sets import order) |
|
|
16
|
+
| Palette: background, foreground, primary, secondary, accent, muted, border, ring, destructive/success/warning/info | `src/theme/tokens/core.css` |
|
|
17
|
+
| Shape: `--ui-radius`, `--ui-shadow`, `--ui-border-width` | `src/theme/tokens/core.css` |
|
|
18
|
+
| Header, menu, footer, newsletter band, `--header-logo-filter` | `src/theme/tokens/header.css` |
|
|
19
|
+
| Status and feedback colors | `src/theme/tokens/status.css` |
|
|
20
|
+
| Swatches, sidebar, agentic UI, payment and cart extras, focus helpers | `tokens/swatch.css`, `sidebar.css`, `agentic.css`, `components.css`, `custom.css` |
|
|
21
|
+
| `--brand-*` color primitives and hero scrims (`--hero-overlay-*`, `--hero-scrim`) | `src/theme/tokens/brand.css` |
|
|
22
|
+
| Font stacks `--font-sans/-serif/-mono`; token-to-utility bridge | `src/theme/tailwind.css` (`@theme inline`) |
|
|
23
|
+
| `@font-face`, base layer, `.section-container`, section-scoped shape rules | `src/theme/base.css` |
|
|
24
|
+
| Component-level CSS (navigation, cart sheet, toasts, store locator) | `src/theme/overrides/*.css` |
|
|
25
|
+
| Font binding and preload | `public/fonts/*.woff2`, `src/lib/fonts.ts` (used by `src/root.tsx`) |
|
|
26
|
+
| Logo, favicon, hero and payment images | `public/images/`, `public/favicon.ico` |
|
|
27
|
+
| Site name and brand strings | `src/locales/<locale>/translations.json` (`common.defaultSiteName`) |
|
|
28
|
+
|
|
29
|
+
Palette values are not all derived from `brand.css`: `core.css` sets `--primary` and friends directly, so change them there. Token-to-class wiring and the full token file list are covered in `storefront-next:sfnext-components` (token system reference).
|
|
30
|
+
|
|
31
|
+
## Workflow
|
|
32
|
+
|
|
33
|
+
### 1. Read the current theme
|
|
34
|
+
|
|
35
|
+
Open `src/theme/index.css`, `tokens/core.css`, `tokens/header.css`, and `tailwind.css` before editing. Keep variable names; change values.
|
|
36
|
+
|
|
37
|
+
### 2. Palette
|
|
38
|
+
|
|
39
|
+
Edit `:root` in `tokens/core.css`: `--primary`/`--primary-foreground`, `--background`/`--foreground`, `--secondary`, `--accent`, `--muted`, borders, `--ring`. Comments in the file record WCAG contrast ratios for the current values; recompute for yours. Minimums: 4.5:1 for text (`--primary` on `--primary-foreground`, `--foreground` on `--background`, each status color on its `-foreground`), 3:1 for borders and focus rings against the surface.
|
|
40
|
+
|
|
41
|
+
Update `tokens/status.css` if semantic colors clash with the new palette, and `tokens/swatch.css`, `tokens/components.css` where defaults look off.
|
|
42
|
+
|
|
43
|
+
### 3. Header, footer, and newsletter chrome
|
|
44
|
+
|
|
45
|
+
`tokens/header.css` is deliberately decoupled from `--primary`, so changing the primary color does not recolor the header. Set `--header-background`/`--header-foreground`, menu hover/active colors, and `--footer-*` yourself. The logo is an image: for a dark header with a dark logo, set `--header-logo-filter` (for example `brightness(0) invert(1)` turns a black logo white; `none` leaves it alone). `--newsletter-background` defaults to `var(--primary)`.
|
|
46
|
+
|
|
47
|
+
### 4. Shape
|
|
48
|
+
|
|
49
|
+
Set `--ui-radius`, `--ui-shadow`, `--ui-border-width` in `core.css` to re-skin every shadcn primitive at once. Flat and square: `0`, `none`, `0`. Soft and raised: `var(--radius-xl)`, a light shadow, `0`. Do not edit primitives or add `rounded-*`/`shadow-*` classes, and never write `--radius-ui` / `--shadow-ui` (compile-time bridges, silent no-op). Scoped overrides, section rules, and the Card border exception are covered in `storefront-next:sfnext-components` (shape tokens reference). If your default border width is 0, the section rules at the bottom of `base.css` re-enable 1px Card borders on account, auth, and checkout pages; adjust those to taste.
|
|
50
|
+
|
|
51
|
+
### 5. Typography
|
|
52
|
+
|
|
53
|
+
Four touch points, all must agree:
|
|
54
|
+
|
|
55
|
+
1. Put the variable `.woff2` in `public/fonts/`.
|
|
56
|
+
2. `src/lib/fonts.ts`: `import font from '/fonts/<file>.woff2'; export const primaryFont = font;` (`root.tsx` preloads it).
|
|
57
|
+
3. `@font-face` in `src/theme/base.css` (same URL, weight range, `font-display: swap`).
|
|
58
|
+
4. `--font-sans` / `--font-serif` / `--font-mono` in `src/theme/tailwind.css`, with a fallback stack of similar metrics.
|
|
59
|
+
|
|
60
|
+
Self-host fonts (WOFF2, preloaded, no third-party CDN). Remove the old font file if unused.
|
|
61
|
+
|
|
62
|
+
### 6. Assets and copy
|
|
63
|
+
|
|
64
|
+
- Logo: replace `public/images/logo.svg` (the `Logo` component in `src/components/logo` renders it; you can replace that component for an inline-SVG logo).
|
|
65
|
+
- Favicon: `public/favicon.ico`.
|
|
66
|
+
- Hero and promo images: `public/images/` (and the Page Designer content that references them).
|
|
67
|
+
- Brand name: `common.defaultSiteName` in each `src/locales/<locale>/translations.json` you ship (used in page titles).
|
|
68
|
+
- Hero text scrims: `--brand-black`/`--brand-white` in `brand.css` feed `--hero-overlay-dark/-light` and `--hero-scrim`; update them with the brand so hero text stays legible.
|
|
69
|
+
|
|
70
|
+
### 7. Dark mode
|
|
71
|
+
|
|
72
|
+
The shipped theme has one palette and no `.dark` token block. Do not promise dark mode; it would be new work (a `.dark` scope for every token file).
|
|
73
|
+
|
|
74
|
+
### 8. Verify
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
pnpm dev # look at home, PLP, PDP, cart, checkout, account
|
|
78
|
+
pnpm storybook # Design System/Theme/Colors, Typography, Radius, Shadows
|
|
79
|
+
pnpm lint # color-linter flags hard-coded colors
|
|
80
|
+
pnpm typecheck
|
|
81
|
+
pnpm storybook:test --type=snapshot # add --update only after reviewing intended changes
|
|
82
|
+
pnpm storybook:test --type=a11y # contrast and ARIA via axe-core
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
The `Design System/Theme/*` stories (`src/design-system/stories/`) render the live tokens and are the quickest visual check.
|
|
86
|
+
|
|
87
|
+
## Guardrails
|
|
88
|
+
|
|
89
|
+
- Change values in token files; do not sprinkle hex codes or `bg-[#...]` in components.
|
|
90
|
+
- Need a new token? Define it in a `tokens/*.css` file and bridge it in `@theme inline` in `tailwind.css` (see TOKEN-SYSTEM).
|
|
91
|
+
- Component-level CSS goes in `src/theme/overrides/*.css` (import it from `shared.css`) or `base.css`; prefer `[data-slot="..."]` selectors over utility-class selectors.
|
|
92
|
+
|
|
93
|
+
## Design handoff
|
|
94
|
+
|
|
95
|
+
If your designers work in Figma, keep the Figma variables and code tokens aligned with `storefront-next-figma:sfnext-create-figma-kit` (requires the Figma MCP server). Change the tokens in code first, then sync the kit.
|
|
96
|
+
|
|
97
|
+
## Related Skills
|
|
98
|
+
|
|
99
|
+
- `storefront-next:sfnext-components` - Build and style components with token classes and shape tokens
|
|
100
|
+
- `storefront-next:sfnext-accessibility` - Contrast, focus, and accessibility scans
|
|
101
|
+
- `storefront-next:sfnext-i18n` - Locale files that hold brand copy
|
|
102
|
+
- `storefront-next:sfnext-performance` - Font and image loading guidance
|
|
103
|
+
- `storefront-next:sfnext-page-designer` - Content and hero components authored in Page Designer
|
|
104
|
+
- `storefront-next-figma:sfnext-create-figma-kit` - Sync the Figma design kit with your tokens
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Rebrand Checklist
|
|
2
|
+
|
|
3
|
+
Work top to bottom; each item names the file to touch.
|
|
4
|
+
|
|
5
|
+
- [ ] `src/theme/tokens/core.css`: `--primary`, `--primary-foreground`, `--background`, `--foreground`, `--secondary`, `--accent`, `--muted`, `--border`, `--input`, `--ring`
|
|
6
|
+
- [ ] `src/theme/tokens/core.css`: contrast re-checked (text 4.5:1, borders and focus rings 3:1); update the ratio comments
|
|
7
|
+
- [ ] `src/theme/tokens/core.css`: `--ui-radius`, `--ui-shadow`, `--ui-border-width`
|
|
8
|
+
- [ ] `src/theme/base.css`: section-scoped Card border rules still match the chosen border width
|
|
9
|
+
- [ ] `src/theme/tokens/header.css`: header, menu, footer, newsletter colors; `--header-logo-filter`
|
|
10
|
+
- [ ] `src/theme/tokens/status.css`: status colors still readable against the new surfaces
|
|
11
|
+
- [ ] `src/theme/tokens/brand.css`: `--brand-*` primitives and hero scrims
|
|
12
|
+
- [ ] `src/theme/tokens/swatch.css`, `components.css`: swatch and badge defaults
|
|
13
|
+
- [ ] Font: `public/fonts/`, `src/lib/fonts.ts`, `@font-face` in `src/theme/base.css`, `--font-*` in `src/theme/tailwind.css`
|
|
14
|
+
- [ ] `public/images/logo.svg`, `public/favicon.ico`, hero images
|
|
15
|
+
- [ ] `common.defaultSiteName` in `src/locales/*/translations.json`
|
|
16
|
+
- [ ] Page Designer content referencing old imagery or colors
|
|
17
|
+
- [ ] `pnpm lint`, `pnpm typecheck`, `pnpm storybook:test --type=snapshot`, `--type=a11y`
|
|
18
|
+
- [ ] Visual pass: home, PLP, PDP, cart, checkout, account, error pages
|
|
19
|
+
|
|
20
|
+
## Common mistakes
|
|
21
|
+
|
|
22
|
+
| Mistake | Result |
|
|
23
|
+
|---|---|
|
|
24
|
+
| Editing only `brand.css` | Little changes; the palette is in `core.css` |
|
|
25
|
+
| Writing `--radius-ui` or `--shadow-ui` | Silent no-op; use `--ui-radius` / `--ui-shadow` |
|
|
26
|
+
| Changing the font file but not `base.css` `@font-face` | Old font still loads or fallback shows |
|
|
27
|
+
| Forgetting `--header-logo-filter` after a header color change | Logo unreadable |
|
|
28
|
+
| Hard-coding hex in components | `pnpm lint` fails (`custom/color-linter`) and the theme no longer controls it |
|
|
29
|
+
| Changing `--primary` and expecting the header to follow | Header tokens are independent; edit `header.css` |
|
package/dist/commands/mcp.d.ts
CHANGED
|
@@ -24,6 +24,7 @@ export default class McpServerCommand extends BaseCommand<typeof McpServerComman
|
|
|
24
24
|
toolsets: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
25
25
|
tools: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
26
26
|
'docs-topics': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
27
|
+
'scapi-schemas': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
27
28
|
server: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
28
29
|
'webdav-server': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
29
30
|
'code-version': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
@@ -53,6 +54,7 @@ export default class McpServerCommand extends BaseCommand<typeof McpServerComman
|
|
|
53
54
|
lang: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
54
55
|
config: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
55
56
|
instance: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
57
|
+
'dotenv-file': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
56
58
|
'project-directory': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
57
59
|
'extra-query': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
58
60
|
'extra-body': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
@@ -87,8 +89,10 @@ export default class McpServerCommand extends BaseCommand<typeof McpServerComman
|
|
|
87
89
|
* 1. Per-call configPath
|
|
88
90
|
* 2. Startup --config / SFCC_CONFIG
|
|
89
91
|
* 3. SFCC_CONFIG from the selected project's .env
|
|
90
|
-
* 4. dw.json in the selected project directory
|
|
91
|
-
*
|
|
92
|
+
* 4. dw.json in the selected project directory, plus the shared default
|
|
93
|
+
* dw.json from the tooling settings
|
|
94
|
+
*
|
|
95
|
+
* An explicit path (1-3) is used on its own; an empty one selects no dw.json.
|
|
92
96
|
*
|
|
93
97
|
* Values are then merged through the normal CLI resolver, including
|
|
94
98
|
* environment, plugin, dw.json, ~/.mobify, and package.json sources.
|
|
@@ -131,6 +135,8 @@ export default class McpServerCommand extends BaseCommand<typeof McpServerComman
|
|
|
131
135
|
* These can be exposed to Services if needed for features like telemetry or caching.
|
|
132
136
|
*/
|
|
133
137
|
run(): Promise<void>;
|
|
138
|
+
/** Load --scapi-schemas once at startup; relative paths resolve from the project directory. */
|
|
139
|
+
private loadLocalScapiSchemas;
|
|
134
140
|
/** Parse a project's .env without mutating the long-lived MCP process environment. */
|
|
135
141
|
private loadProjectEnvironment;
|
|
136
142
|
}
|
package/dist/commands/mcp.js
CHANGED
|
@@ -135,6 +135,7 @@ import { Flags } from '@oclif/core';
|
|
|
135
135
|
import { BaseCommand, MrtCommand, InstanceCommand, loadConfig, extractInstanceFlags, extractMrtFlags, } from '@salesforce/b2c-tooling-sdk/cli';
|
|
136
136
|
import { serveStdio } from '@modelcontextprotocol/server/stdio';
|
|
137
137
|
import { EnvSource, readProjectEnvironment } from '@salesforce/b2c-tooling-sdk/config';
|
|
138
|
+
import { isRemoteScapiSchema, loadScapiSchemaOverrides, } from '@salesforce/b2c-tooling-sdk/scapi';
|
|
138
139
|
import { B2CDxMcpServer } from '../server.js';
|
|
139
140
|
import { Services } from '../services.js';
|
|
140
141
|
import { ServerContext } from '../server-context.js';
|
|
@@ -199,11 +200,17 @@ export default class McpServerCommand extends BaseCommand {
|
|
|
199
200
|
}),
|
|
200
201
|
'docs-topics': Flags.string({
|
|
201
202
|
description: 'Limit the documentation exposed by the docs tools to these categories (comma-separated allowlist). ' +
|
|
202
|
-
'Options: script-api, job-step, commerce-api, pwa-kit-managed-runtime, sfnext, sfra, b2c-commerce, ocapi, tooling, ' +
|
|
203
|
+
'Options: script-api, job-step, commerce-api, pwa-kit-managed-runtime, sfnext, sfra, b2c-commerce, commerce-solutions, ocapi, tooling, ' +
|
|
203
204
|
'help-admin, help-merchant, help-kb. ' +
|
|
204
205
|
'Bounds the whole docs corpus; per-call category/storefront narrow within it. Unknown names are ignored.',
|
|
205
206
|
env: 'SFCC_DOCS_TOPICS',
|
|
206
207
|
}),
|
|
208
|
+
'scapi-schemas': Flags.string({
|
|
209
|
+
description: 'Local SCAPI OpenAPI contracts for scapi_search and scapi_execute (comma-separated JSON files, directories or http(s) URLs). ' +
|
|
210
|
+
'Each replaces the bundled or live contract with the same family/name/version from servers[0].url, or adds an API. ' +
|
|
211
|
+
'Developer option for beta and pre-release APIs. Overrides the project config scapi-schemas (dw.json or project .env).',
|
|
212
|
+
env: 'SFCC_SCAPI_SCHEMAS',
|
|
213
|
+
}),
|
|
207
214
|
};
|
|
208
215
|
/** Signal that triggered shutdown (if any) - used to exit process after finally() */
|
|
209
216
|
shutdownSignal;
|
|
@@ -240,8 +247,10 @@ export default class McpServerCommand extends BaseCommand {
|
|
|
240
247
|
* 1. Per-call configPath
|
|
241
248
|
* 2. Startup --config / SFCC_CONFIG
|
|
242
249
|
* 3. SFCC_CONFIG from the selected project's .env
|
|
243
|
-
* 4. dw.json in the selected project directory
|
|
244
|
-
*
|
|
250
|
+
* 4. dw.json in the selected project directory, plus the shared default
|
|
251
|
+
* dw.json from the tooling settings
|
|
252
|
+
*
|
|
253
|
+
* An explicit path (1-3) is used on its own; an empty one selects no dw.json.
|
|
245
254
|
*
|
|
246
255
|
* Values are then merged through the normal CLI resolver, including
|
|
247
256
|
* environment, plugin, dw.json, ~/.mobify, and package.json sources.
|
|
@@ -256,15 +265,18 @@ export default class McpServerCommand extends BaseCommand {
|
|
|
256
265
|
? path.resolve(effectiveProjectDirectory ?? process.cwd(), projectContext.configPath)
|
|
257
266
|
: undefined) ??
|
|
258
267
|
baseOptions.configPath ??
|
|
259
|
-
|
|
268
|
+
// An empty SFCC_CONFIG selects no dw.json, as in the CLI.
|
|
269
|
+
(projectConfigPath
|
|
260
270
|
? path.isAbsolute(projectConfigPath)
|
|
261
271
|
? projectConfigPath
|
|
262
272
|
: path.resolve(effectiveProjectDirectory, projectConfigPath)
|
|
263
|
-
:
|
|
273
|
+
: projectConfigPath);
|
|
264
274
|
const options = {
|
|
265
275
|
...baseOptions,
|
|
266
276
|
...mrt.options,
|
|
267
277
|
configPath,
|
|
278
|
+
// The selected project's .env supplies Storefront Next fallbacks below dw.json.
|
|
279
|
+
envFile: projectEnvironment ? path.join(effectiveProjectDirectory, '.env') : baseOptions.envFile,
|
|
268
280
|
instance: projectContext?.instanceName ?? baseOptions.instance,
|
|
269
281
|
projectDirectory: effectiveProjectDirectory,
|
|
270
282
|
workingDirectory: effectiveProjectDirectory,
|
|
@@ -301,20 +313,20 @@ export default class McpServerCommand extends BaseCommand {
|
|
|
301
313
|
source: 'argument',
|
|
302
314
|
};
|
|
303
315
|
}
|
|
304
|
-
else if (baseOptions.configPath) {
|
|
305
|
-
primaryConfiguration = { path: path.resolve(baseOptions.configPath), source: 'server' };
|
|
316
|
+
else if (baseOptions.configPath !== undefined) {
|
|
317
|
+
primaryConfiguration = { path: baseOptions.configPath && path.resolve(baseOptions.configPath), source: 'server' };
|
|
318
|
+
}
|
|
319
|
+
else if (projectConfigPath === undefined) {
|
|
320
|
+
primaryConfiguration = { path: path.join(effectiveProjectDirectory, 'dw.json'), source: 'projectDirectory' };
|
|
306
321
|
}
|
|
307
|
-
else
|
|
322
|
+
else {
|
|
308
323
|
primaryConfiguration = {
|
|
309
|
-
path: path.isAbsolute(projectConfigPath)
|
|
310
|
-
? projectConfigPath
|
|
311
|
-
:
|
|
324
|
+
path: projectConfigPath && !path.isAbsolute(projectConfigPath)
|
|
325
|
+
? path.resolve(effectiveProjectDirectory, projectConfigPath)
|
|
326
|
+
: projectConfigPath,
|
|
312
327
|
source: 'projectEnvironment',
|
|
313
328
|
};
|
|
314
329
|
}
|
|
315
|
-
else {
|
|
316
|
-
primaryConfiguration = { path: path.join(effectiveProjectDirectory, 'dw.json'), source: 'projectDirectory' };
|
|
317
|
-
}
|
|
318
330
|
return Services.fromResolvedConfig(config, projectEnvironment, {
|
|
319
331
|
projectDirectory: {
|
|
320
332
|
path: effectiveProjectDirectory,
|
|
@@ -359,13 +371,14 @@ export default class McpServerCommand extends BaseCommand {
|
|
|
359
371
|
const startupFlags = {
|
|
360
372
|
toolsets: this.flags.toolsets ? this.flags.toolsets.split(',').map((s) => s.trim()) : undefined,
|
|
361
373
|
tools: this.flags.tools ? this.flags.tools.split(',').map((s) => s.trim()) : undefined,
|
|
362
|
-
configPath: this.
|
|
374
|
+
configPath: this.getConfigPathFlag(),
|
|
363
375
|
// Default project directory for tool calls. oclif handles the environment fallback.
|
|
364
376
|
projectDirectory: this.flags['project-directory'],
|
|
365
377
|
// Docs topic allowlist (bounds the docs corpus at startup). Flag first
|
|
366
378
|
// (--docs-topics / SFCC_DOCS_TOPICS), else config `docsCategories`
|
|
367
379
|
// (dw.json `docs-categories`, SFCC_DOCS_CATEGORIES, package.json).
|
|
368
380
|
docsTopics: this.flags['docs-topics'] ?? this.resolvedConfig?.values.docsCategories?.join(','),
|
|
381
|
+
scapiSchemas: await this.loadLocalScapiSchemas(),
|
|
369
382
|
};
|
|
370
383
|
// Add toolsets to telemetry attributes
|
|
371
384
|
if (this.telemetry && startupFlags.toolsets) {
|
|
@@ -393,11 +406,11 @@ export default class McpServerCommand extends BaseCommand {
|
|
|
393
406
|
'resources/read': { ttlMs: 300_000, cacheScope: 'private' },
|
|
394
407
|
},
|
|
395
408
|
instructions: 'Discover tool schemas before calling. Prefer dedicated tools; otherwise scapi_search/scapi_execute for Commerce APIs. ' +
|
|
396
|
-
'
|
|
397
|
-
'SCAPI: first read skill://mcp/scapi/SKILL.md. ' +
|
|
398
|
-
'Analytics: cip_discover/cip_query; skill://mcp/cip/SKILL.md. ' +
|
|
399
|
-
'
|
|
400
|
-
'setup
|
|
409
|
+
'Skills: load them through your client when it lists them; otherwise read skill:// URIs as MCP resources or with skills_read({uri: "<URI>"}). ' +
|
|
410
|
+
'SCAPI: first read skill://mcp/b2c-mcp-scapi/SKILL.md. ' +
|
|
411
|
+
'Analytics: cip_discover/cip_query; skill://mcp/b2c-mcp-cip/SKILL.md. ' +
|
|
412
|
+
'Config, auth and deploy prerequisites skill://mcp/b2c-mcp-config/SKILL.md; debugging skill://mcp/b2c-mcp-debugger/SKILL.md; ' +
|
|
413
|
+
'skill index, setup and tool choice skill://mcp/b2c-mcp-server/SKILL.md; full catalog skill://index (b2c-ops runbooks for operations and incidents).',
|
|
401
414
|
});
|
|
402
415
|
activeServer = server;
|
|
403
416
|
await registerToolsets(startupFlags, server, loadServices, context);
|
|
@@ -433,6 +446,27 @@ export default class McpServerCommand extends BaseCommand {
|
|
|
433
446
|
});
|
|
434
447
|
this.logger.info({ version: this.config.version }, 'MCP Server running on stdio');
|
|
435
448
|
}
|
|
449
|
+
/** Load --scapi-schemas once at startup; relative paths resolve from the project directory. */
|
|
450
|
+
async loadLocalScapiSchemas() {
|
|
451
|
+
const value = this.flags['scapi-schemas'];
|
|
452
|
+
if (!value)
|
|
453
|
+
return undefined;
|
|
454
|
+
const base = this.flags['project-directory'] ?? process.cwd();
|
|
455
|
+
const paths = value
|
|
456
|
+
.split(',')
|
|
457
|
+
.map((entry) => entry.trim())
|
|
458
|
+
.filter(Boolean)
|
|
459
|
+
.map((entry) => (isRemoteScapiSchema(entry) ? entry : path.resolve(base, entry)));
|
|
460
|
+
let documents;
|
|
461
|
+
try {
|
|
462
|
+
documents = await loadScapiSchemaOverrides(paths);
|
|
463
|
+
}
|
|
464
|
+
catch (error) {
|
|
465
|
+
this.error(error instanceof Error ? error.message : String(error));
|
|
466
|
+
}
|
|
467
|
+
this.logger.info({ scapiSchemas: documents.map((document) => document.entry.id) }, `Using ${documents.length} local SCAPI contract(s)`);
|
|
468
|
+
return documents;
|
|
469
|
+
}
|
|
436
470
|
/** Parse a project's .env without mutating the long-lived MCP process environment. */
|
|
437
471
|
loadProjectEnvironment(projectDirectory) {
|
|
438
472
|
if (!projectDirectory)
|
package/dist/guidance.d.ts
CHANGED
|
@@ -2,5 +2,8 @@ import type { B2CDxMcpServer } from './server.js';
|
|
|
2
2
|
import type { McpTool } from './utils/types.js';
|
|
3
3
|
/** Read-only guidance does not load instance configuration or credentials. */
|
|
4
4
|
export declare function createGuidanceTool(): McpTool;
|
|
5
|
-
/**
|
|
5
|
+
/**
|
|
6
|
+
* Advertise an index and featured skills; the template reads the entire available catalog.
|
|
7
|
+
* Also serves the MCP skills extension (skills/list, skills/get) over the same catalog.
|
|
8
|
+
*/
|
|
6
9
|
export declare function registerGuidanceResources(server: B2CDxMcpServer, includeSharedSkills?: boolean): void;
|
package/dist/guidance.js
CHANGED
|
@@ -121,7 +121,16 @@ export function createGuidanceTool() {
|
|
|
121
121
|
},
|
|
122
122
|
};
|
|
123
123
|
}
|
|
124
|
-
|
|
124
|
+
function protocolError(error) {
|
|
125
|
+
const detail = error instanceof GuidanceError
|
|
126
|
+
? error
|
|
127
|
+
: new GuidanceError('SKILLS_UNAVAILABLE', 'Packaged skills are unavailable.');
|
|
128
|
+
return new ProtocolError(ProtocolErrorCode.InvalidParams, detail.message, { code: detail.code });
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Advertise an index and featured skills; the template reads the entire available catalog.
|
|
132
|
+
* Also serves the MCP skills extension (skills/list, skills/get) over the same catalog.
|
|
133
|
+
*/
|
|
125
134
|
export function registerGuidanceResources(server, includeSharedSkills = true) {
|
|
126
135
|
const catalog = catalogLoader(includeSharedSkills ? undefined : ['mcp'])();
|
|
127
136
|
const read = async (uri) => {
|
|
@@ -129,10 +138,7 @@ export function registerGuidanceResources(server, includeSharedSkills = true) {
|
|
|
129
138
|
return { contents: [{ uri, mimeType: 'text/markdown', text: catalog.readResource(uri) }] };
|
|
130
139
|
}
|
|
131
140
|
catch (error) {
|
|
132
|
-
|
|
133
|
-
? error
|
|
134
|
-
: new GuidanceError('SKILLS_UNAVAILABLE', 'Packaged skills are unavailable.');
|
|
135
|
-
throw new ProtocolError(ProtocolErrorCode.InvalidParams, detail.message, { code: detail.code });
|
|
141
|
+
throw protocolError(error);
|
|
136
142
|
}
|
|
137
143
|
};
|
|
138
144
|
server.registerResource('skill-index', GUIDANCE_INDEX_URI, {
|
|
@@ -151,5 +157,17 @@ export function registerGuidanceResources(server, includeSharedSkills = true) {
|
|
|
151
157
|
mimeType: 'text/markdown',
|
|
152
158
|
}, async (uri) => read(uri.toString()));
|
|
153
159
|
server.addResourceReader('skill://', read);
|
|
160
|
+
// Lists the featured MCP skills; skills/get answers for every served skill.
|
|
161
|
+
server.addSkillsExtension({
|
|
162
|
+
list: () => catalog.skills(),
|
|
163
|
+
get(uri) {
|
|
164
|
+
try {
|
|
165
|
+
return catalog.skill(uri);
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
throw protocolError(error);
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
});
|
|
154
172
|
}
|
|
155
173
|
//# sourceMappingURL=guidance.js.map
|
package/dist/registry.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ProjectType } from '@salesforce/b2c-tooling-sdk/discovery';
|
|
2
|
+
import type { ScapiSchemaDocument } from '@salesforce/b2c-tooling-sdk/scapi';
|
|
2
3
|
import { type DocCategory } from '@salesforce/b2c-tooling-sdk/docs';
|
|
3
4
|
import type { McpTool, Toolset, StartupFlags } from './utils/index.js';
|
|
4
5
|
import type { B2CDxMcpServer } from './server.js';
|
|
@@ -17,6 +18,6 @@ export type ToolRegistry = Record<Toolset, McpTool[]>;
|
|
|
17
18
|
* @param loadServices - Function that loads configuration and returns Services instance
|
|
18
19
|
* @returns Complete tool registry
|
|
19
20
|
*/
|
|
20
|
-
export declare function createToolRegistry(loadServices: ServicesLoader, serverContext?: ServerContext, detectedWorkspaces?: readonly ProjectType[], enabledDocCategories?: readonly DocCategory[]): ToolRegistry;
|
|
21
|
+
export declare function createToolRegistry(loadServices: ServicesLoader, serverContext?: ServerContext, detectedWorkspaces?: readonly ProjectType[], enabledDocCategories?: readonly DocCategory[], scapiSchemas?: readonly ScapiSchemaDocument[]): ToolRegistry;
|
|
21
22
|
/** Register all toolsets by default, or only explicitly selected toolsets/tools. */
|
|
22
23
|
export declare function registerToolsets(flags: StartupFlags, server: B2CDxMcpServer, loadServices: ServicesLoader, serverContext?: ServerContext): Promise<void>;
|
package/dist/registry.js
CHANGED
|
@@ -22,7 +22,7 @@ import { createGuidanceTool, registerGuidanceResources } from './guidance.js';
|
|
|
22
22
|
* @param loadServices - Function that loads configuration and returns Services instance
|
|
23
23
|
* @returns Complete tool registry
|
|
24
24
|
*/
|
|
25
|
-
export function createToolRegistry(loadServices, serverContext, detectedWorkspaces = [], enabledDocCategories) {
|
|
25
|
+
export function createToolRegistry(loadServices, serverContext, detectedWorkspaces = [], enabledDocCategories, scapiSchemas) {
|
|
26
26
|
const registry = {
|
|
27
27
|
CARTRIDGES: [],
|
|
28
28
|
DIAGNOSTICS: [],
|
|
@@ -40,7 +40,7 @@ export function createToolRegistry(loadServices, serverContext, detectedWorkspac
|
|
|
40
40
|
...createDiagnosticsTools(loadServices, serverContext),
|
|
41
41
|
...createDocsTools(loadServices, { detectedWorkspaces, enabledCategories: enabledDocCategories }),
|
|
42
42
|
...createMrtTools(loadServices),
|
|
43
|
-
...createScapiTools(loadServices, serverContext?.scapiExecutions),
|
|
43
|
+
...createScapiTools(loadServices, serverContext?.scapiExecutions, scapiSchemas),
|
|
44
44
|
createGuidanceTool(),
|
|
45
45
|
];
|
|
46
46
|
// Organize tools by their declared toolsets (supports multi-toolset)
|
|
@@ -70,7 +70,7 @@ export async function registerToolsets(flags, server, loadServices, serverContex
|
|
|
70
70
|
logger.info({ docsTopics: enabledDocCategories }, `Documentation restricted to topics: ${enabledDocCategories.join(', ')}`);
|
|
71
71
|
}
|
|
72
72
|
// Tool availability is independent of the workspace. Explicit selection customizes the default catalog.
|
|
73
|
-
const toolRegistry = createToolRegistry(loadServices, serverContext, [], enabledDocCategories);
|
|
73
|
+
const toolRegistry = createToolRegistry(loadServices, serverContext, [], enabledDocCategories, flags.scapiSchemas);
|
|
74
74
|
const existingToolNames = new Set(Object.values(toolRegistry)
|
|
75
75
|
.flat()
|
|
76
76
|
.map((tool) => tool.name));
|
package/dist/server.d.ts
CHANGED
|
@@ -3,6 +3,8 @@ import type { CallToolResult, Implementation, ReadResourceResult, ToolAnnotation
|
|
|
3
3
|
import { type ZodRawShape } from 'zod';
|
|
4
4
|
import type { Telemetry } from '@salesforce/b2c-tooling-sdk/telemetry';
|
|
5
5
|
import type { McpToolConfig, ToolContext } from './utils/types.js';
|
|
6
|
+
/** MCP skills extension identifier (SEP-2640). */
|
|
7
|
+
export declare const SKILLS_EXTENSION = "io.modelcontextprotocol/skills";
|
|
6
8
|
/**
|
|
7
9
|
* Extended server options.
|
|
8
10
|
*/
|
|
@@ -35,6 +37,14 @@ export declare class B2CDxMcpServer extends McpServer {
|
|
|
35
37
|
constructor(serverInfo: Implementation, options?: B2CDxMcpServerOptions);
|
|
36
38
|
/** Register after resource metadata. Resolve raw URIs before URL dot-segment normalization. */
|
|
37
39
|
addResourceReader(prefix: string, read: (uri: string) => Promise<ReadResourceResult>): void;
|
|
40
|
+
/**
|
|
41
|
+
* Serve the MCP skills extension (SEP-2640): `skills/list` and `skills/get`.
|
|
42
|
+
* Register before connecting. `get` throws a ProtocolError for unknown skills.
|
|
43
|
+
*/
|
|
44
|
+
addSkillsExtension(skills: {
|
|
45
|
+
list: () => unknown[];
|
|
46
|
+
get: (uri: string) => unknown;
|
|
47
|
+
}): void;
|
|
38
48
|
/**
|
|
39
49
|
* Register a tool with the server.
|
|
40
50
|
*
|
package/dist/server.js
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
import { McpServer, ProtocolError, ProtocolErrorCode, CLIENT_INFO_META_KEY, PROTOCOL_VERSION_META_KEY, CLIENT_CAPABILITIES_META_KEY, } from '@modelcontextprotocol/server';
|
|
7
7
|
import { z } from 'zod';
|
|
8
8
|
import { getLogger } from '@salesforce/b2c-tooling-sdk/logging';
|
|
9
|
+
/** MCP skills extension identifier (SEP-2640). */
|
|
10
|
+
export const SKILLS_EXTENSION = 'io.modelcontextprotocol/skills';
|
|
9
11
|
/**
|
|
10
12
|
* A server implementation that extends the base MCP server.
|
|
11
13
|
*
|
|
@@ -57,6 +59,25 @@ export class B2CDxMcpServer extends McpServer {
|
|
|
57
59
|
throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Resource URI is not available.');
|
|
58
60
|
});
|
|
59
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Serve the MCP skills extension (SEP-2640): `skills/list` and `skills/get`.
|
|
64
|
+
* Register before connecting. `get` throws a ProtocolError for unknown skills.
|
|
65
|
+
*/
|
|
66
|
+
addSkillsExtension(skills) {
|
|
67
|
+
this.server.registerCapabilities({ extensions: { [SKILLS_EXTENSION]: {} } });
|
|
68
|
+
this.server.setRequestHandler('skills/list', { params: z.object({ cursor: z.string().optional() }).loose().optional() }, async (params, context) => {
|
|
69
|
+
this.logRequestClient(context);
|
|
70
|
+
// One page: an issued cursor never exists, so any cursor is invalid.
|
|
71
|
+
if (params?.cursor !== undefined)
|
|
72
|
+
throw new ProtocolError(ProtocolErrorCode.InvalidParams, 'Invalid cursor.');
|
|
73
|
+
const modern = Boolean(context.mcpReq?.envelope?.[PROTOCOL_VERSION_META_KEY]);
|
|
74
|
+
return { skills: skills.list(), ...(modern && { ttlMs: 300_000, cacheScope: 'private' }) };
|
|
75
|
+
});
|
|
76
|
+
this.server.setRequestHandler('skills/get', { params: z.object({ uri: z.string() }).loose() }, async (params, context) => {
|
|
77
|
+
this.logRequestClient(context);
|
|
78
|
+
return { skill: skills.get(params.uri) };
|
|
79
|
+
});
|
|
80
|
+
}
|
|
60
81
|
/**
|
|
61
82
|
* Register a tool with the server.
|
|
62
83
|
*
|
package/dist/skill-references.js
CHANGED
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
*/
|
|
6
6
|
/** Targets must resolve through resources even when skills_read is not selected. */
|
|
7
7
|
export const MCP_SKILL_REFERENCES = {
|
|
8
|
-
configSources: { uri: 'skill://mcp/b2c-config/SKILL.md', section: 'where-configuration-comes-from' },
|
|
9
|
-
debuggerPrerequisites: { uri: 'skill://mcp/debugger/SKILL.md', section: 'prerequisites' },
|
|
10
|
-
debuggerRecovery: { uri: 'skill://mcp/debugger/SKILL.md', section: 'recovery' },
|
|
11
|
-
scapiAuthentication: { uri: 'skill://mcp/scapi/SKILL.md', section: 'authentication' },
|
|
12
|
-
cipAccess: { uri: 'skill://mcp/cip/SKILL.md', section: 'configuration-and-access' },
|
|
8
|
+
configSources: { uri: 'skill://mcp/b2c-mcp-config/SKILL.md', section: 'where-configuration-comes-from' },
|
|
9
|
+
debuggerPrerequisites: { uri: 'skill://mcp/b2c-mcp-debugger/SKILL.md', section: 'prerequisites' },
|
|
10
|
+
debuggerRecovery: { uri: 'skill://mcp/b2c-mcp-debugger/SKILL.md', section: 'recovery' },
|
|
11
|
+
scapiAuthentication: { uri: 'skill://mcp/b2c-mcp-scapi/SKILL.md', section: 'authentication' },
|
|
12
|
+
cipAccess: { uri: 'skill://mcp/b2c-mcp-cip/SKILL.md', section: 'configuration-and-access' },
|
|
13
13
|
};
|
|
14
14
|
//# sourceMappingURL=skill-references.js.map
|
|
@@ -40,6 +40,7 @@ function createCartridgeDeployTool(loadServices, injections) {
|
|
|
40
40
|
idempotent: false,
|
|
41
41
|
openWorld: true,
|
|
42
42
|
description: 'Find and deploy cartridges or selected files to B2C Commerce via WebDAV; overwrites matching remote files. ' +
|
|
43
|
+
'Prerequisites (instance, credentials, code version): skill://mcp/b2c-mcp-config/SKILL.md. ' +
|
|
43
44
|
"After deployment, add new cartridges to the site's cartridge path in Business Manager: Sites → Manage Sites → Settings tab → Cartridges.",
|
|
44
45
|
toolsets: ['CARTRIDGES'],
|
|
45
46
|
requiresInstance: true,
|
package/dist/tools/cip/index.js
CHANGED
|
@@ -10,6 +10,7 @@ import { createProjectContextInputSchema } from '../project-context.js';
|
|
|
10
10
|
import { MCP_SKILL_REFERENCES } from '../../skill-references.js';
|
|
11
11
|
import { resolveCipClient } from './client.js';
|
|
12
12
|
const MAX_OUTPUT_BYTES = 24_000;
|
|
13
|
+
const CIP_SKILL_REQUIRED = 'CIP_SKILL_REQUIRED: Read skill://mcp/b2c-mcp-cip/SKILL.md through resources or skills_read, then retry with skillRead: true.';
|
|
13
14
|
const params = z
|
|
14
15
|
.record(z.string(), z.string())
|
|
15
16
|
.optional()
|
|
@@ -68,7 +69,9 @@ export function createCipTools(loadServices, dependencies) {
|
|
|
68
69
|
};
|
|
69
70
|
const execution = {
|
|
70
71
|
...connection,
|
|
71
|
-
skillRead: z
|
|
72
|
+
skillRead: z
|
|
73
|
+
.literal(true, { error: CIP_SKILL_REQUIRED })
|
|
74
|
+
.describe('Required. Set true only after reading skill://mcp/b2c-mcp-cip/SKILL.md (MCP resource, or skills_read({uri})).'),
|
|
72
75
|
report: z.string().min(1).max(100).optional().describe('Curated report name; supply report or sql.'),
|
|
73
76
|
params,
|
|
74
77
|
sql: z
|
|
@@ -157,7 +160,7 @@ export function createCipTools(loadServices, dependencies) {
|
|
|
157
160
|
idempotent: true,
|
|
158
161
|
openWorld: true,
|
|
159
162
|
toolsets: ['CIP'],
|
|
160
|
-
description: 'Query CIP analytics using a curated report or SQL. Read skill://mcp/cip/SKILL.md first. Returns bounded rows; filter/group in SQL. Warehouse data is not live SCAPI state.',
|
|
163
|
+
description: 'Query CIP analytics using a curated report or SQL. Read skill://mcp/b2c-mcp-cip/SKILL.md first. Returns bounded rows; filter/group in SQL. Warehouse data is not live SCAPI state.',
|
|
161
164
|
inputSchema: execution,
|
|
162
165
|
async handler(args, context) {
|
|
163
166
|
let resolution;
|
|
@@ -165,7 +168,7 @@ export function createCipTools(loadServices, dependencies) {
|
|
|
165
168
|
try {
|
|
166
169
|
const input = z.object(execution).strict().parse(args);
|
|
167
170
|
if (input.skillRead !== true)
|
|
168
|
-
throw new Error(
|
|
171
|
+
throw new Error(CIP_SKILL_REQUIRED);
|
|
169
172
|
if (Number(Boolean(input.report)) + Number(Boolean(input.sql)) !== 1)
|
|
170
173
|
throw new Error('Supply exactly one of report or sql.');
|
|
171
174
|
if (input.sql && input.params)
|
|
@@ -18,7 +18,7 @@ export function createDebugCaptureAtBreakpointTool(loadServices, serverContext)
|
|
|
18
18
|
openWorld: true,
|
|
19
19
|
description: 'Add a breakpoint and wait for a halt; return stack, variables, and evaluations. ' +
|
|
20
20
|
'Trigger a GET here or an external request concurrently. Capture does not resume by default. ' +
|
|
21
|
-
'Workflow: skill://mcp/debugger/SKILL.md.',
|
|
21
|
+
'Workflow: skill://mcp/b2c-mcp-debugger/SKILL.md.',
|
|
22
22
|
toolsets: ['CARTRIDGES', 'DIAGNOSTICS', 'SCAPI'],
|
|
23
23
|
inputSchema: {
|
|
24
24
|
session_id: z.string(),
|
|
@@ -15,7 +15,7 @@ export function createDebugSetBreakpointsTool(loadServices, serverContext) {
|
|
|
15
15
|
idempotent: true,
|
|
16
16
|
openWorld: true,
|
|
17
17
|
description: 'Replace all session breakpoints. verified means local source mapping, not deployed-code validation. ' +
|
|
18
|
-
'Workflow: skill://mcp/debugger/SKILL.md.',
|
|
18
|
+
'Workflow: skill://mcp/b2c-mcp-debugger/SKILL.md.',
|
|
19
19
|
toolsets: ['CARTRIDGES', 'DIAGNOSTICS', 'SCAPI'],
|
|
20
20
|
inputSchema: {
|
|
21
21
|
session_id: z.string(),
|
|
@@ -16,7 +16,7 @@ export function createDebugStartSessionTool(loadServices, serverContext) {
|
|
|
16
16
|
idempotent: false,
|
|
17
17
|
openWorld: true,
|
|
18
18
|
description: 'Start a script debugger session and map cartridges; replaces any remote debugger client. Requires BM Basic Auth with WebDAV_Manage_Customization. ' +
|
|
19
|
-
'Use returned session_id; end with debug_end_session. Workflow: skill://mcp/debugger/SKILL.md.',
|
|
19
|
+
'Use returned session_id; end with debug_end_session. Workflow: skill://mcp/b2c-mcp-debugger/SKILL.md.',
|
|
20
20
|
toolsets: ['CARTRIDGES', 'DIAGNOSTICS', 'SCAPI'],
|
|
21
21
|
inputSchema: {
|
|
22
22
|
cartridgeDirectory: z
|
|
@@ -7,7 +7,7 @@ import { TOOLSETS } from '../../utils/constants.js';
|
|
|
7
7
|
import { z } from 'zod';
|
|
8
8
|
import { readDocByQuery } from '@salesforce/b2c-tooling-sdk/docs';
|
|
9
9
|
import { createToolAdapter, errorResult, jsonResult } from '../adapter.js';
|
|
10
|
-
import { enabledCategoriesNote } from './topics.js';
|
|
10
|
+
import { DOCS_CITATION_NOTE, enabledCategoriesNote } from './topics.js';
|
|
11
11
|
import { workspaceInputSchema, resolveProjectWorkspace } from './storefront.js';
|
|
12
12
|
/** Default maximum characters of content returned per read call, to bound the inline payload. */
|
|
13
13
|
const DEFAULT_MAX_LENGTH = 12_000;
|
|
@@ -18,7 +18,8 @@ export function createDocsReadTool(loadServices, enabledCategories, detectedWork
|
|
|
18
18
|
idempotent: true,
|
|
19
19
|
openWorld: true,
|
|
20
20
|
description: 'Read a B2C Commerce (SFCC/Demandware) Script API reference, job step, developer guide, admin/merchant help article, or tooling doc by ID or fuzzy query. ' +
|
|
21
|
-
'Use docs_search to find IDs.' +
|
|
21
|
+
'Use docs_search to find IDs. ' +
|
|
22
|
+
'Cite by entry.url (sourceUrl for Markdown); never show doc IDs.' +
|
|
22
23
|
enabledCategoriesNote(enabledCategories),
|
|
23
24
|
toolsets: [...TOOLSETS],
|
|
24
25
|
inputSchema: {
|
|
@@ -56,6 +57,7 @@ export function createDocsReadTool(loadServices, enabledCategories, detectedWork
|
|
|
56
57
|
const end = offset + slice.length;
|
|
57
58
|
const truncated = end < totalLength;
|
|
58
59
|
return {
|
|
60
|
+
citation: DOCS_CITATION_NOTE,
|
|
59
61
|
entry: found.entry,
|
|
60
62
|
content: slice,
|
|
61
63
|
totalLength,
|