skills-layer 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,12 +1,12 @@
1
1
  /* istanbul ignore file -- generated npm bundle is verified by boundary and tarball smoke tests. */
2
2
  import { createRequire as __skillsLayerCreateRequire } from "node:module"; const require = __skillsLayerCreateRequire(import.meta.url);
3
- import{spawn as fi}from"node:child_process";import{createHash as Gt}from"node:crypto";import{access as hi,appendFile as ns,chmod as yi,mkdir as Ne,readdir as ki,readFile as Oe,rm as Dt,stat as is,writeFile as Ht}from"node:fs/promises";import{basename as G,dirname as oe,join as I,posix as Jt,relative as Te,resolve as wi,win32 as Se}from"node:path";import{createInterface as zt}from"node:readline/promises";import{spawn as wn}from"node:child_process";import{createHash as ar}from"node:crypto";import{chmod as lr,mkdir as Je,readFile as vn,rm as dt,writeFile as he}from"node:fs/promises";import{dirname as $e,posix as cr,win32 as ur}from"node:path";import{posix as ir,win32 as rr}from"node:path";var ct=["codex","claude-code","cursor","opencode","amp","kimi-cli","replit","universal","antigravity","augment","openclaw","cline","warp","codebuddy","command-code","continue","cortex","crush","deepagents","droid","gemini-cli","github-copilot","goose","junie","iflow-cli","kilo","kiro-cli","kode","mcpjam","mistral-vibe","mux","openhands","pi","qoder","qwen-code","roo","trae","trae-cn","windsurf","zencoder","neovate","pochi","adal"],gn=[$("codex","Codex",".codex",{capabilities:L({allowedTools:!0})}),$("claude-code","Claude Code",".claude",{envVar:"CLAUDE_CODE_HOME",capabilities:L({allowedTools:!0,hooks:!0,forkedContext:!0})}),$("cursor","Cursor",".cursor",{capabilities:L({allowedTools:!0})}),$("opencode","OpenCode",".opencode",{globalRootRelativePath:".config/opencode",capabilities:L({allowedTools:!0})}),re("amp","Amp",".config/agents",{capabilities:L({allowedTools:!0})}),re("kimi-cli","Kimi Code CLI",".config/agents"),re("replit","Replit",".config/agents"),re("universal","Universal",".config/agents"),re("antigravity","Antigravity",".gemini/antigravity",{capabilities:L({allowedTools:!0}),detectGlobal:!0}),$("augment","Augment",".augment"),{id:"openclaw",displayName:"OpenClaw",envVar:"OPENCLAW_HOME",capabilities:L({allowedTools:!0}),targets:{projectRootRelativePath:null,projectSkillsRelativePath:"skills",globalRootRelativePath:".openclaw",globalSkillsRelativePath:".openclaw/skills"},detection:{projectProbeRelativePaths:[],globalProbeRelativePaths:[".openclaw",".openclaw/skills"]}},re("cline","Cline",".agents",{capabilities:L({allowedTools:!0,hooks:!0})}),re("warp","Warp",".agents"),$("codebuddy","CodeBuddy",".codebuddy",{capabilities:L({allowedTools:!0})}),$("command-code","Command Code",".commandcode",{capabilities:L({allowedTools:!0})}),$("continue","Continue",".continue"),$("cortex","Cortex Code",".cortex",{globalRootRelativePath:".snowflake/cortex"}),$("crush","Crush",".crush",{globalRootRelativePath:".config/crush"}),re("deepagents","Deep Agents",".deepagents/agent",{detectGlobal:!0}),$("droid","Droid",".factory"),re("gemini-cli","Gemini CLI",".gemini",{detectGlobal:!0}),re("github-copilot","GitHub Copilot",".copilot",{capabilities:L({allowedTools:!0}),detectGlobal:!0}),$("goose","Goose",".goose",{globalRootRelativePath:".config/goose"}),$("junie","Junie",".junie"),$("iflow-cli","iFlow CLI",".iflow"),$("kilo","Kilo Code",".kilocode"),$("kiro-cli","Kiro CLI",".kiro"),$("kode","Kode",".kode"),$("mcpjam","MCPJam",".mcpjam"),$("mistral-vibe","Mistral Vibe",".vibe"),$("mux","Mux",".mux"),$("openhands","OpenHands",".openhands",{capabilities:L({allowedTools:!0})}),$("pi","Pi",".pi",{globalRootRelativePath:".pi/agent",capabilities:L({allowedTools:!0})}),$("qoder","Qoder",".qoder",{capabilities:L({allowedTools:!0})}),$("qwen-code","Qwen Code",".qwen"),$("roo","Roo Code",".roo",{capabilities:L({allowedTools:!0})}),$("trae","Trae",".trae",{detectProject:!1}),$("trae-cn","Trae CN",".trae",{globalRootRelativePath:".trae-cn",detectProject:!1}),$("windsurf","Windsurf",".windsurf",{globalRootRelativePath:".codeium/windsurf"}),$("zencoder","Zencoder",".zencoder",{capabilities:L({allowedTools:!0})}),$("neovate","Neovate",".neovate",{capabilities:L({allowedTools:!0})}),$("pochi","Pochi",".pochi"),$("adal","AdaL",".adal")];function de(e=process.env,t=process.platform,n=process.cwd()){let i=fn(t),r=mn(e,t);return gn.map(s=>{let o=De(e[s.envVar]),l=r&&s.targets.globalRootRelativePath?Ce(i,r,s.targets.globalRootRelativePath):null,c=r&&s.targets.globalSkillsRelativePath?Ce(i,r,s.targets.globalSkillsRelativePath):null,u=s.targets.projectRootRelativePath?Ce(i,n,s.targets.projectRootRelativePath):null,d=o??l;return{id:s.id,displayName:s.displayName,envVar:s.envVar,capabilities:s.capabilities,detectionSources:[],targets:{projectRoot:u,projectSkillsPath:Ce(i,n,s.targets.projectSkillsRelativePath),globalRoot:d,globalSkillsPath:o?i.join(o,"skills"):c}}})}async function pn(e={}){let t=e.env??process.env,n=e.platform??process.platform,i=e.cwd??process.cwd(),r=fn(n),s=mn(t,n),o=de(t,n,i),l=e.pathExists??(async()=>!1);return(await Promise.all(o.map(async c=>{let u=or(c.id),d=[],p=De(t[c.envVar]);return(p&&await l(p)||p&&await l(r.join(p,"skills")))&&d.push("override"),u.detection.projectProbeRelativePaths.length>0&&await dn({basePath:i,relativePaths:u.detection.projectProbeRelativePaths,pathApi:r,pathExists:l})&&d.push("project"),s&&u.detection.globalProbeRelativePaths.length>0&&await dn({basePath:s,relativePaths:u.detection.globalProbeRelativePaths,pathApi:r,pathExists:l})&&d.push("global"),d.length===0?null:{...c,detectionSources:sr(d)}}))).flatMap(c=>c?[c]:[])}function mn(e,t){return t==="win32"?De(e.USERPROFILE,e.HOME):De(e.HOME)}function fn(e){return e==="win32"?rr:ir}function De(...e){return e.find(t=>typeof t=="string"&&t.trim().length>0)?.trim()}function sr(e){return[...new Set(e)]}async function dn(e){for(let t of e.relativePaths)if(await e.pathExists(Ce(e.pathApi,e.basePath,t)))return!0;return!1}function Ce(e,t,n){return e.join(t,...n.split("/"))}function $(e,t,n,i={}){let r=i.globalRootRelativePath??n,s=i.detectProject??!0;return{id:e,displayName:t,envVar:i.envVar??hn(e),capabilities:i.capabilities??L(),targets:{projectRootRelativePath:n,projectSkillsRelativePath:`${n}/skills`,globalRootRelativePath:r,globalSkillsRelativePath:`${r}/skills`},detection:{projectProbeRelativePaths:s?[n,`${n}/skills`]:[],globalProbeRelativePaths:[r,`${r}/skills`]}}}function re(e,t,n,i={}){let r=i.detectGlobal??!1;return{id:e,displayName:t,envVar:i.envVar??hn(e),capabilities:i.capabilities??L(),targets:{projectRootRelativePath:".agents",projectSkillsRelativePath:".agents/skills",globalRootRelativePath:n,globalSkillsRelativePath:`${n}/skills`},detection:{projectProbeRelativePaths:[],globalProbeRelativePaths:r?[n,`${n}/skills`]:[]}}}function L(e={}){let t=["basic_skills"];return e.allowedTools&&t.push("allowed_tools"),e.hooks&&t.push("hooks"),e.forkedContext&&t.push("forked_context"),t.push("local_install"),t}function hn(e){return`${e.replaceAll("-","_").toUpperCase()}_HOME`}function or(e){return gn.find(t=>t.id===e)}var pe="skills-layer",dr="2025-06-18",gr=["mcp","skills-layer-mcp-proxy.mjs"],pr=["mcp","skills-layer-mcp-broker.mjs"],mr=["mcp","skills-layer-mcp-broker.sock"],fr={codex:{tier:"tier_1",configKind:"codex_toml",resolveConfigPath(e,t,n){let i=gt(n);return i.join(e.targets.globalRoot??i.join($r({},n)??t,".codex"),"config.toml")}},cursor:Re(".cursor/mcp.json"),"claude-code":Re(".mcp.json"),cline:Re(".cline/mcp.json"),"gemini-cli":Re(".gemini/settings.json"),windsurf:Re(".windsurf/mcp.json")},hr=new Set(["universal"]);function Ae(e){let t=de(e.env,e.platform,e.cwd),n=new Map(t.map(P=>[P.id,P])),i=e.platform??process.platform,r=e.cwd??process.cwd(),s=e.stateDir??xr(e.env,i),o=e.mcpConfigPath??xe(i,s,"mcp.json"),l=xe(i,s,...gr),c=xe(i,s,...pr),u=xe(i,s,...mr),d=e.nodePath??process.execPath,p=Pn({mcpConfigPath:o}),y=Sn({mcpConfigPath:o,socketPath:u}),m=ye(p),h=ye(y),w=ct.map(P=>{let x=n.get(P),T=fr[P];if(T){let Ge=T.resolveConfigPath(x,r,i);return yr({agentId:P,displayName:x.displayName,configPath:Ge,configKind:T.configKind,bridgePath:l,brokerPath:c,brokerSocketPath:u,mcpConfigPath:o,nodePath:d,bridgeChecksum:m,brokerChecksum:h})}return hr.has(P)?kn({agentId:P,displayName:x.displayName,tier:"tier_3",status:"skills_only",verification:"skills_only",reason:"This agent is currently supported through Skills Layer skill files, not MCP auto-install.",instructions:[`Install skills for ${x.displayName} with \`skills-layer install <skill> --agent ${P}\`.`,"MCP auto-install is not claimed for this agent yet."]}):kn({agentId:P,displayName:x.displayName,tier:"tier_2",status:"manual_handoff",verification:"manual",reason:"MCP support or the safe writable config shape has not been verified yet.",instructions:[`Add a local stdio MCP server named ${pe}.`,`Command: ${d}`,`Args: ${l}`,"Restart or reload the agent if it does not reconnect automatically."]})});return{status:"mcp_registration_plan",serverName:pe,mcpUrl:e.mcpUrl,bearerTokenEnvVar:e.bearerTokenEnvVar,clientId:e.clientId,environment:e.environment,generatedAt:e.now,bridgePath:l,brokerPath:c,brokerSocketPath:u,nodePath:d,mcpConfigPath:o,bridgeChecksum:m,brokerChecksum:h,automaticCount:w.filter(P=>P.status==="automatic").length,manualCount:w.filter(P=>P.status==="manual_handoff").length,skillsOnlyCount:w.filter(P=>P.status==="skills_only").length,unsupportedCount:w.filter(P=>P.status==="unsupported").length,targets:w}}async function bn(e){let t=Ae(e),n=_r(e.clientId),i=t.targets.find(w=>w.agentId===n),r=e.mcpConfig??await ze(t.mcpConfigPath,{allowMissing:!0});if(!r)return yn({plan:t,target:i,mcpConfig:null,tokenConfig:null,tokenPresent:!1,tokenRefPresent:!1,bridgeExists:!1,checksumMatches:!1,brokerExists:!1,brokerChecksumMatches:!1,targetConfigured:!1,rawTokenLeaked:!1});let s=await _e(t.bridgePath),o=s!==null,l=s!==null&&ye(s)===t.bridgeChecksum,c=await _e(t.brokerPath),u=c!==null,d=c!==null&&ye(c)===t.brokerChecksum,p=Ar(r,i.agentId),y=X(p,"token"),m=X(p,"tokenRef"),h=i.status==="automatic"?await Pr(i,y):{configured:!1,rawTokenLeaked:!1};return yn({plan:t,target:i,mcpConfig:r,tokenConfig:p,tokenPresent:!!y,tokenRefPresent:!!m,bridgeExists:o,checksumMatches:l,brokerExists:u,brokerChecksumMatches:d,targetConfigured:h.configured,rawTokenLeaked:h.rawTokenLeaked})}function Pn(e){return`#!/usr/bin/env node
3
+ import{spawn as ki}from"node:child_process";import{createHash as Dt}from"node:crypto";import{access as wi,appendFile as as,chmod as vi,mkdir as Ne,readdir as bi,readFile as Oe,rm as Ht,stat as ls,writeFile as Jt}from"node:fs/promises";import{basename as K,dirname as X,join as A,posix as zt,relative as Te,resolve as Pi,win32 as Se}from"node:path";import{createInterface as Wt}from"node:readline/promises";import{spawn as bn}from"node:child_process";import{createHash as gr}from"node:crypto";import{chmod as pr,mkdir as Je,readFile as Pn,rm as gt,writeFile as he}from"node:fs/promises";import{dirname as $e,posix as mr,win32 as fr}from"node:path";import{posix as lr,win32 as cr}from"node:path";var ut=["codex","claude-code","cursor","opencode","amp","kimi-cli","replit","universal","antigravity","augment","openclaw","cline","warp","codebuddy","command-code","continue","cortex","crush","deepagents","droid","gemini-cli","github-copilot","goose","junie","iflow-cli","kilo","kiro-cli","kode","mcpjam","mistral-vibe","mux","openhands","pi","qoder","qwen-code","roo","trae","trae-cn","windsurf","zencoder","neovate","pochi","adal"],mn=[$("codex","Codex",".codex",{capabilities:T({allowedTools:!0})}),$("claude-code","Claude Code",".claude",{envVar:"CLAUDE_CODE_HOME",capabilities:T({allowedTools:!0,hooks:!0,forkedContext:!0})}),$("cursor","Cursor",".cursor",{capabilities:T({allowedTools:!0})}),$("opencode","OpenCode",".opencode",{globalRootRelativePath:".config/opencode",capabilities:T({allowedTools:!0})}),oe("amp","Amp",".config/agents",{capabilities:T({allowedTools:!0})}),oe("kimi-cli","Kimi Code CLI",".config/agents"),oe("replit","Replit",".config/agents"),oe("universal","Universal",".config/agents"),oe("antigravity","Antigravity",".gemini/antigravity",{capabilities:T({allowedTools:!0}),detectGlobal:!0}),$("augment","Augment",".augment"),{id:"openclaw",displayName:"OpenClaw",envVar:"OPENCLAW_HOME",capabilities:T({allowedTools:!0}),targets:{projectRootRelativePath:null,projectSkillsRelativePath:"skills",globalRootRelativePath:".openclaw",globalSkillsRelativePath:".openclaw/skills"},detection:{projectProbeRelativePaths:[],globalProbeRelativePaths:[".openclaw",".openclaw/skills"]}},oe("cline","Cline",".agents",{capabilities:T({allowedTools:!0,hooks:!0})}),oe("warp","Warp",".agents"),$("codebuddy","CodeBuddy",".codebuddy",{capabilities:T({allowedTools:!0})}),$("command-code","Command Code",".commandcode",{capabilities:T({allowedTools:!0})}),$("continue","Continue",".continue"),$("cortex","Cortex Code",".cortex",{globalRootRelativePath:".snowflake/cortex"}),$("crush","Crush",".crush",{globalRootRelativePath:".config/crush"}),oe("deepagents","Deep Agents",".deepagents/agent",{detectGlobal:!0}),$("droid","Droid",".factory"),oe("gemini-cli","Gemini CLI",".gemini",{detectGlobal:!0}),oe("github-copilot","GitHub Copilot",".copilot",{capabilities:T({allowedTools:!0}),detectGlobal:!0}),$("goose","Goose",".goose",{globalRootRelativePath:".config/goose"}),$("junie","Junie",".junie"),$("iflow-cli","iFlow CLI",".iflow"),$("kilo","Kilo Code",".kilocode"),$("kiro-cli","Kiro CLI",".kiro"),$("kode","Kode",".kode"),$("mcpjam","MCPJam",".mcpjam"),$("mistral-vibe","Mistral Vibe",".vibe"),$("mux","Mux",".mux"),$("openhands","OpenHands",".openhands",{capabilities:T({allowedTools:!0})}),$("pi","Pi",".pi",{globalRootRelativePath:".pi/agent",capabilities:T({allowedTools:!0})}),$("qoder","Qoder",".qoder",{capabilities:T({allowedTools:!0})}),$("qwen-code","Qwen Code",".qwen"),$("roo","Roo Code",".roo",{capabilities:T({allowedTools:!0})}),$("trae","Trae",".trae",{detectProject:!1}),$("trae-cn","Trae CN",".trae",{globalRootRelativePath:".trae-cn",detectProject:!1}),$("windsurf","Windsurf",".windsurf",{globalRootRelativePath:".codeium/windsurf"}),$("zencoder","Zencoder",".zencoder",{capabilities:T({allowedTools:!0})}),$("neovate","Neovate",".neovate",{capabilities:T({allowedTools:!0})}),$("pochi","Pochi",".pochi"),$("adal","AdaL",".adal")];function de(e=process.env,t=process.platform,n=process.cwd()){let i=yn(t),r=hn(e,t);return mn.map(s=>{let o=De(e[s.envVar]),a=r&&s.targets.globalRootRelativePath?Ce(i,r,s.targets.globalRootRelativePath):null,c=r&&s.targets.globalSkillsRelativePath?Ce(i,r,s.targets.globalSkillsRelativePath):null,u=s.targets.projectRootRelativePath?Ce(i,n,s.targets.projectRootRelativePath):null,d=o??a;return{id:s.id,displayName:s.displayName,envVar:s.envVar,capabilities:s.capabilities,detectionSources:[],targets:{projectRoot:u,projectSkillsPath:Ce(i,n,s.targets.projectSkillsRelativePath),globalRoot:d,globalSkillsPath:o?i.join(o,"skills"):c}}})}async function fn(e={}){let t=e.env??process.env,n=e.platform??process.platform,i=e.cwd??process.cwd(),r=yn(n),s=hn(t,n),o=de(t,n,i),a=e.pathExists??(async()=>!1);return(await Promise.all(o.map(async c=>{let u=dr(c.id),d=[],p=De(t[c.envVar]);return(p&&await a(p)||p&&await a(r.join(p,"skills")))&&d.push("override"),u.detection.projectProbeRelativePaths.length>0&&await pn({basePath:i,relativePaths:u.detection.projectProbeRelativePaths,pathApi:r,pathExists:a})&&d.push("project"),s&&u.detection.globalProbeRelativePaths.length>0&&await pn({basePath:s,relativePaths:u.detection.globalProbeRelativePaths,pathApi:r,pathExists:a})&&d.push("global"),d.length===0?null:{...c,detectionSources:ur(d)}}))).flatMap(c=>c?[c]:[])}function hn(e,t){return t==="win32"?De(e.USERPROFILE,e.HOME):De(e.HOME)}function yn(e){return e==="win32"?cr:lr}function De(...e){return e.find(t=>typeof t=="string"&&t.trim().length>0)?.trim()}function ur(e){return[...new Set(e)]}async function pn(e){for(let t of e.relativePaths)if(await e.pathExists(Ce(e.pathApi,e.basePath,t)))return!0;return!1}function Ce(e,t,n){return e.join(t,...n.split("/"))}function $(e,t,n,i={}){let r=i.globalRootRelativePath??n,s=i.detectProject??!0;return{id:e,displayName:t,envVar:i.envVar??kn(e),capabilities:i.capabilities??T(),targets:{projectRootRelativePath:n,projectSkillsRelativePath:`${n}/skills`,globalRootRelativePath:r,globalSkillsRelativePath:`${r}/skills`},detection:{projectProbeRelativePaths:s?[n,`${n}/skills`]:[],globalProbeRelativePaths:[r,`${r}/skills`]}}}function oe(e,t,n,i={}){let r=i.detectGlobal??!1;return{id:e,displayName:t,envVar:i.envVar??kn(e),capabilities:i.capabilities??T(),targets:{projectRootRelativePath:".agents",projectSkillsRelativePath:".agents/skills",globalRootRelativePath:n,globalSkillsRelativePath:`${n}/skills`},detection:{projectProbeRelativePaths:[],globalProbeRelativePaths:r?[n,`${n}/skills`]:[]}}}function T(e={}){let t=["basic_skills"];return e.allowedTools&&t.push("allowed_tools"),e.hooks&&t.push("hooks"),e.forkedContext&&t.push("forked_context"),t.push("local_install"),t}function kn(e){return`${e.replaceAll("-","_").toUpperCase()}_HOME`}function dr(e){return mn.find(t=>t.id===e)}var pe="skills-layer",hr="2025-06-18",yr=["mcp","skills-layer-mcp-proxy.mjs"],kr=["mcp","skills-layer-mcp-broker.mjs"],wr=["mcp","skills-layer-mcp-broker.sock"],vr={codex:{tier:"tier_1",configKind:"codex_toml",resolveConfigPath(e,t,n){let i=pt(n);return i.join(e.targets.globalRoot??i.join(Er({},n)??t,".codex"),"config.toml")}},cursor:Re(".cursor/mcp.json"),"claude-code":Re(".mcp.json"),cline:Re(".cline/mcp.json"),"gemini-cli":Re(".gemini/settings.json"),windsurf:Re(".windsurf/mcp.json")},br=new Set(["universal"]);function je(e){let t=de(e.env,e.platform,e.cwd),n=new Map(t.map(P=>[P.id,P])),i=e.platform??process.platform,r=e.cwd??process.cwd(),s=e.stateDir??Ir(e.env,i),o=e.mcpConfigPath??xe(i,s,"mcp.json"),a=xe(i,s,...yr),c=xe(i,s,...kr),u=xe(i,s,...wr),d=e.nodePath??process.execPath,p=Cn({mcpConfigPath:o}),y=Rn({mcpConfigPath:o,socketPath:u}),m=ye(p),h=ye(y),w=ut.map(P=>{let x=n.get(P),B=vr[P];if(B){let Ge=B.resolveConfigPath(x,r,i);return Pr({agentId:P,displayName:x.displayName,configPath:Ge,configKind:B.configKind,bridgePath:a,brokerPath:c,brokerSocketPath:u,mcpConfigPath:o,nodePath:d,bridgeChecksum:m,brokerChecksum:h})}return br.has(P)?vn({agentId:P,displayName:x.displayName,tier:"tier_3",status:"skills_only",verification:"skills_only",reason:"This agent is currently supported through Skills Layer skill files, not MCP auto-install.",instructions:[`Install skills for ${x.displayName} with \`skills-layer install <skill> --agent ${P}\`.`,"MCP auto-install is not claimed for this agent yet."]}):vn({agentId:P,displayName:x.displayName,tier:"tier_2",status:"manual_handoff",verification:"manual",reason:"MCP support or the safe writable config shape has not been verified yet.",instructions:[`Add a local stdio MCP server named ${pe}.`,`Command: ${d}`,`Args: ${a}`,"Restart or reload the agent if it does not reconnect automatically."]})});return{status:"mcp_registration_plan",serverName:pe,mcpUrl:e.mcpUrl,bearerTokenEnvVar:e.bearerTokenEnvVar,clientId:e.clientId,environment:e.environment,generatedAt:e.now,bridgePath:a,brokerPath:c,brokerSocketPath:u,nodePath:d,mcpConfigPath:o,bridgeChecksum:m,brokerChecksum:h,automaticCount:w.filter(P=>P.status==="automatic").length,manualCount:w.filter(P=>P.status==="manual_handoff").length,skillsOnlyCount:w.filter(P=>P.status==="skills_only").length,unsupportedCount:w.filter(P=>P.status==="unsupported").length,targets:w}}async function Sn(e){let t=je(e),n=Lr(e.clientId),i=t.targets.find(w=>w.agentId===n),r=e.mcpConfig??await ze(t.mcpConfigPath,{allowMissing:!0});if(!r)return wn({plan:t,target:i,mcpConfig:null,tokenConfig:null,tokenPresent:!1,tokenRefPresent:!1,bridgeExists:!1,checksumMatches:!1,brokerExists:!1,brokerChecksumMatches:!1,targetConfigured:!1,rawTokenLeaked:!1});let s=await _e(t.bridgePath),o=s!==null,a=s!==null&&ye(s)===t.bridgeChecksum,c=await _e(t.brokerPath),u=c!==null,d=c!==null&&ye(c)===t.brokerChecksum,p=Tr(r,i.agentId),y=te(p,"token"),m=te(p,"tokenRef"),h=i.status==="automatic"?await $r(i,y):{configured:!1,rawTokenLeaked:!1};return wn({plan:t,target:i,mcpConfig:r,tokenConfig:p,tokenPresent:!!y,tokenRefPresent:!!m,bridgeExists:o,checksumMatches:a,brokerExists:u,brokerChecksumMatches:d,targetConfigured:h.configured,rawTokenLeaked:h.rawTokenLeaked})}function Cn(e){return`#!/usr/bin/env node
4
4
  import { createConnection } from "node:net";
5
5
  import { createInterface } from "node:readline";
6
6
  import { readFile } from "node:fs/promises";
7
7
 
8
8
  const CONFIG_PATH = ${JSON.stringify(e.mcpConfigPath)};
9
- const MCP_PROTOCOL_VERSION = ${JSON.stringify(dr)};
9
+ const MCP_PROTOCOL_VERSION = ${JSON.stringify(hr)};
10
10
 
11
11
  function writeMessage(message) {
12
12
  process.stdout.write(JSON.stringify(message) + "\\n");
@@ -148,7 +148,7 @@ for await (const line of rl) {
148
148
  writeMessage(errorResponse(null, -32603, error instanceof Error ? error.message : "Skills Layer MCP bridge failed."));
149
149
  }
150
150
  }
151
- `}function Sn(e){return`#!/usr/bin/env node
151
+ `}function Rn(e){return`#!/usr/bin/env node
152
152
  import { execFile } from "node:child_process";
153
153
  import { createServer } from "node:net";
154
154
  import { chmod, readFile, rm } from "node:fs/promises";
@@ -244,15 +244,15 @@ server.listen(SOCKET_PATH, async () => {
244
244
  // Some platforms do not support chmod on sockets.
245
245
  }
246
246
  });
247
- `}async function Cn(e){let t=e.requestId??1,n=e.timeoutMs??5e3,i=wn(e.nodePath,[e.bridgePath],{stdio:["pipe","pipe","pipe"]}),r="",s=Rr(i.stdout);i.stderr.on("data",u=>{r+=String(u)});let o,l=new Promise(u=>{o=setTimeout(()=>u("timeout"),n)});i.stdin.write(`${JSON.stringify({jsonrpc:"2.0",id:t,method:"tools/list",params:{}})}
248
- `);let c=await Promise.race([s,l]);if(clearTimeout(o),i.kill(),c==="timeout")return{status:"error",method:"tools/list",bridgePath:e.bridgePath,nodePath:e.nodePath,responseReceived:!1,toolCount:null,reasonCode:"probe_timeout",message:"MCP bridge did not respond before the verification timeout."};if(!c.ok)return{status:"error",method:"tools/list",bridgePath:e.bridgePath,nodePath:e.nodePath,responseReceived:!1,toolCount:null,reasonCode:"probe_failed",message:r.trim()?"MCP bridge failed before returning a response.":c.message};try{let u=JSON.parse(c.line);if(V(u)&&V(u.error))return{status:"error",method:"tools/list",bridgePath:e.bridgePath,nodePath:e.nodePath,responseReceived:!0,toolCount:null,reasonCode:"remote_mcp_error",message:X(u.error,"message")??"Skills Layer MCP returned an error."};let d=V(u)&&V(u.result)&&Array.isArray(u.result.tools)?u.result.tools:null;return{status:"ok",method:"tools/list",bridgePath:e.bridgePath,nodePath:e.nodePath,responseReceived:!0,toolCount:d?d.length:null,reasonCode:null,message:d?`MCP bridge responded with ${d.length} tool${d.length===1?"":"s"}.`:"MCP bridge responded."}}catch{return{status:"error",method:"tools/list",bridgePath:e.bridgePath,nodePath:e.nodePath,responseReceived:!0,toolCount:null,reasonCode:"invalid_probe_response",message:"MCP bridge returned a response that was not valid JSON."}}}function yn(e){let t=e.target.status==="automatic",n=e.tokenRefPresent&&!e.tokenPresent,i=!n||e.brokerExists&&e.brokerChecksumMatches,r=(e.tokenPresent||e.tokenRefPresent)&&e.bridgeExists&&e.checksumMatches&&i&&t&&e.targetConfigured&&!e.rawTokenLeaked,s=r?"mcp_configured":e.mcpConfig?"mcp_needs_repair":"mcp_not_configured",o=`skills-layer mcp verify --client ${e.target.agentId}`;return{status:s,configured:r,clientId:e.target.agentId,environment:X(e.tokenConfig,"environment")??X(e.mcpConfig,"environment")??e.plan.environment,baseUrl:X(e.mcpConfig,"baseUrl"),mcpUrl:X(e.mcpConfig,"mcpUrl"),tokenPrefix:X(e.tokenConfig,"tokenPrefix")??X(e.mcpConfig,"tokenPrefix"),scopes:Array.isArray(e.tokenConfig?.scopes)?e.tokenConfig.scopes:Array.isArray(e.mcpConfig?.scopes)?e.mcpConfig.scopes:[],configuredClients:Ir(e.mcpConfig),tokenPresent:e.tokenPresent||e.tokenRefPresent,tokenStorage:X(e.tokenConfig,"credentialStorage")==="macos_keychain"?"macos_keychain":e.tokenPresent?"local_file_locked":"unknown",bridge:{path:e.plan.bridgePath,exists:e.bridgeExists,checksumMatches:e.checksumMatches},broker:{path:e.plan.brokerPath,socketPath:e.plan.brokerSocketPath,required:n,exists:e.brokerExists,checksumMatches:e.brokerChecksumMatches},target:{agentId:e.target.agentId,displayName:e.target.displayName,tier:e.target.tier,status:e.target.status,configPath:e.target.configPath,configured:e.targetConfigured,rawTokenLeaked:e.rawTokenLeaked,reason:e.target.reason,restartRequired:e.target.restartRequired,instructions:e.target.instructions},liveProbe:{status:"not_run",method:"tools/list",reasonCode:"use_mcp_verify",message:`Live MCP tools/list was not run by status. Run \`${o}\` to verify remote MCP reachability through the local bridge.`,nextCommand:o},nextCommand:r?null:`skills-layer mcp repair --client ${e.target.agentId}`}}function yr(e){return{agentId:e.agentId,displayName:e.displayName,tier:"tier_1",status:"automatic",serverName:pe,configPath:e.configPath,restartRequired:!0,verification:"bridge_config_written",transport:"stdio_bridge",bridgePath:e.bridgePath,nodePath:e.nodePath,configKind:e.configKind,reason:"MCP support and a safe local config shape are known.",instructions:[`Skills Layer will install the local MCP bridge at ${e.bridgePath}.`,`Skills Layer will update ${e.configPath} to launch the bridge with ${e.nodePath}.`,"The raw MCP token stays in Skills Layer local storage and is not written to the agent config.","Open a fresh agent session or restart the agent to load the MCP server."],apply:async()=>{let t=await kr({bridgePath:e.bridgePath,brokerPath:e.brokerPath,brokerSocketPath:e.brokerSocketPath,mcpConfigPath:e.mcpConfigPath,nodePath:e.nodePath});return await vr({configPath:e.configPath,configKind:e.configKind,bridgePath:e.bridgePath,nodePath:e.nodePath,agentId:e.agentId}),t},disconnect:async()=>{await br({configPath:e.configPath,configKind:e.configKind})}}}function kn(e){return{agentId:e.agentId,displayName:e.displayName,tier:e.tier,status:e.status,serverName:pe,configPath:null,restartRequired:!0,verification:e.verification,transport:"manual",bridgePath:null,nodePath:null,configKind:null,reason:e.reason,instructions:e.instructions}}async function kr(e){let t=Pn({mcpConfigPath:e.mcpConfigPath}),n=Sn({mcpConfigPath:e.mcpConfigPath,socketPath:e.brokerSocketPath});return await Je($e(e.bridgePath),{recursive:!0}),await he(e.bridgePath,t,"utf8"),await he(e.brokerPath,n,"utf8"),await ut($e(e.bridgePath),448),await ut(e.bridgePath,448),await ut(e.brokerPath,448),wr({nodePath:e.nodePath,brokerPath:e.brokerPath}),{bridgePath:e.bridgePath,brokerPath:e.brokerPath,brokerSocketPath:e.brokerSocketPath,mcpConfigPath:e.mcpConfigPath,checksum:ye(t),brokerChecksum:ye(n),nodePath:e.nodePath}}function wr(e){if(!(process.env.VITEST==="true"||process.env.SKILLS_LAYER_MCP_BROKER_AUTOSTART==="disabled"))try{wn(e.nodePath,[e.brokerPath],{detached:!0,stdio:"ignore"}).unref()}catch{}}async function vr(e){if(e.configKind==="codex_toml"){await Cr(e);return}await Sr(e)}async function br(e){if(e.configKind==="codex_toml"){let i=await _e(e.configPath);if(i===null)return;await he(e.configPath,Rn(i),"utf8");return}let t=await ze(e.configPath,{allowMissing:!0});if(!t||!V(t.mcpServers))return;let n={...t.mcpServers};delete n[pe],await Je($e(e.configPath),{recursive:!0}),await he(e.configPath,`${JSON.stringify({...t,mcpServers:n},null,2)}
249
- `,"utf8")}async function Pr(e,t){if(!e.configPath||!e.configKind||!e.bridgePath||!e.nodePath)return{configured:!1,rawTokenLeaked:!1};if(e.configKind==="codex_toml"){let s=await _e(e.configPath);return s===null?{configured:!1,rawTokenLeaked:!1}:{configured:s.includes("[mcp_servers.skills-layer]")&&s.includes(`command = ${JSON.stringify(e.nodePath)}`)&&(s.includes(`args = [${JSON.stringify(e.bridgePath)}, "--client", ${JSON.stringify(e.agentId)}]`)||s.includes(`args = [${JSON.stringify(e.bridgePath)}]`)),rawTokenLeaked:!!(t&&s.includes(t))}}let n=await ze(e.configPath,{allowMissing:!0}),i=V(n?.mcpServers)?n.mcpServers[pe]:void 0;return{configured:V(i)&&i.command===e.nodePath&&Array.isArray(i.args)&&i.args[0]===e.bridgePath&&(i.args.length===1||i.args[1]==="--client"&&i.args[2]===e.agentId),rawTokenLeaked:!!(t&&JSON.stringify(n??{}).includes(t))}}async function Sr(e){let t=await ze(e.configPath,{allowMissing:!0})??{},n=V(t.mcpServers)?{...t.mcpServers}:{};n[pe]={command:e.nodePath,args:[e.bridgePath,"--client",e.agentId]},await Je($e(e.configPath),{recursive:!0}),await he(e.configPath,`${JSON.stringify({...t,mcpServers:n},null,2)}
250
- `,"utf8")}async function Cr(e){let t=await _e(e.configPath)??"",n=["[mcp_servers.skills-layer]",`command = ${JSON.stringify(e.nodePath)}`,`args = [${JSON.stringify(e.bridgePath)}, "--client", ${JSON.stringify(e.agentId)}]`,""].join(`
251
- `),i=`${Rn(t).trimEnd()}${t.trim().length>0?`
252
-
253
- `:""}${n}`;await Je($e(e.configPath),{recursive:!0}),await he(e.configPath,i,"utf8")}function Rn(e){let t=e.split(/\r?\n/u),n=[],i=!1;for(let r of t){if(r.trim()==="[mcp_servers.skills-layer]"){i=!0;continue}i&&/^\s*\[.+\]\s*$/u.test(r)&&(i=!1),i||n.push(r)}return n.join(`
254
- `).trimEnd()}function Re(e){return{tier:"tier_1",configKind:"json_mcp_servers",resolveConfigPath(t,n,i){return xe(i,n,...e.split("/"))}}}async function ze(e,t){try{let n=JSON.parse(await vn(e,"utf8"));return V(n)?n:{}}catch(n){if(t.allowMissing&&n.code==="ENOENT")return null;throw n}}async function _e(e){try{return await vn(e,"utf8")}catch(t){if(t.code==="ENOENT")return null;throw t}}async function ut(e,t){try{await lr(e,t)}catch{}}async function xn(e){await dt(e,{force:!0})}async function $n(e,t){await Promise.all([dt(e,{force:!0}),dt(t,{force:!0})])}function Rr(e){return e?new Promise(t=>{let n="";e.on("data",i=>{n+=String(i);let r=n.indexOf(`
255
- `);r>=0&&t({ok:!0,line:n.slice(0,r)})}),e.on("error",i=>{t({ok:!1,message:i instanceof Error?i.message:"MCP bridge stdout failed."})}),e.on("end",()=>{t({ok:!1,message:"MCP bridge exited before returning a response."})})}):Promise.resolve({ok:!1,message:"MCP bridge stdout was not available."})}function xr(e,t){let n=gt(t),i=e??process.env,r=t==="win32"?He(i.APPDATA,i.USERPROFILE,i.HOME):He(i.XDG_CONFIG_HOME,i.HOME?n.join(i.HOME,".skills-layer"):void 0);return r?t==="win32"||i.XDG_CONFIG_HOME?.trim()?n.join(r,"skills-layer"):r:n.join(process.cwd(),".skills-layer")}function $r(e,t){return t==="win32"?He(e.USERPROFILE,e.HOME):He(e.HOME)}function _r(e){return ct.includes(e)?e:"codex"}function Ar(e,t){let n=e.tokens;return V(n)&&V(n[t])?n[t]:e}function Ir(e){if(!e)return[];let t=e.clientIds;if(Array.isArray(t))return t.filter(r=>typeof r=="string"&&r.trim().length>0);let n=e.tokens;if(V(n))return Object.keys(n);let i=X(e,"clientId");return i?[i]:[]}function xe(e,...t){return gt(e).join(...t)}function gt(e){return e==="win32"?ur:cr}function He(...e){return e.find(t=>typeof t=="string"&&t.trim().length>0)?.trim()}function X(e,t){let n=e?.[t];return typeof n=="string"&&n.trim().length>0?n:null}function ye(e){return ar("sha256").update(e).digest("hex")}function V(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function jr(e){let t=Er(e);if(t)return t;let n=Lr(e);if(n)return n;throw new Error("Unsupported bundle archive format")}function _n(e){try{return jr(e)}catch{return null}}function Er(e){if(e.byteLength<4)return null;let t=new TextDecoder,n=new DataView(e.buffer,e.byteOffset,e.byteLength),i=[],r=0,s=!1;for(;r+4<=e.byteLength;){let o=n.getUint32(r,!0);if(o===67324752){if(s=!0,r+30>e.byteLength)throw new Error("ZIP local header is truncated");let l=n.getUint16(r+8,!0),c=n.getUint32(r+18,!0),u=n.getUint16(r+26,!0),d=n.getUint16(r+28,!0),p=r+30,y=p+u+d,m=y+c;if(l!==0)throw new Error("Only stored ZIP entries are supported");if(m>e.byteLength)throw new Error("ZIP entry data is truncated");i.push({path:t.decode(e.slice(p,p+u)),content:t.decode(e.slice(y,m))}),r=m;continue}return o===33639248||o===101010256?s?i:null:s?(()=>{throw new Error("Unexpected ZIP signature")})():null}return i}function Lr(e){try{let t=JSON.parse(new TextDecoder().decode(e));return t.format!=="skills-layer-external-bundle-v1"||!Array.isArray(t.files)?null:t.files.filter(n=>typeof n.path=="string").map(n=>({path:n.path,...typeof n.content=="string"?{content:n.content}:{}}))}catch{return null}}import{createHash as Tr}from"node:crypto";function An(e){let t=Tr("sha256");for(let n of e)t.update(n.path),t.update("\0"),t.update(n.content??""),t.update("\0");return t.digest("hex")}var pt=["productivity","coding","review","testing","devops","data","documents","media","research","planning","design","security","business","education","automation","communication","email","customer-support","sales","marketing","finance","legal","operations","project-management","writing","translation","knowledge-management","hr","ai","ecommerce"],Ur="productivity",Br=new Set(pt),Mr={ci:"devops","ci-cd":"devops",compliance:"security",content:"documents",crm:"customer-support",docs:"documents",frontend:"coding","customer-service":"customer-support","customer-success":"customer-support","e-commerce":"ecommerce",genai:"ai",legal:"legal",llm:"ai",ops:"operations",pm:"project-management",reporting:"business",reports:"business","team-ops":"operations",ui:"design",ux:"design","web-development":"coding"},Nr={productivity:["productivity","todo","task","tasks","calendar","meeting","notes","workflow","focus"],coding:["code","coding","developer","frontend","backend","repository","typescript","javascript","react","vite","html","css","component","bundle","artifact"],review:["review","reviews","critique","audit","feedback","pr","pull","quality"],testing:["test","tests","testing","qa","coverage","regression","playwright","vitest"],devops:["deploy","deployment","ci","cd","pipeline","infra","infrastructure","docker","cloudflare","wrangler"],data:["data","dataset","sql","database","analytics","metrics","spreadsheet","csv","json"],documents:["document","documents","doc","docs","pdf","report","reports","contract","proposal","writing"],media:["media","image","video","audio","transcript","youtube","asset","thumbnail"],research:["research","search","sources","citation","citations","summarize","summaries","literature"],planning:["plan","planning","project","roadmap","milestone","sprint","delivery","schedule"],design:["design","ui","ux","layout","wireframe","prototype","figma","tailwind","shadcn"],security:["security","threat","secret","secrets","vulnerability","vulnerabilities","risk","policy"],business:["business","strategy","customer","market","stakeholder","commercial","pricing"],education:["education","teach","teaching","learn","learning","lesson","course","tutorial"],automation:["automation","automate","workflow","script","scripts","bot","trigger","orchestration"],communication:["communication","slack","message","messages","chat","reply","announcement","conversation"],email:["email","emails","gmail","googleemail","googlemail","outlook","inbox","mail","newsletter"],"customer-support":["support","ticket","tickets","helpdesk","customer","service","csat","escalation"],sales:["sales","lead","leads","prospect","pipeline","deal","deals","crm","account"],marketing:["marketing","campaign","brand","seo","content","social","audience","copy"],finance:["finance","financial","invoice","invoices","budget","forecast","accounting","revenue","tax"],legal:["legal","contract","contracts","clause","clauses","compliance","policy","terms","privacy"],operations:["operations","ops","runbook","process","sop","incident","queue","handoff"],"project-management":["project","projects","backlog","dependency","dependencies","kanban","scrum","pm"],writing:["writing","write","draft","edit","editing","blog","article","copywriting"],translation:["translation","translate","localization","locale","language","languages","i18n"],"knowledge-management":["knowledge","wiki","kb","retrieval","archive","taxonomy","knowledgebase"],hr:["hr","hiring","recruiting","interview","onboarding","employee","people","performance"],ai:["ai","llm","prompt","prompts","model","models","agent","agents","rag","embedding"],ecommerce:["ecommerce","commerce","shop","store","checkout","cart","order","orders","product"]};function In(e){if(typeof e!="string")return null;let t=En(e);return Br.has(t)?t:Mr[t]??null}function jn(e){let t=[{value:e.slug??"",weight:3,signal:"slug"},{value:e.name??"",weight:3,signal:"name"},{value:e.description??"",weight:2,signal:"description"},{value:e.skillType??"",weight:1,signal:"skill_type"},{value:e.compatibility??"",weight:1,signal:"compatibility"},{value:(e.tags??[]).join(" "),weight:4,signal:"tags"},{value:e.body??"",weight:1,signal:"body"}].filter(s=>s.value.trim().length>0),n=new Map;for(let s of t){let o=Fr(s.value);for(let[l,c]of Object.entries(Nr)){if(!c.some(p=>o.has(p)))continue;let d=n.get(l)??{score:0,signals:new Set};d.score+=s.weight,d.signals.add(s.signal),n.set(l,d)}}let r=[...n.entries()].sort((s,o)=>o[1].score-s[1].score||pt.indexOf(s[0])-pt.indexOf(o[0]))[0];return!r||r[1].score<2?{category:Or(e),confidence:"fallback",matchedSignals:[]}:{category:r[0],confidence:r[1].score>=5?"high":r[1].score>=3?"medium":"low",matchedSignals:[...r[1].signals].sort()}}function Or(e){let t=En(e.skillType??"");return t.includes("automation")?"automation":t.includes("mcp")?"ai":Ur}function En(e){return e.trim().toLowerCase().replace(/[_\s]+/gu,"-")}function Fr(e){return new Set(e.toLowerCase().split(/[^a-z0-9]+/u).map(t=>t.trim()).filter(t=>t.length>=2).flatMap(qr))}function qr(e){let t=[e];return e.endsWith("ing")&&e.length>5&&t.push(e.slice(0,-3)),e.endsWith("s")&&e.length>4&&t.push(e.slice(0,-1)),t}var Kr=["standalone","workflow_automation","mcp_enhanced"];function Ln(e){let t=e?.trim();if(!t)return"standalone";if(t==="workflow")return"workflow_automation";if(!Kr.includes(t))throw new Error(`Unsupported skill type "${t}". Supported types: standalone, workflow, workflow_automation, mcp_enhanced.`);return t}function Tn(e){return[{path:"SKILL.md",content:Gr(e)},{path:"README.md",content:Dr(e)},{path:"references/guide.md",content:Jr(e)},{path:"scripts/README.md",content:Hr(e)}]}function Gr(e){let t=zr(e);return`---
247
+ `}async function xn(e){let t=e.requestId??1,n=e.timeoutMs??5e3,i=bn(e.nodePath,[e.bridgePath],{stdio:["pipe","pipe","pipe"]}),r="",s=Ar(i.stdout);i.stderr.on("data",u=>{r+=String(u)});let o,a=new Promise(u=>{o=setTimeout(()=>u("timeout"),n)});i.stdin.write(`${JSON.stringify({jsonrpc:"2.0",id:t,method:"tools/list",params:{}})}
248
+ `);let c=await Promise.race([s,a]);if(clearTimeout(o),i.kill(),c==="timeout")return{status:"error",method:"tools/list",bridgePath:e.bridgePath,nodePath:e.nodePath,responseReceived:!1,toolCount:null,reasonCode:"probe_timeout",message:"MCP bridge did not respond before the verification timeout."};if(!c.ok)return{status:"error",method:"tools/list",bridgePath:e.bridgePath,nodePath:e.nodePath,responseReceived:!1,toolCount:null,reasonCode:"probe_failed",message:r.trim()?"MCP bridge failed before returning a response.":c.message};try{let u=JSON.parse(c.line);if(Z(u)&&Z(u.error))return{status:"error",method:"tools/list",bridgePath:e.bridgePath,nodePath:e.nodePath,responseReceived:!0,toolCount:null,reasonCode:"remote_mcp_error",message:te(u.error,"message")??"Skills Layer MCP returned an error."};let d=Z(u)&&Z(u.result)&&Array.isArray(u.result.tools)?u.result.tools:null;return{status:"ok",method:"tools/list",bridgePath:e.bridgePath,nodePath:e.nodePath,responseReceived:!0,toolCount:d?d.length:null,reasonCode:null,message:d?`MCP bridge responded with ${d.length} tool${d.length===1?"":"s"}.`:"MCP bridge responded."}}catch{return{status:"error",method:"tools/list",bridgePath:e.bridgePath,nodePath:e.nodePath,responseReceived:!0,toolCount:null,reasonCode:"invalid_probe_response",message:"MCP bridge returned a response that was not valid JSON."}}}function wn(e){let t=e.target.status==="automatic",n=e.tokenRefPresent&&!e.tokenPresent,i=!n||e.brokerExists&&e.brokerChecksumMatches,r=(e.tokenPresent||e.tokenRefPresent)&&e.bridgeExists&&e.checksumMatches&&i&&t&&e.targetConfigured&&!e.rawTokenLeaked,s=r?"mcp_configured":e.mcpConfig?"mcp_needs_repair":"mcp_not_configured",o=`skills-layer mcp verify --client ${e.target.agentId}`;return{status:s,configured:r,clientId:e.target.agentId,environment:te(e.tokenConfig,"environment")??te(e.mcpConfig,"environment")??e.plan.environment,baseUrl:te(e.mcpConfig,"baseUrl"),mcpUrl:te(e.mcpConfig,"mcpUrl"),tokenPrefix:te(e.tokenConfig,"tokenPrefix")??te(e.mcpConfig,"tokenPrefix"),scopes:Array.isArray(e.tokenConfig?.scopes)?e.tokenConfig.scopes:Array.isArray(e.mcpConfig?.scopes)?e.mcpConfig.scopes:[],configuredClients:Ur(e.mcpConfig),tokenPresent:e.tokenPresent||e.tokenRefPresent,tokenStorage:te(e.tokenConfig,"credentialStorage")==="macos_keychain"?"macos_keychain":e.tokenPresent?"local_file_locked":"unknown",bridge:{path:e.plan.bridgePath,exists:e.bridgeExists,checksumMatches:e.checksumMatches},broker:{path:e.plan.brokerPath,socketPath:e.plan.brokerSocketPath,required:n,exists:e.brokerExists,checksumMatches:e.brokerChecksumMatches},target:{agentId:e.target.agentId,displayName:e.target.displayName,tier:e.target.tier,status:e.target.status,configPath:e.target.configPath,configured:e.targetConfigured,rawTokenLeaked:e.rawTokenLeaked,reason:e.target.reason,restartRequired:e.target.restartRequired,instructions:e.target.instructions},liveProbe:{status:"not_run",method:"tools/list",reasonCode:"use_mcp_verify",message:`Live MCP tools/list was not run by status. Run \`${o}\` to verify remote MCP reachability through the local bridge.`,nextCommand:o},nextCommand:r?null:`skills-layer mcp repair --client ${e.target.agentId}`}}function Pr(e){return{agentId:e.agentId,displayName:e.displayName,tier:"tier_1",status:"automatic",serverName:pe,configPath:e.configPath,restartRequired:!0,verification:"bridge_config_written",transport:"stdio_bridge",bridgePath:e.bridgePath,nodePath:e.nodePath,configKind:e.configKind,reason:"MCP support and a safe local config shape are known.",instructions:[`Skills Layer will install the local MCP bridge at ${e.bridgePath}.`,`Skills Layer will update ${e.configPath} to launch the bridge with ${e.nodePath}.`,"The raw MCP token stays in Skills Layer local storage and is not written to the agent config.","Open a fresh agent session or restart the agent to load the MCP server."],apply:async()=>{let t=await Sr({bridgePath:e.bridgePath,brokerPath:e.brokerPath,brokerSocketPath:e.brokerSocketPath,mcpConfigPath:e.mcpConfigPath,nodePath:e.nodePath});return await Rr({configPath:e.configPath,configKind:e.configKind,bridgePath:e.bridgePath,nodePath:e.nodePath,agentId:e.agentId}),t},disconnect:async()=>{await xr({configPath:e.configPath,configKind:e.configKind})}}}function vn(e){return{agentId:e.agentId,displayName:e.displayName,tier:e.tier,status:e.status,serverName:pe,configPath:null,restartRequired:!0,verification:e.verification,transport:"manual",bridgePath:null,nodePath:null,configKind:null,reason:e.reason,instructions:e.instructions}}async function Sr(e){let t=Cn({mcpConfigPath:e.mcpConfigPath}),n=Rn({mcpConfigPath:e.mcpConfigPath,socketPath:e.brokerSocketPath});return await Je($e(e.bridgePath),{recursive:!0}),await he(e.bridgePath,t,"utf8"),await he(e.brokerPath,n,"utf8"),await dt($e(e.bridgePath),448),await dt(e.bridgePath,448),await dt(e.brokerPath,448),Cr({nodePath:e.nodePath,brokerPath:e.brokerPath}),{bridgePath:e.bridgePath,brokerPath:e.brokerPath,brokerSocketPath:e.brokerSocketPath,mcpConfigPath:e.mcpConfigPath,checksum:ye(t),brokerChecksum:ye(n),nodePath:e.nodePath}}function Cr(e){if(!(process.env.VITEST==="true"||process.env.SKILLS_LAYER_MCP_BROKER_AUTOSTART==="disabled"))try{bn(e.nodePath,[e.brokerPath],{detached:!0,stdio:"ignore"}).unref()}catch{}}async function Rr(e){if(e.configKind==="codex_toml"){await jr(e);return}await _r(e)}async function xr(e){if(e.configKind==="codex_toml"){let i=await _e(e.configPath);if(i===null)return;await he(e.configPath,$n(i),"utf8");return}let t=await ze(e.configPath,{allowMissing:!0});if(!t||!Z(t.mcpServers))return;let n={...t.mcpServers};delete n[pe],await Je($e(e.configPath),{recursive:!0}),await he(e.configPath,`${JSON.stringify({...t,mcpServers:n},null,2)}
249
+ `,"utf8")}async function $r(e,t){if(!e.configPath||!e.configKind||!e.bridgePath||!e.nodePath)return{configured:!1,rawTokenLeaked:!1};if(e.configKind==="codex_toml"){let s=await _e(e.configPath);return s===null?{configured:!1,rawTokenLeaked:!1}:{configured:s.includes("[mcp_servers.skills-layer]")&&s.includes(`command = ${JSON.stringify(e.nodePath)}`)&&(s.includes(`args = [${JSON.stringify(e.bridgePath)}, "--client", ${JSON.stringify(e.agentId)}]`)||s.includes(`args = [${JSON.stringify(e.bridgePath)}]`)),rawTokenLeaked:!!(t&&s.includes(t))}}let n=await ze(e.configPath,{allowMissing:!0}),i=Z(n?.mcpServers)?n.mcpServers[pe]:void 0;return{configured:Z(i)&&i.command===e.nodePath&&Array.isArray(i.args)&&i.args[0]===e.bridgePath&&(i.args.length===1||i.args[1]==="--client"&&i.args[2]===e.agentId),rawTokenLeaked:!!(t&&JSON.stringify(n??{}).includes(t))}}async function _r(e){let t=await ze(e.configPath,{allowMissing:!0})??{},n=Z(t.mcpServers)?{...t.mcpServers}:{};n[pe]={command:e.nodePath,args:[e.bridgePath,"--client",e.agentId]},await Je($e(e.configPath),{recursive:!0}),await he(e.configPath,`${JSON.stringify({...t,mcpServers:n},null,2)}
250
+ `,"utf8")}async function jr(e){let t=await _e(e.configPath)??"",n=["[mcp_servers.skills-layer]",`command = ${JSON.stringify(e.nodePath)}`,`args = [${JSON.stringify(e.bridgePath)}, "--client", ${JSON.stringify(e.agentId)}]`,""].join(`
251
+ `),i=`${$n(t).trimEnd()}${t.trim().length>0?`
252
+
253
+ `:""}${n}`;await Je($e(e.configPath),{recursive:!0}),await he(e.configPath,i,"utf8")}function $n(e){let t=e.split(/\r?\n/u),n=[],i=!1;for(let r of t){if(r.trim()==="[mcp_servers.skills-layer]"){i=!0;continue}i&&/^\s*\[.+\]\s*$/u.test(r)&&(i=!1),i||n.push(r)}return n.join(`
254
+ `).trimEnd()}function Re(e){return{tier:"tier_1",configKind:"json_mcp_servers",resolveConfigPath(t,n,i){return xe(i,n,...e.split("/"))}}}async function ze(e,t){try{let n=JSON.parse(await Pn(e,"utf8"));return Z(n)?n:{}}catch(n){if(t.allowMissing&&n.code==="ENOENT")return null;throw n}}async function _e(e){try{return await Pn(e,"utf8")}catch(t){if(t.code==="ENOENT")return null;throw t}}async function dt(e,t){try{await pr(e,t)}catch{}}async function _n(e){await gt(e,{force:!0})}async function jn(e,t){await Promise.all([gt(e,{force:!0}),gt(t,{force:!0})])}function Ar(e){return e?new Promise(t=>{let n="";e.on("data",i=>{n+=String(i);let r=n.indexOf(`
255
+ `);r>=0&&t({ok:!0,line:n.slice(0,r)})}),e.on("error",i=>{t({ok:!1,message:i instanceof Error?i.message:"MCP bridge stdout failed."})}),e.on("end",()=>{t({ok:!1,message:"MCP bridge exited before returning a response."})})}):Promise.resolve({ok:!1,message:"MCP bridge stdout was not available."})}function Ir(e,t){let n=pt(t),i=e??process.env,r=t==="win32"?He(i.APPDATA,i.USERPROFILE,i.HOME):He(i.XDG_CONFIG_HOME,i.HOME?n.join(i.HOME,".skills-layer"):void 0);return r?t==="win32"||i.XDG_CONFIG_HOME?.trim()?n.join(r,"skills-layer"):r:n.join(process.cwd(),".skills-layer")}function Er(e,t){return t==="win32"?He(e.USERPROFILE,e.HOME):He(e.HOME)}function Lr(e){return ut.includes(e)?e:"codex"}function Tr(e,t){let n=e.tokens;return Z(n)&&Z(n[t])?n[t]:e}function Ur(e){if(!e)return[];let t=e.clientIds;if(Array.isArray(t))return t.filter(r=>typeof r=="string"&&r.trim().length>0);let n=e.tokens;if(Z(n))return Object.keys(n);let i=te(e,"clientId");return i?[i]:[]}function xe(e,...t){return pt(e).join(...t)}function pt(e){return e==="win32"?fr:mr}function He(...e){return e.find(t=>typeof t=="string"&&t.trim().length>0)?.trim()}function te(e,t){let n=e?.[t];return typeof n=="string"&&n.trim().length>0?n:null}function ye(e){return gr("sha256").update(e).digest("hex")}function Z(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Br(e){let t=Mr(e);if(t)return t;let n=Nr(e);if(n)return n;throw new Error("Unsupported bundle archive format")}function An(e){try{return Br(e)}catch{return null}}function Mr(e){if(e.byteLength<4)return null;let t=new TextDecoder,n=new DataView(e.buffer,e.byteOffset,e.byteLength),i=[],r=0,s=!1;for(;r+4<=e.byteLength;){let o=n.getUint32(r,!0);if(o===67324752){if(s=!0,r+30>e.byteLength)throw new Error("ZIP local header is truncated");let a=n.getUint16(r+8,!0),c=n.getUint32(r+18,!0),u=n.getUint16(r+26,!0),d=n.getUint16(r+28,!0),p=r+30,y=p+u+d,m=y+c;if(a!==0)throw new Error("Only stored ZIP entries are supported");if(m>e.byteLength)throw new Error("ZIP entry data is truncated");i.push({path:t.decode(e.slice(p,p+u)),content:t.decode(e.slice(y,m))}),r=m;continue}return o===33639248||o===101010256?s?i:null:s?(()=>{throw new Error("Unexpected ZIP signature")})():null}return i}function Nr(e){try{let t=JSON.parse(new TextDecoder().decode(e));return t.format!=="skills-layer-external-bundle-v1"||!Array.isArray(t.files)?null:t.files.filter(n=>typeof n.path=="string").map(n=>({path:n.path,...typeof n.content=="string"?{content:n.content}:{}}))}catch{return null}}import{createHash as Or}from"node:crypto";function In(e){let t=Or("sha256");for(let n of e)t.update(n.path),t.update("\0"),t.update(n.content??""),t.update("\0");return t.digest("hex")}var mt=["productivity","coding","review","testing","devops","data","documents","media","research","planning","design","security","business","education","automation","communication","email","customer-support","sales","marketing","finance","legal","operations","project-management","writing","translation","knowledge-management","hr","ai","ecommerce"],Fr="productivity",qr=new Set(mt),Kr={ci:"devops","ci-cd":"devops",compliance:"security",content:"documents",crm:"customer-support",docs:"documents",frontend:"coding","customer-service":"customer-support","customer-success":"customer-support","e-commerce":"ecommerce",genai:"ai",legal:"legal",llm:"ai",ops:"operations",pm:"project-management",reporting:"business",reports:"business","team-ops":"operations",ui:"design",ux:"design","web-development":"coding"},Gr={productivity:["productivity","todo","task","tasks","calendar","meeting","notes","workflow","focus"],coding:["code","coding","developer","frontend","backend","repository","typescript","javascript","react","vite","html","css","component","bundle","artifact"],review:["review","reviews","critique","audit","feedback","pr","pull","quality"],testing:["test","tests","testing","qa","coverage","regression","playwright","vitest"],devops:["deploy","deployment","ci","cd","pipeline","infra","infrastructure","docker","cloudflare","wrangler"],data:["data","dataset","sql","database","analytics","metrics","spreadsheet","csv","json"],documents:["document","documents","doc","docs","pdf","report","reports","contract","proposal","writing"],media:["media","image","video","audio","transcript","youtube","asset","thumbnail"],research:["research","search","sources","citation","citations","summarize","summaries","literature"],planning:["plan","planning","project","roadmap","milestone","sprint","delivery","schedule"],design:["design","ui","ux","layout","wireframe","prototype","figma","tailwind","shadcn"],security:["security","threat","secret","secrets","vulnerability","vulnerabilities","risk","policy"],business:["business","strategy","customer","market","stakeholder","commercial","pricing"],education:["education","teach","teaching","learn","learning","lesson","course","tutorial"],automation:["automation","automate","workflow","script","scripts","bot","trigger","orchestration"],communication:["communication","slack","message","messages","chat","reply","announcement","conversation"],email:["email","emails","gmail","googleemail","googlemail","outlook","inbox","mail","newsletter"],"customer-support":["support","ticket","tickets","helpdesk","customer","service","csat","escalation"],sales:["sales","lead","leads","prospect","pipeline","deal","deals","crm","account"],marketing:["marketing","campaign","brand","seo","content","social","audience","copy"],finance:["finance","financial","invoice","invoices","budget","forecast","accounting","revenue","tax"],legal:["legal","contract","contracts","clause","clauses","compliance","policy","terms","privacy"],operations:["operations","ops","runbook","process","sop","incident","queue","handoff"],"project-management":["project","projects","backlog","dependency","dependencies","kanban","scrum","pm"],writing:["writing","write","draft","edit","editing","blog","article","copywriting"],translation:["translation","translate","localization","locale","language","languages","i18n"],"knowledge-management":["knowledge","wiki","kb","retrieval","archive","taxonomy","knowledgebase"],hr:["hr","hiring","recruiting","interview","onboarding","employee","people","performance"],ai:["ai","llm","prompt","prompts","model","models","agent","agents","rag","embedding"],ecommerce:["ecommerce","commerce","shop","store","checkout","cart","order","orders","product"]};function En(e){if(typeof e!="string")return null;let t=Un(e);return qr.has(t)?t:Kr[t]??null}function Ln(e){let t=e.trim().toLowerCase().replace(/[_\s]+/gu,"-"),n={ai:"AI",hr:"HR",ecommerce:"E-commerce","e-commerce":"E-commerce"};return n[t]?n[t]:e.split(/[-_\s]+/u).filter(Boolean).map(i=>`${i.slice(0,1).toUpperCase()}${i.slice(1)}`).join(" ")}function Tn(e){let t=[{value:e.slug??"",weight:3,signal:"slug"},{value:e.name??"",weight:3,signal:"name"},{value:e.description??"",weight:2,signal:"description"},{value:e.skillType??"",weight:1,signal:"skill_type"},{value:e.compatibility??"",weight:1,signal:"compatibility"},{value:(e.tags??[]).join(" "),weight:4,signal:"tags"},{value:e.body??"",weight:1,signal:"body"}].filter(s=>s.value.trim().length>0),n=new Map;for(let s of t){let o=Hr(s.value);for(let[a,c]of Object.entries(Gr)){if(!c.some(p=>o.has(p)))continue;let d=n.get(a)??{score:0,signals:new Set};d.score+=s.weight,d.signals.add(s.signal),n.set(a,d)}}let r=[...n.entries()].sort((s,o)=>o[1].score-s[1].score||mt.indexOf(s[0])-mt.indexOf(o[0]))[0];return!r||r[1].score<2?{category:Dr(e),confidence:"fallback",matchedSignals:[]}:{category:r[0],confidence:r[1].score>=5?"high":r[1].score>=3?"medium":"low",matchedSignals:[...r[1].signals].sort()}}function Dr(e){let t=Un(e.skillType??"");return t.includes("automation")?"automation":t.includes("mcp")?"ai":Fr}function Un(e){return e.trim().toLowerCase().replace(/[_\s]+/gu,"-")}function Hr(e){return new Set(e.toLowerCase().split(/[^a-z0-9]+/u).map(t=>t.trim()).filter(t=>t.length>=2).flatMap(Jr))}function Jr(e){let t=[e];return e.endsWith("ing")&&e.length>5&&t.push(e.slice(0,-3)),e.endsWith("s")&&e.length>4&&t.push(e.slice(0,-1)),t}var zr=["standalone","workflow_automation","mcp_enhanced"];function Bn(e){let t=e?.trim();if(!t)return"standalone";if(t==="workflow")return"workflow_automation";if(!zr.includes(t))throw new Error(`Unsupported skill type "${t}". Supported types: standalone, workflow, workflow_automation, mcp_enhanced.`);return t}function Mn(e){return[{path:"SKILL.md",content:Wr(e)},{path:"README.md",content:Vr(e)},{path:"references/guide.md",content:Zr(e)},{path:"scripts/README.md",content:Yr(e)}]}function Wr(e){let t=Qr(e);return`---
256
256
  name: ${e.skillSlug}
257
257
  description: ${e.description}
258
258
  compatibility: Codex, Claude Code
@@ -267,7 +267,7 @@ metadata:
267
267
  - model_context
268
268
  - filesystem_read
269
269
  ---
270
- # ${mt(e.skillSlug)}
270
+ # ${ft(e.skillSlug)}
271
271
 
272
272
  Use this skill when the user needs ${e.description.toLowerCase()}
273
273
 
@@ -280,7 +280,7 @@ Use this skill when the user needs ${e.description.toLowerCase()}
280
280
 
281
281
  - If the skill does not trigger, make the user request more explicit and mention the task directly.
282
282
  - Move deeper procedures into [references/guide.md](references/guide.md) to keep this file concise.
283
- `}function Dr(e){return`# ${mt(e.skillSlug)}
283
+ `}function Vr(e){return`# ${ft(e.skillSlug)}
284
284
 
285
285
  This scaffold was created for a ${e.skillType.replaceAll("_"," ")} skill.
286
286
 
@@ -303,12 +303,12 @@ Current summary:
303
303
  - Slug: \`${e.skillSlug}\`
304
304
  - Description: ${e.description}
305
305
  - Default price: free (\`price_cents: 0\`)
306
- `}function Hr(e){return`# Scripts
306
+ `}function Yr(e){return`# Scripts
307
307
 
308
308
  Place optional helper scripts for \`${e.skillSlug}\` here.
309
309
 
310
310
  Only include files that are required by the skill workflow. Keep the runtime surface small so bundle packaging stays predictable.
311
- `}function Jr(e){return`# ${mt(e.skillSlug)} Guide
311
+ `}function Zr(e){return`# ${ft(e.skillSlug)} Guide
312
312
 
313
313
  ## Intent
314
314
 
@@ -320,15 +320,15 @@ Document the decision rules, expected inputs, and success criteria for this ${e.
320
320
  - Example prompts that should trigger the skill
321
321
  - Failure cases and recovery guidance
322
322
  - Tooling or policy constraints
323
- `}function mt(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}function zr(e){let t=In(e.category);return t||jn({name:e.skillSlug,slug:e.skillSlug,description:e.description,skillType:e.skillType}).category}import{execFile as Wr}from"node:child_process";import{createHash as Vr}from"node:crypto";import{promisify as Yr}from"node:util";var ft=Yr(Wr),Ie="apiKey",ke="apiKeyRef",je="Skills Layer CLI";function ht(e=process.platform,t=process.env){let n=t.SKILLS_LAYER_CREDENTIAL_STORE?.trim().toLowerCase();return n==="local-file"||n==="local_file"||n==="disabled"||e!=="darwin"||process.env.VITEST==="true"&&n!=="macos-keychain"&&n!=="macos_keychain"?null:Xr()}async function Un(e,t){if(!(typeof e[Ie]=="string"&&e[Ie].length>0))return e;let i=yt(t);if(!i)return e;try{let r={...e,credentialStorage:"macos_keychain"},s=Qr(e);return await i.set(kt(t),s,e[Ie]),r[ke]=s,delete r[Ie],r}catch{return Zr(e)}}async function Bn(e,t){if(e.credentialStorage!=="macos_keychain"||e[Ie]||!e[ke])return e;let n=yt(t);if(!n)return e;let i=await n.get(kt(t),e[ke]);return i?{...e,apiKey:i}:e}async function Mn(e,t){if(!e||e.credentialStorage!=="macos_keychain"||!e[ke])return;let n=yt(t);n&&await n.delete(kt(t),e[ke])}function Qr(e){let t=[e.baseUrl??"unknown-base-url",e.userId??e.email??e.role??"unknown-user","apiKey"].join(`
324
- `);return`skills-layer-cli:api-key:${Vr("sha256").update(t).digest("base64url").slice(0,32)}`}function yt(e){return e.store!==void 0?e.store:ht(e.platform,e.env??process.env)}function kt(e){return e.service??je}function Zr(e){let t={...e,credentialStorage:"local_file_locked"};return delete t[ke],t}function Xr(){return{kind:"macos_keychain",async set(e,t,n){await ft("/usr/bin/security",["add-generic-password","-a",t,"-s",e,"-w",n,"-U"])},async get(e,t){try{let{stdout:n}=await ft("/usr/bin/security",["find-generic-password","-a",t,"-s",e,"-w"]);return n.trim()||null}catch{return null}},async delete(e,t){try{await ft("/usr/bin/security",["delete-generic-password","-a",t,"-s",e])}catch{}}}}function wt(e){let t=e.skillSlug??"<skill-slug>";return{localWork:{purpose:e.purpose,command:e.command,jsonCommand:e.jsonCommand},guardian:{checkCommand:`skills-layer guardian check --skill ${t} --json`,execCommand:`skills-layer guardian exec ${t} --json -- <command>`,mcpTools:["guardian.check","guardian.enforce","guardian.status","guardian.incident"],guidance:"Before risky shell, network, file, secret, browser, API, generated-code, or model-context actions, call MCP guardian.check/guardian.enforce or run skills-layer guardian check. Route shell actions through skills-layer guardian exec when strict local blocking is needed."},setup:{setupCommand:"skills-layer setup",hookStatusCommand:"skills-layer guardian hook status",hookInstallProjectCommand:"skills-layer guardian hook install --agent codex --scope project",hookInstallGlobalCommand:"skills-layer guardian hook install --agent codex --scope global"}}}var Nn=` ____ _ _ _ _ _
323
+ `}function ft(e){return e.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}function Qr(e){let t=En(e.category);return t||Tn({name:e.skillSlug,slug:e.skillSlug,description:e.description,skillType:e.skillType}).category}import{execFile as Xr}from"node:child_process";import{createHash as es}from"node:crypto";import{promisify as ts}from"node:util";var ht=ts(Xr),Ae="apiKey",ke="apiKeyRef",Ie="Skills Layer CLI";function yt(e=process.platform,t=process.env){let n=t.SKILLS_LAYER_CREDENTIAL_STORE?.trim().toLowerCase();return n==="local-file"||n==="local_file"||n==="disabled"||e!=="darwin"||process.env.VITEST==="true"&&n!=="macos-keychain"&&n!=="macos_keychain"?null:rs()}async function Nn(e,t){if(!(typeof e[Ae]=="string"&&e[Ae].length>0))return e;let i=kt(t);if(!i)return e;try{let r={...e,credentialStorage:"macos_keychain"},s=ns(e);return await i.set(wt(t),s,e[Ae]),r[ke]=s,delete r[Ae],r}catch{return is(e)}}async function On(e,t){if(e.credentialStorage!=="macos_keychain"||e[Ae]||!e[ke])return e;let n=kt(t);if(!n)return e;let i=await n.get(wt(t),e[ke]);return i?{...e,apiKey:i}:e}async function Fn(e,t){if(!e||e.credentialStorage!=="macos_keychain"||!e[ke])return;let n=kt(t);n&&await n.delete(wt(t),e[ke])}function ns(e){let t=[e.baseUrl??"unknown-base-url",e.userId??e.email??e.role??"unknown-user","apiKey"].join(`
324
+ `);return`skills-layer-cli:api-key:${es("sha256").update(t).digest("base64url").slice(0,32)}`}function kt(e){return e.store!==void 0?e.store:yt(e.platform,e.env??process.env)}function wt(e){return e.service??Ie}function is(e){let t={...e,credentialStorage:"local_file_locked"};return delete t[ke],t}function rs(){return{kind:"macos_keychain",async set(e,t,n){await ht("/usr/bin/security",["add-generic-password","-a",t,"-s",e,"-w",n,"-U"])},async get(e,t){try{let{stdout:n}=await ht("/usr/bin/security",["find-generic-password","-a",t,"-s",e,"-w"]);return n.trim()||null}catch{return null}},async delete(e,t){try{await ht("/usr/bin/security",["delete-generic-password","-a",t,"-s",e])}catch{}}}}function vt(e){let t=e.skillSlug??"<skill-slug>";return{localWork:{purpose:e.purpose,command:e.command,jsonCommand:e.jsonCommand},guardian:{checkCommand:`skills-layer guardian check --skill ${t} --json`,execCommand:`skills-layer guardian exec ${t} --json -- <command>`,mcpTools:["guardian.check","guardian.enforce","guardian.status","guardian.incident"],guidance:"Before risky shell, network, file, secret, browser, API, generated-code, or model-context actions, call MCP guardian.check/guardian.enforce or run skills-layer guardian check. Route shell actions through skills-layer guardian exec when strict local blocking is needed."},setup:{setupCommand:"skills-layer setup",hookStatusCommand:"skills-layer guardian hook status",hookInstallProjectCommand:"skills-layer guardian hook install --agent codex --scope project",hookInstallGlobalCommand:"skills-layer guardian hook install --agent codex --scope global"}}}var qn=` ____ _ _ _ _ _
325
325
  / ___|| | _(_) | |___ | | __ _ _ _ ___ _ __
326
326
  \\___ \\| |/ / | | / __| | | / _\` | | | |/ _ \\ '__|
327
327
  ___) | <| | | \\__ \\ | |__| (_| | |_| | __/ |
328
328
  |____/|_|\\_\\_|_|_|___/ |_____\\__,_|\\__, |\\___|_|
329
329
  |___/
330
330
  Skills-Layer
331
- AI Agent first platform for Skills`;var On=`Skills Layer MCP
331
+ AI Agent first platform for Skills`;var Kn=`Skills Layer MCP
332
332
  Configure Skills Layer for AI agents through a local stdio bridge.
333
333
 
334
334
  Usage:
@@ -359,7 +359,7 @@ Checks:
359
359
  repair rewrites the local bridge and supported target config.
360
360
  disconnect removes Skills Layer MCP local state and the selected target config entry.
361
361
 
362
- After setup or repair, open a fresh agent session or restart the agent if tools are not visible.`;var es=`Skills Layer CLI
362
+ After setup or repair, open a fresh agent session or restart the agent if tools are not visible.`;var ss=`Skills Layer CLI
363
363
  Agent-first skill marketplace for developers. CLI, MCP, and API share one journey model.
364
364
 
365
365
  Usage:
@@ -550,9 +550,9 @@ Safety:
550
550
  - Use guardian status [skill-slug] to see Cloud policy, stored user preference, effective mode, local hook posture, and the next Guardian action.
551
551
  - Use guardian hook install to add native host hooks where supported; status reports the actual enforcement layer instead of overclaiming strict blocking.
552
552
  - Use guardian exec when you need a stronger wrapper that refuses blocked shell actions before spawning the command.
553
- - Use --dry-run before mutating catalog/source installs, workspace deployments, submissions, visibility, or ownership state.`,Ee=`${Nn}
553
+ - Use --dry-run before mutating catalog/source installs, workspace deployments, submissions, visibility, or ownership state.`,Ee=`${qn}
554
554
 
555
- ${es}`;var ts=new Set(["add-issue","add-review","agents","api-key","approval","auth","backend","buy","categories","check","compare","creator","doctor","export","featured","find","guardian","help","identity","import","install","installed","library","login","logout","mcp","owned","preview-trigger","profile","purchases","recommend","register","remove","restore","search","show","show-issues","show-reviews","source","status","sync","trending","trust","update","validate","whoami","workspace","workspaces"]);function We(e,t){let n=e?.trim().toLowerCase(),i=t?.trim().toLowerCase();if(!n||!ts.has(n))return null;if(n==="install")return`Skills Layer install help
555
+ ${ss}`;var os=new Set(["add-issue","add-review","agents","api-key","approval","auth","backend","buy","categories","check","compare","creator","doctor","export","featured","find","guardian","help","identity","import","install","installed","library","login","logout","mcp","owned","preview-trigger","profile","purchases","recommend","register","remove","restore","search","show","show-issues","show-reviews","source","status","sync","trending","trust","update","validate","whoami","workspace","workspaces"]);function We(e,t){let n=e?.trim().toLowerCase(),i=t?.trim().toLowerCase();if(!n||!os.has(n))return null;if(n==="install")return`Skills Layer install help
556
556
 
557
557
  Usage:
558
558
  skills-layer install <skill-slug> [--version <semver>] [--scope <local|project|global|workspace>] [--agent <agent>] [--dry-run] [--json]
@@ -758,15 +758,72 @@ What it does:
758
758
  - doctor includes local Guardian hook posture alongside backend diagnostics.
759
759
  - exec is a guarded shell wrapper: local preflight and Cloud Guardian must allow the action before the command is spawned.
760
760
 
761
+ Valid action examples:
762
+ skills-layer guardian check --skill project-planner --action-json '{"type":"file_read","path":"README.md"}'
763
+ skills-layer guardian check --skill project-planner --action-json '{"type":"shell_command","command":"npm test"}'
764
+ skills-layer guardian check --skill project-planner --action-json '{"type":"network_request","url":"https://api.example.com/jobs"}'
765
+ skills-layer guardian exec project-planner --action-json '{"type":"shell_command","command":"npm test"}' -- npm test
766
+
761
767
  Enforcement:
762
768
  - native_hook means the selected host has a concrete pre-action hook configuration installed.
763
769
  - native_hook_candidate means Skills Layer wrote integration metadata but does not yet claim strict host blocking.
764
770
  - strict pre-action blocking still requires a host agent or wrapper that calls Guardian before tool execution.
765
- - Cloud-managed decisions should receive only minimal action metadata, not raw files, secrets, or terminal output.`;if(n==="mcp")return On;let r=i?` ${i}`:"";return`Skills Layer ${n}${r} help
771
+ - Cloud-managed decisions should receive only minimal action metadata, not raw files, secrets, or terminal output.`;if(n==="workspace"||n==="workspaces")return`Skills Layer workspace help
772
+
773
+ Usage:
774
+ skills-layer workspace list [--json]
775
+ skills-layer workspace create [<name>] [--kind <kind>] [--json]
776
+ skills-layer workspace skills <workspace-id> [--json]
777
+ skills-layer workspace deploy <workspace-id> <skill-slug> [--dry-run] [--json]
778
+ skills-layer workspace remove <workspace-id> <skill-slug> [--json]
779
+ skills-layer workspace guide <workspace-id> <skill-slug> [--json]
780
+
781
+ What it does:
782
+ - Manages Cloud workspace availability for skills.
783
+ - deploy --dry-run previews trust, entitlement, and workspace policy before changing availability.
784
+ - guide explains how an approved workspace skill becomes usable on a member machine.
785
+
786
+ Examples:
787
+ skills-layer workspace list
788
+ skills-layer workspace deploy ws_123 project-planner --dry-run
789
+ skills-layer workspace guide ws_123 project-planner`;if(n==="source")return`Skills Layer source help
790
+
791
+ Usage:
792
+ skills-layer source connection start --provider <github|gitlab|local|generic_git|domain> --source <source> [--skill <skill-slug>] [--visibility <private|public|unlisted>] [--json]
793
+ skills-layer source connection status <source-connection-id> [--json]
794
+ skills-layer source connection complete <source-connection-id> [--provider-owner-id <id>] [--provider-repo-id <id>] [--provider-installation-id <id>] [--commit-sha <sha>] [--json]
795
+ skills-layer source connection cancel <source-connection-id> [--json]
796
+ skills-layer source reference resolve <qualified-ref-or-alias> [--json]
797
+
798
+ What it does:
799
+ - Connects private or provider-backed sources before creator source prepare/publish flows.
800
+ - Keeps private GitHub/GitLab access behind explicit provider approval.
801
+ - Public source import stays explicit through install/source visibility choices.
802
+
803
+ Examples:
804
+ skills-layer source connection start --provider github --source https://github.com/OWNER/REPO --skill my-skill --visibility private
805
+ skills-layer source connection status source_connection_123`;if(n==="purchases")return`Skills Layer purchases help
806
+
807
+ Usage:
808
+ skills-layer purchases list [--json]
809
+ skills-layer purchases invoice <purchase-id> [--json]
810
+ skills-layer purchases refund-quote <purchase-id> [--json]
811
+ skills-layer purchases refund <purchase-id> [--json]
812
+ skills-layer purchases spending [--json]
813
+
814
+ What it does:
815
+ - Shows buyer purchase history, invoices, refund quotes, refund requests, and spending summary.
816
+ - Money-moving commands keep human confirmation/browser handoff behavior in human mode.
817
+ - Use --json for agent-safe status and handoff objects.
818
+
819
+ Examples:
820
+ skills-layer purchases list
821
+ skills-layer purchases invoice purchase_123
822
+ skills-layer purchases refund-quote purchase_123`;if(n==="mcp")return Kn;let r=i?` ${i}`:"";return`Skills Layer ${n}${r} help
766
823
 
767
- Run \`skills-layer --help\` for public CLI usage.`}var Ve="0.1.3";var E=class extends Error{status;details;constructor(t,n,i){super(n),this.name="ApiError",this.status=t,this.details=i}},vi=1,Wt=1,Fn=1,se="skills-layer-security-hook",Z="Skills Layer Security Hook",Vt="https://api.skills-layer.com",rs="http://127.0.0.1:8787",ss=new Set(["json","dry-run","help","list","all","verbose","show-url","quarantine","confirm","confirmed","with-mcp","no-mcp","allow-unmanaged-once","disclose-source","allow-findings-featured"]),qn=new Set(["accept-capability","approval-request-id","grant-json","paraphrase","should-not-trigger","should-trigger"]),os=new Set(["bio","company","description","display-name","feedback","message","note","reason","search","summary"]),as=new Set(["action","action-json","agent","amount-cents","api-key","base-url","capability","category","claim-id","client","cloud-trust-ledger","code","commit-sha","decision","decision-evidence-json","dependency-audit-status","dir","email","environment","evidence-json","expires","fixed-version","format","install","issue-id","issue-type","key-id","kind","license","limit","listing-status","max-characters","method","mode","name","output","path","payment-method","pin","price-cents","provider","provider-installation-id","provider-owner-id","provider-project-id","provider-repo-id","provenance-intent","publication-status","rating","requested-role","review-id","runtime-risk","scope","security-capability","skill","skill-type","sort","source","source-intake-context","state","status","text","telemetry-mode","trust","type","unmanaged-policy","version","version-id","visibility","workspace"]);async function kc(e,t={}){let n={env:t.env??process.env,platform:t.platform??process.platform,cwd:t.cwd??process.cwd(),now:t.now??(()=>new Date().toISOString()),fetchFn:t.fetch??globalThis.fetch,openUrl:t.openUrl??Pl(t.platform??process.platform),stdoutIsTty:t.stdoutIsTty??!!process.stdout.isTTY,promptText:t.promptText??kl(),promptSecret:t.promptSecret??wl(),promptSelect:t.promptSelect??vl(t.selectInput??process.stdin,t.selectOutput??process.stdout),sleep:t.sleep??(l=>new Promise(c=>setTimeout(c,l))),emitInfo:t.emitInfo??(l=>process.stdout.write(`${l}
768
- `)),credentialStore:t.credentialStore!==void 0?t.credentialStore:ht(t.platform??process.platform,t.env??process.env)},i=e[0];if(!i){let l=Gn([]),c=await bt(l.flags,n);return await ea(l.flags,c)}if(i==="--help"||i==="-h")return{exitCode:0,stdout:Ee,stderr:""};if(i==="--version"||i==="-v")return{exitCode:0,stdout:`skills-layer ${Ve}
769
- `,stderr:""};let r=Gn(e.slice(1));if(r.error)return k(r.error,r.flags.json);let{flags:s,positionals:o}=r;if(i==="admin")return k("The public skills-layer package does not include internal commands.",s.json);if(i==="version"){let l=await bt(s,n);return f({status:"ok",name:"skills-layer",version:Ve},`skills-layer ${Ve}`,s.json,l)}if(s.help){let l=We(i,o[0]);return l?{exitCode:0,stdout:l,stderr:""}:k(Kn(i),s.json)}try{let l=await bt(s,n);switch(i){case"agents":return await us(o,s,l);case"backend":return await ds(o,s,l);case"register":return await bi(s,l);case"login":return await Pi(s,l);case"logout":return await Si(s,l);case"whoami":return await C("/api/v1/whoami",s,l,"Account loaded.",{authenticated:!0});case"profile":return await ms(o,s,l);case"auth":return await hs(o,s,l);case"identity":return await vs(o,s,l);case"api-key":return await bs(o,s,l);case"mcp":return await Ps(o,s,l);case"search":case"find":return await _s(o,s,l);case"featured":case"trending":return await As(i,s,l);case"categories":return await C("/api/v1/categories",s,l,"Categories loaded.");case"recommend":return await Is(o,s,l);case"compare":return await js(o,s,l);case"show":return await Es(o,s,l);case"trust":return await Ls(o,s,l);case"help":return await Ts(o,s,l);case"status":return await C("/api/v1/status",s,l,"Status loaded.");case"doctor":return await _a(s,l);case"setup":return await ji(s,l);case"validate":return await Us(o,s,l);case"preview-trigger":return await Bs(o,s,l);case"creator":return await Ms(o,s,l);case"install":return await Zt(o,s,l);case"installed":return await Co(s,l);case"remove":return await Ro(o,s,l);case"update":return await xo(o,s,l);case"sync":return await $o(s,l);case"restore":return await Mo(o,s,l);case"check":return await No(o,s,l);case"import":return await Oo(o,s,l);case"source":return await Fo(o,s,l);case"approval":return await Ko(o,s,l);case"workspace":case"workspaces":return await Go(o,s,l);case"buy":return await Ho(o,s,l);case"purchases":return await Jo(o,s,l);case"owned":return await C("/api/v1/me/library",s,l,"Owned skills loaded.",{authenticated:!0});case"export":return await Wo(o,s,l);case"library":return await zo(o,s,l);case"add-review":return await ei("add",o,s,l);case"show-reviews":return await ei("show",o,s,l);case"add-issue":return await ti("add",o,s,l);case"show-issues":return await ti("show",o,s,l);case"guardian":return await Vo(o,s,l);default:return k(Kn(i),s.json)}}catch(l){return l instanceof E?ot(l,s.json):k(ue(l),s.json)}}function Kn(e){let t=e.trim().toLowerCase();return t==="purchase"?`Unknown command "${e}".
824
+ Run \`skills-layer --help\` for public CLI usage.`}var Ve="0.1.4";var E=class extends Error{status;details;constructor(t,n,i){super(n),this.name="ApiError",this.status=t,this.details=i}},Si=1,Vt=1,Gn=1,le="skills-layer-security-hook",ee="Skills Layer Security Hook",Yt="https://api.skills-layer.com",cs="http://127.0.0.1:8787",us=new Set(["json","dry-run","help","list","all","verbose","show-url","quarantine","confirm","confirmed","with-mcp","no-mcp","allow-unmanaged-once","disclose-source","allow-findings-featured"]),Dn=new Set(["accept-capability","approval-request-id","grant-json","paraphrase","should-not-trigger","should-trigger"]),ds=new Set(["bio","company","description","display-name","feedback","message","note","reason","search","summary"]),gs=new Set(["action","action-json","agent","amount-cents","api-key","base-url","capability","category","claim-id","client","cloud-trust-ledger","code","commit-sha","decision","decision-evidence-json","dependency-audit-status","dir","email","environment","evidence-json","expires","fixed-version","format","install","issue-id","issue-type","key-id","kind","license","limit","listing-status","max-characters","method","mode","name","output","path","payment-method","pin","price-cents","provider","provider-installation-id","provider-owner-id","provider-project-id","provider-repo-id","provenance-intent","publication-status","rating","requested-role","review-id","runtime-risk","scope","security-capability","skill","skill-type","sort","source","source-intake-context","state","status","text","telemetry-mode","trust","type","unmanaged-policy","version","version-id","visibility","workspace"]);async function xc(e,t={}){let n={env:t.env??process.env,platform:t.platform??process.platform,cwd:t.cwd??process.cwd(),now:t.now??(()=>new Date().toISOString()),fetchFn:t.fetch??globalThis.fetch,openUrl:t.openUrl??jl(t.platform??process.platform),stdoutIsTty:t.stdoutIsTty??!!process.stdout.isTTY,promptText:t.promptText??Rl(),promptSecret:t.promptSecret??xl(),promptSelect:t.promptSelect??$l(t.selectInput??process.stdin,t.selectOutput??process.stdout),sleep:t.sleep??(a=>new Promise(c=>setTimeout(c,a))),emitInfo:t.emitInfo??(a=>process.stdout.write(`${a}
825
+ `)),credentialStore:t.credentialStore!==void 0?t.credentialStore:yt(t.platform??process.platform,t.env??process.env)},i=e[0];if(!i){let a=Jn([]),c=await Pt(a.flags,n);return await oa(a.flags,c)}if(i==="--help"||i==="-h")return{exitCode:0,stdout:Ee,stderr:""};if(i==="--version"||i==="-v")return{exitCode:0,stdout:`skills-layer ${Ve}
826
+ `,stderr:""};let r=Jn(e.slice(1));if(r.error)return k(r.error,r.flags.json);let{flags:s,positionals:o}=r;if(i==="admin")return k("The public skills-layer package does not include internal commands.",s.json);if(i==="version"){let a=await Pt(s,n);return f({status:"ok",name:"skills-layer",version:Ve},`skills-layer ${Ve}`,s.json,a)}if(s.help){let a=We(i,o[0]);return a?{exitCode:0,stdout:a,stderr:""}:k(Hn(i),s.json)}try{let a=await Pt(s,n);switch(i){case"agents":return await fs(o,s,a);case"backend":return await hs(o,s,a);case"register":return await Ci(s,a);case"login":return await Ri(s,a);case"logout":return await xi(s,a);case"whoami":return await C("/api/v1/whoami",s,a,"Account loaded.",{authenticated:!0});case"profile":return await ws(o,s,a);case"auth":return await bs(o,s,a);case"identity":return await Rs(o,s,a);case"api-key":return await xs(o,s,a);case"mcp":return await $s(o,s,a);case"search":case"find":return await Ls(o,s,a);case"featured":case"trending":return await Ts(i,s,a);case"categories":return await C("/api/v1/categories",s,a,"Categories loaded.");case"recommend":return await Us(o,s,a);case"compare":return await Bs(o,s,a);case"show":return await Ms(o,s,a);case"trust":return await Ns(o,s,a);case"help":return await Os(o,s,a);case"status":return await C("/api/v1/status",s,a,"Status loaded.");case"doctor":return await Ta(s,a);case"setup":return await Ui(s,a);case"validate":return await Fs(o,s,a);case"preview-trigger":return await qs(o,s,a);case"creator":return await Ks(o,s,a);case"install":return await Xt(o,s,a);case"installed":return await Ao(s,a);case"remove":return await Io(o,s,a);case"update":return await Eo(o,s,a);case"sync":return await Lo(s,a);case"restore":return await Go(o,s,a);case"check":return await Do(o,s,a);case"import":return await Ho(o,s,a);case"source":return await Jo(o,s,a);case"approval":return await Wo(o,s,a);case"workspace":case"workspaces":return await Vo(o,s,a);case"buy":return await Zo(o,s,a);case"purchases":return await Qo(o,s,a);case"owned":return await C("/api/v1/me/library",s,a,"Owned skills loaded.",{authenticated:!0});case"export":return await ea(o,s,a);case"library":return await Xo(o,s,a);case"add-review":return await ii("add",o,s,a);case"show-reviews":return await ii("show",o,s,a);case"add-issue":return await ri("add",o,s,a);case"show-issues":return await ri("show",o,s,a);case"guardian":return await ta(o,s,a);default:return k(Hn(i),s.json)}}catch(a){return a instanceof E?at(a,s.json):k(ue(a),s.json)}}function Hn(e){let t=e.trim().toLowerCase();return t==="purchase"?`Unknown command "${e}".
770
827
 
771
828
  Did you mean:
772
829
  skills-layer buy <skill-slug>
@@ -779,7 +836,7 @@ Did you mean:
779
836
  skills-layer show <skill-slug>`:t==="security-report"?`Unknown command "${e}".
780
837
 
781
838
  Did you mean:
782
- skills-layer trust <skill-slug>`:`Unknown command "${e}".`}function Gn(e){let t={json:!1,help:!1,dryRun:!1,list:!1,all:!1,verbose:!1,showUrl:!1,quarantine:!1,confirmed:!1,allowUnmanagedOnce:!1,discloseSource:!1,allowFindingsFeatured:!1,shouldTrigger:[],shouldNotTrigger:[],paraphrase:[],grantJson:[],findingCode:[],acceptCapability:[],approvalRequestId:[]},n=[];for(let i=0;i<e.length;i+=1){let r=e[i];if(!r)continue;if(r==="--"){n.push(...e.slice(i+1));break}if(r==="-h"){t.help=!0;continue}if(!r.startsWith("--")){n.push(r);continue}let s=r.slice(2);if(ss.has(s)){let l=vt(s);s==="confirm"?t.confirmed=!0:t[l]=!0;continue}let o=e[i+1];if(!o||o.startsWith("--")){if(s==="install"){t.install="";continue}return{flags:t,positionals:n,error:`Flag --${s} requires a value.`}}if(os.has(s)){let l=ls(e,i);if(!l.value)return{flags:t,positionals:n,error:`Flag --${s} requires a value.`};t[vt(s)]=l.value,i=l.nextIndex;continue}if(as.has(s)||qn.has(s)){let l=vt(s);if(qn.has(s)){let c=Array.isArray(t[l])?t[l]:[];c.push(o),t[l]=c}else t[l]=o;i+=1;continue}return{flags:t,positionals:n,error:`Unknown flag --${s}.`}}return{flags:t,positionals:n}}function ls(e,t){let n=[],i=t;for(let r=t+1;r<e.length;r+=1){let s=e[r];if(!s||s.startsWith("--"))break;n.push(s),i=r}return{value:n.length>0?n.join(" "):null,nextIndex:i}}function vt(e){return e.replace(/-([a-z])/gu,(t,n)=>n.toUpperCase())}async function bt(e,t){let n=cs(t.env,t.platform),[i,r]=await Promise.all([yl(n.configPath,t),z(n.backendPreferencePath)]),s=ee(g(e.baseUrl)??Q(t.env.SKILLS_LAYER_BASE_URL)??Q(r?.preferredBaseUrl)??Q(i?.baseUrl)??Vt),o=g(e.apiKey)??Q(t.env.SKILLS_LAYER_API_KEY),l=Q(i?.apiKey),c=Q(i?.baseUrl),u=!c||ee(c)===s,d=o??(u?l:void 0),p=!o&&l&&c&&!u?`Your saved login belongs to ${ee(c)}, but the selected backend is ${s}. Run \`skills-layer backend --base-url ${ee(c)}\` to use that login, or run \`skills-layer login\` for ${s}.`:void 0;return{...t,paths:n,config:i,baseUrl:s,apiKey:d,authBlockedMessage:p}}function cs(e,t){let n=t==="win32"?Se:Jt,i=t==="win32"?Q(e.USERPROFILE)??Q(e.HOME):Q(e.HOME),r=n.join(i??".",".skills-layer");return{stateDir:r,configPath:n.join(r,"config.json"),backendPreferencePath:n.join(r,"backend-preference.json"),installsPath:n.join(r,"installs.json"),importsPath:n.join(r,"imports.json"),mcpConfigPath:n.join(r,"mcp.json"),mcpPreferencePath:n.join(r,"mcp-preference.json"),bundlesDir:n.join(r,"bundles"),incidentsDir:n.join(r,"incidents")}}async function us(e,t,n){if(e[0]!=="list")return k(`Unknown agents command "${e[0]??""}".`,t.json);let i=de(n.env,n.platform,n.cwd).map(r=>({id:r.id,displayName:r.displayName,capabilities:r.capabilities,projectSkillsPath:r.targets.projectSkillsPath,globalSkillsPath:r.targets.globalSkillsPath}));return f({status:"ok",results:i},`Found ${i.length} supported agent targets.`,t.json,n)}async function ds(e,t,n){let i=e[0],r=g(t.baseUrl);if(!i&&r||i==="cloud"||i==="local"){let o=ee(r??(i==="local"?rs:Vt)),l=Pe(o);return await K(n.paths.backendPreferencePath,{version:Wt,preferredBaseUrl:o,savedAt:n.now()}),f({status:"updated",selectedBackend:l,selectedBaseUrl:o,savedLoginBaseUrl:n.config?.baseUrl??null,loginMatchesSelectedBackend:!n.config?.baseUrl||ee(n.config.baseUrl)===o},`Backend set to ${l}.`,t.json,n)}if(i&&i!=="status")return k(`Unknown backend command "${i}".`,t.json);let s=Pe(n.baseUrl);return f({status:"ok",selectedBackend:s,selectedBaseUrl:n.baseUrl,savedLoginBaseUrl:n.config?.baseUrl??null,loginMatchesSelectedBackend:!n.config?.baseUrl||ee(n.config.baseUrl)===n.baseUrl,loggedIn:!!n.apiKey,email:n.config?.email??null,role:n.config?.role??null},`Backend: ${n.baseUrl}`,t.json,n)}var Yt=[{value:"google",label:"Google",description:"Open browser sign-in and return here"},{value:"github",label:"GitHub",description:"Open browser sign-in and return here"},{value:"gitlab",label:"GitLab",description:"Open browser sign-in and return here"},{value:"microsoft",label:"Microsoft",description:"Open browser sign-in and return here"}],gs=[...Yt,{value:"email",label:"Email code",description:"Use an emailed one-time code"},{value:"api_key",label:"API key (advanced)",description:"Paste an existing Skills Layer login key"}],ps=[{value:"email",label:"Email",description:"Use an emailed verification code and API key"},...Yt];async function bi(e,t){let n=g(e.method);if(!n)if(e.json)n="email";else try{n=await t.promptSelect("Choose how to register:",ps)}catch{return k("register requires --method when interactive selection is unavailable. Try `skills-layer register --method email --email you@example.com`, `skills-layer register --method google`, `skills-layer register --method github`, `skills-layer register --method gitlab`, or `skills-layer register --method microsoft`.",!1)}if(n==="email"){let r=g(e.email);if(!r&&!e.json)try{r=await t.promptText("Enter your email address: ")}catch{return k("register --method email requires --email when interactive prompts are unavailable.",!1)}r=v(r,"register requires --email.");let s=await b(t,"/api/v1/register",{method:"POST",headers:_(),body:JSON.stringify({method:n,email:r})});if(e.json){let l=s.status==="already_registered"?Kt(s):J({...s,nextCommand:`skills-layer auth verify --email ${r} --code <code> --json`,nextAction:"auth.verify"}),c=s.status==="already_registered"?`${r} is already registered.`:`Registration started for ${r}.`;return f(l,c,e.json,t)}if(s.status==="already_registered")return f(Kt(s),`${r} is already registered. Run \`skills-layer login\` to sign in, or \`skills-layer auth recover\` if you need account recovery.`,!1,t);let o;try{o=await t.promptText(`Enter the verification code sent to ${r} (check spam/junk folder if missing): `)}catch{return f(J(s),`Registration started for ${r}. Check your email (including spam/junk folder) for the verification code, then run \`skills-layer auth verify --email ${r} --code <code>\`.`,!1,t)}return await Gi(r,o,e,t,`Verified ${r}.`)}let i=await b(t,"/api/v1/identity/social/start",{method:"POST",headers:_(),body:JSON.stringify({provider:n,mode:"login"})});return e.json?f(i,"Social registration started.",e.json,t):await on(n,i,e,t,"login")}async function Pi(e,t){if(e.withMcp&&e.noMcp)return k("login cannot combine --with-mcp and --no-mcp.",e.json);let n=g(e.apiKey);if(n){let o=await Ue(t,n,{notifyLogin:!0}),l=await It(e,{...t,config:o,apiKey:n});return D(l)?l:f(J({status:"verified",...o,...l.data?{mcp:l.data}:{}}),[`Logged in as ${o.email}.`,l.message??""].filter(Boolean).join(" "),e.json,t)}let i=g(e.method);if(!i&&!e.json)try{let o=await t.promptSelect("Choose how to sign in:",gs);i=o==="api_key"?void 0:o}catch{return k("login requires --api-key or --method <email|google|github|gitlab|microsoft> when interactive selection is unavailable.",!1)}if(i){if(i==="email"){let l=g(e.email);!l&&!e.json&&(l=(await t.promptText("Enter your email address: ")).trim()),l=v(l,"login --method email requires --email.");let c=await b(t,"/api/v1/identity/recover/start",{method:"POST",headers:_(),body:JSON.stringify({email:l,method:"email",intent:"login"})});if(e.json)return f(c,`Passwordless email login started for ${l}.`,!0,t);let u;try{u=(await t.promptText(`Enter the sign-in code sent to ${l} (check spam/junk folder if missing): `)).trim()}catch{return f(c,`Passwordless email login started for ${l}. Check your email, then run \`skills-layer login --method email --email ${l}\` again when prompts are available.`,!1,t)}let d=await b(t,"/api/v1/identity/recover/complete",{method:"POST",headers:_(),body:JSON.stringify({email:l,code:u,intent:"login"})});return await it(l,d,e,t,`Verified ${l}.`)}if(!["google","github","gitlab","microsoft"].includes(i))return k("login --method must be email, google, github, gitlab, or microsoft.",e.json);let o=await b(t,"/api/v1/identity/social/start",{method:"POST",headers:_(),body:JSON.stringify({provider:i,mode:"login"})});return e.json?f(o,"Social login started.",!0,t):await on(i,o,e,t,"login")}if(!e.json)try{n=(await t.promptSecret("Enter your Skills Layer API key: ")).trim()}catch{return k("login requires an API key.",e.json)}if(!n)return k("login requires --api-key or --method <email|google|github|gitlab|microsoft>.",e.json);let r=await Ue(t,n,{notifyLogin:!0}),s=await It(e,{...t,config:r,apiKey:n});return D(s)?s:f(J({status:"verified",...r,...s.data?{mcp:s.data}:{}}),[`Logged in as ${r.email}.`,s.message??""].filter(Boolean).join(" "),e.json,t)}async function Si(e,t){return await Mn(t.config,{env:t.env,platform:t.platform,store:t.credentialStore}),await Dt(t.paths.configPath,{force:!0}),f({status:"logged_out"},"Logged out.",e.json,t)}async function ms(e,t,n){let i=e[0]??"show";if(i==="show")return await C("/api/v1/profile",t,n,"Profile loaded.",{authenticated:!0});if(i==="update"){let r=await fs(t,n);if(D(r))return r;let s=await b(n,"/api/v1/profile",{method:"PATCH",headers:_(n.apiKey),body:JSON.stringify(r)});return f(s,"Profile updated.",t.json,n)}return k(`Unknown profile command "${i}".`,t.json)}async function fs(e,t){let n=F(e,["displayName","bio","company"]);if(Object.keys(n).length>0)return n;if(e.json)return k("profile update requires at least one of --display-name, --bio, or --company.",!0);try{let i=await t.promptText("Display name (leave blank to keep unchanged): "),r=await t.promptText("Bio (leave blank to keep unchanged): "),s=await t.promptText("Company (leave blank to keep unchanged): "),o=A({displayName:i||void 0,bio:r||void 0,company:s||void 0});return Object.keys(o).length===0?k("No profile changes entered.",!1):o}catch{return k("profile update requires at least one of --display-name, --bio, or --company.",!1)}}async function hs(e,t,n){let i=e[0];if(i==="register")return await bi({...t,method:"email"},n);if(i==="verify"){let r=v(t.email,"auth verify requires --email."),s=v(t.code,"auth verify requires --code.");return await Gi(r,s,t,n,`Verified ${r}.`)}return i==="recover"?await ws(e.slice(1),t,n):i==="login"?await Pi(t,n):i==="logout"?await Si(t,n):i==="status"?ys(t,n):i==="repair"?await ks(t,n):k(`Unknown auth command "${i??""}".`,t.json)}function ys(e,t){let n=t.config?.baseUrl?ee(t.config.baseUrl):null,i=!!(t.apiKey&&n===t.baseUrl);return f({status:"auth_status",selectedBackend:Pe(t.baseUrl),selectedBaseUrl:t.baseUrl,loggedIn:i,requiresLogin:!i,...t.config?.email?{savedLogin:{baseUrl:n,email:t.config.email,role:t.config.role??null,roles:t.config.roles??[],savedAt:t.config.savedAt??null,...t.config.credentialStorage?{credentialStorage:t.config.credentialStorage}:{},matchesSelectedBackend:i}}:{}},i&&t.config?.email?`Logged in as ${t.config.email}.`:t.config?.baseUrl?`Saved login targets ${n}; selected backend is ${t.baseUrl}. Run \`skills-layer auth repair\` or \`skills-layer login\`.`:"Not logged in. Run `skills-layer login`.",e.json,t)}async function ks(e,t){if(!t.config?.baseUrl||!t.config.apiKey||!t.config.email||!t.config.role||!t.config.savedAt)return k("No saved Skills Layer login was found to repair. Run `skills-layer login`.",e.json);let n=ee(t.config.baseUrl);return await K(t.paths.backendPreferencePath,{version:Wt,preferredBaseUrl:n,savedAt:t.now()}),await ln(t.paths.configPath,{...t.config,baseUrl:n,savedAt:t.now()},t),f({status:"auth_repaired",baseUrl:n,loggedIn:!0,email:t.config.email,role:t.config.role,credentialStorage:t.config.credentialStorage??"local_file_locked"},`Auth repaired for ${t.config.email}. Backend preference now matches ${n}.`,e.json,t)}async function ws(e,t,n){let i=e[0]??g(t.method)??"email",r=g(t.email);if(!r&&!t.json)try{r=await n.promptText("Enter your email address: ")}catch{return k("auth recover requires --email when interactive prompts are unavailable.",!1)}if(r=v(r,"auth recover requires --email."),i==="complete"){let c=g(t.code);if(!c&&!t.json)try{c=await n.promptText("Enter the recovery code: ")}catch{return k("auth recover complete requires --code when interactive prompts are unavailable.",!1)}return c=v(c,"auth recover complete requires --code."),await Dn(r,c,t,n)}let s=await b(n,"/api/v1/identity/recover/start",{method:"POST",headers:_(),body:JSON.stringify({email:r,method:i})}),o=Kt(s);if(t.json)return f(o,"Recovery started.",!0,n);let l="";try{l=(await n.promptText("Enter the recovery code if you received one, or press Enter to stop: ")).trim()}catch{return f(o,`If this email can continue, instructions have been sent. Check your inbox and spam folder. When you have a code, run \`skills-layer auth recover complete --email ${r} --code <code>\`.`,!1,n)}return l?await Dn(r,l,t,n):f(o,`If this email can continue, instructions have been sent. When you have a code, run \`skills-layer auth recover complete --email ${r} --code <code>\`.`,!1,n)}async function Dn(e,t,n,i){let r=await b(i,"/api/v1/identity/recover/complete",{method:"POST",headers:_(),body:JSON.stringify({email:e,code:t})});if(n.json){let s=a(r,"apiKey");return s?(await Ue(i,s,{expectedEmail:e,knownEmail:a(r,"email")??e,knownRole:a(r,"role")??"user",knownRoles:ne(r,"roles"),knownUserId:a(r,"userId")}),f(J({...r,loggedIn:!0}),"Recovery complete.",!0,i)):f(J({...r,email:e,loggedIn:!1}),"Recovery complete.",!0,i)}return await it(e,r,n,i,`Recovered access for ${e}.`)}async function vs(e,t,n){let i=e[0],r=1;if(i==="providers")return await C("/api/v1/identity/social/providers",t,n,"Identity providers loaded.");if(i==="start"){let s=g(t.provider);if(!s&&!t.json)try{s=await n.promptSelect("Choose identity provider:",Yt)}catch{return k("identity start requires --provider when interactive selection is unavailable.",!1)}s=v(s,"identity start requires --provider.");let o=await b(n,"/api/v1/identity/social/start",{method:"POST",headers:_(n.apiKey),body:JSON.stringify({provider:s,mode:g(t.mode)??"login"})});return t.json?f(o,"Social auth started.",!0,n):await on(s,o,t,n,"login")}if(i==="status"){let s=g(t.state)??e[r];return s?await C(`/api/v1/identity/social/status/${encodeURIComponent(s)}`,t,n,"Social auth status loaded."):k("identity status requires --state.",t.json)}if(i==="complete"){let s=v(t.provider,"identity complete requires --provider."),o=v(t.state,"identity complete requires --state."),l=v(t.code,"identity complete requires --code."),c=await b(n,"/api/v1/identity/social/complete",{method:"POST",headers:_(n.apiKey),body:JSON.stringify({provider:s,state:o,code:l})});return await La(c,n),f(J(c),"Social auth complete.",t.json,n)}if(i==="list")return await C("/api/v1/me/linked-identities",t,n,"Linked identities loaded.",{authenticated:!0});if(i==="unlink"){let s=v(t.provider??e[r],"identity unlink requires a provider."),o=await b(n,`/api/v1/me/linked-identities/${encodeURIComponent(s)}`,{method:"DELETE",headers:U(n.apiKey,n.authBlockedMessage)});return f(o,"Identity unlinked.",t.json,n)}return k(`Unknown identity command "${i??""}".`,t.json)}async function bs(e,t,n){let i=e[0];if(!i)return k("api-key requires create, list, or revoke.",t.json);if(i==="list")return await C("/api/v1/me/api-keys",t,n,"API keys loaded.",{authenticated:!0});if(i==="create"){let r=g(t.name),s=Rl(t.scope);if(!r)return k("api-key create requires --name.",t.json);if(s.length===0)return k("api-key create requires at least one --scope.",t.json);let o=await b(n,"/api/v1/me/api-keys",{method:"POST",headers:{"content-type":"application/json",...U(n.apiKey,n.authBlockedMessage)},body:JSON.stringify({name:r,scopes:s,...g(t.expires)?{expiresIn:g(t.expires)}:{}})});return f(J(o),"Automation API key created. The full key was sent to your verified email. Run `skills-layer api-key list` to manage keys.",t.json,n)}if(i==="rotate")return k(`api-key rotate is not part of normal login.
839
+ skills-layer trust <skill-slug>`:`Unknown command "${e}".`}function Jn(e){let t={json:!1,help:!1,dryRun:!1,list:!1,all:!1,verbose:!1,showUrl:!1,quarantine:!1,confirmed:!1,allowUnmanagedOnce:!1,discloseSource:!1,allowFindingsFeatured:!1,shouldTrigger:[],shouldNotTrigger:[],paraphrase:[],grantJson:[],findingCode:[],acceptCapability:[],approvalRequestId:[]},n=[];for(let i=0;i<e.length;i+=1){let r=e[i];if(!r)continue;if(r==="--"){n.push(...e.slice(i+1));break}if(r==="-h"){t.help=!0;continue}if(!r.startsWith("--")){n.push(r);continue}let s=r.slice(2);if(us.has(s)){let a=bt(s);s==="confirm"?t.confirmed=!0:t[a]=!0;continue}let o=e[i+1];if(!o||o.startsWith("--")){if(s==="install"){t.install="";continue}return{flags:t,positionals:n,error:`Flag --${s} requires a value.`}}if(ds.has(s)){let a=ps(e,i);if(!a.value)return{flags:t,positionals:n,error:`Flag --${s} requires a value.`};t[bt(s)]=a.value,i=a.nextIndex;continue}if(gs.has(s)||Dn.has(s)){let a=bt(s);if(Dn.has(s)){let c=Array.isArray(t[a])?t[a]:[];c.push(o),t[a]=c}else t[a]=o;i+=1;continue}return{flags:t,positionals:n,error:`Unknown flag --${s}.`}}return{flags:t,positionals:n}}function ps(e,t){let n=[],i=t;for(let r=t+1;r<e.length;r+=1){let s=e[r];if(!s||s.startsWith("--"))break;n.push(s),i=r}return{value:n.length>0?n.join(" "):null,nextIndex:i}}function bt(e){return e.replace(/-([a-z])/gu,(t,n)=>n.toUpperCase())}async function Pt(e,t){let n=ms(t.env,t.platform),[i,r]=await Promise.all([Cl(n.configPath,t),V(n.backendPreferencePath)]),s=ne(g(e.baseUrl)??Q(t.env.SKILLS_LAYER_BASE_URL)??Q(r?.preferredBaseUrl)??Q(i?.baseUrl)??Yt),o=g(e.apiKey)??Q(t.env.SKILLS_LAYER_API_KEY),a=Q(i?.apiKey),c=Q(i?.baseUrl),u=!c||ne(c)===s,d=o??(u?a:void 0),p=!o&&a&&c&&!u?`Your saved login belongs to ${ne(c)}, but the selected backend is ${s}. Run \`skills-layer backend --base-url ${ne(c)}\` to use that login, or run \`skills-layer login\` for ${s}.`:void 0;return{...t,paths:n,config:i,baseUrl:s,apiKey:d,authBlockedMessage:p}}function ms(e,t){let n=t==="win32"?Se:zt,i=t==="win32"?Q(e.USERPROFILE)??Q(e.HOME):Q(e.HOME),r=n.join(i??".",".skills-layer");return{stateDir:r,configPath:n.join(r,"config.json"),backendPreferencePath:n.join(r,"backend-preference.json"),installsPath:n.join(r,"installs.json"),importsPath:n.join(r,"imports.json"),mcpConfigPath:n.join(r,"mcp.json"),mcpPreferencePath:n.join(r,"mcp-preference.json"),bundlesDir:n.join(r,"bundles"),incidentsDir:n.join(r,"incidents")}}async function fs(e,t,n){if(e[0]!=="list")return k(`Unknown agents command "${e[0]??""}".`,t.json);let i=de(n.env,n.platform,n.cwd).map(r=>({id:r.id,displayName:r.displayName,capabilities:r.capabilities,projectSkillsPath:r.targets.projectSkillsPath,globalSkillsPath:r.targets.globalSkillsPath}));return f({status:"ok",results:i},`Found ${i.length} supported agent targets.`,t.json,n)}async function hs(e,t,n){let i=e[0],r=g(t.baseUrl);if(!i&&r||i==="cloud"||i==="local"){let o=ne(r??(i==="local"?cs:Yt)),a=Pe(o);return await D(n.paths.backendPreferencePath,{version:Vt,preferredBaseUrl:o,savedAt:n.now()}),f({status:"updated",selectedBackend:a,selectedBaseUrl:o,savedLoginBaseUrl:n.config?.baseUrl??null,loginMatchesSelectedBackend:!n.config?.baseUrl||ne(n.config.baseUrl)===o},`Backend set to ${a}.`,t.json,n)}if(i&&i!=="status")return k(`Unknown backend command "${i}".`,t.json);let s=Pe(n.baseUrl);return f({status:"ok",selectedBackend:s,selectedBaseUrl:n.baseUrl,savedLoginBaseUrl:n.config?.baseUrl??null,loginMatchesSelectedBackend:!n.config?.baseUrl||ne(n.config.baseUrl)===n.baseUrl,loggedIn:!!n.apiKey,email:n.config?.email??null,role:n.config?.role??null},`Backend: ${n.baseUrl}`,t.json,n)}var Zt=[{value:"google",label:"Google",description:"Open browser sign-in and return here"},{value:"github",label:"GitHub",description:"Open browser sign-in and return here"},{value:"gitlab",label:"GitLab",description:"Open browser sign-in and return here"},{value:"microsoft",label:"Microsoft",description:"Open browser sign-in and return here"}],ys=[...Zt,{value:"email",label:"Email code",description:"Use an emailed one-time code"},{value:"api_key",label:"API key (advanced)",description:"Paste an existing Skills Layer login key"}],ks=[{value:"email",label:"Email",description:"Use an emailed verification code and API key"},...Zt];async function Ci(e,t){let n=g(e.method);if(!n)if(e.json)n="email";else try{n=await t.promptSelect("Choose how to register:",ks)}catch{return k("register requires --method when interactive selection is unavailable. Try `skills-layer register --method email --email you@example.com`, `skills-layer register --method google`, `skills-layer register --method github`, `skills-layer register --method gitlab`, or `skills-layer register --method microsoft`.",!1)}if(n==="email"){let r=g(e.email);if(!r&&!e.json)try{r=await t.promptText("Enter your email address: ")}catch{return k("register --method email requires --email when interactive prompts are unavailable.",!1)}r=v(r,"register requires --email.");let s=await b(t,"/api/v1/register",{method:"POST",headers:_(),body:JSON.stringify({method:n,email:r})});if(e.json){let a=s.status==="already_registered"?Gt(s):z({...s,nextCommand:`skills-layer auth verify --email ${r} --code <code> --json`,nextAction:"auth.verify"}),c=s.status==="already_registered"?`${r} is already registered.`:`Registration started for ${r}.`;return f(a,c,e.json,t)}if(s.status==="already_registered")return f(Gt(s),`${r} is already registered. Run \`skills-layer login\` to sign in, or \`skills-layer auth recover\` if you need account recovery.`,!1,t);let o;try{o=await t.promptText(`Enter the verification code sent to ${r} (check spam/junk folder if missing): `)}catch{return f(z(s),`Registration started for ${r}. Check your email (including spam/junk folder) for the verification code, then run \`skills-layer auth verify --email ${r} --code <code>\`.`,!1,t)}return await zi(r,o,e,t,`Verified ${r}.`)}let i=await b(t,"/api/v1/identity/social/start",{method:"POST",headers:_(),body:JSON.stringify({provider:n,mode:"login"})});return e.json?f(i,"Social registration started.",e.json,t):await ln(n,i,e,t,"login")}async function Ri(e,t){if(e.withMcp&&e.noMcp)return k("login cannot combine --with-mcp and --no-mcp.",e.json);let n=g(e.apiKey);if(n){let o=await Ue(t,n,{notifyLogin:!0}),a=await It(e,{...t,config:o,apiKey:n});return H(a)?a:f(z({status:"verified",...o,...a.data?{mcp:a.data}:{}}),[`Logged in as ${o.email}.`,a.message??""].filter(Boolean).join(" "),e.json,t)}let i=g(e.method);if(!i&&!e.json)try{let o=await t.promptSelect("Choose how to sign in:",ys);i=o==="api_key"?void 0:o}catch{return k("login requires --api-key or --method <email|google|github|gitlab|microsoft> when interactive selection is unavailable.",!1)}if(i){if(i==="email"){let a=g(e.email);!a&&!e.json&&(a=(await t.promptText("Enter your email address: ")).trim()),a=v(a,"login --method email requires --email.");let c=await b(t,"/api/v1/identity/recover/start",{method:"POST",headers:_(),body:JSON.stringify({email:a,method:"email",intent:"login"})});if(e.json)return f(c,`Passwordless email login started for ${a}.`,!0,t);let u;try{u=(await t.promptText(`Enter the sign-in code sent to ${a} (check spam/junk folder if missing): `)).trim()}catch{return f(c,`Passwordless email login started for ${a}. Check your email, then run \`skills-layer login --method email --email ${a}\` again when prompts are available.`,!1,t)}let d=await b(t,"/api/v1/identity/recover/complete",{method:"POST",headers:_(),body:JSON.stringify({email:a,code:u,intent:"login"})});return await rt(a,d,e,t,`Verified ${a}.`)}if(!["google","github","gitlab","microsoft"].includes(i))return k("login --method must be email, google, github, gitlab, or microsoft.",e.json);let o=await b(t,"/api/v1/identity/social/start",{method:"POST",headers:_(),body:JSON.stringify({provider:i,mode:"login"})});return e.json?f(o,"Social login started.",!0,t):await ln(i,o,e,t,"login")}if(!e.json)try{n=(await t.promptSecret("Enter your Skills Layer API key: ")).trim()}catch{return k("login requires an API key.",e.json)}if(!n)return k("login requires --api-key or --method <email|google|github|gitlab|microsoft>.",e.json);let r=await Ue(t,n,{notifyLogin:!0}),s=await It(e,{...t,config:r,apiKey:n});return H(s)?s:f(z({status:"verified",...r,...s.data?{mcp:s.data}:{}}),[`Logged in as ${r.email}.`,s.message??""].filter(Boolean).join(" "),e.json,t)}async function xi(e,t){return await Fn(t.config,{env:t.env,platform:t.platform,store:t.credentialStore}),await Ht(t.paths.configPath,{force:!0}),f({status:"logged_out"},"Logged out.",e.json,t)}async function ws(e,t,n){let i=e[0]??"show";if(i==="show")return await C("/api/v1/profile",t,n,"Profile loaded.",{authenticated:!0});if(i==="update"){let r=await vs(t,n);if(H(r))return r;let s=await b(n,"/api/v1/profile",{method:"PATCH",headers:_(n.apiKey),body:JSON.stringify(r)});return f(s,"Profile updated.",t.json,n)}return k(`Unknown profile command "${i}".`,t.json)}async function vs(e,t){let n=F(e,["displayName","bio","company"]);if(Object.keys(n).length>0)return n;if(e.json)return k("profile update requires at least one of --display-name, --bio, or --company.",!0);try{let i=await t.promptText("Display name (leave blank to keep unchanged): "),r=await t.promptText("Bio (leave blank to keep unchanged): "),s=await t.promptText("Company (leave blank to keep unchanged): "),o=j({displayName:i||void 0,bio:r||void 0,company:s||void 0});return Object.keys(o).length===0?k("No profile changes entered.",!1):o}catch{return k("profile update requires at least one of --display-name, --bio, or --company.",!1)}}async function bs(e,t,n){let i=e[0];if(i==="register")return await Ci({...t,method:"email"},n);if(i==="verify"){let r=v(t.email,"auth verify requires --email."),s=v(t.code,"auth verify requires --code.");return await zi(r,s,t,n,`Verified ${r}.`)}return i==="recover"?await Cs(e.slice(1),t,n):i==="login"?await Ri(t,n):i==="logout"?await xi(t,n):i==="status"?Ps(t,n):i==="repair"?await Ss(t,n):k(`Unknown auth command "${i??""}".`,t.json)}function Ps(e,t){let n=t.config?.baseUrl?ne(t.config.baseUrl):null,i=!!(t.apiKey&&n===t.baseUrl);return f({status:"auth_status",selectedBackend:Pe(t.baseUrl),selectedBaseUrl:t.baseUrl,loggedIn:i,requiresLogin:!i,...t.config?.email?{savedLogin:{baseUrl:n,email:t.config.email,role:t.config.role??null,roles:t.config.roles??[],savedAt:t.config.savedAt??null,...t.config.credentialStorage?{credentialStorage:t.config.credentialStorage}:{},matchesSelectedBackend:i}}:{}},i&&t.config?.email?`Logged in as ${t.config.email}.`:t.config?.baseUrl?`Saved login targets ${n}; selected backend is ${t.baseUrl}. Run \`skills-layer auth repair\` or \`skills-layer login\`.`:"Not logged in. Run `skills-layer login`.",e.json,t)}async function Ss(e,t){if(!t.config?.baseUrl||!t.config.apiKey||!t.config.email||!t.config.role||!t.config.savedAt)return k("No saved Skills Layer login was found to repair. Run `skills-layer login`.",e.json);let n=ne(t.config.baseUrl);return await D(t.paths.backendPreferencePath,{version:Vt,preferredBaseUrl:n,savedAt:t.now()}),await un(t.paths.configPath,{...t.config,baseUrl:n,savedAt:t.now()},t),f({status:"auth_repaired",baseUrl:n,loggedIn:!0,email:t.config.email,role:t.config.role,credentialStorage:t.config.credentialStorage??"local_file_locked"},`Auth repaired for ${t.config.email}. Backend preference now matches ${n}.`,e.json,t)}async function Cs(e,t,n){let i=e[0]??g(t.method)??"email",r=g(t.email);if(!r&&!t.json)try{r=await n.promptText("Enter your email address: ")}catch{return k("auth recover requires --email when interactive prompts are unavailable.",!1)}if(r=v(r,"auth recover requires --email."),i==="complete"){let c=g(t.code);if(!c&&!t.json)try{c=await n.promptText("Enter the recovery code: ")}catch{return k("auth recover complete requires --code when interactive prompts are unavailable.",!1)}return c=v(c,"auth recover complete requires --code."),await zn(r,c,t,n)}let s=await b(n,"/api/v1/identity/recover/start",{method:"POST",headers:_(),body:JSON.stringify({email:r,method:i})}),o=Gt(s);if(t.json)return f(o,"Recovery started.",!0,n);let a="";try{a=(await n.promptText("Enter the recovery code if you received one, or press Enter to stop: ")).trim()}catch{return f(o,`If this email can continue, instructions have been sent. Check your inbox and spam folder. When you have a code, run \`skills-layer auth recover complete --email ${r} --code <code>\`.`,!1,n)}return a?await zn(r,a,t,n):f(o,`If this email can continue, instructions have been sent. When you have a code, run \`skills-layer auth recover complete --email ${r} --code <code>\`.`,!1,n)}async function zn(e,t,n,i){let r=await b(i,"/api/v1/identity/recover/complete",{method:"POST",headers:_(),body:JSON.stringify({email:e,code:t})});if(n.json){let s=l(r,"apiKey");return s?(await Ue(i,s,{expectedEmail:e,knownEmail:l(r,"email")??e,knownRole:l(r,"role")??"user",knownRoles:re(r,"roles"),knownUserId:l(r,"userId")}),f(z({...r,loggedIn:!0}),"Recovery complete.",!0,i)):f(z({...r,email:e,loggedIn:!1}),"Recovery complete.",!0,i)}return await rt(e,r,n,i,`Recovered access for ${e}.`)}async function Rs(e,t,n){let i=e[0],r=1;if(i==="providers")return await C("/api/v1/identity/social/providers",t,n,"Identity providers loaded.");if(i==="start"){let s=g(t.provider);if(!s&&!t.json)try{s=await n.promptSelect("Choose identity provider:",Zt)}catch{return k("identity start requires --provider when interactive selection is unavailable.",!1)}s=v(s,"identity start requires --provider.");let o=await b(n,"/api/v1/identity/social/start",{method:"POST",headers:_(n.apiKey),body:JSON.stringify({provider:s,mode:g(t.mode)??"login"})});return t.json?f(o,"Social auth started.",!0,n):await ln(s,o,t,n,"login")}if(i==="status"){let s=g(t.state)??e[r];return s?await C(`/api/v1/identity/social/status/${encodeURIComponent(s)}`,t,n,"Social auth status loaded."):k("identity status requires --state.",t.json)}if(i==="complete"){let s=v(t.provider,"identity complete requires --provider."),o=v(t.state,"identity complete requires --state."),a=v(t.code,"identity complete requires --code."),c=await b(n,"/api/v1/identity/social/complete",{method:"POST",headers:_(n.apiKey),body:JSON.stringify({provider:s,state:o,code:a})});return await Oa(c,n),f(z(c),"Social auth complete.",t.json,n)}if(i==="list")return await C("/api/v1/me/linked-identities",t,n,"Linked identities loaded.",{authenticated:!0});if(i==="unlink"){let s=v(t.provider??e[r],"identity unlink requires a provider."),o=await b(n,`/api/v1/me/linked-identities/${encodeURIComponent(s)}`,{method:"DELETE",headers:M(n.apiKey,n.authBlockedMessage)});return f(o,"Identity unlinked.",t.json,n)}return k(`Unknown identity command "${i??""}".`,t.json)}async function xs(e,t,n){let i=e[0];if(!i)return k("api-key requires create, list, or revoke.",t.json);if(i==="list")return await C("/api/v1/me/api-keys",t,n,"API keys loaded.",{authenticated:!0});if(i==="create"){let r=g(t.name),s=El(t.scope);if(!r)return k("api-key create requires --name.",t.json);if(s.length===0)return k("api-key create requires at least one --scope.",t.json);let o=await b(n,"/api/v1/me/api-keys",{method:"POST",headers:{"content-type":"application/json",...M(n.apiKey,n.authBlockedMessage)},body:JSON.stringify({name:r,scopes:s,...g(t.expires)?{expiresIn:g(t.expires)}:{}})});return f(z(o),"Automation API key created. The full key was sent to your verified email. Run `skills-layer api-key list` to manage keys.",t.json,n)}if(i==="rotate")return k(`api-key rotate is not part of normal login.
783
840
 
784
841
  For CLI access:
785
842
  skills-layer login
@@ -793,22 +850,22 @@ To remove an old key:
793
850
 
794
851
  Run:
795
852
  skills-layer api-key list
796
- skills-layer api-key revoke --key-id <key-id>`,t.json);let s=String(r),o=await b(n,`/api/v1/me/api-keys/${encodeURIComponent(s)}/revoke`,{method:"POST",headers:U(n.apiKey,n.authBlockedMessage)});return f(o,"API key revoked.",t.json,n)}return k(`Unknown api-key command "${i}".`,t.json)}async function Ps(e,t,n){let i=e[0]??"status";if(i==="setup"||i==="repair"){let r=await Qt(t,n);return D(r)?r:f({...r},`MCP configuration written for ${r.clientId}. Open a fresh agent session to load Skills Layer tools, then run \`skills-layer mcp verify --client ${r.clientId}\` if they are not visible.`,t.json,n)}if(i==="status"||i==="verify"){let r=await z(n.paths.mcpConfigPath);if(!r)return f({status:"mcp_not_configured",configured:!1,nextCommand:"skills-layer mcp setup"},"MCP is not configured on this machine.",t.json,n);let s=g(t.client)??g(t.agent)??a(r,"clientId")??"codex",o=a(r,"baseUrl")??n.baseUrl,l=await bn({baseUrl:o,mcpUrl:a(r,"mcpUrl")??`${o}/mcp`,bearerTokenEnvVar:"SKILLS_LAYER_MCP_TOKEN",clientId:s,environment:a(r,"environment")??Pe(o),now:n.now(),env:n.env,platform:n.platform,cwd:n.cwd,stateDir:n.paths.stateDir,mcpConfigPath:n.paths.mcpConfigPath,nodePath:process.execPath,mcpConfig:r});if(i==="verify"&&l.configured){let c=await Cn({nodePath:process.execPath,bridgePath:l.bridge.path}),u={...l,verified:c.status==="ok",liveProbe:c};return c.status!=="ok"?j(u,`MCP config exists for ${l.clientId}, but live bridge verification failed: ${c.message}`,t.json,c.reasonCode??void 0):f(u,`MCP verified for ${l.clientId}. ${c.message} Open a fresh agent session or restart the agent if tools are not visible yet.`,t.json,n)}return f(l,l.configured?`MCP configuration is present for ${l.clientId}. Open a fresh agent session if tools are not visible, or run \`skills-layer mcp verify --client ${l.clientId}\` for a live check.`:`MCP needs repair for ${l.clientId}. Run \`${l.nextCommand}\`.`,t.json,n)}if(i==="disconnect"||i==="logout"){let r=g(t.client)??g(t.agent)??"codex",s=await z(n.paths.mcpConfigPath),o=Ae({baseUrl:n.baseUrl,mcpUrl:`${n.baseUrl}/mcp`,bearerTokenEnvVar:"SKILLS_LAYER_MCP_TOKEN",clientId:r,environment:Pe(n.baseUrl),now:n.now(),env:n.env,platform:n.platform,cwd:n.cwd,stateDir:n.paths.stateDir,mcpConfigPath:n.paths.mcpConfigPath,nodePath:process.execPath}),l=o.targets.find(c=>c.agentId===r);return await Rs(s,n),await l?.disconnect?.(),await xn(o.bridgePath),await $n(o.brokerPath,o.brokerSocketPath),await Dt(n.paths.mcpConfigPath,{force:!0}),f({status:"mcp_disconnected",configured:!1,clientId:r},"MCP disconnected on this machine.",t.json,n)}return k(`Unknown mcp command "${i}". Use setup, status, verify, repair, or disconnect.`,t.json)}async function Qt(e,t){let n=g(e.environment)??Pe(t.baseUrl),i=["mcp:use","catalog:read","library:read","guardian:check","guardian:incident","creator:read"],r=`${t.baseUrl}/mcp`,s=Ae({baseUrl:t.baseUrl,mcpUrl:r,bearerTokenEnvVar:"SKILLS_LAYER_MCP_TOKEN",clientId:"codex",environment:n,now:t.now(),env:t.env,platform:t.platform,cwd:t.cwd,stateDir:t.paths.stateDir,mcpConfigPath:t.paths.mcpConfigPath,nodePath:process.execPath}),o=await Ss(e,t,s),l=o.clientIds[0]??"codex",c=Ae({baseUrl:t.baseUrl,mcpUrl:r,bearerTokenEnvVar:"SKILLS_LAYER_MCP_TOKEN",clientId:l,environment:n,now:t.now(),env:t.env,platform:t.platform,cwd:t.cwd,stateDir:t.paths.stateDir,mcpConfigPath:t.paths.mcpConfigPath,nodePath:process.execPath}),u={},d=null;for(let m of o.clientIds){let h=await b(t,"/api/v1/me/mcp-tokens",{method:"POST",headers:_(t.apiKey),body:JSON.stringify({clientId:m,environment:n,scopes:i})}),w=a(h,"apiKey");if(!w)return k("MCP setup did not receive a token from the backend.",e.json);let P=await Cs(t,{token:w,clientId:m,environment:n});u[m]={clientId:m,environment:n,...P,tokenPrefix:a(h,"keyPrefix")??null,scopes:Array.isArray(h.scopes)?h.scopes:[],savedAt:t.now()},d??=h}let p=u[l]??{};await K(t.paths.mcpConfigPath,{version:1,baseUrl:t.baseUrl,mcpUrl:r,clientId:l,clientIds:o.clientIds,environment:n,selectionSource:o.selectionSource,detectedClientIds:o.detectedClientIds,...p,tokens:u,brokerPath:c.brokerPath,brokerSocketPath:c.brokerSocketPath,savedAt:t.now()});let y=c.targets.filter(m=>m.status==="automatic"&&o.clientIds.includes(m.agentId));for(let m of y)await m.apply?.();return{...J(d??{}),status:"mcp_configured",clientId:l,clientIds:o.clientIds,selectionSource:o.selectionSource,detectedClientIds:o.detectedClientIds,environment:n,mcpUrl:r,bridgePath:c.bridgePath,brokerPath:c.brokerPath,brokerSocketPath:c.brokerSocketPath,nodePath:c.nodePath,bridgeChecksum:c.bridgeChecksum,brokerChecksum:c.brokerChecksum,saved:!0,readiness:{status:"configured_needs_agent_reload",verifyCommand:`skills-layer mcp verify --client ${l}`,nextStep:"Open a fresh agent session so the host can load the updated MCP configuration. Run verify or repair if Skills Layer tools are still not visible."},registrations:{status:"mcp_registration_plan",automaticCount:c.automaticCount,manualCount:c.manualCount,skillsOnlyCount:c.skillsOnlyCount,unsupportedCount:c.unsupportedCount,appliedCount:y.length,appliedClients:y.map(m=>m.agentId),targets:c.targets.map(m=>({agentId:m.agentId,displayName:m.displayName,tier:m.tier,status:m.status,transport:m.transport,configPath:m.configPath,bridgePath:m.bridgePath,restartRequired:m.restartRequired,reason:m.reason,instructions:m.instructions}))}}}async function Ss(e,t,n){let i=g(e.client)??g(e.agent),r=n.targets.filter(c=>c.status==="automatic").map(c=>c.agentId);if(i)return{clientIds:[i],detectedClientIds:[],selectionSource:"explicit"};if(e.all)return{clientIds:r,detectedClientIds:r,selectionSource:"all"};let s=await pn({env:t.env,platform:t.platform,cwd:t.cwd,pathExists:ge}),o=new Set(r),l=s.map(c=>c.id).filter(c=>o.has(c));return l.length>0?{clientIds:l,detectedClientIds:l,selectionSource:"detected"}:{clientIds:["codex"],detectedClientIds:[],selectionSource:"fallback"}}async function Cs(e,t){if(!e.credentialStore)return{token:t.token,credentialStorage:"local_file_locked",tokenStorage:"local_file_locked"};let n=$s({baseUrl:e.baseUrl,userId:e.config?.userId,email:e.config?.email,clientId:t.clientId,environment:t.environment});try{return await e.credentialStore.set(je,n,t.token),{tokenRef:n,credentialStorage:"macos_keychain",credentialService:je,tokenStorage:"macos_keychain"}}catch{return{token:t.token,credentialStorage:"local_file_locked",tokenStorage:"local_file_locked"}}}async function Rs(e,t){if(!e||!t.credentialStore)return;let n=xs(e,je);for(let i of n)await t.credentialStore.delete(i.service,i.tokenRef)}function xs(e,t){let n=new Map;Hn(e,t,n);let i=e.tokens;if(R(i))for(let r of Object.values(i))R(r)&&Hn(r,t,n);return[...n.values()]}function Hn(e,t,n){let i=a(e,"tokenRef");if(!i||a(e,"credentialStorage")!=="macos_keychain")return;let r=a(e,"credentialService")??t;n.set(`${r}:${i}`,{service:r,tokenRef:i})}function $s(e){let t=[e.baseUrl,e.userId??e.email??"unknown-user",e.clientId,e.environment,"mcpToken"].join(`
797
- `);return`skills-layer-cli:mcp-token:${Gt("sha256").update(t).digest("base64url").slice(0,32)}`}async function It(e,t){if(e.noMcp)return{data:{status:"mcp_skipped",configured:!1,nextCommand:"skills-layer mcp setup"},message:"MCP setup skipped. Run `skills-layer mcp setup` later when you want AI-tool access."};let n=await z(t.paths.mcpConfigPath),i=n?a(n,"baseUrl"):void 0,r=n?a(n,"clientId")??"codex":"codex";if(!e.withMcp&&i===t.baseUrl&&r)return{data:{status:"mcp_already_configured",configured:!0,clientId:r,mcpUrl:n?a(n,"mcpUrl")??`${t.baseUrl}/mcp`:`${t.baseUrl}/mcp`},message:"MCP is already configured for this machine."};if(!e.withMcp&&!e.json){let l=await z(t.paths.mcpPreferencePath),c=l?a(l,"baseUrl"):void 0,u=l?a(l,"clientId")??"codex":void 0;if((l?a(l,"choice"):void 0)==="not_now"&&c===t.baseUrl&&u==="codex")return{data:{status:"mcp_skipped_previously",configured:!1,nextCommand:"skills-layer mcp setup"},message:"MCP setup was skipped previously. Run `skills-layer mcp setup` when you want AI-tool access."}}let s=e.withMcp===!0;if(!s&&!e.json)try{let l=await t.promptSelect("Set up Skills Layer MCP for your AI tools on this machine?",[{value:"yes",label:"Yes, set up MCP",description:"Mint a scoped token and write local MCP configuration"},{value:"no",label:"Not now",description:"You can run skills-layer mcp setup later"}]);if(s=l==="yes",l==="no")return await K(t.paths.mcpPreferencePath,{version:1,choice:"not_now",baseUrl:t.baseUrl,clientId:"codex",savedAt:t.now()}),{data:{status:"mcp_skipped",configured:!1,nextCommand:"skills-layer mcp setup"},message:"MCP setup skipped. Run `skills-layer mcp setup` later when you want AI-tool access."}}catch{return{}}if(!s)return{};let o=await Qt(e,t);return D(o)?o:{data:o,message:"MCP configuration written for this machine. Open a fresh agent session so your AI tools can load it."}}async function _s(e,t,n){let i=e.join(" ").trim()||g(t.search)||"",r=new URLSearchParams;i&&r.set("query",i),B(r,"agent",t.agent),B(r,"capability",t.capability),B(r,"trust",t.trust),B(r,"runtime-risk",t.runtimeRisk),B(r,"security-capability",t.securityCapability);let s=await b(n,`/api/v1/search${ie(r)}`);if(t.install!==void 0){let o=g(t.install);if(!o){if(t.json)return k("search --install requires an explicit skill slug in the public CLI package.",!0);let c=Fe(s);if(c.length===0)return k("Search results do not include any installable skills. Run search again with a broader query.",!1);if(c.length===1)o=c[0].value;else try{o=await n.promptSelect("Select a search result to install:",c)}catch{return k("No search result was selected for install.",!1)}}let l=Sl(s);return l.includes(o)?await Zt([o],t,n):k(l.length===0?`Search results do not include "${o}". Run search again with a matching query first.`:`Search results do not include "${o}". Run search again with a matching query or choose one of: ${l.join(", ")}.`,t.json)}return f(s,"Search complete.",t.json,n)}async function As(e,t,n){let i=new URLSearchParams;return B(i,"limit",t.limit),B(i,"search",t.search),B(i,"sort",t.sort),await C(`/api/v1/${e}${ie(i)}`,t,n,`${lt(e)} skills loaded.`)}async function Is(e,t,n){let i=e.join(" ").trim();if(!i)return k("recommend requires a task.",t.json);let r=new URLSearchParams({task:i});return B(r,"limit",t.limit),await C(`/api/v1/recommend?${r.toString()}`,t,n,"Recommendations loaded.")}async function js(e,t,n){if(e.length<2)return k("compare requires two or more skill slugs.",t.json);let i=new URLSearchParams({slugs:e.join(",")}),r=await b(n,`/api/v1/skills/compare?${i.toString()}`);return t.json?f(r,"Comparison loaded.",!0,n):{exitCode:0,stdout:Fa(r,"Comparison loaded.",W(n),t.verbose),stderr:""}}async function Es(e,t,n){let i=v(e[0],"show requires a skill slug.");return await C(`/api/v1/skills/${encodeURIComponent(i)}`,t,n,"Skill loaded.")}async function Ls(e,t,n){let i=v(e[0],"trust requires a skill slug."),r=new URLSearchParams;B(r,"format",t.format),B(r,"version",t.version);let s=await b(n,`/api/v1/skills/${encodeURIComponent(i)}/trust${ie(r)}`);return g(t.format)?.toLowerCase()==="sarif"&&!t.json?{exitCode:0,stdout:Po(s,i,n),stderr:""}:f(s,"Trust report loaded.",t.json,n)}async function Ts(e,t,n){let i=We(e[0],e[1]);if(i)return Jn(i,[e[0],e[1]].filter(Boolean).join(" "),t,n);let r=e[0];if(!r)return{exitCode:0,stdout:Ee,stderr:""};if(r==="full")return{exitCode:0,stdout:Ee,stderr:""};if(r==="topic"){let s=We(e[1]);if(s)return Jn(s,e[1]??"overview",t,n);let o=new URLSearchParams;return e[1]&&o.set("topic",e[1]),await C(`/api/v1/help${ie(o)}`,t,n,"Help topic loaded.")}if(r==="standards")return await C("/api/v1/standards",t,n,"Marketplace standards loaded.");if(r==="marketplace-status"){let s=await b(n,"/api/v1/marketplace/status");return t.json?f(s,"Marketplace status loaded.",!0,n):f(Ja(s),"Marketplace status loaded.",!1,n)}if(r==="capabilities"){let s=await b(n,"/api/v1/capabilities");return f(Wa(s),"Edition capabilities loaded.",t.json,n)}if(r==="schema-plan")return k("help schema-plan is not included in the public npm CLI.",t.json);if(r==="optimize-tokens"){let s=v(t.text,"help optimize-tokens requires --text."),o=Va(t.maxCharacters,t.json);if(D(o))return o;let l=await b(n,"/api/v1/optimize-tokens",{method:"POST",headers:_(n.apiKey),body:JSON.stringify({text:s,...o?{maxCharacters:o}:{}})});return f(l,"Token optimization complete.",t.json,n)}return k(`Unknown help command "${r}".`,t.json)}function Jn(e,t,n,i){return n.json?f({status:"ok",topic:t,content:e},"Help topic loaded.",!0,i):{exitCode:0,stdout:e,stderr:""}}async function Us(e,t,n){let i=v(e[0]??t.path,"validate requires a file or directory."),s={files:await st(ae(n.cwd,i)),sourceIntakeContext:g(t.sourceIntakeContext),publicationStatus:g(t.publicationStatus),dependencyAuditStatus:g(t.dependencyAuditStatus),category:g(t.category),discloseSource:!!t.discloseSource,allowFindingsFeatured:!!t.allowFindingsFeatured},o=await b(n,"/api/v1/validation/preview",{method:"POST",headers:_(n.apiKey),body:JSON.stringify(A(s))});return t.json?f(o,"Validation complete.",!0,n):{exitCode:0,stdout:Ya(o,i,n),stderr:""}}async function Bs(e,t,n){let i=v(e[0]??t.path,"preview-trigger requires a file or directory."),r=await st(ae(n.cwd,i)),s=await b(n,"/api/v1/validation/trigger-preview",{method:"POST",headers:_(n.apiKey),body:JSON.stringify({files:r,shouldTriggerPrompts:t.shouldTrigger,shouldNotTriggerPrompts:t.shouldNotTrigger,paraphrasePrompts:t.paraphrase})});return t.json?f(s,"Trigger preview complete.",!0,n):{exitCode:0,stdout:Qa(s,i,n),stderr:""}}async function Ms(e,t,n){let i=e[0];if(i==="init")return await Ns(e.slice(1),t,n);if(i==="rules")return await C("/api/v1/creator/rules",t,n,"Creator rules loaded.");if(i==="submissions")return await C("/api/v1/me/submissions",t,n,"Submissions loaded.",{authenticated:!0});if(i==="status"){let r=v(e[1],"creator status requires a skill slug.");try{return await C(`/api/v1/me/submissions/${encodeURIComponent(r)}`,t,n,"Submission status loaded.",{authenticated:!0})}catch(s){if(s instanceof E&&s.status===404)return Ks(r,t);throw s}}if(i==="charge-status"){let r=v(e[1],"creator charge-status requires a charge id.");return await C(`/api/v1/me/private-skill-charges/${encodeURIComponent(r)}`,t,n,"Charge status loaded.",{authenticated:!0})}if(i==="submit")return await zn(e.slice(1),t,n,!1);if(i==="submit-version")return await zn(e.slice(1),t,n,!0);if(i==="check-slug"){let r=v(e[1],"creator check-slug requires a slug.");return await qs(r,t,n)}if(i==="rename"){let r=v(e[1],"creator rename requires the current slug."),s=v(e[2],"creator rename requires the new slug.");return await Be(`/api/v1/me/submissions/${encodeURIComponent(r)}/slug`,{nextSkillSlug:s},t,n,"Skill renamed.")}if(i==="pricing")return await Hs(e,t,n);if(i==="update-listing"){let r=v(e[1],"creator update-listing requires a skill slug.");return await Js(r,t,n)}if(i==="visibility"){let r=v(e[1],"creator visibility requires a skill slug."),s=await b(n,`/api/v1/me/submissions/${encodeURIComponent(r)}/visibility`,{method:"PATCH",headers:_(n.apiKey),body:JSON.stringify(A({visibility:g(t.visibility)??e[2],dryRun:t.dryRun}))});return Uo(s)?j(s,Bo(s,r),t.json,a(s,"reasonCode")??a(s,"status")):f(s,t.dryRun?"Visibility preview loaded.":"Visibility updated.",t.json,n)}if(i==="security-report"){let r=v(e[1],"creator security-report requires a skill slug."),s=new URLSearchParams;B(s,"format",t.format),B(s,"version",t.version),B(s,"versionId",t.versionId);let o=await b(n,`/api/v1/me/submissions/${encodeURIComponent(r)}/trust${ie(s)}`,{headers:U(n.apiKey,n.authBlockedMessage)});return t.json||t.verbose?f(o,"Creator security report loaded.",t.json,n):{exitCode:0,stdout:gl(o,r,n),stderr:""}}if(i==="rescan-security"){let r=v(e[1],"creator rescan-security requires a skill slug."),s=await b(n,`/api/v1/me/submissions/${encodeURIComponent(r)}/trust/rescan`,{method:"POST",headers:_(n.apiKey),body:JSON.stringify(A(F(t,["version","versionId"])))});return t.json?f(s,"Security rescan requested.",!0,n):{exitCode:0,stdout:pl(s,r,n),stderr:""}}if(i==="provenance"){let r=v(e[1],"creator provenance requires a skill slug.");return await C(`/api/v1/me/submissions/${encodeURIComponent(r)}/provenance`,t,n,"Provenance loaded.",{authenticated:!0})}if(i==="claim"||i==="verify"||i==="dispute")return await zs(i,e,t,n);if(i==="issues"||i==="reviews"||i==="update-issue"||i==="moderate-review")return await Xs(i,e,t,n);if(i==="analytics"){let r=v(e[1],"creator analytics requires a skill slug.");return await Ws(r,t,n)}return i==="earnings"?await C("/api/v1/me/earnings",t,n,"Creator earnings loaded.",{authenticated:!0}):i==="payout-profile"?await Vs(t,n):i==="payout-link"?await Ys(t,n):i==="payouts"?await C("/api/v1/me/payouts",t,n,"Creator payouts loaded.",{authenticated:!0}):i==="withdraw"?await N("/api/v1/me/payouts/withdrawals",F(t,["amountCents","reason"]),t,n,"Withdrawal requested."):i==="source"?await eo(e.slice(1),t,n):k(`Unknown creator command "${i??""}".`,t.json)}async function Ns(e,t,n){let i=g(t.skill)??e[0]??"my-skill",r=ae(n.cwd,g(t.dir)??i),s=I(r,"SKILL.md"),o;try{o=Ln(g(t.type))}catch(y){return k(ue(y),t.json)}let l=g(t.category),c=await Os(r);if((await ge(s)||c)&&!t.confirmed)return k(`Creator init target already exists at ${r}. Re-run with --confirm only if you want to overwrite ${s}.`,t.json);await Ne(r,{recursive:!0});let d=Tn({skillSlug:i,description:g(t.description)??"Describe what this skill helps an agent do.",skillType:o,category:l});for(let y of d)await te(I(r,y.path),y.content);let p=A({status:"created",path:s,skillSlug:i,skillType:o,category:l,fileCount:d.length});return t.json?f(p,`Created ${s}.`,!0,n):{exitCode:0,stdout:rl(p,r,s,n),stderr:""}}async function ge(e){try{return await hi(e),!0}catch{return!1}}async function Os(e){try{return(await ki(e)).length>0}catch{return await ge(e)}}async function zn(e,t,n,i){let r=v(e[0]??t.path,`creator ${i?"submit-version":"submit"} requires a path.`),s=await st(ae(n.cwd,r));if(!i&&!t.dryRun){let y=await Fs(s,t,n);if(y)return y}let o=A({files:s,version:g(t.version),dryRun:t.dryRun,allowFindingsFeatured:t.allowFindingsFeatured,pricing:g(t.priceCents)?{priceCents:Number(g(t.priceCents))}:void 0,...F(t,["displayName","skillType","category","visibility","source","skill"])}),l=g(t.skill)??e[1],c=i&&l?`/api/v1/me/submissions/${encodeURIComponent(l)}/versions`:"/api/v1/me/submissions",u=await b(n,c,{method:"POST",headers:_(n.apiKey),body:JSON.stringify(o)});if(t.json||u.status!=="checkout_required"||typeof u.checkoutUrl!="string"||typeof u.chargeId!="string")return f(u,i?"Version submitted.":"Submission uploaded.",t.json,n);n.emitInfo("Opening payment setup for skill submission. Complete the payment in your browser, then come back here."),await n.openUrl(u.checkoutUrl)||n.emitInfo(`Open this checkout URL manually to continue: ${u.checkoutUrl}`),n.emitInfo("Waiting for payment confirmation...");let p=await Ra(u.chargeId,n);return D(p)?p:p.status!=="submitted"?f({...u,chargeStatus:p.status},`Payment is still ${p.status}. You can rerun \`skills-layer creator charge-status ${u.chargeId}\` to continue tracking it.`,t.json,n):f(p,i?"Version submitted.":"Submission uploaded.",t.json,n)}async function Fs(e,t,n){let i=g(t.skill)??Gs(e);if(!i)return null;let r;try{r=await b(n,`/api/v1/me/creator/slug-check?slug=${encodeURIComponent(i)}`,{headers:U(n.apiKey,n.authBlockedMessage)})}catch(s){if(s instanceof E&&s.status===404)return Ci(i,t);throw s}if(r.available===!1||a(r,"reasonCode")==="unavailable"||a(r,"reasonCode")==="reserved"){let s=a(r,"assignedSlug"),o=A({status:"duplicate_candidate",reasonCode:a(r,"reasonCode")??"slug_unavailable",requestedSlug:i,assignedSlug:s,nextAction:"creator.status",nextStep:`Run \`skills-layer creator status ${i}\`, \`skills-layer creator submissions\`, or submit a new version of the existing skill instead of creating a duplicate listing.`});return j(o,`A public skill slug "${i}" already exists or is not available. Run \`skills-layer creator status ${i}\`, check your creator submissions, or submit a new version instead of creating a duplicate listing.`,t.json,a(o,"reasonCode"))}return null}async function qs(e,t,n){try{return await C(`/api/v1/me/creator/slug-check?slug=${encodeURIComponent(e)}`,t,n,"Slug status loaded.",{authenticated:!0})}catch(i){if(i instanceof E&&i.status===404)return Ci(e,t);throw i}}function Ci(e,t){let n={status:"slug_check_unavailable",reasonCode:"slug_check_route_unavailable",requestedSlug:e,nextAction:"creator.status",nextStep:`Slug availability could not be checked on the selected backend. Run \`skills-layer creator submissions\`, \`skills-layer creator status ${e}\`, or retry after selecting a compatible Skills Layer backend.`};return j(n,`Slug availability could not be checked for ${e} on the selected backend. Run \`skills-layer creator submissions\` or retry after selecting a compatible Skills Layer backend.`,t.json,"slug_check_route_unavailable")}function Ks(e,t){return j({status:"not_submitted",reasonCode:"creator_submission_not_found",skillSlug:e,nextAction:"creator.submit",nextStep:"Run `skills-layer creator submit <path> --dry-run` to validate a local skill before submitting it, or run `skills-layer creator submissions` to see your existing submissions."},`No creator submission was found for ${e}. Run \`skills-layer creator submit <path> --dry-run\` before checking status.`,t.json,"creator_submission_not_found")}function Gs(e){let t=e.find(i=>i.path.split("/").pop()?.toLowerCase()==="skill.md");if(!t)return;let n=/^---\s*\n(?<body>[\s\S]*?)\n---/u.exec(t.content??"")?.groups?.body?.split(/\r?\n/u).map(i=>i.match(/^name\s*:\s*(?<name>.+?)\s*$/u)?.groups?.name?.trim().replace(/^["']|["']$/gu,"")).find(i=>!!i);return Ds(n??G(oe(t.path)))}function Ds(e){return e?.toLowerCase().replace(/[^a-z0-9]+/gu,"-").replace(/^-+|-+$/gu,"")||void 0}async function Hs(e,t,n){let i=v(e[1],"creator pricing requires a skill slug."),r=new URLSearchParams;if(B(r,"version",t.version),!t.priceCents)return await C(`/api/v1/me/submissions/${encodeURIComponent(i)}/pricing${ie(r)}`,t,n,"Pricing loaded.",{authenticated:!0});let s=Number(g(t.priceCents)),o=await b(n,`/api/v1/me/submissions/${encodeURIComponent(i)}/pricing${ie(r)}`,{headers:U(n.apiKey,n.authBlockedMessage)}),l=ce(o,"priceCents")??0;if(s>l){let c=A({status:"pending_approval",reasonCode:l===0?"paid_activation_requires_approval":"price_increase_requires_approval",skillSlug:i,version:a(o,"version"),currentPriceCents:l,requestedPriceCents:s,currency:a(o,"currency")??"gbp",nextStep:"Pricing changes that increase buyer-facing cost require approval. Keep the current price for now, then retry after approval is available."});return f(c,"Pricing change requires approval before it can affect buyers.",t.json,n)}return await Be(`/api/v1/me/submissions/${encodeURIComponent(i)}/pricing`,{priceCents:s,version:g(t.version)},t,n,"Pricing updated.")}async function Js(e,t,n){try{return await Be(`/api/v1/me/submissions/${encodeURIComponent(e)}`,F(t,["displayName","summary","description","category","skillType","license","listingStatus"]),t,n,"Listing updated.")}catch(i){if(i instanceof E&&i.status===404){let r={status:"listing_not_found_or_not_editable",reasonCode:"creator_listing_not_found_or_not_owned",skillSlug:e,nextAction:"creator.submissions",nextStep:`Run \`skills-layer creator submissions\` to see editable listings, or \`skills-layer show ${e}\` to inspect the public catalog entry.`};return j(r,`No editable creator listing was found for ${e}. Run \`skills-layer creator submissions\` to see listings you can update.`,t.json,"creator_listing_not_found_or_not_owned")}throw i}}async function zs(e,t,n,i){let r=v(t[1],`creator ${e} requires a skill slug.`);try{if(e==="claim")return await N(`/api/v1/me/skills/${encodeURIComponent(r)}/ownership/claim`,F(n,["requestedRole","message"]),n,i,"Ownership claim submitted.");if(e==="verify"){let s=v(n.claimId,"creator verify requires --claim-id.");return await N(`/api/v1/me/skills/${encodeURIComponent(r)}/ownership/verify`,{claimId:s},n,i,"Ownership claim verified.")}return await N(`/api/v1/me/skills/${encodeURIComponent(r)}/ownership/dispute`,F(n,["message"]),n,i,"Ownership dispute submitted.")}catch(s){if(s instanceof E&&s.status===404){let o={status:"ownership_action_unavailable",reasonCode:e==="claim"?"skill_not_found_or_not_claimable":"ownership_claim_not_found",skillSlug:r,requestedRole:g(n.requestedRole),nextAction:e==="claim"?"search":"creator.claim",nextStep:e==="claim"?`Run \`skills-layer search ${r}\`, \`skills-layer show ${r}\`, or submit/source-install the skill before claiming it.`:`Run \`skills-layer creator claim ${r}\` to start a new claim if the skill is claimable.`};return j(o,e==="claim"?`No claimable skill was found for ${r}. Search or show the skill first, then claim it only when it exists and is claimable.`:`No matching ownership claim was found for ${r}. Start a new claim if the skill is claimable.`,n.json,a(o,"reasonCode")??"ownership_action_unavailable")}throw s}}async function Ws(e,t,n){try{return await C(`/api/v1/me/submissions/${encodeURIComponent(e)}/analytics`,t,n,"Analytics loaded.",{authenticated:!0})}catch(i){if(i instanceof E&&i.status===404){let r={status:"no_creator_submission",reasonCode:"creator_submission_not_found",skillSlug:e,nextAction:"creator.submissions",nextStep:`Run \`skills-layer creator submissions\` to see skills you own, \`skills-layer show ${e}\` to inspect the catalog listing, or \`skills-layer creator claim ${e}\` if it is a claimable public-source skill.`};return j(r,`No creator-owned analytics submission was found for ${e}. Run \`skills-layer creator submissions\`, \`skills-layer show ${e}\`, or \`skills-layer creator claim ${e}\` if you should manage it.`,t.json,"creator_submission_not_found")}throw i}}async function Vs(e,t){let n=await b(t,"/api/v1/me/payout-profile",{headers:U(t.apiKey,t.authBlockedMessage)});return f(n,"Creator payout profile loaded.",e.json,t)}async function Ys(e,t){let n=Qs(g(e.mode));if(e.mode&&n===null)return k("creator payout-link --mode must be account_onboarding|account_update|onboarding|update.",e.json);let i;try{i=await b(t,"/api/v1/me/payout-profile/link",{method:"POST",headers:_(t.apiKey),body:JSON.stringify(n?{mode:n}:{})})}catch(s){if(s instanceof E&&Zs(s))return j({status:"payout_setup_already_submitted",reasonCode:"payout_update_link_unavailable",nextAction:"creator.payout-profile",nextStep:"Run `skills-layer creator payout-profile` to confirm readiness, then use `skills-layer creator earnings` or `skills-layer creator withdraw --amount-cents <amount>`."},"Payout setup is already submitted for this account. Run `skills-layer creator payout-profile` to confirm readiness before requesting a withdrawal.",e.json,"payout_update_link_unavailable");throw s}let r=xa(i);return r&&!e.json&&e.showUrl!==!0&&(t.emitInfo("Opening payout setup in your browser. Finish the flow there, then come back here."),await t.openUrl(r)||t.emitInfo(`Open this payout setup URL manually to continue: ${r}`)),f(i,"Payout setup link created.",e.json,t)}function Qs(e){if(!e)return null;let t=e.trim().toLowerCase();return t==="account_onboarding"||t==="onboarding"?"account_onboarding":t==="account_update"||t==="update"?"account_update":null}function Zs(e){let t=`${e.message} ${a(e.details??{},"error")??""}`.toLowerCase();return t.includes("account_update")&&t.includes("account_onboarding")&&t.includes("account link")}async function Xs(e,t,n,i){let r=v(t[1],`creator ${e} requires a skill slug.`);if(e==="issues")return await C(`/api/v1/me/library/${encodeURIComponent(r)}/issues`,n,i,"Issues loaded.",{authenticated:!0});if(e==="reviews")return await C(`/api/v1/me/library/${encodeURIComponent(r)}/reviews`,n,i,"Reviews loaded.",{authenticated:!0});if(e==="update-issue"){let o=v(n.issueId,"creator update-issue requires --issue-id.");return await Be(`/api/v1/me/library/${encodeURIComponent(r)}/issues/${encodeURIComponent(o)}`,F(n,["status","fixedVersion","note"]),n,i,"Issue updated.")}let s=v(n.reviewId,"creator moderate-review requires --review-id.");return await Be(`/api/v1/me/library/${encodeURIComponent(r)}/reviews/${encodeURIComponent(s)}`,F(n,["status","reason"]),n,i,"Review updated.")}async function eo(e,t,n){let i=e[0],r=v(e[1],`creator source ${i??""} requires a source connection id.`),s=g(t.skill)??e[2];if(i==="prepare")return await N(`/api/v1/me/source-connections/${encodeURIComponent(r)}/prepare`,A({...F(t,["skill","source","version","displayName","skillType","category","priceCents","visibility"]),source:g(t.source)??e[2]}),t,n,"Source release prepared.");if(i==="publish-request"){let o=t.approvalRequestId.length>0?t.approvalRequestId:g(t.approvalRequestId)?[String(t.approvalRequestId)]:[];return await N(`/api/v1/me/source-connections/${encodeURIComponent(r)}/publish-request`,A({skillSlug:s,approvalRequestIds:o,version:g(t.version),...F(t,["visibility","priceCents","license","discloseSource"])}),t,n,"Source publish requested.")}if(i==="release-status"){let o=new URLSearchParams;return s&&o.set("skill",s),await C(`/api/v1/me/source-connections/${encodeURIComponent(r)}/release-status${ie(o)}`,t,n,"Source release status loaded.",{authenticated:!0})}return k(`Unknown creator source command "${i??""}".`,t.json)}async function Zt(e,t,n){let i=g(t.source);if(i){let c=g(t.skill),u=await Mt(i,n.cwd);if(u)return await Wn(i,u,c,t,n);let d=t.list||t.dryRun||!c&&!t.json&&!t.all,p=await Ye(n,i,{source:i,skillSlug:c,listOnly:d},t);if(p.kind==="failure")return p.result;let y=p.inspection;if(t.list)return f(y,"Source skills loaded.",t.json,n);let m=Lt(i,y,t);if(m)return m;let h=await jt({source:i,inspection:y,requestedSkillSlug:c,mode:"install",flags:t,backend:n});if(h.kind==="failure")return h.result;if(t.dryRun)return f(Et(i,y,h.skillSlug,t),"Source install preview ready.",t.json,n);let w=Vn(t,n),P;try{P=await b(n,w,{method:"POST",headers:Yn(t,n),body:JSON.stringify(Zn({source:i},h.skillSlug,t))})}catch(T){if(T instanceof E)return Xn(i,T,t);throw T}let x=await St(n,P);return await et(n,x,h.skillSlug??a(x,"skillSlug")??i),Xe(x,Qn(t),t.json,n)}let r=v(e[0]??t.install,"install requires a skill slug or --source.");if(xl(r)){let c=await Mt(r,n.cwd);if(c)return await Wn(r,c,g(t.skill),t,n);let u=g(t.skill),d;if(t.list){let h=await Ye(n,r,{source:r,listOnly:!0},t);return h.kind==="failure"?h.result:f(h.inspection,"Source skills loaded.",t.json,n)}if(!u&&!t.json&&!t.all){let h=await Ye(n,r,{source:r,listOnly:!0},t);if(h.kind==="failure")return h.result;let w=h.inspection;d=w;let P=Lt(r,w,t);if(P)return P;let x=await jt({source:r,inspection:w,requestedSkillSlug:u,mode:"install",flags:t,backend:n});if(x.kind==="failure")return x.result;u=x.skillSlug}if(t.dryRun){if(!d){let h=await Ye(n,r,{source:r,listOnly:!0},t);if(h.kind==="failure")return h.result;d=h.inspection}return f(Et(r,d,u,t),"Source install preview ready.",t.json,n)}let p=Vn(t,n),y;try{y=await b(n,p,{method:"POST",headers:Yn(t,n),body:JSON.stringify(Zn({source:r},u,t))})}catch(h){if(h instanceof E)return Xn(r,h,t);throw h}let m=await St(n,y);return await et(n,m,u??a(m,"skillSlug")??G(r)),Xe(m,Qn(t),t.json,n)}if(g(t.scope)==="workspace"){let c=v(t.workspace,"workspace installs require --workspace <workspace-id>."),u=await b(n,`/api/v1/workspaces/${encodeURIComponent(c)}/skills`,{method:"POST",headers:_(n.apiKey),body:JSON.stringify(A({skillSlug:r,version:g(t.version),dryRun:t.dryRun}))});return f(u,t.dryRun?"Workspace install preview ready.":"Workspace deployment requested.",t.json,n)}let s=await b(n,"/api/v1/install",{method:"POST",headers:_(n.apiKey),body:JSON.stringify(A({skillSlug:r,version:g(t.version),scope:g(t.scope),agent:g(t.agent),dryRun:t.dryRun}))});if(t.dryRun)return vo(s,t,n);let o=await St(n,s),l=await to(n,o,r,t);return D(l)?l:(await et(n,l,r),Xe(l,"Skill installed.",t.json,n))}async function to(e,t,n,i){if(Array.isArray(t.materializedWrites)&&t.materializedWrites.length>0)return t;let r=no(e,t,n,i);if(r.status==="skip")return t;if(r.status==="failure")return j({status:"materialization_target_invalid",reasonCode:"materialization_target_invalid",skillSlug:r.skillSlug,nextStep:r.nextStep},r.message,i.json,"materialization_target_invalid");let s=await io(e,t,r.skillSlug,r.version),o=await Ri({backend:e,exportResult:s,flags:i,skillSlug:r.skillSlug});if(D(o))return o;let l=await ao({backend:e,skillSlug:r.skillSlug,version:r.version??a(s,"version")??"latest",scope:r.scope,agent:r.agent,skillsPath:r.skillsPath,bytes:o.bytes,files:o.files,archiveSha256:o.archiveSha256});return{...t,...ro(s),archiveSha256:o.archiveSha256,archiveHashFormat:o.archiveHashFormat,scope:r.scope,agent:r.agent.id,targetAgent:r.agent.id,materializationPlan:{scope:r.scope,agent:r.agent.id},...l}}function no(e,t,n,i){let r=S(t,"materializationPlan")??S(t,"installPlan"),s=g(i.scope)??a(t,"scope")??(r?a(r,"scope"):void 0);if(s!=="project"&&s!=="global")return{status:"skip"};let o=a(t,"skillSlug")??a(t,"slug")??n,l=g(i.agent)??a(t,"agent")??a(t,"targetAgent")??(r?a(r,"agent")??a(r,"targetAgent"):void 0)??Q(e.config?.lastSelectedAgent)??"codex",c=de(e.env,e.platform,e.cwd).find(d=>d.id===l);if(!c)return{status:"failure",skillSlug:o,message:`Unsupported agent "${l}". Run \`skills-layer agents list\` to choose a supported local install target.`,nextStep:"Run `skills-layer agents list` and retry with a supported --agent value."};let u=s==="global"?c.targets.globalSkillsPath:c.targets.projectSkillsPath;return u?{status:"ok",scope:s,agent:c,skillsPath:u,skillSlug:o,version:a(t,"version")??a(t,"currentVersion")}:{status:"failure",skillSlug:o,message:`${c.displayName} does not expose a ${s} skills path on this machine.`,nextStep:"Retry with --scope project, or choose another agent from `skills-layer agents list`."}}async function io(e,t,n,i){if(typeof t.downloadUrl=="string"&&typeof t.archiveSha256=="string")return t;let r=new URLSearchParams;return i&&r.set("version",i),await b(e,`/api/v1/me/library/${encodeURIComponent(n)}/export${ie(r)}`,{headers:U(e.apiKey,e.authBlockedMessage)})}function ro(e){return A({version:a(e,"version"),storageKey:a(e,"storageKey"),expiresAt:a(e,"expiresAt")})}async function Ri(e){let t=a(e.exportResult,"downloadUrl");if(!t)return j({status:"export_download_unavailable",reasonCode:"export_download_unavailable",skillSlug:e.skillSlug,nextStep:"Retry after the backend returns a signed bundle download URL."},`Export for ${e.skillSlug} did not include a signed download URL.`,e.flags.json,"export_download_unavailable");let n=await e.backend.fetchFn(so(e.backend.baseUrl,t));if(!n.ok)throw new E(n.status,`Unable to download exported bundle (${n.status}).`);let i=new Uint8Array(await n.arrayBuffer()),r=oo(i),s=a(e.exportResult,"archiveSha256")??n.headers.get("x-skills-layer-archive-sha256")?.trim()??void 0;return s&&r.archiveSha256!==s?j({status:"download_integrity_failed",reasonCode:"download_hash_mismatch",skillSlug:e.skillSlug,version:a(e.exportResult,"version"),expectedArchiveSha256:s,observedArchiveSha256:r.archiveSha256,archiveHashFormat:r.format,nextStep:"Retry after the catalog artifact is refreshed, or contact Skills Layer support if this repeats."},`Downloaded ${e.skillSlug} did not match the catalog artifact hash.`,e.flags.json,"download_hash_mismatch"):r.files.length===0?j({status:"download_integrity_failed",reasonCode:"download_bundle_empty",skillSlug:e.skillSlug,archiveHashFormat:r.format,nextStep:"Retry after the catalog artifact is refreshed."},`Downloaded ${e.skillSlug} did not contain any skill files.`,e.flags.json,"download_bundle_empty"):{status:"ok",bytes:i,files:r.files,archiveSha256:r.archiveSha256,archiveBytesSha256:r.archiveBytesSha256,archiveHashFormat:r.format}}function so(e,t){return/^https?:\/\//iu.test(t)?t:`${ee(e)}${t.startsWith("/")?"":"/"}${t}`}function oo(e){let t=Gt("sha256").update(e).digest("hex"),n=_n(e);return n?{archiveSha256:An(n),archiveBytesSha256:t,format:"bundle_archive",files:n}:{archiveSha256:t,archiveBytesSha256:t,format:"raw",files:[]}}async function ao(e){let t=e.backend.platform==="win32"?Se:Jt,n=t.join(e.backend.paths.bundlesDir,e.skillSlug,e.version,"bundle.zip"),i=t.join(e.skillsPath,e.skillSlug),r=t.join(i,e.version,"bundle.zip"),s=[];await qt(n,e.bytes),await Dt(i,{recursive:!0,force:!0}),await qt(r,e.bytes),s.push({path:tt(e.backend.cwd,r),bytes:e.bytes.byteLength});for(let o of e.files){let l=t.join(i,...lo(o.path)),c=o.content??"";if(await te(l,c),s.push({path:tt(e.backend.cwd,l),bytes:new TextEncoder().encode(c).length}),G(o.path).toLowerCase()==="skill.md"){let u=await sn({backend:e.backend,skillSlug:e.skillSlug,version:e.version,skillDocumentPath:l,skillDocumentContent:c});s.push(u)}}return{bundlePath:n,materializedPath:r,materializedSkillRoot:i,archiveSha256:e.archiveSha256,materializedWrites:s}}function lo(e){let n=e.replaceAll("\\","/").replace(/^\/+/u,"").trim().split("/").filter(i=>i.length>0);if(n.length===0||n.some(i=>i==="."||i===".."))throw new Error(`Unsafe bundle path "${e}".`);return n}async function Wn(e,t,n,i,r){let s=g(i.visibility)??"private";if(s!=="private")return j({status:"local_install_visibility_not_allowed",reasonCode:"local_install_visibility_not_allowed",source:e,requestedVisibility:s,nextStep:`Use \`skills-layer creator submit ${e} --visibility ${s} --dry-run\` when you want to submit a local skill with non-private visibility.`},`Local path install creates a private Cloud skill by default. Use creator submit when you want ${s} visibility.`,i.json,"local_install_visibility_not_allowed");let o=co(e,t,n);if(i.list)return f(o,"Local source skills loaded.",i.json,r);let l=Lt(e,o,i);if(l)return l;let c=await jt({source:e,inspection:o,requestedSkillSlug:n,mode:"install",flags:i,backend:r});if(c.kind==="failure")return c.result;let u=c.skillSlug??Fe(o)[0]?.value??$i(e);if(i.dryRun)return f({...Et(e,o,u,i),installKind:"local_private",publicationStatus:"none",catalogRecord:"not_created",nextStep:`Re-run without --dry-run to install ${u} locally. Use \`skills-layer creator submit ${e} --visibility private --dry-run\` when you want a private creator submission.`},"Local private install preview ready.",i.json,r);let d=await b(r,"/api/v1/me/submissions",{method:"POST",headers:{"content-type":"application/json",...U(r.apiKey,r.authBlockedMessage)},body:JSON.stringify(A({files:t.files,version:g(i.version),visibility:"private",category:g(i.category),displayName:g(i.displayName),skillType:g(i.skillType),sourceMetadata:t.sourceMetadata}))}),p=await po({backend:r,source:e,upload:t,skillSlug:a(d,"skillSlug")??u,flags:i,submitted:d});return await et(r,p,u),Xe(p,"Private Cloud skill installed.",i.json,r)}function co(e,t,n){let i=uo(t.files),r=n?i.find(s=>s.skillSlug===n)??null:i.length===1?i[0]??null:null;return{status:"ok",source:t.sourceMetadata,selectedSkill:r,results:i,issues:[],sourceInstallSupported:!0,sourceInstallMode:"local_private",publicationStatus:"none",originalSource:e}}function uo(e){return e.filter(t=>t.path.split("/").at(-1)?.toLowerCase()==="skill.md").map(t=>{let n=oe(t.path).replaceAll("\\","/"),i=n==="."?".":n,r=xi(t.content??"")??$i(i==="."?t.path:i),s=go(t.content??"");return{skillSlug:r,name:r,...s?{description:s}:{},relativeSkillRoot:i,relativeSkillFile:t.path,sourceKind:"local",discoveryRoute:"local_bundle",validation:{valid:!0,issueCount:0}}})}function xi(e){return/^---\s*[\s\S]*?\nname:\s*["']?([^"'\n]+)["']?\s*(?:\n|$)/u.exec(e)?.[1]?.trim()}function go(e){return/^---\s*[\s\S]*?\ndescription:\s*["']?([^"'\n]+)["']?\s*(?:\n|$)/u.exec(e)?.[1]?.trim()}function $i(e){return(e.replaceAll("\\","/").replace(/\/+$/u,"").split("/").filter(Boolean).at(-1)??"local-skill").toLowerCase().replace(/[^a-z0-9]+/gu,"-").replace(/^-+|-+$/gu,"")||"local-skill"}async function po(e){let t=mo(e.backend,e.flags);if(t.status==="failure")throw new Error(t.message);let n=e.upload.files.map(r=>({path:I(t.skillsPath,e.skillSlug,Hi(r.path)),content:r.content??""})),i=[];for(let r of n)if(await te(r.path,r.content),i.push({path:tt(e.backend.cwd,r.path),bytes:new TextEncoder().encode(r.content).length}),G(r.path).toLowerCase()==="skill.md"){let s=await sn({backend:e.backend,skillSlug:e.skillSlug,version:a(e.submitted,"version")??g(e.flags.version)??"private",skillDocumentPath:r.path,skillDocumentContent:r.content});i.push(s)}return{...e.submitted,status:"installed",cloudStatus:a(e.submitted,"status")??"submitted",installKind:"cloud_private",source:e.source,sourceKind:"local",skillSlug:e.skillSlug,version:a(e.submitted,"version")??g(e.flags.version)??"private",scope:t.scope,agent:t.agent,visibility:"private",publicationStatus:"private",catalogRecord:"private",privacy:{publication:"private",catalogRecord:"private",message:"This local install was saved as a private Cloud skill and did not create a public catalog record."},materializationPlan:{scope:t.scope,agent:t.agent},materializedWrites:i}}function mo(e,t){let n=g(t.scope)??"project";if(!["local","project","global"].includes(n))return{status:"failure",message:"Local private installs support --scope local, project, or global. Use `skills-layer creator submit <path> --visibility private` for private creator workflows."};let i=g(t.agent)??Q(e.config?.lastSelectedAgent)??"codex",r=de(e.env,e.platform,e.cwd).find(o=>o.id===i);if(!r)return{status:"failure",message:`Unsupported agent "${i}". Run \`skills-layer agents list\` to choose a supported local install target.`};let s=n==="global"?r.targets.globalSkillsPath:r.targets.projectSkillsPath;return s?{status:"ok",scope:n,agent:r.id,skillsPath:s}:{status:"failure",message:`${r.displayName} does not expose a ${n} skills path on this machine.`}}function tt(e,t){let n=Te(e,t);return n&&!n.startsWith("..")&&!Se.isAbsolute(n)?n.split("\\").join("/"):t}function Xt(e){return g(e.visibility)==="public"?"public":"private"}function Vn(e,t){return Xt(e)==="public"&&!t.apiKey?"/api/v1/source-imports":"/api/v1/me/source-installs"}function Yn(e,t){return{"content-type":"application/json",...Xt(e)==="private"?U(t.apiKey,t.authBlockedMessage):Ke(t.apiKey)}}function Qn(e){return Xt(e)==="public"?"Public source install planned.":"Private source skill installed."}async function jt(e){if(e.requestedSkillSlug||e.flags.json||e.flags.all)return{kind:"selected",skillSlug:e.requestedSkillSlug};let t=Fe(e.inspection);if(t.length<=1)return{kind:"selected",skillSlug:t[0]?.value};try{return{kind:"selected",skillSlug:await e.backend.promptSelect(`${e.source} exposes multiple skills. Select one to ${e.mode}:`,t)}}catch{return{kind:"failure",result:k(`Source "${e.source}" exposes multiple skills. Re-run with --list or --skill <skill-slug>. Available skills: ${t.map(n=>n.value).join(", ")}.`,e.flags.json)}}}function Fe(e){let t=[e.results,e.skills,e.discoveredSkills,S(e,"source")?.results,S(e,"inspection")?.results],n=new Set,i=[];for(let r of t)if(Array.isArray(r))for(let s of r){let o=fo(s);!o||n.has(o.value)||(n.add(o.value),i.push(o))}return i}function fo(e){if(!R(e))return;let t=a(e,"skillSlug")??a(e,"slug")??a(e,"name");if(!t)return;let n=a(e,"displayName")??a(e,"title")??a(e,"name"),i=n&&n!==t?`${t} - ${n}`:t,r=S(e,"parsedSkill"),s=S(e,"frontmatter")??(r?S(r,"frontmatter"):void 0),o=a(e,"shortDescription")??a(e,"summary")??a(e,"description")??(s?a(s,"description"):void 0)??a(e,"relativeSkillRoot")??a(e,"path")??a(e,"discoveryRoute")??a(e,"sourceKind");return o?{value:t,label:i,description:o}:{value:t,label:i}}function Zn(e,t,n){return A({...e,skillSlug:t,scope:g(n.scope),agent:g(n.agent),workspace:g(n.workspace),version:g(n.version),visibility:g(n.visibility)??"private",category:g(n.category),displayName:g(n.displayName),skillType:g(n.skillType),all:n.all,quarantine:n.quarantine,acceptCapability:n.acceptCapability})}function Et(e,t,n,i){return A({status:"dry_run",source:e,selectedSkillSlug:n,all:i.all,scope:g(i.scope)??"local",agent:g(i.agent),workspace:g(i.workspace),quarantine:i.quarantine,acceptCapability:i.acceptCapability,candidates:Fe(t).map(r=>({skillSlug:r.value,name:r.label,description:r.description})),nextStep:i.all?`Re-run without --dry-run to install every discovered skill from ${e}.`:`Re-run without --dry-run${n?"":" and add --skill <skill-slug> if needed"} to install from ${e}.`})}async function Ye(e,t,n,i){try{return{kind:"ok",inspection:await b(e,"/api/v1/source-inspect",{method:"POST",headers:_(e.apiKey),body:JSON.stringify(A(n))})}}catch(r){if(r instanceof E)return{kind:"failure",result:yo(t,r,i)};throw r}}function Lt(e,t,n){if(Fe(t).length>0)return null;let r=ho(t);return j({status:"unsupported_source_layout",source:e,reasonCode:"source_no_discoverable_skills",issues:r,nextStep:"Run with --list to inspect the source, use a subfolder containing SKILL.md, or install from a Skills Layer-compatible source layout."},wo(e,r),n.json)}function ho(e){return(Array.isArray(e.issues)?e.issues:[]).filter(R).map(n=>({...a(n,"code")?{code:a(n,"code")}:{},...a(n,"message")?{message:a(n,"message")}:{},...a(n,"path")?{path:a(n,"path")}:{}}))}function yo(e,t,n){let i=t.details??{},r=a(i,"error")??t.message;if(_i(t.status,r))return Ai(e,t,n,"inspect");if(!(t.status===404||/not found|does not contain any discoverable skills|no discoverable skills/iu.test(r)))return ot(t,n.json);let o={status:"unsupported_source_layout",source:e,reasonCode:"source_not_inspectable",backendStatus:t.status,backendMessage:r,nextStep:"Try --list, a specific subfolder containing SKILL.md, or a Skills Layer-compatible source URL."};return j(o,`Source ${e} could not be inspected as a Skills Layer-compatible source. Try --list, a specific subfolder containing SKILL.md, or a supported source layout.`,n.json)}function Xn(e,t,n){let i=t.details??{},r=a(i,"error")??t.message;if(_i(t.status,r))return Ai(e,t,n,"install");if(!(t.status===404||/not found|does not contain any discoverable skills|no discoverable skills/iu.test(r)))return ot(t,n.json);let o={status:"unsupported_source_layout",source:e,reasonCode:"source_not_installable",backendStatus:t.status,backendMessage:r,nextStep:"Try --list, a specific subfolder containing SKILL.md, or a Skills Layer-compatible source URL."};return j(o,`Source ${e} could not be installed as a Skills Layer-compatible source. Try --list, a specific subfolder containing SKILL.md, or a supported source layout.`,n.json)}function _i(e,t){return e===401||e===403||/private source|provider authorization|unauthorized|forbidden|access denied/iu.test(t)}function Ai(e,t,n,i){let r=t.details??{},s=a(r,"error")??t.message,l=`skills-layer source connection start --provider ${ko(e)} --source ${e} --visibility private --provenance-intent private_source_import`,c={status:"private_source_access_required",source:e,reasonCode:"private_source_access_required",backendStatus:t.status,backendMessage:s,nextStep:l};return j(c,`Cloud could not ${i} ${e} directly. If this is a private source, start a private source connection first:
798
- ${l}`,n.json,"private_source_access_required")}function ko(e){return/gitlab\./iu.test(e)?"gitlab":/github\./iu.test(e)||/^gh:/iu.test(e)?"github":"generic_git"}function wo(e,t){let n=[`No Skills Layer-compatible skills were found in ${e}.`];if(t.length>0){n.push("Detected issues:");for(let i of t.slice(0,5)){let r=i.code??"source-inspection";n.push(`- ${r}: ${i.message??"No details returned."}${i.path?` (${i.path})`:""}`)}}return n.push("Try --list, a subfolder containing SKILL.md, or a Skills Layer-compatible source layout."),n.join(`
799
- `)}function vo(e,t,n){if(bo(e)){let r=a(e,"reasonCode")??a(e,"reason")??"install_not_ready",s=a(e,"why")??a(e,"summary")??"The requested skill is not ready to install from this backend.";return j(e,`Install preview is not ready: ${s}`,t.json,r)}let i=Array.isArray(e.warnings)&&e.warnings.length>0;return f(e,i?"Install preview ready with warnings.":"Install preview ready.",t.json,n)}function bo(e){let t=a(e,"status")?.toLowerCase(),n=a(e,"reasonCode")?.toLowerCase();return t==="not_found"||t==="missing"||t==="blocked"||t==="not_ready"||n==="skill_not_found"||n==="not_found"}function Xe(e,t,n,i){return n?f(e,t,!0,i):{exitCode:0,stdout:So(e,t,i),stderr:""}}function Po(e,t,n){let i=W(n),r=Array.isArray(e.runs)?e.runs.filter(R):[],s=r.flatMap(c=>Array.isArray(c.results)?c.results.filter(R):[]),o=r.flatMap(c=>{let u=S(c,"tool"),d=u?S(u,"driver"):void 0;return d&&Array.isArray(d.rules)?d.rules.filter(R):[]}),l=[`${i.ok("OK")} Trust report loaded.`,"",i.section("SARIF")];if(l.push(` ${i.label("Skill")}: ${t}`),l.push(` ${i.label("Runs")}: ${r.length}`),l.push(` ${i.label("Rules")}: ${o.length}`),l.push(` ${i.label("Results")}: ${s.length}`),s.length===0)l.push(` ${i.muted("No SARIF findings found.")}`);else{l.push("",i.section("Findings"));for(let[c,u]of s.slice(0,O).entries()){let d=a(u,"ruleId")??"unknown-rule",p=S(u,"message");l.push(`${c+1}. ${d}${p?` - ${a(p,"text")??""}`:""}`)}}return l.push("",i.section("Next")),l.push(` ${i.arrow} skills-layer trust ${t} --format sarif --json`),l.join(`
800
- `)}function So(e,t,n){let i=W(n),r=[`${i.ok("OK")} ${t}`],s=a(e,"skillSlug")??a(e,"slug"),o=a(e,"version")??a(e,"currentVersion");(s||o)&&(r.push("",i.section("Skill")),s&&r.push(` ${i.label("Slug")}: ${s}`),o&&r.push(` ${i.label("Version")}: ${o}`));let l=a(e,"visibility")??a(e,"versionVisibility"),c=a(e,"publicationStatus"),u=a(e,"catalogRecord");(l||c||u)&&(r.push("",i.section("Privacy")),l&&r.push(` ${i.label("Visibility")}: ${l}`),c&&r.push(` ${i.label("Publication")}: ${c}`),u&&r.push(` ${i.label("Catalog record")}: ${u}`));let d=S(e,"materializationPlan")??S(e,"installPlan"),p=a(e,"scope")??(d?a(d,"scope"):void 0),y=a(e,"agent")??a(e,"targetAgent")??(d?a(d,"agent")??a(d,"targetAgent"):void 0),m=Array.isArray(e.materializedWrites)?e.materializedWrites.filter(R):[];if(p||y||m.length>0)if(r.push("",i.section("Local Materialization")),p&&r.push(` ${i.label("Scope")}: ${p}`),y&&r.push(` ${i.label("Agent")}: ${y}`),m.length===0)r.push(` ${i.muted("No local files were written by this command.")}`);else for(let P of m.slice(0,O)){let x=a(P,"path");x&&r.push(` ${i.arrow} ${x}`)}let h=Qi(e,i).filter(P=>!P.includes("materialized writes:"));h.length>0&&r.push("",...h);let w=tr(e);return w.length>0&&r.push("",i.section("Next"),...w.map(P=>` ${i.arrow} ${P}`)),r.join(`
801
- `)}async function Co(e,t){let n=await fe(t),i=Object.values(n.installs);return f({status:"ok",results:i},`Found ${i.length} local install records.`,e.json,t)}async function Ro(e,t,n){let i=v(e[0],"remove requires a skill slug."),r=await fe(n),s=r.installs[i];if(!s)return j({status:"not_installed",reasonCode:"local_install_not_found",skillSlug:i},`${i} is not installed locally. Run \`skills-layer installed\` or \`skills-layer sync\` to inspect local records.`,t.json,"local_install_not_found");delete r.installs[i],await Ji(n,r);let o={status:"removed",skillSlug:i,removedRecord:s};return t.json?f(o,`Removed ${i}.`,!0,n):{exitCode:0,stdout:Lo(i,n),stderr:""}}async function xo(e,t,n){let i=v(e[0],"update requires a skill slug."),r=new URLSearchParams;B(r,"pin",t.pin),t.dryRun&&r.set("dryRun","true");let o=(await fe(n)).installs[i],l;try{l=await b(n,`/api/v1/skills/${encodeURIComponent(i)}${ie(r)}`,{headers:U(n.apiKey,n.authBlockedMessage)})}catch(u){if(u instanceof E&&u.status===404&&o){let d={status:"backend_missing",reasonCode:"local_install_backend_missing",skillSlug:i,localInstall:o,installedVersion:a(o,"version")??a(o,"currentVersion"),selectedBackend:n.baseUrl,nextStep:`This skill is installed locally, but no catalog update source was found on ${n.baseUrl}. Reinstall from its source, run \`skills-layer search ${i}\`, or run \`skills-layer remove ${i}\` if you no longer need it.`};return j(d,`${i} is installed locally, but no catalog update source was found on this backend. Reinstall from its source, search for a replacement, or remove the local install.`,t.json,"local_install_backend_missing")}if(u instanceof E)return ot(u,t.json);throw u}let c=_o(i,l,o,n);return t.json?f(c,"Update check complete.",!0,n):{exitCode:0,stdout:jo(c,n),stderr:""}}async function $o(e,t){let n=await fe(t),r={status:"synced",results:await Promise.all(Object.values(n.installs).map(async s=>Ao(s,t)))};return e.json?f(r,"Local install records synced.",!0,t):{exitCode:0,stdout:Eo(r,t),stderr:""}}function _o(e,t,n,i){let r=n?a(n,"version")??a(n,"currentVersion"):void 0,s=a(t,"currentVersion")??a(t,"version"),o=n?r&&s&&r!==s?"update_available":"up_to_date":"not_installed";return A({...t,skillSlug:a(t,"skillSlug")??a(t,"slug")??e,updateStatus:o,installedVersion:r,latestAvailableVersion:s,selectedBackend:i.baseUrl,localInstall:n,nextStep:o==="not_installed"?`Run \`skills-layer install ${e}\` to install this skill locally.`:o==="update_available"?`Run \`skills-layer install ${e}\` to apply the latest available version.`:`No update is needed for ${e}.`})}async function Ao(e,t){let n=a(e,"skillSlug")??a(e,"slug");if(!n)return{...e,syncStatus:"local_only",backendStatus:"unchecked"};try{let i=await b(t,`/api/v1/skills/${encodeURIComponent(n)}`,{headers:Ke(t.apiKey)}),s=(a(i,"claimedOrigin")??a(i,"sourceKind")??a(e,"sourceKind"))==="public_source"||a(e,"sourceKind")==="external";return{...e,syncStatus:s?"source_backed":"catalog_backed",backendStatus:"found",latestAvailableVersion:a(i,"currentVersion")??a(i,"version"),catalog:Io(i)}}catch(i){return i instanceof E&&i.status===404?{...e,syncStatus:"backend_missing",backendStatus:"not_found",selectedBackend:t.baseUrl}:{...e,syncStatus:"unchecked",backendStatus:"error",backendError:ue(i)}}}function Io(e){return A({slug:a(e,"slug")??a(e,"skillSlug"),currentVersion:a(e,"currentVersion")??a(e,"version"),claimedOrigin:a(e,"claimedOrigin"),trust:a(e,"trust")??a(e,"publicationStatus")})}function jo(e,t){let n=W(t),i=a(e,"skillSlug")??a(e,"slug")??"skill",r=a(e,"updateStatus")??"checked",s=[`${n.ok("OK")} Update check complete.`,"",n.section("Update")];s.push(` ${n.label("Skill")}: ${i}`),s.push(` ${n.label("Status")}: ${r.replaceAll("_"," ")}`);let o=a(e,"installedVersion"),l=a(e,"latestAvailableVersion");o&&s.push(` ${n.label("Installed version")}: ${o}`),l&&s.push(` ${n.label("Latest available version")}: ${l}`);let c=S(e,"localInstall"),u=c?a(c,"materializedPath")??a(c,"path"):void 0,d=c?a(c,"scope"):void 0,p=c?a(c,"targetAgent")??a(c,"agent"):void 0;c&&(s.push("",n.section("Local Install")),d&&s.push(` ${n.label("Scope")}: ${d}`),p&&s.push(` ${n.label("Agent")}: ${p}`),u&&s.push(` ${n.label("Path")}: ${u}`));let y=a(e,"nextStep");return y&&s.push("",n.section("Next"),` ${n.arrow} ${y}`),s.join(`
802
- `)}function Eo(e,t){let n=W(t),i=[`${n.ok("OK")} Local install records synced.`,"",n.section(`Results (${e.results.length})`)];return e.results.length===0?(i.push(` ${n.muted("No local install records found.")}`),i.join(`
803
- `)):(e.results.slice(0,O).forEach((r,s)=>{let o=a(r,"skillSlug")??a(r,"slug")??`item-${s+1}`,l=a(r,"syncStatus")??"unchecked",c=a(r,"version")??a(r,"currentVersion");i.push(`${s+1}. ${o}`),i.push(` status: ${l.replaceAll("_"," ")}${c?`; version: ${c}`:""}`),l==="backend_missing"&&i.push(` ${n.muted("Installed locally, but missing from the selected backend catalog.")}`)}),e.results.length>O&&i.push(` ${n.muted(`... ${e.results.length-O} more`)}`),i.push("",n.section("Next")),i.push(` ${n.arrow} skills-layer installed`),i.push(` ${n.arrow} skills-layer update <skill-slug>`),i.join(`
804
- `))}function Lo(e,t){let n=W(t);return[`${n.ok("OK")} Removed ${e}.`,"",n.section("Local Install"),` ${n.label("Skill")}: ${e}`,` ${n.label("Status")}: removed locally`,"",n.section("Next"),` ${n.arrow} skills-layer installed`,` ${n.arrow} skills-layer sync`].join(`
805
- `)}function To(e,t,n){let i=W(n),r=a(t,"version")??a(t,"currentVersion"),s=a(t,"scope");return[`${i.ok("OK")} Restore record found for ${e}.`,"",i.section("Local Install"),` ${i.label("Skill")}: ${e}`,...r?[` ${i.label("Version")}: ${r}`]:[],...s?[` ${i.label("Scope")}: ${s}`]:[],"",i.section("Next"),` ${i.arrow} skills-layer installed`,` ${i.arrow} skills-layer sync`,` ${i.arrow} skills-layer update ${e}`].join(`
806
- `)}function Uo(e){let t=a(e,"status"),n=a(e,"reasonCode");return t==="invalid_transition"||t==="forbidden"||t==="not_found"||n==="invalid_transition"}function Bo(e,t){let n=a(e,"why")??a(e,"reason")??a(e,"error"),i=a(e,"currentVisibility"),r=a(e,"nextVisibility")??a(e,"visibility"),s=i||r?` Current visibility: ${i??"unknown"}; requested visibility: ${r??"unknown"}.`:"",o=a(e,"nextStep")??`Run \`skills-layer creator status ${t}\` and choose a valid visibility transition.`;return`Visibility was not changed for ${t}.${s}${n?` ${n}`:""}
807
- Next step: ${o}`}async function Mo(e,t,n){let i=await fe(n),r=e[0];if(!r){let l=Object.values(i.installs);return f({status:l.length>0?"restored":"no_op",results:l},`Restore checked ${l.length} local install record${l.length===1?"":"s"}.`,t.json,n)}let s=i.installs[r];if(!s)return j({status:"missing_record",reasonCode:"restore_record_not_found",skillSlug:r,record:null,nextAction:"installed",nextStep:`Run \`skills-layer installed\` to see local records, \`skills-layer sync\` to refresh status, or \`skills-layer search ${r}\` if you want to find a catalog/source replacement.`},`No restorable local install record was found for ${r}. Run \`skills-layer installed\`, \`skills-layer sync\`, or \`skills-layer search ${r}\` next.`,t.json,"restore_record_not_found");let o={status:"restored",skillSlug:r,record:s};return t.json?f(o,`Restore checked for ${r}.`,!0,n):{exitCode:0,stdout:To(r,s,n),stderr:""}}async function No(e,t,n){let i=v(e[0],"check requires a skill slug.");return await C(`/api/v1/skills/${encodeURIComponent(i)}/trust`,t,n,"Install trust checked.",{authenticated:!!n.apiKey})}async function Oo(e,t,n){let i=v(e[0]??t.source,"import requires a source."),r=await Mt(i,n.cwd),s=await b(n,"/api/v1/source-imports",{method:"POST",headers:_(n.apiKey),body:JSON.stringify(A({...r??{source:i},quarantine:t.quarantine,skillSlug:g(t.skill),visibility:g(t.visibility)}))});return await K(n.paths.importsPath,{version:1,lastImport:s,savedAt:n.now()}),f(s,"Source import submitted.",t.json,n)}async function Fo(e,t,n){let i=e[0];if(i==="reference"&&e[1]==="resolve"){let r=v(e[2],"source reference resolve requires a reference.");return await C(`/api/v1/source-references/resolve?reference=${encodeURIComponent(r)}`,t,n,"Source reference resolved.")}return i==="connection"?await qo(e.slice(1),t,n):k(`Unknown source command "${e.join(" ")}".`,t.json)}async function qo(e,t,n){let i=e[0];if(i==="start")return await N("/api/v1/me/source-connections",F(t,["provider","source","skill","mode","visibility","priceCents","license","provenanceIntent","discloseSource"]),t,n,"Source connection started.");let r=v(e[1],`source connection ${i??""} requires a connection id.`);return i==="status"?await C(`/api/v1/me/source-connections/${encodeURIComponent(r)}`,t,n,"Source connection loaded.",{authenticated:!0}):i==="complete"?await N(`/api/v1/me/source-connections/${encodeURIComponent(r)}/complete`,F(t,["providerOwnerId","providerRepoId","providerProjectId","providerInstallationId","commitSha"]),t,n,"Source connection completed."):i==="cancel"?await N(`/api/v1/me/source-connections/${encodeURIComponent(r)}/cancel`,{},t,n,"Source connection cancelled."):k(`Unknown source connection command "${i??""}".`,t.json)}async function Ko(e,t,n){if(e[0]!=="request")return k(`Unknown approval command "${e[0]??""}".`,t.json);let i=e[1],r=v(e[2],`approval request ${i??""} requires an approval id.`);return i==="status"?await C(`/api/v1/me/approvals/${encodeURIComponent(r)}`,t,n,"Approval status loaded.",{authenticated:!0}):i==="complete"?await N(`/api/v1/me/approvals/${encodeURIComponent(r)}/complete`,A({decision:g(t.decision),evidence:at(t.decisionEvidenceJson,"decision-evidence-json")}),t,n,"Approval completed."):k(`Unknown approval request command "${i??""}".`,t.json)}async function Go(e,t,n){let i=e[0]??"list";if(i==="list")return await C("/api/v1/me/workspaces",t,n,"Workspaces loaded.",{authenticated:!0});if(i==="create")return await N("/api/v1/workspaces",{name:e.slice(1).join(" "),kind:g(t.kind)},t,n,"Workspace created.");let r=v(e[1],`workspace ${i} requires a workspace id.`);if(i==="skills")return await C(`/api/v1/workspaces/${encodeURIComponent(r)}/skills`,t,n,"Workspace skills loaded.",{authenticated:!0});if(i==="deploy"){let s=v(e[2],"workspace deploy requires a skill slug.");return await N(`/api/v1/workspaces/${encodeURIComponent(r)}/skills`,{skillSlug:s,dryRun:t.dryRun},t,n,"Workspace deployment requested.")}if(i==="remove"){let s=v(e[2],"workspace remove requires a skill slug.");return await rt(`/api/v1/workspaces/${encodeURIComponent(r)}/skills/${encodeURIComponent(s)}`,{method:"DELETE",headers:U(n.apiKey,n.authBlockedMessage)},t,n,"Workspace skill removed.")}if(i==="guide"){let s=v(e[2],"workspace guide requires a skill slug.");try{return await C(`/api/v1/workspaces/${encodeURIComponent(r)}/skills/${encodeURIComponent(s)}/install-guide`,t,n,"Workspace install guide loaded.",{authenticated:!0})}catch(o){if(o instanceof E&&o.status===404)return Do(r,s,t);throw o}}return k(`Unknown workspace command "${i}".`,t.json)}function Do(e,t,n){let i={status:"deployment_not_found",reasonCode:"workspace_deployment_not_found",workspaceId:e,skillSlug:t,nextAction:"workspace.deploy",nextStep:`Run \`skills-layer workspace deploy ${e} ${t}\` first, then run \`skills-layer workspace guide ${e} ${t}\` after the deployment exists.`};return j(i,`Workspace deployment not found for ${t}. Run \`skills-layer workspace deploy ${e} ${t}\` first.`,n.json,"workspace_deployment_not_found")}async function Ho(e,t,n){let i=v(e[0],"buy requires a skill slug."),r=await b(n,"/api/v1/buy",{method:"POST",headers:_(n.apiKey),body:JSON.stringify({skillSlug:i,paymentMethod:g(t.paymentMethod)??"card"})});if(r.status==="already_owned")return f(r,`You already own ${i}. Run \`skills-layer install ${i}\` to install or update it.`,t.json,n);if(t.json||r.status!=="checkout_required"||typeof r.checkoutUrl!="string"||typeof r.purchaseId!="string")return f(r,`Purchase flow started for ${i}.`,t.json,n);n.emitInfo(`Opening checkout for ${i}. Complete the payment in your browser, then come back here.`),await n.openUrl(r.checkoutUrl)||n.emitInfo(`Open this checkout URL manually to continue: ${r.checkoutUrl}`),n.emitInfo("Waiting for payment confirmation...");let o=await Ca(r.purchaseId,n);return D(o)?o:o.status!=="succeeded"&&o.status!=="refund_requested"?f({...r,purchaseStatus:o.status},`Checkout is still ${o.status} for ${i}. You can rerun install after payment reconciliation completes.`,t.json,n):(n.emitInfo("Payment confirmed. Continuing with install."),await Zt([i],t,n))}async function Jo(e,t,n){let i=e[0]??"list";if(i==="list")return await C("/api/v1/purchases",t,n,"Purchases loaded.",{authenticated:!0});if(i==="spending")return await C("/api/v1/spending",t,n,"Spending loaded.",{authenticated:!0});let r=v(e[1],`purchases ${i} requires a purchase id.`);return i==="invoice"?await C(`/api/v1/purchases/${encodeURIComponent(r)}/invoice`,t,n,"Invoice loaded.",{authenticated:!0}):i==="refund-quote"?await C(`/api/v1/purchases/${encodeURIComponent(r)}/refund-quote`,t,n,"Refund quote loaded.",{authenticated:!0}):i==="refund"?await N(`/api/v1/purchases/${encodeURIComponent(r)}/refund`,F(t,["reason"]),t,n,"Refund requested."):k(`Unknown purchases command "${i}".`,t.json)}async function zo(e,t,n){let i=e[0];if(i==="add"){let r=v(e[1],"library add requires a skill slug.");return await N("/api/v1/install",{skillSlug:r},t,n,"Skill added to library.")}return k(`Unknown library command "${i}".`,t.json)}async function Wo(e,t,n){let i=v(e[0],"export requires a skill slug."),r=new URLSearchParams;B(r,"version",t.version);let s=await b(n,`/api/v1/me/library/${encodeURIComponent(i)}/export${ie(r)}`,{headers:U(n.apiKey,n.authBlockedMessage)}),o=g(t.output);if(o){let l=await Ri({backend:n,exportResult:s,flags:t,skillSlug:i});if(D(l))return l;let c=ae(n.cwd,o);await qt(c,l.bytes);let u={...s};return delete u.downloadUrl,f({...u,archiveSha256:l.archiveSha256,archiveSha256Meaning:"canonical_bundle_sha256",canonicalBundleSha256:l.archiveSha256,downloadedArchiveSha256:l.archiveBytesSha256,archiveHashFormat:l.archiveHashFormat,outputPath:c,downloaded:!0},`Exported ${i} to ${c}.`,t.json,n)}return f(s,o?`Exported ${i} to ${o}.`:"Export prepared.",t.json,n)}async function ei(e,t,n,i){let r=v(t[0],`${e==="add"?"add-review":"show-reviews"} requires a skill slug.`);return e==="show"?await C(`/api/v1/me/library/reviews?skillSlug=${encodeURIComponent(r)}`,n,i,"Reviews loaded.",{authenticated:!0}):await N(`/api/v1/me/library/${encodeURIComponent(r)}/review`,F(n,["rating","feedback"]),n,i,"Review added.")}async function ti(e,t,n,i){let r=v(t[0],`${e==="add"?"add-issue":"show-issues"} requires a skill slug.`);return e==="show"?await C(`/api/v1/me/library/${encodeURIComponent(r)}/issues`,n,i,"Issues loaded.",{authenticated:!0}):await N(`/api/v1/me/library/${encodeURIComponent(r)}/report-issue`,F(n,["issueType","message"]),n,i,"Issue reported.")}async function Vo(e,t,n){let i=e[0];if(i==="hook"){let r=e[1];return r==="install"?await Tt(t,n):r==="status"?await Xo(t,n):k(`Unknown guardian hook command "${r??""}".`,t.json)}if(i==="enable")return e[1]||t.skill?await Pt("enforce",e,t,n):await Tt(t,n);if(i==="disable")return await Pt("disabled",e,t,n);if(i==="enable-warnings-only")return await Pt("warning_only",e,t,n);if(i==="status")return await Qo(e,t,n);if(i==="exec")return await Yo(e,t,n);if(i==="check"){let r=v(e[1]??t.skill,"guardian check requires a skill slug."),s=ci(t,"check"),o=t.grantJson.map(h=>un(h,"grant-json")),l=Cl(t.cloudTrustLedger);if(l.status==="invalid")return k(l.message,t.json);let c=Ut(t.telemetryMode,l.policy==="off"?"local_only":"cloud_managed");if(c.status==="invalid")return k(c.message,t.json);let u=await Ei({skillSlug:r,version:g(t.version),action:s,flags:t,backend:n,telemetryMode:c.mode});if(u.status!=="ok")return u.result;let d=u.context.installedPath,p=g(t.version)??u.context.version,y=A({skillSlug:r,version:p,action:s,authorizationGrants:o,path:d,guardianPreference:await tn(n,r),unmanagedPolicy:u.context.unmanagedPolicy,allowUnmanagedOnce:t.allowUnmanagedOnce,telemetryMode:c.mode,localPreflight:me(u.context)}),m=await b(n,"/api/v1/guardian/enforce",{method:"POST",headers:_(n.apiKey),body:JSON.stringify(y)});return await Le(n,{skillSlug:r,version:p,action:s,decisionStatus:nt(m),reasonCode:Bt(m),telemetryMode:c.mode,path:d}),f({...m,localPreflight:me(u.context)},"Guardian check complete.",t.json,n)}if(i==="incident"){let r=v(e[1]??t.skill,"guardian incident requires a skill slug."),s=v(t.version,"guardian incident requires --version."),o=Ut(t.telemetryMode,"cloud_managed");if(o.status==="invalid")return k(o.message,t.json);let l=g(t.path)??(await Li({skillSlug:r,flags:t,backend:n})).installedPath,c=ci(t,"incident"),u=at(t.evidenceJson,"evidence-json"),d=o.mode==="cloud_managed"&&!n.apiKey?"local_only":o.mode,p=A({skillSlug:r,version:s,action:c,evidence:u,path:l,telemetryMode:d,incident:!0,reason:g(t.reason)});if(d==="local_only"){if(!l)return k("guardian incident --telemetry-mode local_only requires --path <installed-skill-path>.",t.json);let w=await oi({backend:n,skillSlug:r,version:s,installedPath:l,action:c,reason:g(t.reason)??"Guardian local-only incident"});await Le(n,{skillSlug:r,version:s,action:c,decisionStatus:"blocked",reasonCode:"incident_recorded",telemetryMode:d,path:l});let P=ai(n,r);return await te(P,JSON.stringify({request:p,response:null,localResponse:w,savedAt:n.now()},null,2)),f({status:"written",skillSlug:r,version:s,telemetryMode:d,cloudTelemetry:n.apiKey?"not_requested":"login_required",localResponse:w,incidentStatePath:P,incidentPath:w.incidentPath},n.apiKey?"Guardian incident recorded locally.":"Guardian incident recorded locally. Log in to submit Cloud incident evidence.",t.json,n)}let y=await b(n,"/api/v1/guardian/enforce",{method:"POST",headers:_(n.apiKey),body:JSON.stringify(p)}),m=l?await oi({backend:n,skillSlug:r,version:s,installedPath:l,action:c,reason:g(t.reason)??"Guardian Cloud-managed incident"}):null;await Ne(n.paths.incidentsDir,{recursive:!0});let h=ai(n,r);return await te(h,JSON.stringify({request:p,response:y,localResponse:m,savedAt:n.now()},null,2)),await Le(n,{skillSlug:r,version:s,action:c,decisionStatus:nt(y),reasonCode:Bt(y),telemetryMode:o.mode,path:l}),f({...y,telemetryMode:o.mode,localResponse:m,incidentPath:h},"Guardian incident recorded.",t.json,n)}return k(`Unknown guardian command "${i??""}".`,t.json)}async function Yo(e,t,n){let i=g(t.skill),r=v(i??e[1],"guardian exec requires a skill slug."),s=i?e.slice(1):e.slice(2);if(s.length===0)return k("guardian exec requires a command after --.",t.json);let o=Ut(t.telemetryMode,"cloud_managed");if(o.status==="invalid")return k(o.message,t.json);let l=aa(t,s),c=await Ei({skillSlug:r,version:g(t.version),action:l,flags:t,backend:n,telemetryMode:o.mode});if(c.status!=="ok")return c.result;let u=c.context.installedPath,d=g(t.version)??c.context.version,p=A({skillSlug:r,version:d,action:l,authorizationGrants:t.grantJson.map(P=>un(P,"grant-json")),path:u,guardianPreference:await tn(n,r),telemetryMode:o.mode,localPreflight:me(c.context)}),y=await b(n,"/api/v1/guardian/enforce",{method:"POST",headers:_(n.apiKey),body:JSON.stringify(p)}),m=nt(y),h=Bt(y);if(await Le(n,{skillSlug:r,version:d,action:l,decisionStatus:m,reasonCode:h,telemetryMode:o.mode,path:u}),!la(y))return j({status:"blocked",reasonCode:h,skillSlug:r,guardian:y,localPreflight:me(c.context),command:{executable:G(s[0]??""),executed:!1}},"Guardian blocked guarded execution.",t.json,h);if(t.dryRun)return f({status:"allowed",skillSlug:r,guardian:y,localPreflight:me(c.context),command:{executable:G(s[0]??""),executed:!1,dryRun:!0}},"Guardian guarded execution allowed.",t.json,n);let w=await ca(s,n);return{exitCode:w.exitCode,stdout:t.json?JSON.stringify({status:w.exitCode===0?"executed":"command_failed",summary:"Guardian guarded execution complete.",why:null,nextAction:null,nextStep:null,data:{skillSlug:r,guardian:y,localPreflight:me(c.context),command:w},warnings:[],links:[],reasonCode:w.exitCode===0?null:"command_failed",handoff:null},null,2):ua(w),stderr:w.stderr}}async function Pt(e,t,n,i){let r=v(t[1]??n.skill,`guardian ${t[0]??"mode"} requires a skill slug.`),s=await b(i,"/api/v1/guardian/mode",{method:"POST",headers:_(i.apiKey),body:JSON.stringify({skillSlug:r,requestedPreference:e,source:"public-cli"})});return s.preferenceAccepted===!0&&await da(i,r,s),f(s,s.preferenceAccepted===!0?"Guardian mode updated.":"Guardian mode resolved by policy.",n.json,i)}async function Qo(e,t,n){let i=g(t.skill)??g(e[1]),r=await Ii(n,i),s=await qe(n),o=i?await ga(n,i):void 0;return f(A({status:"ok",skillSlug:a(r,"skillSlug")??i,policy:r,localPreference:o,hook:s,nextAction:a(r,"nextAction"),nextStep:a(r,"nextStep")}),"Guardian status loaded.",t.json,n)}async function Ii(e,t){let n=t?await tn(e,t):void 0;return await b(e,"/api/v1/guardian/status",{method:"POST",headers:_(e.apiKey),body:JSON.stringify(A({skillSlug:t,requestedPreference:n,source:"public-cli"}))})}async function Zo(e){if(!e.apiKey)return{status:"unknown",policySource:"cloud",reasonCode:"login_required",nextAction:"skills-layer login",nextStep:"Sign in to read the Cloud Guardian policy that applies to your account."};try{return await Ii(e)}catch(t){return{status:"unavailable",policySource:"cloud",reasonCode:"guardian_policy_status_unavailable",message:ue(t),nextAction:"skills-layer guardian status",nextStep:"Retry Guardian status after backend connectivity or authentication is healthy."}}}async function Tt(e,t){let n=g(e.agent)??"codex",i=Ui(e.scope);if(i.status==="invalid")return k(i.message,e.json);let r=de(t.env,t.platform,t.cwd).find(p=>p.id===n);if(!r)return k(`Unsupported Guardian agent "${n}". Run skills-layer agents list to see supported agents.`,e.json);let s=pa(r,i.scope,t);if(!s)return k(`Guardian ${i.scope} hooks are not available for ${r.displayName}.`,e.json);await ma(s,t);let o=Ni(t,i.scope),l=li(Te(t.cwd,s.hookPath)),c=li(Te(t.cwd,s.configPath)),d=[...(await Oi(o)).hooks.filter(p=>a(p,"agent")!==r.id||a(p,"scope")!==i.scope),{hookId:se,hookName:Z,agent:r.id,agentName:r.displayName,scope:i.scope,hookPath:l.startsWith("..")?s.hookPath:l,configPath:c.startsWith("..")?s.configPath:c,enforcementLayer:s.enforcementLayer,strictPreActionBlocking:s.strictPreActionBlocking,enabledAt:t.now()}];return await K(o,{version:1,hooks:d}),f({status:"enabled",hookId:se,hookName:Z,agent:r.id,agentName:r.displayName,scope:i.scope,hookPath:s.hookPath,configPath:s.configPath,enforcementLayer:s.enforcementLayer,strictPreActionBlocking:s.strictPreActionBlocking,agentCommandMatrix:wt({purpose:"materialize_skill",command:"skills-layer install <skill-slug>",jsonCommand:"skills-layer install <skill-slug> --json"}),nextStep:"Guardian is installed into the selected host configuration. Local hooks call `skills-layer guardian check`; shell agents can route risky commands through `skills-layer guardian exec`; MCP-capable agents can call `guardian.check` or `guardian.enforce` before risky tool use.",warnings:s.enforcementLayer==="native_hook_candidate"?["This host does not expose the same stable native hook contract as Codex or Claude Code yet; Skills Layer records the guardrail config for host integration."]:[]},"Guardian hook enabled.",e.json,t)}async function Xo(e,t){let n=g(e.scope),i=n?Ui(n):null;if(i?.status==="invalid")return k(i.message,e.json);let r=await qe(t,i?.status==="valid"?i.scope:void 0);return f(r,"Guardian status loaded.",e.json,t)}async function qe(e,t){let n=t?[t]:["project","global"],i=[];for(let l of n){let c=Ni(e,l),u=await Oi(c);for(let d of u.hooks){let p=a(d,"hookPath"),y=p?si(e,l,p):null,m=a(d,"configPath"),h=m?si(e,l,m):null,w=y?await ge(y):!1,P=h?await ge(h):null,x=w?P===!1?"active_missing_config":"active":"stale_missing_hook";i.push({hookId:a(d,"hookId")??se,hookName:a(d,"hookName")??Z,...d,scope:a(d,"scope")??l,hookPath:y??p??null,configPath:h??m??null,active:w,configActive:P,hookState:x})}}let r=i.filter(l=>l.active===!0).length,s=i.filter(l=>l.active===!1).length,o=r>0?0:s;return{status:"ok",enforcementLayer:r>0?"native_hook":"not_installed",strictPreActionBlocking:i.some(l=>l.strictPreActionBlocking===!0),activeHookCount:r,missingHookCount:o,staleHookCount:s,hooks:i,setup:await nn(e),warnings:s>0?r>0?["One or more stale Guardian hook records were found, but an active Skills Layer Security Hook is installed."]:["One or more configured Guardian hooks are missing from disk. Run skills-layer guardian hook install --agent <agent> again to repair them."]:[]}}async function ji(e,t){if(e.json){let u=await z(t.paths.mcpConfigPath);return f({setup:await nn(t),mcp:{status:u?"mcp_configured":"mcp_not_configured",configured:!!u,clientId:u?a(u,"clientId")??"codex":void 0,clientIds:u&&Array.isArray(u.clientIds)?u.clientIds:void 0,mcpUrl:u?a(u,"mcpUrl"):void 0,readiness:u?{status:"configured_needs_agent_reload",verifyCommand:`skills-layer mcp verify --client ${a(u,"clientId")??"codex"}`,nextStep:"Open a fresh agent session if Skills Layer tools are not visible yet."}:void 0,nextCommand:u?"skills-layer mcp verify":"skills-layer mcp setup"},guardian:await qe(t)},"Setup status loaded.",!0,t)}if(!t.stdoutIsTty)return f({status:"setup_needs_terminal",mcp:{nextCommand:"skills-layer mcp setup"},security:{nextCommand:"skills-layer guardian hook install --agent codex --scope project"}},"Setup needs an interactive terminal. Run `skills-layer setup`, or use `skills-layer mcp setup` and `skills-layer guardian hook install --agent codex --scope project`.",!1,t);let n=await t.promptSelect("Set up Skills Layer on this machine?",[{value:"mcp",label:"Setup Skills-Layer MCP",description:"Configure Skills Layer MCP for AI tools"},{value:"security",label:"Setup Skills-Layer Security Guardian",description:"Install Guardian hooks for this workspace"},{value:"both",label:"Setup both - MCP & Security Guardian",description:"Connect supported AI tools and install Guardian hooks"},{value:"not_now",label:"Remind me Later",description:"Skip setup for now; you can run skills-layer setup later"}]);if(n==="not_now"){let u={version:1,setupChoice:"not_now",mcpChoice:"not_now",mcpPromptedAt:t.now(),guardianHookChoice:"not_now",guardianHookPromptedAt:t.now(),remindAfter:na(t.now(),7)};return await ri(t,u),f({status:"setup_skipped",mcp:{status:"not_configured",nextCommand:"skills-layer mcp setup"},security:{status:"not_configured",nextCommand:"skills-layer guardian hook install --agent codex --scope project"}},"Skills Layer setup skipped for now. Run `skills-layer setup` when you want MCP and Security hooks on this machine.",!1,t)}if(n!=="both"&&n!=="mcp"&&n!=="security")return k(`Unknown setup option "${n}".`,e.json);let i=n==="both"||n==="mcp",r=n==="both"||n==="security",s={status:"setup_complete",setupChoice:n},o={version:1,setupChoice:n,mcpChoice:i?"configured":"not_requested",mcpPromptedAt:t.now(),guardianHookChoice:r?g(e.scope)??"project":"not_requested",guardianHookPromptedAt:t.now()};if(i)if(!t.apiKey)s.mcp={status:"login_required",configured:!1,nextCommand:"skills-layer login"},o.mcpChoice="login_required";else{let u=await Qt(e,t);if(D(u))return u;s.mcp=u}if(r){let u={...e,json:!0,scope:g(e.scope)??"project",agent:g(e.agent)??"codex"},d=await Tt(u,t);if(d.exitCode!==0)return d;s.security=ba(d.stdout)??{status:"enabled",agent:g(u.agent),scope:g(u.scope)}}await ri(t,o);let c=(R(s.mcp)?a(s.mcp,"status"):void 0)==="login_required"?"Skills Layer Security setup complete. MCP setup needs login; run `skills-layer login`, then `skills-layer setup`.":"Skills Layer setup complete. Open a fresh agent session if MCP tools are not visible yet.";return f(s,c,e.json,t)}async function ea(e,t){let n=await qe(t),i=await nn(t),r=ce(n,"activeHookCount")??0;if(t.stdoutIsTty&&r===0&&!i)return await ji(e,t);let s=r>0?"Guardian host hooks are already configured. Run `skills-layer guardian hook status` to inspect them.":"Guardian is enabled for Skills Layer runtime checks. Run `skills-layer setup` when you want MCP and Security hooks on this machine.";return{exitCode:0,stdout:`${Ee}
808
-
809
- ${s}`,stderr:""}}function ta(e,t){let n=ce(e,"activeHookCount")??0,i=ce(e,"missingHookCount")??0,r=a(t,"status")??"unknown",s=a(t,"effectiveMode"),o=a(t,"adminPolicy"),l=a(t,"nextAction"),c=a(t,"nextStep");return n>0&&i===0?{id:"guardian-local-hook",title:"Guardian local hook",status:"pass",summary:`Guardian native hook active count: ${n}.`,enforcementLayer:a(e,"enforcementLayer")??"native_hook",strictPreActionBlocking:e.strictPreActionBlocking===!0,policyStatus:r,adminPolicy:o,effectiveMode:s,policyNextAction:l,policyNextStep:c,recommendedCommand:"skills-layer guardian hook status"}:{id:"guardian-local-hook",title:"Guardian local hook",status:"warn",summary:`Guardian native hook setup needs attention. Active hooks: ${n}; missing hooks: ${i}.`,enforcementLayer:a(e,"enforcementLayer")??"not_installed",strictPreActionBlocking:e.strictPreActionBlocking===!0,policyStatus:r,adminPolicy:o,effectiveMode:s,policyNextAction:l,policyNextStep:c,recommendedCommand:"skills-layer guardian hook install --agent codex --scope project",nextStep:"Install a Guardian host hook for automatic checks, or route risky shell actions through `skills-layer guardian exec` for strict pre-execution blocking."}}function na(e,t){let n=new Date(e);return Number.isNaN(n.getTime())?e:(n.setUTCDate(n.getUTCDate()+t),n.toISOString())}async function Ei(e){let t=Ti(g(e.flags.unmanagedPolicy)??e.backend.env.SKILLS_LAYER_UNMANAGED_SKILL_POLICY);if(t.status==="invalid")return{status:"invalid",result:k(t.message,e.flags.json)};let n=await Li({skillSlug:e.skillSlug,flags:e.flags,backend:e.backend,unmanagedPolicy:t.policy});if(n.unmanaged&&n.unmanagedPolicy==="block")return Qe({...e,context:n,reasonCode:"unmanaged_skill_blocked",message:"Guardian blocked unmanaged local skill execution.",why:"The skill path is not backed by a public install index or lockfile entry and unmanaged policy is block.",nextStep:"Install the skill with `skills-layer install <path>` or choose --unmanaged-policy warn/allow for a one-off diagnostic check."});if(!n.installedPath)return{status:"ok",context:n};if(await wa(n.installedPath))return Qe({...e,context:n,reasonCode:"skill_disabled",message:"Guardian blocked the action because this local skill is disabled.",why:"A local Guardian incident marker is present for this skill.",nextAction:"guardian.incident.review",nextStep:"Review the local incident report before running this skill again."});if(n.unmanaged)return{status:"ok",context:n};let i=await sa(e.skillSlug,n.installedPath);if(n.identityAssessment=i,i.reattestationRequired===!0)return Qe({...e,context:n,reasonCode:a(i,"reasonCode")??"skill_identity_mismatch",message:"Guardian blocked the action because the installed skill identity changed.",why:"The visible SKILL.md identity no longer matches the installed skill record.",nextStep:"Reinstall or re-attest the skill before running it again."});let r=await oa(e.skillSlug,n.installedPath);return n.driftAssessment=r,r.reattestationRequired===!0?Qe({...e,context:n,reasonCode:a(r,"reasonCode")??"installed_artifact_changed",message:"Guardian blocked the action because local runtime metadata detected installed artifact drift.",why:"The installed SKILL.md hash no longer matches the materialized runtime metadata.",nextStep:"Reinstall or re-attest the skill before running it again."}):{status:"ok",context:n}}async function Qe(e){return await Le(e.backend,{skillSlug:e.skillSlug,version:e.version??e.context.version,action:e.action,decisionStatus:"blocked",reasonCode:e.reasonCode,telemetryMode:e.telemetryMode,path:e.context.installedPath}),{status:"blocked",result:j({status:"blocked",skillSlug:e.skillSlug,version:e.version??e.context.version,reasonCode:e.reasonCode,localPreflight:me(e.context),unmanaged:e.context.unmanaged,unmanagedPolicy:e.context.unmanagedPolicy,allowUnmanagedOnce:e.context.allowUnmanagedOnce,why:e.why,nextAction:e.nextAction,nextStep:e.nextStep},e.message,e.flags.json,e.reasonCode)}}async function Li(e){let t=Ti(g(e.flags.unmanagedPolicy)),n=e.unmanagedPolicy??(t.status==="valid"?t.policy:"warn"),i=g(e.flags.path),r=await ia(e.skillSlug,e.backend),s=i?ae(e.backend.cwd,i):r?.installedPath;return{source:i?"explicit_path":r?.source??"install_index",installedPath:s,version:g(e.flags.version)??r?.version,record:r?.record,unmanaged:!!(i&&!r),unmanagedPolicy:n,allowUnmanagedOnce:e.flags.allowUnmanagedOnce}}async function ia(e,t){let i=(await fe(t)).installs[e];if(i)return{source:"install_index",installedPath:ni(i,t),version:a(i,"version"),record:i};for(let r of ra(t)){let s=await z(r);if(!R(s)||!R(s.installs))continue;let o=s.installs[e];if(R(o))return{source:"lockfile",installedPath:ni(o,t),version:a(o,"version"),record:o}}return null}function ra(e){return Array.from(new Set([I(e.cwd,"skills-layer-lock.json"),I(e.paths.stateDir,"skills-layer-lock.json")]))}function ni(e,t){let n=a(e,"canonicalPath")??a(e,"materializedPath")??a(e,"bundlePath")??a(e,"path");if(n){let o=ae(t.cwd,n);return G(o).toLowerCase()==="skill.md"?oe(o):o}let r=(Array.isArray(e.materializedWrites)?e.materializedWrites.filter(R):[]).find(o=>{let l=a(o,"path");return l?.toLowerCase().endsWith("/skill.md")||l?.toLowerCase()==="skill.md"}),s=r?a(r,"path"):void 0;return s?oe(ae(t.cwd,s)):void 0}async function sa(e,t){let n=I(t,"SKILL.md");if(!await ge(n))return{status:"not_checked",reasonCode:"skill_document_unavailable",expectedSkillSlug:e,reattestationRequired:!1};try{let i=xi(await Oe(n,"utf8"));return i?i!==e?{status:"mismatch",reasonCode:"skill_identity_mismatch",expectedSkillSlug:e,observedSkillName:i,skillDocumentPath:n,reattestationRequired:!0}:{status:"matched",expectedSkillSlug:e,observedSkillName:i,skillDocumentPath:n,reattestationRequired:!1}:{status:"not_checked",reasonCode:"skill_identity_metadata_unavailable",expectedSkillSlug:e,skillDocumentPath:n,reattestationRequired:!1}}catch(i){return{status:"invalid",reasonCode:"skill_identity_unreadable",expectedSkillSlug:e,skillDocumentPath:n,message:ue(i),reattestationRequired:!0}}}async function oa(e,t){let n=I(t,".skills-layer-runtime.json"),i=await z(n),r=i?S(i,"materialization"):void 0,s=r?a(r,"skillDocumentSha256"):void 0;if(!i||!s)return{status:"not_checked",reasonCode:"runtime_metadata_unavailable",skillSlug:e,reattestationRequired:!1};let o=I(t,"SKILL.md");if(!await ge(o))return{status:"changed",reasonCode:"installed_artifact_changed",skillSlug:e,expectedSkillDocumentSha256:s,reattestationRequired:!0};let l=Ki(await Oe(o,"utf8")),c=l===s;return{status:c?"unchanged":"changed",reasonCode:c?"installed_artifact_matches":"installed_artifact_changed",skillSlug:e,expectedSkillDocumentSha256:s,observedSkillDocumentSha256:l,reattestationRequired:!c}}function me(e){return A({source:e.source,installedPath:e.installedPath,version:e.version,unmanaged:e.unmanaged,unmanagedPolicy:e.unmanagedPolicy,allowUnmanagedOnce:e.allowUnmanagedOnce,identityAssessment:e.identityAssessment,driftAssessment:e.driftAssessment})}function Ti(e){if(e===void 0||e.trim()==="")return{status:"valid",policy:"warn"};let t=e.trim().toLowerCase();return t==="allow"||t==="warn"||t==="block"?{status:"valid",policy:t}:{status:"invalid",message:"guardian check --unmanaged-policy must be one of: allow, warn, block."}}function Ut(e,t){let n=g(e)??t;return n==="cloud_managed"||n==="local_only"?{status:"valid",mode:n}:{status:"invalid",message:"guardian --telemetry-mode must be one of: cloud_managed, local_only."}}function aa(e,t){let n=at(e.actionJson,"action-json");return n&&typeof n=="object"&&!Array.isArray(n)?n:{type:"shell_command",command:G(t[0]??"command")}}function la(e){let t=S(e,"enforcement");return typeof t?.canExecute=="boolean"?t.canExecute:nt(e)!=="blocked"}async function ca(e,t){let[n,...i]=e;return await new Promise((r,s)=>{let o=fi(n,i,{cwd:t.cwd,env:{...process.env,...t.env},stdio:["ignore","pipe","pipe"]}),l="",c="";o.stdout?.setEncoding("utf8"),o.stderr?.setEncoding("utf8"),o.stdout?.on("data",u=>{l=ii(`${l}${u}`)}),o.stderr?.on("data",u=>{c=ii(`${c}${u}`)}),o.on("error",s),o.on("close",u=>{r({executable:G(n),argsCount:i.length,exitCode:typeof u=="number"?u:1,stdout:l,stderr:c})})})}function ii(e){return e.length>2e4?`${e.slice(0,2e4)}
810
- [output truncated]`:e}function ua(e){let t=[e.exitCode===0?"OK Guardian guarded execution complete.":"Guardian guarded execution finished with a command error.","","Command",` executable: ${e.executable}`,` args count: ${e.argsCount}`,` exit code: ${e.exitCode}`];return e.stdout&&t.push("","Stdout",e.stdout),e.stderr&&t.push("","Stderr",e.stderr),t.join(`
811
- `)}function Ui(e){let t=g(e)??"project";return t==="project"||t==="global"?{status:"valid",scope:t}:{status:"invalid",message:"guardian hooks --scope must be one of: project, global."}}function Bi(e){return I(e.paths.stateDir,"guardian-modes.json")}function Mi(e){return I(e.paths.stateDir,"setup-state.json")}async function en(e){let t=await z(Bi(e));return{version:1,skills:R(t?.skills)?t.skills:{}}}async function da(e,t,n){let i=await en(e);await K(Bi(e),{version:1,skills:{...i.skills,[t]:{requestedPreference:a(n,"requestedPreference")??"enforce",effectiveMode:a(n,"effectiveMode")??"enforce",reasonCode:a(n,"reasonCode"),auditId:a(n,"auditId"),updatedAt:e.now()}}})}async function tn(e,t){let i=(await en(e)).skills[t];return i?a(i,"requestedPreference"):void 0}async function ga(e,t){return(await en(e)).skills[t]}async function nn(e){let t=await z(Mi(e));return R(t)?{version:1,setupChoice:a(t,"setupChoice"),mcpChoice:a(t,"mcpChoice"),mcpPromptedAt:a(t,"mcpPromptedAt"),guardianHookChoice:a(t,"guardianHookChoice"),guardianHookPromptedAt:a(t,"guardianHookPromptedAt"),remindAfter:a(t,"remindAfter")}:null}async function ri(e,t){await K(Mi(e),t)}function pa(e,t,n){let i=t==="global"?e.targets.globalRoot:e.targets.projectRoot;return i?e.id==="codex"?{agent:e.id,agentName:e.displayName,scope:t,hookId:se,hookName:Z,configPath:I(i,"hooks.json"),hookPath:I(i,"hooks","skills-layer-guardian-hook.mjs"),enforcementLayer:"native_hook",strictPreActionBlocking:!0}:e.id==="claude-code"?{agent:e.id,agentName:e.displayName,scope:t,hookId:se,hookName:Z,configPath:I(i,"settings.json"),hookPath:I(i,"hooks","skills-layer-guardian-hook.mjs"),enforcementLayer:"native_hook",strictPreActionBlocking:!0}:e.id==="cline"?{agent:e.id,agentName:e.displayName,scope:t,hookId:se,hookName:Z,configPath:I(i,"guardian-hooks.json"),hookPath:I(i,"hooks","skills-layer-guardian-hook.mjs"),enforcementLayer:"native_hook_candidate",strictPreActionBlocking:!1}:null:null}async function ma(e,t){if(await te(e.hookPath,ka(e.agentName)),await yi(e.hookPath,448).catch(()=>{}),e.agent==="codex"){await K(e.configPath,fa(e.hookPath));return}if(e.agent==="claude-code"){await K(e.configPath,ha(e.hookPath));return}e.agent==="cline"&&await K(e.configPath,ya(e,t))}function Ni(e,t){return t==="global"?I(e.paths.stateDir,"guardian-hooks.json"):I(e.cwd,".skills-layer","guardian-hooks.json")}async function Oi(e){let t=await z(e);return{version:1,hooks:Array.isArray(t?.hooks)?t.hooks.filter(R):[]}}function si(e,t,n){return Se.isAbsolute(n)||n.startsWith("/")?n:wi(t==="global"?e.paths.stateDir:e.cwd,n)}function fa(e){return{hooks:{PreToolUse:[{name:Z,id:se,matcher:"Bash|Shell|Read|Write|Edit|apply_patch|mcp__.*",hooks:[{name:Z,type:"command",command:`node ${rn(e)}`}]}]}}}function ha(e){return{hooks:{PreToolUse:[{name:Z,id:se,matcher:"Bash|Read|Write|Edit|MultiEdit|NotebookEdit|WebFetch|WebSearch",hooks:[{name:Z,type:"command",command:`node ${rn(e)}`}]}]}}}function ya(e,t){return{version:1,hookId:se,hookName:Z,agent:e.agent,agentName:e.agentName,scope:e.scope,enforcementLayer:e.enforcementLayer,strictPreActionBlocking:e.strictPreActionBlocking,installedAt:t.now(),hooks:[{name:Z,id:se,event:"PreToolUse",command:`node ${rn(e.hookPath)}`,status:"candidate"}]}}function ka(e){return`#!/usr/bin/env node
853
+ skills-layer api-key revoke --key-id <key-id>`,t.json);let s=String(r),o=await b(n,`/api/v1/me/api-keys/${encodeURIComponent(s)}/revoke`,{method:"POST",headers:M(n.apiKey,n.authBlockedMessage)});return f(o,"API key revoked.",t.json,n)}return k(`Unknown api-key command "${i}".`,t.json)}async function $s(e,t,n){let i=e[0]??"status";if(i==="setup"||i==="repair"){let r=await Qt(t,n);return H(r)?r:f({...r},`MCP configuration written for ${r.clientId}. Open a fresh agent session to load Skills Layer tools, then run \`skills-layer mcp verify --client ${r.clientId}\` if they are not visible.`,t.json,n)}if(i==="status"||i==="verify"){let r=await V(n.paths.mcpConfigPath);if(!r)return f({status:"mcp_not_configured",configured:!1,nextCommand:"skills-layer mcp setup"},"MCP is not configured on this machine.",t.json,n);let s=g(t.client)??g(t.agent)??l(r,"clientId")??"codex",o=l(r,"baseUrl")??n.baseUrl,a=await Sn({baseUrl:o,mcpUrl:l(r,"mcpUrl")??`${o}/mcp`,bearerTokenEnvVar:"SKILLS_LAYER_MCP_TOKEN",clientId:s,environment:l(r,"environment")??Pe(o),now:n.now(),env:n.env,platform:n.platform,cwd:n.cwd,stateDir:n.paths.stateDir,mcpConfigPath:n.paths.mcpConfigPath,nodePath:process.execPath,mcpConfig:r});if(i==="verify"&&a.configured){let c=await xn({nodePath:process.execPath,bridgePath:a.bridge.path}),u={...a,verified:c.status==="ok",liveProbe:c};return c.status!=="ok"?I(u,`MCP config exists for ${a.clientId}, but live bridge verification failed: ${c.message}`,t.json,c.reasonCode??void 0):f(u,`MCP verified for ${a.clientId}. ${c.message} Open a fresh agent session or restart the agent if tools are not visible yet.`,t.json,n)}return f(a,a.configured?`MCP configuration is present for ${a.clientId}. Open a fresh agent session if tools are not visible, or run \`skills-layer mcp verify --client ${a.clientId}\` for a live check.`:`MCP needs repair for ${a.clientId}. Run \`${a.nextCommand}\`.`,t.json,n)}if(i==="disconnect"||i==="logout"){let r=g(t.client)??g(t.agent)??"codex",s=await V(n.paths.mcpConfigPath),o=je({baseUrl:n.baseUrl,mcpUrl:`${n.baseUrl}/mcp`,bearerTokenEnvVar:"SKILLS_LAYER_MCP_TOKEN",clientId:r,environment:Pe(n.baseUrl),now:n.now(),env:n.env,platform:n.platform,cwd:n.cwd,stateDir:n.paths.stateDir,mcpConfigPath:n.paths.mcpConfigPath,nodePath:process.execPath}),a=o.targets.find(c=>c.agentId===r);return await As(s,n),await a?.disconnect?.(),await _n(o.bridgePath),await jn(o.brokerPath,o.brokerSocketPath),await Ht(n.paths.mcpConfigPath,{force:!0}),f({status:"mcp_disconnected",configured:!1,clientId:r},"MCP disconnected on this machine.",t.json,n)}return k(`Unknown mcp command "${i}". Use setup, status, verify, repair, or disconnect.`,t.json)}async function Qt(e,t){let n=g(e.environment)??Pe(t.baseUrl),i=["mcp:use","catalog:read","library:read","guardian:check","guardian:incident","creator:read"],r=`${t.baseUrl}/mcp`,s=je({baseUrl:t.baseUrl,mcpUrl:r,bearerTokenEnvVar:"SKILLS_LAYER_MCP_TOKEN",clientId:"codex",environment:n,now:t.now(),env:t.env,platform:t.platform,cwd:t.cwd,stateDir:t.paths.stateDir,mcpConfigPath:t.paths.mcpConfigPath,nodePath:process.execPath}),o=await _s(e,t,s),a=o.clientIds[0]??"codex",c=je({baseUrl:t.baseUrl,mcpUrl:r,bearerTokenEnvVar:"SKILLS_LAYER_MCP_TOKEN",clientId:a,environment:n,now:t.now(),env:t.env,platform:t.platform,cwd:t.cwd,stateDir:t.paths.stateDir,mcpConfigPath:t.paths.mcpConfigPath,nodePath:process.execPath}),u={},d=null;for(let m of o.clientIds){let h=await b(t,"/api/v1/me/mcp-tokens",{method:"POST",headers:_(t.apiKey),body:JSON.stringify({clientId:m,environment:n,scopes:i})}),w=l(h,"apiKey");if(!w)return k("MCP setup did not receive a token from the backend.",e.json);let P=await js(t,{token:w,clientId:m,environment:n});u[m]={clientId:m,environment:n,...P,tokenPrefix:l(h,"keyPrefix")??null,scopes:Array.isArray(h.scopes)?h.scopes:[],savedAt:t.now()},d??=h}let p=u[a]??{};await D(t.paths.mcpConfigPath,{version:1,baseUrl:t.baseUrl,mcpUrl:r,clientId:a,clientIds:o.clientIds,environment:n,selectionSource:o.selectionSource,detectedClientIds:o.detectedClientIds,...p,tokens:u,brokerPath:c.brokerPath,brokerSocketPath:c.brokerSocketPath,savedAt:t.now()});let y=c.targets.filter(m=>m.status==="automatic"&&o.clientIds.includes(m.agentId));for(let m of y)await m.apply?.();return{...z(d??{}),status:"mcp_configured",clientId:a,clientIds:o.clientIds,selectionSource:o.selectionSource,detectedClientIds:o.detectedClientIds,environment:n,mcpUrl:r,bridgePath:c.bridgePath,brokerPath:c.brokerPath,brokerSocketPath:c.brokerSocketPath,nodePath:c.nodePath,bridgeChecksum:c.bridgeChecksum,brokerChecksum:c.brokerChecksum,saved:!0,readiness:{status:"configured_needs_agent_reload",verifyCommand:`skills-layer mcp verify --client ${a}`,nextStep:"Open a fresh agent session so the host can load the updated MCP configuration. Run verify or repair if Skills Layer tools are still not visible."},registrations:{status:"mcp_registration_plan",automaticCount:c.automaticCount,manualCount:c.manualCount,skillsOnlyCount:c.skillsOnlyCount,unsupportedCount:c.unsupportedCount,appliedCount:y.length,appliedClients:y.map(m=>m.agentId),targets:c.targets.map(m=>({agentId:m.agentId,displayName:m.displayName,tier:m.tier,status:m.status,transport:m.transport,configPath:m.configPath,bridgePath:m.bridgePath,restartRequired:m.restartRequired,reason:m.reason,instructions:m.instructions}))}}}async function _s(e,t,n){let i=g(e.client)??g(e.agent),r=n.targets.filter(c=>c.status==="automatic").map(c=>c.agentId);if(i)return{clientIds:[i],detectedClientIds:[],selectionSource:"explicit"};if(e.all)return{clientIds:r,detectedClientIds:r,selectionSource:"all"};let s=await fn({env:t.env,platform:t.platform,cwd:t.cwd,pathExists:ge}),o=new Set(r),a=s.map(c=>c.id).filter(c=>o.has(c));return a.length>0?{clientIds:a,detectedClientIds:a,selectionSource:"detected"}:{clientIds:["codex"],detectedClientIds:[],selectionSource:"fallback"}}async function js(e,t){if(!e.credentialStore)return{token:t.token,credentialStorage:"local_file_locked",tokenStorage:"local_file_locked"};let n=Es({baseUrl:e.baseUrl,userId:e.config?.userId,email:e.config?.email,clientId:t.clientId,environment:t.environment});try{return await e.credentialStore.set(Ie,n,t.token),{tokenRef:n,credentialStorage:"macos_keychain",credentialService:Ie,tokenStorage:"macos_keychain"}}catch{return{token:t.token,credentialStorage:"local_file_locked",tokenStorage:"local_file_locked"}}}async function As(e,t){if(!e||!t.credentialStore)return;let n=Is(e,Ie);for(let i of n)await t.credentialStore.delete(i.service,i.tokenRef)}function Is(e,t){let n=new Map;Wn(e,t,n);let i=e.tokens;if(R(i))for(let r of Object.values(i))R(r)&&Wn(r,t,n);return[...n.values()]}function Wn(e,t,n){let i=l(e,"tokenRef");if(!i||l(e,"credentialStorage")!=="macos_keychain")return;let r=l(e,"credentialService")??t;n.set(`${r}:${i}`,{service:r,tokenRef:i})}function Es(e){let t=[e.baseUrl,e.userId??e.email??"unknown-user",e.clientId,e.environment,"mcpToken"].join(`
854
+ `);return`skills-layer-cli:mcp-token:${Dt("sha256").update(t).digest("base64url").slice(0,32)}`}async function It(e,t){if(e.noMcp)return{data:{status:"mcp_skipped",configured:!1,nextCommand:"skills-layer mcp setup"},message:"MCP setup skipped. Run `skills-layer mcp setup` later when you want AI-tool access."};let n=await V(t.paths.mcpConfigPath),i=n?l(n,"baseUrl"):void 0,r=n?l(n,"clientId")??"codex":"codex";if(!e.withMcp&&i===t.baseUrl&&r)return{data:{status:"mcp_already_configured",configured:!0,clientId:r,mcpUrl:n?l(n,"mcpUrl")??`${t.baseUrl}/mcp`:`${t.baseUrl}/mcp`},message:"MCP is already configured for this machine."};if(!e.withMcp&&!e.json){let a=await V(t.paths.mcpPreferencePath),c=a?l(a,"baseUrl"):void 0,u=a?l(a,"clientId")??"codex":void 0;if((a?l(a,"choice"):void 0)==="not_now"&&c===t.baseUrl&&u==="codex")return{data:{status:"mcp_skipped_previously",configured:!1,nextCommand:"skills-layer mcp setup"},message:"MCP setup was skipped previously. Run `skills-layer mcp setup` when you want AI-tool access."}}let s=e.withMcp===!0;if(!s&&!e.json)try{let a=await t.promptSelect("Set up Skills Layer MCP for your AI tools on this machine?",[{value:"yes",label:"Yes, set up MCP",description:"Mint a scoped token and write local MCP configuration"},{value:"no",label:"Not now",description:"You can run skills-layer mcp setup later"}]);if(s=a==="yes",a==="no")return await D(t.paths.mcpPreferencePath,{version:1,choice:"not_now",baseUrl:t.baseUrl,clientId:"codex",savedAt:t.now()}),{data:{status:"mcp_skipped",configured:!1,nextCommand:"skills-layer mcp setup"},message:"MCP setup skipped. Run `skills-layer mcp setup` later when you want AI-tool access."}}catch{return{}}if(!s)return{};let o=await Qt(e,t);return H(o)?o:{data:o,message:"MCP configuration written for this machine. Open a fresh agent session so your AI tools can load it."}}async function Ls(e,t,n){let i=e.join(" ").trim()||g(t.search)||"",r=new URLSearchParams;i&&r.set("query",i),N(r,"agent",t.agent),N(r,"capability",t.capability),N(r,"trust",t.trust),N(r,"runtime-risk",t.runtimeRisk),N(r,"security-capability",t.securityCapability);let s=await b(n,`/api/v1/search${se(r)}`);if(t.install!==void 0){let o=g(t.install);if(!o){if(t.json)return k("search --install requires an explicit skill slug in the public CLI package.",!0);let c=Fe(s);if(c.length===0)return k("Search results do not include any installable skills. Run search again with a broader query.",!1);if(c.length===1)o=c[0].value;else try{o=await n.promptSelect("Select a search result to install:",c)}catch{return k("No search result was selected for install.",!1)}}let a=Al(s);return a.includes(o)?await Xt([o],t,n):k(a.length===0?`Search results do not include "${o}". Run search again with a matching query first.`:`Search results do not include "${o}". Run search again with a matching query or choose one of: ${a.join(", ")}.`,t.json)}return f(s,"Search complete.",t.json,n)}async function Ts(e,t,n){let i=new URLSearchParams;return N(i,"limit",t.limit),N(i,"search",t.search),N(i,"sort",t.sort),await C(`/api/v1/${e}${se(i)}`,t,n,`${ct(e)} skills loaded.`)}async function Us(e,t,n){let i=e.join(" ").trim();if(!i)return k("recommend requires a task.",t.json);let r=new URLSearchParams({task:i});return N(r,"limit",t.limit),await C(`/api/v1/recommend?${r.toString()}`,t,n,"Recommendations loaded.")}async function Bs(e,t,n){if(e.length<2)return k("compare requires two or more skill slugs.",t.json);let i=new URLSearchParams({slugs:e.join(",")}),r=await b(n,`/api/v1/skills/compare?${i.toString()}`);return t.json?f(r,"Comparison loaded.",!0,n):{exitCode:0,stdout:za(r,"Comparison loaded.",Y(n),t.verbose),stderr:""}}async function Ms(e,t,n){let i=v(e[0],"show requires a skill slug.");return await C(`/api/v1/skills/${encodeURIComponent(i)}`,t,n,"Skill loaded.")}async function Ns(e,t,n){let i=v(e[0],"trust requires a skill slug."),r=new URLSearchParams;N(r,"format",t.format),N(r,"version",t.version);let s=await b(n,`/api/v1/skills/${encodeURIComponent(i)}/trust${se(r)}`);return g(t.format)?.toLowerCase()==="sarif"&&!t.json?{exitCode:0,stdout:_o(s,i,n),stderr:""}:f(s,"Trust report loaded.",t.json,n)}async function Os(e,t,n){let i=We(e[0],e[1]);if(i)return Vn(i,[e[0],e[1]].filter(Boolean).join(" "),t,n);let r=e[0];if(!r)return{exitCode:0,stdout:Ee,stderr:""};if(r==="full")return{exitCode:0,stdout:Ee,stderr:""};if(r==="topic"){let s=We(e[1]);if(s)return Vn(s,e[1]??"overview",t,n);let o=new URLSearchParams;return e[1]&&o.set("topic",e[1]),await C(`/api/v1/help${se(o)}`,t,n,"Help topic loaded.")}if(r==="standards")return await C("/api/v1/standards",t,n,"Marketplace standards loaded.");if(r==="marketplace-status"){let s=await b(n,"/api/v1/marketplace/status");return t.json?f(s,"Marketplace status loaded.",!0,n):f(Xa(s),"Marketplace status loaded.",!1,n)}if(r==="capabilities"){let s=await b(n,"/api/v1/capabilities");return f(tl(s),"Edition capabilities loaded.",t.json,n)}if(r==="schema-plan")return k("help schema-plan is not included in the public npm CLI.",t.json);if(r==="optimize-tokens"){let s=v(t.text,"help optimize-tokens requires --text."),o=nl(t.maxCharacters,t.json);if(H(o))return o;let a=await b(n,"/api/v1/optimize-tokens",{method:"POST",headers:_(n.apiKey),body:JSON.stringify({text:s,...o?{maxCharacters:o}:{}})});return f(a,"Token optimization complete.",t.json,n)}return k(`Unknown help command "${r}".`,t.json)}function Vn(e,t,n,i){return n.json?f({status:"ok",topic:t,content:e},"Help topic loaded.",!0,i):{exitCode:0,stdout:e,stderr:""}}async function Fs(e,t,n){let i=v(e[0]??t.path,"validate requires a file or directory."),s={files:await ot(W(n.cwd,i)),sourceIntakeContext:g(t.sourceIntakeContext),publicationStatus:g(t.publicationStatus),dependencyAuditStatus:g(t.dependencyAuditStatus),category:g(t.category),discloseSource:!!t.discloseSource,allowFindingsFeatured:!!t.allowFindingsFeatured},o=await b(n,"/api/v1/validation/preview",{method:"POST",headers:_(n.apiKey),body:JSON.stringify(j(s))});return t.json?f(o,"Validation complete.",!0,n):{exitCode:0,stdout:il(o,i,n),stderr:""}}async function qs(e,t,n){let i=v(e[0]??t.path,"preview-trigger requires a file or directory."),r=await ot(W(n.cwd,i)),s=await b(n,"/api/v1/validation/trigger-preview",{method:"POST",headers:_(n.apiKey),body:JSON.stringify({files:r,shouldTriggerPrompts:t.shouldTrigger,shouldNotTriggerPrompts:t.shouldNotTrigger,paraphrasePrompts:t.paraphrase})});return t.json?f(s,"Trigger preview complete.",!0,n):{exitCode:0,stdout:rl(s,i,n),stderr:""}}async function Ks(e,t,n){let i=e[0];if(i==="init")return await Gs(e.slice(1),t,n);if(i==="rules")return await C("/api/v1/creator/rules",t,n,"Creator rules loaded.");if(i==="submissions")return await C("/api/v1/me/submissions",t,n,"Submissions loaded.",{authenticated:!0});if(i==="status"){let r=v(e[1],"creator status requires a skill slug.");try{return await C(`/api/v1/me/submissions/${encodeURIComponent(r)}`,t,n,"Submission status loaded.",{authenticated:!0})}catch(s){if(s instanceof E&&s.status===404)return zs(r,t);throw s}}if(i==="charge-status"){let r=v(e[1],"creator charge-status requires a charge id.");return await C(`/api/v1/me/private-skill-charges/${encodeURIComponent(r)}`,t,n,"Charge status loaded.",{authenticated:!0})}if(i==="submit")return await Yn(e.slice(1),t,n,!1);if(i==="submit-version")return await Yn(e.slice(1),t,n,!0);if(i==="check-slug"){let r=v(e[1],"creator check-slug requires a slug.");return await Js(r,t,n)}if(i==="rename"){let r=v(e[1],"creator rename requires the current slug."),s=v(e[2],"creator rename requires the new slug.");return await Be(`/api/v1/me/submissions/${encodeURIComponent(r)}/slug`,{nextSkillSlug:s},t,n,"Skill renamed.")}if(i==="pricing")return await Ys(e,t,n);if(i==="update-listing"){let r=v(e[1],"creator update-listing requires a skill slug.");return await Zs(r,t,n)}if(i==="visibility"){let r=v(e[1],"creator visibility requires a skill slug."),s=await b(n,`/api/v1/me/submissions/${encodeURIComponent(r)}/visibility`,{method:"PATCH",headers:_(n.apiKey),body:JSON.stringify(j({visibility:g(t.visibility)??e[2],dryRun:t.dryRun}))});return qo(s)?I(s,Ko(s,r),t.json,l(s,"reasonCode")??l(s,"status")):f(s,t.dryRun?"Visibility preview loaded.":"Visibility updated.",t.json,n)}if(i==="security-report"){let r=v(e[1],"creator security-report requires a skill slug."),s=new URLSearchParams;N(s,"format",t.format),N(s,"version",t.version),N(s,"versionId",t.versionId);let o=await b(n,`/api/v1/me/submissions/${encodeURIComponent(r)}/trust${se(s)}`,{headers:M(n.apiKey,n.authBlockedMessage)});return t.json||t.verbose?f(o,"Creator security report loaded.",t.json,n):{exitCode:0,stdout:wl(o,r,n),stderr:""}}if(i==="rescan-security"){let r=v(e[1],"creator rescan-security requires a skill slug."),s=await b(n,`/api/v1/me/submissions/${encodeURIComponent(r)}/trust/rescan`,{method:"POST",headers:_(n.apiKey),body:JSON.stringify(j(F(t,["version","versionId"])))});return t.json?f(s,"Security rescan requested.",!0,n):{exitCode:0,stdout:vl(s,r,n),stderr:""}}if(i==="provenance"){let r=v(e[1],"creator provenance requires a skill slug.");return await C(`/api/v1/me/submissions/${encodeURIComponent(r)}/provenance`,t,n,"Provenance loaded.",{authenticated:!0})}if(i==="claim"||i==="verify"||i==="dispute")return await Qs(i,e,t,n);if(i==="issues"||i==="reviews"||i==="update-issue"||i==="moderate-review")return await ro(i,e,t,n);if(i==="analytics"){let r=v(e[1],"creator analytics requires a skill slug.");return await Xs(r,t,n)}return i==="earnings"?await C("/api/v1/me/earnings",t,n,"Creator earnings loaded.",{authenticated:!0}):i==="payout-profile"?await eo(t,n):i==="payout-link"?await to(t,n):i==="payouts"?await C("/api/v1/me/payouts",t,n,"Creator payouts loaded.",{authenticated:!0}):i==="withdraw"?await q("/api/v1/me/payouts/withdrawals",F(t,["amountCents","reason"]),t,n,"Withdrawal requested."):i==="source"?await so(e.slice(1),t,n):k(`Unknown creator command "${i??""}".`,t.json)}async function Gs(e,t,n){let i=g(t.skill)??e[0]??"my-skill",r=W(n.cwd,g(t.dir)??i),s=A(r,"SKILL.md"),o;try{o=Bn(g(t.type))}catch(y){return k(ue(y),t.json)}let a=g(t.category),c=await Ds(r);if((await ge(s)||c)&&!t.confirmed)return k(`Creator init target already exists at ${r}. Re-run with --confirm only if you want to overwrite ${s}.`,t.json);await Ne(r,{recursive:!0});let d=Mn({skillSlug:i,description:g(t.description)??"Describe what this skill helps an agent do.",skillType:o,category:a});for(let y of d)await ie(A(r,y.path),y.content);let p=j({status:"created",path:s,skillSlug:i,skillType:o,category:a,fileCount:d.length});return t.json?f(p,`Created ${s}.`,!0,n):{exitCode:0,stdout:dl(p,r,s,n),stderr:""}}async function ge(e){try{return await wi(e),!0}catch{return!1}}async function Ds(e){try{return(await bi(e)).length>0}catch{return await ge(e)}}async function Yn(e,t,n,i){let r=v(e[0]??t.path,`creator ${i?"submit-version":"submit"} requires a path.`),s=await ot(W(n.cwd,r));if(!i&&!t.dryRun){let y=await Hs(s,t,n);if(y)return y}let o=j({files:s,version:g(t.version),dryRun:t.dryRun,allowFindingsFeatured:t.allowFindingsFeatured,pricing:g(t.priceCents)?{priceCents:Number(g(t.priceCents))}:void 0,...F(t,["displayName","skillType","category","visibility","source","skill"])}),a=g(t.skill)??e[1],c=i&&a?`/api/v1/me/submissions/${encodeURIComponent(a)}/versions`:"/api/v1/me/submissions",u=await b(n,c,{method:"POST",headers:_(n.apiKey),body:JSON.stringify(o)});if(t.json||u.status!=="checkout_required"||typeof u.checkoutUrl!="string"||typeof u.chargeId!="string")return f(u,i?"Version submitted.":"Submission uploaded.",t.json,n);n.emitInfo("Opening payment setup for skill submission. Complete the payment in your browser, then come back here."),await n.openUrl(u.checkoutUrl)||n.emitInfo(`Open this checkout URL manually to continue: ${u.checkoutUrl}`),n.emitInfo("Waiting for payment confirmation...");let p=await Ia(u.chargeId,n);return H(p)?p:p.status!=="submitted"?f({...u,chargeStatus:p.status},`Payment is still ${p.status}. You can rerun \`skills-layer creator charge-status ${u.chargeId}\` to continue tracking it.`,t.json,n):f(p,i?"Version submitted.":"Submission uploaded.",t.json,n)}async function Hs(e,t,n){let i=g(t.skill)??Ws(e);if(!i)return null;let r;try{r=await b(n,`/api/v1/me/creator/slug-check?slug=${encodeURIComponent(i)}`,{headers:M(n.apiKey,n.authBlockedMessage)})}catch(s){if(s instanceof E&&s.status===404)return $i(i,t);throw s}if(r.available===!1||l(r,"reasonCode")==="unavailable"||l(r,"reasonCode")==="reserved"){let s=l(r,"assignedSlug"),o=j({status:"duplicate_candidate",reasonCode:l(r,"reasonCode")??"slug_unavailable",requestedSlug:i,assignedSlug:s,nextAction:"creator.status",nextStep:`Run \`skills-layer creator status ${i}\`, \`skills-layer creator submissions\`, or submit a new version of the existing skill instead of creating a duplicate listing.`});return I(o,`A public skill slug "${i}" already exists or is not available. Run \`skills-layer creator status ${i}\`, check your creator submissions, or submit a new version instead of creating a duplicate listing.`,t.json,l(o,"reasonCode"))}return null}async function Js(e,t,n){try{return await C(`/api/v1/me/creator/slug-check?slug=${encodeURIComponent(e)}`,t,n,"Slug status loaded.",{authenticated:!0})}catch(i){if(i instanceof E&&i.status===404)return $i(e,t);throw i}}function $i(e,t){let n={status:"slug_check_unavailable",reasonCode:"slug_check_route_unavailable",requestedSlug:e,nextAction:"creator.status",nextStep:`Slug availability could not be checked on the selected backend. Run \`skills-layer creator submissions\`, \`skills-layer creator status ${e}\`, or retry after selecting a compatible Skills Layer backend.`};return I(n,`Slug availability could not be checked for ${e} on the selected backend. Run \`skills-layer creator submissions\` or retry after selecting a compatible Skills Layer backend.`,t.json,"slug_check_route_unavailable")}function zs(e,t){return I({status:"not_submitted",reasonCode:"creator_submission_not_found",skillSlug:e,nextAction:"creator.submit",nextStep:"Run `skills-layer creator submit <path> --dry-run` to validate a local skill before submitting it, or run `skills-layer creator submissions` to see your existing submissions."},`No creator submission was found for ${e}. Run \`skills-layer creator submit <path> --dry-run\` before checking status.`,t.json,"creator_submission_not_found")}function Ws(e){let t=e.find(i=>i.path.split("/").pop()?.toLowerCase()==="skill.md");if(!t)return;let n=/^---\s*\n(?<body>[\s\S]*?)\n---/u.exec(t.content??"")?.groups?.body?.split(/\r?\n/u).map(i=>i.match(/^name\s*:\s*(?<name>.+?)\s*$/u)?.groups?.name?.trim().replace(/^["']|["']$/gu,"")).find(i=>!!i);return Vs(n??K(X(t.path)))}function Vs(e){return e?.toLowerCase().replace(/[^a-z0-9]+/gu,"-").replace(/^-+|-+$/gu,"")||void 0}async function Ys(e,t,n){let i=v(e[1],"creator pricing requires a skill slug."),r=new URLSearchParams;if(N(r,"version",t.version),!t.priceCents)return await C(`/api/v1/me/submissions/${encodeURIComponent(i)}/pricing${se(r)}`,t,n,"Pricing loaded.",{authenticated:!0});let s=Number(g(t.priceCents)),o=await b(n,`/api/v1/me/submissions/${encodeURIComponent(i)}/pricing${se(r)}`,{headers:M(n.apiKey,n.authBlockedMessage)}),a=ce(o,"priceCents")??0;if(s>a){let c=j({status:"pending_approval",reasonCode:a===0?"paid_activation_requires_approval":"price_increase_requires_approval",skillSlug:i,version:l(o,"version"),currentPriceCents:a,requestedPriceCents:s,currency:l(o,"currency")??"gbp",nextStep:"Pricing changes that increase buyer-facing cost require approval. Keep the current price for now, then retry after approval is available."});return f(c,"Pricing change requires approval before it can affect buyers.",t.json,n)}return await Be(`/api/v1/me/submissions/${encodeURIComponent(i)}/pricing`,{priceCents:s,version:g(t.version)},t,n,"Pricing updated.")}async function Zs(e,t,n){try{return await Be(`/api/v1/me/submissions/${encodeURIComponent(e)}`,F(t,["displayName","summary","description","category","skillType","license","listingStatus"]),t,n,"Listing updated.")}catch(i){if(i instanceof E&&i.status===404){let r={status:"listing_not_found_or_not_editable",reasonCode:"creator_listing_not_found_or_not_owned",skillSlug:e,nextAction:"creator.submissions",nextStep:`Run \`skills-layer creator submissions\` to see editable listings, or \`skills-layer show ${e}\` to inspect the public catalog entry.`};return I(r,`No editable creator listing was found for ${e}. Run \`skills-layer creator submissions\` to see listings you can update.`,t.json,"creator_listing_not_found_or_not_owned")}throw i}}async function Qs(e,t,n,i){let r=v(t[1],`creator ${e} requires a skill slug.`);try{if(e==="claim")return await q(`/api/v1/me/skills/${encodeURIComponent(r)}/ownership/claim`,F(n,["requestedRole","message"]),n,i,"Ownership claim submitted.");if(e==="verify"){let s=v(n.claimId,"creator verify requires --claim-id.");return await q(`/api/v1/me/skills/${encodeURIComponent(r)}/ownership/verify`,{claimId:s},n,i,"Ownership claim verified.")}return await q(`/api/v1/me/skills/${encodeURIComponent(r)}/ownership/dispute`,F(n,["message"]),n,i,"Ownership dispute submitted.")}catch(s){if(s instanceof E&&s.status===404){let o={status:"ownership_action_unavailable",reasonCode:e==="claim"?"skill_not_found_or_not_claimable":"ownership_claim_not_found",skillSlug:r,requestedRole:g(n.requestedRole),nextAction:e==="claim"?"search":"creator.claim",nextStep:e==="claim"?`Run \`skills-layer search ${r}\`, \`skills-layer show ${r}\`, or submit/source-install the skill before claiming it.`:`Run \`skills-layer creator claim ${r}\` to start a new claim if the skill is claimable.`};return I(o,e==="claim"?`No claimable skill was found for ${r}. Search or show the skill first, then claim it only when it exists and is claimable.`:`No matching ownership claim was found for ${r}. Start a new claim if the skill is claimable.`,n.json,l(o,"reasonCode")??"ownership_action_unavailable")}throw s}}async function Xs(e,t,n){try{return await C(`/api/v1/me/submissions/${encodeURIComponent(e)}/analytics`,t,n,"Analytics loaded.",{authenticated:!0})}catch(i){if(i instanceof E&&i.status===404){let r={status:"no_creator_submission",reasonCode:"creator_submission_not_found",skillSlug:e,nextAction:"creator.submissions",nextStep:`Run \`skills-layer creator submissions\` to see skills you own, \`skills-layer show ${e}\` to inspect the catalog listing, or \`skills-layer creator claim ${e}\` if it is a claimable public-source skill.`};return I(r,`No creator-owned analytics submission was found for ${e}. Run \`skills-layer creator submissions\`, \`skills-layer show ${e}\`, or \`skills-layer creator claim ${e}\` if you should manage it.`,t.json,"creator_submission_not_found")}throw i}}async function eo(e,t){let n=await b(t,"/api/v1/me/payout-profile",{headers:M(t.apiKey,t.authBlockedMessage)});return f(n,"Creator payout profile loaded.",e.json,t)}async function to(e,t){let n=no(g(e.mode));if(e.mode&&n===null)return k("creator payout-link --mode must be account_onboarding|account_update|onboarding|update.",e.json);let i;try{i=await b(t,"/api/v1/me/payout-profile/link",{method:"POST",headers:_(t.apiKey),body:JSON.stringify(n?{mode:n}:{})})}catch(s){if(s instanceof E&&io(s))return I({status:"payout_setup_already_submitted",reasonCode:"payout_update_link_unavailable",nextAction:"creator.payout-profile",nextStep:"Run `skills-layer creator payout-profile` to confirm readiness, then use `skills-layer creator earnings` or `skills-layer creator withdraw --amount-cents <amount>`."},"Payout setup is already submitted for this account. Run `skills-layer creator payout-profile` to confirm readiness before requesting a withdrawal.",e.json,"payout_update_link_unavailable");throw s}let r=Ea(i);return r&&!e.json&&e.showUrl!==!0&&(t.emitInfo("Opening payout setup in your browser. Finish the flow there, then come back here."),await t.openUrl(r)||t.emitInfo(`Open this payout setup URL manually to continue: ${r}`)),f(i,"Payout setup link created.",e.json,t)}function no(e){if(!e)return null;let t=e.trim().toLowerCase();return t==="account_onboarding"||t==="onboarding"?"account_onboarding":t==="account_update"||t==="update"?"account_update":null}function io(e){let t=`${e.message} ${l(e.details??{},"error")??""}`.toLowerCase();return t.includes("account_update")&&t.includes("account_onboarding")&&t.includes("account link")}async function ro(e,t,n,i){let r=v(t[1],`creator ${e} requires a skill slug.`);if(e==="issues")return await C(`/api/v1/me/library/${encodeURIComponent(r)}/issues`,n,i,"Issues loaded.",{authenticated:!0});if(e==="reviews")return await C(`/api/v1/me/library/${encodeURIComponent(r)}/reviews`,n,i,"Reviews loaded.",{authenticated:!0});if(e==="update-issue"){let o=v(n.issueId,"creator update-issue requires --issue-id.");return await Be(`/api/v1/me/library/${encodeURIComponent(r)}/issues/${encodeURIComponent(o)}`,F(n,["status","fixedVersion","note"]),n,i,"Issue updated.")}let s=v(n.reviewId,"creator moderate-review requires --review-id.");return await Be(`/api/v1/me/library/${encodeURIComponent(r)}/reviews/${encodeURIComponent(s)}`,F(n,["status","reason"]),n,i,"Review updated.")}async function so(e,t,n){let i=e[0],r=v(e[1],`creator source ${i??""} requires a source connection id.`),s=g(t.skill)??e[2];if(i==="prepare")return await q(`/api/v1/me/source-connections/${encodeURIComponent(r)}/prepare`,j({...F(t,["skill","source","version","displayName","skillType","category","priceCents","visibility"]),source:g(t.source)??e[2]}),t,n,"Source release prepared.");if(i==="publish-request"){let o=t.approvalRequestId.length>0?t.approvalRequestId:g(t.approvalRequestId)?[String(t.approvalRequestId)]:[];return await q(`/api/v1/me/source-connections/${encodeURIComponent(r)}/publish-request`,j({skillSlug:s,approvalRequestIds:o,version:g(t.version),...F(t,["visibility","priceCents","license","discloseSource"])}),t,n,"Source publish requested.")}if(i==="release-status"){let o=new URLSearchParams;return s&&o.set("skill",s),await C(`/api/v1/me/source-connections/${encodeURIComponent(r)}/release-status${se(o)}`,t,n,"Source release status loaded.",{authenticated:!0})}return k(`Unknown creator source command "${i??""}".`,t.json)}async function Xt(e,t,n){let i=g(t.source);if(i){let c=g(t.skill),u=await Nt(i,n.cwd);if(u)return await Zn(i,u,c,t,n);let d=t.list||t.dryRun||!c&&!t.json&&!t.all,p=await Ye(n,i,{source:i,skillSlug:c,listOnly:d},t);if(p.kind==="failure")return p.result;let y=p.inspection;if(t.list)return f(y,"Source skills loaded.",t.json,n);let m=Tt(i,y,t);if(m)return m;let h=await Et({source:i,inspection:y,requestedSkillSlug:c,mode:"install",flags:t,backend:n});if(h.kind==="failure")return h.result;if(t.dryRun)return f(Lt(i,y,h.skillSlug,t),"Source install preview ready.",t.json,n);let w=Qn(t,n),P;try{P=await b(n,w,{method:"POST",headers:Xn(t,n),body:JSON.stringify(ti({source:i},h.skillSlug,t))})}catch(B){if(B instanceof E)return ni(i,B,t);throw B}let x=await Ct(n,P);return await tt(n,x,h.skillSlug??l(x,"skillSlug")??i),et(x,ei(t),t.json,n)}let r=v(e[0]??t.install,"install requires a skill slug or --source.");if(Ll(r)){let c=await Nt(r,n.cwd);if(c)return await Zn(r,c,g(t.skill),t,n);let u=g(t.skill),d;if(t.list){let h=await Ye(n,r,{source:r,listOnly:!0},t);return h.kind==="failure"?h.result:f(h.inspection,"Source skills loaded.",t.json,n)}if(!u&&!t.json&&!t.all){let h=await Ye(n,r,{source:r,listOnly:!0},t);if(h.kind==="failure")return h.result;let w=h.inspection;d=w;let P=Tt(r,w,t);if(P)return P;let x=await Et({source:r,inspection:w,requestedSkillSlug:u,mode:"install",flags:t,backend:n});if(x.kind==="failure")return x.result;u=x.skillSlug}if(t.dryRun){if(!d){let h=await Ye(n,r,{source:r,listOnly:!0},t);if(h.kind==="failure")return h.result;d=h.inspection}return f(Lt(r,d,u,t),"Source install preview ready.",t.json,n)}let p=Qn(t,n),y;try{y=await b(n,p,{method:"POST",headers:Xn(t,n),body:JSON.stringify(ti({source:r},u,t))})}catch(h){if(h instanceof E)return ni(r,h,t);throw h}let m=await Ct(n,y);return await tt(n,m,u??l(m,"skillSlug")??K(r)),et(m,ei(t),t.json,n)}if(g(t.scope)==="workspace"){let c=v(t.workspace,"workspace installs require --workspace <workspace-id>."),u=await b(n,`/api/v1/workspaces/${encodeURIComponent(c)}/skills`,{method:"POST",headers:_(n.apiKey),body:JSON.stringify(j({skillSlug:r,version:g(t.version),dryRun:t.dryRun}))});return t.dryRun?Li(u,"Workspace install preview ready.",t,n):f(u,"Workspace deployment requested.",t.json,n)}let s=await b(n,"/api/v1/install",{method:"POST",headers:_(n.apiKey),body:JSON.stringify(j({skillSlug:r,version:g(t.version),scope:g(t.scope),agent:g(t.agent),dryRun:t.dryRun}))});if(t.dryRun)return Ro(s,t,n);let o=await Ct(n,s),a=await oo(n,o,r,t);return H(a)?a:(await tt(n,a,r),et(a,"Skill installed.",t.json,n))}async function oo(e,t,n,i){if(Array.isArray(t.materializedWrites)&&t.materializedWrites.length>0)return t;let r=ao(e,t,n,i);if(r.status==="skip")return t;if(r.status==="failure")return I({status:"materialization_target_invalid",reasonCode:"materialization_target_invalid",skillSlug:r.skillSlug,nextStep:r.nextStep},r.message,i.json,"materialization_target_invalid");let s=await lo(e,t,r.skillSlug,r.version),o=await _i({backend:e,exportResult:s,flags:i,skillSlug:r.skillSlug});if(H(o))return o;let a=await po({backend:e,skillSlug:r.skillSlug,version:r.version??l(s,"version")??"latest",scope:r.scope,agent:r.agent,skillsPath:r.skillsPath,bytes:o.bytes,files:o.files,archiveSha256:o.archiveSha256});return{...t,...co(s),archiveSha256:o.archiveSha256,archiveHashFormat:o.archiveHashFormat,scope:r.scope,agent:r.agent.id,targetAgent:r.agent.id,materializationPlan:{scope:r.scope,agent:r.agent.id},...a}}function ao(e,t,n,i){let r=S(t,"materializationPlan")??S(t,"installPlan"),s=g(i.scope)??l(t,"scope")??(r?l(r,"scope"):void 0);if(s!=="project"&&s!=="global")return{status:"skip"};let o=l(t,"skillSlug")??l(t,"slug")??n,a=g(i.agent)??l(t,"agent")??l(t,"targetAgent")??(r?l(r,"agent")??l(r,"targetAgent"):void 0)??Q(e.config?.lastSelectedAgent)??"codex",c=de(e.env,e.platform,e.cwd).find(d=>d.id===a);if(!c)return{status:"failure",skillSlug:o,message:`Unsupported agent "${a}". Run \`skills-layer agents list\` to choose a supported local install target.`,nextStep:"Run `skills-layer agents list` and retry with a supported --agent value."};let u=s==="global"?c.targets.globalSkillsPath:c.targets.projectSkillsPath;return u?{status:"ok",scope:s,agent:c,skillsPath:u,skillSlug:o,version:l(t,"version")??l(t,"currentVersion")}:{status:"failure",skillSlug:o,message:`${c.displayName} does not expose a ${s} skills path on this machine.`,nextStep:"Retry with --scope project, or choose another agent from `skills-layer agents list`."}}async function lo(e,t,n,i){if(typeof t.downloadUrl=="string"&&typeof t.archiveSha256=="string")return t;let r=new URLSearchParams;return i&&r.set("version",i),await b(e,`/api/v1/me/library/${encodeURIComponent(n)}/export${se(r)}`,{headers:M(e.apiKey,e.authBlockedMessage)})}function co(e){return j({version:l(e,"version"),storageKey:l(e,"storageKey"),expiresAt:l(e,"expiresAt")})}async function _i(e){let t=l(e.exportResult,"downloadUrl");if(!t)return I({status:"export_download_unavailable",reasonCode:"export_download_unavailable",skillSlug:e.skillSlug,nextStep:"Retry after the backend returns a signed bundle download URL."},`Export for ${e.skillSlug} did not include a signed download URL.`,e.flags.json,"export_download_unavailable");let n=await e.backend.fetchFn(uo(e.backend.baseUrl,t));if(!n.ok)throw new E(n.status,`Unable to download exported bundle (${n.status}).`);let i=new Uint8Array(await n.arrayBuffer()),r=go(i),s=l(e.exportResult,"archiveSha256")??n.headers.get("x-skills-layer-archive-sha256")?.trim()??void 0;return s&&r.archiveSha256!==s?I({status:"download_integrity_failed",reasonCode:"download_hash_mismatch",skillSlug:e.skillSlug,version:l(e.exportResult,"version"),expectedArchiveSha256:s,observedArchiveSha256:r.archiveSha256,archiveHashFormat:r.format,nextStep:"Retry after the catalog artifact is refreshed, or contact Skills Layer support if this repeats."},`Downloaded ${e.skillSlug} did not match the catalog artifact hash.`,e.flags.json,"download_hash_mismatch"):r.files.length===0?I({status:"download_integrity_failed",reasonCode:"download_bundle_empty",skillSlug:e.skillSlug,archiveHashFormat:r.format,nextStep:"Retry after the catalog artifact is refreshed."},`Downloaded ${e.skillSlug} did not contain any skill files.`,e.flags.json,"download_bundle_empty"):{status:"ok",bytes:i,files:r.files,archiveSha256:r.archiveSha256,archiveBytesSha256:r.archiveBytesSha256,archiveHashFormat:r.format}}function uo(e,t){return/^https?:\/\//iu.test(t)?t:`${ne(e)}${t.startsWith("/")?"":"/"}${t}`}function go(e){let t=Dt("sha256").update(e).digest("hex"),n=An(e);return n?{archiveSha256:In(n),archiveBytesSha256:t,format:"bundle_archive",files:n}:{archiveSha256:t,archiveBytesSha256:t,format:"raw",files:[]}}async function po(e){let t=e.backend.platform==="win32"?Se:zt,n=t.join(e.backend.paths.bundlesDir,e.skillSlug,e.version,"bundle.zip"),i=t.join(e.skillsPath,e.skillSlug),r=t.join(i,e.version,"bundle.zip"),s=[];await Kt(n,e.bytes),await Ht(i,{recursive:!0,force:!0}),await Kt(r,e.bytes),s.push({path:nt(e.backend.cwd,r),bytes:e.bytes.byteLength});for(let o of e.files){let a=t.join(i,...mo(o.path)),c=o.content??"";if(await ie(a,c),s.push({path:nt(e.backend.cwd,a),bytes:new TextEncoder().encode(c).length}),K(o.path).toLowerCase()==="skill.md"){let u=await an({backend:e.backend,skillSlug:e.skillSlug,version:e.version,skillDocumentPath:a,skillDocumentContent:c});s.push(u)}}return{bundlePath:n,materializedPath:r,materializedSkillRoot:i,archiveSha256:e.archiveSha256,materializedWrites:s}}function mo(e){let n=e.replaceAll("\\","/").replace(/^\/+/u,"").trim().split("/").filter(i=>i.length>0);if(n.length===0||n.some(i=>i==="."||i===".."))throw new Error(`Unsafe bundle path "${e}".`);return n}async function Zn(e,t,n,i,r){let s=g(i.visibility)??"private";if(s!=="private")return I({status:"local_install_visibility_not_allowed",reasonCode:"local_install_visibility_not_allowed",source:e,requestedVisibility:s,nextStep:`Use \`skills-layer creator submit ${e} --visibility ${s} --dry-run\` when you want to submit a local skill with non-private visibility.`},`Local path install creates a private Cloud skill by default. Use creator submit when you want ${s} visibility.`,i.json,"local_install_visibility_not_allowed");let o=fo(e,t,n);if(i.list)return f(o,"Local source skills loaded.",i.json,r);let a=Tt(e,o,i);if(a)return a;let c=await Et({source:e,inspection:o,requestedSkillSlug:n,mode:"install",flags:i,backend:r});if(c.kind==="failure")return c.result;let u=c.skillSlug??Fe(o)[0]?.value??Ai(e);if(i.dryRun)return f({...Lt(e,o,u,i),installKind:"local_private",publicationStatus:"none",catalogRecord:"not_created",nextStep:`Re-run without --dry-run to install ${u} locally. Use \`skills-layer creator submit ${e} --visibility private --dry-run\` when you want a private creator submission.`},"Local private install preview ready.",i.json,r);let d=await b(r,"/api/v1/me/submissions",{method:"POST",headers:{"content-type":"application/json",...M(r.apiKey,r.authBlockedMessage)},body:JSON.stringify(j({files:t.files,version:g(i.version),visibility:"private",category:g(i.category),displayName:g(i.displayName),skillType:g(i.skillType),sourceMetadata:t.sourceMetadata}))}),p=await ko({backend:r,source:e,upload:t,skillSlug:l(d,"skillSlug")??u,flags:i,submitted:d});return await tt(r,p,u),et(p,"Private Cloud skill installed.",i.json,r)}function fo(e,t,n){let i=ho(t.files),r=n?i.find(s=>s.skillSlug===n)??null:i.length===1?i[0]??null:null;return{status:"ok",source:t.sourceMetadata,selectedSkill:r,results:i,issues:[],sourceInstallSupported:!0,sourceInstallMode:"local_private",publicationStatus:"none",originalSource:e}}function ho(e){return e.filter(t=>t.path.split("/").at(-1)?.toLowerCase()==="skill.md").map(t=>{let n=X(t.path).replaceAll("\\","/"),i=n==="."?".":n,r=ji(t.content??"")??Ai(i==="."?t.path:i),s=yo(t.content??"");return{skillSlug:r,name:r,...s?{description:s}:{},relativeSkillRoot:i,relativeSkillFile:t.path,sourceKind:"local",discoveryRoute:"local_bundle",validation:{valid:!0,issueCount:0}}})}function ji(e){return/^---\s*[\s\S]*?\nname:\s*["']?([^"'\n]+)["']?\s*(?:\n|$)/u.exec(e)?.[1]?.trim()}function yo(e){return/^---\s*[\s\S]*?\ndescription:\s*["']?([^"'\n]+)["']?\s*(?:\n|$)/u.exec(e)?.[1]?.trim()}function Ai(e){return(e.replaceAll("\\","/").replace(/\/+$/u,"").split("/").filter(Boolean).at(-1)??"local-skill").toLowerCase().replace(/[^a-z0-9]+/gu,"-").replace(/^-+|-+$/gu,"")||"local-skill"}async function ko(e){let t=wo(e.backend,e.flags);if(t.status==="failure")throw new Error(t.message);let n=e.upload.files.map(r=>({path:A(t.skillsPath,e.skillSlug,Vi(r.path)),content:r.content??""})),i=[];for(let r of n)if(await ie(r.path,r.content),i.push({path:nt(e.backend.cwd,r.path),bytes:new TextEncoder().encode(r.content).length}),K(r.path).toLowerCase()==="skill.md"){let s=await an({backend:e.backend,skillSlug:e.skillSlug,version:l(e.submitted,"version")??g(e.flags.version)??"private",skillDocumentPath:r.path,skillDocumentContent:r.content});i.push(s)}return{...e.submitted,status:"installed",cloudStatus:l(e.submitted,"status")??"submitted",installKind:"cloud_private",source:e.source,sourceKind:"local",skillSlug:e.skillSlug,version:l(e.submitted,"version")??g(e.flags.version)??"private",scope:t.scope,agent:t.agent,visibility:"private",publicationStatus:"private",catalogRecord:"private",privacy:{publication:"private",catalogRecord:"private",message:"This local install was saved as a private Cloud skill and did not create a public catalog record."},materializationPlan:{scope:t.scope,agent:t.agent},materializedWrites:i}}function wo(e,t){let n=g(t.scope)??"project";if(!["local","project","global"].includes(n))return{status:"failure",message:"Local private installs support --scope local, project, or global. Use `skills-layer creator submit <path> --visibility private` for private creator workflows."};let i=g(t.agent)??Q(e.config?.lastSelectedAgent)??"codex",r=de(e.env,e.platform,e.cwd).find(o=>o.id===i);if(!r)return{status:"failure",message:`Unsupported agent "${i}". Run \`skills-layer agents list\` to choose a supported local install target.`};let s=n==="global"?r.targets.globalSkillsPath:r.targets.projectSkillsPath;return s?{status:"ok",scope:n,agent:r.id,skillsPath:s}:{status:"failure",message:`${r.displayName} does not expose a ${n} skills path on this machine.`}}function nt(e,t){let n=Te(e,t);return n&&!n.startsWith("..")&&!Se.isAbsolute(n)?n.split("\\").join("/"):t}function en(e){return g(e.visibility)==="public"?"public":"private"}function Qn(e,t){return en(e)==="public"&&!t.apiKey?"/api/v1/source-imports":"/api/v1/me/source-installs"}function Xn(e,t){return{"content-type":"application/json",...en(e)==="private"?M(t.apiKey,t.authBlockedMessage):Ke(t.apiKey)}}function ei(e){return en(e)==="public"?"Public source install planned.":"Private source skill installed."}async function Et(e){if(e.requestedSkillSlug||e.flags.json||e.flags.all)return{kind:"selected",skillSlug:e.requestedSkillSlug};let t=Fe(e.inspection);if(t.length<=1)return{kind:"selected",skillSlug:t[0]?.value};try{return{kind:"selected",skillSlug:await e.backend.promptSelect(`${e.source} exposes multiple skills. Select one to ${e.mode}:`,t)}}catch{return{kind:"failure",result:k(`Source "${e.source}" exposes multiple skills. Re-run with --list or --skill <skill-slug>. Available skills: ${t.map(n=>n.value).join(", ")}.`,e.flags.json)}}}function Fe(e){let t=[e.results,e.skills,e.discoveredSkills,S(e,"source")?.results,S(e,"inspection")?.results],n=new Set,i=[];for(let r of t)if(Array.isArray(r))for(let s of r){let o=vo(s);!o||n.has(o.value)||(n.add(o.value),i.push(o))}return i}function vo(e){if(!R(e))return;let t=l(e,"skillSlug")??l(e,"slug")??l(e,"name");if(!t)return;let n=l(e,"displayName")??l(e,"title")??l(e,"name"),i=n&&n!==t?`${t} - ${n}`:t,r=S(e,"parsedSkill"),s=S(e,"frontmatter")??(r?S(r,"frontmatter"):void 0),o=l(e,"shortDescription")??l(e,"summary")??l(e,"description")??(s?l(s,"description"):void 0)??l(e,"relativeSkillRoot")??l(e,"path")??l(e,"discoveryRoute")??l(e,"sourceKind");return o?{value:t,label:i,description:o}:{value:t,label:i}}function ti(e,t,n){return j({...e,skillSlug:t,scope:g(n.scope),agent:g(n.agent),workspace:g(n.workspace),version:g(n.version),visibility:g(n.visibility)??"private",category:g(n.category),displayName:g(n.displayName),skillType:g(n.skillType),all:n.all,quarantine:n.quarantine,acceptCapability:n.acceptCapability})}function Lt(e,t,n,i){return j({status:"dry_run",source:e,selectedSkillSlug:n,all:i.all,scope:g(i.scope)??"local",agent:g(i.agent),workspace:g(i.workspace),quarantine:i.quarantine,acceptCapability:i.acceptCapability,candidates:Fe(t).map(r=>({skillSlug:r.value,name:r.label,description:r.description})),nextStep:i.all?`Re-run without --dry-run to install every discovered skill from ${e}.`:`Re-run without --dry-run${n?"":" and add --skill <skill-slug> if needed"} to install from ${e}.`})}async function Ye(e,t,n,i){try{return{kind:"ok",inspection:await b(e,"/api/v1/source-inspect",{method:"POST",headers:_(e.apiKey),body:JSON.stringify(j(n))})}}catch(r){if(r instanceof E)return{kind:"failure",result:Po(t,r,i)};throw r}}function Tt(e,t,n){if(Fe(t).length>0)return null;let r=bo(t);return I({status:"unsupported_source_layout",source:e,reasonCode:"source_no_discoverable_skills",issues:r,nextStep:"Run with --list to inspect the source, use a subfolder containing SKILL.md, or install from a Skills Layer-compatible source layout."},Co(e,r),n.json)}function bo(e){return(Array.isArray(e.issues)?e.issues:[]).filter(R).map(n=>({...l(n,"code")?{code:l(n,"code")}:{},...l(n,"message")?{message:l(n,"message")}:{},...l(n,"path")?{path:l(n,"path")}:{}}))}function Po(e,t,n){let i=t.details??{},r=l(i,"error")??t.message;if(Ii(t.status,r))return Ei(e,t,n,"inspect");if(!(t.status===404||/not found|does not contain any discoverable skills|no discoverable skills/iu.test(r)))return at(t,n.json);let o={status:"unsupported_source_layout",source:e,reasonCode:"source_not_inspectable",backendStatus:t.status,backendMessage:r,nextStep:"Try --list, a specific subfolder containing SKILL.md, or a Skills Layer-compatible source URL."};return I(o,`Source ${e} could not be inspected as a Skills Layer-compatible source. Try --list, a specific subfolder containing SKILL.md, or a supported source layout.`,n.json)}function ni(e,t,n){let i=t.details??{},r=l(i,"error")??t.message;if(Ii(t.status,r))return Ei(e,t,n,"install");if(!(t.status===404||/not found|does not contain any discoverable skills|no discoverable skills/iu.test(r)))return at(t,n.json);let o={status:"unsupported_source_layout",source:e,reasonCode:"source_not_installable",backendStatus:t.status,backendMessage:r,nextStep:"Try --list, a specific subfolder containing SKILL.md, or a Skills Layer-compatible source URL."};return I(o,`Source ${e} could not be installed as a Skills Layer-compatible source. Try --list, a specific subfolder containing SKILL.md, or a supported source layout.`,n.json)}function Ii(e,t){return e===401||e===403||/private source|provider authorization|unauthorized|forbidden|access denied/iu.test(t)}function Ei(e,t,n,i){let r=t.details??{},s=l(r,"error")??t.message,a=`skills-layer source connection start --provider ${So(e)} --source ${e} --visibility private --provenance-intent private_source_import`,c={status:"private_source_access_required",source:e,reasonCode:"private_source_access_required",backendStatus:t.status,backendMessage:s,nextStep:a};return I(c,`Cloud could not ${i} ${e} directly. If this is a private source, start a private source connection first:
855
+ ${a}`,n.json,"private_source_access_required")}function So(e){return/gitlab\./iu.test(e)?"gitlab":/github\./iu.test(e)||/^gh:/iu.test(e)?"github":"generic_git"}function Co(e,t){let n=[`No Skills Layer-compatible skills were found in ${e}.`];if(t.length>0){n.push("Detected issues:");for(let i of t.slice(0,5)){let r=i.code??"source-inspection";n.push(`- ${r}: ${i.message??"No details returned."}${i.path?` (${i.path})`:""}`)}}return n.push("Try --list, a subfolder containing SKILL.md, or a Skills Layer-compatible source layout."),n.join(`
856
+ `)}function Ro(e,t,n){if($o(e)){let r=l(e,"reasonCode")??l(e,"reason")??"install_not_ready",s=l(e,"why")??l(e,"summary")??"The requested skill is not ready to install from this backend.";return I(e,`Install preview is not ready: ${s}`,t.json,r)}let i=Array.isArray(e.warnings)&&e.warnings.length>0;return xo(e,i?"Install preview ready with warnings.":"Install preview ready.",t,n)}function xo(e,t,n,i){return n.json?f(e,t,!0,i):{exitCode:0,stdout:tn(e,t,i),stderr:""}}function Li(e,t,n,i){return n.json?f(e,t,!0,i):{exitCode:0,stdout:tn(e,t,i),stderr:""}}function $o(e){let t=l(e,"status")?.toLowerCase(),n=l(e,"reasonCode")?.toLowerCase();return t==="not_found"||t==="missing"||t==="blocked"||t==="not_ready"||n==="skill_not_found"||n==="not_found"}function et(e,t,n,i){return n?f(e,t,!0,i):{exitCode:0,stdout:tn(e,t,i),stderr:""}}function _o(e,t,n){let i=Y(n),r=Array.isArray(e.runs)?e.runs.filter(R):[],s=r.flatMap(c=>Array.isArray(c.results)?c.results.filter(R):[]),o=r.flatMap(c=>{let u=S(c,"tool"),d=u?S(u,"driver"):void 0;return d&&Array.isArray(d.rules)?d.rules.filter(R):[]}),a=[`${i.ok("OK")} Trust report loaded.`,"",i.section("SARIF")];if(a.push(` ${i.label("Skill")}: ${t}`),a.push(` ${i.label("Runs")}: ${r.length}`),a.push(` ${i.label("Rules")}: ${o.length}`),a.push(` ${i.label("Results")}: ${s.length}`),s.length===0)a.push(` ${i.muted("No SARIF findings found.")}`);else{a.push("",i.section("Findings"));for(let[c,u]of s.slice(0,U).entries()){let d=l(u,"ruleId")??"unknown-rule",p=S(u,"message");a.push(`${c+1}. ${d}${p?` - ${l(p,"text")??""}`:""}`)}}return a.push("",i.section("Next")),a.push(` ${i.arrow} skills-layer trust ${t} --format sarif --json`),a.join(`
857
+ `)}function tn(e,t,n){let i=Y(n),r=[`${i.ok("OK")} ${t}`],s=l(e,"skillSlug")??l(e,"slug"),o=l(e,"version")??l(e,"currentVersion");(s||o)&&(r.push("",i.section("Skill")),s&&r.push(` ${i.label("Slug")}: ${s}`),o&&r.push(` ${i.label("Version")}: ${o}`));let a=l(e,"visibility")??l(e,"versionVisibility"),c=l(e,"publicationStatus"),u=l(e,"catalogRecord");(a||c||u)&&(r.push("",i.section("Privacy")),a&&r.push(` ${i.label("Visibility")}: ${a}`),c&&r.push(` ${i.label("Publication")}: ${c}`),u&&r.push(` ${i.label("Catalog record")}: ${u}`));let d=S(e,"materializationPlan")??S(e,"installPlan"),p=l(e,"scope")??(d?l(d,"scope"):void 0),y=l(e,"agent")??l(e,"targetAgent")??(d?l(d,"agent")??l(d,"targetAgent"):void 0),m=Array.isArray(e.materializedWrites)?e.materializedWrites.filter(R):[];if(p||y||m.length>0)if(r.push("",i.section("Local Materialization")),p&&r.push(` ${i.label("Scope")}: ${p}`),y&&r.push(` ${i.label("Agent")}: ${y}`),m.length===0)r.push(` ${i.muted("No local files were written by this command.")}`);else for(let P of m.slice(0,U)){let x=l(P,"path");x&&r.push(` ${i.arrow} ${x}`)}let h=tr(e,i).filter(P=>!P.includes("materialized writes:"));h.length>0&&r.push("",...h);let w=or(e);return w.length>0&&r.push("",i.section("Next"),...w.map(P=>` ${i.arrow} ${P}`)),r.join(`
858
+ `)}function jo(e,t){let n=S(e,"trust"),i=S(e,"securityPosture"),r=S(e,"capabilityProfile"),s=n?.securityScore??n?.score??e.securityScore??i?.securityScore,o=L(n,"runtimeRisk")??l(e,"runtimeRisk")??L(i,"runtimeRisk")??L(r,"runtimeRisk"),a=L(n,"recommendation")??l(e,"recommendation")??L(i,"recommendation"),c=L(n,"label")??L(n,"trust")??l(e,"trustStatus")??l(e,"trust")??L(i,"label");if(s===void 0&&!o&&!a&&!c)return[];let u=[t.section("Trust")];return s!==void 0&&u.push(` ${t.label("Security score")}: ${J("securityScore",s)}`),o&&u.push(` ${t.label("Runtime risk")}: ${o}`),a&&u.push(` ${t.label("Recommendation")}: ${a}`),c&&u.push(` ${t.label("Status")}: ${c}`),u.push(` ${t.label("Source")}: skills-layer trust`),u}async function Ao(e,t){let n=await fe(t),i=Object.values(n.installs);return f({status:"ok",results:i},`Found ${i.length} local install records.`,e.json,t)}async function Io(e,t,n){let i=v(e[0],"remove requires a skill slug."),r=await fe(n),s=r.installs[i];if(!s)return I({status:"not_installed",reasonCode:"local_install_not_found",skillSlug:i},`${i} is not installed locally. Run \`skills-layer installed\` or \`skills-layer sync\` to inspect local records.`,t.json,"local_install_not_found");delete r.installs[i],await Yi(n,r);let o={status:"removed",skillSlug:i,removedRecord:s};return t.json?f(o,`Removed ${i}.`,!0,n):{exitCode:0,stdout:Oo(i,n),stderr:""}}async function Eo(e,t,n){let i=v(e[0],"update requires a skill slug."),r=new URLSearchParams;N(r,"pin",t.pin),t.dryRun&&r.set("dryRun","true");let o=(await fe(n)).installs[i],a;try{a=await b(n,`/api/v1/skills/${encodeURIComponent(i)}${se(r)}`,{headers:M(n.apiKey,n.authBlockedMessage)})}catch(u){if(u instanceof E&&u.status===404&&o){let d={status:"backend_missing",reasonCode:"local_install_backend_missing",skillSlug:i,localInstall:o,installedVersion:l(o,"version")??l(o,"currentVersion"),selectedBackend:n.baseUrl,nextStep:`This skill is installed locally, but no catalog update source was found on ${n.baseUrl}. Reinstall from its source, run \`skills-layer search ${i}\`, or run \`skills-layer remove ${i}\` if you no longer need it.`};return I(d,`${i} is installed locally, but no catalog update source was found on this backend. Reinstall from its source, search for a replacement, or remove the local install.`,t.json,"local_install_backend_missing")}if(u instanceof E)return at(u,t.json);throw u}let c=To(i,a,o,n);return t.json?f(c,"Update check complete.",!0,n):{exitCode:0,stdout:Mo(c,n),stderr:""}}async function Lo(e,t){let n=await fe(t),r={status:"synced",results:await Promise.all(Object.values(n.installs).map(async s=>Uo(s,t)))};return e.json?f(r,"Local install records synced.",!0,t):{exitCode:0,stdout:No(r,t),stderr:""}}function To(e,t,n,i){let r=n?l(n,"version")??l(n,"currentVersion"):void 0,s=l(t,"currentVersion")??l(t,"version"),o=n?r&&s&&r!==s?"update_available":"up_to_date":"not_installed";return j({...t,skillSlug:l(t,"skillSlug")??l(t,"slug")??e,updateStatus:o,installedVersion:r,latestAvailableVersion:s,selectedBackend:i.baseUrl,localInstall:n,nextStep:o==="not_installed"?`Run \`skills-layer install ${e}\` to install this skill locally.`:o==="update_available"?`Run \`skills-layer install ${e}\` to apply the latest available version.`:`No update is needed for ${e}.`})}async function Uo(e,t){let n=l(e,"skillSlug")??l(e,"slug");if(!n)return{...e,syncStatus:"local_only",backendStatus:"unchecked"};try{let i=await b(t,`/api/v1/skills/${encodeURIComponent(n)}`,{headers:Ke(t.apiKey)}),s=(l(i,"claimedOrigin")??l(i,"sourceKind")??l(e,"sourceKind"))==="public_source"||l(e,"sourceKind")==="external";return{...e,syncStatus:s?"source_backed":"catalog_backed",backendStatus:"found",latestAvailableVersion:l(i,"currentVersion")??l(i,"version"),catalog:Bo(i)}}catch(i){return i instanceof E&&i.status===404?{...e,syncStatus:"backend_missing",backendStatus:"not_found",selectedBackend:t.baseUrl}:{...e,syncStatus:"unchecked",backendStatus:"error",backendError:ue(i)}}}function Bo(e){return j({slug:l(e,"slug")??l(e,"skillSlug"),currentVersion:l(e,"currentVersion")??l(e,"version"),claimedOrigin:l(e,"claimedOrigin"),trust:l(e,"trust")??l(e,"publicationStatus")})}function Mo(e,t){let n=Y(t),i=l(e,"skillSlug")??l(e,"slug")??"skill",r=l(e,"updateStatus")??"checked",s=[`${n.ok("OK")} Update check complete.`,"",n.section("Update")];s.push(` ${n.label("Skill")}: ${i}`),s.push(` ${n.label("Status")}: ${r.replaceAll("_"," ")}`);let o=l(e,"installedVersion"),a=l(e,"latestAvailableVersion");o&&s.push(` ${n.label("Installed version")}: ${o}`),a&&s.push(` ${n.label("Latest available version")}: ${a}`);let c=S(e,"localInstall"),u=c?l(c,"materializedPath")??l(c,"path"):void 0,d=c?l(c,"scope"):void 0,p=c?l(c,"targetAgent")??l(c,"agent"):void 0;c&&(s.push("",n.section("Local Install")),d&&s.push(` ${n.label("Scope")}: ${d}`),p&&s.push(` ${n.label("Agent")}: ${p}`),u&&s.push(` ${n.label("Path")}: ${u}`));let y=l(e,"nextStep");return y&&s.push("",n.section("Next"),` ${n.arrow} ${y}`),s.join(`
859
+ `)}function No(e,t){let n=Y(t),i=[`${n.ok("OK")} Local install records synced.`,"",n.section(`Results (${e.results.length})`)];return e.results.length===0?(i.push(` ${n.muted("No local install records found.")}`),i.join(`
860
+ `)):(e.results.slice(0,U).forEach((r,s)=>{let o=l(r,"skillSlug")??l(r,"slug")??`item-${s+1}`,a=l(r,"syncStatus")??"unchecked",c=l(r,"version")??l(r,"currentVersion");i.push(`${s+1}. ${o}`),i.push(` status: ${a.replaceAll("_"," ")}${c?`; version: ${c}`:""}`),a==="backend_missing"&&i.push(` ${n.muted("Installed locally, but missing from the selected backend catalog.")}`)}),e.results.length>U&&i.push(` ${n.muted(`... ${e.results.length-U} more`)}`),i.push("",n.section("Next")),i.push(` ${n.arrow} skills-layer installed`),i.push(` ${n.arrow} skills-layer update <skill-slug>`),i.join(`
861
+ `))}function Oo(e,t){let n=Y(t);return[`${n.ok("OK")} Removed ${e}.`,"",n.section("Local Install"),` ${n.label("Skill")}: ${e}`,` ${n.label("Status")}: removed locally`,"",n.section("Next"),` ${n.arrow} skills-layer installed`,` ${n.arrow} skills-layer sync`].join(`
862
+ `)}function Fo(e,t,n){let i=Y(n),r=l(t,"version")??l(t,"currentVersion"),s=l(t,"scope");return[`${i.ok("OK")} Restore record found for ${e}.`,"",i.section("Local Install"),` ${i.label("Skill")}: ${e}`,...r?[` ${i.label("Version")}: ${r}`]:[],...s?[` ${i.label("Scope")}: ${s}`]:[],"",i.section("Next"),` ${i.arrow} skills-layer installed`,` ${i.arrow} skills-layer sync`,` ${i.arrow} skills-layer update ${e}`].join(`
863
+ `)}function qo(e){let t=l(e,"status"),n=l(e,"reasonCode");return t==="invalid_transition"||t==="forbidden"||t==="not_found"||n==="invalid_transition"}function Ko(e,t){let n=l(e,"why")??l(e,"reason")??l(e,"error"),i=l(e,"currentVisibility"),r=l(e,"nextVisibility")??l(e,"visibility"),s=i||r?` Current visibility: ${i??"unknown"}; requested visibility: ${r??"unknown"}.`:"",o=l(e,"nextStep")??`Run \`skills-layer creator status ${t}\` and choose a valid visibility transition.`;return`Visibility was not changed for ${t}.${s}${n?` ${n}`:""}
864
+ Next step: ${o}`}async function Go(e,t,n){let i=await fe(n),r=e[0];if(!r){let a=Object.values(i.installs);return f({status:a.length>0?"restored":"no_op",results:a},`Restore checked ${a.length} local install record${a.length===1?"":"s"}.`,t.json,n)}let s=i.installs[r];if(!s)return I({status:"missing_record",reasonCode:"restore_record_not_found",skillSlug:r,record:null,nextAction:"installed",nextStep:`Run \`skills-layer installed\` to see local records, \`skills-layer sync\` to refresh status, or \`skills-layer search ${r}\` if you want to find a catalog/source replacement.`},`No restorable local install record was found for ${r}. Run \`skills-layer installed\`, \`skills-layer sync\`, or \`skills-layer search ${r}\` next.`,t.json,"restore_record_not_found");let o={status:"restored",skillSlug:r,record:s};return t.json?f(o,`Restore checked for ${r}.`,!0,n):{exitCode:0,stdout:Fo(r,s,n),stderr:""}}async function Do(e,t,n){let i=v(e[0],"check requires a skill slug.");return await C(`/api/v1/skills/${encodeURIComponent(i)}/trust`,t,n,"Install trust checked.",{authenticated:!!n.apiKey})}async function Ho(e,t,n){let i=v(e[0]??t.source,"import requires a source."),r=await Nt(i,n.cwd),s=await b(n,"/api/v1/source-imports",{method:"POST",headers:_(n.apiKey),body:JSON.stringify(j({...r??{source:i},quarantine:t.quarantine,skillSlug:g(t.skill),visibility:g(t.visibility)}))});return await D(n.paths.importsPath,{version:1,lastImport:s,savedAt:n.now()}),f(s,"Source import submitted.",t.json,n)}async function Jo(e,t,n){let i=e[0];if(i==="reference"&&e[1]==="resolve"){let r=v(e[2],"source reference resolve requires a reference.");return await C(`/api/v1/source-references/resolve?reference=${encodeURIComponent(r)}`,t,n,"Source reference resolved.")}return i==="connection"?await zo(e.slice(1),t,n):k(`Unknown source command "${e.join(" ")}".`,t.json)}async function zo(e,t,n){let i=e[0];if(i==="start")return await q("/api/v1/me/source-connections",F(t,["provider","source","skill","mode","visibility","priceCents","license","provenanceIntent","discloseSource"]),t,n,"Source connection started.");let r=v(e[1],`source connection ${i??""} requires a connection id.`);return i==="status"?await C(`/api/v1/me/source-connections/${encodeURIComponent(r)}`,t,n,"Source connection loaded.",{authenticated:!0}):i==="complete"?await q(`/api/v1/me/source-connections/${encodeURIComponent(r)}/complete`,F(t,["providerOwnerId","providerRepoId","providerProjectId","providerInstallationId","commitSha"]),t,n,"Source connection completed."):i==="cancel"?await q(`/api/v1/me/source-connections/${encodeURIComponent(r)}/cancel`,{},t,n,"Source connection cancelled."):k(`Unknown source connection command "${i??""}".`,t.json)}async function Wo(e,t,n){if(e[0]!=="request")return k(`Unknown approval command "${e[0]??""}".`,t.json);let i=e[1],r=v(e[2],`approval request ${i??""} requires an approval id.`);return i==="status"?await C(`/api/v1/me/approvals/${encodeURIComponent(r)}`,t,n,"Approval status loaded.",{authenticated:!0}):i==="complete"?await q(`/api/v1/me/approvals/${encodeURIComponent(r)}/complete`,j({decision:g(t.decision),evidence:lt(t.decisionEvidenceJson,"decision-evidence-json")}),t,n,"Approval completed."):k(`Unknown approval request command "${i??""}".`,t.json)}async function Vo(e,t,n){let i=e[0]??"list";if(i==="list")return await C("/api/v1/me/workspaces",t,n,"Workspaces loaded.",{authenticated:!0});if(i==="create")return await q("/api/v1/workspaces",{name:e.slice(1).join(" "),kind:g(t.kind)},t,n,"Workspace created.");let r=v(e[1],`workspace ${i} requires a workspace id.`);if(i==="skills")return await C(`/api/v1/workspaces/${encodeURIComponent(r)}/skills`,t,n,"Workspace skills loaded.",{authenticated:!0});if(i==="deploy"){let s=v(e[2],"workspace deploy requires a skill slug."),o=await b(n,`/api/v1/workspaces/${encodeURIComponent(r)}/skills`,{method:"POST",headers:_(n.apiKey),body:JSON.stringify(j({skillSlug:s,dryRun:t.dryRun}))});return t.dryRun?Li(o,"Workspace deployment preview ready.",t,n):f(o,"Workspace deployment requested.",t.json,n)}if(i==="remove"){let s=v(e[2],"workspace remove requires a skill slug.");return await st(`/api/v1/workspaces/${encodeURIComponent(r)}/skills/${encodeURIComponent(s)}`,{method:"DELETE",headers:M(n.apiKey,n.authBlockedMessage)},t,n,"Workspace skill removed.")}if(i==="guide"){let s=v(e[2],"workspace guide requires a skill slug.");try{return await C(`/api/v1/workspaces/${encodeURIComponent(r)}/skills/${encodeURIComponent(s)}/install-guide`,t,n,"Workspace install guide loaded.",{authenticated:!0})}catch(o){if(o instanceof E&&o.status===404)return Yo(r,s,t);throw o}}return k(`Unknown workspace command "${i}".`,t.json)}function Yo(e,t,n){let i={status:"deployment_not_found",reasonCode:"workspace_deployment_not_found",workspaceId:e,skillSlug:t,nextAction:"workspace.deploy",nextStep:`Run \`skills-layer workspace deploy ${e} ${t}\` first, then run \`skills-layer workspace guide ${e} ${t}\` after the deployment exists.`};return I(i,`Workspace deployment not found for ${t}. Run \`skills-layer workspace deploy ${e} ${t}\` first.`,n.json,"workspace_deployment_not_found")}async function Zo(e,t,n){let i=v(e[0],"buy requires a skill slug."),r=await b(n,"/api/v1/buy",{method:"POST",headers:_(n.apiKey),body:JSON.stringify({skillSlug:i,paymentMethod:g(t.paymentMethod)??"card"})});if(r.status==="already_owned")return f(r,`You already own ${i}. Run \`skills-layer install ${i}\` to install or update it.`,t.json,n);if(t.json||r.status!=="checkout_required"||typeof r.checkoutUrl!="string"||typeof r.purchaseId!="string")return f(r,`Purchase flow started for ${i}.`,t.json,n);n.emitInfo(`Opening checkout for ${i}. Complete the payment in your browser, then come back here.`),await n.openUrl(r.checkoutUrl)||n.emitInfo(`Open this checkout URL manually to continue: ${r.checkoutUrl}`),n.emitInfo("Waiting for payment confirmation...");let o=await Aa(r.purchaseId,n);return H(o)?o:o.status!=="succeeded"&&o.status!=="refund_requested"?f({...r,purchaseStatus:o.status},`Checkout is still ${o.status} for ${i}. You can rerun install after payment reconciliation completes.`,t.json,n):(n.emitInfo("Payment confirmed. Continuing with install."),await Xt([i],t,n))}async function Qo(e,t,n){let i=e[0]??"list";if(i==="list")return await C("/api/v1/purchases",t,n,"Purchases loaded.",{authenticated:!0});if(i==="spending")return await C("/api/v1/spending",t,n,"Spending loaded.",{authenticated:!0});let r=v(e[1],`purchases ${i} requires a purchase id.`);return i==="invoice"?await C(`/api/v1/purchases/${encodeURIComponent(r)}/invoice`,t,n,"Invoice loaded.",{authenticated:!0}):i==="refund-quote"?await C(`/api/v1/purchases/${encodeURIComponent(r)}/refund-quote`,t,n,"Refund quote loaded.",{authenticated:!0}):i==="refund"?await q(`/api/v1/purchases/${encodeURIComponent(r)}/refund`,F(t,["reason"]),t,n,"Refund requested."):k(`Unknown purchases command "${i}".`,t.json)}async function Xo(e,t,n){let i=e[0];if(i==="add"){let r=v(e[1],"library add requires a skill slug.");return await q("/api/v1/install",{skillSlug:r},t,n,"Skill added to library.")}return k(`Unknown library command "${i}".`,t.json)}async function ea(e,t,n){let i=v(e[0],"export requires a skill slug."),r=new URLSearchParams;N(r,"version",t.version);let s=await b(n,`/api/v1/me/library/${encodeURIComponent(i)}/export${se(r)}`,{headers:M(n.apiKey,n.authBlockedMessage)}),o=g(t.output);if(o){let a=await _i({backend:n,exportResult:s,flags:t,skillSlug:i});if(H(a))return a;let c=W(n.cwd,o);await Kt(c,a.bytes);let u={...s};return delete u.downloadUrl,f({...u,archiveSha256:a.archiveSha256,archiveSha256Meaning:"canonical_bundle_sha256",canonicalBundleSha256:a.archiveSha256,downloadedArchiveSha256:a.archiveBytesSha256,archiveHashFormat:a.archiveHashFormat,outputPath:c,downloaded:!0},`Exported ${i} to ${c}.`,t.json,n)}return f(s,o?`Exported ${i} to ${o}.`:"Export prepared.",t.json,n)}async function ii(e,t,n,i){let r=v(t[0],`${e==="add"?"add-review":"show-reviews"} requires a skill slug.`);return e==="show"?await C(`/api/v1/me/library/reviews?skillSlug=${encodeURIComponent(r)}`,n,i,"Reviews loaded.",{authenticated:!0}):await q(`/api/v1/me/library/${encodeURIComponent(r)}/review`,F(n,["rating","feedback"]),n,i,"Review added.")}async function ri(e,t,n,i){let r=v(t[0],`${e==="add"?"add-issue":"show-issues"} requires a skill slug.`);return e==="show"?await C(`/api/v1/me/library/${encodeURIComponent(r)}/issues`,n,i,"Issues loaded.",{authenticated:!0}):await q(`/api/v1/me/library/${encodeURIComponent(r)}/report-issue`,F(n,["issueType","message"]),n,i,"Issue reported.")}async function ta(e,t,n){let i=e[0];if(i==="hook"){let r=e[1];return r==="install"?await Ut(t,n):r==="status"?await sa(t,n):k(`Unknown guardian hook command "${r??""}".`,t.json)}if(i==="enable")return e[1]||t.skill?await St("enforce",e,t,n):await Ut(t,n);if(i==="disable")return await St("disabled",e,t,n);if(i==="enable-warnings-only")return await St("warning_only",e,t,n);if(i==="status")return await ia(e,t,n);if(i==="exec")return await na(e,t,n);if(i==="check"){let r=v(e[1]??t.skill,"guardian check requires a skill slug."),s=gi(t,"check"),o=t.grantJson.map(h=>gn(h,"grant-json")),a=Il(t.cloudTrustLedger);if(a.status==="invalid")return k(a.message,t.json);let c=Bt(t.telemetryMode,a.policy==="off"?"local_only":"cloud_managed");if(c.status==="invalid")return k(c.message,t.json);let u=await Bi({skillSlug:r,version:g(t.version),action:s,flags:t,backend:n,telemetryMode:c.mode});if(u.status!=="ok")return u.result;let d=u.context.installedPath,p=g(t.version)??u.context.version,y=j({skillSlug:r,version:p,action:s,authorizationGrants:o,path:d,guardianPreference:await rn(n,r),unmanagedPolicy:u.context.unmanagedPolicy,allowUnmanagedOnce:t.allowUnmanagedOnce,telemetryMode:c.mode,localPreflight:me(u.context)}),m=await b(n,"/api/v1/guardian/enforce",{method:"POST",headers:_(n.apiKey),body:JSON.stringify(y)});return await Le(n,{skillSlug:r,version:p,action:s,decisionStatus:it(m),reasonCode:Mt(m),telemetryMode:c.mode,path:d}),f({...m,localPreflight:me(u.context)},"Guardian check complete.",t.json,n)}if(i==="incident"){let r=v(e[1]??t.skill,"guardian incident requires a skill slug."),s=v(t.version,"guardian incident requires --version."),o=Bt(t.telemetryMode,"cloud_managed");if(o.status==="invalid")return k(o.message,t.json);let a=g(t.path)??(await Mi({skillSlug:r,flags:t,backend:n})).installedPath,c=gi(t,"incident"),u=lt(t.evidenceJson,"evidence-json"),d=o.mode==="cloud_managed"&&!n.apiKey?"local_only":o.mode,p=j({skillSlug:r,version:s,action:c,evidence:u,path:a,telemetryMode:d,incident:!0,reason:g(t.reason)});if(d==="local_only"){if(!a)return k("guardian incident --telemetry-mode local_only requires --path <installed-skill-path>.",t.json);let w=await ci({backend:n,skillSlug:r,version:s,installedPath:a,action:c,reason:g(t.reason)??"Guardian local-only incident"});await Le(n,{skillSlug:r,version:s,action:c,decisionStatus:"blocked",reasonCode:"incident_recorded",telemetryMode:d,path:a});let P=ui(n,r);return await ie(P,JSON.stringify({request:p,response:null,localResponse:w,savedAt:n.now()},null,2)),f({status:"written",skillSlug:r,version:s,telemetryMode:d,cloudTelemetry:n.apiKey?"not_requested":"login_required",localResponse:w,incidentStatePath:P,incidentPath:w.incidentPath},n.apiKey?"Guardian incident recorded locally.":"Guardian incident recorded locally. Log in to submit Cloud incident evidence.",t.json,n)}let y=await b(n,"/api/v1/guardian/enforce",{method:"POST",headers:_(n.apiKey),body:JSON.stringify(p)}),m=a?await ci({backend:n,skillSlug:r,version:s,installedPath:a,action:c,reason:g(t.reason)??"Guardian Cloud-managed incident"}):null;await Ne(n.paths.incidentsDir,{recursive:!0});let h=ui(n,r);return await ie(h,JSON.stringify({request:p,response:y,localResponse:m,savedAt:n.now()},null,2)),await Le(n,{skillSlug:r,version:s,action:c,decisionStatus:it(y),reasonCode:Mt(y),telemetryMode:o.mode,path:a}),f({...y,telemetryMode:o.mode,localResponse:m,incidentPath:h},"Guardian incident recorded.",t.json,n)}return k(`Unknown guardian command "${i??""}".`,t.json)}async function na(e,t,n){let i=g(t.skill),r=v(i??e[1],"guardian exec requires a skill slug."),s=i?e.slice(1):e.slice(2);if(s.length===0)return k("guardian exec requires a command after --.",t.json);let o=Bt(t.telemetryMode,"cloud_managed");if(o.status==="invalid")return k(o.message,t.json);let a=pa(t,s),c=await Bi({skillSlug:r,version:g(t.version),action:a,flags:t,backend:n,telemetryMode:o.mode});if(c.status!=="ok")return c.result;let u=c.context.installedPath,d=g(t.version)??c.context.version,p=j({skillSlug:r,version:d,action:a,authorizationGrants:t.grantJson.map(P=>gn(P,"grant-json")),path:u,guardianPreference:await rn(n,r),telemetryMode:o.mode,localPreflight:me(c.context)}),y=await b(n,"/api/v1/guardian/enforce",{method:"POST",headers:_(n.apiKey),body:JSON.stringify(p)}),m=it(y),h=Mt(y);if(await Le(n,{skillSlug:r,version:d,action:a,decisionStatus:m,reasonCode:h,telemetryMode:o.mode,path:u}),!ma(y))return I({status:"blocked",reasonCode:h,skillSlug:r,guardian:y,localPreflight:me(c.context),command:{executable:K(s[0]??""),executed:!1}},"Guardian blocked guarded execution.",t.json,h);if(t.dryRun)return f({status:"allowed",skillSlug:r,guardian:y,localPreflight:me(c.context),command:{executable:K(s[0]??""),executed:!1,dryRun:!0}},"Guardian guarded execution allowed.",t.json,n);let w=await fa(s,n);return{exitCode:w.exitCode,stdout:t.json?JSON.stringify({status:w.exitCode===0?"executed":"command_failed",summary:"Guardian guarded execution complete.",why:null,nextAction:null,nextStep:null,data:{skillSlug:r,guardian:y,localPreflight:me(c.context),command:w},warnings:[],links:[],reasonCode:w.exitCode===0?null:"command_failed",handoff:null},null,2):ha(w),stderr:w.stderr}}async function St(e,t,n,i){let r=v(t[1]??n.skill,`guardian ${t[0]??"mode"} requires a skill slug.`),s=await b(i,"/api/v1/guardian/mode",{method:"POST",headers:_(i.apiKey),body:JSON.stringify({skillSlug:r,requestedPreference:e,source:"public-cli"})});return s.preferenceAccepted===!0&&await ya(i,r,s),f(s,s.preferenceAccepted===!0?"Guardian mode updated.":"Guardian mode resolved by policy.",n.json,i)}async function ia(e,t,n){let i=g(t.skill)??g(e[1]),r=await Ti(n,i),s=await qe(n),o=i?await ka(n,i):void 0;return f(j({status:"ok",skillSlug:l(r,"skillSlug")??i,policy:r,localPreference:o,hook:s,nextAction:l(r,"nextAction"),nextStep:l(r,"nextStep")}),"Guardian status loaded.",t.json,n)}async function Ti(e,t){let n=t?await rn(e,t):void 0;return await b(e,"/api/v1/guardian/status",{method:"POST",headers:_(e.apiKey),body:JSON.stringify(j({skillSlug:t,requestedPreference:n,source:"public-cli"}))})}async function ra(e){if(!e.apiKey)return{status:"unknown",policySource:"cloud",reasonCode:"login_required",nextAction:"skills-layer login",nextStep:"Sign in to read the Cloud Guardian policy that applies to your account."};try{return await Ti(e)}catch(t){return{status:"unavailable",policySource:"cloud",reasonCode:"guardian_policy_status_unavailable",message:ue(t),nextAction:"skills-layer guardian status",nextStep:"Retry Guardian status after backend connectivity or authentication is healthy."}}}async function Ut(e,t){let n=g(e.agent)??"codex",i=Oi(e.scope);if(i.status==="invalid")return k(i.message,e.json);let r=de(t.env,t.platform,t.cwd).find(p=>p.id===n);if(!r)return k(`Unsupported Guardian agent "${n}". Run skills-layer agents list to see supported agents.`,e.json);let s=wa(r,i.scope,t);if(!s)return k(`Guardian ${i.scope} hooks are not available for ${r.displayName}.`,e.json);await va(s,t);let o=Ki(t,i.scope),a=di(Te(t.cwd,s.hookPath)),c=di(Te(t.cwd,s.configPath)),d=[...(await Gi(o)).hooks.filter(p=>l(p,"agent")!==r.id||l(p,"scope")!==i.scope),{hookId:le,hookName:ee,agent:r.id,agentName:r.displayName,scope:i.scope,hookPath:a.startsWith("..")?s.hookPath:a,configPath:c.startsWith("..")?s.configPath:c,enforcementLayer:s.enforcementLayer,strictPreActionBlocking:s.strictPreActionBlocking,enabledAt:t.now()}];return await D(o,{version:1,hooks:d}),f({status:"enabled",hookId:le,hookName:ee,agent:r.id,agentName:r.displayName,scope:i.scope,hookPath:s.hookPath,configPath:s.configPath,enforcementLayer:s.enforcementLayer,strictPreActionBlocking:s.strictPreActionBlocking,agentCommandMatrix:vt({purpose:"materialize_skill",command:"skills-layer install <skill-slug>",jsonCommand:"skills-layer install <skill-slug> --json"}),nextStep:"Guardian is installed into the selected host configuration. Local hooks call `skills-layer guardian check`; shell agents can route risky commands through `skills-layer guardian exec`; MCP-capable agents can call `guardian.check` or `guardian.enforce` before risky tool use.",warnings:s.enforcementLayer==="native_hook_candidate"?["This host does not expose the same stable native hook contract as Codex or Claude Code yet; Skills Layer records the guardrail config for host integration."]:[]},"Guardian hook enabled.",e.json,t)}async function sa(e,t){let n=g(e.scope),i=n?Oi(n):null;if(i?.status==="invalid")return k(i.message,e.json);let r=await qe(t,i?.status==="valid"?i.scope:void 0);return f(r,"Guardian status loaded.",e.json,t)}async function qe(e,t){let n=t?[t]:["project","global"],i=[];for(let a of n){let c=Ki(e,a),u=await Gi(c);for(let d of u.hooks){let p=l(d,"hookPath"),y=p?li(e,a,p):null,m=l(d,"configPath"),h=m?li(e,a,m):null,w=y?await ge(y):!1,P=h?await ge(h):null,x=w?P===!1?"active_missing_config":"active":"stale_missing_hook";i.push({hookId:l(d,"hookId")??le,hookName:l(d,"hookName")??ee,...d,scope:l(d,"scope")??a,hookPath:y??p??null,configPath:h??m??null,active:w,configActive:P,hookState:x})}}let r=i.filter(a=>a.active===!0).length,s=i.filter(a=>a.active===!1).length,o=r>0?0:s;return{status:"ok",enforcementLayer:r>0?"native_hook":"not_installed",strictPreActionBlocking:i.some(a=>a.strictPreActionBlocking===!0),activeHookCount:r,missingHookCount:o,staleHookCount:s,hooks:i,setup:await sn(e),warnings:s>0?r>0?["One or more stale Guardian hook records were found, but an active Skills Layer Security Hook is installed."]:["One or more configured Guardian hooks are missing from disk. Run skills-layer guardian hook install --agent <agent> again to repair them."]:[]}}async function Ui(e,t){if(e.json){let u=await V(t.paths.mcpConfigPath);return f({setup:await sn(t),mcp:{status:u?"mcp_configured":"mcp_not_configured",configured:!!u,clientId:u?l(u,"clientId")??"codex":void 0,clientIds:u&&Array.isArray(u.clientIds)?u.clientIds:void 0,mcpUrl:u?l(u,"mcpUrl"):void 0,readiness:u?{status:"configured_needs_agent_reload",verifyCommand:`skills-layer mcp verify --client ${l(u,"clientId")??"codex"}`,nextStep:"Open a fresh agent session if Skills Layer tools are not visible yet."}:void 0,nextCommand:u?"skills-layer mcp verify":"skills-layer mcp setup"},guardian:await qe(t)},"Setup status loaded.",!0,t)}if(!t.stdoutIsTty)return f({status:"setup_needs_terminal",mcp:{nextCommand:"skills-layer mcp setup"},security:{nextCommand:"skills-layer guardian hook install --agent codex --scope project"}},"Setup needs an interactive terminal. Run `skills-layer setup`, or use `skills-layer mcp setup` and `skills-layer guardian hook install --agent codex --scope project`.",!1,t);let n=await t.promptSelect("Set up Skills Layer on this machine?",[{value:"mcp",label:"Setup Skills-Layer MCP",description:"Configure Skills Layer MCP for AI tools"},{value:"security",label:"Setup Skills-Layer Security Guardian",description:"Install Guardian hooks for this workspace"},{value:"both",label:"Setup both - MCP & Security Guardian",description:"Connect supported AI tools and install Guardian hooks"},{value:"not_now",label:"Remind me Later",description:"Skip setup for now; you can run skills-layer setup later"}]);if(n==="not_now"){let u={version:1,setupChoice:"not_now",mcpChoice:"not_now",mcpPromptedAt:t.now(),guardianHookChoice:"not_now",guardianHookPromptedAt:t.now(),remindAfter:la(t.now(),7)};return await ai(t,u),f({status:"setup_skipped",mcp:{status:"not_configured",nextCommand:"skills-layer mcp setup"},security:{status:"not_configured",nextCommand:"skills-layer guardian hook install --agent codex --scope project"}},"Skills Layer setup skipped for now. Run `skills-layer setup` when you want MCP and Security hooks on this machine.",!1,t)}if(n!=="both"&&n!=="mcp"&&n!=="security")return k(`Unknown setup option "${n}".`,e.json);let i=n==="both"||n==="mcp",r=n==="both"||n==="security",s={status:"setup_complete",setupChoice:n},o={version:1,setupChoice:n,mcpChoice:i?"configured":"not_requested",mcpPromptedAt:t.now(),guardianHookChoice:r?g(e.scope)??"project":"not_requested",guardianHookPromptedAt:t.now()};if(i)if(!t.apiKey)s.mcp={status:"login_required",configured:!1,nextCommand:"skills-layer login"},o.mcpChoice="login_required";else{let u=await Qt(e,t);if(H(u))return u;s.mcp=u}if(r){let u={...e,json:!0,scope:g(e.scope)??"project",agent:g(e.agent)??"codex"},d=await Ut(u,t);if(d.exitCode!==0)return d;s.security=$a(d.stdout)??{status:"enabled",agent:g(u.agent),scope:g(u.scope)}}await ai(t,o);let c=(R(s.mcp)?l(s.mcp,"status"):void 0)==="login_required"?"Skills Layer Security setup complete. MCP setup needs login; run `skills-layer login`, then `skills-layer setup`.":"Skills Layer setup complete. Open a fresh agent session if MCP tools are not visible yet.";return f(s,c,e.json,t)}async function oa(e,t){let n=await qe(t),i=await sn(t),r=ce(n,"activeHookCount")??0;if(t.stdoutIsTty&&r===0&&!i)return await Ui(e,t);let s=r>0?"Guardian host hooks are already configured. Run `skills-layer guardian hook status` to inspect them.":"Guardian is enabled for Skills Layer runtime checks. Run `skills-layer setup` when you want MCP and Security hooks on this machine.";return{exitCode:0,stdout:`${Ee}
865
+
866
+ ${s}`,stderr:""}}function aa(e,t){let n=ce(e,"activeHookCount")??0,i=ce(e,"missingHookCount")??0,r=l(t,"status")??"unknown",s=l(t,"effectiveMode"),o=l(t,"adminPolicy"),a=l(t,"nextAction"),c=l(t,"nextStep");return n>0&&i===0?{id:"guardian-local-hook",title:"Guardian local hook",status:"pass",summary:`Guardian native hook active count: ${n}.`,enforcementLayer:l(e,"enforcementLayer")??"native_hook",strictPreActionBlocking:e.strictPreActionBlocking===!0,policyStatus:r,adminPolicy:o,effectiveMode:s,policyNextAction:a,policyNextStep:c,recommendedCommand:"skills-layer guardian hook status"}:{id:"guardian-local-hook",title:"Guardian local hook",status:"warn",summary:`Guardian native hook setup needs attention. Active hooks: ${n}; missing hooks: ${i}.`,enforcementLayer:l(e,"enforcementLayer")??"not_installed",strictPreActionBlocking:e.strictPreActionBlocking===!0,policyStatus:r,adminPolicy:o,effectiveMode:s,policyNextAction:a,policyNextStep:c,recommendedCommand:"skills-layer guardian hook install --agent codex --scope project",nextStep:"Install a Guardian host hook for automatic checks, or route risky shell actions through `skills-layer guardian exec` for strict pre-execution blocking."}}function la(e,t){let n=new Date(e);return Number.isNaN(n.getTime())?e:(n.setUTCDate(n.getUTCDate()+t),n.toISOString())}async function Bi(e){let t=Ni(g(e.flags.unmanagedPolicy)??e.backend.env.SKILLS_LAYER_UNMANAGED_SKILL_POLICY);if(t.status==="invalid")return{status:"invalid",result:k(t.message,e.flags.json)};let n=await Mi({skillSlug:e.skillSlug,flags:e.flags,backend:e.backend,unmanagedPolicy:t.policy});if(n.unmanaged&&n.unmanagedPolicy==="block")return Ze({...e,context:n,reasonCode:"unmanaged_skill_blocked",message:"Guardian blocked unmanaged local skill execution.",why:"The skill path is not backed by a public install index or lockfile entry and unmanaged policy is block.",nextStep:"Install the skill with `skills-layer install <path>` or choose --unmanaged-policy warn/allow for a one-off diagnostic check."});if(!n.installedPath)return{status:"ok",context:n};if(await Ra(n.installedPath))return Ze({...e,context:n,reasonCode:"skill_disabled",message:"Guardian blocked the action because this local skill is disabled.",why:"A local Guardian incident marker is present for this skill.",nextAction:"guardian.incident.review",nextStep:"Review the local incident report before running this skill again."});if(n.unmanaged)return{status:"ok",context:n};let i=await da(e.skillSlug,n.installedPath);if(n.identityAssessment=i,i.reattestationRequired===!0)return Ze({...e,context:n,reasonCode:l(i,"reasonCode")??"skill_identity_mismatch",message:"Guardian blocked the action because the installed skill identity changed.",why:"The visible SKILL.md identity no longer matches the installed skill record.",nextStep:"Reinstall or re-attest the skill before running it again."});let r=await ga(e.skillSlug,n.installedPath);return n.driftAssessment=r,r.reattestationRequired===!0?Ze({...e,context:n,reasonCode:l(r,"reasonCode")??"installed_artifact_changed",message:"Guardian blocked the action because local runtime metadata detected installed artifact drift.",why:"The installed SKILL.md hash no longer matches the materialized runtime metadata.",nextStep:"Reinstall or re-attest the skill before running it again."}):{status:"ok",context:n}}async function Ze(e){return await Le(e.backend,{skillSlug:e.skillSlug,version:e.version??e.context.version,action:e.action,decisionStatus:"blocked",reasonCode:e.reasonCode,telemetryMode:e.telemetryMode,path:e.context.installedPath}),{status:"blocked",result:I({status:"blocked",skillSlug:e.skillSlug,version:e.version??e.context.version,reasonCode:e.reasonCode,localPreflight:me(e.context),unmanaged:e.context.unmanaged,unmanagedPolicy:e.context.unmanagedPolicy,allowUnmanagedOnce:e.context.allowUnmanagedOnce,why:e.why,nextAction:e.nextAction,nextStep:e.nextStep},e.message,e.flags.json,e.reasonCode)}}async function Mi(e){let t=Ni(g(e.flags.unmanagedPolicy)),n=e.unmanagedPolicy??(t.status==="valid"?t.policy:"warn"),i=g(e.flags.path),r=await ca(e.skillSlug,e.backend),s=i?W(e.backend.cwd,i):r?.installedPath;return{source:i?"explicit_path":r?.source??"install_index",status:i?"ok":r?.status,reasonCode:i?void 0:r?.reasonCode,installedPath:s,archivePath:i?void 0:r?.archivePath,installedPathSource:i?"explicit_path":r?.installedPathSource,version:g(e.flags.version)??r?.version,record:r?.record,unmanaged:!!(i&&!r),unmanagedPolicy:n,allowUnmanagedOnce:e.flags.allowUnmanagedOnce}}async function ca(e,t){let i=(await fe(t)).installs[e];if(i){let r=si(i,t);return{source:"install_index",installedPath:r.installedPath,archivePath:r.archivePath,installedPathSource:r.installedPathSource,status:r.status,reasonCode:r.reasonCode,version:l(i,"version"),record:i}}for(let r of ua(t)){let s=await V(r);if(!R(s)||!R(s.installs))continue;let o=s.installs[e];if(R(o)){let a=si(o,t);return{source:"lockfile",installedPath:a.installedPath,archivePath:a.archivePath,installedPathSource:a.installedPathSource,status:a.status,reasonCode:a.reasonCode,version:l(o,"version"),record:o}}}return null}function ua(e){return Array.from(new Set([A(e.cwd,"skills-layer-lock.json"),A(e.paths.stateDir,"skills-layer-lock.json")]))}function si(e,t){let n=l(e,"materializedSkillRoot");if(n)return{installedPath:Qe(W(t.cwd,n)),installedPathSource:"materializedSkillRoot",status:"ok"};let i=l(e,"canonicalPath");if(i)return{installedPath:Qe(W(t.cwd,i)),installedPathSource:"canonicalPath",status:"ok"};let r=l(e,"path");if(r)return{installedPath:Qe(W(t.cwd,r)),installedPathSource:"path",status:"ok"};let s=l(e,"materializedPath")??l(e,"bundlePath");if(s){let u=W(t.cwd,s),d=K(u).toLowerCase()==="bundle.zip"||u.toLowerCase().endsWith(".zip");return{installedPath:d?X(X(u)):Qe(u),archivePath:d?u:void 0,installedPathSource:l(e,"materializedPath")?"materializedPath":"bundlePath",status:d?"degraded":"ok",reasonCode:d?"installed_skill_root_missing":void 0}}let a=(Array.isArray(e.materializedWrites)?e.materializedWrites.filter(R):[]).find(u=>{let d=l(u,"path");return d?.toLowerCase().endsWith("/skill.md")||d?.toLowerCase()==="skill.md"}),c=a?l(a,"path"):void 0;return{installedPath:c?X(W(t.cwd,c)):void 0,installedPathSource:c?"materializedWrites":void 0,status:c?"ok":void 0}}function Qe(e){return K(e).toLowerCase()==="skill.md"?X(e):e}async function da(e,t){let n=A(t,"SKILL.md");if(!await ge(n))return{status:"not_checked",reasonCode:"skill_document_unavailable",expectedSkillSlug:e,reattestationRequired:!1};try{let i=ji(await Oe(n,"utf8"));return i?i!==e?{status:"mismatch",reasonCode:"skill_identity_mismatch",expectedSkillSlug:e,observedSkillName:i,skillDocumentPath:n,reattestationRequired:!0}:{status:"matched",expectedSkillSlug:e,observedSkillName:i,skillDocumentPath:n,reattestationRequired:!1}:{status:"not_checked",reasonCode:"skill_identity_metadata_unavailable",expectedSkillSlug:e,skillDocumentPath:n,reattestationRequired:!1}}catch(i){return{status:"invalid",reasonCode:"skill_identity_unreadable",expectedSkillSlug:e,skillDocumentPath:n,message:ue(i),reattestationRequired:!0}}}async function ga(e,t){let n=A(t,".skills-layer-runtime.json"),i=await V(n),r=i?S(i,"materialization"):void 0,s=r?l(r,"skillDocumentSha256"):void 0;if(!i||!s)return{status:"not_checked",reasonCode:"runtime_metadata_unavailable",skillSlug:e,reattestationRequired:!1};let o=A(t,"SKILL.md");if(!await ge(o))return{status:"changed",reasonCode:"installed_artifact_changed",skillSlug:e,expectedSkillDocumentSha256:s,reattestationRequired:!0};let a=Ji(await Oe(o,"utf8")),c=a===s;return{status:c?"unchanged":"changed",reasonCode:c?"installed_artifact_matches":"installed_artifact_changed",skillSlug:e,expectedSkillDocumentSha256:s,observedSkillDocumentSha256:a,reattestationRequired:!c}}function me(e){return j({source:e.source,status:e.status,reasonCode:e.reasonCode,installedPath:e.installedPath,archivePath:e.archivePath,installedPathSource:e.installedPathSource,version:e.version,unmanaged:e.unmanaged,unmanagedPolicy:e.unmanagedPolicy,allowUnmanagedOnce:e.allowUnmanagedOnce,identityAssessment:e.identityAssessment,driftAssessment:e.driftAssessment})}function Ni(e){if(e===void 0||e.trim()==="")return{status:"valid",policy:"warn"};let t=e.trim().toLowerCase();return t==="allow"||t==="warn"||t==="block"?{status:"valid",policy:t}:{status:"invalid",message:"guardian check --unmanaged-policy must be one of: allow, warn, block."}}function Bt(e,t){let n=g(e)??t;return n==="cloud_managed"||n==="local_only"?{status:"valid",mode:n}:{status:"invalid",message:"guardian --telemetry-mode must be one of: cloud_managed, local_only."}}function pa(e,t){let n=lt(e.actionJson,"action-json");return n&&typeof n=="object"&&!Array.isArray(n)?n:{type:"shell_command",command:K(t[0]??"command")}}function ma(e){let t=S(e,"enforcement");return typeof t?.canExecute=="boolean"?t.canExecute:it(e)!=="blocked"}async function fa(e,t){let[n,...i]=e;return await new Promise((r,s)=>{let o=ki(n,i,{cwd:t.cwd,env:{...process.env,...t.env},stdio:["ignore","pipe","pipe"]}),a="",c="";o.stdout?.setEncoding("utf8"),o.stderr?.setEncoding("utf8"),o.stdout?.on("data",u=>{a=oi(`${a}${u}`)}),o.stderr?.on("data",u=>{c=oi(`${c}${u}`)}),o.on("error",s),o.on("close",u=>{r({executable:K(n),argsCount:i.length,exitCode:typeof u=="number"?u:1,stdout:a,stderr:c})})})}function oi(e){return e.length>2e4?`${e.slice(0,2e4)}
867
+ [output truncated]`:e}function ha(e){let t=[e.exitCode===0?"OK Guardian guarded execution complete.":"Guardian guarded execution finished with a command error.","","Command",` executable: ${e.executable}`,` args count: ${e.argsCount}`,` exit code: ${e.exitCode}`];return e.stdout&&t.push("","Stdout",e.stdout),e.stderr&&t.push("","Stderr",e.stderr),t.join(`
868
+ `)}function Oi(e){let t=g(e)??"project";return t==="project"||t==="global"?{status:"valid",scope:t}:{status:"invalid",message:"guardian hooks --scope must be one of: project, global."}}function Fi(e){return A(e.paths.stateDir,"guardian-modes.json")}function qi(e){return A(e.paths.stateDir,"setup-state.json")}async function nn(e){let t=await V(Fi(e));return{version:1,skills:R(t?.skills)?t.skills:{}}}async function ya(e,t,n){let i=await nn(e);await D(Fi(e),{version:1,skills:{...i.skills,[t]:{requestedPreference:l(n,"requestedPreference")??"enforce",effectiveMode:l(n,"effectiveMode")??"enforce",reasonCode:l(n,"reasonCode"),auditId:l(n,"auditId"),updatedAt:e.now()}}})}async function rn(e,t){let i=(await nn(e)).skills[t];return i?l(i,"requestedPreference"):void 0}async function ka(e,t){return(await nn(e)).skills[t]}async function sn(e){let t=await V(qi(e));return R(t)?{version:1,setupChoice:l(t,"setupChoice"),mcpChoice:l(t,"mcpChoice"),mcpPromptedAt:l(t,"mcpPromptedAt"),guardianHookChoice:l(t,"guardianHookChoice"),guardianHookPromptedAt:l(t,"guardianHookPromptedAt"),remindAfter:l(t,"remindAfter")}:null}async function ai(e,t){await D(qi(e),t)}function wa(e,t,n){let i=t==="global"?e.targets.globalRoot:e.targets.projectRoot;return i?e.id==="codex"?{agent:e.id,agentName:e.displayName,scope:t,hookId:le,hookName:ee,configPath:A(i,"hooks.json"),hookPath:A(i,"hooks","skills-layer-guardian-hook.mjs"),enforcementLayer:"native_hook",strictPreActionBlocking:!0}:e.id==="claude-code"?{agent:e.id,agentName:e.displayName,scope:t,hookId:le,hookName:ee,configPath:A(i,"settings.json"),hookPath:A(i,"hooks","skills-layer-guardian-hook.mjs"),enforcementLayer:"native_hook",strictPreActionBlocking:!0}:e.id==="cline"?{agent:e.id,agentName:e.displayName,scope:t,hookId:le,hookName:ee,configPath:A(i,"guardian-hooks.json"),hookPath:A(i,"hooks","skills-layer-guardian-hook.mjs"),enforcementLayer:"native_hook_candidate",strictPreActionBlocking:!1}:null:null}async function va(e,t){if(await ie(e.hookPath,Ca(e.agentName)),await vi(e.hookPath,448).catch(()=>{}),e.agent==="codex"){await D(e.configPath,ba(e.hookPath));return}if(e.agent==="claude-code"){await D(e.configPath,Pa(e.hookPath));return}e.agent==="cline"&&await D(e.configPath,Sa(e,t))}function Ki(e,t){return t==="global"?A(e.paths.stateDir,"guardian-hooks.json"):A(e.cwd,".skills-layer","guardian-hooks.json")}async function Gi(e){let t=await V(e);return{version:1,hooks:Array.isArray(t?.hooks)?t.hooks.filter(R):[]}}function li(e,t,n){return Se.isAbsolute(n)||n.startsWith("/")?n:Pi(t==="global"?e.paths.stateDir:e.cwd,n)}function ba(e){return{hooks:{PreToolUse:[{name:ee,id:le,matcher:"Bash|Shell|Read|Write|Edit|apply_patch|mcp__.*",hooks:[{name:ee,type:"command",command:`node ${on(e)}`}]}]}}}function Pa(e){return{hooks:{PreToolUse:[{name:ee,id:le,matcher:"Bash|Read|Write|Edit|MultiEdit|NotebookEdit|WebFetch|WebSearch",hooks:[{name:ee,type:"command",command:`node ${on(e)}`}]}]}}}function Sa(e,t){return{version:1,hookId:le,hookName:ee,agent:e.agent,agentName:e.agentName,scope:e.scope,enforcementLayer:e.enforcementLayer,strictPreActionBlocking:e.strictPreActionBlocking,installedAt:t.now(),hooks:[{name:ee,id:le,event:"PreToolUse",command:`node ${on(e.hookPath)}`,status:"candidate"}]}}function Ca(e){return`#!/usr/bin/env node
812
869
  import { spawnSync } from "node:child_process";
813
870
  import { readFileSync } from "node:fs";
814
871
 
@@ -843,39 +900,41 @@ const result = spawnSync("skills-layer", [
843
900
  ], { stdio: ["ignore", "inherit", "inherit"] });
844
901
 
845
902
  process.exit(result.status ?? 1);
846
- `}function rn(e){return JSON.stringify(e)}async function sn(e){let t=I(oe(e.skillDocumentPath),".skills-layer-runtime.json"),n={version:1,generatedAt:e.backend.now(),skillSlug:e.skillSlug,sourceProvider:{id:"skills-layer",name:"Skills Layer",managedBy:"skills-layer-cli"},...e.version?{skillVersion:e.version}:{},guardian:{required:!0,enforcementLayer:"cloud_guardian_with_local_preflight",strictPreActionBlocking:!1,checkCommand:`skills-layer guardian check --skill ${e.skillSlug} --json`,incidentCommand:`skills-layer guardian incident ${e.skillSlug} --path <installed-skill-path> --telemetry-mode local_only --json`,guardedExecutorCommand:`skills-layer guardian exec ${e.skillSlug} --json -- <command>`,mcpCheckTool:"guardian.check",mcpEnforceTool:"guardian.enforce",agentCommandMatrix:wt({purpose:"materialize_skill",command:`skills-layer install ${e.skillSlug}`,jsonCommand:`skills-layer install ${e.skillSlug} --json`,skillSlug:e.skillSlug}),agentGuidance:"MCP-capable agents should call guardian.check or guardian.enforce before risky tool use. Local host hooks should call skills-layer guardian check, and shell actions that need strict wrapping should use skills-layer guardian exec.",sensitiveActionFamilies:["shell_command","network_request","file_read","file_write","secret_read","browser_action","device_action","api_call","generated_code_execution","model_context_promotion"]},materialization:{skillDocumentPath:"SKILL.md",skillDocumentSha256:Ki(e.skillDocumentContent)}},i=`${JSON.stringify(n,null,2)}
847
- `;return await te(t,i),{path:tt(e.backend.cwd,t),bytes:new TextEncoder().encode(i).length}}async function wa(e){return await ge(I(e,".skills-layer-disabled.json"))}async function oi(e){let t=e.backend.now(),n=I(e.installedPath,".skills-layer-disabled.json"),i=I(e.installedPath,".skills-layer-quarantine.json"),r=I(e.installedPath,"incident.md"),s=a(e.action,"type")??"unknown";return await te(n,`${JSON.stringify({disabled:!0,generatedAt:t,skillSlug:e.skillSlug,version:e.version,reason:"Skills Layer Guardian incident response"},null,2)}
848
- `),await te(i,`${JSON.stringify({generatedAt:t,skillSlug:e.skillSlug,version:e.version,actions:["disable_skill","quarantine_files","preserve_evidence","generate_incident_report","rescan_before_reenable"],quarantineTargets:[e.installedPath]},null,2)}
849
- `),await te(r,["# Skills Layer Guardian Incident Report","",`Generated: ${t}`,`Skill: ${e.skillSlug}`,`Version: ${e.version}`,"","## Summary","",qi(e.reason),"","## Evidence","",`- ${t}: ${s} -> blocked (incident_recorded)`].join(`
850
- `)),{status:"written",generatedAt:t,incidentPath:r,writtenFiles:[n,i,r]}}function ai(e,t){let n=e.now().replace(/[:.]/gu,"-");return I(e.paths.incidentsDir,`${t}-${n}.json`)}async function Le(e,t){let n=I(e.paths.stateDir,"guardian-audit.jsonl");await nr(oe(n));let i={version:1,generatedAt:e.now(),skillSlug:t.skillSlug,...t.version?{skillVersion:t.version}:{},actionType:a(t.action,"type")??"unknown",actionTarget:va(t.action),decisionStatus:t.decisionStatus,reasonCode:t.reasonCode,telemetryMode:t.telemetryMode,...t.path?{localPath:Fi(t.path)}:{}};await ns(n,`${JSON.stringify(i)}
851
- `,{encoding:"utf8",mode:384}),await cn(n,384)}function nt(e){let t=S(e,"decision"),n=S(e,"enforcement"),i=a(t??{},"status")??a(n??{},"status")??a(e,"status");return i==="allowed"||i==="advisory"?i:"blocked"}function Bt(e){let t=S(e,"decision");return a(t??{},"reasonCode")??a(e,"reasonCode")??a(e,"status")??"cloud_guardian_decision"}function va(e){let t=a(e,"type");if(t==="secret_read")return"redacted_secret";if(t==="shell_command")return"redacted_command";let n=a(e,"url");if(n)try{return new URL(n).origin}catch{return"redacted_url"}let i=a(e,"target");if(i)return qi(i);let r=a(e,"path");return r?Fi(r):null}function Fi(e){let t=G(e.trim());return t?`<local-path>/${t}`:"<local-path>"}function qi(e){return e.replace(/sk-[A-Za-z0-9_-]+/gu,"[redacted-secret]").replace(/[A-Z0-9_]*SECRET[A-Z0-9_]*/gu,"[redacted-secret]").replace(/[A-Z0-9_]*TOKEN[A-Z0-9_]*/gu,"[redacted-token]").replace(/[A-Z0-9_]*KEY[A-Z0-9_]*/gu,"[redacted-key]")}function li(e){return e.split(/[\\/]+/u).join("/")}function Ki(e){return Gt("sha256").update(e).digest("hex")}async function Gi(e,t,n,i,r){let s=await b(i,"/api/v1/verify",{method:"POST",headers:_(),body:JSON.stringify({email:e,code:t,clientDelivery:"cli_secure_storage"})});if(n.json){let o=a(s,"apiKey");return o?(await Ue(i,o,{expectedEmail:e,knownEmail:a(s,"email")??e,knownRole:a(s,"role")??"user",knownRoles:ne(s,"roles"),knownUserId:a(s,"userId")}),f(J({...s,loggedIn:!0}),"Email verified and login completed.",!0,i)):f(J({...s,email:e,loggedIn:!1,nextCommand:`skills-layer login --method email --email ${e}`,nextAction:"login"}),"Email verified. Login still needs to be completed.",!0,i)}return await it(e,s,n,i,r)}async function it(e,t,n,i,r){let s=a(t,"apiKey"),o=a(t,"role")??"user",l=ne(t,"roles"),c=a(t,"userId"),u=s;if(!u)try{u=(await i.promptSecret(`Enter the API key emailed to ${e} (check spam/junk folder if missing): `)).trim()}catch{return f(J({...t,email:e,role:o,...l?{roles:l}:{},loggedIn:!1}),`${r} Check your email (including spam/junk folder) for the API key, then run \`skills-layer login\` to finish signing in.`,n.json,i)}if(!u)return k("No API key was entered. Run `skills-layer login` once you have the emailed key.",n.json);let d=await Ue(i,u,{expectedEmail:e,knownEmail:e,knownRole:o,knownRoles:l,knownUserId:c,forceProfileValidation:!s}),p=await It(n,{...i,config:d,apiKey:u});return D(p)?p:f(J({...t,status:a(t,"status")??"verified",email:d.email,role:d.role,...d.roles?{roles:d.roles}:{},loggedIn:!0,...p.data?{mcp:p.data}:{}}),[`${r} Logged in as ${d.email}.`,p.message??""].filter(Boolean).join(" "),n.json,i)}async function on(e,t,n,i,r){let s=a(t,"authorizationUrl"),o=v(a(t,"state"),"Social auth did not return a state."),l=_l(e);if(s){let u=await i.openUrl(s);i.emitInfo(u?`${l} sign-in started. Finish the login in your browser, then come back here. Waiting for browser sign-in to finish...`:`${l} sign-in started. Open this URL in your browser, then come back here once it is done:
903
+ `}function on(e){return JSON.stringify(e)}async function an(e){let t=A(X(e.skillDocumentPath),".skills-layer-runtime.json"),n={version:1,generatedAt:e.backend.now(),skillSlug:e.skillSlug,sourceProvider:{id:"skills-layer",name:"Skills Layer",managedBy:"skills-layer-cli"},...e.version?{skillVersion:e.version}:{},guardian:{required:!0,enforcementLayer:"cloud_guardian_with_local_preflight",strictPreActionBlocking:!1,checkCommand:`skills-layer guardian check --skill ${e.skillSlug} --json`,incidentCommand:`skills-layer guardian incident ${e.skillSlug} --path <installed-skill-path> --telemetry-mode local_only --json`,guardedExecutorCommand:`skills-layer guardian exec ${e.skillSlug} --json -- <command>`,mcpCheckTool:"guardian.check",mcpEnforceTool:"guardian.enforce",agentCommandMatrix:vt({purpose:"materialize_skill",command:`skills-layer install ${e.skillSlug}`,jsonCommand:`skills-layer install ${e.skillSlug} --json`,skillSlug:e.skillSlug}),agentGuidance:"MCP-capable agents should call guardian.check or guardian.enforce before risky tool use. Local host hooks should call skills-layer guardian check, and shell actions that need strict wrapping should use skills-layer guardian exec.",sensitiveActionFamilies:["shell_command","network_request","file_read","file_write","secret_read","browser_action","device_action","api_call","generated_code_execution","model_context_promotion"]},materialization:{skillDocumentPath:"SKILL.md",skillDocumentSha256:Ji(e.skillDocumentContent)}},i=`${JSON.stringify(n,null,2)}
904
+ `;return await ie(t,i),{path:nt(e.backend.cwd,t),bytes:new TextEncoder().encode(i).length}}async function Ra(e){return await ge(A(e,".skills-layer-disabled.json"))}async function ci(e){let t=e.backend.now(),n=A(e.installedPath,".skills-layer-disabled.json"),i=A(e.installedPath,".skills-layer-quarantine.json"),r=A(e.installedPath,"incident.md"),s=l(e.action,"type")??"unknown";return await ie(n,`${JSON.stringify({disabled:!0,generatedAt:t,skillSlug:e.skillSlug,version:e.version,reason:"Skills Layer Guardian incident response"},null,2)}
905
+ `),await ie(i,`${JSON.stringify({generatedAt:t,skillSlug:e.skillSlug,version:e.version,actions:["disable_skill","quarantine_files","preserve_evidence","generate_incident_report","rescan_before_reenable"],quarantineTargets:[e.installedPath]},null,2)}
906
+ `),await ie(r,["# Skills Layer Guardian Incident Report","",`Generated: ${t}`,`Skill: ${e.skillSlug}`,`Version: ${e.version}`,"","## Summary","",Hi(e.reason),"","## Evidence","",`- ${t}: ${s} -> blocked (incident_recorded)`].join(`
907
+ `)),{status:"written",generatedAt:t,incidentPath:r,writtenFiles:[n,i,r]}}function ui(e,t){let n=e.now().replace(/[:.]/gu,"-");return A(e.paths.incidentsDir,`${t}-${n}.json`)}async function Le(e,t){let n=A(e.paths.stateDir,"guardian-audit.jsonl");await ar(X(n));let i={version:1,generatedAt:e.now(),skillSlug:t.skillSlug,...t.version?{skillVersion:t.version}:{},actionType:l(t.action,"type")??"unknown",actionTarget:xa(t.action),decisionStatus:t.decisionStatus,reasonCode:t.reasonCode,telemetryMode:t.telemetryMode,...t.path?{localPath:Di(t.path)}:{}};await as(n,`${JSON.stringify(i)}
908
+ `,{encoding:"utf8",mode:384}),await dn(n,384)}function it(e){let t=S(e,"decision"),n=S(e,"enforcement"),i=l(t??{},"status")??l(n??{},"status")??l(e,"status");return i==="allowed"||i==="advisory"?i:"blocked"}function Mt(e){let t=S(e,"decision");return l(t??{},"reasonCode")??l(e,"reasonCode")??l(e,"status")??"cloud_guardian_decision"}function xa(e){let t=l(e,"type");if(t==="secret_read")return"redacted_secret";if(t==="shell_command")return"redacted_command";let n=l(e,"url");if(n)try{return new URL(n).origin}catch{return"redacted_url"}let i=l(e,"target");if(i)return Hi(i);let r=l(e,"path");return r?Di(r):null}function Di(e){let t=K(e.trim());return t?`<local-path>/${t}`:"<local-path>"}function Hi(e){return e.replace(/sk-[A-Za-z0-9_-]+/gu,"[redacted-secret]").replace(/[A-Z0-9_]*SECRET[A-Z0-9_]*/gu,"[redacted-secret]").replace(/[A-Z0-9_]*TOKEN[A-Z0-9_]*/gu,"[redacted-token]").replace(/[A-Z0-9_]*KEY[A-Z0-9_]*/gu,"[redacted-key]")}function di(e){return e.split(/[\\/]+/u).join("/")}function Ji(e){return Dt("sha256").update(e).digest("hex")}async function zi(e,t,n,i,r){let s=await b(i,"/api/v1/verify",{method:"POST",headers:_(),body:JSON.stringify({email:e,code:t,clientDelivery:"cli_secure_storage"})});if(n.json){let o=l(s,"apiKey");return o?(await Ue(i,o,{expectedEmail:e,knownEmail:l(s,"email")??e,knownRole:l(s,"role")??"user",knownRoles:re(s,"roles"),knownUserId:l(s,"userId")}),f(z({...s,loggedIn:!0}),"Email verified and login completed.",!0,i)):f(z({...s,email:e,loggedIn:!1,nextCommand:`skills-layer login --method email --email ${e}`,nextAction:"login"}),"Email verified. Login still needs to be completed.",!0,i)}return await rt(e,s,n,i,r)}async function rt(e,t,n,i,r){let s=l(t,"apiKey"),o=l(t,"role")??"user",a=re(t,"roles"),c=l(t,"userId"),u=s;if(!u)try{u=(await i.promptSecret(`Enter the API key emailed to ${e} (check spam/junk folder if missing): `)).trim()}catch{return f(z({...t,email:e,role:o,...a?{roles:a}:{},loggedIn:!1}),`${r} Check your email (including spam/junk folder) for the API key, then run \`skills-layer login\` to finish signing in.`,n.json,i)}if(!u)return k("No API key was entered. Run `skills-layer login` once you have the emailed key.",n.json);let d=await Ue(i,u,{expectedEmail:e,knownEmail:e,knownRole:o,knownRoles:a,knownUserId:c,forceProfileValidation:!s}),p=await It(n,{...i,config:d,apiKey:u});return H(p)?p:f(z({...t,status:l(t,"status")??"verified",email:d.email,role:d.role,...d.roles?{roles:d.roles}:{},loggedIn:!0,...p.data?{mcp:p.data}:{}}),[`${r} Logged in as ${d.email}.`,p.message??""].filter(Boolean).join(" "),n.json,i)}async function ln(e,t,n,i,r){let s=l(t,"authorizationUrl"),o=v(l(t,"state"),"Social auth did not return a state."),a=Ul(e);if(s){let u=await i.openUrl(s);i.emitInfo(u?`${a} sign-in started. Finish the login in your browser, then come back here. Waiting for browser sign-in to finish...`:`${a} sign-in started. Open this URL in your browser, then come back here once it is done:
852
909
  ${s}
853
- Waiting for browser sign-in to finish...`)}else i.emitInfo(`${l} sign-in started. Finish the login in your browser, then come back here. Waiting for browser sign-in to finish...`);let c=await Sa(o,i);return D(c)?c:c.status==="verified"||c.status==="recovered"?await it(c.email,{...c},n,i,r==="recovery"?`Recovered access for ${c.email} through ${l}.`:`Verified ${c.email} through ${l}.`):c.status==="already_registered"?f(c,c.linkedAccount===!0?`${l} is now linked to ${c.email}. Run \`skills-layer login\` to sign in.`:`${c.email} is already registered. Run \`skills-layer login\` to sign in, or \`skills-layer auth recover\` if you need account recovery.`,n.json,i):c.status==="linked"?f(c,`${l} sign-in is now connected.`,n.json,i):Pa(c)?k($a(c),n.json):k("Social auth completed with an unexpected response.",n.json)}function D(e){return R(e)&&typeof e.exitCode=="number"&&typeof e.stdout=="string"&&typeof e.stderr=="string"}function ba(e){try{let t=JSON.parse(e);return R(t)?t.data:void 0}catch{return}}function Pa(e){return e.status==="registration_required"||e.status==="state_expired"||e.status==="provider_mismatch"||e.status==="identity_conflict"||e.status==="email_required"||e.status==="failed"}async function Sa(e,t){for(let n=0;n<120;n+=1)try{let i=await b(t,`/api/v1/identity/social/status/${encodeURIComponent(e)}`),r=a(i,"status")??"failed";if(r==="pending"){await t.sleep(1500);continue}return(r==="verified"||r==="recovered")&&a(i,"email")&&a(i,"role")?{status:r,email:a(i,"email"),role:a(i,"role"),roles:ne(i,"roles"),userId:a(i,"userId"),apiKey:a(i,"apiKey"),keyPrefix:a(i,"keyPrefix"),emailDelivery:a(i,"emailDelivery")}:r==="already_registered"&&a(i,"email")&&a(i,"role")?{status:r,email:a(i,"email"),role:a(i,"role"),roles:ne(i,"roles"),linkedAccount:typeof i.linkedAccount=="boolean"?i.linkedAccount:void 0}:r==="linked"?{status:r}:r==="registration_required"||r==="state_expired"||r==="provider_mismatch"||r==="identity_conflict"||r==="email_required"||r==="failed"?{status:r,error:a(i,"error")}:k("Social auth completed with an unexpected response.",!1)}catch(i){if(i instanceof E&&(i.status===404||i.status===429)){await t.sleep(1500);continue}return k(ue(i),!1)}return k("Timed out while waiting for social auth to complete.",!1)}async function Ca(e,t){for(let n=0;n<120;n+=1)try{let r=(await b(t,"/api/v1/purchases",{headers:U(t.apiKey,t.authBlockedMessage)})).results?.find(s=>s.purchaseId===e);if(!r?.status||r.status==="pending"||r.status==="requires_action"){await t.sleep(1500);continue}return{status:r.status,purchaseId:e}}catch(i){if(i instanceof E&&i.status===429){await t.sleep(1500);continue}return k(ue(i),!1)}return k("Timed out while waiting for purchase confirmation.",!1)}async function Ra(e,t){for(let n=0;n<120;n+=1)try{let i=await b(t,`/api/v1/me/private-skill-charges/${encodeURIComponent(e)}`,{headers:U(t.apiKey,t.authBlockedMessage)}),r=a(i,"status");if(!r||r==="checkout_required"||r==="pending"||r==="requires_action"){await t.sleep(1500);continue}return{...i,status:r}}catch(i){if(i instanceof E&&i.status===429){await t.sleep(1500);continue}return k(ue(i),!1)}return k("Timed out while waiting for payment confirmation.",!1)}function xa(e){let t=S(e,"accountLink");return(t?a(t,"url"):void 0)??a(e,"url")??a(e,"setupUrl")}function $a(e){return e.status==="registration_required"?e.error??"No verified account exists for this social identity. Use `skills-layer register` first.":e.status==="state_expired"?"Social auth expired before completion. Start the flow again.":e.status==="provider_mismatch"?"The browser completed a different social provider than the one the CLI started.":e.status==="identity_conflict"?e.error??"This social identity is already linked to another account.":e.status==="email_required"?e.error??"This social profile did not provide an email address.":e.error??"Social auth could not be completed."}async function Ue(e,t,n={}){let r=n.forceProfileValidation===!0||!n.knownEmail||!n.knownRole?await b({...e,apiKey:t},"/api/v1/me",{headers:{...U(t),...n.notifyLogin?{"x-skills-layer-session-intent":"login"}:{}}}):{userId:n.knownUserId,email:n.knownEmail,role:n.knownRole,roles:n.knownRoles},s=a(r,"email")??n.knownEmail??"unknown";if(n.expectedEmail&&s.toLowerCase()!==n.expectedEmail.toLowerCase())throw new Error(`The entered API key belongs to ${s}, not ${n.expectedEmail}. Use the API key emailed to ${n.expectedEmail}.`);let o=await b({...e,apiKey:t},"/api/v1/capabilities",{headers:U(t)}),l={version:vi,baseUrl:e.baseUrl,apiKey:t,edition:a(o,"edition")??a(r,"edition")??"saas",userId:a(r,"userId")??n.knownUserId,email:s,role:a(r,"role")??n.knownRole??"user",roles:ne(r,"roles")??n.knownRoles,lastSelectedAgent:e.config?.lastSelectedAgent,savedAt:e.now()};return await ln(e.paths.configPath,l,e),await K(e.paths.backendPreferencePath,{version:Wt,preferredBaseUrl:e.baseUrl,savedAt:e.now()}),l}function ci(e,t){let n=at(e.actionJson,"action-json");if(n&&typeof n=="object"&&!Array.isArray(n))return n;let i=g(e.action);return t==="incident"?{type:"file_write",path:g(e.path)??".skills-layer/incidents/guardian-incident.json"}:i==="file_read"||i==="file_write"?{type:i,path:g(e.path)??"."}:i==="shell_command"?{type:"shell_command",command:"unspecified"}:{type:"api_call",...i?{target:i}:{}}}async function C(e,t,n,i,r={}){let s=r.authenticated?U(n.apiKey,n.authBlockedMessage):Ke(n.apiKey);return await rt(e,{headers:s},t,n,i)}async function _a(e,t){let n=await b(t,"/api/v1/doctor",{headers:Ke(t.apiKey)}),i=await qe(t),r=await Zo(t),s=[...Wi(n),ta(i,r)];return f({...n,guardian:{...i,policy:r},checks:s},"Doctor checks loaded.",e.json,t)}async function N(e,t,n,i,r){return await rt(e,{method:"POST",headers:_(i.apiKey),body:JSON.stringify(A(t))},n,i,r)}async function Be(e,t,n,i,r){return await rt(e,{method:"PATCH",headers:_(i.apiKey),body:JSON.stringify(A(t))},n,i,r)}async function rt(e,t,n,i,r){let s=await b(i,e,t);return f(s,r,n.json,i)}async function b(e,t,n={}){let i=await e.fetchFn(`${e.baseUrl}${t}`,n).catch(o=>{throw new Error(`Unable to reach ${e.baseUrl}. ${ue(o)}`)});if(!i.ok)throw await Aa(i);let r=await i.text();if(!r)return{};let s=JSON.parse(r);return s&&typeof s=="object"&&!Array.isArray(s)&&"data"in s?s.data:s}async function Aa(e){let t=await e.text();if(t)try{let n=JSON.parse(t);return new E(e.status,a(n,"error")??(e.statusText||"Request failed"),n)}catch{return new E(e.status,t)}return new E(e.status,e.statusText||"Request failed")}function U(e,t){if(t)throw new Error(t);if(!e)throw new Error("This command requires login. Run `skills-layer login` first.");return{authorization:`Bearer ${e}`}}function Ke(e){return e?{authorization:`Bearer ${e}`}:{}}function _(e){return{"content-type":"application/json",...Ke(e)}}async function st(e){let t=await is(e);if(t.isFile())return[{path:G(e),content:await Oe(e,"utf8")}];if(!t.isDirectory())throw new Error(`Unsupported path: ${e}`);let n=[];if(await Di(e,e,n),n.length===0)throw new Error(`No readable files found in ${e}.`);return n.sort((i,r)=>i.path.localeCompare(r.path))}async function Di(e,t,n){for(let i of await ki(t,{withFileTypes:!0})){if(Ia(i.name))continue;let r=I(t,i.name);if(i.isDirectory()){await Di(e,r,n);continue}if(!i.isFile())continue;let s=Te(e,r).split("\\").join("/");try{n.push({path:s,content:await Oe(r,"utf8")})}catch{continue}}}function Ia(e){return e===".git"||e==="node_modules"||e==="coverage"||e===ja()||e==="dist"}function ja(){return[46,68,83,95,83,116,111,114,101].map(e=>String.fromCharCode(e)).join("")}async function Mt(e,t){if(/^https?:\/\//u.test(e)||/^[a-z]+:/iu.test(e))return;let n=ae(t,e);try{return await hi(n),{sourceMetadata:{kind:"local",input:e,canonicalSource:`local:${e}`},files:await st(n)}}catch{return}}async function St(e,t){let n=Ea(t);if(n.length===0)return t;let i=[];for(let r of n){let s=Hi(r.path),o=ae(e.cwd,s),l=Te(e.cwd,o);if(!l||l.startsWith("..")||Se.isAbsolute(l))throw new Error(`Cloud install plan attempted to write outside the current workspace: ${r.path}`);if(await te(o,r.content),i.push({path:s,bytes:new TextEncoder().encode(r.content).length}),G(s).toLowerCase()==="skill.md"){let c=a(t,"skillSlug")??a(t,"slug")??G(oe(s)),u=await sn({backend:e,skillSlug:c,version:a(t,"version"),skillDocumentPath:o,skillDocumentContent:r.content});i.push(u)}}return{...t,materializedWrites:i}}function Ea(e){return[...Ct(e.localWrites),...Ct(S(e,"installPlan")?.localWrites),...Ct(S(e,"materializationPlan")?.localWrites)]}function Ct(e){return Array.isArray(e)?e.flatMap(t=>{if(!t||typeof t!="object"||Array.isArray(t))return[];let n=t,i=g(n.path),r=typeof n.content=="string"?n.content:void 0;return i&&r!==void 0?[{path:i,content:r}]:[]}):[]}function Hi(e){let t=e.replaceAll("\\","/").replace(/^\.\/+/u,"");if(!t||t.includes("\0")||Jt.isAbsolute(t)||Se.isAbsolute(e)||t.split("/").includes(".."))throw new Error(`Cloud install plan returned an unsafe local write path: ${e}`);return t}async function La(e,t){let n=a(e,"apiKey");if(!n)return;let i={version:vi,baseUrl:t.baseUrl,apiKey:n,edition:a(e,"edition")??t.config?.edition??"saas",userId:a(e,"userId")??t.config?.userId,email:a(e,"email")??t.config?.email??"unknown",role:a(e,"role")??t.config?.role??"user",roles:ne(e,"roles")??t.config?.roles,lastSelectedAgent:t.config?.lastSelectedAgent,savedAt:t.now()};await ln(t.paths.configPath,i,t)}async function fe(e){let t=await z(e.paths.installsPath);if(!R(t))return{version:Fn,installs:{}};let n=R(t.installs)?ui(t.installs):R(t.skills)?ui(t.skills):{};return{version:typeof t.version=="number"?t.version:Fn,installs:n}}async function Ji(e,t){await K(e.paths.installsPath,t)}async function et(e,t,n){let i=a(t,"skillSlug")??a(t,"slug")??n,r=await fe(e);r.installs[i]={skillSlug:i,...t,savedAt:e.now()},await Ji(e,r)}function ui(e){let t={};for(let[n,i]of Object.entries(e))t[n]=R(i)?i:{skillSlug:n,value:i};return t}var O=5;function f(e,t,n,i){let s={status:e&&typeof e=="object"&&!Array.isArray(e)&&typeof e.status=="string"?String(e.status):"ok",summary:t,why:null,nextAction:null,nextStep:null,data:e,warnings:[],links:[],reasonCode:null,handoff:null};return{exitCode:0,stdout:n?JSON.stringify(s,null,2):Ta(e,t,i),stderr:""}}function Ta(e,t,n){let i=W(n);if(R(e)){if(t==="Status loaded."&&di(e))return Na(e,t,i);if(t==="Doctor checks loaded."&&di(e))return Oa(e,t,i);if(t==="Creator payout profile loaded.")return sl(e,t,i);if(t==="Creator earnings loaded."||t==="Earnings loaded.")return ol(e,"Creator earnings loaded.",i);if(t==="Creator payouts loaded."||t==="Payouts loaded.")return al(e,"Creator payouts loaded.",i);if(t==="Guardian check complete.")return Ba(e,t,i);if(t==="Reviews loaded.")return Ua(e,t,i)}let r=[`${i.ok("OK")} ${t}`];if(R(e)){let s=Qi(e,i);s.length>0&&r.push("",...s);let o=tr(e);o.length>0&&r.push("",i.section("Next"),...o.map(l=>` ${i.arrow} ${l}`))}return r.join(`
854
- `)}function Ua(e,t,n){let i=le(e.reviews??e.results),r=[`${n.ok("OK")} ${t}`,"",n.section(`Reviews (${i.length})`)];return i.length===0&&r.push(` ${n.muted("No reviews yet.")}`),i.forEach((s,o)=>{let l=a(s,"reviewId")??a(s,"id"),u=a(s,"skillSlug")??a(s,"slug")??a(s,"skill")??l??`Review ${o+1}`,d=s.rating??s.score,p=a(s,"status"),y=a(s,"updatedAt")??a(s,"createdAt"),m=[l?`review: ${l}`:void 0,d!=null?`rating: ${H("rating",d)}`:void 0,p?`status: ${p}`:void 0,y?`updated: ${y}`:void 0].filter(w=>!!w);r.push(`${o+1}. ${u}`),m.length>0&&r.push(` ${m.join("; ")}`);let h=a(s,"feedback")??a(s,"comment")??a(s,"message");h&&r.push(` ${n.label("feedback")}: ${be(h)}`)}),r.join(`
855
- `)}function Ba(e,t,n){let i=S(e,"decision"),r=S(e,"enforcement"),s=S(e,"auditEvent"),o=Y(i,"status")??Y(r,"status")??"unknown",l=Y(r,"actionType")??Y(s,"actionType")??"action",c=Y(i,"capability")??Y(r,"capability")??"not specified",u=Y(i,"reasonCode")??Y(r,"reasonCode")??"not specified",d=Y(i,"message")??Y(r,"message")??"Guardian policy resolved this action.",p=Y(s,"skillSlug")??"unknown",y=Y(s,"version")??"unknown",m=Rt(r,"canExecute"),h=Rt(r,"auditRequired"),w=Rt(r,"telemetryRequired"),P=o==="blocked"?"BLOCKED":o==="allowed"?"ALLOWED":"WARNING",x=[`${n.ok("OK")} ${t}`,"",n.section(`${P} ${Ma(l)}`),` ${n.label("Skill")}: ${p}`,` ${n.label("Version")}: ${y}`,` ${n.label("Capability")}: ${c}`,` ${n.label("Reason")}: ${d}`,` ${n.label("Reason code")}: ${u}`,` ${n.label("Can execute")}: ${m===!0?"yes":"no"}`,` ${n.label("Audit required")}: ${h===!1?"no":"yes"}`,` ${n.label("Cloud telemetry")}: ${w===!0?"yes":"no"}`,"",n.section("Next")];return o==="blocked"?x.push(` ${n.arrow} Do not run this action.`,` ${n.arrow} Review \`skills-layer trust ${p}\`.`,` ${n.arrow} Run \`skills-layer guardian incident --skill ${p} --version ${y} --path <installed-skill-path> --reason "<reason>"\` if this was unexpected.`):x.push(` ${n.arrow} Continue only with the action Guardian evaluated.`,` ${n.arrow} Re-run guardian check if the action changes.`),x.join(`
856
- `)}function Rt(e,t){if(R(e))return typeof e[t]=="boolean"?e[t]:void 0}function Y(e,t){return R(e)?a(e,t):void 0}function Ma(e){return e.split(/[_-]+/u).filter(Boolean).map(t=>`${t[0]?.toUpperCase()??""}${t.slice(1)}`).join(" ")}function di(e){return!!(S(e,"backend")&&S(e,"auth")&&Array.isArray(e.checks))}function Na(e,t,n){let i=[`${n.ok("OK")} ${t}`,"",n.section("Readiness")],r=a(e,"summary");r&&i.push(` ${r}`);let s=S(e,"backend"),o=s?Ga(s):void 0;o&&i.push(` ${n.label("Backend")}: ${o}`);let l=S(e,"auth"),c=l?Da(l):void 0;c&&i.push(` ${n.label("Account")}: ${c}`);let u=l?ce(l,"workspaceCount"):void 0;u!==void 0&&i.push(` ${n.label("Workspaces")}: ${u}`);let d=l?ce(l,"libraryCount"):void 0;d!==void 0&&i.push(` ${n.label("Owned skills")}: ${d}`);let p=zi(e);return p.length>0&&i.push("",n.section("Next"),...p.map(y=>` ${n.arrow} ${y}`)),i.push(` ${n.arrow} Run \`skills-layer doctor\` for diagnostics.`),i.join(`
857
- `)}function Oa(e,t,n){let i=[`${n.ok("OK")} ${t}`,"",n.section("Diagnostics")],r=a(e,"summary");r&&i.push(` ${r}`);let s=a(e,"status");s&&i.push(` ${n.label("Status")}: ${s}`);let o=Wi(e),l=o.filter(d=>Ha(a(d,"status"))),c=o.filter(d=>a(d,"status")!=="pass");i.push(l.length===0?" No blocking issues found.":` ${l.length} check${l.length===1?"":"s"} need attention.`),l.length===0&&c.length>0&&i.push(` Advisory checks needing attention: ${c.length}.`),i.push("",n.section(`Checks (${o.length})`)),o.length===0&&i.push(` ${n.muted("No checks returned by the backend.")}`),o.forEach((d,p)=>{let y=a(d,"status")??"unknown",m=a(d,"title")??a(d,"id")??`Check ${p+1}`;i.push(`${p+1}. ${n.label(`[${y}] ${m}`)}`);let h=a(d,"summary");h&&i.push(` ${h}`);let w=a(d,"why");if(w&&i.push(` ${n.label("Why")}: ${w}`),y!=="pass"){let P=a(d,"nextStep");P&&i.push(` ${n.label("Fix")}: ${P}`);let x=a(d,"recommendedCommand");x&&i.push(` ${n.label("Try")}: ${x}`)}});let u=zi(e);return u.length>0&&i.push("",n.section(l.length>0?"Recommended Fix":"Next"),...u.map(d=>` ${n.arrow} ${d}`)),i.join(`
858
- `)}function Fa(e,t,n,i){let r=[`${n.ok("OK")} ${t}`],s=ne(e,"requestedSlugs");s&&s.length>0&&r.push("",n.section("Requested"),` ${s.join(", ")}`);let o=le(e.results);r.push("",n.section(`Comparison (${o.length})`)),o.length===0&&r.push(` ${n.muted("No comparable skills returned.")}`),o.forEach((d,p)=>{let y=Ot(d)??`Skill ${p+1}`;r.push(`${p+1}. ${y}`);let m=qa(d);m&&r.push(` ${m}`);let h=er(d);h&&r.push(` ${n.label("summary")}: ${i?h.replace(/\s+/gu," ").trim():be(h)}`)});let l=le(e.missing);l.length>0&&(r.push("",n.section(`Missing (${l.length})`)),l.forEach((d,p)=>{let y=a(d,"slug")??a(d,"skillSlug")??Ot(d)??`Entry ${p+1}`,m=a(d,"reason")??a(d,"status");r.push(`${p+1}. ${m?`${y} - ${m}`:y}`)}));let c=ne(e,"guidance")??ve(e.guidance);c.length>0&&r.push("",n.section("Guidance"),...c.slice(0,3).map(d=>` ${n.arrow} ${be(d)}`));let u=Ka(o);return u.length>0&&r.push("",n.section("Next"),...u.map(d=>` ${n.arrow} ${d}`)),r.join(`
859
- `)}function qa(e){let t=S(e,"securityPosture"),n=a(e,"trust")??a(e,"trustStatus")??a(e,"trustLabel")??(t?a(t,"label"):void 0),i=e.score??e.securityScore??(t?t.securityScore:void 0),r=a(e,"risk")??a(e,"runtimeRisk")??(t?a(t,"runtimeRisk"):void 0);return[["slug",a(e,"slug")??a(e,"skillSlug")],["version",a(e,"version")??a(e,"currentVersion")],["category",a(e,"category")],["type",a(e,"type")??a(e,"skillType")],["trust",n],["score",i],["risk",r]].flatMap(([o,l])=>l==null||l===""?[]:[`${o}: ${H(String(o),l)}`]).join("; ")}function Ka(e){let t=[];for(let n of e.slice(0,5)){let i=a(n,"slug")??a(n,"skillSlug");i&&t.push(`skills-layer show ${i}`,`skills-layer trust ${i}`,`skills-layer install ${i}`)}return t}function Ga(e){let t=a(e,"edition"),n=a(e,"baseUrl");return t&&n?`${t} at ${n}`:t??n}function Da(e){let t=a(e,"state");if(t&&t!=="authenticated")return t==="anonymous"?"not signed in":t;let n=a(e,"email"),i=ne(e,"roles");return n&&i&&i.length>0?`${n} (${i.join(", ")})`:n??a(e,"role")}function zi(e){let t=[],n=a(e,"recommendedCommand");n&&t.push(n);let i=a(e,"nextStep");return i&&t.push(i),t}function Wi(e){return Array.isArray(e.checks)?e.checks.filter(R):[]}function Ha(e){return e!==void 0&&e!=="pass"&&e!=="warn"&&e!=="advisory"}function le(e){return Array.isArray(e)?e.filter(R):[]}function ve(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function Ja(e){let t=e.commerce===!0;return{status:t?"available":"unavailable",summary:t?"Marketplace purchases, invoices, refunds, and creator commerce flows are available.":"Marketplace commerce is not available on this backend.",availableWorkflows:t?["Browse skills with `skills-layer featured` or `skills-layer search <query>`.","Start purchase handoff with `skills-layer buy <skill-slug>`.","Review account purchases with `skills-layer purchases list`."]:["Browse and install available free skills.","Use `skills-layer help topic install` for install guidance."]}}var za={"core.identity":"Account and sign-in","core.catalog":"Catalog discovery","core.validation":"Creator validation","core.creator":"Creator submissions","core.library":"Owned skills","core.workspace":"Workspace rollout","core.guardian":"Runtime trust checks","core.source":"Source installs","core.discovery":"Catalog discovery","marketplace.commerce":"Marketplace commerce","marketplace.reviews":"Reviews and issues","marketplace.payouts":"Creator earnings"};function Wa(e){let t=ve(e.capabilities);return{status:"ok",edition:a(e,"edition")??"unknown",summary:"Public product capabilities available on the selected backend.",capabilities:t.map(n=>({name:za[n]??lt(n.replace(/^[^.]+\./u,"").replace(/[._-]+/gu," ")),available:!0})),count:t.length}}function Va(e,t){let n=g(e);if(!n)return;let i=Number(n);return!Number.isInteger(i)||i<=0?k("help optimize-tokens --max-characters must be a positive integer.",t):i<120||i>4e3?k("help optimize-tokens --max-characters must be between 120 and 4000.",t):i}function Ya(e,t,n){let i=W(n),r=S(e,"validation")??e,s=S(r,"parsedSkill")??S(e,"parsedSkill"),o=s?S(s,"frontmatter"):void 0,l=a(e,"skillSlug")??(o?a(o,"name"):void 0),c=r.valid===!0||e.valid===!0,u=xt(r,e,"issues"),d=xt(r,e,"warnings"),p=xt(r,e,"advice"),y=S(r,"stats")??S(e,"stats"),m=[`${i.ok("OK")} Validation complete.`,"",i.section("Bundle")];if(m.push(` ${i.label("Path")}: ${t}`),l&&m.push(` ${i.label("Skill")}: ${l}`),m.push(` ${i.label("Readiness")}: ${c?"ready for dry-run submission":"needs changes before submission"}`),m.push("",i.section("Checks")),m.push(` ${i.arrow} SKILL.md structure and frontmatter`),m.push(` ${i.arrow} Required bundle files and supported directories`),m.push(` ${i.arrow} Secret hygiene, unsafe script signals, and trust-review readiness`),m.push(` ${i.arrow} Trigger quality inputs for should-trigger / should-not-trigger testing`),y){let h=y.fileCount??y.files??e.fileCount,w=y.bodyWordCount??y.bodyWords??e.bodyWordCount;m.push("",i.section("File Summary")),h!==void 0&&m.push(` ${i.label("File count")}: ${H("fileCount",h)}`),w!==void 0&&m.push(` ${i.label("Body words")}: ${H("bodyWordCount",w)}`)}return m.push("",...$t("Issues",u,i,"No blocking issues found.")),m.push("",...$t("Warnings",d,i,"No warnings returned.")),m.push("",...$t("Advice",p,i,"No extra advice returned.")),m.push("",i.section("Next")),m.push(` ${i.arrow} skills-layer preview-trigger ${t} --should-trigger "<prompt>" --should-not-trigger "<prompt>"`),m.push(` ${i.arrow} skills-layer creator submit ${t} --dry-run`),m.join(`
860
- `)}function xt(e,t,n){let i=Array.isArray(e[n])?e[n]:[],r=Array.isArray(t[n])?t[n]:[];return i.length>0?i:r}function $t(e,t,n,i){let r=[n.section(`${e} (${t.length})`)];return t.length===0?(r.push(` ${n.muted(i)}`),r):(t.slice(0,O).forEach((s,o)=>{r.push(`${o+1}. ${Vi(s)}`)}),r)}function Vi(e){return R(e)?(a(e,"message")??a(e,"title")??a(e,"code")??a(e,"path")??Me(e))||"Details available with --json":H("",e)}function Qa(e,t,n){let i=W(n),r=Za(e),s=Xa(e),o=[`${i.ok("OK")} Trigger preview complete.`,"",i.section("Bundle"),` ${i.label("Path")}: ${t}`],l=a(e,"skillSlug")??a(e,"slug");return l&&o.push(` ${i.label("Skill")}: ${l}`),o.push("",i.section(`Prompt Results (${r.length})`)),r.length===0&&o.push(` ${i.muted("No prompt results returned. Use --json to inspect the raw backend response.")}`),r.slice(0,O).forEach((c,u)=>{o.push(`${u+1}. ${el(c,u)}`)}),o.push("",i.section(`Guidance (${s.length})`)),s.length===0&&o.push(` ${i.muted("No extra trigger guidance returned.")}`),s.slice(0,O).forEach((c,u)=>{o.push(`${u+1}. ${c}`)}),o.push("",i.section("Next")),o.push(` ${i.arrow} skills-layer validate ${t}`),o.push(` ${i.arrow} skills-layer creator submit ${t} --dry-run`),o.join(`
861
- `)}function Za(e){return[...le(e.promptResults),...le(e.results),...le(e.shouldTriggerResults),...le(e.shouldNotTriggerResults),...le(e.paraphraseResults)]}function Xa(e){let t=ve(e.guidance),n=le(e.guidance).map(i=>Vi(i));return[...t,...n]}function el(e,t){let n=a(e,"prompt")??a(e,"text")??a(e,"input")??`Prompt ${t+1}`,i=tl(e),r=nl(e),s=il(e),o=e.score??e.confidence,l=a(e,"reason")??a(e,"explanation")??a(e,"message");return[`"${be(n)}"`,i?`expected: ${i}`:void 0,r?`actual: ${r}`:void 0,s,o!==void 0?`score: ${H("score",o)}`:void 0,l?`reason: ${be(l)}`:void 0].filter(c=>!!c).join("; ")}function tl(e){return typeof e.shouldTrigger=="boolean"?e.shouldTrigger?"should trigger":"should not trigger":typeof e.expectedTrigger=="boolean"?e.expectedTrigger?"should trigger":"should not trigger":a(e,"expected")??a(e,"kind")??a(e,"type")}function nl(e){return typeof e.triggered=="boolean"?e.triggered?"triggered":"did not trigger":typeof e.actualTrigger=="boolean"?e.actualTrigger?"triggered":"did not trigger":a(e,"actual")??a(e,"classification")??a(e,"decision")}function il(e){return typeof e.passed=="boolean"?e.passed?"pass":"fail":typeof e.pass=="boolean"?e.pass?"pass":"fail":a(e,"status")}function rl(e,t,n,i){let r=W(i),s=a(e,"skillSlug")??G(t),o=[`${r.ok("OK")} Created ${n}.`,"",r.section("Local Skill")];o.push(` ${r.label("Path")}: ${n}`),o.push(` ${r.label("Skill")}: ${s}`);let l=a(e,"skillType"),c=a(e,"category");return l&&o.push(` ${r.label("Type")}: ${l}`),c&&o.push(` ${r.label("Category")}: ${c}`),o.push("",r.section("Next")),o.push(` ${r.arrow} Edit ${n}`),o.push(` ${r.arrow} skills-layer validate ${t}`),o.push(` ${r.arrow} skills-layer preview-trigger ${t} --should-trigger "<prompt>" --should-not-trigger "<prompt>"`),o.push(` ${r.arrow} skills-layer creator submit ${t} --dry-run`),o.join(`
862
- `)}function sl(e,t,n){let i=S(e,"profile")??e,r=_t(i,"requirementsCurrentlyDue"),s=_t(i,"requirementsPastDue"),o=_t(i,"requirementsPendingVerification"),l=["payouts","Enabled"].join(""),c=i.readyForPayouts??i[l],u=c===!0,d=[`${n.ok("OK")} ${t}`,"",n.section("Payout Profile")];return d.push(` ${n.label("Status")}: ${Ze(a(i,"status"))}`),d.push(` ${n.label("Ready for payouts")}: ${pi(c)}`),d.push(` ${n.label("Account details submitted")}: ${pi(i.detailsSubmitted)}`),d.push(` ${n.label("Currency")}: ${Ze(a(i,"currency")?.toUpperCase())}`),d.push(` ${n.label("Country")}: ${Ze(a(i,"country")?.toUpperCase())}`),d.push(` ${n.label("Minimum withdrawal")}: ${ll(i)}`),d.push(` ${n.label("Updated at")}: ${Ze(a(i,"updatedAt"))}`),d.push("",n.section("Requirements")),d.push(` ${n.label("Currently due")}: ${At(r)}`),d.push(` ${n.label("Past due")}: ${At(s)}`),d.push(` ${n.label("Pending verification")}: ${At(o)}`),d.push("",n.section("Next")),u?(d.push(` ${n.arrow} skills-layer creator earnings`),d.push(` ${n.arrow} skills-layer creator withdraw --amount-cents <amount>`),d.push(` ${n.arrow} skills-layer creator payouts`)):(d.push(` ${n.arrow} skills-layer creator payout-link`),d.push(` ${n.arrow} skills-layer creator earnings`)),d.join(`
863
- `)}function ol(e,t,n){let i=Nt(e),r=an(e,"withdrawableBalanceCents"),s=[`${n.ok("OK")} ${t}`,"",n.section("Earnings Summary")];return s.push(` ${n.label("Gross sales")}: ${q(e,"successfulSalesCents",i)}`),s.push(` ${n.label("Platform fees")}: ${q(e,"platformFeeCents",i)}`),s.push(` ${n.label("Refunds requested")}: ${q(e,"refundRequestedCents",i)}`),s.push(` ${n.label("Refunded")}: ${q(e,"refundedCents",i)}`),s.push(` ${n.label("Estimated available")}: ${q(e,"estimatedAvailableCents",i)}`),s.push(` ${n.label("Withdrawable now")}: ${q(e,"withdrawableBalanceCents",i)}`),s.push(` ${n.label("Held balance")}: ${q(e,"heldBalanceCents",i)}`),s.push(` ${n.label("Refund exposure")}: ${q(e,"refundExposureCents",i)}`),s.push("",n.section("Activity")),s.push(` ${n.label("Successful purchases")}: ${gi(e,"successfulPurchaseCount")}`),s.push(` ${n.label("Refund requests")}: ${gi(e,"refundRequestedCount")}`),s.push(` ${n.label("Pending payouts")}: ${q(e,"pendingPayoutCents",i)}`),s.push(` ${n.label("Completed payouts")}: ${q(e,"completedPayoutCents",i)}`),s.push("",n.section("Guidance")),r>0?(s.push("1. You have a withdrawable balance available."),s.push("2. Confirm payout setup is ready before requesting withdrawal.")):(s.push("1. No withdrawable balance yet."),s.push("2. Sales will appear here after paid purchases settle.")),s.push("",n.section("Next")),r>0&&s.push(` ${n.arrow} skills-layer creator withdraw --amount-cents ${r}`),s.push(` ${n.arrow} skills-layer creator payout-profile`),s.push(` ${n.arrow} skills-layer creator payouts`),s.join(`
864
- `)}function al(e,t,n){let i=Array.isArray(e.results)?e.results:[],r=Nt(e,i),s=an(e,"withdrawableBalanceCents"),o=[`${n.ok("OK")} ${t}`,"",n.section("Payout History")];return o.push(` ${n.label("Withdrawable now")}: ${q(e,"withdrawableBalanceCents",r)}`),o.push(` ${n.label("Pending payouts")}: ${q(e,"pendingPayoutCents",r)}`),o.push(` ${n.label("Completed payouts")}: ${q(e,"completedPayoutCents",r)}`),o.push("",n.section(`Requests (${i.length})`)),i.length===0?o.push(` ${n.muted("No payout requests yet.")}`):(i.slice(0,O).forEach((l,c)=>{if(!R(l)){o.push(`${c+1}. ${H("",l)}`);return}let u=Nt(l,void 0,r),d=a(l,"payoutId")??a(l,"id")??`Payout ${c+1}`,p=a(l,"status")??"unknown",y=q(l,"amountCents",u),m=a(l,"requestedAt"),h=a(l,"completedAt"),w=a(l,"reason");o.push(`${c+1}. ${d}`),o.push(` ${n.label("Amount")}: ${y}; ${n.label("Status")}: ${p}`),m&&o.push(` ${n.label("Requested")}: ${m}`),h&&o.push(` ${n.label("Completed")}: ${h}`),w&&o.push(` ${n.label("Reason")}: ${w}`)}),i.length>O&&o.push(` ${n.muted(`... ${i.length-O} more`)}`)),o.push("",n.section("Guidance")),i.length===0?o.push("1. Payouts appear here after you request a withdrawal."):o.push("1. Use this history to track requested, processing, paid, or failed payouts."),o.push("2. Check payout profile if setup or verification looks incomplete."),o.push("",n.section("Next")),s>0&&o.push(` ${n.arrow} skills-layer creator withdraw --amount-cents ${s}`),o.push(` ${n.arrow} skills-layer creator earnings`),o.push(` ${n.arrow} skills-layer creator payout-profile`),o.join(`
865
- `)}function Nt(e,t,n="GBP"){let i=a(e,"currency");if(i)return i.toUpperCase();let r=t?.find(R);if(r){let s=a(r,"currency");if(s)return s.toUpperCase()}return n}function an(e,t){return ce(e,t)??0}function gi(e,t){return ce(e,t)??0}function q(e,t,n){return`${Yi(an(e,t))} ${n}`}function _t(e,t){return(ne(e,t)??[]).map(n=>n.replace(/[._-]+/gu," "))}function At(e){return e.length>0?e.join(", "):"none"}function pi(e){return e===!0?"yes":e===!1?"no":"unknown"}function Ze(e){return e??"none"}function ll(e){let t=ce(e,"minimumWithdrawalAmountCents"),n=a(e,"currency")?.toUpperCase()??"minor units";return t===void 0?"none":`${Yi(t)} ${n}`}function Yi(e){return(e/100).toFixed(2).replace(/\.00$/u,"").replace(/(\.\d)0$/u,"$1")}function W(e){let t=cl(e);return{ok:n=>t?we(32,n):n,section:n=>t?we(1,we(36,n)):n,label:n=>t?we(1,n):n,muted:n=>t?we(2,n):n,arrow:t?we(36,"->"):"->"}}function cl(e){let t=e?.env??{};if(t.NO_COLOR)return!1;let n=t.FORCE_COLOR;return n&&n!=="0"?!0:!!e?.stdoutIsTty&&t.TERM!=="dumb"&&n!=="0"}function we(e,t){return`\x1B[${e}m${t}\x1B[0m`}function Qi(e,t){let n=[],i=dl(e,t);i.length>0&&n.push(...i);for(let[r,s]of ml(e))if(Array.isArray(s))n.push(...ul(r,s,t));else if(R(s)){let o=Me(s);o&&n.push(` ${t.label(Ft(r))}: ${o}`)}else n.push(` ${t.label(Ft(r))}: ${H(r,s)}`);return n}function ul(e,t,n){let i=fl(e),r=[n.section(`${i} (${t.length})`)];return t.length===0?(r.push(` ${n.muted("No entries.")}`),r):(t.slice(0,O).forEach((s,o)=>{r.push(...Zi(s,o,n))}),t.length>O&&r.push(` ${n.muted(`... ${t.length-O} more`)}`),r)}function Zi(e,t,n){if(!R(e))return[`${t+1}. ${H("",e)}`];let i=Ot(e)??Q(Me(e))??`Item ${t+1}`,r=[`${t+1}. ${i}`],s=er(e);s&&r.push(` ${s}`);let o=Me(e);return o&&r.push(` ${o}`),r}function dl(e,t){let n=[],i=e.securityScore,r=a(e,"recommendation"),s=S(e,"capabilityProfile"),o=s?a(s,"runtimeRisk"):void 0;return(i!==void 0||r||o)&&(n.push(t.section("Trust")),i!==void 0&&n.push(` ${t.label("Security score")}: ${H("securityScore",i)}`),o&&n.push(` ${t.label("Runtime risk")}: ${o}`),r&&n.push(` ${t.label("Recommendation")}: ${r}`)),n}function gl(e,t,n){let i=W(n),r=a(e,"skillSlug")??t,s=a(e,"runtimeRisk")??(S(e,"capabilityProfile")?a(S(e,"capabilityProfile"),"runtimeRisk"):void 0),o=[`${i.ok("OK")} Creator security report loaded.`,"",i.section("Creator Security")];e.securityScore!==void 0&&o.push(` ${i.label("Security score")}: ${H("securityScore",e.securityScore)}`),s&&o.push(` ${i.label("Runtime risk")}: ${s}`);let l=a(e,"recommendation");l&&o.push(` ${i.label("Recommendation")}: ${l}`),o.push(` ${i.label("Skill")}: ${r}`);let c=a(e,"version");c&&o.push(` ${i.label("Version")}: ${c}`);let u=["semantic","review","no","reviewable","findings"].join("_"),d=ve(e.reviewDegradedReasons).includes(u),p=ve(e.trustBadges).filter(h=>h==="capability-mismatch"),y=ve(e.trustBadges).filter(h=>h!=="capability-mismatch");(d||p.length>0)&&(o.push("",i.section("Creator Notes")),d&&o.push("1. Semantic review was not needed because there were no reviewable findings."),p.forEach((h,w)=>{o.push(`${d?w+2:w+1}. ${h==="capability-mismatch"?"Capability declaration needs review.":h}`)})),y.length>0&&(o.push("",i.section(`Trust badges (${y.length})`)),y.slice(0,O).forEach((h,w)=>o.push(`${w+1}. ${h}`)));let m=Array.isArray(e.findings)?e.findings:[];return o.push("",i.section(`Findings (${m.length})`)),m.length===0?o.push(` ${i.muted("No entries.")}`):m.slice(0,O).forEach((h,w)=>{o.push(...Zi(h,w,i))}),o.push("",i.section("Next")),o.push(` ${i.arrow} skills-layer creator rescan-security ${r}`),o.push(` ${i.arrow} skills-layer creator status ${r}`),o.push(` ${i.arrow} skills-layer trust ${r}`),o.join(`
866
- `)}function pl(e,t,n){let r=S(e,"report")??e,s=W(n),o=r.securityScore,l=a(r,"generatedAt")??a(r,"reportGeneratedAt"),c=Array.isArray(r.findings)?r.findings:void 0,u=[`${s.ok("OK")} Security rescan requested.`,"",s.section("Creator Security")];return u.push(` ${s.label("Skill")}: ${a(r,"skillSlug")??t}`),o!==void 0&&u.push(` ${s.label("Security score")}: ${H("securityScore",o)}`),c&&u.push(` ${s.label("Findings")}: ${c.length}`),l&&u.push(` ${s.label("Generated at")}: ${l}`),u.push("",s.section("Next")),u.push(` ${s.arrow} skills-layer creator security-report ${t}`),u.push(` ${s.arrow} skills-layer creator status ${t}`),u.join(`
867
- `)}function ml(e){return Object.entries(e).filter(([t,n])=>Xi(t,n))}function Xi(e,t){let n=e.toLowerCase();return n==="status"||n==="securityscore"||n==="recommendation"||n==="capabilityprofile"||n.includes("apikey")||n.includes("secret")||n.includes("token")||n==="content"?!1:t!==void 0}function Me(e){let n=[["id","id"],["name","name"],["keyPrefix","prefix"],["slug","slug"],["skillSlug","skill"],["currentVersion","version"],["version","version"],["category","category"],["skillType","type"],["type","type"],["visibility","visibility"],["status","status"],["count","count"],["email","email"],["role","role"],["selectedBackend","backend"],["selectedBaseUrl","base url"],["path","path"],["downloadUrl","download url"],["authorizationUrl","authorization url"],["checkoutUrl","checkout url"],["url","url"],["issueId","issue"],["reviewId","review"],["purchaseId","purchase"],["workspaceId","workspace"],["clientId","client"],["environment","environment"],["expiresAt","expires"],["lastUsedAt","last used"],["revocable","revocable"],["revokeCommand","revoke"],["deploymentId","deployment"],["source","source"],["scope","scope"],["agent","agent"],["bytes","bytes"],["fileCount","file count"],["bodyWordCount","body words"]].flatMap(([r,s])=>{if(!Xi(r,e[r]))return[];let o=e[r];return o===void 0?[]:[`${s}: ${H(r,o)}`]}),i=S(e,"securityPosture");if(i){let r=a(i,"label"),s=i.securityScore,o=a(i,"runtimeRisk");r&&n.push(`trust: ${r}`),s!==void 0&&n.push(`score: ${H("securityScore",s)}`),o&&n.push(`risk: ${o}`)}return n.join("; ")}function er(e){return a(e,"shortDescription")??a(e,"summary")??a(e,"description")??a(e,"message")}function Ot(e){return a(e,"displayName")??a(e,"name")??a(e,"title")??a(e,"slug")??a(e,"skillSlug")??a(e,"code")??a(e,"id")}function H(e,t){return e==="downloadUrl"?"<hidden; use --json or --output>":typeof t=="string"?be(t):typeof t=="number"||typeof t=="boolean"?String(t):t===null?"none":Array.isArray(t)?`${t.length} item${t.length===1?"":"s"}`:R(t)?Me(t)||"details available with --json":String(t)}function be(e){let t=e.replace(/\s+/gu," ").trim();return t.length>160?`${t.slice(0,157)}...`:t}function fl(e){return lt(Ft(e))}function Ft(e){return e.replace(/([a-z0-9])([A-Z])/gu,"$1 $2").replace(/[_-]+/gu," ").toLowerCase()}function tr(e){let t=hl(e),n=t?[`skills-layer show ${t}`,`skills-layer trust ${t}`,`skills-layer install ${t}`]:[],i=typeof e.downloadUrl=="string",r=Array.isArray(e.materializedWrites)&&e.materializedWrites.length>0;return i&&n.push("Use --output <path> to write exports without printing temporary download URLs"),r&&n.push("Review the materialized files in this workspace"),e.valid===!0&&n.push("skills-layer creator submit <path> --dry-run"),n}function hl(e){let t=a(e,"skillSlug")??a(e,"slug");if(t)return t;let n=e.results;if(Array.isArray(n)){for(let i of n)if(R(i)){let r=a(i,"skillSlug")??a(i,"slug");if(r)return r}}}function R(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function k(e,t){return{exitCode:1,stdout:"",stderr:t?JSON.stringify({status:"error",summary:e,why:null,nextAction:null,nextStep:null,data:{error:e},warnings:[],links:[],reasonCode:null,handoff:null},null,2):e}}function j(e,t,n,i){let r={status:a(e,"status")??"error",summary:t,why:a(e,"why")??null,nextAction:a(e,"nextAction")??null,nextStep:a(e,"nextStep")??null,data:e,warnings:Array.isArray(e.warnings)?e.warnings:[],links:Array.isArray(e.links)?e.links:[],reasonCode:i??a(e,"reasonCode")??null,handoff:e.handoff??null};return{exitCode:1,stdout:"",stderr:n?JSON.stringify(r,null,2):t}}function ot(e,t){let n=e.details??{};return e.status===401?j({status:"login_required",error:"Login required.",nextAction:"login",nextStep:"Run `skills-layer login` to sign in, then retry this command."},"Login required. Run `skills-layer login` to sign in, then retry this command.",t,"login_required"):k(a(n,"error")??e.message,t)}async function z(e){try{return JSON.parse(await Oe(e,"utf8"))}catch{return null}}async function yl(e,t){let n=await z(e);return n?Bn(n,{env:t.env,platform:t.platform,store:t.credentialStore}):null}async function ln(e,t,n){let i=await Un(t,{env:n.env,platform:n.platform,store:n.credentialStore});await K(e,i)}async function K(e,t){await nr(oe(e)),await Ht(e,`${JSON.stringify(t,null,2)}
868
- `,{encoding:"utf8",mode:384}),await cn(e,384)}async function nr(e){await Ne(e,{recursive:!0,mode:448}),await cn(e,448)}async function cn(e,t){if(process.platform!=="win32")try{await yi(e,t)}catch{}}async function te(e,t){await Ne(oe(e),{recursive:!0}),await Ht(e,t,"utf8")}async function qt(e,t){await Ne(oe(e),{recursive:!0}),await Ht(e,t)}function kl(e=process.stdin,t=process.stdout,n=zt){return async i=>{if(!e.isTTY||!t.isTTY)throw new Error("Interactive prompt is not available in this environment.");let r=n({input:e,output:t});try{return(await r.question(i)).trim()}finally{r.close()}}}function wl(e=process.stdin,t=process.stdout,n=zt){return async i=>{if(!e.isTTY||!t.isTTY)throw new Error("Interactive secret prompt is not available in this environment.");if(typeof e.setRawMode=="function"&&typeof e.on=="function"&&typeof e.off=="function")return new Promise((s,o)=>{let l=e,c=l.isRaw===!0,u="",d=!1,p=m=>{d||(d=!0,l.off("data",y),l.setRawMode(c),l.pause?.(),t.write(`
910
+ Waiting for browser sign-in to finish...`)}else i.emitInfo(`${a} sign-in started. Finish the login in your browser, then come back here. Waiting for browser sign-in to finish...`);let c=await ja(o,i);return H(c)?c:c.status==="verified"||c.status==="recovered"?await rt(c.email,{...c},n,i,r==="recovery"?`Recovered access for ${c.email} through ${a}.`:`Verified ${c.email} through ${a}.`):c.status==="already_registered"?f(c,c.linkedAccount===!0?`${a} is now linked to ${c.email}. Run \`skills-layer login\` to sign in.`:`${c.email} is already registered. Run \`skills-layer login\` to sign in, or \`skills-layer auth recover\` if you need account recovery.`,n.json,i):c.status==="linked"?f(c,`${a} sign-in is now connected.`,n.json,i):_a(c)?k(La(c),n.json):k("Social auth completed with an unexpected response.",n.json)}function H(e){return R(e)&&typeof e.exitCode=="number"&&typeof e.stdout=="string"&&typeof e.stderr=="string"}function $a(e){try{let t=JSON.parse(e);return R(t)?t.data:void 0}catch{return}}function _a(e){return e.status==="registration_required"||e.status==="state_expired"||e.status==="provider_mismatch"||e.status==="identity_conflict"||e.status==="email_required"||e.status==="failed"}async function ja(e,t){for(let n=0;n<120;n+=1)try{let i=await b(t,`/api/v1/identity/social/status/${encodeURIComponent(e)}`),r=l(i,"status")??"failed";if(r==="pending"){await t.sleep(1500);continue}return(r==="verified"||r==="recovered")&&l(i,"email")&&l(i,"role")?{status:r,email:l(i,"email"),role:l(i,"role"),roles:re(i,"roles"),userId:l(i,"userId"),apiKey:l(i,"apiKey"),keyPrefix:l(i,"keyPrefix"),emailDelivery:l(i,"emailDelivery")}:r==="already_registered"&&l(i,"email")&&l(i,"role")?{status:r,email:l(i,"email"),role:l(i,"role"),roles:re(i,"roles"),linkedAccount:typeof i.linkedAccount=="boolean"?i.linkedAccount:void 0}:r==="linked"?{status:r}:r==="registration_required"||r==="state_expired"||r==="provider_mismatch"||r==="identity_conflict"||r==="email_required"||r==="failed"?{status:r,error:l(i,"error")}:k("Social auth completed with an unexpected response.",!1)}catch(i){if(i instanceof E&&(i.status===404||i.status===429)){await t.sleep(1500);continue}return k(ue(i),!1)}return k("Timed out while waiting for social auth to complete.",!1)}async function Aa(e,t){for(let n=0;n<120;n+=1)try{let r=(await b(t,"/api/v1/purchases",{headers:M(t.apiKey,t.authBlockedMessage)})).results?.find(s=>s.purchaseId===e);if(!r?.status||r.status==="pending"||r.status==="requires_action"){await t.sleep(1500);continue}return{status:r.status,purchaseId:e}}catch(i){if(i instanceof E&&i.status===429){await t.sleep(1500);continue}return k(ue(i),!1)}return k("Timed out while waiting for purchase confirmation.",!1)}async function Ia(e,t){for(let n=0;n<120;n+=1)try{let i=await b(t,`/api/v1/me/private-skill-charges/${encodeURIComponent(e)}`,{headers:M(t.apiKey,t.authBlockedMessage)}),r=l(i,"status");if(!r||r==="checkout_required"||r==="pending"||r==="requires_action"){await t.sleep(1500);continue}return{...i,status:r}}catch(i){if(i instanceof E&&i.status===429){await t.sleep(1500);continue}return k(ue(i),!1)}return k("Timed out while waiting for payment confirmation.",!1)}function Ea(e){let t=S(e,"accountLink");return(t?l(t,"url"):void 0)??l(e,"url")??l(e,"setupUrl")}function La(e){return e.status==="registration_required"?e.error??"No verified account exists for this social identity. Use `skills-layer register` first.":e.status==="state_expired"?"Social auth expired before completion. Start the flow again.":e.status==="provider_mismatch"?"The browser completed a different social provider than the one the CLI started.":e.status==="identity_conflict"?e.error??"This social identity is already linked to another account.":e.status==="email_required"?e.error??"This social profile did not provide an email address.":e.error??"Social auth could not be completed."}async function Ue(e,t,n={}){let r=n.forceProfileValidation===!0||!n.knownEmail||!n.knownRole?await b({...e,apiKey:t},"/api/v1/me",{headers:{...M(t),...n.notifyLogin?{"x-skills-layer-session-intent":"login"}:{}}}):{userId:n.knownUserId,email:n.knownEmail,role:n.knownRole,roles:n.knownRoles},s=l(r,"email")??n.knownEmail??"unknown";if(n.expectedEmail&&s.toLowerCase()!==n.expectedEmail.toLowerCase())throw new Error(`The entered API key belongs to ${s}, not ${n.expectedEmail}. Use the API key emailed to ${n.expectedEmail}.`);let o=await b({...e,apiKey:t},"/api/v1/capabilities",{headers:M(t)}),a={version:Si,baseUrl:e.baseUrl,apiKey:t,edition:l(o,"edition")??l(r,"edition")??"saas",userId:l(r,"userId")??n.knownUserId,email:s,role:l(r,"role")??n.knownRole??"user",roles:re(r,"roles")??n.knownRoles,lastSelectedAgent:e.config?.lastSelectedAgent,savedAt:e.now()};return await un(e.paths.configPath,a,e),await D(e.paths.backendPreferencePath,{version:Vt,preferredBaseUrl:e.baseUrl,savedAt:e.now()}),a}function gi(e,t){let n=lt(e.actionJson,"action-json");if(n&&typeof n=="object"&&!Array.isArray(n))return n;let i=g(e.action);return t==="incident"?{type:"file_write",path:g(e.path)??".skills-layer/incidents/guardian-incident.json"}:i==="file_read"||i==="file_write"?{type:i,path:g(e.path)??"."}:i==="shell_command"?{type:"shell_command",command:"unspecified"}:{type:"api_call",...i?{target:i}:{}}}async function C(e,t,n,i,r={}){let s=r.authenticated?M(n.apiKey,n.authBlockedMessage):Ke(n.apiKey);return await st(e,{headers:s},t,n,i)}async function Ta(e,t){let n=await b(t,"/api/v1/doctor",{headers:Ke(t.apiKey)}),i=await qe(t),r=await ra(t),s=[...Qi(n),aa(i,r)];return f({...n,guardian:{...i,policy:r},checks:s},"Doctor checks loaded.",e.json,t)}async function q(e,t,n,i,r){return await st(e,{method:"POST",headers:_(i.apiKey),body:JSON.stringify(j(t))},n,i,r)}async function Be(e,t,n,i,r){return await st(e,{method:"PATCH",headers:_(i.apiKey),body:JSON.stringify(j(t))},n,i,r)}async function st(e,t,n,i,r){let s=await b(i,e,t);return f(s,r,n.json,i)}async function b(e,t,n={}){let i=await e.fetchFn(`${e.baseUrl}${t}`,n).catch(o=>{throw new Error(`Unable to reach ${e.baseUrl}. ${ue(o)}`)});if(!i.ok)throw await Ua(i);let r=await i.text();if(!r)return{};let s=JSON.parse(r);return s&&typeof s=="object"&&!Array.isArray(s)&&"data"in s?s.data:s}async function Ua(e){let t=await e.text();if(t)try{let n=JSON.parse(t);return new E(e.status,l(n,"error")??(e.statusText||"Request failed"),n)}catch{return new E(e.status,t)}return new E(e.status,e.statusText||"Request failed")}function M(e,t){if(t)throw new Error(t);if(!e)throw new Error("This command requires login. Run `skills-layer login` first.");return{authorization:`Bearer ${e}`}}function Ke(e){return e?{authorization:`Bearer ${e}`}:{}}function _(e){return{"content-type":"application/json",...Ke(e)}}async function ot(e){let t=await ls(e);if(t.isFile())return[{path:K(e),content:await Oe(e,"utf8")}];if(!t.isDirectory())throw new Error(`Unsupported path: ${e}`);let n=[];if(await Wi(e,e,n),n.length===0)throw new Error(`No readable files found in ${e}.`);return n.sort((i,r)=>i.path.localeCompare(r.path))}async function Wi(e,t,n){for(let i of await bi(t,{withFileTypes:!0})){if(Ba(i.name))continue;let r=A(t,i.name);if(i.isDirectory()){await Wi(e,r,n);continue}if(!i.isFile())continue;let s=Te(e,r).split("\\").join("/");try{n.push({path:s,content:await Oe(r,"utf8")})}catch{continue}}}function Ba(e){return e===".git"||e==="node_modules"||e==="coverage"||e===Ma()||e==="dist"}function Ma(){return[46,68,83,95,83,116,111,114,101].map(e=>String.fromCharCode(e)).join("")}async function Nt(e,t){if(/^https?:\/\//u.test(e)||/^[a-z]+:/iu.test(e))return;let n=W(t,e);try{return await wi(n),{sourceMetadata:{kind:"local",input:e,canonicalSource:`local:${e}`},files:await ot(n)}}catch{return}}async function Ct(e,t){let n=Na(t);if(n.length===0)return t;let i=[];for(let r of n){let s=Vi(r.path),o=W(e.cwd,s),a=Te(e.cwd,o);if(!a||a.startsWith("..")||Se.isAbsolute(a))throw new Error(`Cloud install plan attempted to write outside the current workspace: ${r.path}`);if(await ie(o,r.content),i.push({path:s,bytes:new TextEncoder().encode(r.content).length}),K(s).toLowerCase()==="skill.md"){let c=l(t,"skillSlug")??l(t,"slug")??K(X(s)),u=await an({backend:e,skillSlug:c,version:l(t,"version"),skillDocumentPath:o,skillDocumentContent:r.content});i.push(u)}}return{...t,materializedWrites:i}}function Na(e){return[...Rt(e.localWrites),...Rt(S(e,"installPlan")?.localWrites),...Rt(S(e,"materializationPlan")?.localWrites)]}function Rt(e){return Array.isArray(e)?e.flatMap(t=>{if(!t||typeof t!="object"||Array.isArray(t))return[];let n=t,i=g(n.path),r=typeof n.content=="string"?n.content:void 0;return i&&r!==void 0?[{path:i,content:r}]:[]}):[]}function Vi(e){let t=e.replaceAll("\\","/").replace(/^\.\/+/u,"");if(!t||t.includes("\0")||zt.isAbsolute(t)||Se.isAbsolute(e)||t.split("/").includes(".."))throw new Error(`Cloud install plan returned an unsafe local write path: ${e}`);return t}async function Oa(e,t){let n=l(e,"apiKey");if(!n)return;let i={version:Si,baseUrl:t.baseUrl,apiKey:n,edition:l(e,"edition")??t.config?.edition??"saas",userId:l(e,"userId")??t.config?.userId,email:l(e,"email")??t.config?.email??"unknown",role:l(e,"role")??t.config?.role??"user",roles:re(e,"roles")??t.config?.roles,lastSelectedAgent:t.config?.lastSelectedAgent,savedAt:t.now()};await un(t.paths.configPath,i,t)}async function fe(e){let t=await V(e.paths.installsPath);if(!R(t))return{version:Gn,installs:{}};let n=R(t.installs)?pi(t.installs):R(t.skills)?pi(t.skills):{};return{version:typeof t.version=="number"?t.version:Gn,installs:n}}async function Yi(e,t){await D(e.paths.installsPath,t)}async function tt(e,t,n){let i=l(t,"skillSlug")??l(t,"slug")??n,r=await fe(e);r.installs[i]={skillSlug:i,...t,savedAt:e.now()},await Yi(e,r)}function pi(e){let t={};for(let[n,i]of Object.entries(e))t[n]=R(i)?i:{skillSlug:n,value:i};return t}var U=5;function f(e,t,n,i){let s={status:e&&typeof e=="object"&&!Array.isArray(e)&&typeof e.status=="string"?String(e.status):"ok",summary:t,why:null,nextAction:null,nextStep:null,data:e,warnings:[],links:[],reasonCode:null,handoff:null};return{exitCode:0,stdout:n?JSON.stringify(s,null,2):Fa(e,t,i),stderr:""}}function Fa(e,t,n){let i=Y(n);if(R(e)){if(t==="Status loaded."&&mi(e))return Ha(e,t,i);if(t==="Doctor checks loaded."&&mi(e))return Ja(e,t,i);if(t==="Creator payout profile loaded.")return gl(e,t,i);if(t==="Creator earnings loaded."||t==="Earnings loaded.")return pl(e,"Creator earnings loaded.",i);if(t==="Creator payouts loaded."||t==="Payouts loaded.")return ml(e,"Creator payouts loaded.",i);if(t==="Guardian check complete.")return Ga(e,t,i);if(t==="Reviews loaded.")return Ka(e,t,i);if(t==="Categories loaded.")return qa(e,t,i)}let r=[`${i.ok("OK")} ${t}`];if(R(e)){let s=tr(e,i);s.length>0&&r.push("",...s);let o=or(e);o.length>0&&r.push("",i.section("Next"),...o.map(a=>` ${i.arrow} ${a}`))}return r.join(`
911
+ `)}function qa(e,t,n){let i=ae(e.results??e.categories??e.data),r=[`${n.ok("OK")} ${t}`,"",n.section(`Categories (${i.length})`)];return i.length===0?(r.push(` ${n.muted("No categories returned.")}`),r.join(`
912
+ `)):(i.slice(0,U).forEach((s,o)=>{let a=l(s,"slug")??l(s,"category")??l(s,"name")??`category-${o+1}`,c=l(s,"name")??a,u=s.count;r.push(`${o+1}. ${sr(c)}`);let d=[a?`slug: ${a}`:void 0,u!==void 0?`count: ${J("count",u)}`:void 0].filter(p=>!!p);d.length>0&&r.push(` ${d.join("; ")}`)}),i.length>U&&r.push(` ${n.muted(`... ${i.length-U} more`)}`),r.join(`
913
+ `))}function Ka(e,t,n){let i=ae(e.reviews??e.results),r=[`${n.ok("OK")} ${t}`,"",n.section(`Reviews (${i.length})`)];return i.length===0&&r.push(` ${n.muted("No reviews yet.")}`),i.forEach((s,o)=>{let a=l(s,"reviewId")??l(s,"id"),u=l(s,"skillSlug")??l(s,"slug")??l(s,"skill")??a??`Review ${o+1}`,d=s.rating??s.score,p=l(s,"status"),y=l(s,"updatedAt")??l(s,"createdAt"),m=[a?`review: ${a}`:void 0,d!=null?`rating: ${J("rating",d)}`:void 0,p?`status: ${p}`:void 0,y?`updated: ${y}`:void 0].filter(w=>!!w);r.push(`${o+1}. ${u}`),m.length>0&&r.push(` ${m.join("; ")}`);let h=l(s,"feedback")??l(s,"comment")??l(s,"message");h&&r.push(` ${n.label("feedback")}: ${be(h)}`)}),r.join(`
914
+ `)}function Ga(e,t,n){let i=S(e,"decision"),r=S(e,"enforcement"),s=S(e,"auditEvent"),o=L(i,"status")??L(r,"status")??"unknown",a=L(r,"actionType")??L(s,"actionType")??"action",c=L(i,"capability")??L(r,"capability")??"not specified",u=L(i,"reasonCode")??L(r,"reasonCode")??"not specified",d=L(i,"message")??L(r,"message")??"Guardian policy resolved this action.",p=L(s,"skillSlug")??"unknown",y=L(s,"version")??"unknown",m=xt(r,"canExecute"),h=xt(r,"auditRequired"),w=xt(r,"telemetryRequired"),P=o==="blocked"?"BLOCKED":o==="allowed"?"ALLOWED":"WARNING",x=[`${n.ok("OK")} ${t}`,"",n.section(`${P} ${Da(a)}`),` ${n.label("Skill")}: ${p}`,` ${n.label("Version")}: ${y}`,` ${n.label("Capability")}: ${c}`,` ${n.label("Reason")}: ${d}`,` ${n.label("Reason code")}: ${u}`,` ${n.label("Can execute")}: ${m===!0?"yes":"no"}`,` ${n.label("Audit required")}: ${h===!1?"no":"yes"}`,` ${n.label("Cloud telemetry")}: ${w===!0?"yes":"no"}`,"",n.section("Next")];return o==="blocked"?x.push(` ${n.arrow} Do not run this action.`,` ${n.arrow} Review \`skills-layer trust ${p}\`.`,` ${n.arrow} Run \`skills-layer guardian incident --skill ${p} --version ${y} --path <installed-skill-path> --reason "<reason>"\` if this was unexpected.`):x.push(` ${n.arrow} Continue only with the action Guardian evaluated.`,` ${n.arrow} Re-run guardian check if the action changes.`),x.join(`
915
+ `)}function xt(e,t){if(R(e))return typeof e[t]=="boolean"?e[t]:void 0}function L(e,t){return R(e)?l(e,t):void 0}function Da(e){return e.split(/[_-]+/u).filter(Boolean).map(t=>`${t[0]?.toUpperCase()??""}${t.slice(1)}`).join(" ")}function mi(e){return!!(S(e,"backend")&&S(e,"auth")&&Array.isArray(e.checks))}function Ha(e,t,n){let i=[`${n.ok("OK")} ${t}`,"",n.section("Readiness")],r=l(e,"summary");r&&i.push(` ${r}`);let s=S(e,"backend"),o=s?Ya(s):void 0;o&&i.push(` ${n.label("Backend")}: ${o}`);let a=S(e,"auth"),c=a?Za(a):void 0;c&&i.push(` ${n.label("Account")}: ${c}`);let u=a?ce(a,"workspaceCount"):void 0;u!==void 0&&i.push(` ${n.label("Workspaces")}: ${u}`);let d=a?ce(a,"libraryCount"):void 0;d!==void 0&&i.push(` ${n.label("Owned skills")}: ${d}`);let p=Zi(e);return p.length>0&&i.push("",n.section("Next"),...p.map(y=>` ${n.arrow} ${y}`)),i.push(` ${n.arrow} Run \`skills-layer doctor\` for diagnostics.`),i.join(`
916
+ `)}function Ja(e,t,n){let i=[`${n.ok("OK")} ${t}`,"",n.section("Diagnostics")],r=l(e,"summary");r&&i.push(` ${r}`);let s=l(e,"status");s&&i.push(` ${n.label("Status")}: ${s}`);let o=Qi(e),a=o.filter(d=>Qa(l(d,"status"))),c=o.filter(d=>l(d,"status")!=="pass");i.push(a.length===0?" No blocking issues found.":` ${a.length} check${a.length===1?"":"s"} need attention.`),a.length===0&&c.length>0&&i.push(` Advisory checks needing attention: ${c.length}.`),i.push("",n.section(`Checks (${o.length})`)),o.length===0&&i.push(` ${n.muted("No checks returned by the backend.")}`),o.forEach((d,p)=>{let y=l(d,"status")??"unknown",m=l(d,"title")??l(d,"id")??`Check ${p+1}`;i.push(`${p+1}. ${n.label(`[${y}] ${m}`)}`);let h=l(d,"summary");h&&i.push(` ${h}`);let w=l(d,"why");if(w&&i.push(` ${n.label("Why")}: ${w}`),y!=="pass"){let P=l(d,"nextStep");P&&i.push(` ${n.label("Fix")}: ${P}`);let x=l(d,"recommendedCommand");x&&i.push(` ${n.label("Try")}: ${x}`)}});let u=Zi(e);return u.length>0&&i.push("",n.section(a.length>0?"Recommended Fix":"Next"),...u.map(d=>` ${n.arrow} ${d}`)),i.join(`
917
+ `)}function za(e,t,n,i){let r=[`${n.ok("OK")} ${t}`],s=re(e,"requestedSlugs");s&&s.length>0&&r.push("",n.section("Requested"),` ${s.join(", ")}`);let o=ae(e.results);r.push("",n.section(`Comparison (${o.length})`)),o.length===0&&r.push(` ${n.muted("No comparable skills returned.")}`),o.forEach((d,p)=>{let y=Ft(d)??`Skill ${p+1}`;r.push(`${p+1}. ${y}`);let m=Wa(d);m&&r.push(` ${m}`);let h=rr(d);h&&r.push(` ${n.label("summary")}: ${i?h.replace(/\s+/gu," ").trim():be(h)}`)});let a=ae(e.missing);a.length>0&&(r.push("",n.section(`Missing (${a.length})`)),a.forEach((d,p)=>{let y=l(d,"slug")??l(d,"skillSlug")??Ft(d)??`Entry ${p+1}`,m=l(d,"reason")??l(d,"status");r.push(`${p+1}. ${m?`${y} - ${m}`:y}`)}));let c=re(e,"guidance")??ve(e.guidance);c.length>0&&r.push("",n.section("Guidance"),...c.slice(0,3).map(d=>` ${n.arrow} ${be(d)}`));let u=Va(o);return u.length>0&&r.push("",n.section("Next"),...u.map(d=>` ${n.arrow} ${d}`)),r.join(`
918
+ `)}function Wa(e){let t=S(e,"securityPosture"),n=l(e,"trust")??l(e,"trustStatus")??l(e,"trustLabel")??(t?l(t,"label"):void 0),i=e.score??e.securityScore??(t?t.securityScore:void 0),r=l(e,"risk")??l(e,"runtimeRisk")??(t?l(t,"runtimeRisk"):void 0);return[["slug",l(e,"slug")??l(e,"skillSlug")],["version",l(e,"version")??l(e,"currentVersion")],["category",l(e,"category")],["type",l(e,"type")??l(e,"skillType")],["trust",n],["score",i],["risk",r]].flatMap(([o,a])=>a==null||a===""?[]:[`${o}: ${J(String(o),a)}`]).join("; ")}function Va(e){let t=[];for(let n of e.slice(0,5)){let i=l(n,"slug")??l(n,"skillSlug");i&&t.push(`skills-layer show ${i}`,`skills-layer trust ${i}`,`skills-layer install ${i}`)}return t}function Ya(e){let t=l(e,"edition"),n=l(e,"baseUrl");return t&&n?`${t} at ${n}`:t??n}function Za(e){let t=l(e,"state");if(t&&t!=="authenticated")return t==="anonymous"?"not signed in":t;let n=l(e,"email"),i=re(e,"roles");return n&&i&&i.length>0?`${n} (${i.join(", ")})`:n??l(e,"role")}function Zi(e){let t=[],n=l(e,"recommendedCommand");n&&t.push(n);let i=l(e,"nextStep");return i&&t.push(i),t}function Qi(e){return Array.isArray(e.checks)?e.checks.filter(R):[]}function Qa(e){return e!==void 0&&e!=="pass"&&e!=="warn"&&e!=="advisory"}function ae(e){return Array.isArray(e)?e.filter(R):[]}function ve(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function Xa(e){let t=e.commerce===!0;return{status:t?"available":"unavailable",summary:t?"Marketplace purchases, invoices, refunds, and creator commerce flows are available.":"Marketplace commerce is not available on this backend.",availableWorkflows:t?["Browse skills with `skills-layer featured` or `skills-layer search <query>`.","Start purchase handoff with `skills-layer buy <skill-slug>`.","Review account purchases with `skills-layer purchases list`."]:["Browse and install available free skills.","Use `skills-layer help topic install` for install guidance."]}}var el={"core.identity":"Account and sign-in","core.catalog":"Catalog discovery","core.validation":"Creator validation","core.creator":"Creator submissions","core.library":"Owned skills","core.workspace":"Workspace rollout","core.guardian":"Runtime trust checks","core.source":"Source installs","core.discovery":"Catalog discovery","marketplace.commerce":"Marketplace commerce","marketplace.reviews":"Reviews and issues","marketplace.payouts":"Creator earnings"};function tl(e){let t=ve(e.capabilities);return{status:"ok",edition:l(e,"edition")??"unknown",summary:"Public product capabilities available on the selected backend.",capabilities:t.map(n=>({name:el[n]??ct(n.replace(/^[^.]+\./u,"").replace(/[._-]+/gu," ")),available:!0})),count:t.length}}function nl(e,t){let n=g(e);if(!n)return;let i=Number(n);return!Number.isInteger(i)||i<=0?k("help optimize-tokens --max-characters must be a positive integer.",t):i<120||i>4e3?k("help optimize-tokens --max-characters must be between 120 and 4000.",t):i}function il(e,t,n){let i=Y(n),r=S(e,"validation")??e,s=S(r,"parsedSkill")??S(e,"parsedSkill"),o=s?S(s,"frontmatter"):void 0,a=l(e,"skillSlug")??(o?l(o,"name"):void 0),c=r.valid===!0||e.valid===!0,u=$t(r,e,"issues"),d=$t(r,e,"warnings"),p=$t(r,e,"advice"),y=S(r,"stats")??S(e,"stats"),m=[`${i.ok("OK")} Validation complete.`,"",i.section("Bundle")];if(m.push(` ${i.label("Path")}: ${t}`),a&&m.push(` ${i.label("Skill")}: ${a}`),m.push(` ${i.label("Readiness")}: ${c?"ready for dry-run submission":"needs changes before submission"}`),m.push("",i.section("Checks")),m.push(` ${i.arrow} SKILL.md structure and frontmatter`),m.push(` ${i.arrow} Required bundle files and supported directories`),m.push(` ${i.arrow} Secret hygiene, unsafe script signals, and trust-review readiness`),m.push(` ${i.arrow} Trigger quality inputs for should-trigger / should-not-trigger testing`),y){let h=y.fileCount??y.files??e.fileCount,w=y.bodyWordCount??y.bodyWords??e.bodyWordCount;m.push("",i.section("File Summary")),h!==void 0&&m.push(` ${i.label("File count")}: ${J("fileCount",h)}`),w!==void 0&&m.push(` ${i.label("Body words")}: ${J("bodyWordCount",w)}`)}return m.push("",..._t("Issues",u,i,"No blocking issues found.")),m.push("",..._t("Warnings",d,i,"No warnings returned.")),m.push("",..._t("Advice",p,i,"No extra advice returned.")),m.push("",i.section("Next")),m.push(` ${i.arrow} skills-layer preview-trigger ${t} --should-trigger "<prompt>" --should-not-trigger "<prompt>"`),m.push(` ${i.arrow} skills-layer creator submit ${t} --dry-run`),m.join(`
919
+ `)}function $t(e,t,n){let i=Array.isArray(e[n])?e[n]:[],r=Array.isArray(t[n])?t[n]:[];return i.length>0?i:r}function _t(e,t,n,i){let r=[n.section(`${e} (${t.length})`)];return t.length===0?(r.push(` ${n.muted(i)}`),r):(t.slice(0,U).forEach((s,o)=>{r.push(`${o+1}. ${Xi(s)}`)}),r)}function Xi(e){return R(e)?(l(e,"message")??l(e,"title")??l(e,"code")??l(e,"path")??Me(e))||"Details available with --json":J("",e)}function rl(e,t,n){let i=Y(n),r=sl(e),s=ol(e),o=[`${i.ok("OK")} Trigger preview complete.`,"",i.section("Bundle"),` ${i.label("Path")}: ${t}`],a=l(e,"skillSlug")??l(e,"slug");return a&&o.push(` ${i.label("Skill")}: ${a}`),o.push("",i.section(`Prompt Results (${r.length})`)),r.length===0&&o.push(` ${i.muted("No prompt results returned. Use --json to inspect the raw backend response.")}`),r.slice(0,U).forEach((c,u)=>{o.push(`${u+1}. ${al(c,u)}`)}),o.push("",i.section(`Guidance (${s.length})`)),s.length===0&&o.push(` ${i.muted("No extra trigger guidance returned.")}`),s.slice(0,U).forEach((c,u)=>{o.push(`${u+1}. ${c}`)}),o.push("",i.section("Next")),o.push(` ${i.arrow} skills-layer validate ${t}`),o.push(` ${i.arrow} skills-layer creator submit ${t} --dry-run`),o.join(`
920
+ `)}function sl(e){return[...ae(e.promptResults),...ae(e.results),...ae(e.shouldTriggerResults),...ae(e.shouldNotTriggerResults),...ae(e.paraphraseResults)]}function ol(e){let t=ve(e.guidance),n=ae(e.guidance).map(i=>Xi(i));return[...t,...n]}function al(e,t){let n=l(e,"prompt")??l(e,"text")??l(e,"input")??`Prompt ${t+1}`,i=ll(e),r=cl(e),s=ul(e),o=e.score??e.confidence,a=l(e,"reason")??l(e,"explanation")??l(e,"message");return[`"${be(n)}"`,i?`expected: ${i}`:void 0,r?`actual: ${r}`:void 0,s,o!==void 0?`score: ${J("score",o)}`:void 0,a?`reason: ${be(a)}`:void 0].filter(c=>!!c).join("; ")}function ll(e){return typeof e.shouldTrigger=="boolean"?e.shouldTrigger?"should trigger":"should not trigger":typeof e.expectedTrigger=="boolean"?e.expectedTrigger?"should trigger":"should not trigger":l(e,"expected")??l(e,"kind")??l(e,"type")}function cl(e){return typeof e.triggered=="boolean"?e.triggered?"triggered":"did not trigger":typeof e.actualTrigger=="boolean"?e.actualTrigger?"triggered":"did not trigger":l(e,"actual")??l(e,"classification")??l(e,"decision")}function ul(e){return typeof e.passed=="boolean"?e.passed?"pass":"fail":typeof e.pass=="boolean"?e.pass?"pass":"fail":l(e,"status")}function dl(e,t,n,i){let r=Y(i),s=l(e,"skillSlug")??K(t),o=[`${r.ok("OK")} Created ${n}.`,"",r.section("Local Skill")];o.push(` ${r.label("Path")}: ${n}`),o.push(` ${r.label("Skill")}: ${s}`);let a=l(e,"skillType"),c=l(e,"category");return a&&o.push(` ${r.label("Type")}: ${a}`),c&&o.push(` ${r.label("Category")}: ${c}`),o.push("",r.section("Next")),o.push(` ${r.arrow} Edit ${n}`),o.push(` ${r.arrow} skills-layer validate ${t}`),o.push(` ${r.arrow} skills-layer preview-trigger ${t} --should-trigger "<prompt>" --should-not-trigger "<prompt>"`),o.push(` ${r.arrow} skills-layer creator submit ${t} --dry-run`),o.join(`
921
+ `)}function gl(e,t,n){let i=S(e,"profile")??e,r=jt(i,"requirementsCurrentlyDue"),s=jt(i,"requirementsPastDue"),o=jt(i,"requirementsPendingVerification"),a=["payouts","Enabled"].join(""),c=i.readyForPayouts??i[a],u=c===!0,d=[`${n.ok("OK")} ${t}`,"",n.section("Payout Profile")];return d.push(` ${n.label("Status")}: ${Xe(l(i,"status"))}`),d.push(` ${n.label("Ready for payouts")}: ${hi(c)}`),d.push(` ${n.label("Account details submitted")}: ${hi(i.detailsSubmitted)}`),d.push(` ${n.label("Currency")}: ${Xe(l(i,"currency")?.toUpperCase())}`),d.push(` ${n.label("Country")}: ${Xe(l(i,"country")?.toUpperCase())}`),d.push(` ${n.label("Minimum withdrawal")}: ${fl(i)}`),d.push(` ${n.label("Updated at")}: ${Xe(l(i,"updatedAt"))}`),d.push("",n.section("Requirements")),d.push(` ${n.label("Currently due")}: ${At(r)}`),d.push(` ${n.label("Past due")}: ${At(s)}`),d.push(` ${n.label("Pending verification")}: ${At(o)}`),d.push("",n.section("Next")),u?(d.push(` ${n.arrow} skills-layer creator earnings`),d.push(` ${n.arrow} skills-layer creator withdraw --amount-cents <amount>`),d.push(` ${n.arrow} skills-layer creator payouts`)):(d.push(` ${n.arrow} skills-layer creator payout-link`),d.push(` ${n.arrow} skills-layer creator earnings`)),d.join(`
922
+ `)}function pl(e,t,n){let i=Ot(e),r=cn(e,"withdrawableBalanceCents"),s=[`${n.ok("OK")} ${t}`,"",n.section("Earnings Summary")];return s.push(` ${n.label("Gross sales")}: ${G(e,"successfulSalesCents",i)}`),s.push(` ${n.label("Platform fees")}: ${G(e,"platformFeeCents",i)}`),s.push(` ${n.label("Refunds requested")}: ${G(e,"refundRequestedCents",i)}`),s.push(` ${n.label("Refunded")}: ${G(e,"refundedCents",i)}`),s.push(` ${n.label("Estimated available")}: ${G(e,"estimatedAvailableCents",i)}`),s.push(` ${n.label("Withdrawable now")}: ${G(e,"withdrawableBalanceCents",i)}`),s.push(` ${n.label("Held balance")}: ${G(e,"heldBalanceCents",i)}`),s.push(` ${n.label("Refund exposure")}: ${G(e,"refundExposureCents",i)}`),s.push("",n.section("Activity")),s.push(` ${n.label("Successful purchases")}: ${fi(e,"successfulPurchaseCount")}`),s.push(` ${n.label("Refund requests")}: ${fi(e,"refundRequestedCount")}`),s.push(` ${n.label("Pending payouts")}: ${G(e,"pendingPayoutCents",i)}`),s.push(` ${n.label("Completed payouts")}: ${G(e,"completedPayoutCents",i)}`),s.push("",n.section("Guidance")),r>0?(s.push("1. You have a withdrawable balance available."),s.push("2. Confirm payout setup is ready before requesting withdrawal.")):(s.push("1. No withdrawable balance yet."),s.push("2. Sales will appear here after paid purchases settle.")),s.push("",n.section("Next")),r>0&&s.push(` ${n.arrow} skills-layer creator withdraw --amount-cents ${r}`),s.push(` ${n.arrow} skills-layer creator payout-profile`),s.push(` ${n.arrow} skills-layer creator payouts`),s.join(`
923
+ `)}function ml(e,t,n){let i=Array.isArray(e.results)?e.results:[],r=Ot(e,i),s=cn(e,"withdrawableBalanceCents"),o=[`${n.ok("OK")} ${t}`,"",n.section("Payout History")];return o.push(` ${n.label("Withdrawable now")}: ${G(e,"withdrawableBalanceCents",r)}`),o.push(` ${n.label("Pending payouts")}: ${G(e,"pendingPayoutCents",r)}`),o.push(` ${n.label("Completed payouts")}: ${G(e,"completedPayoutCents",r)}`),o.push("",n.section(`Requests (${i.length})`)),i.length===0?o.push(` ${n.muted("No payout requests yet.")}`):(i.slice(0,U).forEach((a,c)=>{if(!R(a)){o.push(`${c+1}. ${J("",a)}`);return}let u=Ot(a,void 0,r),d=l(a,"payoutId")??l(a,"id")??`Payout ${c+1}`,p=l(a,"status")??"unknown",y=G(a,"amountCents",u),m=l(a,"requestedAt"),h=l(a,"completedAt"),w=l(a,"reason");o.push(`${c+1}. ${d}`),o.push(` ${n.label("Amount")}: ${y}; ${n.label("Status")}: ${p}`),m&&o.push(` ${n.label("Requested")}: ${m}`),h&&o.push(` ${n.label("Completed")}: ${h}`),w&&o.push(` ${n.label("Reason")}: ${w}`)}),i.length>U&&o.push(` ${n.muted(`... ${i.length-U} more`)}`)),o.push("",n.section("Guidance")),i.length===0?o.push("1. Payouts appear here after you request a withdrawal."):o.push("1. Use this history to track requested, processing, paid, or failed payouts."),o.push("2. Check payout profile if setup or verification looks incomplete."),o.push("",n.section("Next")),s>0&&o.push(` ${n.arrow} skills-layer creator withdraw --amount-cents ${s}`),o.push(` ${n.arrow} skills-layer creator earnings`),o.push(` ${n.arrow} skills-layer creator payout-profile`),o.join(`
924
+ `)}function Ot(e,t,n="GBP"){let i=l(e,"currency");if(i)return i.toUpperCase();let r=t?.find(R);if(r){let s=l(r,"currency");if(s)return s.toUpperCase()}return n}function cn(e,t){return ce(e,t)??0}function fi(e,t){return ce(e,t)??0}function G(e,t,n){return`${er(cn(e,t))} ${n}`}function jt(e,t){return(re(e,t)??[]).map(n=>n.replace(/[._-]+/gu," "))}function At(e){return e.length>0?e.join(", "):"none"}function hi(e){return e===!0?"yes":e===!1?"no":"unknown"}function Xe(e){return e??"none"}function fl(e){let t=ce(e,"minimumWithdrawalAmountCents"),n=l(e,"currency")?.toUpperCase()??"minor units";return t===void 0?"none":`${er(t)} ${n}`}function er(e){return(e/100).toFixed(2).replace(/\.00$/u,"").replace(/(\.\d)0$/u,"$1")}function Y(e){let t=hl(e);return{ok:n=>t?we(32,n):n,section:n=>t?we(1,we(36,n)):n,label:n=>t?we(1,n):n,muted:n=>t?we(2,n):n,arrow:t?we(36,"->"):"->"}}function hl(e){let t=e?.env??{};if(t.NO_COLOR)return!1;let n=t.FORCE_COLOR;return n&&n!=="0"?!0:!!e?.stdoutIsTty&&t.TERM!=="dumb"&&n!=="0"}function we(e,t){return`\x1B[${e}m${t}\x1B[0m`}function tr(e,t){let n=[],i=kl(e,t);i.length>0&&n.push(...i);for(let[r,s]of bl(e))if(Array.isArray(s))n.push(...yl(r,s,t));else if(R(s)){let o=Me(s);o&&n.push(` ${t.label(qt(r))}: ${o}`)}else n.push(` ${t.label(qt(r))}: ${J(r,s)}`);return n}function yl(e,t,n){let i=Pl(e),r=[n.section(`${i} (${t.length})`)];return t.length===0?(r.push(` ${n.muted("No entries.")}`),r):(t.slice(0,U).forEach((s,o)=>{r.push(...nr(s,o,n))}),t.length>U&&r.push(` ${n.muted(`... ${t.length-U} more`)}`),r)}function nr(e,t,n){if(!R(e))return[`${t+1}. ${J("",e)}`];let i=Ft(e)??Q(Me(e))??`Item ${t+1}`,r=[`${t+1}. ${i}`],s=rr(e);s&&r.push(` ${s}`);let o=Me(e);return o&&r.push(` ${o}`),r}function kl(e,t){let n=jo(e,t);if(n.length>0)return n;let i=S(e,"capabilityProfile"),r=i?l(i,"runtimeRisk"):void 0;return r?[t.section("Trust"),` ${t.label("Runtime risk")}: ${r}`]:[]}function wl(e,t,n){let i=Y(n),r=l(e,"skillSlug")??t,s=l(e,"runtimeRisk")??(S(e,"capabilityProfile")?l(S(e,"capabilityProfile"),"runtimeRisk"):void 0),o=[`${i.ok("OK")} Creator security report loaded.`,"",i.section("Creator Security")];e.securityScore!==void 0&&o.push(` ${i.label("Security score")}: ${J("securityScore",e.securityScore)}`),s&&o.push(` ${i.label("Runtime risk")}: ${s}`);let a=l(e,"recommendation");a&&o.push(` ${i.label("Recommendation")}: ${a}`),o.push(` ${i.label("Skill")}: ${r}`);let c=l(e,"version");c&&o.push(` ${i.label("Version")}: ${c}`);let u=["semantic","review","no","reviewable","findings"].join("_"),d=ve(e.reviewDegradedReasons).includes(u),p=ve(e.trustBadges).filter(h=>h==="capability-mismatch"),y=ve(e.trustBadges).filter(h=>h!=="capability-mismatch");(d||p.length>0)&&(o.push("",i.section("Creator Notes")),d&&o.push("1. Semantic review was not needed because there were no reviewable findings."),p.forEach((h,w)=>{o.push(`${d?w+2:w+1}. ${h==="capability-mismatch"?"Capability declaration needs review.":h}`)})),y.length>0&&(o.push("",i.section(`Trust badges (${y.length})`)),y.slice(0,U).forEach((h,w)=>o.push(`${w+1}. ${h}`)));let m=Array.isArray(e.findings)?e.findings:[];return o.push("",i.section(`Findings (${m.length})`)),m.length===0?o.push(` ${i.muted("No entries.")}`):m.slice(0,U).forEach((h,w)=>{o.push(...nr(h,w,i))}),o.push("",i.section("Next")),o.push(` ${i.arrow} skills-layer creator rescan-security ${r}`),o.push(` ${i.arrow} skills-layer creator status ${r}`),o.push(` ${i.arrow} skills-layer trust ${r}`),o.join(`
925
+ `)}function vl(e,t,n){let r=S(e,"report")??e,s=Y(n),o=r.securityScore,a=l(r,"generatedAt")??l(r,"reportGeneratedAt"),c=Array.isArray(r.findings)?r.findings:void 0,u=[`${s.ok("OK")} Security rescan requested.`,"",s.section("Creator Security")];return u.push(` ${s.label("Skill")}: ${l(r,"skillSlug")??t}`),o!==void 0&&u.push(` ${s.label("Security score")}: ${J("securityScore",o)}`),c&&u.push(` ${s.label("Findings")}: ${c.length}`),a&&u.push(` ${s.label("Generated at")}: ${a}`),u.push("",s.section("Next")),u.push(` ${s.arrow} skills-layer creator security-report ${t}`),u.push(` ${s.arrow} skills-layer creator status ${t}`),u.join(`
926
+ `)}function bl(e){return Object.entries(e).filter(([t,n])=>ir(t,n))}function ir(e,t){let n=e.toLowerCase();return n==="status"||n==="securityscore"||n==="recommendation"||n==="capabilityprofile"||n==="securityposture"||n==="trust"||n.includes("apikey")||n.includes("secret")||n.includes("token")||n==="content"?!1:t!==void 0}function Me(e){let n=[["id","id"],["name","name"],["keyPrefix","prefix"],["slug","slug"],["skillSlug","skill"],["currentVersion","version"],["version","version"],["category","category"],["skillType","type"],["type","type"],["visibility","visibility"],["status","status"],["count","count"],["email","email"],["role","role"],["selectedBackend","backend"],["selectedBaseUrl","base url"],["path","path"],["downloadUrl","download url"],["authorizationUrl","authorization url"],["checkoutUrl","checkout url"],["url","url"],["issueId","issue"],["reviewId","review"],["purchaseId","purchase"],["workspaceId","workspace"],["clientId","client"],["environment","environment"],["expiresAt","expires"],["lastUsedAt","last used"],["revocable","revocable"],["revokeCommand","revoke"],["deploymentId","deployment"],["source","source"],["scope","scope"],["agent","agent"],["bytes","bytes"],["fileCount","file count"],["bodyWordCount","body words"]].flatMap(([r,s])=>{if(!ir(r,e[r]))return[];let o=e[r];return o===void 0?[]:[`${s}: ${J(r,o)}`]}),i=S(e,"securityPosture");if(i){let r=l(i,"label"),s=l(i,"runtimeRisk");r&&n.push(`trust: ${r}`),s&&n.push(`risk: ${s}`)}return n.join("; ")}function rr(e){return l(e,"shortDescription")??l(e,"summary")??l(e,"description")??l(e,"message")}function Ft(e){return l(e,"displayName")??l(e,"name")??l(e,"title")??l(e,"slug")??l(e,"skillSlug")??l(e,"code")??l(e,"id")}function J(e,t){return e==="downloadUrl"?"<hidden; use --json or --output>":typeof t=="string"?e.toLowerCase()==="category"?sr(t):be(t):typeof t=="number"||typeof t=="boolean"?String(t):t===null?"none":Array.isArray(t)?`${t.length} item${t.length===1?"":"s"}`:R(t)?Me(t)||"details available with --json":String(t)}function sr(e){return Ln(e)}function be(e){let t=e.replace(/\s+/gu," ").trim();return t.length>160?`${t.slice(0,157)}...`:t}function Pl(e){return ct(qt(e))}function qt(e){return e.replace(/([a-z0-9])([A-Z])/gu,"$1 $2").replace(/[_-]+/gu," ").toLowerCase()}function or(e){let t=Sl(e),n=t?[`skills-layer show ${t}`,`skills-layer trust ${t}`,`skills-layer install ${t}`]:[],i=typeof e.downloadUrl=="string",r=Array.isArray(e.materializedWrites)&&e.materializedWrites.length>0;return i&&n.push("Use --output <path> to write exports without printing temporary download URLs"),r&&n.push("Review the materialized files in this workspace"),e.valid===!0&&n.push("skills-layer creator submit <path> --dry-run"),n}function Sl(e){let t=l(e,"skillSlug")??l(e,"slug");if(t)return t;let n=e.results;if(Array.isArray(n)){for(let i of n)if(R(i)){let r=l(i,"skillSlug")??l(i,"slug");if(r)return r}}}function R(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function k(e,t){return{exitCode:1,stdout:"",stderr:t?JSON.stringify({status:"error",summary:e,why:null,nextAction:null,nextStep:null,data:{error:e},warnings:[],links:[],reasonCode:null,handoff:null},null,2):e}}function I(e,t,n,i){let r={status:l(e,"status")??"error",summary:t,why:l(e,"why")??null,nextAction:l(e,"nextAction")??null,nextStep:l(e,"nextStep")??null,data:e,warnings:Array.isArray(e.warnings)?e.warnings:[],links:Array.isArray(e.links)?e.links:[],reasonCode:i??l(e,"reasonCode")??null,handoff:e.handoff??null};return{exitCode:1,stdout:"",stderr:n?JSON.stringify(r,null,2):t}}function at(e,t){let n=e.details??{};return e.status===401?I({status:"login_required",error:"Login required.",nextAction:"login",nextStep:"Run `skills-layer login` to sign in, then retry this command."},"Login required. Run `skills-layer login` to sign in, then retry this command.",t,"login_required"):k(l(n,"error")??e.message,t)}async function V(e){try{return JSON.parse(await Oe(e,"utf8"))}catch{return null}}async function Cl(e,t){let n=await V(e);return n?On(n,{env:t.env,platform:t.platform,store:t.credentialStore}):null}async function un(e,t,n){let i=await Nn(t,{env:n.env,platform:n.platform,store:n.credentialStore});await D(e,i)}async function D(e,t){await ar(X(e)),await Jt(e,`${JSON.stringify(t,null,2)}
927
+ `,{encoding:"utf8",mode:384}),await dn(e,384)}async function ar(e){await Ne(e,{recursive:!0,mode:448}),await dn(e,448)}async function dn(e,t){if(process.platform!=="win32")try{await vi(e,t)}catch{}}async function ie(e,t){await Ne(X(e),{recursive:!0}),await Jt(e,t,"utf8")}async function Kt(e,t){await Ne(X(e),{recursive:!0}),await Jt(e,t)}function Rl(e=process.stdin,t=process.stdout,n=Wt){return async i=>{if(!e.isTTY||!t.isTTY)throw new Error("Interactive prompt is not available in this environment.");let r=n({input:e,output:t});try{return(await r.question(i)).trim()}finally{r.close()}}}function xl(e=process.stdin,t=process.stdout,n=Wt){return async i=>{if(!e.isTTY||!t.isTTY)throw new Error("Interactive secret prompt is not available in this environment.");if(typeof e.setRawMode=="function"&&typeof e.on=="function"&&typeof e.off=="function")return new Promise((s,o)=>{let a=e,c=a.isRaw===!0,u="",d=!1,p=m=>{d||(d=!0,a.off("data",y),a.setRawMode(c),a.pause?.(),t.write(`
869
928
  `),m())},y=m=>{let h=typeof m=="string"?m:m.toString("utf8");for(let w of h){if(w==="\r"||w===`
870
- `){p(()=>s(u.trim()));return}if(w===""){p(()=>o(new Error("Interactive secret prompt cancelled.")));return}if(w==="\b"||w==="\x7F"){u.length>0&&(u=u.slice(0,-1),t.write("\b \b"));continue}u+=w,t.write("*")}};t.write(i),l.resume?.(),l.on("data",y),l.setRawMode(!0)});let r=n({input:e,output:t,terminal:!0});r.stdoutMuted=!0,r._writeToOutput=function(o){if(!this.stdoutMuted){t.write(o);return}if(o==="\b"||o==="\x7F"){t.write("\b \b");return}if(o!=="\r"&&o!==`
871
- `){let l=[...o].filter(c=>c!=="\r"&&c!==`
872
- `).length;l>0&&t.write("*".repeat(l))}};try{t.write(i);let s=await r.question("");return t.write(`
873
- `),s.trim()}finally{r.close()}}}function vl(e=process.stdin,t=process.stdout,n=zt){return async(i,r)=>{if(r.length===0)throw new Error("Interactive selection has no available options.");if(!e.isTTY||!t.isTTY)throw new Error("Interactive selection is not available in this environment.");let s=e;if(typeof s.setRawMode=="function"&&typeof s.on=="function"&&typeof s.off=="function")return new Promise((l,c)=>{let u=0,d="",p=0,y=!1,m=s.isRaw===!0,h=()=>{p>0&&t.write(`\x1B[${p}F\x1B[J`),t.write(`${i}
874
- `);for(let[x,T]of r.entries())t.write(`${bl(x===u)} ${x+1}. ${mi(T)}
929
+ `){p(()=>s(u.trim()));return}if(w===""){p(()=>o(new Error("Interactive secret prompt cancelled.")));return}if(w==="\b"||w==="\x7F"){u.length>0&&(u=u.slice(0,-1),t.write("\b \b"));continue}u+=w,t.write("*")}};t.write(i),a.resume?.(),a.on("data",y),a.setRawMode(!0)});let r=n({input:e,output:t,terminal:!0});r.stdoutMuted=!0,r._writeToOutput=function(o){if(!this.stdoutMuted){t.write(o);return}if(o==="\b"||o==="\x7F"){t.write("\b \b");return}if(o!=="\r"&&o!==`
930
+ `){let a=[...o].filter(c=>c!=="\r"&&c!==`
931
+ `).length;a>0&&t.write("*".repeat(a))}};try{t.write(i);let s=await r.question("");return t.write(`
932
+ `),s.trim()}finally{r.close()}}}function $l(e=process.stdin,t=process.stdout,n=Wt){return async(i,r)=>{if(r.length===0)throw new Error("Interactive selection has no available options.");if(!e.isTTY||!t.isTTY)throw new Error("Interactive selection is not available in this environment.");let s=e;if(typeof s.setRawMode=="function"&&typeof s.on=="function"&&typeof s.off=="function")return new Promise((a,c)=>{let u=0,d="",p=0,y=!1,m=s.isRaw===!0,h=()=>{p>0&&t.write(`\x1B[${p}F\x1B[J`),t.write(`${i}
933
+ `);for(let[x,B]of r.entries())t.write(`${_l(x===u)} ${x+1}. ${yi(B)}
875
934
  `);t.write(`Choice: ${d}
876
935
  `),t.write(`Use up/down arrows, type a number, then press Enter.
877
936
  `),p=r.length+3},w=x=>{y||(y=!0,s.off?.("data",P),s.setRawMode?.(m),s.pause?.(),t.write(`
878
- `),x())},P=x=>{let T=typeof x=="string"?x:x.toString("utf8");if(T.includes("")){w(()=>c(new Error("Interactive selection cancelled.")));return}if(T.includes("\x1B[A")){d="",u=(u-1+r.length)%r.length,h();return}if(T.includes("\x1B[B")){d="",u=(u+1)%r.length,h();return}if(T.includes("\r")||T.includes(`
879
- `)){if(d){let M=Number.parseInt(d,10)-1;if(Number.isNaN(M)||M<0||M>=r.length){d="",t.write("\x07"),h();return}u=M}w(()=>l(r[u]?.value??r[0].value));return}if(T.includes("\b")||T.includes("\x7F")){d=d.slice(0,-1);let M=Number.parseInt(d,10)-1;!Number.isNaN(M)&&M>=0&&M<r.length&&(u=M),h();return}let Ge=[...T].filter(M=>/[0-9]/u.test(M));if(Ge.length>0){d=`${d}${Ge.join("")}`;let M=Number.parseInt(d,10)-1;!Number.isNaN(M)&&M>=0&&M<r.length&&(u=M),h()}};h(),s.resume?.(),s.on("data",P),s.setRawMode(!0)});let o=n({input:e,output:t});try{t.write(`${i}
880
- `);for(let[u,d]of r.entries())t.write(`${u+1}. ${mi(d)}
881
- `);let l=(await o.question("Choose a number and press enter: ")).trim(),c=Number.parseInt(l,10)-1;if(Number.isNaN(c)||c<0||c>=r.length)throw new Error("No valid option selected.");return r[c].value}finally{o.close()}}}function bl(e){return e?"\x1B[36m>\x1B[0m":" "}function mi(e){return e.description?`${e.label} (${e.description})`:e.label}function Pl(e){return async t=>{let n=e==="win32"?{file:"rundll32.exe",args:["url.dll,FileProtocolHandler",t]}:e==="darwin"?{file:"open",args:[t]}:{file:"xdg-open",args:[t]};return new Promise(i=>{try{let r=fi(n.file,n.args,{detached:!0,stdio:"ignore"});r.on("error",()=>i(!1)),r.unref(),i(!0)}catch{i(!1)}})}}function F(e,t){let n={};for(let i of t){let r=e[i];r!==void 0&&r!==!1&&(i.endsWith("Cents")||i==="rating"?n[i]=Number(r):n[i]=r)}return A(n)}function Sl(e){let t=e.results;return Array.isArray(t)?t.flatMap(n=>{if(!n||typeof n!="object"||Array.isArray(n))return[];let i=a(n,"slug")??a(n,"skillSlug");return i?[i]:[]}):[]}function Cl(e){let t=g(e)??"auto";return t==="auto"||t==="required"||t==="optional"||t==="off"?{status:"ok",policy:t}:{status:"invalid",message:"guardian check --cloud-trust-ledger must be one of: auto, required, optional, off."}}function A(e){let t={};for(let[n,i]of Object.entries(e))i!==void 0&&(t[n]=i);return t}function at(e,t){let n=g(e);return n?un(n,t):void 0}function un(e,t){try{return JSON.parse(e)}catch{throw new Error(`--${t} must be valid JSON.`)}}function J(e){if(!e||typeof e!="object"||Array.isArray(e))return e;let t={...e};return delete t.apiKey,delete t[["ad","min","Api","Key"].join("")],t}function Kt(e){let t=J(e);for(let n of["role","roles","verifiedAt","expiresAt","userId","tenantId","linkedAccount","linkedIdentity","createdUser"])delete t[n];return t}function v(e,t){let n=g(e);if(!n)throw new Error(t);return n}function g(e){return typeof e=="string"&&e.trim().length>0?e.trim():void 0}function Q(e){return typeof e=="string"&&e.trim().length>0?e.trim():void 0}function a(e,t){let n=e[t];return typeof n=="string"&&n.trim().length>0?n.trim():void 0}function ce(e,t){let n=e[t];if(typeof n=="number"&&Number.isFinite(n))return n;if(typeof n=="string"&&n.trim().length>0){let i=Number(n);return Number.isFinite(i)?i:void 0}}function S(e,t){let n=e[t];return n&&typeof n=="object"&&!Array.isArray(n)?n:void 0}function ne(e,t){let n=e[t];return Array.isArray(n)?n.filter(i=>typeof i=="string"):void 0}function Rl(e){let t=Array.isArray(e)?e:typeof e=="string"?[e]:[];return[...new Set(t.flatMap(n=>n.split(",")).map(n=>n.trim()).filter(Boolean))]}function B(e,t,n){let i=g(n);i&&e.set(t,i)}function ie(e){let t=e.toString();return t?`?${t}`:""}function ee(e){return e.replace(/\/+$/u,"")}function Pe(e){if(ee(e)===Vt)return"cloud";try{let t=new URL(e);return t.hostname==="127.0.0.1"||t.hostname==="localhost"||t.hostname==="::1"||t.hostname==="[::1]"?"local":"custom"}catch{return"custom"}}function xl(e){return e.includes("/")||e.startsWith(".")||/^https?:\/\//u.test(e)||/^[a-z]+:/iu.test(e)}function ae(e,t){return wi(e,t)}function lt(e){return`${e[0]?.toUpperCase()??""}${e.slice(1)}`}var $l={github:"GitHub",gitlab:"GitLab",google:"Google",microsoft:"Microsoft"};function _l(e){return $l[e.toLowerCase()]??lt(e)}function ue(e){return e instanceof Error?e.message:String(e)}export{kc as executePublicCli};
937
+ `),x())},P=x=>{let B=typeof x=="string"?x:x.toString("utf8");if(B.includes("")){w(()=>c(new Error("Interactive selection cancelled.")));return}if(B.includes("\x1B[A")){d="",u=(u-1+r.length)%r.length,h();return}if(B.includes("\x1B[B")){d="",u=(u+1)%r.length,h();return}if(B.includes("\r")||B.includes(`
938
+ `)){if(d){let O=Number.parseInt(d,10)-1;if(Number.isNaN(O)||O<0||O>=r.length){d="",t.write("\x07"),h();return}u=O}w(()=>a(r[u]?.value??r[0].value));return}if(B.includes("\b")||B.includes("\x7F")){d=d.slice(0,-1);let O=Number.parseInt(d,10)-1;!Number.isNaN(O)&&O>=0&&O<r.length&&(u=O),h();return}let Ge=[...B].filter(O=>/[0-9]/u.test(O));if(Ge.length>0){d=`${d}${Ge.join("")}`;let O=Number.parseInt(d,10)-1;!Number.isNaN(O)&&O>=0&&O<r.length&&(u=O),h()}};h(),s.resume?.(),s.on("data",P),s.setRawMode(!0)});let o=n({input:e,output:t});try{t.write(`${i}
939
+ `);for(let[u,d]of r.entries())t.write(`${u+1}. ${yi(d)}
940
+ `);let a=(await o.question("Choose a number and press enter: ")).trim(),c=Number.parseInt(a,10)-1;if(Number.isNaN(c)||c<0||c>=r.length)throw new Error("No valid option selected.");return r[c].value}finally{o.close()}}}function _l(e){return e?"\x1B[36m>\x1B[0m":" "}function yi(e){return e.description?`${e.label} (${e.description})`:e.label}function jl(e){return async t=>{let n=e==="win32"?{file:"rundll32.exe",args:["url.dll,FileProtocolHandler",t]}:e==="darwin"?{file:"open",args:[t]}:{file:"xdg-open",args:[t]};return new Promise(i=>{try{let r=ki(n.file,n.args,{detached:!0,stdio:"ignore"});r.on("error",()=>i(!1)),r.unref(),i(!0)}catch{i(!1)}})}}function F(e,t){let n={};for(let i of t){let r=e[i];r!==void 0&&r!==!1&&(i.endsWith("Cents")||i==="rating"?n[i]=Number(r):n[i]=r)}return j(n)}function Al(e){let t=e.results;return Array.isArray(t)?t.flatMap(n=>{if(!n||typeof n!="object"||Array.isArray(n))return[];let i=l(n,"slug")??l(n,"skillSlug");return i?[i]:[]}):[]}function Il(e){let t=g(e)??"auto";return t==="auto"||t==="required"||t==="optional"||t==="off"?{status:"ok",policy:t}:{status:"invalid",message:"guardian check --cloud-trust-ledger must be one of: auto, required, optional, off."}}function j(e){let t={};for(let[n,i]of Object.entries(e))i!==void 0&&(t[n]=i);return t}function lt(e,t){let n=g(e);return n?gn(n,t):void 0}function gn(e,t){try{return JSON.parse(e)}catch{throw new Error(`--${t} must be valid JSON.`)}}function z(e){if(!e||typeof e!="object"||Array.isArray(e))return e;let t={...e};return delete t.apiKey,delete t[["ad","min","Api","Key"].join("")],t}function Gt(e){let t=z(e);for(let n of["role","roles","verifiedAt","expiresAt","userId","tenantId","linkedAccount","linkedIdentity","createdUser"])delete t[n];return t}function v(e,t){let n=g(e);if(!n)throw new Error(t);return n}function g(e){return typeof e=="string"&&e.trim().length>0?e.trim():void 0}function Q(e){return typeof e=="string"&&e.trim().length>0?e.trim():void 0}function l(e,t){let n=e[t];return typeof n=="string"&&n.trim().length>0?n.trim():void 0}function ce(e,t){let n=e[t];if(typeof n=="number"&&Number.isFinite(n))return n;if(typeof n=="string"&&n.trim().length>0){let i=Number(n);return Number.isFinite(i)?i:void 0}}function S(e,t){let n=e[t];return n&&typeof n=="object"&&!Array.isArray(n)?n:void 0}function re(e,t){let n=e[t];return Array.isArray(n)?n.filter(i=>typeof i=="string"):void 0}function El(e){let t=Array.isArray(e)?e:typeof e=="string"?[e]:[];return[...new Set(t.flatMap(n=>n.split(",")).map(n=>n.trim()).filter(Boolean))]}function N(e,t,n){let i=g(n);i&&e.set(t,i)}function se(e){let t=e.toString();return t?`?${t}`:""}function ne(e){return e.replace(/\/+$/u,"")}function Pe(e){if(ne(e)===Yt)return"cloud";try{let t=new URL(e);return t.hostname==="127.0.0.1"||t.hostname==="localhost"||t.hostname==="::1"||t.hostname==="[::1]"?"local":"custom"}catch{return"custom"}}function Ll(e){return e.includes("/")||e.startsWith(".")||/^https?:\/\//u.test(e)||/^[a-z]+:/iu.test(e)}function W(e,t){return Pi(e,t)}function ct(e){return`${e[0]?.toUpperCase()??""}${e.slice(1)}`}var Tl={github:"GitHub",gitlab:"GitLab",google:"Google",microsoft:"Microsoft"};function Ul(e){return Tl[e.toLowerCase()]??ct(e)}function ue(e){return e instanceof Error?e.message:String(e)}export{xc as executePublicCli};