rahman-resources 0.9.0 → 0.9.2

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-09T14:19:40.545Z",
3
+ "generatedAt": "2026-05-11T06:12:19.160Z",
4
4
  "repo": "rahmanef63/resource-site",
5
5
  "branch": "main",
6
6
  "layouts": [
@@ -931,6 +931,32 @@
931
931
  "design-system"
932
932
  ]
933
933
  },
934
+ {
935
+ "slug": "icon-picker",
936
+ "title": "Notion-Style Icon Picker",
937
+ "description": "Emoji + lucide icon picker with search, 10-color Notion palette, Twemoji/native toggle. One string stores emoji OR lucide:Name OR with ?c=hex tint — backwards-compat with raw-emoji fields.",
938
+ "source": "notion-page-clone",
939
+ "files": [
940
+ "frontend/slices/notion/slices/icon-picker/components/IconPicker.tsx",
941
+ "frontend/slices/notion/slices/icon-picker/components/DynamicIcon.tsx",
942
+ "frontend/slices/notion/slices/icon-picker/lib/parse.ts",
943
+ "frontend/slices/notion/slices/icon-picker/lib/colors.ts",
944
+ "frontend/slices/notion/slices/icon-picker/lib/emoji-catalog.ts",
945
+ "frontend/slices/notion/slices/icon-picker/lib/lucide-catalog.ts",
946
+ "frontend/slices/notion/slices/icon-picker/lib/twemoji.ts",
947
+ "frontend/slices/notion/slices/icon-picker/lib/style-pref.ts"
948
+ ],
949
+ "exampleCode": "import { IconPickerPopover, DynamicIcon } from \"@/frontend/slices/notion/slices/icon-picker\";\n\n<IconPickerPopover value={page.icon} onChange={(v) => updateIcon(v)} onClear={() => updateIcon(\"\")} />\n<DynamicIcon value={page.icon} className=\"text-2xl\" />",
950
+ "agentRecipe": "Single icon field stores emoji or 'lucide:Name' plus optional '?c=hex'. parseIconValue() decodes; lucideValue()/withColor() build. Add 'icon: v.string()' to Convex table — no migration needed for existing emoji fields. Popover variant for inline UI, Inline for sheets/dialogs.",
951
+ "tags": [
952
+ "icon",
953
+ "emoji",
954
+ "lucide",
955
+ "picker",
956
+ "twemoji",
957
+ "notion"
958
+ ]
959
+ },
934
960
  {
935
961
  "slug": "contact-form-resend",
936
962
  "title": "Contact Form + Resend",
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.9.0",
3
+ "version": "0.9.2",
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",