Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
"version": "node ./scripts/versionScript.js",
"build": "node ./node_modules/typescript/lib/tsc.js && npm run config-schema && npm run build:mcp",
"build:mcp": "cd packages/igniteui-mcp/igniteui-doc-mcp && npx tsc && npx tsx scripts/build.ts",
"build:update-skills": "npx tsx scripts/update-skills.ts",
"build-pack": "node ./node_modules/typescript/lib/tsc.js -p tsconfig-pack.json && npm run config-schema && npm run build:mcp",
"pretest": "npm run lint && npm run build",
"test": "nyc npm run jasmine",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# LLM Agent Skills for Ignite UI for React

This directory contains skills for GitHub Copilot and other LLM agents to help developers use **Ignite UI for React** effectively in their applications.

## What are Skills?

Skills are structured instructions that help AI agents understand and execute common tasks consistently. Each skill is a self-contained guide that provides step-by-step instructions, code examples, and best practices — all specific to React and the `igniteui-react` family of packages.

## Available Skills

| Skill | Description | Use When |
| --- | --- | --- |
| [igniteui-react-components](./igniteui-react-components/SKILL.md) | Identify the right React components (`Igr*`) for a UI pattern, then install, import, and use them — JSX patterns, events, refs, forms | Choosing components or setting up and using them in React |
| [igniteui-react-customize-theme](./igniteui-react-customize-theme/SKILL.md) | Customize styling using CSS custom properties, Sass, and the theming system in a React context | Applying custom brand colors/styles |
| [igniteui-react-optimize-bundle-size](./igniteui-react-optimize-bundle-size/SKILL.md) | Reduce bundle size with granular imports, tree-shaking, and lazy loading | Optimizing production performance |

## How to Use

When working with an AI agent like GitHub Copilot, reference skills by name or ask questions naturally:

### Natural Questions

- "How do I add a data grid to my React app?"
- "What Ignite UI component should I use for a date picker?"
- "Help me customize the button colors to match my brand"
- "My bundle size is too large, how can I reduce it?"
- "How do I handle events on IgrCombo?"

### Direct Skill Reference

- "Follow the igniteui-react-components skill for setting up my project"
- "Use the igniteui-react-customize-theme skill to help me style components"
- "Apply the igniteui-react-optimize-bundle-size skill to reduce my bundle"

## Skill Structure

Each skill contains:

- **Example Usage**: Common questions or scenarios
- **When to Use**: Situations where the skill applies
- **Related Skills**: Other relevant skills to explore
- **Step-by-Step Instructions**: Detailed guidance with code examples
- **Common Issues & Solutions**: Troubleshooting guidance
- **Best Practices**: Recommended approaches
- **Additional Resources**: Further reading and documentation

## Editor / Agent Setup

Most modern AI assistants (GitHub Copilot, Cursor, Windsurf, Claude Code, etc.) should auto-discover these skills from a specified location in the workspace or global profile.

For example, you can copy them into the agent-specific skills folder for your editor:

### GitHub Copilot

Copy the skill files into your project's `.agents/skills/` directory:

```
.agents/
skills/
igniteui-react-components/
SKILL.md
reference/
igniteui-react-customize-theme/
SKILL.md
reference/
igniteui-react-optimize-bundle-size/
SKILL.md
```

### Claude Code

Copy the skill files into your project's `.claude/skills/` directory:

```
.claude/
skills/
igniteui-react-components/
SKILL.md
reference/
igniteui-react-customize-theme/
SKILL.md
reference/
igniteui-react-optimize-bundle-size/
SKILL.md
```

### Other Agents (Cursor, Windsurf, etc.)

Consult your agent's documentation for the correct skills directory path and copy the skill files there. The skill structure is agent-agnostic — any assistant that supports skill files can use them directly.
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ export default function MasterView() {

return (
<div className={styles['grid-lite']}>
<IgrGridLite data={northwindCustomers} />
<IgrGridLite data={northwindCustomers} autoGenerate={true} />
</div>
);
}
Expand All @@ -120,8 +120,80 @@ export default function MasterView() {
/* master-view.module.css */
.grid-lite {
min-width: 400px;
min-height: 220px;
height: 600px;
flex-grow: 1;
flex-basis: 0;
}
```

## Grid Lite Example with Column Configurations and Templates

Use `IgrGridLiteColumn` to define columns explicitly with typed `dataType` and optional `cellTemplate` for custom rendering. Set `autoGenerate={false}` (or omit it) when providing explicit columns.

```tsx
import { IgrGridLite, IgrGridLiteColumn, type IgrCellContext } from 'igniteui-react/grid-lite';
import styles from './order-list.module.css';

interface Order {
id: number;
customer: string;
total: number;
date: Date;
status: 'pending' | 'shipped' | 'delivered';
}

const orders: Order[] = [
{ id: 1, customer: 'Alice', total: 149.99, date: new Date('2024-03-01'), status: 'delivered' },
{ id: 2, customer: 'Bob', total: 89.50, date: new Date('2024-03-10'), status: 'shipped' },
{ id: 3, customer: 'Carol', total: 220.00, date: new Date('2024-03-15'), status: 'pending' },
];

// Simple cell templates — render JSX based on the cell value or row data
const currencyTemplate = (ctx: IgrCellContext<Order>) => (
<span>${(ctx.value as number).toFixed(2)}</span>
);

const dateTemplate = (ctx: IgrCellContext<Order>) => (
<span>${(ctx.value as Date).toLocaleDateString()}</span>
Comment thread
Marina-L-Stoyanova marked this conversation as resolved.
);

const statusTemplate = (ctx: IgrCellContext<Order>) => {
const colors: Record<Order['status'], string> = {
pending: 'orange',
shipped: 'blue',
delivered: 'green',
};
return <span style={{ color: colors[ctx.value as Order['status']] }}>{ctx.value}</span>;
};

export default function OrderList() {
return (
<div className={styles['grid-lite']}>
<IgrGridLite data={orders}>
{/* dataType ensures correct sorting and filtering behavior */}
<IgrGridLiteColumn field="id" dataType="number" />
<IgrGridLiteColumn field="customer" dataType="string" />
{/* Columns with custom cell templates */}
<IgrGridLiteColumn field="date" cellTemplate={dateTemplate} />
<IgrGridLiteColumn field="total" dataType="number" cellTemplate={currencyTemplate} />
<IgrGridLiteColumn field="status" dataType="string" cellTemplate={statusTemplate} />
</IgrGridLite>
</div>
);
}
```

```css
/* order-list.module.css */
.grid-lite {
min-width: 400px;
height: 600px;
flex-grow: 1;
flex-basis: 0;
}
```

> **Column configuration notes:**
> - `dataType` accepts `"string"` (default), `"number"`, `"boolean"` — set it explicitly so sorting and filtering work correctly for each column type.
> - `cellTemplate` receives an `IgrCellContext<T>` where `ctx.value` is the cell value and `ctx.row.data` is the full row object.
> - When using `cellTemplate`, define the function outside the component (or memoize it) to avoid unnecessary re-renders.
Original file line number Diff line number Diff line change
Expand Up @@ -49,24 +49,27 @@ function MyPage() {

## Uncontrolled Components

`igniteui-react` Inputs integrate with the native form handling through Element internals, allowing to take advantage of the native state management adn validation to create intuitive, straight-forward forms:
`igniteui-react` Form elements like Inputs, Select, Checkbox, etc., integrate with the native form handling through Element internals, allowing to take advantage of the native state management and validation to create intuitive, straightforward forms. Use the `name` attribute to register the field value with `FormData`:

```tsx
import { useRef } from 'react';
import { IgrInput, IgrButton } from 'igniteui-react';
import { IgrInput, IgrSelect, IgrSelectItem, IgrButton } from 'igniteui-react';

function SimpleForm() {
const nameRef = useRef<IgrInput>(null);

const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
// e.preventDefault(); // optionally prevent default submit form custom handling
const handleSubmit = (e: React.SubmitEvent<HTMLFormElement>) => {
// e.preventDefault(); // optionally prevent default submit for custom handling
const formData = new FormData(e.target);
Comment thread
Marina-L-Stoyanova marked this conversation as resolved.
console.log(formData.get('name')); // input value
console.log(formData.get('role')); // selected option value
};

return (
<form onSubmit={handleSubmit}>
<IgrInput name="name" label="Name" required={true} />
<IgrInput name="description" label="description" minLength={0}>
<IgrSelect name="role" label="Role" required={true}>
<IgrSelectItem value="user">User</IgrSelectItem>
<IgrSelectItem value="admin">Admin</IgrSelectItem>
<IgrSelectItem value="editor">Editor</IgrSelectItem>
</IgrSelect>
<IgrButton type="submit">
<span>Submit</span>
</IgrButton>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# LLM Agent Skills for End Users

This directory contains skills for GitHub Copilot and other LLM agents to help developers use Ignite UI Web Components effectively in their applications.

## What are Skills?

Skills are structured instructions that help AI agents understand and execute common tasks consistently. Each skill is a self-contained guide that provides step-by-step instructions, code examples, and best practices.

## Available Skills

| Skill | Description | Use When |
| ----------------------------------------------------------- | ---------------------------------------------------------------------------------- | ------------------------------------- |
| [igniteui-wc-choose-components](./igniteui-wc-choose-components/SKILL.md) | Identify the right components for a UI pattern and navigate to official docs/demos | Deciding which components to use |
| [igniteui-wc-integrate-with-framework](./igniteui-wc-integrate-with-framework/SKILL.md) | Integrate components into React, Angular, Vue, or vanilla JS applications | Setting up components in your project |
| [igniteui-wc-customize-component-theme](./igniteui-wc-customize-component-theme/SKILL.md) | Customize styling using CSS custom properties, parts, and theming system | Applying custom brand colors/styles |
| [igniteui-wc-optimize-bundle-size](./igniteui-wc-optimize-bundle-size/SKILL.md) | Reduce bundle size by importing only needed components and lazy loading | Optimizing production performance |

## How to Use

When working with an AI agent like GitHub Copilot, reference skills by name or ask questions naturally:

### Natural Questions
- "How do I integrate igniteui-webcomponents with React?"
- "Help me customize the button colors to match my brand"
- "My bundle size is too large, how can I reduce it?"
- "Show me how to use these components in Vue"

### Direct Skill Reference
- "Follow the integrate-with-framework skill for my Angular app"
- "Use the customize-component-theme skill to help me style components"
- "Apply the optimize-bundle-size skill to reduce my bundle"

## Skill Structure

Each skill contains:

- **Example Usage**: Common questions or scenarios
- **When to Use**: Situations where the skill applies
- **Related Skills**: Other relevant skills to explore
- **Step-by-Step Instructions**: Detailed guidance with code examples
- **Framework-Specific Examples**: React, Angular, Vue, and vanilla JS patterns
- **Common Issues & Solutions**: Troubleshooting guidance
- **Best Practices**: Recommended approaches
- **Additional Resources**: Further reading and documentation

## Contributing

If you identify gaps in the skills or have suggestions for improvements:

1. [Open an issue](https://github.com/IgniteUI/igniteui-webcomponents/issues) describing the improvement
2. Submit a pull request with the proposed changes
3. Follow the skill format and structure of existing skills

For skills related to **contributing to the library itself** (creating components, reviewing PRs, etc.), see [`.github/skills/`](../.github/skills/).
Comment thread
Marina-L-Stoyanova marked this conversation as resolved.

## Additional Resources

- [Component Documentation](https://igniteui.github.io/igniteui-webcomponents)
- [Project README](../README.md)
- [Code Examples & Storybook](https://igniteui.github.io/igniteui-webcomponents)
- [GitHub Repository](https://github.com/IgniteUI/igniteui-webcomponents)

## License

These skills are provided under the same license as the Ignite UI Web Components library. See [LICENSE](../LICENSE) for details.
Comment thread
Marina-L-Stoyanova marked this conversation as resolved.
Submodule igniteui-react updated 34 files
+66 −6 .azure-pipelines/artifacts/README_Components.md
+33 −5 .azure-pipelines/artifacts/README_DockManager.md
+42 −12 .azure-pipelines/artifacts/README_Grids.md
+12 −0 .azure-pipelines/release.yml
+203 −0 .github/CONTRIBUTING.md
+2 −1 .github/ISSUE_TEMPLATE/bug_report.md
+2 −1 .github/ISSUE_TEMPLATE/feature_request.md
+16 −0 .github/PULL_REQUEST_TEMPLATE.md
+13 −13 .github/workflows/stale.yml
+128 −0 CODE_OF_CONDUCT.md
+20 −3 README.md
+87 −0 SECURITY.md
+32 −34 package-lock.json
+5 −5 package.json
+6 −1 scripts/build-wc.ts
+2 −2 scripts/components.package.json
+1 −1 scripts/dock-manager.package.json
+89 −0 skills/README.md
+161 −0 skills/igniteui-react-components/SKILL.md
+199 −0 skills/igniteui-react-components/reference/CHARTS-GRIDS.md
+301 −0 skills/igniteui-react-components/reference/COMPONENT-CATALOGUE.md
+70 −0 skills/igniteui-react-components/reference/EVENT-HANDLING.md
+139 −0 skills/igniteui-react-components/reference/INSTALLATION.md
+187 −0 skills/igniteui-react-components/reference/JSX-PATTERNS.md
+232 −0 skills/igniteui-react-components/reference/REFS-FORMS.md
+198 −0 skills/igniteui-react-components/reference/REVEAL-SDK.md
+147 −0 skills/igniteui-react-components/reference/TROUBLESHOOTING.md
+182 −0 skills/igniteui-react-customize-theme/SKILL.md
+265 −0 skills/igniteui-react-customize-theme/reference/CSS-THEMING.md
+75 −0 skills/igniteui-react-customize-theme/reference/MCP-SERVER.md
+86 −0 skills/igniteui-react-customize-theme/reference/REVEAL-THEME.md
+125 −0 skills/igniteui-react-customize-theme/reference/SASS-THEMING.md
+35 −0 skills/igniteui-react-customize-theme/reference/TROUBLESHOOTING.md
+439 −0 skills/igniteui-react-optimize-bundle-size/SKILL.md
Submodule igniteui-webcomponents updated 99 files
+20 −0 CHANGELOG.md
+1 −1 SECURITY.md
+1,706 −1,809 package-lock.json
+19 −16 package.json
+2 −0 scripts/_package.json
+0 −1 scripts/build-typedoc.js
+6 −6 scripts/build.mjs
+19 −0 scripts/report.mjs
+1 −1 src/animations/easings.ts
+2 −5 src/components/button-group/button-group.ts
+0 −37 src/components/button-group/themes/shared/button/button.bootstrap.scss
+78 −13 src/components/button-group/themes/shared/button/button.common.scss
+1 −47 src/components/button-group/themes/shared/button/button.fluent.scss
+11 −49 src/components/button-group/themes/shared/button/button.indigo.scss
+3 −95 src/components/button-group/themes/shared/button/button.material.scss
+3 −3 src/components/calendar/calendar.ts
+15 −22 src/components/calendar/days-view/days-view.ts
+2 −2 src/components/calendar/helpers.ts
+2 −2 src/components/carousel/carousel.ts
+0 −2 src/components/checkbox/themes/shared/checkbox/checkbox.bootstrap.scss
+15 −0 src/components/checkbox/themes/shared/checkbox/checkbox.common.scss
+5 −3 src/components/checkbox/themes/shared/checkbox/checkbox.fluent.scss
+0 −2 src/components/checkbox/themes/shared/checkbox/checkbox.indigo.scss
+2 −3 src/components/checkbox/themes/shared/checkbox/checkbox.material.scss
+1 −1 src/components/combo/combo-header.ts
+11 −6 src/components/combo/combo-item.ts
+1 −2 src/components/combo/combo-list.ts
+20 −1 src/components/combo/combo.spec.ts
+545 −391 src/components/combo/combo.ts
+111 −28 src/components/combo/controllers/data.ts
+127 −137 src/components/combo/controllers/navigation.ts
+0 −236 src/components/combo/controllers/selection.ts
+5 −3 src/components/combo/operations/filter.ts
+2 −2 src/components/combo/operations/group.ts
+1 −1 src/components/common/context.ts
+2 −7 src/components/common/controllers/drag.ts
+276 −115 src/components/common/controllers/key-bindings.spec.ts
+180 −74 src/components/common/controllers/key-bindings.ts
+3 −3 src/components/common/controllers/root-click.ts
+3 −3 src/components/common/controllers/slot.ts
+2 −0 src/components/common/definitions/defineAllComponents.ts
+49 −42 src/components/common/mixins/combo-box.ts
+83 −48 src/components/common/util.ts
+2 −2 src/components/common/utils.spec.ts
+11 −11 src/components/date-picker/date-picker.ts
+13 −14 src/components/date-range-picker/date-range-picker.ts
+1 −1 src/components/date-time-input/date-time-input.ts
+1 −3 src/components/date-time-input/datetime-mask-parser.ts
+7 −10 src/components/dropdown/dropdown.ts
+6 −1 src/components/dropdown/themes/shared/item/dropdown-item.common.scss
+0 −18 src/components/dropdown/themes/shared/item/dropdown-item.indigo.scss
+137 −0 src/components/highlight/highlight.spec.ts
+212 −0 src/components/highlight/highlight.ts
+245 −0 src/components/highlight/service.ts
+9 −0 src/components/highlight/themes/dark/_themes.scss
+9 −0 src/components/highlight/themes/dark/highlight.bootstrap.scss
+9 −0 src/components/highlight/themes/dark/highlight.fluent.scss
+9 −0 src/components/highlight/themes/dark/highlight.indigo.scss
+9 −0 src/components/highlight/themes/dark/highlight.material.scss
+6 −0 src/components/highlight/themes/dark/highlight.shared.scss
+9 −0 src/components/highlight/themes/light/_themes.scss
+8 −0 src/components/highlight/themes/light/highlight.bootstrap.scss
+8 −0 src/components/highlight/themes/light/highlight.fluent.scss
+8 −0 src/components/highlight/themes/light/highlight.indigo.scss
+8 −0 src/components/highlight/themes/light/highlight.material.scss
+6 −0 src/components/highlight/themes/light/highlight.shared.scss
+13 −0 src/components/highlight/themes/shared/highlight.common.scss
+54 −0 src/components/highlight/themes/themes.ts
+76 −27 src/components/input/themes/shared/input.material.scss
+19 −19 src/components/nav-drawer/themes/container.base.scss
+4 −0 src/components/progress/themes/linear/linear.progress.base.scss
+1 −1 src/components/radio/radio.ts
+6 −6 src/components/rating/rating.spec.ts
+204 −137 src/components/rating/rating.ts
+2 −5 src/components/resize-container/resize-controller.ts
+11 −14 src/components/select/select.ts
+5 −6 src/components/splitter/splitter.spec.ts
+6 −1 src/components/splitter/splitter.ts
+14 −7 src/components/splitter/types.ts
+1 −1 src/components/stepper/common/state.ts
+3 −6 src/components/stepper/stepper.ts
+3 −5 src/components/tabs/tab.ts
+3 −6 src/components/tabs/tabs.ts
+33 −9 src/components/tabs/themes/tabs.base.scss
+2 −2 src/components/tile-manager/tile.ts
+3 −0 src/components/tree/themes/shared/item.indigo.scss
+2 −5 src/components/tree/tree-item.ts
+5 −1 src/index.ts
+387 −200 stories/chat.stories.ts
+9 −9 stories/combo.stories.ts
+591 −0 stories/highlight.stories.ts
+1 −6 stories/radio.stories.ts
+1 −1 stories/rating.stories.ts
+1 −1 stories/ripple.stories.ts
+1 −1 stories/snackbar.stories.ts
+1 −1 stories/switch.stories.ts
+478 −99 stories/tile-manager.stories.ts
+1 −2 stories/toast.stories.ts
+3 −3 tsconfig.json
64 changes: 64 additions & 0 deletions scripts/update-skills.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import { execFileSync } from "child_process";
import { cpSync, existsSync, rmSync } from "fs";
import { join, relative, resolve } from "path";

const root = resolve(__dirname, "..");
const branch = process.argv[2] || "master";

Comment on lines +6 to +7
Copy link

Copilot AI Apr 16, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

branch comes from process.argv[2] and is interpolated into a shell command via execSync(...). Because execSync runs through a shell, this allows command injection (e.g., branch values containing ;, &&, etc.) and also breaks on branch names with spaces. Use execFileSync (or spawnSync) with an argument array, and/or validate the branch name against an allowlist regex before invoking git.

Copilot uses AI. Check for mistakes.
if (!/^[\w.\-/]+$/.test(branch) || branch.startsWith("-")) {
// eslint-disable-next-line no-console
console.error(`[update-skills] Invalid branch name: '${branch}'`);
process.exit(1);
Comment on lines +6 to +11
Copy link

Copilot AI Apr 16, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

branch validation allows values starting with - (e.g. --rebase). Even though execFileSync avoids shell injection, Git will still parse a leading - refspec as an option in git pull origin <branch> .... Disallow branches that start with - and/or insert -- before the refspec when invoking git so the branch name is never treated as a flag.

Copilot uses AI. Check for mistakes.
}

const mappings = [
{
name: "angular",
repo: join(root, "packages/igniteui-mcp/igniteui-doc-mcp/angular/igniteui-angular"),
src: join(root, "packages/igniteui-mcp/igniteui-doc-mcp/angular/igniteui-angular/skills"),
dest: join(root, "packages/igx-templates/igx-ts/projects/_base/files/__dot__claude/skills")
},
{
name: "react",
repo: join(root, "packages/igniteui-mcp/igniteui-doc-mcp/react/igniteui-react"),
src: join(root, "packages/igniteui-mcp/igniteui-doc-mcp/react/igniteui-react/skills"),
dest: join(root, "packages/cli/templates/react/igr-ts/projects/_base/files/__dot__claude/skills")
},
{
name: "webcomponents",
repo: join(root, "packages/igniteui-mcp/igniteui-doc-mcp/webcomponents/igniteui-webcomponents"),
src: join(root, "packages/igniteui-mcp/igniteui-doc-mcp/webcomponents/igniteui-webcomponents/skills"),
dest: join(root, "packages/cli/templates/webcomponents/igc-ts/projects/_base/files/__dot__claude/skills")
}
];

for (const { name, repo, src, dest } of mappings) {
if (!existsSync(repo)) {
// eslint-disable-next-line no-console
console.warn(`[update-skills] Skipping ${name}: repo not found at ${repo}`);
continue;
}
Comment on lines +36 to +40
Copy link

Copilot AI Apr 16, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These paths are git submodules (see .gitmodules), and when submodules are not initialized the directory can exist but not be a usable git repo. In that case existsSync(repo) will pass, but git pull will fail. Consider detecting a valid repo (e.g., check for ${repo}/.git or run git rev-parse --is-inside-work-tree) and either auto-run git submodule update --init <path> or skip with a clearer warning.

Copilot uses AI. Check for mistakes.
if (!existsSync(join(repo, ".git"))) {
// Submodule directory exists but hasn't been initialized yet — initialize it now
// eslint-disable-next-line no-console
console.log(`[update-skills] Initializing submodule for ${name}...`);
const submodulePath = relative(root, repo).replace(/\\/g, "/");
execFileSync("git", ["submodule", "update", "--init", submodulePath], { cwd: root, stdio: "inherit" });
}
// eslint-disable-next-line no-console
console.log(`[update-skills] Updating ${name} to branch '${branch}'...`);
execFileSync("git", ["fetch", "origin", branch], { cwd: repo, stdio: "inherit" });
execFileSync("git", ["checkout", "-B", branch, `origin/${branch}`], { cwd: repo, stdio: "inherit" });

if (!existsSync(src)) {
// eslint-disable-next-line no-console
console.warn(`[update-skills] Skipping ${name}: skills not found at ${src}`);
continue;
}
if (existsSync(dest)) {
rmSync(dest, { recursive: true, force: true });
}
cpSync(src, dest, { recursive: true });
// eslint-disable-next-line no-console
console.log(`[update-skills] Updated ${name} skills`);
}
Loading