vskill 1.0.15 → 1.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/agents.json +1 -1
  2. package/dist/agents/agents-registry.d.ts +8 -3
  3. package/dist/agents/agents-registry.js.map +1 -1
  4. package/dist/eval-server/api-routes.js +189 -4
  5. package/dist/eval-server/api-routes.js.map +1 -1
  6. package/dist/eval-server/eval-server.js +8 -1
  7. package/dist/eval-server/eval-server.js.map +1 -1
  8. package/dist/eval-server/install-state-routes.d.ts +21 -0
  9. package/dist/eval-server/install-state-routes.js +111 -0
  10. package/dist/eval-server/install-state-routes.js.map +1 -0
  11. package/dist/eval-ui/assets/{CreateSkillPage-BmbvQEzE.js → CreateSkillPage-CvdYq8Rr.js} +5 -5
  12. package/dist/eval-ui/assets/{FindSkillsPalette-D0Zjhm31.js → FindSkillsPalette-DsSgotS9.js} +2 -2
  13. package/dist/eval-ui/assets/{SearchPaletteCore-EhcN1xEa.js → SearchPaletteCore-Bf3PBC64.js} +2 -2
  14. package/dist/eval-ui/assets/SkillDetailPanel-DAD2yJO-.js +1 -0
  15. package/dist/eval-ui/assets/{UpdateDropdown-Celf0_Cr.js → UpdateDropdown-h5Hg3h7Z.js} +1 -1
  16. package/dist/eval-ui/assets/index-JaDg6FlU.js +124 -0
  17. package/dist/eval-ui/index.html +1 -1
  18. package/dist/installer/canonical.js +2 -11
  19. package/dist/installer/canonical.js.map +1 -1
  20. package/dist/installer/frontmatter.js +1 -1
  21. package/dist/installer/frontmatter.js.map +1 -1
  22. package/dist/studio/lib/provenance.js +3 -2
  23. package/dist/studio/lib/provenance.js.map +1 -1
  24. package/dist/studio/lib/query.d.ts +1 -0
  25. package/dist/studio/lib/query.js +7 -0
  26. package/dist/studio/lib/query.js.map +1 -0
  27. package/dist/studio/lib/scope-transfer.d.ts +6 -0
  28. package/dist/studio/lib/scope-transfer.js +5 -2
  29. package/dist/studio/lib/scope-transfer.js.map +1 -1
  30. package/dist/studio/routes/index.js +3 -0
  31. package/dist/studio/routes/index.js.map +1 -1
  32. package/dist/studio/routes/ops.js +1 -3
  33. package/dist/studio/routes/ops.js.map +1 -1
  34. package/dist/studio/routes/promote.js +1 -3
  35. package/dist/studio/routes/promote.js.map +1 -1
  36. package/dist/studio/routes/revert.js +2 -17
  37. package/dist/studio/routes/revert.js.map +1 -1
  38. package/dist/studio/routes/test-install.js +1 -3
  39. package/dist/studio/routes/test-install.js.map +1 -1
  40. package/dist/utils/skill-builder-detection.d.ts +14 -1
  41. package/dist/utils/skill-builder-detection.js +20 -8
  42. package/dist/utils/skill-builder-detection.js.map +1 -1
  43. package/dist/utils/skill-creator-detection.d.ts +10 -2
  44. package/dist/utils/skill-creator-detection.js +12 -43
  45. package/dist/utils/skill-creator-detection.js.map +1 -1
  46. package/package.json +1 -1
  47. package/dist/eval-ui/assets/SkillDetailPanel-B5J60ffv.js +0 -1
  48. package/dist/eval-ui/assets/index-BV7k6fdk.js +0 -124
@@ -0,0 +1 @@
1
+ import{j as t,r as d,a as G,T as ae}from"./index-JaDg6FlU.js";import{s as V}from"./skill-url-C4ekwoGs.js";/* empty css */const X={T0:{label:"BLOCKED",cssVar:"var(--trust-t0)"},T1:{label:"UNSCANNED",cssVar:"var(--trust-t1)"},T2:{label:"BASIC",cssVar:"var(--trust-t2)"},T3:{label:"VERIFIED",cssVar:"var(--trust-t3)"},T4:{label:"CERTIFIED",cssVar:"var(--trust-t4)"}};function ce({tier:r}){const l=X[r]??X.T1;return t.jsxs("span",{"data-testid":"trust-badge","data-tier":r,style:{display:"inline-flex",alignItems:"center",gap:"0.3rem",padding:"0.15rem 0.5rem",borderRadius:"4px",fontFamily:"var(--font-geist-mono)",fontSize:"0.6875rem",fontWeight:600,letterSpacing:"0.03em",textTransform:"uppercase",whiteSpace:"nowrap",color:l.cssVar,backgroundColor:`color-mix(in srgb, ${l.cssVar} 10%, transparent)`,border:`1px solid color-mix(in srgb, ${l.cssVar} 25%, transparent)`,lineHeight:1,height:"22px"},children:[r," ",l.label]})}const de=/^https?:\/\/github\.com\/([a-zA-Z0-9_.-]+)\/([a-zA-Z0-9_.-]+?)(\.git)?(\/.*)?$/;function ue(r){var h,E;const c=r.trim().match(de);if(!c)return null;const u=(h=c[1])==null?void 0:h.toLowerCase();let s=(E=c[2])==null?void 0:E.toLowerCase();if(!u||!s)return null;s=s.replace(/\.git$/,"");const m=`https://github.com/${u}/${s}`;return{owner:u,name:s,url:m}}function fe({repoUrl:r,mono:l="var(--font-geist-mono)",fontSize:c="0.75rem",showPlaceholder:u=!0}){if(!r)return u?t.jsx("span",{style:{color:"var(--text-faint)",fontSize:c},children:"--"}):null;const s=ue(r);return s?t.jsxs("a",{"data-testid":"repo-link",href:s.url,target:"_blank",rel:"noopener noreferrer",onClick:m=>m.stopPropagation(),style:{color:"#0D9488",textDecoration:"none",fontSize:c,fontFamily:l},children:[s.owner,"/",s.name]}):t.jsx("span",{style:{color:"var(--text-faint)",fontSize:c,fontFamily:l},children:r})}const pe="var(--font-geist-mono)",me={ONLINE:"var(--status-success-text)",OFFLINE:"var(--status-danger-text)",STALE:"var(--status-neutral-text)"},ye={ONLINE:"var(--status-success-bg)",OFFLINE:"var(--status-danger-bg)",STALE:"var(--status-neutral-bg)"};function ge({skillName:r,repoUrl:l}){const[c,u]=d.useState(null),[s,m]=d.useState(!1);if(d.useEffect(()=>{l&&(m(!0),fetch(V(r,"repo-health")).then(w=>{if(!w.ok)throw new Error("fetch failed");return w.json()}).then(w=>{u(w.status),m(!1)}).catch(()=>{u(null),m(!1)}))},[r,l]),!l)return null;if(s)return t.jsx("span",{"data-testid":"repo-health-loading",style:{display:"inline-block",width:56,height:20,borderRadius:"4px",backgroundColor:"color-mix(in srgb, var(--text-faint) 20%, transparent)",animation:"pulse 1.5s ease-in-out infinite"}});if(!c||c==="UNKNOWN")return null;const h=me[c]??"var(--status-neutral-text)",E=ye[c]??"var(--status-neutral-bg)";return t.jsx("span",{"data-testid":"repo-health-badge",style:{fontFamily:pe,fontSize:"0.75rem",fontWeight:600,textTransform:"uppercase",letterSpacing:"0.03em",padding:"0.2rem 0.6rem",borderRadius:"999px",backgroundColor:E,color:h,whiteSpace:"nowrap"},children:c})}function he({children:r,compact:l}){return t.jsx("pre",{"data-testid":"terminal-block",style:{background:"var(--bg-code, #161B22)",color:"#E6EDF3",fontFamily:"var(--font-geist-mono)",fontSize:l?"0.8rem":"0.875rem",lineHeight:1.6,padding:l?"1rem 1.25rem":"1.5rem 2rem",borderRadius:"6px",overflowX:"auto",margin:0},children:r})}const xe="/api/v1/studio/telemetry/install-copy",ve=/^[a-zA-Z0-9._@/-]+$/,be=/^[a-zA-Z0-9._-]+$/,ke="https://verified-skill.com";function Ee(r){return`${r.owner}/${r.repo}/${r.slug}`}function je(r,l){return r!=null&&r.ownerSlug&&(r!=null&&r.repoSlug)?`${r.ownerSlug}/${r.repoSlug}`:r!=null&&r.publisher?r.publisher:`${l.owner}/${l.repo}`}function we(r){return r==="user"?" --global":` --scope ${r}`}function Se(r){return r==="user"?"User":"Project"}function $e(r,l,c,u){const s=c?`${r}/${l}@${c}`:`${r}/${l}`;if(!ve.test(`${r}/${l}`))return{ok:!1,reason:"Invalid skill identifier"};if(c&&!be.test(c))return{ok:!1,reason:"Invalid version identifier"};const m=we(u),h=`npx vskill@latest install ${s}${m}`,E=[{label:"npm",comment:"# npm",command:h},{label:"bun",comment:"# bun",command:`bunx vskill@latest install ${s}${m}`},{label:"pnpm",comment:"# pnpm",command:`pnpx vskill@latest install ${s}${m}`},{label:"yarn",comment:"# yarn",command:`yarn dlx vskill@latest install ${s}${m}`},{label:"alternative",comment:"# alternative (publisher + --skill flag)",command:c?`npx vskill@latest install ${r}@${c} --skill ${l}${m}`:`npx vskill@latest install ${r} --skill ${l}${m}`}];return{ok:!0,command:h,variants:E}}function I(r,l,c){typeof window>"u"||window.dispatchEvent(new CustomEvent("studio:toast",{detail:{message:r,kind:l,durationMs:c,severity:l==="error"?"error":"info"}}))}async function Y(r){var l;if(typeof navigator<"u"&&((l=navigator.clipboard)!=null&&l.writeText))try{return await navigator.clipboard.writeText(r),!0}catch{}if(typeof document>"u")return!1;try{const c=document.createElement("textarea");c.value=r,c.setAttribute("readonly",""),c.style.position="fixed",c.style.left="-9999px",document.body.appendChild(c),c.select();const u=document.execCommand("copy");return document.body.removeChild(c),u}catch{return!1}}function Z(r,l){try{fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l),keepalive:!0}).catch(()=>{})}catch{}}function Ae({selectedSkill:r,onClose:l,telemetryInstallCopyUrl:c=xe,onToast:u}){const[s,m]=d.useState(null),[h,E]=d.useState([]),[w,J]=d.useState(!1),[Q,ee]=d.useState(null),[C,R]=d.useState(!0),[D,O]=d.useState(null),[v,_]=d.useState(null),[b,te]=d.useState("project"),[k,L]=d.useState(null),[U,re]=d.useState(0),M=d.useRef(null),P=d.useRef(null),W=d.useRef(null),g=Ee(r);d.useEffect(()=>(W.current=document.activeElement??null,()=>{const e=W.current;if(e&&typeof e.focus=="function")try{e.focus()}catch{}}),[]),d.useEffect(()=>{const e=setTimeout(()=>{var n;return(n=P.current)==null?void 0:n.focus()},50);return()=>clearTimeout(e)},[]),d.useEffect(()=>{let e=!1;R(!0),O(null);const n=V(g),i=V(g,"versions");return Promise.all([fetch(n).then(async o=>{if(!o.ok)throw new Error(`metadata ${o.status}`);return o.json()}),fetch(i).then(async o=>{if(!o.ok)throw new Error(`versions ${o.status}`);const a=await o.json(),f=Array.isArray(a)?a:(a==null?void 0:a.versions)??[],p=!Array.isArray(a)&&(a==null?void 0:a.unversioned)===!0,x=!Array.isArray(a)&&typeof(a==null?void 0:a.currentVersion)=="string"?a.currentVersion:null;return{list:f,unversioned:p,currentVersion:x}})]).then(([o,a])=>{if(e)return;m(o),E(a.list),J(a.unversioned),ee(a.currentVersion);const f=a.list.find(p=>p.isLatest)??a.list[0]??null;_(f?f.version:null),R(!1)}).catch(o=>{e||(O(o instanceof Error?o.message:String(o)),R(!1))}),()=>{e=!0}},[g,U]),d.useEffect(()=>{let e=!1;return G.getSkillInstallState(g).then(n=>{e||L(n)},()=>{if(!e){try{const n="vskill:installState:warned";typeof sessionStorage<"u"&&!sessionStorage.getItem(n)&&(sessionStorage.setItem(n,"1"),console.warn("[SkillDetailPanel] install-state fetch failed; falling back to optimistic not-installed UX"))}catch{}L(null)}}),()=>{e=!0}},[g,U]),d.useEffect(()=>{if(typeof window>"u")return;let e=null;const n=i=>{const o=i.detail;!(o!=null&&o.skill)||o.skill!==g||(e&&clearTimeout(e),e=setTimeout(()=>{G.getSkillInstallState(g).then(a=>L(a),()=>{})},50))};return window.addEventListener("studio:skill-installed",n),()=>{e&&clearTimeout(e),window.removeEventListener("studio:skill-installed",n)}},[g]),d.useEffect(()=>{function e(n){if(n.key==="Escape")n.stopPropagation(),$();else if(n.key==="Tab"){const i=M.current;if(!i)return;const o=i.querySelectorAll('a[href], button:not([disabled]), input:not([disabled]), [tabindex]:not([tabindex="-1"])');if(o.length===0)return;const a=o[0],f=o[o.length-1],p=document.activeElement;n.shiftKey&&p===a?(n.preventDefault(),f.focus()):!n.shiftKey&&p===f&&(n.preventDefault(),a.focus())}}return window.addEventListener("keydown",e,!0),()=>window.removeEventListener("keydown",e,!0)},[]);const $=d.useCallback(()=>{l();let e="";try{typeof window<"u"&&window.sessionStorage&&(e=window.sessionStorage.getItem("find-skills:last-query")??"")}catch{}typeof window<"u"&&window.dispatchEvent(new CustomEvent("openFindSkills",{detail:{query:e}}))},[l]),T=je(s,r),S=(s==null?void 0:s.skillSlug)??r.slug,H=(s==null?void 0:s.displayName)??r.displayName??S,ne=(s==null?void 0:s.isBlocked)===!0,F=d.useMemo(()=>h.length===0?[]:[...h].sort((n,i)=>{const o=n.publishedAt?Date.parse(n.publishedAt):0;return(i.publishedAt?Date.parse(i.publishedAt):0)-o}).slice(0,5),[h]),B=d.useMemo(()=>!v||F.length===0?!0:F[0].version===v,[v,F]),y=d.useMemo(()=>v?$e(T,S,B?null:v,b):null,[T,S,v,B,b]),z=d.useCallback(async()=>{if(!y||!y.ok)return;const e=await Y(y.command);Z(c,{skillName:g,version:v??"",q:"",ts:Date.now()});const n=e?`Run ${y.command} in your terminal`:"Copy failed — please copy the command manually.";if(u)try{u(n,e?"success":"error")}catch{}else I(n,e?"success":"error",3500)},[y,c,g,v,T,S,B,u]),se=d.useCallback(async()=>{if(!y||!y.ok)return;const e=`${T}/${S}`;if(u)try{u(`Installing ${e}…`,"info")}catch{}else I(`Installing ${e}…`,"info",5e3);let n=null;try{const f=await fetch("/api/studio/install-skill",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({skill:e,scope:b})});if(f.status===404)return z();if(!f.ok){const j=(await f.json().catch(()=>({}))).error||`Install failed (HTTP ${f.status})`;if(u)try{u(j,"error")}catch{}else I(j,"error",6e3);return}const p=await f.json();n=(p==null?void 0:p.jobId)??null}catch{return z()}if(!n||typeof EventSource>"u")return;const i=new EventSource(`/api/studio/install-skill/${n}/stream`),a=setTimeout(()=>{try{i.close()}catch{}},2e5);i.addEventListener("done",f=>{var A;clearTimeout(a);try{i.close()}catch{}let p={};try{p=JSON.parse(f.data)}catch{}const x=p.success===!0,j=x?`Installed ${e} (${b})`:`Install failed: ${((A=p.stderr)==null?void 0:A.trim().split(/\r?\n/).slice(-1)[0])||"see terminal"}`;if(u)try{u(j,x?"success":"error")}catch{}else I(j,x?"success":"error",x?4e3:8e3);if(x){if(typeof window<"u")try{window.dispatchEvent(new CustomEvent("studio:skill-installed",{detail:{skill:e,scope:b}}))}catch{}$()}}),i.onerror=()=>{clearTimeout(a);try{i.close()}catch{}}},[y,T,S,b,u,z,$]),oe=(s==null?void 0:s.trustTier)??"T1",ie=(s==null?void 0:s.certTier)==="CERTIFIED"||(s==null?void 0:s.certTier)==="VERIFIED"?s.certTier:"VERIFIED";return t.jsxs("div",{ref:M,"data-testid":"skill-detail-panel",role:"dialog","aria-modal":"true","aria-label":`Skill detail — ${H}`,style:{position:"fixed",inset:0,zIndex:9998,display:"flex",alignItems:"flex-start",justifyContent:"center",paddingTop:"min(10vh, 80px)"},onClick:e=>{e.target===e.currentTarget&&$()},children:[t.jsx("div",{style:{position:"fixed",inset:0,background:"rgba(0,0,0,0.4)",backdropFilter:"blur(4px)"}}),t.jsxs("div",{onClick:e=>e.stopPropagation(),style:{position:"relative",width:"100%",maxWidth:720,margin:"0 1rem",background:"var(--bg-surface, #FFFFFF)",color:"var(--text-primary, #191919)",borderRadius:"8px",border:"1px solid var(--color-rule, #E8E1D6)",boxShadow:"0 20px 60px rgba(0,0,0,0.15)",overflow:"hidden",maxHeight:"80vh",display:"flex",flexDirection:"column"},children:[t.jsxs("div",{style:{padding:"0.75rem 1rem",borderBottom:"1px solid var(--color-rule, #E8E1D6)",display:"flex",alignItems:"center",justifyContent:"space-between",flexShrink:0},children:[t.jsx("button",{ref:P,type:"button",onClick:$,"data-testid":"skill-detail-back",style:{background:"transparent",border:"none",padding:"4px 8px",borderRadius:4,cursor:"pointer",fontFamily:"var(--font-mono, monospace)",fontSize:12,color:"var(--text-secondary, #5A5651)"},children:"← Back to results"}),t.jsx("kbd",{style:{fontFamily:"var(--font-mono, monospace)",fontSize:11,color:"var(--text-secondary, #5A5651)",border:"1px solid var(--color-rule, #E8E1D6)",borderRadius:4,padding:"1px 5px"},children:"Esc"})]}),t.jsxs("div",{style:{overflowY:"auto",padding:"1rem",flex:1},children:[C&&t.jsx("div",{"data-testid":"skill-detail-loading",style:{padding:"2rem",textAlign:"center",color:"var(--text-secondary, #5A5651)"},children:"Loading…"}),D&&!C&&t.jsxs("div",{"data-testid":"skill-detail-error",style:{padding:"1.5rem",textAlign:"center",fontFamily:"var(--font-mono, monospace)",fontSize:"0.875rem",color:"var(--red, #b54444)"},children:[t.jsxs("div",{style:{marginBottom:"0.75rem"},children:["Failed to load skill: ",D]}),t.jsx("button",{"data-testid":"skill-detail-retry",onClick:()=>re(e=>e+1),style:{fontFamily:"var(--font-mono, monospace)",fontSize:"0.8125rem",padding:"0.4rem 1rem",borderRadius:4,border:"1px solid var(--color-rule, #E8E1D6)",background:"transparent",color:"var(--text-primary, #191919)",cursor:"pointer"},children:"Retry"})]}),!C&&!D&&t.jsxs(t.Fragment,{children:[t.jsxs("section",{"data-testid":"skill-detail-hero",style:{marginBottom:"1.25rem"},children:[t.jsx("h2",{style:{margin:"0 0 0.5rem",fontSize:"1.25rem",fontWeight:600},children:H}),(s==null?void 0:s.description)&&t.jsx("p",{style:{margin:"0 0 0.75rem",color:"var(--text-secondary, #5A5651)",fontSize:"0.875rem",lineHeight:1.5},children:s.description}),t.jsxs("div",{style:{display:"flex",flexWrap:"wrap",gap:"0.5rem",alignItems:"center"},children:[t.jsx(ce,{tier:oe}),t.jsx(ae,{tier:ie,isTainted:s==null?void 0:s.isTainted}),t.jsx(fe,{repoUrl:(s==null?void 0:s.repoUrl)??null}),t.jsx(ge,{skillName:g,repoUrl:s==null?void 0:s.repoUrl})]})]}),t.jsxs("section",{"data-testid":"skill-detail-versions",style:{marginBottom:"1.25rem"},children:[t.jsx("h3",{style:{margin:"0 0 0.5rem",fontSize:"0.8125rem",textTransform:"uppercase",letterSpacing:"0.06em",color:"var(--text-secondary, #5A5651)"},children:"Versions"}),F.length===0?w?t.jsxs("div",{"data-testid":"skill-detail-unversioned",style:{color:"var(--text-secondary, #5A5651)",fontSize:"0.8125rem"},children:["Discovered — no published version yet (currentVersion: ",Q??"unknown",")."]}):t.jsx("div",{"data-testid":"skill-detail-no-versions",style:{color:"var(--text-secondary, #5A5651)",fontSize:"0.8125rem"},children:"No versions found."}):t.jsx("ul",{style:{listStyle:"none",margin:0,padding:0,display:"flex",flexDirection:"column",gap:4},children:F.map(e=>{const n=e.version===v,i=e.publishedAt?e.publishedAt.slice(0,10):"",o=e.authorEmail??e.author??"";return t.jsx("li",{children:t.jsxs("button",{type:"button","data-testid":"skill-detail-version-row","data-version":e.version,"data-selected":n?"true":"false","aria-pressed":n,onClick:()=>_(e.version),style:{width:"100%",textAlign:"left",padding:"0.5rem 0.75rem",borderRadius:4,border:n?"1px solid var(--color-action, #2F5B8E)":"1px solid var(--color-rule, #E8E1D6)",background:n?"color-mix(in srgb, var(--color-action, #2F5B8E) 8%, transparent)":"transparent",cursor:"pointer",fontFamily:"var(--font-mono, monospace)",fontSize:"0.8125rem",color:"var(--text-primary, #191919)",display:"flex",alignItems:"center",gap:"0.5rem"},children:[t.jsx("span",{"aria-hidden":"true",style:{width:14,display:"inline-flex",justifyContent:"center"},children:n?"●":"○"}),t.jsxs("span",{style:{fontWeight:600},children:["v",e.version]}),i&&t.jsxs("span",{style:{color:"var(--text-secondary, #5A5651)"},children:["· ",i]}),o&&t.jsxs("span",{style:{color:"var(--text-secondary, #5A5651)"},children:["· ",o]}),n&&t.jsx("span",{"data-testid":"skill-detail-version-selected-tag",style:{marginLeft:"auto",fontSize:"0.6875rem",color:"var(--color-action, #2F5B8E)"},children:"Selected"})]})},e.version)})}),t.jsx("div",{style:{marginTop:"0.5rem",textAlign:"right"},children:t.jsx("a",{"data-testid":"skill-detail-see-all-versions",href:`${ke}/skills/${r.owner}/${r.repo}/${r.slug}/versions`,target:"_blank",rel:"noopener noreferrer",style:{fontFamily:"var(--font-mono, monospace)",fontSize:"0.75rem",color:"var(--color-action, #2F5B8E)",textDecoration:"none"},children:"see all versions →"})})]}),ne?t.jsxs("section",{"data-testid":"skill-detail-blocked",style:{marginBottom:"0.5rem"},children:[t.jsx("h3",{style:{margin:"0 0 0.5rem",fontSize:"0.8125rem",textTransform:"uppercase",letterSpacing:"0.06em",color:"var(--red, #b54444)"},children:"This skill is blocked"}),t.jsx("div",{style:{padding:"1rem",borderRadius:6,border:"1px solid var(--red, #b54444)",background:"var(--red-muted, color-mix(in srgb, #b54444 18%, transparent))",color:"var(--red, #b54444)",fontSize:"0.875rem"},children:(s==null?void 0:s.blockReason)??"This skill has been blocked by platform moderators and cannot be installed."})]}):y&&!y.ok?t.jsxs("section",{"data-testid":"skill-detail-install-error",style:{marginBottom:"0.5rem"},children:[t.jsx("h3",{style:{margin:"0 0 0.5rem",fontSize:"0.8125rem",textTransform:"uppercase",letterSpacing:"0.06em",color:"var(--red, #b54444)"},children:"Install command unavailable"}),t.jsxs("div",{style:{padding:"1rem",borderRadius:6,border:"1px solid var(--red, #b54444)",background:"var(--red-muted, color-mix(in srgb, #b54444 18%, transparent))",color:"var(--red, #b54444)",fontSize:"0.875rem"},children:[y.reason," — refusing to render the install panel for safety."]})]}):y&&y.ok?t.jsxs("section",{"data-testid":"skill-detail-install",style:{marginBottom:"0.5rem"},children:[t.jsx("h3",{style:{margin:"0 0 0.5rem",fontSize:"0.8125rem",textTransform:"uppercase",letterSpacing:"0.06em",color:"var(--text-secondary, #5A5651)"},children:"Install"}),t.jsxs("div",{role:"radiogroup","aria-label":"Install scope","data-testid":"skill-detail-install-scope",style:{display:"flex",gap:"0.5rem",alignItems:"center",marginBottom:"0.75rem",fontFamily:"var(--font-mono, monospace)",fontSize:"0.75rem",color:"var(--text-secondary, #5A5651)"},children:[t.jsx("span",{children:"Scope:"}),["project","user"].map(e=>{var q;const n=b===e,i=(q=k==null?void 0:k.scopes)==null?void 0:q[e],o=(i==null?void 0:i.installed)===!0,a=(k==null?void 0:k.detectedAgentTools)??[],f=a.map(N=>`./${N.localDir}`).join(", "),p=a.map(N=>N.globalDir).join(", "),x=(i==null?void 0:i.installedAgentTools)??[],j=i!=null&&i.version?`Installed v${i.version} · ${x.join(", ")}`:`Installed · ${x.join(", ")}`,A=e==="project"?f?`Will install to: ${f}`:"Install with --scope project":p?`Will install to: ${p}`:"Install with --global",le=o?j:A,K=Se(e);return t.jsx("button",{type:"button",role:"radio","aria-checked":n,"aria-disabled":o,disabled:o,"data-testid":`skill-detail-install-scope-${e}`,"data-installed":o?"true":"false",title:le,onClick:()=>{o||te(e)},style:{padding:"0.25rem 0.6rem",borderRadius:4,border:`1px solid ${n?"var(--text-primary, #191919)":"var(--color-rule, #E8E1D6)"}`,background:n?"var(--text-primary, #191919)":"transparent",color:n?"var(--bg-surface, #FFFFFF)":"var(--text-secondary, #5A5651)",cursor:o?"not-allowed":"pointer",opacity:o?.55:1,fontFamily:"var(--font-mono, monospace)",fontSize:"0.75rem",fontWeight:n?600:400},children:o?`Installed ✓ ${K}`:K},e)})]}),(()=>{var a;const e=(a=k==null?void 0:k.scopes)==null?void 0:a[b],n=(e==null?void 0:e.installed)===!0,i=e!=null&&e.version?` (v${e.version})`:"",o=`Already installed at ${b} — re-run via CLI to force`;return t.jsx("button",{type:"button",onClick:se,disabled:n,"aria-disabled":n,"data-testid":"skill-detail-install-primary","data-installed":n?"true":"false","aria-label":n?"Already installed at the selected scope":"Install skill",title:n?o:void 0,style:{display:"inline-flex",alignItems:"center",marginBottom:"0.75rem",padding:"0.5rem 1rem",borderRadius:6,border:"1px solid var(--text-primary, #191919)",background:n?"var(--bg-surface, #FFFFFF)":"var(--text-primary, #191919)",color:n?"var(--text-secondary, #5A5651)":"var(--bg-surface, #FFFFFF)",cursor:n?"not-allowed":"pointer",opacity:n?.7:1,fontFamily:"var(--font-mono, monospace)",fontSize:"0.875rem",fontWeight:600},children:n?`✓ Installed${i}`:"Install"})})(),t.jsx("div",{"data-testid":"skill-detail-install-command",style:{display:"block"},children:t.jsx(he,{compact:!0,children:y.variants.map((e,n)=>t.jsxs("div",{"data-testid":`skill-detail-install-variant-${e.label}`,style:{display:"flex",gap:"0.75rem",alignItems:"flex-start",marginTop:n===0?0:"0.75rem"},children:[t.jsxs("div",{style:{flex:1,minWidth:0},children:[t.jsx("div",{style:{color:"#8B949E",marginBottom:"0.125rem"},children:e.comment}),t.jsxs("div",{children:[t.jsx("span",{style:{color:"#8B949E",marginRight:"0.5rem"},children:"$"}),t.jsx("span",{"data-testid":`skill-detail-install-variant-cmd-${e.label}`,children:e.command})]})]}),t.jsx("button",{type:"button",onClick:async()=>{const i=await Y(e.command),o=i?`Run ${e.command} in your terminal`:"Copy failed — please copy the command manually.";if(u)try{u(o,i?"success":"error")}catch{}else I(o,i?"success":"error",3500);i&&Z(c,{skillName:g,version:v??"",q:"",ts:Date.now()})},"data-testid":`skill-detail-copy-${e.label}`,"aria-label":`Copy ${e.label} install command`,style:{flexShrink:0,padding:"0.25rem 0.6rem",borderRadius:4,border:"1px solid color-mix(in srgb, #E6EDF3 25%, transparent)",background:"color-mix(in srgb, #E6EDF3 8%, transparent)",color:"#E6EDF3",cursor:"pointer",fontFamily:"var(--font-mono, monospace)",fontSize:"0.7rem",alignSelf:"flex-end"},children:"Copy"})]},e.label))})})]}):null]})]})]})]})}export{Ae as SkillDetailPanel,Ae as default};
@@ -1 +1 @@
1
- import{r as v,e as N,a as E,j as a,f as L}from"./index-BV7k6fdk.js";/* empty css */function M(l,d){const[c,u]=l.split("."),[w,f]=d.split("."),r=Number(c),m=Number(u),p=Number(w),y=Number(f);return!Number.isFinite(r)||!Number.isFinite(p)?(console.warn(`[semverBump] unparseable version: installed=${l} latest=${d}`),"patch"):p>r?"major":!Number.isFinite(m)||!Number.isFinite(y)?(console.warn(`[semverBump] unparseable minor: installed=${l} latest=${d}`),"patch"):y>m?"minor":"patch"}const F={major:{bg:"var(--red-muted)",text:"var(--red)"},minor:{bg:"var(--yellow-muted)",text:"var(--yellow)"},patch:{bg:"var(--green-muted)",text:"var(--green)"}},z=["project","personal","plugin"];function D(l,d={}){if(l.length===0)return"No tracked install — click to view details";const c=l.filter(n=>!n.readonly),u=l.filter(n=>n.readonly);if(c.length===0)return"Plugin-bundled — Update via plugin to refresh";const f=z.filter(n=>c.some(x=>x.scope===n)).join(" + "),m=Array.from(new Set(c.map(n=>n.agentLabel))).sort((n,x)=>n.localeCompare(x)).join(", "),p=c.length;let i=`Updates ${p} ${p===1?"location":"locations"}: ${f} (${m})`;if(d.pinned)return i+=" — pinned (skipped)",i;if(u.length>0){const n=Array.from(new Set(u.map(x=>x.pluginSlug??"?")));n.length===1&&n[0]!=="?"?i+=` — ${u.length} from plugin ${n[0]} (handled separately)`:i+=` — ${u.length} plugin-bundled (handled separately)`}return i}function O({updates:l,isRefreshing:d,onRefresh:c,onSelectSkill:u,onViewAll:w,onClose:f,anchorRef:r,diffSummariesById:m}){const p=v.useRef(null),y=v.useRef(null);v.useEffect(()=>{var e;(e=y.current)==null||e.focus()},[]),v.useEffect(()=>{function e(s){p.current&&(p.current.contains(s.target)||r!=null&&r.current&&r.current.contains(s.target)||f())}return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[f,r]),v.useEffect(()=>{function e(s){var g;s.key==="Escape"&&(s.preventDefault(),f(),(g=r==null?void 0:r.current)==null||g.focus())}return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[f,r]);const i=l.filter(e=>e.updateAvailable),{toast:n}=N(),{onSkillUpdated:x}=E(),[j,k]=v.useState(()=>new Set);async function $(e){const s=e.installLocations??[],g=s.filter(t=>!t.readonly);if(s.length>0&&g.length===0){const t=s[0].pluginSlug??"the plugin";n({severity:"info",message:`This skill came from plugin ${t}. Update the plugin to refresh it.`});return}if(!j.has(e.name)){k(t=>{const o=new Set(t);return o.add(e.name),o});try{const t=e.name.split("/"),o=e.localPlugin??(t.length>=2?t[t.length-2]:t[0]),b=e.localSkill??t[t.length-1],h=await L.postSkillUpdate(o,b);if(h.ok){const S=g.length||1,U=S===1?"location":"locations";x(o,b),n({severity:"success",message:`Updated ${b} in ${S} ${U}.`,durationMs:4e3})}else n({severity:"error",message:`Couldn't update ${b} — HTTP ${h.status}`,durationMs:0})}catch(t){const o=t instanceof Error?t.message:"Network error";n({severity:"error",message:`Update failed: ${o}`,durationMs:0})}finally{k(t=>{const o=new Set(t);return o.delete(e.name),o})}}}return a.jsxs("div",{ref:p,role:"dialog","aria-modal":"false","aria-label":"Skill update summary","data-testid":"update-dropdown",style:{position:"absolute",top:"calc(100% + 6px)",right:0,width:440,maxHeight:400,overflow:"auto",background:"var(--bg-surface)",border:"1px solid var(--border-default)",borderRadius:8,padding:10,zIndex:1e3,fontFamily:"var(--font-sans)",display:"flex",flexDirection:"column",gap:6},children:[a.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"2px 4px 6px",borderBottom:"1px solid var(--border-default)"},children:[a.jsx("span",{style:{fontSize:12,fontWeight:600,color:"var(--text-primary)"},children:i.length===0?"No updates available":`${i.length} updates available`}),a.jsx("button",{type:"button","data-testid":"update-dropdown-refresh",onClick:c,disabled:d,style:{background:"transparent",border:"none",color:"var(--text-secondary)",fontSize:11,fontFamily:"var(--font-mono)",cursor:d?"not-allowed":"pointer",padding:"2px 6px"},children:d?"Refreshing…":"Refresh"})]}),i.length>0?a.jsx("ul",{role:"list",style:{listStyle:"none",margin:0,padding:0,display:"flex",flexDirection:"column",gap:2},children:i.map((e,s)=>{const g=e.latest?M(e.installed,e.latest):"patch",t=F[g],o=m==null?void 0:m.get(e.name),b=D(e.installLocations??[],{pinned:e.pinned??!1}),h=j.has(e.name);return a.jsxs("li",{style:{margin:0,display:"flex",alignItems:"stretch",gap:4},children:[a.jsxs("button",{ref:s===0?y:void 0,type:"button","data-testid":"update-dropdown-row","data-skill-name":e.name,onClick:()=>u(e),style:{display:"flex",alignItems:"flex-start",gap:8,width:"100%",padding:"6px 8px",background:"transparent",border:"none",borderRadius:4,cursor:"pointer",color:"var(--text-primary)",fontFamily:"inherit",fontSize:12,textAlign:"left"},children:[a.jsx("span",{"aria-hidden":"true","data-testid":"update-dropdown-bump-dot","data-bump":g,style:{width:8,height:8,borderRadius:"50%",background:t.text,flexShrink:0,marginTop:4}}),a.jsxs("span",{style:{display:"flex",flexDirection:"column",gap:2,minWidth:0,flex:1},children:[a.jsxs("span",{style:{display:"flex",alignItems:"center",gap:8,minWidth:0},children:[a.jsx("span",{style:{minWidth:0,flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.name}),a.jsxs("span",{style:{fontFamily:"var(--font-mono)",fontSize:10,color:"var(--text-secondary)",fontVariantNumeric:"tabular-nums"},children:[e.installed," → ",e.latest??"?"]})]}),o&&a.jsx("span",{"data-testid":"update-dropdown-diff-summary",style:{fontSize:11,color:"var(--text-secondary)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:o})]})]}),a.jsx("button",{type:"button","data-testid":"update-dropdown-row-update","data-skill-name":e.name,title:b,onClick:()=>{$(e)},disabled:h,style:{flexShrink:0,padding:"0 10px",background:"var(--color-ink)",color:"var(--color-paper)",border:"none",borderRadius:4,cursor:h?"not-allowed":"pointer",fontFamily:"var(--font-sans)",fontSize:11,fontWeight:500},children:h?"Updating…":"Update"})]},e.name)})}):a.jsx("div",{style:{padding:"12px 4px",fontSize:12,color:"var(--text-secondary)"},children:"All installed skills are up to date."}),a.jsx("div",{style:{display:"flex",justifyContent:"flex-end",padding:"4px 4px 0",borderTop:"1px solid var(--border-default)",marginTop:2},children:a.jsx("button",{type:"button","data-testid":"update-dropdown-view-all",onClick:w,style:{background:"transparent",border:"none",color:"var(--text-secondary)",fontSize:11,fontFamily:"var(--font-sans)",cursor:"pointer",padding:"4px 6px"},children:"View all"})})]})}export{O as default};
1
+ import{r as v,h as N,b as E,j as a,a as L}from"./index-JaDg6FlU.js";/* empty css */function M(l,d){const[c,u]=l.split("."),[w,f]=d.split("."),r=Number(c),m=Number(u),p=Number(w),y=Number(f);return!Number.isFinite(r)||!Number.isFinite(p)?(console.warn(`[semverBump] unparseable version: installed=${l} latest=${d}`),"patch"):p>r?"major":!Number.isFinite(m)||!Number.isFinite(y)?(console.warn(`[semverBump] unparseable minor: installed=${l} latest=${d}`),"patch"):y>m?"minor":"patch"}const F={major:{bg:"var(--red-muted)",text:"var(--red)"},minor:{bg:"var(--yellow-muted)",text:"var(--yellow)"},patch:{bg:"var(--green-muted)",text:"var(--green)"}},z=["project","personal","plugin"];function D(l,d={}){if(l.length===0)return"No tracked install — click to view details";const c=l.filter(n=>!n.readonly),u=l.filter(n=>n.readonly);if(c.length===0)return"Plugin-bundled — Update via plugin to refresh";const f=z.filter(n=>c.some(x=>x.scope===n)).join(" + "),m=Array.from(new Set(c.map(n=>n.agentLabel))).sort((n,x)=>n.localeCompare(x)).join(", "),p=c.length;let i=`Updates ${p} ${p===1?"location":"locations"}: ${f} (${m})`;if(d.pinned)return i+=" — pinned (skipped)",i;if(u.length>0){const n=Array.from(new Set(u.map(x=>x.pluginSlug??"?")));n.length===1&&n[0]!=="?"?i+=` — ${u.length} from plugin ${n[0]} (handled separately)`:i+=` — ${u.length} plugin-bundled (handled separately)`}return i}function O({updates:l,isRefreshing:d,onRefresh:c,onSelectSkill:u,onViewAll:w,onClose:f,anchorRef:r,diffSummariesById:m}){const p=v.useRef(null),y=v.useRef(null);v.useEffect(()=>{var e;(e=y.current)==null||e.focus()},[]),v.useEffect(()=>{function e(s){p.current&&(p.current.contains(s.target)||r!=null&&r.current&&r.current.contains(s.target)||f())}return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[f,r]),v.useEffect(()=>{function e(s){var g;s.key==="Escape"&&(s.preventDefault(),f(),(g=r==null?void 0:r.current)==null||g.focus())}return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[f,r]);const i=l.filter(e=>e.updateAvailable),{toast:n}=N(),{onSkillUpdated:x}=E(),[j,k]=v.useState(()=>new Set);async function $(e){const s=e.installLocations??[],g=s.filter(t=>!t.readonly);if(s.length>0&&g.length===0){const t=s[0].pluginSlug??"the plugin";n({severity:"info",message:`This skill came from plugin ${t}. Update the plugin to refresh it.`});return}if(!j.has(e.name)){k(t=>{const o=new Set(t);return o.add(e.name),o});try{const t=e.name.split("/"),o=e.localPlugin??(t.length>=2?t[t.length-2]:t[0]),b=e.localSkill??t[t.length-1],h=await L.postSkillUpdate(o,b);if(h.ok){const S=g.length||1,U=S===1?"location":"locations";x(o,b),n({severity:"success",message:`Updated ${b} in ${S} ${U}.`,durationMs:4e3})}else n({severity:"error",message:`Couldn't update ${b} — HTTP ${h.status}`,durationMs:0})}catch(t){const o=t instanceof Error?t.message:"Network error";n({severity:"error",message:`Update failed: ${o}`,durationMs:0})}finally{k(t=>{const o=new Set(t);return o.delete(e.name),o})}}}return a.jsxs("div",{ref:p,role:"dialog","aria-modal":"false","aria-label":"Skill update summary","data-testid":"update-dropdown",style:{position:"absolute",top:"calc(100% + 6px)",right:0,width:440,maxHeight:400,overflow:"auto",background:"var(--bg-surface)",border:"1px solid var(--border-default)",borderRadius:8,padding:10,zIndex:1e3,fontFamily:"var(--font-sans)",display:"flex",flexDirection:"column",gap:6},children:[a.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"2px 4px 6px",borderBottom:"1px solid var(--border-default)"},children:[a.jsx("span",{style:{fontSize:12,fontWeight:600,color:"var(--text-primary)"},children:i.length===0?"No updates available":`${i.length} updates available`}),a.jsx("button",{type:"button","data-testid":"update-dropdown-refresh",onClick:c,disabled:d,style:{background:"transparent",border:"none",color:"var(--text-secondary)",fontSize:11,fontFamily:"var(--font-mono)",cursor:d?"not-allowed":"pointer",padding:"2px 6px"},children:d?"Refreshing…":"Refresh"})]}),i.length>0?a.jsx("ul",{role:"list",style:{listStyle:"none",margin:0,padding:0,display:"flex",flexDirection:"column",gap:2},children:i.map((e,s)=>{const g=e.latest?M(e.installed,e.latest):"patch",t=F[g],o=m==null?void 0:m.get(e.name),b=D(e.installLocations??[],{pinned:e.pinned??!1}),h=j.has(e.name);return a.jsxs("li",{style:{margin:0,display:"flex",alignItems:"stretch",gap:4},children:[a.jsxs("button",{ref:s===0?y:void 0,type:"button","data-testid":"update-dropdown-row","data-skill-name":e.name,onClick:()=>u(e),style:{display:"flex",alignItems:"flex-start",gap:8,width:"100%",padding:"6px 8px",background:"transparent",border:"none",borderRadius:4,cursor:"pointer",color:"var(--text-primary)",fontFamily:"inherit",fontSize:12,textAlign:"left"},children:[a.jsx("span",{"aria-hidden":"true","data-testid":"update-dropdown-bump-dot","data-bump":g,style:{width:8,height:8,borderRadius:"50%",background:t.text,flexShrink:0,marginTop:4}}),a.jsxs("span",{style:{display:"flex",flexDirection:"column",gap:2,minWidth:0,flex:1},children:[a.jsxs("span",{style:{display:"flex",alignItems:"center",gap:8,minWidth:0},children:[a.jsx("span",{style:{minWidth:0,flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.name}),a.jsxs("span",{style:{fontFamily:"var(--font-mono)",fontSize:10,color:"var(--text-secondary)",fontVariantNumeric:"tabular-nums"},children:[e.installed," → ",e.latest??"?"]})]}),o&&a.jsx("span",{"data-testid":"update-dropdown-diff-summary",style:{fontSize:11,color:"var(--text-secondary)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:o})]})]}),a.jsx("button",{type:"button","data-testid":"update-dropdown-row-update","data-skill-name":e.name,title:b,onClick:()=>{$(e)},disabled:h,style:{flexShrink:0,padding:"0 10px",background:"var(--color-ink)",color:"var(--color-paper)",border:"none",borderRadius:4,cursor:h?"not-allowed":"pointer",fontFamily:"var(--font-sans)",fontSize:11,fontWeight:500},children:h?"Updating…":"Update"})]},e.name)})}):a.jsx("div",{style:{padding:"12px 4px",fontSize:12,color:"var(--text-secondary)"},children:"All installed skills are up to date."}),a.jsx("div",{style:{display:"flex",justifyContent:"flex-end",padding:"4px 4px 0",borderTop:"1px solid var(--border-default)",marginTop:2},children:a.jsx("button",{type:"button","data-testid":"update-dropdown-view-all",onClick:w,style:{background:"transparent",border:"none",color:"var(--text-secondary)",fontSize:11,fontFamily:"var(--font-sans)",cursor:"pointer",padding:"4px 6px"},children:"View all"})})]})}export{O as default};