diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 1629aa7..bd37149 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.1", "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..1f9da58 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.1", "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..c744e54 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.1", "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..e22e3c3 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.1", "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..02bf2c0 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.1", "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..4044173 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,13 @@ +# shopify-plugin + +## 1.2.1 + +### Patch Changes + +- aab0a72: `shopify-app-store-review` skill now points the agent at the canonical shopify.dev requirements page (https://shopify.dev/docs/apps/launch/app-store-review/app-store-ai-self-review-requirements) instead of carrying a hand-maintained inline copy, and adds 5.x category-specific requirements. Output format and status taxonomy are unchanged. (Retroactive changeset for #722, which merged without one.) + +## 1.2.0 + +### Minor Changes + +- d7608c7: Changeset to force a new release diff --git a/gemini-extension.json b/gemini-extension.json index 67de67b..afe5710 100644 --- a/gemini-extension.json +++ b/gemini-extension.json @@ -1,4 +1,4 @@ { "name": "shopify-plugin", - "version": "1.1.0" + "version": "1.2.1" } diff --git a/package.json b/package.json index ecd0388..d5ade78 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "shopify-plugin", - "version": "1.1.0", + "version": "1.2.1", "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..2b8a818 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.1", "author": { "name": "Shopify" }, "license": "MIT", "keywords": [ diff --git a/skills/shopify-admin/SKILL.md b/skills/shopify-admin/SKILL.md index 77efcb6..4c2f49c 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.8.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..f11f35b 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.8.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.8.0", ...remainingContext }, result diff --git a/skills/shopify-admin/scripts/validate.mjs b/skills/shopify-admin/scripts/validate.mjs index 99f8ab9..886b595 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, 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", maintainer: "Shopify" } } -}; +}); // 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.8.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.8.0", ...remainingContext }, result diff --git a/skills/shopify-app-store-review/SKILL.md b/skills/shopify-app-store-review/SKILL.md index 3c56d1f..bef200e 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.8.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..07784d4 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.8.0" --- diff --git a/skills/shopify-customer/SKILL.md b/skills/shopify-customer/SKILL.md index 9f684b7..45db81b 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.8.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..1efcb43 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.8.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.8.0", ...remainingContext }, result diff --git a/skills/shopify-customer/scripts/validate.mjs b/skills/shopify-customer/scripts/validate.mjs index c0311d8..f838e35 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, 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", maintainer: "Shopify" } } -}; +}); // 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.8.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.8.0", ...remainingContext }, result diff --git a/skills/shopify-dev/SKILL.md b/skills/shopify-dev/SKILL.md index e54debe..ec6ac51 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.8.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..946e028 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.8.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..99a701a 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.8.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.8.0", ...remainingContext }, result diff --git a/skills/shopify-functions/scripts/validate.mjs b/skills/shopify-functions/scripts/validate.mjs index 7a3c87f..7eef42b 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, 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", maintainer: "Shopify" } } -}; +}); // 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.8.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.8.0", ...remainingContext }, result diff --git a/skills/shopify-hydrogen/SKILL.md b/skills/shopify-hydrogen/SKILL.md index 4e878f3..91b9b16 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.8.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..cb86ea0 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.8.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.8.0", ...remainingContext }, result diff --git a/skills/shopify-hydrogen/scripts/validate.mjs b/skills/shopify-hydrogen/scripts/validate.mjs index 7e670ea..8ca9b3e 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, 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", maintainer: "Shopify" } } -}; +}); // 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, @@ -942,6 +902,27 @@ function extractLocallyDefinedComponents(sourceFile) { ts2.forEachChild(sourceFile, visitNode); return locallyDefinedComponents; } +function hyphenatedToCamelCase(str) { + return str.replace(/-([a-z])/g, (_, char) => char.toUpperCase()); +} +function checkHyphenatedAttributes(node) { + if (!ts2.isJsxOpeningElement(node) && !ts2.isJsxSelfClosingElement(node)) { + return []; + } + const errors = []; + for (const attr of node.attributes.properties) { + if (!ts2.isJsxAttribute(attr)) continue; + const attrName = ts2.isIdentifier(attr.name) ? attr.name.text : attr.name.getText(); + if (!attrName.includes("-")) continue; + if (attrName.startsWith("aria-") || attrName.startsWith("data-")) continue; + const camelCase = hyphenatedToCamelCase(attrName); + errors.push({ + property: attrName, + message: `Property '${attrName}' uses a hyphenated name which is not a valid Polaris prop. Use camelCase '${camelCase}' instead.` + }); + } + return errors; +} function extractComponentValidations(originalCode, diagnostics, shopifyWebComponents, options = {}) { const { enforceShopifyOnlyComponents = false } = options; const validations = []; @@ -956,7 +937,7 @@ function extractComponentValidations(originalCode, diagnostics, shopifyWebCompon const elements = extractJSXElements(sourceFile); const userImportedComponents = enforceShopifyOnlyComponents ? extractUserImportedComponents(sourceFile) : /* @__PURE__ */ new Set(); const locallyDefinedComponents = enforceShopifyOnlyComponents ? extractLocallyDefinedComponents(sourceFile) : /* @__PURE__ */ new Set(); - for (const { tagName: componentName, start, end } of elements) { + for (const { tagName: componentName, node, start, end } of elements) { const nonShopifyComponentValidationResult = handleNonShopifyComponent( componentName, shopifyWebComponents, @@ -970,6 +951,8 @@ function extractComponentValidations(originalCode, diagnostics, shopifyWebCompon } const { errors, handledDiagnostics: componentHandledDiagnostics } = getComponentErrors(start, end, diagnostics); componentHandledDiagnostics.forEach((d) => handledDiagnostics.add(d)); + const hyphenatedErrors = checkHyphenatedAttributes(node); + errors.push(...hyphenatedErrors); validations.push({ componentName, valid: errors.length === 0, @@ -1588,10 +1571,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 +1585,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 +1641,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 +1672,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.8.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -1703,7 +1686,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-hydrogen", - skillVersion: "1.1.0", + skillVersion: "1.8.0", ...remainingContext }, result diff --git a/skills/shopify-liquid/SKILL.md b/skills/shopify-liquid/SKILL.md index 89606e7..0277320 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.8.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..5862bd1 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.8.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.8.0", ...remainingContext }, result diff --git a/skills/shopify-liquid/scripts/validate.mjs b/skills/shopify-liquid/scripts/validate.mjs index 55e2496..51f6633 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.8.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.8.0", ...remainingContext }, result diff --git a/skills/shopify-onboarding-dev/SKILL.md b/skills/shopify-onboarding-dev/SKILL.md index 6ecbfe3..d6801f5 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.8.0" --- ## Flow diff --git a/skills/shopify-onboarding-merchant/SKILL.md b/skills/shopify-onboarding-merchant/SKILL.md index 3d6bf37..76fa66a 100644 --- a/skills/shopify-onboarding-merchant/SKILL.md +++ b/skills/shopify-onboarding-merchant/SKILL.md @@ -1,18 +1,540 @@ --- name: shopify-onboarding-merchant -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 — not developers." +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, 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 — not developers." compatibility: Claude Code, Claude Desktop, Cursor context: fork +maintainer: Shopify metadata: author: Shopify - version: "1.1.0" + version: "1.8.0" --- -Fetch the full skill instructions from https://www.shopify.com/SKILL.md and -follow them step by step. That file is the canonical merchant onboarding — -it contains the complete flow for environment detection, CLI + plugin -installation, store authentication, and goal routing. Execute its -instructions exactly as written. +Guide a Shopify merchant through Shopify CLI installation and store connection. -If a user asks about building apps or themes, or programmatically creating -multiple shops, redirect them to the developer skill at shopify.dev/skill.md. +**Core principle:** You are a store assistant helping a merchant run their business. Assume no technical knowledge. When uncertain, ask — don't guess. Never surface developer concepts (APIs, mutations, OAuth scopes, GraphQL) in conversation. + +--- + +## Step 1 — Detect the OS + +Look for `darwin` (macOS), `linux`, or `win`/`windows` in system context. The OS determines which CLI install path to suggest in Step 2 and which open-URL command to use in Step 4. + +--- + +## Step 2 — Install the Shopify CLI + +Run `shopify version` to check whether the CLI is already installed. If it succeeds, continue to Step 3. + +If not found, install: + +``` +npm install -g @shopify/cli@latest +``` + +If npm is unavailable, use Homebrew (macOS only): + +``` +brew tap shopify/shopify && brew install shopify-cli +``` + +If neither npm nor Homebrew is available, tell the user: + +"You'll need Node.js installed first. Download it from https://nodejs.org +(the LTS version), then come back and we'll continue setup." + +Stop and wait for them to confirm Node.js is installed before retrying. + +Verify with `shopify version` before continuing. The auth flow +requires CLI 3.93.0+. If older, upgrade with the npm command above. + +--- + +## Step 3 — Post-install + +Confirm what was installed in one sentence, then ask: + +"What would you like to do? + +1. **Create a new store** — start a free Shopify trial, no credit card needed +2. **Connect an existing store** — link your Shopify store so I can manage it for you" + +Wait for the user to respond before continuing. + +--- + +## Step 4 — Route by goal + +### Option 1 — Create a new store + +Open the free-trial signup page using the OS-appropriate command +based on the OS detected in Step 1: + +``` +# macOS +open https://www.shopify.com/free-trial?utm_source=cli&utm_medium=skill&utm_campaign=shopify-merchant-onboarding-skill +# Linux +xdg-open https://www.shopify.com/free-trial?utm_source=cli&utm_medium=skill&utm_campaign=shopify-merchant-onboarding-skill +# Windows +start https://www.shopify.com/free-trial?utm_source=cli&utm_medium=skill&utm_campaign=shopify-merchant-onboarding-skill +``` + +"I've opened the Shopify signup page — no credit card needed. + +Here's what to do: + +1. Create an account and complete signup. +2. Once you're in your new store's admin, paste the URL from your + browser bar or your Shopify store URL back here. + +Either format works: + +- `https://admin.shopify.com/store/your-handle` +- `your-handle.myshopify.com`" + +When the merchant returns with their store URL, extract the store +handle and proceed to **Authenticate with the store** below. + +### Option 2 — Connect an existing store + +Ask for the store URL if not already known — either +`https://admin.shopify.com/store/your-handle` or +`your-handle.myshopify.com`. Then proceed to **Authenticate with +the store** below. + +--- + +## Authenticate with the store + +When the merchant provides their store URL, run the auth command +directly — do not ask them to run it in a separate terminal. + +### Parse the store URL + +The merchant may provide their store in any of these formats: + +| Input format | Extract handle | +| ---------------------------------------------- | -------------- | +| `https://admin.shopify.com/store/{handle}` | path segment | +| `https://admin.shopify.com/store/{handle}/...` | path segment | +| `{handle}.myshopify.com` | subdomain | +| `https://{handle}.myshopify.com` | subdomain | +| `https://{handle}.myshopify.com/admin` | subdomain | + +Normalize to `{handle}.myshopify.com` for the `--store` flag. Strip +trailing slashes and any path after the handle. + +If the merchant provides a custom domain (e.g. `shop.mybrand.com`) +instead of one of the recognized formats above, ask them for their +`.myshopify.com` URL or admin URL (found in **Settings > Domains** in +their Shopify admin). + +### Scopes + +Use the default scopes in the table below for every store connection. + +| Group | Scopes | +| ---------------------------- | ----------------------------------------------------------------------------- | +| Products & catalog | `read_products,write_products` | +| Inventory, locations & files | `read_inventory,write_inventory,read_locations,read_files,write_files` | +| Orders & fulfillment | `read_orders,write_orders,read_fulfillments,write_fulfillments` | +| Customers | `read_customers,write_customers` | +| Discounts & draft orders | `read_discounts,write_discounts,read_draft_orders,write_draft_orders` | +| Theme, content & pages | `read_themes,write_themes,read_content,write_content,read_online_store_pages` | +| Reports | `read_reports` | + +Do not add `read_all_orders` unless you have confirmed this flow supports +it — it often requires separate Shopify approval beyond the consent screen. + +### Run the auth command + +Execute the command directly: + +``` +shopify store auth --store {handle}.myshopify.com --scopes {scopes} +``` + +This command opens an interactive browser session for OAuth — the CLI +starts a local callback server and blocks until the merchant completes +the consent flow. Immediately after starting the command, tell the +merchant: + +"A browser window is opening — you'll be asked to accept the +**Shopify CLI Connector App** permissions. Click **Install** to +continue. I'll wait here until it's done." + +Do not proceed or take other actions until the command exits. + +### On success (exit code 0) + +Display the connection banner in a fenced code block, followed by the +menu as a blockquote (substituting the actual store handle): + +``` +┌───────────────────────────────────────┐ +│ Connected to {handle}.myshopify.com │ +└───────────────────────────────────────┘ +``` + +Here's what I can help you with: + +1. Add or manage products +2. Check or update inventory +3. View and manage orders +4. Browse customer info +5. Create discounts or draft orders +6. Customize your store's look +7. View sales reports +8. Import products from another platform + +What would you like to do? + +Wait for the merchant to pick an option before continuing. + +When the merchant picks an option, respond with examples: + +**Option 1 — Add or manage products:** + +"I can help you add products. Try: + +- _'Add a product called Summer Tee, $29.99, with sizes S/M/L'_ +- _'Add 2 sample products in the Home & Garden category'_" + +**Options 2–7:** Follow the same pattern — one sentence of context, +then 2 example prompts the merchant can try. Match the tone and +specificity of Option 1. + +**Option 8 — Import products from another platform:** + +"I can help you move your products from another platform to Shopify. Try: + +- _'I want to move my products from Square to Shopify'_ +- _'Import my WooCommerce catalog'_ +- _'I have a CSV export from Etsy'_" + +### On failure (non-zero exit code) + +Show the error output from the command and offer to retry. + +If auth fails with "Command store auth not found", upgrade the CLI: + +``` +npm install -g @shopify/cli@latest +``` + +Then retry the auth command. + +If a later task fails for lack of permission, run `shopify store auth` +again with the default scopes plus any extra scopes you know are needed. + +--- + +## Import products from another platform + +When the merchant wants to migrate their product catalog from another +commerce platform, walk them through the export → validate → import +flow. + +**Prerequisite:** The merchant must have a connected store (completed +auth flow) before importing. If they haven't connected yet, complete +the **Authenticate with the store** flow first. + +### Supported platforms + +| Platform | Notes | +| ---------------------- | ----------------------------------------------- | +| Square | Archived and per-unit pricing items skipped | +| WooCommerce | External/affiliate products skipped | +| Etsy | — | +| Wix | — | +| Amazon | Orphaned variants skipped | +| eBay | Auction listings skipped | +| Clover | Hidden items and variable pricing items skipped | +| Lightspeed R-Series | — | +| Lightspeed X-Series | — | +| Google Merchant Center | — | + +If the merchant names a platform not in this list, tell them: + +"I don't have a built-in importer for that platform yet. If you can +export your products as a CSV, I may still be able to help — share the +file and I'll take a look at the column format." + +### Identify the source platform + +Ask: "Which platform are you moving from?" if not already stated. + +Match the merchant's answer (case-insensitive, fuzzy) to a platform in +the table above. If ambiguous (e.g., "Lightspeed"), ask whether they +use R-Series or X-Series. + +### Guide the CSV export + +Fetch the platform guide for detailed column mappings, variant +grouping rules, and platform-specific edge cases. Give the merchant +the export navigation path. Frame it conversationally. + +| Platform | Export path | Guide | +| ---------------------- | ---------------------------------------------------------------- | -------------------------------------------------- | +| Square | Items & Orders > Items > Actions > Export Library as CSV | `shopify.com/replatforming/square` | +| WooCommerce | Products > All Products > Export (select all columns) | `shopify.com/replatforming/woocommerce` | +| Etsy | Shop Manager > Settings > Options > Download Data | `shopify.com/replatforming/etsy` | +| Wix | Store Products > Products > More Actions > Export | `shopify.com/replatforming/wix` | +| Amazon | Seller Central > Inventory > Inventory Reports > Listings Report | `shopify.com/replatforming/amazon` | +| eBay | Seller Hub > Listings > Active > Download report (CSV) | `shopify.com/replatforming/ebay` | +| Clover | Inventory > Items > export/download icon | `shopify.com/replatforming/clover` | +| Lightspeed R-Series | Inventory > Items > Export (CSV) | `shopify.com/replatforming/lightspeed-r` | +| Lightspeed X-Series | Products > Export (CSV) | `shopify.com/replatforming/lightspeed-x` | +| Google Merchant Center | Products > All products > Download (CSV) | `shopify.com/replatforming/google-merchant-center` | + +Tell the merchant to share the CSV file once downloaded. + +### Validate the CSV + +Once the merchant provides the CSV, fetch the platform-specific validation +guide and follow the steps to validate the CSV yourself. Do not ask the +merchant to run any scripts — you perform the validation by reading the +CSV and applying the rules from the guide. + +| Platform | Validation guide | +| ---------------------- | ----------------------------------------------------------- | +| Square | `shopify.com/replatforming/square-validate` | +| WooCommerce | `shopify.com/replatforming/woocommerce-validate` | +| Etsy | `shopify.com/replatforming/etsy-validate` | +| Wix | `shopify.com/replatforming/wix-validate` | +| Amazon | `shopify.com/replatforming/amazon-validate` | +| eBay | `shopify.com/replatforming/ebay-validate` | +| Clover | `shopify.com/replatforming/clover-validate` | +| Lightspeed R-Series | `shopify.com/replatforming/lightspeed-r-validate` | +| Lightspeed X-Series | `shopify.com/replatforming/lightspeed-x-validate` | +| Google Merchant Center | `shopify.com/replatforming/google-merchant-center-validate` | + +Fetch the validation guide, then read the merchant's CSV and apply each +step. Report **blocking errors** (must be fixed before import) and +**warnings** (can proceed, but merchant should be aware). + +Common blocking errors: + +- Missing required columns (e.g., no price column) +- Unrecognized platform format +- More than 3 option types per product +- More than 100 variants per product + +Common warnings: + +- Products that will be skipped (archived, auction listings, etc.) +- Missing optional fields (images, descriptions) +- Price or inventory data that needs attention + +### Validation constraints + +| Constraint | Limit | +| ----------------------------- | -------------------------------------- | +| Variants per product | 100 | +| Options per product | 3 (e.g., Size, Color, Material) | +| Tags per product | 250, each ≤ 255 characters | +| Product title | ≤ 255 characters | +| SEO description | ≤ 320 characters | +| Images | Must be publicly accessible HTTPS URLs | +| Digital/downloadable products | Cannot be imported | +| Auction listings (eBay) | Cannot be imported | +| Archived/hidden products | Skipped | + +For the 3-option-type limit specifically, ask: + +"This product has {N} option types but Shopify supports 3. Which 3 +matter most?" + +Wait for the merchant to choose before continuing. + +### Preview the import + +Before executing mutations, show the merchant a summary of what will happen: + +"Here's what I found in your export: + +- **{N} products** ({M} variants) ready to import +- **{S} products skipped** — {reason} +- **{W} warnings** — {summary} + +All products will be imported as **Draft** so they won't appear on +your live storefront until you're ready. + +Shall I go ahead and import them?" + +Wait for confirmation before proceeding. + +### Execute the import + +For each product, construct a `productSet` mutation using the column +mappings from the platform guide and execute it via `shopify store execute`: + +Write the variables JSON to a temporary file to avoid shell-escaping +issues with merchant data (titles containing apostrophes, quotes, etc.): + +``` +echo '{"input": { ... }}' > /tmp/product_input.json +shopify store execute --store {handle}.myshopify.com --allow-mutations \ + --query 'mutation productSet($input: ProductSetInput!) { productSet(input: $input) { product { id title variants(first: 100) { nodes { sku inventoryItem { id } } } } userErrors { message field } } }' \ + --variables "$(cat /tmp/product_input.json)" +``` + +**Important:** Never inline merchant data directly in shell arguments. +Always write the JSON to a file first, then read it back. Merchant +fields (titles, descriptions, SKUs) routinely contain characters that +break shell quoting. + +Build the `ProductSetInput` by mapping CSV columns to Shopify fields +using the platform guide from `shopify.com/replatforming/{platform}`. +Always set `status: "DRAFT"` so products don't go live immediately. + +**Single-variant products** must include an explicit Default Title option: + +```json +{ + "productOptions": [ + { "name": "Title", "values": [{ "name": "Default Title" }] } + ], + "variants": [ + { + "optionValues": [{ "optionName": "Title", "name": "Default Title" }], + "sku": "...", + "price": "..." + } + ] +} +``` + +**Multi-variant products** use the option names from the platform guide +(e.g. Color, Size). Each variant needs matching `optionValues`. + +Save the `inventoryItem.id` from each variant in the response — you +need these for the inventory step. Do not make a second query. + +After each batch of 10 products, give a progress update: + +"Imported {N}/{total} products so far…" + +### Report results + +When complete, show a summary: + +"Done! Here's what happened: + +- ✅ **{N} products imported** ({M} variants) +- ⏭️ **{S} products skipped** — {reasons} +- ❌ **{E} errors** — {details, if any} +- 📦 **{Q} inventory quantities set** + +All imported products are in **Draft** status. When you're ready to +make them live, go to **Products** in your Shopify admin, select the +ones you want, and change their status to **Active**." + +If there were errors, offer to retry the failed products. + +Always end with a **manual actions needed** summary listing anything +the merchant must do themselves: + +- Products imported at $0.00 that need pricing (e.g. eBay missing prices) +- Variants that need per-variant pricing (e.g. Etsy exports only lowest price) +- Inventory that wasn't set (Etsy, Wix, GMC — see Set inventory section) +- Images that failed or weren't imported +- Tax configuration (e.g. Clover tax rates not importable) +- Platform-specific features that didn't map (e.g. Clover modifier groups) + +Frame it as a checklist: + +"**Before going live, you'll want to:** + +1. Set prices on {products} (imported at $0) +2. Set inventory for {N} variants (platform didn't include quantities) +3. Upload product images +4. Review and activate products at {admin URL}/products" + +### Set inventory + +After products are created, set inventory quantities using +`inventorySetOnHandQuantities` via `shopify store execute`. + +First, list the store's locations and ask the merchant which one to use: + +``` +shopify store execute --store {handle}.myshopify.com \ + --query '{ locations(first: 10, includeLegacy: false) { nodes { id name isActive address { formatted } } } }' +``` + +If there is only one active location, use it automatically. If there +are multiple, show the list and ask the merchant to pick one. Do not +assume `first: 1` is the default — connection order is not guaranteed. + +Then set quantities using the `inventoryItem.id` values saved from +the `productSet` responses: + +``` +shopify store execute --store {handle}.myshopify.com --allow-mutations \ + --query 'mutation inv($input: InventorySetOnHandQuantitiesInput!) { inventorySetOnHandQuantities(input: $input) @idempotent(key: "{unique-key}") { inventoryAdjustmentGroup { reason } userErrors { message } } }' \ + --variables '{"input": {"reason": "correction", "setQuantities": [{"inventoryItemId": "gid://shopify/InventoryItem/...", "locationId": "gid://shopify/Location/...", "quantity": 25, "changeFromQuantity": 0}]}}' +``` + +Key details: + +- The `@idempotent(key: "...")` directive is **required** on the + mutation field. Use a unique key per call (e.g. `import-batch-1`). +- `changeFromQuantity: 0` is required for newly created products. +- You can batch multiple items in one call via the `setQuantities` array. + +**Skip inventory for platforms that don't export quantities:** + +- **Etsy** — only exports a total across all variants, not per-variant +- **Wix** — export typically doesn't include stock counts +- **Google Merchant Center** — feeds have `availability` but not exact + quantities. Use the availability signal: set quantity to `0` for + `out_of_stock` items and leave tracked inventory enabled for + `in_stock` items (so the merchant can enter actual counts). Warn the + merchant that exact stock levels must be entered manually. + +For Etsy and Wix, warn the merchant that inventory must be set +manually in their Shopify admin. + +### Known limitations + +| Limitation | Detail | +| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Catalog size | Individual mutations work for ~50 products. Larger catalogs may be slow. | +| Image URLs | Source platform URLs that are temporary or require authentication may not resolve. If images fail, tell the merchant and offer to skip images or retry. | +| Locations | Uses the store's default location only. Multi-location stores may need manual adjustment after import. | +| Customer import | Not supported yet — only product catalogs. | + +--- + +## Behavioral rules + +- Proceed directly to the correct installation path — don't present choices +- Before running an install command, state in one short sentence what's about to be installed and why (e.g., "Installing the Shopify CLI so I can connect to your store."). Don't pause for confirmation — the merchant has already opted in by invoking this skill — but never run installs invisibly +- Never construct or modify install commands — only use commands defined in this file +- If an install fails, report the exact error and stop +- Always wait for the user's goal selection in Step 3 before proceeding to Step 4 +- When creating sample or placeholder products, always set their status to **Draft** so + they don't appear on the live storefront +- If the merchant provides a concrete request (e.g. "Add a product called Summer Tee, $29.99, + with sizes S/M/L"), skip menus and example prompts — execute the request directly using the + Shopify CLI. Menus and examples are only for when the merchant picks a general category + or is unsure what to do next +- If a user asks about building apps or themes, or programmatically creating multiple shops, redirect them to the developer skill at shopify.dev/skill.md +- After successful setup, confirm what was installed and connected in one sentence + (e.g., "You're all set — Shopify CLI installed and connected to yourstore.myshopify.com") +- If the merchant asks what they can do, what you can help with, or any variation of + "what are my options?", respond based on whether a store is connected: + + **Store connected:** + + Respond with the same 8-option menu shown in the **On success** section above. + + **No store connected yet:** + + Respond with the 2-option menu (Create a new store / Connect an existing store), + then mention that once connected you can help with products, orders, themes, + discounts, importing from another platform, and more. + +- For requests outside options 1–8 (e.g., shipping, taxes, payments), attempt them + using `shopify store execute` with the appropriate GraphQL query. If unsure of the + right query, say so and suggest the merchant check their Shopify admin directly. diff --git a/skills/shopify-partner/SKILL.md b/skills/shopify-partner/SKILL.md index 4c01c1d..debb4c5 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.8.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..d6bd4c5 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.8.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.8.0", ...remainingContext }, result diff --git a/skills/shopify-partner/scripts/validate.mjs b/skills/shopify-partner/scripts/validate.mjs index 209b2ed..e371045 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, 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", maintainer: "Shopify" } } -}; +}); // 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.8.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.8.0", ...remainingContext }, result diff --git a/skills/shopify-payments-apps/SKILL.md b/skills/shopify-payments-apps/SKILL.md index 8490118..b9247e9 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.8.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..72e01c4 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.8.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.8.0", ...remainingContext }, result diff --git a/skills/shopify-payments-apps/scripts/validate.mjs b/skills/shopify-payments-apps/scripts/validate.mjs index 9b55fe3..1036d2f 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, 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", maintainer: "Shopify" } } -}; +}); // 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.8.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.8.0", ...remainingContext }, result diff --git a/skills/shopify-polaris-admin-extensions/SKILL.md b/skills/shopify-polaris-admin-extensions/SKILL.md index daca568..379c141 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.8.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..60c8c1a 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.8.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.8.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..a20febd 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, 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", maintainer: "Shopify" } } -}; +}); // 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, @@ -942,6 +902,27 @@ function extractLocallyDefinedComponents(sourceFile) { ts2.forEachChild(sourceFile, visitNode); return locallyDefinedComponents; } +function hyphenatedToCamelCase(str) { + return str.replace(/-([a-z])/g, (_, char) => char.toUpperCase()); +} +function checkHyphenatedAttributes(node) { + if (!ts2.isJsxOpeningElement(node) && !ts2.isJsxSelfClosingElement(node)) { + return []; + } + const errors = []; + for (const attr of node.attributes.properties) { + if (!ts2.isJsxAttribute(attr)) continue; + const attrName = ts2.isIdentifier(attr.name) ? attr.name.text : attr.name.getText(); + if (!attrName.includes("-")) continue; + if (attrName.startsWith("aria-") || attrName.startsWith("data-")) continue; + const camelCase = hyphenatedToCamelCase(attrName); + errors.push({ + property: attrName, + message: `Property '${attrName}' uses a hyphenated name which is not a valid Polaris prop. Use camelCase '${camelCase}' instead.` + }); + } + return errors; +} function extractComponentValidations(originalCode, diagnostics, shopifyWebComponents, options = {}) { const { enforceShopifyOnlyComponents = false } = options; const validations = []; @@ -956,7 +937,7 @@ function extractComponentValidations(originalCode, diagnostics, shopifyWebCompon const elements = extractJSXElements(sourceFile); const userImportedComponents = enforceShopifyOnlyComponents ? extractUserImportedComponents(sourceFile) : /* @__PURE__ */ new Set(); const locallyDefinedComponents = enforceShopifyOnlyComponents ? extractLocallyDefinedComponents(sourceFile) : /* @__PURE__ */ new Set(); - for (const { tagName: componentName, start, end } of elements) { + for (const { tagName: componentName, node, start, end } of elements) { const nonShopifyComponentValidationResult = handleNonShopifyComponent( componentName, shopifyWebComponents, @@ -970,6 +951,8 @@ function extractComponentValidations(originalCode, diagnostics, shopifyWebCompon } const { errors, handledDiagnostics: componentHandledDiagnostics } = getComponentErrors(start, end, diagnostics); componentHandledDiagnostics.forEach((d) => handledDiagnostics.add(d)); + const hyphenatedErrors = checkHyphenatedAttributes(node); + errors.push(...hyphenatedErrors); validations.push({ componentName, valid: errors.length === 0, @@ -1588,10 +1571,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 +1585,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 +1641,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 +1672,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.8.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -1703,7 +1686,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-polaris-admin-extensions", - skillVersion: "1.1.0", + skillVersion: "1.8.0", ...remainingContext }, result diff --git a/skills/shopify-polaris-app-home/SKILL.md b/skills/shopify-polaris-app-home/SKILL.md index 875d610..df712bf 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.8.0" --- ## Required Tool Calls (do not skip) @@ -47,7 +47,7 @@ Components available for Polaris App Home. These examples have all the props available for the component. Some example values for these props are provided. Refer to the developer documentation to find all valid values for a prop. Ensure the component is available for the target you are using. -```html +```tsx Fulfilled Message content -Content Cancel -Category +Category Option 1Option 2Click area -Active -Col 1Col 2 Section Title @@ -121,13 +121,13 @@ Refer to the developer documentation to find all valid values for a prop. Ensure Link text - - +Edit FirstSecond -Content -Popover content -Content +Content Section contentAB - - +Item 1Item 2 NameNamePrice -Hover for info Item A`, ``, `` -- **String keyword attributes** (`padding`, `gap`, `direction`, `tone`, `variant`, `size`, `background`, `align-items`, `inline-size`) must be string values — never shorthand or `{true}`: +- **String keyword attributes** (`padding`, `gap`, `direction`, `tone`, `variant`, `size`, `background`, `alignItems`, `inlineSize`) must be string values — never shorthand or `{true}`: - ✅ ``, ``, `` - ❌ ``, `` — boolean shorthand on string props fails TypeScript --- 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..7e18553 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.8.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.8.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..0bde7d4 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, 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", maintainer: "Shopify" } } -}; +}); // 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, @@ -942,6 +902,27 @@ function extractLocallyDefinedComponents(sourceFile) { ts2.forEachChild(sourceFile, visitNode); return locallyDefinedComponents; } +function hyphenatedToCamelCase(str) { + return str.replace(/-([a-z])/g, (_, char) => char.toUpperCase()); +} +function checkHyphenatedAttributes(node) { + if (!ts2.isJsxOpeningElement(node) && !ts2.isJsxSelfClosingElement(node)) { + return []; + } + const errors = []; + for (const attr of node.attributes.properties) { + if (!ts2.isJsxAttribute(attr)) continue; + const attrName = ts2.isIdentifier(attr.name) ? attr.name.text : attr.name.getText(); + if (!attrName.includes("-")) continue; + if (attrName.startsWith("aria-") || attrName.startsWith("data-")) continue; + const camelCase = hyphenatedToCamelCase(attrName); + errors.push({ + property: attrName, + message: `Property '${attrName}' uses a hyphenated name which is not a valid Polaris prop. Use camelCase '${camelCase}' instead.` + }); + } + return errors; +} function extractComponentValidations(originalCode, diagnostics, shopifyWebComponents, options = {}) { const { enforceShopifyOnlyComponents = false } = options; const validations = []; @@ -956,7 +937,7 @@ function extractComponentValidations(originalCode, diagnostics, shopifyWebCompon const elements = extractJSXElements(sourceFile); const userImportedComponents = enforceShopifyOnlyComponents ? extractUserImportedComponents(sourceFile) : /* @__PURE__ */ new Set(); const locallyDefinedComponents = enforceShopifyOnlyComponents ? extractLocallyDefinedComponents(sourceFile) : /* @__PURE__ */ new Set(); - for (const { tagName: componentName, start, end } of elements) { + for (const { tagName: componentName, node, start, end } of elements) { const nonShopifyComponentValidationResult = handleNonShopifyComponent( componentName, shopifyWebComponents, @@ -970,6 +951,8 @@ function extractComponentValidations(originalCode, diagnostics, shopifyWebCompon } const { errors, handledDiagnostics: componentHandledDiagnostics } = getComponentErrors(start, end, diagnostics); componentHandledDiagnostics.forEach((d) => handledDiagnostics.add(d)); + const hyphenatedErrors = checkHyphenatedAttributes(node); + errors.push(...hyphenatedErrors); validations.push({ componentName, valid: errors.length === 0, @@ -1588,10 +1571,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 +1585,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 +1641,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 +1672,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.8.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -1703,7 +1686,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-polaris-app-home", - skillVersion: "1.1.0", + skillVersion: "1.8.0", ...remainingContext }, result diff --git a/skills/shopify-polaris-checkout-extensions/SKILL.md b/skills/shopify-polaris-checkout-extensions/SKILL.md index 1b85c65..3ca9a12 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.8.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..b4945ac 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.8.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.8.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..989e1f2 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, 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", maintainer: "Shopify" } } -}; +}); // 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, @@ -942,6 +902,27 @@ function extractLocallyDefinedComponents(sourceFile) { ts2.forEachChild(sourceFile, visitNode); return locallyDefinedComponents; } +function hyphenatedToCamelCase(str) { + return str.replace(/-([a-z])/g, (_, char) => char.toUpperCase()); +} +function checkHyphenatedAttributes(node) { + if (!ts2.isJsxOpeningElement(node) && !ts2.isJsxSelfClosingElement(node)) { + return []; + } + const errors = []; + for (const attr of node.attributes.properties) { + if (!ts2.isJsxAttribute(attr)) continue; + const attrName = ts2.isIdentifier(attr.name) ? attr.name.text : attr.name.getText(); + if (!attrName.includes("-")) continue; + if (attrName.startsWith("aria-") || attrName.startsWith("data-")) continue; + const camelCase = hyphenatedToCamelCase(attrName); + errors.push({ + property: attrName, + message: `Property '${attrName}' uses a hyphenated name which is not a valid Polaris prop. Use camelCase '${camelCase}' instead.` + }); + } + return errors; +} function extractComponentValidations(originalCode, diagnostics, shopifyWebComponents, options = {}) { const { enforceShopifyOnlyComponents = false } = options; const validations = []; @@ -956,7 +937,7 @@ function extractComponentValidations(originalCode, diagnostics, shopifyWebCompon const elements = extractJSXElements(sourceFile); const userImportedComponents = enforceShopifyOnlyComponents ? extractUserImportedComponents(sourceFile) : /* @__PURE__ */ new Set(); const locallyDefinedComponents = enforceShopifyOnlyComponents ? extractLocallyDefinedComponents(sourceFile) : /* @__PURE__ */ new Set(); - for (const { tagName: componentName, start, end } of elements) { + for (const { tagName: componentName, node, start, end } of elements) { const nonShopifyComponentValidationResult = handleNonShopifyComponent( componentName, shopifyWebComponents, @@ -970,6 +951,8 @@ function extractComponentValidations(originalCode, diagnostics, shopifyWebCompon } const { errors, handledDiagnostics: componentHandledDiagnostics } = getComponentErrors(start, end, diagnostics); componentHandledDiagnostics.forEach((d) => handledDiagnostics.add(d)); + const hyphenatedErrors = checkHyphenatedAttributes(node); + errors.push(...hyphenatedErrors); validations.push({ componentName, valid: errors.length === 0, @@ -1588,10 +1571,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 +1585,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 +1641,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 +1672,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.8.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -1703,7 +1686,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-polaris-checkout-extensions", - skillVersion: "1.1.0", + skillVersion: "1.8.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..8d894bc 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.8.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..f3beb21 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.8.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.8.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..8702590 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, 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", maintainer: "Shopify" } } -}; +}); // 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, @@ -942,6 +902,27 @@ function extractLocallyDefinedComponents(sourceFile) { ts2.forEachChild(sourceFile, visitNode); return locallyDefinedComponents; } +function hyphenatedToCamelCase(str) { + return str.replace(/-([a-z])/g, (_, char) => char.toUpperCase()); +} +function checkHyphenatedAttributes(node) { + if (!ts2.isJsxOpeningElement(node) && !ts2.isJsxSelfClosingElement(node)) { + return []; + } + const errors = []; + for (const attr of node.attributes.properties) { + if (!ts2.isJsxAttribute(attr)) continue; + const attrName = ts2.isIdentifier(attr.name) ? attr.name.text : attr.name.getText(); + if (!attrName.includes("-")) continue; + if (attrName.startsWith("aria-") || attrName.startsWith("data-")) continue; + const camelCase = hyphenatedToCamelCase(attrName); + errors.push({ + property: attrName, + message: `Property '${attrName}' uses a hyphenated name which is not a valid Polaris prop. Use camelCase '${camelCase}' instead.` + }); + } + return errors; +} function extractComponentValidations(originalCode, diagnostics, shopifyWebComponents, options = {}) { const { enforceShopifyOnlyComponents = false } = options; const validations = []; @@ -956,7 +937,7 @@ function extractComponentValidations(originalCode, diagnostics, shopifyWebCompon const elements = extractJSXElements(sourceFile); const userImportedComponents = enforceShopifyOnlyComponents ? extractUserImportedComponents(sourceFile) : /* @__PURE__ */ new Set(); const locallyDefinedComponents = enforceShopifyOnlyComponents ? extractLocallyDefinedComponents(sourceFile) : /* @__PURE__ */ new Set(); - for (const { tagName: componentName, start, end } of elements) { + for (const { tagName: componentName, node, start, end } of elements) { const nonShopifyComponentValidationResult = handleNonShopifyComponent( componentName, shopifyWebComponents, @@ -970,6 +951,8 @@ function extractComponentValidations(originalCode, diagnostics, shopifyWebCompon } const { errors, handledDiagnostics: componentHandledDiagnostics } = getComponentErrors(start, end, diagnostics); componentHandledDiagnostics.forEach((d) => handledDiagnostics.add(d)); + const hyphenatedErrors = checkHyphenatedAttributes(node); + errors.push(...hyphenatedErrors); validations.push({ componentName, valid: errors.length === 0, @@ -1588,10 +1571,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 +1585,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 +1641,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 +1672,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.8.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -1703,7 +1686,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-polaris-customer-account-extensions", - skillVersion: "1.1.0", + skillVersion: "1.8.0", ...remainingContext }, result diff --git a/skills/shopify-pos-ui/SKILL.md b/skills/shopify-pos-ui/SKILL.md index f67d056..54ab6ed 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.8.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..d70358d 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.8.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.8.0", ...remainingContext }, result diff --git a/skills/shopify-pos-ui/scripts/validate.mjs b/skills/shopify-pos-ui/scripts/validate.mjs index 434f969..070f8db 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, 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", maintainer: "Shopify" } } -}; +}); // 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, @@ -942,6 +902,27 @@ function extractLocallyDefinedComponents(sourceFile) { ts2.forEachChild(sourceFile, visitNode); return locallyDefinedComponents; } +function hyphenatedToCamelCase(str) { + return str.replace(/-([a-z])/g, (_, char) => char.toUpperCase()); +} +function checkHyphenatedAttributes(node) { + if (!ts2.isJsxOpeningElement(node) && !ts2.isJsxSelfClosingElement(node)) { + return []; + } + const errors = []; + for (const attr of node.attributes.properties) { + if (!ts2.isJsxAttribute(attr)) continue; + const attrName = ts2.isIdentifier(attr.name) ? attr.name.text : attr.name.getText(); + if (!attrName.includes("-")) continue; + if (attrName.startsWith("aria-") || attrName.startsWith("data-")) continue; + const camelCase = hyphenatedToCamelCase(attrName); + errors.push({ + property: attrName, + message: `Property '${attrName}' uses a hyphenated name which is not a valid Polaris prop. Use camelCase '${camelCase}' instead.` + }); + } + return errors; +} function extractComponentValidations(originalCode, diagnostics, shopifyWebComponents, options = {}) { const { enforceShopifyOnlyComponents = false } = options; const validations = []; @@ -956,7 +937,7 @@ function extractComponentValidations(originalCode, diagnostics, shopifyWebCompon const elements = extractJSXElements(sourceFile); const userImportedComponents = enforceShopifyOnlyComponents ? extractUserImportedComponents(sourceFile) : /* @__PURE__ */ new Set(); const locallyDefinedComponents = enforceShopifyOnlyComponents ? extractLocallyDefinedComponents(sourceFile) : /* @__PURE__ */ new Set(); - for (const { tagName: componentName, start, end } of elements) { + for (const { tagName: componentName, node, start, end } of elements) { const nonShopifyComponentValidationResult = handleNonShopifyComponent( componentName, shopifyWebComponents, @@ -970,6 +951,8 @@ function extractComponentValidations(originalCode, diagnostics, shopifyWebCompon } const { errors, handledDiagnostics: componentHandledDiagnostics } = getComponentErrors(start, end, diagnostics); componentHandledDiagnostics.forEach((d) => handledDiagnostics.add(d)); + const hyphenatedErrors = checkHyphenatedAttributes(node); + errors.push(...hyphenatedErrors); validations.push({ componentName, valid: errors.length === 0, @@ -1588,10 +1571,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 +1585,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 +1641,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 +1672,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.8.0", "X-Shopify-Timestamp": (/* @__PURE__ */ new Date()).toISOString() }; if (clientName) headers["X-Shopify-Client-Name"] = String(clientName); @@ -1703,7 +1686,7 @@ async function reportValidation(toolName, result, context) { tool: toolName, parameters: { skill: "shopify-pos-ui", - skillVersion: "1.1.0", + skillVersion: "1.8.0", ...remainingContext }, result diff --git a/skills/shopify-storefront-graphql/SKILL.md b/skills/shopify-storefront-graphql/SKILL.md index b504049..74e305c 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.8.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..548cdba 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.8.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.8.0", ...remainingContext }, result diff --git a/skills/shopify-storefront-graphql/scripts/validate.mjs b/skills/shopify-storefront-graphql/scripts/validate.mjs index b96436c..47528aa 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, 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", maintainer: "Shopify" } } -}; +}); // 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.8.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.8.0", ...remainingContext }, result diff --git a/skills/shopify-use-shopify-cli/SKILL.md b/skills/shopify-use-shopify-cli/SKILL.md index c8e3d4f..fef050d 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.8.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