diff --git a/main.js b/main.js
index 47151ff..12e856e 100644
--- a/main.js
+++ b/main.js
@@ -1,3 +1,3 @@
-var ve=Object.defineProperty;var xt=Object.getOwnPropertyDescriptor;var Et=Object.getOwnPropertyNames;var Ct=Object.prototype.hasOwnProperty;var Lt=(n,e)=>{for(var t in e)ve(n,t,{get:e[t],enumerable:!0})},Tt=(n,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Et(e))!Ct.call(n,i)&&i!==t&&ve(n,i,{get:()=>e[i],enumerable:!(s=xt(e,i))||s.enumerable});return n};var Mt=n=>Tt(ve({},"__esModule",{value:!0}),n);var as={};Lt(as,{default:()=>ge});module.exports=Mt(as);var wt=require("obsidian");var kt=require("obsidian");var R=require("obsidian"),je=require("electron");var Fe=require("os"),b=require("fs"),p=require("path"),u=(0,Fe.homedir)(),V=process.env.XDG_CONFIG_HOME||(0,p.join)(u,".config");function Q(n){return(0,b.existsSync)(`/Applications/${n}.app`)||(0,b.existsSync)((0,p.join)(u,"Applications",`${n}.app`))}function F(n){let e=[`/usr/local/bin/${n}`,`/opt/homebrew/bin/${n}`,(0,p.join)(u,".local","bin",n)];for(let s of e)if((0,b.existsSync)(s))return!0;let t=(0,p.join)(u,".nvm","versions","node");try{for(let s of(0,b.readdirSync)(t))if((0,b.existsSync)((0,p.join)(t,s,"bin",n)))return!0}catch{}return!1}var E=[{id:"claude-code",name:"Claude Code",color:"#f97316",icon:"brain",paths:[{baseDir:(0,p.join)(u,".claude","skills"),type:"skill",pattern:"directory-with-skillmd"},{baseDir:(0,p.join)(u,".claude","commands"),type:"command",pattern:"flat-md"}],agentPaths:[{baseDir:(0,p.join)(u,".claude","agents"),type:"agent",pattern:"flat-md"}],isInstalled:()=>(0,b.existsSync)((0,p.join)(u,".claude","settings.json"))||(0,b.existsSync)((0,p.join)(u,".claude","CLAUDE.md"))||F("claude")},{id:"cursor",name:"Cursor",color:"#3b82f6",icon:"mouse-pointer",paths:[{baseDir:(0,p.join)(u,".cursor","skills"),type:"skill",pattern:"directory-with-skillmd"},{baseDir:(0,p.join)(u,".cursor","rules"),type:"rule",pattern:"flat-md"}],agentPaths:[{baseDir:(0,p.join)(u,".cursor","agents"),type:"agent",pattern:"flat-md"}],isInstalled:()=>Q("Cursor")||(0,b.existsSync)((0,p.join)(u,".cursor","argv.json"))},{id:"windsurf",name:"Windsurf",color:"#14b8a6",icon:"wind",paths:[{baseDir:(0,p.join)(u,".codeium","windsurf","memories"),type:"memory",pattern:"flat-md"},{baseDir:(0,p.join)(u,".windsurf","rules"),type:"rule",pattern:"flat-md"}],agentPaths:[],isInstalled:()=>Q("Windsurf")||(0,b.existsSync)((0,p.join)(u,".codeium","windsurf","argv.json"))},{id:"codex",name:"Codex",color:"#22c55e",icon:"book",paths:[{baseDir:(0,p.join)(u,".codex","skills"),type:"skill",pattern:"directory-with-skillmd"},{baseDir:(0,p.join)(u,".codex","prompts"),type:"command",pattern:"flat-md"},{baseDir:(0,p.join)(u,".codex","memories"),type:"memory",pattern:"flat-md"}],agentPaths:[{baseDir:(0,p.join)(u,".codex","agents"),type:"agent",pattern:"flat-md"}],isInstalled:()=>(0,b.existsSync)((0,p.join)(u,".codex","config.toml"))||(0,b.existsSync)((0,p.join)(u,".codex","auth.json"))||F("codex")},{id:"copilot",name:"Copilot",color:"#a855f7",icon:"plane",paths:[{baseDir:(0,p.join)(u,".copilot","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>(0,b.existsSync)((0,p.join)(u,".copilot"))||F("copilot")},{id:"amp",name:"Amp",color:"#ec4899",icon:"zap",paths:[{baseDir:(0,p.join)(V,"amp","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>(0,b.existsSync)((0,p.join)(V,"amp","config.json"))||(0,b.existsSync)((0,p.join)(V,"amp","settings.json"))||F("amp")},{id:"opencode",name:"OpenCode",color:"#ef4444",icon:"terminal",paths:[{baseDir:(0,p.join)(V,"opencode","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>Q("OpenCode")||(0,b.existsSync)((0,p.join)(V,"opencode","opencode.json"))||(0,b.existsSync)((0,p.join)(V,"opencode","opencode.jsonc"))||F("opencode")},{id:"pi",name:"Pi",color:"#06b6d4",icon:"sparkles",paths:[{baseDir:(0,p.join)(u,".pi","agent","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>F("pi")},{id:"antigravity",name:"Antigravity",color:"#ef4444",icon:"arrow-up-circle",paths:[{baseDir:(0,p.join)(u,".gemini","antigravity","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>Q("Antigravity")||(0,b.existsSync)((0,p.join)(u,".gemini","antigravity","skills"))||F("antigravity")},{id:"claude-desktop",name:"Claude Desktop",color:"#f97316",icon:"monitor",paths:[],agentPaths:[],isInstalled:()=>Q("Claude")},{id:"global-agents",name:"Global",color:"#a3e635",icon:"globe",paths:[{baseDir:(0,p.join)(u,".agents","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>(0,b.existsSync)((0,p.join)(u,".agents","skills"))},{id:"aider",name:"Aider",color:"#eab308",icon:"wrench",paths:[],agentPaths:[],isInstalled:()=>F("aider")}];var C={"claude-code":{viewBox:"0 0 24 24",paths:''},cursor:{viewBox:"0 0 466.73 532.09",paths:''},windsurf:{viewBox:"0 0 24 24",paths:''},codex:{viewBox:"0 0 24 24",paths:''},copilot:{viewBox:"0 0 24 24",paths:''},opencode:{viewBox:"0 0 24 36",paths:''},"claude-desktop":{viewBox:"0 0 24 24",paths:''},"global-agents":{viewBox:"0 0 24 24",paths:''},goose:{viewBox:"0 0 24 24",paths:''},cline:{viewBox:"0 0 24 24",paths:''},continue:{viewBox:"0 0 26 24",paths:''},"roo-code":{viewBox:"0 0 96 96",paths:''},replit:{viewBox:"0 0 24 24",paths:''},"gemini-cli":{viewBox:"0 0 24 24",paths:''}};function j(n,e,t=16){let s=C[e];if(!s)return;let i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.setAttribute("viewBox",s.viewBox),i.setAttribute("width",String(t)),i.setAttribute("height",String(t)),i.setAttribute("fill","none"),i.classList.add("as-tool-svg"),i.innerHTML=s.paths,n.appendChild(i)}var ee=class{containerEl;store;onToggleDashboard;onToggleMarketplace;dashboardActive=!1;marketplaceActive=!1;constructor(e,t,s,i){this.containerEl=e,this.store=t,this.onToggleDashboard=s,this.onToggleMarketplace=i}setDashboardActive(e){this.dashboardActive=e,e&&(this.marketplaceActive=!1)}setMarketplaceActive(e){this.marketplaceActive=e,e&&(this.dashboardActive=!1)}render(){this.containerEl.empty(),this.containerEl.addClass("as-sidebar"),this.renderLibrarySection(),this.renderTypeSection(),this.renderToolSection(),this.renderProjectSection(),this.renderCollectionSection(),this.store.hasSkillkit||this.renderSkillkitCta()}renderSection(e,t){let s=this.containerEl.createDiv("as-sidebar-section");s.createDiv({cls:"as-sidebar-title",text:e});for(let i of t){let a=s.createDiv("as-sidebar-item");!this.dashboardActive&&this.isActive(i.filter)&&a.addClass("is-active");let r=a.createSpan("as-sidebar-icon");(0,R.setIcon)(r,i.icon),a.createSpan({cls:"as-sidebar-label",text:i.label}),i.count!==void 0&&a.createSpan({cls:"as-sidebar-count",text:String(i.count)}),a.addEventListener("click",()=>{this.dashboardActive&&this.onToggleDashboard(),this.marketplaceActive&&this.onToggleMarketplace(),this.store.setFilter(i.filter)})}}renderTypeSection(){let e=this.store.getTypeCounts(),s=[{label:"Skills",icon:"sparkles",type:"skill"},{label:"Commands",icon:"terminal",type:"command"},{label:"Agents",icon:"bot",type:"agent"},{label:"Rules",icon:"scroll",type:"rule"}].filter(i=>e.has(i.type)).map(i=>({label:i.label,icon:i.icon,filter:{kind:"type",type:i.type},count:e.get(i.type)||0}));s.length>0&&this.renderSection("Types",s)}renderToolSection(){let e=this.store.getToolCounts(),t=E.filter(i=>i.isInstalled()&&e.has(i.id));if(t.length===0)return;let s=this.containerEl.createDiv("as-sidebar-section");s.createDiv({cls:"as-sidebar-title",text:"Tools"});for(let i of t){let a={kind:"tool",toolId:i.id},r=s.createDiv("as-sidebar-item");!this.dashboardActive&&this.isActive(a)&&r.addClass("is-active");let l=r.createSpan("as-sidebar-icon");C[i.id]?j(l,i.id,14):(0,R.setIcon)(l,i.icon),r.createSpan({cls:"as-sidebar-label",text:i.name}),r.createSpan({cls:"as-sidebar-count",text:String(e.get(i.id)||0)}),r.addEventListener("click",()=>{this.dashboardActive&&this.onToggleDashboard(),this.store.setFilter(a)})}}renderProjectSection(){let e=this.store.getProjectCounts();if(e.size===0)return;let t=[];for(let[s,i]of e)t.push({label:s,icon:"folder-git-2",filter:{kind:"project",project:s},count:i});t.sort((s,i)=>s.label.localeCompare(i.label)),this.renderSection("Projects",t)}renderCollectionSection(){let e=this.containerEl.createDiv("as-sidebar-section");e.createDiv({cls:"as-sidebar-title",text:"Collections"});let t=new Set;for(let s of this.store.allItems)for(let i of s.collections)t.add(i);if(t.size===0){e.createDiv({cls:"as-sidebar-empty",text:"No collections yet"});return}for(let s of t){let i={kind:"collection",name:s},a=e.createDiv("as-sidebar-item");!this.dashboardActive&&this.isActive(i)&&a.addClass("is-active");let r=a.createSpan("as-sidebar-icon");(0,R.setIcon)(r,"folder"),a.createSpan({cls:"as-sidebar-label",text:s}),a.addEventListener("click",()=>{this.dashboardActive&&this.onToggleDashboard(),this.store.setFilter(i)})}}renderLibrarySection(){let e=this.containerEl.createDiv("as-sidebar-section");e.createDiv({cls:"as-sidebar-title",text:"Library"});let t=[{label:"All Skills",icon:"layers",filter:{kind:"all"}},{label:"Favorites",icon:"star",filter:{kind:"favorites"}}],s=this.dashboardActive||this.marketplaceActive;for(let o of t){let c=e.createDiv("as-sidebar-item");!s&&this.isActive(o.filter)&&c.addClass("is-active");let d=c.createSpan("as-sidebar-icon");(0,R.setIcon)(d,o.icon),c.createSpan({cls:"as-sidebar-label",text:o.label}),c.addEventListener("click",()=>{this.dashboardActive&&this.onToggleDashboard(),this.marketplaceActive&&this.onToggleMarketplace(),this.store.setFilter(o.filter)})}let i=e.createDiv("as-sidebar-item");this.dashboardActive&&i.addClass("is-active");let a=i.createSpan("as-sidebar-icon");(0,R.setIcon)(a,"bar-chart-2"),i.createSpan({cls:"as-sidebar-label",text:"Dashboard"}),i.addEventListener("click",()=>{this.marketplaceActive&&this.onToggleMarketplace(),this.dashboardActive||this.onToggleDashboard()});let r=e.createDiv("as-sidebar-item");this.marketplaceActive&&r.addClass("is-active");let l=r.createSpan("as-sidebar-icon");(0,R.setIcon)(l,"shopping-bag"),r.createSpan({cls:"as-sidebar-label",text:"Marketplace"}),r.addEventListener("click",()=>{this.dashboardActive&&this.onToggleDashboard(),this.marketplaceActive||this.onToggleMarketplace()})}renderSkillkitCta(){let e=this.containerEl.createDiv("as-skillkit-cta"),t=e.createDiv("as-skillkit-icon");(0,R.setIcon)(t,"bar-chart-2"),e.createDiv({cls:"as-skillkit-title",text:"Unlock analytics"}),e.createDiv({cls:"as-skillkit-desc",text:"Install skillkit to see usage stats, stale badges, and heavy skill warnings."}),e.createDiv("as-skillkit-cmd").createEl("code",{text:"npm i -g skillkit"}),e.createEl("a",{cls:"as-skillkit-link",text:"Learn more",href:"https://www.npmjs.com/package/skillkit"}).addEventListener("click",a=>{a.preventDefault(),je.shell.openExternal("https://www.npmjs.com/package/skillkit")})}isActive(e){let t=this.store.filter;return t.kind!==e.kind?!1:t.kind==="tool"&&e.kind==="tool"?t.toolId===e.toolId:t.kind==="type"&&e.kind==="type"?t.type===e.type:t.kind==="collection"&&e.kind==="collection"?t.name===e.name:t.kind==="project"&&e.kind==="project"?t.project===e.project:!0}};var U=require("obsidian");var te=class{containerEl;store;onSelect;selectedId=null;inputEl=null;deepToggleEl=null;listEl=null;typeFilter=null;sortBy="name";dropdownEl=null;constructor(e,t,s){this.containerEl=e,this.store=t,this.onSelect=s}setSelected(e){this.selectedId=e}render(){if(!this.inputEl){this.containerEl.empty(),this.containerEl.addClass("as-list");let e=this.containerEl.createDiv("as-search");this.inputEl=e.createEl("input",{type:"text",placeholder:"Search skills...",cls:"as-search-input"}),this.inputEl.addEventListener("input",()=>{this.store.setSearch(this.inputEl.value)}),this.deepToggleEl=e.createDiv("as-deep-toggle"),(0,U.setIcon)(this.deepToggleEl,"search-code"),this.deepToggleEl.setAttribute("aria-label","Toggle deep search"),this.deepToggleEl.addEventListener("click",()=>{this.store.setDeepSearch(!this.store.deepSearch),this.updateDeepToggle()});let t=e.createDiv("as-filter-btn");(0,U.setIcon)(t,"filter"),t.setAttribute("aria-label","Filter by status"),t.addEventListener("click",i=>{i.stopPropagation(),this.toggleDropdown(t)});let s=e.createDiv("as-filter-btn");(0,U.setIcon)(s,this.sortBy==="usage"?"arrow-down-wide-narrow":"arrow-down-a-z"),s.setAttribute("aria-label",this.sortBy==="usage"?"Sorted by usage":"Sorted by name"),s.addEventListener("click",()=>{this.sortBy=this.sortBy==="name"?"usage":"name",(0,U.setIcon)(s,this.sortBy==="usage"?"arrow-down-wide-narrow":"arrow-down-a-z"),s.setAttribute("aria-label",this.sortBy==="usage"?"Sorted by usage":"Sorted by name"),this.renderList()}),this.listEl=this.containerEl.createDiv("as-list-items")}this.inputEl.value=this.store.searchQuery,this.updateDeepToggle(),this.renderList()}updateDeepToggle(){this.deepToggleEl&&(this.deepToggleEl.toggleClass("is-active",this.store.deepSearch),this.deepToggleEl.setAttribute("aria-label",this.store.deepSearch?"Deep search enabled \u2014 click to search names only":"Deep search disabled \u2014 click to search file content"))}toggleDropdown(e){if(this.dropdownEl){this.dropdownEl.remove(),this.dropdownEl=null;return}this.dropdownEl=e.createDiv("as-filter-dropdown");let t=[{id:"all",label:"All",cls:""},{id:"stale",label:"Stale",cls:"as-badge-stale"},{id:"heavy",label:"Heavy",cls:"as-badge-heavy"},{id:"oversized",label:"Oversized",cls:"as-badge-warn"},{id:"conflict",label:"Conflict",cls:"as-badge-conflict"}];for(let i of t){let a=this.dropdownEl.createDiv("as-filter-option");(i.id==="all"&&!this.typeFilter||i.id===this.typeFilter)&&a.addClass("is-active"),i.cls?a.createSpan({cls:i.cls,text:i.label}):a.setText(i.label),a.addEventListener("click",r=>{r.stopPropagation(),this.typeFilter=i.id==="all"?null:i.id,this.dropdownEl&&(this.dropdownEl.remove(),this.dropdownEl=null),this.renderList()})}let s=()=>{this.dropdownEl&&(this.dropdownEl.remove(),this.dropdownEl=null),document.removeEventListener("click",s)};setTimeout(()=>document.addEventListener("click",s),0)}renderList(){if(!this.listEl)return;this.listEl.empty();let e=this.store.filteredItems;if(this.typeFilter)switch(this.typeFilter){case"stale":e=e.filter(t=>t.usage?.isStale);break;case"heavy":e=e.filter(t=>t.usage?.isHeavy);break;case"oversized":e=e.filter(t=>t.warnings?.oversized);break;case"conflict":e=e.filter(t=>t.conflicts&&t.conflicts.length>0);break}if(this.sortBy==="usage"&&(e=[...e].sort((t,s)=>(s.usage?.uses??0)-(t.usage?.uses??0))),this.typeFilter){let t={stale:"Stale",heavy:"Heavy",oversized:"Oversized",conflict:"Conflict"},s=this.listEl.createDiv("as-active-filter");s.createSpan({text:`Showing: ${t[this.typeFilter]??this.typeFilter}`}),s.createSpan({cls:"as-filter-clear",text:"Clear"}).addEventListener("click",()=>{this.typeFilter=null,this.renderList()})}if(e.length===0){this.listEl.createDiv({cls:"as-list-empty",text:"No skills found"});return}for(let t of e)this.renderCard(this.listEl,t)}renderCard(e,t){let s=e.createDiv("as-skill-card");t.id===this.selectedId&&s.addClass("is-selected");let i=s.createDiv("as-skill-header");if(i.createSpan({cls:"as-skill-name",text:t.name}),t.isFavorite){let r=i.createSpan("as-skill-star");(0,U.setIcon)(r,"star")}t.description&&s.createDiv({cls:"as-skill-desc",text:t.description.length>80?t.description.slice(0,80)+"...":t.description});let a=s.createDiv("as-skill-meta");a.createSpan({cls:`as-type-tag as-type-${t.type}`,text:t.type});for(let r of t.tools){let l=E.find(c=>c.id===r);if(!l)continue;let o=a.createSpan("as-tool-badge");o.title=l.name,o.setAttribute("aria-label",l.name),o.setCssProps({"--tool-color":l.color}),C[r]?j(o,r,12):o.addClass("as-tool-badge-dot")}t.usage&&(t.usage.uses>0&&a.createSpan({cls:"as-usage-badge",text:`${t.usage.uses}`,attr:{"aria-label":`Used ${t.usage.uses} times`}}),t.usage.isStale&&a.createSpan({cls:"as-badge-stale",text:"stale"}),t.usage.isHeavy&&a.createSpan({cls:"as-badge-heavy",text:"heavy"})),t.warnings?.oversized&&a.createSpan({cls:"as-badge-warn",text:"oversized"}),t.conflicts&&t.conflicts.length>0&&a.createSpan({cls:"as-badge-conflict",text:"conflict"}),s.addEventListener("click",()=>{this.selectedId=t.id,this.onSelect(t)})}};var y=require("obsidian"),Je=require("fs"),Ze=require("electron");var ke=require("child_process"),_=require("fs"),k=require("path"),Re=require("os"),I=(0,Re.homedir)(),Pt=(0,k.join)(I,".skillkit","analytics.db");function Oe(){let n=["/usr/local/bin","/opt/homebrew/bin",(0,k.join)(I,".local","bin"),(0,k.join)(I,".bun","bin")],e=(0,k.join)(I,".nvm","versions","node");try{for(let s of(0,_.readdirSync)(e))n.push((0,k.join)(e,s,"bin"))}catch{}let t=(0,k.join)(I,".local","share","mise","installs");for(let s of["node","bun"])try{for(let i of(0,_.readdirSync)((0,k.join)(t,s)))n.push((0,k.join)(t,s,i,"bin"))}catch{}return[...n,process.env.PATH||""].join(":")}function It(){let n=["/usr/local/bin/skillkit","/opt/homebrew/bin/skillkit",(0,k.join)(I,".local","bin","skillkit"),(0,k.join)(I,".bun","bin","skillkit"),(0,k.join)(I,".local","share","mise","shims","skillkit")];for(let s of n)if((0,_.existsSync)(s))return s;let e=(0,k.join)(I,".nvm","versions","node");try{for(let s of(0,_.readdirSync)(e)){let i=(0,k.join)(e,s,"bin","skillkit");if((0,_.existsSync)(i))return i}}catch{}let t=(0,k.join)(I,".local","share","mise","installs");for(let s of["node","bun"])try{for(let i of(0,_.readdirSync)((0,k.join)(t,s))){let a=(0,k.join)(t,s,i,"bin","skillkit");if((0,_.existsSync)(a))return a}}catch{}return null}var be;function Se(){return be===void 0&&(be=It()),be}function L(){return Se()!==null||(0,_.existsSync)(Pt)}function $(n){let e=Se();if(!e)return null;try{let t=(0,ke.execSync)(`${e} ${n} --json`,{encoding:"utf-8",timeout:15e3,env:{...process.env,NO_COLOR:"1",PATH:Oe()},stdio:["pipe","pipe","pipe"]}).trim(),s=t.indexOf("{"),i=t.indexOf("["),a=s===-1?i:i===-1?s:Math.min(s,i);return a===-1?null:JSON.parse(t.slice(a))}catch{return null}}function Ne(){let n=new Map;if(!L())return n;let e=$("stats");if(!e?.top_skills)return n;let t=Date.now();for(let s of e.top_skills){let i=s.daily.length>0?s.daily[s.daily.length-1]?.date:null,a=null;i&&(a=Math.floor((t-new Date(i).getTime())/(1e3*60*60*24))),n.set(s.name,{uses:s.total,lastUsed:i||null,daysSinceUsed:a,isStale:a!==null&&a>30,isHeavy:!1,daily:s.daily})}return n}function Be(){let n=new Map;if(!L())return n;let e=$("conflicts --dry-run");if(!e||!("pairs"in e))return n;for(let t of e.pairs)n.has(t.skill_a)||n.set(t.skill_a,[]),n.has(t.skill_b)||n.set(t.skill_b,[]),n.get(t.skill_a).push({skillName:t.skill_b,similarity:t.similarity}),n.get(t.skill_b).push({skillName:t.skill_a,similarity:t.similarity});return n}function ze(n){if(!L())return[];let e=$(`trace --list --skill ${n} --limit 5`);return Array.isArray(e)?e.map(t=>({traceId:t.trace_id,timestamp:t.timestamp,tokens:t.tokens_total,cost:t.cost_estimate,duration:t.duration_ms,model:t.model||"unknown"})):[]}function We(){if(!L())return{oversized:[],longDesc:[]};let n=$("health");return n?.warnings?{oversized:n.warnings.oversized||[],longDesc:n.warnings.long_descriptions||[]}:{oversized:[],longDesc:[]}}function G(n){let e=Se();if(!e)return{success:!1,output:"skillkit not found"};try{return{success:!0,output:(0,ke.execSync)(`${e} ${n}`,{encoding:"utf-8",timeout:3e4,env:{...process.env,NO_COLOR:"1",PATH:Oe()},stdio:["pipe","pipe","pipe"]}).trim()}}catch(t){return{success:!1,output:t instanceof Error?t.message:"unknown error"}}}function ye(n){if(!n)return"never";let e=Date.now()-new Date(n).getTime(),t=Math.floor(e/6e4);if(t<60)return`${t}m ago`;let s=Math.floor(t/60);if(s<24)return`${s}h ago`;let i=Math.floor(s/24);return i<30?`${i}d ago`:`${Math.floor(i/30)}mo ago`}function Ve(n,e,t=48,s=16){if(e.length===0)return;let i=Math.max(...e,1),a=e.map((o,c)=>{let d=c/(e.length-1||1)*t,m=s-o/i*s;return`${d.toFixed(1)},${m.toFixed(1)}`}),r=document.createElementNS("http://www.w3.org/2000/svg","svg");r.setAttribute("viewBox",`0 0 ${t} ${s}`),r.setAttribute("width",String(t)),r.setAttribute("height",String(s)),r.classList.add("as-sparkline");let l=document.createElementNS("http://www.w3.org/2000/svg","polyline");l.setAttribute("points",a.join(" ")),l.setAttribute("fill","none"),l.setAttribute("stroke","currentColor"),l.setAttribute("stroke-width","1.5"),l.setAttribute("stroke-linecap","round"),l.setAttribute("stroke-linejoin","round"),r.appendChild(l),n.appendChild(r)}var Ue=require("obsidian");function B(n,e,t,s){new we(n,e,t,s).open()}var we=class extends Ue.Modal{title;message;onConfirm;constructor(e,t,s,i){super(e),this.title=t,this.message=s,this.onConfirm=i}onOpen(){let{contentEl:e}=this;e.addClass("as-confirm-modal"),e.createEl("p",{cls:"as-confirm-title",text:this.title}),e.createEl("p",{cls:"as-confirm-message",text:this.message});let t=e.createDiv("as-confirm-buttons");t.createEl("button",{cls:"as-confirm-cancel",text:"Cancel"}).addEventListener("click",()=>this.close()),t.createEl("button",{cls:"as-confirm-action mod-warning",text:"Confirm"}).addEventListener("click",()=>{this.close(),this.onConfirm()})}onClose(){this.contentEl.empty()}};function _t(n){return Math.ceil(n.length/4)}function At(n){return n<1024?`${n} B`:n<1024*1024?`${(n/1024).toFixed(1)} KB`:`${(n/(1024*1024)).toFixed(1)} MB`}function Ge(n){return n>=1e3?`${(n/1e3).toFixed(1)}k`:String(n)}function Ht(n){return new Date(n).toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}var se=class{containerEl;store;settings;saveSettings;currentItem=null;isEditing=!1;app;constructor(e,t,s,i,a){this.containerEl=e,this.store=t,this.settings=s,this.saveSettings=i,this.app=a.app}show(e){this.currentItem=e,this.isEditing=!1,this.render()}clear(){this.currentItem=null,this.containerEl.empty(),this.containerEl.addClass("as-detail");let e=this.containerEl.createDiv("as-detail-empty");(0,y.setIcon)(e.createDiv("as-detail-empty-icon"),"file-text"),e.createDiv({text:"Select a skill to view"})}render(){this.containerEl.empty(),this.containerEl.addClass("as-detail");let e=this.currentItem;if(!e)return this.clear();this.renderToolbar(e),this.isEditing?this.renderEditor(e):this.renderPreview(e)}renderToolbar(e){let t=this.containerEl.createDiv("as-detail-toolbar"),s=t.createDiv("as-toolbar-top"),i=s.createDiv("as-toolbar-left");i.createSpan({cls:"as-detail-title",text:e.name});for(let g of e.tools){let f=E.find(fe=>fe.id===g);if(!f)continue;let W=i.createSpan("as-tool-name-badge");W.setCssProps({"--tool-color":f.color}),C[g]&&j(W,g,12),W.createSpan({text:f.name})}let a=s.createDiv("as-toolbar-right"),r=a.createEl("button",{cls:"as-toolbar-btn",attr:{"aria-label":"Toggle favorite"}});(0,y.setIcon)(r,e.isFavorite?"star":"star-off"),r.addEventListener("click",()=>{this.store.toggleFavorite(e.id,this.settings),this.saveSettings(),this.render()});let l=a.createEl("button",{cls:"as-toolbar-btn",attr:{"aria-label":this.isEditing?"Preview":"Edit"}});(0,y.setIcon)(l,this.isEditing?"eye":"pencil"),l.addEventListener("click",()=>{this.isEditing=!this.isEditing,this.render()});let o=a.createEl("button",{cls:"as-toolbar-btn",attr:{"aria-label":"Show in system explorer"}});if((0,y.setIcon)(o,"folder-open"),o.addEventListener("click",()=>{Ze.shell.showItemInFolder(e.filePath)}),L()){let g=a.createEl("button",{cls:"as-toolbar-btn as-toolbar-btn-danger",attr:{"aria-label":"Remove skill"}});(0,y.setIcon)(g,"trash-2"),g.addEventListener("click",()=>{B(this.app,"Remove skill",`Remove "${e.name}"? This will delete the skill files.`,()=>{let f=G(`prune --skill ${e.name} --yes`);f.success?(new y.Notice(`Removed ${e.name}`,5e3),this.store.refresh(this.settings),this.clear()):new y.Notice(`Failed to remove: ${f.output}`,5e3)})})}let c=t.createDiv("as-detail-meta-bar"),d=_t(e.content),m=e.content.length;if(c.createSpan({cls:"as-meta-item",text:At(e.fileSize)}),c.createSpan({cls:"as-meta-item",text:`${Ge(m)} chars`}),c.createSpan({cls:"as-meta-item",text:`~${Ge(d)} tokens`}),c.createSpan({cls:"as-meta-item",text:Ht(e.lastModified)}),c.createSpan({cls:"as-meta-item as-meta-type",text:e.type}),e.usage&&e.usage.uses>0){let g=t.createDiv("as-detail-usage-bar");g.createSpan({cls:"as-usage-stat",text:`${e.usage.uses} uses`}),g.createSpan({cls:"as-usage-stat",text:`last: ${ye(e.usage.lastUsed)}`}),e.usage.isStale&&g.createSpan({cls:"as-badge-stale",text:"stale"}),e.usage.isHeavy&&g.createSpan({cls:"as-badge-heavy",text:"heavy"})}}renderFrontmatter(e,t){let s=Object.keys(t.frontmatter),i=e.createDiv("as-frontmatter");if(t.filePath){let a=i.createDiv("as-fm-prop");a.createSpan({cls:"as-fm-key",text:"path"}),a.createSpan({cls:"as-fm-value",text:t.filePath})}if(!(s.length===0&&!t.filePath))for(let a of s){let r=t.frontmatter[a];if(r==null)continue;let l=i.createDiv("as-fm-prop");l.createSpan({cls:"as-fm-key",text:a});let o=typeof r=="object"||Array.isArray(r)?JSON.stringify(r):String(r);o.length>200?l.createDiv({cls:"as-fm-value-long",text:o}):l.createSpan({cls:"as-fm-value",text:o})}}renderPreview(e){let t=this.containerEl.createDiv("as-detail-body");this.renderFrontmatter(t,e),this.renderWarnings(t,e),this.renderUsageSection(t,e),this.renderConflicts(t,e),this.renderTraces(t,e);let s=t.createDiv("as-detail-preview markdown-rendered");y.MarkdownRenderer.render(this.app,e.content,s,e.filePath,this)}renderWarnings(e,t){let s=[];if(t.warnings?.oversized&&s.push(`${t.warnings.lineCount} lines (recommended: <500)`),t.warnings?.longDesc&&s.push(`Description is ${t.warnings.descChars} chars (recommended: <1024)`),t.conflicts&&t.conflicts.length>0){let l=t.conflicts.map(o=>o.skillName).join(", ");s.push(`Conflicts with: ${l}`)}if(s.length===0)return;let i=e.createDiv("as-warnings"),a=i.createDiv("as-warnings-icon");(0,y.setIcon)(a,"alert-triangle");let r=i.createDiv("as-warnings-list");for(let l of s)r.createDiv({cls:"as-warnings-item",text:l})}renderUsageSection(e,t){if(!t.usage||t.usage.uses===0)return;let s=e.createDiv("as-usage-section"),i=s.createDiv("as-usage-left");if(i.createSpan({cls:"as-usage-count",text:String(t.usage.uses)}),i.createSpan({cls:"as-usage-label",text:"uses"}),i.createSpan({cls:"as-usage-last",text:ye(t.usage.lastUsed)}),t.usage.daily&&t.usage.daily.length>1){let a=s.createDiv("as-usage-spark");Ve(a,t.usage.daily.map(r=>r.count),80,20)}}renderConflicts(e,t){if(!t.conflicts||t.conflicts.length===0)return;let s=e.createDiv("as-conflicts-section");s.createDiv({cls:"as-section-title",text:`Conflicts (${t.conflicts.length})`});for(let i of t.conflicts){let a=s.createDiv("as-conflict-row");a.createSpan({cls:"as-conflict-name",text:i.skillName}),a.createDiv("as-conflict-bar-wrap").createDiv("as-conflict-bar").setCssProps({"--bar-w":`${(i.similarity*100).toFixed(0)}%`}),a.createSpan({cls:"as-conflict-score",text:`${(i.similarity*100).toFixed(0)}%`})}}renderTraces(e,t){if(!L())return;let s=ze(t.name);if(s.length===0)return;let i=e.createDiv("as-traces-section");i.createDiv({cls:"as-section-title",text:`Recent traces (${s.length})`});let a=i.createDiv("as-traces-table");for(let r of s){let l=a.createDiv("as-trace-row"),o=new Date(r.timestamp);l.createSpan({cls:"as-trace-date",text:o.toLocaleDateString(void 0,{month:"short",day:"numeric"})}),l.createSpan({cls:"as-trace-model",text:r.model.replace("claude-","").replace("-4-6","")}),l.createSpan({cls:"as-trace-tokens",text:`${(r.tokens/1e3).toFixed(1)}k`}),l.createSpan({cls:"as-trace-cost",text:r.cost>0?`$${r.cost.toFixed(2)}`:""}),l.createSpan({cls:"as-trace-duration",text:`${(r.duration/1e3).toFixed(1)}s`})}i.createDiv({cls:"as-traces-hint",text:"skillkit trace --list --skill "+t.name})}renderPruneAction(e,t){let s=e.createDiv("as-prune-section"),i=s.createEl("button",{cls:"as-prune-btn",text:"Remove this skill"});s.createSpan({cls:"as-prune-hint",text:"This skill hasn't been used in 30+ days"}),i.addEventListener("click",()=>{B(this.app,"Remove skill",`Remove "${t.name}"? This will delete the skill files.`,()=>{let a=G(`prune --skill ${t.name} --yes`);a.success?(new y.Notice(`Removed ${t.name}`,5e3),this.store.refresh(this.settings)):new y.Notice(`Failed to remove: ${a.output}`,5e3)})})}renderEditor(e){let t=this.containerEl.createDiv("as-detail-body as-detail-body-editor"),s=t.createEl("textarea",{cls:"as-editor-textarea"});s.value=e.content,s.spellcheck=!1,s.addEventListener("keydown",r=>{if((r.metaKey||r.ctrlKey)&&r.key==="s"&&(r.preventDefault(),this.saveFile(e,s.value)),r.key==="Tab"){r.preventDefault();let l=s.selectionStart,o=s.selectionEnd;s.value=s.value.substring(0,l)+" "+s.value.substring(o),s.selectionStart=s.selectionEnd=l+1}});let i=t.createDiv("as-save-bar");i.createEl("button",{cls:"as-save-btn",text:"Save"}).addEventListener("click",()=>{this.saveFile(e,s.value)}),i.createSpan({cls:"as-save-hint",text:"Cmd+S to save"})}saveFile(e,t){try{(0,Je.writeFileSync)(e.filePath,t,"utf-8"),e.content=t,new y.Notice(`Saved ${e.name}`,5e3)}catch(s){new y.Notice(`Failed to save: ${s instanceof Error?s.message:String(s)}`,5e3)}}};var A=require("obsidian"),rt=require("electron");var De=require("child_process"),w=require("fs"),S=require("path"),Xe=require("os"),q=require("obsidian"),x=(0,Xe.homedir)(),Ke=(0,S.join)(x,".agents",".skill-lock.json"),$t="https://skills.sh/api";async function xe(n){if(n.length<2)return[];try{let t=(await(0,q.requestUrl)({url:`${$t}/search?q=${encodeURIComponent(n)}&limit=30`})).json;if(!t.skills)return[];let s=st();return t.skills.map(i=>({...i,installed:s.has(i.name)}))}catch{return[]}}var Qe=new Map;async function Ft(n){let e=Qe.get(n);if(e)return e;let s=(await(0,q.requestUrl)({url:`https://api.github.com/repos/${n}`})).json.default_branch||"main",a=(await(0,q.requestUrl)({url:`https://api.github.com/repos/${n}/git/trees/${s}?recursive=1`})).json.tree.filter(l=>l.path.endsWith("/SKILL.md")).map(l=>l.path),r={branch:s,files:a};return Qe.set(n,r),r}function jt(n,e,t){let s=e.split("/"),i=s[s.length-1]||n,a=new Set([i,n]);for(let r of t.split("/")){n.startsWith(r+"-")&&a.add(n.slice(r.length+1));for(let l of r.split("-"))n.startsWith(l+"-")&&a.add(n.slice(l.length+1))}return a}async function Ye(n,e,t){try{let{branch:s,files:i}=await Ft(n),a=jt(e,t,n),r=i.find(c=>{let d=c.replace("/SKILL.md","").split("/").pop()||"";return a.has(d)});r||(r=i.find(c=>{let d=c.replace("/SKILL.md","").split("/").pop()||"";return e.includes(d)||d.includes(e)}));let l=r||`skills/${e}/SKILL.md`;return(await(0,q.requestUrl)({url:`https://raw.githubusercontent.com/${n}/${s}/${l}`})).text}catch{return null}}async function et(){let n=["react","next","clerk","stripe","ai"],e=new Set,t=[];for(let s of n){let i=await xe(s);for(let a of i)e.has(a.id)||(e.add(a.id),t.push(a))}return t.sort((s,i)=>i.installs-s.installs).slice(0,20)}function Rt(){let n=["/usr/local/bin","/opt/homebrew/bin",(0,S.join)(x,".local","bin"),(0,S.join)(x,".bun","bin")],e=(0,S.join)(x,".nvm","versions","node");try{for(let t of(0,w.readdirSync)(e))n.push((0,S.join)(e,t,"bin"))}catch{}return[...n,process.env.PATH||""].join(":")}function qe(){let n=(0,S.join)(x,".bun","bin","bunx");return(0,w.existsSync)(n)?n:(0,w.existsSync)("/usr/local/bin/bunx")||(0,w.existsSync)("/opt/homebrew/bin/bunx")?"bunx":"npx"}function Ee(n="auto"){return n==="npx"?"npx":qe()}var tt=[{id:"claude-code",label:"Claude Code"},{id:"cursor",label:"Cursor"},{id:"codex",label:"Codex"},{id:"github-copilot",label:"GitHub Copilot"},{id:"windsurf",label:"Windsurf"},{id:"amp",label:"Amp"},{id:"opencode",label:"OpenCode"},{id:"cline",label:"Cline"},{id:"gemini-cli",label:"Gemini CLI"},{id:"goose",label:"Goose"},{id:"kiro-cli",label:"Kiro"},{id:"roo",label:"Roo Code"},{id:"continue",label:"Continue"},{id:"antigravity",label:"Antigravity"},{id:"warp",label:"Warp"},{id:"pi",label:"Pi"},{id:"replit",label:"Replit"}],ie={"claude-code":"claude-code",cursor:"cursor",codex:"codex",copilot:"github-copilot",windsurf:"windsurf",amp:"amp",opencode:"opencode",antigravity:"antigravity","claude-desktop":"claude-code",pi:"pi","global-agents":"claude-code",aider:"claude-code"};function st(){let n=new Set;if(!(0,w.existsSync)(Ke))return n;try{let e=JSON.parse((0,w.readFileSync)(Ke,"utf-8"));if(e.skills)for(let t of Object.keys(e.skills))n.add(t)}catch{}return n}var Ot=[(0,S.join)(x,".claude","skills"),(0,S.join)(x,".cursor","skills"),(0,S.join)(x,".codex","skills"),(0,S.join)(x,".codeium","windsurf","skills"),(0,S.join)(x,".config","amp","skills"),(0,S.join)(x,".config","opencode","skills"),(0,S.join)(x,".copilot","skills"),(0,S.join)(x,".agents","skills")];function Nt(n){for(let e of Ot){let t=(0,S.join)(e,n);if((0,w.existsSync)(t))try{(0,w.rmSync)(t,{recursive:!0,force:!0})}catch{}}Bt(n)}function Bt(n){let e=(0,S.join)(x,".agents",".skill-lock.json");if((0,w.existsSync)(e))try{let t=JSON.parse((0,w.readFileSync)(e,"utf-8"));t.skills&&t.skills[n]&&(delete t.skills[n],(0,w.writeFileSync)(e,JSON.stringify(t,null,2)+`
-`,"utf-8"))}catch{}}function ne(n){let e=st();for(let t of n)t.installed=e.has(t.name);return n}function Ce(n,e=12e4){return new Promise(t=>{(0,De.exec)(n,{encoding:"utf-8",timeout:e,env:{...process.env,PATH:Rt(),NO_COLOR:"1"}},(s,i)=>{let a=String(i??"");!s||a.includes("Done")||a.includes("Installed")||a.includes("Removed")||a.includes("Updated")?t({success:!0,output:a}):t({success:!1,output:s?.message??"Command failed"})})})}async function it(n,e,t={}){let s=e.length>0?`-a ${e.join(" ")}`:"-a '*'",i=t.global?"-g":"",r=`${Ee(t.runner||"auto")} skills add ${n} ${s} ${i} -y`.replace(/\s+/g," ").trim();return Ce(r)}async function nt(n,e="auto"){let s=`${Ee(e)} skills remove ${n} -y`,i=await Ce(s,3e4);return Nt(n),{success:!0,output:i.output||`Cleaned ${n}`}}async function at(n="auto"){let t=`${Ee(n)} skills update`,s=await Ce(t),i=s.output.match(/Updated (\d+) skill/);return{...s,count:i?parseInt(i[1]):0}}function Le(n){return n>=1e6?`${(n/1e6).toFixed(1)}M`:n>=1e3?`${(n/1e3).toFixed(1)}K`:String(n)}var J=require("fs"),ot=require("path"),lt=require("os");function zt(){let n=$("stats"),e=$("health"),t=$("burn"),s=$("context");return{stats:n,health:e,burn:t&&t.length>0?t[0]:null,context:s}}var Te=(0,ot.join)((0,lt.homedir)(),".skillkit","dashboard-cache.json"),H=null,O=null;function Wt(){if(!H&&(0,J.existsSync)(Te))try{let n=JSON.parse((0,J.readFileSync)(Te,"utf-8"));H=n.data,O=n.cachedAt}catch{}}function Vt(){if(H)try{(0,J.writeFileSync)(Te,JSON.stringify({data:H,cachedAt:O},null,2),"utf-8")}catch{}}Wt();var ae=class{containerEl;app;constructor(e,t){this.containerEl=e,this.app=t}render(){if(this.containerEl.empty(),this.containerEl.addClass("as-dashboard"),!L()){this.renderNoSkillkit();return}if(H)this.renderDashboard(H);else{let e=this.containerEl.createDiv("as-dash-loading");e.createDiv("as-dash-spinner"),e.createDiv({cls:"as-dash-loading-text",text:"Loading analytics..."}),setTimeout(()=>{let t=zt();H=t,O=Date.now(),Vt(),e.remove(),this.renderDashboard(t)},10)}}renderDashboard(e){if(this.renderActionBar(e),e.stats&&this.renderOverview(e.stats,e.health),e.stats&&this.renderTopSkills(e.stats),e.health||e.context){let t=this.containerEl.createDiv("as-dash-row");e.health&&this.renderHealth(e.health,t),e.context&&this.renderContext(e.context,t)}e.burn&&this.renderBurn(e.burn),e.health&&this.renderStale(e.health)}renderActionBar(e){let t=this.containerEl.createDiv("as-dash-action-bar");if(O){let r=Math.round((Date.now()-O)/1e3),l=r<5?"just now":r<60?`${r}s ago`:`${Math.round(r/60)}m ago`;t.createSpan({cls:"as-dash-updated",text:`Updated ${l}`})}let s=t.createDiv("as-dash-action-buttons"),i=s.createEl("button",{cls:"as-action-btn",text:"Update skills"});i.addEventListener("click",()=>{i.setText("Updating..."),i.disabled=!0,at().then(r=>{if(r.success){let l=r.count>0?`Updated ${r.count} skill(s)`:"All skills up to date";new A.Notice(l,5e3),H=null,O=null,this.render()}else new A.Notice(`Update failed: ${r.output}`,5e3);i.setText("Update skills"),i.disabled=!1})});let a=s.createEl("button",{cls:"as-action-btn",text:"Scan sessions"});if(a.addEventListener("click",()=>{a.setText("Scanning..."),a.disabled=!0,setTimeout(()=>{let r=G("scan");r.success?(new A.Notice("Scan complete",5e3),H=null,O=null,this.render()):new A.Notice(`Scan failed: ${r.output}`,5e3),a.setText("Scan sessions"),a.disabled=!1},10)}),e.health&&e.health.usage.unused_30d>0){let r=s.createEl("button",{cls:"as-action-btn as-action-btn-danger",text:`Prune ${e.health.usage.unused_30d} stale`});r.addEventListener("click",()=>{B(this.app,"Prune stale skills",`Remove ${e.health.usage.unused_30d} unused skills? This cannot be undone.`,()=>{r.setText("Pruning..."),r.disabled=!0,setTimeout(()=>{let l=G("prune --yes");l.success?(new A.Notice("Pruned stale skills",5e3),H=null,O=null,this.render()):new A.Notice(`Prune failed: ${l.output}`,5e3),r.setText(`Prune ${e.health.usage.unused_30d} stale`),r.disabled=!1},10)})})}}renderNoSkillkit(){let e=this.containerEl.createDiv("as-dash-empty"),t=e.createDiv("as-dash-empty-icon");(0,A.setIcon)(t,"bar-chart-2"),e.createEl("h3",{text:"Dashboard requires skillkit"}),e.createEl("p",{text:"Install skillkit to unlock usage analytics, burn rate, context tax, and more."}),e.createDiv("as-dash-install-cmd").createEl("code",{text:"npm i -g @crafter/skillkit && skillkit scan"}),e.createEl("a",{cls:"as-skillkit-link",text:"Learn more",href:"https://www.npmjs.com/package/@crafter/skillkit"}).addEventListener("click",a=>{a.preventDefault(),rt.shell.openExternal("https://www.npmjs.com/package/@crafter/skillkit")})}renderOverview(e,t){let s=this.containerEl.createDiv("as-dash-section");s.createDiv({cls:"as-dash-title",text:"Overview"});let i=s.createDiv("as-dash-stats");if(this.statCard(i,String(e.total_invocations),"invocations","activity"),this.statCard(i,String(e.unique_skills),"active skills","sparkles"),this.statCard(i,String(t?.installed??0),"installed","package"),this.statCard(i,String(t?.usage.unused_30d??0),"stale","alert-triangle"),e.streak&&e.streak.current>0){let a=s.createDiv("as-dash-streak-row");a.createSpan({cls:"as-streak-value",text:`${e.streak.current} day streak`}),e.streak.current>=7&&a.createSpan({cls:"as-streak-fire",text:"on fire"}),a.createSpan({cls:"as-streak-longest",text:`longest: ${e.streak.longest}d`})}if(e.velocity&&e.velocity.this_week>0){let a=s.createDiv("as-dash-velocity-row");a.createSpan({text:`This week: $${e.velocity.this_week.toFixed(0)}`}),a.createSpan({cls:"as-velocity-vs",text:`vs $${e.velocity.last_week.toFixed(0)} last week`});let r=e.velocity.change_pct,l=r>0?"as-velocity-up":r<0?"as-velocity-down":"",o=r>0?"+":"";a.createSpan({cls:`as-velocity-change ${l}`,text:`${o}${r.toFixed(0)}%`})}}statCard(e,t,s,i){let a=e.createDiv("as-stat-card"),r=a.createDiv("as-stat-icon");(0,A.setIcon)(r,i),a.createDiv({cls:"as-stat-value",text:t}),a.createDiv({cls:"as-stat-label",text:s})}renderTopSkills(e){if(e.top_skills.length===0)return;let t=this.containerEl.createDiv("as-dash-section");t.createDiv({cls:"as-dash-title",text:`Top Skills (${e.period.days}d)`});let s=e.top_skills[0]?.total||1,i=t.createDiv("as-dash-bars");for(let a of e.top_skills.slice(0,10)){let r=i.createDiv("as-bar-row");r.createSpan({cls:"as-bar-name",text:a.name}),r.createDiv("as-bar-wrap").createDiv("as-bar-fill").setCssProps({"--bar-w":`${a.total/s*100}%`}),r.createSpan({cls:"as-bar-count",text:String(a.total)})}}renderHealth(e,t){let s=(t||this.containerEl).createDiv("as-dash-section");s.createDiv({cls:"as-dash-title",text:"Health"});let i=e.usage.used_30d+e.usage.unused_30d,a=i>0?Math.round(e.usage.used_30d/i*100):0,r=s.createDiv("as-dash-health-row"),l=r.createDiv("as-donut");l.setCssProps({"--pct":`${a}`}),l.createDiv({cls:"as-donut-label",text:`${a}%`}),l.createDiv({cls:"as-donut-sub",text:"active"});let o=r.createDiv("as-health-details");o.createDiv({cls:"as-health-line",text:`${e.usage.used_30d} used in 30d`}),o.createDiv({cls:"as-health-line as-health-warn",text:`${e.usage.unused_30d} never triggered`});let d=o.createDiv("as-budget-bar").createDiv("as-budget-fill");d.setCssProps({"--bar-w":`${e.metadata.pct}%`}),e.metadata.pct>80&&d.addClass("as-budget-over"),o.createDiv({cls:"as-health-line",text:`Metadata budget: ${e.metadata.pct}%`})}renderBurn(e){let t=this.containerEl.createDiv("as-dash-section");t.createDiv({cls:"as-dash-title",text:`Burn Rate \u2014 ${e.agent} (${e.period.days}d)`});let s=t.createDiv("as-dash-stats as-dash-stats-sm");if(this.statCard(s,`$${Math.round(e.cost.total).toLocaleString()}`,"total cost","flame"),this.statCard(s,`$${Math.round(e.cost.total/(e.period.days||1)).toLocaleString()}`,"daily avg","trending-up"),this.statCard(s,`${(e.period.sessions||0).toLocaleString()}`,"sessions","terminal"),this.statCard(s,`${((e.period.api_calls||0)/1e3).toFixed(0)}k`,"API calls","zap"),e.by_model&&e.by_model.length>0){let l=t.createDiv("as-model-breakdown");for(let o of e.by_model.slice(0,4)){let c=l.createDiv("as-model-row");c.createSpan({cls:"as-model-name",text:o.model}),c.createSpan({cls:"as-model-calls",text:`${o.apiCalls.toLocaleString()} calls`}),o.costUsd>0&&c.createSpan({cls:"as-model-cost",text:`$${Math.round(o.costUsd).toLocaleString()}`})}}let i=e.by_day.slice(-14);if(i.length===0)return;let a=Math.max(...i.map(l=>l.costUsd),1),r=t.createDiv("as-burn-chart");for(let l of i){let o=r.createDiv("as-burn-col"),c=o.createDiv("as-burn-bar"),d=Math.max(2,l.costUsd/a*100);c.setCssProps({"--bar-h":`${d}%`}),c.title=`${l.date}: $${l.costUsd.toFixed(0)}`,o.createDiv({cls:"as-burn-date",text:l.date.slice(8)})}}renderContext(e,t){let s=(t||this.containerEl).createDiv("as-dash-section");s.createDiv({cls:"as-dash-title",text:"Context Tax"});let i=e.always_loaded.total_tokens,a=[{label:"CLAUDE.md",tokens:e.always_loaded.claude_md_tokens,cls:"as-ctx-claude"},{label:"Skills metadata",tokens:e.always_loaded.skill_metadata_tokens,cls:"as-ctx-skills"},{label:"Memory",tokens:e.always_loaded.memory_tokens,cls:"as-ctx-memory"}],r=s.createDiv("as-ctx-bar");for(let c of a){let d=r.createDiv(`as-ctx-part ${c.cls}`);d.setCssProps({"--bar-w":`${c.tokens/i*100}%`}),d.title=`${c.label}: ${(c.tokens/1e3).toFixed(1)}k tokens`}let l=s.createDiv("as-ctx-legend");for(let c of a){let d=l.createDiv("as-ctx-legend-item");d.createSpan({cls:`as-ctx-dot ${c.cls}`}),d.createSpan({text:`${c.label}: ${(c.tokens/1e3).toFixed(1)}k`})}let o=s.createDiv("as-ctx-costs");o.createDiv({text:`Per session (cached): $${e.session_estimate.with_cache.toFixed(2)}`}),o.createDiv({text:`Without cache: $${e.session_estimate.without_cache.toFixed(2)}`}),o.createDiv({cls:"as-ctx-savings",text:`Cache saves ${e.session_estimate.savings_pct.toFixed(0)}%`})}renderStale(e){if(e.usage.never_used.length===0)return;let t=this.containerEl.createDiv("as-dash-section");t.createDiv({cls:"as-dash-title",text:`Stale skills (${e.usage.unused_30d})`});let s=t.createDiv("as-stale-list");for(let i of e.usage.never_used.slice(0,20))s.createDiv("as-stale-item").createSpan({text:i});e.usage.never_used.length>20&&s.createDiv({cls:"as-stale-more",text:`+${e.usage.never_used.length-20} more`})}};var P=require("obsidian"),K=require("fs"),vt=require("path"),bt=require("os");var T=require("obsidian"),Z=require("fs"),gt=require("path"),ft=require("os");var h=require("fs"),v=require("path"),re=require("os"),dt=require("obsidian"),pt=require("crypto");var ct=new Set(["readme.md","license","license.md","changelog.md",".ds_store","thumbs.db"]);function Ut(n){return(0,pt.createHash)("sha256").update(n).digest("hex").slice(0,12)}function Gt(n){let e=n.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);if(!e)return{frontmatter:{},content:n};try{let t=(0,dt.parseYaml)(e[1]);return{frontmatter:typeof t=="object"&&t?t:{},content:e[2]}}catch{return{frontmatter:{},content:n}}}function Jt(n,e,t,s="auto"){if(s==="auto"){if(typeof n.name=="string"&&n.name)return n.name;let a=e.match(/^#\s+(.+)$/m);if(a)return a[1].trim()}let i=(0,v.basename)(t,(0,v.extname)(t));return i==="SKILL"?(0,v.basename)((0,v.join)(t,"..")):i}function Zt(n,e,t,s="auto"){if(!(0,h.existsSync)(n))return[];let i=[];for(let a of(0,h.readdirSync)(n,{withFileTypes:!0})){let r=(0,v.join)(n,a.name);if(!(a.isDirectory()||a.isSymbolicLink()&&(0,h.statSync)(r,{throwIfNoEntry:!1})?.isDirectory()))continue;let o=(0,v.join)(r,"SKILL.md");if(!(0,h.existsSync)(o))continue;let c=X(o,e,t,"directory-with-skillmd",s);c&&i.push(c)}return i}function Kt(n,e,t,s="auto"){if(!(0,h.existsSync)(n))return[];let i=[];for(let a of(0,h.readdirSync)(n,{withFileTypes:!0})){let r=(0,v.join)(n,a.name);if(a.isDirectory()||a.isSymbolicLink()&&(0,h.statSync)(r,{throwIfNoEntry:!1})?.isDirectory()){let d=(0,v.join)(r,"SKILL.md");if((0,h.existsSync)(d)){let f=X(d,e,t,"flat-md",s);f&&i.push(f);continue}let m=(0,h.readdirSync)(r).filter(f=>f.endsWith(".md")&&!ct.has(f.toLowerCase())),g=m.find(f=>f.toLowerCase()===`${a.name.toLowerCase()}.md`)||m[0];if(g){let f=X((0,v.join)(r,g),e,t,"flat-md",s);f&&i.push(f)}continue}let o=a.name.toLowerCase();if(!o.endsWith(".md")||ct.has(o))continue;let c=X(r,e,t,"flat-md",s);c&&i.push(c)}return i}function Qt(n,e,t,s="auto"){if(!(0,h.existsSync)(n))return[];let i=[];for(let a of(0,h.readdirSync)(n,{withFileTypes:!0})){if(!a.name.endsWith(".mdc")&&!a.name.endsWith(".md")||a.isDirectory())continue;let r=X((0,v.join)(n,a.name),e,t,"mdc",s);r&&i.push(r)}return i}function X(n,e,t,s="directory-with-skillmd",i="auto"){try{let a=(0,h.readFileSync)(n,"utf-8"),r=(0,h.statSync)(n),{frontmatter:l,content:o}=Gt(a),c=Jt(l,o,n,i),d=typeof l.description=="string"?l.description:"",m;try{m=(0,h.realpathSync)(n)}catch{m=n}return{id:Ut(m),name:c,description:d,type:e,tools:[t],filePath:n,realPath:m,dirPath:(0,v.join)(n,".."),content:a,frontmatter:l,lastModified:r.mtimeMs,fileSize:r.size,isFavorite:!1,collections:[]}}catch{return null}}function Me(n,e,t="auto"){switch(n.pattern){case"directory-with-skillmd":return Zt(n.baseDir,n.type,e,t);case"flat-md":return Kt(n.baseDir,n.type,e,t);case"mdc":return Qt(n.baseDir,n.type,e,t)}}function qt(n,e){let t=[],s=[{sub:".claude/skills",type:"skill",pattern:"directory-with-skillmd"},{sub:".claude/commands",type:"command",pattern:"flat-md"},{sub:".claude/agents",type:"agent",pattern:"flat-md"},{sub:".cursor/skills",type:"skill",pattern:"directory-with-skillmd"},{sub:".codex/skills",type:"skill",pattern:"directory-with-skillmd"}];for(let i of s){let a=(0,v.join)(n,i.sub);if(!(0,h.existsSync)(a))continue;let r={baseDir:a,type:i.type,pattern:i.pattern};t.push(...Me(r,e))}return t}function ut(n){return n.projectsHomeDir||(0,re.homedir)()}function Xt(n,e){let t=(0,re.homedir)(),s=[];for(let i of[...e.paths,...e.agentPaths]){let a=(0,v.relative)(t,i.baseDir);if(a.startsWith("..")||a.startsWith("/"))continue;let r=(0,v.join)(n,a);if((0,h.existsSync)(r))try{s.push(...Me({...i,baseDir:r},e.id))}catch{}}return s}function Yt(n){let e=ut(n);if(!(0,h.existsSync)(e))return[];let t=[];try{let s=new Set(["node_modules",".Trash","Library","Applications","Music","Movies","Pictures","Public"]);for(let i of(0,h.readdirSync)(e,{withFileTypes:!0})){if(!i.isDirectory()&&!i.isSymbolicLink()||s.has(i.name))continue;let a=(0,v.join)(e,i.name);for(let r of E){if(!r.isInstalled())continue;let l=n.tools[r.id];if(l&&!l.enabled)continue;let o=Xt(a,r);o.length>0&&t.push({items:o,toolId:r.id})}}}catch{}return t}function Pe(n,e){let t=e||(0,re.homedir)();if(!n.startsWith(t+"/"))return"global";let i=n.slice(t.length+1).split("/");return i.length>1&&!i[0].startsWith(".")?i[0]:"global"}function ht(n){let e=n.namingMode||"auto",t=new Map,s=new Map;function i(a,r){let l=t.get(a.id);if(l){l.tools.includes(r)||l.tools.push(r);return}let o=s.get(a.name);if(o){let c=t.get(o);c&&!c.tools.includes(r)&&c.tools.push(r);return}a.isFavorite=n.favorites.includes(a.id);for(let[c,d]of Object.entries(n.collections))d.includes(a.id)&&a.collections.push(c);t.set(a.id,a),s.set(a.name,a.id)}for(let a of E){if(!a.isInstalled())continue;let r=n.tools[a.id];if(r&&!r.enabled)continue;let l=[...a.paths,...a.agentPaths];for(let o of l)for(let c of Me(o,a.id,e))i(c,a.id)}for(let a of n.customScanPaths)if((0,h.existsSync)(a))for(let r of qt(a,"claude-code"))i(r,"claude-code");if(n.projectScanEnabled)for(let{items:a,toolId:r}of Yt(n))for(let l of a)i(l,r);return t}function Ie(){return E.filter(n=>n.isInstalled()).map(n=>n.id)}function mt(n){let e=[];for(let t of E)if(t.isInstalled())for(let s of[...t.paths,...t.agentPaths])(0,h.existsSync)(s.baseDir)&&e.push(s.baseDir);if(n?.projectScanEnabled){let t=ut(n),s=new Set(["node_modules",".Trash","Library","Applications","Music","Movies","Pictures","Public"]);try{for(let i of(0,h.readdirSync)(t,{withFileTypes:!0})){if(!i.isDirectory()&&!i.isSymbolicLink()||s.has(i.name))continue;let a=(0,v.join)(t,i.name);for(let r of[".claude/skills",".claude/commands",".claude/agents",".cursor/skills",".codex/skills"]){let l=(0,v.join)(a,r);(0,h.existsSync)(l)&&e.push(l)}}}catch{}}return e}var _e={};for(let[n,e]of Object.entries(ie))_e[e]||(_e[e]=n);var Ae=(0,gt.join)((0,ft.homedir)(),".skillkit","install-prefs.json"),z=null,oe=!0;function es(){if(!z&&(0,Z.existsSync)(Ae))try{let n=JSON.parse((0,Z.readFileSync)(Ae,"utf-8"));z=new Set(n.agents||[]),oe=n.global??!0}catch{}}function ts(){try{(0,Z.writeFileSync)(Ae,JSON.stringify({agents:z?[...z]:[],global:oe}),"utf-8")}catch{}}es();var le=class extends T.Modal{skill;settings;onInstalled;selectedAgents;isGlobal;constructor(e,t,s,i){if(super(e),this.skill=t,this.settings=s,this.onInstalled=i,z)this.selectedAgents=new Set(z);else{this.selectedAgents=new Set;let a=Ie();for(let r of a){let l=ie[r];l&&this.selectedAgents.add(l)}}this.isGlobal=oe}onOpen(){let{contentEl:e}=this;e.addClass("as-install-modal"),e.createEl("h3",{text:`Install ${this.skill.name}`}),e.createEl("p",{cls:"as-install-source",text:this.skill.source}),new T.Setting(e).setName("Install globally").setDesc("Shared across all projects (~/.agents/skills/)").addToggle(o=>o.setValue(this.isGlobal).onChange(c=>{this.isGlobal=c})),new T.Setting(e).setName("Agents").setHeading();let t=e.createDiv("as-install-scroll"),s=Ie(),i=new Set(s.map(o=>ie[o]).filter(Boolean));for(let o of tt){let c=i.has(o.id),d=_e[o.id],g=new T.Setting(t).addToggle(fe=>fe.setValue(this.selectedAgents.has(o.id)).onChange(Dt=>{Dt?this.selectedAgents.add(o.id):this.selectedAgents.delete(o.id)})).nameEl,f=d&&C[d]?d:C[o.id]?o.id:C[o.id+"-code"]?o.id+"-code":C[o.id+"-cli"]?o.id+"-cli":null,W=g.createSpan("as-install-agent-icon");f?j(W,f,14):W.addClass("as-install-agent-placeholder"),g.createSpan({text:o.label}),c&&g.createSpan({cls:"as-install-detected",text:"detected"})}let a=e.createDiv("as-install-footer");a.createEl("button",{text:"Cancel"}).addEventListener("click",()=>this.close());let l=a.createEl("button",{cls:"mod-cta",text:"Install"});l.addEventListener("click",()=>this.doInstall(l))}doInstall(e){let t=[...this.selectedAgents];if(t.length===0){new T.Notice("Select at least one agent",5e3);return}z=new Set(this.selectedAgents),oe=this.isGlobal,ts(),this.close(),new T.Notice(`Installing ${this.skill.name}...`,3e3),it(this.skill.source,t,{runner:this.settings.packageRunner,global:this.isGlobal}).then(s=>{s.success?(new T.Notice(`Installed ${this.skill.name}`,5e3),this.skill.installed=!0,this.onInstalled()):new T.Notice(`Failed to install ${this.skill.name}`,5e3)})}onClose(){this.contentEl.empty()}};var He=(0,vt.join)((0,bt.homedir)(),".skillkit","marketplace-popular.json"),M=null,ce="",N=null,ss=new P.Component;function is(){if(!M&&(0,K.existsSync)(He))try{let n=JSON.parse((0,K.readFileSync)(He,"utf-8"));M=ne(n)}catch{}}function ns(){if(M)try{(0,K.writeFileSync)(He,JSON.stringify(M),"utf-8")}catch{}}is();var de=class{containerEl;inputEl=null;listEl=null;previewEl=null;searchTimer=null;selectedSkill=null;app;settings;onRefresh;constructor(e,t,s,i){this.containerEl=e,this.app=t.app,this.settings=s,this.onRefresh=i}render(){if(!this.inputEl){this.containerEl.empty(),this.containerEl.addClass("as-marketplace");let e=this.containerEl.createDiv("as-mp-search");this.inputEl=e.createEl("input",{type:"text",placeholder:"Search skills on skills.sh...",cls:"as-mp-search-input"}),this.inputEl.addEventListener("input",()=>{this.searchTimer&&clearTimeout(this.searchTimer),this.searchTimer=setTimeout(()=>{this.doSearch(this.inputEl.value)},300)});let t=this.containerEl.createDiv("as-mp-body");this.listEl=t.createDiv("as-mp-list"),this.previewEl=t.createDiv("as-mp-preview"),this.previewEl.createDiv({cls:"as-mp-hint",text:"Select a skill to preview."})}this.inputEl.value=ce,ce.length>=2&&N?this.showResults(N):M?this.showPopular():this.loadPopular()}async loadPopular(){if(!this.listEl)return;this.listEl.empty(),this.listEl.createDiv({cls:"as-mp-loading",text:"Loading popular skills..."}),M=await et(),ns(),this.showPopular()}refreshList(){M&&ne(M),N&&ne(N),ce.length>=2&&N?this.showResults(N):this.showPopular()}showPopular(){if(this.listEl){if(this.listEl.empty(),!M||M.length===0){this.listEl.createDiv({cls:"as-mp-hint",text:"Search for skills to browse and install."});return}this.listEl.createDiv({cls:"as-mp-section-title",text:"Popular"});for(let e of M)this.renderSkillCard(e)}}showResults(e){if(this.listEl){if(this.listEl.empty(),e.length===0){this.listEl.createDiv({cls:"as-mp-hint",text:"No skills found."});return}for(let t of e)this.renderSkillCard(t)}}async doSearch(e){if(!this.listEl)return;if(ce=e,e.length<2){N=null,this.showPopular();return}this.listEl.empty(),this.listEl.createDiv({cls:"as-mp-loading",text:"Searching..."});let t=await xe(e);N=t,this.showResults(t)}renderSkillCard(e){if(!this.listEl)return;let t=this.listEl.createDiv("as-mp-card");this.selectedSkill?.id===e.id&&t.addClass("is-selected");let s=t.createDiv("as-mp-card-header");s.createSpan({cls:"as-mp-card-name",text:e.name}),e.installed&&s.createSpan({cls:"as-mp-installed-badge",text:"Installed"}),t.createDiv({cls:"as-mp-card-source",text:e.source});let i=t.createDiv("as-mp-card-meta"),a=i.createSpan("as-mp-dl-icon");(0,P.setIcon)(a,"download"),i.createSpan({cls:"as-mp-card-installs",text:Le(e.installs)}),t.addEventListener("click",()=>{this.selectedSkill=e,this.listEl&&this.listEl.querySelectorAll(".as-mp-card").forEach(r=>r.removeClass("is-selected")),t.addClass("is-selected"),this.showPreview(e)})}async showPreview(e){if(!this.previewEl)return;this.previewEl.empty();let s=this.previewEl.createDiv("as-mp-preview-header").createDiv("as-mp-preview-top"),i=s.createDiv("as-mp-preview-left");i.createDiv({cls:"as-mp-preview-name",text:e.name});let a=i.createDiv("as-mp-preview-meta");a.createSpan({cls:"as-mp-preview-source",text:e.source});let r=a.createSpan("as-mp-dl-icon");(0,P.setIcon)(r,"download"),a.createSpan({cls:"as-mp-preview-installs",text:Le(e.installs)});let l=s.createDiv("as-mp-preview-right");if(!e.installed)this.renderInstallButton(l,e);else{l.createSpan({cls:"as-mp-installed-label",text:"Installed"});let d=l.createEl("button",{cls:"as-mp-uninstall-btn",text:"Uninstall"});d.addEventListener("click",()=>{B(this.app,"Uninstall skill",`Remove "${e.name}" from all agents?`,()=>{d.setText("Removing..."),d.disabled=!0,new P.Notice(`Removing ${e.name}...`,3e3),nt(e.name,this.settings.packageRunner).then(m=>{m.success?(new P.Notice(`Removed ${e.name}`,5e3),e.installed=!1,this.refreshList(),this.showPreview(e)):(new P.Notice(`Failed to remove ${e.name}`,5e3),d.setText("Uninstall"),d.disabled=!1)})})})}let o=this.previewEl.createDiv("as-mp-preview-content");o.createDiv({cls:"as-mp-loading",text:"Loading skill content..."});let c=await Ye(e.source,e.name,e.id);if(o.empty(),c){e.content=c;let d=o.createDiv("as-mp-rendered markdown-rendered");P.MarkdownRenderer.render(this.app,c,d,"",ss)}else o.createDiv({cls:"as-mp-hint",text:"Could not load skill content."})}renderInstallButton(e,t){e.createEl("button",{cls:"as-mp-install-btn",text:"Install"}).addEventListener("click",()=>{new le(this.app,t,this.settings,()=>{this.refreshList(),this.showPreview(t)}).open()})}};var Y="agentfiles-view",pe=class extends kt.ItemView{store;settings;saveSettings;sidebarPanel;listPanel;detailPanel;dashboardPanel;marketplacePanel;sidebarEl;listEl;detailEl;dashboardEl;marketplaceEl;resizeHandle1;resizeHandle2;isDashboard=!1;isMarketplace=!1;updateRef=null;dragCleanup=null;constructor(e,t,s,i){super(e),this.store=t,this.settings=s,this.saveSettings=i}getViewType(){return Y}getDisplayText(){return"Agentfiles"}getIcon(){return"cpu"}onOpen(){let e=this.contentEl;e.empty(),e.addClass("as-container"),this.sidebarEl=e.createDiv("as-panel as-panel-sidebar"),this.resizeHandle1=this.createResizeHandle(e,this.sidebarEl,"--as-sidebar-width",120,400),this.listEl=e.createDiv("as-panel as-panel-list"),this.resizeHandle2=this.createResizeHandle(e,this.listEl,"--as-list-width",180,600),this.detailEl=e.createDiv("as-panel as-panel-detail"),this.dashboardEl=e.createDiv("as-panel as-panel-dashboard as-hidden"),this.marketplaceEl=e.createDiv("as-panel as-panel-marketplace as-hidden"),this.sidebarPanel=new ee(this.sidebarEl,this.store,()=>this.toggleDashboard(),()=>this.toggleMarketplace()),this.listPanel=new te(this.listEl,this.store,t=>this.onSelectItem(t)),this.detailPanel=new se(this.detailEl,this.store,this.settings,this.saveSettings,this),this.dashboardPanel=new ae(this.dashboardEl,this.app),this.marketplacePanel=new de(this.marketplaceEl,this,this.settings,()=>{this.store.refresh(this.settings)}),this.updateRef=this.store.on("updated",()=>this.renderAll()),this.renderAll()}toggleDashboard(){this.dragCleanup?.(),this.dragCleanup=null,this.isDashboard=!this.isDashboard,this.isMarketplace&&(this.isMarketplace=!1,this.marketplaceEl.addClass("as-hidden")),this.isDashboard?(this.listEl.addClass("as-hidden"),this.detailEl.addClass("as-hidden"),this.resizeHandle1.addClass("as-hidden"),this.resizeHandle2.addClass("as-hidden"),this.dashboardEl.removeClass("as-hidden"),this.dashboardPanel.render()):(this.listEl.removeClass("as-hidden"),this.detailEl.removeClass("as-hidden"),this.resizeHandle1.removeClass("as-hidden"),this.resizeHandle2.removeClass("as-hidden"),this.dashboardEl.addClass("as-hidden")),this.sidebarPanel.setDashboardActive(this.isDashboard),this.sidebarPanel.render()}toggleMarketplace(){this.dragCleanup?.(),this.dragCleanup=null,this.isMarketplace=!this.isMarketplace,this.isDashboard&&(this.isDashboard=!1,this.dashboardEl.addClass("as-hidden")),this.isMarketplace?(this.listEl.addClass("as-hidden"),this.detailEl.addClass("as-hidden"),this.resizeHandle1.addClass("as-hidden"),this.resizeHandle2.addClass("as-hidden"),this.marketplaceEl.removeClass("as-hidden"),this.marketplacePanel.render()):(this.listEl.removeClass("as-hidden"),this.detailEl.removeClass("as-hidden"),this.resizeHandle1.removeClass("as-hidden"),this.resizeHandle2.removeClass("as-hidden"),this.marketplaceEl.addClass("as-hidden")),this.sidebarPanel.setMarketplaceActive(this.isMarketplace),this.sidebarPanel.render()}renderAll(){this.sidebarPanel.render(),!this.isDashboard&&!this.isMarketplace&&(this.listPanel.render(),this.store.filteredItems.length||this.detailPanel.clear())}onSelectItem(e){this.isDashboard&&this.toggleDashboard(),this.isMarketplace&&this.toggleMarketplace(),this.listPanel.setSelected(e.id),this.listPanel.render(),this.detailPanel.show(e)}createResizeHandle(e,t,s,i,a){let r=e.createDiv("as-resize-handle"),l=0,o=0,c=m=>{let g=Math.min(a,Math.max(i,o+(m.clientX-l)));e.style.setProperty(s,`${g}px`)},d=()=>{r.removeClass("is-dragging"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",d),this.dragCleanup=null};return r.addEventListener("mousedown",m=>{m.preventDefault(),l=m.clientX,o=parseInt(e.style.getPropertyValue(s))||t.offsetWidth,r.addClass("is-dragging"),document.addEventListener("mousemove",c),document.addEventListener("mouseup",d),this.dragCleanup=d}),r}onClose(){this.dragCleanup?.(),this.updateRef&&this.store.offref(this.updateRef)}};var St=require("obsidian");var ue=class extends St.Events{items=new Map;_filter={kind:"all"};_searchQuery="";_deepSearch=!1;_deepSearchScope="both";_projectsHomeDir="";get filter(){return this._filter}get searchQuery(){return this._searchQuery}get deepSearch(){return this._deepSearch}get allItems(){return Array.from(this.items.values())}get filteredItems(){let e=this.allItems;switch(this._filter.kind){case"favorites":e=e.filter(t=>t.isFavorite);break;case"tool":e=e.filter(t=>t.tools.includes(this._filter.toolId));break;case"type":e=e.filter(t=>t.type===this._filter.type);break;case"collection":e=e.filter(t=>t.collections.includes(this._filter.name));break;case"project":e=e.filter(t=>Pe(t.filePath,this._projectsHomeDir)===this._filter.project);break}if(this._searchQuery){let t=this._searchQuery.toLowerCase(),s=this._deepSearch&&(this._deepSearchScope==="description"||this._deepSearchScope==="both"),i=this._deepSearch&&(this._deepSearchScope==="content"||this._deepSearchScope==="both");e=e.filter(a=>a.name.toLowerCase().includes(t)||s&&a.description.toLowerCase().includes(t)||i&&a.content.toLowerCase().includes(t))}return e.sort((t,s)=>t.name.localeCompare(s.name))}getItem(e){return this.items.get(e)}get hasSkillkit(){return L()}refresh(e){this._projectsHomeDir=e.projectsHomeDir,this.items=ht(e),this.enrichWithSkillkit(),this.trigger("updated")}enrichWithSkillkit(){if(!L())return;let e=Ne(),t=Be(),s=We(),i=new Set(s.oversized.map(o=>o.name)),a=new Set(s.longDesc.map(o=>o.name)),r=new Map(s.oversized.map(o=>[o.name,o.lines])),l=new Map(s.longDesc.map(o=>[o.name,o.chars]));for(let o of this.items.values()){let c=o.filePath.split("/").slice(-2,-1)[0],d=o.name.toLowerCase().replace(/\s+/g,"-"),m=e.get(o.name)||e.get(c)||e.get(d);m?(m.isHeavy=o.content.length>5e3,o.usage=m):o.usage={uses:0,lastUsed:null,daysSinceUsed:null,isStale:!0,isHeavy:o.content.length>5e3};let g=o.content.split(`
-`).length,f=o.description.length;o.warnings={oversized:i.has(o.name)||g>500,longDesc:a.has(o.name)||f>1024,lineCount:r.get(o.name)??g,descChars:l.get(o.name)??f},o.conflicts=t.get(o.name)||t.get(c)||[]}}setFilter(e){this._filter=e,this.trigger("updated")}setSearch(e){this._searchQuery=e,this.trigger("updated")}setDeepSearch(e){this._deepSearch!==e&&(this._deepSearch=e,this.trigger("updated"))}setDeepSearchScope(e){this._deepSearchScope!==e&&(this._deepSearchScope=e,this.trigger("updated"))}toggleFavorite(e,t){let s=this.items.get(e);s&&(s.isFavorite=!s.isFavorite,s.isFavorite?t.favorites.includes(e)||t.favorites.push(e):t.favorites=t.favorites.filter(i=>i!==e),this.trigger("updated"))}getToolCounts(){let e=new Map;for(let t of this.items.values())for(let s of t.tools)e.set(s,(e.get(s)||0)+1);return e}getTypeCounts(){let e=new Map;for(let t of this.items.values())e.set(t.type,(e.get(t.type)||0)+1);return e}getProjectCounts(){let e=new Map;for(let t of this.items.values()){let s=Pe(t.filePath,this._projectsHomeDir);e.set(s,(e.get(s)||0)+1)}return e}};var yt=require("fs"),he=class{watchers=[];debounceTimer=null;debounceMs;onChange;constructor(e,t){this.debounceMs=e,this.onChange=t}watchPaths(e){this.close();for(let t of e)try{let s=(0,yt.watch)(t,{recursive:!0},()=>this.scheduleUpdate());this.watchers.push(s)}catch{}}scheduleUpdate(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.onChange()},this.debounceMs)}close(){this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null);for(let e of this.watchers)try{e.close()}catch{}this.watchers=[]}};var D=require("obsidian");var me=class extends D.PluginSettingTab{plugin;constructor(e,t){super(e,t),this.plugin=t}display(){let{containerEl:e}=this;e.empty(),new D.Setting(e).setName("File watching").setDesc("Automatically detect changes to skill files").addToggle(t=>t.setValue(this.plugin.settings.watchEnabled).onChange(async s=>{this.plugin.settings.watchEnabled=s,await this.plugin.saveSettings(),this.plugin.restartWatcher()})),new D.Setting(e).setName("Watch debounce (ms)").setDesc("Delay before re-scanning after file changes").addText(t=>t.setValue(String(this.plugin.settings.watchDebounceMs)).onChange(async s=>{let i=parseInt(s);!isNaN(i)&&i>=100&&(this.plugin.settings.watchDebounceMs=i,await this.plugin.saveSettings())})),new D.Setting(e).setName("Display names").setDesc("How skill and command names are displayed in the list").addDropdown(t=>t.addOptions({auto:"Auto (frontmatter / heading / filename)",filename:"Filename only"}).setValue(this.plugin.settings.namingMode||"auto").onChange(async s=>{this.plugin.settings.namingMode=s,await this.plugin.saveSettings(),this.plugin.refreshStore()})),new D.Setting(e).setName("Deep search by default").setDesc("Enable deep search when the view opens (can always be toggled in the search bar)").addToggle(t=>t.setValue(this.plugin.settings.deepSearchDefault??!1).onChange(async s=>{this.plugin.settings.deepSearchDefault=s,await this.plugin.saveSettings()})),new D.Setting(e).setName("Deep search scope").setDesc("What to include when deep search is enabled").addDropdown(t=>t.addOptions({both:"Description and file content",description:"Description only",content:"File content only"}).setValue(this.plugin.settings.deepSearchScope??"both").onChange(async s=>{this.plugin.settings.deepSearchScope=s,await this.plugin.saveSettings()})),new D.Setting(e).setName("Marketplace").setHeading(),new D.Setting(e).setName("Package runner").setDesc("Command used to install skills from the marketplace").addDropdown(t=>t.addOptions({auto:"Auto-detect",npx:"npx",bunx:"bunx"}).setValue(this.plugin.settings.packageRunner).onChange(async s=>{this.plugin.settings.packageRunner=s,await this.plugin.saveSettings()})),new D.Setting(e).setName("Project scanning").setHeading(),new D.Setting(e).setName("Scan projects").setDesc("Scan all directories under the projects home folder for project-level skills").addToggle(t=>t.setValue(this.plugin.settings.projectScanEnabled).onChange(async s=>{this.plugin.settings.projectScanEnabled=s,await this.plugin.saveSettings(),this.plugin.refreshStore(),this.plugin.restartWatcher()})),new D.Setting(e).setName("Projects home directory").setDesc("Root directory to scan for project-level skills. Leave empty for home directory (~).").addText(t=>t.setPlaceholder("~").setValue(this.plugin.settings.projectsHomeDir).onChange(async s=>{this.plugin.settings.projectsHomeDir=s,await this.plugin.saveSettings(),this.plugin.refreshStore(),this.plugin.restartWatcher()})),new D.Setting(e).setName("Tools").setHeading();for(let t of E){let s=t.isInstalled(),i=this.plugin.settings.tools[t.id]||{enabled:!0,customPaths:[]};new D.Setting(e).setName(t.name).setDesc(s?"Installed":"Not detected").addToggle(a=>a.setValue(s&&i.enabled).setDisabled(!s).onChange(async r=>{this.plugin.settings.tools[t.id]={...i,enabled:r},await this.plugin.saveSettings(),this.plugin.refreshStore()}))}}};var $e={tools:{},watchEnabled:!0,watchDebounceMs:500,deepSearchDefault:!1,deepSearchScope:"both",favorites:[],collections:{},customScanPaths:[],namingMode:"auto",projectScanEnabled:!0,projectsHomeDir:"",packageRunner:"auto"};var ge=class extends wt.Plugin{settings=$e;store=new ue;watcher=null;async onload(){await this.loadSettings(),this.addVaultPath(),this.registerView(Y,e=>new pe(e,this.store,this.settings,()=>this.saveSettings())),this.addRibbonIcon("cpu","Agentfiles",()=>this.activateView()),this.addCommand({id:"open",name:"Open",callback:()=>this.activateView()}),this.addSettingTab(new me(this.app,this)),this.refreshStore(),this.store.setDeepSearch(this.settings.deepSearchDefault??!1),this.store.setDeepSearchScope(this.settings.deepSearchScope??"both"),this.startWatcher()}addVaultPath(){let e=this.app.vault.adapter;if(!e.getBasePath)return;let t=e.getBasePath();this.settings.customScanPaths.includes(t)||this.settings.customScanPaths.push(t)}onunload(){this.stopWatcher()}refreshStore(){this.store.refresh(this.settings)}startWatcher(){this.settings.watchEnabled&&(this.watcher=new he(this.settings.watchDebounceMs,()=>this.refreshStore()),this.watcher.watchPaths(mt(this.settings)))}stopWatcher(){this.watcher&&(this.watcher.close(),this.watcher=null)}restartWatcher(){this.stopWatcher(),this.startWatcher()}async activateView(){let e=this.app.workspace.getLeavesOfType(Y);if(e.length>0){await this.app.workspace.revealLeaf(e[0]);return}let t=this.app.workspace.getLeaf("tab");await t.setViewState({type:Y,active:!0}),await this.app.workspace.revealLeaf(t)}async loadSettings(){this.settings=Object.assign({},$e,await this.loadData())}async saveSettings(){await this.saveData(this.settings)}};
+var ve=Object.defineProperty;var Et=Object.getOwnPropertyDescriptor;var Ct=Object.getOwnPropertyNames;var Lt=Object.prototype.hasOwnProperty;var Tt=(n,e)=>{for(var t in e)ve(n,t,{get:e[t],enumerable:!0})},Mt=(n,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ct(e))!Lt.call(n,i)&&i!==t&&ve(n,i,{get:()=>e[i],enumerable:!(s=Et(e,i))||s.enumerable});return n};var Pt=n=>Mt(ve({},"__esModule",{value:!0}),n);var rs={};Tt(rs,{default:()=>ge});module.exports=Pt(rs);var Dt=require("obsidian");var St=require("obsidian");var R=require("obsidian"),je=require("electron");var Fe=require("os"),b=require("fs"),p=require("path"),u=(0,Fe.homedir)(),U=process.env.XDG_CONFIG_HOME||(0,p.join)(u,".config");function Q(n){return(0,b.existsSync)(`/Applications/${n}.app`)||(0,b.existsSync)((0,p.join)(u,"Applications",`${n}.app`))}function F(n){let e=[`/usr/local/bin/${n}`,`/opt/homebrew/bin/${n}`,(0,p.join)(u,".local","bin",n)];for(let s of e)if((0,b.existsSync)(s))return!0;let t=(0,p.join)(u,".nvm","versions","node");try{for(let s of(0,b.readdirSync)(t))if((0,b.existsSync)((0,p.join)(t,s,"bin",n)))return!0}catch{}return!1}var E=[{id:"claude-code",name:"Claude Code",color:"#f97316",icon:"brain",paths:[{baseDir:(0,p.join)(u,".claude","skills"),type:"skill",pattern:"directory-with-skillmd"},{baseDir:(0,p.join)(u,".claude","commands"),type:"command",pattern:"flat-md"}],agentPaths:[{baseDir:(0,p.join)(u,".claude","agents"),type:"agent",pattern:"flat-md"}],isInstalled:()=>(0,b.existsSync)((0,p.join)(u,".claude","settings.json"))||(0,b.existsSync)((0,p.join)(u,".claude","CLAUDE.md"))||F("claude")},{id:"cursor",name:"Cursor",color:"#3b82f6",icon:"mouse-pointer",paths:[{baseDir:(0,p.join)(u,".cursor","skills"),type:"skill",pattern:"directory-with-skillmd"},{baseDir:(0,p.join)(u,".cursor","rules"),type:"rule",pattern:"flat-md"}],agentPaths:[{baseDir:(0,p.join)(u,".cursor","agents"),type:"agent",pattern:"flat-md"}],isInstalled:()=>Q("Cursor")||(0,b.existsSync)((0,p.join)(u,".cursor","argv.json"))},{id:"windsurf",name:"Windsurf",color:"#14b8a6",icon:"wind",paths:[{baseDir:(0,p.join)(u,".codeium","windsurf","memories"),type:"memory",pattern:"flat-md"},{baseDir:(0,p.join)(u,".windsurf","rules"),type:"rule",pattern:"flat-md"}],agentPaths:[],isInstalled:()=>Q("Windsurf")||(0,b.existsSync)((0,p.join)(u,".codeium","windsurf","argv.json"))},{id:"codex",name:"Codex",color:"#22c55e",icon:"book",paths:[{baseDir:(0,p.join)(u,".codex","skills"),type:"skill",pattern:"directory-with-skillmd"},{baseDir:(0,p.join)(u,".codex","prompts"),type:"command",pattern:"flat-md"},{baseDir:(0,p.join)(u,".codex","memories"),type:"memory",pattern:"flat-md"}],agentPaths:[{baseDir:(0,p.join)(u,".codex","agents"),type:"agent",pattern:"flat-md"}],isInstalled:()=>(0,b.existsSync)((0,p.join)(u,".codex","config.toml"))||(0,b.existsSync)((0,p.join)(u,".codex","auth.json"))||F("codex")},{id:"copilot",name:"Copilot",color:"#a855f7",icon:"plane",paths:[{baseDir:(0,p.join)(u,".copilot","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>(0,b.existsSync)((0,p.join)(u,".copilot"))||F("copilot")},{id:"amp",name:"Amp",color:"#ec4899",icon:"zap",paths:[{baseDir:(0,p.join)(U,"amp","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>(0,b.existsSync)((0,p.join)(U,"amp","config.json"))||(0,b.existsSync)((0,p.join)(U,"amp","settings.json"))||F("amp")},{id:"opencode",name:"OpenCode",color:"#ef4444",icon:"terminal",paths:[{baseDir:(0,p.join)(U,"opencode","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>Q("OpenCode")||(0,b.existsSync)((0,p.join)(U,"opencode","opencode.json"))||(0,b.existsSync)((0,p.join)(U,"opencode","opencode.jsonc"))||F("opencode")},{id:"pi",name:"Pi",color:"#06b6d4",icon:"sparkles",paths:[{baseDir:(0,p.join)(u,".pi","agent","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>F("pi")},{id:"antigravity",name:"Antigravity",color:"#ef4444",icon:"arrow-up-circle",paths:[{baseDir:(0,p.join)(u,".gemini","antigravity","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>Q("Antigravity")||(0,b.existsSync)((0,p.join)(u,".gemini","antigravity","skills"))||F("antigravity")},{id:"claude-desktop",name:"Claude Desktop",color:"#f97316",icon:"monitor",paths:[],agentPaths:[],isInstalled:()=>Q("Claude")},{id:"global-agents",name:"Global",color:"#a3e635",icon:"globe",paths:[{baseDir:(0,p.join)(u,".agents","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>(0,b.existsSync)((0,p.join)(u,".agents","skills"))},{id:"aider",name:"Aider",color:"#eab308",icon:"wrench",paths:[],agentPaths:[],isInstalled:()=>F("aider")}];var C={"claude-code":{viewBox:"0 0 24 24",paths:''},cursor:{viewBox:"0 0 466.73 532.09",paths:''},windsurf:{viewBox:"0 0 24 24",paths:''},codex:{viewBox:"0 0 24 24",paths:''},copilot:{viewBox:"0 0 24 24",paths:''},opencode:{viewBox:"0 0 24 36",paths:''},"claude-desktop":{viewBox:"0 0 24 24",paths:''},"global-agents":{viewBox:"0 0 24 24",paths:''},goose:{viewBox:"0 0 24 24",paths:''},cline:{viewBox:"0 0 24 24",paths:''},continue:{viewBox:"0 0 26 24",paths:''},"roo-code":{viewBox:"0 0 96 96",paths:''},replit:{viewBox:"0 0 24 24",paths:''},"gemini-cli":{viewBox:"0 0 24 24",paths:''}};function j(n,e,t=16){let s=C[e];if(!s)return;let i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.setAttribute("viewBox",s.viewBox),i.setAttribute("width",String(t)),i.setAttribute("height",String(t)),i.setAttribute("fill","none"),i.classList.add("as-tool-svg"),i.innerHTML=s.paths,n.appendChild(i)}var ee=class{containerEl;store;onToggleDashboard;onToggleMarketplace;dashboardActive=!1;marketplaceActive=!1;constructor(e,t,s,i){this.containerEl=e,this.store=t,this.onToggleDashboard=s,this.onToggleMarketplace=i}setDashboardActive(e){this.dashboardActive=e,e&&(this.marketplaceActive=!1)}setMarketplaceActive(e){this.marketplaceActive=e,e&&(this.dashboardActive=!1)}render(){this.containerEl.empty(),this.containerEl.addClass("as-sidebar"),this.renderLibrarySection(),this.renderTypeSection(),this.renderToolSection(),this.renderProjectSection(),this.renderCollectionSection(),this.store.hasSkillkit||this.renderSkillkitCta()}renderSection(e,t){let s=this.containerEl.createDiv("as-sidebar-section");s.createDiv({cls:"as-sidebar-title",text:e});for(let i of t){let a=s.createDiv("as-sidebar-item");!this.dashboardActive&&this.isActive(i.filter)&&a.addClass("is-active");let r=a.createSpan("as-sidebar-icon");(0,R.setIcon)(r,i.icon),a.createSpan({cls:"as-sidebar-label",text:i.label}),i.count!==void 0&&a.createSpan({cls:"as-sidebar-count",text:String(i.count)}),a.addEventListener("click",()=>{this.dashboardActive&&this.onToggleDashboard(),this.marketplaceActive&&this.onToggleMarketplace(),this.store.setFilter(i.filter)})}}renderTypeSection(){let e=this.store.getTypeCounts(),s=[{label:"Skills",icon:"sparkles",type:"skill"},{label:"Commands",icon:"terminal",type:"command"},{label:"Agents",icon:"bot",type:"agent"},{label:"Rules",icon:"scroll",type:"rule"}].filter(i=>e.has(i.type)).map(i=>({label:i.label,icon:i.icon,filter:{kind:"type",type:i.type},count:e.get(i.type)||0}));s.length>0&&this.renderSection("Types",s)}renderToolSection(){let e=this.store.getToolCounts(),t=E.filter(i=>i.isInstalled()&&e.has(i.id));if(t.length===0)return;let s=this.containerEl.createDiv("as-sidebar-section");s.createDiv({cls:"as-sidebar-title",text:"Tools"});for(let i of t){let a={kind:"tool",toolId:i.id},r=s.createDiv("as-sidebar-item");!this.dashboardActive&&this.isActive(a)&&r.addClass("is-active");let l=r.createSpan("as-sidebar-icon");C[i.id]?j(l,i.id,14):(0,R.setIcon)(l,i.icon),r.createSpan({cls:"as-sidebar-label",text:i.name}),r.createSpan({cls:"as-sidebar-count",text:String(e.get(i.id)||0)}),r.addEventListener("click",()=>{this.dashboardActive&&this.onToggleDashboard(),this.store.setFilter(a)})}}renderProjectSection(){let e=this.store.getProjectCounts();if(e.size===0)return;let t=[];for(let[s,i]of e)t.push({label:s,icon:"folder-git-2",filter:{kind:"project",project:s},count:i});t.sort((s,i)=>s.label.localeCompare(i.label)),this.renderSection("Projects",t)}renderCollectionSection(){let e=this.containerEl.createDiv("as-sidebar-section");e.createDiv({cls:"as-sidebar-title",text:"Collections"});let t=new Set;for(let s of this.store.allItems)for(let i of s.collections)t.add(i);if(t.size===0){e.createDiv({cls:"as-sidebar-empty",text:"No collections yet"});return}for(let s of t){let i={kind:"collection",name:s},a=e.createDiv("as-sidebar-item");!this.dashboardActive&&this.isActive(i)&&a.addClass("is-active");let r=a.createSpan("as-sidebar-icon");(0,R.setIcon)(r,"folder"),a.createSpan({cls:"as-sidebar-label",text:s}),a.addEventListener("click",()=>{this.dashboardActive&&this.onToggleDashboard(),this.store.setFilter(i)})}}renderLibrarySection(){let e=this.containerEl.createDiv("as-sidebar-section");e.createDiv({cls:"as-sidebar-title",text:"Library"});let t=[{label:"All Skills",icon:"layers",filter:{kind:"all"}},{label:"Favorites",icon:"star",filter:{kind:"favorites"}}],s=this.dashboardActive||this.marketplaceActive;for(let o of t){let c=e.createDiv("as-sidebar-item");!s&&this.isActive(o.filter)&&c.addClass("is-active");let d=c.createSpan("as-sidebar-icon");(0,R.setIcon)(d,o.icon),c.createSpan({cls:"as-sidebar-label",text:o.label}),c.addEventListener("click",()=>{this.dashboardActive&&this.onToggleDashboard(),this.marketplaceActive&&this.onToggleMarketplace(),this.store.setFilter(o.filter)})}let i=e.createDiv("as-sidebar-item");this.dashboardActive&&i.addClass("is-active");let a=i.createSpan("as-sidebar-icon");(0,R.setIcon)(a,"bar-chart-2"),i.createSpan({cls:"as-sidebar-label",text:"Dashboard"}),i.addEventListener("click",()=>{this.marketplaceActive&&this.onToggleMarketplace(),this.dashboardActive||this.onToggleDashboard()});let r=e.createDiv("as-sidebar-item");this.marketplaceActive&&r.addClass("is-active");let l=r.createSpan("as-sidebar-icon");(0,R.setIcon)(l,"shopping-bag"),r.createSpan({cls:"as-sidebar-label",text:"Marketplace"}),r.addEventListener("click",()=>{this.dashboardActive&&this.onToggleDashboard(),this.marketplaceActive||this.onToggleMarketplace()})}renderSkillkitCta(){let e=this.containerEl.createDiv("as-skillkit-cta"),t=e.createDiv("as-skillkit-icon");(0,R.setIcon)(t,"bar-chart-2"),e.createDiv({cls:"as-skillkit-title",text:"Unlock analytics"}),e.createDiv({cls:"as-skillkit-desc",text:"Install skillkit to see usage stats, stale badges, and heavy skill warnings."}),e.createDiv("as-skillkit-cmd").createEl("code",{text:"npm i -g skillkit"}),e.createEl("a",{cls:"as-skillkit-link",text:"Learn more",href:"https://www.npmjs.com/package/skillkit"}).addEventListener("click",a=>{a.preventDefault(),je.shell.openExternal("https://www.npmjs.com/package/skillkit")})}isActive(e){let t=this.store.filter;return t.kind!==e.kind?!1:t.kind==="tool"&&e.kind==="tool"?t.toolId===e.toolId:t.kind==="type"&&e.kind==="type"?t.type===e.type:t.kind==="collection"&&e.kind==="collection"?t.name===e.name:t.kind==="project"&&e.kind==="project"?t.project===e.project:!0}};var O=require("obsidian"),Re=require("electron");var te=class{containerEl;store;onSelect;selectedId=null;inputEl=null;deepToggleEl=null;listEl=null;typeFilter=null;sortBy="name";dropdownEl=null;constructor(e,t,s){this.containerEl=e,this.store=t,this.onSelect=s}setSelected(e){this.selectedId=e}render(){if(!this.inputEl){this.containerEl.empty(),this.containerEl.addClass("as-list");let e=this.containerEl.createDiv("as-search");this.inputEl=e.createEl("input",{type:"text",placeholder:"Search skills...",cls:"as-search-input"}),this.inputEl.addEventListener("input",()=>{this.store.setSearch(this.inputEl.value)}),this.deepToggleEl=e.createDiv("as-deep-toggle"),(0,O.setIcon)(this.deepToggleEl,"search-code"),this.deepToggleEl.setAttribute("aria-label","Toggle deep search"),this.deepToggleEl.addEventListener("click",()=>{this.store.setDeepSearch(!this.store.deepSearch),this.updateDeepToggle()});let t=e.createDiv("as-filter-btn");(0,O.setIcon)(t,"filter"),t.setAttribute("aria-label","Filter by status"),t.addEventListener("click",i=>{i.stopPropagation(),this.toggleDropdown(t)});let s=e.createDiv("as-filter-btn");(0,O.setIcon)(s,this.sortBy==="usage"?"arrow-down-wide-narrow":"arrow-down-a-z"),s.setAttribute("aria-label",this.sortBy==="usage"?"Sorted by usage":"Sorted by name"),s.addEventListener("click",()=>{this.sortBy=this.sortBy==="name"?"usage":"name",(0,O.setIcon)(s,this.sortBy==="usage"?"arrow-down-wide-narrow":"arrow-down-a-z"),s.setAttribute("aria-label",this.sortBy==="usage"?"Sorted by usage":"Sorted by name"),this.renderList()}),this.listEl=this.containerEl.createDiv("as-list-items")}this.inputEl.value=this.store.searchQuery,this.updateDeepToggle(),this.renderList()}updateDeepToggle(){this.deepToggleEl&&(this.deepToggleEl.toggleClass("is-active",this.store.deepSearch),this.deepToggleEl.setAttribute("aria-label",this.store.deepSearch?"Deep search enabled \u2014 click to search names only":"Deep search disabled \u2014 click to search file content"))}toggleDropdown(e){if(this.dropdownEl){this.dropdownEl.remove(),this.dropdownEl=null;return}this.dropdownEl=e.createDiv("as-filter-dropdown");let t=[{id:"all",label:"All",cls:""},{id:"stale",label:"Stale",cls:"as-badge-stale"},{id:"heavy",label:"Heavy",cls:"as-badge-heavy"},{id:"oversized",label:"Oversized",cls:"as-badge-warn"},{id:"conflict",label:"Conflict",cls:"as-badge-conflict"}];for(let i of t){let a=this.dropdownEl.createDiv("as-filter-option");(i.id==="all"&&!this.typeFilter||i.id===this.typeFilter)&&a.addClass("is-active"),i.cls?a.createSpan({cls:i.cls,text:i.label}):a.setText(i.label),a.addEventListener("click",r=>{r.stopPropagation(),this.typeFilter=i.id==="all"?null:i.id,this.dropdownEl&&(this.dropdownEl.remove(),this.dropdownEl=null),this.renderList()})}let s=()=>{this.dropdownEl&&(this.dropdownEl.remove(),this.dropdownEl=null),document.removeEventListener("click",s)};setTimeout(()=>document.addEventListener("click",s),0)}renderList(){if(!this.listEl)return;this.listEl.empty();let e=this.store.filteredItems;if(this.typeFilter)switch(this.typeFilter){case"stale":e=e.filter(t=>t.usage?.isStale);break;case"heavy":e=e.filter(t=>t.usage?.isHeavy);break;case"oversized":e=e.filter(t=>t.warnings?.oversized);break;case"conflict":e=e.filter(t=>t.conflicts&&t.conflicts.length>0);break}if(this.sortBy==="usage"&&(e=[...e].sort((t,s)=>(s.usage?.uses??0)-(t.usage?.uses??0))),this.typeFilter){let t={stale:"Stale",heavy:"Heavy",oversized:"Oversized",conflict:"Conflict"},s=this.listEl.createDiv("as-active-filter");s.createSpan({text:`Showing: ${t[this.typeFilter]??this.typeFilter}`}),s.createSpan({cls:"as-filter-clear",text:"Clear"}).addEventListener("click",()=>{this.typeFilter=null,this.renderList()})}if(e.length===0){this.listEl.createDiv({cls:"as-list-empty",text:"No skills found"});return}for(let t of e)this.renderCard(this.listEl,t)}renderCard(e,t){let s=e.createDiv("as-skill-card");t.id===this.selectedId&&s.addClass("is-selected");let i=s.createDiv("as-skill-header");if(i.createSpan({cls:"as-skill-name",text:t.name}),t.isFavorite){let r=i.createSpan("as-skill-star");(0,O.setIcon)(r,"star")}t.description&&s.createDiv({cls:"as-skill-desc",text:t.description.length>80?t.description.slice(0,80)+"...":t.description});let a=s.createDiv("as-skill-meta");a.createSpan({cls:`as-type-tag as-type-${t.type}`,text:t.type});for(let r of t.tools){let l=E.find(c=>c.id===r);if(!l)continue;let o=a.createSpan("as-tool-badge");o.title=l.name,o.setAttribute("aria-label",l.name),o.setCssProps({"--tool-color":l.color}),C[r]?j(o,r,12):o.addClass("as-tool-badge-dot")}t.usage&&(t.usage.uses>0&&a.createSpan({cls:"as-usage-badge",text:`${t.usage.uses}`,attr:{"aria-label":`Used ${t.usage.uses} times`}}),t.usage.isStale&&a.createSpan({cls:"as-badge-stale",text:"stale"}),t.usage.isHeavy&&a.createSpan({cls:"as-badge-heavy",text:"heavy"})),t.warnings?.oversized&&a.createSpan({cls:"as-badge-warn",text:"oversized"}),t.conflicts&&t.conflicts.length>0&&a.createSpan({cls:"as-badge-conflict",text:"conflict"}),s.addEventListener("click",()=>{this.selectedId=t.id,this.onSelect(t)}),s.addEventListener("contextmenu",r=>{r.preventDefault();let l=new O.Menu;l.addItem(o=>o.setTitle("Reveal in system explorer").setIcon("folder-open").onClick(()=>Re.shell.showItemInFolder(t.filePath))),l.addItem(o=>o.setTitle("Copy file path").setIcon("copy").onClick(()=>navigator.clipboard.writeText(t.filePath))),l.showAtMouseEvent(r)})}};var y=require("obsidian"),Ze=require("fs"),Ke=require("electron");var ke=require("child_process"),_=require("fs"),k=require("path"),Oe=require("os"),I=(0,Oe.homedir)(),It=(0,k.join)(I,".skillkit","analytics.db");function Ne(){let n=["/usr/local/bin","/opt/homebrew/bin",(0,k.join)(I,".local","bin"),(0,k.join)(I,".bun","bin")],e=(0,k.join)(I,".nvm","versions","node");try{for(let s of(0,_.readdirSync)(e))n.push((0,k.join)(e,s,"bin"))}catch{}let t=(0,k.join)(I,".local","share","mise","installs");for(let s of["node","bun"])try{for(let i of(0,_.readdirSync)((0,k.join)(t,s)))n.push((0,k.join)(t,s,i,"bin"))}catch{}return[...n,process.env.PATH||""].join(":")}function _t(){let n=["/usr/local/bin/skillkit","/opt/homebrew/bin/skillkit",(0,k.join)(I,".local","bin","skillkit"),(0,k.join)(I,".bun","bin","skillkit"),(0,k.join)(I,".local","share","mise","shims","skillkit")];for(let s of n)if((0,_.existsSync)(s))return s;let e=(0,k.join)(I,".nvm","versions","node");try{for(let s of(0,_.readdirSync)(e)){let i=(0,k.join)(e,s,"bin","skillkit");if((0,_.existsSync)(i))return i}}catch{}let t=(0,k.join)(I,".local","share","mise","installs");for(let s of["node","bun"])try{for(let i of(0,_.readdirSync)((0,k.join)(t,s))){let a=(0,k.join)(t,s,i,"bin","skillkit");if((0,_.existsSync)(a))return a}}catch{}return null}var be;function Se(){return be===void 0&&(be=_t()),be}function L(){return Se()!==null||(0,_.existsSync)(It)}function $(n){let e=Se();if(!e)return null;try{let t=(0,ke.execSync)(`${e} ${n} --json`,{encoding:"utf-8",timeout:15e3,env:{...process.env,NO_COLOR:"1",PATH:Ne()},stdio:["pipe","pipe","pipe"]}).trim(),s=t.indexOf("{"),i=t.indexOf("["),a=s===-1?i:i===-1?s:Math.min(s,i);return a===-1?null:JSON.parse(t.slice(a))}catch{return null}}function Be(){let n=new Map;if(!L())return n;let e=$("stats");if(!e?.top_skills)return n;let t=Date.now();for(let s of e.top_skills){let i=s.daily.length>0?s.daily[s.daily.length-1]?.date:null,a=null;i&&(a=Math.floor((t-new Date(i).getTime())/(1e3*60*60*24))),n.set(s.name,{uses:s.total,lastUsed:i||null,daysSinceUsed:a,isStale:a!==null&&a>30,isHeavy:!1,daily:s.daily})}return n}function ze(){let n=new Map;if(!L())return n;let e=$("conflicts --dry-run");if(!e||!("pairs"in e))return n;for(let t of e.pairs)n.has(t.skill_a)||n.set(t.skill_a,[]),n.has(t.skill_b)||n.set(t.skill_b,[]),n.get(t.skill_a).push({skillName:t.skill_b,similarity:t.similarity}),n.get(t.skill_b).push({skillName:t.skill_a,similarity:t.similarity});return n}function We(n){if(!L())return[];let e=$(`trace --list --skill ${n} --limit 5`);return Array.isArray(e)?e.map(t=>({traceId:t.trace_id,timestamp:t.timestamp,tokens:t.tokens_total,cost:t.cost_estimate,duration:t.duration_ms,model:t.model||"unknown"})):[]}function Ve(){if(!L())return{oversized:[],longDesc:[]};let n=$("health");return n?.warnings?{oversized:n.warnings.oversized||[],longDesc:n.warnings.long_descriptions||[]}:{oversized:[],longDesc:[]}}function G(n){let e=Se();if(!e)return{success:!1,output:"skillkit not found"};try{return{success:!0,output:(0,ke.execSync)(`${e} ${n}`,{encoding:"utf-8",timeout:3e4,env:{...process.env,NO_COLOR:"1",PATH:Ne()},stdio:["pipe","pipe","pipe"]}).trim()}}catch(t){return{success:!1,output:t instanceof Error?t.message:"unknown error"}}}function ye(n){if(!n)return"never";let e=Date.now()-new Date(n).getTime(),t=Math.floor(e/6e4);if(t<60)return`${t}m ago`;let s=Math.floor(t/60);if(s<24)return`${s}h ago`;let i=Math.floor(s/24);return i<30?`${i}d ago`:`${Math.floor(i/30)}mo ago`}function Ue(n,e,t=48,s=16){if(e.length===0)return;let i=Math.max(...e,1),a=e.map((o,c)=>{let d=c/(e.length-1||1)*t,m=s-o/i*s;return`${d.toFixed(1)},${m.toFixed(1)}`}),r=document.createElementNS("http://www.w3.org/2000/svg","svg");r.setAttribute("viewBox",`0 0 ${t} ${s}`),r.setAttribute("width",String(t)),r.setAttribute("height",String(s)),r.classList.add("as-sparkline");let l=document.createElementNS("http://www.w3.org/2000/svg","polyline");l.setAttribute("points",a.join(" ")),l.setAttribute("fill","none"),l.setAttribute("stroke","currentColor"),l.setAttribute("stroke-width","1.5"),l.setAttribute("stroke-linecap","round"),l.setAttribute("stroke-linejoin","round"),r.appendChild(l),n.appendChild(r)}var Ge=require("obsidian");function z(n,e,t,s){new we(n,e,t,s).open()}var we=class extends Ge.Modal{title;message;onConfirm;constructor(e,t,s,i){super(e),this.title=t,this.message=s,this.onConfirm=i}onOpen(){let{contentEl:e}=this;e.addClass("as-confirm-modal"),e.createEl("p",{cls:"as-confirm-title",text:this.title}),e.createEl("p",{cls:"as-confirm-message",text:this.message});let t=e.createDiv("as-confirm-buttons");t.createEl("button",{cls:"as-confirm-cancel",text:"Cancel"}).addEventListener("click",()=>this.close()),t.createEl("button",{cls:"as-confirm-action mod-warning",text:"Confirm"}).addEventListener("click",()=>{this.close(),this.onConfirm()})}onClose(){this.contentEl.empty()}};function At(n){return Math.ceil(n.length/4)}function Ht(n){return n<1024?`${n} B`:n<1024*1024?`${(n/1024).toFixed(1)} KB`:`${(n/(1024*1024)).toFixed(1)} MB`}function Je(n){return n>=1e3?`${(n/1e3).toFixed(1)}k`:String(n)}function $t(n){return new Date(n).toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}var se=class{containerEl;store;settings;saveSettings;currentItem=null;isEditing=!1;app;constructor(e,t,s,i,a){this.containerEl=e,this.store=t,this.settings=s,this.saveSettings=i,this.app=a.app}show(e){this.currentItem=e,this.isEditing=!1,this.render()}clear(){this.currentItem=null,this.containerEl.empty(),this.containerEl.addClass("as-detail");let e=this.containerEl.createDiv("as-detail-empty");(0,y.setIcon)(e.createDiv("as-detail-empty-icon"),"file-text"),e.createDiv({text:"Select a skill to view"})}render(){this.containerEl.empty(),this.containerEl.addClass("as-detail");let e=this.currentItem;if(!e)return this.clear();this.renderToolbar(e),this.isEditing?this.renderEditor(e):this.renderPreview(e)}renderToolbar(e){let t=this.containerEl.createDiv("as-detail-toolbar"),s=t.createDiv("as-toolbar-top"),i=s.createDiv("as-toolbar-left");i.createSpan({cls:"as-detail-title",text:e.name});for(let g of e.tools){let f=E.find(fe=>fe.id===g);if(!f)continue;let V=i.createSpan("as-tool-name-badge");V.setCssProps({"--tool-color":f.color}),C[g]&&j(V,g,12),V.createSpan({text:f.name})}let a=s.createDiv("as-toolbar-right"),r=a.createEl("button",{cls:"as-toolbar-btn",attr:{"aria-label":"Toggle favorite"}});(0,y.setIcon)(r,e.isFavorite?"star":"star-off"),r.addEventListener("click",()=>{this.store.toggleFavorite(e.id,this.settings),this.saveSettings(),this.render()});let l=a.createEl("button",{cls:"as-toolbar-btn",attr:{"aria-label":this.isEditing?"Preview":"Edit"}});(0,y.setIcon)(l,this.isEditing?"eye":"pencil"),l.addEventListener("click",()=>{this.isEditing=!this.isEditing,this.render()});let o=a.createEl("button",{cls:"as-toolbar-btn",attr:{"aria-label":"Show in system explorer"}});if((0,y.setIcon)(o,"folder-open"),o.addEventListener("click",()=>{Ke.shell.showItemInFolder(e.filePath)}),L()){let g=a.createEl("button",{cls:"as-toolbar-btn as-toolbar-btn-danger",attr:{"aria-label":"Remove skill"}});(0,y.setIcon)(g,"trash-2"),g.addEventListener("click",()=>{z(this.app,"Remove skill",`Remove "${e.name}"? This will delete the skill files.`,()=>{let f=G(`prune --skill ${e.name} --yes`);f.success?(new y.Notice(`Removed ${e.name}`,5e3),this.store.refresh(this.settings),this.clear()):new y.Notice(`Failed to remove: ${f.output}`,5e3)})})}let c=t.createDiv("as-detail-meta-bar"),d=At(e.content),m=e.content.length;if(c.createSpan({cls:"as-meta-item",text:Ht(e.fileSize)}),c.createSpan({cls:"as-meta-item",text:`${Je(m)} chars`}),c.createSpan({cls:"as-meta-item",text:`~${Je(d)} tokens`}),c.createSpan({cls:"as-meta-item",text:$t(e.lastModified)}),c.createSpan({cls:"as-meta-item as-meta-type",text:e.type}),e.usage&&e.usage.uses>0){let g=t.createDiv("as-detail-usage-bar");g.createSpan({cls:"as-usage-stat",text:`${e.usage.uses} uses`}),g.createSpan({cls:"as-usage-stat",text:`last: ${ye(e.usage.lastUsed)}`}),e.usage.isStale&&g.createSpan({cls:"as-badge-stale",text:"stale"}),e.usage.isHeavy&&g.createSpan({cls:"as-badge-heavy",text:"heavy"})}}renderFrontmatter(e,t){let s=Object.keys(t.frontmatter),i=e.createDiv("as-frontmatter");if(t.filePath){let a=i.createDiv("as-fm-prop");a.createSpan({cls:"as-fm-key",text:"path"}),a.createSpan({cls:"as-fm-value",text:t.filePath})}if(!(s.length===0&&!t.filePath))for(let a of s){let r=t.frontmatter[a];if(r==null)continue;let l=i.createDiv("as-fm-prop");l.createSpan({cls:"as-fm-key",text:a});let o=typeof r=="object"||Array.isArray(r)?JSON.stringify(r):String(r);o.length>200?l.createDiv({cls:"as-fm-value-long",text:o}):l.createSpan({cls:"as-fm-value",text:o})}}renderPreview(e){let t=this.containerEl.createDiv("as-detail-body");this.renderFrontmatter(t,e),this.renderWarnings(t,e),this.renderUsageSection(t,e),this.renderConflicts(t,e),this.renderTraces(t,e);let s=t.createDiv("as-detail-preview markdown-rendered");y.MarkdownRenderer.render(this.app,e.content,s,e.filePath,this)}renderWarnings(e,t){let s=[];if(t.warnings?.oversized&&s.push(`${t.warnings.lineCount} lines (recommended: <500)`),t.warnings?.longDesc&&s.push(`Description is ${t.warnings.descChars} chars (recommended: <1024)`),t.conflicts&&t.conflicts.length>0){let l=t.conflicts.map(o=>o.skillName).join(", ");s.push(`Conflicts with: ${l}`)}if(s.length===0)return;let i=e.createDiv("as-warnings"),a=i.createDiv("as-warnings-icon");(0,y.setIcon)(a,"alert-triangle");let r=i.createDiv("as-warnings-list");for(let l of s)r.createDiv({cls:"as-warnings-item",text:l})}renderUsageSection(e,t){if(!t.usage||t.usage.uses===0)return;let s=e.createDiv("as-usage-section"),i=s.createDiv("as-usage-left");if(i.createSpan({cls:"as-usage-count",text:String(t.usage.uses)}),i.createSpan({cls:"as-usage-label",text:"uses"}),i.createSpan({cls:"as-usage-last",text:ye(t.usage.lastUsed)}),t.usage.daily&&t.usage.daily.length>1){let a=s.createDiv("as-usage-spark");Ue(a,t.usage.daily.map(r=>r.count),80,20)}}renderConflicts(e,t){if(!t.conflicts||t.conflicts.length===0)return;let s=e.createDiv("as-conflicts-section");s.createDiv({cls:"as-section-title",text:`Conflicts (${t.conflicts.length})`});for(let i of t.conflicts){let a=s.createDiv("as-conflict-row");a.createSpan({cls:"as-conflict-name",text:i.skillName}),a.createDiv("as-conflict-bar-wrap").createDiv("as-conflict-bar").setCssProps({"--bar-w":`${(i.similarity*100).toFixed(0)}%`}),a.createSpan({cls:"as-conflict-score",text:`${(i.similarity*100).toFixed(0)}%`})}}renderTraces(e,t){if(!L())return;let s=We(t.name);if(s.length===0)return;let i=e.createDiv("as-traces-section");i.createDiv({cls:"as-section-title",text:`Recent traces (${s.length})`});let a=i.createDiv("as-traces-table");for(let r of s){let l=a.createDiv("as-trace-row"),o=new Date(r.timestamp);l.createSpan({cls:"as-trace-date",text:o.toLocaleDateString(void 0,{month:"short",day:"numeric"})}),l.createSpan({cls:"as-trace-model",text:r.model.replace("claude-","").replace("-4-6","")}),l.createSpan({cls:"as-trace-tokens",text:`${(r.tokens/1e3).toFixed(1)}k`}),l.createSpan({cls:"as-trace-cost",text:r.cost>0?`$${r.cost.toFixed(2)}`:""}),l.createSpan({cls:"as-trace-duration",text:`${(r.duration/1e3).toFixed(1)}s`})}i.createDiv({cls:"as-traces-hint",text:"skillkit trace --list --skill "+t.name})}renderPruneAction(e,t){let s=e.createDiv("as-prune-section"),i=s.createEl("button",{cls:"as-prune-btn",text:"Remove this skill"});s.createSpan({cls:"as-prune-hint",text:"This skill hasn't been used in 30+ days"}),i.addEventListener("click",()=>{z(this.app,"Remove skill",`Remove "${t.name}"? This will delete the skill files.`,()=>{let a=G(`prune --skill ${t.name} --yes`);a.success?(new y.Notice(`Removed ${t.name}`,5e3),this.store.refresh(this.settings)):new y.Notice(`Failed to remove: ${a.output}`,5e3)})})}renderEditor(e){let t=this.containerEl.createDiv("as-detail-body as-detail-body-editor"),s=t.createEl("textarea",{cls:"as-editor-textarea"});s.value=e.content,s.spellcheck=!1,s.addEventListener("keydown",r=>{if((r.metaKey||r.ctrlKey)&&r.key==="s"&&(r.preventDefault(),this.saveFile(e,s.value)),r.key==="Tab"){r.preventDefault();let l=s.selectionStart,o=s.selectionEnd;s.value=s.value.substring(0,l)+" "+s.value.substring(o),s.selectionStart=s.selectionEnd=l+1}});let i=t.createDiv("as-save-bar");i.createEl("button",{cls:"as-save-btn",text:"Save"}).addEventListener("click",()=>{this.saveFile(e,s.value)}),i.createSpan({cls:"as-save-hint",text:"Cmd+S to save"})}saveFile(e,t){try{(0,Ze.writeFileSync)(e.filePath,t,"utf-8"),e.content=t,new y.Notice(`Saved ${e.name}`,5e3)}catch(s){new y.Notice(`Failed to save: ${s instanceof Error?s.message:String(s)}`,5e3)}}};var A=require("obsidian"),ot=require("electron");var De=require("child_process"),w=require("fs"),S=require("path"),Ye=require("os"),q=require("obsidian"),x=(0,Ye.homedir)(),Qe=(0,S.join)(x,".agents",".skill-lock.json"),Ft="https://skills.sh/api";async function xe(n){if(n.length<2)return[];try{let t=(await(0,q.requestUrl)({url:`${Ft}/search?q=${encodeURIComponent(n)}&limit=30`})).json;if(!t.skills)return[];let s=it();return t.skills.map(i=>({...i,installed:s.has(i.name)}))}catch{return[]}}var qe=new Map;async function jt(n){let e=qe.get(n);if(e)return e;let s=(await(0,q.requestUrl)({url:`https://api.github.com/repos/${n}`})).json.default_branch||"main",a=(await(0,q.requestUrl)({url:`https://api.github.com/repos/${n}/git/trees/${s}?recursive=1`})).json.tree.filter(l=>l.path.endsWith("/SKILL.md")).map(l=>l.path),r={branch:s,files:a};return qe.set(n,r),r}function Rt(n,e,t){let s=e.split("/"),i=s[s.length-1]||n,a=new Set([i,n]);for(let r of t.split("/")){n.startsWith(r+"-")&&a.add(n.slice(r.length+1));for(let l of r.split("-"))n.startsWith(l+"-")&&a.add(n.slice(l.length+1))}return a}async function et(n,e,t){try{let{branch:s,files:i}=await jt(n),a=Rt(e,t,n),r=i.find(c=>{let d=c.replace("/SKILL.md","").split("/").pop()||"";return a.has(d)});r||(r=i.find(c=>{let d=c.replace("/SKILL.md","").split("/").pop()||"";return e.includes(d)||d.includes(e)}));let l=r||`skills/${e}/SKILL.md`;return(await(0,q.requestUrl)({url:`https://raw.githubusercontent.com/${n}/${s}/${l}`})).text}catch{return null}}async function tt(){let n=["react","next","clerk","stripe","ai"],e=new Set,t=[];for(let s of n){let i=await xe(s);for(let a of i)e.has(a.id)||(e.add(a.id),t.push(a))}return t.sort((s,i)=>i.installs-s.installs).slice(0,20)}function Ot(){let n=["/usr/local/bin","/opt/homebrew/bin",(0,S.join)(x,".local","bin"),(0,S.join)(x,".bun","bin")],e=(0,S.join)(x,".nvm","versions","node");try{for(let t of(0,w.readdirSync)(e))n.push((0,S.join)(e,t,"bin"))}catch{}return[...n,process.env.PATH||""].join(":")}function Xe(){let n=(0,S.join)(x,".bun","bin","bunx");return(0,w.existsSync)(n)?n:(0,w.existsSync)("/usr/local/bin/bunx")||(0,w.existsSync)("/opt/homebrew/bin/bunx")?"bunx":"npx"}function Ee(n="auto"){return n==="npx"?"npx":Xe()}var st=[{id:"claude-code",label:"Claude Code"},{id:"cursor",label:"Cursor"},{id:"codex",label:"Codex"},{id:"github-copilot",label:"GitHub Copilot"},{id:"windsurf",label:"Windsurf"},{id:"amp",label:"Amp"},{id:"opencode",label:"OpenCode"},{id:"cline",label:"Cline"},{id:"gemini-cli",label:"Gemini CLI"},{id:"goose",label:"Goose"},{id:"kiro-cli",label:"Kiro"},{id:"roo",label:"Roo Code"},{id:"continue",label:"Continue"},{id:"antigravity",label:"Antigravity"},{id:"warp",label:"Warp"},{id:"pi",label:"Pi"},{id:"replit",label:"Replit"}],ie={"claude-code":"claude-code",cursor:"cursor",codex:"codex",copilot:"github-copilot",windsurf:"windsurf",amp:"amp",opencode:"opencode",antigravity:"antigravity","claude-desktop":"claude-code",pi:"pi","global-agents":"claude-code",aider:"claude-code"};function it(){let n=new Set;if(!(0,w.existsSync)(Qe))return n;try{let e=JSON.parse((0,w.readFileSync)(Qe,"utf-8"));if(e.skills)for(let t of Object.keys(e.skills))n.add(t)}catch{}return n}var Nt=[(0,S.join)(x,".claude","skills"),(0,S.join)(x,".cursor","skills"),(0,S.join)(x,".codex","skills"),(0,S.join)(x,".codeium","windsurf","skills"),(0,S.join)(x,".config","amp","skills"),(0,S.join)(x,".config","opencode","skills"),(0,S.join)(x,".copilot","skills"),(0,S.join)(x,".agents","skills")];function Bt(n){for(let e of Nt){let t=(0,S.join)(e,n);if((0,w.existsSync)(t))try{(0,w.rmSync)(t,{recursive:!0,force:!0})}catch{}}zt(n)}function zt(n){let e=(0,S.join)(x,".agents",".skill-lock.json");if((0,w.existsSync)(e))try{let t=JSON.parse((0,w.readFileSync)(e,"utf-8"));t.skills&&t.skills[n]&&(delete t.skills[n],(0,w.writeFileSync)(e,JSON.stringify(t,null,2)+`
+`,"utf-8"))}catch{}}function ne(n){let e=it();for(let t of n)t.installed=e.has(t.name);return n}function Ce(n,e=12e4){return new Promise(t=>{(0,De.exec)(n,{encoding:"utf-8",timeout:e,env:{...process.env,PATH:Ot(),NO_COLOR:"1"}},(s,i)=>{let a=String(i??"");!s||a.includes("Done")||a.includes("Installed")||a.includes("Removed")||a.includes("Updated")?t({success:!0,output:a}):t({success:!1,output:s?.message??"Command failed"})})})}async function nt(n,e,t={}){let s=e.length>0?`-a ${e.join(" ")}`:"-a '*'",i=t.global?"-g":"",r=`${Ee(t.runner||"auto")} skills add ${n} ${s} ${i} -y`.replace(/\s+/g," ").trim();return Ce(r)}async function at(n,e="auto"){let s=`${Ee(e)} skills remove ${n} -y`,i=await Ce(s,3e4);return Bt(n),{success:!0,output:i.output||`Cleaned ${n}`}}async function rt(n="auto"){let t=`${Ee(n)} skills update`,s=await Ce(t),i=s.output.match(/Updated (\d+) skill/);return{...s,count:i?parseInt(i[1]):0}}function Le(n){return n>=1e6?`${(n/1e6).toFixed(1)}M`:n>=1e3?`${(n/1e3).toFixed(1)}K`:String(n)}var J=require("fs"),lt=require("path"),ct=require("os");function Wt(){let n=$("stats"),e=$("health"),t=$("burn"),s=$("context");return{stats:n,health:e,burn:t&&t.length>0?t[0]:null,context:s}}var Te=(0,lt.join)((0,ct.homedir)(),".skillkit","dashboard-cache.json"),H=null,N=null;function Vt(){if(!H&&(0,J.existsSync)(Te))try{let n=JSON.parse((0,J.readFileSync)(Te,"utf-8"));H=n.data,N=n.cachedAt}catch{}}function Ut(){if(H)try{(0,J.writeFileSync)(Te,JSON.stringify({data:H,cachedAt:N},null,2),"utf-8")}catch{}}Vt();var ae=class{containerEl;app;constructor(e,t){this.containerEl=e,this.app=t}render(){if(this.containerEl.empty(),this.containerEl.addClass("as-dashboard"),!L()){this.renderNoSkillkit();return}if(H)this.renderDashboard(H);else{let e=this.containerEl.createDiv("as-dash-loading");e.createDiv("as-dash-spinner"),e.createDiv({cls:"as-dash-loading-text",text:"Loading analytics..."}),setTimeout(()=>{let t=Wt();H=t,N=Date.now(),Ut(),e.remove(),this.renderDashboard(t)},10)}}renderDashboard(e){if(this.renderActionBar(e),e.stats&&this.renderOverview(e.stats,e.health),e.stats&&this.renderTopSkills(e.stats),e.health||e.context){let t=this.containerEl.createDiv("as-dash-row");e.health&&this.renderHealth(e.health,t),e.context&&this.renderContext(e.context,t)}e.burn&&this.renderBurn(e.burn),e.health&&this.renderStale(e.health)}renderActionBar(e){let t=this.containerEl.createDiv("as-dash-action-bar");if(N){let r=Math.round((Date.now()-N)/1e3),l=r<5?"just now":r<60?`${r}s ago`:`${Math.round(r/60)}m ago`;t.createSpan({cls:"as-dash-updated",text:`Updated ${l}`})}let s=t.createDiv("as-dash-action-buttons"),i=s.createEl("button",{cls:"as-action-btn",text:"Update skills"});i.addEventListener("click",()=>{i.setText("Updating..."),i.disabled=!0,rt().then(r=>{if(r.success){let l=r.count>0?`Updated ${r.count} skill(s)`:"All skills up to date";new A.Notice(l,5e3),H=null,N=null,this.render()}else new A.Notice(`Update failed: ${r.output}`,5e3);i.setText("Update skills"),i.disabled=!1})});let a=s.createEl("button",{cls:"as-action-btn",text:"Scan sessions"});if(a.addEventListener("click",()=>{a.setText("Scanning..."),a.disabled=!0,setTimeout(()=>{let r=G("scan");r.success?(new A.Notice("Scan complete",5e3),H=null,N=null,this.render()):new A.Notice(`Scan failed: ${r.output}`,5e3),a.setText("Scan sessions"),a.disabled=!1},10)}),e.health&&e.health.usage.unused_30d>0){let r=s.createEl("button",{cls:"as-action-btn as-action-btn-danger",text:`Prune ${e.health.usage.unused_30d} stale`});r.addEventListener("click",()=>{z(this.app,"Prune stale skills",`Remove ${e.health.usage.unused_30d} unused skills? This cannot be undone.`,()=>{r.setText("Pruning..."),r.disabled=!0,setTimeout(()=>{let l=G("prune --yes");l.success?(new A.Notice("Pruned stale skills",5e3),H=null,N=null,this.render()):new A.Notice(`Prune failed: ${l.output}`,5e3),r.setText(`Prune ${e.health.usage.unused_30d} stale`),r.disabled=!1},10)})})}}renderNoSkillkit(){let e=this.containerEl.createDiv("as-dash-empty"),t=e.createDiv("as-dash-empty-icon");(0,A.setIcon)(t,"bar-chart-2"),e.createEl("h3",{text:"Dashboard requires skillkit"}),e.createEl("p",{text:"Install skillkit to unlock usage analytics, burn rate, context tax, and more."}),e.createDiv("as-dash-install-cmd").createEl("code",{text:"npm i -g @crafter/skillkit && skillkit scan"}),e.createEl("a",{cls:"as-skillkit-link",text:"Learn more",href:"https://www.npmjs.com/package/@crafter/skillkit"}).addEventListener("click",a=>{a.preventDefault(),ot.shell.openExternal("https://www.npmjs.com/package/@crafter/skillkit")})}renderOverview(e,t){let s=this.containerEl.createDiv("as-dash-section");s.createDiv({cls:"as-dash-title",text:"Overview"});let i=s.createDiv("as-dash-stats");if(this.statCard(i,String(e.total_invocations),"invocations","activity"),this.statCard(i,String(e.unique_skills),"active skills","sparkles"),this.statCard(i,String(t?.installed??0),"installed","package"),this.statCard(i,String(t?.usage.unused_30d??0),"stale","alert-triangle"),e.streak&&e.streak.current>0){let a=s.createDiv("as-dash-streak-row");a.createSpan({cls:"as-streak-value",text:`${e.streak.current} day streak`}),e.streak.current>=7&&a.createSpan({cls:"as-streak-fire",text:"on fire"}),a.createSpan({cls:"as-streak-longest",text:`longest: ${e.streak.longest}d`})}if(e.velocity&&e.velocity.this_week>0){let a=s.createDiv("as-dash-velocity-row");a.createSpan({text:`This week: $${e.velocity.this_week.toFixed(0)}`}),a.createSpan({cls:"as-velocity-vs",text:`vs $${e.velocity.last_week.toFixed(0)} last week`});let r=e.velocity.change_pct,l=r>0?"as-velocity-up":r<0?"as-velocity-down":"",o=r>0?"+":"";a.createSpan({cls:`as-velocity-change ${l}`,text:`${o}${r.toFixed(0)}%`})}}statCard(e,t,s,i){let a=e.createDiv("as-stat-card"),r=a.createDiv("as-stat-icon");(0,A.setIcon)(r,i),a.createDiv({cls:"as-stat-value",text:t}),a.createDiv({cls:"as-stat-label",text:s})}renderTopSkills(e){if(e.top_skills.length===0)return;let t=this.containerEl.createDiv("as-dash-section");t.createDiv({cls:"as-dash-title",text:`Top Skills (${e.period.days}d)`});let s=e.top_skills[0]?.total||1,i=t.createDiv("as-dash-bars");for(let a of e.top_skills.slice(0,10)){let r=i.createDiv("as-bar-row");r.createSpan({cls:"as-bar-name",text:a.name}),r.createDiv("as-bar-wrap").createDiv("as-bar-fill").setCssProps({"--bar-w":`${a.total/s*100}%`}),r.createSpan({cls:"as-bar-count",text:String(a.total)})}}renderHealth(e,t){let s=(t||this.containerEl).createDiv("as-dash-section");s.createDiv({cls:"as-dash-title",text:"Health"});let i=e.usage.used_30d+e.usage.unused_30d,a=i>0?Math.round(e.usage.used_30d/i*100):0,r=s.createDiv("as-dash-health-row"),l=r.createDiv("as-donut");l.setCssProps({"--pct":`${a}`}),l.createDiv({cls:"as-donut-label",text:`${a}%`}),l.createDiv({cls:"as-donut-sub",text:"active"});let o=r.createDiv("as-health-details");o.createDiv({cls:"as-health-line",text:`${e.usage.used_30d} used in 30d`}),o.createDiv({cls:"as-health-line as-health-warn",text:`${e.usage.unused_30d} never triggered`});let d=o.createDiv("as-budget-bar").createDiv("as-budget-fill");d.setCssProps({"--bar-w":`${e.metadata.pct}%`}),e.metadata.pct>80&&d.addClass("as-budget-over"),o.createDiv({cls:"as-health-line",text:`Metadata budget: ${e.metadata.pct}%`})}renderBurn(e){let t=this.containerEl.createDiv("as-dash-section");t.createDiv({cls:"as-dash-title",text:`Burn Rate \u2014 ${e.agent} (${e.period.days}d)`});let s=t.createDiv("as-dash-stats as-dash-stats-sm");if(this.statCard(s,`$${Math.round(e.cost.total).toLocaleString()}`,"total cost","flame"),this.statCard(s,`$${Math.round(e.cost.total/(e.period.days||1)).toLocaleString()}`,"daily avg","trending-up"),this.statCard(s,`${(e.period.sessions||0).toLocaleString()}`,"sessions","terminal"),this.statCard(s,`${((e.period.api_calls||0)/1e3).toFixed(0)}k`,"API calls","zap"),e.by_model&&e.by_model.length>0){let l=t.createDiv("as-model-breakdown");for(let o of e.by_model.slice(0,4)){let c=l.createDiv("as-model-row");c.createSpan({cls:"as-model-name",text:o.model}),c.createSpan({cls:"as-model-calls",text:`${o.apiCalls.toLocaleString()} calls`}),o.costUsd>0&&c.createSpan({cls:"as-model-cost",text:`$${Math.round(o.costUsd).toLocaleString()}`})}}let i=e.by_day.slice(-14);if(i.length===0)return;let a=Math.max(...i.map(l=>l.costUsd),1),r=t.createDiv("as-burn-chart");for(let l of i){let o=r.createDiv("as-burn-col"),c=o.createDiv("as-burn-bar"),d=Math.max(2,l.costUsd/a*100);c.setCssProps({"--bar-h":`${d}%`}),c.title=`${l.date}: $${l.costUsd.toFixed(0)}`,o.createDiv({cls:"as-burn-date",text:l.date.slice(8)})}}renderContext(e,t){let s=(t||this.containerEl).createDiv("as-dash-section");s.createDiv({cls:"as-dash-title",text:"Context Tax"});let i=e.always_loaded.total_tokens,a=[{label:"CLAUDE.md",tokens:e.always_loaded.claude_md_tokens,cls:"as-ctx-claude"},{label:"Skills metadata",tokens:e.always_loaded.skill_metadata_tokens,cls:"as-ctx-skills"},{label:"Memory",tokens:e.always_loaded.memory_tokens,cls:"as-ctx-memory"}],r=s.createDiv("as-ctx-bar");for(let c of a){let d=r.createDiv(`as-ctx-part ${c.cls}`);d.setCssProps({"--bar-w":`${c.tokens/i*100}%`}),d.title=`${c.label}: ${(c.tokens/1e3).toFixed(1)}k tokens`}let l=s.createDiv("as-ctx-legend");for(let c of a){let d=l.createDiv("as-ctx-legend-item");d.createSpan({cls:`as-ctx-dot ${c.cls}`}),d.createSpan({text:`${c.label}: ${(c.tokens/1e3).toFixed(1)}k`})}let o=s.createDiv("as-ctx-costs");o.createDiv({text:`Per session (cached): $${e.session_estimate.with_cache.toFixed(2)}`}),o.createDiv({text:`Without cache: $${e.session_estimate.without_cache.toFixed(2)}`}),o.createDiv({cls:"as-ctx-savings",text:`Cache saves ${e.session_estimate.savings_pct.toFixed(0)}%`})}renderStale(e){if(e.usage.never_used.length===0)return;let t=this.containerEl.createDiv("as-dash-section");t.createDiv({cls:"as-dash-title",text:`Stale skills (${e.usage.unused_30d})`});let s=t.createDiv("as-stale-list");for(let i of e.usage.never_used.slice(0,20))s.createDiv("as-stale-item").createSpan({text:i});e.usage.never_used.length>20&&s.createDiv({cls:"as-stale-more",text:`+${e.usage.never_used.length-20} more`})}};var P=require("obsidian"),K=require("fs"),bt=require("path"),kt=require("os");var T=require("obsidian"),Z=require("fs"),ft=require("path"),vt=require("os");var h=require("fs"),v=require("path"),re=require("os"),pt=require("obsidian"),ut=require("crypto");var dt=new Set(["readme.md","license","license.md","changelog.md",".ds_store","thumbs.db"]);function Gt(n){return(0,ut.createHash)("sha256").update(n).digest("hex").slice(0,12)}function Jt(n){let e=n.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);if(!e)return{frontmatter:{},content:n};try{let t=(0,pt.parseYaml)(e[1]);return{frontmatter:typeof t=="object"&&t?t:{},content:e[2]}}catch{return{frontmatter:{},content:n}}}function Zt(n,e,t,s="auto"){if(s==="auto"){if(typeof n.name=="string"&&n.name)return n.name;let a=e.match(/^#\s+(.+)$/m);if(a)return a[1].trim()}let i=(0,v.basename)(t,(0,v.extname)(t));return i==="SKILL"?(0,v.basename)((0,v.join)(t,"..")):i}function Kt(n,e,t,s="auto"){if(!(0,h.existsSync)(n))return[];let i=[];for(let a of(0,h.readdirSync)(n,{withFileTypes:!0})){let r=(0,v.join)(n,a.name);if(!(a.isDirectory()||a.isSymbolicLink()&&(0,h.statSync)(r,{throwIfNoEntry:!1})?.isDirectory()))continue;let o=(0,v.join)(r,"SKILL.md");if(!(0,h.existsSync)(o))continue;let c=X(o,e,t,"directory-with-skillmd",s);c&&i.push(c)}return i}function Qt(n,e,t,s="auto"){if(!(0,h.existsSync)(n))return[];let i=[];for(let a of(0,h.readdirSync)(n,{withFileTypes:!0})){let r=(0,v.join)(n,a.name);if(a.isDirectory()||a.isSymbolicLink()&&(0,h.statSync)(r,{throwIfNoEntry:!1})?.isDirectory()){let d=(0,v.join)(r,"SKILL.md");if((0,h.existsSync)(d)){let f=X(d,e,t,"flat-md",s);f&&i.push(f);continue}let m=(0,h.readdirSync)(r).filter(f=>f.endsWith(".md")&&!dt.has(f.toLowerCase())),g=m.find(f=>f.toLowerCase()===`${a.name.toLowerCase()}.md`)||m[0];if(g){let f=X((0,v.join)(r,g),e,t,"flat-md",s);f&&i.push(f)}continue}let o=a.name.toLowerCase();if(!o.endsWith(".md")||dt.has(o))continue;let c=X(r,e,t,"flat-md",s);c&&i.push(c)}return i}function qt(n,e,t,s="auto"){if(!(0,h.existsSync)(n))return[];let i=[];for(let a of(0,h.readdirSync)(n,{withFileTypes:!0})){if(!a.name.endsWith(".mdc")&&!a.name.endsWith(".md")||a.isDirectory())continue;let r=X((0,v.join)(n,a.name),e,t,"mdc",s);r&&i.push(r)}return i}function X(n,e,t,s="directory-with-skillmd",i="auto"){try{let a=(0,h.readFileSync)(n,"utf-8"),r=(0,h.statSync)(n),{frontmatter:l,content:o}=Jt(a),c=Zt(l,o,n,i),d=typeof l.description=="string"?l.description:"",m;try{m=(0,h.realpathSync)(n)}catch{m=n}return{id:Gt(m),name:c,description:d,type:e,tools:[t],filePath:n,realPath:m,dirPath:(0,v.join)(n,".."),content:a,frontmatter:l,lastModified:r.mtimeMs,fileSize:r.size,isFavorite:!1,collections:[]}}catch{return null}}function Me(n,e,t="auto"){switch(n.pattern){case"directory-with-skillmd":return Kt(n.baseDir,n.type,e,t);case"flat-md":return Qt(n.baseDir,n.type,e,t);case"mdc":return qt(n.baseDir,n.type,e,t)}}function Xt(n,e){let t=[],s=[{sub:".claude/skills",type:"skill",pattern:"directory-with-skillmd"},{sub:".claude/commands",type:"command",pattern:"flat-md"},{sub:".claude/agents",type:"agent",pattern:"flat-md"},{sub:".cursor/skills",type:"skill",pattern:"directory-with-skillmd"},{sub:".codex/skills",type:"skill",pattern:"directory-with-skillmd"}];for(let i of s){let a=(0,v.join)(n,i.sub);if(!(0,h.existsSync)(a))continue;let r={baseDir:a,type:i.type,pattern:i.pattern};t.push(...Me(r,e))}return t}function ht(n){return n.projectsHomeDir||(0,re.homedir)()}function Yt(n,e){let t=(0,re.homedir)(),s=[];for(let i of[...e.paths,...e.agentPaths]){let a=(0,v.relative)(t,i.baseDir);if(a.startsWith("..")||a.startsWith("/"))continue;let r=(0,v.join)(n,a);if((0,h.existsSync)(r))try{s.push(...Me({...i,baseDir:r},e.id))}catch{}}return s}function es(n){let e=ht(n);if(!(0,h.existsSync)(e))return[];let t=[];try{let s=new Set(["node_modules",".Trash","Library","Applications","Music","Movies","Pictures","Public"]);for(let i of(0,h.readdirSync)(e,{withFileTypes:!0})){if(!i.isDirectory()&&!i.isSymbolicLink()||s.has(i.name))continue;let a=(0,v.join)(e,i.name);for(let r of E){if(!r.isInstalled())continue;let l=n.tools[r.id];if(l&&!l.enabled)continue;let o=Yt(a,r);o.length>0&&t.push({items:o,toolId:r.id})}}}catch{}return t}function Pe(n,e){let t=e||(0,re.homedir)();if(!n.startsWith(t+"/"))return"global";let i=n.slice(t.length+1).split("/");return i.length>1&&!i[0].startsWith(".")?i[0]:"global"}function mt(n){let e=n.namingMode||"auto",t=new Map,s=new Map;function i(a,r){let l=t.get(a.id);if(l){l.tools.includes(r)||l.tools.push(r);return}let o=s.get(a.name);if(o){let c=t.get(o);c&&!c.tools.includes(r)&&c.tools.push(r);return}a.isFavorite=n.favorites.includes(a.id);for(let[c,d]of Object.entries(n.collections))d.includes(a.id)&&a.collections.push(c);t.set(a.id,a),s.set(a.name,a.id)}for(let a of E){if(!a.isInstalled())continue;let r=n.tools[a.id];if(r&&!r.enabled)continue;let l=[...a.paths,...a.agentPaths];for(let o of l)for(let c of Me(o,a.id,e))i(c,a.id)}for(let a of n.customScanPaths)if((0,h.existsSync)(a))for(let r of Xt(a,"claude-code"))i(r,"claude-code");if(n.projectScanEnabled)for(let{items:a,toolId:r}of es(n))for(let l of a)i(l,r);return t}function Ie(){return E.filter(n=>n.isInstalled()).map(n=>n.id)}function gt(n){let e=[];for(let t of E)if(t.isInstalled())for(let s of[...t.paths,...t.agentPaths])(0,h.existsSync)(s.baseDir)&&e.push(s.baseDir);if(n?.projectScanEnabled){let t=ht(n),s=new Set(["node_modules",".Trash","Library","Applications","Music","Movies","Pictures","Public"]);try{for(let i of(0,h.readdirSync)(t,{withFileTypes:!0})){if(!i.isDirectory()&&!i.isSymbolicLink()||s.has(i.name))continue;let a=(0,v.join)(t,i.name);for(let r of[".claude/skills",".claude/commands",".claude/agents",".cursor/skills",".codex/skills"]){let l=(0,v.join)(a,r);(0,h.existsSync)(l)&&e.push(l)}}}catch{}}return e}var _e={};for(let[n,e]of Object.entries(ie))_e[e]||(_e[e]=n);var Ae=(0,ft.join)((0,vt.homedir)(),".skillkit","install-prefs.json"),W=null,oe=!0;function ts(){if(!W&&(0,Z.existsSync)(Ae))try{let n=JSON.parse((0,Z.readFileSync)(Ae,"utf-8"));W=new Set(n.agents||[]),oe=n.global??!0}catch{}}function ss(){try{(0,Z.writeFileSync)(Ae,JSON.stringify({agents:W?[...W]:[],global:oe}),"utf-8")}catch{}}ts();var le=class extends T.Modal{skill;settings;onInstalled;selectedAgents;isGlobal;constructor(e,t,s,i){if(super(e),this.skill=t,this.settings=s,this.onInstalled=i,W)this.selectedAgents=new Set(W);else{this.selectedAgents=new Set;let a=Ie();for(let r of a){let l=ie[r];l&&this.selectedAgents.add(l)}}this.isGlobal=oe}onOpen(){let{contentEl:e}=this;e.addClass("as-install-modal"),e.createEl("h3",{text:`Install ${this.skill.name}`}),e.createEl("p",{cls:"as-install-source",text:this.skill.source}),new T.Setting(e).setName("Install globally").setDesc("Shared across all projects (~/.agents/skills/)").addToggle(o=>o.setValue(this.isGlobal).onChange(c=>{this.isGlobal=c})),new T.Setting(e).setName("Agents").setHeading();let t=e.createDiv("as-install-scroll"),s=Ie(),i=new Set(s.map(o=>ie[o]).filter(Boolean));for(let o of st){let c=i.has(o.id),d=_e[o.id],g=new T.Setting(t).addToggle(fe=>fe.setValue(this.selectedAgents.has(o.id)).onChange(xt=>{xt?this.selectedAgents.add(o.id):this.selectedAgents.delete(o.id)})).nameEl,f=d&&C[d]?d:C[o.id]?o.id:C[o.id+"-code"]?o.id+"-code":C[o.id+"-cli"]?o.id+"-cli":null,V=g.createSpan("as-install-agent-icon");f?j(V,f,14):V.addClass("as-install-agent-placeholder"),g.createSpan({text:o.label}),c&&g.createSpan({cls:"as-install-detected",text:"detected"})}let a=e.createDiv("as-install-footer");a.createEl("button",{text:"Cancel"}).addEventListener("click",()=>this.close());let l=a.createEl("button",{cls:"mod-cta",text:"Install"});l.addEventListener("click",()=>this.doInstall(l))}doInstall(e){let t=[...this.selectedAgents];if(t.length===0){new T.Notice("Select at least one agent",5e3);return}W=new Set(this.selectedAgents),oe=this.isGlobal,ss(),this.close(),new T.Notice(`Installing ${this.skill.name}...`,3e3),nt(this.skill.source,t,{runner:this.settings.packageRunner,global:this.isGlobal}).then(s=>{s.success?(new T.Notice(`Installed ${this.skill.name}`,5e3),this.skill.installed=!0,this.onInstalled()):new T.Notice(`Failed to install ${this.skill.name}`,5e3)})}onClose(){this.contentEl.empty()}};var He=(0,bt.join)((0,kt.homedir)(),".skillkit","marketplace-popular.json"),M=null,ce="",B=null,is=new P.Component;function ns(){if(!M&&(0,K.existsSync)(He))try{let n=JSON.parse((0,K.readFileSync)(He,"utf-8"));M=ne(n)}catch{}}function as(){if(M)try{(0,K.writeFileSync)(He,JSON.stringify(M),"utf-8")}catch{}}ns();var de=class{containerEl;inputEl=null;listEl=null;previewEl=null;searchTimer=null;selectedSkill=null;app;settings;onRefresh;constructor(e,t,s,i){this.containerEl=e,this.app=t.app,this.settings=s,this.onRefresh=i}render(){if(!this.inputEl){this.containerEl.empty(),this.containerEl.addClass("as-marketplace");let e=this.containerEl.createDiv("as-mp-search");this.inputEl=e.createEl("input",{type:"text",placeholder:"Search skills on skills.sh...",cls:"as-mp-search-input"}),this.inputEl.addEventListener("input",()=>{this.searchTimer&&clearTimeout(this.searchTimer),this.searchTimer=setTimeout(()=>{this.doSearch(this.inputEl.value)},300)});let t=this.containerEl.createDiv("as-mp-body");this.listEl=t.createDiv("as-mp-list"),this.previewEl=t.createDiv("as-mp-preview"),this.previewEl.createDiv({cls:"as-mp-hint",text:"Select a skill to preview."})}this.inputEl.value=ce,ce.length>=2&&B?this.showResults(B):M?this.showPopular():this.loadPopular()}async loadPopular(){if(!this.listEl)return;this.listEl.empty(),this.listEl.createDiv({cls:"as-mp-loading",text:"Loading popular skills..."}),M=await tt(),as(),this.showPopular()}refreshList(){M&&ne(M),B&&ne(B),ce.length>=2&&B?this.showResults(B):this.showPopular()}showPopular(){if(this.listEl){if(this.listEl.empty(),!M||M.length===0){this.listEl.createDiv({cls:"as-mp-hint",text:"Search for skills to browse and install."});return}this.listEl.createDiv({cls:"as-mp-section-title",text:"Popular"});for(let e of M)this.renderSkillCard(e)}}showResults(e){if(this.listEl){if(this.listEl.empty(),e.length===0){this.listEl.createDiv({cls:"as-mp-hint",text:"No skills found."});return}for(let t of e)this.renderSkillCard(t)}}async doSearch(e){if(!this.listEl)return;if(ce=e,e.length<2){B=null,this.showPopular();return}this.listEl.empty(),this.listEl.createDiv({cls:"as-mp-loading",text:"Searching..."});let t=await xe(e);B=t,this.showResults(t)}renderSkillCard(e){if(!this.listEl)return;let t=this.listEl.createDiv("as-mp-card");this.selectedSkill?.id===e.id&&t.addClass("is-selected");let s=t.createDiv("as-mp-card-header");s.createSpan({cls:"as-mp-card-name",text:e.name}),e.installed&&s.createSpan({cls:"as-mp-installed-badge",text:"Installed"}),t.createDiv({cls:"as-mp-card-source",text:e.source});let i=t.createDiv("as-mp-card-meta"),a=i.createSpan("as-mp-dl-icon");(0,P.setIcon)(a,"download"),i.createSpan({cls:"as-mp-card-installs",text:Le(e.installs)}),t.addEventListener("click",()=>{this.selectedSkill=e,this.listEl&&this.listEl.querySelectorAll(".as-mp-card").forEach(r=>r.removeClass("is-selected")),t.addClass("is-selected"),this.showPreview(e)})}async showPreview(e){if(!this.previewEl)return;this.previewEl.empty();let s=this.previewEl.createDiv("as-mp-preview-header").createDiv("as-mp-preview-top"),i=s.createDiv("as-mp-preview-left");i.createDiv({cls:"as-mp-preview-name",text:e.name});let a=i.createDiv("as-mp-preview-meta");a.createSpan({cls:"as-mp-preview-source",text:e.source});let r=a.createSpan("as-mp-dl-icon");(0,P.setIcon)(r,"download"),a.createSpan({cls:"as-mp-preview-installs",text:Le(e.installs)});let l=s.createDiv("as-mp-preview-right");if(!e.installed)this.renderInstallButton(l,e);else{l.createSpan({cls:"as-mp-installed-label",text:"Installed"});let d=l.createEl("button",{cls:"as-mp-uninstall-btn",text:"Uninstall"});d.addEventListener("click",()=>{z(this.app,"Uninstall skill",`Remove "${e.name}" from all agents?`,()=>{d.setText("Removing..."),d.disabled=!0,new P.Notice(`Removing ${e.name}...`,3e3),at(e.name,this.settings.packageRunner).then(m=>{m.success?(new P.Notice(`Removed ${e.name}`,5e3),e.installed=!1,this.refreshList(),this.showPreview(e)):(new P.Notice(`Failed to remove ${e.name}`,5e3),d.setText("Uninstall"),d.disabled=!1)})})})}let o=this.previewEl.createDiv("as-mp-preview-content");o.createDiv({cls:"as-mp-loading",text:"Loading skill content..."});let c=await et(e.source,e.name,e.id);if(o.empty(),c){e.content=c;let d=o.createDiv("as-mp-rendered markdown-rendered");P.MarkdownRenderer.render(this.app,c,d,"",is)}else o.createDiv({cls:"as-mp-hint",text:"Could not load skill content."})}renderInstallButton(e,t){e.createEl("button",{cls:"as-mp-install-btn",text:"Install"}).addEventListener("click",()=>{new le(this.app,t,this.settings,()=>{this.refreshList(),this.showPreview(t)}).open()})}};var Y="agentfiles-view",pe=class extends St.ItemView{store;settings;saveSettings;sidebarPanel;listPanel;detailPanel;dashboardPanel;marketplacePanel;sidebarEl;listEl;detailEl;dashboardEl;marketplaceEl;resizeHandle1;resizeHandle2;isDashboard=!1;isMarketplace=!1;updateRef=null;dragCleanup=null;constructor(e,t,s,i){super(e),this.store=t,this.settings=s,this.saveSettings=i}getViewType(){return Y}getDisplayText(){return"Agentfiles"}getIcon(){return"cpu"}onOpen(){let e=this.contentEl;e.empty(),e.addClass("as-container"),this.sidebarEl=e.createDiv("as-panel as-panel-sidebar"),this.resizeHandle1=this.createResizeHandle(e,this.sidebarEl,"--as-sidebar-width",120,400),this.listEl=e.createDiv("as-panel as-panel-list"),this.resizeHandle2=this.createResizeHandle(e,this.listEl,"--as-list-width",180,600),this.detailEl=e.createDiv("as-panel as-panel-detail"),this.dashboardEl=e.createDiv("as-panel as-panel-dashboard as-hidden"),this.marketplaceEl=e.createDiv("as-panel as-panel-marketplace as-hidden"),this.sidebarPanel=new ee(this.sidebarEl,this.store,()=>this.toggleDashboard(),()=>this.toggleMarketplace()),this.listPanel=new te(this.listEl,this.store,t=>this.onSelectItem(t)),this.detailPanel=new se(this.detailEl,this.store,this.settings,this.saveSettings,this),this.dashboardPanel=new ae(this.dashboardEl,this.app),this.marketplacePanel=new de(this.marketplaceEl,this,this.settings,()=>{this.store.refresh(this.settings)}),this.updateRef=this.store.on("updated",()=>this.renderAll()),this.renderAll()}toggleDashboard(){this.dragCleanup?.(),this.dragCleanup=null,this.isDashboard=!this.isDashboard,this.isMarketplace&&(this.isMarketplace=!1,this.marketplaceEl.addClass("as-hidden")),this.isDashboard?(this.listEl.addClass("as-hidden"),this.detailEl.addClass("as-hidden"),this.resizeHandle1.addClass("as-hidden"),this.resizeHandle2.addClass("as-hidden"),this.dashboardEl.removeClass("as-hidden"),this.dashboardPanel.render()):(this.listEl.removeClass("as-hidden"),this.detailEl.removeClass("as-hidden"),this.resizeHandle1.removeClass("as-hidden"),this.resizeHandle2.removeClass("as-hidden"),this.dashboardEl.addClass("as-hidden")),this.sidebarPanel.setDashboardActive(this.isDashboard),this.sidebarPanel.render()}toggleMarketplace(){this.dragCleanup?.(),this.dragCleanup=null,this.isMarketplace=!this.isMarketplace,this.isDashboard&&(this.isDashboard=!1,this.dashboardEl.addClass("as-hidden")),this.isMarketplace?(this.listEl.addClass("as-hidden"),this.detailEl.addClass("as-hidden"),this.resizeHandle1.addClass("as-hidden"),this.resizeHandle2.addClass("as-hidden"),this.marketplaceEl.removeClass("as-hidden"),this.marketplacePanel.render()):(this.listEl.removeClass("as-hidden"),this.detailEl.removeClass("as-hidden"),this.resizeHandle1.removeClass("as-hidden"),this.resizeHandle2.removeClass("as-hidden"),this.marketplaceEl.addClass("as-hidden")),this.sidebarPanel.setMarketplaceActive(this.isMarketplace),this.sidebarPanel.render()}renderAll(){this.sidebarPanel.render(),!this.isDashboard&&!this.isMarketplace&&(this.listPanel.render(),this.store.filteredItems.length||this.detailPanel.clear())}onSelectItem(e){this.isDashboard&&this.toggleDashboard(),this.isMarketplace&&this.toggleMarketplace(),this.listPanel.setSelected(e.id),this.listPanel.render(),this.detailPanel.show(e)}createResizeHandle(e,t,s,i,a){let r=e.createDiv("as-resize-handle"),l=0,o=0,c=m=>{let g=Math.min(a,Math.max(i,o+(m.clientX-l)));e.style.setProperty(s,`${g}px`)},d=()=>{r.removeClass("is-dragging"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",d),this.dragCleanup=null};return r.addEventListener("mousedown",m=>{m.preventDefault(),l=m.clientX,o=parseInt(e.style.getPropertyValue(s))||t.offsetWidth,r.addClass("is-dragging"),document.addEventListener("mousemove",c),document.addEventListener("mouseup",d),this.dragCleanup=d}),r}onClose(){this.dragCleanup?.(),this.updateRef&&this.store.offref(this.updateRef)}};var yt=require("obsidian");var ue=class extends yt.Events{items=new Map;_filter={kind:"all"};_searchQuery="";_deepSearch=!1;_deepSearchScope="both";_projectsHomeDir="";get filter(){return this._filter}get searchQuery(){return this._searchQuery}get deepSearch(){return this._deepSearch}get allItems(){return Array.from(this.items.values())}get filteredItems(){let e=this.allItems;switch(this._filter.kind){case"favorites":e=e.filter(t=>t.isFavorite);break;case"tool":e=e.filter(t=>t.tools.includes(this._filter.toolId));break;case"type":e=e.filter(t=>t.type===this._filter.type);break;case"collection":e=e.filter(t=>t.collections.includes(this._filter.name));break;case"project":e=e.filter(t=>Pe(t.filePath,this._projectsHomeDir)===this._filter.project);break}if(this._searchQuery){let t=this._searchQuery.toLowerCase(),s=this._deepSearch&&(this._deepSearchScope==="description"||this._deepSearchScope==="both"),i=this._deepSearch&&(this._deepSearchScope==="content"||this._deepSearchScope==="both");e=e.filter(a=>a.name.toLowerCase().includes(t)||s&&a.description.toLowerCase().includes(t)||i&&a.content.toLowerCase().includes(t))}return e.sort((t,s)=>t.name.localeCompare(s.name))}getItem(e){return this.items.get(e)}get hasSkillkit(){return L()}refresh(e){this._projectsHomeDir=e.projectsHomeDir,this.items=mt(e),this.enrichWithSkillkit(),this.trigger("updated")}enrichWithSkillkit(){if(!L())return;let e=Be(),t=ze(),s=Ve(),i=new Set(s.oversized.map(o=>o.name)),a=new Set(s.longDesc.map(o=>o.name)),r=new Map(s.oversized.map(o=>[o.name,o.lines])),l=new Map(s.longDesc.map(o=>[o.name,o.chars]));for(let o of this.items.values()){let c=o.filePath.split("/").slice(-2,-1)[0],d=o.name.toLowerCase().replace(/\s+/g,"-"),m=e.get(o.name)||e.get(c)||e.get(d);m?(m.isHeavy=o.content.length>5e3,o.usage=m):o.usage={uses:0,lastUsed:null,daysSinceUsed:null,isStale:!0,isHeavy:o.content.length>5e3};let g=o.content.split(`
+`).length,f=o.description.length;o.warnings={oversized:i.has(o.name)||g>500,longDesc:a.has(o.name)||f>1024,lineCount:r.get(o.name)??g,descChars:l.get(o.name)??f},o.conflicts=t.get(o.name)||t.get(c)||[]}}setFilter(e){this._filter=e,this.trigger("updated")}setSearch(e){this._searchQuery=e,this.trigger("updated")}setDeepSearch(e){this._deepSearch!==e&&(this._deepSearch=e,this.trigger("updated"))}setDeepSearchScope(e){this._deepSearchScope!==e&&(this._deepSearchScope=e,this.trigger("updated"))}toggleFavorite(e,t){let s=this.items.get(e);s&&(s.isFavorite=!s.isFavorite,s.isFavorite?t.favorites.includes(e)||t.favorites.push(e):t.favorites=t.favorites.filter(i=>i!==e),this.trigger("updated"))}getToolCounts(){let e=new Map;for(let t of this.items.values())for(let s of t.tools)e.set(s,(e.get(s)||0)+1);return e}getTypeCounts(){let e=new Map;for(let t of this.items.values())e.set(t.type,(e.get(t.type)||0)+1);return e}getProjectCounts(){let e=new Map;for(let t of this.items.values()){let s=Pe(t.filePath,this._projectsHomeDir);e.set(s,(e.get(s)||0)+1)}return e}};var wt=require("fs"),he=class{watchers=[];debounceTimer=null;debounceMs;onChange;constructor(e,t){this.debounceMs=e,this.onChange=t}watchPaths(e){this.close();for(let t of e)try{let s=(0,wt.watch)(t,{recursive:!0},()=>this.scheduleUpdate());this.watchers.push(s)}catch{}}scheduleUpdate(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.onChange()},this.debounceMs)}close(){this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null);for(let e of this.watchers)try{e.close()}catch{}this.watchers=[]}};var D=require("obsidian");var me=class extends D.PluginSettingTab{plugin;constructor(e,t){super(e,t),this.plugin=t}display(){let{containerEl:e}=this;e.empty(),new D.Setting(e).setName("File watching").setDesc("Automatically detect changes to skill files").addToggle(t=>t.setValue(this.plugin.settings.watchEnabled).onChange(async s=>{this.plugin.settings.watchEnabled=s,await this.plugin.saveSettings(),this.plugin.restartWatcher()})),new D.Setting(e).setName("Watch debounce (ms)").setDesc("Delay before re-scanning after file changes").addText(t=>t.setValue(String(this.plugin.settings.watchDebounceMs)).onChange(async s=>{let i=parseInt(s);!isNaN(i)&&i>=100&&(this.plugin.settings.watchDebounceMs=i,await this.plugin.saveSettings())})),new D.Setting(e).setName("Display names").setDesc("How skill and command names are displayed in the list").addDropdown(t=>t.addOptions({auto:"Auto (frontmatter / heading / filename)",filename:"Filename only"}).setValue(this.plugin.settings.namingMode||"auto").onChange(async s=>{this.plugin.settings.namingMode=s,await this.plugin.saveSettings(),this.plugin.refreshStore()})),new D.Setting(e).setName("Deep search by default").setDesc("Enable deep search when the view opens (can always be toggled in the search bar)").addToggle(t=>t.setValue(this.plugin.settings.deepSearchDefault??!1).onChange(async s=>{this.plugin.settings.deepSearchDefault=s,await this.plugin.saveSettings()})),new D.Setting(e).setName("Deep search scope").setDesc("What to include when deep search is enabled").addDropdown(t=>t.addOptions({both:"Description and file content",description:"Description only",content:"File content only"}).setValue(this.plugin.settings.deepSearchScope??"both").onChange(async s=>{this.plugin.settings.deepSearchScope=s,await this.plugin.saveSettings()})),new D.Setting(e).setName("Marketplace").setHeading(),new D.Setting(e).setName("Package runner").setDesc("Command used to install skills from the marketplace").addDropdown(t=>t.addOptions({auto:"Auto-detect",npx:"npx",bunx:"bunx"}).setValue(this.plugin.settings.packageRunner).onChange(async s=>{this.plugin.settings.packageRunner=s,await this.plugin.saveSettings()})),new D.Setting(e).setName("Project scanning").setHeading(),new D.Setting(e).setName("Scan projects").setDesc("Scan all directories under the projects home folder for project-level skills").addToggle(t=>t.setValue(this.plugin.settings.projectScanEnabled).onChange(async s=>{this.plugin.settings.projectScanEnabled=s,await this.plugin.saveSettings(),this.plugin.refreshStore(),this.plugin.restartWatcher()})),new D.Setting(e).setName("Projects home directory").setDesc("Root directory to scan for project-level skills. Leave empty for home directory (~).").addText(t=>t.setPlaceholder("~").setValue(this.plugin.settings.projectsHomeDir).onChange(async s=>{this.plugin.settings.projectsHomeDir=s,await this.plugin.saveSettings(),this.plugin.refreshStore(),this.plugin.restartWatcher()})),new D.Setting(e).setName("Tools").setHeading();for(let t of E){let s=t.isInstalled(),i=this.plugin.settings.tools[t.id]||{enabled:!0,customPaths:[]};new D.Setting(e).setName(t.name).setDesc(s?"Installed":"Not detected").addToggle(a=>a.setValue(s&&i.enabled).setDisabled(!s).onChange(async r=>{this.plugin.settings.tools[t.id]={...i,enabled:r},await this.plugin.saveSettings(),this.plugin.refreshStore()}))}}};var $e={tools:{},watchEnabled:!0,watchDebounceMs:500,deepSearchDefault:!1,deepSearchScope:"both",favorites:[],collections:{},customScanPaths:[],namingMode:"auto",projectScanEnabled:!0,projectsHomeDir:"",packageRunner:"auto"};var ge=class extends Dt.Plugin{settings=$e;store=new ue;watcher=null;async onload(){await this.loadSettings(),this.addVaultPath(),this.registerView(Y,e=>new pe(e,this.store,this.settings,()=>this.saveSettings())),this.addRibbonIcon("cpu","Agentfiles",()=>this.activateView()),this.addCommand({id:"open",name:"Open",callback:()=>this.activateView()}),this.addSettingTab(new me(this.app,this)),this.refreshStore(),this.store.setDeepSearch(this.settings.deepSearchDefault??!1),this.store.setDeepSearchScope(this.settings.deepSearchScope??"both"),this.startWatcher()}addVaultPath(){let e=this.app.vault.adapter;if(!e.getBasePath)return;let t=e.getBasePath();this.settings.customScanPaths.includes(t)||this.settings.customScanPaths.push(t)}onunload(){this.stopWatcher()}refreshStore(){this.store.refresh(this.settings)}startWatcher(){this.settings.watchEnabled&&(this.watcher=new he(this.settings.watchDebounceMs,()=>this.refreshStore()),this.watcher.watchPaths(gt(this.settings)))}stopWatcher(){this.watcher&&(this.watcher.close(),this.watcher=null)}restartWatcher(){this.stopWatcher(),this.startWatcher()}async activateView(){let e=this.app.workspace.getLeavesOfType(Y);if(e.length>0){await this.app.workspace.revealLeaf(e[0]);return}let t=this.app.workspace.getLeaf("tab");await t.setViewState({type:Y,active:!0}),await this.app.workspace.revealLeaf(t)}async loadSettings(){this.settings=Object.assign({},$e,await this.loadData())}async saveSettings(){await this.saveData(this.settings)}};
diff --git a/src/views/list.ts b/src/views/list.ts
index 0814ee3..b7f99b8 100644
--- a/src/views/list.ts
+++ b/src/views/list.ts
@@ -1,4 +1,5 @@
-import { setIcon } from "obsidian";
+import { Menu, setIcon } from "obsidian";
+import { shell } from "electron";
import { TOOL_CONFIGS } from "../tool-configs";
import { TOOL_SVGS, renderToolIcon } from "../tool-icons";
import type { SkillStore } from "../store";
@@ -257,5 +258,21 @@ export class ListPanel {
this.selectedId = item.id;
this.onSelect(item);
});
+
+ card.addEventListener("contextmenu", (e) => {
+ e.preventDefault();
+ const menu = new Menu();
+ menu.addItem((i) =>
+ i.setTitle("Reveal in system explorer")
+ .setIcon("folder-open")
+ .onClick(() => shell.showItemInFolder(item.filePath))
+ );
+ menu.addItem((i) =>
+ i.setTitle("Copy file path")
+ .setIcon("copy")
+ .onClick(() => navigator.clipboard.writeText(item.filePath))
+ );
+ menu.showAtMouseEvent(e);
+ });
}
}