From 04c349d5be69b064509088f0feb42f2dac0f7f19 Mon Sep 17 00:00:00 2001 From: Nick Pape <5674316+nick-pape@users.noreply.github.com> Date: Wed, 3 Jun 2026 11:16:46 -0500 Subject: [PATCH] Add copilot-component-minimal template Adds a new "copilot" template category and a minimal Copilot Component template based on the greeting-copilot-component reference implementation. The template scaffolds a hello-world CopilotComponent with Zod-based properties schema, declarative agent manifests, and copilot agent config. Note: the example is not registered in rush.json because @microsoft/sp-copilot-component has not been published yet. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../etc/spfx-template-api.api.md | 2 +- .../src/templating/SPFxTemplateJsonFile.ts | 5 +- apps/spfx-cli/README.md | 6 + ...copilot-component-template_2026-06-03.json | 10 ++ .../copilot-component-minimal/.eslintrc.js | 148 ++++++++++++++++++ examples/copilot-component-minimal/.gitignore | 33 ++++ examples/copilot-component-minimal/.npmignore | 32 ++++ examples/copilot-component-minimal/README.md | 67 ++++++++ .../config/config.json | 14 ++ .../config/copilot-agent.json | 11 ++ .../config/package-solution.json | 40 +++++ .../copilot-component-minimal/config/rig.json | 7 + .../config/serve.json | 10 ++ .../copilot/ai-plugin.json | 9 ++ .../copilot/color.png | Bin 0 -> 2106 bytes .../copilot/declarativeAgent.json | 19 +++ .../copilot/instruction.txt | 5 + .../copilot/manifest.json | 35 +++++ .../copilot/outline.png | Bin 0 -> 249 bytes .../copilot-component-minimal/package.json | 35 +++++ .../src/MinimalCopilotComponent.ts | 9 ++ .../src/MinimalProperties.ts | 10 ++ .../minimal-copilot-component.manifest.json | 26 +++ .../copilot-component-minimal/tsconfig.json | 3 + .../copilot-component-minimal/.eslintrc.js | 148 ++++++++++++++++++ .../copilot-component-minimal/.gitignore | 33 ++++ .../copilot-component-minimal/.npmignore | 32 ++++ templates/copilot-component-minimal/README.md | 67 ++++++++ .../config/config.json | 14 ++ .../config/copilot-agent.json | 11 ++ .../config/package-solution.json | 40 +++++ .../copilot-component-minimal/config/rig.json | 7 + .../config/serve.json | 10 ++ .../copilot/ai-plugin.json | 9 ++ .../copilot/color.png | Bin 0 -> 2106 bytes .../copilot/declarativeAgent.json | 19 +++ .../copilot/instruction.txt | 5 + .../copilot/manifest.json | 35 +++++ .../copilot/outline.png | Bin 0 -> 249 bytes .../copilot-component-minimal/package.json | 35 +++++ ...me.hyphen}-copilot-component.manifest.json | 26 +++ .../{componentName.pascal}CopilotComponent.ts | 9 ++ .../src/{componentName.pascal}Properties.ts | 10 ++ .../copilot-component-minimal/template.json | 7 + .../copilot-component-minimal/tsconfig.json | 3 + .../multi-component.test.ts.snap | 8 +- .../__snapshots__/templates.test.ts.snap | 138 ++++++++++++++-- .../src/tests/templates.test.ts | 9 ++ 48 files changed, 1189 insertions(+), 22 deletions(-) create mode 100644 common/changes/@microsoft/spfx-cli/add-copilot-component-template_2026-06-03.json create mode 100644 examples/copilot-component-minimal/.eslintrc.js create mode 100644 examples/copilot-component-minimal/.gitignore create mode 100644 examples/copilot-component-minimal/.npmignore create mode 100644 examples/copilot-component-minimal/README.md create mode 100644 examples/copilot-component-minimal/config/config.json create mode 100644 examples/copilot-component-minimal/config/copilot-agent.json create mode 100644 examples/copilot-component-minimal/config/package-solution.json create mode 100644 examples/copilot-component-minimal/config/rig.json create mode 100644 examples/copilot-component-minimal/config/serve.json create mode 100644 examples/copilot-component-minimal/copilot/ai-plugin.json create mode 100644 examples/copilot-component-minimal/copilot/color.png create mode 100644 examples/copilot-component-minimal/copilot/declarativeAgent.json create mode 100644 examples/copilot-component-minimal/copilot/instruction.txt create mode 100644 examples/copilot-component-minimal/copilot/manifest.json create mode 100644 examples/copilot-component-minimal/copilot/outline.png create mode 100644 examples/copilot-component-minimal/package.json create mode 100644 examples/copilot-component-minimal/src/MinimalCopilotComponent.ts create mode 100644 examples/copilot-component-minimal/src/MinimalProperties.ts create mode 100644 examples/copilot-component-minimal/src/minimal-copilot-component.manifest.json create mode 100644 examples/copilot-component-minimal/tsconfig.json create mode 100644 templates/copilot-component-minimal/.eslintrc.js create mode 100644 templates/copilot-component-minimal/.gitignore create mode 100644 templates/copilot-component-minimal/.npmignore create mode 100644 templates/copilot-component-minimal/README.md create mode 100644 templates/copilot-component-minimal/config/config.json create mode 100644 templates/copilot-component-minimal/config/copilot-agent.json create mode 100644 templates/copilot-component-minimal/config/package-solution.json create mode 100644 templates/copilot-component-minimal/config/rig.json create mode 100644 templates/copilot-component-minimal/config/serve.json create mode 100644 templates/copilot-component-minimal/copilot/ai-plugin.json create mode 100644 templates/copilot-component-minimal/copilot/color.png create mode 100644 templates/copilot-component-minimal/copilot/declarativeAgent.json create mode 100644 templates/copilot-component-minimal/copilot/instruction.txt create mode 100644 templates/copilot-component-minimal/copilot/manifest.json create mode 100644 templates/copilot-component-minimal/copilot/outline.png create mode 100644 templates/copilot-component-minimal/package.json create mode 100644 templates/copilot-component-minimal/src/{componentName.hyphen}-copilot-component.manifest.json create mode 100644 templates/copilot-component-minimal/src/{componentName.pascal}CopilotComponent.ts create mode 100644 templates/copilot-component-minimal/src/{componentName.pascal}Properties.ts create mode 100644 templates/copilot-component-minimal/template.json create mode 100644 templates/copilot-component-minimal/tsconfig.json diff --git a/api/spfx-template-api/etc/spfx-template-api.api.md b/api/spfx-template-api/etc/spfx-template-api.api.md index 863d98b9..e104860a 100644 --- a/api/spfx-template-api/etc/spfx-template-api.api.md +++ b/api/spfx-template-api/etc/spfx-template-api.api.md @@ -245,7 +245,7 @@ export class ServeJsonMergeHelper extends JsonMergeHelper { } // @public -export const SPFX_TEMPLATE_CATEGORIES: readonly ['webpart', 'extension', 'ace', 'library']; +export const SPFX_TEMPLATE_CATEGORIES: readonly ['webpart', 'extension', 'ace', 'library', 'copilot']; // @public export type SPFxRepositorySource = LocalFileSystemRepositorySource | PublicGitHubRepositorySource; diff --git a/api/spfx-template-api/src/templating/SPFxTemplateJsonFile.ts b/api/spfx-template-api/src/templating/SPFxTemplateJsonFile.ts index 0418f91d..8dbdef75 100644 --- a/api/spfx-template-api/src/templating/SPFxTemplateJsonFile.ts +++ b/api/spfx-template-api/src/templating/SPFxTemplateJsonFile.ts @@ -16,11 +16,12 @@ const DESCRIPTION_MAX_LENGTH: number = 500; * The allowed category values for SPFx templates. * @public */ -export const SPFX_TEMPLATE_CATEGORIES: readonly ['webpart', 'extension', 'ace', 'library'] = [ +export const SPFX_TEMPLATE_CATEGORIES: readonly ['webpart', 'extension', 'ace', 'library', 'copilot'] = [ 'webpart', 'extension', 'ace', - 'library' + 'library', + 'copilot' ] as const; /** diff --git a/apps/spfx-cli/README.md b/apps/spfx-cli/README.md index b01c674e..9d5883dd 100644 --- a/apps/spfx-cli/README.md +++ b/apps/spfx-cli/README.md @@ -142,6 +142,12 @@ Templates are fetched at runtime from the [SharePoint/spfx](https://github.com/S | `ace-generic-primarytext-card` | Generic primary text card | | `ace-search-card` | Search card | +### Copilot Components + +| Name | Description | +|------|-------------| +| `copilot-component-minimal` | Bare-bones Copilot Component, no UI framework | + ### Other | Name | Description | diff --git a/common/changes/@microsoft/spfx-cli/add-copilot-component-template_2026-06-03.json b/common/changes/@microsoft/spfx-cli/add-copilot-component-template_2026-06-03.json new file mode 100644 index 00000000..a0a328ef --- /dev/null +++ b/common/changes/@microsoft/spfx-cli/add-copilot-component-template_2026-06-03.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@microsoft/spfx-cli", + "comment": "", + "type": "none" + } + ], + "packageName": "@microsoft/spfx-cli" +} diff --git a/examples/copilot-component-minimal/.eslintrc.js b/examples/copilot-component-minimal/.eslintrc.js new file mode 100644 index 00000000..7eecfadb --- /dev/null +++ b/examples/copilot-component-minimal/.eslintrc.js @@ -0,0 +1,148 @@ +require('@rushstack/eslint-config/patch/modern-module-resolution'); +module.exports = { + extends: ['@microsoft/eslint-config-spfx/lib/profiles/default'], + parserOptions: { tsconfigRootDir: __dirname }, + overrides: [ + { + files: ['*.ts', '*.tsx'], + parser: '@typescript-eslint/parser', + parserOptions: { + project: './tsconfig.json', + ecmaVersion: 2018, + sourceType: 'module' + }, + rules: { + '@rushstack/no-new-null': 1, + '@rushstack/hoist-jest-mock': 1, + '@rushstack/import-requires-chunk-name': 1, + '@rushstack/security/no-unsafe-regexp': 1, + '@typescript-eslint/adjacent-overload-signatures': 1, + '@typescript-eslint/explicit-function-return-type': [ + 1, + { + allowExpressions: true, + allowTypedFunctionExpressions: true, + allowHigherOrderFunctions: false + } + ], + '@typescript-eslint/explicit-member-accessibility': 0, + '@typescript-eslint/no-array-constructor': 1, + '@typescript-eslint/no-explicit-any': 1, + '@typescript-eslint/no-floating-promises': 2, + '@typescript-eslint/no-for-in-array': 2, + '@typescript-eslint/no-misused-new': 2, + '@typescript-eslint/no-namespace': [ + 1, + { + allowDeclarations: false, + allowDefinitionFiles: false + } + ], + '@typescript-eslint/parameter-properties': 0, + '@typescript-eslint/no-unused-vars': [ + 1, + { + vars: 'all', + args: 'none' + } + ], + '@typescript-eslint/no-use-before-define': [ + 2, + { + functions: false, + classes: true, + variables: true, + enums: true, + typedefs: true + } + ], + '@typescript-eslint/no-var-requires': 'error', + '@typescript-eslint/prefer-namespace-keyword': 1, + '@typescript-eslint/no-inferrable-types': 0, + '@typescript-eslint/no-empty-interface': 0, + 'accessor-pairs': 1, + 'dot-notation': [ + 1, + { + allowPattern: '^_' + } + ], + eqeqeq: 1, + 'for-direction': 1, + 'guard-for-in': 2, + 'max-lines': ['warn', { max: 2000 }], + 'no-async-promise-executor': 2, + 'no-caller': 2, + 'no-compare-neg-zero': 2, + 'no-cond-assign': 2, + 'no-constant-condition': 1, + 'no-control-regex': 2, + 'no-debugger': 1, + 'no-delete-var': 2, + 'no-duplicate-case': 2, + 'no-empty': 1, + 'no-empty-character-class': 2, + 'no-empty-pattern': 1, + 'no-eval': 1, + 'no-ex-assign': 2, + 'no-extend-native': 1, + 'no-extra-label': 1, + 'no-fallthrough': 2, + 'no-func-assign': 1, + 'no-implied-eval': 2, + 'no-invalid-regexp': 2, + 'no-label-var': 2, + 'no-lone-blocks': 1, + 'no-misleading-character-class': 2, + 'no-multi-str': 2, + 'no-new': 1, + 'no-new-func': 2, + 'no-new-object': 2, + 'no-new-wrappers': 1, + 'no-octal': 2, + 'no-octal-escape': 2, + 'no-regex-spaces': 2, + 'no-return-assign': 2, + 'no-script-url': 1, + 'no-self-assign': 2, + 'no-self-compare': 2, + 'no-sequences': 1, + 'no-shadow-restricted-names': 2, + 'no-sparse-arrays': 2, + 'no-throw-literal': 2, + 'no-unmodified-loop-condition': 1, + 'no-unsafe-finally': 2, + 'no-unused-expressions': 1, + 'no-unused-labels': 1, + 'no-useless-catch': 1, + 'no-useless-concat': 1, + 'no-var': 2, + 'no-void': 1, + 'no-with': 2, + 'prefer-const': 1, + 'promise/param-names': 2, + 'require-atomic-updates': 2, + 'require-yield': 1, + strict: [2, 'never'], + 'use-isnan': 2, + 'no-extra-boolean-cast': 0, + '@microsoft/spfx/no-require-ensure': 2 + } + }, + { + files: [ + '*.test.ts', + '*.test.tsx', + '*.spec.ts', + '*.spec.tsx', + '**/__mocks__/*.ts', + '**/__mocks__/*.tsx', + '**/__tests__/*.ts', + '**/__tests__/*.tsx', + '**/test/*.ts', + '**/test/*.tsx' + ], + rules: {} + } + ] +}; diff --git a/examples/copilot-component-minimal/.gitignore b/examples/copilot-component-minimal/.gitignore new file mode 100644 index 00000000..b0b3dd25 --- /dev/null +++ b/examples/copilot-component-minimal/.gitignore @@ -0,0 +1,33 @@ +# Logs +logs +*.log +npm-debug.log* + +# Dependency directories +node_modules + +# Build generated files +dist +lib +lib-dts +lib-commonjs +lib-esm +jest-output +release +solution +temp +*.sppkg +.heft +.spfx-scaffold.jsonl + +# Coverage directory used by tools like istanbul +coverage + +# OSX +.DS_Store + +# Visual Studio files +.ntvs_analysis.dat +.vs +bin +obj diff --git a/examples/copilot-component-minimal/.npmignore b/examples/copilot-component-minimal/.npmignore new file mode 100644 index 00000000..a2378457 --- /dev/null +++ b/examples/copilot-component-minimal/.npmignore @@ -0,0 +1,32 @@ +# Ignore everything by default +** + +# Use negative patterns to bring back the specific things we want to publish +!/bin/** +!/dist/** +!/EULA/** +!/lib/** +!/lib-*/** +!ThirdPartyNotice.txt + +# Ignore certain files in the above folders +/dist/*.stats.* +/dist/**/*.map +/lib/**/*.map +/lib/**/*.test.* +/lib/**/test/** +/lib-*/**/*.map +/lib-*/**/*.test.* +/lib-*/**/test/** + +# NOTE: These don't need to be specified, because NPM includes them automatically. +# +# package.json +# README (and its variants) +# CHANGELOG (and its variants) +# LICENSE / LICENCE + +## Project specific definitions +# ----------------------------- +/lib/**/integration-test/** +/lib/scripts/** \ No newline at end of file diff --git a/examples/copilot-component-minimal/README.md b/examples/copilot-component-minimal/README.md new file mode 100644 index 00000000..c48f3f13 --- /dev/null +++ b/examples/copilot-component-minimal/README.md @@ -0,0 +1,67 @@ +# @spfx-template/copilot-component-minimal + +## Summary + +Short summary on functionality and used technologies. + +[picture of the solution in action, if possible] + +## Used SharePoint Framework Version + +[![version](https://img.shields.io/badge/version-1.22.2-green.svg)](https://img.shields.io/badge/version-1.22.2-green.svg) + +## Applies to + +- [SharePoint Framework](https://aka.ms/spfx) +- [Microsoft 365 Copilot](https://learn.microsoft.com/copilot/microsoft-365/) + +> Get your own free development tenant by subscribing to [Microsoft 365 developer program](http://aka.ms/o365devprogram) + +## Prerequisites + +> Any special pre-requisites? + +## Solution + +| Solution | Author(s) | +| ----------- | ------------------------------------------------------- | +| folder name | Author details (name, company, twitter alias with link) | + +## Version history + +| Version | Date | Comments | +| ------- | ---------------- | --------------- | +| 1.0 | January 1, 2025 | Initial release | + +## Disclaimer + +**THIS CODE IS PROVIDED _AS IS_ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.** + +--- + +## Minimal Path to Awesome + +- Clone this repository +- Ensure that you are at the solution folder +- in the command-line run: + - `npm install -g @rushstack/heft` + - `npm install` + - `heft start` + +> Include any additional steps as needed. + +Other build commands can be listed using `heft --help`. + +## Features + +This Copilot Component renders a greeting card when invoked by Microsoft 365 Copilot. + +- Demonstrates the `BaseCopilotComponent` base class +- Uses Zod for properties schema (single source of truth for TypeScript types and JSON Schema) +- Includes a declarative agent manifest for Microsoft 365 Copilot + +## References + +- [Getting started with SharePoint Framework](https://docs.microsoft.com/sharepoint/dev/spfx/set-up-your-developer-tenant) +- [Microsoft 365 Copilot extensibility](https://learn.microsoft.com/copilot/microsoft-365/extensibility/) +- [Heft Documentation](https://heft.rushstack.io/) diff --git a/examples/copilot-component-minimal/config/config.json b/examples/copilot-component-minimal/config/config.json new file mode 100644 index 00000000..7edbd266 --- /dev/null +++ b/examples/copilot-component-minimal/config/config.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/config.2.0.schema.json", + "version": "2.0", + "bundles": { + "minimal-copilot-component": { + "components": [ + { + "entrypoint": "./lib/MinimalCopilotComponent.js", + "manifest": "./src/minimal-copilot-component.manifest.json" + } + ] + } + } +} diff --git a/examples/copilot-component-minimal/config/copilot-agent.json b/examples/copilot-component-minimal/config/copilot-agent.json new file mode 100644 index 00000000..331f54c9 --- /dev/null +++ b/examples/copilot-component-minimal/config/copilot-agent.json @@ -0,0 +1,11 @@ +{ + "$schema": "../node_modules/@microsoft/spfx-heft-plugins/lib-commonjs/plugins/copilotAgentPlugin/copilot-agent.schema.json", + + "agents": [ + { + "name": { "default": "Minimal Agent" }, + "description": { "default": "Minimal CopilotComponent Description" }, + "components": ["838638c8-36e9-53b5-a8c3-37a22b55fa22"] + } + ] +} diff --git a/examples/copilot-component-minimal/config/package-solution.json b/examples/copilot-component-minimal/config/package-solution.json new file mode 100644 index 00000000..7640b12d --- /dev/null +++ b/examples/copilot-component-minimal/config/package-solution.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/package-solution.schema.json", + "solution": { + "name": "@spfx-template/copilot-component-minimal-client-side-solution", + "id": "22222222-2222-2222-2222-222222222222", + "version": "1.0.0.0", + "includeClientSideAssets": true, + "skipFeatureDeployment": true, + "isDomainIsolated": false, + "developer": { + "name": "", + "websiteUrl": "", + "privacyUrl": "", + "termsOfUseUrl": "", + "mpnId": "Undefined-1.22.2" + }, + "metadata": { + "shortDescription": { + "default": "Minimal CopilotComponent Description" + }, + "longDescription": { + "default": "Minimal CopilotComponent Description" + }, + "screenshotPaths": [], + "videoUrl": "", + "categories": [] + }, + "features": [ + { + "title": "@spfx-template/copilot-component-minimal Feature", + "description": "The feature that activates elements of the @spfx-template/copilot-component-minimal solution.", + "id": "0371fe5a-40d6-5183-8b37-80b9120a6ce4", + "version": "1.0.0.0" + } + ] + }, + "paths": { + "zippedPackage": "solution/@spfx-template/copilot-component-minimal.sppkg" + } +} diff --git a/examples/copilot-component-minimal/config/rig.json b/examples/copilot-component-minimal/config/rig.json new file mode 100644 index 00000000..99e34318 --- /dev/null +++ b/examples/copilot-component-minimal/config/rig.json @@ -0,0 +1,7 @@ +{ + // The "rig.json" file directs tools to look for their config files in an external package. + // Documentation for this system: https://www.npmjs.com/package/@rushstack/rig-package + "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", + + "rigPackageName": "@microsoft/spfx-web-build-rig" +} diff --git a/examples/copilot-component-minimal/config/serve.json b/examples/copilot-component-minimal/config/serve.json new file mode 100644 index 00000000..3df493f0 --- /dev/null +++ b/examples/copilot-component-minimal/config/serve.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/spfx-serve.schema.json", + "port": 4321, + "https": true, + "serveConfigurations": { + "default": { + "pageUrl": "https://{tenantDomain}/" + } + } +} diff --git a/examples/copilot-component-minimal/copilot/ai-plugin.json b/examples/copilot-component-minimal/copilot/ai-plugin.json new file mode 100644 index 00000000..42c33b04 --- /dev/null +++ b/examples/copilot-component-minimal/copilot/ai-plugin.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://aka.ms/json-schemas/copilot-extensions/v2.1/plugin.schema.json", + "schema_version": "v2.4", + "namespace": "minimalagent", + "name_for_human": "Minimal Agent", + "description_for_human": "Minimal CopilotComponent Description", + "description_for_model": "Calls the MinimalCopilotComponent tool to render a personalized greeting card for the user.", + "contact_email": "publisher@contoso.com" +} diff --git a/examples/copilot-component-minimal/copilot/color.png b/examples/copilot-component-minimal/copilot/color.png new file mode 100644 index 0000000000000000000000000000000000000000..7cdf55b04655810e334cccfe1ac86fd89e625572 GIT binary patch literal 2106 zcmd5;Yc!i#7k(o~qE*DSwAE0w{Y;IDstG#AEd+I`RxfTTQKD{5(6kdJM(YwvdZ9|y zl+Kh;r3|K0lF{iX6JeB~L|luyBvc5A#V)j+3VTQv-hE$_QLMk zv3~~u0K42=F=xQY-gdYOc%B)FhJitq=;{{_06Vp|9n#BBmH_~4!42c!d!u-f?;Y`Y z9ofEo^@0ZP;!6LiK%4ZsD{BU&WA}UV9Np!sz0DVUobYWUdc9M%cXrRCKIidP@%1l8 z4|+ZIw3*!O3Hiyh6tmA<_XdZP(F|jzZ)&66hTP7K{IO%v;CoLQmab<_DVZss`I5|! zbQ9A>Ndc5!u&kL^aba7DP|Vh$rLO>zA>eBC@31IZB4qIOuleVgq{h|$%)FHaE9b2E5S_Xt#`%*kWoC?ST4D8yS*0Y&sA>QZn)( z_F3p;BUu{T)lT#v>O-uK&Wc!;#J@JBak|Ohfi;$Q2i3++mk2{?DM0b=1WASfS+S|7 z=;FJ93k@hxtmf_^%oy&IXDoZv`jkPfmNz$w%GKJZ z%S}z!6vEc3A6YKjnCZDj0}hJK>){r>hig>7(=}%{a89GRU7;Y1#7lVSUZif5-6g#m ziuB&w?vKIph1}69jWXYtgAKG);eOd|Ygq}!P_p{Kr1a(CV>Da%sLb+@3?vA^g;6T{ zH?V53qYER2XV;i$ul}t;<8;A`R_J8u_^HyG|ESY;vAq=?fr}?CKVKJ%dDj#b>4L9M zq|$#lHdtLF#Qat{>#EYj)8@|)QE(@*wz86^h&#E93)97aAA%Bn0^bT%wH%CC1!Fsu zi1s6Ig>#+Zjm7>gL$WqJri!Kl`I93(o^29|tj}}r*u4D+z>}9ewuD+~4AUodP`(&y7Zq>NOlokY> zjUYK|CP=7>b?CnM@(D*koo16t;i@1xKj&Qb^f3b3F?$?Z1Tfd5O2pHH2vOK07@X}B z;>;FZ#Q^G23Ce1U^U9j_6^-A7NSd&Kc{aXAFP&whl<7C9d){0ohqEEu$pbDxZUmT2 zMJbQnbpbD6SRj{yPG!u^+sPN?;elt>s7U__9MHI8SYi1d6w*T$3J;2dxAE9xEISz` z(-5hRRXpuh4iArN5`GjA6z@brd;HH3-T%NL0&b?6L>3<$$QoB zgux?M^|>yLYo+Xl;p;Jxo6S=WBs^5|?rh=$7p>s0HEPILaKD@^4qMY_P==>6bd3C* zs-vERdN>3fJA60Of50R_-kYPL^2`NrjI(X89Niubw@pYe2;6Og8%xgu4(9xS=6O6N zAnN)A&hgvGpd1$;Jakqx1SLdB?pqYNX1Oy0m-))*EL-=WyulU+4YIJQ&4V;N+?k(9 zo@n^O6BN|n>c%u-XUS!fsyD0C7sxSXV@zoPfqZp#p6G)&yXSlK!or4*w@P!IAxFME zbbE?Rq9v*JJ@oRUUOKiEb|P)GfbOQw@=JxHEarvt4czD>OJP=B%;1tr46Ns&*UVE-@54%wS literal 0 HcmV?d00001 diff --git a/examples/copilot-component-minimal/copilot/declarativeAgent.json b/examples/copilot-component-minimal/copilot/declarativeAgent.json new file mode 100644 index 00000000..bf8f61bc --- /dev/null +++ b/examples/copilot-component-minimal/copilot/declarativeAgent.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.5/schema.json", + "version": "v1.5", + "name": "Minimal Agent", + "description": "Minimal CopilotComponent Description", + "instructions": "$[file('instruction.txt')]", + "conversation_starters": [ + { + "title": "Greet me", + "text": "Greet me by name." + } + ], + "actions": [ + { + "id": "minimalAction", + "file": "ai-plugin.json" + } + ] +} diff --git a/examples/copilot-component-minimal/copilot/instruction.txt b/examples/copilot-component-minimal/copilot/instruction.txt new file mode 100644 index 00000000..bfeb59a7 --- /dev/null +++ b/examples/copilot-component-minimal/copilot/instruction.txt @@ -0,0 +1,5 @@ +You are the Minimal Agent — a minimal SPFx CopilotComponent deployed as a Microsoft 365 Copilot declarative agent. + +When the user asks to be greeted, call the MinimalCopilotComponent tool with the name the user provides (defaulting to "friend" if none is given). The tool renders a personalized greeting card in an iframe hosted by the SPFx MCP server. + +Keep responses short and friendly. Do not answer questions outside the greeting use case — politely say you are a simple sample agent focused on greetings and suggest the user try "Greet me by name". diff --git a/examples/copilot-component-minimal/copilot/manifest.json b/examples/copilot-component-minimal/copilot/manifest.json new file mode 100644 index 00000000..7b02eaf7 --- /dev/null +++ b/examples/copilot-component-minimal/copilot/manifest.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.24/MicrosoftTeams.schema.json", + "manifestVersion": "1.24", + "version": "1.0.0", + "id": "22222222-2222-2222-2222-222222222222", + "developer": { + "name": "Contoso", + "websiteUrl": "https://www.contoso.com", + "privacyUrl": "https://www.contoso.com/privacy", + "termsOfUseUrl": "https://www.contoso.com/terms" + }, + "icons": { + "color": "color.png", + "outline": "outline.png" + }, + "name": { + "short": "Minimal Agent", + "full": "Minimal Agent — SPFx CopilotComponent" + }, + "description": { + "short": "Minimal CopilotComponent Description", + "full": "Minimal CopilotComponent Description" + }, + "accentColor": "#FFFFFF", + "copilotAgents": { + "declarativeAgents": [ + { + "id": "minimalAgent", + "file": "declarativeAgent.json" + } + ] + }, + "permissions": ["identity"], + "validDomains": [] +} diff --git a/examples/copilot-component-minimal/copilot/outline.png b/examples/copilot-component-minimal/copilot/outline.png new file mode 100644 index 0000000000000000000000000000000000000000..e8cb4b6ba4f726d47a2e274f16b6069b9a8041cc GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG z%|CHbgX^da?eHs6`1kLARhjOac zf3;y1Iq~M{LLS3g_M2bU{+PBvomV=FH7$YTy5I%1<5B$=?>3fqI5P%5iajq7)W9SX p;gpazd1JnvZNlx8HB0WjVJ`J~Q+P@%pA+aZ22WQ%mvv4FO#n^cR9FB2 literal 0 HcmV?d00001 diff --git a/examples/copilot-component-minimal/package.json b/examples/copilot-component-minimal/package.json new file mode 100644 index 00000000..0e6ed561 --- /dev/null +++ b/examples/copilot-component-minimal/package.json @@ -0,0 +1,35 @@ +{ + "name": "@spfx-template/copilot-component-minimal", + "version": "0.0.1", + "private": true, + "engines": { + "node": ">=22.14.0 < 23.0.0" + }, + "scripts": { + "build": "heft test --clean --production && heft package-solution --production", + "start": "heft start --clean", + "clean": "heft clean", + "_phase:build": "heft run --only build -- --clean", + "_phase:test": "heft run --only test -- --clean", + "_phase:package-solution": "heft run --only package-solution -- --clean" + }, + "dependencies": { + "@microsoft/sp-copilot-component": "1.22.2", + "tslib": "2.3.1", + "zod": "3.25.75", + "zod-to-json-schema": "3.25.1" + }, + "devDependencies": { + "@microsoft/eslint-config-spfx": "1.22.2", + "@microsoft/eslint-plugin-spfx": "1.22.2", + "@microsoft/sp-module-interfaces": "1.22.2", + "@microsoft/spfx-web-build-rig": "1.22.2", + "@rushstack/eslint-config": "4.6.4", + "@rushstack/heft": "^1.2.9", + "@types/heft-jest": "^1.0.6", + "@types/webpack-env": "~1.15.2", + "@typescript-eslint/parser": "8.48.1", + "eslint": "8.57.1", + "typescript": "~5.8.3" + } +} diff --git a/examples/copilot-component-minimal/src/MinimalCopilotComponent.ts b/examples/copilot-component-minimal/src/MinimalCopilotComponent.ts new file mode 100644 index 00000000..1fb1bc8c --- /dev/null +++ b/examples/copilot-component-minimal/src/MinimalCopilotComponent.ts @@ -0,0 +1,9 @@ +import { BaseCopilotComponent } from '@microsoft/sp-copilot-component'; + +import type { IMinimalCopilotComponentProperties } from './MinimalProperties'; + +export default class MinimalCopilotComponent extends BaseCopilotComponent { + protected render(): void { + this.context.domElement.textContent = `Hello, ${this.properties.name}!`; + } +} diff --git a/examples/copilot-component-minimal/src/MinimalProperties.ts b/examples/copilot-component-minimal/src/MinimalProperties.ts new file mode 100644 index 00000000..32c0657a --- /dev/null +++ b/examples/copilot-component-minimal/src/MinimalProperties.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; +import { zodToJsonSchema } from 'zod-to-json-schema'; + +const minimalPropertiesSchema: z.ZodObject<{ name: z.ZodString }> = z.object({ + name: z.string().describe('The name of the person to greet.') +}); + +export type IMinimalCopilotComponentProperties = z.infer; + +export default zodToJsonSchema(minimalPropertiesSchema); diff --git a/examples/copilot-component-minimal/src/minimal-copilot-component.manifest.json b/examples/copilot-component-minimal/src/minimal-copilot-component.manifest.json new file mode 100644 index 00000000..93ac510c --- /dev/null +++ b/examples/copilot-component-minimal/src/minimal-copilot-component.manifest.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-component-manifest.schema.json", + + "id": "838638c8-36e9-53b5-a8c3-37a22b55fa22", + "alias": "MinimalCopilotComponent", + "componentType": "CopilotComponent", + "copilotType": "Ux", + "version": "*", + "manifestVersion": 2, + + "capabilities": { + "availableDisplayModes": ["inline"] + }, + + "tools": [ + { + "name": "Minimal", + "description": { + "default": "Minimal CopilotComponent Description" + }, + "propertiesSchema": { + "id": "$../lib/MinimalProperties.js:default;" + } + } + ] +} diff --git a/examples/copilot-component-minimal/tsconfig.json b/examples/copilot-component-minimal/tsconfig.json new file mode 100644 index 00000000..ee582d51 --- /dev/null +++ b/examples/copilot-component-minimal/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./node_modules/@microsoft/spfx-web-build-rig/profiles/default/tsconfig-base.json" +} diff --git a/templates/copilot-component-minimal/.eslintrc.js b/templates/copilot-component-minimal/.eslintrc.js new file mode 100644 index 00000000..7eecfadb --- /dev/null +++ b/templates/copilot-component-minimal/.eslintrc.js @@ -0,0 +1,148 @@ +require('@rushstack/eslint-config/patch/modern-module-resolution'); +module.exports = { + extends: ['@microsoft/eslint-config-spfx/lib/profiles/default'], + parserOptions: { tsconfigRootDir: __dirname }, + overrides: [ + { + files: ['*.ts', '*.tsx'], + parser: '@typescript-eslint/parser', + parserOptions: { + project: './tsconfig.json', + ecmaVersion: 2018, + sourceType: 'module' + }, + rules: { + '@rushstack/no-new-null': 1, + '@rushstack/hoist-jest-mock': 1, + '@rushstack/import-requires-chunk-name': 1, + '@rushstack/security/no-unsafe-regexp': 1, + '@typescript-eslint/adjacent-overload-signatures': 1, + '@typescript-eslint/explicit-function-return-type': [ + 1, + { + allowExpressions: true, + allowTypedFunctionExpressions: true, + allowHigherOrderFunctions: false + } + ], + '@typescript-eslint/explicit-member-accessibility': 0, + '@typescript-eslint/no-array-constructor': 1, + '@typescript-eslint/no-explicit-any': 1, + '@typescript-eslint/no-floating-promises': 2, + '@typescript-eslint/no-for-in-array': 2, + '@typescript-eslint/no-misused-new': 2, + '@typescript-eslint/no-namespace': [ + 1, + { + allowDeclarations: false, + allowDefinitionFiles: false + } + ], + '@typescript-eslint/parameter-properties': 0, + '@typescript-eslint/no-unused-vars': [ + 1, + { + vars: 'all', + args: 'none' + } + ], + '@typescript-eslint/no-use-before-define': [ + 2, + { + functions: false, + classes: true, + variables: true, + enums: true, + typedefs: true + } + ], + '@typescript-eslint/no-var-requires': 'error', + '@typescript-eslint/prefer-namespace-keyword': 1, + '@typescript-eslint/no-inferrable-types': 0, + '@typescript-eslint/no-empty-interface': 0, + 'accessor-pairs': 1, + 'dot-notation': [ + 1, + { + allowPattern: '^_' + } + ], + eqeqeq: 1, + 'for-direction': 1, + 'guard-for-in': 2, + 'max-lines': ['warn', { max: 2000 }], + 'no-async-promise-executor': 2, + 'no-caller': 2, + 'no-compare-neg-zero': 2, + 'no-cond-assign': 2, + 'no-constant-condition': 1, + 'no-control-regex': 2, + 'no-debugger': 1, + 'no-delete-var': 2, + 'no-duplicate-case': 2, + 'no-empty': 1, + 'no-empty-character-class': 2, + 'no-empty-pattern': 1, + 'no-eval': 1, + 'no-ex-assign': 2, + 'no-extend-native': 1, + 'no-extra-label': 1, + 'no-fallthrough': 2, + 'no-func-assign': 1, + 'no-implied-eval': 2, + 'no-invalid-regexp': 2, + 'no-label-var': 2, + 'no-lone-blocks': 1, + 'no-misleading-character-class': 2, + 'no-multi-str': 2, + 'no-new': 1, + 'no-new-func': 2, + 'no-new-object': 2, + 'no-new-wrappers': 1, + 'no-octal': 2, + 'no-octal-escape': 2, + 'no-regex-spaces': 2, + 'no-return-assign': 2, + 'no-script-url': 1, + 'no-self-assign': 2, + 'no-self-compare': 2, + 'no-sequences': 1, + 'no-shadow-restricted-names': 2, + 'no-sparse-arrays': 2, + 'no-throw-literal': 2, + 'no-unmodified-loop-condition': 1, + 'no-unsafe-finally': 2, + 'no-unused-expressions': 1, + 'no-unused-labels': 1, + 'no-useless-catch': 1, + 'no-useless-concat': 1, + 'no-var': 2, + 'no-void': 1, + 'no-with': 2, + 'prefer-const': 1, + 'promise/param-names': 2, + 'require-atomic-updates': 2, + 'require-yield': 1, + strict: [2, 'never'], + 'use-isnan': 2, + 'no-extra-boolean-cast': 0, + '@microsoft/spfx/no-require-ensure': 2 + } + }, + { + files: [ + '*.test.ts', + '*.test.tsx', + '*.spec.ts', + '*.spec.tsx', + '**/__mocks__/*.ts', + '**/__mocks__/*.tsx', + '**/__tests__/*.ts', + '**/__tests__/*.tsx', + '**/test/*.ts', + '**/test/*.tsx' + ], + rules: {} + } + ] +}; diff --git a/templates/copilot-component-minimal/.gitignore b/templates/copilot-component-minimal/.gitignore new file mode 100644 index 00000000..b0b3dd25 --- /dev/null +++ b/templates/copilot-component-minimal/.gitignore @@ -0,0 +1,33 @@ +# Logs +logs +*.log +npm-debug.log* + +# Dependency directories +node_modules + +# Build generated files +dist +lib +lib-dts +lib-commonjs +lib-esm +jest-output +release +solution +temp +*.sppkg +.heft +.spfx-scaffold.jsonl + +# Coverage directory used by tools like istanbul +coverage + +# OSX +.DS_Store + +# Visual Studio files +.ntvs_analysis.dat +.vs +bin +obj diff --git a/templates/copilot-component-minimal/.npmignore b/templates/copilot-component-minimal/.npmignore new file mode 100644 index 00000000..a2378457 --- /dev/null +++ b/templates/copilot-component-minimal/.npmignore @@ -0,0 +1,32 @@ +# Ignore everything by default +** + +# Use negative patterns to bring back the specific things we want to publish +!/bin/** +!/dist/** +!/EULA/** +!/lib/** +!/lib-*/** +!ThirdPartyNotice.txt + +# Ignore certain files in the above folders +/dist/*.stats.* +/dist/**/*.map +/lib/**/*.map +/lib/**/*.test.* +/lib/**/test/** +/lib-*/**/*.map +/lib-*/**/*.test.* +/lib-*/**/test/** + +# NOTE: These don't need to be specified, because NPM includes them automatically. +# +# package.json +# README (and its variants) +# CHANGELOG (and its variants) +# LICENSE / LICENCE + +## Project specific definitions +# ----------------------------- +/lib/**/integration-test/** +/lib/scripts/** \ No newline at end of file diff --git a/templates/copilot-component-minimal/README.md b/templates/copilot-component-minimal/README.md new file mode 100644 index 00000000..a7736ba0 --- /dev/null +++ b/templates/copilot-component-minimal/README.md @@ -0,0 +1,67 @@ +# <%= libraryName %> + +## Summary + +Short summary on functionality and used technologies. + +[picture of the solution in action, if possible] + +## Used SharePoint Framework Version + +[![version](https://img.shields.io/badge/version-<%= spfxVersionForBadgeUrl %>-green.svg)](https://img.shields.io/badge/version-<%= spfxVersionForBadgeUrl %>-green.svg) + +## Applies to + +- [SharePoint Framework](https://aka.ms/spfx) +- [Microsoft 365 Copilot](https://learn.microsoft.com/copilot/microsoft-365/) + +> Get your own free development tenant by subscribing to [Microsoft 365 developer program](http://aka.ms/o365devprogram) + +## Prerequisites + +> Any special pre-requisites? + +## Solution + +| Solution | Author(s) | +| ----------- | ------------------------------------------------------- | +| folder name | Author details (name, company, twitter alias with link) | + +## Version history + +| Version | Date | Comments | +| ------- | ---------------- | --------------- | +| 1.0 | January 1, 2025 | Initial release | + +## Disclaimer + +**THIS CODE IS PROVIDED _AS IS_ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.** + +--- + +## Minimal Path to Awesome + +- Clone this repository +- Ensure that you are at the solution folder +- in the command-line run: + - `npm install -g @rushstack/heft` + - `npm install` + - `heft start` + +> Include any additional steps as needed. + +Other build commands can be listed using `heft --help`. + +## Features + +This Copilot Component renders a greeting card when invoked by Microsoft 365 Copilot. + +- Demonstrates the `BaseCopilotComponent` base class +- Uses Zod for properties schema (single source of truth for TypeScript types and JSON Schema) +- Includes a declarative agent manifest for Microsoft 365 Copilot + +## References + +- [Getting started with SharePoint Framework](https://docs.microsoft.com/sharepoint/dev/spfx/set-up-your-developer-tenant) +- [Microsoft 365 Copilot extensibility](https://learn.microsoft.com/copilot/microsoft-365/extensibility/) +- [Heft Documentation](https://heft.rushstack.io/) diff --git a/templates/copilot-component-minimal/config/config.json b/templates/copilot-component-minimal/config/config.json new file mode 100644 index 00000000..45401909 --- /dev/null +++ b/templates/copilot-component-minimal/config/config.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/config.2.0.schema.json", + "version": "2.0", + "bundles": { + "<%= componentName.hyphen %>-copilot-component": { + "components": [ + { + "entrypoint": "./lib/<%= componentName.pascal %>CopilotComponent.js", + "manifest": "./src/<%= componentName.hyphen %>-copilot-component.manifest.json" + } + ] + } + } +} diff --git a/templates/copilot-component-minimal/config/copilot-agent.json b/templates/copilot-component-minimal/config/copilot-agent.json new file mode 100644 index 00000000..88a389c9 --- /dev/null +++ b/templates/copilot-component-minimal/config/copilot-agent.json @@ -0,0 +1,11 @@ +{ + "$schema": "../node_modules/@microsoft/spfx-heft-plugins/lib-commonjs/plugins/copilotAgentPlugin/copilot-agent.schema.json", + + "agents": [ + { + "name": { "default": "<%= componentName %> Agent" }, + "description": { "default": "<%= componentDescription %>" }, + "components": ["<%= componentId %>"] + } + ] +} diff --git a/templates/copilot-component-minimal/config/package-solution.json b/templates/copilot-component-minimal/config/package-solution.json new file mode 100644 index 00000000..85e86dfc --- /dev/null +++ b/templates/copilot-component-minimal/config/package-solution.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/package-solution.schema.json", + "solution": { + "name": "<%= libraryName %>-client-side-solution", + "id": "<%= solutionId %>", + "version": "1.0.0.0", + "includeClientSideAssets": true, + "skipFeatureDeployment": true, + "isDomainIsolated": false, + "developer": { + "name": "", + "websiteUrl": "", + "privacyUrl": "", + "termsOfUseUrl": "", + "mpnId": "Undefined-<%= spfxVersion %>" + }, + "metadata": { + "shortDescription": { + "default": "<%= componentDescription %>" + }, + "longDescription": { + "default": "<%= componentDescription %>" + }, + "screenshotPaths": [], + "videoUrl": "", + "categories": [] + }, + "features": [ + { + "title": "<%= libraryName %> Feature", + "description": "The feature that activates elements of the <%= libraryName %> solution.", + "id": "<%= featureId %>", + "version": "1.0.0.0" + } + ] + }, + "paths": { + "zippedPackage": "solution/<%= libraryName %>.sppkg" + } +} diff --git a/templates/copilot-component-minimal/config/rig.json b/templates/copilot-component-minimal/config/rig.json new file mode 100644 index 00000000..99e34318 --- /dev/null +++ b/templates/copilot-component-minimal/config/rig.json @@ -0,0 +1,7 @@ +{ + // The "rig.json" file directs tools to look for their config files in an external package. + // Documentation for this system: https://www.npmjs.com/package/@rushstack/rig-package + "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", + + "rigPackageName": "@microsoft/spfx-web-build-rig" +} diff --git a/templates/copilot-component-minimal/config/serve.json b/templates/copilot-component-minimal/config/serve.json new file mode 100644 index 00000000..3df493f0 --- /dev/null +++ b/templates/copilot-component-minimal/config/serve.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/spfx-serve.schema.json", + "port": 4321, + "https": true, + "serveConfigurations": { + "default": { + "pageUrl": "https://{tenantDomain}/" + } + } +} diff --git a/templates/copilot-component-minimal/copilot/ai-plugin.json b/templates/copilot-component-minimal/copilot/ai-plugin.json new file mode 100644 index 00000000..9019f93f --- /dev/null +++ b/templates/copilot-component-minimal/copilot/ai-plugin.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://aka.ms/json-schemas/copilot-extensions/v2.1/plugin.schema.json", + "schema_version": "v2.4", + "namespace": "<%= componentName.camel %>agent", + "name_for_human": "<%= componentName %> Agent", + "description_for_human": "<%= componentDescription %>", + "description_for_model": "Calls the <%= componentName.pascal %>CopilotComponent tool to render a personalized greeting card for the user.", + "contact_email": "publisher@contoso.com" +} diff --git a/templates/copilot-component-minimal/copilot/color.png b/templates/copilot-component-minimal/copilot/color.png new file mode 100644 index 0000000000000000000000000000000000000000..7cdf55b04655810e334cccfe1ac86fd89e625572 GIT binary patch literal 2106 zcmd5;Yc!i#7k(o~qE*DSwAE0w{Y;IDstG#AEd+I`RxfTTQKD{5(6kdJM(YwvdZ9|y zl+Kh;r3|K0lF{iX6JeB~L|luyBvc5A#V)j+3VTQv-hE$_QLMk zv3~~u0K42=F=xQY-gdYOc%B)FhJitq=;{{_06Vp|9n#BBmH_~4!42c!d!u-f?;Y`Y z9ofEo^@0ZP;!6LiK%4ZsD{BU&WA}UV9Np!sz0DVUobYWUdc9M%cXrRCKIidP@%1l8 z4|+ZIw3*!O3Hiyh6tmA<_XdZP(F|jzZ)&66hTP7K{IO%v;CoLQmab<_DVZss`I5|! zbQ9A>Ndc5!u&kL^aba7DP|Vh$rLO>zA>eBC@31IZB4qIOuleVgq{h|$%)FHaE9b2E5S_Xt#`%*kWoC?ST4D8yS*0Y&sA>QZn)( z_F3p;BUu{T)lT#v>O-uK&Wc!;#J@JBak|Ohfi;$Q2i3++mk2{?DM0b=1WASfS+S|7 z=;FJ93k@hxtmf_^%oy&IXDoZv`jkPfmNz$w%GKJZ z%S}z!6vEc3A6YKjnCZDj0}hJK>){r>hig>7(=}%{a89GRU7;Y1#7lVSUZif5-6g#m ziuB&w?vKIph1}69jWXYtgAKG);eOd|Ygq}!P_p{Kr1a(CV>Da%sLb+@3?vA^g;6T{ zH?V53qYER2XV;i$ul}t;<8;A`R_J8u_^HyG|ESY;vAq=?fr}?CKVKJ%dDj#b>4L9M zq|$#lHdtLF#Qat{>#EYj)8@|)QE(@*wz86^h&#E93)97aAA%Bn0^bT%wH%CC1!Fsu zi1s6Ig>#+Zjm7>gL$WqJri!Kl`I93(o^29|tj}}r*u4D+z>}9ewuD+~4AUodP`(&y7Zq>NOlokY> zjUYK|CP=7>b?CnM@(D*koo16t;i@1xKj&Qb^f3b3F?$?Z1Tfd5O2pHH2vOK07@X}B z;>;FZ#Q^G23Ce1U^U9j_6^-A7NSd&Kc{aXAFP&whl<7C9d){0ohqEEu$pbDxZUmT2 zMJbQnbpbD6SRj{yPG!u^+sPN?;elt>s7U__9MHI8SYi1d6w*T$3J;2dxAE9xEISz` z(-5hRRXpuh4iArN5`GjA6z@brd;HH3-T%NL0&b?6L>3<$$QoB zgux?M^|>yLYo+Xl;p;Jxo6S=WBs^5|?rh=$7p>s0HEPILaKD@^4qMY_P==>6bd3C* zs-vERdN>3fJA60Of50R_-kYPL^2`NrjI(X89Niubw@pYe2;6Og8%xgu4(9xS=6O6N zAnN)A&hgvGpd1$;Jakqx1SLdB?pqYNX1Oy0m-))*EL-=WyulU+4YIJQ&4V;N+?k(9 zo@n^O6BN|n>c%u-XUS!fsyD0C7sxSXV@zoPfqZp#p6G)&yXSlK!or4*w@P!IAxFME zbbE?Rq9v*JJ@oRUUOKiEb|P)GfbOQw@=JxHEarvt4czD>OJP=B%;1tr46Ns&*UVE-@54%wS literal 0 HcmV?d00001 diff --git a/templates/copilot-component-minimal/copilot/declarativeAgent.json b/templates/copilot-component-minimal/copilot/declarativeAgent.json new file mode 100644 index 00000000..38091ec5 --- /dev/null +++ b/templates/copilot-component-minimal/copilot/declarativeAgent.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.5/schema.json", + "version": "v1.5", + "name": "<%= componentName %> Agent", + "description": "<%= componentDescription %>", + "instructions": "$[file('instruction.txt')]", + "conversation_starters": [ + { + "title": "Greet me", + "text": "Greet me by name." + } + ], + "actions": [ + { + "id": "<%= componentName.camel %>Action", + "file": "ai-plugin.json" + } + ] +} diff --git a/templates/copilot-component-minimal/copilot/instruction.txt b/templates/copilot-component-minimal/copilot/instruction.txt new file mode 100644 index 00000000..6c5945dc --- /dev/null +++ b/templates/copilot-component-minimal/copilot/instruction.txt @@ -0,0 +1,5 @@ +You are the <%= componentName %> Agent — a minimal SPFx CopilotComponent deployed as a Microsoft 365 Copilot declarative agent. + +When the user asks to be greeted, call the <%= componentName.pascal %>CopilotComponent tool with the name the user provides (defaulting to "friend" if none is given). The tool renders a personalized greeting card in an iframe hosted by the SPFx MCP server. + +Keep responses short and friendly. Do not answer questions outside the greeting use case — politely say you are a simple sample agent focused on greetings and suggest the user try "Greet me by name". diff --git a/templates/copilot-component-minimal/copilot/manifest.json b/templates/copilot-component-minimal/copilot/manifest.json new file mode 100644 index 00000000..b14a6fd9 --- /dev/null +++ b/templates/copilot-component-minimal/copilot/manifest.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.24/MicrosoftTeams.schema.json", + "manifestVersion": "1.24", + "version": "1.0.0", + "id": "<%= solutionId %>", + "developer": { + "name": "Contoso", + "websiteUrl": "https://www.contoso.com", + "privacyUrl": "https://www.contoso.com/privacy", + "termsOfUseUrl": "https://www.contoso.com/terms" + }, + "icons": { + "color": "color.png", + "outline": "outline.png" + }, + "name": { + "short": "<%= componentName %> Agent", + "full": "<%= componentName %> Agent — SPFx CopilotComponent" + }, + "description": { + "short": "<%= componentDescription %>", + "full": "<%= componentDescription %>" + }, + "accentColor": "#FFFFFF", + "copilotAgents": { + "declarativeAgents": [ + { + "id": "<%= componentName.camel %>Agent", + "file": "declarativeAgent.json" + } + ] + }, + "permissions": ["identity"], + "validDomains": [] +} diff --git a/templates/copilot-component-minimal/copilot/outline.png b/templates/copilot-component-minimal/copilot/outline.png new file mode 100644 index 0000000000000000000000000000000000000000..e8cb4b6ba4f726d47a2e274f16b6069b9a8041cc GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG z%|CHbgX^da?eHs6`1kLARhjOac zf3;y1Iq~M{LLS3g_M2bU{+PBvomV=FH7$YTy5I%1<5B$=?>3fqI5P%5iajq7)W9SX p;gpazd1JnvZNlx8HB0WjVJ`J~Q+P@%pA+aZ22WQ%mvv4FO#n^cR9FB2 literal 0 HcmV?d00001 diff --git a/templates/copilot-component-minimal/package.json b/templates/copilot-component-minimal/package.json new file mode 100644 index 00000000..6908f416 --- /dev/null +++ b/templates/copilot-component-minimal/package.json @@ -0,0 +1,35 @@ +{ + "name": "<%= libraryName %>", + "version": "0.0.1", + "private": true, + "engines": { + "node": ">=22.14.0 < 23.0.0" + }, + "scripts": { + "build": "heft test --clean --production && heft package-solution --production", + "start": "heft start --clean", + "clean": "heft clean", + "_phase:build": "heft run --only build -- --clean", + "_phase:test": "heft run --only test -- --clean", + "_phase:package-solution": "heft run --only package-solution -- --clean" + }, + "dependencies": { + "@microsoft/sp-copilot-component": "<%= spfxVersion %>", + "tslib": "2.3.1", + "zod": "3.25.75", + "zod-to-json-schema": "3.25.1" + }, + "devDependencies": { + "@microsoft/eslint-config-spfx": "<%= spfxVersion %>", + "@microsoft/eslint-plugin-spfx": "<%= spfxVersion %>", + "@microsoft/sp-module-interfaces": "<%= spfxVersion %>", + "@microsoft/spfx-web-build-rig": "<%= spfxVersion %>", + "@rushstack/eslint-config": "4.6.4", + "@rushstack/heft": "^1.2.9", + "@types/heft-jest": "^1.0.6", + "@types/webpack-env": "~1.15.2", + "@typescript-eslint/parser": "8.48.1", + "eslint": "8.57.1", + "typescript": "~5.8.3" + } +} diff --git a/templates/copilot-component-minimal/src/{componentName.hyphen}-copilot-component.manifest.json b/templates/copilot-component-minimal/src/{componentName.hyphen}-copilot-component.manifest.json new file mode 100644 index 00000000..8bcba082 --- /dev/null +++ b/templates/copilot-component-minimal/src/{componentName.hyphen}-copilot-component.manifest.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-component-manifest.schema.json", + + "id": "<%= componentId %>", + "alias": "<%= componentAlias %>CopilotComponent", + "componentType": "CopilotComponent", + "copilotType": "Ux", + "version": "*", + "manifestVersion": 2, + + "capabilities": { + "availableDisplayModes": ["inline"] + }, + + "tools": [ + { + "name": "<%= componentName.pascal %>", + "description": { + "default": "<%= componentDescription %>" + }, + "propertiesSchema": { + "id": "$../lib/<%= componentName.pascal %>Properties.js:default;" + } + } + ] +} diff --git a/templates/copilot-component-minimal/src/{componentName.pascal}CopilotComponent.ts b/templates/copilot-component-minimal/src/{componentName.pascal}CopilotComponent.ts new file mode 100644 index 00000000..cee61ec7 --- /dev/null +++ b/templates/copilot-component-minimal/src/{componentName.pascal}CopilotComponent.ts @@ -0,0 +1,9 @@ +import { BaseCopilotComponent } from '@microsoft/sp-copilot-component'; + +import type { I<%= componentName.pascal %>CopilotComponentProperties } from './<%= componentName.pascal %>Properties'; + +export default class <%= componentName.pascal %>CopilotComponent extends BaseCopilotComponentCopilotComponentProperties> { + protected render(): void { + this.context.domElement.textContent = `Hello, ${this.properties.name}!`; + } +} diff --git a/templates/copilot-component-minimal/src/{componentName.pascal}Properties.ts b/templates/copilot-component-minimal/src/{componentName.pascal}Properties.ts new file mode 100644 index 00000000..89b09936 --- /dev/null +++ b/templates/copilot-component-minimal/src/{componentName.pascal}Properties.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; +import { zodToJsonSchema } from 'zod-to-json-schema'; + +const <%= componentName.camel %>PropertiesSchema: z.ZodObject<{ name: z.ZodString }> = z.object({ + name: z.string().describe('The name of the person to greet.') +}); + +export type I<%= componentName.pascal %>CopilotComponentProperties = z.inferPropertiesSchema>; + +export default zodToJsonSchema(<%= componentName.camel %>PropertiesSchema); diff --git a/templates/copilot-component-minimal/template.json b/templates/copilot-component-minimal/template.json new file mode 100644 index 00000000..0756d03e --- /dev/null +++ b/templates/copilot-component-minimal/template.json @@ -0,0 +1,7 @@ +{ + "name": "copilot-component-minimal", + "category": "copilot", + "description": "A minimal Copilot Component template (no framework) for SPFx", + "version": "0.0.1", + "spfxVersion": "1.22.2" +} diff --git a/templates/copilot-component-minimal/tsconfig.json b/templates/copilot-component-minimal/tsconfig.json new file mode 100644 index 00000000..ee582d51 --- /dev/null +++ b/templates/copilot-component-minimal/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./node_modules/@microsoft/spfx-web-build-rig/profiles/default/tsconfig-base.json" +} diff --git a/tests/spfx-template-test/src/tests/__snapshots__/multi-component.test.ts.snap b/tests/spfx-template-test/src/tests/__snapshots__/multi-component.test.ts.snap index c9cd57fe..9f258a0f 100644 --- a/tests/spfx-template-test/src/tests/__snapshots__/multi-component.test.ts.snap +++ b/tests/spfx-template-test/src/tests/__snapshots__/multi-component.test.ts.snap @@ -165,7 +165,7 @@ Object { exports[`Multi-component scaffolding should scaffold webpart-minimal then extension-application-customizer into same directory: stdout 1`] = ` "Adding local template source: -Found 17 templates: +Found 18 templates: [gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] [gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] @@ -180,6 +180,8 @@ Found 17 templates: [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] @@ -236,7 +238,7 @@ targetDir: exports[`Multi-component scaffolding should scaffold webpart-minimal then extension-application-customizer into same directory: stdout 2`] = ` "Adding local template source: -Found 17 templates: +Found 18 templates: [gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] [gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] @@ -251,6 +253,8 @@ Found 17 templates: [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] diff --git a/tests/spfx-template-test/src/tests/__snapshots__/templates.test.ts.snap b/tests/spfx-template-test/src/tests/__snapshots__/templates.test.ts.snap index 5a90e3da..2eb73983 100644 --- a/tests/spfx-template-test/src/tests/__snapshots__/templates.test.ts.snap +++ b/tests/spfx-template-test/src/tests/__snapshots__/templates.test.ts.snap @@ -2,7 +2,7 @@ exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold ace-data-visualization template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: +Found 18 templates: [gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] [gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] @@ -17,6 +17,8 @@ Found 17 templates: [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] @@ -75,7 +77,7 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold ace-generic-card template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: +Found 18 templates: [gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] [gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] @@ -90,6 +92,8 @@ Found 17 templates: [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] @@ -148,7 +152,7 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold ace-generic-image-card template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: +Found 18 templates: [gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] [gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] @@ -163,6 +167,8 @@ Found 17 templates: [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] @@ -221,7 +227,7 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold ace-generic-primarytext-card template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: +Found 18 templates: [gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] [gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] @@ -236,6 +242,8 @@ Found 17 templates: [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] @@ -294,7 +302,7 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold ace-search-card template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: +Found 18 templates: [gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] [gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] @@ -309,6 +317,8 @@ Found 17 templates: [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] @@ -365,9 +375,79 @@ targetDir: " `; +exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold copilot-component-minimal template and match example output: stdout 1`] = ` +"Adding local template source: +Found 18 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴──────────────[default][gray]┴───────┘[default] +targetDir: + +[cyan]The following files will be generated:[default] +[green] .eslintrc.js[default] +[green] .gitignore[default] +[green] .npmignore[default] +[green] README.md[default] +[green] config/config.json[default] +[green] config/copilot-agent.json[default] +[green] config/package-solution.json[default] +[green] config/rig.json[default] +[green] config/serve.json[default] +[green] copilot/ai-plugin.json[default] +[green] copilot/color.png[default] +[green] copilot/declarativeAgent.json[default] +[green] copilot/instruction.txt[default] +[green] copilot/manifest.json[default] +[green] copilot/outline.png[default] +[green] package.json[default] +[green] src/MinimalCopilotComponent.ts[default] +[green] src/MinimalProperties.ts[default] +[green] src/minimal-copilot-component.manifest.json[default] +[green] tsconfig.json[default] + +" +`; + exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold extension-application-customizer template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: +Found 18 templates: [gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] [gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] @@ -382,6 +462,8 @@ Found 17 templates: [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] @@ -437,7 +519,7 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold extension-fieldcustomizer-minimal template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: +Found 18 templates: [gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] [gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] @@ -452,6 +534,8 @@ Found 17 templates: [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] @@ -507,7 +591,7 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold extension-fieldcustomizer-noframework template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: +Found 18 templates: [gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] [gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] @@ -522,6 +606,8 @@ Found 17 templates: [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] @@ -577,7 +663,7 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold extension-fieldcustomizer-react template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: +Found 18 templates: [gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] [gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] @@ -592,6 +678,8 @@ Found 17 templates: [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] @@ -648,7 +736,7 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold extension-formcustomizer-noframework template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: +Found 18 templates: [gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] [gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] @@ -663,6 +751,8 @@ Found 17 templates: [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] @@ -717,7 +807,7 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold extension-formcustomizer-react template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: +Found 18 templates: [gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] [gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] @@ -732,6 +822,8 @@ Found 17 templates: [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] @@ -785,7 +877,7 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold extension-listviewcommandset template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: +Found 18 templates: [gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] [gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] @@ -800,6 +892,8 @@ Found 17 templates: [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] @@ -857,7 +951,7 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold extension-search-query-modifier template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: +Found 18 templates: [gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] [gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] @@ -872,6 +966,8 @@ Found 17 templates: [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] @@ -927,7 +1023,7 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold library template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: +Found 18 templates: [gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] [gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] @@ -942,6 +1038,8 @@ Found 17 templates: [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] @@ -1014,7 +1112,7 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold webpart-minimal template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: +Found 18 templates: [gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] [gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] @@ -1029,6 +1127,8 @@ Found 17 templates: [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] @@ -1085,7 +1185,7 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold webpart-noframework template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: +Found 18 templates: [gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] [gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] @@ -1100,6 +1200,8 @@ Found 17 templates: [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] @@ -1159,7 +1261,7 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold webpart-react template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: +Found 18 templates: [gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] [gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] @@ -1174,6 +1276,8 @@ Found 17 templates: [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 25 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] [gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] [gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.22.2 [gray]│[default] 22 [gray]│[default] diff --git a/tests/spfx-template-test/src/tests/templates.test.ts b/tests/spfx-template-test/src/tests/templates.test.ts index 42147bf5..0b9ed74b 100644 --- a/tests/spfx-template-test/src/tests/templates.test.ts +++ b/tests/spfx-template-test/src/tests/templates.test.ts @@ -189,6 +189,15 @@ const TEMPLATE_CONFIGS: ITemplateConfig[] = [ componentName: 'Minimal', componentAlias: 'Minimal', componentDescription: 'Minimal Web Part Description' + }, + { + libraryName: '@spfx-template/copilot-component-minimal', + templateName: 'copilot-component-minimal', + templatePath: `${REPO_ROOT}/templates/copilot-component-minimal`, + localTemplatePath: TEMPLATES_DIR, + componentName: 'Minimal', + componentAlias: 'Minimal', + componentDescription: 'Minimal CopilotComponent Description' } ];