From dbe2930ad81b5383cf39f34897691909c9009ecc Mon Sep 17 00:00:00 2001 From: YisuWang Date: Sat, 4 Apr 2026 21:38:04 -0500 Subject: [PATCH] fix: add pnpm, Volta, Yarn, fnm, asdf, proto paths to skillkit discovery Both findSkillkitBin() and buildPath() now search additional package manager directories. A dynamic fallback (pnpm/yarn/npm bin -g) runs only when static paths find nothing, keeping the common case zero-cost. Closes #18 Co-Authored-By: Claude Opus 4.6 --- main.js | 18 +++++++++--------- src/skillkit.ts | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/main.js b/main.js index fe13c7f..cfe5f4f 100644 --- a/main.js +++ b/main.js @@ -1,11 +1,11 @@ -var Jt=Object.defineProperty;var ys=Object.getOwnPropertyDescriptor;var ws=Object.getOwnPropertyNames;var Ds=Object.prototype.hasOwnProperty;var Cs=(n,t)=>{for(var e in t)Jt(n,e,{get:t[e],enumerable:!0})},Es=(n,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of ws(t))!Ds.call(n,i)&&i!==e&&Jt(n,i,{get:()=>t[i],enumerable:!(s=ys(t,i))||s.enumerable});return n};var xs=n=>Es(Jt({},"__esModule",{value:!0}),n);var Ti={};Cs(Ti,{default:()=>Gt});module.exports=xs(Ti);var bs=require("obsidian");var ms=require("obsidian");var _=require("obsidian"),ke=require("electron");var St=require("os"),y=require("fs"),u=require("path"),g=(0,St.homedir)(),it=(0,St.platform)()==="win32",st=process.env.XDG_CONFIG_HOME||(it?(0,u.join)(g,".config"):(0,u.join)(g,".config")),Zt=new Map;function Se(){Zt.clear()}function H(n,t){let e=Zt.get(n);if(e!==void 0)return e;let s=t();return Zt.set(n,s),s}function mt(n){if(it){let t=process.env.ProgramFiles||"C:\\Program Files",e=process.env.LOCALAPPDATA||(0,u.join)(g,"AppData","Local");return(0,y.existsSync)((0,u.join)(t,n))||(0,y.existsSync)((0,u.join)(e,"Programs",n))}return(0,y.existsSync)(`/Applications/${n}.app`)||(0,y.existsSync)((0,u.join)(g,"Applications",`${n}.app`))}function q(n){let t=it?[`${n}.cmd`,`${n}.exe`,n]:[n],e=[];if(it){let i=process.env.APPDATA||(0,u.join)(g,"AppData","Roaming");e.push((0,u.join)(i,"npm"),(0,u.join)(g,".bun","bin"),(0,u.join)(g,"AppData","Local","npm"))}else e.push("/usr/local/bin","/opt/homebrew/bin",(0,u.join)(g,".local","bin"));for(let i of e)for(let a of t)if((0,y.existsSync)((0,u.join)(i,a)))return!0;let s=it?(0,u.join)(g,"AppData","Roaming","nvm"):(0,u.join)(g,".nvm","versions","node");try{for(let i of(0,y.readdirSync)(s)){let a=it?(0,u.join)(s,i):(0,u.join)(s,i,"bin");for(let r of t)if((0,y.existsSync)((0,u.join)(a,r)))return!0}}catch{}return!1}var T=[{id:"claude-code",name:"Claude Code",color:"#f97316",icon:"brain",paths:[{baseDir:(0,u.join)(g,".claude","skills"),type:"skill",pattern:"directory-with-skillmd"},{baseDir:(0,u.join)(g,".claude","commands"),type:"command",pattern:"flat-md"}],agentPaths:[{baseDir:(0,u.join)(g,".claude","agents"),type:"agent",pattern:"flat-md"}],isInstalled:()=>H("claude-code",()=>(0,y.existsSync)((0,u.join)(g,".claude","settings.json"))||(0,y.existsSync)((0,u.join)(g,".claude","CLAUDE.md"))||q("claude"))},{id:"cursor",name:"Cursor",color:"#3b82f6",icon:"mouse-pointer",paths:[{baseDir:(0,u.join)(g,".cursor","skills"),type:"skill",pattern:"directory-with-skillmd"},{baseDir:(0,u.join)(g,".cursor","rules"),type:"rule",pattern:"flat-md"}],agentPaths:[{baseDir:(0,u.join)(g,".cursor","agents"),type:"agent",pattern:"flat-md"}],isInstalled:()=>H("cursor",()=>mt("Cursor")||(0,y.existsSync)((0,u.join)(g,".cursor","argv.json")))},{id:"windsurf",name:"Windsurf",color:"#14b8a6",icon:"wind",paths:[{baseDir:(0,u.join)(g,".codeium","windsurf","memories"),type:"memory",pattern:"flat-md"},{baseDir:(0,u.join)(g,".windsurf","rules"),type:"rule",pattern:"flat-md"}],agentPaths:[],isInstalled:()=>H("windsurf",()=>mt("Windsurf")||(0,y.existsSync)((0,u.join)(g,".codeium","windsurf","argv.json")))},{id:"codex",name:"Codex",color:"#22c55e",icon:"book",paths:[{baseDir:(0,u.join)(g,".codex","skills"),type:"skill",pattern:"directory-with-skillmd"},{baseDir:(0,u.join)(g,".codex","prompts"),type:"command",pattern:"flat-md"},{baseDir:(0,u.join)(g,".codex","memories"),type:"memory",pattern:"flat-md"}],agentPaths:[{baseDir:(0,u.join)(g,".codex","agents"),type:"agent",pattern:"flat-md"}],isInstalled:()=>H("codex",()=>(0,y.existsSync)((0,u.join)(g,".codex","config.toml"))||(0,y.existsSync)((0,u.join)(g,".codex","auth.json"))||q("codex"))},{id:"copilot",name:"Copilot",color:"#a855f7",icon:"plane",paths:[{baseDir:(0,u.join)(g,".copilot","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>H("copilot",()=>(0,y.existsSync)((0,u.join)(g,".copilot"))||q("copilot"))},{id:"amp",name:"Amp",color:"#ec4899",icon:"zap",paths:[{baseDir:(0,u.join)(st,"amp","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>H("amp",()=>(0,y.existsSync)((0,u.join)(st,"amp","config.json"))||(0,y.existsSync)((0,u.join)(st,"amp","settings.json"))||q("amp"))},{id:"opencode",name:"OpenCode",color:"#ef4444",icon:"terminal",paths:[{baseDir:(0,u.join)(st,"opencode","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>H("opencode",()=>mt("OpenCode")||(0,y.existsSync)((0,u.join)(st,"opencode","opencode.json"))||(0,y.existsSync)((0,u.join)(st,"opencode","opencode.jsonc"))||q("opencode"))},{id:"pi",name:"Pi",color:"#06b6d4",icon:"sparkles",paths:[{baseDir:(0,u.join)(g,".pi","agent","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>H("pi",()=>q("pi"))},{id:"antigravity",name:"Antigravity",color:"#ef4444",icon:"arrow-up-circle",paths:[{baseDir:(0,u.join)(g,".gemini","antigravity","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>H("antigravity",()=>mt("Antigravity")||(0,y.existsSync)((0,u.join)(g,".gemini","antigravity","skills"))||q("antigravity"))},{id:"claude-desktop",name:"Claude Desktop",color:"#f97316",icon:"monitor",paths:[],agentPaths:[],isInstalled:()=>H("claude-desktop",()=>mt("Claude"))},{id:"global-agents",name:"Global",color:"#a3e635",icon:"globe",paths:[{baseDir:(0,u.join)(g,".agents","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>H("global-agents",()=>(0,y.existsSync)((0,u.join)(g,".agents","skills")))},{id:"aider",name:"Aider",color:"#eab308",icon:"wrench",paths:[],agentPaths:[],isInstalled:()=>H("aider",()=>q("aider"))}];var L={"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:''},amp:{viewBox:"0 0 21 21",paths:''},antigravity:{viewBox:"0 0 112 96",paths:''}};function F(n,t,e=16){let s=L[t];if(!s)return;let i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.setAttribute("viewBox",s.viewBox),i.setAttribute("width",String(e)),i.setAttribute("height",String(e)),i.setAttribute("fill","none"),i.classList.add("as-tool-svg"),i.innerHTML=s.paths,n.appendChild(i)}var kt=class{containerEl;store;onToggleDashboard;onToggleMarketplace;onCreateSkill;onToggleConversations;conversationStore;dashboardActive=!1;marketplaceActive=!1;conversationsActive=!1;constructor(t,e,s,i,a,r,l){this.containerEl=t,this.store=e,this.onToggleDashboard=s,this.onToggleMarketplace=i,this.onCreateSkill=a,this.onToggleConversations=r||(()=>{}),this.conversationStore=l||null}setDashboardActive(t){this.dashboardActive=t}setMarketplaceActive(t){this.marketplaceActive=t}setConversationsActive(t){this.conversationsActive=t}render(){this.containerEl.empty(),this.containerEl.addClass("as-sidebar"),this.renderLibrarySection(),this.conversationsActive&&this.conversationStore?this.renderConversationFilters():(this.renderTypeSection(),this.renderToolSection(),this.renderProjectSection(),this.renderCollectionSection(),this.store.hasSkillkit||this.renderSkillkitCta())}renderSection(t,e){let s=this.containerEl.createDiv("as-sidebar-section");s.createDiv({cls:"as-sidebar-title",text:t});for(let i of e){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,_.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 t=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=>t.has(i.type)).map(i=>({label:i.label,icon:i.icon,filter:{kind:"type",type:i.type},count:t.get(i.type)||0}));s.length>0&&this.renderSection("Types",s)}renderToolSection(){let t=this.store.getToolCounts(),e=T.filter(i=>i.isInstalled()&&t.has(i.id));if(e.length===0)return;let s=this.containerEl.createDiv("as-sidebar-section");s.createDiv({cls:"as-sidebar-title",text:"Tools"});for(let i of e){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");L[i.id]?F(l,i.id,14):(0,_.setIcon)(l,i.icon),r.createSpan({cls:"as-sidebar-label",text:i.name}),r.createSpan({cls:"as-sidebar-count",text:String(t.get(i.id)||0)}),r.addEventListener("click",()=>{this.dashboardActive&&this.onToggleDashboard(),this.store.setFilter(a)})}}renderProjectSection(){let t=this.store.getProjectCounts();if(t.size===0)return;let e=[];for(let[s,i]of t)e.push({label:s,icon:"folder-git-2",filter:{kind:"project",project:s},count:i});e.sort((s,i)=>s.label.localeCompare(i.label)),this.renderSection("Projects",e)}renderCollectionSection(){let t=this.containerEl.createDiv("as-sidebar-section");t.createDiv({cls:"as-sidebar-title",text:"Collections"});let e=new Set;for(let s of this.store.allItems)for(let i of s.collections)e.add(i);if(e.size===0){t.createDiv({cls:"as-sidebar-empty",text:"No collections yet"});return}for(let s of e){let i={kind:"collection",name:s},a=t.createDiv("as-sidebar-item");!this.dashboardActive&&this.isActive(i)&&a.addClass("is-active");let r=a.createSpan("as-sidebar-icon");(0,_.setIcon)(r,"folder"),a.createSpan({cls:"as-sidebar-label",text:s}),a.addEventListener("click",()=>{this.dashboardActive&&this.onToggleDashboard(),this.store.setFilter(i)})}}renderLibrarySection(){let t=this.containerEl.createDiv("as-sidebar-section");t.createDiv({cls:"as-sidebar-title",text:"Library"});let e=[{label:"All Skills",icon:"layers",filter:{kind:"all"}},{label:"Favorites",icon:"star",filter:{kind:"favorites"}}],s=this.dashboardActive||this.marketplaceActive||this.conversationsActive;for(let h of e){let m=t.createDiv("as-sidebar-item");!s&&this.isActive(h.filter)&&m.addClass("is-active");let k=m.createSpan("as-sidebar-icon");(0,_.setIcon)(k,h.icon),m.createSpan({cls:"as-sidebar-label",text:h.label}),m.addEventListener("click",()=>{this.dashboardActive&&this.onToggleDashboard(),this.marketplaceActive&&this.onToggleMarketplace(),this.conversationsActive&&this.onToggleConversations(),this.store.setFilter(h.filter)})}let i=t.createDiv("as-sidebar-item");this.dashboardActive&&i.addClass("is-active");let a=i.createSpan("as-sidebar-icon");(0,_.setIcon)(a,"bar-chart-2"),i.createSpan({cls:"as-sidebar-label",text:"Dashboard"}),i.addEventListener("click",()=>{this.marketplaceActive&&this.onToggleMarketplace(),this.conversationsActive&&this.onToggleConversations(),this.dashboardActive||this.onToggleDashboard()});let r=t.createDiv("as-sidebar-item");this.marketplaceActive&&r.addClass("is-active");let l=r.createSpan("as-sidebar-icon");(0,_.setIcon)(l,"shopping-bag"),r.createSpan({cls:"as-sidebar-label",text:"Marketplace"}),r.addEventListener("click",()=>{this.dashboardActive&&this.onToggleDashboard(),this.conversationsActive&&this.onToggleConversations(),this.marketplaceActive||this.onToggleMarketplace()});let o=t.createDiv("as-sidebar-item");this.conversationsActive&&o.addClass("is-active");let c=o.createSpan("as-sidebar-icon");(0,_.setIcon)(c,"message-circle"),o.createSpan({cls:"as-sidebar-label",text:"Conversations"}),o.addEventListener("click",()=>{this.dashboardActive&&this.onToggleDashboard(),this.marketplaceActive&&this.onToggleMarketplace(),this.conversationsActive||this.onToggleConversations()});let d=t.createDiv("as-sidebar-item as-sidebar-create"),p=d.createSpan("as-sidebar-icon");(0,_.setIcon)(p,"plus"),d.createSpan({cls:"as-sidebar-label",text:"Create"}),d.addEventListener("click",()=>this.onCreateSkill())}renderSkillkitCta(){let t=this.containerEl.createDiv("as-skillkit-cta"),e=t.createDiv("as-skillkit-icon");(0,_.setIcon)(e,"bar-chart-2"),t.createDiv({cls:"as-skillkit-title",text:"Unlock analytics"}),t.createDiv({cls:"as-skillkit-desc",text:"Install skillkit to see usage stats, stale badges, and heavy skill warnings."}),t.createDiv("as-skillkit-cmd").createEl("code",{text:"npm i -g @crafter/skillkit"}),t.createEl("a",{cls:"as-skillkit-link",text:"Learn more",href:"https://www.npmjs.com/package/@crafter/skillkit"}).addEventListener("click",a=>{a.preventDefault(),ke.shell.openExternal("https://www.npmjs.com/package/@crafter/skillkit")})}renderConversationFilters(){if(!this.conversationStore)return;let t=this.conversationStore.getProjectCounts();if(t.size>0){let e=this.containerEl.createDiv("as-sidebar-section");e.createDiv({cls:"as-sidebar-title",text:"Projects"});let s=e.createDiv("as-sidebar-item"),i=this.conversationStore.filter;i.kind==="all-conversations"&&s.addClass("is-active");let a=s.createSpan("as-sidebar-icon");(0,_.setIcon)(a,"layers"),s.createSpan({cls:"as-sidebar-label",text:"All"}),s.createSpan({cls:"as-sidebar-count",text:String(this.conversationStore.allItems.length)}),s.addEventListener("click",()=>{this.conversationStore.setFilter({kind:"all-conversations"})});let r=e.createDiv("as-sidebar-item");i.kind==="conversation-favorites"&&r.addClass("is-active");let l=r.createSpan("as-sidebar-icon");(0,_.setIcon)(l,"star"),r.createSpan({cls:"as-sidebar-label",text:"Favorites"}),r.addEventListener("click",()=>{this.conversationStore.setFilter({kind:"conversation-favorites"})});for(let[o,c]of Array.from(t.entries()).sort((d,p)=>p[1]-d[1])){let d=e.createDiv("as-sidebar-item");i.kind==="conversation-project"&&i.project===o&&d.addClass("is-active");let p=d.createSpan("as-sidebar-icon");(0,_.setIcon)(p,"folder-git-2"),d.createSpan({cls:"as-sidebar-label",text:o}),d.createSpan({cls:"as-sidebar-count",text:String(c)}),d.addEventListener("click",()=>{this.conversationStore.setFilter({kind:"conversation-project",project:o})})}}}isActive(t){let e=this.store.filter;return e.kind!==t.kind?!1:e.kind==="tool"&&t.kind==="tool"?e.toolId===t.toolId:e.kind==="type"&&t.kind==="type"?e.type===t.type:e.kind==="collection"&&t.kind==="collection"?e.name===t.name:e.kind==="project"&&t.kind==="project"?e.project===t.project:!0}};var K=require("obsidian"),ye=require("electron");var yt=class{containerEl;store;onSelect;selectedId=null;inputEl=null;listEl=null;typeFilter=null;sortBy="name";openDropdown=null;menuDropdownEl=null;outsideClickCleanup=null;constructor(t,e,s){this.containerEl=t,this.store=e,this.onSelect=s}setSelected(t){this.selectedId=t}render(){if(!this.inputEl){this.containerEl.empty(),this.containerEl.addClass("as-list");let t=this.containerEl.createDiv("as-search");this.inputEl=t.createEl("input",{type:"text",placeholder:"Search skills...",cls:"as-search-input"}),this.inputEl.addEventListener("input",()=>{this.store.setSearch(this.inputEl.value)});let e=t.createDiv("as-conv-search-actions"),s=e.createEl("button",{cls:"as-conv-icon-btn"}),i=s.createSpan("as-conv-icon-btn-icon");(0,K.setIcon)(i,"file-search"),s.setAttribute("aria-label","Search file content"),this.store.deepSearch&&s.addClass("has-active"),s.addEventListener("click",()=>{this.store.setDeepSearch(!this.store.deepSearch),s.toggleClass("has-active",this.store.deepSearch)});let a=e.createDiv("as-conv-dropdown-wrap"),r=a.createEl("button",{cls:"as-conv-icon-btn"}),l=r.createSpan("as-conv-icon-btn-icon");(0,K.setIcon)(l,"sliders-horizontal"),r.setAttribute("aria-label","Filter & sort"),(this.typeFilter||this.sortBy!=="name")&&r.addClass("has-active"),this.menuDropdownEl=a.createDiv("as-conv-dropdown as-conv-dropdown-wide"),this.renderMenuDropdown(),r.addEventListener("click",o=>{if(o.stopPropagation(),this.openDropdown==="menu")this.closeDropdown();else{this.closeDropdown(),this.openDropdown="menu",this.menuDropdownEl?.addClass("is-open");let c=d=>{a.contains(d.target)||this.closeDropdown()};setTimeout(()=>document.addEventListener("click",c),0),this.outsideClickCleanup=()=>document.removeEventListener("click",c)}}),this.listEl=this.containerEl.createDiv("as-list-items")}this.inputEl.value=this.store.searchQuery,this.renderList()}closeDropdown(){this.openDropdown=null,this.menuDropdownEl?.removeClass("is-open"),this.outsideClickCleanup&&(this.outsideClickCleanup(),this.outsideClickCleanup=null)}renderMenuDropdown(){if(!this.menuDropdownEl)return;this.menuDropdownEl.empty(),this.menuDropdownEl.createDiv("as-conv-dropdown-header").setText("Sort");let e=[{label:"Name",value:"name",icon:"arrow-up-az"},{label:"Usage",value:"usage",icon:"trending-up"}];for(let a of e){let r=this.menuDropdownEl.createDiv(`as-conv-dropdown-item ${this.sortBy===a.value?"is-active":""}`),l=r.createSpan("as-conv-dropdown-check");this.sortBy===a.value&&(0,K.setIcon)(l,"check"),r.createSpan({cls:"as-conv-dropdown-item-label",text:a.label}),r.addEventListener("click",o=>{o.stopPropagation(),this.sortBy=a.value,this.updateMenuBtnState(),this.renderMenuDropdown(),this.renderList()})}this.menuDropdownEl.createDiv("as-conv-dropdown-header").setText("Filter");let i=[{id:null,label:"All"},{id:"stale",label:"Stale"},{id:"heavy",label:"Heavy"},{id:"oversized",label:"Oversized"},{id:"conflict",label:"Conflicts"}];for(let a of i){let r=this.typeFilter===a.id,l=this.menuDropdownEl.createDiv(`as-conv-dropdown-item ${r?"is-active":""}`),o=l.createSpan("as-conv-dropdown-check");r&&(0,K.setIcon)(o,"check"),l.createSpan({cls:"as-conv-dropdown-item-label",text:a.label}),l.addEventListener("click",c=>{c.stopPropagation(),this.typeFilter=a.id,this.updateMenuBtnState(),this.renderMenuDropdown(),this.renderList()})}}updateMenuBtnState(){let t=this.containerEl.querySelector(".as-conv-dropdown-wrap .as-conv-icon-btn");if(t){let e=this.typeFilter!==null||this.sortBy!=="name";t.toggleClass("has-active",e)}}renderList(){if(!this.listEl)return;this.listEl.empty();let t=this.store.filteredItems;if(this.typeFilter)switch(this.typeFilter){case"stale":t=t.filter(e=>e.usage?.isStale);break;case"heavy":t=t.filter(e=>e.usage?.isHeavy);break;case"oversized":t=t.filter(e=>e.warnings?.oversized);break;case"conflict":t=t.filter(e=>e.conflicts&&e.conflicts.length>0);break}if(this.sortBy==="usage"&&(t=[...t].sort((e,s)=>(s.usage?.uses??0)-(e.usage?.uses??0))),this.typeFilter){let e={stale:"Stale",heavy:"Heavy",oversized:"Oversized",conflict:"Conflict"},s=this.listEl.createDiv("as-active-filter");s.createSpan({text:`Showing: ${e[this.typeFilter]??this.typeFilter}`}),s.createSpan({cls:"as-filter-clear",text:"Clear"}).addEventListener("click",()=>{this.typeFilter=null,this.updateMenuBtn(),this.renderList()})}if(t.length===0){this.listEl.createDiv({cls:"as-list-empty",text:"No skills found"});return}for(let e of t)this.renderCard(this.listEl,e)}renderCard(t,e){let s=t.createDiv("as-skill-card");e.id===this.selectedId&&s.addClass("is-selected");let i=s.createDiv("as-skill-header");if(i.createSpan({cls:"as-skill-name",text:e.name}),e.isFavorite){let r=i.createSpan("as-skill-star");(0,K.setIcon)(r,"star")}e.description&&s.createDiv({cls:"as-skill-desc",text:e.description.length>80?e.description.slice(0,80)+"...":e.description});let a=s.createDiv("as-skill-meta");a.createSpan({cls:`as-type-tag as-type-${e.type}`,text:e.type});for(let r of e.tools){let l=T.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}),L[r]?F(o,r,12):o.addClass("as-tool-badge-dot")}e.usage&&(e.usage.uses>0&&a.createSpan({cls:"as-usage-badge",text:`${e.usage.uses}`,attr:{"aria-label":`Used ${e.usage.uses} times`}}),e.usage.isStale&&a.createSpan({cls:"as-badge-stale",text:"stale"}),e.usage.isHeavy&&a.createSpan({cls:"as-badge-heavy",text:"heavy"})),e.warnings?.oversized&&a.createSpan({cls:"as-badge-warn",text:"oversized"}),e.conflicts&&e.conflicts.length>0&&a.createSpan({cls:"as-badge-conflict",text:"conflict"}),s.addEventListener("click",()=>{this.selectedId=e.id,this.onSelect(e)}),s.addEventListener("contextmenu",r=>{r.preventDefault();let l=new K.Menu;l.addItem(o=>o.setTitle("Reveal in system explorer").setIcon("folder-open").onClick(()=>ye.shell.showItemInFolder(e.filePath))),l.addItem(o=>o.setTitle("Copy file path").setIcon("copy").onClick(()=>navigator.clipboard.writeText(e.filePath))),l.showAtMouseEvent(r)})}};var x=require("obsidian"),Me=require("fs"),_e=require("electron");var nt=require("child_process"),B=require("fs"),v=require("path"),wt=require("os"),Ts=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","WebSearch","WebFetch","TodoRead","TodoWrite","Task","Agent","Skill","LSP","NotebookEdit","AskFollowupQuestion","AttemptCompletion","SearchReplace","InsertCodeBlock","ReadImages","ExecuteCommand","ListFiles","SearchFiles","ReadFile","WriteFile","ReplaceInFile","ListCodeDefinitionNames","BrowserAction","UseMcp","shell","shell_command","update_plan","create_plan","read_file","write_file","execute_command","spawn_agent","write_stdin","multi_tool_use.parallel"]);function Ls(n){return!(Ts.has(n)||n.startsWith("mcp__")||n.startsWith("mcp_"))}var E=(0,wt.homedir)(),I=(0,wt.platform)()==="win32",Ps=(0,v.join)(E,".skillkit","analytics.db"),we=I?["skillkit.cmd","skillkit.exe","skillkit"]:["skillkit"];function Dt(){let n=[];if(I){let e=process.env.APPDATA||(0,v.join)(E,"AppData","Roaming");n.push((0,v.join)(e,"npm"),(0,v.join)(E,".bun","bin"),(0,v.join)(E,"AppData","Local","npm"))}else n.push("/usr/local/bin","/opt/homebrew/bin",(0,v.join)(E,".local","bin"),(0,v.join)(E,".bun","bin"));let t=I?(0,v.join)(E,"AppData","Roaming","nvm"):(0,v.join)(E,".nvm","versions","node");try{for(let e of(0,B.readdirSync)(t))n.push(I?(0,v.join)(t,e):(0,v.join)(t,e,"bin"))}catch{}if(!I){let e=(0,v.join)(E,".local","share","mise","installs");for(let s of["node","bun"])try{for(let i of(0,B.readdirSync)((0,v.join)(e,s)))n.push((0,v.join)(e,s,i,"bin"))}catch{}}return[...n,process.env.PATH||""].join(v.delimiter)}function As(n){try{return(0,nt.execSync)(`"${n}" help`,{encoding:"utf-8",timeout:5e3,env:{...process.env,NO_COLOR:"1",PATH:Dt()},stdio:["pipe","pipe","pipe"],shell:I?"cmd.exe":void 0}).includes("Analytics for AI agent skills")}catch{return!1}}function Ms(){let n=[],t=[];if(I){let s=process.env.APPDATA||(0,v.join)(E,"AppData","Roaming");t.push((0,v.join)(s,"npm"),(0,v.join)(E,".bun","bin"),(0,v.join)(E,"AppData","Local","npm"))}else t.push("/usr/local/bin","/opt/homebrew/bin",(0,v.join)(E,".local","bin"),(0,v.join)(E,".bun","bin"),(0,v.join)(E,".local","share","mise","shims"));for(let s of t)for(let i of we){let a=(0,v.join)(s,i);(0,B.existsSync)(a)&&n.push(a)}let e=I?(0,v.join)(E,"AppData","Roaming","nvm"):(0,v.join)(E,".nvm","versions","node");try{for(let s of(0,B.readdirSync)(e)){let i=I?(0,v.join)(e,s):(0,v.join)(e,s,"bin");for(let a of we){let r=(0,v.join)(i,a);(0,B.existsSync)(r)&&n.push(r)}}}catch{}if(!I){let s=(0,v.join)(E,".local","share","mise","installs");for(let i of["node","bun"])try{for(let a of(0,B.readdirSync)((0,v.join)(s,i))){let r=(0,v.join)(s,i,a,"bin","skillkit");(0,B.existsSync)(r)&&n.push(r)}}catch{}}for(let s of n)if(As(s))return s;return null}var qt;function Ct(){return qt===void 0&&(qt=Ms()),qt}function $(){return Ct()!==null||(0,B.existsSync)(Ps)}function at(n){let t=Ct();if(!t)return null;try{let e=(0,nt.execSync)(`${t} ${n} --json`,{encoding:"utf-8",timeout:15e3,env:{...process.env,NO_COLOR:"1",PATH:Dt()},stdio:["pipe","pipe","pipe"],shell:I?"cmd.exe":void 0}).trim();return De(e)}catch{return null}}function De(n){let t=n.indexOf("{"),e=n.indexOf("["),s=t===-1?e:e===-1?t:Math.min(t,e);return s===-1?null:JSON.parse(n.slice(s))}function Kt(n){let t=Ct();return t?new Promise(e=>{(0,nt.exec)(`${t} ${n} --json`,{encoding:"utf-8",timeout:15e3,env:{...process.env,NO_COLOR:"1",PATH:Dt()},shell:I?"cmd.exe":void 0},(s,i)=>{if(s){e(null);return}try{e(De(String(i).trim()))}catch{e(null)}})}):Promise.resolve(null)}function Ce(n){if(!$())return[];let t=at(`trace --list --skill ${n} --limit 5`);return Array.isArray(t)?t.map(e=>({traceId:e.trace_id,timestamp:e.timestamp,tokens:e.tokens_total,cost:e.cost_estimate,duration:e.duration_ms,model:e.model||"unknown"})):[]}async function Ee(){let n=new Map;if(!$())return n;let t=await Kt("stats");if(!t?.top_skills)return n;let e=Date.now();for(let s of t.top_skills){if(!Ls(s.name))continue;let i=s.daily.length>0?s.daily[s.daily.length-1]?.date:null,a=null;i&&(a=Math.floor((e-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}async function xe(){let n=new Map;if(!$())return n;let t=await Kt("conflicts --dry-run");if(!t||!("pairs"in t))return n;for(let e of t.pairs)n.has(e.skill_a)||n.set(e.skill_a,[]),n.has(e.skill_b)||n.set(e.skill_b,[]),n.get(e.skill_a).push({skillName:e.skill_b,similarity:e.similarity}),n.get(e.skill_b).push({skillName:e.skill_a,similarity:e.similarity});return n}async function Te(){if(!$())return{oversized:[],longDesc:[]};let n=await Kt("health");return n?.warnings?{oversized:n.warnings.oversized||[],longDesc:n.warnings.long_descriptions||[]}:{oversized:[],longDesc:[]}}function rt(n){let t=Ct();if(!t)return{success:!1,output:"skillkit not found"};try{return{success:!0,output:(0,nt.execSync)(`${t} ${n}`,{encoding:"utf-8",timeout:3e4,env:{...process.env,NO_COLOR:"1",PATH:Dt()},stdio:["pipe","pipe","pipe"],shell:I?"cmd.exe":void 0}).trim()}}catch(e){return{success:!1,output:e instanceof Error?e.message:"unknown error"}}}function Qt(n){if(!n)return"never";let t=Date.now()-new Date(n).getTime(),e=Math.floor(t/6e4);if(e<60)return`${e}m ago`;let s=Math.floor(e/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 Le(n,t,e=48,s=16){if(t.length===0)return;let i=Math.max(...t,1),a=t.map((o,c)=>{let d=c/(t.length-1||1)*e,p=s-o/i*s;return`${d.toFixed(1)},${p.toFixed(1)}`}),r=document.createElementNS("http://www.w3.org/2000/svg","svg");r.setAttribute("viewBox",`0 0 ${e} ${s}`),r.setAttribute("width",String(e)),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 Pe=require("obsidian");function Y(n,t,e,s){new Xt(n,t,e,s).open()}var Xt=class extends Pe.Modal{title;message;onConfirm;constructor(t,e,s,i){super(t),this.title=e,this.message=s,this.onConfirm=i}onOpen(){let{contentEl:t}=this;t.addClass("as-confirm-modal"),t.createEl("p",{cls:"as-confirm-title",text:this.title}),t.createEl("p",{cls:"as-confirm-message",text:this.message});let e=t.createDiv("as-confirm-buttons");e.createEl("button",{cls:"as-confirm-cancel",text:"Cancel"}).addEventListener("click",()=>this.close()),e.createEl("button",{cls:"as-confirm-action mod-warning",text:"Confirm"}).addEventListener("click",()=>{this.close(),this.onConfirm()})}onClose(){this.contentEl.empty()}};function _s(n){return Math.ceil(n.length/4)}function Is(n){return n<1024?`${n} B`:n<1024*1024?`${(n/1024).toFixed(1)} KB`:`${(n/(1024*1024)).toFixed(1)} MB`}function Ae(n){return n>=1e3?`${(n/1e3).toFixed(1)}k`:String(n)}function $s(n){return new Date(n).toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}var Hs=new x.Component,Et=class{containerEl;store;settings;saveSettings;currentItem=null;isEditing=!1;app;constructor(t,e,s,i,a){this.containerEl=t,this.store=e,this.settings=s,this.saveSettings=i,this.app=a.app}show(t){this.currentItem=t,this.isEditing=!1,this.render()}clear(){this.currentItem=null,this.containerEl.empty(),this.containerEl.addClass("as-detail");let t=this.containerEl.createDiv("as-detail-empty");(0,x.setIcon)(t.createDiv("as-detail-empty-icon"),"file-text"),t.createDiv({text:"Select a skill to view"})}render(){this.containerEl.empty(),this.containerEl.addClass("as-detail");let t=this.currentItem;if(!t)return this.clear();this.renderToolbar(t),this.isEditing?this.renderEditor(t):this.renderPreview(t)}renderToolbar(t){let e=this.containerEl.createDiv("as-detail-toolbar"),s=e.createDiv("as-toolbar-top"),i=s.createDiv("as-toolbar-left");i.createSpan({cls:"as-detail-title",text:t.name});for(let h of t.tools){let m=T.find(C=>C.id===h);if(!m)continue;let k=i.createSpan("as-tool-name-badge");k.setCssProps({"--tool-color":m.color}),L[h]&&F(k,h,12),k.createSpan({text:m.name})}let a=s.createDiv("as-toolbar-right"),r=a.createEl("button",{cls:"as-toolbar-btn",attr:{"aria-label":"Toggle favorite"}});(0,x.setIcon)(r,t.isFavorite?"star":"star-off"),r.addEventListener("click",()=>{this.store.toggleFavorite(t.id,this.settings),this.saveSettings(),this.render()});let l=a.createEl("button",{cls:"as-toolbar-btn",attr:{"aria-label":this.isEditing?"Preview":"Edit"}});(0,x.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,x.setIcon)(o,"folder-open"),o.addEventListener("click",()=>{_e.shell.showItemInFolder(t.filePath)}),$()){let h=a.createEl("button",{cls:"as-toolbar-btn as-toolbar-btn-danger",attr:{"aria-label":"Remove skill"}});(0,x.setIcon)(h,"trash-2"),h.addEventListener("click",()=>{Y(this.app,"Remove skill",`Remove "${t.name}"? This will delete the skill files.`,()=>{let m=rt(`prune --skill ${t.name} --yes`);m.success?(new x.Notice(`Removed ${t.name}`,5e3),this.store.refresh(this.settings),this.clear()):new x.Notice(`Failed to remove: ${m.output}`,5e3)})})}let c=e.createDiv("as-detail-meta-bar"),d=_s(t.content),p=t.content.length;if(c.createSpan({cls:"as-meta-item",text:Is(t.fileSize)}),c.createSpan({cls:"as-meta-item",text:`${Ae(p)} chars`}),c.createSpan({cls:"as-meta-item",text:`~${Ae(d)} tokens`}),c.createSpan({cls:"as-meta-item",text:$s(t.lastModified)}),c.createSpan({cls:"as-meta-item as-meta-type",text:t.type}),t.usage&&t.usage.uses>0){let h=e.createDiv("as-detail-usage-bar");h.createSpan({cls:"as-usage-stat",text:`${t.usage.uses} uses`}),h.createSpan({cls:"as-usage-stat",text:`last: ${Qt(t.usage.lastUsed)}`}),t.usage.isStale&&h.createSpan({cls:"as-badge-stale",text:"stale"}),t.usage.isHeavy&&h.createSpan({cls:"as-badge-heavy",text:"heavy"})}}renderFrontmatter(t,e){let s=Object.keys(e.frontmatter),i=t.createDiv("as-frontmatter");if(e.filePath){let a=i.createDiv("as-fm-prop");a.createSpan({cls:"as-fm-key",text:"path"}),a.createSpan({cls:"as-fm-value",text:e.filePath})}if(!(s.length===0&&!e.filePath))for(let a of s){let r=e.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(t){let e=this.containerEl.createDiv("as-detail-body");this.renderFrontmatter(e,t),this.renderWarnings(e,t),this.renderUsageSection(e,t),this.renderConflicts(e,t),this.renderTraces(e,t);let s=e.createDiv("as-detail-preview markdown-rendered");x.MarkdownRenderer.render(this.app,t.content,s,t.filePath,Hs)}renderWarnings(t,e){let s=[];if(e.warnings?.oversized&&s.push(`${e.warnings.lineCount} lines (recommended: <500)`),e.warnings?.longDesc&&s.push(`Description is ${e.warnings.descChars} chars (recommended: <1024)`),e.conflicts&&e.conflicts.length>0){let l=e.conflicts.map(o=>o.skillName).join(", ");s.push(`Conflicts with: ${l}`)}if(s.length===0)return;let i=t.createDiv("as-warnings"),a=i.createDiv("as-warnings-icon");(0,x.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(t,e){if(!e.usage||e.usage.uses===0)return;let s=t.createDiv("as-usage-section"),i=s.createDiv("as-usage-left");if(i.createSpan({cls:"as-usage-count",text:String(e.usage.uses)}),i.createSpan({cls:"as-usage-label",text:"uses"}),i.createSpan({cls:"as-usage-last",text:Qt(e.usage.lastUsed)}),e.usage.daily&&e.usage.daily.length>1){let a=s.createDiv("as-usage-spark");Le(a,e.usage.daily.map(r=>r.count),80,20)}}renderConflicts(t,e){if(!e.conflicts||e.conflicts.length===0)return;let s=t.createDiv("as-conflicts-section");s.createDiv({cls:"as-section-title",text:`Conflicts (${e.conflicts.length})`});for(let i of e.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(t,e){if(!$())return;let s=Ce(e.name);if(s.length===0)return;let i=t.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 "+e.name})}renderPruneAction(t,e){let s=t.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",()=>{Y(this.app,"Remove skill",`Remove "${e.name}"? This will delete the skill files.`,()=>{let a=rt(`prune --skill ${e.name} --yes`);a.success?(new x.Notice(`Removed ${e.name}`,5e3),this.store.refresh(this.settings)):new x.Notice(`Failed to remove: ${a.output}`,5e3)})})}renderEditor(t){let e=this.containerEl.createDiv("as-detail-body as-detail-body-editor"),s=e.createEl("textarea",{cls:"as-editor-textarea"});s.value=t.content,s.spellcheck=!1,s.addEventListener("keydown",r=>{if((r.metaKey||r.ctrlKey)&&r.key==="s"&&(r.preventDefault(),this.saveFile(t,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=e.createDiv("as-save-bar");i.createEl("button",{cls:"as-save-btn",text:"Save"}).addEventListener("click",()=>{this.saveFile(t,s.value)}),i.createSpan({cls:"as-save-hint",text:"Cmd+S to save"})}saveFile(t,e){try{(0,Me.writeFileSync)(t.filePath,e,"utf-8"),t.content=e,new x.Notice(`Saved ${t.name}`,5e3)}catch(s){new x.Notice(`Failed to save: ${s instanceof Error?s.message:String(s)}`,5e3)}}};var W=require("obsidian"),Ue=require("electron");var Yt=require("child_process"),A=require("fs"),f=require("path"),xt=require("os"),gt=require("obsidian"),w=(0,xt.homedir)(),ot=(0,xt.platform)()==="win32",Ie=(0,f.join)(w,".agents",".skill-lock.json"),js="https://skills.sh/api";async function te(n){if(n.length<2)return[];try{let e=(await(0,gt.requestUrl)({url:`${js}/search?q=${encodeURIComponent(n)}&limit=30`})).json;if(!e.skills)return[];let s=Oe();return e.skills.map(i=>({...i,installed:s.has(i.name)}))}catch{return[]}}var $e=new Map;async function Fs(n){let t=$e.get(n);if(t)return t;let s=(await(0,gt.requestUrl)({url:`https://api.github.com/repos/${n}`})).json.default_branch||"main",a=(await(0,gt.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 $e.set(n,r),r}function Rs(n,t,e){let s=t.split("/"),i=s[s.length-1]||n,a=new Set([i,n]);for(let r of e.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 je(n,t,e){try{let{branch:s,files:i}=await Fs(n),a=Rs(t,e,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 t.includes(d)||d.includes(t)}));let l=r||`skills/${t}/SKILL.md`;return(await(0,gt.requestUrl)({url:`https://raw.githubusercontent.com/${n}/${s}/${l}`})).text}catch{return null}}async function Fe(){let n=["react","next","clerk","stripe","ai"],t=new Set,e=[];for(let s of n){let i=await te(s);for(let a of i)t.has(a.id)||(t.add(a.id),e.push(a))}return e.sort((s,i)=>i.installs-s.installs).slice(0,20)}function Os(){let n=[];if(ot){let e=process.env.APPDATA||(0,f.join)(w,"AppData","Roaming");n.push((0,f.join)(e,"npm"),(0,f.join)(w,".bun","bin"),(0,f.join)(w,"AppData","Local","npm"))}else n.push("/usr/local/bin","/opt/homebrew/bin",(0,f.join)(w,".local","bin"),(0,f.join)(w,".bun","bin"));let t=ot?(0,f.join)(w,"AppData","Roaming","nvm"):(0,f.join)(w,".nvm","versions","node");try{for(let e of(0,A.readdirSync)(t))n.push(ot?(0,f.join)(t,e):(0,f.join)(t,e,"bin"))}catch{}return[...n,process.env.PATH||""].join(f.delimiter)}function He(){let n=ot?["bunx.cmd","bunx.exe","bunx"]:["bunx"],t=[];if(ot){let e=process.env.APPDATA||(0,f.join)(w,"AppData","Roaming");t.push((0,f.join)(w,".bun","bin"),(0,f.join)(e,"npm"))}else t.push((0,f.join)(w,".bun","bin"),"/usr/local/bin","/opt/homebrew/bin");for(let e of t)for(let s of n)if((0,A.existsSync)((0,f.join)(e,s)))return(0,f.join)(e,s);return"npx"}function ee(n="auto"){return n==="npx"?"npx":He()}var Re=[{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"}],Tt={"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 Oe(){let n=new Set;if(!(0,A.existsSync)(Ie))return n;try{let t=JSON.parse((0,A.readFileSync)(Ie,"utf-8"));if(t.skills)for(let e of Object.keys(t.skills))n.add(e)}catch{}return n}var Ns=[(0,f.join)(w,".claude","skills"),(0,f.join)(w,".cursor","skills"),(0,f.join)(w,".codex","skills"),(0,f.join)(w,".codeium","windsurf","skills"),(0,f.join)(w,".config","amp","skills"),(0,f.join)(w,".config","opencode","skills"),(0,f.join)(w,".copilot","skills"),(0,f.join)(w,".agents","skills")];function Bs(n){for(let t of Ns){let e=(0,f.join)(t,n);if((0,A.existsSync)(e))try{(0,A.rmSync)(e,{recursive:!0,force:!0})}catch{}}Ws(n)}function Ws(n){let t=(0,f.join)(w,".agents",".skill-lock.json");if((0,A.existsSync)(t))try{let e=JSON.parse((0,A.readFileSync)(t,"utf-8"));e.skills&&e.skills[n]&&(delete e.skills[n],(0,A.writeFileSync)(t,JSON.stringify(e,null,2)+` -`,"utf-8"))}catch{}}function Lt(n){let t=Oe();for(let e of n)e.installed=t.has(e.name);return n}function se(n,t=12e4){return new Promise(e=>{(0,Yt.exec)(n,{encoding:"utf-8",timeout:t,env:{...process.env,PATH:Os(),NO_COLOR:"1"},shell:ot?"cmd.exe":void 0},(s,i)=>{let a=String(i??"");!s||a.includes("Done")||a.includes("Installed")||a.includes("Removed")||a.includes("Updated")?e({success:!0,output:a}):e({success:!1,output:s?.message??"Command failed"})})})}async function Ne(n,t,e={}){let s=t.length>0?`-a ${t.join(" ")}`:"-a '*'",i=e.global?"-g":"",a=e.skillName?`-s ${e.skillName}`:"",l=`${ee(e.runner||"auto")} skills add ${n} ${s} ${i} ${a} -y`.replace(/\s+/g," ").trim();return se(l)}async function Be(n,t="auto"){let s=`${ee(t)} skills remove ${n} -y`,i=await se(s,3e4);return Bs(n),{success:!0,output:i.output||`Cleaned ${n}`}}async function We(n="auto"){let e=`${ee(n)} skills update`,s=await se(e),i=s.output.match(/Updated (\d+) skill/);return{...s,count:i?parseInt(i[1]):0}}function ie(n){return n>=1e6?`${(n/1e6).toFixed(1)}M`:n>=1e3?`${(n/1e3).toFixed(1)}K`:String(n)}var lt=require("fs"),Ve=require("path"),Ge=require("os"),zs=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","WebSearch","WebFetch","TodoRead","TodoWrite","Task","Agent","Skill","LSP","NotebookEdit","AskFollowupQuestion","AttemptCompletion","SearchReplace","InsertCodeBlock","ReadImages","ExecuteCommand","ListFiles","SearchFiles","ReadFile","WriteFile","ReplaceInFile","ListCodeDefinitionNames","BrowserAction","UseMcp","shell","shell_command","update_plan","create_plan","read_file","write_file","execute_command","spawn_agent","write_stdin","multi_tool_use.parallel"]);function ze(n){return!(zs.has(n)||n.startsWith("mcp__")||n.startsWith("mcp_"))}function Us(n){let t=n.top_skills.filter(s=>ze(s.name)),e=n.top_skills.filter(s=>!ze(s.name)).reduce((s,i)=>s+i.total,0);return{...n,top_skills:t,total_invocations:Math.max(0,n.total_invocations-e),unique_skills:t.length}}function Vs(){let n=at("stats"),t=at("health"),e=at("burn"),s=at("context");return{stats:n,health:t,burn:e&&e.length>0?e[0]:null,context:s}}var ne=(0,Ve.join)((0,Ge.homedir)(),".skillkit","dashboard-cache.json"),z=null,Q=null;function Gs(){if(!z&&(0,lt.existsSync)(ne))try{let n=JSON.parse((0,lt.readFileSync)(ne,"utf-8"));z=n.data,Q=n.cachedAt}catch{}}function Js(){if(z)try{(0,lt.writeFileSync)(ne,JSON.stringify({data:z,cachedAt:Q},null,2),"utf-8")}catch{}}Gs();var Pt=class{containerEl;app;constructor(t,e){this.containerEl=t,this.app=e}render(){if(this.containerEl.empty(),this.containerEl.addClass("as-dashboard"),!$()){this.renderNoSkillkit();return}if(z)this.renderDashboard(z);else{let t=this.containerEl.createDiv("as-dash-loading");t.createDiv("as-dash-spinner"),t.createDiv({cls:"as-dash-loading-text",text:"Loading analytics..."}),setTimeout(()=>{let e=Vs();z=e,Q=Date.now(),Js(),t.remove(),this.renderDashboard(e)},10)}}renderDashboard(t){this.renderActionBar(t);let e=t.stats?Us(t.stats):null;if(e&&this.renderOverview(e,t.health),e&&this.renderTopSkills(e),t.health||t.context){let s=this.containerEl.createDiv("as-dash-row");t.health&&this.renderHealth(t.health,s),t.context&&this.renderContext(t.context,s)}t.burn&&this.renderBurn(t.burn),t.health&&this.renderStale(t.health)}renderActionBar(t){let e=this.containerEl.createDiv("as-dash-action-bar");if(Q){let r=Math.round((Date.now()-Q)/1e3),l=r<5?"just now":r<60?`${r}s ago`:`${Math.round(r/60)}m ago`;e.createSpan({cls:"as-dash-updated",text:`Updated ${l}`})}let s=e.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,We().then(r=>{if(r.success){let l=r.count>0?`Updated ${r.count} skill(s)`:"All skills up to date";new W.Notice(l,5e3),z=null,Q=null,this.render()}else new W.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=rt("scan");r.success?(new W.Notice("Scan complete",5e3),z=null,Q=null,this.render()):new W.Notice(`Scan failed: ${r.output}`,5e3),a.setText("Scan sessions"),a.disabled=!1},10)}),t.health&&t.health.usage.unused_30d>0){let r=s.createEl("button",{cls:"as-action-btn as-action-btn-danger",text:`Prune ${t.health.usage.unused_30d} stale`});r.addEventListener("click",()=>{Y(this.app,"Prune stale skills",`Remove ${t.health.usage.unused_30d} unused skills? This cannot be undone.`,()=>{r.setText("Pruning..."),r.disabled=!0,setTimeout(()=>{let l=rt("prune --yes");l.success?(new W.Notice("Pruned stale skills",5e3),z=null,Q=null,this.render()):new W.Notice(`Prune failed: ${l.output}`,5e3),r.setText(`Prune ${t.health.usage.unused_30d} stale`),r.disabled=!1},10)})})}}renderNoSkillkit(){let t=this.containerEl.createDiv("as-dash-empty"),e=t.createDiv("as-dash-empty-icon");(0,W.setIcon)(e,"bar-chart-2"),t.createEl("h3",{text:"Dashboard requires skillkit"}),t.createEl("p",{text:"Install skillkit to unlock usage analytics, burn rate, context tax, and more."}),t.createDiv("as-dash-install-cmd").createEl("code",{text:"npm i -g @crafter/skillkit && skillkit scan"}),t.createEl("a",{cls:"as-skillkit-link",text:"Learn more",href:"https://www.npmjs.com/package/@crafter/skillkit"}).addEventListener("click",a=>{a.preventDefault(),Ue.shell.openExternal("https://www.npmjs.com/package/@crafter/skillkit")})}renderOverview(t,e){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(t.total_invocations),"invocations","activity"),this.statCard(i,String(t.unique_skills),"active skills","sparkles"),this.statCard(i,String(e?.installed??0),"installed","package"),this.statCard(i,String(e?.usage.unused_30d??0),"stale","alert-triangle"),t.streak&&t.streak.current>0){let a=s.createDiv("as-dash-streak-row");a.createSpan({cls:"as-streak-value",text:`${t.streak.current} day streak`}),t.streak.current>=7&&a.createSpan({cls:"as-streak-fire",text:"on fire"}),a.createSpan({cls:"as-streak-longest",text:`longest: ${t.streak.longest}d`})}if(t.velocity&&t.velocity.this_week>0){let a=s.createDiv("as-dash-velocity-row");a.createSpan({text:`This week: $${t.velocity.this_week.toFixed(0)}`}),a.createSpan({cls:"as-velocity-vs",text:`vs $${t.velocity.last_week.toFixed(0)} last week`});let r=t.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(t,e,s,i){let a=t.createDiv("as-stat-card"),r=a.createDiv("as-stat-icon");(0,W.setIcon)(r,i),a.createDiv({cls:"as-stat-value",text:e}),a.createDiv({cls:"as-stat-label",text:s})}renderTopSkills(t){if(t.top_skills.length===0)return;let e=this.containerEl.createDiv("as-dash-section");e.createDiv({cls:"as-dash-title",text:`Top Skills (${t.period.days}d)`});let s=t.top_skills[0]?.total||1,i=e.createDiv("as-dash-bars");for(let a of t.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(t,e){let s=(e||this.containerEl).createDiv("as-dash-section");s.createDiv({cls:"as-dash-title",text:"Health"});let i=t.usage.used_30d+t.usage.unused_30d,a=i>0?Math.round(t.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:`${t.usage.used_30d} used in 30d`}),o.createDiv({cls:"as-health-line as-health-warn",text:`${t.usage.unused_30d} never triggered`});let d=o.createDiv("as-budget-bar").createDiv("as-budget-fill");d.setCssProps({"--bar-w":`${t.metadata.pct}%`}),t.metadata.pct>80&&d.addClass("as-budget-over"),o.createDiv({cls:"as-health-line",text:`Metadata budget: ${t.metadata.pct}%`})}renderBurn(t){let e=this.containerEl.createDiv("as-dash-section");e.createDiv({cls:"as-dash-title",text:`Burn Rate \u2014 ${t.agent} (${t.period.days}d)`});let s=e.createDiv("as-dash-stats as-dash-stats-sm");if(this.statCard(s,`$${Math.round(t.cost.total).toLocaleString()}`,"total cost","flame"),this.statCard(s,`$${Math.round(t.cost.total/(t.period.days||1)).toLocaleString()}`,"daily avg","trending-up"),this.statCard(s,`${(t.period.sessions||0).toLocaleString()}`,"sessions","terminal"),this.statCard(s,`${((t.period.api_calls||0)/1e3).toFixed(0)}k`,"API calls","zap"),t.by_model&&t.by_model.length>0){let l=e.createDiv("as-model-breakdown");for(let o of t.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=t.by_day.slice(-14);if(i.length===0)return;let a=Math.max(...i.map(l=>l.costUsd),1),r=e.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(t,e){let s=(e||this.containerEl).createDiv("as-dash-section");s.createDiv({cls:"as-dash-title",text:"Context Tax"});let i=t.always_loaded.total_tokens,a=[{label:"CLAUDE.md",tokens:t.always_loaded.claude_md_tokens,cls:"as-ctx-claude"},{label:"Skills metadata",tokens:t.always_loaded.skill_metadata_tokens,cls:"as-ctx-skills"},{label:"Memory",tokens:t.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): $${t.session_estimate.with_cache.toFixed(2)}`}),o.createDiv({text:`Without cache: $${t.session_estimate.without_cache.toFixed(2)}`}),o.createDiv({cls:"as-ctx-savings",text:`Cache saves ${t.session_estimate.savings_pct.toFixed(0)}%`})}renderStale(t){if(t.usage.never_used.length===0)return;let e=this.containerEl.createDiv("as-dash-section");e.createDiv({cls:"as-dash-title",text:`Stale skills (${t.usage.unused_30d})`});let s=e.createDiv("as-stale-list");for(let i of t.usage.never_used.slice(0,20))s.createDiv("as-stale-item").createSpan({text:i});t.usage.never_used.length>20&&s.createDiv({cls:"as-stale-more",text:`+${t.usage.never_used.length-20} more`})}};var N=require("obsidian"),dt=require("fs"),ss=require("path"),is=require("os");var R=require("obsidian"),ct=require("fs"),ts=require("path"),es=require("os");var b=require("fs"),S=require("path"),At=require("os"),Ze=require("obsidian"),qe=require("crypto");var Je=new Set(["readme.md","license","license.md","changelog.md",".ds_store","thumbs.db"]);function Zs(n){return(0,qe.createHash)("sha256").update(n).digest("hex").slice(0,12)}function qs(n){let t=n.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);if(!t)return{frontmatter:{},content:n};try{let e=(0,Ze.parseYaml)(t[1]);return{frontmatter:typeof e=="object"&&e?e:{},content:t[2]}}catch{return{frontmatter:{},content:n}}}function Ks(n,t,e,s="auto",i="skill"){if(i==="command")return typeof n.name=="string"&&n.name?n.name:(0,S.basename)(e,(0,S.extname)(e));if(s==="auto"){if(typeof n.name=="string"&&n.name)return n.name;let r=t.match(/^#\s+(.+)$/m);if(r)return r[1].trim()}let a=(0,S.basename)(e,(0,S.extname)(e));return a==="SKILL"?(0,S.basename)((0,S.join)(e,"..")):a}function Ke(n,t,e,s="auto",i=0){if(!(0,b.existsSync)(n)||i>3)return[];let a=[];for(let r of(0,b.readdirSync)(n,{withFileTypes:!0})){let l=(0,S.join)(n,r.name);if(!(r.isDirectory()||r.isSymbolicLink()&&(0,b.statSync)(l,{throwIfNoEntry:!1})?.isDirectory()))continue;let c=(0,S.join)(l,"SKILL.md");if((0,b.existsSync)(c)){let d=vt(c,t,e,"directory-with-skillmd",s);d&&a.push(d)}else a.push(...Ke(l,t,e,s,i+1))}return a}function Qs(n,t,e,s="auto"){if(!(0,b.existsSync)(n))return[];let i=[];for(let a of(0,b.readdirSync)(n,{withFileTypes:!0})){let r=(0,S.join)(n,a.name);if(a.isDirectory()||a.isSymbolicLink()&&(0,b.statSync)(r,{throwIfNoEntry:!1})?.isDirectory()){let d=(0,S.join)(r,"SKILL.md");if((0,b.existsSync)(d)){let m=vt(d,t,e,"flat-md",s);m&&i.push(m);continue}let p=(0,b.readdirSync)(r).filter(m=>m.endsWith(".md")&&!Je.has(m.toLowerCase())),h=p.find(m=>m.toLowerCase()===`${a.name.toLowerCase()}.md`)||p[0];if(h){let m=vt((0,S.join)(r,h),t,e,"flat-md",s);m&&i.push(m)}continue}let o=a.name.toLowerCase();if(!o.endsWith(".md")||Je.has(o))continue;let c=vt(r,t,e,"flat-md",s);c&&i.push(c)}return i}function Xs(n,t,e,s="auto"){if(!(0,b.existsSync)(n))return[];let i=[];for(let a of(0,b.readdirSync)(n,{withFileTypes:!0})){if(!a.name.endsWith(".mdc")&&!a.name.endsWith(".md")||a.isDirectory())continue;let r=vt((0,S.join)(n,a.name),t,e,"mdc",s);r&&i.push(r)}return i}function vt(n,t,e,s="directory-with-skillmd",i="auto"){try{let a=(0,b.readFileSync)(n,"utf-8"),r=(0,b.statSync)(n),{frontmatter:l,content:o}=qs(a),c=Ks(l,o,n,i,t),d=typeof l.description=="string"?l.description:"",p;try{p=(0,b.realpathSync)(n)}catch{p=n}return{id:Zs(p),name:c,description:d,type:t,tools:[e],filePath:n,realPath:p,dirPath:(0,S.join)(n,".."),content:a,frontmatter:l,lastModified:r.mtimeMs,fileSize:r.size,isFavorite:!1,collections:[]}}catch{return null}}function ae(n,t,e="auto"){switch(n.pattern){case"directory-with-skillmd":return Ke(n.baseDir,n.type,t,e);case"flat-md":return Qs(n.baseDir,n.type,t,e);case"mdc":return Xs(n.baseDir,n.type,t,e)}}function Ys(n,t){let e=[],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,S.join)(n,i.sub);if(!(0,b.existsSync)(a))continue;let r={baseDir:a,type:i.type,pattern:i.pattern};e.push(...ae(r,t))}return e}function Qe(n){return n.projectsHomeDir||(0,At.homedir)()}function ti(n,t){let e=(0,At.homedir)(),s=[];for(let i of[...t.paths,...t.agentPaths]){let a=(0,S.relative)(e,i.baseDir);if(a.startsWith("..")||a.startsWith("/"))continue;let r=(0,S.join)(n,a);if((0,b.existsSync)(r))try{s.push(...ae({...i,baseDir:r},t.id))}catch{}}return s}function ei(n){let t=Qe(n);if(!(0,b.existsSync)(t))return[];let e=[];try{let s=new Set(["node_modules",".Trash","Library","Applications","Music","Movies","Pictures","Public"]);for(let i of(0,b.readdirSync)(t,{withFileTypes:!0})){if(!i.isDirectory()&&!i.isSymbolicLink()||s.has(i.name))continue;let a=(0,S.join)(t,i.name);for(let r of T){if(!r.isInstalled())continue;let l=n.tools[r.id];if(l&&!l.enabled)continue;let o=ti(a,r);o.length>0&&e.push({items:o,toolId:r.id})}}}catch{}return e}function re(n,t){let e=t||(0,At.homedir)();if(!n.startsWith(e+S.sep))return"global";let i=n.slice(e.length+1).split(S.sep);return i.length>1&&!i[0].startsWith(".")?i[0]:"global"}function Xe(n){Se();let t=n.namingMode||"auto",e=new Map,s=new Map;function i(a,r){let l=e.get(a.id);if(l){l.tools.includes(r)||l.tools.push(r);return}let o=s.get(a.name);if(o){let c=e.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);e.set(a.id,a),s.set(a.name,a.id)}for(let a of T){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 ae(o,a.id,t))i(c,a.id)}for(let a of n.customScanPaths)if((0,b.existsSync)(a))for(let r of Ys(a,"claude-code"))i(r,"claude-code");if(n.projectScanEnabled)for(let{items:a,toolId:r}of ei(n))for(let l of a)i(l,r);return e}function oe(){return T.filter(n=>n.isInstalled()).map(n=>n.id)}function Ye(n){let t=[];for(let e of T)if(e.isInstalled())for(let s of[...e.paths,...e.agentPaths])(0,b.existsSync)(s.baseDir)&&t.push(s.baseDir);if(n?.projectScanEnabled){let e=Qe(n),s=new Set(["node_modules",".Trash","Library","Applications","Music","Movies","Pictures","Public"]);try{for(let i of(0,b.readdirSync)(e,{withFileTypes:!0})){if(!i.isDirectory()&&!i.isSymbolicLink()||s.has(i.name))continue;let a=(0,S.join)(e,i.name);for(let r of[".claude/skills",".claude/commands",".claude/agents",".cursor/skills",".codex/skills"]){let l=(0,S.join)(a,r);(0,b.existsSync)(l)&&t.push(l)}}}catch{}}return t}var le={};for(let[n,t]of Object.entries(Tt))le[t]||(le[t]=n);var ce=(0,ts.join)((0,es.homedir)(),".skillkit","install-prefs.json"),tt=null,Mt=!0;function si(){if(!tt&&(0,ct.existsSync)(ce))try{let n=JSON.parse((0,ct.readFileSync)(ce,"utf-8"));tt=new Set(n.agents||[]),Mt=n.global??!0}catch{}}function ii(){try{(0,ct.writeFileSync)(ce,JSON.stringify({agents:tt?[...tt]:[],global:Mt}),"utf-8")}catch{}}si();var _t=class extends R.Modal{skill;settings;onInstalled;selectedAgents;isGlobal;constructor(t,e,s,i){if(super(t),this.skill=e,this.settings=s,this.onInstalled=i,tt)this.selectedAgents=new Set(tt);else{this.selectedAgents=new Set;let a=oe();for(let r of a){let l=Tt[r];l&&this.selectedAgents.add(l)}}this.isGlobal=Mt}onOpen(){let{contentEl:t}=this;t.addClass("as-install-modal"),t.createEl("h3",{text:`Install ${this.skill.name}`}),t.createEl("p",{cls:"as-install-source",text:this.skill.source}),new R.Setting(t).setName("Install globally").setDesc("Shared across all projects (~/.agents/skills/)").addToggle(o=>o.setValue(this.isGlobal).onChange(c=>{this.isGlobal=c})),new R.Setting(t).setName("Agents").setHeading();let e=t.createDiv("as-install-scroll"),s=oe(),i=new Set(s.map(o=>Tt[o]).filter(Boolean));for(let o of Re){let c=i.has(o.id),d=le[o.id],h=new R.Setting(e).addToggle(C=>C.setValue(this.selectedAgents.has(o.id)).onChange(M=>{M?this.selectedAgents.add(o.id):this.selectedAgents.delete(o.id)})).nameEl,m=d&&L[d]?d:L[o.id]?o.id:L[o.id+"-code"]?o.id+"-code":L[o.id+"-cli"]?o.id+"-cli":null,k=h.createSpan("as-install-agent-icon");m?F(k,m,14):k.addClass("as-install-agent-placeholder"),h.createSpan({text:o.label}),c&&h.createSpan({cls:"as-install-detected",text:"detected"})}let a=t.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(t){let e=[...this.selectedAgents];if(e.length===0){new R.Notice("Select at least one agent",5e3);return}tt=new Set(this.selectedAgents),Mt=this.isGlobal,ii(),this.close(),new R.Notice(`Installing ${this.skill.name}...`,3e3),Ne(this.skill.source,e,{runner:this.settings.packageRunner,global:this.isGlobal,skillName:this.skill.name}).then(s=>{s.success?(new R.Notice(`Installed ${this.skill.name}`,5e3),this.skill.installed=!0,this.onInstalled()):new R.Notice(`Failed to install ${this.skill.name}`,5e3)})}onClose(){this.contentEl.empty()}};var de=(0,ss.join)((0,is.homedir)(),".skillkit","marketplace-popular.json"),O=null,It="",X=null,ni=new N.Component;function ai(){if(!O&&(0,dt.existsSync)(de))try{let n=JSON.parse((0,dt.readFileSync)(de,"utf-8"));O=Lt(n)}catch{}}function ri(){if(O)try{(0,dt.writeFileSync)(de,JSON.stringify(O),"utf-8")}catch{}}ai();var $t=class{containerEl;inputEl=null;listEl=null;previewEl=null;searchTimer=null;selectedSkill=null;app;settings;onRefresh;constructor(t,e,s,i){this.containerEl=t,this.app=e.app,this.settings=s,this.onRefresh=i}render(){if(!this.inputEl){this.containerEl.empty(),this.containerEl.addClass("as-marketplace");let t=this.containerEl.createDiv("as-mp-search");this.inputEl=t.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 e=this.containerEl.createDiv("as-mp-body");this.listEl=e.createDiv("as-mp-list"),this.previewEl=e.createDiv("as-mp-preview"),this.previewEl.createDiv({cls:"as-mp-hint",text:"Select a skill to preview."})}this.inputEl.value=It,It.length>=2&&X?this.showResults(X):O?this.showPopular():this.loadPopular()}async loadPopular(){if(!this.listEl)return;this.listEl.empty(),this.listEl.createDiv({cls:"as-mp-loading",text:"Loading popular skills..."}),O=await Fe(),ri(),this.showPopular()}refreshList(){O&&Lt(O),X&&Lt(X),It.length>=2&&X?this.showResults(X):this.showPopular()}showPopular(){if(this.listEl){if(this.listEl.empty(),!O||O.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 t of O)this.renderSkillCard(t)}}showResults(t){if(this.listEl){if(this.listEl.empty(),t.length===0){this.listEl.createDiv({cls:"as-mp-hint",text:"No skills found."});return}for(let e of t)this.renderSkillCard(e)}}async doSearch(t){if(!this.listEl)return;if(It=t,t.length<2){X=null,this.showPopular();return}this.listEl.empty(),this.listEl.createDiv({cls:"as-mp-loading",text:"Searching..."});let e=await te(t);X=e,this.showResults(e)}renderSkillCard(t){if(!this.listEl)return;let e=this.listEl.createDiv("as-mp-card");this.selectedSkill?.id===t.id&&e.addClass("is-selected");let s=e.createDiv("as-mp-card-header");s.createSpan({cls:"as-mp-card-name",text:t.name}),t.installed&&s.createSpan({cls:"as-mp-installed-badge",text:"Installed"}),e.createDiv({cls:"as-mp-card-source",text:t.source});let i=e.createDiv("as-mp-card-meta"),a=i.createSpan("as-mp-dl-icon");(0,N.setIcon)(a,"download"),i.createSpan({cls:"as-mp-card-installs",text:ie(t.installs)}),e.addEventListener("click",()=>{this.selectedSkill=t,this.listEl&&this.listEl.querySelectorAll(".as-mp-card").forEach(r=>r.removeClass("is-selected")),e.addClass("is-selected"),this.showPreview(t)})}async showPreview(t){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:t.name});let a=i.createDiv("as-mp-preview-meta");a.createSpan({cls:"as-mp-preview-source",text:t.source});let r=a.createSpan("as-mp-dl-icon");(0,N.setIcon)(r,"download"),a.createSpan({cls:"as-mp-preview-installs",text:ie(t.installs)});let l=s.createDiv("as-mp-preview-right");if(!t.installed)this.renderInstallButton(l,t);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",()=>{Y(this.app,"Uninstall skill",`Remove "${t.name}" from all agents?`,()=>{d.setText("Removing..."),d.disabled=!0,new N.Notice(`Removing ${t.name}...`,3e3),Be(t.name,this.settings.packageRunner).then(p=>{p.success?(new N.Notice(`Removed ${t.name}`,5e3),t.installed=!1,this.refreshList(),this.showPreview(t)):(new N.Notice(`Failed to remove ${t.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 je(t.source,t.name,t.id);if(o.empty(),c){t.content=c;let d=o.createDiv("as-mp-rendered markdown-rendered");N.MarkdownRenderer.render(this.app,c,d,"",ni)}else o.createDiv({cls:"as-mp-hint",text:"Could not load skill content."})}renderInstallButton(t,e){t.createEl("button",{cls:"as-mp-install-btn",text:"Install"}).addEventListener("click",()=>{new _t(this.app,e,this.settings,()=>{this.refreshList(),this.showPreview(e)}).open()})}};var et=require("obsidian"),U=require("fs"),Ht=require("path");function oi(){let n=[];for(let t of T){if(!t.isInstalled())continue;let e=[];for(let s of[...t.paths,...t.agentPaths])s.type==="rule"||s.type==="memory"||e.push({sp:s,label:s.type});e.length>0&&n.push({tool:t,paths:e})}return n}var li={skill:"sparkles",command:"terminal",agent:"bot"},jt=class extends et.Modal{onCreated;toolOptions;selectedTool=null;selectedPath=null;name="";step="tool";constructor(t,e){super(t),this.onCreated=e,this.toolOptions=oi()}onOpen(){this.modalEl.addClass("as-create-modal"),this.render()}render(){let{contentEl:t}=this;t.empty(),this.step==="tool"?this.renderToolStep(t):this.step==="type"?this.renderTypeStep(t):this.renderNameStep(t)}renderToolStep(t){this.renderHeader(t,"Choose tool",null);let e=t.createDiv("as-create-grid");for(let s of this.toolOptions){let i=e.createDiv("as-create-card");i.style.setProperty("--tool-color",s.tool.color);let a=i.createDiv("as-create-card-icon");L[s.tool.id]&&F(a,s.tool.id,24),i.createDiv({cls:"as-create-card-name",text:s.tool.name}),i.addEventListener("click",()=>{this.selectedTool=s,s.paths.length===1?(this.selectedPath=s.paths[0],this.step="name"):this.step="type",this.render()})}}renderTypeStep(t){if(!this.selectedTool)return;this.renderHeader(t,`${this.selectedTool.tool.name}`,()=>{this.step="tool",this.render()}),t.createDiv("as-create-subtitle").setText("What do you want to create?");let s=t.createDiv("as-create-type-grid");for(let i of this.selectedTool.paths){let a=s.createDiv("as-create-type-card");a.style.setProperty("--tool-color",this.selectedTool.tool.color);let r=li[i.label]||"file",o=a.createDiv("as-create-type-icon").createSvg("svg",{attr:{viewBox:"0 0 24 24",width:"20",height:"20",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"}});r==="sparkles"?o.innerHTML='':r==="terminal"?o.innerHTML='':r==="bot"&&(o.innerHTML=''),a.createDiv({cls:"as-create-type-label",text:i.label}),a.addEventListener("click",()=>{this.selectedPath=i,this.step="name",this.render()})}}renderNameStep(t){if(!this.selectedTool||!this.selectedPath)return;let e=this.selectedTool.paths.length>1?"type":"tool";this.renderHeader(t,`New ${this.selectedPath.label}`,()=>{this.step=e,this.render()});let s=t.createDiv("as-create-badge");s.style.setProperty("--tool-color",this.selectedTool.tool.color);let i=s.createSpan("as-create-badge-icon");L[this.selectedTool.tool.id]&&F(i,this.selectedTool.tool.id,14),s.createSpan({text:this.selectedTool.tool.name});let r=t.createDiv("as-create-input-wrap").createEl("input",{type:"text",placeholder:`my-${this.selectedPath.label}-name`,cls:"as-create-input"});r.value=this.name,r.addEventListener("input",()=>{this.name=r.value.trim()}),r.addEventListener("keydown",c=>{c.key==="Enter"&&this.name&&this.create()}),setTimeout(()=>r.focus(),10);let o=t.createDiv("as-create-actions").createEl("button",{text:`Create ${this.selectedPath.label}`,cls:"as-create-submit"});o.style.setProperty("--tool-color",this.selectedTool.tool.color),o.addEventListener("click",()=>this.create())}renderHeader(t,e,s){let i=t.createDiv("as-create-header");if(s){let a=i.createDiv("as-create-back");a.innerHTML='',a.addEventListener("click",s)}i.createDiv({cls:"as-create-title",text:e})}create(){if(!this.name||!this.selectedPath)return;let t=this.name.toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"");if(!t){new et.Notice("Invalid name");return}let e=this.selectedPath.sp,s;if(e.pattern==="directory-with-skillmd"){let i=(0,Ht.join)(e.baseDir,t);if((0,U.existsSync)(i)){new et.Notice(`Already exists: ${t}`);return}(0,U.mkdirSync)(i,{recursive:!0}),s=(0,Ht.join)(i,"SKILL.md"),(0,U.writeFileSync)(s,["---",`name: ${this.name}`,'description: ""',"---","",`# ${this.name}`,"","## Instructions","",""].join(` -`),"utf-8")}else{if((0,U.existsSync)(e.baseDir)||(0,U.mkdirSync)(e.baseDir,{recursive:!0}),s=(0,Ht.join)(e.baseDir,`${t}.md`),(0,U.existsSync)(s)){new et.Notice(`Already exists: ${t}.md`);return}(0,U.writeFileSync)(s,["---",'description: ""',"---","",""].join(` -`),"utf-8")}new et.Notice(`Created ${this.name}`),this.close(),this.onCreated(s)}onClose(){this.contentEl.empty()}};var cs=require("obsidian"),pt=require("fs"),ds=require("path"),ps=require("os");var pe={customTags:{},favorites:[]},ue={tools:{},watchEnabled:!0,watchDebounceMs:500,deepSearchDefault:!1,deepSearchScope:"both",favorites:[],collections:{},customScanPaths:[],namingMode:"auto",projectScanEnabled:!0,projectsHomeDir:"",packageRunner:"auto"};var j=require("fs"),G=require("path"),ge=require("os"),ns=require("readline"),ci=(0,G.join)((0,ge.homedir)(),".claude"),he=(0,G.join)(ci,"projects"),di=5*1024*1024,me=500;function pi(n){let t=(0,ge.homedir)().split(G.sep).filter(Boolean),e=t.join("-"),s=n;if(s.startsWith(e+"-"))s=s.slice(e.length+1);else if(s.startsWith("-")){s=s.slice(1);let a=t.join("-")+"-";s.startsWith(a)&&(s=s.slice(a.length))}let i=s.split("-").filter(Boolean);return i.length<=2?i.join("-")||"root":i.slice(-2).join("-")}function Ft(n){if(typeof n=="string")return n;if(Array.isArray(n)){let t=[];for(let e of n)if(typeof e=="object"&&e!==null){let s=e;s.type==="text"&&typeof s.text=="string"&&t.push(s.text)}return t.join(` -`)}return""}function as(n){if(!Array.isArray(n))return[];let t=[];for(let e of n)if(typeof e=="object"&&e!==null){let s=e;s.type==="tool_use"&&typeof s.name=="string"&&t.push(s.name)}return t}function ui(n){let t=[],e="",s="";for(let i of n)try{let a=JSON.parse(i),r=a.timestamp;if(r&&(e||(e=r),s=r),a.type==="user"){let l=a.message;if(!l)continue;let o=Ft(l.content);o&&t.push({role:"human",text:o,timestamp:r||""})}if(a.type==="assistant"){let l=a.message;if(!l)continue;let o=Ft(l.content),c=as(l.content);o&&t.push({role:"assistant",text:o,timestamp:r||"",toolCalls:c.length>0?c:void 0})}}catch{}return{messages:t,firstTimestamp:e,lastTimestamp:s}}function hi(){let n=[];if(!(0,j.existsSync)(he))return n;let t;try{t=(0,j.readdirSync)(he)}catch{return n}for(let e of t){let s=(0,G.join)(he,e);try{if(!(0,j.statSync)(s).isDirectory())continue}catch{continue}let i=pi(e),a;try{a=(0,j.readdirSync)(s).filter(r=>r.endsWith(".jsonl"))}catch{continue}for(let r of a){let l=(0,G.join)(s,r);try{let o=(0,j.statSync)(l);n.push({uuid:(0,G.basename)(r,".jsonl"),project:i,projectPath:s,filePath:l,fileSize:o.size})}catch{continue}}}return n}function mi(n){try{let e=(0,j.readFileSync)(n.filePath,"utf-8").split(` -`).filter(c=>c.trim());if(e.length===0)return null;let s=e.length>me?e.slice(0,me):e,{messages:i,firstTimestamp:a,lastTimestamp:r}=ui(s);if(i.length===0)return null;let l=i.find(c=>c.role==="human"),o=l?l.text.slice(0,120).replace(/\n/g," "):"(empty conversation)";return{id:n.uuid,uuid:n.uuid,project:n.project,projectPath:n.projectPath,title:o,messages:i,messageCount:i.length,firstTimestamp:a,lastTimestamp:r,tags:[],customTags:[],isFavorite:!1,filePath:n.filePath}}catch{return null}}async function gi(n){return new Promise(t=>{let e=[],s="",i="",a=0,r=(0,ns.createInterface)({input:(0,j.createReadStream)(n.filePath,{encoding:"utf-8"}),crlfDelay:Number.POSITIVE_INFINITY});r.on("line",l=>{if(l.trim()){if(a++,a>me){r.close();return}try{let o=JSON.parse(l),c=o.timestamp;if(c&&(s||(s=c),i=c),o.type==="user"){let d=o.message;if(!d)return;let p=Ft(d.content);p&&e.push({role:"human",text:p,timestamp:c||""})}if(o.type==="assistant"){let d=o.message;if(!d)return;let p=Ft(d.content),h=as(d.content);p&&e.push({role:"assistant",text:p,timestamp:c||"",toolCalls:h.length>0?h:void 0})}}catch{}}}),r.on("close",()=>{if(e.length===0){t(null);return}let l=e.find(c=>c.role==="human"),o=l?l.text.slice(0,120).replace(/\n/g," "):"(empty conversation)";t({id:n.uuid,uuid:n.uuid,project:n.project,projectPath:n.projectPath,title:o,messages:e,messageCount:e.length,firstTimestamp:s,lastTimestamp:i,tags:[],customTags:[],isFavorite:!1,filePath:n.filePath})}),r.on("error",()=>t(null))})}async function rs(){let n=hi(),t=[],e=20;n.sort((s,i)=>i.fileSize-s.fileSize);for(let s=0;sr.fileSize>di?gi(r):Promise.resolve(mi(r))));for(let r of a)r&&t.push(r)}return t.sort((s,i)=>(i.lastTimestamp||"").localeCompare(s.lastTimestamp||"")),t}var vi=[{tag:"react",patterns:[/\breact\b/i,/\.tsx\b/,/\.jsx\b/,/usestate|useeffect|useref/i]},{tag:"react-native",patterns:[/react.native/i,/\bexpo\b/i,/react-navigation/i]},{tag:"nextjs",patterns:[/next\.js/i,/\bnextjs\b/i,/next\.config/i]},{tag:"vue",patterns:[/\bvue\b/i,/\.vue\b/,/vuex|pinia/i]},{tag:"angular",patterns:[/\bangular\b/i,/\.component\.ts/i]},{tag:"svelte",patterns:[/\bsvelte\b/i,/\.svelte\b/]},{tag:"typescript",patterns:[/typescript/i,/tsconfig/i,/\.tsx\b/]},{tag:"javascript",patterns:[/javascript/i,/\.js\b/,/\.mjs\b/]},{tag:"python",patterns:[/\bpython\b/i,/\.py\b/,/\bpip\b/i,/django|flask|fastapi/i]},{tag:"rust",patterns:[/\brust\b/i,/\.rs\b/,/cargo\.toml/i]},{tag:"go",patterns:[/\bgolang\b/i,/\.go\b/,/go\.mod/i]},{tag:"java",patterns:[/\bjava\b/i,/\.java\b/,/gradle|maven/i]},{tag:"csharp",patterns:[/\bc#\b/i,/\.cs\b/,/unity|dotnet/i]},{tag:"swift",patterns:[/\bswift\b/i,/\.swift\b/,/swiftui/i]},{tag:"nestjs",patterns:[/nestjs/i,/\bnest\b/i,/@nestjs\//]},{tag:"tailwind",patterns:[/tailwind/i,/tailwindcss/i]},{tag:"css",patterns:[/\.css\b/,/\.scss\b/,/\.sass\b/,/styled-components/i]},{tag:"node",patterns:[/node\.js/i,/\bnodejs\b/i,/package\.json/i,/\bnpm\b/i]},{tag:"docker",patterns:[/\bdocker\b/i,/dockerfile/i,/docker-compose/i]},{tag:"sql",patterns:[/\bsql\b/i,/postgres|mysql|sqlite/i,/prisma|typeorm|sequelize/i]},{tag:"mongodb",patterns:[/\bmongo\b/i,/mongodb/i,/mongoose/i]},{tag:"graphql",patterns:[/graphql/i,/\.graphql\b/,/apollo/i]},{tag:"git",patterns:[/\bgit\s+(commit|push|pull|merge|rebase|checkout|branch)/i]},{tag:"unity",patterns:[/\bunity\b/i,/gameobject|monobehaviour/i,/\.unity\b/]},{tag:"blender",patterns:[/\bblender\b/i,/\.blend\b/,/bpy\./i]},{tag:"threejs",patterns:[/three\.js/i,/threejs/i,/\br3f\b/i,/react-three/i]},{tag:"aws",patterns:[/\baws\b/i,/lambda|s3|ec2|dynamodb/i]},{tag:"firebase",patterns:[/firebase/i,/firestore/i]},{tag:"testing",patterns:[/\bjest\b/i,/\bvitest\b/i,/\.test\.|\.spec\./i,/testing/i]}],fi=[{tag:"bug-fix",patterns:[/\bfix\b/i,/\bbug\b/i,/\berror\b/i,/broken/i,/not working/i,/no funciona/i,/arregl/i]},{tag:"feature",patterns:[/\badd\b/i,/\bcreate\b/i,/\bimplement\b/i,/\bnew\b/i,/agreg/i,/crea /i]},{tag:"refactor",patterns:[/refactor/i,/restructur/i,/reorganiz/i,/clean.?up/i]},{tag:"styling",patterns:[/\bcss\b/i,/\bstyle\b/i,/\bdesign\b/i,/layout/i,/responsive/i,/color/i,/estilo/i]},{tag:"config",patterns:[/config/i,/setup/i,/install/i,/\.env\b/i,/configur/i]},{tag:"api",patterns:[/\bapi\b/i,/endpoint/i,/fetch|axios/i,/request/i,/rest\b/i]},{tag:"auth",patterns:[/auth/i,/login/i,/password/i,/token/i,/session/i,/jwt/i]},{tag:"database",patterns:[/database/i,/migration/i,/schema/i,/seed/i,/query/i]},{tag:"deployment",patterns:[/deploy/i,/ci.?cd/i,/pipeline/i,/production/i,/vercel|netlify|heroku/i]},{tag:"documentation",patterns:[/\bdocs?\b/i,/readme/i,/documentation/i,/comment/i]},{tag:"performance",patterns:[/performance/i,/optimi[zs]/i,/slow/i,/fast/i,/cache/i,/lazy/i]},{tag:"ui-ux",patterns:[/\bui\b/i,/\bux\b/i,/component/i,/button|modal|dialog|form/i,/animation/i]}];function bi(n,t){let e=new RegExp(t.source,t.flags.includes("g")?t.flags:t.flags+"g"),s=n.match(e);return s?s.length:0}function os(n,t,e=1){let s=[];for(let i of t){let a=0;for(let r of i.patterns)a+=bi(n,r);a>=e&&s.push(i.tag)}return s}function Si(n){let t=new Set;n.project&&n.project!=="root"&&t.add(n.project);let s=n.messages.filter(r=>r.role==="human").slice(0,5).map(r=>r.text.replace(/[\s\S]*?<\/system-reminder>/g,"")).join(" "),a=n.messages.filter(r=>r.role==="assistant").flatMap(r=>r.toolCalls||[]);for(let r of os(s,vi,3))t.add(r);for(let r of os(s,fi,2))t.add(r);return a.some(r=>r.includes("mcp__blender"))&&t.add("blender"),a.some(r=>r.includes("mcp-unity")||r.includes("mcp__mcp-unity"))&&t.add("unity"),Array.from(t).sort()}function ls(n){for(let t of n)t.tags=Si(t)}var ve=(0,ds.join)((0,ps.homedir)(),".claude","agentfiles-conversations.json"),Rt=class extends cs.Events{items=[];_filter={kind:"all-conversations"};_sort="date";_dateRange="today";_activeTags=[];_searchQuery="";_loading=!1;tagData={...pe};get filter(){return this._filter}get sort(){return this._sort}get dateRange(){return this._dateRange}get activeTags(){return this._activeTags}get searchQuery(){return this._searchQuery}get loading(){return this._loading}get allItems(){return this.items}get filteredItems(){let t=this.items;switch(this._filter.kind){case"conversation-project":t=t.filter(e=>e.project===this._filter.project);break;case"conversation-tag":t=t.filter(e=>e.tags.includes(this._filter.tag)||e.customTags.includes(this._filter.tag));break;case"conversation-favorites":t=t.filter(e=>e.isFavorite);break}if(this._dateRange!=="all"){let e=Date.now(),s={today:1,"7d":7,"30d":30,"90d":90,"180d":180}[this._dateRange],i=e-s*864e5;t=t.filter(a=>new Date(a.lastTimestamp).getTime()>=i)}if(this._activeTags.length>0&&(t=t.filter(e=>{let s=[...e.tags,...e.customTags];return this._activeTags.every(i=>s.includes(i))})),this._searchQuery){let e=this._searchQuery.toLowerCase();t=t.filter(s=>s.title.toLowerCase().includes(e)||s.project.toLowerCase().includes(e)||s.tags.some(i=>i.includes(e))||s.customTags.some(i=>i.includes(e))||s.messages.some(i=>i.text.toLowerCase().includes(e)))}return this._sort==="messages"&&(t=[...t].sort((e,s)=>s.messageCount-e.messageCount)),t}getProjectCounts(){let t=new Map;for(let e of this.items)t.set(e.project,(t.get(e.project)||0)+1);return t}getAllTags(){let t=new Map;for(let e of this.items)for(let s of[...e.tags,...e.customTags])t.set(s,(t.get(s)||0)+1);return t}refresh(){this._loading=!0,this.trigger("conversations-updated"),this.refreshAsync()}async refreshAsync(){this.loadTagData(),this.items=await rs(),ls(this.items),this.applyTagData(),this._loading=!1,this.trigger("conversations-updated")}loadTagData(){try{(0,pt.existsSync)(ve)&&(this.tagData=JSON.parse((0,pt.readFileSync)(ve,"utf-8")))}catch{this.tagData={...pe}}}saveTagData(){try{(0,pt.writeFileSync)(ve,JSON.stringify(this.tagData,null,2),"utf-8")}catch{}}applyTagData(){for(let t of this.items)t.customTags=this.tagData.customTags[t.uuid]||[],t.isFavorite=this.tagData.favorites.includes(t.uuid)}setFilter(t){this._filter=t,this.trigger("conversations-updated")}setSort(t){this._sort=t,this.trigger("conversations-updated")}setDateRange(t){this._dateRange=t,this.trigger("conversations-updated")}toggleTag(t){let e=this._activeTags.indexOf(t);e>=0?this._activeTags.splice(e,1):this._activeTags.push(t),this.trigger("conversations-updated")}clearTags(){this._activeTags=[],this.trigger("conversations-updated")}setSearch(t){this._searchQuery=t,this.trigger("conversations-updated")}toggleFavorite(t){let e=this.tagData.favorites.indexOf(t);e>=0?this.tagData.favorites.splice(e,1):this.tagData.favorites.push(t),this.saveTagData();let s=this.items.find(i=>i.uuid===t);s&&(s.isFavorite=!s.isFavorite),this.trigger("conversations-updated")}addCustomTag(t,e){this.tagData.customTags[t]||(this.tagData.customTags[t]=[]);let s=this.tagData.customTags[t];s.includes(e)||s.push(e),this.saveTagData();let i=this.items.find(a=>a.uuid===t);i&&!i.customTags.includes(e)&&i.customTags.push(e),this.trigger("conversations-updated")}removeCustomTag(t,e){this.tagData.customTags[t]&&(this.tagData.customTags[t]=this.tagData.customTags[t].filter(i=>i!==e)),this.saveTagData();let s=this.items.find(i=>i.uuid===t);s&&(s.customTags=s.customTags.filter(i=>i!==e)),this.trigger("conversations-updated")}getItem(t){return this.items.find(e=>e.uuid===t)}};var J=require("obsidian");function ki(n){return n.replace(/<[^>]+>/g,"").replace(/\[Image #?\d*\]/gi,"").replace(/\s+/g," ").trim()||"(untitled)"}function yi(n){if(!n)return"";let t=Date.now()-new Date(n).getTime(),e=Math.floor(t/6e4);if(e<60)return`${e}m ago`;let s=Math.floor(e/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 wi(n){return n?new Date(n).toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"}):""}var Ot=class{containerEl;store;onSelect;selectedUuid=null;inputEl=null;toolbarEl=null;listEl=null;constructor(t,e,s){this.containerEl=t,this.store=e,this.onSelect=s}setSelected(t){this.selectedUuid=t}render(){this.inputEl||(this.containerEl.empty(),this.containerEl.addClass("as-list"),this.searchRowEl=this.containerEl.createDiv("as-search"),this.inputEl=this.searchRowEl.createEl("input",{type:"text",placeholder:"Search conversations...",cls:"as-search-input"}),this.inputEl.addEventListener("input",()=>{this.store.setSearch(this.inputEl.value)}),this.toolbarEl=this.containerEl.createDiv("as-conv-toolbar"),this.listEl=this.containerEl.createDiv("as-list-items as-conv-list")),this.inputEl.value=this.store.searchQuery,this.renderSearchActions(),this.renderTagStrip(),this.renderList()}searchRowEl=null;searchActionsEl=null;outsideClickCleanup=null;dateDropdownEl=null;tagDropdownEl=null;openDropdown=null;closeAllDropdowns(){this.openDropdown=null,this.dateDropdownEl?.removeClass("is-open"),this.tagDropdownEl?.removeClass("is-open"),this.outsideClickCleanup&&(this.outsideClickCleanup(),this.outsideClickCleanup=null)}toggleDropdown(t,e){if(this.openDropdown===t){this.closeAllDropdowns();return}this.closeAllDropdowns(),this.openDropdown=t,(t==="date"?this.dateDropdownEl:this.tagDropdownEl)?.addClass("is-open");let i=a=>{e.contains(a.target)||this.closeAllDropdowns()};setTimeout(()=>document.addEventListener("click",i),0),this.outsideClickCleanup=()=>document.removeEventListener("click",i)}renderSearchActions(){if(!this.searchRowEl)return;this.searchActionsEl&&this.searchActionsEl.remove(),this.searchActionsEl=this.searchRowEl.createDiv("as-conv-search-actions");let t=this.searchActionsEl.createDiv("as-conv-dropdown-wrap"),e=t.createEl("button",{cls:"as-conv-icon-btn"}),s=e.createSpan("as-conv-icon-btn-icon");(0,J.setIcon)(s,"calendar"),this.dateDropdownEl=t.createDiv("as-conv-dropdown"),this.openDropdown==="date"&&this.dateDropdownEl.addClass("is-open");let i=[{label:"Today",value:"today"},{label:"Last 7 days",value:"7d"},{label:"Last 30 days",value:"30d"},{label:"Last 90 days",value:"90d"},{label:"Last 6 months",value:"180d"},{label:"All time",value:"all"}];for(let k of i){let C=this.store.dateRange===k.value,M=this.dateDropdownEl.createDiv(`as-conv-dropdown-item ${C?"is-active":""}`),V=M.createSpan("as-conv-dropdown-check");C&&(0,J.setIcon)(V,"check"),M.createSpan({cls:"as-conv-dropdown-item-label",text:k.label}),M.addEventListener("click",Z=>{Z.stopPropagation(),this.store.setDateRange(k.value),this.closeAllDropdowns()})}e.addEventListener("click",k=>{k.stopPropagation(),this.toggleDropdown("date",t)});let a=this.store.getAllTags(),r=this.store.activeTags,l=a.size>0,o=this.searchActionsEl.createDiv("as-conv-dropdown-wrap"),c=o.createEl("button",{cls:"as-conv-icon-btn"});l||c.addClass("is-disabled"),r.length>0&&c.addClass("has-active");let d=c.createSpan("as-conv-icon-btn-icon");if((0,J.setIcon)(d,"tag"),this.tagDropdownEl=o.createDiv("as-conv-dropdown"),this.openDropdown==="tag"&&this.tagDropdownEl.addClass("is-open"),l){if(r.length>0){let C=this.tagDropdownEl.createDiv("as-conv-dropdown-item as-conv-dropdown-clear"),M=C.createSpan("as-conv-dropdown-item-icon");(0,J.setIcon)(M,"x"),C.createSpan({text:"Clear filters"}),C.addEventListener("click",V=>{V.stopPropagation(),this.store.clearTags()})}let k=Array.from(a.entries()).sort((C,M)=>M[1]-C[1]).slice(0,25);for(let[C,M]of k){let V=r.includes(C),Z=this.tagDropdownEl.createDiv(`as-conv-dropdown-item ${V?"is-active":""}`),Ss=Z.createSpan("as-conv-dropdown-check");V&&(0,J.setIcon)(Ss,"check"),Z.createSpan({cls:"as-conv-dropdown-item-label",text:C}),Z.createSpan({cls:"as-conv-dropdown-item-count",text:String(M)}),Z.addEventListener("click",ks=>{ks.stopPropagation(),this.store.toggleTag(C)})}}c.addEventListener("click",k=>{k.stopPropagation(),l&&this.toggleDropdown("tag",o)});let p=this.store.sort==="date"?"messages":"date",h=this.searchActionsEl.createEl("button",{cls:"as-conv-icon-btn"}),m=h.createSpan("as-conv-icon-btn-icon");(0,J.setIcon)(m,this.store.sort==="date"?"clock":"hash"),h.setAttribute("aria-label",`Sort by ${p}`),h.addEventListener("click",()=>this.store.setSort(p))}renderTagStrip(){if(!this.toolbarEl)return;this.toolbarEl.empty();let t=this.store.activeTags,e=this.store.filteredItems.length;if(t.length===0&&e===this.store.allItems.length)return;let s=this.toolbarEl.createDiv("as-conv-tag-strip");s.createSpan({cls:"as-conv-result-count",text:`${e} results`});for(let i of t){let a=s.createEl("button",{cls:"as-conv-tag-pill is-active"});a.createSpan({text:i});let r=a.createSpan("as-conv-tag-pill-x");(0,J.setIcon)(r,"x"),a.addEventListener("click",()=>this.store.toggleTag(i))}if(t.length>0){let i=s.createEl("button",{cls:"as-conv-tag-pill as-conv-tag-clear"});i.createSpan({text:"Clear all"}),i.addEventListener("click",()=>this.store.clearTags())}}renderList(){if(!this.listEl)return;if(this.listEl.empty(),this.store.loading){this.listEl.createDiv({cls:"as-list-empty",text:"Loading conversations..."});return}let t=this.store.filteredItems;if(t.length===0){this.listEl.createDiv({cls:"as-list-empty",text:"No conversations found"});return}let e="";for(let s of t){let i=wi(s.lastTimestamp);i!==e&&(e=i,this.listEl.createDiv({cls:"as-conv-date-header",text:i})),this.renderCard(this.listEl,s)}}renderCard(t,e){let s=t.createDiv("as-skill-card");e.uuid===this.selectedUuid&&s.addClass("is-selected");let i=s.createDiv("as-skill-header"),a=ki(e.title),r=a.length>60?a.slice(0,60)+"...":a;if(i.createSpan({cls:"as-skill-name",text:r}),e.isFavorite){let c=i.createSpan("as-skill-star");(0,J.setIcon)(c,"star")}let l=[e.project,yi(e.lastTimestamp),`${e.messageCount} msgs`].filter(Boolean).join(" \xB7 ");s.createDiv({cls:"as-skill-desc",text:l});let o=[...e.tags,...e.customTags].filter(c=>c!==e.project);if(o.length>0){let c=s.createDiv("as-skill-meta"),d=3;for(let p of o.slice(0,d)){let h=e.customTags.includes(p);c.createSpan({cls:`as-conv-tag ${h?"as-conv-tag-custom":""}`,text:p})}o.length>d&&c.createSpan({cls:"as-conv-tag as-conv-tag-more",text:`+${o.length-d}`})}s.addEventListener("click",()=>{this.selectedUuid=e.uuid,this.onSelect(e)})}};var D=require("obsidian"),ut=require("fs"),ft=require("path");function fe(n){return n?new Date(n).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function Di(n){return n.replace(/[<>:"/\\|?*]/g,"").replace(/\.{2,}/g,"").replace(/\s+/g,"-").slice(0,80)}function us(n,t){let e=n.firstTimestamp?new Date(n.firstTimestamp).toISOString().slice(0,10):"unknown-date",s=Di(n.title.slice(0,60));return`${t}/Claude Sessions/${e}-${s}.md`}function hs(n){let{selectedMessages:t,conversation:e}=n,s=[...e.tags,...e.customTags],i=s.map(r=>`"${r}"`).join(", "),a=[];if(a.push("---"),a.push(`tags: [claude-session, ${i}]`),a.push(`session: ${e.uuid}`),a.push(`project: ${e.project}`),a.push(`date: ${e.firstTimestamp?new Date(e.firstTimestamp).toISOString().slice(0,10):"unknown"}`),a.push(`messages: ${e.messageCount}`),a.push("---"),a.push(""),a.push(`# ${e.title.slice(0,100)}`),a.push(""),a.push("## Context"),a.push(`- **Project:** ${e.project}`),a.push(`- **Started:** ${fe(e.firstTimestamp)}`),a.push(`- **Last activity:** ${fe(e.lastTimestamp)}`),a.push(`- **Messages:** ${e.messageCount}`),s.length>0&&a.push(`- **Tags:** ${s.map(r=>`\`${r}\``).join(" ")}`),a.push(""),t.length>0){a.push("## Key Snippets"),a.push("");for(let r of t){let l=r.role==="human"?"You":"Claude",o=fe(r.timestamp);a.push(`### ${l} ${o?`(${o})`:""}`),a.push(""),r.role==="human"?a.push(`> ${r.text.replace(/\n/g,` +var Jt=Object.defineProperty;var ws=Object.getOwnPropertyDescriptor;var Ds=Object.getOwnPropertyNames;var Cs=Object.prototype.hasOwnProperty;var Es=(n,t)=>{for(var e in t)Jt(n,e,{get:t[e],enumerable:!0})},xs=(n,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Ds(t))!Cs.call(n,i)&&i!==e&&Jt(n,i,{get:()=>t[i],enumerable:!(s=ws(t,i))||s.enumerable});return n};var Ts=n=>xs(Jt({},"__esModule",{value:!0}),n);var Ti={};Es(Ti,{default:()=>Gt});module.exports=Ts(Ti);var Ss=require("obsidian");var gs=require("obsidian");var I=require("obsidian"),ye=require("electron");var St=require("os"),w=require("fs"),u=require("path"),v=(0,St.homedir)(),nt=(0,St.platform)()==="win32",it=process.env.XDG_CONFIG_HOME||(nt?(0,u.join)(v,".config"):(0,u.join)(v,".config")),Zt=new Map;function ke(){Zt.clear()}function j(n,t){let e=Zt.get(n);if(e!==void 0)return e;let s=t();return Zt.set(n,s),s}function mt(n){if(nt){let t=process.env.ProgramFiles||"C:\\Program Files",e=process.env.LOCALAPPDATA||(0,u.join)(v,"AppData","Local");return(0,w.existsSync)((0,u.join)(t,n))||(0,w.existsSync)((0,u.join)(e,"Programs",n))}return(0,w.existsSync)(`/Applications/${n}.app`)||(0,w.existsSync)((0,u.join)(v,"Applications",`${n}.app`))}function q(n){let t=nt?[`${n}.cmd`,`${n}.exe`,n]:[n],e=[];if(nt){let i=process.env.APPDATA||(0,u.join)(v,"AppData","Roaming");e.push((0,u.join)(i,"npm"),(0,u.join)(v,".bun","bin"),(0,u.join)(v,"AppData","Local","npm"))}else e.push("/usr/local/bin","/opt/homebrew/bin",(0,u.join)(v,".local","bin"));for(let i of e)for(let a of t)if((0,w.existsSync)((0,u.join)(i,a)))return!0;let s=nt?(0,u.join)(v,"AppData","Roaming","nvm"):(0,u.join)(v,".nvm","versions","node");try{for(let i of(0,w.readdirSync)(s)){let a=nt?(0,u.join)(s,i):(0,u.join)(s,i,"bin");for(let r of t)if((0,w.existsSync)((0,u.join)(a,r)))return!0}}catch{}return!1}var T=[{id:"claude-code",name:"Claude Code",color:"#f97316",icon:"brain",paths:[{baseDir:(0,u.join)(v,".claude","skills"),type:"skill",pattern:"directory-with-skillmd"},{baseDir:(0,u.join)(v,".claude","commands"),type:"command",pattern:"flat-md"}],agentPaths:[{baseDir:(0,u.join)(v,".claude","agents"),type:"agent",pattern:"flat-md"}],isInstalled:()=>j("claude-code",()=>(0,w.existsSync)((0,u.join)(v,".claude","settings.json"))||(0,w.existsSync)((0,u.join)(v,".claude","CLAUDE.md"))||q("claude"))},{id:"cursor",name:"Cursor",color:"#3b82f6",icon:"mouse-pointer",paths:[{baseDir:(0,u.join)(v,".cursor","skills"),type:"skill",pattern:"directory-with-skillmd"},{baseDir:(0,u.join)(v,".cursor","rules"),type:"rule",pattern:"flat-md"}],agentPaths:[{baseDir:(0,u.join)(v,".cursor","agents"),type:"agent",pattern:"flat-md"}],isInstalled:()=>j("cursor",()=>mt("Cursor")||(0,w.existsSync)((0,u.join)(v,".cursor","argv.json")))},{id:"windsurf",name:"Windsurf",color:"#14b8a6",icon:"wind",paths:[{baseDir:(0,u.join)(v,".codeium","windsurf","memories"),type:"memory",pattern:"flat-md"},{baseDir:(0,u.join)(v,".windsurf","rules"),type:"rule",pattern:"flat-md"}],agentPaths:[],isInstalled:()=>j("windsurf",()=>mt("Windsurf")||(0,w.existsSync)((0,u.join)(v,".codeium","windsurf","argv.json")))},{id:"codex",name:"Codex",color:"#22c55e",icon:"book",paths:[{baseDir:(0,u.join)(v,".codex","skills"),type:"skill",pattern:"directory-with-skillmd"},{baseDir:(0,u.join)(v,".codex","prompts"),type:"command",pattern:"flat-md"},{baseDir:(0,u.join)(v,".codex","memories"),type:"memory",pattern:"flat-md"}],agentPaths:[{baseDir:(0,u.join)(v,".codex","agents"),type:"agent",pattern:"flat-md"}],isInstalled:()=>j("codex",()=>(0,w.existsSync)((0,u.join)(v,".codex","config.toml"))||(0,w.existsSync)((0,u.join)(v,".codex","auth.json"))||q("codex"))},{id:"copilot",name:"Copilot",color:"#a855f7",icon:"plane",paths:[{baseDir:(0,u.join)(v,".copilot","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>j("copilot",()=>(0,w.existsSync)((0,u.join)(v,".copilot"))||q("copilot"))},{id:"amp",name:"Amp",color:"#ec4899",icon:"zap",paths:[{baseDir:(0,u.join)(it,"amp","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>j("amp",()=>(0,w.existsSync)((0,u.join)(it,"amp","config.json"))||(0,w.existsSync)((0,u.join)(it,"amp","settings.json"))||q("amp"))},{id:"opencode",name:"OpenCode",color:"#ef4444",icon:"terminal",paths:[{baseDir:(0,u.join)(it,"opencode","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>j("opencode",()=>mt("OpenCode")||(0,w.existsSync)((0,u.join)(it,"opencode","opencode.json"))||(0,w.existsSync)((0,u.join)(it,"opencode","opencode.jsonc"))||q("opencode"))},{id:"pi",name:"Pi",color:"#06b6d4",icon:"sparkles",paths:[{baseDir:(0,u.join)(v,".pi","agent","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>j("pi",()=>q("pi"))},{id:"antigravity",name:"Antigravity",color:"#ef4444",icon:"arrow-up-circle",paths:[{baseDir:(0,u.join)(v,".gemini","antigravity","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>j("antigravity",()=>mt("Antigravity")||(0,w.existsSync)((0,u.join)(v,".gemini","antigravity","skills"))||q("antigravity"))},{id:"claude-desktop",name:"Claude Desktop",color:"#f97316",icon:"monitor",paths:[],agentPaths:[],isInstalled:()=>j("claude-desktop",()=>mt("Claude"))},{id:"global-agents",name:"Global",color:"#a3e635",icon:"globe",paths:[{baseDir:(0,u.join)(v,".agents","skills"),type:"skill",pattern:"directory-with-skillmd"}],agentPaths:[],isInstalled:()=>j("global-agents",()=>(0,w.existsSync)((0,u.join)(v,".agents","skills")))},{id:"aider",name:"Aider",color:"#eab308",icon:"wrench",paths:[],agentPaths:[],isInstalled:()=>j("aider",()=>q("aider"))}];var L={"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:''},amp:{viewBox:"0 0 21 21",paths:''},antigravity:{viewBox:"0 0 112 96",paths:''}};function F(n,t,e=16){let s=L[t];if(!s)return;let i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.setAttribute("viewBox",s.viewBox),i.setAttribute("width",String(e)),i.setAttribute("height",String(e)),i.setAttribute("fill","none"),i.classList.add("as-tool-svg"),i.innerHTML=s.paths,n.appendChild(i)}var kt=class{containerEl;store;onToggleDashboard;onToggleMarketplace;onCreateSkill;onToggleConversations;conversationStore;dashboardActive=!1;marketplaceActive=!1;conversationsActive=!1;constructor(t,e,s,i,a,r,l){this.containerEl=t,this.store=e,this.onToggleDashboard=s,this.onToggleMarketplace=i,this.onCreateSkill=a,this.onToggleConversations=r||(()=>{}),this.conversationStore=l||null}setDashboardActive(t){this.dashboardActive=t}setMarketplaceActive(t){this.marketplaceActive=t}setConversationsActive(t){this.conversationsActive=t}render(){this.containerEl.empty(),this.containerEl.addClass("as-sidebar"),this.renderLibrarySection(),this.conversationsActive&&this.conversationStore?this.renderConversationFilters():(this.renderTypeSection(),this.renderToolSection(),this.renderProjectSection(),this.renderCollectionSection(),this.store.hasSkillkit||this.renderSkillkitCta())}renderSection(t,e){let s=this.containerEl.createDiv("as-sidebar-section");s.createDiv({cls:"as-sidebar-title",text:t});for(let i of e){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,I.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 t=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=>t.has(i.type)).map(i=>({label:i.label,icon:i.icon,filter:{kind:"type",type:i.type},count:t.get(i.type)||0}));s.length>0&&this.renderSection("Types",s)}renderToolSection(){let t=this.store.getToolCounts(),e=T.filter(i=>i.isInstalled()&&t.has(i.id));if(e.length===0)return;let s=this.containerEl.createDiv("as-sidebar-section");s.createDiv({cls:"as-sidebar-title",text:"Tools"});for(let i of e){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");L[i.id]?F(l,i.id,14):(0,I.setIcon)(l,i.icon),r.createSpan({cls:"as-sidebar-label",text:i.name}),r.createSpan({cls:"as-sidebar-count",text:String(t.get(i.id)||0)}),r.addEventListener("click",()=>{this.dashboardActive&&this.onToggleDashboard(),this.store.setFilter(a)})}}renderProjectSection(){let t=this.store.getProjectCounts();if(t.size===0)return;let e=[];for(let[s,i]of t)e.push({label:s,icon:"folder-git-2",filter:{kind:"project",project:s},count:i});e.sort((s,i)=>s.label.localeCompare(i.label)),this.renderSection("Projects",e)}renderCollectionSection(){let t=this.containerEl.createDiv("as-sidebar-section");t.createDiv({cls:"as-sidebar-title",text:"Collections"});let e=new Set;for(let s of this.store.allItems)for(let i of s.collections)e.add(i);if(e.size===0){t.createDiv({cls:"as-sidebar-empty",text:"No collections yet"});return}for(let s of e){let i={kind:"collection",name:s},a=t.createDiv("as-sidebar-item");!this.dashboardActive&&this.isActive(i)&&a.addClass("is-active");let r=a.createSpan("as-sidebar-icon");(0,I.setIcon)(r,"folder"),a.createSpan({cls:"as-sidebar-label",text:s}),a.addEventListener("click",()=>{this.dashboardActive&&this.onToggleDashboard(),this.store.setFilter(i)})}}renderLibrarySection(){let t=this.containerEl.createDiv("as-sidebar-section");t.createDiv({cls:"as-sidebar-title",text:"Library"});let e=[{label:"All Skills",icon:"layers",filter:{kind:"all"}},{label:"Favorites",icon:"star",filter:{kind:"favorites"}}],s=this.dashboardActive||this.marketplaceActive||this.conversationsActive;for(let m of e){let g=t.createDiv("as-sidebar-item");!s&&this.isActive(m.filter)&&g.addClass("is-active");let y=g.createSpan("as-sidebar-icon");(0,I.setIcon)(y,m.icon),g.createSpan({cls:"as-sidebar-label",text:m.label}),g.addEventListener("click",()=>{this.dashboardActive&&this.onToggleDashboard(),this.marketplaceActive&&this.onToggleMarketplace(),this.conversationsActive&&this.onToggleConversations(),this.store.setFilter(m.filter)})}let i=t.createDiv("as-sidebar-item");this.dashboardActive&&i.addClass("is-active");let a=i.createSpan("as-sidebar-icon");(0,I.setIcon)(a,"bar-chart-2"),i.createSpan({cls:"as-sidebar-label",text:"Dashboard"}),i.addEventListener("click",()=>{this.marketplaceActive&&this.onToggleMarketplace(),this.conversationsActive&&this.onToggleConversations(),this.dashboardActive||this.onToggleDashboard()});let r=t.createDiv("as-sidebar-item");this.marketplaceActive&&r.addClass("is-active");let l=r.createSpan("as-sidebar-icon");(0,I.setIcon)(l,"shopping-bag"),r.createSpan({cls:"as-sidebar-label",text:"Marketplace"}),r.addEventListener("click",()=>{this.dashboardActive&&this.onToggleDashboard(),this.conversationsActive&&this.onToggleConversations(),this.marketplaceActive||this.onToggleMarketplace()});let o=t.createDiv("as-sidebar-item");this.conversationsActive&&o.addClass("is-active");let c=o.createSpan("as-sidebar-icon");(0,I.setIcon)(c,"message-circle"),o.createSpan({cls:"as-sidebar-label",text:"Conversations"}),o.addEventListener("click",()=>{this.dashboardActive&&this.onToggleDashboard(),this.marketplaceActive&&this.onToggleMarketplace(),this.conversationsActive||this.onToggleConversations()});let d=t.createDiv("as-sidebar-item as-sidebar-create"),p=d.createSpan("as-sidebar-icon");(0,I.setIcon)(p,"plus"),d.createSpan({cls:"as-sidebar-label",text:"Create"}),d.addEventListener("click",()=>this.onCreateSkill())}renderSkillkitCta(){let t=this.containerEl.createDiv("as-skillkit-cta"),e=t.createDiv("as-skillkit-icon");(0,I.setIcon)(e,"bar-chart-2"),t.createDiv({cls:"as-skillkit-title",text:"Unlock analytics"}),t.createDiv({cls:"as-skillkit-desc",text:"Install skillkit to see usage stats, stale badges, and heavy skill warnings."}),t.createDiv("as-skillkit-cmd").createEl("code",{text:"npm i -g @crafter/skillkit"}),t.createEl("a",{cls:"as-skillkit-link",text:"Learn more",href:"https://www.npmjs.com/package/@crafter/skillkit"}).addEventListener("click",a=>{a.preventDefault(),ye.shell.openExternal("https://www.npmjs.com/package/@crafter/skillkit")})}renderConversationFilters(){if(!this.conversationStore)return;let t=this.conversationStore.getProjectCounts();if(t.size>0){let e=this.containerEl.createDiv("as-sidebar-section");e.createDiv({cls:"as-sidebar-title",text:"Projects"});let s=e.createDiv("as-sidebar-item"),i=this.conversationStore.filter;i.kind==="all-conversations"&&s.addClass("is-active");let a=s.createSpan("as-sidebar-icon");(0,I.setIcon)(a,"layers"),s.createSpan({cls:"as-sidebar-label",text:"All"}),s.createSpan({cls:"as-sidebar-count",text:String(this.conversationStore.allItems.length)}),s.addEventListener("click",()=>{this.conversationStore.setFilter({kind:"all-conversations"})});let r=e.createDiv("as-sidebar-item");i.kind==="conversation-favorites"&&r.addClass("is-active");let l=r.createSpan("as-sidebar-icon");(0,I.setIcon)(l,"star"),r.createSpan({cls:"as-sidebar-label",text:"Favorites"}),r.addEventListener("click",()=>{this.conversationStore.setFilter({kind:"conversation-favorites"})});for(let[o,c]of Array.from(t.entries()).sort((d,p)=>p[1]-d[1])){let d=e.createDiv("as-sidebar-item");i.kind==="conversation-project"&&i.project===o&&d.addClass("is-active");let p=d.createSpan("as-sidebar-icon");(0,I.setIcon)(p,"folder-git-2"),d.createSpan({cls:"as-sidebar-label",text:o}),d.createSpan({cls:"as-sidebar-count",text:String(c)}),d.addEventListener("click",()=>{this.conversationStore.setFilter({kind:"conversation-project",project:o})})}}}isActive(t){let e=this.store.filter;return e.kind!==t.kind?!1:e.kind==="tool"&&t.kind==="tool"?e.toolId===t.toolId:e.kind==="type"&&t.kind==="type"?e.type===t.type:e.kind==="collection"&&t.kind==="collection"?e.name===t.name:e.kind==="project"&&t.kind==="project"?e.project===t.project:!0}};var K=require("obsidian"),we=require("electron");var yt=class{containerEl;store;onSelect;selectedId=null;inputEl=null;listEl=null;typeFilter=null;sortBy="name";openDropdown=null;menuDropdownEl=null;outsideClickCleanup=null;constructor(t,e,s){this.containerEl=t,this.store=e,this.onSelect=s}setSelected(t){this.selectedId=t}render(){if(!this.inputEl){this.containerEl.empty(),this.containerEl.addClass("as-list");let t=this.containerEl.createDiv("as-search");this.inputEl=t.createEl("input",{type:"text",placeholder:"Search skills...",cls:"as-search-input"}),this.inputEl.addEventListener("input",()=>{this.store.setSearch(this.inputEl.value)});let e=t.createDiv("as-conv-search-actions"),s=e.createEl("button",{cls:"as-conv-icon-btn"}),i=s.createSpan("as-conv-icon-btn-icon");(0,K.setIcon)(i,"file-search"),s.setAttribute("aria-label","Search file content"),this.store.deepSearch&&s.addClass("has-active"),s.addEventListener("click",()=>{this.store.setDeepSearch(!this.store.deepSearch),s.toggleClass("has-active",this.store.deepSearch)});let a=e.createDiv("as-conv-dropdown-wrap"),r=a.createEl("button",{cls:"as-conv-icon-btn"}),l=r.createSpan("as-conv-icon-btn-icon");(0,K.setIcon)(l,"sliders-horizontal"),r.setAttribute("aria-label","Filter & sort"),(this.typeFilter||this.sortBy!=="name")&&r.addClass("has-active"),this.menuDropdownEl=a.createDiv("as-conv-dropdown as-conv-dropdown-wide"),this.renderMenuDropdown(),r.addEventListener("click",o=>{if(o.stopPropagation(),this.openDropdown==="menu")this.closeDropdown();else{this.closeDropdown(),this.openDropdown="menu",this.menuDropdownEl?.addClass("is-open");let c=d=>{a.contains(d.target)||this.closeDropdown()};setTimeout(()=>document.addEventListener("click",c),0),this.outsideClickCleanup=()=>document.removeEventListener("click",c)}}),this.listEl=this.containerEl.createDiv("as-list-items")}this.inputEl.value=this.store.searchQuery,this.renderList()}closeDropdown(){this.openDropdown=null,this.menuDropdownEl?.removeClass("is-open"),this.outsideClickCleanup&&(this.outsideClickCleanup(),this.outsideClickCleanup=null)}renderMenuDropdown(){if(!this.menuDropdownEl)return;this.menuDropdownEl.empty(),this.menuDropdownEl.createDiv("as-conv-dropdown-header").setText("Sort");let e=[{label:"Name",value:"name",icon:"arrow-up-az"},{label:"Usage",value:"usage",icon:"trending-up"}];for(let a of e){let r=this.menuDropdownEl.createDiv(`as-conv-dropdown-item ${this.sortBy===a.value?"is-active":""}`),l=r.createSpan("as-conv-dropdown-check");this.sortBy===a.value&&(0,K.setIcon)(l,"check"),r.createSpan({cls:"as-conv-dropdown-item-label",text:a.label}),r.addEventListener("click",o=>{o.stopPropagation(),this.sortBy=a.value,this.updateMenuBtnState(),this.renderMenuDropdown(),this.renderList()})}this.menuDropdownEl.createDiv("as-conv-dropdown-header").setText("Filter");let i=[{id:null,label:"All"},{id:"stale",label:"Stale"},{id:"heavy",label:"Heavy"},{id:"oversized",label:"Oversized"},{id:"conflict",label:"Conflicts"}];for(let a of i){let r=this.typeFilter===a.id,l=this.menuDropdownEl.createDiv(`as-conv-dropdown-item ${r?"is-active":""}`),o=l.createSpan("as-conv-dropdown-check");r&&(0,K.setIcon)(o,"check"),l.createSpan({cls:"as-conv-dropdown-item-label",text:a.label}),l.addEventListener("click",c=>{c.stopPropagation(),this.typeFilter=a.id,this.updateMenuBtnState(),this.renderMenuDropdown(),this.renderList()})}}updateMenuBtnState(){let t=this.containerEl.querySelector(".as-conv-dropdown-wrap .as-conv-icon-btn");if(t){let e=this.typeFilter!==null||this.sortBy!=="name";t.toggleClass("has-active",e)}}renderList(){if(!this.listEl)return;this.listEl.empty();let t=this.store.filteredItems;if(this.typeFilter)switch(this.typeFilter){case"stale":t=t.filter(e=>e.usage?.isStale);break;case"heavy":t=t.filter(e=>e.usage?.isHeavy);break;case"oversized":t=t.filter(e=>e.warnings?.oversized);break;case"conflict":t=t.filter(e=>e.conflicts&&e.conflicts.length>0);break}if(this.sortBy==="usage"&&(t=[...t].sort((e,s)=>(s.usage?.uses??0)-(e.usage?.uses??0))),this.typeFilter){let e={stale:"Stale",heavy:"Heavy",oversized:"Oversized",conflict:"Conflict"},s=this.listEl.createDiv("as-active-filter");s.createSpan({text:`Showing: ${e[this.typeFilter]??this.typeFilter}`}),s.createSpan({cls:"as-filter-clear",text:"Clear"}).addEventListener("click",()=>{this.typeFilter=null,this.updateMenuBtn(),this.renderList()})}if(t.length===0){this.listEl.createDiv({cls:"as-list-empty",text:"No skills found"});return}for(let e of t)this.renderCard(this.listEl,e)}renderCard(t,e){let s=t.createDiv("as-skill-card");e.id===this.selectedId&&s.addClass("is-selected");let i=s.createDiv("as-skill-header");if(i.createSpan({cls:"as-skill-name",text:e.name}),e.isFavorite){let r=i.createSpan("as-skill-star");(0,K.setIcon)(r,"star")}e.description&&s.createDiv({cls:"as-skill-desc",text:e.description.length>80?e.description.slice(0,80)+"...":e.description});let a=s.createDiv("as-skill-meta");a.createSpan({cls:`as-type-tag as-type-${e.type}`,text:e.type});for(let r of e.tools){let l=T.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}),L[r]?F(o,r,12):o.addClass("as-tool-badge-dot")}e.usage&&(e.usage.uses>0&&a.createSpan({cls:"as-usage-badge",text:`${e.usage.uses}`,attr:{"aria-label":`Used ${e.usage.uses} times`}}),e.usage.isStale&&a.createSpan({cls:"as-badge-stale",text:"stale"}),e.usage.isHeavy&&a.createSpan({cls:"as-badge-heavy",text:"heavy"})),e.warnings?.oversized&&a.createSpan({cls:"as-badge-warn",text:"oversized"}),e.conflicts&&e.conflicts.length>0&&a.createSpan({cls:"as-badge-conflict",text:"conflict"}),s.addEventListener("click",()=>{this.selectedId=e.id,this.onSelect(e)}),s.addEventListener("contextmenu",r=>{r.preventDefault();let l=new K.Menu;l.addItem(o=>o.setTitle("Reveal in system explorer").setIcon("folder-open").onClick(()=>we.shell.showItemInFolder(e.filePath))),l.addItem(o=>o.setTitle("Copy file path").setIcon("copy").onClick(()=>navigator.clipboard.writeText(e.filePath))),l.showAtMouseEvent(r)})}};var x=require("obsidian"),_e=require("fs"),Ie=require("electron");var Y=require("child_process"),R=require("fs"),h=require("path"),wt=require("os"),Ls=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","WebSearch","WebFetch","TodoRead","TodoWrite","Task","Agent","Skill","LSP","NotebookEdit","AskFollowupQuestion","AttemptCompletion","SearchReplace","InsertCodeBlock","ReadImages","ExecuteCommand","ListFiles","SearchFiles","ReadFile","WriteFile","ReplaceInFile","ListCodeDefinitionNames","BrowserAction","UseMcp","shell","shell_command","update_plan","create_plan","read_file","write_file","execute_command","spawn_agent","write_stdin","multi_tool_use.parallel"]);function Ps(n){return!(Ls.has(n)||n.startsWith("mcp__")||n.startsWith("mcp_"))}var f=(0,wt.homedir)(),A=(0,wt.platform)()==="win32",As=(0,h.join)(f,".skillkit","analytics.db"),qt=A?["skillkit.cmd","skillkit.exe","skillkit"]:["skillkit"];function Dt(){let n=[];if(A){let e=process.env.APPDATA||(0,h.join)(f,"AppData","Roaming");n.push((0,h.join)(e,"npm"),(0,h.join)(f,".bun","bin"),(0,h.join)(f,"AppData","Local","npm"))}else n.push("/usr/local/bin","/opt/homebrew/bin",(0,h.join)(f,".local","bin"),(0,h.join)(f,".bun","bin"),(0,h.join)(f,".local","share","pnpm"),(0,h.join)(f,".volta","bin"),(0,h.join)(f,".yarn","bin"),(0,h.join)(f,".config","yarn","global","node_modules",".bin"),(0,h.join)(f,".fnm","aliases","default","bin"),(0,h.join)(f,".asdf","shims"),(0,h.join)(f,".proto","bin"));let t=A?(0,h.join)(f,"AppData","Roaming","nvm"):(0,h.join)(f,".nvm","versions","node");try{for(let e of(0,R.readdirSync)(t))n.push(A?(0,h.join)(t,e):(0,h.join)(t,e,"bin"))}catch{}if(!A){let e=(0,h.join)(f,".local","share","mise","installs");for(let s of["node","bun"])try{for(let i of(0,R.readdirSync)((0,h.join)(e,s)))n.push((0,h.join)(e,s,i,"bin"))}catch{}}return[...n,process.env.PATH||""].join(h.delimiter)}function De(n){try{return(0,Y.execSync)(`"${n}" help`,{encoding:"utf-8",timeout:5e3,env:{...process.env,NO_COLOR:"1",PATH:Dt()},stdio:["pipe","pipe","pipe"],shell:A?"cmd.exe":void 0}).includes("Analytics for AI agent skills")}catch{return!1}}function Ms(){let n=[],t=[];if(A){let s=process.env.APPDATA||(0,h.join)(f,"AppData","Roaming");t.push((0,h.join)(s,"npm"),(0,h.join)(f,".bun","bin"),(0,h.join)(f,"AppData","Local","npm"))}else t.push("/usr/local/bin","/opt/homebrew/bin",(0,h.join)(f,".local","bin"),(0,h.join)(f,".bun","bin"),(0,h.join)(f,".local","share","mise","shims"),(0,h.join)(f,".local","share","pnpm"),(0,h.join)(f,".volta","bin"),(0,h.join)(f,".yarn","bin"),(0,h.join)(f,".config","yarn","global","node_modules",".bin"),(0,h.join)(f,".fnm","aliases","default","bin"),(0,h.join)(f,".asdf","shims"),(0,h.join)(f,".proto","bin"));for(let s of t)for(let i of qt){let a=(0,h.join)(s,i);(0,R.existsSync)(a)&&n.push(a)}let e=A?(0,h.join)(f,"AppData","Roaming","nvm"):(0,h.join)(f,".nvm","versions","node");try{for(let s of(0,R.readdirSync)(e)){let i=A?(0,h.join)(e,s):(0,h.join)(e,s,"bin");for(let a of qt){let r=(0,h.join)(i,a);(0,R.existsSync)(r)&&n.push(r)}}}catch{}if(!A){let s=(0,h.join)(f,".local","share","mise","installs");for(let i of["node","bun"])try{for(let a of(0,R.readdirSync)((0,h.join)(s,i))){let r=(0,h.join)(s,i,a,"bin","skillkit");(0,R.existsSync)(r)&&n.push(r)}}catch{}}if(n.length===0&&!A){let s=[["pnpm","bin","-g"],["yarn","global","bin"],["npm","bin","-g"]];for(let i of s)try{let a=(0,Y.execSync)(i.join(" "),{encoding:"utf-8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim();if(a)for(let r of qt){let l=(0,h.join)(a,r);if((0,R.existsSync)(l)&&De(l))return l}}catch{}}for(let s of n)if(De(s))return s;return null}var Kt;function Ct(){return Kt===void 0&&(Kt=Ms()),Kt}function $(){return Ct()!==null||(0,R.existsSync)(As)}function at(n){let t=Ct();if(!t)return null;try{let e=(0,Y.execSync)(`${t} ${n} --json`,{encoding:"utf-8",timeout:15e3,env:{...process.env,NO_COLOR:"1",PATH:Dt()},stdio:["pipe","pipe","pipe"],shell:A?"cmd.exe":void 0}).trim();return Ce(e)}catch{return null}}function Ce(n){let t=n.indexOf("{"),e=n.indexOf("["),s=t===-1?e:e===-1?t:Math.min(t,e);return s===-1?null:JSON.parse(n.slice(s))}function Qt(n){let t=Ct();return t?new Promise(e=>{(0,Y.exec)(`${t} ${n} --json`,{encoding:"utf-8",timeout:15e3,env:{...process.env,NO_COLOR:"1",PATH:Dt()},shell:A?"cmd.exe":void 0},(s,i)=>{if(s){e(null);return}try{e(Ce(String(i).trim()))}catch{e(null)}})}):Promise.resolve(null)}function Ee(n){if(!$())return[];let t=at(`trace --list --skill ${n} --limit 5`);return Array.isArray(t)?t.map(e=>({traceId:e.trace_id,timestamp:e.timestamp,tokens:e.tokens_total,cost:e.cost_estimate,duration:e.duration_ms,model:e.model||"unknown"})):[]}async function xe(){let n=new Map;if(!$())return n;let t=await Qt("stats");if(!t?.top_skills)return n;let e=Date.now();for(let s of t.top_skills){if(!Ps(s.name))continue;let i=s.daily.length>0?s.daily[s.daily.length-1]?.date:null,a=null;i&&(a=Math.floor((e-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}async function Te(){let n=new Map;if(!$())return n;let t=await Qt("conflicts --dry-run");if(!t||!("pairs"in t))return n;for(let e of t.pairs)n.has(e.skill_a)||n.set(e.skill_a,[]),n.has(e.skill_b)||n.set(e.skill_b,[]),n.get(e.skill_a).push({skillName:e.skill_b,similarity:e.similarity}),n.get(e.skill_b).push({skillName:e.skill_a,similarity:e.similarity});return n}async function Le(){if(!$())return{oversized:[],longDesc:[]};let n=await Qt("health");return n?.warnings?{oversized:n.warnings.oversized||[],longDesc:n.warnings.long_descriptions||[]}:{oversized:[],longDesc:[]}}function rt(n){let t=Ct();if(!t)return{success:!1,output:"skillkit not found"};try{return{success:!0,output:(0,Y.execSync)(`${t} ${n}`,{encoding:"utf-8",timeout:3e4,env:{...process.env,NO_COLOR:"1",PATH:Dt()},stdio:["pipe","pipe","pipe"],shell:A?"cmd.exe":void 0}).trim()}}catch(e){return{success:!1,output:e instanceof Error?e.message:"unknown error"}}}function Xt(n){if(!n)return"never";let t=Date.now()-new Date(n).getTime(),e=Math.floor(t/6e4);if(e<60)return`${e}m ago`;let s=Math.floor(e/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 Pe(n,t,e=48,s=16){if(t.length===0)return;let i=Math.max(...t,1),a=t.map((o,c)=>{let d=c/(t.length-1||1)*e,p=s-o/i*s;return`${d.toFixed(1)},${p.toFixed(1)}`}),r=document.createElementNS("http://www.w3.org/2000/svg","svg");r.setAttribute("viewBox",`0 0 ${e} ${s}`),r.setAttribute("width",String(e)),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 Ae=require("obsidian");function tt(n,t,e,s){new Yt(n,t,e,s).open()}var Yt=class extends Ae.Modal{title;message;onConfirm;constructor(t,e,s,i){super(t),this.title=e,this.message=s,this.onConfirm=i}onOpen(){let{contentEl:t}=this;t.addClass("as-confirm-modal"),t.createEl("p",{cls:"as-confirm-title",text:this.title}),t.createEl("p",{cls:"as-confirm-message",text:this.message});let e=t.createDiv("as-confirm-buttons");e.createEl("button",{cls:"as-confirm-cancel",text:"Cancel"}).addEventListener("click",()=>this.close()),e.createEl("button",{cls:"as-confirm-action mod-warning",text:"Confirm"}).addEventListener("click",()=>{this.close(),this.onConfirm()})}onClose(){this.contentEl.empty()}};function _s(n){return Math.ceil(n.length/4)}function Is(n){return n<1024?`${n} B`:n<1024*1024?`${(n/1024).toFixed(1)} KB`:`${(n/(1024*1024)).toFixed(1)} MB`}function Me(n){return n>=1e3?`${(n/1e3).toFixed(1)}k`:String(n)}function $s(n){return new Date(n).toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}var js=new x.Component,Et=class{containerEl;store;settings;saveSettings;currentItem=null;isEditing=!1;app;constructor(t,e,s,i,a){this.containerEl=t,this.store=e,this.settings=s,this.saveSettings=i,this.app=a.app}show(t){this.currentItem=t,this.isEditing=!1,this.render()}clear(){this.currentItem=null,this.containerEl.empty(),this.containerEl.addClass("as-detail");let t=this.containerEl.createDiv("as-detail-empty");(0,x.setIcon)(t.createDiv("as-detail-empty-icon"),"file-text"),t.createDiv({text:"Select a skill to view"})}render(){this.containerEl.empty(),this.containerEl.addClass("as-detail");let t=this.currentItem;if(!t)return this.clear();this.renderToolbar(t),this.isEditing?this.renderEditor(t):this.renderPreview(t)}renderToolbar(t){let e=this.containerEl.createDiv("as-detail-toolbar"),s=e.createDiv("as-toolbar-top"),i=s.createDiv("as-toolbar-left");i.createSpan({cls:"as-detail-title",text:t.name});for(let m of t.tools){let g=T.find(E=>E.id===m);if(!g)continue;let y=i.createSpan("as-tool-name-badge");y.setCssProps({"--tool-color":g.color}),L[m]&&F(y,m,12),y.createSpan({text:g.name})}let a=s.createDiv("as-toolbar-right"),r=a.createEl("button",{cls:"as-toolbar-btn",attr:{"aria-label":"Toggle favorite"}});(0,x.setIcon)(r,t.isFavorite?"star":"star-off"),r.addEventListener("click",()=>{this.store.toggleFavorite(t.id,this.settings),this.saveSettings(),this.render()});let l=a.createEl("button",{cls:"as-toolbar-btn",attr:{"aria-label":this.isEditing?"Preview":"Edit"}});(0,x.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,x.setIcon)(o,"folder-open"),o.addEventListener("click",()=>{Ie.shell.showItemInFolder(t.filePath)}),$()){let m=a.createEl("button",{cls:"as-toolbar-btn as-toolbar-btn-danger",attr:{"aria-label":"Remove skill"}});(0,x.setIcon)(m,"trash-2"),m.addEventListener("click",()=>{tt(this.app,"Remove skill",`Remove "${t.name}"? This will delete the skill files.`,()=>{let g=rt(`prune --skill ${t.name} --yes`);g.success?(new x.Notice(`Removed ${t.name}`,5e3),this.store.refresh(this.settings),this.clear()):new x.Notice(`Failed to remove: ${g.output}`,5e3)})})}let c=e.createDiv("as-detail-meta-bar"),d=_s(t.content),p=t.content.length;if(c.createSpan({cls:"as-meta-item",text:Is(t.fileSize)}),c.createSpan({cls:"as-meta-item",text:`${Me(p)} chars`}),c.createSpan({cls:"as-meta-item",text:`~${Me(d)} tokens`}),c.createSpan({cls:"as-meta-item",text:$s(t.lastModified)}),c.createSpan({cls:"as-meta-item as-meta-type",text:t.type}),t.usage&&t.usage.uses>0){let m=e.createDiv("as-detail-usage-bar");m.createSpan({cls:"as-usage-stat",text:`${t.usage.uses} uses`}),m.createSpan({cls:"as-usage-stat",text:`last: ${Xt(t.usage.lastUsed)}`}),t.usage.isStale&&m.createSpan({cls:"as-badge-stale",text:"stale"}),t.usage.isHeavy&&m.createSpan({cls:"as-badge-heavy",text:"heavy"})}}renderFrontmatter(t,e){let s=Object.keys(e.frontmatter),i=t.createDiv("as-frontmatter");if(e.filePath){let a=i.createDiv("as-fm-prop");a.createSpan({cls:"as-fm-key",text:"path"}),a.createSpan({cls:"as-fm-value",text:e.filePath})}if(!(s.length===0&&!e.filePath))for(let a of s){let r=e.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(t){let e=this.containerEl.createDiv("as-detail-body");this.renderFrontmatter(e,t),this.renderWarnings(e,t),this.renderUsageSection(e,t),this.renderConflicts(e,t),this.renderTraces(e,t);let s=e.createDiv("as-detail-preview markdown-rendered");x.MarkdownRenderer.render(this.app,t.content,s,t.filePath,js)}renderWarnings(t,e){let s=[];if(e.warnings?.oversized&&s.push(`${e.warnings.lineCount} lines (recommended: <500)`),e.warnings?.longDesc&&s.push(`Description is ${e.warnings.descChars} chars (recommended: <1024)`),e.conflicts&&e.conflicts.length>0){let l=e.conflicts.map(o=>o.skillName).join(", ");s.push(`Conflicts with: ${l}`)}if(s.length===0)return;let i=t.createDiv("as-warnings"),a=i.createDiv("as-warnings-icon");(0,x.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(t,e){if(!e.usage||e.usage.uses===0)return;let s=t.createDiv("as-usage-section"),i=s.createDiv("as-usage-left");if(i.createSpan({cls:"as-usage-count",text:String(e.usage.uses)}),i.createSpan({cls:"as-usage-label",text:"uses"}),i.createSpan({cls:"as-usage-last",text:Xt(e.usage.lastUsed)}),e.usage.daily&&e.usage.daily.length>1){let a=s.createDiv("as-usage-spark");Pe(a,e.usage.daily.map(r=>r.count),80,20)}}renderConflicts(t,e){if(!e.conflicts||e.conflicts.length===0)return;let s=t.createDiv("as-conflicts-section");s.createDiv({cls:"as-section-title",text:`Conflicts (${e.conflicts.length})`});for(let i of e.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(t,e){if(!$())return;let s=Ee(e.name);if(s.length===0)return;let i=t.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 "+e.name})}renderPruneAction(t,e){let s=t.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",()=>{tt(this.app,"Remove skill",`Remove "${e.name}"? This will delete the skill files.`,()=>{let a=rt(`prune --skill ${e.name} --yes`);a.success?(new x.Notice(`Removed ${e.name}`,5e3),this.store.refresh(this.settings)):new x.Notice(`Failed to remove: ${a.output}`,5e3)})})}renderEditor(t){let e=this.containerEl.createDiv("as-detail-body as-detail-body-editor"),s=e.createEl("textarea",{cls:"as-editor-textarea"});s.value=t.content,s.spellcheck=!1,s.addEventListener("keydown",r=>{if((r.metaKey||r.ctrlKey)&&r.key==="s"&&(r.preventDefault(),this.saveFile(t,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=e.createDiv("as-save-bar");i.createEl("button",{cls:"as-save-btn",text:"Save"}).addEventListener("click",()=>{this.saveFile(t,s.value)}),i.createSpan({cls:"as-save-hint",text:"Cmd+S to save"})}saveFile(t,e){try{(0,_e.writeFileSync)(t.filePath,e,"utf-8"),t.content=e,new x.Notice(`Saved ${t.name}`,5e3)}catch(s){new x.Notice(`Failed to save: ${s instanceof Error?s.message:String(s)}`,5e3)}}};var W=require("obsidian"),Ve=require("electron");var te=require("child_process"),M=require("fs"),b=require("path"),xt=require("os"),gt=require("obsidian"),D=(0,xt.homedir)(),ot=(0,xt.platform)()==="win32",$e=(0,b.join)(D,".agents",".skill-lock.json"),Hs="https://skills.sh/api";async function ee(n){if(n.length<2)return[];try{let e=(await(0,gt.requestUrl)({url:`${Hs}/search?q=${encodeURIComponent(n)}&limit=30`})).json;if(!e.skills)return[];let s=Ne();return e.skills.map(i=>({...i,installed:s.has(i.name)}))}catch{return[]}}var je=new Map;async function Fs(n){let t=je.get(n);if(t)return t;let s=(await(0,gt.requestUrl)({url:`https://api.github.com/repos/${n}`})).json.default_branch||"main",a=(await(0,gt.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 je.set(n,r),r}function Rs(n,t,e){let s=t.split("/"),i=s[s.length-1]||n,a=new Set([i,n]);for(let r of e.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 Fe(n,t,e){try{let{branch:s,files:i}=await Fs(n),a=Rs(t,e,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 t.includes(d)||d.includes(t)}));let l=r||`skills/${t}/SKILL.md`;return(await(0,gt.requestUrl)({url:`https://raw.githubusercontent.com/${n}/${s}/${l}`})).text}catch{return null}}async function Re(){let n=["react","next","clerk","stripe","ai"],t=new Set,e=[];for(let s of n){let i=await ee(s);for(let a of i)t.has(a.id)||(t.add(a.id),e.push(a))}return e.sort((s,i)=>i.installs-s.installs).slice(0,20)}function Os(){let n=[];if(ot){let e=process.env.APPDATA||(0,b.join)(D,"AppData","Roaming");n.push((0,b.join)(e,"npm"),(0,b.join)(D,".bun","bin"),(0,b.join)(D,"AppData","Local","npm"))}else n.push("/usr/local/bin","/opt/homebrew/bin",(0,b.join)(D,".local","bin"),(0,b.join)(D,".bun","bin"));let t=ot?(0,b.join)(D,"AppData","Roaming","nvm"):(0,b.join)(D,".nvm","versions","node");try{for(let e of(0,M.readdirSync)(t))n.push(ot?(0,b.join)(t,e):(0,b.join)(t,e,"bin"))}catch{}return[...n,process.env.PATH||""].join(b.delimiter)}function He(){let n=ot?["bunx.cmd","bunx.exe","bunx"]:["bunx"],t=[];if(ot){let e=process.env.APPDATA||(0,b.join)(D,"AppData","Roaming");t.push((0,b.join)(D,".bun","bin"),(0,b.join)(e,"npm"))}else t.push((0,b.join)(D,".bun","bin"),"/usr/local/bin","/opt/homebrew/bin");for(let e of t)for(let s of n)if((0,M.existsSync)((0,b.join)(e,s)))return(0,b.join)(e,s);return"npx"}function se(n="auto"){return n==="npx"?"npx":He()}var Oe=[{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"}],Tt={"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 Ne(){let n=new Set;if(!(0,M.existsSync)($e))return n;try{let t=JSON.parse((0,M.readFileSync)($e,"utf-8"));if(t.skills)for(let e of Object.keys(t.skills))n.add(e)}catch{}return n}var Ns=[(0,b.join)(D,".claude","skills"),(0,b.join)(D,".cursor","skills"),(0,b.join)(D,".codex","skills"),(0,b.join)(D,".codeium","windsurf","skills"),(0,b.join)(D,".config","amp","skills"),(0,b.join)(D,".config","opencode","skills"),(0,b.join)(D,".copilot","skills"),(0,b.join)(D,".agents","skills")];function Bs(n){for(let t of Ns){let e=(0,b.join)(t,n);if((0,M.existsSync)(e))try{(0,M.rmSync)(e,{recursive:!0,force:!0})}catch{}}Ws(n)}function Ws(n){let t=(0,b.join)(D,".agents",".skill-lock.json");if((0,M.existsSync)(t))try{let e=JSON.parse((0,M.readFileSync)(t,"utf-8"));e.skills&&e.skills[n]&&(delete e.skills[n],(0,M.writeFileSync)(t,JSON.stringify(e,null,2)+` +`,"utf-8"))}catch{}}function Lt(n){let t=Ne();for(let e of n)e.installed=t.has(e.name);return n}function ie(n,t=12e4){return new Promise(e=>{(0,te.exec)(n,{encoding:"utf-8",timeout:t,env:{...process.env,PATH:Os(),NO_COLOR:"1"},shell:ot?"cmd.exe":void 0},(s,i)=>{let a=String(i??"");!s||a.includes("Done")||a.includes("Installed")||a.includes("Removed")||a.includes("Updated")?e({success:!0,output:a}):e({success:!1,output:s?.message??"Command failed"})})})}async function Be(n,t,e={}){let s=t.length>0?`-a ${t.join(" ")}`:"-a '*'",i=e.global?"-g":"",a=e.skillName?`-s ${e.skillName}`:"",l=`${se(e.runner||"auto")} skills add ${n} ${s} ${i} ${a} -y`.replace(/\s+/g," ").trim();return ie(l)}async function We(n,t="auto"){let s=`${se(t)} skills remove ${n} -y`,i=await ie(s,3e4);return Bs(n),{success:!0,output:i.output||`Cleaned ${n}`}}async function ze(n="auto"){let e=`${se(n)} skills update`,s=await ie(e),i=s.output.match(/Updated (\d+) skill/);return{...s,count:i?parseInt(i[1]):0}}function ne(n){return n>=1e6?`${(n/1e6).toFixed(1)}M`:n>=1e3?`${(n/1e3).toFixed(1)}K`:String(n)}var lt=require("fs"),Ge=require("path"),Je=require("os"),zs=new Set(["Read","Write","Edit","MultiEdit","Bash","Glob","Grep","WebSearch","WebFetch","TodoRead","TodoWrite","Task","Agent","Skill","LSP","NotebookEdit","AskFollowupQuestion","AttemptCompletion","SearchReplace","InsertCodeBlock","ReadImages","ExecuteCommand","ListFiles","SearchFiles","ReadFile","WriteFile","ReplaceInFile","ListCodeDefinitionNames","BrowserAction","UseMcp","shell","shell_command","update_plan","create_plan","read_file","write_file","execute_command","spawn_agent","write_stdin","multi_tool_use.parallel"]);function Ue(n){return!(zs.has(n)||n.startsWith("mcp__")||n.startsWith("mcp_"))}function Us(n){let t=n.top_skills.filter(s=>Ue(s.name)),e=n.top_skills.filter(s=>!Ue(s.name)).reduce((s,i)=>s+i.total,0);return{...n,top_skills:t,total_invocations:Math.max(0,n.total_invocations-e),unique_skills:t.length}}function Vs(){let n=at("stats"),t=at("health"),e=at("burn"),s=at("context");return{stats:n,health:t,burn:e&&e.length>0?e[0]:null,context:s}}var ae=(0,Ge.join)((0,Je.homedir)(),".skillkit","dashboard-cache.json"),z=null,Q=null;function Gs(){if(!z&&(0,lt.existsSync)(ae))try{let n=JSON.parse((0,lt.readFileSync)(ae,"utf-8"));z=n.data,Q=n.cachedAt}catch{}}function Js(){if(z)try{(0,lt.writeFileSync)(ae,JSON.stringify({data:z,cachedAt:Q},null,2),"utf-8")}catch{}}Gs();var Pt=class{containerEl;app;constructor(t,e){this.containerEl=t,this.app=e}render(){if(this.containerEl.empty(),this.containerEl.addClass("as-dashboard"),!$()){this.renderNoSkillkit();return}if(z)this.renderDashboard(z);else{let t=this.containerEl.createDiv("as-dash-loading");t.createDiv("as-dash-spinner"),t.createDiv({cls:"as-dash-loading-text",text:"Loading analytics..."}),setTimeout(()=>{let e=Vs();z=e,Q=Date.now(),Js(),t.remove(),this.renderDashboard(e)},10)}}renderDashboard(t){this.renderActionBar(t);let e=t.stats?Us(t.stats):null;if(e&&this.renderOverview(e,t.health),e&&this.renderTopSkills(e),t.health||t.context){let s=this.containerEl.createDiv("as-dash-row");t.health&&this.renderHealth(t.health,s),t.context&&this.renderContext(t.context,s)}t.burn&&this.renderBurn(t.burn),t.health&&this.renderStale(t.health)}renderActionBar(t){let e=this.containerEl.createDiv("as-dash-action-bar");if(Q){let r=Math.round((Date.now()-Q)/1e3),l=r<5?"just now":r<60?`${r}s ago`:`${Math.round(r/60)}m ago`;e.createSpan({cls:"as-dash-updated",text:`Updated ${l}`})}let s=e.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,ze().then(r=>{if(r.success){let l=r.count>0?`Updated ${r.count} skill(s)`:"All skills up to date";new W.Notice(l,5e3),z=null,Q=null,this.render()}else new W.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=rt("scan");r.success?(new W.Notice("Scan complete",5e3),z=null,Q=null,this.render()):new W.Notice(`Scan failed: ${r.output}`,5e3),a.setText("Scan sessions"),a.disabled=!1},10)}),t.health&&t.health.usage.unused_30d>0){let r=s.createEl("button",{cls:"as-action-btn as-action-btn-danger",text:`Prune ${t.health.usage.unused_30d} stale`});r.addEventListener("click",()=>{tt(this.app,"Prune stale skills",`Remove ${t.health.usage.unused_30d} unused skills? This cannot be undone.`,()=>{r.setText("Pruning..."),r.disabled=!0,setTimeout(()=>{let l=rt("prune --yes");l.success?(new W.Notice("Pruned stale skills",5e3),z=null,Q=null,this.render()):new W.Notice(`Prune failed: ${l.output}`,5e3),r.setText(`Prune ${t.health.usage.unused_30d} stale`),r.disabled=!1},10)})})}}renderNoSkillkit(){let t=this.containerEl.createDiv("as-dash-empty"),e=t.createDiv("as-dash-empty-icon");(0,W.setIcon)(e,"bar-chart-2"),t.createEl("h3",{text:"Dashboard requires skillkit"}),t.createEl("p",{text:"Install skillkit to unlock usage analytics, burn rate, context tax, and more."}),t.createDiv("as-dash-install-cmd").createEl("code",{text:"npm i -g @crafter/skillkit && skillkit scan"}),t.createEl("a",{cls:"as-skillkit-link",text:"Learn more",href:"https://www.npmjs.com/package/@crafter/skillkit"}).addEventListener("click",a=>{a.preventDefault(),Ve.shell.openExternal("https://www.npmjs.com/package/@crafter/skillkit")})}renderOverview(t,e){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(t.total_invocations),"invocations","activity"),this.statCard(i,String(t.unique_skills),"active skills","sparkles"),this.statCard(i,String(e?.installed??0),"installed","package"),this.statCard(i,String(e?.usage.unused_30d??0),"stale","alert-triangle"),t.streak&&t.streak.current>0){let a=s.createDiv("as-dash-streak-row");a.createSpan({cls:"as-streak-value",text:`${t.streak.current} day streak`}),t.streak.current>=7&&a.createSpan({cls:"as-streak-fire",text:"on fire"}),a.createSpan({cls:"as-streak-longest",text:`longest: ${t.streak.longest}d`})}if(t.velocity&&t.velocity.this_week>0){let a=s.createDiv("as-dash-velocity-row");a.createSpan({text:`This week: $${t.velocity.this_week.toFixed(0)}`}),a.createSpan({cls:"as-velocity-vs",text:`vs $${t.velocity.last_week.toFixed(0)} last week`});let r=t.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(t,e,s,i){let a=t.createDiv("as-stat-card"),r=a.createDiv("as-stat-icon");(0,W.setIcon)(r,i),a.createDiv({cls:"as-stat-value",text:e}),a.createDiv({cls:"as-stat-label",text:s})}renderTopSkills(t){if(t.top_skills.length===0)return;let e=this.containerEl.createDiv("as-dash-section");e.createDiv({cls:"as-dash-title",text:`Top Skills (${t.period.days}d)`});let s=t.top_skills[0]?.total||1,i=e.createDiv("as-dash-bars");for(let a of t.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(t,e){let s=(e||this.containerEl).createDiv("as-dash-section");s.createDiv({cls:"as-dash-title",text:"Health"});let i=t.usage.used_30d+t.usage.unused_30d,a=i>0?Math.round(t.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:`${t.usage.used_30d} used in 30d`}),o.createDiv({cls:"as-health-line as-health-warn",text:`${t.usage.unused_30d} never triggered`});let d=o.createDiv("as-budget-bar").createDiv("as-budget-fill");d.setCssProps({"--bar-w":`${t.metadata.pct}%`}),t.metadata.pct>80&&d.addClass("as-budget-over"),o.createDiv({cls:"as-health-line",text:`Metadata budget: ${t.metadata.pct}%`})}renderBurn(t){let e=this.containerEl.createDiv("as-dash-section");e.createDiv({cls:"as-dash-title",text:`Burn Rate \u2014 ${t.agent} (${t.period.days}d)`});let s=e.createDiv("as-dash-stats as-dash-stats-sm");if(this.statCard(s,`$${Math.round(t.cost.total).toLocaleString()}`,"total cost","flame"),this.statCard(s,`$${Math.round(t.cost.total/(t.period.days||1)).toLocaleString()}`,"daily avg","trending-up"),this.statCard(s,`${(t.period.sessions||0).toLocaleString()}`,"sessions","terminal"),this.statCard(s,`${((t.period.api_calls||0)/1e3).toFixed(0)}k`,"API calls","zap"),t.by_model&&t.by_model.length>0){let l=e.createDiv("as-model-breakdown");for(let o of t.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=t.by_day.slice(-14);if(i.length===0)return;let a=Math.max(...i.map(l=>l.costUsd),1),r=e.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(t,e){let s=(e||this.containerEl).createDiv("as-dash-section");s.createDiv({cls:"as-dash-title",text:"Context Tax"});let i=t.always_loaded.total_tokens,a=[{label:"CLAUDE.md",tokens:t.always_loaded.claude_md_tokens,cls:"as-ctx-claude"},{label:"Skills metadata",tokens:t.always_loaded.skill_metadata_tokens,cls:"as-ctx-skills"},{label:"Memory",tokens:t.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): $${t.session_estimate.with_cache.toFixed(2)}`}),o.createDiv({text:`Without cache: $${t.session_estimate.without_cache.toFixed(2)}`}),o.createDiv({cls:"as-ctx-savings",text:`Cache saves ${t.session_estimate.savings_pct.toFixed(0)}%`})}renderStale(t){if(t.usage.never_used.length===0)return;let e=this.containerEl.createDiv("as-dash-section");e.createDiv({cls:"as-dash-title",text:`Stale skills (${t.usage.unused_30d})`});let s=e.createDiv("as-stale-list");for(let i of t.usage.never_used.slice(0,20))s.createDiv("as-stale-item").createSpan({text:i});t.usage.never_used.length>20&&s.createDiv({cls:"as-stale-more",text:`+${t.usage.never_used.length-20} more`})}};var B=require("obsidian"),dt=require("fs"),is=require("path"),ns=require("os");var O=require("obsidian"),ct=require("fs"),es=require("path"),ss=require("os");var S=require("fs"),k=require("path"),At=require("os"),qe=require("obsidian"),Ke=require("crypto");var Ze=new Set(["readme.md","license","license.md","changelog.md",".ds_store","thumbs.db"]);function Zs(n){return(0,Ke.createHash)("sha256").update(n).digest("hex").slice(0,12)}function qs(n){let t=n.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);if(!t)return{frontmatter:{},content:n};try{let e=(0,qe.parseYaml)(t[1]);return{frontmatter:typeof e=="object"&&e?e:{},content:t[2]}}catch{return{frontmatter:{},content:n}}}function Ks(n,t,e,s="auto",i="skill"){if(i==="command")return typeof n.name=="string"&&n.name?n.name:(0,k.basename)(e,(0,k.extname)(e));if(s==="auto"){if(typeof n.name=="string"&&n.name)return n.name;let r=t.match(/^#\s+(.+)$/m);if(r)return r[1].trim()}let a=(0,k.basename)(e,(0,k.extname)(e));return a==="SKILL"?(0,k.basename)((0,k.join)(e,"..")):a}function Qe(n,t,e,s="auto",i=0){if(!(0,S.existsSync)(n)||i>3)return[];let a=[];for(let r of(0,S.readdirSync)(n,{withFileTypes:!0})){let l=(0,k.join)(n,r.name);if(!(r.isDirectory()||r.isSymbolicLink()&&(0,S.statSync)(l,{throwIfNoEntry:!1})?.isDirectory()))continue;let c=(0,k.join)(l,"SKILL.md");if((0,S.existsSync)(c)){let d=vt(c,t,e,"directory-with-skillmd",s);d&&a.push(d)}else a.push(...Qe(l,t,e,s,i+1))}return a}function Qs(n,t,e,s="auto"){if(!(0,S.existsSync)(n))return[];let i=[];for(let a of(0,S.readdirSync)(n,{withFileTypes:!0})){let r=(0,k.join)(n,a.name);if(a.isDirectory()||a.isSymbolicLink()&&(0,S.statSync)(r,{throwIfNoEntry:!1})?.isDirectory()){let d=(0,k.join)(r,"SKILL.md");if((0,S.existsSync)(d)){let g=vt(d,t,e,"flat-md",s);g&&i.push(g);continue}let p=(0,S.readdirSync)(r).filter(g=>g.endsWith(".md")&&!Ze.has(g.toLowerCase())),m=p.find(g=>g.toLowerCase()===`${a.name.toLowerCase()}.md`)||p[0];if(m){let g=vt((0,k.join)(r,m),t,e,"flat-md",s);g&&i.push(g)}continue}let o=a.name.toLowerCase();if(!o.endsWith(".md")||Ze.has(o))continue;let c=vt(r,t,e,"flat-md",s);c&&i.push(c)}return i}function Xs(n,t,e,s="auto"){if(!(0,S.existsSync)(n))return[];let i=[];for(let a of(0,S.readdirSync)(n,{withFileTypes:!0})){if(!a.name.endsWith(".mdc")&&!a.name.endsWith(".md")||a.isDirectory())continue;let r=vt((0,k.join)(n,a.name),t,e,"mdc",s);r&&i.push(r)}return i}function vt(n,t,e,s="directory-with-skillmd",i="auto"){try{let a=(0,S.readFileSync)(n,"utf-8"),r=(0,S.statSync)(n),{frontmatter:l,content:o}=qs(a),c=Ks(l,o,n,i,t),d=typeof l.description=="string"?l.description:"",p;try{p=(0,S.realpathSync)(n)}catch{p=n}return{id:Zs(p),name:c,description:d,type:t,tools:[e],filePath:n,realPath:p,dirPath:(0,k.join)(n,".."),content:a,frontmatter:l,lastModified:r.mtimeMs,fileSize:r.size,isFavorite:!1,collections:[]}}catch{return null}}function re(n,t,e="auto"){switch(n.pattern){case"directory-with-skillmd":return Qe(n.baseDir,n.type,t,e);case"flat-md":return Qs(n.baseDir,n.type,t,e);case"mdc":return Xs(n.baseDir,n.type,t,e)}}function Ys(n,t){let e=[],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,k.join)(n,i.sub);if(!(0,S.existsSync)(a))continue;let r={baseDir:a,type:i.type,pattern:i.pattern};e.push(...re(r,t))}return e}function Xe(n){return n.projectsHomeDir||(0,At.homedir)()}function ti(n,t){let e=(0,At.homedir)(),s=[];for(let i of[...t.paths,...t.agentPaths]){let a=(0,k.relative)(e,i.baseDir);if(a.startsWith("..")||a.startsWith("/"))continue;let r=(0,k.join)(n,a);if((0,S.existsSync)(r))try{s.push(...re({...i,baseDir:r},t.id))}catch{}}return s}function ei(n){let t=Xe(n);if(!(0,S.existsSync)(t))return[];let e=[];try{let s=new Set(["node_modules",".Trash","Library","Applications","Music","Movies","Pictures","Public"]);for(let i of(0,S.readdirSync)(t,{withFileTypes:!0})){if(!i.isDirectory()&&!i.isSymbolicLink()||s.has(i.name))continue;let a=(0,k.join)(t,i.name);for(let r of T){if(!r.isInstalled())continue;let l=n.tools[r.id];if(l&&!l.enabled)continue;let o=ti(a,r);o.length>0&&e.push({items:o,toolId:r.id})}}}catch{}return e}function oe(n,t){let e=t||(0,At.homedir)();if(!n.startsWith(e+k.sep))return"global";let i=n.slice(e.length+1).split(k.sep);return i.length>1&&!i[0].startsWith(".")?i[0]:"global"}function Ye(n){ke();let t=n.namingMode||"auto",e=new Map,s=new Map;function i(a,r){let l=e.get(a.id);if(l){l.tools.includes(r)||l.tools.push(r);return}let o=s.get(a.name);if(o){let c=e.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);e.set(a.id,a),s.set(a.name,a.id)}for(let a of T){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 re(o,a.id,t))i(c,a.id)}for(let a of n.customScanPaths)if((0,S.existsSync)(a))for(let r of Ys(a,"claude-code"))i(r,"claude-code");if(n.projectScanEnabled)for(let{items:a,toolId:r}of ei(n))for(let l of a)i(l,r);return e}function le(){return T.filter(n=>n.isInstalled()).map(n=>n.id)}function ts(n){let t=[];for(let e of T)if(e.isInstalled())for(let s of[...e.paths,...e.agentPaths])(0,S.existsSync)(s.baseDir)&&t.push(s.baseDir);if(n?.projectScanEnabled){let e=Xe(n),s=new Set(["node_modules",".Trash","Library","Applications","Music","Movies","Pictures","Public"]);try{for(let i of(0,S.readdirSync)(e,{withFileTypes:!0})){if(!i.isDirectory()&&!i.isSymbolicLink()||s.has(i.name))continue;let a=(0,k.join)(e,i.name);for(let r of[".claude/skills",".claude/commands",".claude/agents",".cursor/skills",".codex/skills"]){let l=(0,k.join)(a,r);(0,S.existsSync)(l)&&t.push(l)}}}catch{}}return t}var ce={};for(let[n,t]of Object.entries(Tt))ce[t]||(ce[t]=n);var de=(0,es.join)((0,ss.homedir)(),".skillkit","install-prefs.json"),et=null,Mt=!0;function si(){if(!et&&(0,ct.existsSync)(de))try{let n=JSON.parse((0,ct.readFileSync)(de,"utf-8"));et=new Set(n.agents||[]),Mt=n.global??!0}catch{}}function ii(){try{(0,ct.writeFileSync)(de,JSON.stringify({agents:et?[...et]:[],global:Mt}),"utf-8")}catch{}}si();var _t=class extends O.Modal{skill;settings;onInstalled;selectedAgents;isGlobal;constructor(t,e,s,i){if(super(t),this.skill=e,this.settings=s,this.onInstalled=i,et)this.selectedAgents=new Set(et);else{this.selectedAgents=new Set;let a=le();for(let r of a){let l=Tt[r];l&&this.selectedAgents.add(l)}}this.isGlobal=Mt}onOpen(){let{contentEl:t}=this;t.addClass("as-install-modal"),t.createEl("h3",{text:`Install ${this.skill.name}`}),t.createEl("p",{cls:"as-install-source",text:this.skill.source}),new O.Setting(t).setName("Install globally").setDesc("Shared across all projects (~/.agents/skills/)").addToggle(o=>o.setValue(this.isGlobal).onChange(c=>{this.isGlobal=c})),new O.Setting(t).setName("Agents").setHeading();let e=t.createDiv("as-install-scroll"),s=le(),i=new Set(s.map(o=>Tt[o]).filter(Boolean));for(let o of Oe){let c=i.has(o.id),d=ce[o.id],m=new O.Setting(e).addToggle(E=>E.setValue(this.selectedAgents.has(o.id)).onChange(_=>{_?this.selectedAgents.add(o.id):this.selectedAgents.delete(o.id)})).nameEl,g=d&&L[d]?d:L[o.id]?o.id:L[o.id+"-code"]?o.id+"-code":L[o.id+"-cli"]?o.id+"-cli":null,y=m.createSpan("as-install-agent-icon");g?F(y,g,14):y.addClass("as-install-agent-placeholder"),m.createSpan({text:o.label}),c&&m.createSpan({cls:"as-install-detected",text:"detected"})}let a=t.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(t){let e=[...this.selectedAgents];if(e.length===0){new O.Notice("Select at least one agent",5e3);return}et=new Set(this.selectedAgents),Mt=this.isGlobal,ii(),this.close(),new O.Notice(`Installing ${this.skill.name}...`,3e3),Be(this.skill.source,e,{runner:this.settings.packageRunner,global:this.isGlobal,skillName:this.skill.name}).then(s=>{s.success?(new O.Notice(`Installed ${this.skill.name}`,5e3),this.skill.installed=!0,this.onInstalled()):new O.Notice(`Failed to install ${this.skill.name}`,5e3)})}onClose(){this.contentEl.empty()}};var pe=(0,is.join)((0,ns.homedir)(),".skillkit","marketplace-popular.json"),N=null,It="",X=null,ni=new B.Component;function ai(){if(!N&&(0,dt.existsSync)(pe))try{let n=JSON.parse((0,dt.readFileSync)(pe,"utf-8"));N=Lt(n)}catch{}}function ri(){if(N)try{(0,dt.writeFileSync)(pe,JSON.stringify(N),"utf-8")}catch{}}ai();var $t=class{containerEl;inputEl=null;listEl=null;previewEl=null;searchTimer=null;selectedSkill=null;app;settings;onRefresh;constructor(t,e,s,i){this.containerEl=t,this.app=e.app,this.settings=s,this.onRefresh=i}render(){if(!this.inputEl){this.containerEl.empty(),this.containerEl.addClass("as-marketplace");let t=this.containerEl.createDiv("as-mp-search");this.inputEl=t.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 e=this.containerEl.createDiv("as-mp-body");this.listEl=e.createDiv("as-mp-list"),this.previewEl=e.createDiv("as-mp-preview"),this.previewEl.createDiv({cls:"as-mp-hint",text:"Select a skill to preview."})}this.inputEl.value=It,It.length>=2&&X?this.showResults(X):N?this.showPopular():this.loadPopular()}async loadPopular(){if(!this.listEl)return;this.listEl.empty(),this.listEl.createDiv({cls:"as-mp-loading",text:"Loading popular skills..."}),N=await Re(),ri(),this.showPopular()}refreshList(){N&&Lt(N),X&&Lt(X),It.length>=2&&X?this.showResults(X):this.showPopular()}showPopular(){if(this.listEl){if(this.listEl.empty(),!N||N.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 t of N)this.renderSkillCard(t)}}showResults(t){if(this.listEl){if(this.listEl.empty(),t.length===0){this.listEl.createDiv({cls:"as-mp-hint",text:"No skills found."});return}for(let e of t)this.renderSkillCard(e)}}async doSearch(t){if(!this.listEl)return;if(It=t,t.length<2){X=null,this.showPopular();return}this.listEl.empty(),this.listEl.createDiv({cls:"as-mp-loading",text:"Searching..."});let e=await ee(t);X=e,this.showResults(e)}renderSkillCard(t){if(!this.listEl)return;let e=this.listEl.createDiv("as-mp-card");this.selectedSkill?.id===t.id&&e.addClass("is-selected");let s=e.createDiv("as-mp-card-header");s.createSpan({cls:"as-mp-card-name",text:t.name}),t.installed&&s.createSpan({cls:"as-mp-installed-badge",text:"Installed"}),e.createDiv({cls:"as-mp-card-source",text:t.source});let i=e.createDiv("as-mp-card-meta"),a=i.createSpan("as-mp-dl-icon");(0,B.setIcon)(a,"download"),i.createSpan({cls:"as-mp-card-installs",text:ne(t.installs)}),e.addEventListener("click",()=>{this.selectedSkill=t,this.listEl&&this.listEl.querySelectorAll(".as-mp-card").forEach(r=>r.removeClass("is-selected")),e.addClass("is-selected"),this.showPreview(t)})}async showPreview(t){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:t.name});let a=i.createDiv("as-mp-preview-meta");a.createSpan({cls:"as-mp-preview-source",text:t.source});let r=a.createSpan("as-mp-dl-icon");(0,B.setIcon)(r,"download"),a.createSpan({cls:"as-mp-preview-installs",text:ne(t.installs)});let l=s.createDiv("as-mp-preview-right");if(!t.installed)this.renderInstallButton(l,t);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",()=>{tt(this.app,"Uninstall skill",`Remove "${t.name}" from all agents?`,()=>{d.setText("Removing..."),d.disabled=!0,new B.Notice(`Removing ${t.name}...`,3e3),We(t.name,this.settings.packageRunner).then(p=>{p.success?(new B.Notice(`Removed ${t.name}`,5e3),t.installed=!1,this.refreshList(),this.showPreview(t)):(new B.Notice(`Failed to remove ${t.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 Fe(t.source,t.name,t.id);if(o.empty(),c){t.content=c;let d=o.createDiv("as-mp-rendered markdown-rendered");B.MarkdownRenderer.render(this.app,c,d,"",ni)}else o.createDiv({cls:"as-mp-hint",text:"Could not load skill content."})}renderInstallButton(t,e){t.createEl("button",{cls:"as-mp-install-btn",text:"Install"}).addEventListener("click",()=>{new _t(this.app,e,this.settings,()=>{this.refreshList(),this.showPreview(e)}).open()})}};var st=require("obsidian"),U=require("fs"),jt=require("path");function oi(){let n=[];for(let t of T){if(!t.isInstalled())continue;let e=[];for(let s of[...t.paths,...t.agentPaths])s.type==="rule"||s.type==="memory"||e.push({sp:s,label:s.type});e.length>0&&n.push({tool:t,paths:e})}return n}var li={skill:"sparkles",command:"terminal",agent:"bot"},Ht=class extends st.Modal{onCreated;toolOptions;selectedTool=null;selectedPath=null;name="";step="tool";constructor(t,e){super(t),this.onCreated=e,this.toolOptions=oi()}onOpen(){this.modalEl.addClass("as-create-modal"),this.render()}render(){let{contentEl:t}=this;t.empty(),this.step==="tool"?this.renderToolStep(t):this.step==="type"?this.renderTypeStep(t):this.renderNameStep(t)}renderToolStep(t){this.renderHeader(t,"Choose tool",null);let e=t.createDiv("as-create-grid");for(let s of this.toolOptions){let i=e.createDiv("as-create-card");i.style.setProperty("--tool-color",s.tool.color);let a=i.createDiv("as-create-card-icon");L[s.tool.id]&&F(a,s.tool.id,24),i.createDiv({cls:"as-create-card-name",text:s.tool.name}),i.addEventListener("click",()=>{this.selectedTool=s,s.paths.length===1?(this.selectedPath=s.paths[0],this.step="name"):this.step="type",this.render()})}}renderTypeStep(t){if(!this.selectedTool)return;this.renderHeader(t,`${this.selectedTool.tool.name}`,()=>{this.step="tool",this.render()}),t.createDiv("as-create-subtitle").setText("What do you want to create?");let s=t.createDiv("as-create-type-grid");for(let i of this.selectedTool.paths){let a=s.createDiv("as-create-type-card");a.style.setProperty("--tool-color",this.selectedTool.tool.color);let r=li[i.label]||"file",o=a.createDiv("as-create-type-icon").createSvg("svg",{attr:{viewBox:"0 0 24 24",width:"20",height:"20",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"}});r==="sparkles"?o.innerHTML='':r==="terminal"?o.innerHTML='':r==="bot"&&(o.innerHTML=''),a.createDiv({cls:"as-create-type-label",text:i.label}),a.addEventListener("click",()=>{this.selectedPath=i,this.step="name",this.render()})}}renderNameStep(t){if(!this.selectedTool||!this.selectedPath)return;let e=this.selectedTool.paths.length>1?"type":"tool";this.renderHeader(t,`New ${this.selectedPath.label}`,()=>{this.step=e,this.render()});let s=t.createDiv("as-create-badge");s.style.setProperty("--tool-color",this.selectedTool.tool.color);let i=s.createSpan("as-create-badge-icon");L[this.selectedTool.tool.id]&&F(i,this.selectedTool.tool.id,14),s.createSpan({text:this.selectedTool.tool.name});let r=t.createDiv("as-create-input-wrap").createEl("input",{type:"text",placeholder:`my-${this.selectedPath.label}-name`,cls:"as-create-input"});r.value=this.name,r.addEventListener("input",()=>{this.name=r.value.trim()}),r.addEventListener("keydown",c=>{c.key==="Enter"&&this.name&&this.create()}),setTimeout(()=>r.focus(),10);let o=t.createDiv("as-create-actions").createEl("button",{text:`Create ${this.selectedPath.label}`,cls:"as-create-submit"});o.style.setProperty("--tool-color",this.selectedTool.tool.color),o.addEventListener("click",()=>this.create())}renderHeader(t,e,s){let i=t.createDiv("as-create-header");if(s){let a=i.createDiv("as-create-back");a.innerHTML='',a.addEventListener("click",s)}i.createDiv({cls:"as-create-title",text:e})}create(){if(!this.name||!this.selectedPath)return;let t=this.name.toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"");if(!t){new st.Notice("Invalid name");return}let e=this.selectedPath.sp,s;if(e.pattern==="directory-with-skillmd"){let i=(0,jt.join)(e.baseDir,t);if((0,U.existsSync)(i)){new st.Notice(`Already exists: ${t}`);return}(0,U.mkdirSync)(i,{recursive:!0}),s=(0,jt.join)(i,"SKILL.md"),(0,U.writeFileSync)(s,["---",`name: ${this.name}`,'description: ""',"---","",`# ${this.name}`,"","## Instructions","",""].join(` +`),"utf-8")}else{if((0,U.existsSync)(e.baseDir)||(0,U.mkdirSync)(e.baseDir,{recursive:!0}),s=(0,jt.join)(e.baseDir,`${t}.md`),(0,U.existsSync)(s)){new st.Notice(`Already exists: ${t}.md`);return}(0,U.writeFileSync)(s,["---",'description: ""',"---","",""].join(` +`),"utf-8")}new st.Notice(`Created ${this.name}`),this.close(),this.onCreated(s)}onClose(){this.contentEl.empty()}};var ds=require("obsidian"),pt=require("fs"),ps=require("path"),us=require("os");var ue={customTags:{},favorites:[]},he={tools:{},watchEnabled:!0,watchDebounceMs:500,deepSearchDefault:!1,deepSearchScope:"both",favorites:[],collections:{},customScanPaths:[],namingMode:"auto",projectScanEnabled:!0,projectsHomeDir:"",packageRunner:"auto"};var H=require("fs"),G=require("path"),ve=require("os"),as=require("readline"),ci=(0,G.join)((0,ve.homedir)(),".claude"),me=(0,G.join)(ci,"projects"),di=5*1024*1024,ge=500;function pi(n){let t=(0,ve.homedir)().split(G.sep).filter(Boolean),e=t.join("-"),s=n;if(s.startsWith(e+"-"))s=s.slice(e.length+1);else if(s.startsWith("-")){s=s.slice(1);let a=t.join("-")+"-";s.startsWith(a)&&(s=s.slice(a.length))}let i=s.split("-").filter(Boolean);return i.length<=2?i.join("-")||"root":i.slice(-2).join("-")}function Ft(n){if(typeof n=="string")return n;if(Array.isArray(n)){let t=[];for(let e of n)if(typeof e=="object"&&e!==null){let s=e;s.type==="text"&&typeof s.text=="string"&&t.push(s.text)}return t.join(` +`)}return""}function rs(n){if(!Array.isArray(n))return[];let t=[];for(let e of n)if(typeof e=="object"&&e!==null){let s=e;s.type==="tool_use"&&typeof s.name=="string"&&t.push(s.name)}return t}function ui(n){let t=[],e="",s="";for(let i of n)try{let a=JSON.parse(i),r=a.timestamp;if(r&&(e||(e=r),s=r),a.type==="user"){let l=a.message;if(!l)continue;let o=Ft(l.content);o&&t.push({role:"human",text:o,timestamp:r||""})}if(a.type==="assistant"){let l=a.message;if(!l)continue;let o=Ft(l.content),c=rs(l.content);o&&t.push({role:"assistant",text:o,timestamp:r||"",toolCalls:c.length>0?c:void 0})}}catch{}return{messages:t,firstTimestamp:e,lastTimestamp:s}}function hi(){let n=[];if(!(0,H.existsSync)(me))return n;let t;try{t=(0,H.readdirSync)(me)}catch{return n}for(let e of t){let s=(0,G.join)(me,e);try{if(!(0,H.statSync)(s).isDirectory())continue}catch{continue}let i=pi(e),a;try{a=(0,H.readdirSync)(s).filter(r=>r.endsWith(".jsonl"))}catch{continue}for(let r of a){let l=(0,G.join)(s,r);try{let o=(0,H.statSync)(l);n.push({uuid:(0,G.basename)(r,".jsonl"),project:i,projectPath:s,filePath:l,fileSize:o.size})}catch{continue}}}return n}function mi(n){try{let e=(0,H.readFileSync)(n.filePath,"utf-8").split(` +`).filter(c=>c.trim());if(e.length===0)return null;let s=e.length>ge?e.slice(0,ge):e,{messages:i,firstTimestamp:a,lastTimestamp:r}=ui(s);if(i.length===0)return null;let l=i.find(c=>c.role==="human"),o=l?l.text.slice(0,120).replace(/\n/g," "):"(empty conversation)";return{id:n.uuid,uuid:n.uuid,project:n.project,projectPath:n.projectPath,title:o,messages:i,messageCount:i.length,firstTimestamp:a,lastTimestamp:r,tags:[],customTags:[],isFavorite:!1,filePath:n.filePath}}catch{return null}}async function gi(n){return new Promise(t=>{let e=[],s="",i="",a=0,r=(0,as.createInterface)({input:(0,H.createReadStream)(n.filePath,{encoding:"utf-8"}),crlfDelay:Number.POSITIVE_INFINITY});r.on("line",l=>{if(l.trim()){if(a++,a>ge){r.close();return}try{let o=JSON.parse(l),c=o.timestamp;if(c&&(s||(s=c),i=c),o.type==="user"){let d=o.message;if(!d)return;let p=Ft(d.content);p&&e.push({role:"human",text:p,timestamp:c||""})}if(o.type==="assistant"){let d=o.message;if(!d)return;let p=Ft(d.content),m=rs(d.content);p&&e.push({role:"assistant",text:p,timestamp:c||"",toolCalls:m.length>0?m:void 0})}}catch{}}}),r.on("close",()=>{if(e.length===0){t(null);return}let l=e.find(c=>c.role==="human"),o=l?l.text.slice(0,120).replace(/\n/g," "):"(empty conversation)";t({id:n.uuid,uuid:n.uuid,project:n.project,projectPath:n.projectPath,title:o,messages:e,messageCount:e.length,firstTimestamp:s,lastTimestamp:i,tags:[],customTags:[],isFavorite:!1,filePath:n.filePath})}),r.on("error",()=>t(null))})}async function os(){let n=hi(),t=[],e=20;n.sort((s,i)=>i.fileSize-s.fileSize);for(let s=0;sr.fileSize>di?gi(r):Promise.resolve(mi(r))));for(let r of a)r&&t.push(r)}return t.sort((s,i)=>(i.lastTimestamp||"").localeCompare(s.lastTimestamp||"")),t}var vi=[{tag:"react",patterns:[/\breact\b/i,/\.tsx\b/,/\.jsx\b/,/usestate|useeffect|useref/i]},{tag:"react-native",patterns:[/react.native/i,/\bexpo\b/i,/react-navigation/i]},{tag:"nextjs",patterns:[/next\.js/i,/\bnextjs\b/i,/next\.config/i]},{tag:"vue",patterns:[/\bvue\b/i,/\.vue\b/,/vuex|pinia/i]},{tag:"angular",patterns:[/\bangular\b/i,/\.component\.ts/i]},{tag:"svelte",patterns:[/\bsvelte\b/i,/\.svelte\b/]},{tag:"typescript",patterns:[/typescript/i,/tsconfig/i,/\.tsx\b/]},{tag:"javascript",patterns:[/javascript/i,/\.js\b/,/\.mjs\b/]},{tag:"python",patterns:[/\bpython\b/i,/\.py\b/,/\bpip\b/i,/django|flask|fastapi/i]},{tag:"rust",patterns:[/\brust\b/i,/\.rs\b/,/cargo\.toml/i]},{tag:"go",patterns:[/\bgolang\b/i,/\.go\b/,/go\.mod/i]},{tag:"java",patterns:[/\bjava\b/i,/\.java\b/,/gradle|maven/i]},{tag:"csharp",patterns:[/\bc#\b/i,/\.cs\b/,/unity|dotnet/i]},{tag:"swift",patterns:[/\bswift\b/i,/\.swift\b/,/swiftui/i]},{tag:"nestjs",patterns:[/nestjs/i,/\bnest\b/i,/@nestjs\//]},{tag:"tailwind",patterns:[/tailwind/i,/tailwindcss/i]},{tag:"css",patterns:[/\.css\b/,/\.scss\b/,/\.sass\b/,/styled-components/i]},{tag:"node",patterns:[/node\.js/i,/\bnodejs\b/i,/package\.json/i,/\bnpm\b/i]},{tag:"docker",patterns:[/\bdocker\b/i,/dockerfile/i,/docker-compose/i]},{tag:"sql",patterns:[/\bsql\b/i,/postgres|mysql|sqlite/i,/prisma|typeorm|sequelize/i]},{tag:"mongodb",patterns:[/\bmongo\b/i,/mongodb/i,/mongoose/i]},{tag:"graphql",patterns:[/graphql/i,/\.graphql\b/,/apollo/i]},{tag:"git",patterns:[/\bgit\s+(commit|push|pull|merge|rebase|checkout|branch)/i]},{tag:"unity",patterns:[/\bunity\b/i,/gameobject|monobehaviour/i,/\.unity\b/]},{tag:"blender",patterns:[/\bblender\b/i,/\.blend\b/,/bpy\./i]},{tag:"threejs",patterns:[/three\.js/i,/threejs/i,/\br3f\b/i,/react-three/i]},{tag:"aws",patterns:[/\baws\b/i,/lambda|s3|ec2|dynamodb/i]},{tag:"firebase",patterns:[/firebase/i,/firestore/i]},{tag:"testing",patterns:[/\bjest\b/i,/\bvitest\b/i,/\.test\.|\.spec\./i,/testing/i]}],fi=[{tag:"bug-fix",patterns:[/\bfix\b/i,/\bbug\b/i,/\berror\b/i,/broken/i,/not working/i,/no funciona/i,/arregl/i]},{tag:"feature",patterns:[/\badd\b/i,/\bcreate\b/i,/\bimplement\b/i,/\bnew\b/i,/agreg/i,/crea /i]},{tag:"refactor",patterns:[/refactor/i,/restructur/i,/reorganiz/i,/clean.?up/i]},{tag:"styling",patterns:[/\bcss\b/i,/\bstyle\b/i,/\bdesign\b/i,/layout/i,/responsive/i,/color/i,/estilo/i]},{tag:"config",patterns:[/config/i,/setup/i,/install/i,/\.env\b/i,/configur/i]},{tag:"api",patterns:[/\bapi\b/i,/endpoint/i,/fetch|axios/i,/request/i,/rest\b/i]},{tag:"auth",patterns:[/auth/i,/login/i,/password/i,/token/i,/session/i,/jwt/i]},{tag:"database",patterns:[/database/i,/migration/i,/schema/i,/seed/i,/query/i]},{tag:"deployment",patterns:[/deploy/i,/ci.?cd/i,/pipeline/i,/production/i,/vercel|netlify|heroku/i]},{tag:"documentation",patterns:[/\bdocs?\b/i,/readme/i,/documentation/i,/comment/i]},{tag:"performance",patterns:[/performance/i,/optimi[zs]/i,/slow/i,/fast/i,/cache/i,/lazy/i]},{tag:"ui-ux",patterns:[/\bui\b/i,/\bux\b/i,/component/i,/button|modal|dialog|form/i,/animation/i]}];function bi(n,t){let e=new RegExp(t.source,t.flags.includes("g")?t.flags:t.flags+"g"),s=n.match(e);return s?s.length:0}function ls(n,t,e=1){let s=[];for(let i of t){let a=0;for(let r of i.patterns)a+=bi(n,r);a>=e&&s.push(i.tag)}return s}function Si(n){let t=new Set;n.project&&n.project!=="root"&&t.add(n.project);let s=n.messages.filter(r=>r.role==="human").slice(0,5).map(r=>r.text.replace(/[\s\S]*?<\/system-reminder>/g,"")).join(" "),a=n.messages.filter(r=>r.role==="assistant").flatMap(r=>r.toolCalls||[]);for(let r of ls(s,vi,3))t.add(r);for(let r of ls(s,fi,2))t.add(r);return a.some(r=>r.includes("mcp__blender"))&&t.add("blender"),a.some(r=>r.includes("mcp-unity")||r.includes("mcp__mcp-unity"))&&t.add("unity"),Array.from(t).sort()}function cs(n){for(let t of n)t.tags=Si(t)}var fe=(0,ps.join)((0,us.homedir)(),".claude","agentfiles-conversations.json"),Rt=class extends ds.Events{items=[];_filter={kind:"all-conversations"};_sort="date";_dateRange="today";_activeTags=[];_searchQuery="";_loading=!1;tagData={...ue};get filter(){return this._filter}get sort(){return this._sort}get dateRange(){return this._dateRange}get activeTags(){return this._activeTags}get searchQuery(){return this._searchQuery}get loading(){return this._loading}get allItems(){return this.items}get filteredItems(){let t=this.items;switch(this._filter.kind){case"conversation-project":t=t.filter(e=>e.project===this._filter.project);break;case"conversation-tag":t=t.filter(e=>e.tags.includes(this._filter.tag)||e.customTags.includes(this._filter.tag));break;case"conversation-favorites":t=t.filter(e=>e.isFavorite);break}if(this._dateRange!=="all"){let e=Date.now(),s={today:1,"7d":7,"30d":30,"90d":90,"180d":180}[this._dateRange],i=e-s*864e5;t=t.filter(a=>new Date(a.lastTimestamp).getTime()>=i)}if(this._activeTags.length>0&&(t=t.filter(e=>{let s=[...e.tags,...e.customTags];return this._activeTags.every(i=>s.includes(i))})),this._searchQuery){let e=this._searchQuery.toLowerCase();t=t.filter(s=>s.title.toLowerCase().includes(e)||s.project.toLowerCase().includes(e)||s.tags.some(i=>i.includes(e))||s.customTags.some(i=>i.includes(e))||s.messages.some(i=>i.text.toLowerCase().includes(e)))}return this._sort==="messages"&&(t=[...t].sort((e,s)=>s.messageCount-e.messageCount)),t}getProjectCounts(){let t=new Map;for(let e of this.items)t.set(e.project,(t.get(e.project)||0)+1);return t}getAllTags(){let t=new Map;for(let e of this.items)for(let s of[...e.tags,...e.customTags])t.set(s,(t.get(s)||0)+1);return t}refresh(){this._loading=!0,this.trigger("conversations-updated"),this.refreshAsync()}async refreshAsync(){this.loadTagData(),this.items=await os(),cs(this.items),this.applyTagData(),this._loading=!1,this.trigger("conversations-updated")}loadTagData(){try{(0,pt.existsSync)(fe)&&(this.tagData=JSON.parse((0,pt.readFileSync)(fe,"utf-8")))}catch{this.tagData={...ue}}}saveTagData(){try{(0,pt.writeFileSync)(fe,JSON.stringify(this.tagData,null,2),"utf-8")}catch{}}applyTagData(){for(let t of this.items)t.customTags=this.tagData.customTags[t.uuid]||[],t.isFavorite=this.tagData.favorites.includes(t.uuid)}setFilter(t){this._filter=t,this.trigger("conversations-updated")}setSort(t){this._sort=t,this.trigger("conversations-updated")}setDateRange(t){this._dateRange=t,this.trigger("conversations-updated")}toggleTag(t){let e=this._activeTags.indexOf(t);e>=0?this._activeTags.splice(e,1):this._activeTags.push(t),this.trigger("conversations-updated")}clearTags(){this._activeTags=[],this.trigger("conversations-updated")}setSearch(t){this._searchQuery=t,this.trigger("conversations-updated")}toggleFavorite(t){let e=this.tagData.favorites.indexOf(t);e>=0?this.tagData.favorites.splice(e,1):this.tagData.favorites.push(t),this.saveTagData();let s=this.items.find(i=>i.uuid===t);s&&(s.isFavorite=!s.isFavorite),this.trigger("conversations-updated")}addCustomTag(t,e){this.tagData.customTags[t]||(this.tagData.customTags[t]=[]);let s=this.tagData.customTags[t];s.includes(e)||s.push(e),this.saveTagData();let i=this.items.find(a=>a.uuid===t);i&&!i.customTags.includes(e)&&i.customTags.push(e),this.trigger("conversations-updated")}removeCustomTag(t,e){this.tagData.customTags[t]&&(this.tagData.customTags[t]=this.tagData.customTags[t].filter(i=>i!==e)),this.saveTagData();let s=this.items.find(i=>i.uuid===t);s&&(s.customTags=s.customTags.filter(i=>i!==e)),this.trigger("conversations-updated")}getItem(t){return this.items.find(e=>e.uuid===t)}};var J=require("obsidian");function ki(n){return n.replace(/<[^>]+>/g,"").replace(/\[Image #?\d*\]/gi,"").replace(/\s+/g," ").trim()||"(untitled)"}function yi(n){if(!n)return"";let t=Date.now()-new Date(n).getTime(),e=Math.floor(t/6e4);if(e<60)return`${e}m ago`;let s=Math.floor(e/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 wi(n){return n?new Date(n).toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"}):""}var Ot=class{containerEl;store;onSelect;selectedUuid=null;inputEl=null;toolbarEl=null;listEl=null;constructor(t,e,s){this.containerEl=t,this.store=e,this.onSelect=s}setSelected(t){this.selectedUuid=t}render(){this.inputEl||(this.containerEl.empty(),this.containerEl.addClass("as-list"),this.searchRowEl=this.containerEl.createDiv("as-search"),this.inputEl=this.searchRowEl.createEl("input",{type:"text",placeholder:"Search conversations...",cls:"as-search-input"}),this.inputEl.addEventListener("input",()=>{this.store.setSearch(this.inputEl.value)}),this.toolbarEl=this.containerEl.createDiv("as-conv-toolbar"),this.listEl=this.containerEl.createDiv("as-list-items as-conv-list")),this.inputEl.value=this.store.searchQuery,this.renderSearchActions(),this.renderTagStrip(),this.renderList()}searchRowEl=null;searchActionsEl=null;outsideClickCleanup=null;dateDropdownEl=null;tagDropdownEl=null;openDropdown=null;closeAllDropdowns(){this.openDropdown=null,this.dateDropdownEl?.removeClass("is-open"),this.tagDropdownEl?.removeClass("is-open"),this.outsideClickCleanup&&(this.outsideClickCleanup(),this.outsideClickCleanup=null)}toggleDropdown(t,e){if(this.openDropdown===t){this.closeAllDropdowns();return}this.closeAllDropdowns(),this.openDropdown=t,(t==="date"?this.dateDropdownEl:this.tagDropdownEl)?.addClass("is-open");let i=a=>{e.contains(a.target)||this.closeAllDropdowns()};setTimeout(()=>document.addEventListener("click",i),0),this.outsideClickCleanup=()=>document.removeEventListener("click",i)}renderSearchActions(){if(!this.searchRowEl)return;this.searchActionsEl&&this.searchActionsEl.remove(),this.searchActionsEl=this.searchRowEl.createDiv("as-conv-search-actions");let t=this.searchActionsEl.createDiv("as-conv-dropdown-wrap"),e=t.createEl("button",{cls:"as-conv-icon-btn"}),s=e.createSpan("as-conv-icon-btn-icon");(0,J.setIcon)(s,"calendar"),this.dateDropdownEl=t.createDiv("as-conv-dropdown"),this.openDropdown==="date"&&this.dateDropdownEl.addClass("is-open");let i=[{label:"Today",value:"today"},{label:"Last 7 days",value:"7d"},{label:"Last 30 days",value:"30d"},{label:"Last 90 days",value:"90d"},{label:"Last 6 months",value:"180d"},{label:"All time",value:"all"}];for(let y of i){let E=this.store.dateRange===y.value,_=this.dateDropdownEl.createDiv(`as-conv-dropdown-item ${E?"is-active":""}`),V=_.createSpan("as-conv-dropdown-check");E&&(0,J.setIcon)(V,"check"),_.createSpan({cls:"as-conv-dropdown-item-label",text:y.label}),_.addEventListener("click",Z=>{Z.stopPropagation(),this.store.setDateRange(y.value),this.closeAllDropdowns()})}e.addEventListener("click",y=>{y.stopPropagation(),this.toggleDropdown("date",t)});let a=this.store.getAllTags(),r=this.store.activeTags,l=a.size>0,o=this.searchActionsEl.createDiv("as-conv-dropdown-wrap"),c=o.createEl("button",{cls:"as-conv-icon-btn"});l||c.addClass("is-disabled"),r.length>0&&c.addClass("has-active");let d=c.createSpan("as-conv-icon-btn-icon");if((0,J.setIcon)(d,"tag"),this.tagDropdownEl=o.createDiv("as-conv-dropdown"),this.openDropdown==="tag"&&this.tagDropdownEl.addClass("is-open"),l){if(r.length>0){let E=this.tagDropdownEl.createDiv("as-conv-dropdown-item as-conv-dropdown-clear"),_=E.createSpan("as-conv-dropdown-item-icon");(0,J.setIcon)(_,"x"),E.createSpan({text:"Clear filters"}),E.addEventListener("click",V=>{V.stopPropagation(),this.store.clearTags()})}let y=Array.from(a.entries()).sort((E,_)=>_[1]-E[1]).slice(0,25);for(let[E,_]of y){let V=r.includes(E),Z=this.tagDropdownEl.createDiv(`as-conv-dropdown-item ${V?"is-active":""}`),ks=Z.createSpan("as-conv-dropdown-check");V&&(0,J.setIcon)(ks,"check"),Z.createSpan({cls:"as-conv-dropdown-item-label",text:E}),Z.createSpan({cls:"as-conv-dropdown-item-count",text:String(_)}),Z.addEventListener("click",ys=>{ys.stopPropagation(),this.store.toggleTag(E)})}}c.addEventListener("click",y=>{y.stopPropagation(),l&&this.toggleDropdown("tag",o)});let p=this.store.sort==="date"?"messages":"date",m=this.searchActionsEl.createEl("button",{cls:"as-conv-icon-btn"}),g=m.createSpan("as-conv-icon-btn-icon");(0,J.setIcon)(g,this.store.sort==="date"?"clock":"hash"),m.setAttribute("aria-label",`Sort by ${p}`),m.addEventListener("click",()=>this.store.setSort(p))}renderTagStrip(){if(!this.toolbarEl)return;this.toolbarEl.empty();let t=this.store.activeTags,e=this.store.filteredItems.length;if(t.length===0&&e===this.store.allItems.length)return;let s=this.toolbarEl.createDiv("as-conv-tag-strip");s.createSpan({cls:"as-conv-result-count",text:`${e} results`});for(let i of t){let a=s.createEl("button",{cls:"as-conv-tag-pill is-active"});a.createSpan({text:i});let r=a.createSpan("as-conv-tag-pill-x");(0,J.setIcon)(r,"x"),a.addEventListener("click",()=>this.store.toggleTag(i))}if(t.length>0){let i=s.createEl("button",{cls:"as-conv-tag-pill as-conv-tag-clear"});i.createSpan({text:"Clear all"}),i.addEventListener("click",()=>this.store.clearTags())}}renderList(){if(!this.listEl)return;if(this.listEl.empty(),this.store.loading){this.listEl.createDiv({cls:"as-list-empty",text:"Loading conversations..."});return}let t=this.store.filteredItems;if(t.length===0){this.listEl.createDiv({cls:"as-list-empty",text:"No conversations found"});return}let e="";for(let s of t){let i=wi(s.lastTimestamp);i!==e&&(e=i,this.listEl.createDiv({cls:"as-conv-date-header",text:i})),this.renderCard(this.listEl,s)}}renderCard(t,e){let s=t.createDiv("as-skill-card");e.uuid===this.selectedUuid&&s.addClass("is-selected");let i=s.createDiv("as-skill-header"),a=ki(e.title),r=a.length>60?a.slice(0,60)+"...":a;if(i.createSpan({cls:"as-skill-name",text:r}),e.isFavorite){let c=i.createSpan("as-skill-star");(0,J.setIcon)(c,"star")}let l=[e.project,yi(e.lastTimestamp),`${e.messageCount} msgs`].filter(Boolean).join(" \xB7 ");s.createDiv({cls:"as-skill-desc",text:l});let o=[...e.tags,...e.customTags].filter(c=>c!==e.project);if(o.length>0){let c=s.createDiv("as-skill-meta"),d=3;for(let p of o.slice(0,d)){let m=e.customTags.includes(p);c.createSpan({cls:`as-conv-tag ${m?"as-conv-tag-custom":""}`,text:p})}o.length>d&&c.createSpan({cls:"as-conv-tag as-conv-tag-more",text:`+${o.length-d}`})}s.addEventListener("click",()=>{this.selectedUuid=e.uuid,this.onSelect(e)})}};var C=require("obsidian"),ut=require("fs"),ft=require("path");function be(n){return n?new Date(n).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function Di(n){return n.replace(/[<>:"/\\|?*]/g,"").replace(/\.{2,}/g,"").replace(/\s+/g,"-").slice(0,80)}function hs(n,t){let e=n.firstTimestamp?new Date(n.firstTimestamp).toISOString().slice(0,10):"unknown-date",s=Di(n.title.slice(0,60));return`${t}/Claude Sessions/${e}-${s}.md`}function ms(n){let{selectedMessages:t,conversation:e}=n,s=[...e.tags,...e.customTags],i=s.map(r=>`"${r}"`).join(", "),a=[];if(a.push("---"),a.push(`tags: [claude-session, ${i}]`),a.push(`session: ${e.uuid}`),a.push(`project: ${e.project}`),a.push(`date: ${e.firstTimestamp?new Date(e.firstTimestamp).toISOString().slice(0,10):"unknown"}`),a.push(`messages: ${e.messageCount}`),a.push("---"),a.push(""),a.push(`# ${e.title.slice(0,100)}`),a.push(""),a.push("## Context"),a.push(`- **Project:** ${e.project}`),a.push(`- **Started:** ${be(e.firstTimestamp)}`),a.push(`- **Last activity:** ${be(e.lastTimestamp)}`),a.push(`- **Messages:** ${e.messageCount}`),s.length>0&&a.push(`- **Tags:** ${s.map(r=>`\`${r}\``).join(" ")}`),a.push(""),t.length>0){a.push("## Key Snippets"),a.push("");for(let r of t){let l=r.role==="human"?"You":"Claude",o=be(r.timestamp);a.push(`### ${l} ${o?`(${o})`:""}`),a.push(""),r.role==="human"?a.push(`> ${r.text.replace(/\n/g,` > `)}`):a.push(r.text),a.push("")}}return a.push("## Resume"),a.push(""),a.push("```bash"),a.push(`claude --resume ${e.uuid}`),a.push("```"),a.join(` -`)}function Ci(n){return n?new Date(n).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}var Nt=class{containerEl;store;app;vaultPath;currentItem=null;selectedMessages=new Set;visibleCount=20;renderComponent=new D.Component;constructor(t,e,s,i){this.containerEl=t,this.store=e,this.app=s,this.vaultPath=i}show(t){this.currentItem=t,this.selectedMessages.clear(),this.visibleCount=20,this.render()}clear(){this.currentItem=null,this.containerEl.empty(),this.containerEl.addClass("as-detail");let t=this.containerEl.createDiv("as-detail-empty");(0,D.setIcon)(t.createDiv("as-detail-empty-icon"),"message-circle"),t.createDiv({text:"Select a conversation to view"})}render(){this.containerEl.empty(),this.containerEl.addClass("as-detail");let t=this.currentItem;if(!t)return this.clear();this.renderToolbar(t),this.renderBody(t)}renderToolbar(t){let e=this.containerEl.createDiv("as-detail-toolbar"),s=e.createDiv("as-toolbar-top"),i=s.createDiv("as-toolbar-left"),a=t.title.length>100?t.title.slice(0,100)+"...":t.title;i.createSpan({cls:"as-detail-title",text:a});let r=s.createDiv("as-toolbar-right"),l=r.createEl("button",{cls:"as-toolbar-btn",attr:{"aria-label":"Toggle favorite"}});(0,D.setIcon)(l,t.isFavorite?"star":"star-off"),l.addEventListener("click",()=>{this.store.toggleFavorite(t.uuid),this.render()});let o=r.createEl("button",{cls:"as-toolbar-btn",attr:{"aria-label":"Copy resume command"}});(0,D.setIcon)(o,"terminal"),o.addEventListener("click",()=>{navigator.clipboard.writeText(`claude --resume ${t.uuid}`),new D.Notice("Resume command copied!",3e3)});let c=r.createEl("button",{cls:"as-toolbar-btn as-toolbar-btn-primary",attr:{"aria-label":"Save to vault"}});(0,D.setIcon)(c,"download"),c.addEventListener("click",()=>this.saveToVault(t));let d=e.createDiv("as-detail-meta-bar");d.createSpan({cls:"as-meta-item",text:t.project}),d.createSpan({cls:"as-meta-item",text:`${t.messageCount} messages`}),t.firstTimestamp&&d.createSpan({cls:"as-meta-item",text:new Date(t.firstTimestamp).toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})});let p=[...t.tags,...t.customTags];if(p.length>0){let h=e.createDiv("as-conv-detail-tags");for(let k of p){let C=t.customTags.includes(k),M=h.createSpan({cls:`as-conv-tag ${C?"as-conv-tag-custom":""}`,text:k});if(C){let V=M.createSpan("as-conv-tag-remove");(0,D.setIcon)(V,"x"),V.addEventListener("click",Z=>{Z.stopPropagation(),this.store.removeCustomTag(t.uuid,k),this.render()})}}let m=h.createSpan("as-conv-tag as-conv-tag-add");(0,D.setIcon)(m,"plus"),m.addEventListener("click",()=>this.promptAddTag(t))}}renderBody(t){let e=this.containerEl.createDiv("as-detail-body");if(this.selectedMessages.size>0){let o=e.createDiv("as-conv-selection-bar");o.createSpan({text:`${this.selectedMessages.size} message${this.selectedMessages.size>1?"s":""} selected`}),o.createEl("button",{cls:"as-conv-save-selected-btn",text:"Save selected to vault"}).addEventListener("click",()=>this.saveToVault(t))}let s=20,i=t.messages.length,a=t.messages.slice(0,this.visibleCount);for(let o=0;o{this.visibleCount+=s,this.render()}),d.createEl("button",{text:`Show all ${i} messages`,cls:"as-conv-show-all-btn"}).addEventListener("click",()=>{this.visibleCount=i,this.render()})}let r=e.createDiv("as-conv-resume-section");r.createDiv({cls:"as-section-title",text:"Resume this conversation"}),r.createEl("code",{cls:"as-conv-resume-cmd",text:`claude --resume ${t.uuid}`}).addEventListener("click",()=>{navigator.clipboard.writeText(`claude --resume ${t.uuid}`),new D.Notice("Copied!",2e3)})}renderMessage(t,e,s){let i=e.role==="human",a=t.createDiv(`as-conv-msg ${i?"as-conv-msg-human":"as-conv-msg-assistant"}`);this.selectedMessages.has(s)&&a.addClass("as-conv-msg-selected");let r=a.createDiv("as-conv-msg-header"),l=r.createSpan("as-conv-msg-role-icon");(0,D.setIcon)(l,i?"user":"bot"),r.createSpan({cls:"as-conv-msg-role",text:i?"You":"Claude"}),e.timestamp&&r.createSpan({cls:"as-conv-msg-time",text:Ci(e.timestamp)});let o=r.createSpan("as-conv-msg-select");(0,D.setIcon)(o,this.selectedMessages.has(s)?"check-square":"square"),o.setAttribute("aria-label","Select message for export"),o.addEventListener("click",p=>{p.stopPropagation(),this.selectedMessages.has(s)?this.selectedMessages.delete(s):this.selectedMessages.add(s),this.render()});let c=a.createDiv("as-conv-msg-content"),d=e.text.length>2e3&&!i?e.text.slice(0,2e3)+` +`)}function Ci(n){return n?new Date(n).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}var Nt=class{containerEl;store;app;vaultPath;currentItem=null;selectedMessages=new Set;visibleCount=20;renderComponent=new C.Component;constructor(t,e,s,i){this.containerEl=t,this.store=e,this.app=s,this.vaultPath=i}show(t){this.currentItem=t,this.selectedMessages.clear(),this.visibleCount=20,this.render()}clear(){this.currentItem=null,this.containerEl.empty(),this.containerEl.addClass("as-detail");let t=this.containerEl.createDiv("as-detail-empty");(0,C.setIcon)(t.createDiv("as-detail-empty-icon"),"message-circle"),t.createDiv({text:"Select a conversation to view"})}render(){this.containerEl.empty(),this.containerEl.addClass("as-detail");let t=this.currentItem;if(!t)return this.clear();this.renderToolbar(t),this.renderBody(t)}renderToolbar(t){let e=this.containerEl.createDiv("as-detail-toolbar"),s=e.createDiv("as-toolbar-top"),i=s.createDiv("as-toolbar-left"),a=t.title.length>100?t.title.slice(0,100)+"...":t.title;i.createSpan({cls:"as-detail-title",text:a});let r=s.createDiv("as-toolbar-right"),l=r.createEl("button",{cls:"as-toolbar-btn",attr:{"aria-label":"Toggle favorite"}});(0,C.setIcon)(l,t.isFavorite?"star":"star-off"),l.addEventListener("click",()=>{this.store.toggleFavorite(t.uuid),this.render()});let o=r.createEl("button",{cls:"as-toolbar-btn",attr:{"aria-label":"Copy resume command"}});(0,C.setIcon)(o,"terminal"),o.addEventListener("click",()=>{navigator.clipboard.writeText(`claude --resume ${t.uuid}`),new C.Notice("Resume command copied!",3e3)});let c=r.createEl("button",{cls:"as-toolbar-btn as-toolbar-btn-primary",attr:{"aria-label":"Save to vault"}});(0,C.setIcon)(c,"download"),c.addEventListener("click",()=>this.saveToVault(t));let d=e.createDiv("as-detail-meta-bar");d.createSpan({cls:"as-meta-item",text:t.project}),d.createSpan({cls:"as-meta-item",text:`${t.messageCount} messages`}),t.firstTimestamp&&d.createSpan({cls:"as-meta-item",text:new Date(t.firstTimestamp).toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})});let p=[...t.tags,...t.customTags];if(p.length>0){let m=e.createDiv("as-conv-detail-tags");for(let y of p){let E=t.customTags.includes(y),_=m.createSpan({cls:`as-conv-tag ${E?"as-conv-tag-custom":""}`,text:y});if(E){let V=_.createSpan("as-conv-tag-remove");(0,C.setIcon)(V,"x"),V.addEventListener("click",Z=>{Z.stopPropagation(),this.store.removeCustomTag(t.uuid,y),this.render()})}}let g=m.createSpan("as-conv-tag as-conv-tag-add");(0,C.setIcon)(g,"plus"),g.addEventListener("click",()=>this.promptAddTag(t))}}renderBody(t){let e=this.containerEl.createDiv("as-detail-body");if(this.selectedMessages.size>0){let o=e.createDiv("as-conv-selection-bar");o.createSpan({text:`${this.selectedMessages.size} message${this.selectedMessages.size>1?"s":""} selected`}),o.createEl("button",{cls:"as-conv-save-selected-btn",text:"Save selected to vault"}).addEventListener("click",()=>this.saveToVault(t))}let s=20,i=t.messages.length,a=t.messages.slice(0,this.visibleCount);for(let o=0;o{this.visibleCount+=s,this.render()}),d.createEl("button",{text:`Show all ${i} messages`,cls:"as-conv-show-all-btn"}).addEventListener("click",()=>{this.visibleCount=i,this.render()})}let r=e.createDiv("as-conv-resume-section");r.createDiv({cls:"as-section-title",text:"Resume this conversation"}),r.createEl("code",{cls:"as-conv-resume-cmd",text:`claude --resume ${t.uuid}`}).addEventListener("click",()=>{navigator.clipboard.writeText(`claude --resume ${t.uuid}`),new C.Notice("Copied!",2e3)})}renderMessage(t,e,s){let i=e.role==="human",a=t.createDiv(`as-conv-msg ${i?"as-conv-msg-human":"as-conv-msg-assistant"}`);this.selectedMessages.has(s)&&a.addClass("as-conv-msg-selected");let r=a.createDiv("as-conv-msg-header"),l=r.createSpan("as-conv-msg-role-icon");(0,C.setIcon)(l,i?"user":"bot"),r.createSpan({cls:"as-conv-msg-role",text:i?"You":"Claude"}),e.timestamp&&r.createSpan({cls:"as-conv-msg-time",text:Ci(e.timestamp)});let o=r.createSpan("as-conv-msg-select");(0,C.setIcon)(o,this.selectedMessages.has(s)?"check-square":"square"),o.setAttribute("aria-label","Select message for export"),o.addEventListener("click",p=>{p.stopPropagation(),this.selectedMessages.has(s)?this.selectedMessages.delete(s):this.selectedMessages.add(s),this.render()});let c=a.createDiv("as-conv-msg-content"),d=e.text.length>2e3&&!i?e.text.slice(0,2e3)+` -*... (truncated)*`:e.text;if(D.MarkdownRenderer.render(this.app,d,c,"",this.renderComponent),e.toolCalls&&e.toolCalls.length>0){let p=a.createDiv("as-conv-msg-tools"),h=[...new Set(e.toolCalls)];for(let m of h.slice(0,5))p.createSpan({cls:"as-conv-tool-badge",text:m});h.length>5&&p.createSpan({cls:"as-conv-tool-badge",text:`+${h.length-5}`})}}promptAddTag(t){let e=this.containerEl.querySelector(".as-conv-detail-tags");if(!e)return;let s=e.querySelector(".as-conv-tag-add");if(!s)return;let i=createEl("input",{type:"text",placeholder:"Enter tag...",cls:"as-conv-tag-input"});s.replaceWith(i),i.focus();let a=!1,r=()=>{if(a)return;a=!0;let l=i.value.trim().toLowerCase().replace(/\s+/g,"-");l&&this.store.addCustomTag(t.uuid,l),this.render()};i.addEventListener("keydown",l=>{l.key==="Enter"&&r(),l.key==="Escape"&&this.render()}),i.addEventListener("blur",r)}saveToVault(t){if(this.selectedMessages.size===0){new D.Notice("Select messages to export first",3e3);return}let e=Array.from(this.selectedMessages).sort((r,l)=>r-l).map(r=>t.messages[r]).filter(Boolean),s=hs({selectedMessages:e,conversation:t,vaultPath:this.vaultPath}),i=(0,ft.resolve)(us(t,this.vaultPath));if(!i.startsWith((0,ft.resolve)(this.vaultPath))){new D.Notice("Invalid path \u2014 cannot save outside vault",5e3);return}let a=(0,ft.dirname)(i);try{(0,ut.existsSync)(a)||(0,ut.mkdirSync)(a,{recursive:!0}),(0,ut.writeFileSync)(i,s,"utf-8"),new D.Notice(`Saved to ${i.split("/").slice(-2).join("/")}`,5e3)}catch(r){new D.Notice(`Failed to save: ${r instanceof Error?r.message:String(r)}`,5e3)}}};var bt="agentfiles-view",Bt=class extends ms.ItemView{store;settings;saveSettings;sidebarPanel;listPanel;detailPanel;dashboardPanel;marketplacePanel;conversationStore=new Rt;convListPanel;convDetailPanel;sidebarEl;listEl;detailEl;dashboardEl;marketplaceEl;convListWrapperEl;convDetailWrapperEl;skillListWrapperEl;skillDetailWrapperEl;resizeHandle1;resizeHandle2;isDashboard=!1;isMarketplace=!1;isConversations=!1;updateRef=null;convUpdateRef=null;dragCleanup=null;constructor(t,e,s,i){super(t),this.store=e,this.settings=s,this.saveSettings=i}getViewType(){return bt}getDisplayText(){return"Agentfiles"}getIcon(){return"cpu"}onOpen(){let t=this.contentEl;t.empty(),t.addClass("as-container"),this.sidebarEl=t.createDiv("as-panel as-panel-sidebar"),this.resizeHandle1=this.createResizeHandle(t,this.sidebarEl,"--as-sidebar-width",120,400),this.listEl=t.createDiv("as-panel as-panel-list"),this.resizeHandle2=this.createResizeHandle(t,this.listEl,"--as-list-width",180,600),this.detailEl=t.createDiv("as-panel as-panel-detail"),this.dashboardEl=t.createDiv("as-panel as-panel-dashboard as-hidden"),this.marketplaceEl=t.createDiv("as-panel as-panel-marketplace as-hidden"),this.skillListWrapperEl=this.listEl.createDiv("as-wrapper"),this.convListWrapperEl=this.listEl.createDiv("as-wrapper as-hidden"),this.skillDetailWrapperEl=this.detailEl.createDiv("as-wrapper"),this.convDetailWrapperEl=this.detailEl.createDiv("as-wrapper as-hidden");let e=this.app.vault.adapter.getBasePath?.()||"";this.sidebarPanel=new kt(this.sidebarEl,this.store,()=>this.toggleDashboard(),()=>this.toggleMarketplace(),()=>this.openCreateModal(),()=>this.toggleConversations(),this.conversationStore),this.listPanel=new yt(this.skillListWrapperEl,this.store,s=>this.onSelectItem(s)),this.detailPanel=new Et(this.skillDetailWrapperEl,this.store,this.settings,this.saveSettings,this),this.dashboardPanel=new Pt(this.dashboardEl,this.app),this.marketplacePanel=new $t(this.marketplaceEl,this,this.settings,()=>{this.store.refresh(this.settings)}),this.convListPanel=new Ot(this.convListWrapperEl,this.conversationStore,s=>this.onSelectConversation(s)),this.convDetailPanel=new Nt(this.convDetailWrapperEl,this.conversationStore,this.app,e),this.updateRef=this.store.on("updated",()=>this.renderAll()),this.convUpdateRef=this.conversationStore.on("conversations-updated",()=>{this.isConversations&&(this.convListPanel.render(),this.sidebarPanel.render())}),this.renderAll(),this.store.revalidate()}hideAllSpecialPanels(){this.listEl.addClass("as-hidden"),this.detailEl.addClass("as-hidden"),this.resizeHandle1.addClass("as-hidden"),this.resizeHandle2.addClass("as-hidden"),this.dashboardEl.addClass("as-hidden"),this.marketplaceEl.addClass("as-hidden")}showDefaultPanels(){this.listEl.removeClass("as-hidden"),this.detailEl.removeClass("as-hidden"),this.resizeHandle1.removeClass("as-hidden"),this.resizeHandle2.removeClass("as-hidden")}showSkillPanels(){this.skillListWrapperEl.removeClass("as-hidden"),this.skillDetailWrapperEl.removeClass("as-hidden"),this.convListWrapperEl.addClass("as-hidden"),this.convDetailWrapperEl.addClass("as-hidden")}showConversationPanels(){this.skillListWrapperEl.addClass("as-hidden"),this.skillDetailWrapperEl.addClass("as-hidden"),this.convListWrapperEl.removeClass("as-hidden"),this.convDetailWrapperEl.removeClass("as-hidden")}toggleDashboard(){this.dragCleanup?.(),this.dragCleanup=null,this.isDashboard=!this.isDashboard,this.isMarketplace=!1,this.isConversations=!1,this.hideAllSpecialPanels(),this.isDashboard?(this.dashboardEl.removeClass("as-hidden"),this.dashboardPanel.render()):(this.showDefaultPanels(),this.showSkillPanels()),this.sidebarPanel.setDashboardActive(this.isDashboard),this.sidebarPanel.setMarketplaceActive(!1),this.sidebarPanel.setConversationsActive(!1),this.sidebarPanel.render()}toggleMarketplace(){this.dragCleanup?.(),this.dragCleanup=null,this.isMarketplace=!this.isMarketplace,this.isDashboard=!1,this.isConversations=!1,this.hideAllSpecialPanels(),this.isMarketplace?(this.marketplaceEl.removeClass("as-hidden"),this.marketplacePanel.render()):(this.showDefaultPanels(),this.showSkillPanels()),this.sidebarPanel.setMarketplaceActive(this.isMarketplace),this.sidebarPanel.setDashboardActive(!1),this.sidebarPanel.setConversationsActive(!1),this.sidebarPanel.render()}toggleConversations(){this.dragCleanup?.(),this.dragCleanup=null,this.isConversations=!this.isConversations,this.isDashboard=!1,this.isMarketplace=!1,this.hideAllSpecialPanels(),this.isConversations?(this.showDefaultPanels(),this.showConversationPanels(),this.conversationStore.refresh(),this.convListPanel.render(),this.convDetailPanel.clear()):(this.showDefaultPanels(),this.showSkillPanels()),this.sidebarPanel.setConversationsActive(this.isConversations),this.sidebarPanel.setDashboardActive(!1),this.sidebarPanel.setMarketplaceActive(!1),this.sidebarPanel.render()}renderAll(){this.sidebarPanel.render(),!this.isDashboard&&!this.isMarketplace&&!this.isConversations&&(this.listPanel.render(),this.store.filteredItems.length||this.detailPanel.clear())}openCreateModal(){new jt(this.app,t=>{this.store.refresh(this.settings),setTimeout(()=>{let e=this.store.allItems.find(s=>s.filePath===t||s.realPath===t);e&&this.onSelectItem(e)},100)}).open()}onSelectItem(t){this.isDashboard&&this.toggleDashboard(),this.isMarketplace&&this.toggleMarketplace(),this.isConversations&&this.toggleConversations(),this.listPanel.setSelected(t.id),this.listPanel.render(),this.detailPanel.show(t)}onSelectConversation(t){this.convListPanel.setSelected(t.uuid),this.convListPanel.render(),this.convDetailPanel.show(t)}createResizeHandle(t,e,s,i,a){let r=t.createDiv("as-resize-handle"),l=0,o=0,c=p=>{let h=Math.min(a,Math.max(i,o+(p.clientX-l)));t.style.setProperty(s,`${h}px`)},d=()=>{r.removeClass("is-dragging"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",d),this.dragCleanup=null};return r.addEventListener("mousedown",p=>{p.preventDefault(),l=p.clientX,o=parseInt(t.style.getPropertyValue(s))||e.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),this.convUpdateRef&&this.conversationStore.offref(this.convUpdateRef)}};var gs=require("obsidian"),zt=require("path"),ht=require("fs"),vs=require("os");var be=(0,zt.join)((0,vs.homedir)(),".skillkit","enrichment-cache.json");function Ei(){if(!(0,ht.existsSync)(be))return null;try{return JSON.parse((0,ht.readFileSync)(be,"utf-8"))}catch{return null}}function xi(n){try{(0,ht.writeFileSync)(be,JSON.stringify(n),"utf-8")}catch{}}var Wt=class extends gs.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 t=this.allItems;switch(this._filter.kind){case"favorites":t=t.filter(e=>e.isFavorite);break;case"tool":t=t.filter(e=>e.tools.includes(this._filter.toolId));break;case"type":t=t.filter(e=>e.type===this._filter.type);break;case"collection":t=t.filter(e=>e.collections.includes(this._filter.name));break;case"project":t=t.filter(e=>re(e.filePath,this._projectsHomeDir)===this._filter.project);break}if(this._searchQuery){let e=this._searchQuery.toLowerCase(),s=this._deepSearch&&(this._deepSearchScope==="description"||this._deepSearchScope==="both"),i=this._deepSearch&&(this._deepSearchScope==="content"||this._deepSearchScope==="both");t=t.filter(a=>a.name.toLowerCase().includes(e)||s&&a.description.toLowerCase().includes(e)||i&&a.content.toLowerCase().includes(e))}return t.sort((e,s)=>e.name.localeCompare(s.name))}getItem(t){return this.items.get(t)}get hasSkillkit(){return $()}_enrichGeneration=0;refresh(t){this._projectsHomeDir=t.projectsHomeDir,this.items=Xe(t),$()&&this.applyEnrichmentFromCache(),this.trigger("updated")}revalidate(){$()&&this.revalidateAsync()}applyEnrichmentFromCache(){let t=Ei();if(!t)return;let e=new Map(Object.entries(t.stats)),s=new Map(Object.entries(t.conflicts));this.applyEnrichment(e,s,t.warnings)}async revalidateAsync(){let t=++this._enrichGeneration,[e,s,i]=await Promise.all([Ee(),xe(),Te()]);t===this._enrichGeneration&&(this.applyEnrichment(e,s,i),this.trigger("updated"),xi({stats:Object.fromEntries(e),conflicts:Object.fromEntries(s),warnings:i}))}applyEnrichment(t,e,s){let 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(zt.sep).slice(-2,-1)[0],d=o.name.toLowerCase().replace(/\s+/g,"-"),p=t.get(o.name)||t.get(c)||t.get(d);p?(p.isHeavy=o.content.length>5e3,o.usage=p):o.usage={uses:0,lastUsed:null,daysSinceUsed:null,isStale:!0,isHeavy:o.content.length>5e3};let h=o.content.split(` -`).length,m=o.description.length;o.warnings={oversized:i.has(o.name)||h>500,longDesc:a.has(o.name)||m>1024,lineCount:r.get(o.name)??h,descChars:l.get(o.name)??m},o.conflicts=e.get(o.name)||e.get(c)||[]}}setFilter(t){this._filter=t,this.trigger("updated")}setSearch(t){this._searchQuery=t,this.trigger("updated")}setDeepSearch(t){this._deepSearch!==t&&(this._deepSearch=t,this.trigger("updated"))}setDeepSearchScope(t){this._deepSearchScope!==t&&(this._deepSearchScope=t,this.trigger("updated"))}toggleFavorite(t,e){let s=this.items.get(t);s&&(s.isFavorite=!s.isFavorite,s.isFavorite?e.favorites.includes(t)||e.favorites.push(t):e.favorites=e.favorites.filter(i=>i!==t),this.trigger("updated"))}getToolCounts(){let t=new Map;for(let e of this.items.values())for(let s of e.tools)t.set(s,(t.get(s)||0)+1);return t}getTypeCounts(){let t=new Map;for(let e of this.items.values())t.set(e.type,(t.get(e.type)||0)+1);return t}getProjectCounts(){let t=new Map;for(let e of this.items.values()){let s=re(e.filePath,this._projectsHomeDir);t.set(s,(t.get(s)||0)+1)}return t}};var fs=require("fs"),Ut=class{watchers=[];debounceTimer=null;debounceMs;onChange;constructor(t,e){this.debounceMs=t,this.onChange=e}watchPaths(t){this.close();for(let e of t)try{let s=(0,fs.watch)(e,{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 t of this.watchers)try{t.close()}catch{}this.watchers=[]}};var P=require("obsidian");var Vt=class extends P.PluginSettingTab{plugin;constructor(t,e){super(t,e),this.plugin=e}display(){let{containerEl:t}=this;t.empty(),new P.Setting(t).setName("File watching").setDesc("Automatically detect changes to skill files").addToggle(e=>e.setValue(this.plugin.settings.watchEnabled).onChange(async s=>{this.plugin.settings.watchEnabled=s,await this.plugin.saveSettings(),this.plugin.restartWatcher()})),new P.Setting(t).setName("Watch debounce (ms)").setDesc("Delay before re-scanning after file changes").addText(e=>e.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 P.Setting(t).setName("Display names").setDesc("How skill and command names are displayed in the list").addDropdown(e=>e.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 P.Setting(t).setName("Deep search by default").setDesc("Enable deep search when the view opens (can always be toggled in the search bar)").addToggle(e=>e.setValue(this.plugin.settings.deepSearchDefault??!1).onChange(async s=>{this.plugin.settings.deepSearchDefault=s,await this.plugin.saveSettings()})),new P.Setting(t).setName("Deep search scope").setDesc("What to include when deep search is enabled").addDropdown(e=>e.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 P.Setting(t).setName("Marketplace").setHeading(),new P.Setting(t).setName("Package runner").setDesc("Command used to install skills from the marketplace").addDropdown(e=>e.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 P.Setting(t).setName("Project scanning").setHeading(),new P.Setting(t).setName("Scan projects").setDesc("Scan all directories under the projects home folder for project-level skills").addToggle(e=>e.setValue(this.plugin.settings.projectScanEnabled).onChange(async s=>{this.plugin.settings.projectScanEnabled=s,await this.plugin.saveSettings(),this.plugin.refreshStore(),this.plugin.restartWatcher()})),new P.Setting(t).setName("Projects home directory").setDesc("Root directory to scan for project-level skills. Leave empty for home directory (~).").addText(e=>e.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 P.Setting(t).setName("Tools").setHeading();for(let e of T){let s=e.isInstalled(),i=this.plugin.settings.tools[e.id]||{enabled:!0,customPaths:[]};new P.Setting(t).setName(e.name).setDesc(s?"Installed":"Not detected").addToggle(a=>a.setValue(s&&i.enabled).setDisabled(!s).onChange(async r=>{this.plugin.settings.tools[e.id]={...i,enabled:r},await this.plugin.saveSettings(),this.plugin.refreshStore()}))}}};var Gt=class extends bs.Plugin{settings=ue;store=new Wt;watcher=null;async onload(){await this.loadSettings(),this.addVaultPath(),this.registerView(bt,t=>new Bt(t,this.store,this.settings,()=>this.saveSettings())),this.addRibbonIcon("cpu","Agentfiles",()=>this.activateView()),this.addCommand({id:"open",name:"Open",callback:()=>this.activateView()}),this.addSettingTab(new Vt(this.app,this)),this.store.setDeepSearch(this.settings.deepSearchDefault??!1),this.store.setDeepSearchScope(this.settings.deepSearchScope??"both"),setTimeout(()=>{this.refreshStore(),this.startWatcher()},0)}addVaultPath(){let t=this.app.vault.adapter;if(!t.getBasePath)return;let e=t.getBasePath();this.settings.customScanPaths.includes(e)||this.settings.customScanPaths.push(e)}onunload(){this.stopWatcher()}refreshStore(){this.store.refresh(this.settings)}startWatcher(){this.settings.watchEnabled&&(this.watcher=new Ut(this.settings.watchDebounceMs,()=>this.refreshStore()),this.watcher.watchPaths(Ye(this.settings)))}stopWatcher(){this.watcher&&(this.watcher.close(),this.watcher=null)}restartWatcher(){this.stopWatcher(),this.startWatcher()}async activateView(){let t=this.app.workspace.getLeavesOfType(bt);if(t.length>0){await this.app.workspace.revealLeaf(t[0]);return}let e=this.app.workspace.getLeaf("tab");await e.setViewState({type:bt,active:!0}),await this.app.workspace.revealLeaf(e)}async loadSettings(){this.settings=Object.assign({},ue,await this.loadData())}async saveSettings(){await this.saveData(this.settings)}}; +*... (truncated)*`:e.text;if(C.MarkdownRenderer.render(this.app,d,c,"",this.renderComponent),e.toolCalls&&e.toolCalls.length>0){let p=a.createDiv("as-conv-msg-tools"),m=[...new Set(e.toolCalls)];for(let g of m.slice(0,5))p.createSpan({cls:"as-conv-tool-badge",text:g});m.length>5&&p.createSpan({cls:"as-conv-tool-badge",text:`+${m.length-5}`})}}promptAddTag(t){let e=this.containerEl.querySelector(".as-conv-detail-tags");if(!e)return;let s=e.querySelector(".as-conv-tag-add");if(!s)return;let i=createEl("input",{type:"text",placeholder:"Enter tag...",cls:"as-conv-tag-input"});s.replaceWith(i),i.focus();let a=!1,r=()=>{if(a)return;a=!0;let l=i.value.trim().toLowerCase().replace(/\s+/g,"-");l&&this.store.addCustomTag(t.uuid,l),this.render()};i.addEventListener("keydown",l=>{l.key==="Enter"&&r(),l.key==="Escape"&&this.render()}),i.addEventListener("blur",r)}saveToVault(t){if(this.selectedMessages.size===0){new C.Notice("Select messages to export first",3e3);return}let e=Array.from(this.selectedMessages).sort((r,l)=>r-l).map(r=>t.messages[r]).filter(Boolean),s=ms({selectedMessages:e,conversation:t,vaultPath:this.vaultPath}),i=(0,ft.resolve)(hs(t,this.vaultPath));if(!i.startsWith((0,ft.resolve)(this.vaultPath))){new C.Notice("Invalid path \u2014 cannot save outside vault",5e3);return}let a=(0,ft.dirname)(i);try{(0,ut.existsSync)(a)||(0,ut.mkdirSync)(a,{recursive:!0}),(0,ut.writeFileSync)(i,s,"utf-8"),new C.Notice(`Saved to ${i.split("/").slice(-2).join("/")}`,5e3)}catch(r){new C.Notice(`Failed to save: ${r instanceof Error?r.message:String(r)}`,5e3)}}};var bt="agentfiles-view",Bt=class extends gs.ItemView{store;settings;saveSettings;sidebarPanel;listPanel;detailPanel;dashboardPanel;marketplacePanel;conversationStore=new Rt;convListPanel;convDetailPanel;sidebarEl;listEl;detailEl;dashboardEl;marketplaceEl;convListWrapperEl;convDetailWrapperEl;skillListWrapperEl;skillDetailWrapperEl;resizeHandle1;resizeHandle2;isDashboard=!1;isMarketplace=!1;isConversations=!1;updateRef=null;convUpdateRef=null;dragCleanup=null;constructor(t,e,s,i){super(t),this.store=e,this.settings=s,this.saveSettings=i}getViewType(){return bt}getDisplayText(){return"Agentfiles"}getIcon(){return"cpu"}onOpen(){let t=this.contentEl;t.empty(),t.addClass("as-container"),this.sidebarEl=t.createDiv("as-panel as-panel-sidebar"),this.resizeHandle1=this.createResizeHandle(t,this.sidebarEl,"--as-sidebar-width",120,400),this.listEl=t.createDiv("as-panel as-panel-list"),this.resizeHandle2=this.createResizeHandle(t,this.listEl,"--as-list-width",180,600),this.detailEl=t.createDiv("as-panel as-panel-detail"),this.dashboardEl=t.createDiv("as-panel as-panel-dashboard as-hidden"),this.marketplaceEl=t.createDiv("as-panel as-panel-marketplace as-hidden"),this.skillListWrapperEl=this.listEl.createDiv("as-wrapper"),this.convListWrapperEl=this.listEl.createDiv("as-wrapper as-hidden"),this.skillDetailWrapperEl=this.detailEl.createDiv("as-wrapper"),this.convDetailWrapperEl=this.detailEl.createDiv("as-wrapper as-hidden");let e=this.app.vault.adapter.getBasePath?.()||"";this.sidebarPanel=new kt(this.sidebarEl,this.store,()=>this.toggleDashboard(),()=>this.toggleMarketplace(),()=>this.openCreateModal(),()=>this.toggleConversations(),this.conversationStore),this.listPanel=new yt(this.skillListWrapperEl,this.store,s=>this.onSelectItem(s)),this.detailPanel=new Et(this.skillDetailWrapperEl,this.store,this.settings,this.saveSettings,this),this.dashboardPanel=new Pt(this.dashboardEl,this.app),this.marketplacePanel=new $t(this.marketplaceEl,this,this.settings,()=>{this.store.refresh(this.settings)}),this.convListPanel=new Ot(this.convListWrapperEl,this.conversationStore,s=>this.onSelectConversation(s)),this.convDetailPanel=new Nt(this.convDetailWrapperEl,this.conversationStore,this.app,e),this.updateRef=this.store.on("updated",()=>this.renderAll()),this.convUpdateRef=this.conversationStore.on("conversations-updated",()=>{this.isConversations&&(this.convListPanel.render(),this.sidebarPanel.render())}),this.renderAll(),this.store.revalidate()}hideAllSpecialPanels(){this.listEl.addClass("as-hidden"),this.detailEl.addClass("as-hidden"),this.resizeHandle1.addClass("as-hidden"),this.resizeHandle2.addClass("as-hidden"),this.dashboardEl.addClass("as-hidden"),this.marketplaceEl.addClass("as-hidden")}showDefaultPanels(){this.listEl.removeClass("as-hidden"),this.detailEl.removeClass("as-hidden"),this.resizeHandle1.removeClass("as-hidden"),this.resizeHandle2.removeClass("as-hidden")}showSkillPanels(){this.skillListWrapperEl.removeClass("as-hidden"),this.skillDetailWrapperEl.removeClass("as-hidden"),this.convListWrapperEl.addClass("as-hidden"),this.convDetailWrapperEl.addClass("as-hidden")}showConversationPanels(){this.skillListWrapperEl.addClass("as-hidden"),this.skillDetailWrapperEl.addClass("as-hidden"),this.convListWrapperEl.removeClass("as-hidden"),this.convDetailWrapperEl.removeClass("as-hidden")}toggleDashboard(){this.dragCleanup?.(),this.dragCleanup=null,this.isDashboard=!this.isDashboard,this.isMarketplace=!1,this.isConversations=!1,this.hideAllSpecialPanels(),this.isDashboard?(this.dashboardEl.removeClass("as-hidden"),this.dashboardPanel.render()):(this.showDefaultPanels(),this.showSkillPanels()),this.sidebarPanel.setDashboardActive(this.isDashboard),this.sidebarPanel.setMarketplaceActive(!1),this.sidebarPanel.setConversationsActive(!1),this.sidebarPanel.render()}toggleMarketplace(){this.dragCleanup?.(),this.dragCleanup=null,this.isMarketplace=!this.isMarketplace,this.isDashboard=!1,this.isConversations=!1,this.hideAllSpecialPanels(),this.isMarketplace?(this.marketplaceEl.removeClass("as-hidden"),this.marketplacePanel.render()):(this.showDefaultPanels(),this.showSkillPanels()),this.sidebarPanel.setMarketplaceActive(this.isMarketplace),this.sidebarPanel.setDashboardActive(!1),this.sidebarPanel.setConversationsActive(!1),this.sidebarPanel.render()}toggleConversations(){this.dragCleanup?.(),this.dragCleanup=null,this.isConversations=!this.isConversations,this.isDashboard=!1,this.isMarketplace=!1,this.hideAllSpecialPanels(),this.isConversations?(this.showDefaultPanels(),this.showConversationPanels(),this.conversationStore.refresh(),this.convListPanel.render(),this.convDetailPanel.clear()):(this.showDefaultPanels(),this.showSkillPanels()),this.sidebarPanel.setConversationsActive(this.isConversations),this.sidebarPanel.setDashboardActive(!1),this.sidebarPanel.setMarketplaceActive(!1),this.sidebarPanel.render()}renderAll(){this.sidebarPanel.render(),!this.isDashboard&&!this.isMarketplace&&!this.isConversations&&(this.listPanel.render(),this.store.filteredItems.length||this.detailPanel.clear())}openCreateModal(){new Ht(this.app,t=>{this.store.refresh(this.settings),setTimeout(()=>{let e=this.store.allItems.find(s=>s.filePath===t||s.realPath===t);e&&this.onSelectItem(e)},100)}).open()}onSelectItem(t){this.isDashboard&&this.toggleDashboard(),this.isMarketplace&&this.toggleMarketplace(),this.isConversations&&this.toggleConversations(),this.listPanel.setSelected(t.id),this.listPanel.render(),this.detailPanel.show(t)}onSelectConversation(t){this.convListPanel.setSelected(t.uuid),this.convListPanel.render(),this.convDetailPanel.show(t)}createResizeHandle(t,e,s,i,a){let r=t.createDiv("as-resize-handle"),l=0,o=0,c=p=>{let m=Math.min(a,Math.max(i,o+(p.clientX-l)));t.style.setProperty(s,`${m}px`)},d=()=>{r.removeClass("is-dragging"),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",d),this.dragCleanup=null};return r.addEventListener("mousedown",p=>{p.preventDefault(),l=p.clientX,o=parseInt(t.style.getPropertyValue(s))||e.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),this.convUpdateRef&&this.conversationStore.offref(this.convUpdateRef)}};var vs=require("obsidian"),zt=require("path"),ht=require("fs"),fs=require("os");var Se=(0,zt.join)((0,fs.homedir)(),".skillkit","enrichment-cache.json");function Ei(){if(!(0,ht.existsSync)(Se))return null;try{return JSON.parse((0,ht.readFileSync)(Se,"utf-8"))}catch{return null}}function xi(n){try{(0,ht.writeFileSync)(Se,JSON.stringify(n),"utf-8")}catch{}}var Wt=class extends vs.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 t=this.allItems;switch(this._filter.kind){case"favorites":t=t.filter(e=>e.isFavorite);break;case"tool":t=t.filter(e=>e.tools.includes(this._filter.toolId));break;case"type":t=t.filter(e=>e.type===this._filter.type);break;case"collection":t=t.filter(e=>e.collections.includes(this._filter.name));break;case"project":t=t.filter(e=>oe(e.filePath,this._projectsHomeDir)===this._filter.project);break}if(this._searchQuery){let e=this._searchQuery.toLowerCase(),s=this._deepSearch&&(this._deepSearchScope==="description"||this._deepSearchScope==="both"),i=this._deepSearch&&(this._deepSearchScope==="content"||this._deepSearchScope==="both");t=t.filter(a=>a.name.toLowerCase().includes(e)||s&&a.description.toLowerCase().includes(e)||i&&a.content.toLowerCase().includes(e))}return t.sort((e,s)=>e.name.localeCompare(s.name))}getItem(t){return this.items.get(t)}get hasSkillkit(){return $()}_enrichGeneration=0;refresh(t){this._projectsHomeDir=t.projectsHomeDir,this.items=Ye(t),$()&&this.applyEnrichmentFromCache(),this.trigger("updated")}revalidate(){$()&&this.revalidateAsync()}applyEnrichmentFromCache(){let t=Ei();if(!t)return;let e=new Map(Object.entries(t.stats)),s=new Map(Object.entries(t.conflicts));this.applyEnrichment(e,s,t.warnings)}async revalidateAsync(){let t=++this._enrichGeneration,[e,s,i]=await Promise.all([xe(),Te(),Le()]);t===this._enrichGeneration&&(this.applyEnrichment(e,s,i),this.trigger("updated"),xi({stats:Object.fromEntries(e),conflicts:Object.fromEntries(s),warnings:i}))}applyEnrichment(t,e,s){let 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(zt.sep).slice(-2,-1)[0],d=o.name.toLowerCase().replace(/\s+/g,"-"),p=t.get(o.name)||t.get(c)||t.get(d);p?(p.isHeavy=o.content.length>5e3,o.usage=p):o.usage={uses:0,lastUsed:null,daysSinceUsed:null,isStale:!0,isHeavy:o.content.length>5e3};let m=o.content.split(` +`).length,g=o.description.length;o.warnings={oversized:i.has(o.name)||m>500,longDesc:a.has(o.name)||g>1024,lineCount:r.get(o.name)??m,descChars:l.get(o.name)??g},o.conflicts=e.get(o.name)||e.get(c)||[]}}setFilter(t){this._filter=t,this.trigger("updated")}setSearch(t){this._searchQuery=t,this.trigger("updated")}setDeepSearch(t){this._deepSearch!==t&&(this._deepSearch=t,this.trigger("updated"))}setDeepSearchScope(t){this._deepSearchScope!==t&&(this._deepSearchScope=t,this.trigger("updated"))}toggleFavorite(t,e){let s=this.items.get(t);s&&(s.isFavorite=!s.isFavorite,s.isFavorite?e.favorites.includes(t)||e.favorites.push(t):e.favorites=e.favorites.filter(i=>i!==t),this.trigger("updated"))}getToolCounts(){let t=new Map;for(let e of this.items.values())for(let s of e.tools)t.set(s,(t.get(s)||0)+1);return t}getTypeCounts(){let t=new Map;for(let e of this.items.values())t.set(e.type,(t.get(e.type)||0)+1);return t}getProjectCounts(){let t=new Map;for(let e of this.items.values()){let s=oe(e.filePath,this._projectsHomeDir);t.set(s,(t.get(s)||0)+1)}return t}};var bs=require("fs"),Ut=class{watchers=[];debounceTimer=null;debounceMs;onChange;constructor(t,e){this.debounceMs=t,this.onChange=e}watchPaths(t){this.close();for(let e of t)try{let s=(0,bs.watch)(e,{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 t of this.watchers)try{t.close()}catch{}this.watchers=[]}};var P=require("obsidian");var Vt=class extends P.PluginSettingTab{plugin;constructor(t,e){super(t,e),this.plugin=e}display(){let{containerEl:t}=this;t.empty(),new P.Setting(t).setName("File watching").setDesc("Automatically detect changes to skill files").addToggle(e=>e.setValue(this.plugin.settings.watchEnabled).onChange(async s=>{this.plugin.settings.watchEnabled=s,await this.plugin.saveSettings(),this.plugin.restartWatcher()})),new P.Setting(t).setName("Watch debounce (ms)").setDesc("Delay before re-scanning after file changes").addText(e=>e.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 P.Setting(t).setName("Display names").setDesc("How skill and command names are displayed in the list").addDropdown(e=>e.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 P.Setting(t).setName("Deep search by default").setDesc("Enable deep search when the view opens (can always be toggled in the search bar)").addToggle(e=>e.setValue(this.plugin.settings.deepSearchDefault??!1).onChange(async s=>{this.plugin.settings.deepSearchDefault=s,await this.plugin.saveSettings()})),new P.Setting(t).setName("Deep search scope").setDesc("What to include when deep search is enabled").addDropdown(e=>e.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 P.Setting(t).setName("Marketplace").setHeading(),new P.Setting(t).setName("Package runner").setDesc("Command used to install skills from the marketplace").addDropdown(e=>e.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 P.Setting(t).setName("Project scanning").setHeading(),new P.Setting(t).setName("Scan projects").setDesc("Scan all directories under the projects home folder for project-level skills").addToggle(e=>e.setValue(this.plugin.settings.projectScanEnabled).onChange(async s=>{this.plugin.settings.projectScanEnabled=s,await this.plugin.saveSettings(),this.plugin.refreshStore(),this.plugin.restartWatcher()})),new P.Setting(t).setName("Projects home directory").setDesc("Root directory to scan for project-level skills. Leave empty for home directory (~).").addText(e=>e.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 P.Setting(t).setName("Tools").setHeading();for(let e of T){let s=e.isInstalled(),i=this.plugin.settings.tools[e.id]||{enabled:!0,customPaths:[]};new P.Setting(t).setName(e.name).setDesc(s?"Installed":"Not detected").addToggle(a=>a.setValue(s&&i.enabled).setDisabled(!s).onChange(async r=>{this.plugin.settings.tools[e.id]={...i,enabled:r},await this.plugin.saveSettings(),this.plugin.refreshStore()}))}}};var Gt=class extends Ss.Plugin{settings=he;store=new Wt;watcher=null;async onload(){await this.loadSettings(),this.addVaultPath(),this.registerView(bt,t=>new Bt(t,this.store,this.settings,()=>this.saveSettings())),this.addRibbonIcon("cpu","Agentfiles",()=>this.activateView()),this.addCommand({id:"open",name:"Open",callback:()=>this.activateView()}),this.addSettingTab(new Vt(this.app,this)),this.store.setDeepSearch(this.settings.deepSearchDefault??!1),this.store.setDeepSearchScope(this.settings.deepSearchScope??"both"),setTimeout(()=>{this.refreshStore(),this.startWatcher()},0)}addVaultPath(){let t=this.app.vault.adapter;if(!t.getBasePath)return;let e=t.getBasePath();this.settings.customScanPaths.includes(e)||this.settings.customScanPaths.push(e)}onunload(){this.stopWatcher()}refreshStore(){this.store.refresh(this.settings)}startWatcher(){this.settings.watchEnabled&&(this.watcher=new Ut(this.settings.watchDebounceMs,()=>this.refreshStore()),this.watcher.watchPaths(ts(this.settings)))}stopWatcher(){this.watcher&&(this.watcher.close(),this.watcher=null)}restartWatcher(){this.stopWatcher(),this.startWatcher()}async activateView(){let t=this.app.workspace.getLeavesOfType(bt);if(t.length>0){await this.app.workspace.revealLeaf(t[0]);return}let e=this.app.workspace.getLeaf("tab");await e.setViewState({type:bt,active:!0}),await this.app.workspace.revealLeaf(e)}async loadSettings(){this.settings=Object.assign({},he,await this.loadData())}async saveSettings(){await this.saveData(this.settings)}}; diff --git a/src/skillkit.ts b/src/skillkit.ts index fadc3cd..8830b44 100644 --- a/src/skillkit.ts +++ b/src/skillkit.ts @@ -42,6 +42,13 @@ function buildPath(): string { "/opt/homebrew/bin", join(HOME, ".local", "bin"), join(HOME, ".bun", "bin"), + join(HOME, ".local", "share", "pnpm"), // pnpm global bin + join(HOME, ".volta", "bin"), // Volta + join(HOME, ".yarn", "bin"), // Yarn classic + join(HOME, ".config", "yarn", "global", "node_modules", ".bin"), // Yarn modern + join(HOME, ".fnm", "aliases", "default", "bin"), // fnm + join(HOME, ".asdf", "shims"), // asdf + join(HOME, ".proto", "bin"), // proto ); } const nvmDir = IS_WIN @@ -95,6 +102,13 @@ function findSkillkitBin(): string | null { join(HOME, ".local", "bin"), join(HOME, ".bun", "bin"), join(HOME, ".local", "share", "mise", "shims"), + join(HOME, ".local", "share", "pnpm"), // pnpm global bin + join(HOME, ".volta", "bin"), // Volta + join(HOME, ".yarn", "bin"), // Yarn classic + join(HOME, ".config", "yarn", "global", "node_modules", ".bin"), // Yarn modern + join(HOME, ".fnm", "aliases", "default", "bin"), // fnm + join(HOME, ".asdf", "shims"), // asdf + join(HOME, ".proto", "bin"), // proto ); } for (const dir of searchDirs) { @@ -126,6 +140,32 @@ function findSkillkitBin(): string | null { } catch { /* empty */ } } } + // Dynamic fallback: only runs when static paths found no candidates, + // so the common case stays zero-cost (no child processes spawned). + // Each command queries a package manager for its global bin directory. + // Returns immediately once a valid crafter skillkit binary is found. + if (candidates.length === 0 && !IS_WIN) { + const dynamicCmds = [ + ["pnpm", "bin", "-g"], // pnpm global bin directory + ["yarn", "global", "bin"], // yarn global bin directory + ["npm", "bin", "-g"], // npm global bin directory + ]; + for (const args of dynamicCmds) { + try { + const dir = execSync(args.join(" "), { + encoding: "utf-8", + timeout: 5000, + stdio: ["pipe", "pipe", "pipe"], + }).trim(); + if (dir) { + for (const bin of BIN_NAMES) { + const p = join(dir, bin); + if (existsSync(p) && isCrafterSkillkit(p)) return p; + } + } + } catch { /* command not available — skip to next */ } + } + } for (const c of candidates) { if (isCrafterSkillkit(c)) return c; }