@sit-onyx/modelcontextprotocol 0.3.0-dev-20260715161231 → 0.4.0-dev-20260728073608

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -5,6 +5,7 @@ This is the official [onyx](https://onyx.schwarz/) Model Context Protocol (or "M
5
5
  ## Prerequisites
6
6
 
7
7
  - [Node.js](https://nodejs.org/en) version as specified in [.node-version](./.node-version) file
8
+ - If you are sitting behind an (enterprise) proxy, you might need to set the `export NODE_USE_SYSTEM_CA=1` environment variable.
8
9
 
9
10
  ## Getting started
10
11
 
@@ -51,7 +52,23 @@ Save the file and confirm that the MCP has been set up correctly:
51
52
  gemini mcp list
52
53
  ```
53
54
 
54
- ## Development
55
+ ### "Eject" Skills
56
+
57
+ If you prefer to have the skills as editable markdown on your filesystem, then the `--writeSkills` flag can be used in the CLI:
58
+
59
+ ```shell
60
+ onyx-mcp --writeSkills "./skills"
61
+ ```
62
+
63
+ Then configure the `onyx-mcp` in your coding assistants configuration to exclude the `skill` capabilities:
64
+
65
+ ```sh
66
+ onyx-mcp --exclude "skill"
67
+ ```
68
+
69
+ This way the MCP will not provide the skills and avoid duplicated context for the coding agent.
70
+
71
+ ## Development/Contributing
55
72
 
56
73
  Run this command in the monorepo root:
57
74
 
@@ -63,3 +80,18 @@ This starts the "build" watcher and the [`@modelcontextprotocol/inspector`](http
63
80
 
64
81
  You must reload the inspector browser website after changes to the `@sit-onyx/modelcontextprotocol` source code.
65
82
  **Using the "Reconnect" button does not suffice!**
83
+
84
+ ### Adding Agent Skills
85
+
86
+ [Agent Skills](https://agentskills.io/) are developed and maintained in the `./src/resources/skills` directory.
87
+ Each skill has its own directory with a single `SKILL.md` file.
88
+
89
+ ```md
90
+ ---
91
+ name: <skill-name>
92
+ description: <skill-description>
93
+ license: Apache-2.0
94
+ ---
95
+ ```
96
+
97
+ Nested/bundled references and other resources are currently not supported.
package/dist/index.js CHANGED
@@ -4,8 +4,8 @@ import { error, log } from "node:console";
4
4
  import { mkdir, stat, writeFile } from "node:fs/promises";
5
5
  import { parseArgs } from "node:util";
6
6
  import { resolve } from "node:path";
7
- import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
8
7
  import { createServer as createServer$1 } from "node:http";
8
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
9
9
  import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
10
10
  import { Readable } from "node:stream";
11
11
  import { buffer } from "node:stream/consumers";
@@ -19,7 +19,14 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
19
19
  var __getOwnPropNames = Object.getOwnPropertyNames;
20
20
  var __getProtoOf = Object.getPrototypeOf;
21
21
  var __hasOwnProp = Object.prototype.hasOwnProperty;
22
- var __esmMin = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
22
+ var __esmMin = (fn, res, err) => () => {
23
+ if (err) throw err[0];
24
+ try {
25
+ return fn && (res = fn(fn = 0)), res;
26
+ } catch (e) {
27
+ throw err = [e], e;
28
+ }
29
+ };
23
30
  var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
24
31
  var __exportAll = (all, no_symbols) => {
25
32
  let target = {};
@@ -45,10 +52,10 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
45
52
  enumerable: true
46
53
  }) : target, mod));
47
54
  var __toCommonJS = (mod) => __hasOwnProp.call(mod, "module.exports") ? mod["module.exports"] : __copyProps(__defProp({}, "__esModule", { value: true }), mod);
48
- var __require = /* @__PURE__ */ createRequire(import.meta.url);
55
+ var __require = /* #__PURE__ */ (() => createRequire(import.meta.url))();
49
56
  var package_default = {
50
57
  name: "@sit-onyx/modelcontextprotocol",
51
- version: "0.2.0",
58
+ version: "0.3.0",
52
59
  description: "MCP (Model Context Protocol) Server that provide onyx specific tools and resources.",
53
60
  homepage: "https://onyx.schwarz",
54
61
  bugs: { "url": "https://github.com/SchwarzIT/onyx/issues" },
@@ -101,8 +108,8 @@ var SKILL_exports$3 = /* @__PURE__ */ __exportAll({
101
108
  frontmatter: () => frontmatter$3,
102
109
  raw: () => raw$3
103
110
  });
104
- var SKILL_default$3 = "# Onyx Components\n\nImplement and configure Onyx Vue 3 UI components using authoritative API definitions.\n\n## Rule: Mandatory Dynamic API Lookups (MCP)\n\nOnyx component APIs are dynamic and change across versions. **NEVER guess or assume props, events, or slots.**\n\n### Action Components (Buttons & Links)\n\n* **Props-based Links:** Components like `OnyxButton`, `OnyxIconButton`, `OnyxSystemButton`, `OnyxMenuItem`, and `OnyxNavItem` support a `link` prop. Do not wrap these components in raw `<a>` tags; pass the URL to the `link` prop.\n* **Headless Links:** Use the `useLink` composable (`const { navigate, isActive } = useLink()`) or `OnyxRouterLink` for custom unstyled navigation components.\n\n### Form Elements\n\n* **Labels & Messages:** Always configure standard `Message` and `LabelPositions` properties consistently.\n* **Loading State:** Implement built-in `Skeleton` loading states when loading form data.\n* **Accessibility:** Use proper labels and fieldsets for complex multi-input forms (`date-picker`, `radio-group`, `checkbox-group`).\n\n### Cards & Layout Structure\n\n* Nest and structure basic components (`Accordion`, `Cards`, `Badge`, `Tag`) inside the Onyx grid layout (see `onyx-foundation`) to prevent layout breaking.\n\n***\n\n## Validation & Quality Check\n\nAfter writing or updating components, you **MUST** run the following verification steps:\n\n1. **Type Check:** Run TypeScript verification (e.g., `npx vue-tsc --noEmit` or `npm run type-check`) to confirm no invalid props or event bindings exist.\n2. **Linter Check:** Run standard project linters (e.g., `npm run lint` or `eslint .`) to confirm code style and rules are respected.\n3. **Manual Verification:** Confirm all slots and custom events mapped conform to the authoritative API fetched from the MCP.\n";
105
- var raw$3 = "---\nname: onyx-components\ndescription: Best practices and dynamic API lookup instructions for Onyx UI components. Use when implementing UI features, forms, or building Vue templates.\nlicense: Apache-2.0\n---\n\n# Onyx Components\n\nImplement and configure Onyx Vue 3 UI components using authoritative API definitions.\n\n## Rule: Mandatory Dynamic API Lookups (MCP)\n\nOnyx component APIs are dynamic and change across versions. **NEVER guess or assume props, events, or slots.**\n\n### Action Components (Buttons & Links)\n\n- **Props-based Links:** Components like `OnyxButton`, `OnyxIconButton`, `OnyxSystemButton`, `OnyxMenuItem`, and `OnyxNavItem` support a `link` prop. Do not wrap these components in raw `<a>` tags; pass the URL to the `link` prop.\n- **Headless Links:** Use the `useLink` composable (`const { navigate, isActive } = useLink()`) or `OnyxRouterLink` for custom unstyled navigation components.\n\n### Form Elements\n\n- **Labels & Messages:** Always configure standard `Message` and `LabelPositions` properties consistently.\n- **Loading State:** Implement built-in `Skeleton` loading states when loading form data.\n- **Accessibility:** Use proper labels and fieldsets for complex multi-input forms (`date-picker`, `radio-group`, `checkbox-group`).\n\n### Cards & Layout Structure\n\n- Nest and structure basic components (`Accordion`, `Cards`, `Badge`, `Tag`) inside the Onyx grid layout (see `onyx-foundation`) to prevent layout breaking.\n\n---\n\n## Validation & Quality Check\n\nAfter writing or updating components, you **MUST** run the following verification steps:\n\n1. **Type Check:** Run TypeScript verification (e.g., `npx vue-tsc --noEmit` or `npm run type-check`) to confirm no invalid props or event bindings exist.\n2. **Linter Check:** Run standard project linters (e.g., `npm run lint` or `eslint .`) to confirm code style and rules are respected.\n3. **Manual Verification:** Confirm all slots and custom events mapped conform to the authoritative API fetched from the MCP.\n";
111
+ var SKILL_default$3 = "# Onyx Components\n\nImplement and configure Onyx Vue 3 UI components using authoritative API definitions.\n\n## Rule: Mandatory Dynamic API Lookups (MCP)\n\nOnyx component APIs are dynamic and change across versions. **NEVER guess or assume props, events, or slots.**\n\n### Action Components (Buttons & Links)\n\n* **Props-based Links:** Components like `OnyxButton`, `OnyxIconButton`, `OnyxSystemButton`, `OnyxMenuItem`, and `OnyxNavItem` support a `link` prop. Do not wrap these components in raw `<a>` tags; pass the URL to the `link` prop.\n* **Headless Links:** Use the `useLink` composable (`const { navigate, isActive } = useLink()`) or `OnyxRouterLink` for custom unstyled navigation components.\n\n### Composition\n\n* Compose, don't reinvent. Data page = OnyxHeadline + OnyxTabs + OnyxDataGrid. Dashboard = OnyxCard + OnyxHeadline + OnyxFlyoutMenu + OnyxSystemButton.\n* Always use the recommended components for a slot. These are usually mentioned in the API description of the slot itself.\n* Always use the appropriate Onyx component instead of building components from scratch: E.g.\n * `OnyxButton`, `OnyxSystemButton` or `OnyxIconButton` instead of `<button>`\n * `OnyxInput`, `OnyxTimepicker`, `OnyxDatepicker` or `OnyxStepper` instead of `<input>`\n * `OnyxTextarea` instead of `<textarea>`\n * `OnyxSelect` instead `<select>`\n * `OnyxDatagrid` instead of `<table>`\n * `OnyxSidebar` instead of building a sidebar from scratch\n\n### Form Elements\n\n* **Labels & Messages:** Always configure standard `Message` and `LabelPositions` properties consistently.\n* **Loading State:** Implement built-in `Skeleton` loading states when loading form data.\n* **Accessibility:** Use proper labels for complex multi-input forms (`date-picker`, `radio-group`, `checkbox-group`).\n\n### Cards & Layout Structure\n\n* Nest and structure basic components (`Accordion`, `Cards`, `Badge`, `Tag`) inside the Onyx grid layout (see `onyx-foundation`) to prevent layout breaking.\n\n### Data presentation\n\n* **Tabular data:** Always prefer the use of the `OnyxDataGrid` over the `OnyxTable` component.\n\n***\n\n## Validation & Quality Check\n\nAfter writing or updating components, you **MUST** run the following verification steps:\n\n1. **Type Check:** Run TypeScript verification (e.g., `npx vue-tsc --noEmit` or `npm run type-check`) to confirm no invalid props or event bindings exist.\n2. **Linter Check:** Run standard project linters (e.g., `npm run lint` or `eslint .`) to confirm code style and rules are respected.\n3. **Manual Verification:** Confirm all slots and custom events mapped conform to the authoritative API fetched from the MCP.\n";
112
+ var raw$3 = "---\nname: onyx-components\ndescription: Best practices and dynamic API lookup instructions for Onyx UI components. Use when implementing UI features, forms, or building Vue templates.\nlicense: Apache-2.0\n---\n\n# Onyx Components\n\nImplement and configure Onyx Vue 3 UI components using authoritative API definitions.\n\n## Rule: Mandatory Dynamic API Lookups (MCP)\n\nOnyx component APIs are dynamic and change across versions. **NEVER guess or assume props, events, or slots.**\n\n### Action Components (Buttons & Links)\n\n- **Props-based Links:** Components like `OnyxButton`, `OnyxIconButton`, `OnyxSystemButton`, `OnyxMenuItem`, and `OnyxNavItem` support a `link` prop. Do not wrap these components in raw `<a>` tags; pass the URL to the `link` prop.\n- **Headless Links:** Use the `useLink` composable (`const { navigate, isActive } = useLink()`) or `OnyxRouterLink` for custom unstyled navigation components.\n\n### Composition\n\n- Compose, don't reinvent. Data page = OnyxHeadline + OnyxTabs + OnyxDataGrid. Dashboard = OnyxCard + OnyxHeadline + OnyxFlyoutMenu + OnyxSystemButton.\n- Always use the recommended components for a slot. These are usually mentioned in the API description of the slot itself.\n- Always use the appropriate Onyx component instead of building components from scratch: E.g.\n - `OnyxButton`, `OnyxSystemButton` or `OnyxIconButton` instead of `<button>`\n - `OnyxInput`, `OnyxTimepicker`, `OnyxDatepicker` or `OnyxStepper` instead of `<input>`\n - `OnyxTextarea` instead of `<textarea>`\n - `OnyxSelect` instead `<select>`\n - `OnyxDatagrid` instead of `<table>`\n - `OnyxSidebar` instead of building a sidebar from scratch\n\n### Form Elements\n\n- **Labels & Messages:** Always configure standard `Message` and `LabelPositions` properties consistently.\n- **Loading State:** Implement built-in `Skeleton` loading states when loading form data.\n- **Accessibility:** Use proper labels for complex multi-input forms (`date-picker`, `radio-group`, `checkbox-group`).\n\n### Cards & Layout Structure\n\n- Nest and structure basic components (`Accordion`, `Cards`, `Badge`, `Tag`) inside the Onyx grid layout (see `onyx-foundation`) to prevent layout breaking.\n\n### Data presentation\n\n- **Tabular data:** Always prefer the use of the `OnyxDataGrid` over the `OnyxTable` component.\n\n---\n\n## Validation & Quality Check\n\nAfter writing or updating components, you **MUST** run the following verification steps:\n\n1. **Type Check:** Run TypeScript verification (e.g., `npx vue-tsc --noEmit` or `npm run type-check`) to confirm no invalid props or event bindings exist.\n2. **Linter Check:** Run standard project linters (e.g., `npm run lint` or `eslint .`) to confirm code style and rules are respected.\n3. **Manual Verification:** Confirm all slots and custom events mapped conform to the authoritative API fetched from the MCP.\n";
106
113
  var frontmatter$3 = {
107
114
  "name": "onyx-components",
108
115
  "description": "Best practices and dynamic API lookup instructions for Onyx UI components. Use when implementing UI features, forms, or building Vue templates.",
@@ -115,8 +122,8 @@ var SKILL_exports$2 = /* @__PURE__ */ __exportAll({
115
122
  frontmatter: () => frontmatter$2,
116
123
  raw: () => raw$2
117
124
  });
118
- var SKILL_default$2 = "# Onyx Foundation & Theming\n\nApply Onyx styling foundations, CSS variables, responsive grid, and layout rules.\n\n## Theming & Colors\n\nOnyx supports light and dark themes out-of-the-box. Theme switching is handled automatically.\n\n### Rule: CSS Variables Only\n\n**NEVER hardcode hex, rgb, or hsl color values.** Always use semantic Onyx CSS variables (prefixed with `--onyx-`).\n\n* **Base backgrounds:** `var(--onyx-color-base-background-tinted)`, `var(--onyx-color-base-background-blank)`\n* **Primary brand:** `var(--onyx-color-base-primary-500)`, `var(--onyx-color-base-primary-100)`\n* **Text & icons:** `var(--onyx-color-text-icons-primary-soft)`, `var(--onyx-color-text-icons-primary-medium)`, `var(--onyx-color-text-icons-primary-intense)`\n* **Component states:** `var(--onyx-color-component-cta-default)`, `var(--onyx-color-component-border-primary)`, `var(--onyx-color-component-focus-primary)`\n\n*Note: Access ONLY Semantic variables. Do NOT use global or component variables directly in applications.*\n\n## Density\n\nDensity levels control the vertical white space and heights (base heights: Compact = 32px, Default = 40px, Cozy = 48px).\nApply density via properties on supported components or by adding these CSS classes to any element:\n\n* `.onyx-density-compact`\n* `.onyx-density-default`\n* `.onyx-density-cozy`\n\n## Breakpoints\n\nThe design system defines six standard breakpoints:\n\n* `2xs`: `320px` to `576px` (Max 4 columns)\n* `xs`: `577px` to `768px` (Max 8 columns)\n* `sm`: `769px` to `992px` (Max 8 columns)\n* `md`: `993px` to `1440px` (Max 12 columns)\n* `lg`: `1441px` to `1920px` (Max 12 or 16 columns)\n* `xl`: `1921px` and beyond (Max 12, 16, or 20 columns)\n\n### Responsive SCSS Mixins\n\nImport `\"sit-onyx/breakpoints.scss\"` to apply media or container queries:\n\n```scss\n@use \"sit-onyx/breakpoints.scss\";\n\n// Media queries (compares against whole screen width)\n.my-screen-class {\n @include breakpoints.screen(max, sm) {\n /* styles for sm and smaller */\n }\n @include breakpoints.screen(min, md) {\n /* styles for md and larger */\n }\n}\n\n// Container queries (compares against nearest container width)\n// MUST set container-type on the parent element\n.my-container-class {\n container-type: inline-size;\n\n @include breakpoints.container(max, md) {\n /* styles for md container and smaller */\n }\n @include breakpoints.container(min, lg) {\n /* styles for lg container and larger */\n }\n}\n```\n\n## Grid System\n\nOnyx uses container-query-based grids. The nearest parent component with `container-type: inline-size;` (automatically set by `OnyxPageLayout`, `OnyxAppLayout`, `OnyxSidebar`) determines the active grid width.\n\n### Grid Classes\n\n* **Container:** `.onyx-grid` (Defines a grid container)\n* **Spanning Columns:** `.onyx-grid-span-<number>` (Define exact span from 1 to 12)\n* **Full Width:** `.onyx-grid-span-full` (Span all available columns)\n* **Breakpoint-Specific Span:** `.onyx-grid-<breakpoint>-span-<number>` (Define column span for a specific breakpoint **and larger**)\n\n### Grid Margin\n\nApply `.onyx-grid-layout` manually to wrap page contents and add outer page margins if not using `OnyxPageLayout`.\n\n```vue\n<template>\n <div class=\"onyx-grid\">\n <!-- Spans 4 cols on smaller screens, 6 on md and larger -->\n <OnyxCard class=\"onyx-grid-span-4 onyx-grid-md-span-6\">Content</OnyxCard>\n\n <!-- Spans full width always -->\n <OnyxCard class=\"onyx-grid-span-full\">Footer / Hero</OnyxCard>\n </div>\n</template>\n```\n\n### Grid Customization\n\nSet these CSS classes on the root element of your application (e.g. `OnyxAppLayout`):\n\n* **Limit Max Width:** `onyx-grid-max-md` (max 1440px) or `onyx-grid-max-lg` (max 1920px)\n* **Alignment:** `onyx-grid-center` (Centers the layout when screen size exceeds max width)\n* **Max Columns (lg and beyond):** `onyx-grid-lg-16` (16 columns) or `onyx-grid-xl-20` (20 columns)\n\n## Page Layout (`OnyxPageLayout`)\n\nImplement the `OnyxPageLayout` component as the root element on every individual page/view to ensure standardized paddings, page-level scroll behavior, and unified outer page margins.\n\n```vue\n<template>\n <OnyxPageLayout>\n <OnyxHeadline is=\"h1\">Page Title</OnyxHeadline>\n </OnyxPageLayout>\n</template>\n```\n\nFor recurring page elements (like sidebars, footers, or sub-navigation), wrap the `OnyxPageLayout` in a reusable component or a Nuxt layout.\n\n## Layout Principles & Page Anatomy\n\nAll custom layout constructions must align with the core Onyx layout guidelines:\n\n### Core Principles\n\n* **Responsive:** Layouts must fluidly adapt to maintain usability and visual hierarchy across all device sizes.\n* **Content-Driven:** Prioritize structural layout decisions based on the content's hierarchy and user needs, not vice versa.\n\n### The Four Page Anatomy Regions\n\n1. **Main Navigation (`OnyxNavBar`):** Persistent top/left area independent of scroll containers, providing access to top-level views.\n2. **Sidebar (`OnyxSidebar`):** Persistent left/right sidebar used for secondary navigation or master-detail detail panels.\n3. **Page Content (`OnyxPageLayout`):** The flexible central area governed by the grid system and acting as the primary scroll container.\n4. **Bottom Bar (`OnyxBottomBar`):** Scroll-independent sticky bar at the bottom for status confirmations or primary page-level triggers.\n\n### Component Alignment Rule\n\n* **STRICT Left-Alignment:** All internal component layout structures must be left-aligned to preserve scannability.\n* **Exception:** Tables and data grids may utilize center/right alignment within specific columns depending on data type formats (e.g. numeric currencies).\n\n### Visual Rhythm & Grouping\n\n* **Spatial Grouping:** Group functionally related components together using generous empty space (white space), typography, or dividers to minimize cognitive load. Ensure balanced proportions across all section distributions.\n\n***\n\n## Validation & Quality Check\n\nAfter writing custom layouts or styling overrides, you **MUST** run the following verification steps:\n\n1. **CSS Variables Audit:** Scan your stylesheets for any hardcoded hex, rgb, or hsl values, or direct global/component variable usages. Replace them with proper `--onyx-` semantic variables.\n2. **Layout Alignment Check:** Verify all custom component interiors are left-aligned (with the exception of specific table/data grid columns).\n3. **Responsive Verification:** Verify your CSS container-query selectors are properly paired with a parent `container-type: inline-size;`. Ensure no breakpoint styles break responsive fluidity.\n";
119
- var raw$2 = "---\nname: onyx-foundation\ndescription: Styling foundations, CSS variables, layout grid, breakpoints, and responsive mixins for Onyx. Use when writing custom CSS, designing layouts, or ensuring theme compliance.\nlicense: Apache-2.0\n---\n\n# Onyx Foundation & Theming\n\nApply Onyx styling foundations, CSS variables, responsive grid, and layout rules.\n\n## Theming & Colors\n\nOnyx supports light and dark themes out-of-the-box. Theme switching is handled automatically.\n\n### Rule: CSS Variables Only\n\n**NEVER hardcode hex, rgb, or hsl color values.** Always use semantic Onyx CSS variables (prefixed with `--onyx-`).\n\n- **Base backgrounds:** `var(--onyx-color-base-background-tinted)`, `var(--onyx-color-base-background-blank)`\n- **Primary brand:** `var(--onyx-color-base-primary-500)`, `var(--onyx-color-base-primary-100)`\n- **Text & icons:** `var(--onyx-color-text-icons-primary-soft)`, `var(--onyx-color-text-icons-primary-medium)`, `var(--onyx-color-text-icons-primary-intense)`\n- **Component states:** `var(--onyx-color-component-cta-default)`, `var(--onyx-color-component-border-primary)`, `var(--onyx-color-component-focus-primary)`\n\n_Note: Access ONLY Semantic variables. Do NOT use global or component variables directly in applications._\n\n## Density\n\nDensity levels control the vertical white space and heights (base heights: Compact = 32px, Default = 40px, Cozy = 48px).\nApply density via properties on supported components or by adding these CSS classes to any element:\n\n- `.onyx-density-compact`\n- `.onyx-density-default`\n- `.onyx-density-cozy`\n\n## Breakpoints\n\nThe design system defines six standard breakpoints:\n\n- `2xs`: `320px` to `576px` (Max 4 columns)\n- `xs`: `577px` to `768px` (Max 8 columns)\n- `sm`: `769px` to `992px` (Max 8 columns)\n- `md`: `993px` to `1440px` (Max 12 columns)\n- `lg`: `1441px` to `1920px` (Max 12 or 16 columns)\n- `xl`: `1921px` and beyond (Max 12, 16, or 20 columns)\n\n### Responsive SCSS Mixins\n\nImport `\"sit-onyx/breakpoints.scss\"` to apply media or container queries:\n\n```scss\n@use \"sit-onyx/breakpoints.scss\";\n\n// Media queries (compares against whole screen width)\n.my-screen-class {\n @include breakpoints.screen(max, sm) {\n /* styles for sm and smaller */\n }\n @include breakpoints.screen(min, md) {\n /* styles for md and larger */\n }\n}\n\n// Container queries (compares against nearest container width)\n// MUST set container-type on the parent element\n.my-container-class {\n container-type: inline-size;\n\n @include breakpoints.container(max, md) {\n /* styles for md container and smaller */\n }\n @include breakpoints.container(min, lg) {\n /* styles for lg container and larger */\n }\n}\n```\n\n## Grid System\n\nOnyx uses container-query-based grids. The nearest parent component with `container-type: inline-size;` (automatically set by `OnyxPageLayout`, `OnyxAppLayout`, `OnyxSidebar`) determines the active grid width.\n\n### Grid Classes\n\n- **Container:** `.onyx-grid` (Defines a grid container)\n- **Spanning Columns:** `.onyx-grid-span-<number>` (Define exact span from 1 to 12)\n- **Full Width:** `.onyx-grid-span-full` (Span all available columns)\n- **Breakpoint-Specific Span:** `.onyx-grid-<breakpoint>-span-<number>` (Define column span for a specific breakpoint **and larger**)\n\n### Grid Margin\n\nApply `.onyx-grid-layout` manually to wrap page contents and add outer page margins if not using `OnyxPageLayout`.\n\n```vue\n<template>\n <div class=\"onyx-grid\">\n <!-- Spans 4 cols on smaller screens, 6 on md and larger -->\n <OnyxCard class=\"onyx-grid-span-4 onyx-grid-md-span-6\">Content</OnyxCard>\n\n <!-- Spans full width always -->\n <OnyxCard class=\"onyx-grid-span-full\">Footer / Hero</OnyxCard>\n </div>\n</template>\n```\n\n### Grid Customization\n\nSet these CSS classes on the root element of your application (e.g. `OnyxAppLayout`):\n\n- **Limit Max Width:** `onyx-grid-max-md` (max 1440px) or `onyx-grid-max-lg` (max 1920px)\n- **Alignment:** `onyx-grid-center` (Centers the layout when screen size exceeds max width)\n- **Max Columns (lg and beyond):** `onyx-grid-lg-16` (16 columns) or `onyx-grid-xl-20` (20 columns)\n\n## Page Layout (`OnyxPageLayout`)\n\nImplement the `OnyxPageLayout` component as the root element on every individual page/view to ensure standardized paddings, page-level scroll behavior, and unified outer page margins.\n\n```vue\n<template>\n <OnyxPageLayout>\n <OnyxHeadline is=\"h1\">Page Title</OnyxHeadline>\n </OnyxPageLayout>\n</template>\n```\n\nFor recurring page elements (like sidebars, footers, or sub-navigation), wrap the `OnyxPageLayout` in a reusable component or a Nuxt layout.\n\n## Layout Principles & Page Anatomy\n\nAll custom layout constructions must align with the core Onyx layout guidelines:\n\n### Core Principles\n\n- **Responsive:** Layouts must fluidly adapt to maintain usability and visual hierarchy across all device sizes.\n- **Content-Driven:** Prioritize structural layout decisions based on the content's hierarchy and user needs, not vice versa.\n\n### The Four Page Anatomy Regions\n\n1. **Main Navigation (`OnyxNavBar`):** Persistent top/left area independent of scroll containers, providing access to top-level views.\n2. **Sidebar (`OnyxSidebar`):** Persistent left/right sidebar used for secondary navigation or master-detail detail panels.\n3. **Page Content (`OnyxPageLayout`):** The flexible central area governed by the grid system and acting as the primary scroll container.\n4. **Bottom Bar (`OnyxBottomBar`):** Scroll-independent sticky bar at the bottom for status confirmations or primary page-level triggers.\n\n### Component Alignment Rule\n\n- **STRICT Left-Alignment:** All internal component layout structures must be left-aligned to preserve scannability.\n- **Exception:** Tables and data grids may utilize center/right alignment within specific columns depending on data type formats (e.g. numeric currencies).\n\n### Visual Rhythm & Grouping\n\n- **Spatial Grouping:** Group functionally related components together using generous empty space (white space), typography, or dividers to minimize cognitive load. Ensure balanced proportions across all section distributions.\n\n---\n\n## Validation & Quality Check\n\nAfter writing custom layouts or styling overrides, you **MUST** run the following verification steps:\n\n1. **CSS Variables Audit:** Scan your stylesheets for any hardcoded hex, rgb, or hsl values, or direct global/component variable usages. Replace them with proper `--onyx-` semantic variables.\n2. **Layout Alignment Check:** Verify all custom component interiors are left-aligned (with the exception of specific table/data grid columns).\n3. **Responsive Verification:** Verify your CSS container-query selectors are properly paired with a parent `container-type: inline-size;`. Ensure no breakpoint styles break responsive fluidity.\n";
125
+ var SKILL_default$2 = "# Onyx Foundation & Theming\n\nApply Onyx styling foundations, CSS variables, responsive grid, and layout rules.\n\n## Theming & Colors\n\nOnyx supports light and dark themes out-of-the-box. Theme switching is handled automatically.\n\n### Rule: CSS Variables Only\n\n**NEVER hardcode hex, rgb, or hsl color values!** Always use semantic Onyx CSS variables (prefixed with `--onyx-`).\n\n* **Base backgrounds:** `var(--onyx-color-base-background-tinted)`, `var(--onyx-color-base-background-blank)`\n* **Primary brand:** `var(--onyx-color-base-primary-500)`, `var(--onyx-color-base-primary-100)`\n* **Text & icons:** `var(--onyx-color-text-icons-primary-soft)`, `var(--onyx-color-text-icons-primary-medium)`, `var(--onyx-color-text-icons-primary-intense)`\n* **Component states:** `var(--onyx-color-component-cta-default)`, `var(--onyx-color-component-border-primary)`, `var(--onyx-color-component-focus-primary)`\n\n*Note: Access ONLY Semantic variables. Do NOT use global or component variables directly in applications.*\n\n### Rule: No custom animations\n\n**NEVER add animations or transitions unprompted!** Only add them when explicitly asked for and use the Onyx duration CSS variables:\n\n* `--onyx-duration-sm`\n* `--onyx-duration-md`\n* `--onyx-duration-lg`\n\n## Density\n\nDensity levels control the vertical white space and heights (base heights: Compact = 32px, Default = 40px, Cozy = 48px).\nApply density via properties on supported components or by adding these CSS classes to any element:\n\n* `.onyx-density-compact`\n* `.onyx-density-default`\n* `.onyx-density-cozy`\n\n## Breakpoints\n\nThe design system defines six standard breakpoints:\n\n* `2xs`: `320px` to `576px` (Max 4 columns)\n* `xs`: `577px` to `768px` (Max 8 columns)\n* `sm`: `769px` to `992px` (Max 8 columns)\n* `md`: `993px` to `1440px` (Max 12 columns)\n* `lg`: `1441px` to `1920px` (Max 12 or 16 columns)\n* `xl`: `1921px` and beyond (Max 12, 16, or 20 columns)\n\n### Responsive SCSS Mixins\n\nImport `\"sit-onyx/breakpoints.scss\"` to apply media or container queries:\n\n```scss\n@use \"sit-onyx/breakpoints.scss\";\n\n// Media queries (compares against whole screen width)\n.my-screen-class {\n @include breakpoints.screen(max, sm) {\n /* styles for sm and smaller */\n }\n @include breakpoints.screen(min, md) {\n /* styles for md and larger */\n }\n}\n\n// Container queries (compares against nearest container width)\n// MUST set container-type on the parent element\n.my-container-class {\n container-type: inline-size;\n\n @include breakpoints.container(max, md) {\n /* styles for md container and smaller */\n }\n @include breakpoints.container(min, lg) {\n /* styles for lg container and larger */\n }\n}\n```\n\n## Grid System\n\nOnyx uses container-query-based grids. The nearest parent component with `container-type: inline-size;` (automatically set by `OnyxPageLayout`, `OnyxAppLayout`, `OnyxSidebar`) determines the active grid width.\n\n### Grid Classes\n\n* **Container:** `.onyx-grid` (Defines a grid container)\n* **Spanning Columns:** `.onyx-grid-span-<number>` (Define exact span from 1 to 12)\n* **Full Width:** `.onyx-grid-span-full` (Span all available columns)\n* **Breakpoint-Specific Span:** `.onyx-grid-<breakpoint>-span-<number>` (Define column span for a specific breakpoint **and larger**)\n\n### Grid Margin\n\nApply `.onyx-grid-layout` manually to wrap page contents and add outer page margins if not using `OnyxPageLayout`.\n\n```vue\n<template>\n <div class=\"onyx-grid\">\n <!-- Spans 4 cols on smaller screens, 6 on md and larger -->\n <OnyxCard class=\"onyx-grid-span-4 onyx-grid-md-span-6\">Content</OnyxCard>\n\n <!-- Spans full width always -->\n <OnyxCard class=\"onyx-grid-span-full\">Footer / Hero</OnyxCard>\n </div>\n</template>\n```\n\n### Grid Customization\n\nSet these CSS classes on the root element of your application (e.g. `OnyxAppLayout`):\n\n* **Limit Max Width:** `onyx-grid-max-md` (max 1440px) or `onyx-grid-max-lg` (max 1920px)\n* **Alignment:** `onyx-grid-center` (Centers the layout when screen size exceeds max width)\n* **Max Columns (lg and beyond):** `onyx-grid-lg-16` (16 columns) or `onyx-grid-xl-20` (20 columns)\n\n## Page Layout (`OnyxPageLayout`)\n\nImplement the `OnyxPageLayout` component as the root element on every individual page/view to ensure standardized paddings, page-level scroll behavior, and unified outer page margins.\n\n```vue\n<template>\n <OnyxPageLayout>\n <OnyxHeadline is=\"h1\">Page Title</OnyxHeadline>\n </OnyxPageLayout>\n</template>\n```\n\nFor recurring page elements (like sidebars, footers, or sub-navigation), wrap the `OnyxPageLayout` in a reusable component or a Nuxt layout.\n\n## Layout Principles & Page Anatomy\n\nAll custom layout constructions must align with the core Onyx layout guidelines:\n\n### Core Principles\n\n* **Responsive:** Layouts must fluidly adapt to maintain usability and visual hierarchy across all device sizes.\n* **Content-Driven:** Prioritize structural layout decisions based on the content's hierarchy and user needs, not vice versa.\n\n### The Four Page Anatomy Regions\n\n1. **Main Navigation (`OnyxNavBar`):** Persistent top/left area independent of scroll containers, providing access to top-level views.\n2. **Sidebar (`OnyxSidebar`):** Persistent left/right sidebar used for secondary navigation or master-detail detail panels.\n3. **Page Content (`OnyxPageLayout`):** The flexible central area governed by the grid system and acting as the primary scroll container.\n4. **Bottom Bar (`OnyxBottomBar`):** Scroll-independent sticky bar at the bottom for status confirmations or primary page-level triggers.\n\n### Component Alignment Rule\n\n* **STRICT Left-Alignment:** All internal component layout structures must be left-aligned to preserve scannability.\n* **Exception:** Tables and data grids may utilize center/right alignment within specific columns depending on data type formats (e.g. numeric currencies).\n\n### Visual Rhythm & Grouping\n\n* **Spatial Grouping:** Group functionally related components together using generous empty space (white space), typography, or dividers to minimize cognitive load. Ensure balanced proportions across all section distributions.\n\n***\n\n## Validation & Quality Check\n\nAfter writing custom layouts or styling overrides, you **MUST** run the following verification steps:\n\n1. **CSS Variables Audit:** Scan your stylesheets for any hardcoded hex, rgb, or hsl values, or direct global/component variable usages. Replace them with proper `--onyx-` semantic variables.\n2. **Layout Alignment Check:** Verify all custom component interiors are left-aligned (with the exception of specific table/data grid columns).\n3. **Responsive Verification:** Verify your CSS container-query selectors are properly paired with a parent `container-type: inline-size;`. Ensure no breakpoint styles break responsive fluidity.\n";
126
+ var raw$2 = "---\nname: onyx-foundation\ndescription: Styling foundations, CSS variables, layout grid, breakpoints, and responsive mixins for Onyx. Use when writing custom CSS, designing layouts, or ensuring theme compliance.\nlicense: Apache-2.0\n---\n\n# Onyx Foundation & Theming\n\nApply Onyx styling foundations, CSS variables, responsive grid, and layout rules.\n\n## Theming & Colors\n\nOnyx supports light and dark themes out-of-the-box. Theme switching is handled automatically.\n\n### Rule: CSS Variables Only\n\n**NEVER hardcode hex, rgb, or hsl color values!** Always use semantic Onyx CSS variables (prefixed with `--onyx-`).\n\n- **Base backgrounds:** `var(--onyx-color-base-background-tinted)`, `var(--onyx-color-base-background-blank)`\n- **Primary brand:** `var(--onyx-color-base-primary-500)`, `var(--onyx-color-base-primary-100)`\n- **Text & icons:** `var(--onyx-color-text-icons-primary-soft)`, `var(--onyx-color-text-icons-primary-medium)`, `var(--onyx-color-text-icons-primary-intense)`\n- **Component states:** `var(--onyx-color-component-cta-default)`, `var(--onyx-color-component-border-primary)`, `var(--onyx-color-component-focus-primary)`\n\n_Note: Access ONLY Semantic variables. Do NOT use global or component variables directly in applications._\n\n### Rule: No custom animations\n\n**NEVER add animations or transitions unprompted!** Only add them when explicitly asked for and use the Onyx duration CSS variables:\n\n- `--onyx-duration-sm`\n- `--onyx-duration-md`\n- `--onyx-duration-lg`\n\n## Density\n\nDensity levels control the vertical white space and heights (base heights: Compact = 32px, Default = 40px, Cozy = 48px).\nApply density via properties on supported components or by adding these CSS classes to any element:\n\n- `.onyx-density-compact`\n- `.onyx-density-default`\n- `.onyx-density-cozy`\n\n## Breakpoints\n\nThe design system defines six standard breakpoints:\n\n- `2xs`: `320px` to `576px` (Max 4 columns)\n- `xs`: `577px` to `768px` (Max 8 columns)\n- `sm`: `769px` to `992px` (Max 8 columns)\n- `md`: `993px` to `1440px` (Max 12 columns)\n- `lg`: `1441px` to `1920px` (Max 12 or 16 columns)\n- `xl`: `1921px` and beyond (Max 12, 16, or 20 columns)\n\n### Responsive SCSS Mixins\n\nImport `\"sit-onyx/breakpoints.scss\"` to apply media or container queries:\n\n```scss\n@use \"sit-onyx/breakpoints.scss\";\n\n// Media queries (compares against whole screen width)\n.my-screen-class {\n @include breakpoints.screen(max, sm) {\n /* styles for sm and smaller */\n }\n @include breakpoints.screen(min, md) {\n /* styles for md and larger */\n }\n}\n\n// Container queries (compares against nearest container width)\n// MUST set container-type on the parent element\n.my-container-class {\n container-type: inline-size;\n\n @include breakpoints.container(max, md) {\n /* styles for md container and smaller */\n }\n @include breakpoints.container(min, lg) {\n /* styles for lg container and larger */\n }\n}\n```\n\n## Grid System\n\nOnyx uses container-query-based grids. The nearest parent component with `container-type: inline-size;` (automatically set by `OnyxPageLayout`, `OnyxAppLayout`, `OnyxSidebar`) determines the active grid width.\n\n### Grid Classes\n\n- **Container:** `.onyx-grid` (Defines a grid container)\n- **Spanning Columns:** `.onyx-grid-span-<number>` (Define exact span from 1 to 12)\n- **Full Width:** `.onyx-grid-span-full` (Span all available columns)\n- **Breakpoint-Specific Span:** `.onyx-grid-<breakpoint>-span-<number>` (Define column span for a specific breakpoint **and larger**)\n\n### Grid Margin\n\nApply `.onyx-grid-layout` manually to wrap page contents and add outer page margins if not using `OnyxPageLayout`.\n\n```vue\n<template>\n <div class=\"onyx-grid\">\n <!-- Spans 4 cols on smaller screens, 6 on md and larger -->\n <OnyxCard class=\"onyx-grid-span-4 onyx-grid-md-span-6\">Content</OnyxCard>\n\n <!-- Spans full width always -->\n <OnyxCard class=\"onyx-grid-span-full\">Footer / Hero</OnyxCard>\n </div>\n</template>\n```\n\n### Grid Customization\n\nSet these CSS classes on the root element of your application (e.g. `OnyxAppLayout`):\n\n- **Limit Max Width:** `onyx-grid-max-md` (max 1440px) or `onyx-grid-max-lg` (max 1920px)\n- **Alignment:** `onyx-grid-center` (Centers the layout when screen size exceeds max width)\n- **Max Columns (lg and beyond):** `onyx-grid-lg-16` (16 columns) or `onyx-grid-xl-20` (20 columns)\n\n## Page Layout (`OnyxPageLayout`)\n\nImplement the `OnyxPageLayout` component as the root element on every individual page/view to ensure standardized paddings, page-level scroll behavior, and unified outer page margins.\n\n```vue\n<template>\n <OnyxPageLayout>\n <OnyxHeadline is=\"h1\">Page Title</OnyxHeadline>\n </OnyxPageLayout>\n</template>\n```\n\nFor recurring page elements (like sidebars, footers, or sub-navigation), wrap the `OnyxPageLayout` in a reusable component or a Nuxt layout.\n\n## Layout Principles & Page Anatomy\n\nAll custom layout constructions must align with the core Onyx layout guidelines:\n\n### Core Principles\n\n- **Responsive:** Layouts must fluidly adapt to maintain usability and visual hierarchy across all device sizes.\n- **Content-Driven:** Prioritize structural layout decisions based on the content's hierarchy and user needs, not vice versa.\n\n### The Four Page Anatomy Regions\n\n1. **Main Navigation (`OnyxNavBar`):** Persistent top/left area independent of scroll containers, providing access to top-level views.\n2. **Sidebar (`OnyxSidebar`):** Persistent left/right sidebar used for secondary navigation or master-detail detail panels.\n3. **Page Content (`OnyxPageLayout`):** The flexible central area governed by the grid system and acting as the primary scroll container.\n4. **Bottom Bar (`OnyxBottomBar`):** Scroll-independent sticky bar at the bottom for status confirmations or primary page-level triggers.\n\n### Component Alignment Rule\n\n- **STRICT Left-Alignment:** All internal component layout structures must be left-aligned to preserve scannability.\n- **Exception:** Tables and data grids may utilize center/right alignment within specific columns depending on data type formats (e.g. numeric currencies).\n\n### Visual Rhythm & Grouping\n\n- **Spatial Grouping:** Group functionally related components together using generous empty space (white space), typography, or dividers to minimize cognitive load. Ensure balanced proportions across all section distributions.\n\n---\n\n## Validation & Quality Check\n\nAfter writing custom layouts or styling overrides, you **MUST** run the following verification steps:\n\n1. **CSS Variables Audit:** Scan your stylesheets for any hardcoded hex, rgb, or hsl values, or direct global/component variable usages. Replace them with proper `--onyx-` semantic variables.\n2. **Layout Alignment Check:** Verify all custom component interiors are left-aligned (with the exception of specific table/data grid columns).\n3. **Responsive Verification:** Verify your CSS container-query selectors are properly paired with a parent `container-type: inline-size;`. Ensure no breakpoint styles break responsive fluidity.\n";
120
127
  var frontmatter$2 = {
121
128
  "name": "onyx-foundation",
122
129
  "description": "Styling foundations, CSS variables, layout grid, breakpoints, and responsive mixins for Onyx. Use when writing custom CSS, designing layouts, or ensuring theme compliance.",
@@ -347,7 +354,10 @@ function assignProp(target, prop, value) {
347
354
  }
348
355
  function mergeDefs(...defs) {
349
356
  const mergedDescriptors = {};
350
- for (const def of defs) Object.assign(mergedDescriptors, Object.getOwnPropertyDescriptors(def));
357
+ for (const def of defs) {
358
+ const descriptors = Object.getOwnPropertyDescriptors(def);
359
+ Object.assign(mergedDescriptors, descriptors);
360
+ }
351
361
  return Object.defineProperties({}, mergedDescriptors);
352
362
  }
353
363
  function esc(str) {
@@ -669,7 +679,7 @@ var _parse = (_Err) => (schema, value, _ctx, _params) => {
669
679
  }, ctx);
670
680
  if (result instanceof Promise) throw new $ZodAsyncError();
671
681
  if (result.issues.length) {
672
- const e = new (_params?.Err ?? _Err)(result.issues.map((iss) => finalizeIssue(iss, ctx, config())));
682
+ const e = new ((_params?.Err) ?? _Err)(result.issues.map((iss) => finalizeIssue(iss, ctx, config())));
673
683
  captureStackTrace(e, _params?.callee);
674
684
  throw e;
675
685
  }
@@ -687,7 +697,7 @@ var _parseAsync = (_Err) => async (schema, value, _ctx, params) => {
687
697
  }, ctx);
688
698
  if (result instanceof Promise) result = await result;
689
699
  if (result.issues.length) {
690
- const e = new (params?.Err ?? _Err)(result.issues.map((iss) => finalizeIssue(iss, ctx, config())));
700
+ const e = new ((params?.Err) ?? _Err)(result.issues.map((iss) => finalizeIssue(iss, ctx, config())));
691
701
  captureStackTrace(e, params?.callee);
692
702
  throw e;
693
703
  }
@@ -1650,7 +1660,7 @@ var $ZodBoolean = /*@__PURE__*/ $constructor("$ZodBoolean", (inst, def) => {
1650
1660
  var $ZodNull = /*@__PURE__*/ $constructor("$ZodNull", (inst, def) => {
1651
1661
  $ZodType.init(inst, def);
1652
1662
  inst._zod.pattern = _null$2;
1653
- inst._zod.values = new Set([null]);
1663
+ inst._zod.values = /* @__PURE__ */ new Set([null]);
1654
1664
  inst._zod.parse = (payload, _ctx) => {
1655
1665
  const input = payload.value;
1656
1666
  if (input === null) return payload;
@@ -1797,13 +1807,13 @@ var $ZodObject = /*@__PURE__*/ $constructor("$ZodObject", (inst, def) => {
1797
1807
  }
1798
1808
  return propValues;
1799
1809
  });
1800
- const isObject$1 = isObject;
1810
+ const isObject$2 = isObject;
1801
1811
  const catchall = def.catchall;
1802
1812
  let value;
1803
1813
  inst._zod.parse = (payload, ctx) => {
1804
1814
  value ?? (value = _normalized.value);
1805
1815
  const input = payload.value;
1806
- if (!isObject$1(input)) {
1816
+ if (!isObject$2(input)) {
1807
1817
  payload.issues.push({
1808
1818
  expected: "object",
1809
1819
  code: "invalid_type",
@@ -1926,7 +1936,7 @@ var $ZodObjectJIT = /*@__PURE__*/ $constructor("$ZodObjectJIT", (inst, def) => {
1926
1936
  return (payload, ctx) => fn(shape, payload, ctx);
1927
1937
  };
1928
1938
  let fastpass;
1929
- const isObject$2 = isObject;
1939
+ const isObject$1 = isObject;
1930
1940
  const jit = !globalConfig.jitless;
1931
1941
  const fastEnabled = jit && allowsEval.value;
1932
1942
  const catchall = def.catchall;
@@ -1934,7 +1944,7 @@ var $ZodObjectJIT = /*@__PURE__*/ $constructor("$ZodObjectJIT", (inst, def) => {
1934
1944
  inst._zod.parse = (payload, ctx) => {
1935
1945
  value ?? (value = _normalized.value);
1936
1946
  const input = payload.value;
1937
- if (!isObject$2(input)) {
1947
+ if (!isObject$1(input)) {
1938
1948
  payload.issues.push({
1939
1949
  expected: "object",
1940
1950
  code: "invalid_type",
@@ -2280,7 +2290,7 @@ var $ZodOptional = /*@__PURE__*/ $constructor("$ZodOptional", (inst, def) => {
2280
2290
  inst._zod.optin = "optional";
2281
2291
  inst._zod.optout = "optional";
2282
2292
  defineLazy(inst._zod, "values", () => {
2283
- return def.innerType._zod.values ? new Set([...def.innerType._zod.values, void 0]) : void 0;
2293
+ return def.innerType._zod.values ? /* @__PURE__ */ new Set([...def.innerType._zod.values, void 0]) : void 0;
2284
2294
  });
2285
2295
  defineLazy(inst._zod, "pattern", () => {
2286
2296
  const pattern = def.innerType._zod.pattern;
@@ -2314,7 +2324,7 @@ var $ZodNullable = /*@__PURE__*/ $constructor("$ZodNullable", (inst, def) => {
2314
2324
  return pattern ? new RegExp(`^(${cleanRegex(pattern.source)}|null)$`) : void 0;
2315
2325
  });
2316
2326
  defineLazy(inst._zod, "values", () => {
2317
- return def.innerType._zod.values ? new Set([...def.innerType._zod.values, null]) : void 0;
2327
+ return def.innerType._zod.values ? /* @__PURE__ */ new Set([...def.innerType._zod.values, null]) : void 0;
2318
2328
  });
2319
2329
  inst._zod.parse = (payload, ctx) => {
2320
2330
  if (payload.value === null) return payload;
@@ -5685,7 +5695,7 @@ var require_text_decoder = /* @__PURE__ */ __commonJSMin(((exports, module) => {
5685
5695
  }
5686
5696
  }));
5687
5697
  //#endregion
5688
- //#region ../../node_modules/.pnpm/streamx@2.27.0/node_modules/streamx/lib/errors.js
5698
+ //#region ../../node_modules/.pnpm/streamx@2.28.0/node_modules/streamx/lib/errors.js
5689
5699
  var require_errors = /* @__PURE__ */ __commonJSMin(((exports, module) => {
5690
5700
  module.exports = class StreamError extends Error {
5691
5701
  constructor(msg, code, fn = StreamError) {
@@ -5723,7 +5733,7 @@ var require_errors = /* @__PURE__ */ __commonJSMin(((exports, module) => {
5723
5733
  };
5724
5734
  }));
5725
5735
  //#endregion
5726
- //#region ../../node_modules/.pnpm/streamx@2.27.0/node_modules/streamx/index.js
5736
+ //#region ../../node_modules/.pnpm/streamx@2.28.0/node_modules/streamx/index.js
5727
5737
  var require_streamx = /* @__PURE__ */ __commonJSMin(((exports, module) => {
5728
5738
  var { EventEmitter } = require_default();
5729
5739
  var FIFO = require_fast_fifo();
@@ -7747,7 +7757,8 @@ var s = (t, i, e) => {
7747
7757
  s = o + 2, n--;
7748
7758
  } while (n > 0);
7749
7759
  throw new Error("Too many escaping");
7750
- }, n = (t, i, e) => {
7760
+ };
7761
+ var n = (t, i, e) => {
7751
7762
  let r = e, o = 1e4;
7752
7763
  do {
7753
7764
  const e = i.map((i) => t.indexOf(i, r));
@@ -7785,7 +7796,8 @@ var s = (t, i, e) => {
7785
7796
  o--;
7786
7797
  } while (o > 0);
7787
7798
  throw new Error("Too many escaping");
7788
- }, r = /\/\*[^]*?(?:\*\/|$)/g;
7799
+ };
7800
+ var r = /\/\*[^]*?(?:\*\/|$)/g;
7789
7801
  function o(t) {
7790
7802
  return t ? t.trim() : "";
7791
7803
  }
@@ -8460,7 +8472,7 @@ var resourceToTool = (resource) => {
8460
8472
  //#endregion
8461
8473
  //#region src/server/server.ts
8462
8474
  var { name, version, description } = package_default;
8463
- var createServer = ({ resourcesAsTools }) => {
8475
+ var createServer = ({ resourcesAsTools, exclude }) => {
8464
8476
  /**
8465
8477
  * Internal McpServer, which provides the MCP resources.
8466
8478
  */
@@ -8468,10 +8480,14 @@ var createServer = ({ resourcesAsTools }) => {
8468
8480
  name,
8469
8481
  version,
8470
8482
  description,
8471
- websiteUrl: "https://onyx.schwarz"
8483
+ websiteUrl: "https://onyx.schwarz/development/packages/mcp.html"
8472
8484
  });
8473
- resources.forEach((resource) => server.registerResource(...resource));
8474
- if (resourcesAsTools) resources.map((r) => resourceToTool(r)).forEach((t) => server.registerTool(...t));
8485
+ for (const resource of resources) {
8486
+ const uri = typeof resource[1] === "string" ? resource[1] : resource[1].uriTemplate.expand({});
8487
+ if (exclude && new RegExp(exclude).test(uri)) continue;
8488
+ server.registerResource(...resource);
8489
+ if (resourcesAsTools) server.registerTool(...resourceToTool(resource));
8490
+ }
8475
8491
  return server;
8476
8492
  };
8477
8493
  //#endregion
@@ -8492,7 +8508,7 @@ var SUPPORTED_TRANSPORTS = {
8492
8508
  http: run
8493
8509
  };
8494
8510
  if (import.meta.main) {
8495
- const { values: { transport, version, help, resourcesAsTools, writeSkills } } = parseArgs({
8511
+ const { values: { transport, version, help, resourcesAsTools, writeSkills, exclude } } = parseArgs({
8496
8512
  args: process.argv.slice(2),
8497
8513
  options: {
8498
8514
  transport: {
@@ -8509,6 +8525,10 @@ if (import.meta.main) {
8509
8525
  type: "string",
8510
8526
  short: "w"
8511
8527
  },
8528
+ exclude: {
8529
+ type: "string",
8530
+ short: "e"
8531
+ },
8512
8532
  help: {
8513
8533
  type: "boolean",
8514
8534
  short: "h",
@@ -8535,7 +8555,8 @@ Options:
8535
8555
  The "http" transport considers PORT and HOST environment variables, when starting the server.
8536
8556
  -r, --resourcesAsTools Some LLM Coding Assistants (e.g. Gemini) are not able to to use MCP resources (yet).
8537
8557
  This setting makes resources also available as tools to support these Coding Assistants.
8538
- -w, --writeSkills <directory> Write skill resources to SKILL.md files in the specified directory.
8558
+ -w, --writeSkills <directory> Write skill resources to SKILL.md files in the specified directory.
8559
+ -e, --exclude <regex-pattern> Exclude/Filter capabilities by their URI. E.g. '-e "skill"' to exclude skills.
8539
8560
  -h, --help Show this help text and quit.
8540
8561
  -v, --version Show version number and quit.`);
8541
8562
  process.exit(0);
@@ -8548,7 +8569,10 @@ Options:
8548
8569
  process.exit(0);
8549
8570
  } else {
8550
8571
  if (!Object.keys(SUPPORTED_TRANSPORTS).includes(transport)) throw new Error(`Unsupported transport: ${transport}`);
8551
- const getServer = () => createServer({ resourcesAsTools });
8572
+ const getServer = () => createServer({
8573
+ resourcesAsTools,
8574
+ exclude
8575
+ });
8552
8576
  await SUPPORTED_TRANSPORTS[transport](getServer);
8553
8577
  }
8554
8578
  }
@@ -1,6 +1,7 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  type CreateServerOptions = {
3
3
  resourcesAsTools: boolean;
4
+ exclude?: string;
4
5
  };
5
- export declare const createServer: ({ resourcesAsTools }: CreateServerOptions) => McpServer;
6
+ export declare const createServer: ({ resourcesAsTools, exclude }: CreateServerOptions) => McpServer;
6
7
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sit-onyx/modelcontextprotocol",
3
- "version": "0.3.0-dev-20260715161231",
3
+ "version": "0.4.0-dev-20260728073608",
4
4
  "description": "MCP (Model Context Protocol) Server that provide onyx specific tools and resources.",
5
5
  "homepage": "https://onyx.schwarz",
6
6
  "bugs": {
@@ -40,7 +40,7 @@
40
40
  "typescript": "6.0.3",
41
41
  "unified": "^11.0.5",
42
42
  "unplugin-dts": "1.0.3",
43
- "vite": "8.0.16",
43
+ "vite": "8.1.5",
44
44
  "vue-component-meta": "3.3.7",
45
45
  "yaml": "^2.9.0",
46
46
  "zod": "^4.4.3",