@julianpedro/plugin-dev-ai-hub-common 0.2.0 → 0.4.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
@@ -2,12 +2,16 @@
2
2
 
3
3
  var schemas = require('./schemas.cjs.js');
4
4
  var installPaths = require('./installPaths.cjs.js');
5
+ var permissions = require('./permissions.cjs.js');
5
6
 
6
7
 
7
8
 
8
9
  exports.AiAssetFrontmatterSchema = schemas.AiAssetFrontmatterSchema;
9
10
  exports.AiToolEnum = schemas.AiToolEnum;
10
11
  exports.AssetTypeEnum = schemas.AssetTypeEnum;
12
+ exports.McpCatalogFileSchema = schemas.McpCatalogFileSchema;
11
13
  exports.getInstallPath = installPaths.getInstallPath;
12
14
  exports.getInstallPathsForAsset = installPaths.getInstallPathsForAsset;
15
+ exports.devAiHubPermissions = permissions.devAiHubPermissions;
16
+ exports.devAiHubSyncPermission = permissions.devAiHubSyncPermission;
13
17
  //# 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,36 @@
1
1
  import { z } from 'zod';
2
+ import * as _backstage_plugin_permission_common from '@backstage/plugin-permission-common';
2
3
 
3
- type AssetType = 'instruction' | 'agent' | 'skill' | 'workflow';
4
+ type AssetType = 'instruction' | 'agent' | 'skill' | 'workflow' | 'prompt' | 'bundle';
4
5
  type AiTool = 'all' | 'github-copilot' | 'claude-code' | 'google-gemini' | 'cursor';
6
+ interface BundleItem {
7
+ ref: string;
8
+ assetId?: string;
9
+ name?: string;
10
+ label?: string;
11
+ type?: Exclude<AssetType, 'bundle'>;
12
+ description?: string;
13
+ tools?: AiTool[];
14
+ }
15
+ interface McpCatalogEntry {
16
+ id: string;
17
+ name: string;
18
+ description?: string;
19
+ icon?: string;
20
+ type: 'http' | 'stdio';
21
+ url?: string;
22
+ command?: string;
23
+ args?: string[];
24
+ env?: Record<string, string>;
25
+ }
26
+ /** A single MCP server requirement declared in the asset envelope. */
27
+ interface McpRequirement {
28
+ id: string;
29
+ /** Display name override — shown when the server is not in the MCP catalog. */
30
+ name?: string;
31
+ /** URL to a PNG icon for this MCP server. */
32
+ icon?: string;
33
+ }
5
34
  /** Lightweight summary returned by list endpoints — no markdown content. */
6
35
  interface AiAssetSummary {
7
36
  id: string;
@@ -16,7 +45,15 @@ interface AiAssetSummary {
16
45
  author: string;
17
46
  icon?: string;
18
47
  version: string;
48
+ /** Model identifier declared in the YAML envelope (e.g. "claude-opus-4-5"). Only set for agents. */
49
+ model?: string;
19
50
  installCount: number;
51
+ /** Number of items in a bundle (only set for type === 'bundle'). */
52
+ itemCount?: number;
53
+ /** Markdown usage guide defined in the YAML envelope. Present only when the author provided it. */
54
+ helpText?: string;
55
+ /** MCP servers required by this asset (only set for agent/skill types). */
56
+ mcps?: McpRequirement[];
20
57
  syncedAt: string;
21
58
  createdAt: string;
22
59
  updatedAt: string;
@@ -34,6 +71,8 @@ interface AiAsset {
34
71
  author: string;
35
72
  icon?: string;
36
73
  version: string;
74
+ /** Model identifier declared in the YAML envelope (e.g. "claude-opus-4-5"). Only set for agents. */
75
+ model?: string;
37
76
  /** Override the install path for all tools */
38
77
  installPath?: string;
39
78
  /** Override the install path per tool */
@@ -44,11 +83,17 @@ interface AiAsset {
44
83
  yamlRaw: string;
45
84
  /** Extra metadata stored from the envelope (e.g. resources for skills) */
46
85
  metadata?: Record<string, unknown>;
86
+ /** Markdown usage guide defined in the YAML envelope. Present only when the author provided it. */
87
+ helpText?: string;
88
+ /** MCP servers required by this asset (only set for agent/skill types). */
89
+ mcps?: McpRequirement[];
47
90
  /**
48
91
  * Content of bundled resource files for skills (path → file content).
49
92
  * Only populated for assets of type `skill` that declare `resources` in the envelope.
50
93
  */
51
94
  resourcesContent?: Record<string, string>;
95
+ /** Resolved bundle items — only populated for type === 'bundle'. */
96
+ items?: BundleItem[];
52
97
  /** Path of the .yaml file in the repository */
53
98
  yamlPath: string;
54
99
  /** Path of the .md file in the repository */
@@ -96,7 +141,7 @@ interface AssetListFilter {
96
141
  }
97
142
 
98
143
  declare const AiToolEnum: z.ZodEnum<["all", "github-copilot", "claude-code", "google-gemini", "cursor"]>;
99
- declare const AssetTypeEnum: z.ZodEnum<["instruction", "agent", "skill", "workflow"]>;
144
+ declare const AssetTypeEnum: z.ZodEnum<["instruction", "agent", "skill", "workflow", "prompt", "bundle"]>;
100
145
  /**
101
146
  * Schema for the YAML metadata file (.yaml) that acts as an envelope.
102
147
  * The actual asset content lives in the referenced .md file.
@@ -109,7 +154,7 @@ declare const AiAssetFrontmatterSchema: z.ZodObject<{
109
154
  /** Human-readable display label shown in the UI. Falls back to `name` when omitted. */
110
155
  label: z.ZodOptional<z.ZodString>;
111
156
  description: z.ZodString;
112
- type: z.ZodEnum<["instruction", "agent", "skill", "workflow"]>;
157
+ type: z.ZodEnum<["instruction", "agent", "skill", "workflow", "prompt", "bundle"]>;
113
158
  tools: z.ZodArray<z.ZodEnum<["all", "github-copilot", "claude-code", "google-gemini", "cursor"]>, "many">;
114
159
  tags: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
115
160
  author: z.ZodDefault<z.ZodOptional<z.ZodString>>;
@@ -119,6 +164,28 @@ declare const AiAssetFrontmatterSchema: z.ZodObject<{
119
164
  installPath: z.ZodOptional<z.ZodString>;
120
165
  installPaths: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
121
166
  resources: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
167
+ items: z.ZodOptional<z.ZodArray<z.ZodObject<{
168
+ ref: z.ZodString;
169
+ }, "strip", z.ZodTypeAny, {
170
+ ref: string;
171
+ }, {
172
+ ref: string;
173
+ }>, "many">>;
174
+ help: z.ZodOptional<z.ZodString>;
175
+ model: z.ZodOptional<z.ZodString>;
176
+ mcps: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodObject<{
177
+ id: z.ZodString;
178
+ name: z.ZodOptional<z.ZodString>;
179
+ icon: z.ZodOptional<z.ZodString>;
180
+ }, "strip", z.ZodTypeAny, {
181
+ id: string;
182
+ name?: string | undefined;
183
+ icon?: string | undefined;
184
+ }, {
185
+ id: string;
186
+ name?: string | undefined;
187
+ icon?: string | undefined;
188
+ }>]>, "many">>;
122
189
  }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
123
190
  /** Path to the .md content file, relative to the .yaml file directory.
124
191
  * If omitted, the parser falls back to <same-name>.md by convention. */
@@ -127,7 +194,7 @@ declare const AiAssetFrontmatterSchema: z.ZodObject<{
127
194
  /** Human-readable display label shown in the UI. Falls back to `name` when omitted. */
128
195
  label: z.ZodOptional<z.ZodString>;
129
196
  description: z.ZodString;
130
- type: z.ZodEnum<["instruction", "agent", "skill", "workflow"]>;
197
+ type: z.ZodEnum<["instruction", "agent", "skill", "workflow", "prompt", "bundle"]>;
131
198
  tools: z.ZodArray<z.ZodEnum<["all", "github-copilot", "claude-code", "google-gemini", "cursor"]>, "many">;
132
199
  tags: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
133
200
  author: z.ZodDefault<z.ZodOptional<z.ZodString>>;
@@ -137,6 +204,28 @@ declare const AiAssetFrontmatterSchema: z.ZodObject<{
137
204
  installPath: z.ZodOptional<z.ZodString>;
138
205
  installPaths: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
139
206
  resources: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
207
+ items: z.ZodOptional<z.ZodArray<z.ZodObject<{
208
+ ref: z.ZodString;
209
+ }, "strip", z.ZodTypeAny, {
210
+ ref: string;
211
+ }, {
212
+ ref: string;
213
+ }>, "many">>;
214
+ help: z.ZodOptional<z.ZodString>;
215
+ model: z.ZodOptional<z.ZodString>;
216
+ mcps: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodObject<{
217
+ id: z.ZodString;
218
+ name: z.ZodOptional<z.ZodString>;
219
+ icon: z.ZodOptional<z.ZodString>;
220
+ }, "strip", z.ZodTypeAny, {
221
+ id: string;
222
+ name?: string | undefined;
223
+ icon?: string | undefined;
224
+ }, {
225
+ id: string;
226
+ name?: string | undefined;
227
+ icon?: string | undefined;
228
+ }>]>, "many">>;
140
229
  }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
141
230
  /** Path to the .md content file, relative to the .yaml file directory.
142
231
  * If omitted, the parser falls back to <same-name>.md by convention. */
@@ -145,7 +234,7 @@ declare const AiAssetFrontmatterSchema: z.ZodObject<{
145
234
  /** Human-readable display label shown in the UI. Falls back to `name` when omitted. */
146
235
  label: z.ZodOptional<z.ZodString>;
147
236
  description: z.ZodString;
148
- type: z.ZodEnum<["instruction", "agent", "skill", "workflow"]>;
237
+ type: z.ZodEnum<["instruction", "agent", "skill", "workflow", "prompt", "bundle"]>;
149
238
  tools: z.ZodArray<z.ZodEnum<["all", "github-copilot", "claude-code", "google-gemini", "cursor"]>, "many">;
150
239
  tags: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
151
240
  author: z.ZodDefault<z.ZodOptional<z.ZodString>>;
@@ -155,8 +244,92 @@ declare const AiAssetFrontmatterSchema: z.ZodObject<{
155
244
  installPath: z.ZodOptional<z.ZodString>;
156
245
  installPaths: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
157
246
  resources: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
247
+ items: z.ZodOptional<z.ZodArray<z.ZodObject<{
248
+ ref: z.ZodString;
249
+ }, "strip", z.ZodTypeAny, {
250
+ ref: string;
251
+ }, {
252
+ ref: string;
253
+ }>, "many">>;
254
+ help: z.ZodOptional<z.ZodString>;
255
+ model: z.ZodOptional<z.ZodString>;
256
+ mcps: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodObject<{
257
+ id: z.ZodString;
258
+ name: z.ZodOptional<z.ZodString>;
259
+ icon: z.ZodOptional<z.ZodString>;
260
+ }, "strip", z.ZodTypeAny, {
261
+ id: string;
262
+ name?: string | undefined;
263
+ icon?: string | undefined;
264
+ }, {
265
+ id: string;
266
+ name?: string | undefined;
267
+ icon?: string | undefined;
268
+ }>]>, "many">>;
158
269
  }, z.ZodTypeAny, "passthrough">>;
159
270
  type AiAssetFrontmatter = z.infer<typeof AiAssetFrontmatterSchema>;
271
+ /**
272
+ * Schema for the mcp-catalog.yaml file placed at the root of a provider repository.
273
+ * Defines external MCP servers that users can install with one click.
274
+ */
275
+ declare const McpCatalogFileSchema: z.ZodObject<{
276
+ servers: z.ZodArray<z.ZodObject<{
277
+ id: z.ZodString;
278
+ name: z.ZodString;
279
+ description: z.ZodOptional<z.ZodString>;
280
+ icon: z.ZodOptional<z.ZodString>;
281
+ type: z.ZodEnum<["http", "stdio"]>;
282
+ url: z.ZodOptional<z.ZodString>;
283
+ command: z.ZodOptional<z.ZodString>;
284
+ args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
285
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
286
+ }, "strip", z.ZodTypeAny, {
287
+ name: string;
288
+ type: "http" | "stdio";
289
+ id: string;
290
+ description?: string | undefined;
291
+ icon?: string | undefined;
292
+ url?: string | undefined;
293
+ command?: string | undefined;
294
+ args?: string[] | undefined;
295
+ env?: Record<string, string> | undefined;
296
+ }, {
297
+ name: string;
298
+ type: "http" | "stdio";
299
+ id: string;
300
+ description?: string | undefined;
301
+ icon?: string | undefined;
302
+ url?: string | undefined;
303
+ command?: string | undefined;
304
+ args?: string[] | undefined;
305
+ env?: Record<string, string> | undefined;
306
+ }>, "many">;
307
+ }, "strip", z.ZodTypeAny, {
308
+ servers: {
309
+ name: string;
310
+ type: "http" | "stdio";
311
+ id: string;
312
+ description?: string | undefined;
313
+ icon?: string | undefined;
314
+ url?: string | undefined;
315
+ command?: string | undefined;
316
+ args?: string[] | undefined;
317
+ env?: Record<string, string> | undefined;
318
+ }[];
319
+ }, {
320
+ servers: {
321
+ name: string;
322
+ type: "http" | "stdio";
323
+ id: string;
324
+ description?: string | undefined;
325
+ icon?: string | undefined;
326
+ url?: string | undefined;
327
+ command?: string | undefined;
328
+ args?: string[] | undefined;
329
+ env?: Record<string, string> | undefined;
330
+ }[];
331
+ }>;
332
+ type McpCatalogFile = z.infer<typeof McpCatalogFileSchema>;
160
333
 
161
334
  interface InstallPathOverrides {
162
335
  /** Single path override — applies to all tools when installPaths has no entry for the tool */
@@ -175,5 +348,8 @@ declare function getInstallPath(type: AssetType, tool: AiTool | string, name: st
175
348
  */
176
349
  declare function getInstallPathsForAsset(type: AssetType, tools: (AiTool | string)[], name: string, overrides?: InstallPathOverrides): Record<string, string>;
177
350
 
178
- export { AiAssetFrontmatterSchema, AiToolEnum, AssetTypeEnum, getInstallPath, getInstallPathsForAsset };
179
- export type { AiAsset, AiAssetFrontmatter, AiAssetListResponse, AiAssetSummary, AiHubProvider, AiHubStats, AiTool, AssetListFilter, AssetType, InstallPathOverrides };
351
+ declare const devAiHubSyncPermission: _backstage_plugin_permission_common.BasicPermission;
352
+ declare const devAiHubPermissions: _backstage_plugin_permission_common.BasicPermission[];
353
+
354
+ export { AiAssetFrontmatterSchema, AiToolEnum, AssetTypeEnum, McpCatalogFileSchema, devAiHubPermissions, devAiHubSyncPermission, getInstallPath, getInstallPathsForAsset };
355
+ export type { AiAsset, AiAssetFrontmatter, AiAssetListResponse, AiAssetSummary, AiHubProvider, AiHubStats, AiTool, AssetListFilter, AssetType, BundleItem, InstallPathOverrides, McpCatalogEntry, McpCatalogFile, McpRequirement };
package/dist/index.esm.js CHANGED
@@ -1,3 +1,4 @@
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
+ export { devAiHubPermissions, devAiHubSyncPermission } from './permissions.esm.js';
3
4
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -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`,
@@ -35,6 +43,14 @@ const CONVENTIONS = {
35
43
  "cursor": (name) => `.cursor/rules/${name}.mdc`,
36
44
  "all": (name) => `.ai/workflows/${name}.md`,
37
45
  "default": (name) => `.ai/workflows/${name}.md`
46
+ },
47
+ prompt: {
48
+ "claude-code": (name) => `.claude/prompts/${name}.md`,
49
+ "github-copilot": (name) => `.github/prompts/${name}.md`,
50
+ "google-gemini": (name) => `.gemini/prompts/${name}.md`,
51
+ "cursor": (name) => `.cursor/prompts/${name}.md`,
52
+ "all": (name) => `.ai/prompts/${name}.md`,
53
+ "default": (name) => `.ai/prompts/${name}.md`
38
54
  }
39
55
  };
40
56
  function getInstallPath(type, tool, name, overrides) {
@@ -46,6 +62,7 @@ function getInstallPath(type, tool, name, overrides) {
46
62
  return fn(slug);
47
63
  }
48
64
  function getInstallPathsForAsset(type, tools, name, overrides) {
65
+ if (type === "bundle") return {};
49
66
  const ALL_TOOLS = ["claude-code", "github-copilot", "google-gemini", "cursor"];
50
67
  const resolvedTools = tools.includes("all") ? ALL_TOOLS : tools;
51
68
  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': () => '',\n '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 prompt: {\n 'claude-code': name => `.claude/prompts/${name}.md`,\n 'github-copilot': name => `.github/prompts/${name}.md`,\n 'google-gemini': name => `.gemini/prompts/${name}.md`,\n 'cursor': name => `.cursor/prompts/${name}.md`,\n 'all': name => `.ai/prompts/${name}.md`,\n 'default': name => `.ai/prompts/${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}"],"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`,
@@ -33,6 +41,14 @@ const CONVENTIONS = {
33
41
  "cursor": (name) => `.cursor/rules/${name}.mdc`,
34
42
  "all": (name) => `.ai/workflows/${name}.md`,
35
43
  "default": (name) => `.ai/workflows/${name}.md`
44
+ },
45
+ prompt: {
46
+ "claude-code": (name) => `.claude/prompts/${name}.md`,
47
+ "github-copilot": (name) => `.github/prompts/${name}.md`,
48
+ "google-gemini": (name) => `.gemini/prompts/${name}.md`,
49
+ "cursor": (name) => `.cursor/prompts/${name}.md`,
50
+ "all": (name) => `.ai/prompts/${name}.md`,
51
+ "default": (name) => `.ai/prompts/${name}.md`
36
52
  }
37
53
  };
38
54
  function getInstallPath(type, tool, name, overrides) {
@@ -44,6 +60,7 @@ function getInstallPath(type, tool, name, overrides) {
44
60
  return fn(slug);
45
61
  }
46
62
  function getInstallPathsForAsset(type, tools, name, overrides) {
63
+ if (type === "bundle") return {};
47
64
  const ALL_TOOLS = ["claude-code", "github-copilot", "google-gemini", "cursor"];
48
65
  const resolvedTools = tools.includes("all") ? ALL_TOOLS : tools;
49
66
  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': () => '',\n '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 prompt: {\n 'claude-code': name => `.claude/prompts/${name}.md`,\n 'github-copilot': name => `.github/prompts/${name}.md`,\n 'google-gemini': name => `.gemini/prompts/${name}.md`,\n 'cursor': name => `.cursor/prompts/${name}.md`,\n 'all': name => `.ai/prompts/${name}.md`,\n 'default': name => `.ai/prompts/${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}"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ var pluginPermissionCommon = require('@backstage/plugin-permission-common');
4
+
5
+ const devAiHubSyncPermission = pluginPermissionCommon.createPermission({
6
+ name: "dev-ai-hub.sync.trigger",
7
+ attributes: { action: "create" }
8
+ });
9
+ const devAiHubPermissions = [devAiHubSyncPermission];
10
+
11
+ exports.devAiHubPermissions = devAiHubPermissions;
12
+ exports.devAiHubSyncPermission = devAiHubSyncPermission;
13
+ //# sourceMappingURL=permissions.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.cjs.js","sources":["../src/permissions.ts"],"sourcesContent":["import { createPermission } from '@backstage/plugin-permission-common';\n\nexport const devAiHubSyncPermission = createPermission({\n name: 'dev-ai-hub.sync.trigger',\n attributes: { action: 'create' },\n});\n\nexport const devAiHubPermissions = [devAiHubSyncPermission];"],"names":["createPermission"],"mappings":";;;;AAEO,MAAM,yBAAyBA,uCAAA,CAAiB;AAAA,EACrD,IAAA,EAAM,yBAAA;AAAA,EACN,UAAA,EAAY,EAAE,MAAA,EAAQ,QAAA;AACxB,CAAC;AAEM,MAAM,mBAAA,GAAsB,CAAC,sBAAsB;;;;;"}
@@ -0,0 +1,10 @@
1
+ import { createPermission } from '@backstage/plugin-permission-common';
2
+
3
+ const devAiHubSyncPermission = createPermission({
4
+ name: "dev-ai-hub.sync.trigger",
5
+ attributes: { action: "create" }
6
+ });
7
+ const devAiHubPermissions = [devAiHubSyncPermission];
8
+
9
+ export { devAiHubPermissions, devAiHubSyncPermission };
10
+ //# sourceMappingURL=permissions.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.esm.js","sources":["../src/permissions.ts"],"sourcesContent":["import { createPermission } from '@backstage/plugin-permission-common';\n\nexport const devAiHubSyncPermission = createPermission({\n name: 'dev-ai-hub.sync.trigger',\n attributes: { action: 'create' },\n});\n\nexport const devAiHubPermissions = [devAiHubSyncPermission];"],"names":[],"mappings":";;AAEO,MAAM,yBAAyB,gBAAA,CAAiB;AAAA,EACrD,IAAA,EAAM,yBAAA;AAAA,EACN,UAAA,EAAY,EAAE,MAAA,EAAQ,QAAA;AACxB,CAAC;AAEM,MAAM,mBAAA,GAAsB,CAAC,sBAAsB;;;;"}
@@ -13,7 +13,9 @@ const AssetTypeEnum = zod.z.enum([
13
13
  "instruction",
14
14
  "agent",
15
15
  "skill",
16
- "workflow"
16
+ "workflow",
17
+ "prompt",
18
+ "bundle"
17
19
  ]);
18
20
  const AiAssetFrontmatterSchema = zod.z.object({
19
21
  /** Path to the .md content file, relative to the .yaml file directory.
@@ -34,10 +36,39 @@ const AiAssetFrontmatterSchema = zod.z.object({
34
36
  installPath: zod.z.string().optional(),
35
37
  installPaths: zod.z.record(zod.z.string()).optional(),
36
38
  // skill-specific
37
- resources: zod.z.array(zod.z.string()).optional()
39
+ resources: zod.z.array(zod.z.string()).optional(),
40
+ // bundle-specific
41
+ items: zod.z.array(zod.z.object({ ref: zod.z.string() })).optional(),
42
+ // usage guide — markdown shown when the user clicks the help button
43
+ help: zod.z.string().optional(),
44
+ // agent-specific: model identifier (e.g. "claude-opus-4-5", "gpt-4o")
45
+ model: zod.z.string().optional(),
46
+ // MCP servers required by this agent/skill
47
+ mcps: zod.z.array(
48
+ zod.z.union([
49
+ zod.z.string(),
50
+ zod.z.object({ id: zod.z.string(), name: zod.z.string().optional(), icon: zod.z.string().optional() })
51
+ ])
52
+ ).optional()
38
53
  }).passthrough();
54
+ const McpCatalogFileSchema = zod.z.object({
55
+ servers: zod.z.array(
56
+ zod.z.object({
57
+ id: zod.z.string().min(1),
58
+ name: zod.z.string().min(1),
59
+ description: zod.z.string().optional(),
60
+ icon: zod.z.string().optional(),
61
+ type: zod.z.enum(["http", "stdio"]),
62
+ url: zod.z.string().optional(),
63
+ command: zod.z.string().optional(),
64
+ args: zod.z.array(zod.z.string()).optional(),
65
+ env: zod.z.record(zod.z.string()).optional()
66
+ })
67
+ )
68
+ });
39
69
 
40
70
  exports.AiAssetFrontmatterSchema = AiAssetFrontmatterSchema;
41
71
  exports.AiToolEnum = AiToolEnum;
42
72
  exports.AssetTypeEnum = AssetTypeEnum;
73
+ exports.McpCatalogFileSchema = McpCatalogFileSchema;
43
74
  //# 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 'prompt',\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 // agent-specific: model identifier (e.g. \"claude-opus-4-5\", \"gpt-4o\")\n model: 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>;"],"names":["z"],"mappings":"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"}
@@ -11,7 +11,9 @@ const AssetTypeEnum = z.enum([
11
11
  "instruction",
12
12
  "agent",
13
13
  "skill",
14
- "workflow"
14
+ "workflow",
15
+ "prompt",
16
+ "bundle"
15
17
  ]);
16
18
  const AiAssetFrontmatterSchema = z.object({
17
19
  /** Path to the .md content file, relative to the .yaml file directory.
@@ -32,8 +34,36 @@ const AiAssetFrontmatterSchema = z.object({
32
34
  installPath: z.string().optional(),
33
35
  installPaths: z.record(z.string()).optional(),
34
36
  // skill-specific
35
- resources: z.array(z.string()).optional()
37
+ resources: z.array(z.string()).optional(),
38
+ // bundle-specific
39
+ items: z.array(z.object({ ref: z.string() })).optional(),
40
+ // usage guide — markdown shown when the user clicks the help button
41
+ help: z.string().optional(),
42
+ // agent-specific: model identifier (e.g. "claude-opus-4-5", "gpt-4o")
43
+ model: z.string().optional(),
44
+ // MCP servers required by this agent/skill
45
+ mcps: z.array(
46
+ z.union([
47
+ z.string(),
48
+ z.object({ id: z.string(), name: z.string().optional(), icon: z.string().optional() })
49
+ ])
50
+ ).optional()
36
51
  }).passthrough();
52
+ const McpCatalogFileSchema = z.object({
53
+ servers: z.array(
54
+ z.object({
55
+ id: z.string().min(1),
56
+ name: z.string().min(1),
57
+ description: z.string().optional(),
58
+ icon: z.string().optional(),
59
+ type: z.enum(["http", "stdio"]),
60
+ url: z.string().optional(),
61
+ command: z.string().optional(),
62
+ args: z.array(z.string()).optional(),
63
+ env: z.record(z.string()).optional()
64
+ })
65
+ )
66
+ });
37
67
 
38
- export { AiAssetFrontmatterSchema, AiToolEnum, AssetTypeEnum };
68
+ export { AiAssetFrontmatterSchema, AiToolEnum, AssetTypeEnum, McpCatalogFileSchema };
39
69
  //# 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 'prompt',\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 // agent-specific: model identifier (e.g. \"claude-opus-4-5\", \"gpt-4o\")\n model: 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>;"],"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.4.0",
4
4
  "description": "Common types and schemas for Dev AI Hub",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -49,6 +49,9 @@
49
49
  "dependencies": {
50
50
  "zod": "^3.22.0"
51
51
  },
52
+ "peerDependencies": {
53
+ "@backstage/plugin-permission-common": ">=0.9.0"
54
+ },
52
55
  "devDependencies": {
53
56
  "@backstage/cli": "*",
54
57
  "@types/jest": "^29.0.0",