@prave/shared 0.1.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.
Files changed (56) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -0
  4. package/dist/lib/classify.d.ts +21 -0
  5. package/dist/lib/classify.d.ts.map +1 -0
  6. package/dist/lib/classify.js +121 -0
  7. package/dist/lib/index.d.ts +2 -0
  8. package/dist/lib/index.d.ts.map +1 -0
  9. package/dist/lib/index.js +1 -0
  10. package/dist/schemas/api-keys.schema.d.ts +71 -0
  11. package/dist/schemas/api-keys.schema.d.ts.map +1 -0
  12. package/dist/schemas/api-keys.schema.js +29 -0
  13. package/dist/schemas/billing.schema.d.ts +7 -7
  14. package/dist/schemas/billing.schema.d.ts.map +1 -1
  15. package/dist/schemas/billing.schema.js +2 -2
  16. package/dist/schemas/credits.schema.d.ts +61 -0
  17. package/dist/schemas/credits.schema.d.ts.map +1 -0
  18. package/dist/schemas/credits.schema.js +44 -0
  19. package/dist/schemas/index.d.ts +4 -1
  20. package/dist/schemas/index.d.ts.map +1 -1
  21. package/dist/schemas/index.js +4 -1
  22. package/dist/schemas/install.schema.d.ts +27 -5
  23. package/dist/schemas/install.schema.d.ts.map +1 -1
  24. package/dist/schemas/intelligence.schema.d.ts +82 -0
  25. package/dist/schemas/intelligence.schema.d.ts.map +1 -0
  26. package/dist/schemas/intelligence.schema.js +31 -0
  27. package/dist/schemas/marketplace.schema.d.ts +2 -2
  28. package/dist/schemas/marketplace.schema.d.ts.map +1 -1
  29. package/dist/schemas/marketplace.schema.js +2 -2
  30. package/dist/schemas/org.schema.d.ts +3 -3
  31. package/dist/schemas/search.schema.d.ts +41 -3
  32. package/dist/schemas/search.schema.d.ts.map +1 -1
  33. package/dist/schemas/skill-dependency.schema.d.ts +27 -5
  34. package/dist/schemas/skill-dependency.schema.d.ts.map +1 -1
  35. package/dist/schemas/skill-pr.schema.d.ts +544 -0
  36. package/dist/schemas/skill-pr.schema.d.ts.map +1 -0
  37. package/dist/schemas/skill-pr.schema.js +87 -0
  38. package/dist/schemas/skill-test.schema.d.ts +4 -9
  39. package/dist/schemas/skill-test.schema.d.ts.map +1 -1
  40. package/dist/schemas/skill-test.schema.js +4 -9
  41. package/dist/schemas/skill.schema.d.ts +76 -10
  42. package/dist/schemas/skill.schema.d.ts.map +1 -1
  43. package/dist/schemas/skill.schema.js +16 -1
  44. package/dist/types/categories.d.ts +5 -0
  45. package/dist/types/categories.d.ts.map +1 -0
  46. package/dist/types/categories.js +35 -0
  47. package/dist/types/index.d.ts +26 -1
  48. package/dist/types/index.d.ts.map +1 -1
  49. package/dist/types/index.js +3 -1
  50. package/dist/types/intelligence.d.ts +132 -0
  51. package/dist/types/intelligence.d.ts.map +1 -0
  52. package/dist/types/intelligence.js +52 -0
  53. package/dist/types/plan-limits.d.ts +62 -0
  54. package/dist/types/plan-limits.d.ts.map +1 -0
  55. package/dist/types/plan-limits.js +88 -0
  56. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- export declare const skillVisibilitySchema: z.ZodEnum<["public", "private", "org"]>;
2
+ export declare const skillVisibilitySchema: z.ZodEnum<["public", "private"]>;
3
3
  export type SkillVisibility = z.infer<typeof skillVisibilitySchema>;
4
4
  export declare const skillSchema: z.ZodObject<{
5
5
  id: z.ZodString;
@@ -8,7 +8,7 @@ export declare const skillSchema: z.ZodObject<{
8
8
  slug: z.ZodString;
9
9
  description: z.ZodNullable<z.ZodString>;
10
10
  content: z.ZodNullable<z.ZodString>;
11
- visibility: z.ZodDefault<z.ZodEnum<["public", "private", "org"]>>;
11
+ visibility: z.ZodDefault<z.ZodEnum<["public", "private"]>>;
12
12
  source_repo: z.ZodNullable<z.ZodString>;
13
13
  license: z.ZodDefault<z.ZodString>;
14
14
  category: z.ZodNullable<z.ZodString>;
@@ -24,6 +24,29 @@ export declare const skillSchema: z.ZodObject<{
24
24
  is_owner: z.ZodOptional<z.ZodBoolean>;
25
25
  /** Attached by the API on GET: true if the caller has bookmarked the Skill. */
26
26
  bookmarked: z.ZodOptional<z.ZodBoolean>;
27
+ /** Attached by the API: a public slice of the owner profile so cards can render attribution. */
28
+ owner: z.ZodOptional<z.ZodNullable<z.ZodObject<{
29
+ id: z.ZodString;
30
+ username: z.ZodNullable<z.ZodString>;
31
+ display_name: z.ZodNullable<z.ZodString>;
32
+ avatar_url: z.ZodNullable<z.ZodString>;
33
+ is_creator: z.ZodBoolean;
34
+ is_partner: z.ZodBoolean;
35
+ }, "strip", z.ZodTypeAny, {
36
+ id: string;
37
+ username: string | null;
38
+ display_name: string | null;
39
+ avatar_url: string | null;
40
+ is_creator: boolean;
41
+ is_partner: boolean;
42
+ }, {
43
+ id: string;
44
+ username: string | null;
45
+ display_name: string | null;
46
+ avatar_url: string | null;
47
+ is_creator: boolean;
48
+ is_partner: boolean;
49
+ }>>>;
27
50
  created_at: z.ZodString;
28
51
  updated_at: z.ZodString;
29
52
  }, "strip", z.ZodTypeAny, {
@@ -33,7 +56,7 @@ export declare const skillSchema: z.ZodObject<{
33
56
  slug: string;
34
57
  description: string | null;
35
58
  content: string | null;
36
- visibility: "public" | "private" | "org";
59
+ visibility: "public" | "private";
37
60
  source_repo: string | null;
38
61
  license: string;
39
62
  category: string | null;
@@ -48,6 +71,14 @@ export declare const skillSchema: z.ZodObject<{
48
71
  purchased?: boolean | undefined;
49
72
  is_owner?: boolean | undefined;
50
73
  bookmarked?: boolean | undefined;
74
+ owner?: {
75
+ id: string;
76
+ username: string | null;
77
+ display_name: string | null;
78
+ avatar_url: string | null;
79
+ is_creator: boolean;
80
+ is_partner: boolean;
81
+ } | null | undefined;
51
82
  }, {
52
83
  id: string;
53
84
  owner_id: string;
@@ -59,7 +90,7 @@ export declare const skillSchema: z.ZodObject<{
59
90
  category: string | null;
60
91
  created_at: string;
61
92
  updated_at: string;
62
- visibility?: "public" | "private" | "org" | undefined;
93
+ visibility?: "public" | "private" | undefined;
63
94
  license?: string | undefined;
64
95
  tags?: string[] | undefined;
65
96
  install_count?: number | undefined;
@@ -70,6 +101,14 @@ export declare const skillSchema: z.ZodObject<{
70
101
  purchased?: boolean | undefined;
71
102
  is_owner?: boolean | undefined;
72
103
  bookmarked?: boolean | undefined;
104
+ owner?: {
105
+ id: string;
106
+ username: string | null;
107
+ display_name: string | null;
108
+ avatar_url: string | null;
109
+ is_creator: boolean;
110
+ is_partner: boolean;
111
+ } | null | undefined;
73
112
  }>;
74
113
  export type Skill = z.infer<typeof skillSchema>;
75
114
  export declare const createSkillInputSchema: z.ZodObject<{
@@ -77,7 +116,7 @@ export declare const createSkillInputSchema: z.ZodObject<{
77
116
  slug: z.ZodString;
78
117
  description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
79
118
  content: z.ZodOptional<z.ZodNullable<z.ZodString>>;
80
- visibility: z.ZodOptional<z.ZodDefault<z.ZodEnum<["public", "private", "org"]>>>;
119
+ visibility: z.ZodOptional<z.ZodDefault<z.ZodEnum<["public", "private"]>>>;
81
120
  source_repo: z.ZodOptional<z.ZodNullable<z.ZodString>>;
82
121
  license: z.ZodOptional<z.ZodDefault<z.ZodString>>;
83
122
  category: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -89,7 +128,7 @@ export declare const createSkillInputSchema: z.ZodObject<{
89
128
  slug: string;
90
129
  description?: string | null | undefined;
91
130
  content?: string | null | undefined;
92
- visibility?: "public" | "private" | "org" | undefined;
131
+ visibility?: "public" | "private" | undefined;
93
132
  source_repo?: string | null | undefined;
94
133
  license?: string | undefined;
95
134
  category?: string | null | undefined;
@@ -101,7 +140,7 @@ export declare const createSkillInputSchema: z.ZodObject<{
101
140
  slug: string;
102
141
  description?: string | null | undefined;
103
142
  content?: string | null | undefined;
104
- visibility?: "public" | "private" | "org" | undefined;
143
+ visibility?: "public" | "private" | undefined;
105
144
  source_repo?: string | null | undefined;
106
145
  license?: string | undefined;
107
146
  category?: string | null | undefined;
@@ -115,7 +154,7 @@ export declare const updateSkillInputSchema: z.ZodObject<{
115
154
  slug: z.ZodOptional<z.ZodString>;
116
155
  description: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
117
156
  content: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
118
- visibility: z.ZodOptional<z.ZodOptional<z.ZodDefault<z.ZodEnum<["public", "private", "org"]>>>>;
157
+ visibility: z.ZodOptional<z.ZodOptional<z.ZodDefault<z.ZodEnum<["public", "private"]>>>>;
119
158
  source_repo: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
120
159
  license: z.ZodOptional<z.ZodOptional<z.ZodDefault<z.ZodString>>>;
121
160
  category: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
@@ -129,7 +168,7 @@ export declare const updateSkillInputSchema: z.ZodObject<{
129
168
  slug?: string | undefined;
130
169
  description?: string | null | undefined;
131
170
  content?: string | null | undefined;
132
- visibility?: "public" | "private" | "org" | undefined;
171
+ visibility?: "public" | "private" | undefined;
133
172
  source_repo?: string | null | undefined;
134
173
  license?: string | undefined;
135
174
  category?: string | null | undefined;
@@ -142,7 +181,7 @@ export declare const updateSkillInputSchema: z.ZodObject<{
142
181
  slug?: string | undefined;
143
182
  description?: string | null | undefined;
144
183
  content?: string | null | undefined;
145
- visibility?: "public" | "private" | "org" | undefined;
184
+ visibility?: "public" | "private" | undefined;
146
185
  source_repo?: string | null | undefined;
147
186
  license?: string | undefined;
148
187
  category?: string | null | undefined;
@@ -177,4 +216,31 @@ export declare const skillSearchQuerySchema: z.ZodObject<{
177
216
  offset?: number | undefined;
178
217
  }>;
179
218
  export type SkillSearchQuery = z.infer<typeof skillSearchQuerySchema>;
219
+ export declare const mySkillsQuerySchema: z.ZodObject<{
220
+ q: z.ZodOptional<z.ZodString>;
221
+ category: z.ZodOptional<z.ZodString>;
222
+ tag: z.ZodOptional<z.ZodString>;
223
+ sort: z.ZodDefault<z.ZodEnum<["trending", "popular", "newest", "relevance"]>>;
224
+ limit: z.ZodDefault<z.ZodNumber>;
225
+ offset: z.ZodDefault<z.ZodNumber>;
226
+ } & {
227
+ visibility: z.ZodOptional<z.ZodEnum<["public", "private"]>>;
228
+ }, "strip", z.ZodTypeAny, {
229
+ sort: "trending" | "popular" | "newest" | "relevance";
230
+ limit: number;
231
+ offset: number;
232
+ visibility?: "public" | "private" | undefined;
233
+ category?: string | undefined;
234
+ q?: string | undefined;
235
+ tag?: string | undefined;
236
+ }, {
237
+ sort?: "trending" | "popular" | "newest" | "relevance" | undefined;
238
+ visibility?: "public" | "private" | undefined;
239
+ category?: string | undefined;
240
+ q?: string | undefined;
241
+ tag?: string | undefined;
242
+ limit?: number | undefined;
243
+ offset?: number | undefined;
244
+ }>;
245
+ export type MySkillsQuery = z.infer<typeof mySkillsQuerySchema>;
180
246
  //# sourceMappingURL=skill.schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skill.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/skill.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,qBAAqB,yCAAuC,CAAA;AACzE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEnE,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;IAqBtB,6EAA6E;;IAE7E,mEAAmE;;IAEnE,+EAA+E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI/E,CAAA;AACF,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AAE/C,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwB/B,CAAA;AACJ,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAErE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEjC,CAAA;AACF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAErE,eAAO,MAAM,eAAe,2DAAyD,CAAA;AACrF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAEvD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;EAOjC,CAAA;AACF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA"}
1
+ {"version":3,"file":"skill.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/skill.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,qBAAqB,kCAAgC,CAAA;AAClE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEnE,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;IAqBtB,6EAA6E;;IAE7E,mEAAmE;;IAEnE,+EAA+E;;IAE/E,gGAAgG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAchG,CAAA;AACF,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AAE/C,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwB/B,CAAA;AACJ,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAErE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEjC,CAAA;AACF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAErE,eAAO,MAAM,eAAe,2DAAyD,CAAA;AACrF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAEvD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;EAOjC,CAAA;AACF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAErE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;EAE9B,CAAA;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- export const skillVisibilitySchema = z.enum(['public', 'private', 'org']);
2
+ export const skillVisibilitySchema = z.enum(['public', 'private']);
3
3
  export const skillSchema = z.object({
4
4
  id: z.string().uuid(),
5
5
  owner_id: z.string().uuid(),
@@ -27,6 +27,18 @@ export const skillSchema = z.object({
27
27
  is_owner: z.boolean().optional(),
28
28
  /** Attached by the API on GET: true if the caller has bookmarked the Skill. */
29
29
  bookmarked: z.boolean().optional(),
30
+ /** Attached by the API: a public slice of the owner profile so cards can render attribution. */
31
+ owner: z
32
+ .object({
33
+ id: z.string().uuid(),
34
+ username: z.string().nullable(),
35
+ display_name: z.string().nullable(),
36
+ avatar_url: z.string().nullable(),
37
+ is_creator: z.boolean(),
38
+ is_partner: z.boolean(),
39
+ })
40
+ .nullable()
41
+ .optional(),
30
42
  created_at: z.string().datetime(),
31
43
  updated_at: z.string().datetime(),
32
44
  });
@@ -67,3 +79,6 @@ export const skillSearchQuerySchema = z.object({
67
79
  limit: z.coerce.number().int().min(1).max(100).default(24),
68
80
  offset: z.coerce.number().int().nonnegative().default(0),
69
81
  });
82
+ export const mySkillsQuerySchema = skillSearchQuerySchema.extend({
83
+ visibility: z.enum(['public', 'private']).optional(),
84
+ });
@@ -0,0 +1,5 @@
1
+ export declare const SKILL_CATEGORIES: readonly ["engineering", "design", "marketing", "research", "writing", "analytics", "productivity", "devops", "data", "ai", "security", "product", "workflow-orchestration", "other"];
2
+ export type SkillCategory = (typeof SKILL_CATEGORIES)[number];
3
+ export declare const CATEGORY_LABELS: Record<SkillCategory, string>;
4
+ export declare function isSkillCategory(value: unknown): value is SkillCategory;
5
+ //# sourceMappingURL=categories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categories.d.ts","sourceRoot":"","sources":["../../src/types/categories.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,uLAenB,CAAA;AAEV,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE7D,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAezD,CAAA;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAEtE"}
@@ -0,0 +1,35 @@
1
+ export const SKILL_CATEGORIES = [
2
+ 'engineering',
3
+ 'design',
4
+ 'marketing',
5
+ 'research',
6
+ 'writing',
7
+ 'analytics',
8
+ 'productivity',
9
+ 'devops',
10
+ 'data',
11
+ 'ai',
12
+ 'security',
13
+ 'product',
14
+ 'workflow-orchestration',
15
+ 'other',
16
+ ];
17
+ export const CATEGORY_LABELS = {
18
+ engineering: 'Engineering',
19
+ design: 'Design',
20
+ marketing: 'Marketing',
21
+ research: 'Research',
22
+ writing: 'Writing',
23
+ analytics: 'Analytics',
24
+ productivity: 'Productivity',
25
+ devops: 'DevOps',
26
+ data: 'Data',
27
+ ai: 'AI',
28
+ security: 'Security',
29
+ product: 'Product',
30
+ 'workflow-orchestration': 'Workflow',
31
+ other: 'Other',
32
+ };
33
+ export function isSkillCategory(value) {
34
+ return typeof value === 'string' && SKILL_CATEGORIES.includes(value);
35
+ }
@@ -1,4 +1,7 @@
1
- export type UserPlan = 'free' | 'pro' | 'team';
1
+ export * from './categories.js';
2
+ export * from './plan-limits.js';
3
+ export * from './intelligence.js';
4
+ export type UserPlan = 'free' | 'explorer' | 'creator';
2
5
  export type UserRole = 'user' | 'admin';
3
6
  export interface Profile {
4
7
  id: string;
@@ -6,12 +9,34 @@ export interface Profile {
6
9
  display_name: string | null;
7
10
  avatar_url: string | null;
8
11
  github_username: string | null;
12
+ bio: string | null;
13
+ website_url: string | null;
14
+ is_creator: boolean;
15
+ is_partner: boolean;
9
16
  role: UserRole;
10
17
  plan: UserPlan;
11
18
  stripe_customer_id: string | null;
12
19
  created_at: string;
13
20
  updated_at: string;
14
21
  }
22
+ /** Public-safe profile slice — no plan, no stripe ids, no role. */
23
+ export interface PublicProfile {
24
+ id: string;
25
+ username: string | null;
26
+ display_name: string | null;
27
+ avatar_url: string | null;
28
+ github_username: string | null;
29
+ bio: string | null;
30
+ website_url: string | null;
31
+ is_creator: boolean;
32
+ is_partner: boolean;
33
+ created_at: string;
34
+ }
35
+ export interface PublicProfilePage {
36
+ profile: PublicProfile;
37
+ skills: import('../schemas/skill.schema.js').Skill[];
38
+ skill_count: number;
39
+ }
15
40
  export interface AuthUser {
16
41
  id: string;
17
42
  email: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAA;AAC9C,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;AAEvC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE,QAAQ,CAAA;IACd,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CACd"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AAEjC,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;AACtD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;AAEvC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,UAAU,EAAE,OAAO,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;IACnB,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE,QAAQ,CAAA;IACd,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,mEAAmE;AACnE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,UAAU,EAAE,OAAO,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,aAAa,CAAA;IACtB,MAAM,EAAE,OAAO,4BAA4B,EAAE,KAAK,EAAE,CAAA;IACpD,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CACd"}
@@ -1 +1,3 @@
1
- export {};
1
+ export * from './categories.js';
2
+ export * from './plan-limits.js';
3
+ export * from './intelligence.js';
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Skill Intelligence — types shared across the API, web, CLI.
3
+ *
4
+ * Source-of-truth for the rows in `skill_metadata`, `skill_conflicts`,
5
+ * `skill_usage_stats`, and `user_agent_settings`. Every layer reads these.
6
+ */
7
+ export declare const AGENT_TYPES: readonly ["claude", "codex", "cursor", "gemini", "cline", "amp"];
8
+ export type AgentType = (typeof AGENT_TYPES)[number];
9
+ export interface AgentMeta {
10
+ id: AgentType;
11
+ label: string;
12
+ description: string;
13
+ /** Default OS-specific skill paths used as a fallback in the UI. */
14
+ defaultPath: {
15
+ mac: string;
16
+ windows: string;
17
+ };
18
+ /** When true, the SKILL.md needs format conversion before deploy. */
19
+ conversionRequired: boolean;
20
+ }
21
+ export declare const AGENT_REGISTRY: Record<AgentType, AgentMeta>;
22
+ export interface SkillMetadata {
23
+ id: string;
24
+ skill_id: string | null;
25
+ user_id: string;
26
+ name: string | null;
27
+ description: string | null;
28
+ triggers: string[];
29
+ slash_command: string | null;
30
+ disable_model_invocation: boolean;
31
+ user_invocable: boolean;
32
+ requires: string[];
33
+ estimated_tokens: number;
34
+ file_path: string;
35
+ agent_type: AgentType;
36
+ last_analyzed: string;
37
+ created_at: string;
38
+ updated_at: string;
39
+ }
40
+ export type ConflictType = 'trigger_overlap' | 'auto_invocation_collision' | 'dependency_conflict';
41
+ export interface SkillConflict {
42
+ id: string;
43
+ user_id: string;
44
+ skill_a_id: string;
45
+ skill_b_id: string;
46
+ conflict_type: ConflictType;
47
+ conflict_detail: string | null;
48
+ detected_at: string;
49
+ skill_a_name?: string | null;
50
+ skill_b_name?: string | null;
51
+ }
52
+ export interface SkillUsageStat {
53
+ id: string;
54
+ user_id: string;
55
+ skill_metadata_id: string;
56
+ trigger_phrase: string | null;
57
+ triggered_at: string;
58
+ }
59
+ export interface UserAgentSettings {
60
+ user_id: string;
61
+ enabled_agents: AgentType[];
62
+ skill_paths: Record<AgentType, {
63
+ mac: string;
64
+ windows: string;
65
+ }>;
66
+ detected_os: 'mac' | 'windows' | 'linux' | null;
67
+ updated_at: string;
68
+ }
69
+ export interface IntelligenceOverview {
70
+ total_skills: number;
71
+ auto_trigger_count: number;
72
+ user_invocable_count: number;
73
+ total_estimated_tokens: number;
74
+ conflict_count: number;
75
+ agents: {
76
+ agent: AgentType;
77
+ skill_count: number;
78
+ }[];
79
+ /** Top 5 token-heaviest skills, for the panel summary. */
80
+ heaviest: Array<Pick<SkillMetadata, 'id' | 'name' | 'slash_command' | 'estimated_tokens'>>;
81
+ }
82
+ export interface IntelligenceOptimization {
83
+ underused: SkillMetadata[];
84
+ merge_candidates: Array<{
85
+ a: SkillMetadata;
86
+ b: SkillMetadata;
87
+ reason: string;
88
+ }>;
89
+ heavy: SkillMetadata[];
90
+ total_savings_estimate_tokens: number;
91
+ }
92
+ export interface IntelligenceSearchResult {
93
+ source: 'local' | 'marketplace';
94
+ id: string;
95
+ slug: string;
96
+ name: string;
97
+ description: string | null;
98
+ slash_command: string | null;
99
+ estimated_tokens: number;
100
+ install_count?: number | null;
101
+ rating?: number | null;
102
+ is_installed: boolean;
103
+ }
104
+ export interface LlmSearchResult {
105
+ task: string;
106
+ keywords: string[];
107
+ scope: 'local' | 'marketplace' | 'both';
108
+ suggested_triggers: string[];
109
+ results: IntelligenceSearchResult[];
110
+ }
111
+ /** Shape returned to `prave whatdoes` and the Intelligence detail panel. */
112
+ export interface SkillWhatDoes {
113
+ found: boolean;
114
+ source: 'local' | 'marketplace' | null;
115
+ metadata: SkillMetadata | null;
116
+ marketplace?: {
117
+ slug: string;
118
+ name: string;
119
+ description: string | null;
120
+ install_count: number;
121
+ rating: number | null;
122
+ } | null;
123
+ conflicts: SkillConflict[];
124
+ similar?: Array<{
125
+ slug: string;
126
+ name: string;
127
+ }>;
128
+ }
129
+ /** Token-tier classification used by the CLI + UI badges. */
130
+ export type TokenTier = 'lean' | 'medium' | 'heavy';
131
+ export declare const tokenTier: (n: number) => TokenTier;
132
+ //# sourceMappingURL=intelligence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intelligence.d.ts","sourceRoot":"","sources":["../../src/types/intelligence.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,WAAW,kEAAmE,CAAA;AAC3F,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAEpD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,SAAS,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,oEAAoE;IACpE,WAAW,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7C,qEAAqE;IACrE,kBAAkB,EAAE,OAAO,CAAA;CAC5B;AAED,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,SAAS,EAAE,SAAS,CA2CvD,CAAA;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,wBAAwB,EAAE,OAAO,CAAA;IACjC,cAAc,EAAE,OAAO,CAAA;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,SAAS,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,MAAM,YAAY,GACpB,iBAAiB,GACjB,2BAA2B,GAC3B,qBAAqB,CAAA;AAEzB,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,YAAY,CAAA;IAC3B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,WAAW,EAAE,MAAM,CAAA;IAEnB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,iBAAiB,EAAE,MAAM,CAAA;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,SAAS,EAAE,CAAA;IAC3B,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAChE,WAAW,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,GAAG,IAAI,CAAA;IAC/C,UAAU,EAAE,MAAM,CAAA;CACnB;AAID,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAA;IACpB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,oBAAoB,EAAE,MAAM,CAAA;IAC5B,sBAAsB,EAAE,MAAM,CAAA;IAC9B,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACnD,0DAA0D;IAC1D,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,MAAM,GAAG,eAAe,GAAG,kBAAkB,CAAC,CAAC,CAAA;CAC3F;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,aAAa,EAAE,CAAA;IAC1B,gBAAgB,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,aAAa,CAAC;QAAC,CAAC,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC/E,KAAK,EAAE,aAAa,EAAE,CAAA;IACtB,6BAA6B,EAAE,MAAM,CAAA;CACtC;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,OAAO,GAAG,aAAa,CAAA;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,gBAAgB,EAAE,MAAM,CAAA;IACxB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,YAAY,EAAE,OAAO,CAAA;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,EAAE,OAAO,GAAG,aAAa,GAAG,MAAM,CAAA;IACvC,kBAAkB,EAAE,MAAM,EAAE,CAAA;IAC5B,OAAO,EAAE,wBAAwB,EAAE,CAAA;CACpC;AAED,4EAA4E;AAC5E,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CAAA;IACtC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAA;IAC9B,WAAW,CAAC,EAAE;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;QAC1B,aAAa,EAAE,MAAM,CAAA;QACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KACtB,GAAG,IAAI,CAAA;IACR,SAAS,EAAE,aAAa,EAAE,CAAA;IAC1B,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAChD;AAED,6DAA6D;AAC7D,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;AACnD,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,KAAG,SACY,CAAA"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Skill Intelligence — types shared across the API, web, CLI.
3
+ *
4
+ * Source-of-truth for the rows in `skill_metadata`, `skill_conflicts`,
5
+ * `skill_usage_stats`, and `user_agent_settings`. Every layer reads these.
6
+ */
7
+ export const AGENT_TYPES = ['claude', 'codex', 'cursor', 'gemini', 'cline', 'amp'];
8
+ export const AGENT_REGISTRY = {
9
+ claude: {
10
+ id: 'claude',
11
+ label: 'Claude Code',
12
+ description: "Anthropic's terminal-based coding agent",
13
+ defaultPath: { mac: '~/.claude/skills/', windows: '%APPDATA%\\Claude\\skills\\' },
14
+ conversionRequired: false,
15
+ },
16
+ codex: {
17
+ id: 'codex',
18
+ label: 'OpenAI Codex',
19
+ description: "OpenAI's CLI coding agent",
20
+ defaultPath: { mac: '~/.codex/skills/', windows: '%APPDATA%\\Codex\\skills\\' },
21
+ conversionRequired: false,
22
+ },
23
+ cursor: {
24
+ id: 'cursor',
25
+ label: 'Cursor',
26
+ description: 'AI-first code editor',
27
+ defaultPath: { mac: '.cursor/rules/', windows: '.cursor\\rules\\' },
28
+ conversionRequired: true,
29
+ },
30
+ gemini: {
31
+ id: 'gemini',
32
+ label: 'Gemini CLI',
33
+ description: "Google's terminal agent",
34
+ defaultPath: { mac: '~/.gemini/skills/', windows: '%APPDATA%\\Gemini\\skills\\' },
35
+ conversionRequired: false,
36
+ },
37
+ cline: {
38
+ id: 'cline',
39
+ label: 'Cline',
40
+ description: 'Open-source VS Code agent',
41
+ defaultPath: { mac: '~/.cline/skills/', windows: '%APPDATA%\\Cline\\skills\\' },
42
+ conversionRequired: false,
43
+ },
44
+ amp: {
45
+ id: 'amp',
46
+ label: 'Amp',
47
+ description: 'Ampcode terminal agent',
48
+ defaultPath: { mac: '~/.amp/skills/', windows: '%APPDATA%\\Amp\\skills\\' },
49
+ conversionRequired: false,
50
+ },
51
+ };
52
+ export const tokenTier = (n) => n < 500 ? 'lean' : n < 2000 ? 'medium' : 'heavy';
@@ -0,0 +1,62 @@
1
+ import type { Plan } from '../schemas/billing.schema.js';
2
+ /**
3
+ * PLAN_LIMITS — single source of truth for every gate, quota and copy
4
+ * choice across the app. Backend uses the numeric/boolean fields to
5
+ * enforce rules; frontend reads the same object to render disabled
6
+ * states + upgrade CTAs; CLI calls /me/plan and resolves limits here so
7
+ * one config drives all three surfaces.
8
+ *
9
+ * `null` numeric limits = unlimited.
10
+ */
11
+ export interface PlanLimits {
12
+ /** Display label used in pricing cards / Settings */
13
+ label: string;
14
+ /** Monthly price in EUR (display only — Stripe is the source of truth) */
15
+ price_eur_monthly: number;
16
+ /** Marketing tagline for the plan card */
17
+ tagline: string;
18
+ /** Marketplace creator share (0–1). Free can't sell. */
19
+ creator_revenue_share: number | null;
20
+ /** Max public skills the user can publish. null = unlimited. */
21
+ max_public_skills: number | null;
22
+ /** Can the user create private skills? */
23
+ can_private_skills: boolean;
24
+ /** Max private skills if allowed. null = unlimited. */
25
+ max_private_skills: number | null;
26
+ /** History tab + revert. */
27
+ can_versioning: boolean;
28
+ /** Max paid skills listed simultaneously. 0 = no marketplace. null = unlimited. */
29
+ max_marketplace_listings: number | null;
30
+ /** Monthly BYOK tester runs. 0 = blocked. null = unlimited. */
31
+ tester_credits_monthly: number | null;
32
+ /** Max bookmarks. null = unlimited. */
33
+ max_bookmarks: number | null;
34
+ /** Total skills the user may import via CLI. null = unlimited. */
35
+ cli_max_imports: number | null;
36
+ /** Monthly export quota via CLI. 0 = blocked. null = unlimited. */
37
+ cli_exports_monthly: number | null;
38
+ /** `prave sync` enabled. */
39
+ can_cli_sync: boolean;
40
+ /** Auto-update on `prave sync` rather than diff-only. */
41
+ can_cli_auto_update: boolean;
42
+ /** `prave install --bulk`, `prave export --bulk`. */
43
+ can_cli_bulk: boolean;
44
+ /** Drag-and-drop block builder UI. */
45
+ can_block_builder: boolean;
46
+ /** CI-style skill pipelines + automated tests. */
47
+ can_pipelines: boolean;
48
+ /** Per-skill analytics page. */
49
+ can_analytics: boolean;
50
+ /** Verified Creator badge on public profile. */
51
+ has_creator_badge: boolean;
52
+ }
53
+ export declare const PLAN_LIMITS: Record<Plan, PlanLimits>;
54
+ export declare const PLAN_RANK: Record<Plan, number>;
55
+ /** True when `actual` includes everything `required` does. */
56
+ export declare const planMeets: (actual: Plan, required: Plan) => boolean;
57
+ /**
58
+ * Smallest plan that satisfies a feature flag. Used by the UI to render
59
+ * accurate "Upgrade to X" CTAs without hard-coding plan names.
60
+ */
61
+ export declare const minPlanFor: (feature: keyof PlanLimits) => Plan | null;
62
+ //# sourceMappingURL=plan-limits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-limits.d.ts","sourceRoot":"","sources":["../../src/types/plan-limits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAA;AAExD;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAA;IACb,0EAA0E;IAC1E,iBAAiB,EAAE,MAAM,CAAA;IACzB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAA;IACf,wDAAwD;IACxD,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAA;IAGpC,gEAAgE;IAChE,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,0CAA0C;IAC1C,kBAAkB,EAAE,OAAO,CAAA;IAC3B,uDAAuD;IACvD,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,4BAA4B;IAC5B,cAAc,EAAE,OAAO,CAAA;IAGvB,mFAAmF;IACnF,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAA;IAGvC,+DAA+D;IAC/D,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAA;IAGrC,uCAAuC;IACvC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAG5B,kEAAkE;IAClE,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,mEAAmE;IACnE,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,4BAA4B;IAC5B,YAAY,EAAE,OAAO,CAAA;IACrB,yDAAyD;IACzD,mBAAmB,EAAE,OAAO,CAAA;IAC5B,qDAAqD;IACrD,YAAY,EAAE,OAAO,CAAA;IAGrB,sCAAsC;IACtC,iBAAiB,EAAE,OAAO,CAAA;IAC1B,kDAAkD;IAClD,aAAa,EAAE,OAAO,CAAA;IACtB,gCAAgC;IAChC,aAAa,EAAE,OAAO,CAAA;IACtB,gDAAgD;IAChD,iBAAiB,EAAE,OAAO,CAAA;CAC3B;AAED,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,CA+EhD,CAAA;AAED,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAI1C,CAAA;AAED,8DAA8D;AAC9D,eAAO,MAAM,SAAS,GAAI,QAAQ,IAAI,EAAE,UAAU,IAAI,KAAG,OACf,CAAA;AAE1C;;;GAGG;AACH,eAAO,MAAM,UAAU,GAAI,SAAS,MAAM,UAAU,KAAG,IAAI,GAAG,IAO7D,CAAA"}
@@ -0,0 +1,88 @@
1
+ export const PLAN_LIMITS = {
2
+ free: {
3
+ label: 'Starter',
4
+ price_eur_monthly: 0,
5
+ tagline: 'Discover, install and try Prave Skills.',
6
+ creator_revenue_share: null,
7
+ max_public_skills: 3,
8
+ can_private_skills: false,
9
+ max_private_skills: 0,
10
+ can_versioning: false,
11
+ max_marketplace_listings: 0,
12
+ tester_credits_monthly: 10,
13
+ max_bookmarks: 5,
14
+ cli_max_imports: 10,
15
+ cli_exports_monthly: 0,
16
+ can_cli_sync: false,
17
+ can_cli_auto_update: false,
18
+ can_cli_bulk: false,
19
+ can_block_builder: false,
20
+ can_pipelines: false,
21
+ can_analytics: false,
22
+ has_creator_badge: false,
23
+ },
24
+ explorer: {
25
+ label: 'Explorer',
26
+ price_eur_monthly: 4,
27
+ tagline: 'For developers building and shipping Skills.',
28
+ creator_revenue_share: null,
29
+ max_public_skills: 20,
30
+ can_private_skills: true,
31
+ max_private_skills: 20,
32
+ can_versioning: true,
33
+ max_marketplace_listings: 0,
34
+ tester_credits_monthly: 80,
35
+ max_bookmarks: null,
36
+ cli_max_imports: null,
37
+ cli_exports_monthly: 50,
38
+ can_cli_sync: true,
39
+ can_cli_auto_update: false,
40
+ can_cli_bulk: false,
41
+ can_block_builder: false,
42
+ can_pipelines: false,
43
+ can_analytics: false,
44
+ has_creator_badge: false,
45
+ },
46
+ creator: {
47
+ label: 'Creator',
48
+ price_eur_monthly: 10,
49
+ tagline: 'For power users shipping and selling Skills daily.',
50
+ creator_revenue_share: 0.7,
51
+ max_public_skills: null,
52
+ can_private_skills: true,
53
+ max_private_skills: null,
54
+ can_versioning: true,
55
+ max_marketplace_listings: null,
56
+ tester_credits_monthly: 250,
57
+ max_bookmarks: null,
58
+ cli_max_imports: null,
59
+ cli_exports_monthly: null,
60
+ can_cli_sync: true,
61
+ can_cli_auto_update: true,
62
+ can_cli_bulk: true,
63
+ can_block_builder: true,
64
+ can_pipelines: true,
65
+ can_analytics: true,
66
+ has_creator_badge: true,
67
+ },
68
+ };
69
+ export const PLAN_RANK = {
70
+ free: 0,
71
+ explorer: 1,
72
+ creator: 2,
73
+ };
74
+ /** True when `actual` includes everything `required` does. */
75
+ export const planMeets = (actual, required) => PLAN_RANK[actual] >= PLAN_RANK[required];
76
+ /**
77
+ * Smallest plan that satisfies a feature flag. Used by the UI to render
78
+ * accurate "Upgrade to X" CTAs without hard-coding plan names.
79
+ */
80
+ export const minPlanFor = (feature) => {
81
+ const order = ['free', 'explorer', 'creator'];
82
+ for (const plan of order) {
83
+ const v = PLAN_LIMITS[plan][feature];
84
+ if (typeof v === 'boolean' ? v : v !== 0)
85
+ return plan;
86
+ }
87
+ return null;
88
+ };