rahman-resources 0.4.3 → 0.8.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/bin/cli.js +673 -23
- package/lib/manifest.json +432 -25
- package/lib/rr-schema.json +14 -0
- package/lib/rr.mjs +19 -0
- package/lib/slice-schema.json +161 -0
- package/lib/starter/_gitignore +3 -1
- package/lib/starter/_package.json +1 -0
- package/lib/starter/app/layout.tsx +4 -1
- package/lib/starter/components/convex-provider.tsx +31 -7
- package/lib/starter/tsconfig.json +5 -2
- package/lib/workflows/features.md +50 -0
- package/lib/workflows/recipes.md +42 -0
- package/lib/workflows/skills.md +48 -0
- package/lib/workflows/templates.md +51 -0
- package/package.json +4 -3
package/lib/manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 2,
|
|
3
|
-
"generatedAt": "2026-05-
|
|
3
|
+
"generatedAt": "2026-05-09T13:46:31.069Z",
|
|
4
4
|
"repo": "rahmanef63/resource-site",
|
|
5
5
|
"branch": "main",
|
|
6
6
|
"layouts": [
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"app/preview/personal-brand-os",
|
|
16
16
|
"components/templates/_shared",
|
|
17
17
|
"components/templates/personal-brand",
|
|
18
|
-
"convex
|
|
18
|
+
"convex-templates/personal-brand-os"
|
|
19
19
|
],
|
|
20
20
|
"files": [
|
|
21
21
|
"app/preview/personal-brand-os/robots.ts",
|
|
@@ -91,16 +91,16 @@
|
|
|
91
91
|
"components/templates/personal-brand/slices/admin/newsletter/NewsletterView.tsx",
|
|
92
92
|
"components/templates/personal-brand/slices/admin/analytics/AnalyticsView.tsx",
|
|
93
93
|
"components/templates/personal-brand/slices/admin/settings/SettingsView.tsx",
|
|
94
|
-
"convex
|
|
95
|
-
"convex
|
|
96
|
-
"convex
|
|
97
|
-
"convex
|
|
98
|
-
"convex
|
|
99
|
-
"convex
|
|
100
|
-
"convex
|
|
101
|
-
"convex
|
|
102
|
-
"convex
|
|
103
|
-
"convex
|
|
94
|
+
"convex-templates/personal-brand-os/schema.ts",
|
|
95
|
+
"convex-templates/personal-brand-os/posts.ts",
|
|
96
|
+
"convex-templates/personal-brand-os/portfolio.ts",
|
|
97
|
+
"convex-templates/personal-brand-os/services.ts",
|
|
98
|
+
"convex-templates/personal-brand-os/resources.ts",
|
|
99
|
+
"convex-templates/personal-brand-os/leads.ts",
|
|
100
|
+
"convex-templates/personal-brand-os/comments.ts",
|
|
101
|
+
"convex-templates/personal-brand-os/subscribers.ts",
|
|
102
|
+
"convex-templates/personal-brand-os/chat.ts",
|
|
103
|
+
"convex-templates/personal-brand-os/README.md"
|
|
104
104
|
],
|
|
105
105
|
"dependencies": [
|
|
106
106
|
"next@^16",
|
|
@@ -113,6 +113,7 @@
|
|
|
113
113
|
"tailwindcss@^4",
|
|
114
114
|
"convex",
|
|
115
115
|
"@convex-dev/auth",
|
|
116
|
+
"@auth/core@^0.37.0",
|
|
116
117
|
"@radix-ui/react-avatar",
|
|
117
118
|
"@radix-ui/react-dialog",
|
|
118
119
|
"@radix-ui/react-dropdown-menu",
|
|
@@ -123,7 +124,18 @@
|
|
|
123
124
|
"@radix-ui/react-slot",
|
|
124
125
|
"@radix-ui/react-tabs"
|
|
125
126
|
],
|
|
126
|
-
"
|
|
127
|
+
"shadcnComponents": [
|
|
128
|
+
"badge",
|
|
129
|
+
"button",
|
|
130
|
+
"card",
|
|
131
|
+
"dialog",
|
|
132
|
+
"input",
|
|
133
|
+
"separator",
|
|
134
|
+
"sheet",
|
|
135
|
+
"tabs",
|
|
136
|
+
"textarea"
|
|
137
|
+
],
|
|
138
|
+
"agentRecipe": "Personal Brand OS = full-app template (public + admin). 1) Move app/preview/personal-brand-os/{robots,sitemap,opengraph-image}.* to app root. 2) Copy app/preview/personal-brand-os/public into app/(public)/, app/preview/personal-brand-os/admin into app/(admin)/. 3) Edit components/templates/personal-brand/shared/site-config.ts — set brandName, ownerName, baseUrl, twitter, email. 4) Wire convex-templates/personal-brand-os/* into your convex/ (kitab ships them outside `convex/` so the bundler doesn't try to compile scaffolds without _generated) and add @convex-dev/auth on admin routes. 5) Replace localStorage StoreProvider with Convex queries (schema mirrors localStorage shape).",
|
|
127
139
|
"tags": [
|
|
128
140
|
"template",
|
|
129
141
|
"personal-brand",
|
|
@@ -145,7 +157,7 @@
|
|
|
145
157
|
"app/preview/agency-studio-os",
|
|
146
158
|
"components/templates/_shared",
|
|
147
159
|
"components/templates/agency-studio",
|
|
148
|
-
"convex
|
|
160
|
+
"convex-templates/agency-studio-os"
|
|
149
161
|
],
|
|
150
162
|
"files": [
|
|
151
163
|
"app/preview/agency-studio-os/robots.ts",
|
|
@@ -186,12 +198,12 @@
|
|
|
186
198
|
"components/templates/agency-studio/slices/admin/services/ServicesAdminView.tsx",
|
|
187
199
|
"components/templates/agency-studio/slices/admin/leads/LeadsView.tsx",
|
|
188
200
|
"components/templates/agency-studio/slices/admin/settings/SettingsView.tsx",
|
|
189
|
-
"convex
|
|
190
|
-
"convex
|
|
191
|
-
"convex
|
|
192
|
-
"convex
|
|
193
|
-
"convex
|
|
194
|
-
"convex
|
|
201
|
+
"convex-templates/agency-studio-os/schema.ts",
|
|
202
|
+
"convex-templates/agency-studio-os/projects.ts",
|
|
203
|
+
"convex-templates/agency-studio-os/clients.ts",
|
|
204
|
+
"convex-templates/agency-studio-os/services.ts",
|
|
205
|
+
"convex-templates/agency-studio-os/leads.ts",
|
|
206
|
+
"convex-templates/agency-studio-os/README.md"
|
|
195
207
|
],
|
|
196
208
|
"dependencies": [
|
|
197
209
|
"next@^16",
|
|
@@ -204,13 +216,24 @@
|
|
|
204
216
|
"tailwindcss@^4",
|
|
205
217
|
"convex",
|
|
206
218
|
"@convex-dev/auth",
|
|
219
|
+
"@auth/core@^0.37.0",
|
|
207
220
|
"@radix-ui/react-avatar",
|
|
208
221
|
"@radix-ui/react-dialog",
|
|
209
222
|
"@radix-ui/react-label",
|
|
210
223
|
"@radix-ui/react-separator",
|
|
211
224
|
"@radix-ui/react-slot"
|
|
212
225
|
],
|
|
213
|
-
"
|
|
226
|
+
"shadcnComponents": [
|
|
227
|
+
"badge",
|
|
228
|
+
"button",
|
|
229
|
+
"card",
|
|
230
|
+
"input",
|
|
231
|
+
"label",
|
|
232
|
+
"separator",
|
|
233
|
+
"sheet",
|
|
234
|
+
"textarea"
|
|
235
|
+
],
|
|
236
|
+
"agentRecipe": "Agency Studio OS = full-app B2B agency template (public + admin). 1) Move app/preview/agency-studio-os/{robots,sitemap,opengraph-image}.* to app root. 2) Copy public into app/(public)/, admin into app/(admin)/. 3) Edit components/templates/agency-studio/shared/site-config.ts — set studioName, brandName, baseUrl, twitter, email. 4) Wire convex-templates/agency-studio-os/* into your convex/ (kitab ships them outside `convex/` so the bundler doesn't try to compile scaffolds without _generated) and add @convex-dev/auth on admin routes. 5) Replace localStorage StoreProvider with Convex queries.",
|
|
214
237
|
"tags": [
|
|
215
238
|
"template",
|
|
216
239
|
"agency",
|
|
@@ -234,6 +257,7 @@
|
|
|
234
257
|
],
|
|
235
258
|
"files": [],
|
|
236
259
|
"dependencies": [],
|
|
260
|
+
"shadcnComponents": [],
|
|
237
261
|
"agentRecipe": "Mount the HeroSection from cookbook/layouts/landing-hero-carousel as the hero of the marketing route group. Provide image array via props or wire to Convex api.heroImages.list.",
|
|
238
262
|
"tags": [
|
|
239
263
|
"marketing",
|
|
@@ -255,6 +279,7 @@
|
|
|
255
279
|
],
|
|
256
280
|
"files": [],
|
|
257
281
|
"dependencies": [],
|
|
282
|
+
"shadcnComponents": [],
|
|
258
283
|
"agentRecipe": "Use PortfolioGrid for case-study or portfolio pages. Items array shape: { id, title, cover, href, category }. The 8-slot pattern repeats; supply at least 8 items for the layout to bloom.",
|
|
259
284
|
"tags": [
|
|
260
285
|
"marketing",
|
|
@@ -276,6 +301,7 @@
|
|
|
276
301
|
],
|
|
277
302
|
"files": [],
|
|
278
303
|
"dependencies": [],
|
|
304
|
+
"shadcnComponents": [],
|
|
279
305
|
"agentRecipe": "Compose a 3-column CSS grid with explicit area assignments per feature. Mix Card sizes (1x1, 1x2, 2x1, 2x2) for visual rhythm.",
|
|
280
306
|
"tags": [
|
|
281
307
|
"marketing",
|
|
@@ -296,6 +322,7 @@
|
|
|
296
322
|
],
|
|
297
323
|
"files": [],
|
|
298
324
|
"dependencies": [],
|
|
325
|
+
"shadcnComponents": [],
|
|
299
326
|
"agentRecipe": "Use motion primitives marquee, kinetic-heading, magnetic from components/motion (already imported into the kitab from rahmanef.com). All respect prefers-reduced-motion automatically.",
|
|
300
327
|
"tags": [
|
|
301
328
|
"marketing",
|
|
@@ -316,6 +343,7 @@
|
|
|
316
343
|
],
|
|
317
344
|
"files": [],
|
|
318
345
|
"dependencies": [],
|
|
346
|
+
"shadcnComponents": [],
|
|
319
347
|
"agentRecipe": "Mount inside app/dashboard/<slice>/page.tsx. Wrap with the kitab's <ThreeColumnLayout>. Slot in slice-specific sidebars and inspectors. Mobile auto-collapses to drawers.",
|
|
320
348
|
"tags": [
|
|
321
349
|
"dashboard",
|
|
@@ -337,6 +365,7 @@
|
|
|
337
365
|
],
|
|
338
366
|
"files": [],
|
|
339
367
|
"dependencies": [],
|
|
368
|
+
"shadcnComponents": [],
|
|
340
369
|
"agentRecipe": "Compose grid: 48px activity bar + tabs row + editor/inspector flex row + bottom console. Wire activity bar items to dispatch into tabs/inspector store.",
|
|
341
370
|
"tags": [
|
|
342
371
|
"dashboard",
|
|
@@ -357,6 +386,7 @@
|
|
|
357
386
|
],
|
|
358
387
|
"files": [],
|
|
359
388
|
"dependencies": [],
|
|
389
|
+
"shadcnComponents": [],
|
|
360
390
|
"agentRecipe": "Use ResponsiveDashboardShell which branches desktop (sidebar) vs mobile (dock). Customize MobileDashboardDock items and MobileTopBar workspace switcher to your domain.",
|
|
361
391
|
"tags": [
|
|
362
392
|
"dashboard",
|
|
@@ -377,6 +407,7 @@
|
|
|
377
407
|
],
|
|
378
408
|
"files": [],
|
|
379
409
|
"dependencies": [],
|
|
410
|
+
"shadcnComponents": [],
|
|
380
411
|
"agentRecipe": "Port kitab-core slices/cms-lite/ into your project's app/(cms)/ route group. Fetch products/pages from Convex via api.cmsLite.* queries.",
|
|
381
412
|
"tags": [
|
|
382
413
|
"cms",
|
|
@@ -427,11 +458,23 @@
|
|
|
427
458
|
"react@^19",
|
|
428
459
|
"react-dom@^19",
|
|
429
460
|
"lucide-react",
|
|
461
|
+
"@tabler/icons-react",
|
|
430
462
|
"sonner",
|
|
431
463
|
"next-themes",
|
|
432
464
|
"tailwindcss@^4",
|
|
465
|
+
"@radix-ui/react-label",
|
|
466
|
+
"@radix-ui/react-separator",
|
|
433
467
|
"@radix-ui/react-slot"
|
|
434
468
|
],
|
|
469
|
+
"shadcnComponents": [
|
|
470
|
+
"badge",
|
|
471
|
+
"button",
|
|
472
|
+
"input",
|
|
473
|
+
"label",
|
|
474
|
+
"separator",
|
|
475
|
+
"sheet",
|
|
476
|
+
"textarea"
|
|
477
|
+
],
|
|
435
478
|
"agentRecipe": "SaaS Marketing OS = public-only marketing template. Blog + changelog use MDX (add the mdx-blog feature). Edit components/templates/saas-marketing/shared/site-config.ts to set product name, tagline, pricing tiers, contact email.",
|
|
436
479
|
"tags": [
|
|
437
480
|
"template",
|
|
@@ -499,7 +542,20 @@
|
|
|
499
542
|
"react@^19",
|
|
500
543
|
"react-dom@^19",
|
|
501
544
|
"lucide-react",
|
|
502
|
-
"
|
|
545
|
+
"@tabler/icons-react",
|
|
546
|
+
"tailwindcss@^4",
|
|
547
|
+
"@radix-ui/react-label",
|
|
548
|
+
"@radix-ui/react-separator",
|
|
549
|
+
"@radix-ui/react-slot"
|
|
550
|
+
],
|
|
551
|
+
"shadcnComponents": [
|
|
552
|
+
"badge",
|
|
553
|
+
"button",
|
|
554
|
+
"card",
|
|
555
|
+
"input",
|
|
556
|
+
"label",
|
|
557
|
+
"separator",
|
|
558
|
+
"sheet"
|
|
503
559
|
],
|
|
504
560
|
"agentRecipe": "Kreator Studio OS = full-app content-creator template (public newsletter + 9-tab admin). 1) Edit components/templates/kreator-studio/shared/site-config.ts (brandName, ownerName, baseUrl, twitter). 2) Replace localStorage StoreProvider with Convex queries (state shape mirrors localStorage). 3) Wire Resend for newsletter + Midtrans tip-jar on public CTA. 4) Voice/Scripts/Carousels admin views are scaffolds — wire to ai-router (mid tier for voice-train/voice-apply, nano for shortform script).",
|
|
505
561
|
"tags": [
|
|
@@ -564,7 +620,21 @@
|
|
|
564
620
|
"react@^19",
|
|
565
621
|
"react-dom@^19",
|
|
566
622
|
"lucide-react",
|
|
567
|
-
"
|
|
623
|
+
"@tabler/icons-react",
|
|
624
|
+
"tailwindcss@^4",
|
|
625
|
+
"@radix-ui/react-label",
|
|
626
|
+
"@radix-ui/react-separator",
|
|
627
|
+
"@radix-ui/react-slot"
|
|
628
|
+
],
|
|
629
|
+
"shadcnComponents": [
|
|
630
|
+
"badge",
|
|
631
|
+
"button",
|
|
632
|
+
"card",
|
|
633
|
+
"input",
|
|
634
|
+
"label",
|
|
635
|
+
"separator",
|
|
636
|
+
"sheet",
|
|
637
|
+
"textarea"
|
|
568
638
|
],
|
|
569
639
|
"agentRecipe": "Konsultan OS = full-app consultancy template (public services + 7-tab admin). 1) Edit components/templates/konsultan/shared/site-config.ts (brandName, ownerName, baseUrl). 2) Replace localStorage StoreProvider with Convex queries. 3) Add @convex-dev/auth + RBAC on /admin routes. 4) Wire Resend for proposal email + e-sign provider for contracts. 5) Billing view is PajakAware-ready — connect to Midtrans + Indonesian-tax calc on invoice generation.",
|
|
570
640
|
"tags": [
|
|
@@ -629,7 +699,21 @@
|
|
|
629
699
|
"react@^19",
|
|
630
700
|
"react-dom@^19",
|
|
631
701
|
"lucide-react",
|
|
632
|
-
"
|
|
702
|
+
"@tabler/icons-react",
|
|
703
|
+
"tailwindcss@^4",
|
|
704
|
+
"@radix-ui/react-label",
|
|
705
|
+
"@radix-ui/react-separator",
|
|
706
|
+
"@radix-ui/react-slot"
|
|
707
|
+
],
|
|
708
|
+
"shadcnComponents": [
|
|
709
|
+
"badge",
|
|
710
|
+
"button",
|
|
711
|
+
"card",
|
|
712
|
+
"input",
|
|
713
|
+
"label",
|
|
714
|
+
"separator",
|
|
715
|
+
"sheet",
|
|
716
|
+
"textarea"
|
|
633
717
|
],
|
|
634
718
|
"agentRecipe": "Wirausaha OS = full-app UKM template (mobile-first public storefront + 8-tab admin). 1) Edit components/templates/wirausaha/shared/site-config.ts. 2) Replace localStorage StoreProvider with Convex queries. 3) Wire Midtrans + QRIS for orders. 4) Add WhatsApp-bot for order confirmations. 5) Finance view scaffolds AI-laporan — connect to ai-router (mid tier) for narrative generation from monthly aggregates.",
|
|
635
719
|
"tags": [
|
|
@@ -693,7 +777,20 @@
|
|
|
693
777
|
"react@^19",
|
|
694
778
|
"react-dom@^19",
|
|
695
779
|
"lucide-react",
|
|
696
|
-
"
|
|
780
|
+
"@tabler/icons-react",
|
|
781
|
+
"tailwindcss@^4",
|
|
782
|
+
"@radix-ui/react-label",
|
|
783
|
+
"@radix-ui/react-separator",
|
|
784
|
+
"@radix-ui/react-slot"
|
|
785
|
+
],
|
|
786
|
+
"shadcnComponents": [
|
|
787
|
+
"badge",
|
|
788
|
+
"button",
|
|
789
|
+
"card",
|
|
790
|
+
"input",
|
|
791
|
+
"label",
|
|
792
|
+
"separator",
|
|
793
|
+
"sheet"
|
|
697
794
|
],
|
|
698
795
|
"agentRecipe": "Riset Kit = full-app research template (public KB reader + 6-tab admin). 1) Edit components/templates/research/shared/site-config.ts. 2) Replace localStorage StoreProvider with Convex queries. 3) Add @convex-dev/auth on /admin (single owner suffices). 4) Document library expects pdf-extract + vector-search — wire convex-vector-search component. 5) AI Reader wires ai-router (mid tier) for QA over uploaded PDFs. 6) Lit-review matrix is a scaffold — wire AI summarizer per cell.",
|
|
699
796
|
"tags": [
|
|
@@ -1019,5 +1116,315 @@
|
|
|
1019
1116
|
"embed"
|
|
1020
1117
|
]
|
|
1021
1118
|
}
|
|
1119
|
+
],
|
|
1120
|
+
"slices": [
|
|
1121
|
+
{
|
|
1122
|
+
"slug": "convex-auth",
|
|
1123
|
+
"title": "Convex Auth — Email Magic Link",
|
|
1124
|
+
"category": "auth",
|
|
1125
|
+
"version": "0.1.0",
|
|
1126
|
+
"description": "@convex-dev/auth with email magic link via Resend. Self-hosted Convex friendly. Hard mandate per kitab CLAUDE.md (no Clerk).",
|
|
1127
|
+
"source": "rahmanef63/resource-site",
|
|
1128
|
+
"slicePath": "frontend/slices/convex-auth",
|
|
1129
|
+
"convexPaths": [
|
|
1130
|
+
"convex/features/auth"
|
|
1131
|
+
],
|
|
1132
|
+
"npm": [
|
|
1133
|
+
"@convex-dev/auth@^0.0.84",
|
|
1134
|
+
"@auth/core@^0.37.0",
|
|
1135
|
+
"resend@^4.0.0"
|
|
1136
|
+
],
|
|
1137
|
+
"shadcn": [
|
|
1138
|
+
"button",
|
|
1139
|
+
"card",
|
|
1140
|
+
"input",
|
|
1141
|
+
"label",
|
|
1142
|
+
"dropdown-menu",
|
|
1143
|
+
"avatar"
|
|
1144
|
+
],
|
|
1145
|
+
"env": [
|
|
1146
|
+
{
|
|
1147
|
+
"name": "AUTH_RESEND_KEY",
|
|
1148
|
+
"scope": "convex"
|
|
1149
|
+
},
|
|
1150
|
+
{
|
|
1151
|
+
"name": "JWT_PRIVATE_KEY",
|
|
1152
|
+
"scope": "convex"
|
|
1153
|
+
},
|
|
1154
|
+
{
|
|
1155
|
+
"name": "JWKS",
|
|
1156
|
+
"scope": "convex"
|
|
1157
|
+
},
|
|
1158
|
+
{
|
|
1159
|
+
"name": "SITE_URL",
|
|
1160
|
+
"scope": "convex"
|
|
1161
|
+
}
|
|
1162
|
+
],
|
|
1163
|
+
"peers": [],
|
|
1164
|
+
"providers": [],
|
|
1165
|
+
"tags": [
|
|
1166
|
+
"auth",
|
|
1167
|
+
"convex",
|
|
1168
|
+
"magic-link",
|
|
1169
|
+
"no-clerk"
|
|
1170
|
+
],
|
|
1171
|
+
"agentRecipe": "Run `rr add convex-auth`. Then create convex/auth.ts using the kitab pattern (Resend provider). Set env via `npx convex env set` for self-hosted."
|
|
1172
|
+
},
|
|
1173
|
+
{
|
|
1174
|
+
"slug": "midtrans-payment",
|
|
1175
|
+
"title": "Midtrans Payment",
|
|
1176
|
+
"category": "payment",
|
|
1177
|
+
"version": "0.1.0",
|
|
1178
|
+
"description": "Midtrans Snap checkout + webhook + transaction history. Provider-isolated under components/providers/midtrans + actions/midtrans so Doku/Stripe land as siblings.",
|
|
1179
|
+
"source": "rahmanef63/resource-site",
|
|
1180
|
+
"slicePath": "frontend/slices/midtrans-payment",
|
|
1181
|
+
"convexPaths": [
|
|
1182
|
+
"convex/features/payment"
|
|
1183
|
+
],
|
|
1184
|
+
"npm": [
|
|
1185
|
+
"midtrans-client@^1.4.2"
|
|
1186
|
+
],
|
|
1187
|
+
"shadcn": [
|
|
1188
|
+
"card",
|
|
1189
|
+
"button",
|
|
1190
|
+
"dialog",
|
|
1191
|
+
"input",
|
|
1192
|
+
"label"
|
|
1193
|
+
],
|
|
1194
|
+
"env": [
|
|
1195
|
+
{
|
|
1196
|
+
"name": "MIDTRANS_SERVER_KEY",
|
|
1197
|
+
"scope": "convex",
|
|
1198
|
+
"required": true
|
|
1199
|
+
},
|
|
1200
|
+
{
|
|
1201
|
+
"name": "MIDTRANS_CLIENT_KEY",
|
|
1202
|
+
"scope": "next-public",
|
|
1203
|
+
"required": true
|
|
1204
|
+
},
|
|
1205
|
+
{
|
|
1206
|
+
"name": "MIDTRANS_IS_PRODUCTION",
|
|
1207
|
+
"scope": "convex"
|
|
1208
|
+
}
|
|
1209
|
+
],
|
|
1210
|
+
"peers": [
|
|
1211
|
+
{
|
|
1212
|
+
"slug": "convex-auth",
|
|
1213
|
+
"range": "^0.1",
|
|
1214
|
+
"reason": "Order ownership requires authenticated user."
|
|
1215
|
+
}
|
|
1216
|
+
],
|
|
1217
|
+
"providers": [
|
|
1218
|
+
"midtrans"
|
|
1219
|
+
],
|
|
1220
|
+
"tags": [
|
|
1221
|
+
"payment",
|
|
1222
|
+
"midtrans",
|
|
1223
|
+
"indonesia",
|
|
1224
|
+
"qris",
|
|
1225
|
+
"snap"
|
|
1226
|
+
],
|
|
1227
|
+
"agentRecipe": ""
|
|
1228
|
+
},
|
|
1229
|
+
{
|
|
1230
|
+
"slug": "resend-newsletter",
|
|
1231
|
+
"title": "Resend Newsletter",
|
|
1232
|
+
"category": "email",
|
|
1233
|
+
"version": "0.1.0",
|
|
1234
|
+
"description": "Subscribe form + admin send-broadcast pipeline via Resend.",
|
|
1235
|
+
"source": "rahmanef63/resource-site",
|
|
1236
|
+
"slicePath": "frontend/slices/resend-newsletter",
|
|
1237
|
+
"convexPaths": [
|
|
1238
|
+
"convex/features/newsletter"
|
|
1239
|
+
],
|
|
1240
|
+
"npm": [
|
|
1241
|
+
"resend@^4.0.0"
|
|
1242
|
+
],
|
|
1243
|
+
"shadcn": [
|
|
1244
|
+
"button",
|
|
1245
|
+
"card",
|
|
1246
|
+
"input",
|
|
1247
|
+
"label",
|
|
1248
|
+
"textarea"
|
|
1249
|
+
],
|
|
1250
|
+
"env": [
|
|
1251
|
+
{
|
|
1252
|
+
"name": "RESEND_API_KEY",
|
|
1253
|
+
"scope": "convex",
|
|
1254
|
+
"required": true
|
|
1255
|
+
},
|
|
1256
|
+
{
|
|
1257
|
+
"name": "RESEND_FROM",
|
|
1258
|
+
"scope": "convex",
|
|
1259
|
+
"required": true
|
|
1260
|
+
}
|
|
1261
|
+
],
|
|
1262
|
+
"peers": [],
|
|
1263
|
+
"providers": [],
|
|
1264
|
+
"tags": [
|
|
1265
|
+
"email",
|
|
1266
|
+
"newsletter",
|
|
1267
|
+
"resend"
|
|
1268
|
+
],
|
|
1269
|
+
"agentRecipe": ""
|
|
1270
|
+
},
|
|
1271
|
+
{
|
|
1272
|
+
"slug": "ai-router",
|
|
1273
|
+
"title": "AI Router (OpenRouter)",
|
|
1274
|
+
"category": "ai",
|
|
1275
|
+
"version": "0.1.0",
|
|
1276
|
+
"description": "Tier-routed LLM access via OpenRouter — nano (Haiku) for classification, mid (Sonnet) for chat, flagship (Opus) for deep reasoning. Per-call usage log.",
|
|
1277
|
+
"source": "rahmanef63/resource-site",
|
|
1278
|
+
"slicePath": "frontend/slices/ai-router",
|
|
1279
|
+
"convexPaths": [
|
|
1280
|
+
"convex/features/ai"
|
|
1281
|
+
],
|
|
1282
|
+
"npm": [
|
|
1283
|
+
"ai@^4.0.0",
|
|
1284
|
+
"@openrouter/ai-sdk-provider@^0.0.5"
|
|
1285
|
+
],
|
|
1286
|
+
"shadcn": [
|
|
1287
|
+
"button"
|
|
1288
|
+
],
|
|
1289
|
+
"env": [
|
|
1290
|
+
{
|
|
1291
|
+
"name": "OPENROUTER_API_KEY",
|
|
1292
|
+
"scope": "convex",
|
|
1293
|
+
"required": true
|
|
1294
|
+
}
|
|
1295
|
+
],
|
|
1296
|
+
"peers": [],
|
|
1297
|
+
"providers": [],
|
|
1298
|
+
"tags": [
|
|
1299
|
+
"ai",
|
|
1300
|
+
"llm",
|
|
1301
|
+
"openrouter",
|
|
1302
|
+
"tier-routing"
|
|
1303
|
+
],
|
|
1304
|
+
"agentRecipe": ""
|
|
1305
|
+
},
|
|
1306
|
+
{
|
|
1307
|
+
"slug": "vector-search",
|
|
1308
|
+
"title": "Convex Vector Search",
|
|
1309
|
+
"category": "search",
|
|
1310
|
+
"version": "0.1.0",
|
|
1311
|
+
"description": "Embeddings-based search via @convex-dev/vector-search. Embed on insert, query by vector similarity.",
|
|
1312
|
+
"source": "rahmanef63/resource-site",
|
|
1313
|
+
"slicePath": "frontend/slices/vector-search",
|
|
1314
|
+
"convexPaths": [
|
|
1315
|
+
"convex/features/search"
|
|
1316
|
+
],
|
|
1317
|
+
"npm": [
|
|
1318
|
+
"@convex-dev/vector-search@^0.0.5"
|
|
1319
|
+
],
|
|
1320
|
+
"shadcn": [
|
|
1321
|
+
"card",
|
|
1322
|
+
"input"
|
|
1323
|
+
],
|
|
1324
|
+
"env": [
|
|
1325
|
+
{
|
|
1326
|
+
"name": "OPENAI_API_KEY",
|
|
1327
|
+
"scope": "convex",
|
|
1328
|
+
"required": true
|
|
1329
|
+
}
|
|
1330
|
+
],
|
|
1331
|
+
"peers": [],
|
|
1332
|
+
"providers": [],
|
|
1333
|
+
"tags": [
|
|
1334
|
+
"search",
|
|
1335
|
+
"vector",
|
|
1336
|
+
"embeddings",
|
|
1337
|
+
"convex"
|
|
1338
|
+
],
|
|
1339
|
+
"agentRecipe": ""
|
|
1340
|
+
},
|
|
1341
|
+
{
|
|
1342
|
+
"slug": "mdx-blog",
|
|
1343
|
+
"title": "MDX Blog",
|
|
1344
|
+
"category": "content",
|
|
1345
|
+
"version": "0.1.0",
|
|
1346
|
+
"description": "File-based MDX blog under content/blog/*.mdx. List + detail page + RSS feed. No backend.",
|
|
1347
|
+
"source": "rahmanef63/resource-site",
|
|
1348
|
+
"slicePath": "frontend/slices/mdx-blog",
|
|
1349
|
+
"convexPaths": [],
|
|
1350
|
+
"npm": [
|
|
1351
|
+
"@next/mdx@^16.0.0",
|
|
1352
|
+
"gray-matter@^4.0.3",
|
|
1353
|
+
"rehype-pretty-code@^0.14.0"
|
|
1354
|
+
],
|
|
1355
|
+
"shadcn": [
|
|
1356
|
+
"card"
|
|
1357
|
+
],
|
|
1358
|
+
"env": [],
|
|
1359
|
+
"peers": [],
|
|
1360
|
+
"providers": [],
|
|
1361
|
+
"tags": [
|
|
1362
|
+
"content",
|
|
1363
|
+
"blog",
|
|
1364
|
+
"mdx",
|
|
1365
|
+
"static"
|
|
1366
|
+
],
|
|
1367
|
+
"agentRecipe": ""
|
|
1368
|
+
},
|
|
1369
|
+
{
|
|
1370
|
+
"slug": "cal-com-booking",
|
|
1371
|
+
"title": "Cal.com Booking",
|
|
1372
|
+
"category": "data",
|
|
1373
|
+
"version": "0.1.0",
|
|
1374
|
+
"description": "Embedded Cal.com booking widget + webhook receiver to mirror bookings into Convex.",
|
|
1375
|
+
"source": "rahmanef63/resource-site",
|
|
1376
|
+
"slicePath": "frontend/slices/cal-com-booking",
|
|
1377
|
+
"convexPaths": [
|
|
1378
|
+
"convex/features/bookings"
|
|
1379
|
+
],
|
|
1380
|
+
"npm": [
|
|
1381
|
+
"@calcom/embed-react@^1.5.0"
|
|
1382
|
+
],
|
|
1383
|
+
"shadcn": [
|
|
1384
|
+
"card"
|
|
1385
|
+
],
|
|
1386
|
+
"env": [
|
|
1387
|
+
{
|
|
1388
|
+
"name": "NEXT_PUBLIC_CALCOM_USERNAME",
|
|
1389
|
+
"scope": "next-public",
|
|
1390
|
+
"required": true
|
|
1391
|
+
},
|
|
1392
|
+
{
|
|
1393
|
+
"name": "CALCOM_WEBHOOK_SECRET",
|
|
1394
|
+
"scope": "convex",
|
|
1395
|
+
"required": true
|
|
1396
|
+
}
|
|
1397
|
+
],
|
|
1398
|
+
"peers": [],
|
|
1399
|
+
"providers": [],
|
|
1400
|
+
"tags": [
|
|
1401
|
+
"data",
|
|
1402
|
+
"scheduling",
|
|
1403
|
+
"cal-com",
|
|
1404
|
+
"bookings"
|
|
1405
|
+
],
|
|
1406
|
+
"agentRecipe": ""
|
|
1407
|
+
},
|
|
1408
|
+
{
|
|
1409
|
+
"slug": "broadcast-channel-sync",
|
|
1410
|
+
"title": "BroadcastChannel Sync",
|
|
1411
|
+
"category": "realtime",
|
|
1412
|
+
"version": "0.1.0",
|
|
1413
|
+
"description": "Cross-tab + cross-iframe state sync via BroadcastChannel + localStorage fallback. Tiny, no backend.",
|
|
1414
|
+
"source": "rahmanef63/resource-site",
|
|
1415
|
+
"slicePath": "frontend/slices/broadcast-channel-sync",
|
|
1416
|
+
"convexPaths": [],
|
|
1417
|
+
"npm": [],
|
|
1418
|
+
"shadcn": [],
|
|
1419
|
+
"env": [],
|
|
1420
|
+
"peers": [],
|
|
1421
|
+
"providers": [],
|
|
1422
|
+
"tags": [
|
|
1423
|
+
"realtime",
|
|
1424
|
+
"cross-tab",
|
|
1425
|
+
"broadcast-channel"
|
|
1426
|
+
],
|
|
1427
|
+
"agentRecipe": ""
|
|
1428
|
+
}
|
|
1022
1429
|
]
|
|
1023
1430
|
}
|
package/lib/rr-schema.json
CHANGED
|
@@ -64,6 +64,20 @@
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
},
|
|
67
|
+
"slices": {
|
|
68
|
+
"type": "array",
|
|
69
|
+
"description": "Tier-3 portable slice references — each entry mirrors a slice that has been lifted into this project.",
|
|
70
|
+
"items": {
|
|
71
|
+
"type": "object",
|
|
72
|
+
"required": ["slug"],
|
|
73
|
+
"properties": {
|
|
74
|
+
"slug": { "type": "string" },
|
|
75
|
+
"version": { "type": "string" },
|
|
76
|
+
"category": { "type": "string" },
|
|
77
|
+
"addedAt": { "type": "string", "format": "date" }
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
},
|
|
67
81
|
"skills": {
|
|
68
82
|
"type": "array",
|
|
69
83
|
"items": {
|
package/lib/rr.mjs
CHANGED
|
@@ -36,6 +36,7 @@ export const DEFAULT_RR = {
|
|
|
36
36
|
},
|
|
37
37
|
template: null,
|
|
38
38
|
features: [],
|
|
39
|
+
slices: [],
|
|
39
40
|
skills: [],
|
|
40
41
|
auth: { provider: "convex-auth" },
|
|
41
42
|
convex: { self_hosted: true },
|
|
@@ -91,6 +92,23 @@ export function addFeature(rr, slug, version = "main") {
|
|
|
91
92
|
return rr;
|
|
92
93
|
}
|
|
93
94
|
|
|
95
|
+
export function addSlice(rr, slug, opts = {}) {
|
|
96
|
+
rr.slices = rr.slices ?? [];
|
|
97
|
+
const existing = rr.slices.find((s) => s.slug === slug);
|
|
98
|
+
if (existing) {
|
|
99
|
+
if (opts.version) existing.version = opts.version;
|
|
100
|
+
if (opts.category) existing.category = opts.category;
|
|
101
|
+
return rr;
|
|
102
|
+
}
|
|
103
|
+
rr.slices.push({ slug, version: opts.version ?? "main", category: opts.category, addedAt: today() });
|
|
104
|
+
return rr;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export function removeSlice(rr, slug) {
|
|
108
|
+
rr.slices = (rr.slices ?? []).filter((s) => s.slug !== slug);
|
|
109
|
+
return rr;
|
|
110
|
+
}
|
|
111
|
+
|
|
94
112
|
export function addSkill(rr, slug, source = "anthropics", version = "main") {
|
|
95
113
|
rr.skills = rr.skills ?? [];
|
|
96
114
|
if (rr.skills.find((s) => s.slug === slug && s.source === source)) return rr;
|
|
@@ -125,6 +143,7 @@ export function validateRr(rr) {
|
|
|
125
143
|
issues.push(`layout.kind must be vertical-slice|feature-folders (got ${rr.layout.kind})`);
|
|
126
144
|
}
|
|
127
145
|
if (rr.features && !Array.isArray(rr.features)) issues.push("features must be an array");
|
|
146
|
+
if (rr.slices && !Array.isArray(rr.slices)) issues.push("slices must be an array");
|
|
128
147
|
if (rr.skills && !Array.isArray(rr.skills)) issues.push("skills must be an array");
|
|
129
148
|
return issues;
|
|
130
149
|
}
|