agent-skill-manager 1.19.0 → 1.21.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.
@@ -1,3 +1,3 @@
1
- import{createRequire as k}from"node:module";var S=Object.create;var{getPrototypeOf:U,defineProperty:K,getOwnPropertyNames:j}=Object;var E=Object.prototype.hasOwnProperty;var F=(x,$,b)=>{b=x!=null?S(U(x)):{};let q=$||!x||!x.__esModule?K(b,"default",{value:x,enumerable:!0}):b;for(let V of j(x))if(!E.call(q,V))K(q,V,{get:()=>x[V],enumerable:!0});return q};var h=(x,$)=>()=>($||x(($={exports:{}}).exports,$),$.exports);var I=k(import.meta.url);import{readFile as W,writeFile as v,mkdir as R,copyFile as A}from"fs/promises";import{join as B,resolve as Z,dirname as s}from"path";import{fileURLToPath as H}from"url";import{homedir as G}from"os";var L=!1,M=0;function T(x){if(L=x,x)M=performance.now()}function z(x){if(!L)return;let $=Math.round(performance.now()-M),q=globalThis.__CLI_NO_COLOR?`[verbose] +${$}ms`:`\x1B[2m[verbose] +${$}ms\x1B[0m`;console.error(`${q} ${x}`)}var D=H(import.meta.url),X=s(D),w=G(),J=B(w,".config","agent-skill-manager"),y=B(J,"config.json"),O=B(J,".skill-lock.json"),m=B(J,"skill-index"),N=[{name:"claude",label:"Claude Code",global:"~/.claude/skills",project:".claude/skills",enabled:!0},{name:"agents",label:"Agents",global:"~/.agents/skills",project:".agents/skills",enabled:!0},{name:"codex",label:"Codex",global:"~/.codex/skills",project:".codex/skills",enabled:!0},{name:"opencode",label:"OpenCode",global:"~/.config/opencode/skills",project:".opencode/skills",enabled:!0},{name:"openclaw",label:"OpenClaw",global:"~/.openclaw/skills",project:".openclaw/skills",enabled:!0},{name:"cursor",label:"Cursor",global:"~/.cursor/rules",project:".cursor/rules",enabled:!0},{name:"copilot",label:"GitHub Copilot",global:"~/.github/instructions",project:".github/instructions",enabled:!0},{name:"windsurf",label:"Windsurf",global:"~/.windsurf/rules",project:".windsurf/rules",enabled:!0},{name:"antigravity",label:"Google Antigravity",global:"~/.antigravity/skills",project:".antigravity/skills",enabled:!0},{name:"gemini",label:"Gemini CLI",global:"~/.gemini/skills",project:".gemini/skills",enabled:!0},{name:"cline",label:"Cline",global:"~/Documents/Cline/Rules",project:".clinerules",enabled:!0},{name:"roocode",label:"Roo Code",global:"~/.roo/rules",project:".roo/rules",enabled:!0},{name:"continue",label:"Continue",global:"~/.continue/rules",project:".continue/rules",enabled:!0},{name:"aider",label:"Aider",global:"~/.aider/skills",project:".aider/skills",enabled:!0},{name:"zed",label:"Zed",global:"~/.config/zed/prompt_overrides",project:".zed/rules",enabled:!0},{name:"augment",label:"Augment",global:"~/.augment/rules",project:".augment/rules",enabled:!0},{name:"amp",label:"Amp",global:"~/.amp/skills",project:".amp/skills",enabled:!0}];function Q(){return{version:1,providers:N.map((x)=>({...x})),customPaths:[],preferences:{defaultScope:"both",defaultSort:"name"}}}function t(){return y}function f(){return O}function g(){return m}function i(){return Z(X,"..","data","skill-index")}function _(){return Z(X,"..","data","skill-index-resources.json")}async function a(){let x=_(),$=await W(x,"utf-8");return JSON.parse($)}function e(x){if(x.startsWith("~/"))return B(w,x.slice(2));if(x.startsWith("/"))return x;return Z(x)}function u(x){let $=Q(),b=x.providers||[],q=new Set(b.map((V)=>V.name));for(let V of $.providers)if(!q.has(V.name))b.push({...V});return{version:x.version??$.version,providers:b,customPaths:x.customPaths??[],preferences:{defaultScope:x.preferences?.defaultScope??$.preferences.defaultScope,defaultSort:x.preferences?.defaultSort??$.preferences.defaultSort,selectedTools:x.preferences?.selectedTools}}}async function C(){z(`config: checking ${y}`);let x;try{x=await W(y,"utf-8")}catch($){if($?.code==="ENOENT"){z("config: using defaults (file not found)");let b=Q();return await Y(b),b}throw $}try{let $=JSON.parse(x);return z(`config: loaded from ${y}`),u($)}catch{let $=y+".bak";z(`config: parse error, backing up to ${$}`),await A(y,$),console.error(`Warning: Config file was corrupted. Backup saved to ${$}. Using defaults.`);let b=Q();return await Y(b),b}}async function Y(x){await R(J,{recursive:!0}),await v(y,JSON.stringify(x,null,2)+`
1
+ import{createRequire as k}from"node:module";var S=Object.create;var{getPrototypeOf:U,defineProperty:K,getOwnPropertyNames:j}=Object;var E=Object.prototype.hasOwnProperty;var F=(x,$,b)=>{b=x!=null?S(U(x)):{};let q=$||!x||!x.__esModule?K(b,"default",{value:x,enumerable:!0}):b;for(let V of j(x))if(!E.call(q,V))K(q,V,{get:()=>x[V],enumerable:!0});return q};var h=(x,$)=>()=>($||x(($={exports:{}}).exports,$),$.exports);var I=k(import.meta.url);import{readFile as W,writeFile as v,mkdir as R,copyFile as A}from"fs/promises";import{join as B,resolve as Z,dirname as s}from"path";import{fileURLToPath as H}from"url";import{homedir as G}from"os";var L=!1,M=0;function T(x){if(L=x,x)M=performance.now()}function z(x){if(!L)return;let $=Math.round(performance.now()-M),q=globalThis.__CLI_NO_COLOR?`[verbose] +${$}ms`:`\x1B[2m[verbose] +${$}ms\x1B[0m`;console.error(`${q} ${x}`)}var D=H(import.meta.url),X=s(D),w=G(),J=B(w,".config","agent-skill-manager"),y=B(J,"config.json"),O=B(J,".skill-lock.json"),m=B(J,"skill-index"),N=[{name:"claude",label:"Claude Code",global:"~/.claude/skills",project:".claude/skills",enabled:!0},{name:"agents",label:"Agents",global:"~/.agents/skills",project:".agents/skills",enabled:!0},{name:"codex",label:"Codex",global:"~/.codex/skills",project:".codex/skills",enabled:!0},{name:"opencode",label:"OpenCode",global:"~/.config/opencode/skills",project:".opencode/skills",enabled:!0},{name:"openclaw",label:"OpenClaw",global:"~/.openclaw/skills",project:".openclaw/skills",enabled:!0},{name:"cursor",label:"Cursor",global:"~/.cursor/rules",project:".cursor/rules",enabled:!0},{name:"copilot",label:"GitHub Copilot",global:"~/.github/instructions",project:".github/instructions",enabled:!0},{name:"windsurf",label:"Windsurf",global:"~/.windsurf/rules",project:".windsurf/rules",enabled:!0},{name:"antigravity",label:"Google Antigravity",global:"~/.antigravity/skills",project:".antigravity/skills",enabled:!0},{name:"gemini",label:"Gemini CLI",global:"~/.gemini/skills",project:".gemini/skills",enabled:!0},{name:"hermes",label:"Hermes",global:"~/.hermes/skills",project:".hermes/skills",enabled:!0},{name:"cline",label:"Cline",global:"~/Documents/Cline/Rules",project:".clinerules",enabled:!0},{name:"roocode",label:"Roo Code",global:"~/.roo/rules",project:".roo/rules",enabled:!0},{name:"continue",label:"Continue",global:"~/.continue/rules",project:".continue/rules",enabled:!0},{name:"aider",label:"Aider",global:"~/.aider/skills",project:".aider/skills",enabled:!0},{name:"zed",label:"Zed",global:"~/.config/zed/prompt_overrides",project:".zed/rules",enabled:!0},{name:"augment",label:"Augment",global:"~/.augment/rules",project:".augment/rules",enabled:!0},{name:"amp",label:"Amp",global:"~/.amp/skills",project:".amp/skills",enabled:!0}];function Q(){return{version:1,providers:N.map((x)=>({...x})),customPaths:[],preferences:{defaultScope:"both",defaultSort:"name"}}}function t(){return y}function f(){return O}function g(){return m}function i(){return Z(X,"..","data","skill-index")}function _(){return Z(X,"..","data","skill-index-resources.json")}async function a(){let x=_(),$=await W(x,"utf-8");return JSON.parse($)}function e(x){if(x.startsWith("~/"))return B(w,x.slice(2));if(x.startsWith("/"))return x;return Z(x)}function u(x){let $=Q(),b=x.providers||[],q=new Set(b.map((V)=>V.name));for(let V of $.providers)if(!q.has(V.name))b.push({...V});return{version:x.version??$.version,providers:b,customPaths:x.customPaths??[],preferences:{defaultScope:x.preferences?.defaultScope??$.preferences.defaultScope,defaultSort:x.preferences?.defaultSort??$.preferences.defaultSort,selectedTools:x.preferences?.selectedTools}}}async function C(){z(`config: checking ${y}`);let x;try{x=await W(y,"utf-8")}catch($){if($?.code==="ENOENT"){z("config: using defaults (file not found)");let b=Q();return await Y(b),b}throw $}try{let $=JSON.parse(x);return z(`config: loaded from ${y}`),u($)}catch{let $=y+".bak";z(`config: parse error, backing up to ${$}`),await A(y,$),console.error(`Warning: Config file was corrupted. Backup saved to ${$}. Using defaults.`);let b=Q();return await Y(b),b}}async function Y(x){await R(J,{recursive:!0}),await v(y,JSON.stringify(x,null,2)+`
2
2
  `,"utf-8")}async function xx(x){let $=await C();$.preferences.selectedTools=x,await Y($)}export{xx as saveSelectedTools,Y as saveConfig,e as resolveProviderPath,a as loadSkillIndexResources,C as loadConfig,_ as getSkillIndexResourcesPath,f as getLockPath,g as getIndexDir,Q as getDefaultConfig,t as getConfigPath,i as getBundledIndexDir};
3
- export{F as J,h as K,I as L,T as M,z as N,Q as O,t as P,f as Q,g as R,i as S,e as T,C as U,Y as V};
3
+ export{F as K,h as L,I as M,T as N,z as O,Q as P,t as Q,f as R,g as S,i as T,e as U,C as V,Y as W};
@@ -0,0 +1,15 @@
1
+ import{O as T,U as D}from"./chunk-a26gjzjk.js";import{readdir as M,stat as W,lstat as zz,readlink as Fz,readFile as f,realpath as t}from"fs/promises";import{join as E,resolve as a,basename as Iz}from"path";import{homedir as g}from"os";function d(z){let Y={},$=z.split(`
2
+ `),Z=!1,J=!1,X=null,L=[],H="none",Q=-1,U=null;function G(){if(X){let O=L.join(" ").trim();if(O)Y[X]=O;X=null,L=[],H="none",Q=-1}}for(let O of $){if(O.trim()==="---")if(!J){J=!0,Z=!0;continue}else{G();break}if(!Z)continue;if(H!=="none"&&X){let A=O.replace(/^\s*/,""),I=O.length-A.length;if(I>0&&A.length>0){if(Q===-1)Q=I;L.push(A);continue}else if(A.length===0)continue;else G()}if(U!==null){let A=O.match(/^\s+(\w[\w-]*):\s*(.*?)\s*$/);if(A){let I=A[1],_=A[2].replace(/^["']|["']$/g,"");if(_)Y[`${U}.${I}`]=_;continue}if(O.trim().length>0)U=null;else continue}let j=O.match(/^(\w[\w-]*):\s*(.*?)\s*$/);if(j){G();let A=j[1],I=j[2];if(I==="|"||I===">")X=A,L=[],H=I==="|"?"literal":"folded";else if(I==="|+"||I===">+"||I==="|-"||I===">-")X=A,L=[],H=I.startsWith("|")?"literal":"folded";else{let F=I.replace(/^["']|["']$/g,"");if(F)Y[A]=F;else U=A}}}return G(),Y}function n(z){return z["metadata.version"]||z.version||"0.0.0"}function o(z){let Y=z["allowed-tools"]||"";if(!Y.trim())return[];return Y.split(/[\s,]+/).map(($)=>$.trim()).filter(Boolean)}var _z=E(g(),".claude","plugins","marketplaces"),qz=E(g(),".codex","plugins","cache"),Tz=E(g(),".codex","config.toml"),JY=E(g(),".agents","plugins","marketplace.json");function Ez(z,Y){let $=[];for(let Z of z.providers){if(!Z.enabled){T(`scan: skipping disabled provider "${Z.name}"`);continue}if(Y==="global"||Y==="both"){let J=D(Z.global);T(`scan: adding location ${J} (${Z.label}, global)`),$.push({dir:J,location:`global-${Z.name}`,scope:"global",providerName:Z.name,providerLabel:Z.label})}if(Y==="project"||Y==="both"){let J=D(Z.project);T(`scan: adding location ${J} (${Z.label}, project)`),$.push({dir:J,location:`project-${Z.name}`,scope:"project",providerName:Z.name,providerLabel:Z.label})}}for(let Z of z.customPaths)if(Y===Z.scope||Y==="both"){let J=D(Z.path);T(`scan: adding custom location ${J} (${Z.label}, ${Z.scope})`),$.push({dir:J,location:`${Z.scope}-custom`,scope:Z.scope,providerName:"custom",providerLabel:Z.label})}return $}async function i(z){try{return(await M(z,{recursive:!0})).length}catch{return 0}}async function Nz(z){let Y=[];T(`scanning: ${z.dir} (${z.location})`);let $;try{$=await M(z.dir)}catch{return T(`scanning: ${z.dir} — not found, skipping`),Y}for(let Z of $){let J=E(z.dir,Z);try{if(!(await W(J)).isDirectory()){T(` skip: "${Z}" — not a directory`);continue}}catch{T(` skip: "${Z}" — stat failed`);continue}let X=E(J,"SKILL.md"),L;try{L=await f(X,"utf-8")}catch{T(` skip: "${Z}" — no SKILL.md`);continue}let H=d(L),Q=!1,U=null;try{if((await zz(J)).isSymbolicLink())Q=!0,U=await Fz(J)}catch{}let G=a(J),O;try{O=await t(J)}catch{O=G}Y.push({name:H.name||Z,version:n(H),description:(H.description||"").replace(/\s*\n\s*/g," ").trim(),creator:H["metadata.creator"]||"",license:(H.license||"").trim(),compatibility:(H.compatibility||"").trim(),allowedTools:o(H),effort:H.effort||H["metadata.effort"]||void 0,dirName:Z,path:G,originalPath:J,location:z.location,scope:z.scope,provider:z.providerName,providerLabel:z.providerLabel,isSymlink:Q,symlinkTarget:U,realPath:O})}return T(`found ${Y.length} skill(s) in ${z.dir}`),Y}async function Yz(z){let Y=[],$;try{$=await M(z)}catch{return Y}for(let Z of $){let J=E(z,Z),X;try{X=await zz(J)}catch{continue}if(X.isSymbolicLink())continue;if(X.isDirectory()){let L=E(J,"SKILL.md");try{await W(L),Y.push(J)}catch{let H=await Yz(J);Y.push(...H)}}}return Y}async function Rz(z){let Y=z??_z,$=[];T(`scan: checking plugin marketplaces at ${Y}`);let Z;try{Z=await M(Y)}catch{return T("scan: plugin marketplaces dir not found, skipping"),$}for(let J of Z){let X=E(Y,J),L;try{L=await W(X)}catch{continue}if(!L.isDirectory())continue;T(`scan: scanning marketplace "${J}"`);let H=await Yz(X);for(let Q of H){let U=E(Q,"SKILL.md"),G;try{G=await f(U,"utf-8")}catch{continue}let O=d(G),j=Iz(Q),A=a(Q),I;try{I=await t(Q)}catch{I=A}$.push({name:O.name||j,version:n(O),description:(O.description||"").replace(/\s*\n\s*/g," ").trim(),creator:O["metadata.creator"]||"",license:(O.license||"").trim(),compatibility:(O.compatibility||"").trim(),allowedTools:o(O),effort:O.effort||O["metadata.effort"]||void 0,dirName:j,path:A,originalPath:Q,location:`global-plugin-${J}`,scope:"global",provider:"plugin",providerLabel:`Plugin (${J})`,isSymlink:!1,symlinkTarget:null,realPath:I,marketplace:J})}}return T(`scan: found ${$.length} plugin marketplace skill(s)`),$}function Mz(z){let Y=new Map,$=null;for(let Z of z.split(`
3
+ `)){let J=Z.trim(),X=J.match(/^\[plugins\.([^\]]+)\]$/);if(X){$=X[1].trim().replace(/^["']|["']$/g,"");continue}if(J.startsWith("[")){$=null;continue}if($&&J.startsWith("enabled")){let L=J.match(/^enabled\s*=\s*(true|false)/i);if(L)Y.set($,L[1].toLowerCase()==="true")}}return Y}async function Sz(z){let Y=z??Tz;try{let $=await f(Y,"utf-8");return Mz($)}catch{return T(`codex: config.toml not found at ${Y}, skipping enabled check`),new Map}}async function xz(z,Y){let $=z??qz,Z=[];T(`codex: checking plugin cache at ${$}`);let J;try{J=await M($)}catch{return T("codex: plugin cache dir not found, skipping"),Z}let X=await Sz(Y);for(let L of J){let H=E($,L),Q;try{Q=await W(H)}catch{continue}if(!Q.isDirectory())continue;let U;try{U=await M(H)}catch{continue}for(let G of U){let O=E(H,G),j;try{j=await W(O)}catch{continue}if(!j.isDirectory())continue;let A;try{A=await M(O)}catch{continue}let I=(await Promise.all(A.map(async(R)=>{try{return(await W(E(O,R))).isDirectory()?R:null}catch{return null}}))).filter((R)=>R!==null);if(I.length===0)continue;let F=I.sort(Zz).at(-1),_=E(O,F),S=E(_,".codex-plugin","plugin.json"),N;try{let R=await f(S,"utf-8");N=JSON.parse(R)}catch{T(`codex: no valid plugin.json at ${S}, skipping`);continue}let x=a(_),V;try{V=await t(_)}catch{V=x}let q=N.interface?.displayName||N.name||G,y=N.version||F,P=(N.description||"").replace(/\s*\n\s*/g," ").trim(),v=X.has(G)?X.get(G):!0;Z.push({name:q,version:y,description:P,creator:"",license:"",compatibility:"",allowedTools:[],dirName:G,path:x,originalPath:_,location:`global-codex-plugin-${L}`,scope:"global",provider:"codex-plugin",providerLabel:`Codex Plugin (${L})`,isSymlink:!1,symlinkTarget:null,realPath:V,marketplace:L,codexPlugin:{category:N.interface?.category,hasMcpConfig:N.mcp!=null&&Object.keys(N.mcp).length>0,pluginName:G,pluginVersion:F,enabled:v}})}}return T(`codex: found ${Z.length} plugin(s) in cache`),Z}async function XY(z,Y,$,Z){let J=Ez(z,Y),X=Y==="global"||Y==="both",[L,H,Q]=await Promise.all([Promise.all(J.map(Nz)),X?Rz($):Promise.resolve([]),X?xz(Z):Promise.resolve([])]),U=L.flat(),G=new Set(U.map((j)=>j.realPath)),O=new Set(U.map((j)=>j.name.toLowerCase()));for(let j of H)if(!G.has(j.realPath)&&!O.has(j.name.toLowerCase()))U.push(j),G.add(j.realPath),O.add(j.name.toLowerCase());for(let j of Q)if(!G.has(j.realPath)&&!O.has(j.name.toLowerCase()))U.push(j),G.add(j.realPath),O.add(j.name.toLowerCase());return U}function QY(z,Y){if(!Y.trim())return z;let $=Y.toLowerCase();return z.filter((Z)=>Z.name.toLowerCase().includes($)||Z.description.toLowerCase().includes($)||Z.creator.toLowerCase().includes($)||Z.effort&&Z.effort.toLowerCase().includes($)||Z.location.toLowerCase().includes($)||Z.providerLabel.toLowerCase().includes($))}function Zz(z,Y){let $=z.split("."),Z=Y.split("."),J=Math.max($.length,Z.length);for(let X=0;X<J;X++){let L=parseInt($[X]??"0",10),H=parseInt(Z[X]??"0",10);if(isNaN(L)||isNaN(H))return z.localeCompare(Y);if(L!==H)return L-H}return 0}function UY(z,Y){let $=[...z];switch(Y){case"name":$.sort((Z,J)=>Z.name.localeCompare(J.name));break;case"version":$.sort((Z,J)=>Zz(Z.version,J.version));break;case"location":$.sort((Z,J)=>Z.location.localeCompare(J.location));break}return $}import{rm as r,readFile as Jz,writeFile as Dz,access as Wz,lstat as wz,symlink as Cz}from"fs/promises";import{join as $z,resolve as w,dirname as Xz,relative as yz}from"path";import{homedir as Pz}from"os";var vz=Pz();function bz(z,Y){let $={directories:[],ruleFiles:[],agentsBlocks:[]};$.directories.push({path:z.originalPath,isSymlink:z.isSymlink});let Z=z.dirName;if(z.scope==="project")$.ruleFiles.push(w(".cursor","rules",`${Z}.mdc`),w(".windsurf","rules",`${Z}.md`),w(".github","instructions",`${Z}.instructions.md`)),$.agentsBlocks.push({file:w("AGENTS.md"),skillName:Z});if(z.scope==="global"){for(let L of Y.providers){if(!L.enabled)continue;let H=D(L.global),Q=$z(Xz(H),"AGENTS.md");$.agentsBlocks.push({file:Q,skillName:Z})}let J=$z(vz,".codex","AGENTS.md");if(!$.agentsBlocks.some((L)=>L.file===J))$.agentsBlocks.push({file:J,skillName:Z})}return $}function jY(z,Y,$){let Z=Y.filter((Q)=>Q.dirName===z);if(Z.length===0)return{directories:[],ruleFiles:[],agentsBlocks:[]};let J={directories:[],ruleFiles:[],agentsBlocks:[]},X=new Set,L=new Set,H=new Set;for(let Q of Z){let U=bz(Q,$);for(let G of U.directories)if(!X.has(G.path))X.add(G.path),J.directories.push(G);for(let G of U.ruleFiles)if(!L.has(G))L.add(G),J.ruleFiles.push(G);for(let G of U.agentsBlocks){let O=`${G.file}::${G.skillName}`;if(!H.has(O))H.add(O),J.agentsBlocks.push(G)}}return J}async function b(z){try{return await Wz(z),!0}catch{return!1}}async function hz(z,Y){if(!await b(z))return;let $=await Jz(z,"utf-8");for(let Z of["agent-skill-manager","skill-manager","pskills"]){let J=`<!-- ${Z}: ${Y} -->`,X=`<!-- /${Z}: ${Y} -->`,L=$.indexOf(J),H=$.indexOf(X);if(L===-1||H===-1)continue;let Q=L;if(Q>0&&$[Q-1]===`
4
+ `)Q--;let G=H+X.length;if(G<$.length&&$[G]===`
5
+ `)G++;$=$.slice(0,Q)+$.slice(G)}await Dz(z,$,"utf-8")}async function AY(z,Y){let $=[];for(let Z of z.directories)try{if(Z.isSymlink)await r(Z.path),$.push(`Removed symlink: ${Z.path}`);else await r(Z.path,{recursive:!0,force:!0}),$.push(`Removed directory: ${Z.path}`);if(Y&&w(Z.path)!==w(Y)){let J=Xz(Z.path),X=yz(J,Y);await Cz(X,Z.path,"dir"),$.push(`Created symlink: ${Z.path} -> ${X}`)}}catch(J){$.push(`Failed to remove ${Z.path}: ${J.message}`)}for(let Z of z.ruleFiles)if(await b(Z))try{await r(Z),$.push(`Removed rule file: ${Z}`)}catch(J){$.push(`Failed to remove ${Z}: ${J.message}`)}for(let Z of z.agentsBlocks)try{await hz(Z.file,Z.skillName),$.push(`Cleaned AGENTS.md block in: ${Z.file}`)}catch(J){$.push(`Failed to clean AGENTS.md block: ${J.message}`)}return $}async function KY(z){let Y=[];for(let $ of z.directories)if(await b($.path)){let J=(await wz($.path)).isSymbolicLink()?"symlink":"directory";Y.push(`${$.path} (${J})`)}for(let $ of z.ruleFiles)if(await b($))Y.push($);for(let $ of z.agentsBlocks)if(await b($.file)){let Z=await Jz($.file,"utf-8");if(Z.includes(`<!-- agent-skill-manager: ${$.skillName} -->`)||Z.includes(`<!-- skill-manager: ${$.skillName} -->`)||Z.includes(`<!-- pskills: ${$.skillName} -->`))Y.push(`${$.file} (AGENTS.md block)`)}return Y}var K=()=>{if(process.env.NO_COLOR!==void 0)return!1;if(globalThis.__CLI_NO_COLOR)return!1;if(!process.stdout.isTTY)return!1;return!0},B={bold:(z)=>K()?`\x1B[1m${z}\x1B[0m`:z,cyan:(z)=>K()?`\x1B[36m${z}\x1B[0m`:z,green:(z)=>K()?`\x1B[32m${z}\x1B[0m`:z,yellow:(z)=>K()?`\x1B[33m${z}\x1B[0m`:z,dim:(z)=>K()?`\x1B[2m${z}\x1B[0m`:z,white:(z)=>K()?`\x1B[37m${z}\x1B[0m`:z,red:(z)=>K()?`\x1B[31m${z}\x1B[0m`:z,blue:(z)=>K()?`\x1B[34m${z}\x1B[0m`:z,blueBold:(z)=>K()?`\x1B[34;1m${z}\x1B[0m`:z,magenta:(z)=>K()?`\x1B[35m${z}\x1B[0m`:z,bgDim:(z)=>K()?`\x1B[48;5;236m${z}\x1B[0m`:z,bgRed:(z)=>K()?`\x1B[41m\x1B[37m\x1B[1m${z}\x1B[0m`:z,bgYellow:(z)=>K()?`\x1B[43m\x1B[30m\x1B[1m${z}\x1B[0m`:z,bgGreen:(z)=>K()?`\x1B[42m\x1B[30m\x1B[1m${z}\x1B[0m`:z,bgCyan:(z)=>K()?`\x1B[46m\x1B[30m\x1B[1m${z}\x1B[0m`:z};function k(z){if(!z)return"";switch(z.toLowerCase()){case"low":return B.green(z);case"medium":return B.yellow(z);case"high":return B.red(z);case"max":return B.magenta(z);default:return z}}var Qz={claude:B.blueBold,codex:B.cyan,"codex-plugin":B.cyan,openclaw:B.yellow,agents:B.green,custom:B.magenta,cursor:B.blue,windsurf:B.cyan,cline:B.green,roocode:B.magenta,continue:B.yellow,copilot:B.white,aider:B.red,opencode:B.cyan,zed:B.blue,augment:B.green,amp:B.yellow};function l(z,Y){return(Qz[z]||B.dim)(Y)}function s(z,Y){if(!K())return`[${Y}]`;return(Qz[z]||B.dim)(`[${Y}]`)}function C(z){let Y=process.env.HOME||process.env.USERPROFILE||"";if(Y&&z.startsWith(Y))return"~"+z.slice(Y.length);return z}function IY(z){if(z.length===0)return"No skills found.";let Y=["Name","Version","Creator","Effort","Tool","Scope","Type","Path"],$=z.map((Q)=>[Q.name,Q.version,Q.creator||"—",Q.effort||"—",Q.providerLabel,Q.scope,Q.isSymlink?"symlink":"directory",C(Q.path)]),Z=Y.map((Q,U)=>Math.max(Q.length,...$.map((G)=>G[U].length))),J=(Q,U)=>Q.padEnd(U),X=Y.map((Q,U)=>J(Q,Z[U])).join(" "),L=Z.map((Q)=>"-".repeat(Q)).join("--"),H=$.map((Q)=>Q.map((U,G)=>J(U,Z[G])).join(" "));return[K()?B.bold(X):X,L,...H].join(`
6
+ `)}function Uz(z){let Y=new Map;for(let Z of z){let J=`${Z.dirName}||${Z.scope}`,X=Y.get(J)??[];X.push(Z),Y.set(J,X)}let $=[];for(let[,Z]of Y){let J=Z[0],X=new Set(Z.map((H)=>H.scope)),L=new Set(Z.map((H)=>H.isSymlink?"symlink":"directory"));$.push({name:J.name,version:J.version,creator:J.creator||"",effort:J.effort||"",providers:Z.map((H)=>({provider:H.provider,label:H.providerLabel})),scope:X.size>1?"mixed":J.scope,type:L.size>1?"mixed":J.isSymlink?"symlink":"directory",path:C(J.path),warningCount:Z.reduce((H,Q)=>H+(Q.warnings?.length??0),0)})}return $}function _Y(z){if(z.length===0)return"No skills found.";let Y=Uz(z),$=[],Z=Math.max(4,...Y.map((V)=>V.name.length)),J=Math.max(7,...Y.map((V)=>V.version.length)),X=Math.max(7,...Y.map((V)=>Math.min((V.creator||"—").length,15))),L=Math.max(6,...Y.map((V)=>(V.effort||"—").length)),H=7,Q=9,U=Y.map((V)=>V.providers.map((q)=>s(q.provider,q.label)).join(" ")),G=Y.map((V)=>V.providers.map((q)=>`[${q.label}]`).join(" ")),O=Math.max(9,...G.map((V)=>V.length)),j=(V,q)=>V.padEnd(q),A=`${j("Name",Z)} ${j("Version",J)} ${j("Creator",X)} ${j("Effort",L)} ${j("Tools",O)} ${j("Scope",H)} ${j("Type",Q)}`;$.push(K()?B.bold(A):A),$.push(`${"-".repeat(Z)} ${"-".repeat(J)} ${"-".repeat(X)} ${"-".repeat(L)} ${"-".repeat(O)} ${"-".repeat(H)} ${"-".repeat(Q)}`);for(let V=0;V<Y.length;V++){let q=Y[V],y=j(q.name,Z),P=j(q.version,J),v=(q.creator||"—").slice(0,15),R=j(v,X),h=q.effort||"—",m=q.effort?k(q.effort):"—",c=L-h.length,u=m+" ".repeat(Math.max(0,c)),p=O-G[V].length,jz=U[V]+" ".repeat(Math.max(0,p)),Az=j(q.scope,H),Kz=j(q.type,Q),Vz=q.warningCount>0?` ${B.yellow(`(${q.warningCount} warning${q.warningCount>1?"s":""})`)}`:"";$.push(`${y} ${P} ${R} ${u} ${jz} ${Az} ${Kz}${Vz}`)}let I=Y.length,F=z.length,_=new Set(z.map((V)=>V.provider)),S=z.filter((V)=>V.scope==="global").length,N=z.filter((V)=>V.scope==="project").length;$.push("");let x=`${F} skills (${I} unique) across ${_.size} tools | ${S} global, ${N} project`;return $.push(B.dim(x)),$.join(`
7
+ `)}function fz(z,Y){if(!K()||!Y)return z;let $=z.toLowerCase().indexOf(Y.toLowerCase());if($===-1)return z;let Z=z.slice(0,$),J=z.slice($,$+Y.length),X=z.slice($+Y.length);return`${Z}${B.bold(B.yellow(J))}${X}`}function qY(z,Y){if(z.length===0)return`No skills matching "${Y}". Try ${B.bold("asm list")} to see all skills.`;let $=Uz(z),Z=[];Z.push(B.dim(`Found ${z.length} result${z.length===1?"":"s"} (${$.length} unique) matching "${Y}"`)+`
8
+ `);let J=Math.max(4,...$.map((F)=>F.name.length)),X=Math.max(7,...$.map((F)=>F.version.length)),L=Math.max(7,...$.map((F)=>Math.min((F.creator||"—").length,15))),H=Math.max(6,...$.map((F)=>(F.effort||"—").length)),Q=$.map((F)=>F.providers.map((_)=>s(_.provider,_.label)).join(" ")),U=$.map((F)=>F.providers.map((_)=>`[${_.label}]`).join(" ")),G=Math.max(9,...U.map((F)=>F.length)),O=7,j=9,A=(F,_)=>F.padEnd(_),I=`${A("Name",J)} ${A("Version",X)} ${A("Creator",L)} ${A("Effort",H)} ${A("Tools",G)} ${A("Scope",O)} ${A("Type",j)}`;Z.push(K()?B.bold(I):I),Z.push(`${"-".repeat(J)} ${"-".repeat(X)} ${"-".repeat(L)} ${"-".repeat(H)} ${"-".repeat(G)} ${"-".repeat(O)} ${"-".repeat(j)}`);for(let F=0;F<$.length;F++){let _=$[F],S=fz(_.name,Y),N=J-_.name.length,x=S+" ".repeat(Math.max(0,N)),V=A(_.version,X),q=(_.creator||"—").slice(0,15),y=A(q,L),P=_.effort||"—",v=_.effort?k(_.effort):"—",R=H-P.length,h=v+" ".repeat(Math.max(0,R)),m=G-U[F].length,c=Q[F]+" ".repeat(Math.max(0,m)),u=A(_.scope,O),p=A(_.type,j);Z.push(`${x} ${V} ${y} ${h} ${c} ${u} ${p}`)}return Z.join(`
9
+ `)}function TY(z,Y){if(z.length===0)return"";let $=[];$.push(B.dim(`Found ${z.length} available skill${z.length===1?"":"s"} matching "${Y}"`)+`
10
+ `);for(let Z of z){$.push(` ${B.dim("To install:")} ${B.green(`asm install ${Z.installUrl}`)}`);let J=Z.verified?B.blue(" [verified]"):"";$.push(` ${B.cyan(Z.name)} ${B.dim(`v${Z.version}`)}${J} ${B.dim(`[${Z.repoLabel}]`)}`);for(let X of Lz(Z.description,76))$.push(` ${X}`);$.push("")}return $.join(`
11
+ `)}var Gz=new Set(["Bash","Write","Edit","NotebookEdit"]),gz=new Set(["WebFetch","WebSearch"]);function kz(z){if(Gz.has(z))return B.red(z);if(gz.has(z))return B.yellow(z);return B.green(z)}function Bz(z){if(z.length===0)return"";return z.map(kz).join(" ")}function Hz(z){let Y=z.filter((Z)=>Gz.has(Z));if(Y.length===0)return null;let $=[];if(Y.includes("Bash"))$.push("execute shell commands");if(Y.includes("Write")||Y.includes("Edit")||Y.includes("NotebookEdit"))$.push("modify files");return`This skill can ${$.join(" and ")}`}async function mz(z){let Y=[],$=(J,X)=>`${K()?B.bold(J+":"):J+":"} ${X}`;if(Y.push($("Name",z.name)),Y.push($("Version",z.version)),Y.push($("Creator",z.creator||"—")),Y.push($("License",z.license||"—")),z.compatibility)Y.push($("Compatibility",z.compatibility));if(z.effort)Y.push($("Effort",k(z.effort)));if(Y.push($("Tool",z.providerLabel)),Y.push($("Scope",z.scope)),Y.push($("Location",z.location)),Y.push($("Path",C(z.path))),Y.push($("Type",z.isSymlink?"symlink":"directory")),z.isSymlink&&z.symlinkTarget)Y.push($("Symlink Target",z.symlinkTarget));let Z=z.fileCount??await i(z.path);if(Y.push($("File Count",String(Z))),z.description)Y.push(""),Y.push($("Description",z.description));if(z.allowedTools&&z.allowedTools.length>0){Y.push(""),Y.push(K()?B.bold("Allowed Tools:"):"Allowed Tools:"),Y.push(` ${Bz(z.allowedTools)}`);let J=Hz(z.allowedTools);if(J)Y.push(` ${K()?B.yellow("⚠"):"!"} ${J}`)}if(z.warnings&&z.warnings.length>0){Y.push(""),Y.push(K()?B.bold("Warnings:"):"Warnings:");for(let J of z.warnings)Y.push(` ${K()?B.yellow("!"):"!"} [${J.category}] ${J.message}`)}return Y.join(`
12
+ `)}async function EY(z){if(z.length===0)return"No skills found.";if(z.length===1)return mz(z[0]);let Y=[],$=(U,G)=>`${K()?B.bold(U+":"):U+":"} ${G}`,Z=z[0],J=Z.name;if(Y.push(""),Y.push(K()?B.blueBold(` ${J}`):` ${J}`),Y.push(K()?B.dim(" "+"-".repeat(J.length+2)):" "+"-".repeat(J.length+2)),Y.push(""),Y.push($(" Version",Z.version)),Y.push($(" Creator",Z.creator||"—")),Y.push($(" License",Z.license||"—")),Z.compatibility)Y.push($(" Compatibility",Z.compatibility));if(Z.effort)Y.push($(" Effort",k(Z.effort)));let X=Z.fileCount??await i(Z.path);Y.push($(" File Count",String(X)));let L=z.map((U)=>s(U.provider,U.providerLabel)).join(" ");if(Y.push($(" Installed in",L)),Z.description){Y.push(""),Y.push(K()?B.bold(" Description:"):" Description:");let U=Lz(Z.description,72);for(let G of U)Y.push(" "+G)}if(Z.allowedTools&&Z.allowedTools.length>0){Y.push(""),Y.push(K()?B.bold(" Allowed Tools:"):" Allowed Tools:"),Y.push(` ${Bz(Z.allowedTools)}`);let U=Hz(Z.allowedTools);if(U)Y.push(` ${K()?B.yellow("⚠"):"!"} ${U}`)}Y.push("");let H=` Installations (${z.length})`;Y.push(K()?B.bold(H):H);for(let U=0;U<z.length;U++){let G=z[U],O=l(G.provider,G.providerLabel),j=G.isSymlink?"symlink":"directory",A=B.dim(G.scope);if(Y.push(` ${O} (${A}, ${j})`),Y.push(` ${B.dim("Path:")} ${C(G.path)}`),G.isSymlink&&G.symlinkTarget)Y.push(` ${B.dim("Target:")} ${G.symlinkTarget}`)}let Q=z.flatMap((U)=>{if(!U.warnings||U.warnings.length===0)return[];return U.warnings.map((G)=>({...G,provider:U.providerLabel}))});if(Q.length>0){Y.push("");let U=` Warnings (${Q.length})`;Y.push(K()?B.bold(U):U);for(let G of Q){let O=K()?B.yellow("!"):"!";Y.push(` ${O} [${G.category}] ${G.message}`)}}return Y.push(""),Y.join(`
13
+ `)}function Lz(z,Y){let $=z.split(/\s+/),Z=[],J="";for(let X of $)if(J.length+X.length+1>Y&&J.length>0)Z.push(J),J=X;else J=J?J+" "+X:X;if(J)Z.push(J);return Z}function NY(z){return JSON.stringify(z,null,2)}function SY(z){let Y=[],$=new Set,Z=new Map,J=[];for(let Q of z){let U=Z.get(Q.realPath);if(U){if(Q.isSymlink)continue;if(U.isSymlink)J[J.indexOf(U)]=Q,Z.set(Q.realPath,Q);else J.push(Q)}else Z.set(Q.realPath,Q),J.push(Q)}let X=new Map;for(let Q of J){let U=X.get(Q.dirName)??[];U.push(Q),X.set(Q.dirName,U)}for(let[Q,U]of X)if(new Set(U.map((O)=>O.location)).size>=2){Y.push({key:Q,reason:"same-dirName",instances:U});for(let O of U)$.add(O.path)}let L=new Map;for(let Q of J){if(!Q.name)continue;let U=L.get(Q.name)??[];U.push(Q),L.set(Q.name,U)}for(let[Q,U]of L){if(new Set(U.map((A)=>A.dirName)).size<2)continue;let O=U.filter((A)=>!$.has(A.path));if(O.length<2)continue;if(new Set(O.map((A)=>A.dirName)).size<2)continue;Y.push({key:Q,reason:"same-frontmatterName",instances:O})}Y.sort((Q,U)=>{if(Q.reason!==U.reason)return Q.reason==="same-dirName"?-1:1;return Q.key.localeCompare(U.key)});let H=Y.reduce((Q,U)=>Q+U.instances.length,0);return{scannedAt:new Date().toISOString(),totalSkills:z.length,duplicateGroups:Y,totalDuplicateInstances:H}}function cz(z){return[...z].sort((Y,$)=>{if(Y.scope!==$.scope)return Y.scope==="global"?-1:1;let Z=Y.providerLabel.localeCompare($.providerLabel);if(Z!==0)return Z;return Y.path.localeCompare($.path)})}function uz(z){return z==="same-dirName"?"same dirName":"same name"}function xY(z){if(z.duplicateGroups.length===0)return B.green("No duplicate skills found.");let Y=[];Y.push(""),Y.push(B.bold(` Found ${z.duplicateGroups.length} duplicate group(s) (${z.totalDuplicateInstances} total instances):`)),Y.push("");for(let $ of z.duplicateGroups){Y.push(` ${B.yellow(`"${$.key}"`)} ${B.dim(`(${uz($.reason)})`)}`);let Z=cz($.instances);for(let J=0;J<Z.length;J++){let X=Z[J],L=l(X.provider,X.providerLabel),H=J===0?B.green(" [keep]"):B.dim(" "),Q=B.dim(`(${X.scope})`);Y.push(` ${H} ${L} ${Q} ${B.dim(C(X.path))}`)}Y.push("")}return Y.push(B.dim(` Run ${B.bold("asm audit -y")} to auto-remove duplicates`)),Y.push(""),Y.join(`
14
+ `)}function DY(z){return JSON.stringify(z,null,2)}function wY(z){let Y=z.trim();if(!Y)return["vi",[]];let $=[],Z="",J=!1,X=0;while(X<Y.length){let L=Y[X];if(L==='"'){J=!0,X++;while(X<Y.length&&Y[X]!=='"'){if(Y[X]==="\\"&&X+1<Y.length){let H=Y[X+1];if(H==='"'||H==="\\"){Z+=H,X+=2;continue}}Z+=Y[X],X++}X++}else if(L==="'"){J=!0,X++;while(X<Y.length&&Y[X]!=="'")Z+=Y[X],X++;X++}else if(L===" "||L==="\t"){if(Z.length>0||J)$.push(Z),Z="",J=!1;X++}else Z+=L,X++}if(Z.length>0||J)$.push(Z);if($.length===0)return["vi",[]];return[$[0],$.slice(1)]}import{readFileSync as pz}from"fs";import{resolve as dz,dirname as nz}from"path";import{fileURLToPath as oz}from"url";import{execSync as tz}from"child_process";var az=nz(oz(import.meta.url)),Oz="1.21.0";try{let z=pz(dz(az,"../../package.json"),"utf-8");Oz=JSON.parse(z).version}catch{}var e="fe440c5";try{e=tz("git rev-parse --short HEAD",{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).trim()||e}catch{}var iz=Oz,rz=e,hY=`v${iz} (${rz})`;
15
+ export{d as e,n as f,o as g,i as h,XY as i,QY as j,UY as k,bz as l,jY as m,AY as n,KY as o,B as p,k as q,l as r,C as s,IY as t,_Y as u,qY as v,TY as w,Gz as x,gz as y,EY as z,Lz as A,NY as B,SY as C,cz as D,uz as E,xY as F,DY as G,iz as H,hY as I,wY as J};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-skill-manager",
3
- "version": "1.19.0",
3
+ "version": "1.21.0",
4
4
  "description": "Interactive TUI for managing installed skills for AI coding agents (Claude Code, Codex, OpenClaw, and more)",
5
5
  "type": "module",
6
6
  "bin": {
@@ -29,7 +29,8 @@
29
29
  ],
30
30
  "dependencies": {
31
31
  "@opentui/core": "0.1.87",
32
- "yaml": "^2.8.2"
32
+ "skillgrade": "^0.1.3",
33
+ "yaml": "^2.8.3"
33
34
  },
34
35
  "engines": {
35
36
  "node": ">=18",
@@ -1,14 +0,0 @@
1
- import{N as V,T as K}from"./chunk-v3wdjh4r.js";import{readdir as a,stat as J$,lstat as B$,readlink as G$,readFile as U$,realpath as Q$}from"fs/promises";import{join as n,resolve as N$}from"path";function d($){let L={},j=$.split(`
2
- `),S=!1,A=!1,z=null,G=[],J="none",X=-1,Y=null;function B(){if(z){let U=G.join(" ").trim();if(U)L[z]=U;z=null,G=[],J="none",X=-1}}for(let U of j){if(U.trim()==="---")if(!A){A=!0,S=!0;continue}else{B();break}if(!S)continue;if(J!=="none"&&z){let Q=U.replace(/^\s*/,""),O=U.length-Q.length;if(O>0&&Q.length>0){if(X===-1)X=O;G.push(Q);continue}else if(Q.length===0)continue;else B()}if(Y!==null){let Q=U.match(/^\s+(\w[\w-]*):\s*(.*?)\s*$/);if(Q){let O=Q[1],F=Q[2].replace(/^["']|["']$/g,"");if(F)L[`${Y}.${O}`]=F;continue}if(U.trim().length>0)Y=null;else continue}let H=U.match(/^(\w[\w-]*):\s*(.*?)\s*$/);if(H){B();let Q=H[1],O=H[2];if(O==="|"||O===">")z=Q,G=[],J=O==="|"?"literal":"folded";else if(O==="|+"||O===">+"||O==="|-"||O===">-")z=Q,G=[],J=O.startsWith("|")?"literal":"folded";else{let D=O.replace(/^["']|["']$/g,"");if(D)L[Q]=D;else Y=Q}}}return B(),L}function t($){return $["metadata.version"]||$.version||"0.0.0"}function o($){let L=$["allowed-tools"]||"";if(!L.trim())return[];return L.split(/[\s,]+/).map((j)=>j.trim()).filter(Boolean)}function I$($,L){let j=[];for(let S of $.providers){if(!S.enabled){V(`scan: skipping disabled provider "${S.name}"`);continue}if(L==="global"||L==="both"){let A=K(S.global);V(`scan: adding location ${A} (${S.label}, global)`),j.push({dir:A,location:`global-${S.name}`,scope:"global",providerName:S.name,providerLabel:S.label})}if(L==="project"||L==="both"){let A=K(S.project);V(`scan: adding location ${A} (${S.label}, project)`),j.push({dir:A,location:`project-${S.name}`,scope:"project",providerName:S.name,providerLabel:S.label})}}for(let S of $.customPaths)if(L===S.scope||L==="both"){let A=K(S.path);V(`scan: adding custom location ${A} (${S.label}, ${S.scope})`),j.push({dir:A,location:`${S.scope}-custom`,scope:S.scope,providerName:"custom",providerLabel:S.label})}return j}async function g($){try{return(await a($,{recursive:!0})).length}catch{return 0}}async function D$($){let L=[];V(`scanning: ${$.dir} (${$.location})`);let j;try{j=await a($.dir)}catch{return V(`scanning: ${$.dir} — not found, skipping`),L}for(let S of j){let A=n($.dir,S);try{if(!(await J$(A)).isDirectory()){V(` skip: "${S}" — not a directory`);continue}}catch{V(` skip: "${S}" — stat failed`);continue}let z=n(A,"SKILL.md"),G;try{G=await U$(z,"utf-8")}catch{V(` skip: "${S}" — no SKILL.md`);continue}let J=d(G),X=!1,Y=null;try{if((await B$(A)).isSymbolicLink())X=!0,Y=await G$(A)}catch{}let B=N$(A),U;try{U=await Q$(A)}catch{U=B}L.push({name:J.name||S,version:t(J),description:(J.description||"").replace(/\s*\n\s*/g," ").trim(),creator:J["metadata.creator"]||"",license:(J.license||"").trim(),compatibility:(J.compatibility||"").trim(),allowedTools:o(J),effort:J.effort||J["metadata.effort"]||void 0,dirName:S,path:B,originalPath:A,location:$.location,scope:$.scope,provider:$.providerName,providerLabel:$.providerLabel,isSymlink:X,symlinkTarget:Y,realPath:U})}return V(`found ${L.length} skill(s) in ${$.dir}`),L}async function n$($,L){let j=I$($,L);return(await Promise.all(j.map(D$))).flat()}function a$($,L){if(!L.trim())return $;let j=L.toLowerCase();return $.filter((S)=>S.name.toLowerCase().includes(j)||S.description.toLowerCase().includes(j)||S.creator.toLowerCase().includes(j)||S.effort&&S.effort.toLowerCase().includes(j)||S.location.toLowerCase().includes(j)||S.providerLabel.toLowerCase().includes(j))}function H$($,L){let j=$.split("."),S=L.split("."),A=Math.max(j.length,S.length);for(let z=0;z<A;z++){let G=parseInt(j[z]??"0",10),J=parseInt(S[z]??"0",10);if(isNaN(G)||isNaN(J))return $.localeCompare(L);if(G!==J)return G-J}return 0}function r$($,L){let j=[...$];switch(L){case"name":j.sort((S,A)=>S.name.localeCompare(A.name));break;case"version":j.sort((S,A)=>H$(S.version,A.version));break;case"location":j.sort((S,A)=>S.location.localeCompare(A.location));break}return j}import{rm as m,readFile as i,writeFile as F$,access as T$,lstat as O$,symlink as V$}from"fs/promises";import{join as r,resolve as _,dirname as l,relative as K$}from"path";import{homedir as _$}from"os";var q$=_$();function M$($,L){let j={directories:[],ruleFiles:[],agentsBlocks:[]};j.directories.push({path:$.originalPath,isSymlink:$.isSymlink});let S=$.dirName;if($.scope==="project")j.ruleFiles.push(_(".cursor","rules",`${S}.mdc`),_(".windsurf","rules",`${S}.md`),_(".github","instructions",`${S}.instructions.md`)),j.agentsBlocks.push({file:_("AGENTS.md"),skillName:S});if($.scope==="global"){for(let G of L.providers){if(!G.enabled)continue;let J=K(G.global),X=r(l(J),"AGENTS.md");j.agentsBlocks.push({file:X,skillName:S})}let A=r(q$,".codex","AGENTS.md");if(!j.agentsBlocks.some((G)=>G.file===A))j.agentsBlocks.push({file:A,skillName:S})}return j}function LL($,L,j){let S=L.filter((X)=>X.dirName===$);if(S.length===0)return{directories:[],ruleFiles:[],agentsBlocks:[]};let A={directories:[],ruleFiles:[],agentsBlocks:[]},z=new Set,G=new Set,J=new Set;for(let X of S){let Y=M$(X,j);for(let B of Y.directories)if(!z.has(B.path))z.add(B.path),A.directories.push(B);for(let B of Y.ruleFiles)if(!G.has(B))G.add(B),A.ruleFiles.push(B);for(let B of Y.agentsBlocks){let U=`${B.file}::${B.skillName}`;if(!J.has(U))J.add(U),A.agentsBlocks.push(B)}}return A}async function M($){try{return await T$($),!0}catch{return!1}}async function R$($,L){if(!await M($))return;let j=await i($,"utf-8");for(let S of["agent-skill-manager","skill-manager","pskills"]){let A=`<!-- ${S}: ${L} -->`,z=`<!-- /${S}: ${L} -->`,G=j.indexOf(A),J=j.indexOf(z);if(G===-1||J===-1)continue;let X=G;if(X>0&&j[X-1]===`
3
- `)X--;let B=J+z.length;if(B<j.length&&j[B]===`
4
- `)B++;j=j.slice(0,X)+j.slice(B)}await F$($,j,"utf-8")}async function SL($,L){let j=[];for(let S of $.directories)try{if(S.isSymlink)await m(S.path),j.push(`Removed symlink: ${S.path}`);else await m(S.path,{recursive:!0,force:!0}),j.push(`Removed directory: ${S.path}`);if(L&&_(S.path)!==_(L)){let A=l(S.path),z=K$(A,L);await V$(z,S.path,"dir"),j.push(`Created symlink: ${S.path} -> ${z}`)}}catch(A){j.push(`Failed to remove ${S.path}: ${A.message}`)}for(let S of $.ruleFiles)if(await M(S))try{await m(S),j.push(`Removed rule file: ${S}`)}catch(A){j.push(`Failed to remove ${S}: ${A.message}`)}for(let S of $.agentsBlocks)try{await R$(S.file,S.skillName),j.push(`Cleaned AGENTS.md block in: ${S.file}`)}catch(A){j.push(`Failed to clean AGENTS.md block: ${A.message}`)}return j}async function jL($){let L=[];for(let j of $.directories)if(await M(j.path)){let A=(await O$(j.path)).isSymbolicLink()?"symlink":"directory";L.push(`${j.path} (${A})`)}for(let j of $.ruleFiles)if(await M(j))L.push(j);for(let j of $.agentsBlocks)if(await M(j.file)){let S=await i(j.file,"utf-8");if(S.includes(`<!-- agent-skill-manager: ${j.skillName} -->`)||S.includes(`<!-- skill-manager: ${j.skillName} -->`)||S.includes(`<!-- pskills: ${j.skillName} -->`))L.push(`${j.file} (AGENTS.md block)`)}return L}var N=()=>{if(process.env.NO_COLOR!==void 0)return!1;if(globalThis.__CLI_NO_COLOR)return!1;if(!process.stdout.isTTY)return!1;return!0},Z={bold:($)=>N()?`\x1B[1m${$}\x1B[0m`:$,cyan:($)=>N()?`\x1B[36m${$}\x1B[0m`:$,green:($)=>N()?`\x1B[32m${$}\x1B[0m`:$,yellow:($)=>N()?`\x1B[33m${$}\x1B[0m`:$,dim:($)=>N()?`\x1B[2m${$}\x1B[0m`:$,white:($)=>N()?`\x1B[37m${$}\x1B[0m`:$,red:($)=>N()?`\x1B[31m${$}\x1B[0m`:$,blue:($)=>N()?`\x1B[34m${$}\x1B[0m`:$,blueBold:($)=>N()?`\x1B[34;1m${$}\x1B[0m`:$,magenta:($)=>N()?`\x1B[35m${$}\x1B[0m`:$,bgDim:($)=>N()?`\x1B[48;5;236m${$}\x1B[0m`:$,bgRed:($)=>N()?`\x1B[41m\x1B[37m\x1B[1m${$}\x1B[0m`:$,bgYellow:($)=>N()?`\x1B[43m\x1B[30m\x1B[1m${$}\x1B[0m`:$,bgGreen:($)=>N()?`\x1B[42m\x1B[30m\x1B[1m${$}\x1B[0m`:$,bgCyan:($)=>N()?`\x1B[46m\x1B[30m\x1B[1m${$}\x1B[0m`:$};function R($){if(!$)return"";switch($.toLowerCase()){case"low":return Z.green($);case"medium":return Z.yellow($);case"high":return Z.red($);case"max":return Z.magenta($);default:return $}}var s={claude:Z.blueBold,codex:Z.cyan,openclaw:Z.yellow,agents:Z.green,custom:Z.magenta,cursor:Z.blue,windsurf:Z.cyan,cline:Z.green,roocode:Z.magenta,continue:Z.yellow,copilot:Z.white,aider:Z.red,opencode:Z.cyan,zed:Z.blue,augment:Z.green,amp:Z.yellow};function p($,L){return(s[$]||Z.dim)(L)}function k($,L){if(!N())return`[${L}]`;return(s[$]||Z.dim)(`[${L}]`)}function q($){let L=process.env.HOME||process.env.USERPROFILE||"";if(L&&$.startsWith(L))return"~"+$.slice(L.length);return $}function XL($){if($.length===0)return"No skills found.";let L=["Name","Version","Creator","Effort","Tool","Scope","Type","Path"],j=$.map((X)=>[X.name,X.version,X.creator||"—",X.effort||"—",X.providerLabel,X.scope,X.isSymlink?"symlink":"directory",q(X.path)]),S=L.map((X,Y)=>Math.max(X.length,...j.map((B)=>B[Y].length))),A=(X,Y)=>X.padEnd(Y),z=L.map((X,Y)=>A(X,S[Y])).join(" "),G=S.map((X)=>"-".repeat(X)).join("--"),J=j.map((X)=>X.map((Y,B)=>A(Y,S[B])).join(" "));return[N()?Z.bold(z):z,G,...J].join(`
5
- `)}function e($){let L=new Map;for(let S of $){let A=`${S.dirName}||${S.scope}`,z=L.get(A)??[];z.push(S),L.set(A,z)}let j=[];for(let[,S]of L){let A=S[0],z=new Set(S.map((J)=>J.scope)),G=new Set(S.map((J)=>J.isSymlink?"symlink":"directory"));j.push({name:A.name,version:A.version,creator:A.creator||"",effort:A.effort||"",providers:S.map((J)=>({provider:J.provider,label:J.providerLabel})),scope:z.size>1?"mixed":A.scope,type:G.size>1?"mixed":A.isSymlink?"symlink":"directory",path:q(A.path),warningCount:S.reduce((J,X)=>J+(X.warnings?.length??0),0)})}return j}function YL($){if($.length===0)return"No skills found.";let L=e($),j=[],S=Math.max(4,...L.map((I)=>I.name.length)),A=Math.max(7,...L.map((I)=>I.version.length)),z=Math.max(7,...L.map((I)=>Math.min((I.creator||"—").length,15))),G=Math.max(6,...L.map((I)=>(I.effort||"—").length)),J=7,X=9,Y=L.map((I)=>I.providers.map((T)=>k(T.provider,T.label)).join(" ")),B=L.map((I)=>I.providers.map((T)=>`[${T.label}]`).join(" ")),U=Math.max(9,...B.map((I)=>I.length)),H=(I,T)=>I.padEnd(T),Q=`${H("Name",S)} ${H("Version",A)} ${H("Creator",z)} ${H("Effort",G)} ${H("Tools",U)} ${H("Scope",J)} ${H("Type",X)}`;j.push(N()?Z.bold(Q):Q),j.push(`${"-".repeat(S)} ${"-".repeat(A)} ${"-".repeat(z)} ${"-".repeat(G)} ${"-".repeat(U)} ${"-".repeat(J)} ${"-".repeat(X)}`);for(let I=0;I<L.length;I++){let T=L[I],w=H(T.name,S),C=H(T.version,A),x=(T.creator||"—").slice(0,15),v=H(x,z),W=T.effort||"—",y=T.effort?R(T.effort):"—",b=G-W.length,h=y+" ".repeat(Math.max(0,b)),f=U-B[I].length,z$=Y[I]+" ".repeat(Math.max(0,f)),X$=H(T.scope,J),Y$=H(T.type,X),Z$=T.warningCount>0?` ${Z.yellow(`(${T.warningCount} warning${T.warningCount>1?"s":""})`)}`:"";j.push(`${w} ${C} ${v} ${h} ${z$} ${X$} ${Y$}${Z$}`)}let O=L.length,D=$.length,F=new Set($.map((I)=>I.provider)),E=$.filter((I)=>I.scope==="global").length,P=$.filter((I)=>I.scope==="project").length;j.push("");let c=`${D} skills (${O} unique) across ${F.size} tools | ${E} global, ${P} project`;return j.push(Z.dim(c)),j.join(`
6
- `)}function E$($,L){if(!N()||!L)return $;let j=$.toLowerCase().indexOf(L.toLowerCase());if(j===-1)return $;let S=$.slice(0,j),A=$.slice(j,j+L.length),z=$.slice(j+L.length);return`${S}${Z.bold(Z.yellow(A))}${z}`}function ZL($,L){if($.length===0)return`No skills matching "${L}". Try ${Z.bold("asm list")} to see all skills.`;let j=e($),S=[];S.push(Z.dim(`Found ${$.length} result${$.length===1?"":"s"} (${j.length} unique) matching "${L}"`)+`
7
- `);let A=Math.max(4,...j.map((D)=>D.name.length)),z=Math.max(7,...j.map((D)=>D.version.length)),G=Math.max(7,...j.map((D)=>Math.min((D.creator||"—").length,15))),J=Math.max(6,...j.map((D)=>(D.effort||"—").length)),X=j.map((D)=>D.providers.map((F)=>k(F.provider,F.label)).join(" ")),Y=j.map((D)=>D.providers.map((F)=>`[${F.label}]`).join(" ")),B=Math.max(9,...Y.map((D)=>D.length)),U=7,H=9,Q=(D,F)=>D.padEnd(F),O=`${Q("Name",A)} ${Q("Version",z)} ${Q("Creator",G)} ${Q("Effort",J)} ${Q("Tools",B)} ${Q("Scope",U)} ${Q("Type",H)}`;S.push(N()?Z.bold(O):O),S.push(`${"-".repeat(A)} ${"-".repeat(z)} ${"-".repeat(G)} ${"-".repeat(J)} ${"-".repeat(B)} ${"-".repeat(U)} ${"-".repeat(H)}`);for(let D=0;D<j.length;D++){let F=j[D],E=E$(F.name,L),P=A-F.name.length,c=E+" ".repeat(Math.max(0,P)),I=Q(F.version,z),T=(F.creator||"—").slice(0,15),w=Q(T,G),C=F.effort||"—",x=F.effort?R(F.effort):"—",v=J-C.length,W=x+" ".repeat(Math.max(0,v)),y=B-Y[D].length,b=X[D]+" ".repeat(Math.max(0,y)),h=Q(F.scope,U),f=Q(F.type,H);S.push(`${c} ${I} ${w} ${W} ${b} ${h} ${f}`)}return S.join(`
8
- `)}function JL($,L){if($.length===0)return"";let j=[];j.push(Z.dim(`Found ${$.length} available skill${$.length===1?"":"s"} matching "${L}"`)+`
9
- `);for(let S of $){j.push(` ${Z.dim("To install:")} ${Z.green(`asm install ${S.installUrl}`)}`);let A=S.verified?Z.blue(" [verified]"):"";j.push(` ${Z.cyan(S.name)} ${Z.dim(`v${S.version}`)}${A} ${Z.dim(`[${S.repoLabel}]`)}`);for(let z of j$(S.description,76))j.push(` ${z}`);j.push("")}return j.join(`
10
- `)}var $$=new Set(["Bash","Write","Edit","NotebookEdit"]),P$=new Set(["WebFetch","WebSearch"]);function c$($){if($$.has($))return Z.red($);if(P$.has($))return Z.yellow($);return Z.green($)}function L$($){if($.length===0)return"";return $.map(c$).join(" ")}function S$($){let L=$.filter((S)=>$$.has(S));if(L.length===0)return null;let j=[];if(L.includes("Bash"))j.push("execute shell commands");if(L.includes("Write")||L.includes("Edit")||L.includes("NotebookEdit"))j.push("modify files");return`This skill can ${j.join(" and ")}`}async function w$($){let L=[],j=(A,z)=>`${N()?Z.bold(A+":"):A+":"} ${z}`;if(L.push(j("Name",$.name)),L.push(j("Version",$.version)),L.push(j("Creator",$.creator||"—")),L.push(j("License",$.license||"—")),$.compatibility)L.push(j("Compatibility",$.compatibility));if($.effort)L.push(j("Effort",R($.effort)));if(L.push(j("Tool",$.providerLabel)),L.push(j("Scope",$.scope)),L.push(j("Location",$.location)),L.push(j("Path",q($.path))),L.push(j("Type",$.isSymlink?"symlink":"directory")),$.isSymlink&&$.symlinkTarget)L.push(j("Symlink Target",$.symlinkTarget));let S=$.fileCount??await g($.path);if(L.push(j("File Count",String(S))),$.description)L.push(""),L.push(j("Description",$.description));if($.allowedTools&&$.allowedTools.length>0){L.push(""),L.push(N()?Z.bold("Allowed Tools:"):"Allowed Tools:"),L.push(` ${L$($.allowedTools)}`);let A=S$($.allowedTools);if(A)L.push(` ${N()?Z.yellow("⚠"):"!"} ${A}`)}if($.warnings&&$.warnings.length>0){L.push(""),L.push(N()?Z.bold("Warnings:"):"Warnings:");for(let A of $.warnings)L.push(` ${N()?Z.yellow("!"):"!"} [${A.category}] ${A.message}`)}return L.join(`
11
- `)}async function BL($){if($.length===0)return"No skills found.";if($.length===1)return w$($[0]);let L=[],j=(Y,B)=>`${N()?Z.bold(Y+":"):Y+":"} ${B}`,S=$[0],A=S.name;if(L.push(""),L.push(N()?Z.blueBold(` ${A}`):` ${A}`),L.push(N()?Z.dim(" "+"-".repeat(A.length+2)):" "+"-".repeat(A.length+2)),L.push(""),L.push(j(" Version",S.version)),L.push(j(" Creator",S.creator||"—")),L.push(j(" License",S.license||"—")),S.compatibility)L.push(j(" Compatibility",S.compatibility));if(S.effort)L.push(j(" Effort",R(S.effort)));let z=S.fileCount??await g(S.path);L.push(j(" File Count",String(z)));let G=$.map((Y)=>k(Y.provider,Y.providerLabel)).join(" ");if(L.push(j(" Installed in",G)),S.description){L.push(""),L.push(N()?Z.bold(" Description:"):" Description:");let Y=j$(S.description,72);for(let B of Y)L.push(" "+B)}if(S.allowedTools&&S.allowedTools.length>0){L.push(""),L.push(N()?Z.bold(" Allowed Tools:"):" Allowed Tools:"),L.push(` ${L$(S.allowedTools)}`);let Y=S$(S.allowedTools);if(Y)L.push(` ${N()?Z.yellow("⚠"):"!"} ${Y}`)}L.push("");let J=` Installations (${$.length})`;L.push(N()?Z.bold(J):J);for(let Y=0;Y<$.length;Y++){let B=$[Y],U=p(B.provider,B.providerLabel),H=B.isSymlink?"symlink":"directory",Q=Z.dim(B.scope);if(L.push(` ${U} (${Q}, ${H})`),L.push(` ${Z.dim("Path:")} ${q(B.path)}`),B.isSymlink&&B.symlinkTarget)L.push(` ${Z.dim("Target:")} ${B.symlinkTarget}`)}let X=$.flatMap((Y)=>{if(!Y.warnings||Y.warnings.length===0)return[];return Y.warnings.map((B)=>({...B,provider:Y.providerLabel}))});if(X.length>0){L.push("");let Y=` Warnings (${X.length})`;L.push(N()?Z.bold(Y):Y);for(let B of X){let U=N()?Z.yellow("!"):"!";L.push(` ${U} [${B.category}] ${B.message}`)}}return L.push(""),L.join(`
12
- `)}function j$($,L){let j=$.split(/\s+/),S=[],A="";for(let z of j)if(A.length+z.length+1>L&&A.length>0)S.push(A),A=z;else A=A?A+" "+z:z;if(A)S.push(A);return S}function GL($){return JSON.stringify($,null,2)}function NL($){let L=[],j=new Set,S=new Map,A=[];for(let X of $){let Y=S.get(X.realPath);if(Y){if(X.isSymlink)continue;if(Y.isSymlink)A[A.indexOf(Y)]=X,S.set(X.realPath,X);else A.push(X)}else S.set(X.realPath,X),A.push(X)}let z=new Map;for(let X of A){let Y=z.get(X.dirName)??[];Y.push(X),z.set(X.dirName,Y)}for(let[X,Y]of z)if(new Set(Y.map((U)=>U.location)).size>=2){L.push({key:X,reason:"same-dirName",instances:Y});for(let U of Y)j.add(U.path)}let G=new Map;for(let X of A){if(!X.name)continue;let Y=G.get(X.name)??[];Y.push(X),G.set(X.name,Y)}for(let[X,Y]of G){if(new Set(Y.map((Q)=>Q.dirName)).size<2)continue;let U=Y.filter((Q)=>!j.has(Q.path));if(U.length<2)continue;if(new Set(U.map((Q)=>Q.dirName)).size<2)continue;L.push({key:X,reason:"same-frontmatterName",instances:U})}L.sort((X,Y)=>{if(X.reason!==Y.reason)return X.reason==="same-dirName"?-1:1;return X.key.localeCompare(Y.key)});let J=L.reduce((X,Y)=>X+Y.instances.length,0);return{scannedAt:new Date().toISOString(),totalSkills:$.length,duplicateGroups:L,totalDuplicateInstances:J}}function C$($){return[...$].sort((L,j)=>{if(L.scope!==j.scope)return L.scope==="global"?-1:1;let S=L.providerLabel.localeCompare(j.providerLabel);if(S!==0)return S;return L.path.localeCompare(j.path)})}function x$($){return $==="same-dirName"?"same dirName":"same name"}function IL($){if($.duplicateGroups.length===0)return Z.green("No duplicate skills found.");let L=[];L.push(""),L.push(Z.bold(` Found ${$.duplicateGroups.length} duplicate group(s) (${$.totalDuplicateInstances} total instances):`)),L.push("");for(let j of $.duplicateGroups){L.push(` ${Z.yellow(`"${j.key}"`)} ${Z.dim(`(${x$(j.reason)})`)}`);let S=C$(j.instances);for(let A=0;A<S.length;A++){let z=S[A],G=p(z.provider,z.providerLabel),J=A===0?Z.green(" [keep]"):Z.dim(" "),X=Z.dim(`(${z.scope})`);L.push(` ${J} ${G} ${X} ${Z.dim(q(z.path))}`)}L.push("")}return L.push(Z.dim(` Run ${Z.bold("asm audit -y")} to auto-remove duplicates`)),L.push(""),L.join(`
13
- `)}function DL($){return JSON.stringify($,null,2)}function FL($){let L=$.trim();if(!L)return["vi",[]];let j=[],S="",A=!1,z=0;while(z<L.length){let G=L[z];if(G==='"'){A=!0,z++;while(z<L.length&&L[z]!=='"'){if(L[z]==="\\"&&z+1<L.length){let J=L[z+1];if(J==='"'||J==="\\"){S+=J,z+=2;continue}}S+=L[z],z++}z++}else if(G==="'"){A=!0,z++;while(z<L.length&&L[z]!=="'")S+=L[z],z++;z++}else if(G===" "||G==="\t"){if(S.length>0||A)j.push(S),S="",A=!1;z++}else S+=G,z++}if(S.length>0||A)j.push(S);if(j.length===0)return["vi",[]];return[j[0],j.slice(1)]}import{readFileSync as v$}from"fs";import{resolve as W$,dirname as y$}from"path";import{fileURLToPath as b$}from"url";import{execSync as h$}from"child_process";var f$=y$(b$(import.meta.url)),A$="1.19.0";try{let $=v$(W$(f$,"../../package.json"),"utf-8");A$=JSON.parse($).version}catch{}var u="3548a49";try{u=h$("git rev-parse --short HEAD",{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).trim()||u}catch{}var g$=A$,m$=u,qL=`v${g$} (${m$})`;
14
- export{d as e,t as f,o as g,g as h,n$ as i,a$ as j,r$ as k,M$ as l,LL as m,SL as n,jL as o,Z as p,R as q,p as r,q as s,XL as t,YL as u,ZL as v,JL as w,$$ as x,P$ as y,BL as z,j$ as A,GL as B,NL as C,C$ as D,x$ as E,IL as F,DL as G,qL as H,FL as I};