From b350f97b0533eb6d8e2e1ced0b0c9854dfa0c59c Mon Sep 17 00:00:00 2001 From: Bill Fienberg Date: Tue, 6 Jan 2026 17:12:17 -0600 Subject: [PATCH 01/14] add initial admin-search-data template --- admin-search-data/README.md.liquid | 32 ++++++++ .../locales/en.default.json.liquid | 4 + admin-search-data/locales/fr.json.liquid | 4 + admin-search-data/package.json.liquid | 9 +++ .../shopify.extension.toml.liquid | 14 ++++ admin-search-data/src/SearchData.liquid | 45 +++++++++++ admin-search-data/src/tools.json | 77 +++++++++++++++++++ admin-search-data/tsconfig.json | 10 +++ admin-search-data/tsconfig.json.liquid | 10 +++ 9 files changed, 205 insertions(+) create mode 100644 admin-search-data/README.md.liquid create mode 100644 admin-search-data/locales/en.default.json.liquid create mode 100644 admin-search-data/locales/fr.json.liquid create mode 100644 admin-search-data/package.json.liquid create mode 100644 admin-search-data/shopify.extension.toml.liquid create mode 100644 admin-search-data/src/SearchData.liquid create mode 100644 admin-search-data/src/tools.json create mode 100644 admin-search-data/tsconfig.json create mode 100644 admin-search-data/tsconfig.json.liquid diff --git a/admin-search-data/README.md.liquid b/admin-search-data/README.md.liquid new file mode 100644 index 00000000..a41c692c --- /dev/null +++ b/admin-search-data/README.md.liquid @@ -0,0 +1,32 @@ +# {{ name }} + +{{ description }} + +--- + +## Get started with this extension + +This extension provides search functionality for the Shopify Admin. After installation, your app's search results will appear in Admin search. + +### Key files + +- `src/SearchData.{{ srcFileExtension }}` - Main extension code that registers the search tool +- `src/tools.json` - Schema definition for the search tool inputs and outputs + +### How it works + +1. The extension registers a `search` tool using `shopify.tools.register()` +2. When a user searches in the Admin, your search function is called with the query +3. Your function returns results matching the schema defined in `tools.json` + +### Customizing the search + +Edit `src/SearchData.{{ srcFileExtension }}` to implement your search logic: + +1. Fetch data from your app's backend or API +2. Filter/search the data based on the `query` input +3. Return results in the expected format with pagination info + +### Testing locally + +Run `shopify app dev` to test your extension in development mode. diff --git a/admin-search-data/locales/en.default.json.liquid b/admin-search-data/locales/en.default.json.liquid new file mode 100644 index 00000000..4fbfab2f --- /dev/null +++ b/admin-search-data/locales/en.default.json.liquid @@ -0,0 +1,4 @@ +{ + "name": "{{ name }}", + "description": "Search extension for your app" +} diff --git a/admin-search-data/locales/fr.json.liquid b/admin-search-data/locales/fr.json.liquid new file mode 100644 index 00000000..d280be39 --- /dev/null +++ b/admin-search-data/locales/fr.json.liquid @@ -0,0 +1,4 @@ +{ + "name": "{{ name }}", + "description": "Extension de recherche pour votre application" +} diff --git a/admin-search-data/package.json.liquid b/admin-search-data/package.json.liquid new file mode 100644 index 00000000..dc581be1 --- /dev/null +++ b/admin-search-data/package.json.liquid @@ -0,0 +1,9 @@ +{ + "name": "{{ handle }}", + "private": true, + "version": "1.0.0", + "license": "UNLICENSED", + "dependencies": { + "@shopify/ui-extensions": "2025.10.x" + } +} diff --git a/admin-search-data/shopify.extension.toml.liquid b/admin-search-data/shopify.extension.toml.liquid new file mode 100644 index 00000000..d89b1b29 --- /dev/null +++ b/admin-search-data/shopify.extension.toml.liquid @@ -0,0 +1,14 @@ +api_version = "2025-10" + +[[extensions]] +# Change the merchant-facing name of the extension in locales/en.default.json +name = "t:name" +handle = "{{ handle }}" +type = "ui_extension" +{% if uid %}uid = "{{ uid }}"{% endif %} +description = "t:description" + +[[extensions.targeting]] +module = "./src/SearchData.{{ srcFileExtension }}" +target = "admin.app.search.data" +tools = "src/tools.json" diff --git a/admin-search-data/src/SearchData.liquid b/admin-search-data/src/SearchData.liquid new file mode 100644 index 00000000..af8480f8 --- /dev/null +++ b/admin-search-data/src/SearchData.liquid @@ -0,0 +1,45 @@ +{%- if flavor contains 'typescript' -%} +interface SearchInput { + query?: string; + after?: string; + first?: number; +} + +interface SearchResult { + id: string; + type: string; + url: string; + title: string; +} + +interface SearchOutput { + results: SearchResult[]; + pageInfo: { + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; + endCursor: string | null; + }; +} +{%- endif %} + +async function search(input{%- if flavor contains 'typescript' -%}: SearchInput{%- endif -%}){%- if flavor contains 'typescript' -%}: Promise{%- endif %} { + const {query = '', first = 10, after} = input; + + // TODO: Implement your search logic here + // This is a placeholder that returns empty results + + return { + results: [], + pageInfo: { + hasNextPage: false, + hasPreviousPage: false, + startCursor: null, + endCursor: null, + }, + }; +} + +export default {%- if flavor contains 'typescript' -%} async (): Promise =>{%- else -%} async () =>{%- endif %} { + shopify.tools.register('search', search); +}; diff --git a/admin-search-data/src/tools.json b/admin-search-data/src/tools.json new file mode 100644 index 00000000..4ce2d71c --- /dev/null +++ b/admin-search-data/src/tools.json @@ -0,0 +1,77 @@ +[ + { + "name": "search", + "description": "Search for resources", + "inputSchema": { + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "Search query string" + }, + "after": { + "type": "string", + "description": "Cursor for pagination - returns elements after this cursor" + }, + "first": { + "type": "integer", + "description": "Number of results to return (default: 10)" + } + }, + "required": [] + }, + "outputSchema": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the result" + }, + "type": { + "type": "string", + "description": "The type/category of the result" + }, + "url": { + "type": "string", + "description": "URL to view or edit the resource" + }, + "title": { + "type": "string", + "description": "Display title for the result" + } + }, + "required": ["id", "type"] + } + }, + "pageInfo": { + "type": "object", + "properties": { + "hasNextPage": { + "type": "boolean", + "description": "Whether there are more results available" + }, + "hasPreviousPage": { + "type": "boolean", + "description": "Whether there are previous results available" + }, + "startCursor": { + "type": "string", + "nullable": true, + "description": "Cursor for the first item in results" + }, + "endCursor": { + "type": "string", + "nullable": true, + "description": "Cursor for the last item in results" + } + } + } + } + } + } +] diff --git a/admin-search-data/tsconfig.json b/admin-search-data/tsconfig.json new file mode 100644 index 00000000..a5da8e40 --- /dev/null +++ b/admin-search-data/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "target": "ES2020", + "checkJs": true, + "allowJs": true, + "moduleResolution": "node", + "esModuleInterop": true, + "noEmit": true + } +} diff --git a/admin-search-data/tsconfig.json.liquid b/admin-search-data/tsconfig.json.liquid new file mode 100644 index 00000000..a5da8e40 --- /dev/null +++ b/admin-search-data/tsconfig.json.liquid @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "target": "ES2020", + "checkJs": true, + "allowJs": true, + "moduleResolution": "node", + "esModuleInterop": true, + "noEmit": true + } +} From bd14fb96da31cda6b1fe1acbdf5c5d0c20f40bc0 Mon Sep 17 00:00:00 2001 From: Bill Fienberg Date: Fri, 9 Jan 2026 10:06:49 -0600 Subject: [PATCH 02/14] Rename admin.app.search.data to admin.app.tools.data - Rename template directory from admin-search-data to admin-tools-data - Rename SearchData.liquid to ToolsData.liquid - Update target name in shopify.extension.toml.liquid - Update README references --- {admin-search-data => admin-tools-data}/README.md.liquid | 4 ++-- .../locales/en.default.json.liquid | 0 .../locales/fr.json.liquid | 0 {admin-search-data => admin-tools-data}/package.json.liquid | 0 .../shopify.extension.toml.liquid | 4 ++-- .../src/ToolsData.liquid | 0 {admin-search-data => admin-tools-data}/src/tools.json | 0 {admin-search-data => admin-tools-data}/tsconfig.json | 0 {admin-search-data => admin-tools-data}/tsconfig.json.liquid | 0 9 files changed, 4 insertions(+), 4 deletions(-) rename {admin-search-data => admin-tools-data}/README.md.liquid (83%) rename {admin-search-data => admin-tools-data}/locales/en.default.json.liquid (100%) rename {admin-search-data => admin-tools-data}/locales/fr.json.liquid (100%) rename {admin-search-data => admin-tools-data}/package.json.liquid (100%) rename {admin-search-data => admin-tools-data}/shopify.extension.toml.liquid (78%) rename admin-search-data/src/SearchData.liquid => admin-tools-data/src/ToolsData.liquid (100%) rename {admin-search-data => admin-tools-data}/src/tools.json (100%) rename {admin-search-data => admin-tools-data}/tsconfig.json (100%) rename {admin-search-data => admin-tools-data}/tsconfig.json.liquid (100%) diff --git a/admin-search-data/README.md.liquid b/admin-tools-data/README.md.liquid similarity index 83% rename from admin-search-data/README.md.liquid rename to admin-tools-data/README.md.liquid index a41c692c..3f281c00 100644 --- a/admin-search-data/README.md.liquid +++ b/admin-tools-data/README.md.liquid @@ -10,7 +10,7 @@ This extension provides search functionality for the Shopify Admin. After instal ### Key files -- `src/SearchData.{{ srcFileExtension }}` - Main extension code that registers the search tool +- `src/ToolsData.{{ srcFileExtension }}` - Main extension code that registers the search tool - `src/tools.json` - Schema definition for the search tool inputs and outputs ### How it works @@ -21,7 +21,7 @@ This extension provides search functionality for the Shopify Admin. After instal ### Customizing the search -Edit `src/SearchData.{{ srcFileExtension }}` to implement your search logic: +Edit `src/ToolsData.{{ srcFileExtension }}` to implement your search logic: 1. Fetch data from your app's backend or API 2. Filter/search the data based on the `query` input diff --git a/admin-search-data/locales/en.default.json.liquid b/admin-tools-data/locales/en.default.json.liquid similarity index 100% rename from admin-search-data/locales/en.default.json.liquid rename to admin-tools-data/locales/en.default.json.liquid diff --git a/admin-search-data/locales/fr.json.liquid b/admin-tools-data/locales/fr.json.liquid similarity index 100% rename from admin-search-data/locales/fr.json.liquid rename to admin-tools-data/locales/fr.json.liquid diff --git a/admin-search-data/package.json.liquid b/admin-tools-data/package.json.liquid similarity index 100% rename from admin-search-data/package.json.liquid rename to admin-tools-data/package.json.liquid diff --git a/admin-search-data/shopify.extension.toml.liquid b/admin-tools-data/shopify.extension.toml.liquid similarity index 78% rename from admin-search-data/shopify.extension.toml.liquid rename to admin-tools-data/shopify.extension.toml.liquid index d89b1b29..f79adc78 100644 --- a/admin-search-data/shopify.extension.toml.liquid +++ b/admin-tools-data/shopify.extension.toml.liquid @@ -9,6 +9,6 @@ type = "ui_extension" description = "t:description" [[extensions.targeting]] -module = "./src/SearchData.{{ srcFileExtension }}" -target = "admin.app.search.data" +module = "./src/ToolsData.{{ srcFileExtension }}" +target = "admin.app.tools.data" tools = "src/tools.json" diff --git a/admin-search-data/src/SearchData.liquid b/admin-tools-data/src/ToolsData.liquid similarity index 100% rename from admin-search-data/src/SearchData.liquid rename to admin-tools-data/src/ToolsData.liquid diff --git a/admin-search-data/src/tools.json b/admin-tools-data/src/tools.json similarity index 100% rename from admin-search-data/src/tools.json rename to admin-tools-data/src/tools.json diff --git a/admin-search-data/tsconfig.json b/admin-tools-data/tsconfig.json similarity index 100% rename from admin-search-data/tsconfig.json rename to admin-tools-data/tsconfig.json diff --git a/admin-search-data/tsconfig.json.liquid b/admin-tools-data/tsconfig.json.liquid similarity index 100% rename from admin-search-data/tsconfig.json.liquid rename to admin-tools-data/tsconfig.json.liquid From 37b6e7a052112e7e38b12bca1044853c21182745 Mon Sep 17 00:00:00 2001 From: Bill Fienberg Date: Fri, 9 Jan 2026 13:45:36 -0600 Subject: [PATCH 03/14] update admin-tools template --- admin-tools-data/src/ToolsData.liquid | 45 ------------------- admin-tools-data/tsconfig.json | 10 ----- admin-tools-data/tsconfig.json.liquid | 10 ----- .../README.md.liquid | 0 .../locales/en.default.json.liquid | 0 .../locales/fr.json.liquid | 0 .../package.json.liquid | 0 .../shopify.extension.toml.liquid | 0 admin-tools/src/ToolsData.liquid | 20 +++++++++ .../src/tools.json | 0 templates.json | 18 ++++++++ 11 files changed, 38 insertions(+), 65 deletions(-) delete mode 100644 admin-tools-data/src/ToolsData.liquid delete mode 100644 admin-tools-data/tsconfig.json delete mode 100644 admin-tools-data/tsconfig.json.liquid rename {admin-tools-data => admin-tools}/README.md.liquid (100%) rename {admin-tools-data => admin-tools}/locales/en.default.json.liquid (100%) rename {admin-tools-data => admin-tools}/locales/fr.json.liquid (100%) rename {admin-tools-data => admin-tools}/package.json.liquid (100%) rename {admin-tools-data => admin-tools}/shopify.extension.toml.liquid (100%) create mode 100644 admin-tools/src/ToolsData.liquid rename {admin-tools-data => admin-tools}/src/tools.json (100%) diff --git a/admin-tools-data/src/ToolsData.liquid b/admin-tools-data/src/ToolsData.liquid deleted file mode 100644 index af8480f8..00000000 --- a/admin-tools-data/src/ToolsData.liquid +++ /dev/null @@ -1,45 +0,0 @@ -{%- if flavor contains 'typescript' -%} -interface SearchInput { - query?: string; - after?: string; - first?: number; -} - -interface SearchResult { - id: string; - type: string; - url: string; - title: string; -} - -interface SearchOutput { - results: SearchResult[]; - pageInfo: { - hasNextPage: boolean; - hasPreviousPage: boolean; - startCursor: string | null; - endCursor: string | null; - }; -} -{%- endif %} - -async function search(input{%- if flavor contains 'typescript' -%}: SearchInput{%- endif -%}){%- if flavor contains 'typescript' -%}: Promise{%- endif %} { - const {query = '', first = 10, after} = input; - - // TODO: Implement your search logic here - // This is a placeholder that returns empty results - - return { - results: [], - pageInfo: { - hasNextPage: false, - hasPreviousPage: false, - startCursor: null, - endCursor: null, - }, - }; -} - -export default {%- if flavor contains 'typescript' -%} async (): Promise =>{%- else -%} async () =>{%- endif %} { - shopify.tools.register('search', search); -}; diff --git a/admin-tools-data/tsconfig.json b/admin-tools-data/tsconfig.json deleted file mode 100644 index a5da8e40..00000000 --- a/admin-tools-data/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "checkJs": true, - "allowJs": true, - "moduleResolution": "node", - "esModuleInterop": true, - "noEmit": true - } -} diff --git a/admin-tools-data/tsconfig.json.liquid b/admin-tools-data/tsconfig.json.liquid deleted file mode 100644 index a5da8e40..00000000 --- a/admin-tools-data/tsconfig.json.liquid +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "checkJs": true, - "allowJs": true, - "moduleResolution": "node", - "esModuleInterop": true, - "noEmit": true - } -} diff --git a/admin-tools-data/README.md.liquid b/admin-tools/README.md.liquid similarity index 100% rename from admin-tools-data/README.md.liquid rename to admin-tools/README.md.liquid diff --git a/admin-tools-data/locales/en.default.json.liquid b/admin-tools/locales/en.default.json.liquid similarity index 100% rename from admin-tools-data/locales/en.default.json.liquid rename to admin-tools/locales/en.default.json.liquid diff --git a/admin-tools-data/locales/fr.json.liquid b/admin-tools/locales/fr.json.liquid similarity index 100% rename from admin-tools-data/locales/fr.json.liquid rename to admin-tools/locales/fr.json.liquid diff --git a/admin-tools-data/package.json.liquid b/admin-tools/package.json.liquid similarity index 100% rename from admin-tools-data/package.json.liquid rename to admin-tools/package.json.liquid diff --git a/admin-tools-data/shopify.extension.toml.liquid b/admin-tools/shopify.extension.toml.liquid similarity index 100% rename from admin-tools-data/shopify.extension.toml.liquid rename to admin-tools/shopify.extension.toml.liquid diff --git a/admin-tools/src/ToolsData.liquid b/admin-tools/src/ToolsData.liquid new file mode 100644 index 00000000..52c12cda --- /dev/null +++ b/admin-tools/src/ToolsData.liquid @@ -0,0 +1,20 @@ +async function search(input) { + const {query = '', first = 10, after} = input; + + // TODO: Implement your search logic here + // This is a placeholder that returns empty results + + return { + results: [], + pageInfo: { + hasNextPage: false, + hasPreviousPage: false, + startCursor: null, + endCursor: null, + }, + }; +} + +export default async function extension() { + shopify.tools.register('search', search); +} diff --git a/admin-tools-data/src/tools.json b/admin-tools/src/tools.json similarity index 100% rename from admin-tools-data/src/tools.json rename to admin-tools/src/tools.json diff --git a/templates.json b/templates.json index 03f0e631..25a38f94 100644 --- a/templates.json +++ b/templates.json @@ -399,6 +399,24 @@ ], "minimumCliVersion": "3.85.3" }, + { + "identifier": "app_tools", + "name": "Admin app tools", + "defaultName": "app-tools", + "group": "UI extensions", + "supportLinks": [], + "url": "https://github.com/Shopify/extensions-templates#bf/add-admin-tools-data-template", + "type": "ui_extension", + "extensionPoints": [], + "supportedFlavors": [ + { + "name": "JavaScript", + "value": "vanilla-js", + "path": "admin-tools" + } + ], + "minimumCliVersion": "3.85.3" + }, { "identifier": "admin_print_legacy", "name": "Admin print action", From 6bb3ac19b4efaa487ca96dd227e120d49c4d9bf0 Mon Sep 17 00:00:00 2001 From: Bill Fienberg Date: Fri, 9 Jan 2026 13:48:48 -0600 Subject: [PATCH 04/14] move tools.json to root --- admin-tools/shopify.extension.toml.liquid | 2 +- admin-tools/{src => }/tools.json | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename admin-tools/{src => }/tools.json (100%) diff --git a/admin-tools/shopify.extension.toml.liquid b/admin-tools/shopify.extension.toml.liquid index f79adc78..6391d495 100644 --- a/admin-tools/shopify.extension.toml.liquid +++ b/admin-tools/shopify.extension.toml.liquid @@ -11,4 +11,4 @@ description = "t:description" [[extensions.targeting]] module = "./src/ToolsData.{{ srcFileExtension }}" target = "admin.app.tools.data" -tools = "src/tools.json" +tools = "./tools.json" diff --git a/admin-tools/src/tools.json b/admin-tools/tools.json similarity index 100% rename from admin-tools/src/tools.json rename to admin-tools/tools.json From e284d13b61a1c044ee3d393fe78146a850de43d1 Mon Sep 17 00:00:00 2001 From: Bill Fienberg Date: Fri, 9 Jan 2026 16:44:55 -0600 Subject: [PATCH 05/14] Rename ToolsData to index to match CLI output --- admin-tools/README.md.liquid | 6 +++--- admin-tools/shopify.extension.toml.liquid | 2 +- admin-tools/src/{ToolsData.liquid => index.liquid} | 0 3 files changed, 4 insertions(+), 4 deletions(-) rename admin-tools/src/{ToolsData.liquid => index.liquid} (100%) diff --git a/admin-tools/README.md.liquid b/admin-tools/README.md.liquid index 3f281c00..f5097ba1 100644 --- a/admin-tools/README.md.liquid +++ b/admin-tools/README.md.liquid @@ -10,8 +10,8 @@ This extension provides search functionality for the Shopify Admin. After instal ### Key files -- `src/ToolsData.{{ srcFileExtension }}` - Main extension code that registers the search tool -- `src/tools.json` - Schema definition for the search tool inputs and outputs +- `src/index.{{ srcFileExtension }}` - Main extension code that registers the search tool +- `tools.json` - Schema definition for the search tool inputs and outputs ### How it works @@ -21,7 +21,7 @@ This extension provides search functionality for the Shopify Admin. After instal ### Customizing the search -Edit `src/ToolsData.{{ srcFileExtension }}` to implement your search logic: +Edit `src/index.{{ srcFileExtension }}` to implement your search logic: 1. Fetch data from your app's backend or API 2. Filter/search the data based on the `query` input diff --git a/admin-tools/shopify.extension.toml.liquid b/admin-tools/shopify.extension.toml.liquid index 6391d495..49a967c9 100644 --- a/admin-tools/shopify.extension.toml.liquid +++ b/admin-tools/shopify.extension.toml.liquid @@ -9,6 +9,6 @@ type = "ui_extension" description = "t:description" [[extensions.targeting]] -module = "./src/ToolsData.{{ srcFileExtension }}" +module = "./src/index.{{ srcFileExtension }}" target = "admin.app.tools.data" tools = "./tools.json" diff --git a/admin-tools/src/ToolsData.liquid b/admin-tools/src/index.liquid similarity index 100% rename from admin-tools/src/ToolsData.liquid rename to admin-tools/src/index.liquid From 767e10a5370513f5a10bd20ee2d8b748bf3295b2 Mon Sep 17 00:00:00 2001 From: Bill Fienberg Date: Tue, 13 Jan 2026 14:33:37 -0600 Subject: [PATCH 06/14] Add tsconfig.json.liquid for admin-tools template Co-Authored-By: Claude Opus 4.5 --- admin-tools/src/index.liquid | 1 - admin-tools/tsconfig.json.liquid | 10 ++++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 admin-tools/tsconfig.json.liquid diff --git a/admin-tools/src/index.liquid b/admin-tools/src/index.liquid index 52c12cda..b80e4989 100644 --- a/admin-tools/src/index.liquid +++ b/admin-tools/src/index.liquid @@ -2,7 +2,6 @@ async function search(input) { const {query = '', first = 10, after} = input; // TODO: Implement your search logic here - // This is a placeholder that returns empty results return { results: [], diff --git a/admin-tools/tsconfig.json.liquid b/admin-tools/tsconfig.json.liquid new file mode 100644 index 00000000..a5da8e40 --- /dev/null +++ b/admin-tools/tsconfig.json.liquid @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "target": "ES2020", + "checkJs": true, + "allowJs": true, + "moduleResolution": "node", + "esModuleInterop": true, + "noEmit": true + } +} From 34f1430bd650e9ad0da779f6c4468643001a6115 Mon Sep 17 00:00:00 2001 From: Kyle Bavender Date: Wed, 14 Jan 2026 14:12:51 -0500 Subject: [PATCH 07/14] use snapshot version of ui-extensions --- admin-tools/package.json.liquid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin-tools/package.json.liquid b/admin-tools/package.json.liquid index dc581be1..39ed4097 100644 --- a/admin-tools/package.json.liquid +++ b/admin-tools/package.json.liquid @@ -4,6 +4,6 @@ "version": "1.0.0", "license": "UNLICENSED", "dependencies": { - "@shopify/ui-extensions": "2025.10.x" + "@shopify/ui-extensions": "0.0.0-snapshot-20260113202545" } } From f128e5bdc5862286876e182d3a4f49e4334a85d2 Mon Sep 17 00:00:00 2001 From: Kyle Bavender Date: Wed, 14 Jan 2026 18:41:39 -0500 Subject: [PATCH 08/14] update index for typing and tweak config for demo --- admin-tools/package.json.liquid | 2 +- admin-tools/shopify.extension.toml.liquid | 2 +- admin-tools/src/index.liquid | 30 +++++++++++------------ 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/admin-tools/package.json.liquid b/admin-tools/package.json.liquid index 39ed4097..afc3e34d 100644 --- a/admin-tools/package.json.liquid +++ b/admin-tools/package.json.liquid @@ -4,6 +4,6 @@ "version": "1.0.0", "license": "UNLICENSED", "dependencies": { - "@shopify/ui-extensions": "0.0.0-snapshot-20260113202545" + "@shopify/ui-extensions": "0.0.0-snapshot-20260114193753" } } diff --git a/admin-tools/shopify.extension.toml.liquid b/admin-tools/shopify.extension.toml.liquid index 49a967c9..3fbbaf46 100644 --- a/admin-tools/shopify.extension.toml.liquid +++ b/admin-tools/shopify.extension.toml.liquid @@ -10,5 +10,5 @@ description = "t:description" [[extensions.targeting]] module = "./src/index.{{ srcFileExtension }}" -target = "admin.app.tools.data" +target = "admin.app.search.data" tools = "./tools.json" diff --git a/admin-tools/src/index.liquid b/admin-tools/src/index.liquid index b80e4989..2e58d9e2 100644 --- a/admin-tools/src/index.liquid +++ b/admin-tools/src/index.liquid @@ -1,19 +1,17 @@ -async function search(input) { - const {query = '', first = 10, after} = input; - - // TODO: Implement your search logic here +export default async function extension() { + shopify.tools.register('search', (input) => { + const {query = '', first = 10, after} = input; - return { - results: [], - pageInfo: { - hasNextPage: false, - hasPreviousPage: false, - startCursor: null, - endCursor: null, - }, - }; -} + // TODO: Implement your search logic here -export default async function extension() { - shopify.tools.register('search', search); + return { + results: [], + pageInfo: { + hasNextPage: false, + hasPreviousPage: false, + startCursor: null, + endCursor: null, + }, + }; + }); } From 148bb26b4af8cc98fa58e422db546e17eefb6778 Mon Sep 17 00:00:00 2001 From: Kyle Bavender Date: Fri, 16 Jan 2026 15:05:56 -0500 Subject: [PATCH 09/14] Use intended values --- admin-tools/shopify.extension.toml.liquid | 2 +- templates.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/admin-tools/shopify.extension.toml.liquid b/admin-tools/shopify.extension.toml.liquid index 3fbbaf46..49a967c9 100644 --- a/admin-tools/shopify.extension.toml.liquid +++ b/admin-tools/shopify.extension.toml.liquid @@ -10,5 +10,5 @@ description = "t:description" [[extensions.targeting]] module = "./src/index.{{ srcFileExtension }}" -target = "admin.app.search.data" +target = "admin.app.tools.data" tools = "./tools.json" diff --git a/templates.json b/templates.json index 25a38f94..24269c62 100644 --- a/templates.json +++ b/templates.json @@ -415,6 +415,7 @@ "path": "admin-tools" } ], + "organizationExpFlags": ["d7c1b4ad"], "minimumCliVersion": "3.85.3" }, { From 27bab0af3e22d275e74ff7846274b5e9beb4aec4 Mon Sep 17 00:00:00 2001 From: Kyle Bavender Date: Fri, 16 Jan 2026 16:35:35 -0500 Subject: [PATCH 10/14] Switch ui-extensions version to 2025.10.x --- admin-tools/package.json.liquid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin-tools/package.json.liquid b/admin-tools/package.json.liquid index afc3e34d..dc581be1 100644 --- a/admin-tools/package.json.liquid +++ b/admin-tools/package.json.liquid @@ -4,6 +4,6 @@ "version": "1.0.0", "license": "UNLICENSED", "dependencies": { - "@shopify/ui-extensions": "0.0.0-snapshot-20260114193753" + "@shopify/ui-extensions": "2025.10.x" } } From 29bd4efe36cfbc7af013f50cdaba1bd639e551f5 Mon Sep 17 00:00:00 2001 From: Kyle Bavender Date: Tue, 20 Jan 2026 09:09:34 -0500 Subject: [PATCH 11/14] Tweak README content for clarity / helpfulness --- admin-tools/README.md.liquid | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/admin-tools/README.md.liquid b/admin-tools/README.md.liquid index f5097ba1..0bc94531 100644 --- a/admin-tools/README.md.liquid +++ b/admin-tools/README.md.liquid @@ -6,17 +6,17 @@ ## Get started with this extension -This extension provides search functionality for the Shopify Admin. After installation, your app's search results will appear in Admin search. +This extension demonstrates adding search functionality for Sidekick. After deployment, results will be available to Sidekick. ### Key files -- `src/index.{{ srcFileExtension }}` - Main extension code that registers the search tool +- `src/index.{{ srcFileExtension }}` - Main extension code that defines the search tool execution logic - `tools.json` - Schema definition for the search tool inputs and outputs ### How it works 1. The extension registers a `search` tool using `shopify.tools.register()` -2. When a user searches in the Admin, your search function is called with the query +2. When Sidekick is asked to search for a resource, your search function is called with the query 3. Your function returns results matching the schema defined in `tools.json` ### Customizing the search From 74436c2e2d7c060299cf130c1aa4d5d89dcd11d8 Mon Sep 17 00:00:00 2001 From: Kyle Bavender Date: Wed, 21 Jan 2026 11:29:17 -0500 Subject: [PATCH 12/14] Implement PR feedback iterating on template content --- admin-tools/README.md | 34 +++++++++++++++++++++++ admin-tools/README.md.liquid | 32 --------------------- admin-tools/instructions.md | 18 ++++++++++++ admin-tools/shopify.extension.toml.liquid | 1 + admin-tools/tools.json | 2 +- 5 files changed, 54 insertions(+), 33 deletions(-) create mode 100644 admin-tools/README.md delete mode 100644 admin-tools/README.md.liquid create mode 100644 admin-tools/instructions.md diff --git a/admin-tools/README.md b/admin-tools/README.md new file mode 100644 index 00000000..5b32e6ec --- /dev/null +++ b/admin-tools/README.md @@ -0,0 +1,34 @@ +# Admin App Tools Extension + +Admin app tools extensions enable app developers to provide data and search functionality to Sidekick in the Shopify Admin. These extensions allow Sidekick to query your app's external data sources and surface results to merchants. + +Learn more about Admin app tools extensions in Shopify's [developer documentation](https://shopify.dev/docs/apps/build/sidekick/build-app-data). + +--- + +## Get started with this extension + +This extension demonstrates adding search functionality for Sidekick. After deployment, Sidekick will be able to run the search tool to query for the app's data. + +### Key files + +- `src/index.js` - Main extension code that defines the search tool execution logic +- `tools.json` - Schema definition for the search tool's inputs and outputs + +### How it works + +1. The extension registers a `search` tool using `shopify.tools.register()` +2. When Sidekick is asked to search for a resource, your search function is called with the query +3. Your function returns results matching the schema defined in `tools.json` + +### Customizing the search + +Edit `src/index.js` to implement your search logic: + +1. Fetch data from your app's backend or API +2. Filter/search the data based on the `query` input +3. Return results in the expected format with pagination info + +### Testing locally + +Run `shopify app dev` and click on the "admin.app.tools.data" preview link in the Dev Console to test your extension in development mode diff --git a/admin-tools/README.md.liquid b/admin-tools/README.md.liquid deleted file mode 100644 index 0bc94531..00000000 --- a/admin-tools/README.md.liquid +++ /dev/null @@ -1,32 +0,0 @@ -# {{ name }} - -{{ description }} - ---- - -## Get started with this extension - -This extension demonstrates adding search functionality for Sidekick. After deployment, results will be available to Sidekick. - -### Key files - -- `src/index.{{ srcFileExtension }}` - Main extension code that defines the search tool execution logic -- `tools.json` - Schema definition for the search tool inputs and outputs - -### How it works - -1. The extension registers a `search` tool using `shopify.tools.register()` -2. When Sidekick is asked to search for a resource, your search function is called with the query -3. Your function returns results matching the schema defined in `tools.json` - -### Customizing the search - -Edit `src/index.{{ srcFileExtension }}` to implement your search logic: - -1. Fetch data from your app's backend or API -2. Filter/search the data based on the `query` input -3. Return results in the expected format with pagination info - -### Testing locally - -Run `shopify app dev` to test your extension in development mode. diff --git a/admin-tools/instructions.md b/admin-tools/instructions.md new file mode 100644 index 00000000..075c9844 --- /dev/null +++ b/admin-tools/instructions.md @@ -0,0 +1,18 @@ +## When to Use This App's Tools + +Use these tools when the merchant asks about: + +- Data or records from apps + +## Important Guidelines + +- Use the `query` parameter to pass the merchant's search terms +- Results are paginated - use `first` and `after` parameters for large result sets + +## Common Workflows + +### Searching for Data + +1. Understand what the merchant is looking for +2. Use the search tool with their query +3. Present the results with relevant details (title, type, URL if available) diff --git a/admin-tools/shopify.extension.toml.liquid b/admin-tools/shopify.extension.toml.liquid index 49a967c9..fa50cf28 100644 --- a/admin-tools/shopify.extension.toml.liquid +++ b/admin-tools/shopify.extension.toml.liquid @@ -12,3 +12,4 @@ description = "t:description" module = "./src/index.{{ srcFileExtension }}" target = "admin.app.tools.data" tools = "./tools.json" +instructions = "./instructions.md" diff --git a/admin-tools/tools.json b/admin-tools/tools.json index 4ce2d71c..bc53bc86 100644 --- a/admin-tools/tools.json +++ b/admin-tools/tools.json @@ -1,7 +1,7 @@ [ { "name": "search", - "description": "Search for resources", + "description": "Search for data from this app's external data source", "inputSchema": { "type": "object", "properties": { From 0289e95295e1b2a575208a6b34720b61aae82c34 Mon Sep 17 00:00:00 2001 From: Kyle Bavender Date: Fri, 23 Jan 2026 15:15:05 -0500 Subject: [PATCH 13/14] Pin to 2025.10.12 patch version or greater, which is required --- admin-tools/package.json.liquid | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin-tools/package.json.liquid b/admin-tools/package.json.liquid index dc581be1..8a69544c 100644 --- a/admin-tools/package.json.liquid +++ b/admin-tools/package.json.liquid @@ -4,6 +4,6 @@ "version": "1.0.0", "license": "UNLICENSED", "dependencies": { - "@shopify/ui-extensions": "2025.10.x" + "@shopify/ui-extensions": "~2025.10.12" } } From 158ea116a25e326972f84d647ec5c8aa0875daed Mon Sep 17 00:00:00 2001 From: Kyle Bavender Date: Fri, 23 Jan 2026 16:26:35 -0500 Subject: [PATCH 14/14] Prepare for merge --- templates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates.json b/templates.json index 24269c62..03a4a247 100644 --- a/templates.json +++ b/templates.json @@ -405,7 +405,7 @@ "defaultName": "app-tools", "group": "UI extensions", "supportLinks": [], - "url": "https://github.com/Shopify/extensions-templates#bf/add-admin-tools-data-template", + "url": "https://github.com/Shopify/extensions-templates", "type": "ui_extension", "extensionPoints": [], "supportedFlavors": [ @@ -416,7 +416,7 @@ } ], "organizationExpFlags": ["d7c1b4ad"], - "minimumCliVersion": "3.85.3" + "minimumCliVersion": "3.90.0" }, { "identifier": "admin_print_legacy",