@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.
Files changed (2) hide show
  1. package/dist/index.js +70 -1
  2. 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."));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buiducnhat/agent-skills",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Install AI agent skills and ruler configuration for coding assistants",
5
5
  "type": "module",
6
6
  "bin": {