@buiducnhat/agent-skills 0.2.0 → 0.2.1
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/dist/index.js +70 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -8,7 +8,7 @@ import * as g from "node:readline";
|
|
|
8
8
|
import O from "node:readline";
|
|
9
9
|
import { Writable } from "node:stream";
|
|
10
10
|
import { execSync } from "node:child_process";
|
|
11
|
-
import { tmpdir } from "node:os";
|
|
11
|
+
import os, { tmpdir } from "node:os";
|
|
12
12
|
|
|
13
13
|
//#region \0rolldown/runtime.js
|
|
14
14
|
var __create = Object.create;
|
|
@@ -1589,6 +1589,73 @@ function copyDirectory(src, dest) {
|
|
|
1589
1589
|
else fs.copyFileSync(srcPath, destPath);
|
|
1590
1590
|
}
|
|
1591
1591
|
}
|
|
1592
|
+
function getAgentOutputSkillsDir(projectDir, agent) {
|
|
1593
|
+
return path.join(projectDir, `.${agent}`, "skills");
|
|
1594
|
+
}
|
|
1595
|
+
function preserveCustomSkills(tempDir, projectDir, agents) {
|
|
1596
|
+
const templateSkills = new Set(getTemplateSkillNames(tempDir));
|
|
1597
|
+
const manifestSkills = new Set(readManifest(projectDir)?.skills ?? []);
|
|
1598
|
+
const backupDir = fs.mkdtempSync(path.join(os.tmpdir(), "agent-skills-custom-skills-"));
|
|
1599
|
+
const entries = [];
|
|
1600
|
+
for (const agent of agents) {
|
|
1601
|
+
const skillsDir = getAgentOutputSkillsDir(projectDir, agent);
|
|
1602
|
+
if (!fs.existsSync(skillsDir)) continue;
|
|
1603
|
+
const customSkills = fs.readdirSync(skillsDir, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name).filter((skill) => !templateSkills.has(skill) && !manifestSkills.has(skill));
|
|
1604
|
+
for (const skill of customSkills) {
|
|
1605
|
+
const srcSkillDir = path.join(skillsDir, skill);
|
|
1606
|
+
const destSkillDir = path.join(backupDir, agent, skill);
|
|
1607
|
+
try {
|
|
1608
|
+
copyDirectory(srcSkillDir, destSkillDir);
|
|
1609
|
+
entries.push({
|
|
1610
|
+
agent,
|
|
1611
|
+
skill
|
|
1612
|
+
});
|
|
1613
|
+
} catch (err) {
|
|
1614
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
1615
|
+
M.warn(`Failed to back up custom skill "${skill}" for agent "${agent}": ${message}`);
|
|
1616
|
+
}
|
|
1617
|
+
}
|
|
1618
|
+
}
|
|
1619
|
+
if (entries.length === 0) {
|
|
1620
|
+
fs.rmSync(backupDir, {
|
|
1621
|
+
recursive: true,
|
|
1622
|
+
force: true
|
|
1623
|
+
});
|
|
1624
|
+
return null;
|
|
1625
|
+
}
|
|
1626
|
+
M.info(`Backed up ${entries.length} custom skill(s) from agent output directories`);
|
|
1627
|
+
return {
|
|
1628
|
+
backupDir,
|
|
1629
|
+
entries
|
|
1630
|
+
};
|
|
1631
|
+
}
|
|
1632
|
+
function restoreCustomSkills(preserved, projectDir) {
|
|
1633
|
+
if (!preserved) return;
|
|
1634
|
+
let restored = 0;
|
|
1635
|
+
for (const entry of preserved.entries) {
|
|
1636
|
+
const destSkillsDir = getAgentOutputSkillsDir(projectDir, entry.agent);
|
|
1637
|
+
const srcSkillDir = path.join(preserved.backupDir, entry.agent, entry.skill);
|
|
1638
|
+
const destSkillDir = path.join(destSkillsDir, entry.skill);
|
|
1639
|
+
try {
|
|
1640
|
+
if (!fs.existsSync(srcSkillDir)) continue;
|
|
1641
|
+
fs.mkdirSync(destSkillsDir, { recursive: true });
|
|
1642
|
+
fs.rmSync(destSkillDir, {
|
|
1643
|
+
recursive: true,
|
|
1644
|
+
force: true
|
|
1645
|
+
});
|
|
1646
|
+
copyDirectory(srcSkillDir, destSkillDir);
|
|
1647
|
+
restored++;
|
|
1648
|
+
} catch (err) {
|
|
1649
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
1650
|
+
M.warn(`Failed to restore custom skill "${entry.skill}" for agent "${entry.agent}": ${message}`);
|
|
1651
|
+
}
|
|
1652
|
+
}
|
|
1653
|
+
fs.rmSync(preserved.backupDir, {
|
|
1654
|
+
recursive: true,
|
|
1655
|
+
force: true
|
|
1656
|
+
});
|
|
1657
|
+
M.info(`Restored ${restored}/${preserved.entries.length} custom skill(s) to agent output directories`);
|
|
1658
|
+
}
|
|
1592
1659
|
function copyDirectoryExcluding(src, dest, excludeNames) {
|
|
1593
1660
|
fs.mkdirSync(dest, { recursive: true });
|
|
1594
1661
|
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
@@ -1794,7 +1861,9 @@ async function main() {
|
|
|
1794
1861
|
tempDir = await fetchTemplates();
|
|
1795
1862
|
await copyTemplates(tempDir, cwd, action);
|
|
1796
1863
|
configureRulerToml(cwd, selectedAgents);
|
|
1864
|
+
const preserved = preserveCustomSkills(tempDir, cwd, selectedAgents);
|
|
1797
1865
|
await runRulerApply(cwd, selectedAgents);
|
|
1866
|
+
restoreCustomSkills(preserved, cwd);
|
|
1798
1867
|
ensureRulerScripts(tempDir, cwd);
|
|
1799
1868
|
printSummary(selectedAgents, cwd);
|
|
1800
1869
|
Se(import_picocolors.default.green("Done! Your AI agent skills are ready."));
|