rahman-resources 0.8.0 → 0.9.1

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 CHANGED
@@ -982,6 +982,8 @@ async function runLift(rest) {
982
982
  process.stdout.write(`\n pulling ${kleur.dim(step.from)} ... `);
983
983
  if (parsed.kind === "superspace-local") {
984
984
  copyLocalTree(step.localFromAbs, step.toAbs);
985
+ } else if (parsed.kind === "github") {
986
+ await pullFromRepo(step.githubRepo, step.githubSubPath, "main", step.toAbs);
985
987
  } else {
986
988
  await pull(step.from, step.toAbs);
987
989
  }
@@ -1073,6 +1075,9 @@ async function resolveLiftPlan(parsed, target) {
1073
1075
  from: `${parsed.owner}/${parsed.repo}/${parsed.subPath}`,
1074
1076
  toRel: parsed.subPath,
1075
1077
  toAbs: path.join(target, parsed.subPath),
1078
+ // Mark the full repo so pull dispatcher targets the correct repo, not the kitab.
1079
+ githubRepo: `${parsed.owner}/${parsed.repo}`,
1080
+ githubSubPath: parsed.subPath,
1076
1081
  });
1077
1082
  }
1078
1083
  return { steps, peers, npm, shadcn, env };
@@ -1109,12 +1114,13 @@ async function runPublishSlice(rest) {
1109
1114
  }
1110
1115
  console.log(kleur.bold(`\n→ Validating ${kleur.cyan(abs)}\n`));
1111
1116
 
1112
- // Run the validator script as a subprocess so any user-side override holds.
1117
+ // Run the validator script as a subprocess. Direct binary, no shell — args
1118
+ // pass through Node's argv, no /bin/sh metachar re-parse.
1113
1119
  await new Promise((resolve, reject) => {
1114
1120
  const ps = spawn(
1115
- "node",
1121
+ process.execPath,
1116
1122
  [path.join(__dirname, "../scripts/validate-slice.mjs"), path.join(abs, "slice.json")],
1117
- { stdio: "inherit", shell: true },
1123
+ { stdio: "inherit" },
1118
1124
  );
1119
1125
  ps.on("error", reject);
1120
1126
  ps.on("exit", (code) => (code === 0 ? resolve() : reject(new Error(`validate-slice exited ${code}`))));
@@ -1180,7 +1186,8 @@ async function runPublishSlice(rest) {
1180
1186
 
1181
1187
  async function checkGhInstalled() {
1182
1188
  return new Promise((resolve) => {
1183
- const ps = spawn("gh", ["--version"], { stdio: "ignore", shell: true });
1189
+ // Direct binary no shell. PATH lookup happens in spawn itself.
1190
+ const ps = spawn("gh", ["--version"], { stdio: "ignore" });
1184
1191
  ps.on("error", () => resolve(false));
1185
1192
  ps.on("exit", (code) => resolve(code === 0));
1186
1193
  });
@@ -1193,6 +1200,11 @@ async function pull(repoPath, dest) {
1193
1200
  await emitter.clone(dest);
1194
1201
  }
1195
1202
 
1203
+ async function pullFromRepo(repo, subPath, branch, dest) {
1204
+ const emitter = tiged(`${repo}/${subPath}#${branch}`, { cache: false, force: true, verbose: false });
1205
+ await emitter.clone(dest);
1206
+ }
1207
+
1196
1208
  function detectPM(target) {
1197
1209
  if (existsSync(path.join(target, "pnpm-lock.yaml"))) return "pnpm";
1198
1210
  if (existsSync(path.join(target, "yarn.lock"))) return "yarn";
package/lib/manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 2,
3
- "generatedAt": "2026-05-09T13:46:31.069Z",
3
+ "generatedAt": "2026-05-10T04:09:55.146Z",
4
4
  "repo": "rahmanef63/resource-site",
5
5
  "branch": "main",
6
6
  "layouts": [
@@ -950,33 +950,12 @@
950
950
  }
951
951
  ],
952
952
  "features": [
953
- {
954
- "slug": "ai-sdk-openrouter",
955
- "title": "AI SDK — OpenRouter Router",
956
- "category": "ai",
957
- "description": "Tier-routed LLM calls via OpenRouter. Nano (Haiku/4o-mini) for classification, mid (Sonnet/4o) for drafting, flagship (Opus) for deep reasoning. Cost log + retry baked in.",
958
- "source": "@openrouter/ai-sdk-provider + ai",
959
- "docsUrl": "https://sdk.vercel.ai/docs",
960
- "install": "npm i ai @openrouter/ai-sdk-provider",
961
- "npmPackages": [
962
- "ai",
963
- "@openrouter/ai-sdk-provider"
964
- ],
965
- "exampleCode": "// convex/shared/ai/router.ts\nimport { action } from \"./_generated/server\";\nimport { v } from \"convex/values\";\nimport { generateText } from \"ai\";\nimport { createOpenRouter } from \"@openrouter/ai-sdk-provider\";\n\nconst router = createOpenRouter({ apiKey: process.env.OPENROUTER_API_KEY! });\n\nconst TIER_TO_MODEL = {\n nano: \"anthropic/claude-haiku-4-5\",\n mid: \"anthropic/claude-sonnet-4-6\",\n flagship: \"anthropic/claude-opus-4-7\",\n};\n\nexport const callModel = action({\n args: {\n feature: v.string(),\n prompt: v.string(),\n tier: v.union(v.literal(\"nano\"), v.literal(\"mid\"), v.literal(\"flagship\")),\n },\n handler: async (ctx, { feature, prompt, tier }) => {\n const { text, usage } = await generateText({\n model: router(TIER_TO_MODEL[tier]),\n prompt,\n });\n await ctx.runMutation(internal.ai.logUsage, { feature, tier, usage });\n return text;\n },\n});",
966
- "agentRecipe": "Wrap every AI call through ai-router action. Pick tier based on workload: nano for spam-flag/headline-suggest, mid for chat/draft, flagship for methodology-review. Log token usage to ai_usage table for cost dashboard.",
967
- "tags": [
968
- "ai",
969
- "llm",
970
- "openrouter",
971
- "vercel-ai-sdk"
972
- ]
973
- },
974
953
  {
975
954
  "slug": "convex-auth",
976
955
  "title": "Convex Auth — Email Magic Link",
977
956
  "category": "auth",
978
- "description": "@convex-dev/auth with email magic link only. No Clerk, no NextAuth. Self-hosted Convex friendly. Hard mandate per kitab CLAUDE.md.",
979
- "source": "@convex-dev/auth",
957
+ "description": "@convex-dev/auth with email magic link via Resend. Self-hosted Convex friendly. Hard mandate per kitab CLAUDE.md (no Clerk).",
958
+ "source": "rahmanef63/resource-site",
980
959
  "docsUrl": "https://labs.convex.dev/auth",
981
960
  "install": "npm i @convex-dev/auth @auth/core resend",
982
961
  "npmPackages": [
@@ -984,51 +963,34 @@
984
963
  "@auth/core",
985
964
  "resend"
986
965
  ],
987
- "exampleCode": "// convex/auth.ts\nimport { convexAuth } from \"@convex-dev/auth/server\";\nimport { ResendOTP } from \"./auth/ResendOTP\";\n\nexport const { auth, signIn, signOut, store, isAuthenticated } = convexAuth({\n providers: [ResendOTP],\n});\n\n// app/proxy.ts (Next 16 — NOT middleware.ts)\nimport { convexAuthNextjsMiddleware } from \"@convex-dev/auth/nextjs/server\";\nexport default convexAuthNextjsMiddleware();",
988
- "agentRecipe": "Mount auth in convex/auth.ts. Wire ResendOTP for magic-link delivery. Use convexAuthNextjsMiddleware in app/proxy.ts (Next 16 renamed middleware.ts proxy.ts). Forbid Clerk per CLAUDE.md.",
966
+ "exampleCode": "// convex/auth.ts\nimport { convexAuth } from \"@convex-dev/auth/server\";\nimport Resend from \"@convex-dev/auth/providers/Resend\";\n\nexport const { auth, signIn, signOut, store, isAuthenticated } = convexAuth({\n providers: [Resend({ from: \"auth@yourdomain.com\" })],\n});\n\n// app/proxy.ts (Next 16 — NOT middleware.ts)\nimport { convexAuthNextjsMiddleware } from \"@convex-dev/auth/nextjs/server\";\nexport default convexAuthNextjsMiddleware();",
967
+ "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.",
989
968
  "tags": [
990
969
  "auth",
991
970
  "convex",
992
- "email-magic-link",
971
+ "magic-link",
993
972
  "no-clerk"
994
973
  ]
995
974
  },
996
975
  {
997
- "slug": "broadcast-channel-sync",
998
- "title": "BroadcastChannelCross-iframe Live Sync",
999
- "category": "realtime",
1000
- "description": "Same-origin iframe live sync without backend. Used in T1 split preview tab submit form di Public, action propagates ke Admin secara realtime via window.BroadcastChannel.",
1001
- "source": "Web Platform — BroadcastChannel API",
1002
- "docsUrl": "https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API",
1003
- "install": "// no install — Web Platform API",
1004
- "npmPackages": [],
1005
- "exampleCode": "\"use client\";\nimport * as React from \"react\";\n\nexport function StoreProvider({ children }) {\n const [state, baseDispatch] = React.useReducer(reducer, SEED_STATE);\n const channelRef = React.useRef<BroadcastChannel | null>(null);\n\n React.useEffect(() => {\n const ch = new BroadcastChannel(\"pbos:sync\");\n channelRef.current = ch;\n ch.onmessage = (e) => baseDispatch(e.data);\n return () => ch.close();\n }, []);\n\n const dispatch = React.useCallback((action) => {\n baseDispatch(action);\n channelRef.current?.postMessage(action);\n }, []);\n\n return <Ctx.Provider value={{ state, dispatch }}>{children}</Ctx.Provider>;\n}",
1006
- "agentRecipe": "Use BroadcastChannel only for demo / cross-iframe state mirroring. Production data still goes through Convex realtime. The channel does not echo to the sender so no loop.",
1007
- "tags": [
1008
- "realtime",
1009
- "broadcast-channel",
1010
- "cross-iframe",
1011
- "demo-pattern"
1012
- ]
1013
- },
1014
- {
1015
- "slug": "convex-vector-search",
1016
- "title": "Convex Vector Index — Semantic Search",
1017
- "category": "search",
1018
- "description": "Built-in vector index on any Convex table. Embed via OpenAI text-embedding-3-small (1536-dim), query via vectorIndex().",
1019
- "source": "convex (built-in)",
1020
- "docsUrl": "https://docs.convex.dev/database/vector-search",
1021
- "install": "npm i openai",
976
+ "slug": "midtrans-payment",
977
+ "title": "MidtransIndonesia Payment",
978
+ "category": "payment",
979
+ "description": "Pembayaran lokal Indonesia via Midtrans Snap (BCA, Mandiri, BRI, e-wallet GoPay/OVO/Dana, QRIS). Webhook untuk konfirmasi. Provider-isolated under components/providers/midtrans + actions/midtrans so Doku/Stripe land as siblings.",
980
+ "source": "rahmanef63/resource-site",
981
+ "docsUrl": "https://docs.midtrans.com",
982
+ "install": "npm i midtrans-client",
1022
983
  "npmPackages": [
1023
- "openai"
984
+ "midtrans-client"
1024
985
  ],
1025
- "exampleCode": "// convex/schema.ts\nposts: defineTable({\n title: v.string(),\n body: v.string(),\n embedding: v.array(v.float64()),\n}).vectorIndex(\"by_embedding\", {\n vectorField: \"embedding\",\n dimensions: 1536,\n filterFields: [\"workspaceId\", \"status\"],\n}),\n\n// convex/posts.ts\nexport const search = action({\n args: { query: v.string(), workspaceId: v.id(\"workspaces\") },\n handler: async (ctx, args) => {\n const emb = await embed(args.query);\n return await ctx.vectorSearch(\"posts\", \"by_embedding\", {\n vector: emb,\n limit: 10,\n filter: (q) => q.eq(\"workspaceId\", args.workspaceId),\n });\n },\n});",
1026
- "agentRecipe": "Add embedding field + vectorIndex per searchable table. Re-embed on upsert via Convex action. Cache embeddings don't re-call OpenAI on every read.",
986
+ "exampleCode": "",
987
+ "agentRecipe": "Midtrans Snap untuk pembayaran instant. Webhook ke Convex HTTP action /api/midtrans-callback untuk update order status. Ingat: PPN 11% sudah included di amount, jangan double-count.",
1027
988
  "tags": [
1028
- "search",
1029
- "vector",
1030
- "convex",
1031
- "rag"
989
+ "payment",
990
+ "midtrans",
991
+ "indonesia",
992
+ "qris",
993
+ "snap"
1032
994
  ]
1033
995
  },
1034
996
  {
@@ -1036,7 +998,7 @@
1036
998
  "title": "Resend — Transactional & Newsletter",
1037
999
  "category": "email",
1038
1000
  "description": "Transactional email + newsletter blast via Resend. Double opt-in flow + audience segmentation. Magic-link delivery for Convex Auth.",
1039
- "source": "resend + react-email",
1001
+ "source": "rahmanef63/resource-site",
1040
1002
  "docsUrl": "https://resend.com/docs",
1041
1003
  "install": "npm i resend react-email @react-email/components",
1042
1004
  "npmPackages": [
@@ -1044,41 +1006,62 @@
1044
1006
  "react-email",
1045
1007
  "@react-email/components"
1046
1008
  ],
1047
- "exampleCode": "// convex/shared/email/resend.ts\nimport { Resend } from \"resend\";\nimport { action } from \"../../_generated/server\";\n\nconst resend = new Resend(process.env.RESEND_API_KEY!);\n\nexport const sendNewsletter = action({\n args: { audienceId: v.string(), subject: v.string(), html: v.string() },\n handler: async (_, args) => {\n await resend.broadcasts.create({\n audienceId: args.audienceId,\n from: \"lorem.dev <hi@lorem.dev>\",\n subject: args.subject,\n html: args.html,\n });\n },\n});",
1009
+ "exampleCode": "",
1048
1010
  "agentRecipe": "Use Resend Audiences API for newsletter — store subscriber emails in Convex too for segmentation. Double opt-in: subscriber.create with status 'pending' → click link → status 'confirmed'.",
1049
1011
  "tags": [
1050
1012
  "email",
1051
- "resend",
1052
1013
  "newsletter",
1053
- "transactional"
1014
+ "resend"
1054
1015
  ]
1055
1016
  },
1056
1017
  {
1057
- "slug": "midtrans-payment",
1058
- "title": "Midtrans Indonesia Payment",
1059
- "category": "payment",
1060
- "description": "Pembayaran lokal Indonesia via Midtrans Snap (BCA, Mandiri, BRI, e-wallet GoPay/OVO/Dana, QRIS). Webhook untuk konfirmasi.",
1061
- "source": "midtrans-client",
1062
- "docsUrl": "https://docs.midtrans.com",
1063
- "install": "npm i midtrans-client",
1018
+ "slug": "ai-router",
1019
+ "title": "AI Router (OpenRouter)",
1020
+ "category": "ai",
1021
+ "description": "Tier-routed LLM access via OpenRouter nano (Haiku) for classification, mid (Sonnet) for chat, flagship (Opus) for deep reasoning. Per-call usage log.",
1022
+ "source": "rahmanef63/resource-site",
1023
+ "docsUrl": "https://sdk.vercel.ai/docs",
1024
+ "install": "npm i ai @openrouter/ai-sdk-provider",
1064
1025
  "npmPackages": [
1065
- "midtrans-client"
1026
+ "ai",
1027
+ "@openrouter/ai-sdk-provider"
1066
1028
  ],
1067
- "exampleCode": "// convex/shared/billing/midtrans.ts\nimport midtransClient from \"midtrans-client\";\nimport { action } from \"../../_generated/server\";\n\nconst snap = new midtransClient.Snap({\n isProduction: false,\n serverKey: process.env.MIDTRANS_SERVER_KEY!,\n});\n\nexport const createPayment = action({\n args: { orderId: v.string(), amount: v.number(), customer: v.any() },\n handler: async (_, args) => {\n const tx = await snap.createTransaction({\n transaction_details: { order_id: args.orderId, gross_amount: args.amount },\n customer_details: args.customer,\n });\n return tx.redirect_url;\n },\n});",
1068
- "agentRecipe": "Midtrans Snap untuk pembayaran instant. Webhook ke Convex HTTP action /api/midtrans-callback untuk update order status. Ingat: PPN 11% sudah included di amount, jangan double-count.",
1029
+ "exampleCode": "",
1030
+ "agentRecipe": "Wrap every AI call through ai-router action. Pick tier based on workload: nano for spam-flag/headline-suggest, mid for chat/draft, flagship for methodology-review. Log token usage to ai_usage table for cost dashboard.",
1069
1031
  "tags": [
1070
- "payment",
1071
- "midtrans",
1072
- "indonesia",
1073
- "qris"
1032
+ "ai",
1033
+ "llm",
1034
+ "openrouter",
1035
+ "tier-routing"
1036
+ ]
1037
+ },
1038
+ {
1039
+ "slug": "vector-search",
1040
+ "title": "Convex Vector Search",
1041
+ "category": "search",
1042
+ "description": "Embeddings-based search via Convex's built-in vector index. Embed via OpenAI text-embedding-3-small (1536-dim), query via vectorIndex().",
1043
+ "source": "rahmanef63/resource-site",
1044
+ "docsUrl": "https://docs.convex.dev/database/vector-search",
1045
+ "install": "npm i openai",
1046
+ "npmPackages": [
1047
+ "openai"
1048
+ ],
1049
+ "exampleCode": "",
1050
+ "agentRecipe": "Add embedding field + vectorIndex per searchable table. Re-embed on upsert via Convex action. Cache embeddings — don't re-call OpenAI on every read.",
1051
+ "tags": [
1052
+ "search",
1053
+ "vector",
1054
+ "embeddings",
1055
+ "convex",
1056
+ "rag"
1074
1057
  ]
1075
1058
  },
1076
1059
  {
1077
1060
  "slug": "mdx-blog",
1078
- "title": "MDX Blog Content",
1061
+ "title": "MDX Blog",
1079
1062
  "category": "content",
1080
- "description": "Markdown-with-JSX untuk blog post. Auto-generate ToC, reading-time, syntax highlight, plus embed React components inline.",
1081
- "source": "next-mdx-remote",
1063
+ "description": "Markdown-with-JSX untuk blog post. File-based under content/blog/*.mdx. Auto-generate ToC, reading-time, syntax highlight, plus embed React components inline.",
1064
+ "source": "rahmanef63/resource-site",
1082
1065
  "docsUrl": "https://github.com/hashicorp/next-mdx-remote",
1083
1066
  "install": "npm i next-mdx-remote rehype-pretty-code remark-gfm reading-time",
1084
1067
  "npmPackages": [
@@ -1087,33 +1070,51 @@
1087
1070
  "remark-gfm",
1088
1071
  "reading-time"
1089
1072
  ],
1090
- "exampleCode": "// app/blog/[slug]/page.tsx\nimport { MDXRemote } from \"next-mdx-remote/rsc\";\nimport readingTime from \"reading-time\";\n\nexport default async function Page({ params }) {\n const { slug } = await params;\n const post = await getPost(slug);\n const stats = readingTime(post.body);\n\n return (\n <article>\n <h1>{post.title}</h1>\n <p>{stats.text}</p>\n <MDXRemote\n source={post.body}\n options={{ mdxOptions: { rehypePlugins: [rehypePrettyCode], remarkPlugins: [remarkGfm] } }}\n />\n </article>\n );\n}",
1091
- "agentRecipe": "Store post body sebagai markdown di Convex. Render dengan MDXRemote di [slug]/page.tsx. Auto-extract headings ke ToC via remark plugin custom.",
1073
+ "exampleCode": "",
1074
+ "agentRecipe": "Store post body sebagai markdown di content/blog/*.mdx. Render dengan MDXRemote di [slug]/page.tsx. Auto-extract headings ke ToC via remark plugin custom.",
1092
1075
  "tags": [
1093
- "mdx",
1094
- "markdown",
1076
+ "content",
1095
1077
  "blog",
1096
- "content"
1078
+ "mdx",
1079
+ "static"
1097
1080
  ]
1098
1081
  },
1099
1082
  {
1100
1083
  "slug": "cal-com-booking",
1101
- "title": "Cal.com Booking Embed",
1084
+ "title": "Cal.com Booking",
1102
1085
  "category": "data",
1103
- "description": "Embed Cal.com booking widget di halaman Services. Self-hosted atau cloud. Webhook ke Convex untuk sync booking ke leads table.",
1104
- "source": "@calcom/embed-react",
1086
+ "description": "Embedded Cal.com booking widget + webhook receiver to mirror bookings into Convex.",
1087
+ "source": "rahmanef63/resource-site",
1105
1088
  "docsUrl": "https://cal.com/docs/integrations/web-app/embed",
1106
1089
  "install": "npm i @calcom/embed-react",
1107
1090
  "npmPackages": [
1108
1091
  "@calcom/embed-react"
1109
1092
  ],
1110
- "exampleCode": "\"use client\";\nimport Cal from \"@calcom/embed-react\";\n\nexport function CalEmbed({ eventType }: { eventType: string }) {\n return (\n <Cal\n calLink={`lorem/${eventType}`}\n style={{ width: \"100%\", height: \"600px\", overflow: \"scroll\" }}\n config={{ layout: \"month_view\", theme: \"dark\" }}\n />\n );\n}",
1111
- "agentRecipe": "Embed Cal.com via @calcom/embed-react di halaman services. Configure webhook di Cal.com dashboard → POST ke /api/cal-webhook → create lead di Convex.",
1093
+ "exampleCode": "",
1094
+ "agentRecipe": "Embed Cal.com via @calcom/embed-react di halaman services. Configure webhook di Cal.com dashboard → POST ke /api/cal-webhook → upsert booking di Convex.",
1112
1095
  "tags": [
1113
- "booking",
1114
- "cal-com",
1096
+ "data",
1115
1097
  "scheduling",
1116
- "embed"
1098
+ "cal-com",
1099
+ "bookings"
1100
+ ]
1101
+ },
1102
+ {
1103
+ "slug": "broadcast-channel-sync",
1104
+ "title": "BroadcastChannel — Cross-tab Sync",
1105
+ "category": "realtime",
1106
+ "description": "Same-origin cross-tab + cross-iframe state sync via BroadcastChannel API. Tiny, no backend, no install.",
1107
+ "source": "Web Platform — BroadcastChannel API",
1108
+ "docsUrl": "https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API",
1109
+ "install": "// no install — Web Platform API",
1110
+ "npmPackages": [],
1111
+ "exampleCode": "",
1112
+ "agentRecipe": "Use BroadcastChannel only for demo / cross-iframe state mirroring. Production data still goes through Convex realtime. Use the useBroadcastSync(channelName, initial) hook from @/features/broadcast-channel-sync.",
1113
+ "tags": [
1114
+ "realtime",
1115
+ "cross-tab",
1116
+ "broadcast-channel",
1117
+ "demo-pattern"
1117
1118
  ]
1118
1119
  }
1119
1120
  ],
@@ -1172,10 +1173,10 @@
1172
1173
  },
1173
1174
  {
1174
1175
  "slug": "midtrans-payment",
1175
- "title": "Midtrans Payment",
1176
+ "title": "Midtrans — Indonesia Payment",
1176
1177
  "category": "payment",
1177
1178
  "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
+ "description": "Pembayaran lokal Indonesia via Midtrans Snap (BCA, Mandiri, BRI, e-wallet GoPay/OVO/Dana, QRIS). Webhook untuk konfirmasi. Provider-isolated under components/providers/midtrans + actions/midtrans so Doku/Stripe land as siblings.",
1179
1180
  "source": "rahmanef63/resource-site",
1180
1181
  "slicePath": "frontend/slices/midtrans-payment",
1181
1182
  "convexPaths": [
@@ -1224,14 +1225,14 @@
1224
1225
  "qris",
1225
1226
  "snap"
1226
1227
  ],
1227
- "agentRecipe": ""
1228
+ "agentRecipe": "Midtrans Snap untuk pembayaran instant. Webhook ke Convex HTTP action /api/midtrans-callback untuk update order status. Ingat: PPN 11% sudah included di amount, jangan double-count."
1228
1229
  },
1229
1230
  {
1230
1231
  "slug": "resend-newsletter",
1231
- "title": "Resend Newsletter",
1232
+ "title": "Resend — Transactional & Newsletter",
1232
1233
  "category": "email",
1233
1234
  "version": "0.1.0",
1234
- "description": "Subscribe form + admin send-broadcast pipeline via Resend.",
1235
+ "description": "Transactional email + newsletter blast via Resend. Double opt-in flow + audience segmentation. Magic-link delivery for Convex Auth.",
1235
1236
  "source": "rahmanef63/resource-site",
1236
1237
  "slicePath": "frontend/slices/resend-newsletter",
1237
1238
  "convexPaths": [
@@ -1266,7 +1267,7 @@
1266
1267
  "newsletter",
1267
1268
  "resend"
1268
1269
  ],
1269
- "agentRecipe": ""
1270
+ "agentRecipe": "Use Resend Audiences API for newsletter — store subscriber emails in Convex too for segmentation. Double opt-in: subscriber.create with status 'pending' → click link → status 'confirmed'."
1270
1271
  },
1271
1272
  {
1272
1273
  "slug": "ai-router",
@@ -1301,14 +1302,14 @@
1301
1302
  "openrouter",
1302
1303
  "tier-routing"
1303
1304
  ],
1304
- "agentRecipe": ""
1305
+ "agentRecipe": "Wrap every AI call through ai-router action. Pick tier based on workload: nano for spam-flag/headline-suggest, mid for chat/draft, flagship for methodology-review. Log token usage to ai_usage table for cost dashboard."
1305
1306
  },
1306
1307
  {
1307
1308
  "slug": "vector-search",
1308
1309
  "title": "Convex Vector Search",
1309
1310
  "category": "search",
1310
1311
  "version": "0.1.0",
1311
- "description": "Embeddings-based search via @convex-dev/vector-search. Embed on insert, query by vector similarity.",
1312
+ "description": "Embeddings-based search via Convex's built-in vector index. Embed via OpenAI text-embedding-3-small (1536-dim), query via vectorIndex().",
1312
1313
  "source": "rahmanef63/resource-site",
1313
1314
  "slicePath": "frontend/slices/vector-search",
1314
1315
  "convexPaths": [
@@ -1334,16 +1335,17 @@
1334
1335
  "search",
1335
1336
  "vector",
1336
1337
  "embeddings",
1337
- "convex"
1338
+ "convex",
1339
+ "rag"
1338
1340
  ],
1339
- "agentRecipe": ""
1341
+ "agentRecipe": "Add embedding field + vectorIndex per searchable table. Re-embed on upsert via Convex action. Cache embeddings — don't re-call OpenAI on every read."
1340
1342
  },
1341
1343
  {
1342
1344
  "slug": "mdx-blog",
1343
1345
  "title": "MDX Blog",
1344
1346
  "category": "content",
1345
1347
  "version": "0.1.0",
1346
- "description": "File-based MDX blog under content/blog/*.mdx. List + detail page + RSS feed. No backend.",
1348
+ "description": "Markdown-with-JSX untuk blog post. File-based under content/blog/*.mdx. Auto-generate ToC, reading-time, syntax highlight, plus embed React components inline.",
1347
1349
  "source": "rahmanef63/resource-site",
1348
1350
  "slicePath": "frontend/slices/mdx-blog",
1349
1351
  "convexPaths": [],
@@ -1364,7 +1366,7 @@
1364
1366
  "mdx",
1365
1367
  "static"
1366
1368
  ],
1367
- "agentRecipe": ""
1369
+ "agentRecipe": "Store post body sebagai markdown di content/blog/*.mdx. Render dengan MDXRemote di [slug]/page.tsx. Auto-extract headings ke ToC via remark plugin custom."
1368
1370
  },
1369
1371
  {
1370
1372
  "slug": "cal-com-booking",
@@ -1403,15 +1405,15 @@
1403
1405
  "cal-com",
1404
1406
  "bookings"
1405
1407
  ],
1406
- "agentRecipe": ""
1408
+ "agentRecipe": "Embed Cal.com via @calcom/embed-react di halaman services. Configure webhook di Cal.com dashboard → POST ke /api/cal-webhook → upsert booking di Convex."
1407
1409
  },
1408
1410
  {
1409
1411
  "slug": "broadcast-channel-sync",
1410
- "title": "BroadcastChannel Sync",
1412
+ "title": "BroadcastChannel — Cross-tab Sync",
1411
1413
  "category": "realtime",
1412
1414
  "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
+ "description": "Same-origin cross-tab + cross-iframe state sync via BroadcastChannel API. Tiny, no backend, no install.",
1416
+ "source": "Web Platform — BroadcastChannel API",
1415
1417
  "slicePath": "frontend/slices/broadcast-channel-sync",
1416
1418
  "convexPaths": [],
1417
1419
  "npm": [],
@@ -1422,9 +1424,10 @@
1422
1424
  "tags": [
1423
1425
  "realtime",
1424
1426
  "cross-tab",
1425
- "broadcast-channel"
1427
+ "broadcast-channel",
1428
+ "demo-pattern"
1426
1429
  ],
1427
- "agentRecipe": ""
1430
+ "agentRecipe": "Use BroadcastChannel only for demo / cross-iframe state mirroring. Production data still goes through Convex realtime. Use the useBroadcastSync(channelName, initial) hook from @/features/broadcast-channel-sync."
1428
1431
  }
1429
1432
  ]
1430
1433
  }
package/lib/skills.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "_meta": {
3
- "description": "Claude Skills inventory — 18 entries (sync'd from site/lib/content/claude-skills.ts). Used by CLI add-skill + builder UI + MCP server.",
3
+ "description": "Claude Skills inventory — 19 entries (sync'd from site/lib/content/claude-skills.ts). Used by CLI add-skill + builder UI + MCP server.",
4
4
  "anthropicsRepo": "anthropics/skills",
5
5
  "branch": "main",
6
- "lastSynced": "2026-05-05"
6
+ "lastSynced": "2026-05-09"
7
7
  },
8
8
  "skills": [
9
9
  {
@@ -149,6 +149,14 @@
149
149
  "source": "rahman",
150
150
  "path": "skills/rahman-resources",
151
151
  "description": "Use the Rahman Resources kitab — discover templates, features, recipes; assemble bundles; emit npx commands."
152
+ },
153
+ {
154
+ "slug": "rr",
155
+ "title": "rr — Slice/Template Author",
156
+ "category": "development",
157
+ "source": "rahman",
158
+ "path": ".claude/skills/rr",
159
+ "description": "CRUD slices and templates inside the kitab — scaffold, modify, port from superspace, validate, prep publish. Wires npm run new:slice / modify:slice / new:template plus the npx CLI."
152
160
  }
153
161
  ]
154
162
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rahman-resources",
3
- "version": "0.8.0",
3
+ "version": "0.9.1",
4
4
  "description": "Scaffolder + installer for Rahman Resources kitab — npx rahman-resources init/add/lift/scaffold-slice/publish-slice. Tier-3 portable feature slices + manifest + skills + CRUD workflows.",
5
5
  "type": "module",
6
6
  "license": "MIT",