yeknal 1.3.2 → 1.3.3

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/README.md CHANGED
@@ -40,12 +40,14 @@ Behavior:
40
40
  - Uses GitHub API + raw file download by default.
41
41
  - If GitHub API rate limit is hit, it automatically falls back to `git clone` (Git must be installed).
42
42
  - Top-level folders are included only if they contain `SKILL.md`.
43
+ - Installs each synced skill with a `yeknal-` folder prefix, for example `taste-skill` installs as `yeknal-taste-skill`.
44
+ - Only the matching `yeknal-*` managed destination folders are overwritten during sync.
43
45
  - Sync targets (if parent folder exists):
44
46
  - Gemini: `~/.gemini/antigravity` or `~/.antigravity`
45
47
  - Codex: `~/.codex`
46
48
  - Claude: `~/.claude`
47
49
  - For each detected target, creates `<parent>/skills` if missing.
48
- - Overwrites destination skill folders to keep targets in sync.
50
+ - Personal/private skill folders without the `yeknal-` prefix are left untouched.
49
51
 
50
52
  Optional environment variable overrides:
51
53
  - `YEKNAL_GEMINI_PARENT`
package/bin/yeknal.js CHANGED
@@ -27,6 +27,7 @@ const API_BASE = `https://api.github.com/repos/${GITHUB_USERNAME}/${GITHUB_REPO}
27
27
  const GITHUB_TOKEN = process.env.YEKNAL_GITHUB_TOKEN || process.env.GITHUB_TOKEN || "";
28
28
 
29
29
  const EXCLUDED_SKILL_FOLDERS = new Set(["Design", "Security", "Security_Raw", "SEO"]);
30
+ const MANAGED_SKILL_FOLDER_PREFIX = "yeknal-";
30
31
 
31
32
  const SECURITY_REPO_FOLDERS = ["Security", "Security_Raw"];
32
33
 
@@ -163,6 +164,13 @@ function listFilesForFolder(repoTree, folderName) {
163
164
  .sort((a, b) => a.localeCompare(b));
164
165
  }
165
166
 
167
+ function getManagedSkillFolderName(folderName) {
168
+ if (folderName.startsWith(MANAGED_SKILL_FOLDER_PREFIX)) {
169
+ return folderName;
170
+ }
171
+ return `${MANAGED_SKILL_FOLDER_PREFIX}${folderName}`;
172
+ }
173
+
166
174
  function buildRawFileUrl(repoFilePath) {
167
175
  const encodedPath = repoFilePath.split("/").map((part) => encodeURIComponent(part)).join("/");
168
176
  return `${RAW_BASE_URL}/${encodedPath}`;
@@ -393,6 +401,7 @@ async function runSkillsCommand() {
393
401
 
394
402
  console.log(`\nSkill folders to sync (${skillFolders.length}) via ${sourceLabel}:`);
395
403
  console.log(` ${skillFolders.join(", ")}`);
404
+ console.log(`\nInstalled folders use the managed "${MANAGED_SKILL_FOLDER_PREFIX}" prefix.`);
396
405
 
397
406
  let hadFailure = false;
398
407
  for (const target of targets) {
@@ -402,7 +411,7 @@ async function runSkillsCommand() {
402
411
 
403
412
  for (const folder of skillFolders) {
404
413
  const sourceFolder = path.join(tempRoot, folder);
405
- const destinationFolder = path.join(target.skillsPath, folder);
414
+ const destinationFolder = path.join(target.skillsPath, getManagedSkillFolderName(folder));
406
415
  await fsp.rm(destinationFolder, { recursive: true, force: true });
407
416
  await copyDirRecursive(sourceFolder, destinationFolder);
408
417
  copiedCount += 1;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yeknal",
3
- "version": "1.3.2",
3
+ "version": "1.3.3",
4
4
  "description": "CLI to fetch markdown templates and sync AI agent skills",
5
5
  "main": "bin/yeknal.js",
6
6
  "bin": {