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 +16 -4
- package/lib/manifest.json +114 -111
- package/lib/skills.json +10 -2
- package/package.json +1 -1
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
|
|
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
|
-
|
|
1121
|
+
process.execPath,
|
|
1116
1122
|
[path.join(__dirname, "../scripts/validate-slice.mjs"), path.join(abs, "slice.json")],
|
|
1117
|
-
{ stdio: "inherit"
|
|
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
|
-
|
|
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-
|
|
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
|
|
979
|
-
"source": "
|
|
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
|
|
988
|
-
"agentRecipe": "
|
|
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
|
-
"
|
|
971
|
+
"magic-link",
|
|
993
972
|
"no-clerk"
|
|
994
973
|
]
|
|
995
974
|
},
|
|
996
975
|
{
|
|
997
|
-
"slug": "
|
|
998
|
-
"title": "
|
|
999
|
-
"category": "
|
|
1000
|
-
"description": "
|
|
1001
|
-
"source": "
|
|
1002
|
-
"docsUrl": "https://
|
|
1003
|
-
"install": "
|
|
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": "Midtrans — Indonesia 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
|
-
"
|
|
984
|
+
"midtrans-client"
|
|
1024
985
|
],
|
|
1025
|
-
"exampleCode": "
|
|
1026
|
-
"agentRecipe": "
|
|
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
|
-
"
|
|
1029
|
-
"
|
|
1030
|
-
"
|
|
1031
|
-
"
|
|
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": "
|
|
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": "
|
|
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
|
-
"
|
|
1014
|
+
"resend"
|
|
1054
1015
|
]
|
|
1055
1016
|
},
|
|
1056
1017
|
{
|
|
1057
|
-
"slug": "
|
|
1058
|
-
"title": "
|
|
1059
|
-
"category": "
|
|
1060
|
-
"description": "
|
|
1061
|
-
"source": "
|
|
1062
|
-
"docsUrl": "https://
|
|
1063
|
-
"install": "npm i
|
|
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
|
-
"
|
|
1026
|
+
"ai",
|
|
1027
|
+
"@openrouter/ai-sdk-provider"
|
|
1066
1028
|
],
|
|
1067
|
-
"exampleCode": "
|
|
1068
|
-
"agentRecipe": "
|
|
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
|
-
"
|
|
1071
|
-
"
|
|
1072
|
-
"
|
|
1073
|
-
"
|
|
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
|
|
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": "
|
|
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": "
|
|
1091
|
-
"agentRecipe": "Store post body sebagai markdown di
|
|
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
|
-
"
|
|
1094
|
-
"markdown",
|
|
1076
|
+
"content",
|
|
1095
1077
|
"blog",
|
|
1096
|
-
"
|
|
1078
|
+
"mdx",
|
|
1079
|
+
"static"
|
|
1097
1080
|
]
|
|
1098
1081
|
},
|
|
1099
1082
|
{
|
|
1100
1083
|
"slug": "cal-com-booking",
|
|
1101
|
-
"title": "Cal.com
|
|
1084
|
+
"title": "Cal.com Booking",
|
|
1102
1085
|
"category": "data",
|
|
1103
|
-
"description": "
|
|
1104
|
-
"source": "
|
|
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": "
|
|
1111
|
-
"agentRecipe": "Embed Cal.com via @calcom/embed-react di halaman services. Configure webhook di Cal.com dashboard → POST ke /api/cal-webhook →
|
|
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
|
-
"
|
|
1114
|
-
"cal-com",
|
|
1096
|
+
"data",
|
|
1115
1097
|
"scheduling",
|
|
1116
|
-
"
|
|
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
|
|
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": "
|
|
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
|
|
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": "
|
|
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": "
|
|
1414
|
-
"source": "
|
|
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 —
|
|
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-
|
|
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.
|
|
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",
|