@julianpedro/plugin-dev-ai-hub-common 0.2.0 → 0.3.0

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/dist/index.cjs.js CHANGED
@@ -8,6 +8,7 @@ var installPaths = require('./installPaths.cjs.js');
8
8
  exports.AiAssetFrontmatterSchema = schemas.AiAssetFrontmatterSchema;
9
9
  exports.AiToolEnum = schemas.AiToolEnum;
10
10
  exports.AssetTypeEnum = schemas.AssetTypeEnum;
11
+ exports.McpCatalogFileSchema = schemas.McpCatalogFileSchema;
11
12
  exports.getInstallPath = installPaths.getInstallPath;
12
13
  exports.getInstallPathsForAsset = installPaths.getInstallPathsForAsset;
13
14
  //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,27 @@
1
1
  import { z } from 'zod';
2
2
 
3
- type AssetType = 'instruction' | 'agent' | 'skill' | 'workflow';
3
+ type AssetType = 'instruction' | 'agent' | 'skill' | 'workflow' | 'bundle';
4
4
  type AiTool = 'all' | 'github-copilot' | 'claude-code' | 'google-gemini' | 'cursor';
5
+ interface BundleItem {
6
+ ref: string;
7
+ assetId?: string;
8
+ name?: string;
9
+ label?: string;
10
+ type?: Exclude<AssetType, 'bundle'>;
11
+ description?: string;
12
+ tools?: AiTool[];
13
+ }
14
+ interface McpCatalogEntry {
15
+ id: string;
16
+ name: string;
17
+ description?: string;
18
+ icon?: string;
19
+ type: 'http' | 'stdio';
20
+ url?: string;
21
+ command?: string;
22
+ args?: string[];
23
+ env?: Record<string, string>;
24
+ }
5
25
  /** Lightweight summary returned by list endpoints — no markdown content. */
6
26
  interface AiAssetSummary {
7
27
  id: string;
@@ -17,6 +37,8 @@ interface AiAssetSummary {
17
37
  icon?: string;
18
38
  version: string;
19
39
  installCount: number;
40
+ /** Number of items in a bundle (only set for type === 'bundle'). */
41
+ itemCount?: number;
20
42
  syncedAt: string;
21
43
  createdAt: string;
22
44
  updatedAt: string;
@@ -49,6 +71,8 @@ interface AiAsset {
49
71
  * Only populated for assets of type `skill` that declare `resources` in the envelope.
50
72
  */
51
73
  resourcesContent?: Record<string, string>;
74
+ /** Resolved bundle items — only populated for type === 'bundle'. */
75
+ items?: BundleItem[];
52
76
  /** Path of the .yaml file in the repository */
53
77
  yamlPath: string;
54
78
  /** Path of the .md file in the repository */
@@ -96,7 +120,7 @@ interface AssetListFilter {
96
120
  }
97
121
 
98
122
  declare const AiToolEnum: z.ZodEnum<["all", "github-copilot", "claude-code", "google-gemini", "cursor"]>;
99
- declare const AssetTypeEnum: z.ZodEnum<["instruction", "agent", "skill", "workflow"]>;
123
+ declare const AssetTypeEnum: z.ZodEnum<["instruction", "agent", "skill", "workflow", "bundle"]>;
100
124
  /**
101
125
  * Schema for the YAML metadata file (.yaml) that acts as an envelope.
102
126
  * The actual asset content lives in the referenced .md file.
@@ -109,7 +133,7 @@ declare const AiAssetFrontmatterSchema: z.ZodObject<{
109
133
  /** Human-readable display label shown in the UI. Falls back to `name` when omitted. */
110
134
  label: z.ZodOptional<z.ZodString>;
111
135
  description: z.ZodString;
112
- type: z.ZodEnum<["instruction", "agent", "skill", "workflow"]>;
136
+ type: z.ZodEnum<["instruction", "agent", "skill", "workflow", "bundle"]>;
113
137
  tools: z.ZodArray<z.ZodEnum<["all", "github-copilot", "claude-code", "google-gemini", "cursor"]>, "many">;
114
138
  tags: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
115
139
  author: z.ZodDefault<z.ZodOptional<z.ZodString>>;
@@ -119,6 +143,13 @@ declare const AiAssetFrontmatterSchema: z.ZodObject<{
119
143
  installPath: z.ZodOptional<z.ZodString>;
120
144
  installPaths: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
121
145
  resources: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
146
+ items: z.ZodOptional<z.ZodArray<z.ZodObject<{
147
+ ref: z.ZodString;
148
+ }, "strip", z.ZodTypeAny, {
149
+ ref: string;
150
+ }, {
151
+ ref: string;
152
+ }>, "many">>;
122
153
  }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
123
154
  /** Path to the .md content file, relative to the .yaml file directory.
124
155
  * If omitted, the parser falls back to <same-name>.md by convention. */
@@ -127,7 +158,7 @@ declare const AiAssetFrontmatterSchema: z.ZodObject<{
127
158
  /** Human-readable display label shown in the UI. Falls back to `name` when omitted. */
128
159
  label: z.ZodOptional<z.ZodString>;
129
160
  description: z.ZodString;
130
- type: z.ZodEnum<["instruction", "agent", "skill", "workflow"]>;
161
+ type: z.ZodEnum<["instruction", "agent", "skill", "workflow", "bundle"]>;
131
162
  tools: z.ZodArray<z.ZodEnum<["all", "github-copilot", "claude-code", "google-gemini", "cursor"]>, "many">;
132
163
  tags: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
133
164
  author: z.ZodDefault<z.ZodOptional<z.ZodString>>;
@@ -137,6 +168,13 @@ declare const AiAssetFrontmatterSchema: z.ZodObject<{
137
168
  installPath: z.ZodOptional<z.ZodString>;
138
169
  installPaths: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
139
170
  resources: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
171
+ items: z.ZodOptional<z.ZodArray<z.ZodObject<{
172
+ ref: z.ZodString;
173
+ }, "strip", z.ZodTypeAny, {
174
+ ref: string;
175
+ }, {
176
+ ref: string;
177
+ }>, "many">>;
140
178
  }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
141
179
  /** Path to the .md content file, relative to the .yaml file directory.
142
180
  * If omitted, the parser falls back to <same-name>.md by convention. */
@@ -145,7 +183,7 @@ declare const AiAssetFrontmatterSchema: z.ZodObject<{
145
183
  /** Human-readable display label shown in the UI. Falls back to `name` when omitted. */
146
184
  label: z.ZodOptional<z.ZodString>;
147
185
  description: z.ZodString;
148
- type: z.ZodEnum<["instruction", "agent", "skill", "workflow"]>;
186
+ type: z.ZodEnum<["instruction", "agent", "skill", "workflow", "bundle"]>;
149
187
  tools: z.ZodArray<z.ZodEnum<["all", "github-copilot", "claude-code", "google-gemini", "cursor"]>, "many">;
150
188
  tags: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
151
189
  author: z.ZodDefault<z.ZodOptional<z.ZodString>>;
@@ -155,6 +193,13 @@ declare const AiAssetFrontmatterSchema: z.ZodObject<{
155
193
  installPath: z.ZodOptional<z.ZodString>;
156
194
  installPaths: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
157
195
  resources: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
196
+ items: z.ZodOptional<z.ZodArray<z.ZodObject<{
197
+ ref: z.ZodString;
198
+ }, "strip", z.ZodTypeAny, {
199
+ ref: string;
200
+ }, {
201
+ ref: string;
202
+ }>, "many">>;
158
203
  }, z.ZodTypeAny, "passthrough">>;
159
204
  type AiAssetFrontmatter = z.infer<typeof AiAssetFrontmatterSchema>;
160
205
 
@@ -176,4 +221,4 @@ declare function getInstallPath(type: AssetType, tool: AiTool | string, name: st
176
221
  declare function getInstallPathsForAsset(type: AssetType, tools: (AiTool | string)[], name: string, overrides?: InstallPathOverrides): Record<string, string>;
177
222
 
178
223
  export { AiAssetFrontmatterSchema, AiToolEnum, AssetTypeEnum, getInstallPath, getInstallPathsForAsset };
179
- export type { AiAsset, AiAssetFrontmatter, AiAssetListResponse, AiAssetSummary, AiHubProvider, AiHubStats, AiTool, AssetListFilter, AssetType, InstallPathOverrides };
224
+ export type { AiAsset, AiAssetFrontmatter, AiAssetListResponse, AiAssetSummary, AiHubProvider, AiHubStats, AiTool, AssetListFilter, AssetType, BundleItem, InstallPathOverrides, McpCatalogEntry };
package/dist/index.esm.js CHANGED
@@ -1,3 +1,3 @@
1
- export { AiAssetFrontmatterSchema, AiToolEnum, AssetTypeEnum } from './schemas.esm.js';
1
+ export { AiAssetFrontmatterSchema, AiToolEnum, AssetTypeEnum, McpCatalogFileSchema } from './schemas.esm.js';
2
2
  export { getInstallPath, getInstallPathsForAsset } from './installPaths.esm.js';
3
3
  //# sourceMappingURL=index.esm.js.map
@@ -4,6 +4,14 @@ function toSlug(name) {
4
4
  return name.toLowerCase().replace(/\s+/g, "-").replace(/[^a-z0-9-_]/g, "");
5
5
  }
6
6
  const CONVENTIONS = {
7
+ bundle: {
8
+ "claude-code": () => "",
9
+ "github-copilot": () => "",
10
+ "google-gemini": () => "",
11
+ "cursor": () => "",
12
+ "all": () => "",
13
+ "default": () => ""
14
+ },
7
15
  instruction: {
8
16
  "claude-code": (name) => `.claude/rules/${name}.md`,
9
17
  "github-copilot": (name) => `.github/instructions/${name}.instructions.md`,
@@ -46,6 +54,7 @@ function getInstallPath(type, tool, name, overrides) {
46
54
  return fn(slug);
47
55
  }
48
56
  function getInstallPathsForAsset(type, tools, name, overrides) {
57
+ if (type === "bundle") return {};
49
58
  const ALL_TOOLS = ["claude-code", "github-copilot", "google-gemini", "cursor"];
50
59
  const resolvedTools = tools.includes("all") ? ALL_TOOLS : tools;
51
60
  return Object.fromEntries(
@@ -1 +1 @@
1
- {"version":3,"file":"installPaths.cjs.js","sources":["../src/installPaths.ts"],"sourcesContent":["import type { AssetType, AiTool } from './types';\n\n/** Sanitize asset name for use in file paths */\nfunction toSlug(name: string): string {\n return name.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-_]/g, '');\n}\n\n/**\n * Convention table: (type, tool) → install path template.\n * Returns the recommended filesystem path for an asset given the target tool.\n *\n * Priority: installPaths[tool] > installPath > convention below.\n */\nconst CONVENTIONS: Record<AssetType, Record<AiTool | 'default', (name: string) => string>> = {\n instruction: {\n 'claude-code': name => `.claude/rules/${name}.md`,\n 'github-copilot': name => `.github/instructions/${name}.instructions.md`,\n 'google-gemini': _ => `GEMINI.md`,\n 'cursor': name => `.cursor/rules/${name}.mdc`,\n 'all': name => `.ai/instructions/${name}.md`,\n 'default': name => `.ai/instructions/${name}.md`,\n },\n agent: {\n 'claude-code': name => `.claude/agents/${name}.md`,\n 'github-copilot': name => `.github/agents/${name}.agent.md`,\n 'google-gemini': _ => `GEMINI.md`,\n 'cursor': name => `.cursor/rules/${name}.mdc`,\n 'all': name => `.ai/agents/${name}.md`,\n 'default': name => `.ai/agents/${name}.md`,\n },\n skill: {\n 'claude-code': name => `.claude/skills/${name}/SKILL.md`,\n 'github-copilot': name => `.claude/skills/${name}/SKILL.md`,\n 'google-gemini': name => `.claude/skills/${name}/SKILL.md`,\n 'cursor': name => `.cursor/skills/${name}/SKILL.md`,\n 'all': name => `.claude/skills/${name}/SKILL.md`,\n 'default': name => `.claude/skills/${name}/SKILL.md`,\n },\n workflow: {\n 'claude-code': name => `.claude/workflows/${name}.md`,\n 'github-copilot': name => `.github/workflows/${name}.workflow.md`,\n 'google-gemini': name => `.gemini/workflows/${name}.md`,\n 'cursor': name => `.cursor/rules/${name}.mdc`,\n 'all': name => `.ai/workflows/${name}.md`,\n 'default': name => `.ai/workflows/${name}.md`,\n },\n};\n\nexport interface InstallPathOverrides {\n /** Single path override — applies to all tools when installPaths has no entry for the tool */\n installPath?: string;\n /** Per-tool path overrides — highest priority */\n installPaths?: Record<string, string>;\n}\n\n/**\n * Returns the recommended install path for an asset in a given tool's workspace.\n * Resolution order: installPaths[tool] > installPath > built-in convention.\n */\nexport function getInstallPath(\n type: AssetType,\n tool: AiTool | string,\n name: string,\n overrides?: InstallPathOverrides,\n): string {\n if (overrides?.installPaths?.[tool]) return overrides.installPaths[tool];\n if (overrides?.installPath) return overrides.installPath;\n\n const slug = toSlug(name);\n const toolConventions = CONVENTIONS[type];\n const fn = toolConventions[tool as AiTool] ?? toolConventions.default;\n return fn(slug);\n}\n\n/**\n * Returns install paths for all tools in the asset's tools list.\n * If tools contains 'all', returns paths for every known tool.\n */\nexport function getInstallPathsForAsset(\n type: AssetType,\n tools: (AiTool | string)[],\n name: string,\n overrides?: InstallPathOverrides,\n): Record<string, string> {\n const ALL_TOOLS: AiTool[] = ['claude-code', 'github-copilot', 'google-gemini', 'cursor'];\n const resolvedTools = tools.includes('all') ? ALL_TOOLS : tools;\n\n return Object.fromEntries(\n resolvedTools.map(tool => [tool, getInstallPath(type, tool, name, overrides)]),\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"installPaths.cjs.js","sources":["../src/installPaths.ts"],"sourcesContent":["import type { AssetType, AiTool } from './types';\n\n/** Sanitize asset name for use in file paths */\nfunction toSlug(name: string): string {\n return name.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-_]/g, '');\n}\n\n/**\n * Convention table: (type, tool) → install path template.\n * Returns the recommended filesystem path for an asset given the target tool.\n *\n * Priority: installPaths[tool] > installPath > convention below.\n */\nconst CONVENTIONS: Record<AssetType, Record<AiTool | 'default', (name: string) => string>> = {\n bundle: {\n 'claude-code': () => '',\n 'github-copilot': () => '',\n 'google-gemini': () => '',\n 'cursor': () => '',\n 'all': () => '', 'default': () => '',\n },\n instruction: {\n 'claude-code': name => `.claude/rules/${name}.md`,\n 'github-copilot': name => `.github/instructions/${name}.instructions.md`,\n 'google-gemini': _ => `GEMINI.md`,\n 'cursor': name => `.cursor/rules/${name}.mdc`,\n 'all': name => `.ai/instructions/${name}.md`,\n 'default': name => `.ai/instructions/${name}.md`,\n },\n agent: {\n 'claude-code': name => `.claude/agents/${name}.md`,\n 'github-copilot': name => `.github/agents/${name}.agent.md`,\n 'google-gemini': _ => `GEMINI.md`,\n 'cursor': name => `.cursor/rules/${name}.mdc`,\n 'all': name => `.ai/agents/${name}.md`,\n 'default': name => `.ai/agents/${name}.md`,\n },\n skill: {\n 'claude-code': name => `.claude/skills/${name}/SKILL.md`,\n 'github-copilot': name => `.claude/skills/${name}/SKILL.md`,\n 'google-gemini': name => `.claude/skills/${name}/SKILL.md`,\n 'cursor': name => `.cursor/skills/${name}/SKILL.md`,\n 'all': name => `.claude/skills/${name}/SKILL.md`,\n 'default': name => `.claude/skills/${name}/SKILL.md`,\n },\n workflow: {\n 'claude-code': name => `.claude/workflows/${name}.md`,\n 'github-copilot': name => `.github/workflows/${name}.workflow.md`,\n 'google-gemini': name => `.gemini/workflows/${name}.md`,\n 'cursor': name => `.cursor/rules/${name}.mdc`,\n 'all': name => `.ai/workflows/${name}.md`,\n 'default': name => `.ai/workflows/${name}.md`,\n },\n};\n\nexport interface InstallPathOverrides {\n /** Single path override — applies to all tools when installPaths has no entry for the tool */\n installPath?: string;\n /** Per-tool path overrides — highest priority */\n installPaths?: Record<string, string>;\n}\n\n/**\n * Returns the recommended install path for an asset in a given tool's workspace.\n * Resolution order: installPaths[tool] > installPath > built-in convention.\n */\nexport function getInstallPath(\n type: AssetType,\n tool: AiTool | string,\n name: string,\n overrides?: InstallPathOverrides,\n): string {\n if (overrides?.installPaths?.[tool]) return overrides.installPaths[tool];\n if (overrides?.installPath) return overrides.installPath;\n\n const slug = toSlug(name);\n const toolConventions = CONVENTIONS[type];\n const fn = toolConventions[tool as AiTool] ?? toolConventions.default;\n return fn(slug);\n}\n\n/**\n * Returns install paths for all tools in the asset's tools list.\n * If tools contains 'all', returns paths for every known tool.\n */\nexport function getInstallPathsForAsset(\n type: AssetType,\n tools: (AiTool | string)[],\n name: string,\n overrides?: InstallPathOverrides,\n): Record<string, string> {\n // Bundles have no single install path — they're composed of individual items\n if (type === 'bundle') return {};\n\n const ALL_TOOLS: AiTool[] = ['claude-code', 'github-copilot', 'google-gemini', 'cursor'];\n const resolvedTools = tools.includes('all') ? ALL_TOOLS : tools;\n\n return Object.fromEntries(\n resolvedTools.map(tool => [tool, getInstallPath(type, tool, name, overrides)]),\n );\n}\n"],"names":[],"mappings":"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"}
@@ -2,6 +2,14 @@ function toSlug(name) {
2
2
  return name.toLowerCase().replace(/\s+/g, "-").replace(/[^a-z0-9-_]/g, "");
3
3
  }
4
4
  const CONVENTIONS = {
5
+ bundle: {
6
+ "claude-code": () => "",
7
+ "github-copilot": () => "",
8
+ "google-gemini": () => "",
9
+ "cursor": () => "",
10
+ "all": () => "",
11
+ "default": () => ""
12
+ },
5
13
  instruction: {
6
14
  "claude-code": (name) => `.claude/rules/${name}.md`,
7
15
  "github-copilot": (name) => `.github/instructions/${name}.instructions.md`,
@@ -44,6 +52,7 @@ function getInstallPath(type, tool, name, overrides) {
44
52
  return fn(slug);
45
53
  }
46
54
  function getInstallPathsForAsset(type, tools, name, overrides) {
55
+ if (type === "bundle") return {};
47
56
  const ALL_TOOLS = ["claude-code", "github-copilot", "google-gemini", "cursor"];
48
57
  const resolvedTools = tools.includes("all") ? ALL_TOOLS : tools;
49
58
  return Object.fromEntries(
@@ -1 +1 @@
1
- {"version":3,"file":"installPaths.esm.js","sources":["../src/installPaths.ts"],"sourcesContent":["import type { AssetType, AiTool } from './types';\n\n/** Sanitize asset name for use in file paths */\nfunction toSlug(name: string): string {\n return name.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-_]/g, '');\n}\n\n/**\n * Convention table: (type, tool) → install path template.\n * Returns the recommended filesystem path for an asset given the target tool.\n *\n * Priority: installPaths[tool] > installPath > convention below.\n */\nconst CONVENTIONS: Record<AssetType, Record<AiTool | 'default', (name: string) => string>> = {\n instruction: {\n 'claude-code': name => `.claude/rules/${name}.md`,\n 'github-copilot': name => `.github/instructions/${name}.instructions.md`,\n 'google-gemini': _ => `GEMINI.md`,\n 'cursor': name => `.cursor/rules/${name}.mdc`,\n 'all': name => `.ai/instructions/${name}.md`,\n 'default': name => `.ai/instructions/${name}.md`,\n },\n agent: {\n 'claude-code': name => `.claude/agents/${name}.md`,\n 'github-copilot': name => `.github/agents/${name}.agent.md`,\n 'google-gemini': _ => `GEMINI.md`,\n 'cursor': name => `.cursor/rules/${name}.mdc`,\n 'all': name => `.ai/agents/${name}.md`,\n 'default': name => `.ai/agents/${name}.md`,\n },\n skill: {\n 'claude-code': name => `.claude/skills/${name}/SKILL.md`,\n 'github-copilot': name => `.claude/skills/${name}/SKILL.md`,\n 'google-gemini': name => `.claude/skills/${name}/SKILL.md`,\n 'cursor': name => `.cursor/skills/${name}/SKILL.md`,\n 'all': name => `.claude/skills/${name}/SKILL.md`,\n 'default': name => `.claude/skills/${name}/SKILL.md`,\n },\n workflow: {\n 'claude-code': name => `.claude/workflows/${name}.md`,\n 'github-copilot': name => `.github/workflows/${name}.workflow.md`,\n 'google-gemini': name => `.gemini/workflows/${name}.md`,\n 'cursor': name => `.cursor/rules/${name}.mdc`,\n 'all': name => `.ai/workflows/${name}.md`,\n 'default': name => `.ai/workflows/${name}.md`,\n },\n};\n\nexport interface InstallPathOverrides {\n /** Single path override — applies to all tools when installPaths has no entry for the tool */\n installPath?: string;\n /** Per-tool path overrides — highest priority */\n installPaths?: Record<string, string>;\n}\n\n/**\n * Returns the recommended install path for an asset in a given tool's workspace.\n * Resolution order: installPaths[tool] > installPath > built-in convention.\n */\nexport function getInstallPath(\n type: AssetType,\n tool: AiTool | string,\n name: string,\n overrides?: InstallPathOverrides,\n): string {\n if (overrides?.installPaths?.[tool]) return overrides.installPaths[tool];\n if (overrides?.installPath) return overrides.installPath;\n\n const slug = toSlug(name);\n const toolConventions = CONVENTIONS[type];\n const fn = toolConventions[tool as AiTool] ?? toolConventions.default;\n return fn(slug);\n}\n\n/**\n * Returns install paths for all tools in the asset's tools list.\n * If tools contains 'all', returns paths for every known tool.\n */\nexport function getInstallPathsForAsset(\n type: AssetType,\n tools: (AiTool | string)[],\n name: string,\n overrides?: InstallPathOverrides,\n): Record<string, string> {\n const ALL_TOOLS: AiTool[] = ['claude-code', 'github-copilot', 'google-gemini', 'cursor'];\n const resolvedTools = tools.includes('all') ? ALL_TOOLS : tools;\n\n return Object.fromEntries(\n resolvedTools.map(tool => [tool, getInstallPath(type, tool, name, overrides)]),\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"installPaths.esm.js","sources":["../src/installPaths.ts"],"sourcesContent":["import type { AssetType, AiTool } from './types';\n\n/** Sanitize asset name for use in file paths */\nfunction toSlug(name: string): string {\n return name.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-_]/g, '');\n}\n\n/**\n * Convention table: (type, tool) → install path template.\n * Returns the recommended filesystem path for an asset given the target tool.\n *\n * Priority: installPaths[tool] > installPath > convention below.\n */\nconst CONVENTIONS: Record<AssetType, Record<AiTool | 'default', (name: string) => string>> = {\n bundle: {\n 'claude-code': () => '',\n 'github-copilot': () => '',\n 'google-gemini': () => '',\n 'cursor': () => '',\n 'all': () => '', 'default': () => '',\n },\n instruction: {\n 'claude-code': name => `.claude/rules/${name}.md`,\n 'github-copilot': name => `.github/instructions/${name}.instructions.md`,\n 'google-gemini': _ => `GEMINI.md`,\n 'cursor': name => `.cursor/rules/${name}.mdc`,\n 'all': name => `.ai/instructions/${name}.md`,\n 'default': name => `.ai/instructions/${name}.md`,\n },\n agent: {\n 'claude-code': name => `.claude/agents/${name}.md`,\n 'github-copilot': name => `.github/agents/${name}.agent.md`,\n 'google-gemini': _ => `GEMINI.md`,\n 'cursor': name => `.cursor/rules/${name}.mdc`,\n 'all': name => `.ai/agents/${name}.md`,\n 'default': name => `.ai/agents/${name}.md`,\n },\n skill: {\n 'claude-code': name => `.claude/skills/${name}/SKILL.md`,\n 'github-copilot': name => `.claude/skills/${name}/SKILL.md`,\n 'google-gemini': name => `.claude/skills/${name}/SKILL.md`,\n 'cursor': name => `.cursor/skills/${name}/SKILL.md`,\n 'all': name => `.claude/skills/${name}/SKILL.md`,\n 'default': name => `.claude/skills/${name}/SKILL.md`,\n },\n workflow: {\n 'claude-code': name => `.claude/workflows/${name}.md`,\n 'github-copilot': name => `.github/workflows/${name}.workflow.md`,\n 'google-gemini': name => `.gemini/workflows/${name}.md`,\n 'cursor': name => `.cursor/rules/${name}.mdc`,\n 'all': name => `.ai/workflows/${name}.md`,\n 'default': name => `.ai/workflows/${name}.md`,\n },\n};\n\nexport interface InstallPathOverrides {\n /** Single path override — applies to all tools when installPaths has no entry for the tool */\n installPath?: string;\n /** Per-tool path overrides — highest priority */\n installPaths?: Record<string, string>;\n}\n\n/**\n * Returns the recommended install path for an asset in a given tool's workspace.\n * Resolution order: installPaths[tool] > installPath > built-in convention.\n */\nexport function getInstallPath(\n type: AssetType,\n tool: AiTool | string,\n name: string,\n overrides?: InstallPathOverrides,\n): string {\n if (overrides?.installPaths?.[tool]) return overrides.installPaths[tool];\n if (overrides?.installPath) return overrides.installPath;\n\n const slug = toSlug(name);\n const toolConventions = CONVENTIONS[type];\n const fn = toolConventions[tool as AiTool] ?? toolConventions.default;\n return fn(slug);\n}\n\n/**\n * Returns install paths for all tools in the asset's tools list.\n * If tools contains 'all', returns paths for every known tool.\n */\nexport function getInstallPathsForAsset(\n type: AssetType,\n tools: (AiTool | string)[],\n name: string,\n overrides?: InstallPathOverrides,\n): Record<string, string> {\n // Bundles have no single install path — they're composed of individual items\n if (type === 'bundle') return {};\n\n const ALL_TOOLS: AiTool[] = ['claude-code', 'github-copilot', 'google-gemini', 'cursor'];\n const resolvedTools = tools.includes('all') ? ALL_TOOLS : tools;\n\n return Object.fromEntries(\n resolvedTools.map(tool => [tool, getInstallPath(type, tool, name, overrides)]),\n );\n}\n"],"names":[],"mappings":"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"}
@@ -13,7 +13,8 @@ const AssetTypeEnum = zod.z.enum([
13
13
  "instruction",
14
14
  "agent",
15
15
  "skill",
16
- "workflow"
16
+ "workflow",
17
+ "bundle"
17
18
  ]);
18
19
  const AiAssetFrontmatterSchema = zod.z.object({
19
20
  /** Path to the .md content file, relative to the .yaml file directory.
@@ -34,10 +35,37 @@ const AiAssetFrontmatterSchema = zod.z.object({
34
35
  installPath: zod.z.string().optional(),
35
36
  installPaths: zod.z.record(zod.z.string()).optional(),
36
37
  // skill-specific
37
- resources: zod.z.array(zod.z.string()).optional()
38
+ resources: zod.z.array(zod.z.string()).optional(),
39
+ // bundle-specific
40
+ items: zod.z.array(zod.z.object({ ref: zod.z.string() })).optional(),
41
+ // usage guide — markdown shown when the user clicks the help button
42
+ help: zod.z.string().optional(),
43
+ // MCP servers required by this agent/skill
44
+ mcps: zod.z.array(
45
+ zod.z.union([
46
+ zod.z.string(),
47
+ zod.z.object({ id: zod.z.string(), name: zod.z.string().optional(), icon: zod.z.string().optional() })
48
+ ])
49
+ ).optional()
38
50
  }).passthrough();
51
+ const McpCatalogFileSchema = zod.z.object({
52
+ servers: zod.z.array(
53
+ zod.z.object({
54
+ id: zod.z.string().min(1),
55
+ name: zod.z.string().min(1),
56
+ description: zod.z.string().optional(),
57
+ icon: zod.z.string().optional(),
58
+ type: zod.z.enum(["http", "stdio"]),
59
+ url: zod.z.string().optional(),
60
+ command: zod.z.string().optional(),
61
+ args: zod.z.array(zod.z.string()).optional(),
62
+ env: zod.z.record(zod.z.string()).optional()
63
+ })
64
+ )
65
+ });
39
66
 
40
67
  exports.AiAssetFrontmatterSchema = AiAssetFrontmatterSchema;
41
68
  exports.AiToolEnum = AiToolEnum;
42
69
  exports.AssetTypeEnum = AssetTypeEnum;
70
+ exports.McpCatalogFileSchema = McpCatalogFileSchema;
43
71
  //# sourceMappingURL=schemas.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.cjs.js","sources":["../src/schemas.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const AiToolEnum = z.enum([\n 'all',\n 'github-copilot',\n 'claude-code',\n 'google-gemini',\n 'cursor',\n]);\n\nexport const AssetTypeEnum = z.enum([\n 'instruction',\n 'agent',\n 'skill',\n 'workflow',\n]);\n\n/**\n * Schema for the YAML metadata file (.yaml) that acts as an envelope.\n * The actual asset content lives in the referenced .md file.\n */\nexport const AiAssetFrontmatterSchema = z\n .object({\n /** Path to the .md content file, relative to the .yaml file directory.\n * If omitted, the parser falls back to <same-name>.md by convention. */\n content: z.string().optional(),\n name: z.string().min(1).max(200),\n /** Human-readable display label shown in the UI. Falls back to `name` when omitted. */\n label: z.string().min(1).max(200).optional(),\n description: z.string().min(1).max(500),\n type: AssetTypeEnum,\n tools: z.array(AiToolEnum).min(1),\n tags: z.array(z.string()).optional().default([]),\n author: z.string().optional().default('Unknown'),\n icon: z.string().optional(),\n version: z.string().optional().default('1.0.0'),\n updatedAt: z.string().optional(),\n // install path overrides\n installPath: z.string().optional(),\n installPaths: z.record(z.string()).optional(),\n // skill-specific\n resources: z.array(z.string()).optional(),\n })\n .passthrough();\n\nexport type AiAssetFrontmatter = z.infer<typeof AiAssetFrontmatterSchema>;\n"],"names":["z"],"mappings":";;;;AAEO,MAAM,UAAA,GAAaA,MAAE,IAAA,CAAK;AAAA,EAC/B,KAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAC;AAEM,MAAM,aAAA,GAAgBA,MAAE,IAAA,CAAK;AAAA,EAClC,aAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC;AAMM,MAAM,wBAAA,GAA2BA,MACrC,MAAA,CAAO;AAAA;AAAA;AAAA,EAGN,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,IAAA,EAAMA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA;AAAA;AAAA,EAE/B,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA,EAAS;AAAA,EAC3C,WAAA,EAAaA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA;AAAA,EACtC,IAAA,EAAM,aAAA;AAAA,EACN,OAAOA,KAAA,CAAE,KAAA,CAAM,UAAU,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAChC,IAAA,EAAMA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,EAC/C,QAAQA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,SAAS,CAAA;AAAA,EAC/C,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,SAASA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,OAAO,CAAA;AAAA,EAC9C,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE/B,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,cAAcA,KAAA,CAAE,MAAA,CAAOA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA;AAAA,EAE5C,WAAWA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA;AACjC,CAAC,EACA,WAAA;;;;;;"}
1
+ {"version":3,"file":"schemas.cjs.js","sources":["../src/schemas.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const AiToolEnum = z.enum([\n 'all',\n 'github-copilot',\n 'claude-code',\n 'google-gemini',\n 'cursor',\n]);\n\nexport const AssetTypeEnum = z.enum([\n 'instruction',\n 'agent',\n 'skill',\n 'workflow',\n 'bundle',\n]);\n\n/**\n * Schema for the YAML metadata file (.yaml) that acts as an envelope.\n * The actual asset content lives in the referenced .md file.\n */\nexport const AiAssetFrontmatterSchema = z\n .object({\n /** Path to the .md content file, relative to the .yaml file directory.\n * If omitted, the parser falls back to <same-name>.md by convention. */\n content: z.string().optional(),\n name: z.string().min(1).max(200),\n /** Human-readable display label shown in the UI. Falls back to `name` when omitted. */\n label: z.string().min(1).max(200).optional(),\n description: z.string().min(1).max(500),\n type: AssetTypeEnum,\n tools: z.array(AiToolEnum).min(1),\n tags: z.array(z.string()).optional().default([]),\n author: z.string().optional().default('Unknown'),\n icon: z.string().optional(),\n version: z.string().optional().default('1.0.0'),\n updatedAt: z.string().optional(),\n // install path overrides\n installPath: z.string().optional(),\n installPaths: z.record(z.string()).optional(),\n // skill-specific\n resources: z.array(z.string()).optional(),\n // bundle-specific\n items: z.array(z.object({ ref: z.string() })).optional(),\n // usage guide — markdown shown when the user clicks the help button\n help: z.string().optional(),\n // MCP servers required by this agent/skill\n mcps: z.array(\n z.union([\n z.string(),\n z.object({ id: z.string(), name: z.string().optional(), icon: z.string().optional() }),\n ]),\n ).optional(),\n })\n .passthrough();\n\nexport type AiAssetFrontmatter = z.infer<typeof AiAssetFrontmatterSchema>;\n\n/**\n * Schema for the mcp-catalog.yaml file placed at the root of a provider repository.\n * Defines external MCP servers that users can install with one click.\n */\nexport const McpCatalogFileSchema = z.object({\n servers: z.array(\n z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n description: z.string().optional(),\n icon: z.string().optional(),\n type: z.enum(['http', 'stdio']),\n url: z.string().optional(),\n command: z.string().optional(),\n args: z.array(z.string()).optional(),\n env: z.record(z.string()).optional(),\n }),\n ),\n});\n\nexport type McpCatalogFile = z.infer<typeof McpCatalogFileSchema>;\n"],"names":["z"],"mappings":";;;;AAEO,MAAM,UAAA,GAAaA,MAAE,IAAA,CAAK;AAAA,EAC/B,KAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAC;AAEM,MAAM,aAAA,GAAgBA,MAAE,IAAA,CAAK;AAAA,EAClC,aAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAC;AAMM,MAAM,wBAAA,GAA2BA,MACrC,MAAA,CAAO;AAAA;AAAA;AAAA,EAGN,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,IAAA,EAAMA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA;AAAA;AAAA,EAE/B,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA,EAAS;AAAA,EAC3C,WAAA,EAAaA,MAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA;AAAA,EACtC,IAAA,EAAM,aAAA;AAAA,EACN,OAAOA,KAAA,CAAE,KAAA,CAAM,UAAU,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAChC,IAAA,EAAMA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,EAC/C,QAAQA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,SAAS,CAAA;AAAA,EAC/C,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,SAASA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,OAAO,CAAA;AAAA,EAC9C,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE/B,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,cAAcA,KAAA,CAAE,MAAA,CAAOA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA;AAAA,EAE5C,WAAWA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA;AAAA,EAExC,KAAA,EAAOA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,MAAA,CAAO,EAAE,GAAA,EAAKA,KAAA,CAAE,MAAA,EAAO,EAAG,CAAC,EAAE,QAAA,EAAS;AAAA;AAAA,EAEvD,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE1B,MAAMA,KAAA,CAAE,KAAA;AAAA,IACNA,MAAE,KAAA,CAAM;AAAA,MACNA,MAAE,MAAA,EAAO;AAAA,MACTA,MAAE,MAAA,CAAO,EAAE,IAAIA,KAAA,CAAE,MAAA,IAAU,IAAA,EAAMA,KAAA,CAAE,QAAO,CAAE,QAAA,IAAY,IAAA,EAAMA,KAAA,CAAE,QAAO,CAAE,QAAA,IAAY;AAAA,KACtF;AAAA,IACD,QAAA;AACJ,CAAC,EACA,WAAA;AAQI,MAAM,oBAAA,GAAuBA,MAAE,MAAA,CAAO;AAAA,EAC3C,SAASA,KAAA,CAAE,KAAA;AAAA,IACTA,MAAE,MAAA,CAAO;AAAA,MACP,EAAA,EAAIA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,MACpB,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,MACtB,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACjC,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAC1B,MAAMA,KAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA,MAC9B,GAAA,EAAKA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACzB,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAC7B,MAAMA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,MACnC,KAAKA,KAAA,CAAE,MAAA,CAAOA,MAAE,MAAA,EAAQ,EAAE,QAAA;AAAS,KACpC;AAAA;AAEL,CAAC;;;;;;;"}
@@ -11,7 +11,8 @@ const AssetTypeEnum = z.enum([
11
11
  "instruction",
12
12
  "agent",
13
13
  "skill",
14
- "workflow"
14
+ "workflow",
15
+ "bundle"
15
16
  ]);
16
17
  const AiAssetFrontmatterSchema = z.object({
17
18
  /** Path to the .md content file, relative to the .yaml file directory.
@@ -32,8 +33,34 @@ const AiAssetFrontmatterSchema = z.object({
32
33
  installPath: z.string().optional(),
33
34
  installPaths: z.record(z.string()).optional(),
34
35
  // skill-specific
35
- resources: z.array(z.string()).optional()
36
+ resources: z.array(z.string()).optional(),
37
+ // bundle-specific
38
+ items: z.array(z.object({ ref: z.string() })).optional(),
39
+ // usage guide — markdown shown when the user clicks the help button
40
+ help: z.string().optional(),
41
+ // MCP servers required by this agent/skill
42
+ mcps: z.array(
43
+ z.union([
44
+ z.string(),
45
+ z.object({ id: z.string(), name: z.string().optional(), icon: z.string().optional() })
46
+ ])
47
+ ).optional()
36
48
  }).passthrough();
49
+ const McpCatalogFileSchema = z.object({
50
+ servers: z.array(
51
+ z.object({
52
+ id: z.string().min(1),
53
+ name: z.string().min(1),
54
+ description: z.string().optional(),
55
+ icon: z.string().optional(),
56
+ type: z.enum(["http", "stdio"]),
57
+ url: z.string().optional(),
58
+ command: z.string().optional(),
59
+ args: z.array(z.string()).optional(),
60
+ env: z.record(z.string()).optional()
61
+ })
62
+ )
63
+ });
37
64
 
38
- export { AiAssetFrontmatterSchema, AiToolEnum, AssetTypeEnum };
65
+ export { AiAssetFrontmatterSchema, AiToolEnum, AssetTypeEnum, McpCatalogFileSchema };
39
66
  //# sourceMappingURL=schemas.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.esm.js","sources":["../src/schemas.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const AiToolEnum = z.enum([\n 'all',\n 'github-copilot',\n 'claude-code',\n 'google-gemini',\n 'cursor',\n]);\n\nexport const AssetTypeEnum = z.enum([\n 'instruction',\n 'agent',\n 'skill',\n 'workflow',\n]);\n\n/**\n * Schema for the YAML metadata file (.yaml) that acts as an envelope.\n * The actual asset content lives in the referenced .md file.\n */\nexport const AiAssetFrontmatterSchema = z\n .object({\n /** Path to the .md content file, relative to the .yaml file directory.\n * If omitted, the parser falls back to <same-name>.md by convention. */\n content: z.string().optional(),\n name: z.string().min(1).max(200),\n /** Human-readable display label shown in the UI. Falls back to `name` when omitted. */\n label: z.string().min(1).max(200).optional(),\n description: z.string().min(1).max(500),\n type: AssetTypeEnum,\n tools: z.array(AiToolEnum).min(1),\n tags: z.array(z.string()).optional().default([]),\n author: z.string().optional().default('Unknown'),\n icon: z.string().optional(),\n version: z.string().optional().default('1.0.0'),\n updatedAt: z.string().optional(),\n // install path overrides\n installPath: z.string().optional(),\n installPaths: z.record(z.string()).optional(),\n // skill-specific\n resources: z.array(z.string()).optional(),\n })\n .passthrough();\n\nexport type AiAssetFrontmatter = z.infer<typeof AiAssetFrontmatterSchema>;\n"],"names":[],"mappings":";;AAEO,MAAM,UAAA,GAAa,EAAE,IAAA,CAAK;AAAA,EAC/B,KAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAC;AAEM,MAAM,aAAA,GAAgB,EAAE,IAAA,CAAK;AAAA,EAClC,aAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC;AAMM,MAAM,wBAAA,GAA2B,EACrC,MAAA,CAAO;AAAA;AAAA;AAAA,EAGN,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,IAAA,EAAM,EAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA;AAAA;AAAA,EAE/B,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA,EAAS;AAAA,EAC3C,WAAA,EAAa,EAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA;AAAA,EACtC,IAAA,EAAM,aAAA;AAAA,EACN,OAAO,CAAA,CAAE,KAAA,CAAM,UAAU,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAChC,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,EAC/C,QAAQ,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,SAAS,CAAA;AAAA,EAC/C,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,SAAS,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,OAAO,CAAA;AAAA,EAC9C,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE/B,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,cAAc,CAAA,CAAE,MAAA,CAAO,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA;AAAA,EAE5C,WAAW,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AACjC,CAAC,EACA,WAAA;;;;"}
1
+ {"version":3,"file":"schemas.esm.js","sources":["../src/schemas.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const AiToolEnum = z.enum([\n 'all',\n 'github-copilot',\n 'claude-code',\n 'google-gemini',\n 'cursor',\n]);\n\nexport const AssetTypeEnum = z.enum([\n 'instruction',\n 'agent',\n 'skill',\n 'workflow',\n 'bundle',\n]);\n\n/**\n * Schema for the YAML metadata file (.yaml) that acts as an envelope.\n * The actual asset content lives in the referenced .md file.\n */\nexport const AiAssetFrontmatterSchema = z\n .object({\n /** Path to the .md content file, relative to the .yaml file directory.\n * If omitted, the parser falls back to <same-name>.md by convention. */\n content: z.string().optional(),\n name: z.string().min(1).max(200),\n /** Human-readable display label shown in the UI. Falls back to `name` when omitted. */\n label: z.string().min(1).max(200).optional(),\n description: z.string().min(1).max(500),\n type: AssetTypeEnum,\n tools: z.array(AiToolEnum).min(1),\n tags: z.array(z.string()).optional().default([]),\n author: z.string().optional().default('Unknown'),\n icon: z.string().optional(),\n version: z.string().optional().default('1.0.0'),\n updatedAt: z.string().optional(),\n // install path overrides\n installPath: z.string().optional(),\n installPaths: z.record(z.string()).optional(),\n // skill-specific\n resources: z.array(z.string()).optional(),\n // bundle-specific\n items: z.array(z.object({ ref: z.string() })).optional(),\n // usage guide — markdown shown when the user clicks the help button\n help: z.string().optional(),\n // MCP servers required by this agent/skill\n mcps: z.array(\n z.union([\n z.string(),\n z.object({ id: z.string(), name: z.string().optional(), icon: z.string().optional() }),\n ]),\n ).optional(),\n })\n .passthrough();\n\nexport type AiAssetFrontmatter = z.infer<typeof AiAssetFrontmatterSchema>;\n\n/**\n * Schema for the mcp-catalog.yaml file placed at the root of a provider repository.\n * Defines external MCP servers that users can install with one click.\n */\nexport const McpCatalogFileSchema = z.object({\n servers: z.array(\n z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n description: z.string().optional(),\n icon: z.string().optional(),\n type: z.enum(['http', 'stdio']),\n url: z.string().optional(),\n command: z.string().optional(),\n args: z.array(z.string()).optional(),\n env: z.record(z.string()).optional(),\n }),\n ),\n});\n\nexport type McpCatalogFile = z.infer<typeof McpCatalogFileSchema>;\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@julianpedro/plugin-dev-ai-hub-common",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Common types and schemas for Dev AI Hub",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {