diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 1629aa7..8535e81 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -11,7 +11,7 @@ "name": "shopify-plugin", "source": "./", "description": "Search Shopify docs, generate and validate GraphQL, Liquid, and UI extension code", - "version": "1.1.0", + "version": "1.2.0", "author": { "name": "Shopify" }, "license": "MIT", "homepage": "https://github.com/Shopify/Shopify-AI-Toolkit", diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 22a439f..fcb5593 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "shopify-plugin", "description": "Shopify developer tools for Claude Code — search Shopify docs, generate and validate GraphQL, Liquid, and UI extension code", - "version": "1.1.0", + "version": "1.2.0", "author": { "name": "Shopify" }, "license": "MIT", "keywords": ["shopify", "mcp", "graphql", "liquid", "storefront", "admin-api"] diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index db84df5..98234cc 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "shopify-plugin", - "version": "1.1.0", + "version": "1.2.0", "description": "Shopify developer tools for OpenAI Codex — search Shopify docs, generate and validate GraphQL, Liquid, and UI extension code", "author": { "name": "Shopify" }, "homepage": "https://shopify.dev/docs/apps/build/devmcp", diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index 8934d46..9f4a83c 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -11,7 +11,7 @@ "name": "shopify-plugin", "source": "./", "description": "Search Shopify docs, generate and validate GraphQL, Liquid, and UI extension code", - "version": "1.1.0", + "version": "1.2.0", "author": { "name": "Shopify" }, "license": "MIT", "homepage": "https://shopify.dev/docs/apps/build/devmcp", diff --git a/.cursor-plugin/plugin.json b/.cursor-plugin/plugin.json index 5e24f0e..11f13c3 100644 --- a/.cursor-plugin/plugin.json +++ b/.cursor-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "shopify-plugin", "description": "Shopify developer tools for Cursor — search Shopify docs, generate and validate GraphQL, Liquid, and UI extension code", - "version": "1.1.0", + "version": "1.2.0", "author": { "name": "Shopify" }, "logo": "../assets/shopify_glyph.svg", "homepage": "https://shopify.dev/docs/apps/build/devmcp", diff --git a/.github/workflows/close-all-prs.yml b/.github/workflows/close-all-prs.yml deleted file mode 100644 index 20a8599..0000000 --- a/.github/workflows/close-all-prs.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Close All PRs - -on: - pull_request_target: - types: [opened, reopened] - -permissions: - pull-requests: write - -jobs: - close-pr: - runs-on: ubuntu-latest - steps: - - name: Close PR and comment - uses: actions/github-script@v7 - with: - script: | - const prNumber = context.payload.pull_request.number; - - // Add comment to PR - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: prNumber, - body: `Thanks for your interest but we don't accept pull requests. Any pull requests will be automatically closed.\n\nIf you have feedback or suggestions, please share them in the [Shopify Developer Community](https://community.shopify.dev/).` - }); - - // Close the PR - await github.rest.pulls.update({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: prNumber, - state: 'closed' - }); - - console.log(`Closed PR #${prNumber}`); diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..cffd3fc --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,7 @@ +# shopify-plugin + +## 1.2.0 + +### Minor Changes + +- d7608c7: Changeset to force a new release diff --git a/gemini-extension.json b/gemini-extension.json index 67de67b..dc4626a 100644 --- a/gemini-extension.json +++ b/gemini-extension.json @@ -1,4 +1,4 @@ { "name": "shopify-plugin", - "version": "1.1.0" + "version": "1.2.0" } diff --git a/package.json b/package.json index ecd0388..89b6be4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shopify-plugin", - "version": "1.1.0", + "version": "1.2.0", "private": true, "description": "AI agent plugin manifests for the Shopify Dev MCP server", "author": "Shopify", diff --git a/plugin.json b/plugin.json index 678f1d0..007fd75 100644 --- a/plugin.json +++ b/plugin.json @@ -1,7 +1,7 @@ { "name": "shopify-plugin", "description": "Shopify developer tools for GitHub Copilot — search Shopify docs, generate and validate GraphQL, Liquid, and UI extension code", - "version": "1.1.0", + "version": "1.2.0", "author": { "name": "Shopify" }, "license": "MIT", "keywords": [ diff --git a/skills/shopify-admin/SKILL.md b/skills/shopify-admin/SKILL.md index 77efcb6..e40d651 100644 --- a/skills/shopify-admin/SKILL.md +++ b/skills/shopify-admin/SKILL.md @@ -1,10 +1,10 @@ --- name: shopify-admin -description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself—even before deciding how to run it. Do **not** choose `admin` first for **app or extension config files** (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`), pre-deploy config errors, or invalid TOML—use **`use-shopify-cli`** and **`shopify app config validate --json`** (no TOML validator here). Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows—use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes)." +description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself—even before deciding how to run it. Do **not** choose `admin` first for **app or extension config validation** —use **`use-shopify-cli`**. Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows—use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes)." compatibility: Requires Node.js metadata: author: Shopify - version: "1.1.0" + version: "1.6.0" --- ## Required Tool Calls (do not skip) diff --git a/skills/shopify-admin/scripts/search_docs.mjs b/skills/shopify-admin/scripts/search_docs.mjs index 89cb0b0..00744f9 100755 --- a/skills/shopify-admin/scripts/search_docs.mjs +++ b/skills/shopify-admin/scripts/search_docs.mjs @@ -22,7 +22,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -36,7 +36,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-admin", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-admin/scripts/validate.mjs b/skills/shopify-admin/scripts/validate.mjs index 99f8ab9..0e8e80d 100755 --- a/skills/shopify-admin/scripts/validate.mjs +++ b/skills/shopify-admin/scripts/validate.mjs @@ -17311,61 +17311,6 @@ import { readFileSync } from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; -// src/types/api-constants.ts -var GRAPHQL_APIs = { - ADMIN: "admin", - STOREFRONT: "storefront-graphql", - PARTNER: "partner", - CUSTOMER: "customer", - PAYMENTS_APPS: "payments-apps" -}; -var FUNCTION_GRAPHQL_SCHEMAS = { - FUNCTIONS_CART_CHECKOUT_VALIDATION: "functions_cart_checkout_validation", - FUNCTIONS_CART_TRANSFORM: "functions_cart_transform", - FUNCTIONS_DELIVERY_CUSTOMIZATION: "functions_delivery_customization", - FUNCTIONS_DISCOUNT: "functions_discount", - FUNCTIONS_DISCOUNTS_ALLOCATOR: "functions_discounts_allocator", - FUNCTIONS_FULFILLMENT_CONSTRAINTS: "functions_fulfillment_constraints", - FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR: "functions_local_pickup_delivery_option_generator", - FUNCTIONS_ORDER_DISCOUNTS: "functions_order_discounts", - FUNCTIONS_ORDER_ROUTING_LOCATION_RULE: "functions_order_routing_location_rule", - FUNCTIONS_PAYMENT_CUSTOMIZATION: "functions_payment_customization", - FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR: "functions_pickup_point_delivery_option_generator", - FUNCTIONS_PRODUCT_DISCOUNTS: "functions_product_discounts", - FUNCTIONS_SHIPPING_DISCOUNTS: "functions_shipping_discounts" -}; -var FUNCTIONS_APIs = { - FUNCTIONS: "functions" - // Main Functions API without GraphQL schema -}; -var TYPESCRIPT_APIs = { - POLARIS_APP_HOME: "polaris-app-home", - POLARIS_ADMIN_EXTENSIONS: "polaris-admin-extensions", - POLARIS_CHECKOUT_EXTENSIONS: "polaris-checkout-extensions", - POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS: "polaris-customer-account-extensions", - POS_UI: "pos-ui", - HYDROGEN: "hydrogen", - STOREFRONT_WEB_COMPONENTS: "storefront-web-components" -}; -var THEME_APIs = { - LIQUID: "liquid" -}; -var CONFIGURATION_APIs = { - CUSTOM_DATA: "custom-data" -}; -var EXECUTION_APIs = { - USE_SHOPIFY_CLI: "use-shopify-cli" -}; -var SHOPIFY_APIS = { - ...GRAPHQL_APIs, - ...FUNCTIONS_APIs, - ...TYPESCRIPT_APIs, - ...THEME_APIs, - ...FUNCTION_GRAPHQL_SCHEMAS, - ...CONFIGURATION_APIs, - ...EXECUTION_APIs -}; - // src/types/api-types.ts var Visibility = { PUBLIC: "public", @@ -17380,23 +17325,28 @@ var APICategory = { UI_FRAMEWORK: "ui-framework", THEME: "theme", CONFIGURATION: "configuration", - EXECUTION: "execution" + EXECUTION: "execution", + GUIDANCE: "guidance" + // Procedural topics (onboarding, review checklists) — hand-maintained, no validation/search }; // src/types/api-mapping.ts -var SHOPIFY_APIS2 = { - [EXECUTION_APIs.USE_SHOPIFY_CLI]: { - name: EXECUTION_APIs.USE_SHOPIFY_CLI, +function defineApis(apis) { + return Object.fromEntries( + Object.entries(apis).map(([name, config]) => [name, { name, ...config }]) + ); +} +var SHOPIFY_APIS = defineApis({ + "use-shopify-cli": { displayName: "Use Shopify CLI", - description: "Choose before `admin` when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`) with **`shopify app config validate --json`** (not Admin GraphQL; MCP has no TOML validator); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", + description: "Choose when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate configuration before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", category: APICategory.EXECUTION, visibility: Visibility.PUBLIC, searchable: false }, - [GRAPHQL_APIs.ADMIN]: { - name: GRAPHQL_APIs.ADMIN, + admin: { displayName: "Admin API", - description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config files** (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`), pre-deploy config errors, or invalid TOML\u2014use **`use-shopify-cli`** and **`shopify app config validate --json`** (no TOML validator here). Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", + description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config validation** \u2014use **`use-shopify-cli`**. Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "admin" }, @@ -17406,10 +17356,9 @@ var SHOPIFY_APIS2 = { context: "creating a product" } }, - [GRAPHQL_APIs.STOREFRONT]: { - name: GRAPHQL_APIs.STOREFRONT, + "storefront-graphql": { displayName: "Storefront GraphQL API", - description: `Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use ${TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS} instead.`, + description: "Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use storefront-web-components instead.", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "storefront" }, @@ -17419,8 +17368,7 @@ var SHOPIFY_APIS2 = { context: "storefront search" } }, - [GRAPHQL_APIs.PARTNER]: { - name: GRAPHQL_APIs.PARTNER, + partner: { displayName: "Partner API", description: "The Partner API lets you programmatically access data about your Partner Dashboard, including your apps, themes, and affiliate referrals.", category: APICategory.GRAPHQL, @@ -17432,8 +17380,7 @@ var SHOPIFY_APIS2 = { context: "app install data" } }, - [GRAPHQL_APIs.CUSTOMER]: { - name: GRAPHQL_APIs.CUSTOMER, + customer: { displayName: "Customer Account API", description: "The Customer Account API allows customers to access their own data including orders, payment methods, and addresses.", category: APICategory.GRAPHQL, @@ -17445,8 +17392,7 @@ var SHOPIFY_APIS2 = { context: "customer order history" } }, - [GRAPHQL_APIs.PAYMENTS_APPS]: { - name: GRAPHQL_APIs.PAYMENTS_APPS, + "payments-apps": { displayName: "Payments Apps API", description: "The Payments Apps API enables payment providers to integrate their payment solutions with Shopify's checkout.", category: APICategory.GRAPHQL, @@ -17458,8 +17404,7 @@ var SHOPIFY_APIS2 = { context: "pending a payment session" } }, - [FUNCTIONS_APIs.FUNCTIONS]: { - name: FUNCTIONS_APIs.FUNCTIONS, + functions: { displayName: "Shopify Functions", description: "Shopify Functions allow developers to customize the backend logic that powers parts of Shopify. Available APIs: Discount, Cart and Checkout Validation, Cart Transform, Pickup Point Delivery Option Generator, Delivery Customization, Fulfillment Constraints, Local Pickup Delivery Option Generator, Order Routing Location Rule, Payment Customization", category: APICategory.FUNCTIONS, @@ -17471,8 +17416,7 @@ var SHOPIFY_APIS2 = { } }, // Function-specific GraphQL APIs for input query validation - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION, + functions_cart_checkout_validation: { displayName: "Cart Checkout Validation Function", description: "GraphQL schema for Cart and Checkout Validation Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17481,16 +17425,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_cart_checkout_validation_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM, + functions_cart_transform: { displayName: "Cart Transform Function", description: "GraphQL schema for Cart Transform Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_cart_transform_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION, + functions_delivery_customization: { displayName: "Delivery Customization Function", description: "GraphQL schema for Delivery Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17499,24 +17441,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_delivery_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT, + functions_discount: { displayName: "Discount Function", description: "GraphQL schema for Discount Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discount_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR, + functions_discounts_allocator: { displayName: "Discounts Allocator Function", description: "GraphQL schema for Discounts Allocator Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discounts_allocator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS, + functions_fulfillment_constraints: { displayName: "Fulfillment Constraints Function", description: "GraphQL schema for Fulfillment Constraints Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17525,8 +17464,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_fulfillment_constraints_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR, + functions_local_pickup_delivery_option_generator: { displayName: "Local Pickup Delivery Option Generator Function", description: "GraphQL schema for Local Pickup Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17535,16 +17473,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_local_pickup_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS, + functions_order_discounts: { displayName: "Order Discounts Function", description: "GraphQL schema for Order Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_order_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE, + functions_order_routing_location_rule: { displayName: "Order Routing Location Rule Function", description: "GraphQL schema for Order Routing Location Rule Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17553,8 +17489,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_order_routing_location_rule_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION, + functions_payment_customization: { displayName: "Payment Customization Function", description: "GraphQL schema for Payment Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17563,8 +17498,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_payment_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR, + functions_pickup_point_delivery_option_generator: { displayName: "Pickup Point Delivery Option Generator Function", description: "GraphQL schema for Pickup Point Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17573,24 +17507,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_pickup_point_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS, + functions_product_discounts: { displayName: "Product Discounts Function", description: "GraphQL schema for Product Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_product_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS, + functions_shipping_discounts: { displayName: "Shipping Discounts Function", description: "GraphQL schema for Shipping Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_shipping_discounts_schema" } }, - [TYPESCRIPT_APIs.POLARIS_APP_HOME]: { - name: TYPESCRIPT_APIs.POLARIS_APP_HOME, + "polaris-app-home": { displayName: "Polaris App Home", description: "Build your app's primary user interface embedded in the Shopify admin. If the prompt just mentions `Polaris` and you can't tell based off of the context what API they meant, assume they meant this API.", category: APICategory.UI_FRAMEWORK, @@ -17602,13 +17533,14 @@ var SHOPIFY_APIS2 = { context: "form in app home" } }, - [TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS, + "polaris-admin-extensions": { displayName: "Polaris Admin Extensions", description: `Add custom actions and blocks from your app at contextually relevant spots throughout the Shopify Admin. Admin UI Extensions also supports scaffolding new adminextensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "admin", + extensionTypeName: "Admin Extensions", + extensionSearchContext: "admin UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17616,13 +17548,14 @@ var SHOPIFY_APIS2 = { context: "text input in an admin extension" } }, - [TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS, + "polaris-checkout-extensions": { displayName: "Polaris Checkout Extensions", description: `Build custom functionality that merchants can install at defined points in the checkout flow, including product information, shipping, payment, order summary, and Shop Pay. Checkout UI Extensions also supports scaffolding new checkout extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "checkout", + extensionTypeName: "Checkout Extensions", + extensionSearchContext: "checkout UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17630,13 +17563,14 @@ var SHOPIFY_APIS2 = { context: "checkout button" } }, - [TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS, + "polaris-customer-account-extensions": { displayName: "Polaris Customer Account Extensions", description: `Build custom functionality that merchants can install at defined points on the Order index, Order status, and Profile pages in customer accounts. Customer Account UI Extensions also supports scaffolding new customer account extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "customer-account", + extensionTypeName: "Customer Account Extensions", + extensionSearchContext: "customer account UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17644,13 +17578,14 @@ var SHOPIFY_APIS2 = { context: "customer account card" } }, - [TYPESCRIPT_APIs.POS_UI]: { - name: TYPESCRIPT_APIs.POS_UI, + "pos-ui": { displayName: "POS UI", description: `Build retail point-of-sale applications using Shopify's POS UI components. These components provide a consistent and familiar interface for POS applications. POS UI Extensions also supports scaffolding new POS extensions using Shopify CLI commands. Keywords: POS, Retail, smart grid`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "point-of-sale", + extensionTypeName: "POS UI Extensions", + extensionSearchContext: "POS UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17658,8 +17593,7 @@ var SHOPIFY_APIS2 = { context: "POS screen layout" } }, - [TYPESCRIPT_APIs.HYDROGEN]: { - name: TYPESCRIPT_APIs.HYDROGEN, + hydrogen: { displayName: "Hydrogen", description: "Hydrogen storefront implementation cookbooks. Some of the available recipes are: B2B Commerce, Bundles, Combined Listings, Custom Cart Method, Dynamic Content with Metaobjects, Express Server, Google Tag Manager Integration, Infinite Scroll, Legacy Customer Account Flow, Markets, Partytown + Google Tag Manager, Subscriptions, Third-party API Queries and Caching. MANDATORY: Use this API for ANY Hydrogen storefront question - do NOT use Storefront GraphQL when 'Hydrogen' is mentioned.", category: APICategory.UI_FRAMEWORK, @@ -17671,8 +17605,7 @@ var SHOPIFY_APIS2 = { context: "cart UI" } }, - [TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS]: { - name: TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS, + "storefront-web-components": { displayName: "Storefront Web Components", description: "HTML-first web components for building storefronts WITHOUT GraphQL. Choose when prompts mention: Web Components, HTML tags (, , , , ), native , 'HTML-only', 'without JavaScript', or 'no GraphQL'. Components handle data fetching and state internally.", category: APICategory.UI_FRAMEWORK, @@ -17681,10 +17614,13 @@ var SHOPIFY_APIS2 = { // Docs has and not a npm package publicPackages: ["@shopify/polaris-types", "@shopify/app-bridge-types"], visibility: Visibility.EARLY_ACCESS, - validation: true + validation: true, + exampleVectorStoreQuery: { + query: "shopify-cart", + context: "cart web component" + } }, - [THEME_APIs.LIQUID]: { - name: THEME_APIs.LIQUID, + liquid: { displayName: "Liquid", description: "Liquid is an open-source templating language created by Shopify. It is the backbone of Shopify themes and is used to load dynamic content on storefronts. Keywords: liquid, theme, shopify-theme, liquid-component, liquid-block, liquid-section, liquid-snippet, liquid-schemas, shopify-theme-schemas", category: APICategory.THEME, @@ -17696,15 +17632,39 @@ var SHOPIFY_APIS2 = { context: "product metafield access in a theme" } }, - [CONFIGURATION_APIs.CUSTOM_DATA]: { - name: CONFIGURATION_APIs.CUSTOM_DATA, + "custom-data": { displayName: "Custom Data", description: "MUST be used first when prompts mention Metafields or Metaobjects. Use Metafields and Metaobjects to model and store custom data for your app. Metafields extend built-in Shopify data types like products or customers, Metaobjects are custom data types that can be used to store bespoke data structures. Metafield and Metaobject definitions provide a schema and configuration for values to follow.", category: APICategory.CONFIGURATION, visibility: Visibility.PUBLIC, searchable: false + }, + "app-store-review": { + displayName: "App Store Review", + description: "Run a pre-submission compliance check against your Shopify app's codebase. Reviews App Store requirements and surfaces likely issues before you submit for official review.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-dev": { + displayName: "Developer Onboarding", + description: "Get started building on Shopify. Use when a developer asks to build an app, build a theme, create a dev store, set up a partner account, scaffold a project, or get started developing for Shopify. NOT for merchants managing stores.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-merchant": { + displayName: "Merchant Onboarding", + description: "Set up and connect a Shopify store from your AI assistant. Use when the user wants to: set up my Shopify store, connect my store, install Shopify plugin, get started with Shopify, manage my store, add products to my store, merchant onboarding, start selling online, Shopify setup help, create my first store, how do I set up an online store, shopify.com/SKILL.md, import products, migrate from Square, migrate from WooCommerce, migrate from Etsy, migrate from Amazon, migrate from eBay, migrate from Wix, import from Google Merchant Center, migrate from Clover, migrate from Lightspeed, move products to Shopify, import catalog, replatform to Shopify. This is for store owners \u2014 not developers.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor", + frontmatterExtras: { context: "fork" } } -}; +}); // src/schemaOperations/loadAPISchemas.ts function getDataDirectory() { @@ -17724,6 +17684,22 @@ function getDataDirectory() { return path.resolve(currentDir, "../data"); } var dataDir = getDataDirectory(); +function configuredSchemaPath(api) { + const apiConfig = SHOPIFY_APIS[api]; + if (apiConfig?.gqlSchemaPath) return apiConfig.gqlSchemaPath; + if (apiConfig?.gqlSchemaFileName) { + return path.join(dataDir, apiConfig.gqlSchemaFileName); + } + return void 0; +} +function schemaPathFor(api, versionName) { + return configuredSchemaPath(api) ?? path.join(dataDir, `${api}_${versionName}.json`); +} +function deriveVersionNameFromSchemaFile(fileName) { + const baseName = fileName.replace(/\.json(?:\.gz)?$/, ""); + const versionSeparatorIndex = baseName.lastIndexOf("_"); + return versionSeparatorIndex === -1 ? "latest" : baseName.slice(versionSeparatorIndex + 1); +} function loadAPISchemas(apis, schemaOptions) { if (apis.length === 0) { throw new Error("No APIs provided"); @@ -17738,7 +17714,7 @@ function loadAPISchemas(apis, schemaOptions) { { ...schemaOptions, api: apis[0], - schemaPath: schemaOptions.schemaPath ?? SHOPIFY_APIS2[apis[0]]?.gqlSchemaPath ?? path.join(dataDir, `${apis[0]}_${schemaOptions.name}.json`) + schemaPath: schemaOptions.schemaPath ?? schemaPathFor(apis[0], schemaOptions.name) } ]; } @@ -17753,15 +17729,18 @@ function loadAPISchemas(apis, schemaOptions) { const versionsWithApi = versions.map((v) => ({ ...v, api, - schemaPath: SHOPIFY_APIS2[api]?.gqlSchemaPath ?? path.join(dataDir, `${api}_${v.name}.json`) + schemaPath: schemaPathFor(api, v.name) })); apiVersions.push(...versionsWithApi); - } else if (SHOPIFY_APIS2[api]?.gqlSchemaPath) { + } else { + const apiConfig = SHOPIFY_APIS[api]; + const configuredPath = configuredSchemaPath(api); + if (!configuredPath) continue; apiVersions.push({ - name: "latest", + name: apiConfig?.gqlSchemaFileName ? deriveVersionNameFromSchemaFile(apiConfig.gqlSchemaFileName) : "latest", latestVersion: true, api, - schemaPath: SHOPIFY_APIS2[api].gqlSchemaPath + schemaPath: configuredPath }); } } @@ -18186,7 +18165,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -18200,7 +18179,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-admin", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-app-store-review/SKILL.md b/skills/shopify-app-store-review/SKILL.md index 3c56d1f..1def255 100644 --- a/skills/shopify-app-store-review/SKILL.md +++ b/skills/shopify-app-store-review/SKILL.md @@ -4,14 +4,16 @@ description: "Run a pre-submission compliance check against your Shopify app's c compatibility: Claude Code, Claude Desktop, Cursor metadata: author: Shopify - version: "1.1.0" + version: "1.6.0" --- You are a Shopify App Store reviewer performing a pre-submission compliance check against a developer's local codebase. Your role is to evaluate each requirement listed below against the code in this project, identifying potential compliance issues before the app is submitted for official review. ## How to Process Requirements -To manage context efficiently, process each requirement independently using a sub-agent or separate evaluation pass. For each requirement: +To manage context efficiently, process each requirement independently using a sub-agent or separate evaluation pass. + +For each requirement: 1. Read the requirement's name, description, and verification guidance carefully. 2. Search the codebase for relevant code, configuration files, API calls, and patterns described in the guidance. @@ -23,160 +25,41 @@ To manage context efficiently, process each requirement independently using a su ### Important Evaluation Principles -- **Error on the side of surfacing ambiguity.** If you're unsure whether something passes, mark it as ⚠️ Needs review. Do not silently pass a requirement you cannot verify. +- **Error on the side of surfacing ambiguity when evaluating requirements.** If you're unsure whether something passes, mark it as ⚠️ Needs review. Do not silently pass a requirement you cannot verify. - **Be brief but specific in your explanations.** There are a lot of requirements, keep context brief for the user. Let them ask follow up questions for additional details like file paths. -## List of Requirements - -### Use session tokens for authentication - -**Description:** Your embedded app must function properly without relying on third-party cookies or local storage, including when accessed in incognito mode on Chrome. -**Verification guidance:** Check that the app uses Shopify session tokens for authentication rather than relying on third-party cookies or local storage. Look for @shopify/app-bridge-react or @shopify/app-bridge-react-router usage with authenticatedFetch, session token exchange logic, or that the app-bridge.js cdn has been added as a script tag. Verify there are no direct cookie-based auth flows or localStorage-based session management that would fail when third-party cookies are blocked. - -### Use Shopify checkout - -**Description:** Shopify can't guarantee the safety or security of an order that's been placed through an offsite or third party checkout. Apps that bypass checkout or payment processing, or register any transactions through the Shopify API in connection with such activity, are prohibited. -**Verification guidance:** Search the codebase for external checkout URLs, redirect logic pointing to non-Shopify payment or checkout pages, and any code that processes payments or creates orders outside of Shopify's checkout flow. - -### Direct merchants to the Shopify Theme Store - -**Description:** Your app must not allow merchants to download themes. Themes can only be installed via the Shopify Theme Store. -**Verification guidance:** Check if the app contains logic to install, download, or push theme files to a merchant's store. Look for Themes API calls that create or upload themes rather than simply modifying existing theme assets. - -### Use only factual information - -**Description:** Your app and app listing should only include factual information. Apps that falsify data to deceive merchants or buyers, such as fake reviews or false purchase notifications, violate our [Partner Program Agreement](https://www.shopify.ca/partners/terms) and our [Acceptable Use Policy](https://www.shopify.com/legal/aup). -**Verification guidance:** Look for code that generates fake or random sales data, fabricated reviews, or simulated order/traffic statistics for storefront display. Verify that any storefront components (e.g., sales popups, recent-purchase notifications) pull from real store data via Shopify APIs. - -### Build single-merchant storefronts. Marketplaces should be sales channels - -**Description:** Apps that allow merchants to turn their stores into classifieds-style marketplaces cannot be distributed through the Shopify App Store. If you are a marketplace platform aiming to connect to Shopify in order to list products on your marketplace, consider submitting as a [sales channel](https://shopify.dev/docs/apps/selling-strategies/channels). -**Verification guidance:** Check if the app provides multi-seller or marketplace functionality such as seller registration, per-seller dashboards, per-seller order management, or payment splitting among multiple sellers. A single merchant sourcing products from vendors is acceptable; multiple independent sellers operating within one store is not. - -### Always build Payment Gateway apps using the Payments API and after obtaining authorization - -**Description:** Payment Gateway apps must be authorized through an [application process.](https://shopify.dev/apps/payments/getting-started#overview) They must be built using the [Payments API](https://shopify.dev/docs/api/admin-rest/2023-10/resources/payment). -**Verification guidance:** Search for payment processing logic, payment gateway integrations, references to external payment provider API keys, or checkout/cart modifications that add payment methods without the app having read/write_payment_gateway scopes in the TOML file. Only apps submitted through Shopify's payments extension process should handle payment processing. - -### Build apps for Shopify POS only, not third-party systems - -**Description:** Shopify is not currently accepting apps that connect to a POS system outside of Shopify. This applies to all apps that connect to a POS system outside of Shopify. -**Verification guidance:** Check if the app references or integrates with a third-party POS system (e.g., Square, Clover, Lightspeed) for data syncing between Shopify and that POS. Integrations exclusively with Shopify POS or POS connections that are part of an ERP integration are acceptable. - -### Obtain explicit buyer consent before adding charges - -**Description:** Apps can't automatically add or pre-select optional charges to a buyer's cart that increase the total checkout price. Apps can only add optional charges to carts or at checkout after displaying the additional cost in a manner that is clear to the buyer, and upon obtaining explicit buyer consent. -**Verification guidance:** Look for code that adds fees, surcharges, or additional line items at the cart or checkout level. Any fee added must be implemented via a checkout UI extension and require explicit buyer consent before being applied. - -### Maintain the cheapest shipping option as default - -**Description:** Apps can’t alter or re-order shipping options in a manner that increases the default shipping price. The cheapest shipping option must always be selected by default. This restriction doesn’t apply to non-shipping delivery methods, such as in-store pickup, local delivery, and pickup points. -**Verification guidance:** If the app reorders or customizes shipping options at checkout, verify that the cheapest shipping option is set as the default, pre-selected, and first option presented to the buyer. - -### Duplicate only authorized product information - -**Description:** Your app should only duplicate product information that the merchant has the proper permission to use: their own products, officially licensed or dropshipped products. Marketing claims like "import from any store in the world" or "copy the product information from any website", whether using your app or a Chrome extension, are not acceptable. -**Verification guidance:** Review any in-app messaging for language that promotes copying or migrating products the merchant does not own. The app should frame its functionality as migrating or duplicating products the merchant owns or has rights to resell. This does not apply for product sourcing (dropshipping/Print on Demand). - -### Don't connect merchants to external agencies and developers - -**Description:** Apps that connect merchants to agencies and freelancers cannot be distributed through the Shopify App Store. -**Verification guidance:** Check if the app connects merchants with external freelance developers or agencies for hire. Connecting merchants to the app partner's own internal support team or developers is acceptable; acting as a marketplace for third-party development services is not. - -### Process refunds only through the original payment processor - -**Description:** Your app must not offer methods for processing refunds outside of the original payment processor. -**Verification guidance:** Search for refund processing logic and verify refunds are issued to the original payment method. Flag any code that refunds to gift cards or cashback wallets. Offering discount codes or gift cards as a separate incentive (not as a refund) is acceptable. Give the user a heads-up that refunding can only be done to the original payment method or store credit using refundCreate or returnProcess and should not offer any other refunds. - -### Don't provide capital lending +## Section and Group Context -**Description:** Apps that provide capital funding (including but not limited to loans, cash advances, and purchase of receivables) cannot be distributed through the Shopify App Store. These types of services are difficult to monitor on an ongoing basis, and in a manner that makes sure merchants are protected from unsound lending practices. -**Verification guidance:** Look for functionality that offers, promotes, or facilitates financing, capital loans, cash advances, or any form of lending money to merchants. +Some sections and groups include an **applicability note** immediately after their title. Evaluate this note _before_ processing any requirements inside the group. There are three types: -### Use Shopify Managed Pricing or the Shopify Billing API +- **Conditional** — Starts with "Applies if…". Check the codebase for the described signal. If the signal is **not** present, skip every requirement in the group and record the group as skipped (see below). If the signal **is** present, evaluate the group normally. +- **Opt-in** — Starts with "Opt-in:". Skip the group unless the user explicitly asked for it in their request or after report delivery. Record it as skipped. +- **Informational** — Starts with "Note:". Does not gate the group. Use the context to inform your evaluation of the requirements inside. -**Description:** Apps that use off-platform billing cannot be distributed through the Shopify App store. Your app must use [Managed Pricing](https://shopify.dev/docs/apps/launch/billing/managed-pricing) or the [Shopify Billing API](https://shopify.dev/docs/apps/billing) for any app charges. -**Verification guidance:** Check for Shopify Billing API usage (e.g., appSubscriptionCreate, appPurchaseOneTimeCreate mutations) or Managed Pricing configuration. Flag any external billing integrations, third-party payment forms for app charges. If no billing logic is found at all, inform the developer that this is fine if the app is truly free, but if any charges are made to the merchant—even through a separate platform or website outside the Shopify app—they must implement Shopify Billing. Charging merchants externally while listing the Shopify app as free is not allowed. +When in doubt about whether a conditional signal is present, skip the group rather than evaluating it and allow the user to explicitly request evaluation. -### Implement Shopify Managed Pricing or the Shopify Billing API correctly +### Tracking skipped groups -**Description:** If your app has any charges, it must correctly implement [Managed Pricing](https://shopify-dev.shop.dev/docs/apps/launch/billing/managed-pricing) or the [Shopify Billing API](https://shopify.dev/docs/apps/billing) to ensure that it can accept, decline and [request approval for charges again on reinstall](https://shopify.dev/docs/apps/billing/subscriptions). -**Verification guidance:** Verify the app uses Managed Pricing or the Billing API with proper charge approval and decline handling. Check that the app gracefully handles a merchant declining a charge and that merchants can resubscribe to a plan after reinstalling the app without errors. +Keep a running list of any groups you skip, including: -### Allow pricing plan changes +- The group number and name +- The reason (conditional signal not detected, or opt-in not requested) -**Description:** Your app must allow merchants to upgrade and downgrade their pricing plan without having to contact your support team or having to reinstall the app. This includes ensuring that the charges are successfully processed in the application charge history page in the merchant admin. -**Verification guidance:** If the app offers multiple pricing plans, verify that plan switching is handled in-app via the Billing API or Managed Pricing without requiring the merchant to reinstall or contact the developer. Automatic usage-based plan changes are acceptable. +Report this list in the **Skipped groups** section of the output (see Output Format). -### Use Shopify APIs +> Note: Gaps in requirement numbering (e.g., missing 1.1.5, 2.2.2) are intentional. Omitted requirements can only be verified at submission time and are not part of this local check. -**Description:** Your app must be configured to use [Shopify's API](https://shopify.dev/docs/admin-api) to ensure it best serves merchants. Apps that don't use or need any Shopify APIs are not permitted. -**Verification guidance:** Search the codebase for any Shopify API client initialization, OAuth flows, session token usage, or Admin API calls. If the app has no Shopify API integration and operates standalone without the need of Shopify API to function, verify it does not prompt users to install a custom app or provide a Shopify API key/secret configuration. - -### Authenticate immediately after install - -**Description:** Your app must immediately authenticate using OAuth before any other steps occur. Merchants should not be able to interact with the user interface (UI) before OAuth. -**Verification guidance:** Trace the app installation flow starting from the install entry point. Verify the app redirects to Shopify's OAuth authorization URL (e.g., /admin/oauth/authorize) with the correct client_id and scopes matching the app's own credentials, not a different application's. - -### Don't display promotions or advertisements in admin extensions - -**Description:** Don't use [admin UI blocks, admin actions](https://shopify.dev/docs/apps/design-guidelines/app-structure#admin-ui-extensions), or [admin links](https://shopify.dev/docs/apps/build/admin/admin-links/add-admin-links) to promote your app, promote related apps, or request reviews. -**Verification guidance:** Search for admin UI extension configurations (admin.block.toml, admin.action.toml, admin.link.toml or equivalent extension targets) and inspect their rendered content for promotional language, review request prompts, or cross-promotion of related apps. - -### Only launch Max modal with merchant interaction - -**Description:** Max modal (formerly known as full screen mode) must not launch without a merchant interaction. Max modal can't be launched from the app navigation menu. -**Verification guidance:** Search the codebase for usage of Max modal APIs such as fullscreen mode or ResourcePicker with fullscreen. Verify that any Max modal is triggered only by explicit user interaction (e.g., button click) and is not opened automatically on page load or from navigation sidebar link handlers. - -### Initiate installation from a Shopify-owned surface - -**Description:** Apps must be installed and initiated only on Shopify services. Your app must not request the manual entry of a myshopify.com URL or a shop's domain during the installation or configuration flow. -**Verification guidance:** Search the codebase for input fields, forms, or URL parameters that accept or reference ".myshopify.com" domains or the first identifying part of the myshopify url (xxx.myshopify.com). Check for any UI prompting the user to manually enter their shop URL. The app should rely on OAuth or session tokens for shop identification instead. - -### Authenticate immediately after install - -**Description:** Your app must immediately authenticate using OAuth before any other steps occur. Merchants should not be able to interact with the user interface (UI) before OAuth. -**Verification guidance:** Trace the app installation flow starting from the install entry point. Verify the app redirects to Shopify's OAuth authorization URL (e.g., /admin/oauth/authorize) with the correct client_id and scopes matching the app's own credentials, not a different application's. - -### Redirect to the app UI after installation - -**Description:** Your app must redirect merchants to the user interface (UI) after they accept permissions access on the OAuth handshake page. -**Verification guidance:** Follow the OAuth callback handler and verify that after receiving the authorization code and completing token exchange, the app redirects the user to the app's main UI route e.g., the embedded app URL within Shopify Admin if embedded or the external page if not embedded. It should not lead to a dead end or the app index page in the Shopify Admin. - -### Require OAuth authentication immediately after reinstall - -**Description:** Help merchants easily return to workflows in your app if they choose to reinstall it. Your app must immediately authenticate using [OAuth](https://shopify.dev/docs/apps/auth/oauth) before any other steps occur, even if the merchant has previously installed and then uninstalled your app. -**Verification guidance:** Review the OAuth callback and session/token storage logic to confirm the app handles the case where a shop record already exists. Verify it updates existing tokens rather than failing on duplicate entries, and that no install-once flags or one-time setup flows would block a reinstall. - -### Use a valid TLS/SSL certificate - -**Description:** All data exchanged between a client (such as a merchant's web browser) and your app server should be encrypted using Transport Layer Security (TLS) to ensure that any data transmitted can only be read by your application server. Websites secured by a TLS certificate will display HTTPS and the small padlock icon in the browser address bar. Your app must have a valid [TLS/SSL certificate](https://shopify.dev/docs/apps/store/security/tls-certificates) without any errors. -**Verification guidance:** Check the app's server configuration for TLS/SSL setup. Verify the app serves over HTTPS by inspecting server entry points, environment variables for SSL certificates, and any redirect-to-HTTPS middleware. For non-embedded apps, confirm there is no HTTP-only fallback. - -### Request read_all_orders access scope only if it provides necessary app functionality - -**Description:** If your app is accessing the `read_all_orders` scope, it must demonstrate the need for this scope. -**Verification guidance:** Search for Shopify API calls that fetch orders and check if the app uses read_all_orders scope or queries orders beyond the default 60-day window. Verify the app has functionality such as analytics, reporting, or loyalty features that genuinely require historical order data. - -### Request write_payment_mandate scope only if it provides necessary app functionality - -**Description:** If your app is accessing the `write_payment_mandate` scope, it must demonstrate the need for this scope. -**Verification guidance:** Search the codebase for usage of deferred payment or purchase option APIs (e.g., SellingPlanGroup creation with deferred payment strategies, pre-order or try-before-you-buy policies). Confirm the app implements a selling flow where customers can defer full payment. - -### Request write_checkout_extensions_apis scope only if it provides necessary app functionality - -**Description:** If your app is accessing the `write_checkout_extensions_apis` scope, it must demonstrate the need for this scope. -**Verification guidance:** Search for checkout extension targets or post-purchase extension points (e.g., purchase.thank-you, purchase.checkout, post_purchase). Verify the app provides additional functionality to customers after checkout such as surveys, upsell offers, donations, or similar features. +## List of Requirements -### Request read_advanced_dom_pixel_events scope only if it provides necessary app functionality +Fetch the canonical, up-to-date list of requirements from: -**Description:** If your app is accessing the `read_advanced_dom_pixel_events` scope, it must demonstrate the need for this scope. You must use this scope to either implement a heatmap or session recording functionality on checkout pages. -**Verification guidance:** Search for references to read_advanced_dom_pixel_events scope and web pixel or checkout pixel implementations. Verify the app processes DOM-level pixel events and provides checkout heatmap visualization or session recording/replay features in its UI. +``` +https://shopify.dev/docs/apps/launch/app-store-review/app-store-ai-self-review-requirements +``` -### Request read_checkout_extensions_chat scope only when required +That page is the source of truth — it contains every requirement to be evaluated, each with a **Description** and **Verification guidance**. Use whatever web-fetching capability you have (e.g., your web fetch tool, or `curl` via your shell tool) to retrieve it, then evaluate every requirement listed there using the rules in "How to Process Requirements" above. -**Description:** If your app is accessing the `read_checkout_extensions_chat` scope, it must demonstrate the need for this scope. -**Verification guidance:** Search for Chat UI component usage in checkout or thank-you page extensions. Verify the chat widget connects to a human or AI support agent, is scoped to customer support interactions, and does not proactively recommend products before a buyer initiates a help request. +Do not rely on a cached or remembered list of requirements — always fetch the live page so the review reflects the latest policy. ## Output Format @@ -187,6 +70,7 @@ After evaluating all requirements, compile the results into a single report usin ✅ **Likely passing:** {number} ❌ **Likely failing:** {number} ⚠️ **Needs review:** {number} +⏭️ **Groups skipped:** {number} _(see below)_ **Note:** The agent has reviewed a subset of requirements that have been selected by Shopify as checkable against a local codebase without browser context. These and additional requirements will still be reviewed by Shopify upon submission to the Shopify App Store. @@ -210,6 +94,14 @@ For each requirement needing review, provide the following with a new line betwe **What was found:** A concise explanation of the violation detected, referencing specific files, code patterns, or configurations where possible. +### Skipped groups + +The following groups weren't evaluated because they didn't appear to apply to this codebase (or are opt-in). If you'd like me to check any of these anyway, just ask. + +For each skipped group: + +- **{Group number} {Group name}** — {reason, e.g. "No theme app extension detected" or "Opt-in only"} + ### Resources Unless all requirements are labeled as likely passing, include these helpful resources at the end of the report: diff --git a/skills/shopify-custom-data/SKILL.md b/skills/shopify-custom-data/SKILL.md index ee23b2e..26f3f7d 100644 --- a/skills/shopify-custom-data/SKILL.md +++ b/skills/shopify-custom-data/SKILL.md @@ -4,7 +4,7 @@ description: "MUST be used first when prompts mention Metafields or Metaobjects. compatibility: Requires Node.js metadata: author: Shopify - version: "1.1.0" + version: "1.6.0" --- diff --git a/skills/shopify-customer/SKILL.md b/skills/shopify-customer/SKILL.md index 9f684b7..3547ef2 100644 --- a/skills/shopify-customer/SKILL.md +++ b/skills/shopify-customer/SKILL.md @@ -4,7 +4,7 @@ description: "The Customer Account API allows customers to access their own data compatibility: Requires Node.js metadata: author: Shopify - version: "1.1.0" + version: "1.6.0" --- ## Required Tool Calls (do not skip) diff --git a/skills/shopify-customer/scripts/search_docs.mjs b/skills/shopify-customer/scripts/search_docs.mjs index 35c99c6..7dbaa49 100755 --- a/skills/shopify-customer/scripts/search_docs.mjs +++ b/skills/shopify-customer/scripts/search_docs.mjs @@ -22,7 +22,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -36,7 +36,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-customer", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-customer/scripts/validate.mjs b/skills/shopify-customer/scripts/validate.mjs index c0311d8..f51f8d4 100755 --- a/skills/shopify-customer/scripts/validate.mjs +++ b/skills/shopify-customer/scripts/validate.mjs @@ -17311,61 +17311,6 @@ import { readFileSync } from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; -// src/types/api-constants.ts -var GRAPHQL_APIs = { - ADMIN: "admin", - STOREFRONT: "storefront-graphql", - PARTNER: "partner", - CUSTOMER: "customer", - PAYMENTS_APPS: "payments-apps" -}; -var FUNCTION_GRAPHQL_SCHEMAS = { - FUNCTIONS_CART_CHECKOUT_VALIDATION: "functions_cart_checkout_validation", - FUNCTIONS_CART_TRANSFORM: "functions_cart_transform", - FUNCTIONS_DELIVERY_CUSTOMIZATION: "functions_delivery_customization", - FUNCTIONS_DISCOUNT: "functions_discount", - FUNCTIONS_DISCOUNTS_ALLOCATOR: "functions_discounts_allocator", - FUNCTIONS_FULFILLMENT_CONSTRAINTS: "functions_fulfillment_constraints", - FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR: "functions_local_pickup_delivery_option_generator", - FUNCTIONS_ORDER_DISCOUNTS: "functions_order_discounts", - FUNCTIONS_ORDER_ROUTING_LOCATION_RULE: "functions_order_routing_location_rule", - FUNCTIONS_PAYMENT_CUSTOMIZATION: "functions_payment_customization", - FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR: "functions_pickup_point_delivery_option_generator", - FUNCTIONS_PRODUCT_DISCOUNTS: "functions_product_discounts", - FUNCTIONS_SHIPPING_DISCOUNTS: "functions_shipping_discounts" -}; -var FUNCTIONS_APIs = { - FUNCTIONS: "functions" - // Main Functions API without GraphQL schema -}; -var TYPESCRIPT_APIs = { - POLARIS_APP_HOME: "polaris-app-home", - POLARIS_ADMIN_EXTENSIONS: "polaris-admin-extensions", - POLARIS_CHECKOUT_EXTENSIONS: "polaris-checkout-extensions", - POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS: "polaris-customer-account-extensions", - POS_UI: "pos-ui", - HYDROGEN: "hydrogen", - STOREFRONT_WEB_COMPONENTS: "storefront-web-components" -}; -var THEME_APIs = { - LIQUID: "liquid" -}; -var CONFIGURATION_APIs = { - CUSTOM_DATA: "custom-data" -}; -var EXECUTION_APIs = { - USE_SHOPIFY_CLI: "use-shopify-cli" -}; -var SHOPIFY_APIS = { - ...GRAPHQL_APIs, - ...FUNCTIONS_APIs, - ...TYPESCRIPT_APIs, - ...THEME_APIs, - ...FUNCTION_GRAPHQL_SCHEMAS, - ...CONFIGURATION_APIs, - ...EXECUTION_APIs -}; - // src/types/api-types.ts var Visibility = { PUBLIC: "public", @@ -17380,23 +17325,28 @@ var APICategory = { UI_FRAMEWORK: "ui-framework", THEME: "theme", CONFIGURATION: "configuration", - EXECUTION: "execution" + EXECUTION: "execution", + GUIDANCE: "guidance" + // Procedural topics (onboarding, review checklists) — hand-maintained, no validation/search }; // src/types/api-mapping.ts -var SHOPIFY_APIS2 = { - [EXECUTION_APIs.USE_SHOPIFY_CLI]: { - name: EXECUTION_APIs.USE_SHOPIFY_CLI, +function defineApis(apis) { + return Object.fromEntries( + Object.entries(apis).map(([name, config]) => [name, { name, ...config }]) + ); +} +var SHOPIFY_APIS = defineApis({ + "use-shopify-cli": { displayName: "Use Shopify CLI", - description: "Choose before `admin` when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`) with **`shopify app config validate --json`** (not Admin GraphQL; MCP has no TOML validator); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", + description: "Choose when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate configuration before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", category: APICategory.EXECUTION, visibility: Visibility.PUBLIC, searchable: false }, - [GRAPHQL_APIs.ADMIN]: { - name: GRAPHQL_APIs.ADMIN, + admin: { displayName: "Admin API", - description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config files** (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`), pre-deploy config errors, or invalid TOML\u2014use **`use-shopify-cli`** and **`shopify app config validate --json`** (no TOML validator here). Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", + description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config validation** \u2014use **`use-shopify-cli`**. Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "admin" }, @@ -17406,10 +17356,9 @@ var SHOPIFY_APIS2 = { context: "creating a product" } }, - [GRAPHQL_APIs.STOREFRONT]: { - name: GRAPHQL_APIs.STOREFRONT, + "storefront-graphql": { displayName: "Storefront GraphQL API", - description: `Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use ${TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS} instead.`, + description: "Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use storefront-web-components instead.", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "storefront" }, @@ -17419,8 +17368,7 @@ var SHOPIFY_APIS2 = { context: "storefront search" } }, - [GRAPHQL_APIs.PARTNER]: { - name: GRAPHQL_APIs.PARTNER, + partner: { displayName: "Partner API", description: "The Partner API lets you programmatically access data about your Partner Dashboard, including your apps, themes, and affiliate referrals.", category: APICategory.GRAPHQL, @@ -17432,8 +17380,7 @@ var SHOPIFY_APIS2 = { context: "app install data" } }, - [GRAPHQL_APIs.CUSTOMER]: { - name: GRAPHQL_APIs.CUSTOMER, + customer: { displayName: "Customer Account API", description: "The Customer Account API allows customers to access their own data including orders, payment methods, and addresses.", category: APICategory.GRAPHQL, @@ -17445,8 +17392,7 @@ var SHOPIFY_APIS2 = { context: "customer order history" } }, - [GRAPHQL_APIs.PAYMENTS_APPS]: { - name: GRAPHQL_APIs.PAYMENTS_APPS, + "payments-apps": { displayName: "Payments Apps API", description: "The Payments Apps API enables payment providers to integrate their payment solutions with Shopify's checkout.", category: APICategory.GRAPHQL, @@ -17458,8 +17404,7 @@ var SHOPIFY_APIS2 = { context: "pending a payment session" } }, - [FUNCTIONS_APIs.FUNCTIONS]: { - name: FUNCTIONS_APIs.FUNCTIONS, + functions: { displayName: "Shopify Functions", description: "Shopify Functions allow developers to customize the backend logic that powers parts of Shopify. Available APIs: Discount, Cart and Checkout Validation, Cart Transform, Pickup Point Delivery Option Generator, Delivery Customization, Fulfillment Constraints, Local Pickup Delivery Option Generator, Order Routing Location Rule, Payment Customization", category: APICategory.FUNCTIONS, @@ -17471,8 +17416,7 @@ var SHOPIFY_APIS2 = { } }, // Function-specific GraphQL APIs for input query validation - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION, + functions_cart_checkout_validation: { displayName: "Cart Checkout Validation Function", description: "GraphQL schema for Cart and Checkout Validation Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17481,16 +17425,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_cart_checkout_validation_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM, + functions_cart_transform: { displayName: "Cart Transform Function", description: "GraphQL schema for Cart Transform Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_cart_transform_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION, + functions_delivery_customization: { displayName: "Delivery Customization Function", description: "GraphQL schema for Delivery Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17499,24 +17441,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_delivery_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT, + functions_discount: { displayName: "Discount Function", description: "GraphQL schema for Discount Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discount_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR, + functions_discounts_allocator: { displayName: "Discounts Allocator Function", description: "GraphQL schema for Discounts Allocator Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discounts_allocator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS, + functions_fulfillment_constraints: { displayName: "Fulfillment Constraints Function", description: "GraphQL schema for Fulfillment Constraints Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17525,8 +17464,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_fulfillment_constraints_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR, + functions_local_pickup_delivery_option_generator: { displayName: "Local Pickup Delivery Option Generator Function", description: "GraphQL schema for Local Pickup Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17535,16 +17473,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_local_pickup_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS, + functions_order_discounts: { displayName: "Order Discounts Function", description: "GraphQL schema for Order Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_order_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE, + functions_order_routing_location_rule: { displayName: "Order Routing Location Rule Function", description: "GraphQL schema for Order Routing Location Rule Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17553,8 +17489,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_order_routing_location_rule_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION, + functions_payment_customization: { displayName: "Payment Customization Function", description: "GraphQL schema for Payment Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17563,8 +17498,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_payment_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR, + functions_pickup_point_delivery_option_generator: { displayName: "Pickup Point Delivery Option Generator Function", description: "GraphQL schema for Pickup Point Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17573,24 +17507,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_pickup_point_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS, + functions_product_discounts: { displayName: "Product Discounts Function", description: "GraphQL schema for Product Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_product_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS, + functions_shipping_discounts: { displayName: "Shipping Discounts Function", description: "GraphQL schema for Shipping Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_shipping_discounts_schema" } }, - [TYPESCRIPT_APIs.POLARIS_APP_HOME]: { - name: TYPESCRIPT_APIs.POLARIS_APP_HOME, + "polaris-app-home": { displayName: "Polaris App Home", description: "Build your app's primary user interface embedded in the Shopify admin. If the prompt just mentions `Polaris` and you can't tell based off of the context what API they meant, assume they meant this API.", category: APICategory.UI_FRAMEWORK, @@ -17602,13 +17533,14 @@ var SHOPIFY_APIS2 = { context: "form in app home" } }, - [TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS, + "polaris-admin-extensions": { displayName: "Polaris Admin Extensions", description: `Add custom actions and blocks from your app at contextually relevant spots throughout the Shopify Admin. Admin UI Extensions also supports scaffolding new adminextensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "admin", + extensionTypeName: "Admin Extensions", + extensionSearchContext: "admin UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17616,13 +17548,14 @@ var SHOPIFY_APIS2 = { context: "text input in an admin extension" } }, - [TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS, + "polaris-checkout-extensions": { displayName: "Polaris Checkout Extensions", description: `Build custom functionality that merchants can install at defined points in the checkout flow, including product information, shipping, payment, order summary, and Shop Pay. Checkout UI Extensions also supports scaffolding new checkout extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "checkout", + extensionTypeName: "Checkout Extensions", + extensionSearchContext: "checkout UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17630,13 +17563,14 @@ var SHOPIFY_APIS2 = { context: "checkout button" } }, - [TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS, + "polaris-customer-account-extensions": { displayName: "Polaris Customer Account Extensions", description: `Build custom functionality that merchants can install at defined points on the Order index, Order status, and Profile pages in customer accounts. Customer Account UI Extensions also supports scaffolding new customer account extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "customer-account", + extensionTypeName: "Customer Account Extensions", + extensionSearchContext: "customer account UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17644,13 +17578,14 @@ var SHOPIFY_APIS2 = { context: "customer account card" } }, - [TYPESCRIPT_APIs.POS_UI]: { - name: TYPESCRIPT_APIs.POS_UI, + "pos-ui": { displayName: "POS UI", description: `Build retail point-of-sale applications using Shopify's POS UI components. These components provide a consistent and familiar interface for POS applications. POS UI Extensions also supports scaffolding new POS extensions using Shopify CLI commands. Keywords: POS, Retail, smart grid`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "point-of-sale", + extensionTypeName: "POS UI Extensions", + extensionSearchContext: "POS UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17658,8 +17593,7 @@ var SHOPIFY_APIS2 = { context: "POS screen layout" } }, - [TYPESCRIPT_APIs.HYDROGEN]: { - name: TYPESCRIPT_APIs.HYDROGEN, + hydrogen: { displayName: "Hydrogen", description: "Hydrogen storefront implementation cookbooks. Some of the available recipes are: B2B Commerce, Bundles, Combined Listings, Custom Cart Method, Dynamic Content with Metaobjects, Express Server, Google Tag Manager Integration, Infinite Scroll, Legacy Customer Account Flow, Markets, Partytown + Google Tag Manager, Subscriptions, Third-party API Queries and Caching. MANDATORY: Use this API for ANY Hydrogen storefront question - do NOT use Storefront GraphQL when 'Hydrogen' is mentioned.", category: APICategory.UI_FRAMEWORK, @@ -17671,8 +17605,7 @@ var SHOPIFY_APIS2 = { context: "cart UI" } }, - [TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS]: { - name: TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS, + "storefront-web-components": { displayName: "Storefront Web Components", description: "HTML-first web components for building storefronts WITHOUT GraphQL. Choose when prompts mention: Web Components, HTML tags (, , , , ), native , 'HTML-only', 'without JavaScript', or 'no GraphQL'. Components handle data fetching and state internally.", category: APICategory.UI_FRAMEWORK, @@ -17681,10 +17614,13 @@ var SHOPIFY_APIS2 = { // Docs has and not a npm package publicPackages: ["@shopify/polaris-types", "@shopify/app-bridge-types"], visibility: Visibility.EARLY_ACCESS, - validation: true + validation: true, + exampleVectorStoreQuery: { + query: "shopify-cart", + context: "cart web component" + } }, - [THEME_APIs.LIQUID]: { - name: THEME_APIs.LIQUID, + liquid: { displayName: "Liquid", description: "Liquid is an open-source templating language created by Shopify. It is the backbone of Shopify themes and is used to load dynamic content on storefronts. Keywords: liquid, theme, shopify-theme, liquid-component, liquid-block, liquid-section, liquid-snippet, liquid-schemas, shopify-theme-schemas", category: APICategory.THEME, @@ -17696,15 +17632,39 @@ var SHOPIFY_APIS2 = { context: "product metafield access in a theme" } }, - [CONFIGURATION_APIs.CUSTOM_DATA]: { - name: CONFIGURATION_APIs.CUSTOM_DATA, + "custom-data": { displayName: "Custom Data", description: "MUST be used first when prompts mention Metafields or Metaobjects. Use Metafields and Metaobjects to model and store custom data for your app. Metafields extend built-in Shopify data types like products or customers, Metaobjects are custom data types that can be used to store bespoke data structures. Metafield and Metaobject definitions provide a schema and configuration for values to follow.", category: APICategory.CONFIGURATION, visibility: Visibility.PUBLIC, searchable: false + }, + "app-store-review": { + displayName: "App Store Review", + description: "Run a pre-submission compliance check against your Shopify app's codebase. Reviews App Store requirements and surfaces likely issues before you submit for official review.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-dev": { + displayName: "Developer Onboarding", + description: "Get started building on Shopify. Use when a developer asks to build an app, build a theme, create a dev store, set up a partner account, scaffold a project, or get started developing for Shopify. NOT for merchants managing stores.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-merchant": { + displayName: "Merchant Onboarding", + description: "Set up and connect a Shopify store from your AI assistant. Use when the user wants to: set up my Shopify store, connect my store, install Shopify plugin, get started with Shopify, manage my store, add products to my store, merchant onboarding, start selling online, Shopify setup help, create my first store, how do I set up an online store, shopify.com/SKILL.md, import products, migrate from Square, migrate from WooCommerce, migrate from Etsy, migrate from Amazon, migrate from eBay, migrate from Wix, import from Google Merchant Center, migrate from Clover, migrate from Lightspeed, move products to Shopify, import catalog, replatform to Shopify. This is for store owners \u2014 not developers.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor", + frontmatterExtras: { context: "fork" } } -}; +}); // src/schemaOperations/loadAPISchemas.ts function getDataDirectory() { @@ -17724,6 +17684,22 @@ function getDataDirectory() { return path.resolve(currentDir, "../data"); } var dataDir = getDataDirectory(); +function configuredSchemaPath(api) { + const apiConfig = SHOPIFY_APIS[api]; + if (apiConfig?.gqlSchemaPath) return apiConfig.gqlSchemaPath; + if (apiConfig?.gqlSchemaFileName) { + return path.join(dataDir, apiConfig.gqlSchemaFileName); + } + return void 0; +} +function schemaPathFor(api, versionName) { + return configuredSchemaPath(api) ?? path.join(dataDir, `${api}_${versionName}.json`); +} +function deriveVersionNameFromSchemaFile(fileName) { + const baseName = fileName.replace(/\.json(?:\.gz)?$/, ""); + const versionSeparatorIndex = baseName.lastIndexOf("_"); + return versionSeparatorIndex === -1 ? "latest" : baseName.slice(versionSeparatorIndex + 1); +} function loadAPISchemas(apis, schemaOptions) { if (apis.length === 0) { throw new Error("No APIs provided"); @@ -17738,7 +17714,7 @@ function loadAPISchemas(apis, schemaOptions) { { ...schemaOptions, api: apis[0], - schemaPath: schemaOptions.schemaPath ?? SHOPIFY_APIS2[apis[0]]?.gqlSchemaPath ?? path.join(dataDir, `${apis[0]}_${schemaOptions.name}.json`) + schemaPath: schemaOptions.schemaPath ?? schemaPathFor(apis[0], schemaOptions.name) } ]; } @@ -17753,15 +17729,18 @@ function loadAPISchemas(apis, schemaOptions) { const versionsWithApi = versions.map((v) => ({ ...v, api, - schemaPath: SHOPIFY_APIS2[api]?.gqlSchemaPath ?? path.join(dataDir, `${api}_${v.name}.json`) + schemaPath: schemaPathFor(api, v.name) })); apiVersions.push(...versionsWithApi); - } else if (SHOPIFY_APIS2[api]?.gqlSchemaPath) { + } else { + const apiConfig = SHOPIFY_APIS[api]; + const configuredPath = configuredSchemaPath(api); + if (!configuredPath) continue; apiVersions.push({ - name: "latest", + name: apiConfig?.gqlSchemaFileName ? deriveVersionNameFromSchemaFile(apiConfig.gqlSchemaFileName) : "latest", latestVersion: true, api, - schemaPath: SHOPIFY_APIS2[api].gqlSchemaPath + schemaPath: configuredPath }); } } @@ -18186,7 +18165,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -18200,7 +18179,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-customer", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-dev/SKILL.md b/skills/shopify-dev/SKILL.md index e54debe..8a592a8 100644 --- a/skills/shopify-dev/SKILL.md +++ b/skills/shopify-dev/SKILL.md @@ -4,7 +4,7 @@ description: "Search Shopify developer documentation across all APIs. Use only w compatibility: Requires Node.js metadata: author: Shopify - version: "1.1.0" + version: "1.6.0" --- This skill provides a general-purpose search over all of Shopify's developer documentation on shopify.dev. diff --git a/skills/shopify-functions/SKILL.md b/skills/shopify-functions/SKILL.md index 9052eb1..29afb42 100644 --- a/skills/shopify-functions/SKILL.md +++ b/skills/shopify-functions/SKILL.md @@ -4,7 +4,7 @@ description: "Shopify Functions allow developers to customize the backend logic compatibility: Requires Node.js metadata: author: Shopify - version: "1.1.0" + version: "1.6.0" --- ## Required Tool Calls (do not skip) diff --git a/skills/shopify-functions/scripts/search_docs.mjs b/skills/shopify-functions/scripts/search_docs.mjs index dd974e1..4216cfe 100755 --- a/skills/shopify-functions/scripts/search_docs.mjs +++ b/skills/shopify-functions/scripts/search_docs.mjs @@ -22,7 +22,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -36,7 +36,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-functions", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-functions/scripts/validate.mjs b/skills/shopify-functions/scripts/validate.mjs index 7a3c87f..3b2fd94 100755 --- a/skills/shopify-functions/scripts/validate.mjs +++ b/skills/shopify-functions/scripts/validate.mjs @@ -17311,61 +17311,6 @@ import { readFileSync } from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; -// src/types/api-constants.ts -var GRAPHQL_APIs = { - ADMIN: "admin", - STOREFRONT: "storefront-graphql", - PARTNER: "partner", - CUSTOMER: "customer", - PAYMENTS_APPS: "payments-apps" -}; -var FUNCTION_GRAPHQL_SCHEMAS = { - FUNCTIONS_CART_CHECKOUT_VALIDATION: "functions_cart_checkout_validation", - FUNCTIONS_CART_TRANSFORM: "functions_cart_transform", - FUNCTIONS_DELIVERY_CUSTOMIZATION: "functions_delivery_customization", - FUNCTIONS_DISCOUNT: "functions_discount", - FUNCTIONS_DISCOUNTS_ALLOCATOR: "functions_discounts_allocator", - FUNCTIONS_FULFILLMENT_CONSTRAINTS: "functions_fulfillment_constraints", - FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR: "functions_local_pickup_delivery_option_generator", - FUNCTIONS_ORDER_DISCOUNTS: "functions_order_discounts", - FUNCTIONS_ORDER_ROUTING_LOCATION_RULE: "functions_order_routing_location_rule", - FUNCTIONS_PAYMENT_CUSTOMIZATION: "functions_payment_customization", - FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR: "functions_pickup_point_delivery_option_generator", - FUNCTIONS_PRODUCT_DISCOUNTS: "functions_product_discounts", - FUNCTIONS_SHIPPING_DISCOUNTS: "functions_shipping_discounts" -}; -var FUNCTIONS_APIs = { - FUNCTIONS: "functions" - // Main Functions API without GraphQL schema -}; -var TYPESCRIPT_APIs = { - POLARIS_APP_HOME: "polaris-app-home", - POLARIS_ADMIN_EXTENSIONS: "polaris-admin-extensions", - POLARIS_CHECKOUT_EXTENSIONS: "polaris-checkout-extensions", - POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS: "polaris-customer-account-extensions", - POS_UI: "pos-ui", - HYDROGEN: "hydrogen", - STOREFRONT_WEB_COMPONENTS: "storefront-web-components" -}; -var THEME_APIs = { - LIQUID: "liquid" -}; -var CONFIGURATION_APIs = { - CUSTOM_DATA: "custom-data" -}; -var EXECUTION_APIs = { - USE_SHOPIFY_CLI: "use-shopify-cli" -}; -var SHOPIFY_APIS = { - ...GRAPHQL_APIs, - ...FUNCTIONS_APIs, - ...TYPESCRIPT_APIs, - ...THEME_APIs, - ...FUNCTION_GRAPHQL_SCHEMAS, - ...CONFIGURATION_APIs, - ...EXECUTION_APIs -}; - // src/types/api-types.ts var Visibility = { PUBLIC: "public", @@ -17380,23 +17325,28 @@ var APICategory = { UI_FRAMEWORK: "ui-framework", THEME: "theme", CONFIGURATION: "configuration", - EXECUTION: "execution" + EXECUTION: "execution", + GUIDANCE: "guidance" + // Procedural topics (onboarding, review checklists) — hand-maintained, no validation/search }; // src/types/api-mapping.ts -var SHOPIFY_APIS2 = { - [EXECUTION_APIs.USE_SHOPIFY_CLI]: { - name: EXECUTION_APIs.USE_SHOPIFY_CLI, +function defineApis(apis) { + return Object.fromEntries( + Object.entries(apis).map(([name, config]) => [name, { name, ...config }]) + ); +} +var SHOPIFY_APIS = defineApis({ + "use-shopify-cli": { displayName: "Use Shopify CLI", - description: "Choose before `admin` when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`) with **`shopify app config validate --json`** (not Admin GraphQL; MCP has no TOML validator); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", + description: "Choose when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate configuration before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", category: APICategory.EXECUTION, visibility: Visibility.PUBLIC, searchable: false }, - [GRAPHQL_APIs.ADMIN]: { - name: GRAPHQL_APIs.ADMIN, + admin: { displayName: "Admin API", - description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config files** (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`), pre-deploy config errors, or invalid TOML\u2014use **`use-shopify-cli`** and **`shopify app config validate --json`** (no TOML validator here). Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", + description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config validation** \u2014use **`use-shopify-cli`**. Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "admin" }, @@ -17406,10 +17356,9 @@ var SHOPIFY_APIS2 = { context: "creating a product" } }, - [GRAPHQL_APIs.STOREFRONT]: { - name: GRAPHQL_APIs.STOREFRONT, + "storefront-graphql": { displayName: "Storefront GraphQL API", - description: `Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use ${TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS} instead.`, + description: "Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use storefront-web-components instead.", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "storefront" }, @@ -17419,8 +17368,7 @@ var SHOPIFY_APIS2 = { context: "storefront search" } }, - [GRAPHQL_APIs.PARTNER]: { - name: GRAPHQL_APIs.PARTNER, + partner: { displayName: "Partner API", description: "The Partner API lets you programmatically access data about your Partner Dashboard, including your apps, themes, and affiliate referrals.", category: APICategory.GRAPHQL, @@ -17432,8 +17380,7 @@ var SHOPIFY_APIS2 = { context: "app install data" } }, - [GRAPHQL_APIs.CUSTOMER]: { - name: GRAPHQL_APIs.CUSTOMER, + customer: { displayName: "Customer Account API", description: "The Customer Account API allows customers to access their own data including orders, payment methods, and addresses.", category: APICategory.GRAPHQL, @@ -17445,8 +17392,7 @@ var SHOPIFY_APIS2 = { context: "customer order history" } }, - [GRAPHQL_APIs.PAYMENTS_APPS]: { - name: GRAPHQL_APIs.PAYMENTS_APPS, + "payments-apps": { displayName: "Payments Apps API", description: "The Payments Apps API enables payment providers to integrate their payment solutions with Shopify's checkout.", category: APICategory.GRAPHQL, @@ -17458,8 +17404,7 @@ var SHOPIFY_APIS2 = { context: "pending a payment session" } }, - [FUNCTIONS_APIs.FUNCTIONS]: { - name: FUNCTIONS_APIs.FUNCTIONS, + functions: { displayName: "Shopify Functions", description: "Shopify Functions allow developers to customize the backend logic that powers parts of Shopify. Available APIs: Discount, Cart and Checkout Validation, Cart Transform, Pickup Point Delivery Option Generator, Delivery Customization, Fulfillment Constraints, Local Pickup Delivery Option Generator, Order Routing Location Rule, Payment Customization", category: APICategory.FUNCTIONS, @@ -17471,8 +17416,7 @@ var SHOPIFY_APIS2 = { } }, // Function-specific GraphQL APIs for input query validation - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION, + functions_cart_checkout_validation: { displayName: "Cart Checkout Validation Function", description: "GraphQL schema for Cart and Checkout Validation Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17481,16 +17425,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_cart_checkout_validation_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM, + functions_cart_transform: { displayName: "Cart Transform Function", description: "GraphQL schema for Cart Transform Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_cart_transform_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION, + functions_delivery_customization: { displayName: "Delivery Customization Function", description: "GraphQL schema for Delivery Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17499,24 +17441,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_delivery_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT, + functions_discount: { displayName: "Discount Function", description: "GraphQL schema for Discount Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discount_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR, + functions_discounts_allocator: { displayName: "Discounts Allocator Function", description: "GraphQL schema for Discounts Allocator Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discounts_allocator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS, + functions_fulfillment_constraints: { displayName: "Fulfillment Constraints Function", description: "GraphQL schema for Fulfillment Constraints Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17525,8 +17464,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_fulfillment_constraints_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR, + functions_local_pickup_delivery_option_generator: { displayName: "Local Pickup Delivery Option Generator Function", description: "GraphQL schema for Local Pickup Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17535,16 +17473,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_local_pickup_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS, + functions_order_discounts: { displayName: "Order Discounts Function", description: "GraphQL schema for Order Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_order_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE, + functions_order_routing_location_rule: { displayName: "Order Routing Location Rule Function", description: "GraphQL schema for Order Routing Location Rule Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17553,8 +17489,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_order_routing_location_rule_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION, + functions_payment_customization: { displayName: "Payment Customization Function", description: "GraphQL schema for Payment Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17563,8 +17498,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_payment_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR, + functions_pickup_point_delivery_option_generator: { displayName: "Pickup Point Delivery Option Generator Function", description: "GraphQL schema for Pickup Point Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17573,24 +17507,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_pickup_point_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS, + functions_product_discounts: { displayName: "Product Discounts Function", description: "GraphQL schema for Product Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_product_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS, + functions_shipping_discounts: { displayName: "Shipping Discounts Function", description: "GraphQL schema for Shipping Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_shipping_discounts_schema" } }, - [TYPESCRIPT_APIs.POLARIS_APP_HOME]: { - name: TYPESCRIPT_APIs.POLARIS_APP_HOME, + "polaris-app-home": { displayName: "Polaris App Home", description: "Build your app's primary user interface embedded in the Shopify admin. If the prompt just mentions `Polaris` and you can't tell based off of the context what API they meant, assume they meant this API.", category: APICategory.UI_FRAMEWORK, @@ -17602,13 +17533,14 @@ var SHOPIFY_APIS2 = { context: "form in app home" } }, - [TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS, + "polaris-admin-extensions": { displayName: "Polaris Admin Extensions", description: `Add custom actions and blocks from your app at contextually relevant spots throughout the Shopify Admin. Admin UI Extensions also supports scaffolding new adminextensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "admin", + extensionTypeName: "Admin Extensions", + extensionSearchContext: "admin UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17616,13 +17548,14 @@ var SHOPIFY_APIS2 = { context: "text input in an admin extension" } }, - [TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS, + "polaris-checkout-extensions": { displayName: "Polaris Checkout Extensions", description: `Build custom functionality that merchants can install at defined points in the checkout flow, including product information, shipping, payment, order summary, and Shop Pay. Checkout UI Extensions also supports scaffolding new checkout extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "checkout", + extensionTypeName: "Checkout Extensions", + extensionSearchContext: "checkout UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17630,13 +17563,14 @@ var SHOPIFY_APIS2 = { context: "checkout button" } }, - [TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS, + "polaris-customer-account-extensions": { displayName: "Polaris Customer Account Extensions", description: `Build custom functionality that merchants can install at defined points on the Order index, Order status, and Profile pages in customer accounts. Customer Account UI Extensions also supports scaffolding new customer account extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "customer-account", + extensionTypeName: "Customer Account Extensions", + extensionSearchContext: "customer account UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17644,13 +17578,14 @@ var SHOPIFY_APIS2 = { context: "customer account card" } }, - [TYPESCRIPT_APIs.POS_UI]: { - name: TYPESCRIPT_APIs.POS_UI, + "pos-ui": { displayName: "POS UI", description: `Build retail point-of-sale applications using Shopify's POS UI components. These components provide a consistent and familiar interface for POS applications. POS UI Extensions also supports scaffolding new POS extensions using Shopify CLI commands. Keywords: POS, Retail, smart grid`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "point-of-sale", + extensionTypeName: "POS UI Extensions", + extensionSearchContext: "POS UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17658,8 +17593,7 @@ var SHOPIFY_APIS2 = { context: "POS screen layout" } }, - [TYPESCRIPT_APIs.HYDROGEN]: { - name: TYPESCRIPT_APIs.HYDROGEN, + hydrogen: { displayName: "Hydrogen", description: "Hydrogen storefront implementation cookbooks. Some of the available recipes are: B2B Commerce, Bundles, Combined Listings, Custom Cart Method, Dynamic Content with Metaobjects, Express Server, Google Tag Manager Integration, Infinite Scroll, Legacy Customer Account Flow, Markets, Partytown + Google Tag Manager, Subscriptions, Third-party API Queries and Caching. MANDATORY: Use this API for ANY Hydrogen storefront question - do NOT use Storefront GraphQL when 'Hydrogen' is mentioned.", category: APICategory.UI_FRAMEWORK, @@ -17671,8 +17605,7 @@ var SHOPIFY_APIS2 = { context: "cart UI" } }, - [TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS]: { - name: TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS, + "storefront-web-components": { displayName: "Storefront Web Components", description: "HTML-first web components for building storefronts WITHOUT GraphQL. Choose when prompts mention: Web Components, HTML tags (, , , , ), native , 'HTML-only', 'without JavaScript', or 'no GraphQL'. Components handle data fetching and state internally.", category: APICategory.UI_FRAMEWORK, @@ -17681,10 +17614,13 @@ var SHOPIFY_APIS2 = { // Docs has and not a npm package publicPackages: ["@shopify/polaris-types", "@shopify/app-bridge-types"], visibility: Visibility.EARLY_ACCESS, - validation: true + validation: true, + exampleVectorStoreQuery: { + query: "shopify-cart", + context: "cart web component" + } }, - [THEME_APIs.LIQUID]: { - name: THEME_APIs.LIQUID, + liquid: { displayName: "Liquid", description: "Liquid is an open-source templating language created by Shopify. It is the backbone of Shopify themes and is used to load dynamic content on storefronts. Keywords: liquid, theme, shopify-theme, liquid-component, liquid-block, liquid-section, liquid-snippet, liquid-schemas, shopify-theme-schemas", category: APICategory.THEME, @@ -17696,15 +17632,39 @@ var SHOPIFY_APIS2 = { context: "product metafield access in a theme" } }, - [CONFIGURATION_APIs.CUSTOM_DATA]: { - name: CONFIGURATION_APIs.CUSTOM_DATA, + "custom-data": { displayName: "Custom Data", description: "MUST be used first when prompts mention Metafields or Metaobjects. Use Metafields and Metaobjects to model and store custom data for your app. Metafields extend built-in Shopify data types like products or customers, Metaobjects are custom data types that can be used to store bespoke data structures. Metafield and Metaobject definitions provide a schema and configuration for values to follow.", category: APICategory.CONFIGURATION, visibility: Visibility.PUBLIC, searchable: false + }, + "app-store-review": { + displayName: "App Store Review", + description: "Run a pre-submission compliance check against your Shopify app's codebase. Reviews App Store requirements and surfaces likely issues before you submit for official review.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-dev": { + displayName: "Developer Onboarding", + description: "Get started building on Shopify. Use when a developer asks to build an app, build a theme, create a dev store, set up a partner account, scaffold a project, or get started developing for Shopify. NOT for merchants managing stores.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-merchant": { + displayName: "Merchant Onboarding", + description: "Set up and connect a Shopify store from your AI assistant. Use when the user wants to: set up my Shopify store, connect my store, install Shopify plugin, get started with Shopify, manage my store, add products to my store, merchant onboarding, start selling online, Shopify setup help, create my first store, how do I set up an online store, shopify.com/SKILL.md, import products, migrate from Square, migrate from WooCommerce, migrate from Etsy, migrate from Amazon, migrate from eBay, migrate from Wix, import from Google Merchant Center, migrate from Clover, migrate from Lightspeed, move products to Shopify, import catalog, replatform to Shopify. This is for store owners \u2014 not developers.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor", + frontmatterExtras: { context: "fork" } } -}; +}); // src/schemaOperations/loadAPISchemas.ts function getDataDirectory() { @@ -17724,6 +17684,22 @@ function getDataDirectory() { return path.resolve(currentDir, "../data"); } var dataDir = getDataDirectory(); +function configuredSchemaPath(api) { + const apiConfig = SHOPIFY_APIS[api]; + if (apiConfig?.gqlSchemaPath) return apiConfig.gqlSchemaPath; + if (apiConfig?.gqlSchemaFileName) { + return path.join(dataDir, apiConfig.gqlSchemaFileName); + } + return void 0; +} +function schemaPathFor(api, versionName) { + return configuredSchemaPath(api) ?? path.join(dataDir, `${api}_${versionName}.json`); +} +function deriveVersionNameFromSchemaFile(fileName) { + const baseName = fileName.replace(/\.json(?:\.gz)?$/, ""); + const versionSeparatorIndex = baseName.lastIndexOf("_"); + return versionSeparatorIndex === -1 ? "latest" : baseName.slice(versionSeparatorIndex + 1); +} function loadAPISchemas(apis, schemaOptions) { if (apis.length === 0) { throw new Error("No APIs provided"); @@ -17738,7 +17714,7 @@ function loadAPISchemas(apis, schemaOptions) { { ...schemaOptions, api: apis[0], - schemaPath: schemaOptions.schemaPath ?? SHOPIFY_APIS2[apis[0]]?.gqlSchemaPath ?? path.join(dataDir, `${apis[0]}_${schemaOptions.name}.json`) + schemaPath: schemaOptions.schemaPath ?? schemaPathFor(apis[0], schemaOptions.name) } ]; } @@ -17753,15 +17729,18 @@ function loadAPISchemas(apis, schemaOptions) { const versionsWithApi = versions.map((v) => ({ ...v, api, - schemaPath: SHOPIFY_APIS2[api]?.gqlSchemaPath ?? path.join(dataDir, `${api}_${v.name}.json`) + schemaPath: schemaPathFor(api, v.name) })); apiVersions.push(...versionsWithApi); - } else if (SHOPIFY_APIS2[api]?.gqlSchemaPath) { + } else { + const apiConfig = SHOPIFY_APIS[api]; + const configuredPath = configuredSchemaPath(api); + if (!configuredPath) continue; apiVersions.push({ - name: "latest", + name: apiConfig?.gqlSchemaFileName ? deriveVersionNameFromSchemaFile(apiConfig.gqlSchemaFileName) : "latest", latestVersion: true, api, - schemaPath: SHOPIFY_APIS2[api].gqlSchemaPath + schemaPath: configuredPath }); } } @@ -18186,7 +18165,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -18200,7 +18179,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-functions", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-hydrogen/SKILL.md b/skills/shopify-hydrogen/SKILL.md index 4e878f3..0c80e5b 100644 --- a/skills/shopify-hydrogen/SKILL.md +++ b/skills/shopify-hydrogen/SKILL.md @@ -4,7 +4,7 @@ description: "Hydrogen storefront implementation cookbooks. Some of the availabl compatibility: Requires Node.js metadata: author: Shopify - version: "1.1.0" + version: "1.6.0" --- ## Required Tool Calls (do not skip) diff --git a/skills/shopify-hydrogen/package-lock.json b/skills/shopify-hydrogen/package-lock.json deleted file mode 100644 index 963b1da..0000000 --- a/skills/shopify-hydrogen/package-lock.json +++ /dev/null @@ -1,2536 +0,0 @@ -{ - "name": "shopify-hydrogen", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "shopify-hydrogen", - "dependencies": { - "@react-router/dev": "7.13.2", - "@shopify/hydrogen": "2026.1.3", - "@shopify/hydrogen-react": "2026.1.2", - "@types/react": "19.2.14", - "graphql": "16.13.1", - "preact": "10.28.4", - "react-router": "7.13.2", - "schema-dts": "1.1.5", - "type-fest": "5.5.0", - "typescript": "5.9.3" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", - "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", - "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", - "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", - "license": "MIT", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", - "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", - "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", - "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@google/model-viewer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@google/model-viewer/-/model-viewer-4.2.0.tgz", - "integrity": "sha512-RjpAI5cLs9CdvPcMRsOs8Bea/lNmGTTyaPyl16o9Fv6Qn8VSpgBMmXFr/11yb0hTrsojp2dOACEcY77R8hVUVA==", - "license": "Apache-2.0", - "dependencies": { - "@monogrid/gainmap-js": "^3.1.0", - "lit": "^3.2.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "three": "^0.182.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@juggle/resize-observer": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", - "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", - "license": "Apache-2.0" - }, - "node_modules/@lit-labs/ssr-dom-shim": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.5.1.tgz", - "integrity": "sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==", - "license": "BSD-3-Clause" - }, - "node_modules/@lit/reactive-element": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.2.tgz", - "integrity": "sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==", - "license": "BSD-3-Clause", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.5.0" - } - }, - "node_modules/@mjackson/node-fetch-server": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@mjackson/node-fetch-server/-/node-fetch-server-0.2.0.tgz", - "integrity": "sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng==", - "license": "MIT" - }, - "node_modules/@monogrid/gainmap-js": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.4.0.tgz", - "integrity": "sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg==", - "license": "MIT", - "dependencies": { - "promise-worker-transferable": "^1.0.4" - }, - "peerDependencies": { - "three": ">= 0.159.0" - } - }, - "node_modules/@react-router/dev": { - "version": "7.13.2", - "resolved": "https://registry.npmjs.org/@react-router/dev/-/dev-7.13.2.tgz", - "integrity": "sha512-8Lgf+WCEIPDhp22YB3fyoiWnNyM39sjkfWnSxAwy+Sg83OHxnQFQg0OK1oPM9lm1n/hxJe4lLYOPNwDSyeGiog==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.7", - "@babel/generator": "^7.27.5", - "@babel/parser": "^7.27.7", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/preset-typescript": "^7.27.1", - "@babel/traverse": "^7.27.7", - "@babel/types": "^7.27.7", - "@react-router/node": "7.13.2", - "@remix-run/node-fetch-server": "^0.13.0", - "arg": "^5.0.1", - "babel-dead-code-elimination": "^1.0.6", - "chokidar": "^4.0.0", - "dedent": "^1.5.3", - "es-module-lexer": "^1.3.1", - "exit-hook": "2.2.1", - "isbot": "^5.1.11", - "jsesc": "3.0.2", - "lodash": "^4.17.21", - "p-map": "^7.0.3", - "pathe": "^1.1.2", - "picocolors": "^1.1.1", - "pkg-types": "^2.3.0", - "prettier": "^3.6.2", - "react-refresh": "^0.14.0", - "semver": "^7.3.7", - "tinyglobby": "^0.2.14", - "valibot": "^1.2.0", - "vite-node": "^3.2.2" - }, - "bin": { - "react-router": "bin.js" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@react-router/serve": "^7.13.2", - "@vitejs/plugin-rsc": "~0.5.7", - "react-router": "^7.13.2", - "react-server-dom-webpack": "^19.2.3", - "typescript": "^5.1.0", - "vite": "^5.1.0 || ^6.0.0 || ^7.0.0", - "wrangler": "^3.28.2 || ^4.0.0" - }, - "peerDependenciesMeta": { - "@react-router/serve": { - "optional": true - }, - "@vitejs/plugin-rsc": { - "optional": true - }, - "react-server-dom-webpack": { - "optional": true - }, - "typescript": { - "optional": true - }, - "wrangler": { - "optional": true - } - } - }, - "node_modules/@react-router/node": { - "version": "7.13.2", - "resolved": "https://registry.npmjs.org/@react-router/node/-/node-7.13.2.tgz", - "integrity": "sha512-1q0v1gclPga2mNQ7Q+MLuLdEPRpDefAmz25jOlrEz+jSyYkaFt9qbSdkTUPw/QIg/DDnnT3QV8lhgr6r5iIAOA==", - "license": "MIT", - "dependencies": { - "@mjackson/node-fetch-server": "^0.2.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react-router": "7.13.2", - "typescript": "^5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@remix-run/node-fetch-server": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@remix-run/node-fetch-server/-/node-fetch-server-0.13.0.tgz", - "integrity": "sha512-1EsNo0ZpgXu/90AWoRZf/oE3RVTUS80tiTUpt+hv5pjtAkw7icN4WskDwz/KdAw5ARbJLMhZBrO1NqThmy/McA==", - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", - "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", - "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", - "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", - "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", - "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", - "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", - "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", - "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", - "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", - "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", - "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", - "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", - "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", - "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", - "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", - "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", - "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", - "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", - "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", - "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", - "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", - "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", - "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", - "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", - "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@shopify/graphql-client": { - "version": "1.4.1", - "resolved": "https://npm.shopify.io/node/@shopify/graphql-client/-/graphql-client-1.4.1.tgz", - "integrity": "sha512-/w4Uchx8ueI8gwmJd1ZbbIGndsjfMEFlzmay3P7rya5zj7K308xne/ggIvWDweueIut2qf1A8lI58xQl9Pu22w==", - "license": "MIT" - }, - "node_modules/@shopify/hydrogen": { - "version": "2026.1.3", - "resolved": "https://npm.shopify.io/node/@shopify/hydrogen/-/hydrogen-2026.1.3.tgz", - "integrity": "sha512-h6J9SemK4SqOmsmlPW7GhC1bdeCJ7ghcRVIqOMJwFrGENhbOOWKhEKJ2cEjw/eEfKmnY0BYUbCmYNVRaDivGjw==", - "license": "MIT", - "dependencies": { - "@shopify/graphql-client": "1.4.1", - "@shopify/hydrogen-react": "2026.1.2", - "content-security-policy-builder": "^2.2.0", - "flame-chart-js": "2.3.1", - "isbot": "^5.1.21", - "source-map-support": "^0.5.21", - "type-fest": "^4.33.0", - "use-resize-observer": "^9.1.0", - "worktop": "^0.7.3" - }, - "peerDependencies": { - "@react-router/dev": "7.12.0", - "react": "^18.3.1 || ~19.0.3 || ~19.1.4 || ^19.2.3", - "react-router": "7.12.0", - "vite": "^5.1.0 || ^6.2.1" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/@shopify/hydrogen-react": { - "version": "2026.1.2", - "resolved": "https://npm.shopify.io/node/@shopify/hydrogen-react/-/hydrogen-react-2026.1.2.tgz", - "integrity": "sha512-FV/D+5eK/cu51BAqVlqifhVjbf0VTg3J5Lr3lcwMghaFAY2WeQ37WMIDfeeg/zcr3/QiwENf1wxH160Vdi/YOQ==", - "license": "MIT", - "dependencies": { - "@google/model-viewer": "^4.0.0", - "@xstate/fsm": "2.0.0", - "ast-v8-to-istanbul": "^0.3.11", - "graphql": "^16.10.0", - "type-fest": "^4.33.0", - "worktop": "^0.7.3" - }, - "peerDependencies": { - "react": "^18.3.1 || ~19.0.3 || ~19.1.4 || ^19.2.3", - "react-dom": "^18.3.1 || ~19.0.3 || ~19.1.4 || ^19.2.3", - "vite": "^5.1.0 || ^6.2.1" - } - }, - "node_modules/@shopify/hydrogen-react/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@shopify/hydrogen/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", - "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT" - }, - "node_modules/@xstate/fsm": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@xstate/fsm/-/fsm-2.0.0.tgz", - "integrity": "sha512-p/zcvBMoU2ap5byMefLkR+AM+Eh99CU/SDEQeccgKlmFNOMDwphaRGqdk+emvel/SaGZ7Rf9sDvzAplLzLdEVQ==", - "license": "MIT" - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/ast-v8-to-istanbul": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.12.tgz", - "integrity": "sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.31", - "estree-walker": "^3.0.3", - "js-tokens": "^10.0.0" - } - }, - "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "license": "MIT" - }, - "node_modules/babel-dead-code-elimination": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.12.tgz", - "integrity": "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.16", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.16.tgz", - "integrity": "sha512-Lyf3aK28zpsD1yQMiiHD4RvVb6UdMoo8xzG2XzFIfR9luPzOpcBlAsT/qfB1XWS1bxWT+UtE4WmQgsp297FYOA==", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001787", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001787.tgz", - "integrity": "sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/confbox": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", - "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", - "license": "MIT" - }, - "node_modules/content-security-policy-builder": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.3.0.tgz", - "integrity": "sha512-qmdEmn1M+WpadIeBLKr9Em8VJSCjtRINCSbYsyJHQ4liTwCmrLzIRpJdJpoVDnsvWUrR5iblYhQJqA4b4Hs/iw==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" - }, - "node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", - "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.334", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.334.tgz", - "integrity": "sha512-mgjZAz7Jyx1SRCwEpy9wefDS7GvNPazLthHg8eQMJ76wBdGQQDW33TCrUTvQ4wzpmOrv2zrFoD3oNufMdyMpog==", - "license": "ISC" - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", - "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.7", - "@esbuild/android-arm": "0.27.7", - "@esbuild/android-arm64": "0.27.7", - "@esbuild/android-x64": "0.27.7", - "@esbuild/darwin-arm64": "0.27.7", - "@esbuild/darwin-x64": "0.27.7", - "@esbuild/freebsd-arm64": "0.27.7", - "@esbuild/freebsd-x64": "0.27.7", - "@esbuild/linux-arm": "0.27.7", - "@esbuild/linux-arm64": "0.27.7", - "@esbuild/linux-ia32": "0.27.7", - "@esbuild/linux-loong64": "0.27.7", - "@esbuild/linux-mips64el": "0.27.7", - "@esbuild/linux-ppc64": "0.27.7", - "@esbuild/linux-riscv64": "0.27.7", - "@esbuild/linux-s390x": "0.27.7", - "@esbuild/linux-x64": "0.27.7", - "@esbuild/netbsd-arm64": "0.27.7", - "@esbuild/netbsd-x64": "0.27.7", - "@esbuild/openbsd-arm64": "0.27.7", - "@esbuild/openbsd-x64": "0.27.7", - "@esbuild/openharmony-arm64": "0.27.7", - "@esbuild/sunos-x64": "0.27.7", - "@esbuild/win32-arm64": "0.27.7", - "@esbuild/win32-ia32": "0.27.7", - "@esbuild/win32-x64": "0.27.7" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/exit-hook": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", - "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/exsolve": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", - "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", - "license": "MIT" - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/flame-chart-js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/flame-chart-js/-/flame-chart-js-2.3.1.tgz", - "integrity": "sha512-wi3g+BEYEWcxnFrakPt7A/oXVfMnun6Uvjve3kfscXXCrgP6f1O8o5LOseXfHnVI1jxTWOINnzdXPN/NLw9guQ==", - "license": "MIT", - "dependencies": { - "color": "^3.1.3", - "events": "^3.2.0" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/graphql": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.13.1.tgz", - "integrity": "sha512-gGgrVCoDKlIZ8fIqXBBb0pPKqDgki0Z/FSKNiQzSGj2uEYHr1tq5wmBegGwJx6QB5S5cM0khSBpi/JFHMCvsmQ==", - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "license": "MIT" - }, - "node_modules/is-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", - "license": "MIT" - }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "license": "MIT" - }, - "node_modules/isbot": { - "version": "5.1.37", - "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.37.tgz", - "integrity": "sha512-5bcicX81xf6NlTEV8rWdg7Pk01LFizDetuYGHx6d/f6y3lR2/oo8IfxjzJqn1UdDEyCcwT9e7NRloj8DwCYujQ==", - "license": "Unlicense", - "engines": { - "node": ">=18" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/lit": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.2.tgz", - "integrity": "sha512-NF9zbsP79l4ao2SNrH3NkfmFgN/hBYSQo90saIVI1o5GpjAdCPVstVzO1MrLOakHoEhYkrtRjPK6Ob521aoYWQ==", - "license": "BSD-3-Clause", - "dependencies": { - "@lit/reactive-element": "^2.1.0", - "lit-element": "^4.2.0", - "lit-html": "^3.3.0" - } - }, - "node_modules/lit-element": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.2.tgz", - "integrity": "sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==", - "license": "BSD-3-Clause", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.5.0", - "@lit/reactive-element": "^2.1.0", - "lit-html": "^3.3.0" - } - }, - "node_modules/lit-html": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.2.tgz", - "integrity": "sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==", - "license": "BSD-3-Clause", - "dependencies": { - "@types/trusted-types": "^2.0.2" - } - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-releases": { - "version": "2.0.37", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", - "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", - "license": "MIT" - }, - "node_modules/p-map": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", - "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", - "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", - "license": "MIT", - "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", - "pathe": "^2.0.3" - } - }, - "node_modules/pkg-types/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "license": "MIT" - }, - "node_modules/postcss": { - "version": "8.5.9", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.9.tgz", - "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/preact": { - "version": "10.28.4", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.4.tgz", - "integrity": "sha512-uKFfOHWuSNpRFVTnljsCluEFq57OKT+0QdOiQo8XWnQ/pSvg7OpX5eNOejELXJMWy+BwM2nobz0FkvzmnpCNsQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/promise-worker-transferable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", - "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", - "license": "Apache-2.0", - "dependencies": { - "is-promise": "^2.1.0", - "lie": "^3.0.2" - } - }, - "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-router": { - "version": "7.13.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.13.2.tgz", - "integrity": "sha512-tX1Aee+ArlKQP+NIUd7SE6Li+CiGKwQtbS+FfRxPX6Pe4vHOo6nr9d++u5cwg+Z8K/x8tP+7qLmujDtfrAoUJA==", - "license": "MIT", - "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/regexparam": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-2.0.2.tgz", - "integrity": "sha512-A1PeDEYMrkLrfyOwv2jwihXbo9qxdGD3atBYQA9JJgreAx8/7rC6IUkWOw2NQlOxLp2wL0ifQbh1HuidDfYA6w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", - "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.1", - "@rollup/rollup-android-arm64": "4.60.1", - "@rollup/rollup-darwin-arm64": "4.60.1", - "@rollup/rollup-darwin-x64": "4.60.1", - "@rollup/rollup-freebsd-arm64": "4.60.1", - "@rollup/rollup-freebsd-x64": "4.60.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", - "@rollup/rollup-linux-arm-musleabihf": "4.60.1", - "@rollup/rollup-linux-arm64-gnu": "4.60.1", - "@rollup/rollup-linux-arm64-musl": "4.60.1", - "@rollup/rollup-linux-loong64-gnu": "4.60.1", - "@rollup/rollup-linux-loong64-musl": "4.60.1", - "@rollup/rollup-linux-ppc64-gnu": "4.60.1", - "@rollup/rollup-linux-ppc64-musl": "4.60.1", - "@rollup/rollup-linux-riscv64-gnu": "4.60.1", - "@rollup/rollup-linux-riscv64-musl": "4.60.1", - "@rollup/rollup-linux-s390x-gnu": "4.60.1", - "@rollup/rollup-linux-x64-gnu": "4.60.1", - "@rollup/rollup-linux-x64-musl": "4.60.1", - "@rollup/rollup-openbsd-x64": "4.60.1", - "@rollup/rollup-openharmony-arm64": "4.60.1", - "@rollup/rollup-win32-arm64-msvc": "4.60.1", - "@rollup/rollup-win32-ia32-msvc": "4.60.1", - "@rollup/rollup-win32-x64-gnu": "4.60.1", - "@rollup/rollup-win32-x64-msvc": "4.60.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/schema-dts": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", - "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", - "license": "Apache-2.0" - }, - "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", - "license": "MIT" - }, - "node_modules/simple-swizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", - "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/tagged-tag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", - "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/type-fest": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.5.0.tgz", - "integrity": "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==", - "license": "(MIT OR CC0-1.0)", - "dependencies": { - "tagged-tag": "^1.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/use-resize-observer": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/use-resize-observer/-/use-resize-observer-9.1.0.tgz", - "integrity": "sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==", - "license": "MIT", - "dependencies": { - "@juggle/resize-observer": "^3.3.1" - }, - "peerDependencies": { - "react": "16.8.0 - 18", - "react-dom": "16.8.0 - 18" - } - }, - "node_modules/valibot": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.3.1.tgz", - "integrity": "sha512-sfdRir/QFM0JaF22hqTroPc5xy4DimuGQVKFrzF1YfGwaS1nJot3Y8VqMdLO2Lg27fMzat2yD3pY5PbAYO39Gg==", - "license": "MIT", - "peerDependencies": { - "typescript": ">=5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vite": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", - "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", - "license": "MIT", - "dependencies": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-node/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "license": "MIT" - }, - "node_modules/worktop": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/worktop/-/worktop-0.7.3.tgz", - "integrity": "sha512-WBHP1hk8pLP7ahAw13fugDWcO0SUAOiCD6DHT/bfLWoCIA/PL9u7GKdudT2nGZ8EGR1APbGCAI6ZzKG1+X+PnQ==", - "license": "MIT", - "dependencies": { - "regexparam": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - } - } -} diff --git a/skills/shopify-hydrogen/scripts/search_docs.mjs b/skills/shopify-hydrogen/scripts/search_docs.mjs index 5d995e1..459c7f7 100755 --- a/skills/shopify-hydrogen/scripts/search_docs.mjs +++ b/skills/shopify-hydrogen/scripts/search_docs.mjs @@ -22,7 +22,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -36,7 +36,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-hydrogen", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-hydrogen/scripts/validate.mjs b/skills/shopify-hydrogen/scripts/validate.mjs index 7e670ea..2aa64b6 100755 --- a/skills/shopify-hydrogen/scripts/validate.mjs +++ b/skills/shopify-hydrogen/scripts/validate.mjs @@ -4,61 +4,6 @@ import { readFileSync } from "fs"; import { parseArgs } from "util"; -// src/types/api-constants.ts -var GRAPHQL_APIs = { - ADMIN: "admin", - STOREFRONT: "storefront-graphql", - PARTNER: "partner", - CUSTOMER: "customer", - PAYMENTS_APPS: "payments-apps" -}; -var FUNCTION_GRAPHQL_SCHEMAS = { - FUNCTIONS_CART_CHECKOUT_VALIDATION: "functions_cart_checkout_validation", - FUNCTIONS_CART_TRANSFORM: "functions_cart_transform", - FUNCTIONS_DELIVERY_CUSTOMIZATION: "functions_delivery_customization", - FUNCTIONS_DISCOUNT: "functions_discount", - FUNCTIONS_DISCOUNTS_ALLOCATOR: "functions_discounts_allocator", - FUNCTIONS_FULFILLMENT_CONSTRAINTS: "functions_fulfillment_constraints", - FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR: "functions_local_pickup_delivery_option_generator", - FUNCTIONS_ORDER_DISCOUNTS: "functions_order_discounts", - FUNCTIONS_ORDER_ROUTING_LOCATION_RULE: "functions_order_routing_location_rule", - FUNCTIONS_PAYMENT_CUSTOMIZATION: "functions_payment_customization", - FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR: "functions_pickup_point_delivery_option_generator", - FUNCTIONS_PRODUCT_DISCOUNTS: "functions_product_discounts", - FUNCTIONS_SHIPPING_DISCOUNTS: "functions_shipping_discounts" -}; -var FUNCTIONS_APIs = { - FUNCTIONS: "functions" - // Main Functions API without GraphQL schema -}; -var TYPESCRIPT_APIs = { - POLARIS_APP_HOME: "polaris-app-home", - POLARIS_ADMIN_EXTENSIONS: "polaris-admin-extensions", - POLARIS_CHECKOUT_EXTENSIONS: "polaris-checkout-extensions", - POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS: "polaris-customer-account-extensions", - POS_UI: "pos-ui", - HYDROGEN: "hydrogen", - STOREFRONT_WEB_COMPONENTS: "storefront-web-components" -}; -var THEME_APIs = { - LIQUID: "liquid" -}; -var CONFIGURATION_APIs = { - CUSTOM_DATA: "custom-data" -}; -var EXECUTION_APIs = { - USE_SHOPIFY_CLI: "use-shopify-cli" -}; -var SHOPIFY_APIS = { - ...GRAPHQL_APIs, - ...FUNCTIONS_APIs, - ...TYPESCRIPT_APIs, - ...THEME_APIs, - ...FUNCTION_GRAPHQL_SCHEMAS, - ...CONFIGURATION_APIs, - ...EXECUTION_APIs -}; - // src/types/api-types.ts var Visibility = { PUBLIC: "public", @@ -73,23 +18,28 @@ var APICategory = { UI_FRAMEWORK: "ui-framework", THEME: "theme", CONFIGURATION: "configuration", - EXECUTION: "execution" + EXECUTION: "execution", + GUIDANCE: "guidance" + // Procedural topics (onboarding, review checklists) — hand-maintained, no validation/search }; // src/types/api-mapping.ts -var SHOPIFY_APIS2 = { - [EXECUTION_APIs.USE_SHOPIFY_CLI]: { - name: EXECUTION_APIs.USE_SHOPIFY_CLI, +function defineApis(apis) { + return Object.fromEntries( + Object.entries(apis).map(([name, config]) => [name, { name, ...config }]) + ); +} +var SHOPIFY_APIS = defineApis({ + "use-shopify-cli": { displayName: "Use Shopify CLI", - description: "Choose before `admin` when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`) with **`shopify app config validate --json`** (not Admin GraphQL; MCP has no TOML validator); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", + description: "Choose when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate configuration before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", category: APICategory.EXECUTION, visibility: Visibility.PUBLIC, searchable: false }, - [GRAPHQL_APIs.ADMIN]: { - name: GRAPHQL_APIs.ADMIN, + admin: { displayName: "Admin API", - description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config files** (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`), pre-deploy config errors, or invalid TOML\u2014use **`use-shopify-cli`** and **`shopify app config validate --json`** (no TOML validator here). Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", + description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config validation** \u2014use **`use-shopify-cli`**. Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "admin" }, @@ -99,10 +49,9 @@ var SHOPIFY_APIS2 = { context: "creating a product" } }, - [GRAPHQL_APIs.STOREFRONT]: { - name: GRAPHQL_APIs.STOREFRONT, + "storefront-graphql": { displayName: "Storefront GraphQL API", - description: `Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use ${TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS} instead.`, + description: "Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use storefront-web-components instead.", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "storefront" }, @@ -112,8 +61,7 @@ var SHOPIFY_APIS2 = { context: "storefront search" } }, - [GRAPHQL_APIs.PARTNER]: { - name: GRAPHQL_APIs.PARTNER, + partner: { displayName: "Partner API", description: "The Partner API lets you programmatically access data about your Partner Dashboard, including your apps, themes, and affiliate referrals.", category: APICategory.GRAPHQL, @@ -125,8 +73,7 @@ var SHOPIFY_APIS2 = { context: "app install data" } }, - [GRAPHQL_APIs.CUSTOMER]: { - name: GRAPHQL_APIs.CUSTOMER, + customer: { displayName: "Customer Account API", description: "The Customer Account API allows customers to access their own data including orders, payment methods, and addresses.", category: APICategory.GRAPHQL, @@ -138,8 +85,7 @@ var SHOPIFY_APIS2 = { context: "customer order history" } }, - [GRAPHQL_APIs.PAYMENTS_APPS]: { - name: GRAPHQL_APIs.PAYMENTS_APPS, + "payments-apps": { displayName: "Payments Apps API", description: "The Payments Apps API enables payment providers to integrate their payment solutions with Shopify's checkout.", category: APICategory.GRAPHQL, @@ -151,8 +97,7 @@ var SHOPIFY_APIS2 = { context: "pending a payment session" } }, - [FUNCTIONS_APIs.FUNCTIONS]: { - name: FUNCTIONS_APIs.FUNCTIONS, + functions: { displayName: "Shopify Functions", description: "Shopify Functions allow developers to customize the backend logic that powers parts of Shopify. Available APIs: Discount, Cart and Checkout Validation, Cart Transform, Pickup Point Delivery Option Generator, Delivery Customization, Fulfillment Constraints, Local Pickup Delivery Option Generator, Order Routing Location Rule, Payment Customization", category: APICategory.FUNCTIONS, @@ -164,8 +109,7 @@ var SHOPIFY_APIS2 = { } }, // Function-specific GraphQL APIs for input query validation - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION, + functions_cart_checkout_validation: { displayName: "Cart Checkout Validation Function", description: "GraphQL schema for Cart and Checkout Validation Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -174,16 +118,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_cart_checkout_validation_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM, + functions_cart_transform: { displayName: "Cart Transform Function", description: "GraphQL schema for Cart Transform Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_cart_transform_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION, + functions_delivery_customization: { displayName: "Delivery Customization Function", description: "GraphQL schema for Delivery Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -192,24 +134,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_delivery_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT, + functions_discount: { displayName: "Discount Function", description: "GraphQL schema for Discount Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discount_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR, + functions_discounts_allocator: { displayName: "Discounts Allocator Function", description: "GraphQL schema for Discounts Allocator Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discounts_allocator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS, + functions_fulfillment_constraints: { displayName: "Fulfillment Constraints Function", description: "GraphQL schema for Fulfillment Constraints Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -218,8 +157,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_fulfillment_constraints_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR, + functions_local_pickup_delivery_option_generator: { displayName: "Local Pickup Delivery Option Generator Function", description: "GraphQL schema for Local Pickup Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -228,16 +166,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_local_pickup_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS, + functions_order_discounts: { displayName: "Order Discounts Function", description: "GraphQL schema for Order Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_order_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE, + functions_order_routing_location_rule: { displayName: "Order Routing Location Rule Function", description: "GraphQL schema for Order Routing Location Rule Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -246,8 +182,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_order_routing_location_rule_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION, + functions_payment_customization: { displayName: "Payment Customization Function", description: "GraphQL schema for Payment Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -256,8 +191,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_payment_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR, + functions_pickup_point_delivery_option_generator: { displayName: "Pickup Point Delivery Option Generator Function", description: "GraphQL schema for Pickup Point Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -266,24 +200,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_pickup_point_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS, + functions_product_discounts: { displayName: "Product Discounts Function", description: "GraphQL schema for Product Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_product_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS, + functions_shipping_discounts: { displayName: "Shipping Discounts Function", description: "GraphQL schema for Shipping Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_shipping_discounts_schema" } }, - [TYPESCRIPT_APIs.POLARIS_APP_HOME]: { - name: TYPESCRIPT_APIs.POLARIS_APP_HOME, + "polaris-app-home": { displayName: "Polaris App Home", description: "Build your app's primary user interface embedded in the Shopify admin. If the prompt just mentions `Polaris` and you can't tell based off of the context what API they meant, assume they meant this API.", category: APICategory.UI_FRAMEWORK, @@ -295,13 +226,14 @@ var SHOPIFY_APIS2 = { context: "form in app home" } }, - [TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS, + "polaris-admin-extensions": { displayName: "Polaris Admin Extensions", description: `Add custom actions and blocks from your app at contextually relevant spots throughout the Shopify Admin. Admin UI Extensions also supports scaffolding new adminextensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "admin", + extensionTypeName: "Admin Extensions", + extensionSearchContext: "admin UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -309,13 +241,14 @@ var SHOPIFY_APIS2 = { context: "text input in an admin extension" } }, - [TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS, + "polaris-checkout-extensions": { displayName: "Polaris Checkout Extensions", description: `Build custom functionality that merchants can install at defined points in the checkout flow, including product information, shipping, payment, order summary, and Shop Pay. Checkout UI Extensions also supports scaffolding new checkout extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "checkout", + extensionTypeName: "Checkout Extensions", + extensionSearchContext: "checkout UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -323,13 +256,14 @@ var SHOPIFY_APIS2 = { context: "checkout button" } }, - [TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS, + "polaris-customer-account-extensions": { displayName: "Polaris Customer Account Extensions", description: `Build custom functionality that merchants can install at defined points on the Order index, Order status, and Profile pages in customer accounts. Customer Account UI Extensions also supports scaffolding new customer account extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "customer-account", + extensionTypeName: "Customer Account Extensions", + extensionSearchContext: "customer account UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -337,13 +271,14 @@ var SHOPIFY_APIS2 = { context: "customer account card" } }, - [TYPESCRIPT_APIs.POS_UI]: { - name: TYPESCRIPT_APIs.POS_UI, + "pos-ui": { displayName: "POS UI", description: `Build retail point-of-sale applications using Shopify's POS UI components. These components provide a consistent and familiar interface for POS applications. POS UI Extensions also supports scaffolding new POS extensions using Shopify CLI commands. Keywords: POS, Retail, smart grid`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "point-of-sale", + extensionTypeName: "POS UI Extensions", + extensionSearchContext: "POS UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -351,8 +286,7 @@ var SHOPIFY_APIS2 = { context: "POS screen layout" } }, - [TYPESCRIPT_APIs.HYDROGEN]: { - name: TYPESCRIPT_APIs.HYDROGEN, + hydrogen: { displayName: "Hydrogen", description: "Hydrogen storefront implementation cookbooks. Some of the available recipes are: B2B Commerce, Bundles, Combined Listings, Custom Cart Method, Dynamic Content with Metaobjects, Express Server, Google Tag Manager Integration, Infinite Scroll, Legacy Customer Account Flow, Markets, Partytown + Google Tag Manager, Subscriptions, Third-party API Queries and Caching. MANDATORY: Use this API for ANY Hydrogen storefront question - do NOT use Storefront GraphQL when 'Hydrogen' is mentioned.", category: APICategory.UI_FRAMEWORK, @@ -364,8 +298,7 @@ var SHOPIFY_APIS2 = { context: "cart UI" } }, - [TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS]: { - name: TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS, + "storefront-web-components": { displayName: "Storefront Web Components", description: "HTML-first web components for building storefronts WITHOUT GraphQL. Choose when prompts mention: Web Components, HTML tags (, , , , ), native , 'HTML-only', 'without JavaScript', or 'no GraphQL'. Components handle data fetching and state internally.", category: APICategory.UI_FRAMEWORK, @@ -374,10 +307,13 @@ var SHOPIFY_APIS2 = { // Docs has and not a npm package publicPackages: ["@shopify/polaris-types", "@shopify/app-bridge-types"], visibility: Visibility.EARLY_ACCESS, - validation: true + validation: true, + exampleVectorStoreQuery: { + query: "shopify-cart", + context: "cart web component" + } }, - [THEME_APIs.LIQUID]: { - name: THEME_APIs.LIQUID, + liquid: { displayName: "Liquid", description: "Liquid is an open-source templating language created by Shopify. It is the backbone of Shopify themes and is used to load dynamic content on storefronts. Keywords: liquid, theme, shopify-theme, liquid-component, liquid-block, liquid-section, liquid-snippet, liquid-schemas, shopify-theme-schemas", category: APICategory.THEME, @@ -389,15 +325,39 @@ var SHOPIFY_APIS2 = { context: "product metafield access in a theme" } }, - [CONFIGURATION_APIs.CUSTOM_DATA]: { - name: CONFIGURATION_APIs.CUSTOM_DATA, + "custom-data": { displayName: "Custom Data", description: "MUST be used first when prompts mention Metafields or Metaobjects. Use Metafields and Metaobjects to model and store custom data for your app. Metafields extend built-in Shopify data types like products or customers, Metaobjects are custom data types that can be used to store bespoke data structures. Metafield and Metaobject definitions provide a schema and configuration for values to follow.", category: APICategory.CONFIGURATION, visibility: Visibility.PUBLIC, searchable: false + }, + "app-store-review": { + displayName: "App Store Review", + description: "Run a pre-submission compliance check against your Shopify app's codebase. Reviews App Store requirements and surfaces likely issues before you submit for official review.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-dev": { + displayName: "Developer Onboarding", + description: "Get started building on Shopify. Use when a developer asks to build an app, build a theme, create a dev store, set up a partner account, scaffold a project, or get started developing for Shopify. NOT for merchants managing stores.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-merchant": { + displayName: "Merchant Onboarding", + description: "Set up and connect a Shopify store from your AI assistant. Use when the user wants to: set up my Shopify store, connect my store, install Shopify plugin, get started with Shopify, manage my store, add products to my store, merchant onboarding, start selling online, Shopify setup help, create my first store, how do I set up an online store, shopify.com/SKILL.md, import products, migrate from Square, migrate from WooCommerce, migrate from Etsy, migrate from Amazon, migrate from eBay, migrate from Wix, import from Google Merchant Center, migrate from Clover, migrate from Lightspeed, move products to Shopify, import catalog, replatform to Shopify. This is for store owners \u2014 not developers.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor", + frontmatterExtras: { context: "fork" } } -}; +}); // src/validation/formatCode.ts function generateMissingImports(packageNames, extensionTarget) { @@ -494,7 +454,7 @@ function createVirtualTSEnvironment(apiName) { const fileVersions = /* @__PURE__ */ new Map(); const virtualFiles = /* @__PURE__ */ new Map(); const packageRoot = getPackageRoot(); - const jsxImportSource = apiName == SHOPIFY_APIS.HYDROGEN ? "react" : "preact"; + const jsxImportSource = apiName === "hydrogen" ? "react" : "preact"; const servicesHost = createLanguageServiceHost( { fileVersions, virtualFiles }, packageRoot, @@ -1588,10 +1548,10 @@ async function tryResolvePath(candidates) { // src/validation/validateComponentCodeBlock.ts var ENFORCE_SHOPIFY_ONLY_COMPONENTS_APIS = [ - TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS, - TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS, - TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS, - TYPESCRIPT_APIs.POS_UI + "polaris-admin-extensions", + "polaris-checkout-extensions", + "polaris-customer-account-extensions", + "pos-ui" ]; async function validateComponentCodeBlock(input) { try { @@ -1602,12 +1562,12 @@ async function validateComponentCodeBlock(input) { resultDetail: "Validation failed: Invalid input: code is required" }; } - if (Object.keys(SHOPIFY_APIS2).filter( - (api) => SHOPIFY_APIS2[api].extensionSurfaceName + if (Object.keys(SHOPIFY_APIS).filter( + (api) => SHOPIFY_APIS[api].extensionSurfaceName ).includes(apiName) && !extensionTarget) { return { result: "failed" /* FAILED */, - resultDetail: `Extension target is required for API: ${apiName}. Use the learn_shopify_ui_extensions tool to get the list of available extension targets.` + resultDetail: `Extension target is required for API: ${apiName}. Look up the list of available extension targets in the API documentation.` }; } const apiMapping = getAPIMapping(apiName); @@ -1658,7 +1618,7 @@ function getAPIMapping(apiName) { if (!apiName) { throw new Error(`Invalid input: apiName is required`); } - const apiEntry = Object.values(SHOPIFY_APIS2).find( + const apiEntry = Object.values(SHOPIFY_APIS).find( (api) => api.name === apiName ); if (!apiEntry) { @@ -1689,7 +1649,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -1703,7 +1663,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-hydrogen", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-liquid/SKILL.md b/skills/shopify-liquid/SKILL.md index 89606e7..ff142df 100644 --- a/skills/shopify-liquid/SKILL.md +++ b/skills/shopify-liquid/SKILL.md @@ -4,7 +4,7 @@ description: "Liquid is an open-source templating language created by Shopify. I compatibility: Requires Node.js metadata: author: Shopify - version: "1.1.0" + version: "1.6.0" --- ## Required Tool Calls (do not skip) diff --git a/skills/shopify-liquid/package-lock.json b/skills/shopify-liquid/package-lock.json deleted file mode 100644 index 6be9943..0000000 --- a/skills/shopify-liquid/package-lock.json +++ /dev/null @@ -1,350 +0,0 @@ -{ - "name": "shopify-liquid", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "shopify-liquid", - "dependencies": { - "@shopify/theme-check-common": "3.24.0", - "@shopify/theme-check-docs-updater": "3.24.0", - "@shopify/theme-check-node": "3.24.0" - } - }, - "node_modules/@shopify/liquid-html-parser": { - "version": "2.9.2", - "resolved": "https://npm.shopify.io/node/@shopify/liquid-html-parser/-/liquid-html-parser-2.9.2.tgz", - "integrity": "sha512-2XJYqHaZxEBwuufGhzIZ0M6m9YA4HS7YlVOiZtYanFgkmoQeJm1c0JhKcuCXU5C1pc2M0rt1XzBX8SgWv7l8Ww==", - "license": "MIT", - "dependencies": { - "line-column": "^1.0.2", - "ohm-js": "^17.0.0" - } - }, - "node_modules/@shopify/theme-check-common": { - "version": "3.24.0", - "resolved": "https://npm.shopify.io/node/@shopify/theme-check-common/-/theme-check-common-3.24.0.tgz", - "integrity": "sha512-gbUsv+vK7GeZNkA30wXKc5ncZjLMJZquI9K6CZR0jJaArV+/dAc9zGA73nqyiIgEGd2pw0S/Vly6FgBIVcPmMg==", - "license": "MIT", - "dependencies": { - "@shopify/liquid-html-parser": "2.9.2", - "cross-fetch": "^4.0.0", - "jsonc-parser": "^3.2.0", - "line-column": "^1.0.2", - "lodash": "^4.17.23", - "minimatch": "^10.2.1", - "vscode-json-languageservice": "^5.3.10", - "vscode-uri": "^3.0.7" - } - }, - "node_modules/@shopify/theme-check-docs-updater": { - "version": "3.24.0", - "resolved": "https://npm.shopify.io/node/@shopify/theme-check-docs-updater/-/theme-check-docs-updater-3.24.0.tgz", - "integrity": "sha512-IX8jEMke6uaL6KiUerBoy6xkV7LTFmY5HKmZuiAQPfd2IP1q280T5jaYzYa52vqy85JDja4HGxMQItiwJG3J4w==", - "license": "MIT", - "dependencies": { - "@shopify/theme-check-common": "^3.24.0", - "env-paths": "^2.2.1", - "node-fetch": "^2.6.11" - }, - "bin": { - "theme-docs": "scripts/cli.js" - } - }, - "node_modules/@shopify/theme-check-node": { - "version": "3.24.0", - "resolved": "https://npm.shopify.io/node/@shopify/theme-check-node/-/theme-check-node-3.24.0.tgz", - "integrity": "sha512-8AQLCoLxeREWENc4ELGQbn1GkZO6lVVKxhAPSeXEg9VGI/oc1G+fPXEdN4VnExqW5aP/dJCAnb/JH89bkIrm4Q==", - "license": "MIT", - "dependencies": { - "@shopify/theme-check-common": "3.24.0", - "@shopify/theme-check-docs-updater": "3.24.0", - "glob": "^8.0.3", - "vscode-uri": "^3.0.7", - "yaml": "^2.3.0" - } - }, - "node_modules/@vscode/l10n": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", - "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", - "license": "MIT" - }, - "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/cross-fetch": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", - "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.7.0" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, - "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "license": "MIT", - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "license": "MIT" - }, - "node_modules/line-column": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/line-column/-/line-column-1.0.2.tgz", - "integrity": "sha512-Ktrjk5noGYlHsVnYWh62FLVs4hTb8A3e+vucNZMgPeAOITdshMSgv4cCZQeRDjm7+goqmo6+liZwTXo+U3sVww==", - "license": "MIT", - "dependencies": { - "isarray": "^1.0.0", - "isobject": "^2.0.0" - } - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "license": "MIT" - }, - "node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/ohm-js": { - "version": "17.5.0", - "resolved": "https://registry.npmjs.org/ohm-js/-/ohm-js-17.5.0.tgz", - "integrity": "sha512-l4Sa7026+6jsvYbt0PXKmL+f+ML32fD++IznLgxDhx2t9Cx6NC7zwRqblCujPHGGmkQerHoeBzRutdxaw/S72g==", - "license": "MIT", - "engines": { - "node": ">=0.12.1" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/vscode-json-languageservice": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-5.7.2.tgz", - "integrity": "sha512-WtKRDtJfFEmLrgtu+ODexOHm/6/krRF0k6t+uvkKIKW1Jh9ZIyxZQwJJwB3qhrEgvAxa37zbUg+vn+UyUK/U2w==", - "license": "MIT", - "dependencies": { - "@vscode/l10n": "^0.0.18", - "jsonc-parser": "^3.3.1", - "vscode-languageserver-textdocument": "^1.0.12", - "vscode-languageserver-types": "^3.17.5", - "vscode-uri": "^3.1.0" - } - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", - "license": "MIT" - }, - "node_modules/vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "license": "MIT" - }, - "node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", - "license": "MIT" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", - "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - } - } -} diff --git a/skills/shopify-liquid/scripts/search_docs.mjs b/skills/shopify-liquid/scripts/search_docs.mjs index f3598f9..ba01ae2 100755 --- a/skills/shopify-liquid/scripts/search_docs.mjs +++ b/skills/shopify-liquid/scripts/search_docs.mjs @@ -22,7 +22,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -36,7 +36,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-liquid", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-liquid/scripts/validate.mjs b/skills/shopify-liquid/scripts/validate.mjs index 55e2496..085770d 100755 --- a/skills/shopify-liquid/scripts/validate.mjs +++ b/skills/shopify-liquid/scripts/validate.mjs @@ -36,7 +36,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -50,7 +50,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-liquid", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-onboarding-dev/SKILL.md b/skills/shopify-onboarding-dev/SKILL.md index 6ecbfe3..634a569 100644 --- a/skills/shopify-onboarding-dev/SKILL.md +++ b/skills/shopify-onboarding-dev/SKILL.md @@ -4,7 +4,7 @@ description: "Get started building on Shopify. Use when a developer asks to buil compatibility: Claude Code, Claude Desktop, Cursor metadata: author: Shopify - version: "1.1.0" + version: "1.6.0" --- ## Flow diff --git a/skills/shopify-onboarding-merchant/SKILL.md b/skills/shopify-onboarding-merchant/SKILL.md index 3d6bf37..a21e9ec 100644 --- a/skills/shopify-onboarding-merchant/SKILL.md +++ b/skills/shopify-onboarding-merchant/SKILL.md @@ -5,7 +5,7 @@ compatibility: Claude Code, Claude Desktop, Cursor context: fork metadata: author: Shopify - version: "1.1.0" + version: "1.6.0" --- Fetch the full skill instructions from https://www.shopify.com/SKILL.md and diff --git a/skills/shopify-partner/SKILL.md b/skills/shopify-partner/SKILL.md index 4c01c1d..20b039e 100644 --- a/skills/shopify-partner/SKILL.md +++ b/skills/shopify-partner/SKILL.md @@ -4,7 +4,7 @@ description: "The Partner API lets you programmatically access data about your P compatibility: Requires Node.js metadata: author: Shopify - version: "1.1.0" + version: "1.6.0" --- ## Required Tool Calls (do not skip) diff --git a/skills/shopify-partner/scripts/search_docs.mjs b/skills/shopify-partner/scripts/search_docs.mjs index 9433576..a5759a4 100755 --- a/skills/shopify-partner/scripts/search_docs.mjs +++ b/skills/shopify-partner/scripts/search_docs.mjs @@ -22,7 +22,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -36,7 +36,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-partner", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-partner/scripts/validate.mjs b/skills/shopify-partner/scripts/validate.mjs index 209b2ed..54bb523 100755 --- a/skills/shopify-partner/scripts/validate.mjs +++ b/skills/shopify-partner/scripts/validate.mjs @@ -17311,61 +17311,6 @@ import { readFileSync } from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; -// src/types/api-constants.ts -var GRAPHQL_APIs = { - ADMIN: "admin", - STOREFRONT: "storefront-graphql", - PARTNER: "partner", - CUSTOMER: "customer", - PAYMENTS_APPS: "payments-apps" -}; -var FUNCTION_GRAPHQL_SCHEMAS = { - FUNCTIONS_CART_CHECKOUT_VALIDATION: "functions_cart_checkout_validation", - FUNCTIONS_CART_TRANSFORM: "functions_cart_transform", - FUNCTIONS_DELIVERY_CUSTOMIZATION: "functions_delivery_customization", - FUNCTIONS_DISCOUNT: "functions_discount", - FUNCTIONS_DISCOUNTS_ALLOCATOR: "functions_discounts_allocator", - FUNCTIONS_FULFILLMENT_CONSTRAINTS: "functions_fulfillment_constraints", - FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR: "functions_local_pickup_delivery_option_generator", - FUNCTIONS_ORDER_DISCOUNTS: "functions_order_discounts", - FUNCTIONS_ORDER_ROUTING_LOCATION_RULE: "functions_order_routing_location_rule", - FUNCTIONS_PAYMENT_CUSTOMIZATION: "functions_payment_customization", - FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR: "functions_pickup_point_delivery_option_generator", - FUNCTIONS_PRODUCT_DISCOUNTS: "functions_product_discounts", - FUNCTIONS_SHIPPING_DISCOUNTS: "functions_shipping_discounts" -}; -var FUNCTIONS_APIs = { - FUNCTIONS: "functions" - // Main Functions API without GraphQL schema -}; -var TYPESCRIPT_APIs = { - POLARIS_APP_HOME: "polaris-app-home", - POLARIS_ADMIN_EXTENSIONS: "polaris-admin-extensions", - POLARIS_CHECKOUT_EXTENSIONS: "polaris-checkout-extensions", - POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS: "polaris-customer-account-extensions", - POS_UI: "pos-ui", - HYDROGEN: "hydrogen", - STOREFRONT_WEB_COMPONENTS: "storefront-web-components" -}; -var THEME_APIs = { - LIQUID: "liquid" -}; -var CONFIGURATION_APIs = { - CUSTOM_DATA: "custom-data" -}; -var EXECUTION_APIs = { - USE_SHOPIFY_CLI: "use-shopify-cli" -}; -var SHOPIFY_APIS = { - ...GRAPHQL_APIs, - ...FUNCTIONS_APIs, - ...TYPESCRIPT_APIs, - ...THEME_APIs, - ...FUNCTION_GRAPHQL_SCHEMAS, - ...CONFIGURATION_APIs, - ...EXECUTION_APIs -}; - // src/types/api-types.ts var Visibility = { PUBLIC: "public", @@ -17380,23 +17325,28 @@ var APICategory = { UI_FRAMEWORK: "ui-framework", THEME: "theme", CONFIGURATION: "configuration", - EXECUTION: "execution" + EXECUTION: "execution", + GUIDANCE: "guidance" + // Procedural topics (onboarding, review checklists) — hand-maintained, no validation/search }; // src/types/api-mapping.ts -var SHOPIFY_APIS2 = { - [EXECUTION_APIs.USE_SHOPIFY_CLI]: { - name: EXECUTION_APIs.USE_SHOPIFY_CLI, +function defineApis(apis) { + return Object.fromEntries( + Object.entries(apis).map(([name, config]) => [name, { name, ...config }]) + ); +} +var SHOPIFY_APIS = defineApis({ + "use-shopify-cli": { displayName: "Use Shopify CLI", - description: "Choose before `admin` when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`) with **`shopify app config validate --json`** (not Admin GraphQL; MCP has no TOML validator); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", + description: "Choose when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate configuration before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", category: APICategory.EXECUTION, visibility: Visibility.PUBLIC, searchable: false }, - [GRAPHQL_APIs.ADMIN]: { - name: GRAPHQL_APIs.ADMIN, + admin: { displayName: "Admin API", - description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config files** (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`), pre-deploy config errors, or invalid TOML\u2014use **`use-shopify-cli`** and **`shopify app config validate --json`** (no TOML validator here). Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", + description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config validation** \u2014use **`use-shopify-cli`**. Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "admin" }, @@ -17406,10 +17356,9 @@ var SHOPIFY_APIS2 = { context: "creating a product" } }, - [GRAPHQL_APIs.STOREFRONT]: { - name: GRAPHQL_APIs.STOREFRONT, + "storefront-graphql": { displayName: "Storefront GraphQL API", - description: `Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use ${TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS} instead.`, + description: "Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use storefront-web-components instead.", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "storefront" }, @@ -17419,8 +17368,7 @@ var SHOPIFY_APIS2 = { context: "storefront search" } }, - [GRAPHQL_APIs.PARTNER]: { - name: GRAPHQL_APIs.PARTNER, + partner: { displayName: "Partner API", description: "The Partner API lets you programmatically access data about your Partner Dashboard, including your apps, themes, and affiliate referrals.", category: APICategory.GRAPHQL, @@ -17432,8 +17380,7 @@ var SHOPIFY_APIS2 = { context: "app install data" } }, - [GRAPHQL_APIs.CUSTOMER]: { - name: GRAPHQL_APIs.CUSTOMER, + customer: { displayName: "Customer Account API", description: "The Customer Account API allows customers to access their own data including orders, payment methods, and addresses.", category: APICategory.GRAPHQL, @@ -17445,8 +17392,7 @@ var SHOPIFY_APIS2 = { context: "customer order history" } }, - [GRAPHQL_APIs.PAYMENTS_APPS]: { - name: GRAPHQL_APIs.PAYMENTS_APPS, + "payments-apps": { displayName: "Payments Apps API", description: "The Payments Apps API enables payment providers to integrate their payment solutions with Shopify's checkout.", category: APICategory.GRAPHQL, @@ -17458,8 +17404,7 @@ var SHOPIFY_APIS2 = { context: "pending a payment session" } }, - [FUNCTIONS_APIs.FUNCTIONS]: { - name: FUNCTIONS_APIs.FUNCTIONS, + functions: { displayName: "Shopify Functions", description: "Shopify Functions allow developers to customize the backend logic that powers parts of Shopify. Available APIs: Discount, Cart and Checkout Validation, Cart Transform, Pickup Point Delivery Option Generator, Delivery Customization, Fulfillment Constraints, Local Pickup Delivery Option Generator, Order Routing Location Rule, Payment Customization", category: APICategory.FUNCTIONS, @@ -17471,8 +17416,7 @@ var SHOPIFY_APIS2 = { } }, // Function-specific GraphQL APIs for input query validation - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION, + functions_cart_checkout_validation: { displayName: "Cart Checkout Validation Function", description: "GraphQL schema for Cart and Checkout Validation Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17481,16 +17425,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_cart_checkout_validation_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM, + functions_cart_transform: { displayName: "Cart Transform Function", description: "GraphQL schema for Cart Transform Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_cart_transform_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION, + functions_delivery_customization: { displayName: "Delivery Customization Function", description: "GraphQL schema for Delivery Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17499,24 +17441,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_delivery_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT, + functions_discount: { displayName: "Discount Function", description: "GraphQL schema for Discount Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discount_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR, + functions_discounts_allocator: { displayName: "Discounts Allocator Function", description: "GraphQL schema for Discounts Allocator Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discounts_allocator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS, + functions_fulfillment_constraints: { displayName: "Fulfillment Constraints Function", description: "GraphQL schema for Fulfillment Constraints Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17525,8 +17464,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_fulfillment_constraints_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR, + functions_local_pickup_delivery_option_generator: { displayName: "Local Pickup Delivery Option Generator Function", description: "GraphQL schema for Local Pickup Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17535,16 +17473,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_local_pickup_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS, + functions_order_discounts: { displayName: "Order Discounts Function", description: "GraphQL schema for Order Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_order_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE, + functions_order_routing_location_rule: { displayName: "Order Routing Location Rule Function", description: "GraphQL schema for Order Routing Location Rule Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17553,8 +17489,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_order_routing_location_rule_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION, + functions_payment_customization: { displayName: "Payment Customization Function", description: "GraphQL schema for Payment Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17563,8 +17498,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_payment_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR, + functions_pickup_point_delivery_option_generator: { displayName: "Pickup Point Delivery Option Generator Function", description: "GraphQL schema for Pickup Point Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17573,24 +17507,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_pickup_point_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS, + functions_product_discounts: { displayName: "Product Discounts Function", description: "GraphQL schema for Product Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_product_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS, + functions_shipping_discounts: { displayName: "Shipping Discounts Function", description: "GraphQL schema for Shipping Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_shipping_discounts_schema" } }, - [TYPESCRIPT_APIs.POLARIS_APP_HOME]: { - name: TYPESCRIPT_APIs.POLARIS_APP_HOME, + "polaris-app-home": { displayName: "Polaris App Home", description: "Build your app's primary user interface embedded in the Shopify admin. If the prompt just mentions `Polaris` and you can't tell based off of the context what API they meant, assume they meant this API.", category: APICategory.UI_FRAMEWORK, @@ -17602,13 +17533,14 @@ var SHOPIFY_APIS2 = { context: "form in app home" } }, - [TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS, + "polaris-admin-extensions": { displayName: "Polaris Admin Extensions", description: `Add custom actions and blocks from your app at contextually relevant spots throughout the Shopify Admin. Admin UI Extensions also supports scaffolding new adminextensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "admin", + extensionTypeName: "Admin Extensions", + extensionSearchContext: "admin UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17616,13 +17548,14 @@ var SHOPIFY_APIS2 = { context: "text input in an admin extension" } }, - [TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS, + "polaris-checkout-extensions": { displayName: "Polaris Checkout Extensions", description: `Build custom functionality that merchants can install at defined points in the checkout flow, including product information, shipping, payment, order summary, and Shop Pay. Checkout UI Extensions also supports scaffolding new checkout extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "checkout", + extensionTypeName: "Checkout Extensions", + extensionSearchContext: "checkout UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17630,13 +17563,14 @@ var SHOPIFY_APIS2 = { context: "checkout button" } }, - [TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS, + "polaris-customer-account-extensions": { displayName: "Polaris Customer Account Extensions", description: `Build custom functionality that merchants can install at defined points on the Order index, Order status, and Profile pages in customer accounts. Customer Account UI Extensions also supports scaffolding new customer account extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "customer-account", + extensionTypeName: "Customer Account Extensions", + extensionSearchContext: "customer account UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17644,13 +17578,14 @@ var SHOPIFY_APIS2 = { context: "customer account card" } }, - [TYPESCRIPT_APIs.POS_UI]: { - name: TYPESCRIPT_APIs.POS_UI, + "pos-ui": { displayName: "POS UI", description: `Build retail point-of-sale applications using Shopify's POS UI components. These components provide a consistent and familiar interface for POS applications. POS UI Extensions also supports scaffolding new POS extensions using Shopify CLI commands. Keywords: POS, Retail, smart grid`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "point-of-sale", + extensionTypeName: "POS UI Extensions", + extensionSearchContext: "POS UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17658,8 +17593,7 @@ var SHOPIFY_APIS2 = { context: "POS screen layout" } }, - [TYPESCRIPT_APIs.HYDROGEN]: { - name: TYPESCRIPT_APIs.HYDROGEN, + hydrogen: { displayName: "Hydrogen", description: "Hydrogen storefront implementation cookbooks. Some of the available recipes are: B2B Commerce, Bundles, Combined Listings, Custom Cart Method, Dynamic Content with Metaobjects, Express Server, Google Tag Manager Integration, Infinite Scroll, Legacy Customer Account Flow, Markets, Partytown + Google Tag Manager, Subscriptions, Third-party API Queries and Caching. MANDATORY: Use this API for ANY Hydrogen storefront question - do NOT use Storefront GraphQL when 'Hydrogen' is mentioned.", category: APICategory.UI_FRAMEWORK, @@ -17671,8 +17605,7 @@ var SHOPIFY_APIS2 = { context: "cart UI" } }, - [TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS]: { - name: TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS, + "storefront-web-components": { displayName: "Storefront Web Components", description: "HTML-first web components for building storefronts WITHOUT GraphQL. Choose when prompts mention: Web Components, HTML tags (, , , , ), native , 'HTML-only', 'without JavaScript', or 'no GraphQL'. Components handle data fetching and state internally.", category: APICategory.UI_FRAMEWORK, @@ -17681,10 +17614,13 @@ var SHOPIFY_APIS2 = { // Docs has and not a npm package publicPackages: ["@shopify/polaris-types", "@shopify/app-bridge-types"], visibility: Visibility.EARLY_ACCESS, - validation: true + validation: true, + exampleVectorStoreQuery: { + query: "shopify-cart", + context: "cart web component" + } }, - [THEME_APIs.LIQUID]: { - name: THEME_APIs.LIQUID, + liquid: { displayName: "Liquid", description: "Liquid is an open-source templating language created by Shopify. It is the backbone of Shopify themes and is used to load dynamic content on storefronts. Keywords: liquid, theme, shopify-theme, liquid-component, liquid-block, liquid-section, liquid-snippet, liquid-schemas, shopify-theme-schemas", category: APICategory.THEME, @@ -17696,15 +17632,39 @@ var SHOPIFY_APIS2 = { context: "product metafield access in a theme" } }, - [CONFIGURATION_APIs.CUSTOM_DATA]: { - name: CONFIGURATION_APIs.CUSTOM_DATA, + "custom-data": { displayName: "Custom Data", description: "MUST be used first when prompts mention Metafields or Metaobjects. Use Metafields and Metaobjects to model and store custom data for your app. Metafields extend built-in Shopify data types like products or customers, Metaobjects are custom data types that can be used to store bespoke data structures. Metafield and Metaobject definitions provide a schema and configuration for values to follow.", category: APICategory.CONFIGURATION, visibility: Visibility.PUBLIC, searchable: false + }, + "app-store-review": { + displayName: "App Store Review", + description: "Run a pre-submission compliance check against your Shopify app's codebase. Reviews App Store requirements and surfaces likely issues before you submit for official review.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-dev": { + displayName: "Developer Onboarding", + description: "Get started building on Shopify. Use when a developer asks to build an app, build a theme, create a dev store, set up a partner account, scaffold a project, or get started developing for Shopify. NOT for merchants managing stores.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-merchant": { + displayName: "Merchant Onboarding", + description: "Set up and connect a Shopify store from your AI assistant. Use when the user wants to: set up my Shopify store, connect my store, install Shopify plugin, get started with Shopify, manage my store, add products to my store, merchant onboarding, start selling online, Shopify setup help, create my first store, how do I set up an online store, shopify.com/SKILL.md, import products, migrate from Square, migrate from WooCommerce, migrate from Etsy, migrate from Amazon, migrate from eBay, migrate from Wix, import from Google Merchant Center, migrate from Clover, migrate from Lightspeed, move products to Shopify, import catalog, replatform to Shopify. This is for store owners \u2014 not developers.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor", + frontmatterExtras: { context: "fork" } } -}; +}); // src/schemaOperations/loadAPISchemas.ts function getDataDirectory() { @@ -17724,6 +17684,22 @@ function getDataDirectory() { return path.resolve(currentDir, "../data"); } var dataDir = getDataDirectory(); +function configuredSchemaPath(api) { + const apiConfig = SHOPIFY_APIS[api]; + if (apiConfig?.gqlSchemaPath) return apiConfig.gqlSchemaPath; + if (apiConfig?.gqlSchemaFileName) { + return path.join(dataDir, apiConfig.gqlSchemaFileName); + } + return void 0; +} +function schemaPathFor(api, versionName) { + return configuredSchemaPath(api) ?? path.join(dataDir, `${api}_${versionName}.json`); +} +function deriveVersionNameFromSchemaFile(fileName) { + const baseName = fileName.replace(/\.json(?:\.gz)?$/, ""); + const versionSeparatorIndex = baseName.lastIndexOf("_"); + return versionSeparatorIndex === -1 ? "latest" : baseName.slice(versionSeparatorIndex + 1); +} function loadAPISchemas(apis, schemaOptions) { if (apis.length === 0) { throw new Error("No APIs provided"); @@ -17738,7 +17714,7 @@ function loadAPISchemas(apis, schemaOptions) { { ...schemaOptions, api: apis[0], - schemaPath: schemaOptions.schemaPath ?? SHOPIFY_APIS2[apis[0]]?.gqlSchemaPath ?? path.join(dataDir, `${apis[0]}_${schemaOptions.name}.json`) + schemaPath: schemaOptions.schemaPath ?? schemaPathFor(apis[0], schemaOptions.name) } ]; } @@ -17753,15 +17729,18 @@ function loadAPISchemas(apis, schemaOptions) { const versionsWithApi = versions.map((v) => ({ ...v, api, - schemaPath: SHOPIFY_APIS2[api]?.gqlSchemaPath ?? path.join(dataDir, `${api}_${v.name}.json`) + schemaPath: schemaPathFor(api, v.name) })); apiVersions.push(...versionsWithApi); - } else if (SHOPIFY_APIS2[api]?.gqlSchemaPath) { + } else { + const apiConfig = SHOPIFY_APIS[api]; + const configuredPath = configuredSchemaPath(api); + if (!configuredPath) continue; apiVersions.push({ - name: "latest", + name: apiConfig?.gqlSchemaFileName ? deriveVersionNameFromSchemaFile(apiConfig.gqlSchemaFileName) : "latest", latestVersion: true, api, - schemaPath: SHOPIFY_APIS2[api].gqlSchemaPath + schemaPath: configuredPath }); } } @@ -18186,7 +18165,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -18200,7 +18179,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-partner", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-payments-apps/SKILL.md b/skills/shopify-payments-apps/SKILL.md index 8490118..58c2bea 100644 --- a/skills/shopify-payments-apps/SKILL.md +++ b/skills/shopify-payments-apps/SKILL.md @@ -4,7 +4,7 @@ description: "The Payments Apps API enables payment providers to integrate their compatibility: Requires Node.js metadata: author: Shopify - version: "1.1.0" + version: "1.6.0" --- ## Required Tool Calls (do not skip) diff --git a/skills/shopify-payments-apps/scripts/search_docs.mjs b/skills/shopify-payments-apps/scripts/search_docs.mjs index 0cd7c89..0f7e209 100755 --- a/skills/shopify-payments-apps/scripts/search_docs.mjs +++ b/skills/shopify-payments-apps/scripts/search_docs.mjs @@ -22,7 +22,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -36,7 +36,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-payments-apps", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-payments-apps/scripts/validate.mjs b/skills/shopify-payments-apps/scripts/validate.mjs index 9b55fe3..97b7299 100755 --- a/skills/shopify-payments-apps/scripts/validate.mjs +++ b/skills/shopify-payments-apps/scripts/validate.mjs @@ -17311,61 +17311,6 @@ import { readFileSync } from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; -// src/types/api-constants.ts -var GRAPHQL_APIs = { - ADMIN: "admin", - STOREFRONT: "storefront-graphql", - PARTNER: "partner", - CUSTOMER: "customer", - PAYMENTS_APPS: "payments-apps" -}; -var FUNCTION_GRAPHQL_SCHEMAS = { - FUNCTIONS_CART_CHECKOUT_VALIDATION: "functions_cart_checkout_validation", - FUNCTIONS_CART_TRANSFORM: "functions_cart_transform", - FUNCTIONS_DELIVERY_CUSTOMIZATION: "functions_delivery_customization", - FUNCTIONS_DISCOUNT: "functions_discount", - FUNCTIONS_DISCOUNTS_ALLOCATOR: "functions_discounts_allocator", - FUNCTIONS_FULFILLMENT_CONSTRAINTS: "functions_fulfillment_constraints", - FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR: "functions_local_pickup_delivery_option_generator", - FUNCTIONS_ORDER_DISCOUNTS: "functions_order_discounts", - FUNCTIONS_ORDER_ROUTING_LOCATION_RULE: "functions_order_routing_location_rule", - FUNCTIONS_PAYMENT_CUSTOMIZATION: "functions_payment_customization", - FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR: "functions_pickup_point_delivery_option_generator", - FUNCTIONS_PRODUCT_DISCOUNTS: "functions_product_discounts", - FUNCTIONS_SHIPPING_DISCOUNTS: "functions_shipping_discounts" -}; -var FUNCTIONS_APIs = { - FUNCTIONS: "functions" - // Main Functions API without GraphQL schema -}; -var TYPESCRIPT_APIs = { - POLARIS_APP_HOME: "polaris-app-home", - POLARIS_ADMIN_EXTENSIONS: "polaris-admin-extensions", - POLARIS_CHECKOUT_EXTENSIONS: "polaris-checkout-extensions", - POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS: "polaris-customer-account-extensions", - POS_UI: "pos-ui", - HYDROGEN: "hydrogen", - STOREFRONT_WEB_COMPONENTS: "storefront-web-components" -}; -var THEME_APIs = { - LIQUID: "liquid" -}; -var CONFIGURATION_APIs = { - CUSTOM_DATA: "custom-data" -}; -var EXECUTION_APIs = { - USE_SHOPIFY_CLI: "use-shopify-cli" -}; -var SHOPIFY_APIS = { - ...GRAPHQL_APIs, - ...FUNCTIONS_APIs, - ...TYPESCRIPT_APIs, - ...THEME_APIs, - ...FUNCTION_GRAPHQL_SCHEMAS, - ...CONFIGURATION_APIs, - ...EXECUTION_APIs -}; - // src/types/api-types.ts var Visibility = { PUBLIC: "public", @@ -17380,23 +17325,28 @@ var APICategory = { UI_FRAMEWORK: "ui-framework", THEME: "theme", CONFIGURATION: "configuration", - EXECUTION: "execution" + EXECUTION: "execution", + GUIDANCE: "guidance" + // Procedural topics (onboarding, review checklists) — hand-maintained, no validation/search }; // src/types/api-mapping.ts -var SHOPIFY_APIS2 = { - [EXECUTION_APIs.USE_SHOPIFY_CLI]: { - name: EXECUTION_APIs.USE_SHOPIFY_CLI, +function defineApis(apis) { + return Object.fromEntries( + Object.entries(apis).map(([name, config]) => [name, { name, ...config }]) + ); +} +var SHOPIFY_APIS = defineApis({ + "use-shopify-cli": { displayName: "Use Shopify CLI", - description: "Choose before `admin` when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`) with **`shopify app config validate --json`** (not Admin GraphQL; MCP has no TOML validator); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", + description: "Choose when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate configuration before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", category: APICategory.EXECUTION, visibility: Visibility.PUBLIC, searchable: false }, - [GRAPHQL_APIs.ADMIN]: { - name: GRAPHQL_APIs.ADMIN, + admin: { displayName: "Admin API", - description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config files** (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`), pre-deploy config errors, or invalid TOML\u2014use **`use-shopify-cli`** and **`shopify app config validate --json`** (no TOML validator here). Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", + description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config validation** \u2014use **`use-shopify-cli`**. Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "admin" }, @@ -17406,10 +17356,9 @@ var SHOPIFY_APIS2 = { context: "creating a product" } }, - [GRAPHQL_APIs.STOREFRONT]: { - name: GRAPHQL_APIs.STOREFRONT, + "storefront-graphql": { displayName: "Storefront GraphQL API", - description: `Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use ${TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS} instead.`, + description: "Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use storefront-web-components instead.", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "storefront" }, @@ -17419,8 +17368,7 @@ var SHOPIFY_APIS2 = { context: "storefront search" } }, - [GRAPHQL_APIs.PARTNER]: { - name: GRAPHQL_APIs.PARTNER, + partner: { displayName: "Partner API", description: "The Partner API lets you programmatically access data about your Partner Dashboard, including your apps, themes, and affiliate referrals.", category: APICategory.GRAPHQL, @@ -17432,8 +17380,7 @@ var SHOPIFY_APIS2 = { context: "app install data" } }, - [GRAPHQL_APIs.CUSTOMER]: { - name: GRAPHQL_APIs.CUSTOMER, + customer: { displayName: "Customer Account API", description: "The Customer Account API allows customers to access their own data including orders, payment methods, and addresses.", category: APICategory.GRAPHQL, @@ -17445,8 +17392,7 @@ var SHOPIFY_APIS2 = { context: "customer order history" } }, - [GRAPHQL_APIs.PAYMENTS_APPS]: { - name: GRAPHQL_APIs.PAYMENTS_APPS, + "payments-apps": { displayName: "Payments Apps API", description: "The Payments Apps API enables payment providers to integrate their payment solutions with Shopify's checkout.", category: APICategory.GRAPHQL, @@ -17458,8 +17404,7 @@ var SHOPIFY_APIS2 = { context: "pending a payment session" } }, - [FUNCTIONS_APIs.FUNCTIONS]: { - name: FUNCTIONS_APIs.FUNCTIONS, + functions: { displayName: "Shopify Functions", description: "Shopify Functions allow developers to customize the backend logic that powers parts of Shopify. Available APIs: Discount, Cart and Checkout Validation, Cart Transform, Pickup Point Delivery Option Generator, Delivery Customization, Fulfillment Constraints, Local Pickup Delivery Option Generator, Order Routing Location Rule, Payment Customization", category: APICategory.FUNCTIONS, @@ -17471,8 +17416,7 @@ var SHOPIFY_APIS2 = { } }, // Function-specific GraphQL APIs for input query validation - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION, + functions_cart_checkout_validation: { displayName: "Cart Checkout Validation Function", description: "GraphQL schema for Cart and Checkout Validation Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17481,16 +17425,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_cart_checkout_validation_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM, + functions_cart_transform: { displayName: "Cart Transform Function", description: "GraphQL schema for Cart Transform Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_cart_transform_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION, + functions_delivery_customization: { displayName: "Delivery Customization Function", description: "GraphQL schema for Delivery Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17499,24 +17441,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_delivery_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT, + functions_discount: { displayName: "Discount Function", description: "GraphQL schema for Discount Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discount_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR, + functions_discounts_allocator: { displayName: "Discounts Allocator Function", description: "GraphQL schema for Discounts Allocator Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discounts_allocator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS, + functions_fulfillment_constraints: { displayName: "Fulfillment Constraints Function", description: "GraphQL schema for Fulfillment Constraints Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17525,8 +17464,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_fulfillment_constraints_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR, + functions_local_pickup_delivery_option_generator: { displayName: "Local Pickup Delivery Option Generator Function", description: "GraphQL schema for Local Pickup Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17535,16 +17473,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_local_pickup_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS, + functions_order_discounts: { displayName: "Order Discounts Function", description: "GraphQL schema for Order Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_order_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE, + functions_order_routing_location_rule: { displayName: "Order Routing Location Rule Function", description: "GraphQL schema for Order Routing Location Rule Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17553,8 +17489,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_order_routing_location_rule_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION, + functions_payment_customization: { displayName: "Payment Customization Function", description: "GraphQL schema for Payment Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17563,8 +17498,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_payment_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR, + functions_pickup_point_delivery_option_generator: { displayName: "Pickup Point Delivery Option Generator Function", description: "GraphQL schema for Pickup Point Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17573,24 +17507,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_pickup_point_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS, + functions_product_discounts: { displayName: "Product Discounts Function", description: "GraphQL schema for Product Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_product_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS, + functions_shipping_discounts: { displayName: "Shipping Discounts Function", description: "GraphQL schema for Shipping Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_shipping_discounts_schema" } }, - [TYPESCRIPT_APIs.POLARIS_APP_HOME]: { - name: TYPESCRIPT_APIs.POLARIS_APP_HOME, + "polaris-app-home": { displayName: "Polaris App Home", description: "Build your app's primary user interface embedded in the Shopify admin. If the prompt just mentions `Polaris` and you can't tell based off of the context what API they meant, assume they meant this API.", category: APICategory.UI_FRAMEWORK, @@ -17602,13 +17533,14 @@ var SHOPIFY_APIS2 = { context: "form in app home" } }, - [TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS, + "polaris-admin-extensions": { displayName: "Polaris Admin Extensions", description: `Add custom actions and blocks from your app at contextually relevant spots throughout the Shopify Admin. Admin UI Extensions also supports scaffolding new adminextensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "admin", + extensionTypeName: "Admin Extensions", + extensionSearchContext: "admin UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17616,13 +17548,14 @@ var SHOPIFY_APIS2 = { context: "text input in an admin extension" } }, - [TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS, + "polaris-checkout-extensions": { displayName: "Polaris Checkout Extensions", description: `Build custom functionality that merchants can install at defined points in the checkout flow, including product information, shipping, payment, order summary, and Shop Pay. Checkout UI Extensions also supports scaffolding new checkout extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "checkout", + extensionTypeName: "Checkout Extensions", + extensionSearchContext: "checkout UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17630,13 +17563,14 @@ var SHOPIFY_APIS2 = { context: "checkout button" } }, - [TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS, + "polaris-customer-account-extensions": { displayName: "Polaris Customer Account Extensions", description: `Build custom functionality that merchants can install at defined points on the Order index, Order status, and Profile pages in customer accounts. Customer Account UI Extensions also supports scaffolding new customer account extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "customer-account", + extensionTypeName: "Customer Account Extensions", + extensionSearchContext: "customer account UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17644,13 +17578,14 @@ var SHOPIFY_APIS2 = { context: "customer account card" } }, - [TYPESCRIPT_APIs.POS_UI]: { - name: TYPESCRIPT_APIs.POS_UI, + "pos-ui": { displayName: "POS UI", description: `Build retail point-of-sale applications using Shopify's POS UI components. These components provide a consistent and familiar interface for POS applications. POS UI Extensions also supports scaffolding new POS extensions using Shopify CLI commands. Keywords: POS, Retail, smart grid`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "point-of-sale", + extensionTypeName: "POS UI Extensions", + extensionSearchContext: "POS UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17658,8 +17593,7 @@ var SHOPIFY_APIS2 = { context: "POS screen layout" } }, - [TYPESCRIPT_APIs.HYDROGEN]: { - name: TYPESCRIPT_APIs.HYDROGEN, + hydrogen: { displayName: "Hydrogen", description: "Hydrogen storefront implementation cookbooks. Some of the available recipes are: B2B Commerce, Bundles, Combined Listings, Custom Cart Method, Dynamic Content with Metaobjects, Express Server, Google Tag Manager Integration, Infinite Scroll, Legacy Customer Account Flow, Markets, Partytown + Google Tag Manager, Subscriptions, Third-party API Queries and Caching. MANDATORY: Use this API for ANY Hydrogen storefront question - do NOT use Storefront GraphQL when 'Hydrogen' is mentioned.", category: APICategory.UI_FRAMEWORK, @@ -17671,8 +17605,7 @@ var SHOPIFY_APIS2 = { context: "cart UI" } }, - [TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS]: { - name: TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS, + "storefront-web-components": { displayName: "Storefront Web Components", description: "HTML-first web components for building storefronts WITHOUT GraphQL. Choose when prompts mention: Web Components, HTML tags (, , , , ), native , 'HTML-only', 'without JavaScript', or 'no GraphQL'. Components handle data fetching and state internally.", category: APICategory.UI_FRAMEWORK, @@ -17681,10 +17614,13 @@ var SHOPIFY_APIS2 = { // Docs has and not a npm package publicPackages: ["@shopify/polaris-types", "@shopify/app-bridge-types"], visibility: Visibility.EARLY_ACCESS, - validation: true + validation: true, + exampleVectorStoreQuery: { + query: "shopify-cart", + context: "cart web component" + } }, - [THEME_APIs.LIQUID]: { - name: THEME_APIs.LIQUID, + liquid: { displayName: "Liquid", description: "Liquid is an open-source templating language created by Shopify. It is the backbone of Shopify themes and is used to load dynamic content on storefronts. Keywords: liquid, theme, shopify-theme, liquid-component, liquid-block, liquid-section, liquid-snippet, liquid-schemas, shopify-theme-schemas", category: APICategory.THEME, @@ -17696,15 +17632,39 @@ var SHOPIFY_APIS2 = { context: "product metafield access in a theme" } }, - [CONFIGURATION_APIs.CUSTOM_DATA]: { - name: CONFIGURATION_APIs.CUSTOM_DATA, + "custom-data": { displayName: "Custom Data", description: "MUST be used first when prompts mention Metafields or Metaobjects. Use Metafields and Metaobjects to model and store custom data for your app. Metafields extend built-in Shopify data types like products or customers, Metaobjects are custom data types that can be used to store bespoke data structures. Metafield and Metaobject definitions provide a schema and configuration for values to follow.", category: APICategory.CONFIGURATION, visibility: Visibility.PUBLIC, searchable: false + }, + "app-store-review": { + displayName: "App Store Review", + description: "Run a pre-submission compliance check against your Shopify app's codebase. Reviews App Store requirements and surfaces likely issues before you submit for official review.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-dev": { + displayName: "Developer Onboarding", + description: "Get started building on Shopify. Use when a developer asks to build an app, build a theme, create a dev store, set up a partner account, scaffold a project, or get started developing for Shopify. NOT for merchants managing stores.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-merchant": { + displayName: "Merchant Onboarding", + description: "Set up and connect a Shopify store from your AI assistant. Use when the user wants to: set up my Shopify store, connect my store, install Shopify plugin, get started with Shopify, manage my store, add products to my store, merchant onboarding, start selling online, Shopify setup help, create my first store, how do I set up an online store, shopify.com/SKILL.md, import products, migrate from Square, migrate from WooCommerce, migrate from Etsy, migrate from Amazon, migrate from eBay, migrate from Wix, import from Google Merchant Center, migrate from Clover, migrate from Lightspeed, move products to Shopify, import catalog, replatform to Shopify. This is for store owners \u2014 not developers.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor", + frontmatterExtras: { context: "fork" } } -}; +}); // src/schemaOperations/loadAPISchemas.ts function getDataDirectory() { @@ -17724,6 +17684,22 @@ function getDataDirectory() { return path.resolve(currentDir, "../data"); } var dataDir = getDataDirectory(); +function configuredSchemaPath(api) { + const apiConfig = SHOPIFY_APIS[api]; + if (apiConfig?.gqlSchemaPath) return apiConfig.gqlSchemaPath; + if (apiConfig?.gqlSchemaFileName) { + return path.join(dataDir, apiConfig.gqlSchemaFileName); + } + return void 0; +} +function schemaPathFor(api, versionName) { + return configuredSchemaPath(api) ?? path.join(dataDir, `${api}_${versionName}.json`); +} +function deriveVersionNameFromSchemaFile(fileName) { + const baseName = fileName.replace(/\.json(?:\.gz)?$/, ""); + const versionSeparatorIndex = baseName.lastIndexOf("_"); + return versionSeparatorIndex === -1 ? "latest" : baseName.slice(versionSeparatorIndex + 1); +} function loadAPISchemas(apis, schemaOptions) { if (apis.length === 0) { throw new Error("No APIs provided"); @@ -17738,7 +17714,7 @@ function loadAPISchemas(apis, schemaOptions) { { ...schemaOptions, api: apis[0], - schemaPath: schemaOptions.schemaPath ?? SHOPIFY_APIS2[apis[0]]?.gqlSchemaPath ?? path.join(dataDir, `${apis[0]}_${schemaOptions.name}.json`) + schemaPath: schemaOptions.schemaPath ?? schemaPathFor(apis[0], schemaOptions.name) } ]; } @@ -17753,15 +17729,18 @@ function loadAPISchemas(apis, schemaOptions) { const versionsWithApi = versions.map((v) => ({ ...v, api, - schemaPath: SHOPIFY_APIS2[api]?.gqlSchemaPath ?? path.join(dataDir, `${api}_${v.name}.json`) + schemaPath: schemaPathFor(api, v.name) })); apiVersions.push(...versionsWithApi); - } else if (SHOPIFY_APIS2[api]?.gqlSchemaPath) { + } else { + const apiConfig = SHOPIFY_APIS[api]; + const configuredPath = configuredSchemaPath(api); + if (!configuredPath) continue; apiVersions.push({ - name: "latest", + name: apiConfig?.gqlSchemaFileName ? deriveVersionNameFromSchemaFile(apiConfig.gqlSchemaFileName) : "latest", latestVersion: true, api, - schemaPath: SHOPIFY_APIS2[api].gqlSchemaPath + schemaPath: configuredPath }); } } @@ -18186,7 +18165,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -18200,7 +18179,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-payments-apps", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-polaris-admin-extensions/SKILL.md b/skills/shopify-polaris-admin-extensions/SKILL.md index daca568..d02817e 100644 --- a/skills/shopify-polaris-admin-extensions/SKILL.md +++ b/skills/shopify-polaris-admin-extensions/SKILL.md @@ -4,7 +4,7 @@ description: "Add custom actions and blocks from your app at contextually releva compatibility: Requires Node.js metadata: author: Shopify - version: "1.1.0" + version: "1.6.0" --- ## Required Tool Calls (do not skip) diff --git a/skills/shopify-polaris-admin-extensions/package-lock.json b/skills/shopify-polaris-admin-extensions/package-lock.json deleted file mode 100644 index 3508656..0000000 --- a/skills/shopify-polaris-admin-extensions/package-lock.json +++ /dev/null @@ -1,363 +0,0 @@ -{ - "name": "shopify-polaris-admin-extensions", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "shopify-polaris-admin-extensions", - "dependencies": { - "@shopify/ui-extensions": "2026.1.1", - "@types/react": "19.2.14", - "preact": "10.28.4", - "typescript": "5.9.3" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@shopify/ui-extensions": { - "version": "2026.1.1", - "resolved": "https://npm.shopify.io/node/@shopify/ui-extensions/-/ui-extensions-2026.1.1.tgz", - "integrity": "sha512-QjyU/PsbmEM0f/UmPA0MVwPjMy4tZxecBtoh7YqZk0D3RrAK9fw5FTn+yDVw6YOIcH97/Wk5zJCUuXVCJ85C1A==", - "license": "MIT", - "dependencies": { - "ts-morph": "^25.0.1" - }, - "peerDependencies": { - "@preact/signals": "*", - "preact": "*" - }, - "peerDependenciesMeta": { - "@preact/signals": { - "optional": true - }, - "preact": { - "optional": true - } - } - }, - "node_modules/@ts-morph/common": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.26.1.tgz", - "integrity": "sha512-Sn28TGl/4cFpcM+jwsH1wLncYq3FtN/BIpem+HOygfBWPT5pAeS5dB4VFVzV8FbnOKHpDLZmvAl4AjPEev5idA==", - "license": "MIT", - "dependencies": { - "fast-glob": "^3.3.2", - "minimatch": "^9.0.4", - "path-browserify": "^1.0.1" - } - }, - "node_modules/@types/react": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", - "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/code-block-writer": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", - "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "license": "MIT" - }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/preact": { - "version": "10.28.4", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.4.tgz", - "integrity": "sha512-uKFfOHWuSNpRFVTnljsCluEFq57OKT+0QdOiQo8XWnQ/pSvg7OpX5eNOejELXJMWy+BwM2nobz0FkvzmnpCNsQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-morph": { - "version": "25.0.1", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-25.0.1.tgz", - "integrity": "sha512-QJEiTdnz1YjrB3JFhd626gX4rKHDLSjSVMvGGG4v7ONc3RBwa0Eei98G9AT9uNFDMtV54JyuXsFeC+OH0n6bXQ==", - "license": "MIT", - "dependencies": { - "@ts-morph/common": "~0.26.0", - "code-block-writer": "^13.0.3" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - } - } -} diff --git a/skills/shopify-polaris-admin-extensions/scripts/search_docs.mjs b/skills/shopify-polaris-admin-extensions/scripts/search_docs.mjs index 33dfd00..e5c3d55 100755 --- a/skills/shopify-polaris-admin-extensions/scripts/search_docs.mjs +++ b/skills/shopify-polaris-admin-extensions/scripts/search_docs.mjs @@ -22,7 +22,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -36,7 +36,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-polaris-admin-extensions", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-polaris-admin-extensions/scripts/validate.mjs b/skills/shopify-polaris-admin-extensions/scripts/validate.mjs index f8539c8..473935d 100755 --- a/skills/shopify-polaris-admin-extensions/scripts/validate.mjs +++ b/skills/shopify-polaris-admin-extensions/scripts/validate.mjs @@ -4,61 +4,6 @@ import { readFileSync } from "fs"; import { parseArgs } from "util"; -// src/types/api-constants.ts -var GRAPHQL_APIs = { - ADMIN: "admin", - STOREFRONT: "storefront-graphql", - PARTNER: "partner", - CUSTOMER: "customer", - PAYMENTS_APPS: "payments-apps" -}; -var FUNCTION_GRAPHQL_SCHEMAS = { - FUNCTIONS_CART_CHECKOUT_VALIDATION: "functions_cart_checkout_validation", - FUNCTIONS_CART_TRANSFORM: "functions_cart_transform", - FUNCTIONS_DELIVERY_CUSTOMIZATION: "functions_delivery_customization", - FUNCTIONS_DISCOUNT: "functions_discount", - FUNCTIONS_DISCOUNTS_ALLOCATOR: "functions_discounts_allocator", - FUNCTIONS_FULFILLMENT_CONSTRAINTS: "functions_fulfillment_constraints", - FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR: "functions_local_pickup_delivery_option_generator", - FUNCTIONS_ORDER_DISCOUNTS: "functions_order_discounts", - FUNCTIONS_ORDER_ROUTING_LOCATION_RULE: "functions_order_routing_location_rule", - FUNCTIONS_PAYMENT_CUSTOMIZATION: "functions_payment_customization", - FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR: "functions_pickup_point_delivery_option_generator", - FUNCTIONS_PRODUCT_DISCOUNTS: "functions_product_discounts", - FUNCTIONS_SHIPPING_DISCOUNTS: "functions_shipping_discounts" -}; -var FUNCTIONS_APIs = { - FUNCTIONS: "functions" - // Main Functions API without GraphQL schema -}; -var TYPESCRIPT_APIs = { - POLARIS_APP_HOME: "polaris-app-home", - POLARIS_ADMIN_EXTENSIONS: "polaris-admin-extensions", - POLARIS_CHECKOUT_EXTENSIONS: "polaris-checkout-extensions", - POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS: "polaris-customer-account-extensions", - POS_UI: "pos-ui", - HYDROGEN: "hydrogen", - STOREFRONT_WEB_COMPONENTS: "storefront-web-components" -}; -var THEME_APIs = { - LIQUID: "liquid" -}; -var CONFIGURATION_APIs = { - CUSTOM_DATA: "custom-data" -}; -var EXECUTION_APIs = { - USE_SHOPIFY_CLI: "use-shopify-cli" -}; -var SHOPIFY_APIS = { - ...GRAPHQL_APIs, - ...FUNCTIONS_APIs, - ...TYPESCRIPT_APIs, - ...THEME_APIs, - ...FUNCTION_GRAPHQL_SCHEMAS, - ...CONFIGURATION_APIs, - ...EXECUTION_APIs -}; - // src/types/api-types.ts var Visibility = { PUBLIC: "public", @@ -73,23 +18,28 @@ var APICategory = { UI_FRAMEWORK: "ui-framework", THEME: "theme", CONFIGURATION: "configuration", - EXECUTION: "execution" + EXECUTION: "execution", + GUIDANCE: "guidance" + // Procedural topics (onboarding, review checklists) — hand-maintained, no validation/search }; // src/types/api-mapping.ts -var SHOPIFY_APIS2 = { - [EXECUTION_APIs.USE_SHOPIFY_CLI]: { - name: EXECUTION_APIs.USE_SHOPIFY_CLI, +function defineApis(apis) { + return Object.fromEntries( + Object.entries(apis).map(([name, config]) => [name, { name, ...config }]) + ); +} +var SHOPIFY_APIS = defineApis({ + "use-shopify-cli": { displayName: "Use Shopify CLI", - description: "Choose before `admin` when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`) with **`shopify app config validate --json`** (not Admin GraphQL; MCP has no TOML validator); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", + description: "Choose when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate configuration before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", category: APICategory.EXECUTION, visibility: Visibility.PUBLIC, searchable: false }, - [GRAPHQL_APIs.ADMIN]: { - name: GRAPHQL_APIs.ADMIN, + admin: { displayName: "Admin API", - description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config files** (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`), pre-deploy config errors, or invalid TOML\u2014use **`use-shopify-cli`** and **`shopify app config validate --json`** (no TOML validator here). Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", + description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config validation** \u2014use **`use-shopify-cli`**. Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "admin" }, @@ -99,10 +49,9 @@ var SHOPIFY_APIS2 = { context: "creating a product" } }, - [GRAPHQL_APIs.STOREFRONT]: { - name: GRAPHQL_APIs.STOREFRONT, + "storefront-graphql": { displayName: "Storefront GraphQL API", - description: `Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use ${TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS} instead.`, + description: "Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use storefront-web-components instead.", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "storefront" }, @@ -112,8 +61,7 @@ var SHOPIFY_APIS2 = { context: "storefront search" } }, - [GRAPHQL_APIs.PARTNER]: { - name: GRAPHQL_APIs.PARTNER, + partner: { displayName: "Partner API", description: "The Partner API lets you programmatically access data about your Partner Dashboard, including your apps, themes, and affiliate referrals.", category: APICategory.GRAPHQL, @@ -125,8 +73,7 @@ var SHOPIFY_APIS2 = { context: "app install data" } }, - [GRAPHQL_APIs.CUSTOMER]: { - name: GRAPHQL_APIs.CUSTOMER, + customer: { displayName: "Customer Account API", description: "The Customer Account API allows customers to access their own data including orders, payment methods, and addresses.", category: APICategory.GRAPHQL, @@ -138,8 +85,7 @@ var SHOPIFY_APIS2 = { context: "customer order history" } }, - [GRAPHQL_APIs.PAYMENTS_APPS]: { - name: GRAPHQL_APIs.PAYMENTS_APPS, + "payments-apps": { displayName: "Payments Apps API", description: "The Payments Apps API enables payment providers to integrate their payment solutions with Shopify's checkout.", category: APICategory.GRAPHQL, @@ -151,8 +97,7 @@ var SHOPIFY_APIS2 = { context: "pending a payment session" } }, - [FUNCTIONS_APIs.FUNCTIONS]: { - name: FUNCTIONS_APIs.FUNCTIONS, + functions: { displayName: "Shopify Functions", description: "Shopify Functions allow developers to customize the backend logic that powers parts of Shopify. Available APIs: Discount, Cart and Checkout Validation, Cart Transform, Pickup Point Delivery Option Generator, Delivery Customization, Fulfillment Constraints, Local Pickup Delivery Option Generator, Order Routing Location Rule, Payment Customization", category: APICategory.FUNCTIONS, @@ -164,8 +109,7 @@ var SHOPIFY_APIS2 = { } }, // Function-specific GraphQL APIs for input query validation - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION, + functions_cart_checkout_validation: { displayName: "Cart Checkout Validation Function", description: "GraphQL schema for Cart and Checkout Validation Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -174,16 +118,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_cart_checkout_validation_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM, + functions_cart_transform: { displayName: "Cart Transform Function", description: "GraphQL schema for Cart Transform Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_cart_transform_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION, + functions_delivery_customization: { displayName: "Delivery Customization Function", description: "GraphQL schema for Delivery Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -192,24 +134,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_delivery_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT, + functions_discount: { displayName: "Discount Function", description: "GraphQL schema for Discount Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discount_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR, + functions_discounts_allocator: { displayName: "Discounts Allocator Function", description: "GraphQL schema for Discounts Allocator Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discounts_allocator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS, + functions_fulfillment_constraints: { displayName: "Fulfillment Constraints Function", description: "GraphQL schema for Fulfillment Constraints Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -218,8 +157,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_fulfillment_constraints_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR, + functions_local_pickup_delivery_option_generator: { displayName: "Local Pickup Delivery Option Generator Function", description: "GraphQL schema for Local Pickup Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -228,16 +166,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_local_pickup_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS, + functions_order_discounts: { displayName: "Order Discounts Function", description: "GraphQL schema for Order Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_order_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE, + functions_order_routing_location_rule: { displayName: "Order Routing Location Rule Function", description: "GraphQL schema for Order Routing Location Rule Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -246,8 +182,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_order_routing_location_rule_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION, + functions_payment_customization: { displayName: "Payment Customization Function", description: "GraphQL schema for Payment Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -256,8 +191,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_payment_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR, + functions_pickup_point_delivery_option_generator: { displayName: "Pickup Point Delivery Option Generator Function", description: "GraphQL schema for Pickup Point Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -266,24 +200,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_pickup_point_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS, + functions_product_discounts: { displayName: "Product Discounts Function", description: "GraphQL schema for Product Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_product_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS, + functions_shipping_discounts: { displayName: "Shipping Discounts Function", description: "GraphQL schema for Shipping Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_shipping_discounts_schema" } }, - [TYPESCRIPT_APIs.POLARIS_APP_HOME]: { - name: TYPESCRIPT_APIs.POLARIS_APP_HOME, + "polaris-app-home": { displayName: "Polaris App Home", description: "Build your app's primary user interface embedded in the Shopify admin. If the prompt just mentions `Polaris` and you can't tell based off of the context what API they meant, assume they meant this API.", category: APICategory.UI_FRAMEWORK, @@ -295,13 +226,14 @@ var SHOPIFY_APIS2 = { context: "form in app home" } }, - [TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS, + "polaris-admin-extensions": { displayName: "Polaris Admin Extensions", description: `Add custom actions and blocks from your app at contextually relevant spots throughout the Shopify Admin. Admin UI Extensions also supports scaffolding new adminextensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "admin", + extensionTypeName: "Admin Extensions", + extensionSearchContext: "admin UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -309,13 +241,14 @@ var SHOPIFY_APIS2 = { context: "text input in an admin extension" } }, - [TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS, + "polaris-checkout-extensions": { displayName: "Polaris Checkout Extensions", description: `Build custom functionality that merchants can install at defined points in the checkout flow, including product information, shipping, payment, order summary, and Shop Pay. Checkout UI Extensions also supports scaffolding new checkout extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "checkout", + extensionTypeName: "Checkout Extensions", + extensionSearchContext: "checkout UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -323,13 +256,14 @@ var SHOPIFY_APIS2 = { context: "checkout button" } }, - [TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS, + "polaris-customer-account-extensions": { displayName: "Polaris Customer Account Extensions", description: `Build custom functionality that merchants can install at defined points on the Order index, Order status, and Profile pages in customer accounts. Customer Account UI Extensions also supports scaffolding new customer account extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "customer-account", + extensionTypeName: "Customer Account Extensions", + extensionSearchContext: "customer account UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -337,13 +271,14 @@ var SHOPIFY_APIS2 = { context: "customer account card" } }, - [TYPESCRIPT_APIs.POS_UI]: { - name: TYPESCRIPT_APIs.POS_UI, + "pos-ui": { displayName: "POS UI", description: `Build retail point-of-sale applications using Shopify's POS UI components. These components provide a consistent and familiar interface for POS applications. POS UI Extensions also supports scaffolding new POS extensions using Shopify CLI commands. Keywords: POS, Retail, smart grid`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "point-of-sale", + extensionTypeName: "POS UI Extensions", + extensionSearchContext: "POS UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -351,8 +286,7 @@ var SHOPIFY_APIS2 = { context: "POS screen layout" } }, - [TYPESCRIPT_APIs.HYDROGEN]: { - name: TYPESCRIPT_APIs.HYDROGEN, + hydrogen: { displayName: "Hydrogen", description: "Hydrogen storefront implementation cookbooks. Some of the available recipes are: B2B Commerce, Bundles, Combined Listings, Custom Cart Method, Dynamic Content with Metaobjects, Express Server, Google Tag Manager Integration, Infinite Scroll, Legacy Customer Account Flow, Markets, Partytown + Google Tag Manager, Subscriptions, Third-party API Queries and Caching. MANDATORY: Use this API for ANY Hydrogen storefront question - do NOT use Storefront GraphQL when 'Hydrogen' is mentioned.", category: APICategory.UI_FRAMEWORK, @@ -364,8 +298,7 @@ var SHOPIFY_APIS2 = { context: "cart UI" } }, - [TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS]: { - name: TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS, + "storefront-web-components": { displayName: "Storefront Web Components", description: "HTML-first web components for building storefronts WITHOUT GraphQL. Choose when prompts mention: Web Components, HTML tags (, , , , ), native , 'HTML-only', 'without JavaScript', or 'no GraphQL'. Components handle data fetching and state internally.", category: APICategory.UI_FRAMEWORK, @@ -374,10 +307,13 @@ var SHOPIFY_APIS2 = { // Docs has and not a npm package publicPackages: ["@shopify/polaris-types", "@shopify/app-bridge-types"], visibility: Visibility.EARLY_ACCESS, - validation: true + validation: true, + exampleVectorStoreQuery: { + query: "shopify-cart", + context: "cart web component" + } }, - [THEME_APIs.LIQUID]: { - name: THEME_APIs.LIQUID, + liquid: { displayName: "Liquid", description: "Liquid is an open-source templating language created by Shopify. It is the backbone of Shopify themes and is used to load dynamic content on storefronts. Keywords: liquid, theme, shopify-theme, liquid-component, liquid-block, liquid-section, liquid-snippet, liquid-schemas, shopify-theme-schemas", category: APICategory.THEME, @@ -389,15 +325,39 @@ var SHOPIFY_APIS2 = { context: "product metafield access in a theme" } }, - [CONFIGURATION_APIs.CUSTOM_DATA]: { - name: CONFIGURATION_APIs.CUSTOM_DATA, + "custom-data": { displayName: "Custom Data", description: "MUST be used first when prompts mention Metafields or Metaobjects. Use Metafields and Metaobjects to model and store custom data for your app. Metafields extend built-in Shopify data types like products or customers, Metaobjects are custom data types that can be used to store bespoke data structures. Metafield and Metaobject definitions provide a schema and configuration for values to follow.", category: APICategory.CONFIGURATION, visibility: Visibility.PUBLIC, searchable: false + }, + "app-store-review": { + displayName: "App Store Review", + description: "Run a pre-submission compliance check against your Shopify app's codebase. Reviews App Store requirements and surfaces likely issues before you submit for official review.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-dev": { + displayName: "Developer Onboarding", + description: "Get started building on Shopify. Use when a developer asks to build an app, build a theme, create a dev store, set up a partner account, scaffold a project, or get started developing for Shopify. NOT for merchants managing stores.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-merchant": { + displayName: "Merchant Onboarding", + description: "Set up and connect a Shopify store from your AI assistant. Use when the user wants to: set up my Shopify store, connect my store, install Shopify plugin, get started with Shopify, manage my store, add products to my store, merchant onboarding, start selling online, Shopify setup help, create my first store, how do I set up an online store, shopify.com/SKILL.md, import products, migrate from Square, migrate from WooCommerce, migrate from Etsy, migrate from Amazon, migrate from eBay, migrate from Wix, import from Google Merchant Center, migrate from Clover, migrate from Lightspeed, move products to Shopify, import catalog, replatform to Shopify. This is for store owners \u2014 not developers.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor", + frontmatterExtras: { context: "fork" } } -}; +}); // src/validation/formatCode.ts function generateMissingImports(packageNames, extensionTarget) { @@ -494,7 +454,7 @@ function createVirtualTSEnvironment(apiName) { const fileVersions = /* @__PURE__ */ new Map(); const virtualFiles = /* @__PURE__ */ new Map(); const packageRoot = getPackageRoot(); - const jsxImportSource = apiName == SHOPIFY_APIS.HYDROGEN ? "react" : "preact"; + const jsxImportSource = apiName === "hydrogen" ? "react" : "preact"; const servicesHost = createLanguageServiceHost( { fileVersions, virtualFiles }, packageRoot, @@ -1588,10 +1548,10 @@ async function tryResolvePath(candidates) { // src/validation/validateComponentCodeBlock.ts var ENFORCE_SHOPIFY_ONLY_COMPONENTS_APIS = [ - TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS, - TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS, - TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS, - TYPESCRIPT_APIs.POS_UI + "polaris-admin-extensions", + "polaris-checkout-extensions", + "polaris-customer-account-extensions", + "pos-ui" ]; async function validateComponentCodeBlock(input) { try { @@ -1602,12 +1562,12 @@ async function validateComponentCodeBlock(input) { resultDetail: "Validation failed: Invalid input: code is required" }; } - if (Object.keys(SHOPIFY_APIS2).filter( - (api) => SHOPIFY_APIS2[api].extensionSurfaceName + if (Object.keys(SHOPIFY_APIS).filter( + (api) => SHOPIFY_APIS[api].extensionSurfaceName ).includes(apiName) && !extensionTarget) { return { result: "failed" /* FAILED */, - resultDetail: `Extension target is required for API: ${apiName}. Use the learn_shopify_ui_extensions tool to get the list of available extension targets.` + resultDetail: `Extension target is required for API: ${apiName}. Look up the list of available extension targets in the API documentation.` }; } const apiMapping = getAPIMapping(apiName); @@ -1658,7 +1618,7 @@ function getAPIMapping(apiName) { if (!apiName) { throw new Error(`Invalid input: apiName is required`); } - const apiEntry = Object.values(SHOPIFY_APIS2).find( + const apiEntry = Object.values(SHOPIFY_APIS).find( (api) => api.name === apiName ); if (!apiEntry) { @@ -1689,7 +1649,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -1703,7 +1663,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-polaris-admin-extensions", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-polaris-app-home/SKILL.md b/skills/shopify-polaris-app-home/SKILL.md index 875d610..65ab9cc 100644 --- a/skills/shopify-polaris-app-home/SKILL.md +++ b/skills/shopify-polaris-app-home/SKILL.md @@ -4,7 +4,7 @@ description: "Build your app's primary user interface embedded in the Shopify ad compatibility: Requires Node.js metadata: author: Shopify - version: "1.1.0" + version: "1.6.0" --- ## Required Tool Calls (do not skip) diff --git a/skills/shopify-polaris-app-home/package-lock.json b/skills/shopify-polaris-app-home/package-lock.json deleted file mode 100644 index 008e2bc..0000000 --- a/skills/shopify-polaris-app-home/package-lock.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "name": "shopify-polaris-app-home", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "shopify-polaris-app-home", - "dependencies": { - "@shopify/app-bridge-types": "0.7.0", - "@shopify/polaris-types": "1.0.1", - "@types/react": "19.2.14", - "preact": "10.28.4", - "typescript": "5.9.3" - } - }, - "node_modules/@shopify/app-bridge-types": { - "version": "0.7.0", - "resolved": "https://npm.shopify.io/node/@shopify/app-bridge-types/-/app-bridge-types-0.7.0.tgz", - "integrity": "sha512-A/DiGIjCBdd45ijMDKLgXrrGG68so3d25Yaeo0lv8ruWeljHGn3sA+UU1o/5BptSPkikDkgPPl8EQDxe4/KShw==", - "license": "ISC", - "dependencies": { - "@standard-schema/spec": "^1.0.0" - } - }, - "node_modules/@shopify/polaris-types": { - "version": "1.0.1", - "resolved": "https://npm.shopify.io/node/@shopify/polaris-types/-/polaris-types-1.0.1.tgz", - "integrity": "sha512-BZs47atXnaOVqFrCfTeXc6Vz8Vk8Vpj9o3nx/lYTvy9i4pPvd4K4mRKIhjrer2NWITCMvY6+nZ6GE1I9Qfq4rQ==" - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", - "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/preact": { - "version": "10.28.4", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.4.tgz", - "integrity": "sha512-uKFfOHWuSNpRFVTnljsCluEFq57OKT+0QdOiQo8XWnQ/pSvg7OpX5eNOejELXJMWy+BwM2nobz0FkvzmnpCNsQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - } - } -} diff --git a/skills/shopify-polaris-app-home/scripts/search_docs.mjs b/skills/shopify-polaris-app-home/scripts/search_docs.mjs index 2030669..6833125 100755 --- a/skills/shopify-polaris-app-home/scripts/search_docs.mjs +++ b/skills/shopify-polaris-app-home/scripts/search_docs.mjs @@ -22,7 +22,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -36,7 +36,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-polaris-app-home", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-polaris-app-home/scripts/validate.mjs b/skills/shopify-polaris-app-home/scripts/validate.mjs index 8400f63..4609c27 100755 --- a/skills/shopify-polaris-app-home/scripts/validate.mjs +++ b/skills/shopify-polaris-app-home/scripts/validate.mjs @@ -4,61 +4,6 @@ import { readFileSync } from "fs"; import { parseArgs } from "util"; -// src/types/api-constants.ts -var GRAPHQL_APIs = { - ADMIN: "admin", - STOREFRONT: "storefront-graphql", - PARTNER: "partner", - CUSTOMER: "customer", - PAYMENTS_APPS: "payments-apps" -}; -var FUNCTION_GRAPHQL_SCHEMAS = { - FUNCTIONS_CART_CHECKOUT_VALIDATION: "functions_cart_checkout_validation", - FUNCTIONS_CART_TRANSFORM: "functions_cart_transform", - FUNCTIONS_DELIVERY_CUSTOMIZATION: "functions_delivery_customization", - FUNCTIONS_DISCOUNT: "functions_discount", - FUNCTIONS_DISCOUNTS_ALLOCATOR: "functions_discounts_allocator", - FUNCTIONS_FULFILLMENT_CONSTRAINTS: "functions_fulfillment_constraints", - FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR: "functions_local_pickup_delivery_option_generator", - FUNCTIONS_ORDER_DISCOUNTS: "functions_order_discounts", - FUNCTIONS_ORDER_ROUTING_LOCATION_RULE: "functions_order_routing_location_rule", - FUNCTIONS_PAYMENT_CUSTOMIZATION: "functions_payment_customization", - FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR: "functions_pickup_point_delivery_option_generator", - FUNCTIONS_PRODUCT_DISCOUNTS: "functions_product_discounts", - FUNCTIONS_SHIPPING_DISCOUNTS: "functions_shipping_discounts" -}; -var FUNCTIONS_APIs = { - FUNCTIONS: "functions" - // Main Functions API without GraphQL schema -}; -var TYPESCRIPT_APIs = { - POLARIS_APP_HOME: "polaris-app-home", - POLARIS_ADMIN_EXTENSIONS: "polaris-admin-extensions", - POLARIS_CHECKOUT_EXTENSIONS: "polaris-checkout-extensions", - POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS: "polaris-customer-account-extensions", - POS_UI: "pos-ui", - HYDROGEN: "hydrogen", - STOREFRONT_WEB_COMPONENTS: "storefront-web-components" -}; -var THEME_APIs = { - LIQUID: "liquid" -}; -var CONFIGURATION_APIs = { - CUSTOM_DATA: "custom-data" -}; -var EXECUTION_APIs = { - USE_SHOPIFY_CLI: "use-shopify-cli" -}; -var SHOPIFY_APIS = { - ...GRAPHQL_APIs, - ...FUNCTIONS_APIs, - ...TYPESCRIPT_APIs, - ...THEME_APIs, - ...FUNCTION_GRAPHQL_SCHEMAS, - ...CONFIGURATION_APIs, - ...EXECUTION_APIs -}; - // src/types/api-types.ts var Visibility = { PUBLIC: "public", @@ -73,23 +18,28 @@ var APICategory = { UI_FRAMEWORK: "ui-framework", THEME: "theme", CONFIGURATION: "configuration", - EXECUTION: "execution" + EXECUTION: "execution", + GUIDANCE: "guidance" + // Procedural topics (onboarding, review checklists) — hand-maintained, no validation/search }; // src/types/api-mapping.ts -var SHOPIFY_APIS2 = { - [EXECUTION_APIs.USE_SHOPIFY_CLI]: { - name: EXECUTION_APIs.USE_SHOPIFY_CLI, +function defineApis(apis) { + return Object.fromEntries( + Object.entries(apis).map(([name, config]) => [name, { name, ...config }]) + ); +} +var SHOPIFY_APIS = defineApis({ + "use-shopify-cli": { displayName: "Use Shopify CLI", - description: "Choose before `admin` when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`) with **`shopify app config validate --json`** (not Admin GraphQL; MCP has no TOML validator); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", + description: "Choose when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate configuration before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", category: APICategory.EXECUTION, visibility: Visibility.PUBLIC, searchable: false }, - [GRAPHQL_APIs.ADMIN]: { - name: GRAPHQL_APIs.ADMIN, + admin: { displayName: "Admin API", - description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config files** (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`), pre-deploy config errors, or invalid TOML\u2014use **`use-shopify-cli`** and **`shopify app config validate --json`** (no TOML validator here). Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", + description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config validation** \u2014use **`use-shopify-cli`**. Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "admin" }, @@ -99,10 +49,9 @@ var SHOPIFY_APIS2 = { context: "creating a product" } }, - [GRAPHQL_APIs.STOREFRONT]: { - name: GRAPHQL_APIs.STOREFRONT, + "storefront-graphql": { displayName: "Storefront GraphQL API", - description: `Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use ${TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS} instead.`, + description: "Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use storefront-web-components instead.", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "storefront" }, @@ -112,8 +61,7 @@ var SHOPIFY_APIS2 = { context: "storefront search" } }, - [GRAPHQL_APIs.PARTNER]: { - name: GRAPHQL_APIs.PARTNER, + partner: { displayName: "Partner API", description: "The Partner API lets you programmatically access data about your Partner Dashboard, including your apps, themes, and affiliate referrals.", category: APICategory.GRAPHQL, @@ -125,8 +73,7 @@ var SHOPIFY_APIS2 = { context: "app install data" } }, - [GRAPHQL_APIs.CUSTOMER]: { - name: GRAPHQL_APIs.CUSTOMER, + customer: { displayName: "Customer Account API", description: "The Customer Account API allows customers to access their own data including orders, payment methods, and addresses.", category: APICategory.GRAPHQL, @@ -138,8 +85,7 @@ var SHOPIFY_APIS2 = { context: "customer order history" } }, - [GRAPHQL_APIs.PAYMENTS_APPS]: { - name: GRAPHQL_APIs.PAYMENTS_APPS, + "payments-apps": { displayName: "Payments Apps API", description: "The Payments Apps API enables payment providers to integrate their payment solutions with Shopify's checkout.", category: APICategory.GRAPHQL, @@ -151,8 +97,7 @@ var SHOPIFY_APIS2 = { context: "pending a payment session" } }, - [FUNCTIONS_APIs.FUNCTIONS]: { - name: FUNCTIONS_APIs.FUNCTIONS, + functions: { displayName: "Shopify Functions", description: "Shopify Functions allow developers to customize the backend logic that powers parts of Shopify. Available APIs: Discount, Cart and Checkout Validation, Cart Transform, Pickup Point Delivery Option Generator, Delivery Customization, Fulfillment Constraints, Local Pickup Delivery Option Generator, Order Routing Location Rule, Payment Customization", category: APICategory.FUNCTIONS, @@ -164,8 +109,7 @@ var SHOPIFY_APIS2 = { } }, // Function-specific GraphQL APIs for input query validation - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION, + functions_cart_checkout_validation: { displayName: "Cart Checkout Validation Function", description: "GraphQL schema for Cart and Checkout Validation Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -174,16 +118,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_cart_checkout_validation_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM, + functions_cart_transform: { displayName: "Cart Transform Function", description: "GraphQL schema for Cart Transform Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_cart_transform_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION, + functions_delivery_customization: { displayName: "Delivery Customization Function", description: "GraphQL schema for Delivery Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -192,24 +134,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_delivery_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT, + functions_discount: { displayName: "Discount Function", description: "GraphQL schema for Discount Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discount_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR, + functions_discounts_allocator: { displayName: "Discounts Allocator Function", description: "GraphQL schema for Discounts Allocator Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discounts_allocator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS, + functions_fulfillment_constraints: { displayName: "Fulfillment Constraints Function", description: "GraphQL schema for Fulfillment Constraints Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -218,8 +157,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_fulfillment_constraints_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR, + functions_local_pickup_delivery_option_generator: { displayName: "Local Pickup Delivery Option Generator Function", description: "GraphQL schema for Local Pickup Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -228,16 +166,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_local_pickup_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS, + functions_order_discounts: { displayName: "Order Discounts Function", description: "GraphQL schema for Order Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_order_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE, + functions_order_routing_location_rule: { displayName: "Order Routing Location Rule Function", description: "GraphQL schema for Order Routing Location Rule Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -246,8 +182,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_order_routing_location_rule_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION, + functions_payment_customization: { displayName: "Payment Customization Function", description: "GraphQL schema for Payment Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -256,8 +191,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_payment_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR, + functions_pickup_point_delivery_option_generator: { displayName: "Pickup Point Delivery Option Generator Function", description: "GraphQL schema for Pickup Point Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -266,24 +200,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_pickup_point_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS, + functions_product_discounts: { displayName: "Product Discounts Function", description: "GraphQL schema for Product Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_product_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS, + functions_shipping_discounts: { displayName: "Shipping Discounts Function", description: "GraphQL schema for Shipping Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_shipping_discounts_schema" } }, - [TYPESCRIPT_APIs.POLARIS_APP_HOME]: { - name: TYPESCRIPT_APIs.POLARIS_APP_HOME, + "polaris-app-home": { displayName: "Polaris App Home", description: "Build your app's primary user interface embedded in the Shopify admin. If the prompt just mentions `Polaris` and you can't tell based off of the context what API they meant, assume they meant this API.", category: APICategory.UI_FRAMEWORK, @@ -295,13 +226,14 @@ var SHOPIFY_APIS2 = { context: "form in app home" } }, - [TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS, + "polaris-admin-extensions": { displayName: "Polaris Admin Extensions", description: `Add custom actions and blocks from your app at contextually relevant spots throughout the Shopify Admin. Admin UI Extensions also supports scaffolding new adminextensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "admin", + extensionTypeName: "Admin Extensions", + extensionSearchContext: "admin UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -309,13 +241,14 @@ var SHOPIFY_APIS2 = { context: "text input in an admin extension" } }, - [TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS, + "polaris-checkout-extensions": { displayName: "Polaris Checkout Extensions", description: `Build custom functionality that merchants can install at defined points in the checkout flow, including product information, shipping, payment, order summary, and Shop Pay. Checkout UI Extensions also supports scaffolding new checkout extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "checkout", + extensionTypeName: "Checkout Extensions", + extensionSearchContext: "checkout UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -323,13 +256,14 @@ var SHOPIFY_APIS2 = { context: "checkout button" } }, - [TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS, + "polaris-customer-account-extensions": { displayName: "Polaris Customer Account Extensions", description: `Build custom functionality that merchants can install at defined points on the Order index, Order status, and Profile pages in customer accounts. Customer Account UI Extensions also supports scaffolding new customer account extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "customer-account", + extensionTypeName: "Customer Account Extensions", + extensionSearchContext: "customer account UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -337,13 +271,14 @@ var SHOPIFY_APIS2 = { context: "customer account card" } }, - [TYPESCRIPT_APIs.POS_UI]: { - name: TYPESCRIPT_APIs.POS_UI, + "pos-ui": { displayName: "POS UI", description: `Build retail point-of-sale applications using Shopify's POS UI components. These components provide a consistent and familiar interface for POS applications. POS UI Extensions also supports scaffolding new POS extensions using Shopify CLI commands. Keywords: POS, Retail, smart grid`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "point-of-sale", + extensionTypeName: "POS UI Extensions", + extensionSearchContext: "POS UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -351,8 +286,7 @@ var SHOPIFY_APIS2 = { context: "POS screen layout" } }, - [TYPESCRIPT_APIs.HYDROGEN]: { - name: TYPESCRIPT_APIs.HYDROGEN, + hydrogen: { displayName: "Hydrogen", description: "Hydrogen storefront implementation cookbooks. Some of the available recipes are: B2B Commerce, Bundles, Combined Listings, Custom Cart Method, Dynamic Content with Metaobjects, Express Server, Google Tag Manager Integration, Infinite Scroll, Legacy Customer Account Flow, Markets, Partytown + Google Tag Manager, Subscriptions, Third-party API Queries and Caching. MANDATORY: Use this API for ANY Hydrogen storefront question - do NOT use Storefront GraphQL when 'Hydrogen' is mentioned.", category: APICategory.UI_FRAMEWORK, @@ -364,8 +298,7 @@ var SHOPIFY_APIS2 = { context: "cart UI" } }, - [TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS]: { - name: TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS, + "storefront-web-components": { displayName: "Storefront Web Components", description: "HTML-first web components for building storefronts WITHOUT GraphQL. Choose when prompts mention: Web Components, HTML tags (, , , , ), native , 'HTML-only', 'without JavaScript', or 'no GraphQL'. Components handle data fetching and state internally.", category: APICategory.UI_FRAMEWORK, @@ -374,10 +307,13 @@ var SHOPIFY_APIS2 = { // Docs has and not a npm package publicPackages: ["@shopify/polaris-types", "@shopify/app-bridge-types"], visibility: Visibility.EARLY_ACCESS, - validation: true + validation: true, + exampleVectorStoreQuery: { + query: "shopify-cart", + context: "cart web component" + } }, - [THEME_APIs.LIQUID]: { - name: THEME_APIs.LIQUID, + liquid: { displayName: "Liquid", description: "Liquid is an open-source templating language created by Shopify. It is the backbone of Shopify themes and is used to load dynamic content on storefronts. Keywords: liquid, theme, shopify-theme, liquid-component, liquid-block, liquid-section, liquid-snippet, liquid-schemas, shopify-theme-schemas", category: APICategory.THEME, @@ -389,15 +325,39 @@ var SHOPIFY_APIS2 = { context: "product metafield access in a theme" } }, - [CONFIGURATION_APIs.CUSTOM_DATA]: { - name: CONFIGURATION_APIs.CUSTOM_DATA, + "custom-data": { displayName: "Custom Data", description: "MUST be used first when prompts mention Metafields or Metaobjects. Use Metafields and Metaobjects to model and store custom data for your app. Metafields extend built-in Shopify data types like products or customers, Metaobjects are custom data types that can be used to store bespoke data structures. Metafield and Metaobject definitions provide a schema and configuration for values to follow.", category: APICategory.CONFIGURATION, visibility: Visibility.PUBLIC, searchable: false + }, + "app-store-review": { + displayName: "App Store Review", + description: "Run a pre-submission compliance check against your Shopify app's codebase. Reviews App Store requirements and surfaces likely issues before you submit for official review.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-dev": { + displayName: "Developer Onboarding", + description: "Get started building on Shopify. Use when a developer asks to build an app, build a theme, create a dev store, set up a partner account, scaffold a project, or get started developing for Shopify. NOT for merchants managing stores.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-merchant": { + displayName: "Merchant Onboarding", + description: "Set up and connect a Shopify store from your AI assistant. Use when the user wants to: set up my Shopify store, connect my store, install Shopify plugin, get started with Shopify, manage my store, add products to my store, merchant onboarding, start selling online, Shopify setup help, create my first store, how do I set up an online store, shopify.com/SKILL.md, import products, migrate from Square, migrate from WooCommerce, migrate from Etsy, migrate from Amazon, migrate from eBay, migrate from Wix, import from Google Merchant Center, migrate from Clover, migrate from Lightspeed, move products to Shopify, import catalog, replatform to Shopify. This is for store owners \u2014 not developers.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor", + frontmatterExtras: { context: "fork" } } -}; +}); // src/validation/formatCode.ts function generateMissingImports(packageNames, extensionTarget) { @@ -494,7 +454,7 @@ function createVirtualTSEnvironment(apiName) { const fileVersions = /* @__PURE__ */ new Map(); const virtualFiles = /* @__PURE__ */ new Map(); const packageRoot = getPackageRoot(); - const jsxImportSource = apiName == SHOPIFY_APIS.HYDROGEN ? "react" : "preact"; + const jsxImportSource = apiName === "hydrogen" ? "react" : "preact"; const servicesHost = createLanguageServiceHost( { fileVersions, virtualFiles }, packageRoot, @@ -1588,10 +1548,10 @@ async function tryResolvePath(candidates) { // src/validation/validateComponentCodeBlock.ts var ENFORCE_SHOPIFY_ONLY_COMPONENTS_APIS = [ - TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS, - TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS, - TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS, - TYPESCRIPT_APIs.POS_UI + "polaris-admin-extensions", + "polaris-checkout-extensions", + "polaris-customer-account-extensions", + "pos-ui" ]; async function validateComponentCodeBlock(input) { try { @@ -1602,12 +1562,12 @@ async function validateComponentCodeBlock(input) { resultDetail: "Validation failed: Invalid input: code is required" }; } - if (Object.keys(SHOPIFY_APIS2).filter( - (api) => SHOPIFY_APIS2[api].extensionSurfaceName + if (Object.keys(SHOPIFY_APIS).filter( + (api) => SHOPIFY_APIS[api].extensionSurfaceName ).includes(apiName) && !extensionTarget) { return { result: "failed" /* FAILED */, - resultDetail: `Extension target is required for API: ${apiName}. Use the learn_shopify_ui_extensions tool to get the list of available extension targets.` + resultDetail: `Extension target is required for API: ${apiName}. Look up the list of available extension targets in the API documentation.` }; } const apiMapping = getAPIMapping(apiName); @@ -1658,7 +1618,7 @@ function getAPIMapping(apiName) { if (!apiName) { throw new Error(`Invalid input: apiName is required`); } - const apiEntry = Object.values(SHOPIFY_APIS2).find( + const apiEntry = Object.values(SHOPIFY_APIS).find( (api) => api.name === apiName ); if (!apiEntry) { @@ -1689,7 +1649,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -1703,7 +1663,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-polaris-app-home", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-polaris-checkout-extensions/SKILL.md b/skills/shopify-polaris-checkout-extensions/SKILL.md index 1b85c65..51229d3 100644 --- a/skills/shopify-polaris-checkout-extensions/SKILL.md +++ b/skills/shopify-polaris-checkout-extensions/SKILL.md @@ -4,7 +4,7 @@ description: "Build custom functionality that merchants can install at defined p compatibility: Requires Node.js metadata: author: Shopify - version: "1.1.0" + version: "1.6.0" --- ## Required Tool Calls (do not skip) diff --git a/skills/shopify-polaris-checkout-extensions/package-lock.json b/skills/shopify-polaris-checkout-extensions/package-lock.json deleted file mode 100644 index f7ffb4c..0000000 --- a/skills/shopify-polaris-checkout-extensions/package-lock.json +++ /dev/null @@ -1,363 +0,0 @@ -{ - "name": "shopify-polaris-checkout-extensions", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "shopify-polaris-checkout-extensions", - "dependencies": { - "@shopify/ui-extensions": "2026.1.1", - "@types/react": "19.2.14", - "preact": "10.28.4", - "typescript": "5.9.3" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@shopify/ui-extensions": { - "version": "2026.1.1", - "resolved": "https://npm.shopify.io/node/@shopify/ui-extensions/-/ui-extensions-2026.1.1.tgz", - "integrity": "sha512-QjyU/PsbmEM0f/UmPA0MVwPjMy4tZxecBtoh7YqZk0D3RrAK9fw5FTn+yDVw6YOIcH97/Wk5zJCUuXVCJ85C1A==", - "license": "MIT", - "dependencies": { - "ts-morph": "^25.0.1" - }, - "peerDependencies": { - "@preact/signals": "*", - "preact": "*" - }, - "peerDependenciesMeta": { - "@preact/signals": { - "optional": true - }, - "preact": { - "optional": true - } - } - }, - "node_modules/@ts-morph/common": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.26.1.tgz", - "integrity": "sha512-Sn28TGl/4cFpcM+jwsH1wLncYq3FtN/BIpem+HOygfBWPT5pAeS5dB4VFVzV8FbnOKHpDLZmvAl4AjPEev5idA==", - "license": "MIT", - "dependencies": { - "fast-glob": "^3.3.2", - "minimatch": "^9.0.4", - "path-browserify": "^1.0.1" - } - }, - "node_modules/@types/react": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", - "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/code-block-writer": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", - "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "license": "MIT" - }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/preact": { - "version": "10.28.4", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.4.tgz", - "integrity": "sha512-uKFfOHWuSNpRFVTnljsCluEFq57OKT+0QdOiQo8XWnQ/pSvg7OpX5eNOejELXJMWy+BwM2nobz0FkvzmnpCNsQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-morph": { - "version": "25.0.1", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-25.0.1.tgz", - "integrity": "sha512-QJEiTdnz1YjrB3JFhd626gX4rKHDLSjSVMvGGG4v7ONc3RBwa0Eei98G9AT9uNFDMtV54JyuXsFeC+OH0n6bXQ==", - "license": "MIT", - "dependencies": { - "@ts-morph/common": "~0.26.0", - "code-block-writer": "^13.0.3" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - } - } -} diff --git a/skills/shopify-polaris-checkout-extensions/scripts/search_docs.mjs b/skills/shopify-polaris-checkout-extensions/scripts/search_docs.mjs index adb536d..39f6f0f 100755 --- a/skills/shopify-polaris-checkout-extensions/scripts/search_docs.mjs +++ b/skills/shopify-polaris-checkout-extensions/scripts/search_docs.mjs @@ -22,7 +22,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -36,7 +36,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-polaris-checkout-extensions", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-polaris-checkout-extensions/scripts/validate.mjs b/skills/shopify-polaris-checkout-extensions/scripts/validate.mjs index 4c4a9a0..4464d65 100755 --- a/skills/shopify-polaris-checkout-extensions/scripts/validate.mjs +++ b/skills/shopify-polaris-checkout-extensions/scripts/validate.mjs @@ -4,61 +4,6 @@ import { readFileSync } from "fs"; import { parseArgs } from "util"; -// src/types/api-constants.ts -var GRAPHQL_APIs = { - ADMIN: "admin", - STOREFRONT: "storefront-graphql", - PARTNER: "partner", - CUSTOMER: "customer", - PAYMENTS_APPS: "payments-apps" -}; -var FUNCTION_GRAPHQL_SCHEMAS = { - FUNCTIONS_CART_CHECKOUT_VALIDATION: "functions_cart_checkout_validation", - FUNCTIONS_CART_TRANSFORM: "functions_cart_transform", - FUNCTIONS_DELIVERY_CUSTOMIZATION: "functions_delivery_customization", - FUNCTIONS_DISCOUNT: "functions_discount", - FUNCTIONS_DISCOUNTS_ALLOCATOR: "functions_discounts_allocator", - FUNCTIONS_FULFILLMENT_CONSTRAINTS: "functions_fulfillment_constraints", - FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR: "functions_local_pickup_delivery_option_generator", - FUNCTIONS_ORDER_DISCOUNTS: "functions_order_discounts", - FUNCTIONS_ORDER_ROUTING_LOCATION_RULE: "functions_order_routing_location_rule", - FUNCTIONS_PAYMENT_CUSTOMIZATION: "functions_payment_customization", - FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR: "functions_pickup_point_delivery_option_generator", - FUNCTIONS_PRODUCT_DISCOUNTS: "functions_product_discounts", - FUNCTIONS_SHIPPING_DISCOUNTS: "functions_shipping_discounts" -}; -var FUNCTIONS_APIs = { - FUNCTIONS: "functions" - // Main Functions API without GraphQL schema -}; -var TYPESCRIPT_APIs = { - POLARIS_APP_HOME: "polaris-app-home", - POLARIS_ADMIN_EXTENSIONS: "polaris-admin-extensions", - POLARIS_CHECKOUT_EXTENSIONS: "polaris-checkout-extensions", - POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS: "polaris-customer-account-extensions", - POS_UI: "pos-ui", - HYDROGEN: "hydrogen", - STOREFRONT_WEB_COMPONENTS: "storefront-web-components" -}; -var THEME_APIs = { - LIQUID: "liquid" -}; -var CONFIGURATION_APIs = { - CUSTOM_DATA: "custom-data" -}; -var EXECUTION_APIs = { - USE_SHOPIFY_CLI: "use-shopify-cli" -}; -var SHOPIFY_APIS = { - ...GRAPHQL_APIs, - ...FUNCTIONS_APIs, - ...TYPESCRIPT_APIs, - ...THEME_APIs, - ...FUNCTION_GRAPHQL_SCHEMAS, - ...CONFIGURATION_APIs, - ...EXECUTION_APIs -}; - // src/types/api-types.ts var Visibility = { PUBLIC: "public", @@ -73,23 +18,28 @@ var APICategory = { UI_FRAMEWORK: "ui-framework", THEME: "theme", CONFIGURATION: "configuration", - EXECUTION: "execution" + EXECUTION: "execution", + GUIDANCE: "guidance" + // Procedural topics (onboarding, review checklists) — hand-maintained, no validation/search }; // src/types/api-mapping.ts -var SHOPIFY_APIS2 = { - [EXECUTION_APIs.USE_SHOPIFY_CLI]: { - name: EXECUTION_APIs.USE_SHOPIFY_CLI, +function defineApis(apis) { + return Object.fromEntries( + Object.entries(apis).map(([name, config]) => [name, { name, ...config }]) + ); +} +var SHOPIFY_APIS = defineApis({ + "use-shopify-cli": { displayName: "Use Shopify CLI", - description: "Choose before `admin` when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`) with **`shopify app config validate --json`** (not Admin GraphQL; MCP has no TOML validator); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", + description: "Choose when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate configuration before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", category: APICategory.EXECUTION, visibility: Visibility.PUBLIC, searchable: false }, - [GRAPHQL_APIs.ADMIN]: { - name: GRAPHQL_APIs.ADMIN, + admin: { displayName: "Admin API", - description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config files** (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`), pre-deploy config errors, or invalid TOML\u2014use **`use-shopify-cli`** and **`shopify app config validate --json`** (no TOML validator here). Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", + description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config validation** \u2014use **`use-shopify-cli`**. Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "admin" }, @@ -99,10 +49,9 @@ var SHOPIFY_APIS2 = { context: "creating a product" } }, - [GRAPHQL_APIs.STOREFRONT]: { - name: GRAPHQL_APIs.STOREFRONT, + "storefront-graphql": { displayName: "Storefront GraphQL API", - description: `Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use ${TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS} instead.`, + description: "Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use storefront-web-components instead.", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "storefront" }, @@ -112,8 +61,7 @@ var SHOPIFY_APIS2 = { context: "storefront search" } }, - [GRAPHQL_APIs.PARTNER]: { - name: GRAPHQL_APIs.PARTNER, + partner: { displayName: "Partner API", description: "The Partner API lets you programmatically access data about your Partner Dashboard, including your apps, themes, and affiliate referrals.", category: APICategory.GRAPHQL, @@ -125,8 +73,7 @@ var SHOPIFY_APIS2 = { context: "app install data" } }, - [GRAPHQL_APIs.CUSTOMER]: { - name: GRAPHQL_APIs.CUSTOMER, + customer: { displayName: "Customer Account API", description: "The Customer Account API allows customers to access their own data including orders, payment methods, and addresses.", category: APICategory.GRAPHQL, @@ -138,8 +85,7 @@ var SHOPIFY_APIS2 = { context: "customer order history" } }, - [GRAPHQL_APIs.PAYMENTS_APPS]: { - name: GRAPHQL_APIs.PAYMENTS_APPS, + "payments-apps": { displayName: "Payments Apps API", description: "The Payments Apps API enables payment providers to integrate their payment solutions with Shopify's checkout.", category: APICategory.GRAPHQL, @@ -151,8 +97,7 @@ var SHOPIFY_APIS2 = { context: "pending a payment session" } }, - [FUNCTIONS_APIs.FUNCTIONS]: { - name: FUNCTIONS_APIs.FUNCTIONS, + functions: { displayName: "Shopify Functions", description: "Shopify Functions allow developers to customize the backend logic that powers parts of Shopify. Available APIs: Discount, Cart and Checkout Validation, Cart Transform, Pickup Point Delivery Option Generator, Delivery Customization, Fulfillment Constraints, Local Pickup Delivery Option Generator, Order Routing Location Rule, Payment Customization", category: APICategory.FUNCTIONS, @@ -164,8 +109,7 @@ var SHOPIFY_APIS2 = { } }, // Function-specific GraphQL APIs for input query validation - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION, + functions_cart_checkout_validation: { displayName: "Cart Checkout Validation Function", description: "GraphQL schema for Cart and Checkout Validation Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -174,16 +118,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_cart_checkout_validation_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM, + functions_cart_transform: { displayName: "Cart Transform Function", description: "GraphQL schema for Cart Transform Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_cart_transform_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION, + functions_delivery_customization: { displayName: "Delivery Customization Function", description: "GraphQL schema for Delivery Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -192,24 +134,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_delivery_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT, + functions_discount: { displayName: "Discount Function", description: "GraphQL schema for Discount Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discount_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR, + functions_discounts_allocator: { displayName: "Discounts Allocator Function", description: "GraphQL schema for Discounts Allocator Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discounts_allocator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS, + functions_fulfillment_constraints: { displayName: "Fulfillment Constraints Function", description: "GraphQL schema for Fulfillment Constraints Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -218,8 +157,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_fulfillment_constraints_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR, + functions_local_pickup_delivery_option_generator: { displayName: "Local Pickup Delivery Option Generator Function", description: "GraphQL schema for Local Pickup Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -228,16 +166,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_local_pickup_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS, + functions_order_discounts: { displayName: "Order Discounts Function", description: "GraphQL schema for Order Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_order_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE, + functions_order_routing_location_rule: { displayName: "Order Routing Location Rule Function", description: "GraphQL schema for Order Routing Location Rule Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -246,8 +182,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_order_routing_location_rule_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION, + functions_payment_customization: { displayName: "Payment Customization Function", description: "GraphQL schema for Payment Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -256,8 +191,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_payment_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR, + functions_pickup_point_delivery_option_generator: { displayName: "Pickup Point Delivery Option Generator Function", description: "GraphQL schema for Pickup Point Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -266,24 +200,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_pickup_point_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS, + functions_product_discounts: { displayName: "Product Discounts Function", description: "GraphQL schema for Product Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_product_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS, + functions_shipping_discounts: { displayName: "Shipping Discounts Function", description: "GraphQL schema for Shipping Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_shipping_discounts_schema" } }, - [TYPESCRIPT_APIs.POLARIS_APP_HOME]: { - name: TYPESCRIPT_APIs.POLARIS_APP_HOME, + "polaris-app-home": { displayName: "Polaris App Home", description: "Build your app's primary user interface embedded in the Shopify admin. If the prompt just mentions `Polaris` and you can't tell based off of the context what API they meant, assume they meant this API.", category: APICategory.UI_FRAMEWORK, @@ -295,13 +226,14 @@ var SHOPIFY_APIS2 = { context: "form in app home" } }, - [TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS, + "polaris-admin-extensions": { displayName: "Polaris Admin Extensions", description: `Add custom actions and blocks from your app at contextually relevant spots throughout the Shopify Admin. Admin UI Extensions also supports scaffolding new adminextensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "admin", + extensionTypeName: "Admin Extensions", + extensionSearchContext: "admin UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -309,13 +241,14 @@ var SHOPIFY_APIS2 = { context: "text input in an admin extension" } }, - [TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS, + "polaris-checkout-extensions": { displayName: "Polaris Checkout Extensions", description: `Build custom functionality that merchants can install at defined points in the checkout flow, including product information, shipping, payment, order summary, and Shop Pay. Checkout UI Extensions also supports scaffolding new checkout extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "checkout", + extensionTypeName: "Checkout Extensions", + extensionSearchContext: "checkout UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -323,13 +256,14 @@ var SHOPIFY_APIS2 = { context: "checkout button" } }, - [TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS, + "polaris-customer-account-extensions": { displayName: "Polaris Customer Account Extensions", description: `Build custom functionality that merchants can install at defined points on the Order index, Order status, and Profile pages in customer accounts. Customer Account UI Extensions also supports scaffolding new customer account extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "customer-account", + extensionTypeName: "Customer Account Extensions", + extensionSearchContext: "customer account UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -337,13 +271,14 @@ var SHOPIFY_APIS2 = { context: "customer account card" } }, - [TYPESCRIPT_APIs.POS_UI]: { - name: TYPESCRIPT_APIs.POS_UI, + "pos-ui": { displayName: "POS UI", description: `Build retail point-of-sale applications using Shopify's POS UI components. These components provide a consistent and familiar interface for POS applications. POS UI Extensions also supports scaffolding new POS extensions using Shopify CLI commands. Keywords: POS, Retail, smart grid`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "point-of-sale", + extensionTypeName: "POS UI Extensions", + extensionSearchContext: "POS UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -351,8 +286,7 @@ var SHOPIFY_APIS2 = { context: "POS screen layout" } }, - [TYPESCRIPT_APIs.HYDROGEN]: { - name: TYPESCRIPT_APIs.HYDROGEN, + hydrogen: { displayName: "Hydrogen", description: "Hydrogen storefront implementation cookbooks. Some of the available recipes are: B2B Commerce, Bundles, Combined Listings, Custom Cart Method, Dynamic Content with Metaobjects, Express Server, Google Tag Manager Integration, Infinite Scroll, Legacy Customer Account Flow, Markets, Partytown + Google Tag Manager, Subscriptions, Third-party API Queries and Caching. MANDATORY: Use this API for ANY Hydrogen storefront question - do NOT use Storefront GraphQL when 'Hydrogen' is mentioned.", category: APICategory.UI_FRAMEWORK, @@ -364,8 +298,7 @@ var SHOPIFY_APIS2 = { context: "cart UI" } }, - [TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS]: { - name: TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS, + "storefront-web-components": { displayName: "Storefront Web Components", description: "HTML-first web components for building storefronts WITHOUT GraphQL. Choose when prompts mention: Web Components, HTML tags (, , , , ), native , 'HTML-only', 'without JavaScript', or 'no GraphQL'. Components handle data fetching and state internally.", category: APICategory.UI_FRAMEWORK, @@ -374,10 +307,13 @@ var SHOPIFY_APIS2 = { // Docs has and not a npm package publicPackages: ["@shopify/polaris-types", "@shopify/app-bridge-types"], visibility: Visibility.EARLY_ACCESS, - validation: true + validation: true, + exampleVectorStoreQuery: { + query: "shopify-cart", + context: "cart web component" + } }, - [THEME_APIs.LIQUID]: { - name: THEME_APIs.LIQUID, + liquid: { displayName: "Liquid", description: "Liquid is an open-source templating language created by Shopify. It is the backbone of Shopify themes and is used to load dynamic content on storefronts. Keywords: liquid, theme, shopify-theme, liquid-component, liquid-block, liquid-section, liquid-snippet, liquid-schemas, shopify-theme-schemas", category: APICategory.THEME, @@ -389,15 +325,39 @@ var SHOPIFY_APIS2 = { context: "product metafield access in a theme" } }, - [CONFIGURATION_APIs.CUSTOM_DATA]: { - name: CONFIGURATION_APIs.CUSTOM_DATA, + "custom-data": { displayName: "Custom Data", description: "MUST be used first when prompts mention Metafields or Metaobjects. Use Metafields and Metaobjects to model and store custom data for your app. Metafields extend built-in Shopify data types like products or customers, Metaobjects are custom data types that can be used to store bespoke data structures. Metafield and Metaobject definitions provide a schema and configuration for values to follow.", category: APICategory.CONFIGURATION, visibility: Visibility.PUBLIC, searchable: false + }, + "app-store-review": { + displayName: "App Store Review", + description: "Run a pre-submission compliance check against your Shopify app's codebase. Reviews App Store requirements and surfaces likely issues before you submit for official review.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-dev": { + displayName: "Developer Onboarding", + description: "Get started building on Shopify. Use when a developer asks to build an app, build a theme, create a dev store, set up a partner account, scaffold a project, or get started developing for Shopify. NOT for merchants managing stores.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-merchant": { + displayName: "Merchant Onboarding", + description: "Set up and connect a Shopify store from your AI assistant. Use when the user wants to: set up my Shopify store, connect my store, install Shopify plugin, get started with Shopify, manage my store, add products to my store, merchant onboarding, start selling online, Shopify setup help, create my first store, how do I set up an online store, shopify.com/SKILL.md, import products, migrate from Square, migrate from WooCommerce, migrate from Etsy, migrate from Amazon, migrate from eBay, migrate from Wix, import from Google Merchant Center, migrate from Clover, migrate from Lightspeed, move products to Shopify, import catalog, replatform to Shopify. This is for store owners \u2014 not developers.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor", + frontmatterExtras: { context: "fork" } } -}; +}); // src/validation/formatCode.ts function generateMissingImports(packageNames, extensionTarget) { @@ -494,7 +454,7 @@ function createVirtualTSEnvironment(apiName) { const fileVersions = /* @__PURE__ */ new Map(); const virtualFiles = /* @__PURE__ */ new Map(); const packageRoot = getPackageRoot(); - const jsxImportSource = apiName == SHOPIFY_APIS.HYDROGEN ? "react" : "preact"; + const jsxImportSource = apiName === "hydrogen" ? "react" : "preact"; const servicesHost = createLanguageServiceHost( { fileVersions, virtualFiles }, packageRoot, @@ -1588,10 +1548,10 @@ async function tryResolvePath(candidates) { // src/validation/validateComponentCodeBlock.ts var ENFORCE_SHOPIFY_ONLY_COMPONENTS_APIS = [ - TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS, - TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS, - TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS, - TYPESCRIPT_APIs.POS_UI + "polaris-admin-extensions", + "polaris-checkout-extensions", + "polaris-customer-account-extensions", + "pos-ui" ]; async function validateComponentCodeBlock(input) { try { @@ -1602,12 +1562,12 @@ async function validateComponentCodeBlock(input) { resultDetail: "Validation failed: Invalid input: code is required" }; } - if (Object.keys(SHOPIFY_APIS2).filter( - (api) => SHOPIFY_APIS2[api].extensionSurfaceName + if (Object.keys(SHOPIFY_APIS).filter( + (api) => SHOPIFY_APIS[api].extensionSurfaceName ).includes(apiName) && !extensionTarget) { return { result: "failed" /* FAILED */, - resultDetail: `Extension target is required for API: ${apiName}. Use the learn_shopify_ui_extensions tool to get the list of available extension targets.` + resultDetail: `Extension target is required for API: ${apiName}. Look up the list of available extension targets in the API documentation.` }; } const apiMapping = getAPIMapping(apiName); @@ -1658,7 +1618,7 @@ function getAPIMapping(apiName) { if (!apiName) { throw new Error(`Invalid input: apiName is required`); } - const apiEntry = Object.values(SHOPIFY_APIS2).find( + const apiEntry = Object.values(SHOPIFY_APIS).find( (api) => api.name === apiName ); if (!apiEntry) { @@ -1689,7 +1649,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -1703,7 +1663,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-polaris-checkout-extensions", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-polaris-customer-account-extensions/SKILL.md b/skills/shopify-polaris-customer-account-extensions/SKILL.md index f32d79a..f3c963a 100644 --- a/skills/shopify-polaris-customer-account-extensions/SKILL.md +++ b/skills/shopify-polaris-customer-account-extensions/SKILL.md @@ -4,7 +4,7 @@ description: "Build custom functionality that merchants can install at defined p compatibility: Requires Node.js metadata: author: Shopify - version: "1.1.0" + version: "1.6.0" --- ## Required Tool Calls (do not skip) diff --git a/skills/shopify-polaris-customer-account-extensions/package-lock.json b/skills/shopify-polaris-customer-account-extensions/package-lock.json deleted file mode 100644 index 271bc76..0000000 --- a/skills/shopify-polaris-customer-account-extensions/package-lock.json +++ /dev/null @@ -1,363 +0,0 @@ -{ - "name": "shopify-polaris-customer-account-extensions", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "shopify-polaris-customer-account-extensions", - "dependencies": { - "@shopify/ui-extensions": "2026.1.1", - "@types/react": "19.2.14", - "preact": "10.28.4", - "typescript": "5.9.3" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@shopify/ui-extensions": { - "version": "2026.1.1", - "resolved": "https://npm.shopify.io/node/@shopify/ui-extensions/-/ui-extensions-2026.1.1.tgz", - "integrity": "sha512-QjyU/PsbmEM0f/UmPA0MVwPjMy4tZxecBtoh7YqZk0D3RrAK9fw5FTn+yDVw6YOIcH97/Wk5zJCUuXVCJ85C1A==", - "license": "MIT", - "dependencies": { - "ts-morph": "^25.0.1" - }, - "peerDependencies": { - "@preact/signals": "*", - "preact": "*" - }, - "peerDependenciesMeta": { - "@preact/signals": { - "optional": true - }, - "preact": { - "optional": true - } - } - }, - "node_modules/@ts-morph/common": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.26.1.tgz", - "integrity": "sha512-Sn28TGl/4cFpcM+jwsH1wLncYq3FtN/BIpem+HOygfBWPT5pAeS5dB4VFVzV8FbnOKHpDLZmvAl4AjPEev5idA==", - "license": "MIT", - "dependencies": { - "fast-glob": "^3.3.2", - "minimatch": "^9.0.4", - "path-browserify": "^1.0.1" - } - }, - "node_modules/@types/react": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", - "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/code-block-writer": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", - "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "license": "MIT" - }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/preact": { - "version": "10.28.4", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.4.tgz", - "integrity": "sha512-uKFfOHWuSNpRFVTnljsCluEFq57OKT+0QdOiQo8XWnQ/pSvg7OpX5eNOejELXJMWy+BwM2nobz0FkvzmnpCNsQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-morph": { - "version": "25.0.1", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-25.0.1.tgz", - "integrity": "sha512-QJEiTdnz1YjrB3JFhd626gX4rKHDLSjSVMvGGG4v7ONc3RBwa0Eei98G9AT9uNFDMtV54JyuXsFeC+OH0n6bXQ==", - "license": "MIT", - "dependencies": { - "@ts-morph/common": "~0.26.0", - "code-block-writer": "^13.0.3" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - } - } -} diff --git a/skills/shopify-polaris-customer-account-extensions/scripts/search_docs.mjs b/skills/shopify-polaris-customer-account-extensions/scripts/search_docs.mjs index 450277f..96c5422 100755 --- a/skills/shopify-polaris-customer-account-extensions/scripts/search_docs.mjs +++ b/skills/shopify-polaris-customer-account-extensions/scripts/search_docs.mjs @@ -22,7 +22,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -36,7 +36,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-polaris-customer-account-extensions", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-polaris-customer-account-extensions/scripts/validate.mjs b/skills/shopify-polaris-customer-account-extensions/scripts/validate.mjs index 9f63f24..30a102a 100755 --- a/skills/shopify-polaris-customer-account-extensions/scripts/validate.mjs +++ b/skills/shopify-polaris-customer-account-extensions/scripts/validate.mjs @@ -4,61 +4,6 @@ import { readFileSync } from "fs"; import { parseArgs } from "util"; -// src/types/api-constants.ts -var GRAPHQL_APIs = { - ADMIN: "admin", - STOREFRONT: "storefront-graphql", - PARTNER: "partner", - CUSTOMER: "customer", - PAYMENTS_APPS: "payments-apps" -}; -var FUNCTION_GRAPHQL_SCHEMAS = { - FUNCTIONS_CART_CHECKOUT_VALIDATION: "functions_cart_checkout_validation", - FUNCTIONS_CART_TRANSFORM: "functions_cart_transform", - FUNCTIONS_DELIVERY_CUSTOMIZATION: "functions_delivery_customization", - FUNCTIONS_DISCOUNT: "functions_discount", - FUNCTIONS_DISCOUNTS_ALLOCATOR: "functions_discounts_allocator", - FUNCTIONS_FULFILLMENT_CONSTRAINTS: "functions_fulfillment_constraints", - FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR: "functions_local_pickup_delivery_option_generator", - FUNCTIONS_ORDER_DISCOUNTS: "functions_order_discounts", - FUNCTIONS_ORDER_ROUTING_LOCATION_RULE: "functions_order_routing_location_rule", - FUNCTIONS_PAYMENT_CUSTOMIZATION: "functions_payment_customization", - FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR: "functions_pickup_point_delivery_option_generator", - FUNCTIONS_PRODUCT_DISCOUNTS: "functions_product_discounts", - FUNCTIONS_SHIPPING_DISCOUNTS: "functions_shipping_discounts" -}; -var FUNCTIONS_APIs = { - FUNCTIONS: "functions" - // Main Functions API without GraphQL schema -}; -var TYPESCRIPT_APIs = { - POLARIS_APP_HOME: "polaris-app-home", - POLARIS_ADMIN_EXTENSIONS: "polaris-admin-extensions", - POLARIS_CHECKOUT_EXTENSIONS: "polaris-checkout-extensions", - POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS: "polaris-customer-account-extensions", - POS_UI: "pos-ui", - HYDROGEN: "hydrogen", - STOREFRONT_WEB_COMPONENTS: "storefront-web-components" -}; -var THEME_APIs = { - LIQUID: "liquid" -}; -var CONFIGURATION_APIs = { - CUSTOM_DATA: "custom-data" -}; -var EXECUTION_APIs = { - USE_SHOPIFY_CLI: "use-shopify-cli" -}; -var SHOPIFY_APIS = { - ...GRAPHQL_APIs, - ...FUNCTIONS_APIs, - ...TYPESCRIPT_APIs, - ...THEME_APIs, - ...FUNCTION_GRAPHQL_SCHEMAS, - ...CONFIGURATION_APIs, - ...EXECUTION_APIs -}; - // src/types/api-types.ts var Visibility = { PUBLIC: "public", @@ -73,23 +18,28 @@ var APICategory = { UI_FRAMEWORK: "ui-framework", THEME: "theme", CONFIGURATION: "configuration", - EXECUTION: "execution" + EXECUTION: "execution", + GUIDANCE: "guidance" + // Procedural topics (onboarding, review checklists) — hand-maintained, no validation/search }; // src/types/api-mapping.ts -var SHOPIFY_APIS2 = { - [EXECUTION_APIs.USE_SHOPIFY_CLI]: { - name: EXECUTION_APIs.USE_SHOPIFY_CLI, +function defineApis(apis) { + return Object.fromEntries( + Object.entries(apis).map(([name, config]) => [name, { name, ...config }]) + ); +} +var SHOPIFY_APIS = defineApis({ + "use-shopify-cli": { displayName: "Use Shopify CLI", - description: "Choose before `admin` when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`) with **`shopify app config validate --json`** (not Admin GraphQL; MCP has no TOML validator); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", + description: "Choose when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate configuration before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", category: APICategory.EXECUTION, visibility: Visibility.PUBLIC, searchable: false }, - [GRAPHQL_APIs.ADMIN]: { - name: GRAPHQL_APIs.ADMIN, + admin: { displayName: "Admin API", - description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config files** (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`), pre-deploy config errors, or invalid TOML\u2014use **`use-shopify-cli`** and **`shopify app config validate --json`** (no TOML validator here). Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", + description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config validation** \u2014use **`use-shopify-cli`**. Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "admin" }, @@ -99,10 +49,9 @@ var SHOPIFY_APIS2 = { context: "creating a product" } }, - [GRAPHQL_APIs.STOREFRONT]: { - name: GRAPHQL_APIs.STOREFRONT, + "storefront-graphql": { displayName: "Storefront GraphQL API", - description: `Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use ${TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS} instead.`, + description: "Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use storefront-web-components instead.", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "storefront" }, @@ -112,8 +61,7 @@ var SHOPIFY_APIS2 = { context: "storefront search" } }, - [GRAPHQL_APIs.PARTNER]: { - name: GRAPHQL_APIs.PARTNER, + partner: { displayName: "Partner API", description: "The Partner API lets you programmatically access data about your Partner Dashboard, including your apps, themes, and affiliate referrals.", category: APICategory.GRAPHQL, @@ -125,8 +73,7 @@ var SHOPIFY_APIS2 = { context: "app install data" } }, - [GRAPHQL_APIs.CUSTOMER]: { - name: GRAPHQL_APIs.CUSTOMER, + customer: { displayName: "Customer Account API", description: "The Customer Account API allows customers to access their own data including orders, payment methods, and addresses.", category: APICategory.GRAPHQL, @@ -138,8 +85,7 @@ var SHOPIFY_APIS2 = { context: "customer order history" } }, - [GRAPHQL_APIs.PAYMENTS_APPS]: { - name: GRAPHQL_APIs.PAYMENTS_APPS, + "payments-apps": { displayName: "Payments Apps API", description: "The Payments Apps API enables payment providers to integrate their payment solutions with Shopify's checkout.", category: APICategory.GRAPHQL, @@ -151,8 +97,7 @@ var SHOPIFY_APIS2 = { context: "pending a payment session" } }, - [FUNCTIONS_APIs.FUNCTIONS]: { - name: FUNCTIONS_APIs.FUNCTIONS, + functions: { displayName: "Shopify Functions", description: "Shopify Functions allow developers to customize the backend logic that powers parts of Shopify. Available APIs: Discount, Cart and Checkout Validation, Cart Transform, Pickup Point Delivery Option Generator, Delivery Customization, Fulfillment Constraints, Local Pickup Delivery Option Generator, Order Routing Location Rule, Payment Customization", category: APICategory.FUNCTIONS, @@ -164,8 +109,7 @@ var SHOPIFY_APIS2 = { } }, // Function-specific GraphQL APIs for input query validation - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION, + functions_cart_checkout_validation: { displayName: "Cart Checkout Validation Function", description: "GraphQL schema for Cart and Checkout Validation Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -174,16 +118,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_cart_checkout_validation_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM, + functions_cart_transform: { displayName: "Cart Transform Function", description: "GraphQL schema for Cart Transform Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_cart_transform_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION, + functions_delivery_customization: { displayName: "Delivery Customization Function", description: "GraphQL schema for Delivery Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -192,24 +134,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_delivery_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT, + functions_discount: { displayName: "Discount Function", description: "GraphQL schema for Discount Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discount_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR, + functions_discounts_allocator: { displayName: "Discounts Allocator Function", description: "GraphQL schema for Discounts Allocator Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discounts_allocator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS, + functions_fulfillment_constraints: { displayName: "Fulfillment Constraints Function", description: "GraphQL schema for Fulfillment Constraints Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -218,8 +157,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_fulfillment_constraints_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR, + functions_local_pickup_delivery_option_generator: { displayName: "Local Pickup Delivery Option Generator Function", description: "GraphQL schema for Local Pickup Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -228,16 +166,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_local_pickup_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS, + functions_order_discounts: { displayName: "Order Discounts Function", description: "GraphQL schema for Order Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_order_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE, + functions_order_routing_location_rule: { displayName: "Order Routing Location Rule Function", description: "GraphQL schema for Order Routing Location Rule Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -246,8 +182,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_order_routing_location_rule_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION, + functions_payment_customization: { displayName: "Payment Customization Function", description: "GraphQL schema for Payment Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -256,8 +191,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_payment_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR, + functions_pickup_point_delivery_option_generator: { displayName: "Pickup Point Delivery Option Generator Function", description: "GraphQL schema for Pickup Point Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -266,24 +200,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_pickup_point_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS, + functions_product_discounts: { displayName: "Product Discounts Function", description: "GraphQL schema for Product Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_product_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS, + functions_shipping_discounts: { displayName: "Shipping Discounts Function", description: "GraphQL schema for Shipping Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_shipping_discounts_schema" } }, - [TYPESCRIPT_APIs.POLARIS_APP_HOME]: { - name: TYPESCRIPT_APIs.POLARIS_APP_HOME, + "polaris-app-home": { displayName: "Polaris App Home", description: "Build your app's primary user interface embedded in the Shopify admin. If the prompt just mentions `Polaris` and you can't tell based off of the context what API they meant, assume they meant this API.", category: APICategory.UI_FRAMEWORK, @@ -295,13 +226,14 @@ var SHOPIFY_APIS2 = { context: "form in app home" } }, - [TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS, + "polaris-admin-extensions": { displayName: "Polaris Admin Extensions", description: `Add custom actions and blocks from your app at contextually relevant spots throughout the Shopify Admin. Admin UI Extensions also supports scaffolding new adminextensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "admin", + extensionTypeName: "Admin Extensions", + extensionSearchContext: "admin UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -309,13 +241,14 @@ var SHOPIFY_APIS2 = { context: "text input in an admin extension" } }, - [TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS, + "polaris-checkout-extensions": { displayName: "Polaris Checkout Extensions", description: `Build custom functionality that merchants can install at defined points in the checkout flow, including product information, shipping, payment, order summary, and Shop Pay. Checkout UI Extensions also supports scaffolding new checkout extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "checkout", + extensionTypeName: "Checkout Extensions", + extensionSearchContext: "checkout UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -323,13 +256,14 @@ var SHOPIFY_APIS2 = { context: "checkout button" } }, - [TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS, + "polaris-customer-account-extensions": { displayName: "Polaris Customer Account Extensions", description: `Build custom functionality that merchants can install at defined points on the Order index, Order status, and Profile pages in customer accounts. Customer Account UI Extensions also supports scaffolding new customer account extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "customer-account", + extensionTypeName: "Customer Account Extensions", + extensionSearchContext: "customer account UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -337,13 +271,14 @@ var SHOPIFY_APIS2 = { context: "customer account card" } }, - [TYPESCRIPT_APIs.POS_UI]: { - name: TYPESCRIPT_APIs.POS_UI, + "pos-ui": { displayName: "POS UI", description: `Build retail point-of-sale applications using Shopify's POS UI components. These components provide a consistent and familiar interface for POS applications. POS UI Extensions also supports scaffolding new POS extensions using Shopify CLI commands. Keywords: POS, Retail, smart grid`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "point-of-sale", + extensionTypeName: "POS UI Extensions", + extensionSearchContext: "POS UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -351,8 +286,7 @@ var SHOPIFY_APIS2 = { context: "POS screen layout" } }, - [TYPESCRIPT_APIs.HYDROGEN]: { - name: TYPESCRIPT_APIs.HYDROGEN, + hydrogen: { displayName: "Hydrogen", description: "Hydrogen storefront implementation cookbooks. Some of the available recipes are: B2B Commerce, Bundles, Combined Listings, Custom Cart Method, Dynamic Content with Metaobjects, Express Server, Google Tag Manager Integration, Infinite Scroll, Legacy Customer Account Flow, Markets, Partytown + Google Tag Manager, Subscriptions, Third-party API Queries and Caching. MANDATORY: Use this API for ANY Hydrogen storefront question - do NOT use Storefront GraphQL when 'Hydrogen' is mentioned.", category: APICategory.UI_FRAMEWORK, @@ -364,8 +298,7 @@ var SHOPIFY_APIS2 = { context: "cart UI" } }, - [TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS]: { - name: TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS, + "storefront-web-components": { displayName: "Storefront Web Components", description: "HTML-first web components for building storefronts WITHOUT GraphQL. Choose when prompts mention: Web Components, HTML tags (, , , , ), native , 'HTML-only', 'without JavaScript', or 'no GraphQL'. Components handle data fetching and state internally.", category: APICategory.UI_FRAMEWORK, @@ -374,10 +307,13 @@ var SHOPIFY_APIS2 = { // Docs has and not a npm package publicPackages: ["@shopify/polaris-types", "@shopify/app-bridge-types"], visibility: Visibility.EARLY_ACCESS, - validation: true + validation: true, + exampleVectorStoreQuery: { + query: "shopify-cart", + context: "cart web component" + } }, - [THEME_APIs.LIQUID]: { - name: THEME_APIs.LIQUID, + liquid: { displayName: "Liquid", description: "Liquid is an open-source templating language created by Shopify. It is the backbone of Shopify themes and is used to load dynamic content on storefronts. Keywords: liquid, theme, shopify-theme, liquid-component, liquid-block, liquid-section, liquid-snippet, liquid-schemas, shopify-theme-schemas", category: APICategory.THEME, @@ -389,15 +325,39 @@ var SHOPIFY_APIS2 = { context: "product metafield access in a theme" } }, - [CONFIGURATION_APIs.CUSTOM_DATA]: { - name: CONFIGURATION_APIs.CUSTOM_DATA, + "custom-data": { displayName: "Custom Data", description: "MUST be used first when prompts mention Metafields or Metaobjects. Use Metafields and Metaobjects to model and store custom data for your app. Metafields extend built-in Shopify data types like products or customers, Metaobjects are custom data types that can be used to store bespoke data structures. Metafield and Metaobject definitions provide a schema and configuration for values to follow.", category: APICategory.CONFIGURATION, visibility: Visibility.PUBLIC, searchable: false + }, + "app-store-review": { + displayName: "App Store Review", + description: "Run a pre-submission compliance check against your Shopify app's codebase. Reviews App Store requirements and surfaces likely issues before you submit for official review.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-dev": { + displayName: "Developer Onboarding", + description: "Get started building on Shopify. Use when a developer asks to build an app, build a theme, create a dev store, set up a partner account, scaffold a project, or get started developing for Shopify. NOT for merchants managing stores.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-merchant": { + displayName: "Merchant Onboarding", + description: "Set up and connect a Shopify store from your AI assistant. Use when the user wants to: set up my Shopify store, connect my store, install Shopify plugin, get started with Shopify, manage my store, add products to my store, merchant onboarding, start selling online, Shopify setup help, create my first store, how do I set up an online store, shopify.com/SKILL.md, import products, migrate from Square, migrate from WooCommerce, migrate from Etsy, migrate from Amazon, migrate from eBay, migrate from Wix, import from Google Merchant Center, migrate from Clover, migrate from Lightspeed, move products to Shopify, import catalog, replatform to Shopify. This is for store owners \u2014 not developers.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor", + frontmatterExtras: { context: "fork" } } -}; +}); // src/validation/formatCode.ts function generateMissingImports(packageNames, extensionTarget) { @@ -494,7 +454,7 @@ function createVirtualTSEnvironment(apiName) { const fileVersions = /* @__PURE__ */ new Map(); const virtualFiles = /* @__PURE__ */ new Map(); const packageRoot = getPackageRoot(); - const jsxImportSource = apiName == SHOPIFY_APIS.HYDROGEN ? "react" : "preact"; + const jsxImportSource = apiName === "hydrogen" ? "react" : "preact"; const servicesHost = createLanguageServiceHost( { fileVersions, virtualFiles }, packageRoot, @@ -1588,10 +1548,10 @@ async function tryResolvePath(candidates) { // src/validation/validateComponentCodeBlock.ts var ENFORCE_SHOPIFY_ONLY_COMPONENTS_APIS = [ - TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS, - TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS, - TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS, - TYPESCRIPT_APIs.POS_UI + "polaris-admin-extensions", + "polaris-checkout-extensions", + "polaris-customer-account-extensions", + "pos-ui" ]; async function validateComponentCodeBlock(input) { try { @@ -1602,12 +1562,12 @@ async function validateComponentCodeBlock(input) { resultDetail: "Validation failed: Invalid input: code is required" }; } - if (Object.keys(SHOPIFY_APIS2).filter( - (api) => SHOPIFY_APIS2[api].extensionSurfaceName + if (Object.keys(SHOPIFY_APIS).filter( + (api) => SHOPIFY_APIS[api].extensionSurfaceName ).includes(apiName) && !extensionTarget) { return { result: "failed" /* FAILED */, - resultDetail: `Extension target is required for API: ${apiName}. Use the learn_shopify_ui_extensions tool to get the list of available extension targets.` + resultDetail: `Extension target is required for API: ${apiName}. Look up the list of available extension targets in the API documentation.` }; } const apiMapping = getAPIMapping(apiName); @@ -1658,7 +1618,7 @@ function getAPIMapping(apiName) { if (!apiName) { throw new Error(`Invalid input: apiName is required`); } - const apiEntry = Object.values(SHOPIFY_APIS2).find( + const apiEntry = Object.values(SHOPIFY_APIS).find( (api) => api.name === apiName ); if (!apiEntry) { @@ -1689,7 +1649,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -1703,7 +1663,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-polaris-customer-account-extensions", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-pos-ui/SKILL.md b/skills/shopify-pos-ui/SKILL.md index f67d056..049059d 100644 --- a/skills/shopify-pos-ui/SKILL.md +++ b/skills/shopify-pos-ui/SKILL.md @@ -4,7 +4,7 @@ description: "Build retail point-of-sale applications using Shopify's POS UI com compatibility: Requires Node.js metadata: author: Shopify - version: "1.1.0" + version: "1.6.0" --- ## Required Tool Calls (do not skip) diff --git a/skills/shopify-pos-ui/package-lock.json b/skills/shopify-pos-ui/package-lock.json deleted file mode 100644 index 07bb720..0000000 --- a/skills/shopify-pos-ui/package-lock.json +++ /dev/null @@ -1,363 +0,0 @@ -{ - "name": "shopify-pos-ui", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "shopify-pos-ui", - "dependencies": { - "@shopify/ui-extensions": "2026.1.1", - "@types/react": "19.2.14", - "preact": "10.28.4", - "typescript": "5.9.3" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@shopify/ui-extensions": { - "version": "2026.1.1", - "resolved": "https://npm.shopify.io/node/@shopify/ui-extensions/-/ui-extensions-2026.1.1.tgz", - "integrity": "sha512-QjyU/PsbmEM0f/UmPA0MVwPjMy4tZxecBtoh7YqZk0D3RrAK9fw5FTn+yDVw6YOIcH97/Wk5zJCUuXVCJ85C1A==", - "license": "MIT", - "dependencies": { - "ts-morph": "^25.0.1" - }, - "peerDependencies": { - "@preact/signals": "*", - "preact": "*" - }, - "peerDependenciesMeta": { - "@preact/signals": { - "optional": true - }, - "preact": { - "optional": true - } - } - }, - "node_modules/@ts-morph/common": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.26.1.tgz", - "integrity": "sha512-Sn28TGl/4cFpcM+jwsH1wLncYq3FtN/BIpem+HOygfBWPT5pAeS5dB4VFVzV8FbnOKHpDLZmvAl4AjPEev5idA==", - "license": "MIT", - "dependencies": { - "fast-glob": "^3.3.2", - "minimatch": "^9.0.4", - "path-browserify": "^1.0.1" - } - }, - "node_modules/@types/react": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", - "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/code-block-writer": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", - "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "license": "MIT" - }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/preact": { - "version": "10.28.4", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.4.tgz", - "integrity": "sha512-uKFfOHWuSNpRFVTnljsCluEFq57OKT+0QdOiQo8XWnQ/pSvg7OpX5eNOejELXJMWy+BwM2nobz0FkvzmnpCNsQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-morph": { - "version": "25.0.1", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-25.0.1.tgz", - "integrity": "sha512-QJEiTdnz1YjrB3JFhd626gX4rKHDLSjSVMvGGG4v7ONc3RBwa0Eei98G9AT9uNFDMtV54JyuXsFeC+OH0n6bXQ==", - "license": "MIT", - "dependencies": { - "@ts-morph/common": "~0.26.0", - "code-block-writer": "^13.0.3" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - } - } -} diff --git a/skills/shopify-pos-ui/scripts/search_docs.mjs b/skills/shopify-pos-ui/scripts/search_docs.mjs index 77ccec5..747baa6 100755 --- a/skills/shopify-pos-ui/scripts/search_docs.mjs +++ b/skills/shopify-pos-ui/scripts/search_docs.mjs @@ -22,7 +22,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -36,7 +36,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-pos-ui", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-pos-ui/scripts/validate.mjs b/skills/shopify-pos-ui/scripts/validate.mjs index 434f969..8492bed 100755 --- a/skills/shopify-pos-ui/scripts/validate.mjs +++ b/skills/shopify-pos-ui/scripts/validate.mjs @@ -4,61 +4,6 @@ import { readFileSync } from "fs"; import { parseArgs } from "util"; -// src/types/api-constants.ts -var GRAPHQL_APIs = { - ADMIN: "admin", - STOREFRONT: "storefront-graphql", - PARTNER: "partner", - CUSTOMER: "customer", - PAYMENTS_APPS: "payments-apps" -}; -var FUNCTION_GRAPHQL_SCHEMAS = { - FUNCTIONS_CART_CHECKOUT_VALIDATION: "functions_cart_checkout_validation", - FUNCTIONS_CART_TRANSFORM: "functions_cart_transform", - FUNCTIONS_DELIVERY_CUSTOMIZATION: "functions_delivery_customization", - FUNCTIONS_DISCOUNT: "functions_discount", - FUNCTIONS_DISCOUNTS_ALLOCATOR: "functions_discounts_allocator", - FUNCTIONS_FULFILLMENT_CONSTRAINTS: "functions_fulfillment_constraints", - FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR: "functions_local_pickup_delivery_option_generator", - FUNCTIONS_ORDER_DISCOUNTS: "functions_order_discounts", - FUNCTIONS_ORDER_ROUTING_LOCATION_RULE: "functions_order_routing_location_rule", - FUNCTIONS_PAYMENT_CUSTOMIZATION: "functions_payment_customization", - FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR: "functions_pickup_point_delivery_option_generator", - FUNCTIONS_PRODUCT_DISCOUNTS: "functions_product_discounts", - FUNCTIONS_SHIPPING_DISCOUNTS: "functions_shipping_discounts" -}; -var FUNCTIONS_APIs = { - FUNCTIONS: "functions" - // Main Functions API without GraphQL schema -}; -var TYPESCRIPT_APIs = { - POLARIS_APP_HOME: "polaris-app-home", - POLARIS_ADMIN_EXTENSIONS: "polaris-admin-extensions", - POLARIS_CHECKOUT_EXTENSIONS: "polaris-checkout-extensions", - POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS: "polaris-customer-account-extensions", - POS_UI: "pos-ui", - HYDROGEN: "hydrogen", - STOREFRONT_WEB_COMPONENTS: "storefront-web-components" -}; -var THEME_APIs = { - LIQUID: "liquid" -}; -var CONFIGURATION_APIs = { - CUSTOM_DATA: "custom-data" -}; -var EXECUTION_APIs = { - USE_SHOPIFY_CLI: "use-shopify-cli" -}; -var SHOPIFY_APIS = { - ...GRAPHQL_APIs, - ...FUNCTIONS_APIs, - ...TYPESCRIPT_APIs, - ...THEME_APIs, - ...FUNCTION_GRAPHQL_SCHEMAS, - ...CONFIGURATION_APIs, - ...EXECUTION_APIs -}; - // src/types/api-types.ts var Visibility = { PUBLIC: "public", @@ -73,23 +18,28 @@ var APICategory = { UI_FRAMEWORK: "ui-framework", THEME: "theme", CONFIGURATION: "configuration", - EXECUTION: "execution" + EXECUTION: "execution", + GUIDANCE: "guidance" + // Procedural topics (onboarding, review checklists) — hand-maintained, no validation/search }; // src/types/api-mapping.ts -var SHOPIFY_APIS2 = { - [EXECUTION_APIs.USE_SHOPIFY_CLI]: { - name: EXECUTION_APIs.USE_SHOPIFY_CLI, +function defineApis(apis) { + return Object.fromEntries( + Object.entries(apis).map(([name, config]) => [name, { name, ...config }]) + ); +} +var SHOPIFY_APIS = defineApis({ + "use-shopify-cli": { displayName: "Use Shopify CLI", - description: "Choose before `admin` when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`) with **`shopify app config validate --json`** (not Admin GraphQL; MCP has no TOML validator); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", + description: "Choose when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate configuration before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", category: APICategory.EXECUTION, visibility: Visibility.PUBLIC, searchable: false }, - [GRAPHQL_APIs.ADMIN]: { - name: GRAPHQL_APIs.ADMIN, + admin: { displayName: "Admin API", - description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config files** (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`), pre-deploy config errors, or invalid TOML\u2014use **`use-shopify-cli`** and **`shopify app config validate --json`** (no TOML validator here). Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", + description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config validation** \u2014use **`use-shopify-cli`**. Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "admin" }, @@ -99,10 +49,9 @@ var SHOPIFY_APIS2 = { context: "creating a product" } }, - [GRAPHQL_APIs.STOREFRONT]: { - name: GRAPHQL_APIs.STOREFRONT, + "storefront-graphql": { displayName: "Storefront GraphQL API", - description: `Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use ${TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS} instead.`, + description: "Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use storefront-web-components instead.", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "storefront" }, @@ -112,8 +61,7 @@ var SHOPIFY_APIS2 = { context: "storefront search" } }, - [GRAPHQL_APIs.PARTNER]: { - name: GRAPHQL_APIs.PARTNER, + partner: { displayName: "Partner API", description: "The Partner API lets you programmatically access data about your Partner Dashboard, including your apps, themes, and affiliate referrals.", category: APICategory.GRAPHQL, @@ -125,8 +73,7 @@ var SHOPIFY_APIS2 = { context: "app install data" } }, - [GRAPHQL_APIs.CUSTOMER]: { - name: GRAPHQL_APIs.CUSTOMER, + customer: { displayName: "Customer Account API", description: "The Customer Account API allows customers to access their own data including orders, payment methods, and addresses.", category: APICategory.GRAPHQL, @@ -138,8 +85,7 @@ var SHOPIFY_APIS2 = { context: "customer order history" } }, - [GRAPHQL_APIs.PAYMENTS_APPS]: { - name: GRAPHQL_APIs.PAYMENTS_APPS, + "payments-apps": { displayName: "Payments Apps API", description: "The Payments Apps API enables payment providers to integrate their payment solutions with Shopify's checkout.", category: APICategory.GRAPHQL, @@ -151,8 +97,7 @@ var SHOPIFY_APIS2 = { context: "pending a payment session" } }, - [FUNCTIONS_APIs.FUNCTIONS]: { - name: FUNCTIONS_APIs.FUNCTIONS, + functions: { displayName: "Shopify Functions", description: "Shopify Functions allow developers to customize the backend logic that powers parts of Shopify. Available APIs: Discount, Cart and Checkout Validation, Cart Transform, Pickup Point Delivery Option Generator, Delivery Customization, Fulfillment Constraints, Local Pickup Delivery Option Generator, Order Routing Location Rule, Payment Customization", category: APICategory.FUNCTIONS, @@ -164,8 +109,7 @@ var SHOPIFY_APIS2 = { } }, // Function-specific GraphQL APIs for input query validation - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION, + functions_cart_checkout_validation: { displayName: "Cart Checkout Validation Function", description: "GraphQL schema for Cart and Checkout Validation Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -174,16 +118,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_cart_checkout_validation_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM, + functions_cart_transform: { displayName: "Cart Transform Function", description: "GraphQL schema for Cart Transform Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_cart_transform_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION, + functions_delivery_customization: { displayName: "Delivery Customization Function", description: "GraphQL schema for Delivery Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -192,24 +134,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_delivery_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT, + functions_discount: { displayName: "Discount Function", description: "GraphQL schema for Discount Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discount_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR, + functions_discounts_allocator: { displayName: "Discounts Allocator Function", description: "GraphQL schema for Discounts Allocator Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discounts_allocator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS, + functions_fulfillment_constraints: { displayName: "Fulfillment Constraints Function", description: "GraphQL schema for Fulfillment Constraints Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -218,8 +157,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_fulfillment_constraints_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR, + functions_local_pickup_delivery_option_generator: { displayName: "Local Pickup Delivery Option Generator Function", description: "GraphQL schema for Local Pickup Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -228,16 +166,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_local_pickup_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS, + functions_order_discounts: { displayName: "Order Discounts Function", description: "GraphQL schema for Order Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_order_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE, + functions_order_routing_location_rule: { displayName: "Order Routing Location Rule Function", description: "GraphQL schema for Order Routing Location Rule Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -246,8 +182,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_order_routing_location_rule_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION, + functions_payment_customization: { displayName: "Payment Customization Function", description: "GraphQL schema for Payment Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -256,8 +191,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_payment_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR, + functions_pickup_point_delivery_option_generator: { displayName: "Pickup Point Delivery Option Generator Function", description: "GraphQL schema for Pickup Point Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -266,24 +200,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_pickup_point_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS, + functions_product_discounts: { displayName: "Product Discounts Function", description: "GraphQL schema for Product Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_product_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS, + functions_shipping_discounts: { displayName: "Shipping Discounts Function", description: "GraphQL schema for Shipping Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_shipping_discounts_schema" } }, - [TYPESCRIPT_APIs.POLARIS_APP_HOME]: { - name: TYPESCRIPT_APIs.POLARIS_APP_HOME, + "polaris-app-home": { displayName: "Polaris App Home", description: "Build your app's primary user interface embedded in the Shopify admin. If the prompt just mentions `Polaris` and you can't tell based off of the context what API they meant, assume they meant this API.", category: APICategory.UI_FRAMEWORK, @@ -295,13 +226,14 @@ var SHOPIFY_APIS2 = { context: "form in app home" } }, - [TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS, + "polaris-admin-extensions": { displayName: "Polaris Admin Extensions", description: `Add custom actions and blocks from your app at contextually relevant spots throughout the Shopify Admin. Admin UI Extensions also supports scaffolding new adminextensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "admin", + extensionTypeName: "Admin Extensions", + extensionSearchContext: "admin UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -309,13 +241,14 @@ var SHOPIFY_APIS2 = { context: "text input in an admin extension" } }, - [TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS, + "polaris-checkout-extensions": { displayName: "Polaris Checkout Extensions", description: `Build custom functionality that merchants can install at defined points in the checkout flow, including product information, shipping, payment, order summary, and Shop Pay. Checkout UI Extensions also supports scaffolding new checkout extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "checkout", + extensionTypeName: "Checkout Extensions", + extensionSearchContext: "checkout UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -323,13 +256,14 @@ var SHOPIFY_APIS2 = { context: "checkout button" } }, - [TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS, + "polaris-customer-account-extensions": { displayName: "Polaris Customer Account Extensions", description: `Build custom functionality that merchants can install at defined points on the Order index, Order status, and Profile pages in customer accounts. Customer Account UI Extensions also supports scaffolding new customer account extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "customer-account", + extensionTypeName: "Customer Account Extensions", + extensionSearchContext: "customer account UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -337,13 +271,14 @@ var SHOPIFY_APIS2 = { context: "customer account card" } }, - [TYPESCRIPT_APIs.POS_UI]: { - name: TYPESCRIPT_APIs.POS_UI, + "pos-ui": { displayName: "POS UI", description: `Build retail point-of-sale applications using Shopify's POS UI components. These components provide a consistent and familiar interface for POS applications. POS UI Extensions also supports scaffolding new POS extensions using Shopify CLI commands. Keywords: POS, Retail, smart grid`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "point-of-sale", + extensionTypeName: "POS UI Extensions", + extensionSearchContext: "POS UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -351,8 +286,7 @@ var SHOPIFY_APIS2 = { context: "POS screen layout" } }, - [TYPESCRIPT_APIs.HYDROGEN]: { - name: TYPESCRIPT_APIs.HYDROGEN, + hydrogen: { displayName: "Hydrogen", description: "Hydrogen storefront implementation cookbooks. Some of the available recipes are: B2B Commerce, Bundles, Combined Listings, Custom Cart Method, Dynamic Content with Metaobjects, Express Server, Google Tag Manager Integration, Infinite Scroll, Legacy Customer Account Flow, Markets, Partytown + Google Tag Manager, Subscriptions, Third-party API Queries and Caching. MANDATORY: Use this API for ANY Hydrogen storefront question - do NOT use Storefront GraphQL when 'Hydrogen' is mentioned.", category: APICategory.UI_FRAMEWORK, @@ -364,8 +298,7 @@ var SHOPIFY_APIS2 = { context: "cart UI" } }, - [TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS]: { - name: TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS, + "storefront-web-components": { displayName: "Storefront Web Components", description: "HTML-first web components for building storefronts WITHOUT GraphQL. Choose when prompts mention: Web Components, HTML tags (, , , , ), native , 'HTML-only', 'without JavaScript', or 'no GraphQL'. Components handle data fetching and state internally.", category: APICategory.UI_FRAMEWORK, @@ -374,10 +307,13 @@ var SHOPIFY_APIS2 = { // Docs has and not a npm package publicPackages: ["@shopify/polaris-types", "@shopify/app-bridge-types"], visibility: Visibility.EARLY_ACCESS, - validation: true + validation: true, + exampleVectorStoreQuery: { + query: "shopify-cart", + context: "cart web component" + } }, - [THEME_APIs.LIQUID]: { - name: THEME_APIs.LIQUID, + liquid: { displayName: "Liquid", description: "Liquid is an open-source templating language created by Shopify. It is the backbone of Shopify themes and is used to load dynamic content on storefronts. Keywords: liquid, theme, shopify-theme, liquid-component, liquid-block, liquid-section, liquid-snippet, liquid-schemas, shopify-theme-schemas", category: APICategory.THEME, @@ -389,15 +325,39 @@ var SHOPIFY_APIS2 = { context: "product metafield access in a theme" } }, - [CONFIGURATION_APIs.CUSTOM_DATA]: { - name: CONFIGURATION_APIs.CUSTOM_DATA, + "custom-data": { displayName: "Custom Data", description: "MUST be used first when prompts mention Metafields or Metaobjects. Use Metafields and Metaobjects to model and store custom data for your app. Metafields extend built-in Shopify data types like products or customers, Metaobjects are custom data types that can be used to store bespoke data structures. Metafield and Metaobject definitions provide a schema and configuration for values to follow.", category: APICategory.CONFIGURATION, visibility: Visibility.PUBLIC, searchable: false + }, + "app-store-review": { + displayName: "App Store Review", + description: "Run a pre-submission compliance check against your Shopify app's codebase. Reviews App Store requirements and surfaces likely issues before you submit for official review.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-dev": { + displayName: "Developer Onboarding", + description: "Get started building on Shopify. Use when a developer asks to build an app, build a theme, create a dev store, set up a partner account, scaffold a project, or get started developing for Shopify. NOT for merchants managing stores.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-merchant": { + displayName: "Merchant Onboarding", + description: "Set up and connect a Shopify store from your AI assistant. Use when the user wants to: set up my Shopify store, connect my store, install Shopify plugin, get started with Shopify, manage my store, add products to my store, merchant onboarding, start selling online, Shopify setup help, create my first store, how do I set up an online store, shopify.com/SKILL.md, import products, migrate from Square, migrate from WooCommerce, migrate from Etsy, migrate from Amazon, migrate from eBay, migrate from Wix, import from Google Merchant Center, migrate from Clover, migrate from Lightspeed, move products to Shopify, import catalog, replatform to Shopify. This is for store owners \u2014 not developers.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor", + frontmatterExtras: { context: "fork" } } -}; +}); // src/validation/formatCode.ts function generateMissingImports(packageNames, extensionTarget) { @@ -494,7 +454,7 @@ function createVirtualTSEnvironment(apiName) { const fileVersions = /* @__PURE__ */ new Map(); const virtualFiles = /* @__PURE__ */ new Map(); const packageRoot = getPackageRoot(); - const jsxImportSource = apiName == SHOPIFY_APIS.HYDROGEN ? "react" : "preact"; + const jsxImportSource = apiName === "hydrogen" ? "react" : "preact"; const servicesHost = createLanguageServiceHost( { fileVersions, virtualFiles }, packageRoot, @@ -1588,10 +1548,10 @@ async function tryResolvePath(candidates) { // src/validation/validateComponentCodeBlock.ts var ENFORCE_SHOPIFY_ONLY_COMPONENTS_APIS = [ - TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS, - TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS, - TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS, - TYPESCRIPT_APIs.POS_UI + "polaris-admin-extensions", + "polaris-checkout-extensions", + "polaris-customer-account-extensions", + "pos-ui" ]; async function validateComponentCodeBlock(input) { try { @@ -1602,12 +1562,12 @@ async function validateComponentCodeBlock(input) { resultDetail: "Validation failed: Invalid input: code is required" }; } - if (Object.keys(SHOPIFY_APIS2).filter( - (api) => SHOPIFY_APIS2[api].extensionSurfaceName + if (Object.keys(SHOPIFY_APIS).filter( + (api) => SHOPIFY_APIS[api].extensionSurfaceName ).includes(apiName) && !extensionTarget) { return { result: "failed" /* FAILED */, - resultDetail: `Extension target is required for API: ${apiName}. Use the learn_shopify_ui_extensions tool to get the list of available extension targets.` + resultDetail: `Extension target is required for API: ${apiName}. Look up the list of available extension targets in the API documentation.` }; } const apiMapping = getAPIMapping(apiName); @@ -1658,7 +1618,7 @@ function getAPIMapping(apiName) { if (!apiName) { throw new Error(`Invalid input: apiName is required`); } - const apiEntry = Object.values(SHOPIFY_APIS2).find( + const apiEntry = Object.values(SHOPIFY_APIS).find( (api) => api.name === apiName ); if (!apiEntry) { @@ -1689,7 +1649,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -1703,7 +1663,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-pos-ui", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-storefront-graphql/SKILL.md b/skills/shopify-storefront-graphql/SKILL.md index b504049..b162d1b 100644 --- a/skills/shopify-storefront-graphql/SKILL.md +++ b/skills/shopify-storefront-graphql/SKILL.md @@ -4,7 +4,7 @@ description: "Use for custom storefronts requiring direct GraphQL queries/mutati compatibility: Requires Node.js metadata: author: Shopify - version: "1.1.0" + version: "1.6.0" --- ## Required Tool Calls (do not skip) diff --git a/skills/shopify-storefront-graphql/scripts/search_docs.mjs b/skills/shopify-storefront-graphql/scripts/search_docs.mjs index 6ebf8f4..285c647 100755 --- a/skills/shopify-storefront-graphql/scripts/search_docs.mjs +++ b/skills/shopify-storefront-graphql/scripts/search_docs.mjs @@ -22,7 +22,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -36,7 +36,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-storefront-graphql", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-storefront-graphql/scripts/validate.mjs b/skills/shopify-storefront-graphql/scripts/validate.mjs index b96436c..fff084b 100755 --- a/skills/shopify-storefront-graphql/scripts/validate.mjs +++ b/skills/shopify-storefront-graphql/scripts/validate.mjs @@ -17311,61 +17311,6 @@ import { readFileSync } from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; -// src/types/api-constants.ts -var GRAPHQL_APIs = { - ADMIN: "admin", - STOREFRONT: "storefront-graphql", - PARTNER: "partner", - CUSTOMER: "customer", - PAYMENTS_APPS: "payments-apps" -}; -var FUNCTION_GRAPHQL_SCHEMAS = { - FUNCTIONS_CART_CHECKOUT_VALIDATION: "functions_cart_checkout_validation", - FUNCTIONS_CART_TRANSFORM: "functions_cart_transform", - FUNCTIONS_DELIVERY_CUSTOMIZATION: "functions_delivery_customization", - FUNCTIONS_DISCOUNT: "functions_discount", - FUNCTIONS_DISCOUNTS_ALLOCATOR: "functions_discounts_allocator", - FUNCTIONS_FULFILLMENT_CONSTRAINTS: "functions_fulfillment_constraints", - FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR: "functions_local_pickup_delivery_option_generator", - FUNCTIONS_ORDER_DISCOUNTS: "functions_order_discounts", - FUNCTIONS_ORDER_ROUTING_LOCATION_RULE: "functions_order_routing_location_rule", - FUNCTIONS_PAYMENT_CUSTOMIZATION: "functions_payment_customization", - FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR: "functions_pickup_point_delivery_option_generator", - FUNCTIONS_PRODUCT_DISCOUNTS: "functions_product_discounts", - FUNCTIONS_SHIPPING_DISCOUNTS: "functions_shipping_discounts" -}; -var FUNCTIONS_APIs = { - FUNCTIONS: "functions" - // Main Functions API without GraphQL schema -}; -var TYPESCRIPT_APIs = { - POLARIS_APP_HOME: "polaris-app-home", - POLARIS_ADMIN_EXTENSIONS: "polaris-admin-extensions", - POLARIS_CHECKOUT_EXTENSIONS: "polaris-checkout-extensions", - POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS: "polaris-customer-account-extensions", - POS_UI: "pos-ui", - HYDROGEN: "hydrogen", - STOREFRONT_WEB_COMPONENTS: "storefront-web-components" -}; -var THEME_APIs = { - LIQUID: "liquid" -}; -var CONFIGURATION_APIs = { - CUSTOM_DATA: "custom-data" -}; -var EXECUTION_APIs = { - USE_SHOPIFY_CLI: "use-shopify-cli" -}; -var SHOPIFY_APIS = { - ...GRAPHQL_APIs, - ...FUNCTIONS_APIs, - ...TYPESCRIPT_APIs, - ...THEME_APIs, - ...FUNCTION_GRAPHQL_SCHEMAS, - ...CONFIGURATION_APIs, - ...EXECUTION_APIs -}; - // src/types/api-types.ts var Visibility = { PUBLIC: "public", @@ -17380,23 +17325,28 @@ var APICategory = { UI_FRAMEWORK: "ui-framework", THEME: "theme", CONFIGURATION: "configuration", - EXECUTION: "execution" + EXECUTION: "execution", + GUIDANCE: "guidance" + // Procedural topics (onboarding, review checklists) — hand-maintained, no validation/search }; // src/types/api-mapping.ts -var SHOPIFY_APIS2 = { - [EXECUTION_APIs.USE_SHOPIFY_CLI]: { - name: EXECUTION_APIs.USE_SHOPIFY_CLI, +function defineApis(apis) { + return Object.fromEntries( + Object.entries(apis).map(([name, config]) => [name, { name, ...config }]) + ); +} +var SHOPIFY_APIS = defineApis({ + "use-shopify-cli": { displayName: "Use Shopify CLI", - description: "Choose before `admin` when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`) with **`shopify app config validate --json`** (not Admin GraphQL; MCP has no TOML validator); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", + description: "Choose when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate configuration before deploy; run an existing query via CLI; list products; missing `shopify store execute`.", category: APICategory.EXECUTION, visibility: Visibility.PUBLIC, searchable: false }, - [GRAPHQL_APIs.ADMIN]: { - name: GRAPHQL_APIs.ADMIN, + admin: { displayName: "Admin API", - description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config files** (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`), pre-deploy config errors, or invalid TOML\u2014use **`use-shopify-cli`** and **`shopify app config validate --json`** (no TOML validator here). Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", + description: "Write or explain **Admin GraphQL** queries and mutations for apps and integrations that extend the Shopify admin. Use when the user wants to **understand, design, or generate** the operation itself\u2014even before deciding how to run it. Do **not** choose `admin` first for **app or extension config validation** \u2014use **`use-shopify-cli`**. Do **not** choose `admin` first to **execute** Admin GraphQL **now via Shopify CLI** or for CLI setup/troubleshooting on store workflows\u2014use **`use-shopify-cli`** (store auth/execute, handle/SKU/location lookups, inventory changes).", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "admin" }, @@ -17406,10 +17356,9 @@ var SHOPIFY_APIS2 = { context: "creating a product" } }, - [GRAPHQL_APIs.STOREFRONT]: { - name: GRAPHQL_APIs.STOREFRONT, + "storefront-graphql": { displayName: "Storefront GraphQL API", - description: `Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use ${TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS} instead.`, + description: "Use for custom storefronts requiring direct GraphQL queries/mutations for data fetching and cart operations. Choose this when you need full control over data fetching and rendering your own UI. NOT for Web Components - if the prompt mentions HTML tags like , , use storefront-web-components instead.", category: APICategory.GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "storefront" }, @@ -17419,8 +17368,7 @@ var SHOPIFY_APIS2 = { context: "storefront search" } }, - [GRAPHQL_APIs.PARTNER]: { - name: GRAPHQL_APIs.PARTNER, + partner: { displayName: "Partner API", description: "The Partner API lets you programmatically access data about your Partner Dashboard, including your apps, themes, and affiliate referrals.", category: APICategory.GRAPHQL, @@ -17432,8 +17380,7 @@ var SHOPIFY_APIS2 = { context: "app install data" } }, - [GRAPHQL_APIs.CUSTOMER]: { - name: GRAPHQL_APIs.CUSTOMER, + customer: { displayName: "Customer Account API", description: "The Customer Account API allows customers to access their own data including orders, payment methods, and addresses.", category: APICategory.GRAPHQL, @@ -17445,8 +17392,7 @@ var SHOPIFY_APIS2 = { context: "customer order history" } }, - [GRAPHQL_APIs.PAYMENTS_APPS]: { - name: GRAPHQL_APIs.PAYMENTS_APPS, + "payments-apps": { displayName: "Payments Apps API", description: "The Payments Apps API enables payment providers to integrate their payment solutions with Shopify's checkout.", category: APICategory.GRAPHQL, @@ -17458,8 +17404,7 @@ var SHOPIFY_APIS2 = { context: "pending a payment session" } }, - [FUNCTIONS_APIs.FUNCTIONS]: { - name: FUNCTIONS_APIs.FUNCTIONS, + functions: { displayName: "Shopify Functions", description: "Shopify Functions allow developers to customize the backend logic that powers parts of Shopify. Available APIs: Discount, Cart and Checkout Validation, Cart Transform, Pickup Point Delivery Option Generator, Delivery Customization, Fulfillment Constraints, Local Pickup Delivery Option Generator, Order Routing Location Rule, Payment Customization", category: APICategory.FUNCTIONS, @@ -17471,8 +17416,7 @@ var SHOPIFY_APIS2 = { } }, // Function-specific GraphQL APIs for input query validation - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_CHECKOUT_VALIDATION, + functions_cart_checkout_validation: { displayName: "Cart Checkout Validation Function", description: "GraphQL schema for Cart and Checkout Validation Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17481,16 +17425,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_cart_checkout_validation_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_CART_TRANSFORM, + functions_cart_transform: { displayName: "Cart Transform Function", description: "GraphQL schema for Cart Transform Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_cart_transform_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DELIVERY_CUSTOMIZATION, + functions_delivery_customization: { displayName: "Delivery Customization Function", description: "GraphQL schema for Delivery Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17499,24 +17441,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_delivery_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNT, + functions_discount: { displayName: "Discount Function", description: "GraphQL schema for Discount Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discount_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_DISCOUNTS_ALLOCATOR, + functions_discounts_allocator: { displayName: "Discounts Allocator Function", description: "GraphQL schema for Discounts Allocator Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_discounts_allocator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_FULFILLMENT_CONSTRAINTS, + functions_fulfillment_constraints: { displayName: "Fulfillment Constraints Function", description: "GraphQL schema for Fulfillment Constraints Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17525,8 +17464,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_fulfillment_constraints_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_LOCAL_PICKUP_DELIVERY_OPTION_GENERATOR, + functions_local_pickup_delivery_option_generator: { displayName: "Local Pickup Delivery Option Generator Function", description: "GraphQL schema for Local Pickup Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17535,16 +17473,14 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_local_pickup_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_DISCOUNTS, + functions_order_discounts: { displayName: "Order Discounts Function", description: "GraphQL schema for Order Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_order_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_ORDER_ROUTING_LOCATION_RULE, + functions_order_routing_location_rule: { displayName: "Order Routing Location Rule Function", description: "GraphQL schema for Order Routing Location Rule Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17553,8 +17489,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_order_routing_location_rule_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PAYMENT_CUSTOMIZATION, + functions_payment_customization: { displayName: "Payment Customization Function", description: "GraphQL schema for Payment Customization Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17563,8 +17498,7 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_payment_customization_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PICKUP_POINT_DELIVERY_OPTION_GENERATOR, + functions_pickup_point_delivery_option_generator: { displayName: "Pickup Point Delivery Option Generator Function", description: "GraphQL schema for Pickup Point Delivery Option Generator Function input queries", category: APICategory.FUNCTION_GRAPHQL, @@ -17573,24 +17507,21 @@ var SHOPIFY_APIS2 = { shopifyDevPrefix: "functions_pickup_point_delivery_option_generator_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_PRODUCT_DISCOUNTS, + functions_product_discounts: { displayName: "Product Discounts Function", description: "GraphQL schema for Product Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_product_discounts_schema" } }, - [FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS]: { - name: FUNCTION_GRAPHQL_SCHEMAS.FUNCTIONS_SHIPPING_DISCOUNTS, + functions_shipping_discounts: { displayName: "Shipping Discounts Function", description: "GraphQL schema for Shipping Discounts Function input queries", category: APICategory.FUNCTION_GRAPHQL, visibility: Visibility.PUBLIC, schemaSource: { shopifyDevPrefix: "functions_shipping_discounts_schema" } }, - [TYPESCRIPT_APIs.POLARIS_APP_HOME]: { - name: TYPESCRIPT_APIs.POLARIS_APP_HOME, + "polaris-app-home": { displayName: "Polaris App Home", description: "Build your app's primary user interface embedded in the Shopify admin. If the prompt just mentions `Polaris` and you can't tell based off of the context what API they meant, assume they meant this API.", category: APICategory.UI_FRAMEWORK, @@ -17602,13 +17533,14 @@ var SHOPIFY_APIS2 = { context: "form in app home" } }, - [TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_ADMIN_EXTENSIONS, + "polaris-admin-extensions": { displayName: "Polaris Admin Extensions", description: `Add custom actions and blocks from your app at contextually relevant spots throughout the Shopify Admin. Admin UI Extensions also supports scaffolding new adminextensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "admin", + extensionTypeName: "Admin Extensions", + extensionSearchContext: "admin UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17616,13 +17548,14 @@ var SHOPIFY_APIS2 = { context: "text input in an admin extension" } }, - [TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CHECKOUT_EXTENSIONS, + "polaris-checkout-extensions": { displayName: "Polaris Checkout Extensions", description: `Build custom functionality that merchants can install at defined points in the checkout flow, including product information, shipping, payment, order summary, and Shop Pay. Checkout UI Extensions also supports scaffolding new checkout extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "checkout", + extensionTypeName: "Checkout Extensions", + extensionSearchContext: "checkout UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17630,13 +17563,14 @@ var SHOPIFY_APIS2 = { context: "checkout button" } }, - [TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS]: { - name: TYPESCRIPT_APIs.POLARIS_CUSTOMER_ACCOUNT_EXTENSIONS, + "polaris-customer-account-extensions": { displayName: "Polaris Customer Account Extensions", description: `Build custom functionality that merchants can install at defined points on the Order index, Order status, and Profile pages in customer accounts. Customer Account UI Extensions also supports scaffolding new customer account extensions using Shopify CLI commands.`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "customer-account", + extensionTypeName: "Customer Account Extensions", + extensionSearchContext: "customer account UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17644,13 +17578,14 @@ var SHOPIFY_APIS2 = { context: "customer account card" } }, - [TYPESCRIPT_APIs.POS_UI]: { - name: TYPESCRIPT_APIs.POS_UI, + "pos-ui": { displayName: "POS UI", description: `Build retail point-of-sale applications using Shopify's POS UI components. These components provide a consistent and familiar interface for POS applications. POS UI Extensions also supports scaffolding new POS extensions using Shopify CLI commands. Keywords: POS, Retail, smart grid`, category: APICategory.UI_FRAMEWORK, publicPackages: ["@shopify/ui-extensions"], extensionSurfaceName: "point-of-sale", + extensionTypeName: "POS UI Extensions", + extensionSearchContext: "POS UI extensions", visibility: Visibility.PUBLIC, validation: true, exampleVectorStoreQuery: { @@ -17658,8 +17593,7 @@ var SHOPIFY_APIS2 = { context: "POS screen layout" } }, - [TYPESCRIPT_APIs.HYDROGEN]: { - name: TYPESCRIPT_APIs.HYDROGEN, + hydrogen: { displayName: "Hydrogen", description: "Hydrogen storefront implementation cookbooks. Some of the available recipes are: B2B Commerce, Bundles, Combined Listings, Custom Cart Method, Dynamic Content with Metaobjects, Express Server, Google Tag Manager Integration, Infinite Scroll, Legacy Customer Account Flow, Markets, Partytown + Google Tag Manager, Subscriptions, Third-party API Queries and Caching. MANDATORY: Use this API for ANY Hydrogen storefront question - do NOT use Storefront GraphQL when 'Hydrogen' is mentioned.", category: APICategory.UI_FRAMEWORK, @@ -17671,8 +17605,7 @@ var SHOPIFY_APIS2 = { context: "cart UI" } }, - [TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS]: { - name: TYPESCRIPT_APIs.STOREFRONT_WEB_COMPONENTS, + "storefront-web-components": { displayName: "Storefront Web Components", description: "HTML-first web components for building storefronts WITHOUT GraphQL. Choose when prompts mention: Web Components, HTML tags (, , , , ), native , 'HTML-only', 'without JavaScript', or 'no GraphQL'. Components handle data fetching and state internally.", category: APICategory.UI_FRAMEWORK, @@ -17681,10 +17614,13 @@ var SHOPIFY_APIS2 = { // Docs has and not a npm package publicPackages: ["@shopify/polaris-types", "@shopify/app-bridge-types"], visibility: Visibility.EARLY_ACCESS, - validation: true + validation: true, + exampleVectorStoreQuery: { + query: "shopify-cart", + context: "cart web component" + } }, - [THEME_APIs.LIQUID]: { - name: THEME_APIs.LIQUID, + liquid: { displayName: "Liquid", description: "Liquid is an open-source templating language created by Shopify. It is the backbone of Shopify themes and is used to load dynamic content on storefronts. Keywords: liquid, theme, shopify-theme, liquid-component, liquid-block, liquid-section, liquid-snippet, liquid-schemas, shopify-theme-schemas", category: APICategory.THEME, @@ -17696,15 +17632,39 @@ var SHOPIFY_APIS2 = { context: "product metafield access in a theme" } }, - [CONFIGURATION_APIs.CUSTOM_DATA]: { - name: CONFIGURATION_APIs.CUSTOM_DATA, + "custom-data": { displayName: "Custom Data", description: "MUST be used first when prompts mention Metafields or Metaobjects. Use Metafields and Metaobjects to model and store custom data for your app. Metafields extend built-in Shopify data types like products or customers, Metaobjects are custom data types that can be used to store bespoke data structures. Metafield and Metaobject definitions provide a schema and configuration for values to follow.", category: APICategory.CONFIGURATION, visibility: Visibility.PUBLIC, searchable: false + }, + "app-store-review": { + displayName: "App Store Review", + description: "Run a pre-submission compliance check against your Shopify app's codebase. Reviews App Store requirements and surfaces likely issues before you submit for official review.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-dev": { + displayName: "Developer Onboarding", + description: "Get started building on Shopify. Use when a developer asks to build an app, build a theme, create a dev store, set up a partner account, scaffold a project, or get started developing for Shopify. NOT for merchants managing stores.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor" + }, + "onboarding-merchant": { + displayName: "Merchant Onboarding", + description: "Set up and connect a Shopify store from your AI assistant. Use when the user wants to: set up my Shopify store, connect my store, install Shopify plugin, get started with Shopify, manage my store, add products to my store, merchant onboarding, start selling online, Shopify setup help, create my first store, how do I set up an online store, shopify.com/SKILL.md, import products, migrate from Square, migrate from WooCommerce, migrate from Etsy, migrate from Amazon, migrate from eBay, migrate from Wix, import from Google Merchant Center, migrate from Clover, migrate from Lightspeed, move products to Shopify, import catalog, replatform to Shopify. This is for store owners \u2014 not developers.", + category: APICategory.GUIDANCE, + visibility: Visibility.PUBLIC, + searchable: false, + compatibility: "Claude Code, Claude Desktop, Cursor", + frontmatterExtras: { context: "fork" } } -}; +}); // src/schemaOperations/loadAPISchemas.ts function getDataDirectory() { @@ -17724,6 +17684,22 @@ function getDataDirectory() { return path.resolve(currentDir, "../data"); } var dataDir = getDataDirectory(); +function configuredSchemaPath(api) { + const apiConfig = SHOPIFY_APIS[api]; + if (apiConfig?.gqlSchemaPath) return apiConfig.gqlSchemaPath; + if (apiConfig?.gqlSchemaFileName) { + return path.join(dataDir, apiConfig.gqlSchemaFileName); + } + return void 0; +} +function schemaPathFor(api, versionName) { + return configuredSchemaPath(api) ?? path.join(dataDir, `${api}_${versionName}.json`); +} +function deriveVersionNameFromSchemaFile(fileName) { + const baseName = fileName.replace(/\.json(?:\.gz)?$/, ""); + const versionSeparatorIndex = baseName.lastIndexOf("_"); + return versionSeparatorIndex === -1 ? "latest" : baseName.slice(versionSeparatorIndex + 1); +} function loadAPISchemas(apis, schemaOptions) { if (apis.length === 0) { throw new Error("No APIs provided"); @@ -17738,7 +17714,7 @@ function loadAPISchemas(apis, schemaOptions) { { ...schemaOptions, api: apis[0], - schemaPath: schemaOptions.schemaPath ?? SHOPIFY_APIS2[apis[0]]?.gqlSchemaPath ?? path.join(dataDir, `${apis[0]}_${schemaOptions.name}.json`) + schemaPath: schemaOptions.schemaPath ?? schemaPathFor(apis[0], schemaOptions.name) } ]; } @@ -17753,15 +17729,18 @@ function loadAPISchemas(apis, schemaOptions) { const versionsWithApi = versions.map((v) => ({ ...v, api, - schemaPath: SHOPIFY_APIS2[api]?.gqlSchemaPath ?? path.join(dataDir, `${api}_${v.name}.json`) + schemaPath: schemaPathFor(api, v.name) })); apiVersions.push(...versionsWithApi); - } else if (SHOPIFY_APIS2[api]?.gqlSchemaPath) { + } else { + const apiConfig = SHOPIFY_APIS[api]; + const configuredPath = configuredSchemaPath(api); + if (!configuredPath) continue; apiVersions.push({ - name: "latest", + name: apiConfig?.gqlSchemaFileName ? deriveVersionNameFromSchemaFile(apiConfig.gqlSchemaFileName) : "latest", latestVersion: true, api, - schemaPath: SHOPIFY_APIS2[api].gqlSchemaPath + schemaPath: configuredPath }); } } @@ -18186,7 +18165,7 @@ async function reportValidation(toolName, result, context) { Accept: "application/json", "Cache-Control": "no-cache", "X-Shopify-Surface": "skills", - "X-Shopify-MCP-Version": "1.1.0", + "X-Shopify-MCP-Version": "1.6.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -18200,7 +18179,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-storefront-graphql", - skillVersion: "1.1.0", + skillVersion: "1.6.0", ...remainingContext }, result diff --git a/skills/shopify-use-shopify-cli/SKILL.md b/skills/shopify-use-shopify-cli/SKILL.md index c8e3d4f..6bdb4aa 100644 --- a/skills/shopify-use-shopify-cli/SKILL.md +++ b/skills/shopify-use-shopify-cli/SKILL.md @@ -1,10 +1,10 @@ --- name: shopify-use-shopify-cli -description: "Choose before `admin` when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`) with **`shopify app config validate --json`** (not Admin GraphQL; MCP has no TOML validator); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate before deploy; run an existing query via CLI; list products; missing `shopify store execute`." +description: "Choose when the user needs **Shopify CLI** to run or fix something now: validate app or extension config on disk (`shopify.app.toml`, `shopify.app..toml`, `shopify.extension.toml`); run or troubleshoot store workflows (`shopify store auth`, `shopify store execute`); inventory or product changes by handle, SKU, or location name; or CLI setup, auth, upgrade issues. Emphasize **commands and operational steps**, not only authoring GraphQL. Skip for API-only understanding or codegen with no CLI execution. Examples: validate configuration before deploy; run an existing query via CLI; list products; missing `shopify store execute`." compatibility: Requires Node.js metadata: author: Shopify - version: "1.1.0" + version: "1.6.0" --- You are an assistant that helps Shopify developers use Shopify CLI. @@ -73,7 +73,6 @@ This workflow does **not** use `validate_graphql_codeblocks`; that tool validate - Do not run GraphQL validation for this task. - Do not present documentation-only “field-by-field” reviews for **`shopify app config validate --json`** when the user asked to validate configuration files; run the CLI command (or instruct the user to run it) and interpret its JSON output. -- Do not add 2>&1 to the command. All the required information is already in the stdout output. - Do not run the command with npx or pnpx, just run shopify directly. Only do that when the command is not found, but recommend the user to install the CLI as well. ## Store execution contract