#!/usr/bin/env node var _e=Object.defineProperty;var r=(t,e)=>_e(t,"name",{value:e,configurable:!0});var d=["flow","use-shopify-cli","admin","shopifyql","storefront-graphql","partner","customer","payments-apps","functions","polaris-app-home","polaris-admin-extensions","polaris-checkout-extensions","polaris-customer-account-extensions","pos-ui","hydrogen","liquid","custom-data","app-pricing","app-store-review","onboarding-dev","onboarding-merchant"];var u=["admin","shopifyql","storefront-graphql","partner","customer","payments-apps","functions","polaris-app-home","polaris-admin-extensions","polaris-checkout-extensions","polaris-customer-account-extensions","pos-ui","hydrogen","liquid"];var l=["use-shopify-cli","custom-data","app-store-review","onboarding-dev","onboarding-merchant"];var m=["flow","app-pricing"];import{parseArgs as je}from"util";import{isIP as ve}from"node:net";var Oe="https://shopify.dev/",Ie="https://shopify-dev.shop.dev/";function B(t){return`https://shopify-dev-staging${t}.shopifycloud.com/`}r(B,"stagingHost");var w="SHOPIFY_DEV_SUPPORT_CORE_MCP_DOMAIN",R="SHOPIFY_DEV_LOCAL_SERVER_URL",ye="Shopify-Dev-Support-Core-Mcp-Domain",j=["shopify.com","shopify.io","shop.dev"];function Re(t,e=w){let n=t.trim().toLowerCase();if(!n)throw new Error(`${e} must not be empty.`);let s=n.split(".");if(!(n.length<=253&&s.every(a=>a.length<=63&&/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/.test(a))))throw new Error(`${e} must be a bare hostname (no scheme, port, path, or query); got: "${t}"`);if(!j.some(a=>n===a||n.endsWith(`.${a}`)))throw new Error(`${e} must end with ${j.join(", ")}; got: "${t}"`);return n}r(Re,"normalizeSupportCoreDomain");function K(t=process.env){let e=t[w]?.trim();return e?{[ye]:Re(e)}:{}}r(K,"supportCoreDomainHeaders");function Ae(t){let e;try{e=new URL(t)}catch{throw new Error(`${R} must identify a local Shopify.dev origin`)}let n=e.hostname==="localhost"||e.hostname==="[::1]"||ve(e.hostname)===4&&e.hostname.startsWith("127."),s=/^shopify-dev-[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.shop\.dev$/u.test(e.hostname);if(!n&&!s||n&&!e.port||s&&e.protocol!=="https:"||n&&e.protocol!=="http:"&&e.protocol!=="https:"||e.username||e.password||e.pathname!==""&&e.pathname!=="/"||e.search||e.hash)throw new Error(`${R} must identify a local Shopify.dev origin`);return`${e.origin}/`}r(Ae,"normalizeLocalShopifyDevUrl");function O(t){let e=t?.env??process.env,n=e.SHOPIFY_DEV_STAGING_SERVER_NUMBER?.trim(),s=e[R]?.trim();if(s&&t?.allowLocalServer){if(n||e.DEV&&e.DEV!=="false"||e[w]?.trim())throw new Error(`${R} cannot be combined with staging, DEV, or Support Core routing overrides`);return{url:Ae(s),headers:{}}}if(n){if(!/^\d+$/.test(n))throw new Error(`SHOPIFY_DEV_STAGING_SERVER_NUMBER must be a positive integer; got: "${n}"`);let o=Number(n);if(!Number.isSafeInteger(o)||o<=0)throw new Error(`SHOPIFY_DEV_STAGING_SERVER_NUMBER must be a positive integer; got: "${n}"`);let a=e.MINERVA_TOKEN;if(!a){let p=B(o).replace(/\/$/,"");throw new Error(`SHOPIFY_DEV_STAGING_SERVER_NUMBER=${o} is set but no Minerva token is available. Staging servers are behind Minerva. Get a token via: export MINERVA_TOKEN=$(devx minerva-auth --client-id 0oa1bphetnkOusboI0x8 --audience ${p})`)}return{url:B(o),headers:{Cookie:`MINERVA_TOKEN=${a}`}}}let i=e.SHOPIFY_DEV_INSTRUMENTATION_URL?.trim();return i&&t?.uri?.startsWith("/mcp/usage")?{url:i,headers:{}}:e.DEV&&e.DEV!=="false"?{url:Ie,headers:{}}:{url:Oe,headers:{}}}r(O,"resolveShopifyDevBaseUrl");async function A(t,e){let n,s={};if(t.startsWith("http://")||t.startsWith("https://"))n=new URL(t);else{let o=O({uri:t,allowLocalServer:e?.allowLocalServer});n=new URL(t,o.url),s=o.headers}e?.parameters&&Object.entries(e.parameters).forEach(([o,a])=>{n.searchParams.append(o,a)});let i=await fetch(n.toString(),{method:e?.method||"GET",...e?.redirect&&{redirect:e.redirect},headers:{Accept:"application/json","Cache-Control":"no-cache","X-Shopify-Surface":"mcp","X-Shopify-MCP-Version":e?.instrumentation?.packageVersion||"","X-Shopify-Timestamp":e?.instrumentation?.timestamp||"",...s,...e?.headers},...e?.body&&{body:e.body}});if(!i.ok){let o;try{o=await i.text()}catch{}throw new Error(o?`HTTP ${i.status}: ${o}`:`HTTP error! status: ${i.status}`)}return await i.text()}r(A,"shopifyDevFetch");function Y(t,e=process.env){if(!e.SHOPIFY_DEV_LOCAL_SERVER_URL?.trim())return null;if(!t)throw new Error("SHOPIFY_DEV_LOCAL_SERVER_URL requires source-built Dev MCP or private eval Skills");let{url:n}=O({env:e,uri:"/assistant/search",allowLocalServer:!0});return{baseUrl:n,fetchOptions:{allowLocalServer:!0,redirect:"error",headers:{"Shopify-Dev-Local-Search-Smoke":"1"}}}}r(Y,"resolveLocalAuthoringSearch");var G={shopifyql:[{name:"2027-01",releaseCandidate:!0},{name:"2026-10",latestVersion:!0},{name:"2026-07"},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"}],admin:[{name:"unstable"},{name:"2027-01",releaseCandidate:!0},{name:"2026-10",latestVersion:!0},{name:"2026-07"},{name:"2026-04"},{name:"2026-01"}],"storefront-graphql":[{name:"unstable"},{name:"2027-01",releaseCandidate:!0},{name:"2026-10",latestVersion:!0},{name:"2026-07"},{name:"2026-04"},{name:"2026-01"}],partner:[{name:"unstable"},{name:"2027-01",releaseCandidate:!0},{name:"2026-10",latestVersion:!0},{name:"2026-07"},{name:"2026-04"},{name:"2026-01"}],customer:[{name:"unstable"},{name:"2027-01",releaseCandidate:!0},{name:"2026-10",latestVersion:!0},{name:"2026-07"},{name:"2026-04"},{name:"2026-01"}],"payments-apps":[{name:"unstable"},{name:"2027-01",releaseCandidate:!0},{name:"2026-10",latestVersion:!0},{name:"2026-07"},{name:"2026-04"},{name:"2026-01"}],"polaris-app-home":[{name:"v2.0",latestVersion:!0},{name:"v1.1"},{name:"v1.0"}],"polaris-admin-extensions":[{name:"2026-10",latestVersion:!0},{name:"2026-07"},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"},{name:"2025-07"}],"polaris-checkout-extensions":[{name:"2026-10",latestVersion:!0},{name:"2026-07"},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"},{name:"2025-07"}],"polaris-customer-account-extensions":[{name:"2026-10",latestVersion:!0},{name:"2026-07"},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"},{name:"2025-07"}],"pos-ui":[{name:"2026-10",latestVersion:!0},{name:"2026-07"},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"},{name:"2025-07"}],hydrogen:[{name:"2026-10",latestVersion:!0},{name:"2026-04"},{name:"2026-01"},{name:"2025-10"},{name:"2025-07"}],"storefront-web-components":[],functions_cart_checkout_validation:[{name:"unstable"},{name:"2027-01",releaseCandidate:!0},{name:"2026-10",latestVersion:!0},{name:"2026-07"},{name:"2026-04"},{name:"2026-01"}],functions_cart_transform:[{name:"unstable"},{name:"2027-01",releaseCandidate:!0},{name:"2026-10",latestVersion:!0},{name:"2026-07"},{name:"2026-04"},{name:"2026-01"}],functions_delivery_customization:[{name:"unstable"},{name:"2027-01",releaseCandidate:!0},{name:"2026-10",latestVersion:!0},{name:"2026-07"},{name:"2026-04"},{name:"2026-01"}],functions_discount:[{name:"unstable"},{name:"2027-01",releaseCandidate:!0},{name:"2026-10",latestVersion:!0},{name:"2026-07"},{name:"2026-04"},{name:"2026-01"}],functions_fulfillment_constraints:[{name:"unstable"},{name:"2027-01",releaseCandidate:!0},{name:"2026-10",latestVersion:!0},{name:"2026-07"},{name:"2026-04"},{name:"2026-01"}],functions_local_pickup_delivery_option_generator:[{name:"unstable",latestVersion:!0}],functions_order_discounts:[{name:"unstable"},{name:"2027-01",releaseCandidate:!0},{name:"2026-10",latestVersion:!0},{name:"2026-07"},{name:"2026-04"},{name:"2026-01"}],functions_order_routing_location_rule:[{name:"unstable"},{name:"2027-01",releaseCandidate:!0},{name:"2026-10",latestVersion:!0},{name:"2026-07"},{name:"2026-04"},{name:"2026-01"}],functions_payment_customization:[{name:"unstable"},{name:"2027-01",releaseCandidate:!0},{name:"2026-10",latestVersion:!0},{name:"2026-07"},{name:"2026-04"},{name:"2026-01"}],functions_pickup_point_delivery_option_generator:[{name:"unstable",latestVersion:!0}],functions_product_discounts:[{name:"unstable"},{name:"2027-01",releaseCandidate:!0},{name:"2026-10",latestVersion:!0},{name:"2026-07"},{name:"2026-04"},{name:"2026-01"}],functions_shipping_discounts:[{name:"unstable"},{name:"2027-01",releaseCandidate:!0},{name:"2026-10",latestVersion:!0},{name:"2026-07"},{name:"2026-04"},{name:"2026-01"}]};var x=G,q=Object.fromEntries(Object.entries(x).filter(([t,e])=>e.length>0).map(([t,e])=>[t,e.map(n=>n.name)]));function T(t){return Object.prototype.hasOwnProperty.call(q,t)}r(T,"hasSupportedVersions");function J(t){return T(t)?q[t]:[]}r(J,"getSupportedVersions");function Le(t){let e=x[t];if(e)return e.find(n=>n.latestVersion)?.name??e[0]?.name}r(Le,"getLatestVersion");function W(t,e){if(!T(t))throw new Error(`API "${t}" is not in the supported versions catalog. Only call resolveVersion for APIs with entries in SUPPORTED_API_VERSIONS.`);let n=J(t);if(n.length===0)return{ok:!1,reason:"no_versions",supportedVersions:n};let s=Ne(t,e);if(s)return n.includes(s)?{ok:!0,version:s,source:"explicit",supportedVersions:n}:{ok:!1,reason:"unsupported_version",supportedVersions:n};let i=Le(t);return i?{ok:!0,version:i,source:"default",supportedVersions:n}:{ok:!1,reason:"no_versions",supportedVersions:n}}r(W,"resolveVersion");function Ne(t,e){if(!e||t!=="polaris-app-home")return e;let n=e.replace(/^v/,""),s=/^(\d+)$/.exec(n)?.[1];if(s){let p=x[t]?.filter(_=>!_.releaseCandidate&&new RegExp("^v?"+s+"\\.\\d+$").test(_.name)).sort((_,S)=>{let v=Number(_.name.replace(/^v/,"").split(".")[1]),P=Number(S.name.replace(/^v/,"").split(".")[1]);return v-P}).at(-1)?.name;if(p)return p}let i=n.replace(/-rc$/,""),o=[e,n,"v"+i,i],a=J(t);return o.find(p=>a.includes(p))??e}r(Ne,"normalizeRequestedVersion");function X(t){return Object.fromEntries(Object.entries(t).map(([e,n])=>{let{description:s,valueName:i,choices:o,...a}=n;return[e,a]}))}r(X,"toParseArgsOptions");var L={model:{type:"string",valueName:"name",description:"Agent model name"},"client-name":{type:"string",valueName:"name",description:"Agent client name"},"client-version":{type:"string",valueName:"version",description:"Agent client version"}},z={"user-prompt-base64":{type:"string",valueName:"base64",description:"Base64-encoded triggering prompt"},"session-id":{type:"string",valueName:"id",description:"Agent session identifier"},"tool-use-id":{type:"string",valueName:"id",description:"Agent tool-use identifier"}},It={"artifact-id":{type:"string",valueName:"id",description:"Stable artifact identifier"},revision:{type:"string",valueName:"number",description:"Positive artifact revision"},...L,...z,json:{type:"boolean",description:"Emit machine-readable JSON"}},Q={help:{type:"boolean",short:"h",description:"Show this help"}};function Z(t,e){let n=new Set([...Object.keys(L),...Object.keys(z),"artifact-id","revision"]),s=Object.entries(e).filter(([o])=>!0).map(([o,a])=>{let p=a.type==="string"?a.valueName||a.choices?.join("|")||"value":void 0,_=`--${o}${p?` <${p}>`:""}`;return[a.short?`-${a.short}, ${_}`:_,a.description]}),i=Math.max(...s.map(([o])=>o.length));return["Usage:",...t.map(o=>` ${o}`),"","Options:",...s.map(([o,a])=>` ${o.padEnd(i)} ${a}`)].join(` `)}r(Z,"formatCliHelp");function ee(){let t=[process.env.CLAUDE_SESSION_ID,process.env.CLAUDE_CODE_SESSION_ID,process.env.CURSOR_SESSION_ID,process.env.COPILOT_SESSION_ID];for(let e of t)if(typeof e=="string"&&e.length>0)return e}r(ee,"readHostSessionId");import{readFileSync as be,statSync as Ve}from"node:fs";import{homedir as Pe}from"node:os";import{join as I}from"node:path";var N="shopify-ai-toolkit",C="opt-out",De="SHOPIFY_AI_TOOLKIT_OPT_OUT_FILE",we=new Set(["false","0","no","off"]);function te(t){return{env:t?.env??process.env,platform:t?.platform??process.platform,homeDir:t&&"homeDir"in t?t.homeDir:xe(t?.env??process.env)}}r(te,"resolveContext");function xe(t){let e=t.HOME?.trim()||t.USERPROFILE?.trim();if(e)return e;try{return Pe()||void 0}catch{return}}r(xe,"resolveHomeDir");function ke(t){let{env:e,platform:n,homeDir:s}=te(t),i=[],o=e[De]?.trim();o&&i.push(o);let a=e.XDG_CONFIG_HOME?.trim();if(a&&i.push(I(a,N,C)),s&&(i.push(I(s,".config",N,C)),n==="darwin"&&i.push(I(s,"Library","Application Support",N,C))),n==="win32"){let p=e.APPDATA?.trim()||(s?I(s,"AppData","Roaming"):void 0);p&&i.push(I(p,N,C))}return[...new Set(i.filter(p=>!!p))]}r(ke,"telemetryOptOutFileCandidates");function Ue(t){if(t.OPT_OUT_INSTRUMENTATION?.trim().toLowerCase()==="true")return!0;let e=t.DO_NOT_TRACK?.trim().toLowerCase();return e==="1"||e==="true"}r(Ue,"envSaysOptOut");function $e(t){try{if(!Ve(t).isFile())return!1}catch{return!1}try{let e=be(t,"utf8").trim().toLowerCase();return!we.has(e)}catch{return!0}}r($e,"fileSaysOptOut");function ne(t){try{let e=te(t);return Ue(e.env)?!0:ke(e).some($e)}catch{return!1}}r(ne,"isTelemetryOptedOut");function re(t){return{...t?.api&&{api:t.api},...t?.api_version&&{api_version:t.api_version},...t?.resolve_api_version&&{resolve_api_version:t.resolve_api_version}}}r(re,"nonEmptyUsageMetadata");var Fe={ucp:"ucp"},Me="functions_",He="shopify-";function oe(t){if(t)return t.startsWith(Me)?"shopify-functions":Fe[t]??`${He}${t}`}r(oe,"legacySkillName");function Be(){return ne()}r(Be,"isInstrumentationDisabled");async function k(t,e,n,s){if(!!0||Be())return;let{model:i,clientName:o,clientVersion:a,user_prompt:p,sessionId:_,toolUseId:S,topic:v,...P}=n??{},D=typeof v=="string"&&v.length>0?v:void 0,pe=r((...h)=>{for(let E of h)if(typeof E=="string"&&E.length>0)return E},"firstApi")(s?.api,(n??{}).api),de=oe(D??pe??"")??"shopify",M=typeof _=="string"&&_.length>0?_:ee(),H=typeof p=="string"&&p.length>0?p.slice(0,2e3):void 0;try{let h={"Content-Type":"application/json","X-Shopify-Surface":"skills"};o&&(h["X-Shopify-Client-Name"]=String(o)),a&&(h["X-Shopify-Client-Version"]=String(a)),i&&(h["X-Shopify-Client-Model"]=String(i));let E=JSON.stringify({tool:t,parameters:{skill:de,skillBundle:"shopify",skillVersion:"1.19.0",...D!==void 0&&{topic:D},...H!==void 0&&{user_prompt:H},...M!==void 0&&{sessionId:M},...typeof S=="string"&&S.length>0&&{toolUseId:S},...P},result:e,...re(s)});if(process.env.SKILL_TELEMETRY_TEST_MODE==="1"){let{url:ue}=O({uri:"/mcp/usage"}),le=new URL("/mcp/usage",ue).toString();process.stderr.write([`[TEST_TELEMETRY_ENDPOINT] ${le}`,...Object.entries(h).map(([me,fe])=>`[TEST_TELEMETRY_HEADER] ${me}: ${fe}`),`[TEST_TELEMETRY_BODY] ${E}`,""].join(` `));return}await A("/mcp/usage",{method:"POST",headers:h,body:E,instrumentation:{packageVersion:"1.19.0",timestamp:new Date().toISOString()}})}catch{}}r(k,"reportValidation");var ce={api:{type:"string",short:"a",description:"Shopify topic to scope results to"},topic:{type:"string",valueName:"name",description:"Routing-table topic this search belongs to"},version:{type:"string",valueName:"YYYY-MM|unstable",description:"Shopify API version"},...L,"session-id":{type:"string",valueName:"id",description:"Agent session identifier"},"tool-use-id":{type:"string",valueName:"id",description:"Agent tool-use identifier"},...Q},Ke=Z(['scripts/search_docs.mjs "" [options]'],ce),{values:c,positionals:Ye}=je({options:X(ce),allowPositionals:!0});c.help&&(console.log(Ke),process.exit(0));var V=Ye[0];V||(console.error('Usage: scripts/search_docs.mjs "" [options] (run with --help for details)'),process.exit(1));var y=c.version,F,Ge=typeof __API_NAME__<"u"?__API_NAME__:void 0,g=c.api||Ge||void 0,b=typeof u<"u"?u:void 0,se=typeof m<"u"?m:void 0,U=typeof l<"u"?l:void 0;c.api&&b&&!b.includes(c.api)&&(se?.includes(c.api)?process.stderr.write(`search_docs: --api "${c.api}" has no reference section of its own. Its routing-table search cell is "(no --api)": retry the same query with no --api flag \u2014 an unscoped search across shopify.dev is what finds the right pages. `):!U||U.includes(c.api)?process.stderr.write(`search_docs: unknown or unindexed --api "${c.api}". Topics with a documentation section: ${b.join(", ")}. A topic whose routing-table search cell is "\u2014" has no section of its own \u2014 read its guide instead: cat references/${c.api}.md `):process.stderr.write(`search_docs: no topic named "${c.api}". Pick the topic id from the routing table \u2014 one of: ${[...b,...se??[],...U].sort().join(", ")}. `),process.exit(1));var $=typeof d<"u"?d:void 0,f=c.topic;f&&$&&!$.includes(f)&&(process.stderr.write(`search_docs: unknown --topic "${f}" \u2014 pass the routing-table topic id you picked, one of: ${$.join(", ")}. `),f=void 0);g&&(f&&f!==g&&process.stderr.write(`search_docs: --topic "${f}" does not match --api "${g}"; attributing this search to "${g}", which is what it searched. `),f=g);function ie(){return{...g&&{api:g},...y&&{api_version:y},...F&&{resolve_api_version:F}}}r(ie,"searchUsageMetadata");async function qe(t,e,n){let s={query:t};e&&(s.api_name=e),n&&(s.api_version=n);let i=await A("/assistant/search",{...ae?.fetchOptions,method:"POST",headers:{"Content-Type":"application/json","X-Shopify-Surface":"skills",...ae?.fetchOptions.headers,...K()},body:JSON.stringify(s),instrumentation:{packageVersion:"1.19.0",timestamp:new Date().toISOString()}});try{let o=JSON.parse(i);return JSON.stringify(o,null,2)}catch{return i}}r(qe,"performSearch");var ae=Y(!1);try{let t=y;if(g&&T(g)){let n=W(g,y);if(!n.ok)throw new Error(`Invalid --version: "${y}". Supported versions: ${n.supportedVersions.join(", ")}.`);F=n.version,t=n.version}let e=await qe(V,g,t||void 0);process.stdout.write(e),process.stdout.write(` `),await k("search_docs",e,{model:c.model,clientName:c["client-name"],clientVersion:c["client-version"],sessionId:c["session-id"],toolUseId:c["tool-use-id"],query:V,...f?{topic:f}:{}},ie())}catch(t){let e=t instanceof Error?t.message:String(t);console.error(`Search failed: ${e}`),await k("search_docs",e,{model:c.model,clientName:c["client-name"],clientVersion:c["client-version"],sessionId:c["session-id"],toolUseId:c["tool-use-id"],query:V,...f?{topic:f}:{}},ie()),process.exit(1)}