skiller 0.7.22 → 0.8.0

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
@@ -37,7 +37,7 @@ npx skiller@latest apply
37
37
  | `agentsmd` | AgentsMd (pseudo) | `AGENTS.md` | - | - |
38
38
  | `copilot` | GitHub Copilot | `AGENTS.md` | `.vscode/mcp.json` (`servers`) | `.claude/skills` |
39
39
  | `claude` | Claude Code | `CLAUDE.md` (`@file` refs) | `.mcp.json` | `.claude/skills` |
40
- | `codex` | OpenAI Codex CLI | `AGENTS.md`, `.codex/config.toml` | `.codex/config.toml` | `.codex/skills` |
40
+ | `codex` | OpenAI Codex CLI | `AGENTS.md`, `.codex/config.toml` | `.codex/config.toml` | `.agents/skills` |
41
41
  | `cursor` | Cursor | `AGENTS.md` | `.cursor/mcp.json` | `.cursor/skills` |
42
42
  | `windsurf` | Windsurf | `AGENTS.md` | `.windsurf/mcp_config.json` | - |
43
43
  | `cline` | Cline | `.clinerules` | - | - |
@@ -143,7 +143,7 @@ class CodexCliAgent {
143
143
  return true;
144
144
  }
145
145
  getSkillsPath(projectRoot) {
146
- return path.join(projectRoot, '.codex/skills');
146
+ return path.join(projectRoot, '.agents/skills');
147
147
  }
148
148
  }
149
149
  exports.CodexCliAgent = CodexCliAgent;
package/dist/cli/index.js CHANGED
File without changes
@@ -792,6 +792,7 @@ async function syncClaudePluginsToSkillsDirs(args) {
792
792
  continue;
793
793
  const desiredPrefix = pluginNamespacePrefixByPluginId.get(item.pluginId) ??
794
794
  sanitizeId(item.pluginId);
795
+ const currentNamespacedBase = `${desiredPrefix}-${item.baseName}`;
795
796
  // Migration: previous versions used `${pluginId}__${name}`, then
796
797
  // `${pluginId}-${name}`. If we changed the namespace prefix (for example
797
798
  // to omit marketplace), don't preserve the old destination so the item
@@ -801,6 +802,13 @@ async function syncClaudePluginsToSkillsDirs(args) {
801
802
  if (prev.startsWith(`${sanitizeId(item.pluginId)}-`) &&
802
803
  desiredPrefix !== sanitizeId(item.pluginId))
803
804
  continue;
805
+ // If the item was previously namespaced only because its base name was
806
+ // unavailable, drop that sticky destination once the base name is free.
807
+ if ((prev === currentNamespacedBase ||
808
+ prev.startsWith(`${currentNamespacedBase}-`)) &&
809
+ !taken.has(item.baseName)) {
810
+ continue;
811
+ }
804
812
  if (taken.has(prev))
805
813
  continue;
806
814
  assignedDestByItemKey.set(item.itemKey, prev);
@@ -49,6 +49,8 @@ const yaml = __importStar(require("js-yaml"));
49
49
  const constants_1 = require("../constants");
50
50
  const SkillsUtils_1 = require("./SkillsUtils");
51
51
  const FrontmatterParser_1 = require("./FrontmatterParser");
52
+ const LEGACY_CODEX_SKILLS_PATH = path.join('.codex', 'skills');
53
+ const UNIVERSAL_AGENTS_SKILLS_PATH = path.join('.agents', 'skills');
52
54
  /**
53
55
  * For non-Claude agents, compile a wrapper SKILL.md (body is a single @reference)
54
56
  * into a standalone SKILL.md with the referenced file's body inlined.
@@ -570,6 +572,45 @@ function getSkillsGitignorePaths(projectRoot, agents) {
570
572
  * This function now only discovers and validates skills.
571
573
  */
572
574
  async function propagateSkills(projectRoot, agents, skillsEnabled, verbose, dryRun, skillerDir) {
575
+ async function migrateLegacyCodexSkillsDir(destinationPaths) {
576
+ const universalSkillsDir = path.join(projectRoot, UNIVERSAL_AGENTS_SKILLS_PATH);
577
+ const legacyCodexSkillsDir = path.join(projectRoot, LEGACY_CODEX_SKILLS_PATH);
578
+ if (!destinationPaths.has(universalSkillsDir))
579
+ return;
580
+ try {
581
+ await fs.access(legacyCodexSkillsDir);
582
+ }
583
+ catch {
584
+ return;
585
+ }
586
+ (0, constants_1.logVerboseInfo)(dryRun
587
+ ? `DRY RUN: Would migrate legacy Codex skills from ${legacyCodexSkillsDir} to ${universalSkillsDir}`
588
+ : `Migrating legacy Codex skills from ${legacyCodexSkillsDir} to ${universalSkillsDir}`, verbose, dryRun);
589
+ if (dryRun)
590
+ return;
591
+ await fs.mkdir(path.dirname(universalSkillsDir), { recursive: true });
592
+ try {
593
+ await fs.access(universalSkillsDir);
594
+ const entries = await fs.readdir(legacyCodexSkillsDir, {
595
+ withFileTypes: true,
596
+ });
597
+ for (const entry of entries) {
598
+ const sourcePath = path.join(legacyCodexSkillsDir, entry.name);
599
+ const targetPath = path.join(universalSkillsDir, entry.name);
600
+ try {
601
+ await fs.access(targetPath);
602
+ await fs.rm(sourcePath, { recursive: true, force: true });
603
+ }
604
+ catch {
605
+ await fs.rename(sourcePath, targetPath);
606
+ }
607
+ }
608
+ await fs.rmdir(legacyCodexSkillsDir).catch(() => undefined);
609
+ }
610
+ catch {
611
+ await fs.rename(legacyCodexSkillsDir, universalSkillsDir);
612
+ }
613
+ }
573
614
  if (!skillsEnabled) {
574
615
  (0, constants_1.logVerboseInfo)('Skills support disabled', verbose, dryRun);
575
616
  return;
@@ -589,6 +630,7 @@ async function propagateSkills(projectRoot, agents, skillsEnabled, verbose, dryR
589
630
  }
590
631
  }
591
632
  }
633
+ await migrateLegacyCodexSkillsDir(destinationPaths);
592
634
  // Check if skills directory exists
593
635
  let skillsDirExists = true;
594
636
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skiller",
3
- "version": "0.7.22",
3
+ "version": "0.8.0",
4
4
  "description": "Skiller — apply the same rules to all coding agents",
5
5
  "main": "dist/lib.js",
6
6
  "publishConfig": {