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` | `.
|
|
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` | - | - |
|
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 {
|