From d3fae7dfc058bf07a66536d0a8473152747569d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jussi=20M=C3=A4kinen?= Date: Fri, 6 Feb 2026 09:39:50 +0200 Subject: [PATCH] Add codex-global target in skillpack-install.mjs --- shared/scripts/skillpack-install.mjs | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/shared/scripts/skillpack-install.mjs b/shared/scripts/skillpack-install.mjs index e9411aa..210cad0 100644 --- a/shared/scripts/skillpack-install.mjs +++ b/shared/scripts/skillpack-install.mjs @@ -9,9 +9,9 @@ function usage() { " node shared/scripts/skillpack-install.mjs --dest= [options]", "", "Options:", - " --dest= Destination repo root (required, unless using --global)", + " --dest= Destination repo root (required, unless using global targets)", " --from= Source directory (default: dist)", - " --targets= Comma-separated targets: codex, vscode, claude, claude-global, cursor, cursor-global (default: codex,vscode)", + " --targets= Comma-separated targets: codex, codex-global, vscode, claude, claude-global, cursor, cursor-global (default: codex,vscode)", " --skills= Comma-separated skill names to install (default: all)", " --mode= 'replace' (default) or 'merge'", " --global Shorthand for --targets=claude-global (installs to ~/.claude/skills)", @@ -20,6 +20,7 @@ function usage() { "", "Targets:", " codex Install to /.codex/skills/", + " codex-global Install to ~/.codex/skills/ (user-level, ignores --dest)", " vscode Install to /.github/skills/", " claude Install to /.claude/skills/ (project-level)", " claude-global Install to ~/.claude/skills/ (user-level, ignores --dest)", @@ -34,6 +35,9 @@ function usage() { " # Install globally for Claude Code (all skills)", " node shared/scripts/skillpack-install.mjs --global", "", + " # Install globally for Codex CLI (all skills)", + " node shared/scripts/skillpack-install.mjs --targets=codex-global", + "", " # Install globally for Cursor (all skills)", " node shared/scripts/skillpack-install.mjs --targets=cursor-global", "", @@ -133,13 +137,16 @@ function listSkillDirs(skillsRoot) { .filter((d) => fs.existsSync(path.join(d, "SKILL.md"))); } -const VALID_TARGETS = ["codex", "vscode", "claude", "claude-global", "cursor", "cursor-global"]; +const VALID_TARGETS = ["codex", "vscode", "claude", "claude-global", "codex-global", "cursor", "cursor-global"]; // Map target to source subdirectory in dist function getSourceDir(fromDir, target) { - // claude-global uses the same source as claude; cursor-global uses the same as cursor + // *-global targets use the same source as their non-global counterparts const sourceTarget = - target === "claude-global" ? "claude" : target === "cursor-global" ? "cursor" : target; + target === "claude-global" ? "claude" : + target === "codex-global" ? "codex" : + target === "cursor-global" ? "cursor" : + target; const targetDirMap = { codex: path.join(fromDir, "codex", ".codex", "skills"), vscode: path.join(fromDir, "vscode", ".github", "skills"), @@ -151,10 +158,13 @@ function getSourceDir(fromDir, target) { // Map target to destination directory function getDestDir(destRepoRoot, target) { - // claude-global and cursor-global don't need destRepoRoot + // Global targets don't need destRepoRoot if (target === "claude-global") { return path.join(os.homedir(), ".claude", "skills"); } + if (target === "codex-global") { + return path.join(os.homedir(), ".codex", "skills"); + } if (target === "cursor-global") { return path.join(os.homedir(), ".cursor", "skills"); } @@ -213,7 +223,7 @@ function installTarget({ fromDir, destRepoRoot, target, skillsFilter, mode, dryR copyDir({ srcDir: srcSkillDir, destDir: destSkillDir }); } - const isGlobal = target === "claude-global" || target === "cursor-global"; + const isGlobal = target === "claude-global" || target === "codex-global" || target === "cursor-global"; const location = isGlobal ? destSkillsRoot : path.relative(destRepoRoot, destSkillsRoot) || "."; process.stdout.write(`OK: installed ${skillDirs.length} skill(s) to ${location}\n`); } @@ -258,8 +268,8 @@ function main() { assert(VALID_TARGETS.includes(t), `Invalid target: ${t}. Valid targets: ${VALID_TARGETS.join(", ")}`); } - // --dest is required unless only using global targets (claude-global, cursor-global) - const needsDest = targets.some((t) => t !== "claude-global" && t !== "cursor-global"); + // --dest is required unless only using global targets + const needsDest = targets.some((t) => t !== "claude-global" && t !== "codex-global" && t !== "cursor-global"); if (needsDest && !args.dest) { process.stderr.write("Error: --dest is required for non-global targets.\n\n"); usage();