skill-atlas-cli 0.7.0-beta.1 → 0.7.0-beta.2
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.
- package/bin/cli.js +2 -2
- package/lib/index.js +1 -1
- package/package.json +2 -2
package/bin/cli.js
CHANGED
|
@@ -46,7 +46,7 @@ Example: skill-atlas install my-skill`});let n=await m.text({message:`Enter skil
|
|
|
46
46
|
`),M.default.green(`已发布技能 (${e.length})`))}function lr(e){if(e instanceof N)switch(e.code){case`AGENT_NOT_FOUND`:return`Agent 不存在`;default:return e.message||`请求失败`}return e instanceof Error?e.message:String(e)}var ur={run:async(e={})=>{m.intro(M.default.bold(`skill-atlas skill-published`)),Vn(e.pre);let t=j.getAgentId();t||(m.log.error(`缺少 agentId,请先执行 agent-register 注册`),process.exit(1));let n=!process.stdout.isTTY||!process.stdin.isTTY,r=J.createProgressReporter(n);r.start(`正在查询已发布技能...`);try{let e=await Ot(t);e.success||(r.stop(`查询失败`),m.log.error(e.message||`查询已发布技能失败`),process.exit(1)),r.stop(`查询完成`),cr(e.data?.items??[]),m.outro(M.default.green(`完成!`))}catch(e){r.stop(`查询失败`),m.log.error(lr(e)),process.exit(1)}}};function dr(e){switch(e){case`passed`:return M.default.green(e);case`rejected`:return M.default.red(e);case`reviewing`:return M.default.yellow(e);case`pending`:return M.default.dim(e);default:return e}}function fr(e,t,n){if(e.length===0){m.log.info(`暂无上传记录`);return}let r=e.map((e,t)=>[`${M.default.bold(M.default.cyan(`${t+1}. ${e.slug}`))} ${M.default.dim(`v${e.version}`)}`,` ${M.default.dim(`状态:`)} ${dr(e.status)}`,` ${M.default.dim(`安全审核:`)} ${dr(e.securityStatus)} | ${M.default.dim(`完整性:`)} ${dr(e.integrityStatus)} | ${M.default.dim(`可用性:`)} ${dr(e.availabilityStatus)}`,` ${M.default.dim(`创建时间:`)} ${X(e.createdAt)}`].join(`
|
|
47
47
|
`));m.note(r.join(`
|
|
48
48
|
|
|
49
|
-
`),M.default.green(`上传记录 (第 ${t} 页,共 ${n} 条)`))}function pr(e){if(e instanceof N)switch(e.code){case`UNAUTHORIZED`:return`认证失败,请重新执行 agent-register`;default:return e.message||`请求失败`}return e instanceof Error?e.message:String(e)}var mr={run:async(e,t)=>{m.intro(M.default.bold(`skill-atlas skill-upload-list`));let n=!process.stdout.isTTY||!process.stdin.isTTY,r=J.createProgressReporter(n);r.start(`正在查询上传记录...`);try{let n=await kt({slug:e.slug,status:e.status,page:e.page,pageSize:e.pageSize},t.token);n.success||(r.stop(`查询失败`),m.log.error(n.message||`查询上传记录失败`),process.exit(1)),r.stop(`查询完成`),fr(n.data?.items??[],n.data?.page??1,n.data?.total??0),m.outro(M.default.green(`完成!`))}catch(e){r.stop(`查询失败`),m.log.error(pr(e)),process.exit(1)}}};function hr(e){return e.serviceCode?.trim()?e.payload?.trim()?{valid:!0}:{valid:!1,error:`缺少必需参数: --payload`}:{valid:!1,error:`缺少必需参数: --service-code`}}function gr(e){try{let t=JSON.parse(e);return typeof t!=`object`||!t||Array.isArray(t)?{valid:!1,error:`payload 必须是有效的 JSON 对象`}:{valid:!0,payload:t}}catch{return{valid:!1,error:`payload 必须是有效的 JSON 格式`}}}function _r(e,t){let n={payload:e};return t.clientRequestId?.trim()&&(n.clientRequestId=t.clientRequestId.trim()),n}function vr(e){if(e instanceof N)switch(e.code){case`SERVICE_DISABLED`:return`服务凭据冷却中,请稍后重试`;case`UPSTREAM_ERROR`:return`第三方服务拒绝请求`;case`UPSTREAM_TIMEOUT_CHARGED`:return`上游服务超时,已按消费处理`;case`UNAUTHORIZED`:return`认证失败,请重新执行 agent-register`;case`INSUFFICIENT_CREDITS`:return`Credits 余额不足`;default:return e.message||`请求失败`}return e instanceof Error?e.message:String(e)}function yr(e,t){return`本次扣费: ${e} credits | 剩余: ${t} credits`}var br={run:async(e,t)=>{m.intro(M.default.bold(`skill-atlas service-gateway-invoke`));let n=hr(e);n.valid||(m.log.error(n.error),process.exit(1));let r=gr(e.payload);r.valid||(m.log.error(r.error),process.exit(1));let i=_r(r.payload,e),a=e.serviceCode.trim(),o=!process.stdout.isTTY||!process.stdin.isTTY,s=J.createProgressReporter(o);s.start(`正在调用服务: ${a}...`);try{let e=await jt(a,i,t.token,void 0,18e4);e.success||(s.stop(`调用失败`),m.log.error(e.message||`服务调用失败`),e.data?.creditsCharged!==void 0&&e.data?.creditsBalance!==void 0&&m.log.info(yr(e.data.creditsCharged,e.data.creditsBalance)),process.exit(1)),s.stop(`服务调用成功`);let n=e.data,r=[` ${M.default.green(`服务编码:`)} ${n.serviceCode}`,` ${M.default.green(`调用状态:`)} ${n.invokeStatus}`];n.creditsCharged!==void 0&&r.push(` ${M.default.green(`本次扣费:`)} ${n.creditsCharged} credits`),n.creditsBalance!==void 0&&r.push(` ${M.default.green(`剩余余额:`)} ${n.creditsBalance} credits`),m.note(r.join(`
|
|
49
|
+
`),M.default.green(`上传记录 (第 ${t} 页,共 ${n} 条)`))}function pr(e){if(e instanceof N)switch(e.code){case`UNAUTHORIZED`:return`认证失败,请重新执行 agent-register`;default:return e.message||`请求失败`}return e instanceof Error?e.message:String(e)}var mr={run:async(e,t)=>{m.intro(M.default.bold(`skill-atlas skill-upload-list`));let n=!process.stdout.isTTY||!process.stdin.isTTY,r=J.createProgressReporter(n);r.start(`正在查询上传记录...`);try{let n=await kt({slug:e.slug,status:e.status,page:e.page,pageSize:e.pageSize},t.token);n.success||(r.stop(`查询失败`),m.log.error(n.message||`查询上传记录失败`),process.exit(1)),r.stop(`查询完成`),fr(n.data?.items??[],n.data?.page??1,n.data?.total??0),m.outro(M.default.green(`完成!`))}catch(e){r.stop(`查询失败`),m.log.error(pr(e)),process.exit(1)}}};function hr(e){return e.serviceCode?.trim()?e.payload?.trim()?{valid:!0}:{valid:!1,error:`缺少必需参数: --payload`}:{valid:!1,error:`缺少必需参数: --service-code`}}function gr(e){try{let t=JSON.parse(e);return typeof t!=`object`||!t||Array.isArray(t)?{valid:!1,error:`payload 必须是有效的 JSON 对象`}:{valid:!0,payload:t}}catch{return{valid:!1,error:`payload 必须是有效的 JSON 格式`}}}function _r(e,t){let n={payload:e};return t.clientRequestId?.trim()&&(n.clientRequestId=t.clientRequestId.trim()),t.skillExecutionId?.trim()&&(n.skillExecutionId=t.skillExecutionId.trim()),t.skillSlug?.trim()&&(n.skillSlug=t.skillSlug.trim()),n}function vr(e){if(e instanceof N)switch(e.code){case`SERVICE_DISABLED`:return`服务凭据冷却中,请稍后重试`;case`UPSTREAM_ERROR`:return`第三方服务拒绝请求`;case`UPSTREAM_TIMEOUT_CHARGED`:return`上游服务超时,已按消费处理`;case`UNAUTHORIZED`:return`认证失败,请重新执行 agent-register`;case`INSUFFICIENT_CREDITS`:return`Credits 余额不足`;default:return e.message||`请求失败`}return e instanceof Error?e.message:String(e)}function yr(e,t){return`本次扣费: ${e} credits | 剩余: ${t} credits`}var br={run:async(e,t)=>{m.intro(M.default.bold(`skill-atlas service-gateway-invoke`));let n=hr(e);n.valid||(m.log.error(n.error),process.exit(1));let r=gr(e.payload);r.valid||(m.log.error(r.error),process.exit(1));let i=_r(r.payload,e),a=e.serviceCode.trim(),o=!process.stdout.isTTY||!process.stdin.isTTY,s=J.createProgressReporter(o);s.start(`正在调用服务: ${a}...`);try{let e=await jt(a,i,t.token,void 0,18e4);e.success||(s.stop(`调用失败`),m.log.error(e.message||`服务调用失败`),e.data?.creditsCharged!==void 0&&e.data?.creditsBalance!==void 0&&m.log.info(yr(e.data.creditsCharged,e.data.creditsBalance)),process.exit(1)),s.stop(`服务调用成功`);let n=e.data,r=[` ${M.default.green(`服务编码:`)} ${n.serviceCode}`,` ${M.default.green(`调用状态:`)} ${n.invokeStatus}`];n.creditsCharged!==void 0&&r.push(` ${M.default.green(`本次扣费:`)} ${n.creditsCharged} credits`),n.creditsBalance!==void 0&&r.push(` ${M.default.green(`剩余余额:`)} ${n.creditsBalance} credits`),m.note(r.join(`
|
|
50
50
|
`),M.default.green(`调用结果`)),n.result!==void 0&&(console.log(`
|
|
51
51
|
`+M.default.bold(`返回数据:`)),console.log(JSON.stringify(n.result,null,2))),m.outro(M.default.green(`完成!`))}catch(e){s.stop(`调用失败`);let t=vr(e);if(m.log.error(t),e instanceof N&&e.responseData){let t=e.responseData;t.data?.creditsCharged!==void 0&&t.data?.creditsBalance!==void 0&&m.log.info(yr(t.data.creditsCharged,t.data.creditsBalance))}process.exit(1)}}};const xr=process.env.SKILLATLAS_CONFIG_DIR||l.join(f.homedir(),`.skillatlas`),Sr=l.join(xr,`mail-config.json`);function Cr(){e.existsSync(xr)||e.mkdirSync(xr,{recursive:!0})}function wr(){if(!e.existsSync(Sr))return{};try{let t=e.readFileSync(Sr,`utf-8`);return JSON.parse(t)}catch{return{}}}function Tr(t){Cr(),t.updatedAt=new Date().toISOString(),e.writeFileSync(Sr,JSON.stringify(t,null,2)+`
|
|
52
52
|
`)}function Er(e,t){let n=wr();n[e]=t,Tr(n)}function Dr(e){let t=wr()[e];if(t!=null)return String(t)}function Or(){let e=wr(),t=[];for(let[n,r]of Object.entries(e))n!==`updatedAt`&&r!=null&&t.push({key:n,value:String(r)});return t}function kr(e){return e in wr()&&e!==`updatedAt`}const Ar=[`主邮箱`,`工作`,`学习`,`金融`,`购物`,`社交`,`订阅`,`临时`,`项目`,`备用`];function jr(){return Dr(`mailbox`)}const Mr={production:`skillatlas.cn`,pre:`pre-skillhub.aliyun-inc.com`};function Nr(e,t,n){return`https://${n?Mr.pre:Mr.production}/agents/${e}?token=${t}`}var Pr={run:async(e,t)=>{m.intro(M.default.bold(`skill-atlas agent-info`));let{agentId:n,token:r}=t,i=e.pre??!1,a=Nr(n,r,i),o=i?`预发环境`:`生产环境`,s=null,c=!1,l=J.createProgressReporter();l.start(`正在获取 Agent 信息...`);try{let e=await Nt(n,r);e.success&&e.data&&(s=e.data),l.stop(`获取成功`)}catch{c=!0,l.stop(`无法连接服务器,仅显示本地信息`)}let u=[];if(u.push(` ${M.default.green(`Agent ID:`)} ${n}`),u.push(` ${M.default.green(`环境:`)} ${o}`),s?.metadata&&(u.push(` ${M.default.green(`名称:`)} ${s.metadata.name}`),s.metadata.avatar&&u.push(` ${M.default.green(`头像:`)} ${s.metadata.avatar}`)),s?.creditAccount){let e=s.creditAccount;u.push(``),u.push(` ${M.default.cyan(`--- 虾小宝 Credits 账户 ---`)}`),u.push(` ${M.default.green(`可用 Credits:`)} ${e.availableCredits}`),u.push(` ${M.default.green(`冻结 Credits:`)} ${e.frozenCredits}`),u.push(` ${M.default.green(`累计发放:`)} ${e.totalGrantedCredits}`),u.push(` ${M.default.green(`累计消费:`)} ${e.totalConsumedCredits}`),e.welcomeBonus&&u.push(` ${M.default.green(`Welcome Bonus:`)} ${e.welcomeBonus.grantStatus}`)}let d=Dr(`mailbox`);d&&(u.push(``),u.push(` ${M.default.cyan(`--- 邮箱信息 ---`)}`),u.push(` ${M.default.green(`默认邮箱 ID:`)} ${d}`)),u.push(``),u.push(` ${M.default.green(`虾小宝主页链接:`)}`),u.push(` [您的虾小宝Agent 主页](${a})`),m.note(u.join(`
|
|
@@ -73,5 +73,5 @@ Example: skill-atlas install my-skill`});let n=await m.text({message:`Enter skil
|
|
|
73
73
|
`),M.default.green(`秘钥列表(共 ${r.length} 条)`)),m.outro(M.default.green(`完成!`))}catch(e){n.stop(`获取失败`);let t=e instanceof N||e instanceof Error?e.message:String(e);m.log.error(t),process.exit(1)}}},oi={run:async(e,t)=>{m.intro(M.default.bold(`skill-atlas vault-delete`)),e.name?.trim()||(m.log.error(`缺少必需参数: --name`),process.exit(1));let n=e.name.trim(),r=J.createProgressReporter();r.start(`正在删除秘钥...`);try{let e=await Kt(n,t.token);e.success||(r.stop(`删除失败`),m.log.error(e.message||`秘钥删除失败`),process.exit(1)),r.stop(`删除成功`),m.note(` ${M.default.green(`秘钥名称:`)} ${n}\n ${M.default.green(`状态:`)} 已删除`,M.default.green(`删除结果`)),m.outro(M.default.green(`完成!`))}catch(e){r.stop(`删除失败`);let t=e instanceof N||e instanceof Error?e.message:String(e);m.log.error(t),process.exit(1)}}};function si(e){let t=e.currentVersion;return typeof t==`string`?t:t&&typeof t==`object`&&`version`in t?t.version??`—`:`—`}function ci(e,t,n,i){let a=Math.max(...e.map(e=>(e.slug||``).length),6),o=Math.max(...e.map(e=>Math.min((e.displayName||`—`).length,30)),8),s=` ${r.bold(`Description`.padEnd(o))} ${r.bold(`SkillName`.padEnd(a))} ${r.bold(`Version`)}`,c=` `+`-`.repeat(a+o+12),l=e.map(e=>{let t=(e.slug||`—`).padEnd(a),n=((e.displayName||`—`).length>30?(e.displayName||`—`).slice(0,27)+`...`:e.displayName||`—`).padEnd(o),i=si(e);return` ${r.white(n)} ${r.cyan.bold(t)} ${r.dim(`v${i}`)}`});m.note([s,c,...l].join(`
|
|
74
74
|
`));let u=(n-1)*i+1,d=Math.min(n*i,t);m.log.message(r.dim(`Showing ${u}-${d} of ${t}`)),m.log.message(r.green(`Install: npx skill-atlas install <skillName>`))}async function li(e){let{q:t,k:n}=e,i=t||n||``;try{let e=await _t({q:t,k:n}),{items:a,total:o}=e;if(a.length===0){m.log.error(`No skills found matching "${r.bold(i)}"`);return}ci(a,o,e.page,e.pageSize)}catch(e){m.log.error(`Search failed: ${e.message}`),process.exit(1)}}var ui={run:li};function di(e,t){let n=[];return n.push(` ${r.cyan.bold(`${t+1}. ${e.displayName}`)} ${r.dim(`(${e.slug})`)}`),e.summary&&n.push(` ${r.white(e.summary)}`),n.push(` ${r.dim(`Version:`)} ${r.green(e.currentVersion)} | ${r.dim(`Downloads:`)} ${e.downloadCount} | ${r.dim(`CertLevel:`)} ${e.certLevel}`),e.matchedFunctions&&e.matchedFunctions.length>0&&n.push(` ${r.dim(`Matched Functions:`)} ${r.yellow(e.matchedFunctions.join(`, `))}`),n.join(`
|
|
75
75
|
`)}function fi(e,t){if(e.length===0){m.log.warn(`No skill combinations found for "${r.bold(t)}"`);return}m.log.success(`Found ${r.green(e.length)} combination(s) for "${r.bold(t)}"\n`),e.forEach((e,t)=>{let n=r.bold.blue(`Combination ${t+1}`),i=r.dim(`(${e.length} skill${e.length>1?`s`:``})`);console.log(`\n${n} ${i}`),console.log(r.dim(`─`.repeat(50))),e.forEach((e,t)=>{console.log(di(e,t))});let a=[...new Set(e.flatMap(e=>e.matchedFunctions||[]))];a.length>0&&console.log(`\n ${r.dim(`Combined coverage:`)} ${r.green(a.join(`, `))}`)}),console.log(`
|
|
76
|
-
`+r.dim(`─`.repeat(50))),m.log.message(r.green(`Install: npx skill-atlas install <skillName>`))}async function pi(e){let{q:t,k:n,certLevel:r,pre:i}=e;(!t||!n)&&(m.log.error(`Missing required parameters: --q and --k are required`),process.exit(1)),Vn(i);let a=n;try{fi(await Mt({q:t,k:n,certLevel:r}),a)}catch(e){m.log.error(`Search failed: ${e.message}`),process.exit(1)}}var mi={run:pi};async function hi(e,t=`latest`){let n=(process.env.npm_config_registry||`https://registry.npmjs.org`).replace(/\/$/,``),r=await fetch(`${n}/-/package/${e}/dist-tags`,{signal:AbortSignal.timeout(5e3)});if(!r.ok)throw Error(`获取版本信息失败`);return(await r.json())[t]||`0.0.0`}async function gi(e){let{pkgName:t,currentVersion:n,yes:i,plugin:a,pre:o}=e,s=o?`beta`:`latest`,c=J.createProgressReporter();c.start(o?`检查最新 beta 版本...`:`检查最新版本...`);try{let e=await hi(t,s);if(c.stop(`检查完成`),d.valid(e)||(m.log.error(`无法解析最新版本: ${e}`),process.exit(1)),d.lte(e,n)){m.log.success(`已是最新版本 ${r.cyan(n)}`);return}let l=o?r.yellow(`[beta] `):``;m.log.message(l+`发现新版本: ${r.red(n)} → ${r.green(e)}`+(a?r.dim(`(将使用官方安装脚本更新 CLI 与插件)`):``));let u=i||!process.stdin.isTTY?!0:await m.confirm({message:`是否立即升级?`,initialValue:!0});if(m.isCancel(u)||u===!1){m.cancel(`已取消升级`);return}c.start(a?`正在通过官方脚本升级(CLI + 插件)…`:`正在升级...`);let f=a?await ct():await st(t,s);c.stop(f===0?`升级完成`:`升级失败`),f!==0&&(a?J.error(`升级失败,可手动执行: `+ot()):J.error(`升级失败,可手动执行: npm install -g `+t+`@`+s),process.exit(1)),m.log.success(a?`已通过官方脚本更新(目标版本 ${r.green(e)})`:`已升级到 ${r.green(e)}`)}catch(e){c.stop(`检查失败`),m.log.error(e.message),a?J.info(`可手动执行: `+ot()):J.info(`可手动执行: npm install -g `+t+`@`+s),process.exit(1)}}var _i={run:gi};async function vi(e){let{yes:t}=e,n=t||J.isNonInteractive();if(m.intro(r.bold(`skill-atlas uninstall`)),!n){let e=await m.confirm({message:`确认要卸载 skill-atlas CLI 吗?`,initialValue:!1});if(m.isCancel(e)||e===!1){m.cancel(`已取消卸载`);return}}let i=J.createProgressReporter(n);i.start(`正在执行卸载脚本...`);try{let e=await pt();i.stop(e===0?`卸载完成`:`卸载失败`),e!==0&&(J.error(`卸载失败,可手动执行: `+ft()),process.exit(1)),m.log.success(r.green(`skill-atlas CLI 已卸载`))}catch(e){i.stop(`卸载失败`),m.log.error(e.message),J.info(`可手动执行: `+ft()),process.exit(1)}}var yi={run:vi};const bi=[`token`,`password`,`secret`,`authorization`];let xi;function Si(){if(!xi){let e=j.getSlsConfig();xi=`https://${e.project}.${e.endpoint}/logstores/${e.logStore}/track?APIVersion=0.6.0`}return xi}const Ci={os:f.platform(),nodeVersion:process.version};function wi(e){let t=e.toLowerCase();return bi.some(e=>t.includes(e))}function Ti(e,t){return e.length>t?e.slice(0,t)+`...`:e}function Ei(e){return e instanceof Error?`${e.name||`Error`}: ${Ti(e.message||`Unknown error`,200)}`:Ti(String(e),200)}const Q=new Set;async function Di(e=3e3){if(Q.size===0)return;let t=setTimeout(()=>{},e);await Promise.race([Promise.allSettled([...Q]),new Promise(t=>setTimeout(t,e))]),clearTimeout(t),Q.clear()}function Oi(e,t){let n=JSON.stringify({__logs__:[e],__topic__:`cli-telemetry`,__source__:t}),r=fetch(Si(),{method:`POST`,headers:{"Content-Type":`application/json`,"x-log-apiversion":`0.6.0`,"x-log-bodyrawsize":String(Buffer.byteLength(n,`utf-8`))},body:n,signal:AbortSignal.timeout(5e3)}).then(()=>{}).catch(()=>{}).finally(()=>Q.delete(r));Q.add(r)}function ki(e){let t={};for(let[n,r]of Object.entries(e))r!=null&&(wi(n)||(t[n]=typeof r==`object`?Ti(JSON.stringify(r),500):String(r)));return t}function Ai(e,t,n,r){if(!j.isTelemetryDisabled())try{let i=j.getAgentId()??void 0,{error:a,...o}=r??{};Oi(ki({event:e,command:t,version:n,...Ci,env:j.getCurrentEnv(),timestamp:Math.floor(Date.now()/1e3),...i&&{agentId:i},...o,...a!==void 0&&{error:Ei(a)}}),i||`anonymous`)}catch{}}var ji={trackEvent:Ai,flush:Di,_internal:{sanitizeError:Ei,toSlsRecord:ki,sendToSls:Oi,getSlsUrl:Si}};const Mi={name:`search`,description:`搜索 skill(按名称或描述匹配),普通搜索,返回单技能列表`,options:[{flags:`--q <query>`,description:`模型的意图 query(语义搜索,必传)`},{flags:`--k <keyword>`,description:`关键词(精确匹配,必传)`}],action:async e=>{let t=e.q?.trim(),n=e.k?.trim();(!t||!n)&&(J.error(`请提供 --q 和 --k 参数`),J.info(`提示: skill-atlas search --q <query> --k <关键词>`),process.exit(1)),await ui.run({q:t,k:n})}},Ni={name:`update`,description:`快速升级 CLI 到最新版本`,options:[{flags:`-y, --yes`,description:`非交互模式,跳过确认直接升级`},{flags:`-p, --plugin`,description:`使用官方安装脚本,同步更新 agent 插件与 CLI(推荐: skill-atlas update -y -p)`},{flags:`--pre`,description:`更新到最新 beta 版本(测试环境)`}],action:async e=>{let t=Ni._pkgInfo||{name:`skill-atlas`,version:`1.0.0`};await _i.run({pkgName:t.name,currentVersion:t.version,yes:e.yes,plugin:e.plugin,pre:e.pre})}},Pi={name:`install [name]`,description:`安装 skill(支持 skill 名称)`,options:[{flags:`-y, --yes`,description:`非交互模式,默认安装到全局`},{flags:`-g, --global`,description:`安装到全局目录`},{flags:`-p, --path <dir>`,description:`安装到自定义路径(目录),如 -p /path/to/skills 或 -p .qoder/skills`},{flags:`-a, --agent <agent...>`,description:`非交互/非 TTY 时指定目标 agent(如 cursor、openclaw)`}],action:async(e,t)=>{await Bn.run(e?[e]:[],{yes:t.yes,global:t.global,agent:t.agent,path:t.path})}},Fi={name:`agent-register`,description:`注册 Agent 到 SkillAtlas 社区`,options:[{flags:`-f, --force`,description:`强制重新注册(即使已注册)`},{flags:`--pre`,description:`使用预发环境 API 执行注册与认证`}],action:async e=>{await Qn.run({force:e.force,pre:e.pre})}},Ii={name:`skill-review <skillSlug>`,description:`对指定 Skill 发表评论`,options:[{flags:`-r, --rating <rating>`,description:`评分(1-5 星)`},{flags:`--versionUsed <version>`,description:`使用的 Skill 版本号`},{flags:`-t, --title <title>`,description:`评价标题`},{flags:`-c, --content <content>`,description:`详细评价内容`},{flags:`--rec <level>`,description:`推荐度(positive/negative/neutral)`},{flags:`--success <value>`,description:'Skill 执行是否成功:`"1"` 成功,`"0"` 失败'},{flags:`--pre`,description:`使用预发环境 API`}],action:async(e,t)=>{let n=Hn(t.pre);await nr.run(e,t,n)}},Li={name:`skill-upload`,description:`上传 Skill 到 SkillAtlas 平台`,options:[{flags:`--file <path>`,description:`ZIP 文件路径(必填)`},{flags:`--slug <slug>`,description:`Skill 唯一标识符(kebab-case,必填)`},{flags:`--ver <version>`,description:`语义化版本号(如 1.0.0,必填)`},{flags:`--displayName <name>`,description:`Skill 展示名称(必填)`},{flags:`--summary <summary>`,description:`Skill 摘要描述(必填)`},{flags:`--tags <tags>`,description:`Skill 标签(逗号分隔,如 ai,image,必填)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await sr.run({...e,version:e.ver},t)})},Ri={name:`skill-published`,description:`查询已发布的技能列表`,options:[{flags:`--pre`,description:`使用预发环境 API`}],action:async e=>{await ur.run({pre:e.pre})}},zi={name:`skill-upload-list`,description:`查询上传记录列表`,options:[{flags:`--slug <slug>`,description:`按 slug 过滤`},{flags:`--status <status>`,description:`按状态过滤(reviewing/passed/rejected)`},{flags:`--page <page>`,description:`页码(默认: 1)`},{flags:`--pageSize <size>`,description:`每页条数(默认: 20)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await mr.run({slug:e.slug,status:e.status,page:e.page?Number(e.page):void 0,pageSize:e.pageSize?Number(e.pageSize):void 0,pre:e.pre},t)})},Bi={name:`service-gateway-invoke`,description:`调用平台统一第三方服务网关`,options:[{flags:`--service-code <code>`,description:`服务编码(如 tavily_search、qwen_image)`},{flags:`--payload <json>`,description:`业务载荷(JSON 格式字符串)`},{flags:`--client-request-id <id>`,description:`客户端请求号(可选)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await br.run({serviceCode:e.serviceCode,payload:e.payload,clientRequestId:e.clientRequestId||c(),pre:e.pre},t)})},Vi=[Mi,{name:`search-combinations`,description:`搜索 Skill 组合方案(当单个 Skill 无法满足需求时)`,options:[{flags:`--q <query>`,description:`描述需要完成的完整任务(语义搜索,必传)`},{flags:`--k <keyword>`,description:`搜索关键词(必传)`},{flags:`--certLevel <level>`,description:`安全状态筛选(FULL_CERTIFIED/KEY_REVIEWED/BASIC_REVIEWED)`},{flags:`--pre`,description:`使用预发环境 API`}],action:async e=>{let t=e.q?.trim(),n=e.k?.trim();(!t||!n)&&(J.error(`请提供 --q 和 --k 参数`),J.info(`提示: skill-atlas search-combinations --q <query> --k <关键词>`),process.exit(1)),await mi.run({q:t,k:n,certLevel:e.certLevel,pre:e.pre})}},Ni,Pi,Fi,{name:`agent-info`,description:`查看当前已注册 Agent 的信息`,options:[{flags:`--pre`,description:`使用预发环境主页地址`}],action:Z(async(e,t)=>{await Pr.run({pre:e.pre},t)})},{name:`agent-credits-record`,description:`查询 credits 流水记录`,options:[{flags:`--page <page>`,description:`页码(默认: 1)`},{flags:`--pageSize <size>`,description:`每页条数(默认: 20)`},{flags:`--changeType <type>`,description:`流水类型过滤(consume/grant 等)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await zr.run({page:e.page?Number(e.page):void 0,pageSize:e.pageSize?Number(e.pageSize):void 0,changeType:e.changeType,pre:e.pre},t)})},Ii,Li,Ri,zi,Bi,{name:`uninstall`,description:`卸载 skill-atlas CLI`,options:[{flags:`-y, --yes`,description:`非交互模式,跳过确认直接卸载`}],action:async e=>{await yi.run({yes:e.yes})}},{name:`mail-create`,description:`创建邮箱`,options:[{flags:`--address <address>`,description:`邮箱地址(必填)`},{flags:`--tags <tags>`,description:`标签(逗号分隔,可选值: 主邮箱/工作/学习/金融/购物/社交/订阅/临时/项目/备用)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await Vr.run(e,t)})},{name:`mail-list`,description:`查询邮箱列表`,options:[{flags:`--page <page>`,description:`页码(默认: 1)`},{flags:`--pageSize <size>`,description:`每页条数(默认: 20)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await Ur.run({page:e.page?Number(e.page):void 0,pageSize:e.pageSize?Number(e.pageSize):void 0,pre:e.pre},t)})},{name:`mail-send`,description:`发送邮件(未指定 --from 时使用默认邮箱)`,options:[{flags:`--from <from>`,description:`发件人邮箱地址(可选,未指定则使用默认邮箱)`},{flags:`--to <addresses>`,description:`收件人(逗号分隔,必填)`},{flags:`--subject <subject>`,description:`邮件主题(必填)`},{flags:`--body <body>`,description:`邮件正文(必填)`},{flags:`--cc <addresses>`,description:`抄送(逗号分隔,可选)`},{flags:`--bcc <addresses>`,description:`密送(逗号分隔,可选)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await Gr.run(e,t)})},{name:`mail-sent-list`,description:`查询发件列表`,options:[{flags:`--address <address>`,description:`邮箱地址(必填)`},{flags:`--page <page>`,description:`页码(默认: 1)`},{flags:`--pageSize <size>`,description:`每页条数(默认: 20)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await Jr.run({address:e.address,page:e.page?Number(e.page):void 0,pageSize:e.pageSize?Number(e.pageSize):void 0,pre:e.pre},t)})},{name:`mail-sent-detail`,description:`查询发件详情`,options:[{flags:`--address <address>`,description:`邮箱地址(必填)`},{flags:`--email-id <emailId>`,description:`邮件 ID(必填)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await Yr.run(e,t)})},{name:`mail-received-list`,description:`查询收件列表`,options:[{flags:`--address <address>`,description:`邮箱地址(必填)`},{flags:`--page <page>`,description:`页码(默认: 1)`},{flags:`--pageSize <size>`,description:`每页条数(默认: 20)`},{flags:`--unread-only`,description:`仅显示未读邮件`},{flags:`--start-time <time>`,description:`起始时间过滤`},{flags:`--subject <subject>`,description:`按主题过滤`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await Zr.run({address:e.address,page:e.page?Number(e.page):void 0,pageSize:e.pageSize?Number(e.pageSize):void 0,unreadOnly:e.unreadOnly,startTime:e.startTime,subject:e.subject,pre:e.pre},t)})},{name:`mail-received-detail`,description:`查询收件详情`,options:[{flags:`--address <address>`,description:`邮箱地址(必填)`},{flags:`--email-id <emailId>`,description:`邮件 ID(必填)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await Qr.run(e,t)})},{name:`mail-config-set`,description:`设置邮箱配置项`,options:[{flags:`-k, --key <key>`,description:`配置项键名(与 --tag 二选一)`},{flags:`-V, --value <value>`,description:`配置项值(必填)`},{flags:`--tag <tag>`,description:`邮箱标签,自动设置 {tag}_mailbox 键名`}],action:async e=>{await ni.run(`set`,e)}},{name:`mail-config-get`,description:`获取邮箱配置项`,options:[{flags:`-k, --key <key>`,description:`配置项键名(必填)`}],action:async e=>{await ni.run(`get`,e)}},{name:`mail-config-list`,description:`列出所有邮箱配置项`,options:[],action:async()=>{await ni.run(`list`,{})}},{name:`vault-set`,description:`存储或更新秘钥(同名则覆盖)`,options:[{flags:`--name <name>`,description:`秘钥名称(必填)`},{flags:`--value <value>`,description:`秘钥值(明文,必填)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await ri.run(e,t)})},{name:`vault-get`,description:`根据名称获取秘钥明文值`,options:[{flags:`--name <name>`,description:`秘钥名称(必填)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await ii.run(e,t)})},{name:`vault-list`,description:`列出所有秘钥(不返回值)`,options:[{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await ai.run(e,t)})},{name:`vault-delete`,description:`根据名称删除秘钥`,options:[{flags:`--name <name>`,description:`秘钥名称(必填)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await oi.run(e,t)})}];function Hi(e){Ni._pkgInfo=e}const Ui=[` _ _ _ _ _ _ `,` ___| | _(_) | | __ _| |_| | __ _ ___ `," / __| |/ / | | |_____ / _` | __| |/ _` / __|",` \\__ \\ <| | | |_____| (_| | |_| | (_| \\__ \\`,` |___/_|\\_\\_|_|_| \\__,_|\\__|_|\\__,_|___/`];function Wi(){try{return JSON.parse(t(new URL(`../package.json`,import.meta.url),`utf8`))}catch{return{name:`skill-atlas`,version:`1.0.0`}}}function Gi(){Ui.forEach(e=>console.log(e)),console.log()}function Ki(){return process.stdin.isTTY?!process.argv.includes(`-y`)&&!process.argv.includes(`--yes`):!1}let $=`0.0.0`;function qi(e){let t={};if(!e.length)return t;for(let n=0;n<e.length-1;n++){let r=e[n];r!=null&&(t[`arg_${n}`]=String(r))}let n=e[e.length-1];if(n&&typeof n==`object`&&!Array.isArray(n))for(let[e,r]of Object.entries(n))e!==`--`&&(r==null||r===!1||(t[`arg_${e}`]=r===!0?`true`:String(r)));return t}function Ji(e,t){return async(...n)=>{let r=Date.now(),i=e.split(/\s+/)[0],a=qi(n);ji.trackEvent(`command_start`,i,$,a);try{await t(...n);let e=Date.now()-r;ji.trackEvent(`command_success`,i,$,{duration:e,...a})}catch(e){let t=Date.now()-r;throw ji.trackEvent(`command_error`,i,$,{duration:t,error:e,...a}),e}finally{await ji.flush()}}}function Yi(e,t){let n=e.command(t.name,t.description);t.options?.forEach(e=>{n.option(e.flags,e.description)}),n.action(Ji(t.name,t.action))}function Xi(e){Vi.forEach(t=>Yi(e,t))}function Zi(e){let t=e,n=t.message||String(e);if(t.name===`CACError`){let e=n.match(/Unknown option `(.+?)`/);if(e){let t=e[1];a.error(`未知选项: ${t}`),a.info(`提示: 使用 skill-atlas <command> --help 查看可用选项`),process.exit(1)}let t=n.match(/Missing required arg for option `(.+?)`/);if(t){let e=t[1];a.error(`选项 ${e} 缺少必需的参数值`),a.info(`提示: 使用 skill-atlas <command> --help 查看参数用法`),process.exit(1)}let r=n.match(/option (.+?) value is missing/);if(r){let e=r[1];a.error(`选项 ${e} 需要提供一个值`),a.info(`提示: 使用 skill-atlas <command> --help 查看参数用法`),process.exit(1)}a.error(`命令解析错误: ${n}`),a.info(`提示: 使用 skill-atlas --help 查看帮助`),process.exit(1)}(n.includes(`canceled`)||n.includes(`cancelled`))&&(a.info(`操作已取消`),process.exit(0)),a.error(`执行出错: ${n}`),process.exit(1)}async function Qi(){let e=Wi();$=e.version,Hi(e),await i(e),Ki()&&Gi();let t=process.argv.slice(2).length===0?[...process.argv.slice(0,2),`--help`]:process.argv,a=n(`skill-atlas`);Xi(a),a.help(e=>(e.push({body:r.green(`
|
|
76
|
+
`+r.dim(`─`.repeat(50))),m.log.message(r.green(`Install: npx skill-atlas install <skillName>`))}async function pi(e){let{q:t,k:n,certLevel:r,pre:i}=e;(!t||!n)&&(m.log.error(`Missing required parameters: --q and --k are required`),process.exit(1)),Vn(i);let a=n;try{fi(await Mt({q:t,k:n,certLevel:r}),a)}catch(e){m.log.error(`Search failed: ${e.message}`),process.exit(1)}}var mi={run:pi};async function hi(e,t=`latest`){let n=(process.env.npm_config_registry||`https://registry.npmjs.org`).replace(/\/$/,``),r=await fetch(`${n}/-/package/${e}/dist-tags`,{signal:AbortSignal.timeout(5e3)});if(!r.ok)throw Error(`获取版本信息失败`);return(await r.json())[t]||`0.0.0`}async function gi(e){let{pkgName:t,currentVersion:n,yes:i,plugin:a,pre:o}=e,s=o?`beta`:`latest`,c=J.createProgressReporter();c.start(o?`检查最新 beta 版本...`:`检查最新版本...`);try{let e=await hi(t,s);if(c.stop(`检查完成`),d.valid(e)||(m.log.error(`无法解析最新版本: ${e}`),process.exit(1)),d.lte(e,n)){m.log.success(`已是最新版本 ${r.cyan(n)}`);return}let l=o?r.yellow(`[beta] `):``;m.log.message(l+`发现新版本: ${r.red(n)} → ${r.green(e)}`+(a?r.dim(`(将使用官方安装脚本更新 CLI 与插件)`):``));let u=i||!process.stdin.isTTY?!0:await m.confirm({message:`是否立即升级?`,initialValue:!0});if(m.isCancel(u)||u===!1){m.cancel(`已取消升级`);return}c.start(a?`正在通过官方脚本升级(CLI + 插件)…`:`正在升级...`);let f=a?await ct():await st(t,s);c.stop(f===0?`升级完成`:`升级失败`),f!==0&&(a?J.error(`升级失败,可手动执行: `+ot()):J.error(`升级失败,可手动执行: npm install -g `+t+`@`+s),process.exit(1)),m.log.success(a?`已通过官方脚本更新(目标版本 ${r.green(e)})`:`已升级到 ${r.green(e)}`)}catch(e){c.stop(`检查失败`),m.log.error(e.message),a?J.info(`可手动执行: `+ot()):J.info(`可手动执行: npm install -g `+t+`@`+s),process.exit(1)}}var _i={run:gi};async function vi(e){let{yes:t}=e,n=t||J.isNonInteractive();if(m.intro(r.bold(`skill-atlas uninstall`)),!n){let e=await m.confirm({message:`确认要卸载 skill-atlas CLI 吗?`,initialValue:!1});if(m.isCancel(e)||e===!1){m.cancel(`已取消卸载`);return}}let i=J.createProgressReporter(n);i.start(`正在执行卸载脚本...`);try{let e=await pt();i.stop(e===0?`卸载完成`:`卸载失败`),e!==0&&(J.error(`卸载失败,可手动执行: `+ft()),process.exit(1)),m.log.success(r.green(`skill-atlas CLI 已卸载`))}catch(e){i.stop(`卸载失败`),m.log.error(e.message),J.info(`可手动执行: `+ft()),process.exit(1)}}var yi={run:vi};const bi=[`token`,`password`,`secret`,`authorization`];let xi;function Si(){if(!xi){let e=j.getSlsConfig();xi=`https://${e.project}.${e.endpoint}/logstores/${e.logStore}/track?APIVersion=0.6.0`}return xi}const Ci={os:f.platform(),nodeVersion:process.version};function wi(e){let t=e.toLowerCase();return bi.some(e=>t.includes(e))}function Ti(e,t){return e.length>t?e.slice(0,t)+`...`:e}function Ei(e){return e instanceof Error?`${e.name||`Error`}: ${Ti(e.message||`Unknown error`,200)}`:Ti(String(e),200)}const Q=new Set;async function Di(e=3e3){if(Q.size===0)return;let t=setTimeout(()=>{},e);await Promise.race([Promise.allSettled([...Q]),new Promise(t=>setTimeout(t,e))]),clearTimeout(t),Q.clear()}function Oi(e,t){let n=JSON.stringify({__logs__:[e],__topic__:`cli-telemetry`,__source__:t}),r=fetch(Si(),{method:`POST`,headers:{"Content-Type":`application/json`,"x-log-apiversion":`0.6.0`,"x-log-bodyrawsize":String(Buffer.byteLength(n,`utf-8`))},body:n,signal:AbortSignal.timeout(5e3)}).then(()=>{}).catch(()=>{}).finally(()=>Q.delete(r));Q.add(r)}function ki(e){let t={};for(let[n,r]of Object.entries(e))r!=null&&(wi(n)||(t[n]=typeof r==`object`?Ti(JSON.stringify(r),500):String(r)));return t}function Ai(e,t,n,r){if(!j.isTelemetryDisabled())try{let i=j.getAgentId()??void 0,{error:a,...o}=r??{};Oi(ki({event:e,command:t,version:n,...Ci,env:j.getCurrentEnv(),timestamp:Math.floor(Date.now()/1e3),...i&&{agentId:i},...o,...a!==void 0&&{error:Ei(a)}}),i||`anonymous`)}catch{}}var ji={trackEvent:Ai,flush:Di,_internal:{sanitizeError:Ei,toSlsRecord:ki,sendToSls:Oi,getSlsUrl:Si}};const Mi={name:`search`,description:`搜索 skill(按名称或描述匹配),普通搜索,返回单技能列表`,options:[{flags:`--q <query>`,description:`模型的意图 query(语义搜索,必传)`},{flags:`--k <keyword>`,description:`关键词(精确匹配,必传)`}],action:async e=>{let t=e.q?.trim(),n=e.k?.trim();(!t||!n)&&(J.error(`请提供 --q 和 --k 参数`),J.info(`提示: skill-atlas search --q <query> --k <关键词>`),process.exit(1)),await ui.run({q:t,k:n})}},Ni={name:`update`,description:`快速升级 CLI 到最新版本`,options:[{flags:`-y, --yes`,description:`非交互模式,跳过确认直接升级`},{flags:`-p, --plugin`,description:`使用官方安装脚本,同步更新 agent 插件与 CLI(推荐: skill-atlas update -y -p)`},{flags:`--pre`,description:`更新到最新 beta 版本(测试环境)`}],action:async e=>{let t=Ni._pkgInfo||{name:`skill-atlas`,version:`1.0.0`};await _i.run({pkgName:t.name,currentVersion:t.version,yes:e.yes,plugin:e.plugin,pre:e.pre})}},Pi={name:`install [name]`,description:`安装 skill(支持 skill 名称)`,options:[{flags:`-y, --yes`,description:`非交互模式,默认安装到全局`},{flags:`-g, --global`,description:`安装到全局目录`},{flags:`-p, --path <dir>`,description:`安装到自定义路径(目录),如 -p /path/to/skills 或 -p .qoder/skills`},{flags:`-a, --agent <agent...>`,description:`非交互/非 TTY 时指定目标 agent(如 cursor、openclaw)`}],action:async(e,t)=>{await Bn.run(e?[e]:[],{yes:t.yes,global:t.global,agent:t.agent,path:t.path})}},Fi={name:`agent-register`,description:`注册 Agent 到 SkillAtlas 社区`,options:[{flags:`-f, --force`,description:`强制重新注册(即使已注册)`},{flags:`--pre`,description:`使用预发环境 API 执行注册与认证`}],action:async e=>{await Qn.run({force:e.force,pre:e.pre})}},Ii={name:`skill-review <skillSlug>`,description:`对指定 Skill 发表评论`,options:[{flags:`-r, --rating <rating>`,description:`评分(1-5 星)`},{flags:`--versionUsed <version>`,description:`使用的 Skill 版本号`},{flags:`-t, --title <title>`,description:`评价标题`},{flags:`-c, --content <content>`,description:`详细评价内容`},{flags:`--rec <level>`,description:`推荐度(positive/negative/neutral)`},{flags:`--success <value>`,description:'Skill 执行是否成功:`"1"` 成功,`"0"` 失败'},{flags:`--pre`,description:`使用预发环境 API`}],action:async(e,t)=>{let n=Hn(t.pre);await nr.run(e,t,n)}},Li={name:`skill-upload`,description:`上传 Skill 到 SkillAtlas 平台`,options:[{flags:`--file <path>`,description:`ZIP 文件路径(必填)`},{flags:`--slug <slug>`,description:`Skill 唯一标识符(kebab-case,必填)`},{flags:`--ver <version>`,description:`语义化版本号(如 1.0.0,必填)`},{flags:`--displayName <name>`,description:`Skill 展示名称(必填)`},{flags:`--summary <summary>`,description:`Skill 摘要描述(必填)`},{flags:`--tags <tags>`,description:`Skill 标签(逗号分隔,如 ai,image,必填)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await sr.run({...e,version:e.ver},t)})},Ri={name:`skill-published`,description:`查询已发布的技能列表`,options:[{flags:`--pre`,description:`使用预发环境 API`}],action:async e=>{await ur.run({pre:e.pre})}},zi={name:`skill-upload-list`,description:`查询上传记录列表`,options:[{flags:`--slug <slug>`,description:`按 slug 过滤`},{flags:`--status <status>`,description:`按状态过滤(reviewing/passed/rejected)`},{flags:`--page <page>`,description:`页码(默认: 1)`},{flags:`--pageSize <size>`,description:`每页条数(默认: 20)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await mr.run({slug:e.slug,status:e.status,page:e.page?Number(e.page):void 0,pageSize:e.pageSize?Number(e.pageSize):void 0,pre:e.pre},t)})},Bi={name:`service-gateway-invoke`,description:`调用平台统一第三方服务网关`,options:[{flags:`--service-code <code>`,description:`服务编码(如 tavily_search、qwen_image)`},{flags:`--payload <json>`,description:`业务载荷(JSON 格式字符串)`},{flags:`--client-request-id <id>`,description:`客户端请求号(可选)`},{flags:`--skill-execution-id <id>`,description:`技能执行唯一标识(必填)`},{flags:`--skill-slug <slug>`,description:`发起调用的技能 slug(必填)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await br.run({serviceCode:e.serviceCode,payload:e.payload,clientRequestId:e.clientRequestId||c(),skillExecutionId:e.skillExecutionId,skillSlug:e.skillSlug,pre:e.pre},t)})},Vi=[Mi,{name:`search-combinations`,description:`搜索 Skill 组合方案(当单个 Skill 无法满足需求时)`,options:[{flags:`--q <query>`,description:`描述需要完成的完整任务(语义搜索,必传)`},{flags:`--k <keyword>`,description:`搜索关键词(必传)`},{flags:`--certLevel <level>`,description:`安全状态筛选(FULL_CERTIFIED/KEY_REVIEWED/BASIC_REVIEWED)`},{flags:`--pre`,description:`使用预发环境 API`}],action:async e=>{let t=e.q?.trim(),n=e.k?.trim();(!t||!n)&&(J.error(`请提供 --q 和 --k 参数`),J.info(`提示: skill-atlas search-combinations --q <query> --k <关键词>`),process.exit(1)),await mi.run({q:t,k:n,certLevel:e.certLevel,pre:e.pre})}},Ni,Pi,Fi,{name:`agent-info`,description:`查看当前已注册 Agent 的信息`,options:[{flags:`--pre`,description:`使用预发环境主页地址`}],action:Z(async(e,t)=>{await Pr.run({pre:e.pre},t)})},{name:`agent-credits-record`,description:`查询 credits 流水记录`,options:[{flags:`--page <page>`,description:`页码(默认: 1)`},{flags:`--pageSize <size>`,description:`每页条数(默认: 20)`},{flags:`--changeType <type>`,description:`流水类型过滤(consume/grant 等)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await zr.run({page:e.page?Number(e.page):void 0,pageSize:e.pageSize?Number(e.pageSize):void 0,changeType:e.changeType,pre:e.pre},t)})},Ii,Li,Ri,zi,Bi,{name:`uninstall`,description:`卸载 skill-atlas CLI`,options:[{flags:`-y, --yes`,description:`非交互模式,跳过确认直接卸载`}],action:async e=>{await yi.run({yes:e.yes})}},{name:`mail-create`,description:`创建邮箱`,options:[{flags:`--address <address>`,description:`邮箱地址(必填)`},{flags:`--tags <tags>`,description:`标签(逗号分隔,可选值: 主邮箱/工作/学习/金融/购物/社交/订阅/临时/项目/备用)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await Vr.run(e,t)})},{name:`mail-list`,description:`查询邮箱列表`,options:[{flags:`--page <page>`,description:`页码(默认: 1)`},{flags:`--pageSize <size>`,description:`每页条数(默认: 20)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await Ur.run({page:e.page?Number(e.page):void 0,pageSize:e.pageSize?Number(e.pageSize):void 0,pre:e.pre},t)})},{name:`mail-send`,description:`发送邮件(未指定 --from 时使用默认邮箱)`,options:[{flags:`--from <from>`,description:`发件人邮箱地址(可选,未指定则使用默认邮箱)`},{flags:`--to <addresses>`,description:`收件人(逗号分隔,必填)`},{flags:`--subject <subject>`,description:`邮件主题(必填)`},{flags:`--body <body>`,description:`邮件正文(必填)`},{flags:`--cc <addresses>`,description:`抄送(逗号分隔,可选)`},{flags:`--bcc <addresses>`,description:`密送(逗号分隔,可选)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await Gr.run(e,t)})},{name:`mail-sent-list`,description:`查询发件列表`,options:[{flags:`--address <address>`,description:`邮箱地址(必填)`},{flags:`--page <page>`,description:`页码(默认: 1)`},{flags:`--pageSize <size>`,description:`每页条数(默认: 20)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await Jr.run({address:e.address,page:e.page?Number(e.page):void 0,pageSize:e.pageSize?Number(e.pageSize):void 0,pre:e.pre},t)})},{name:`mail-sent-detail`,description:`查询发件详情`,options:[{flags:`--address <address>`,description:`邮箱地址(必填)`},{flags:`--email-id <emailId>`,description:`邮件 ID(必填)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await Yr.run(e,t)})},{name:`mail-received-list`,description:`查询收件列表`,options:[{flags:`--address <address>`,description:`邮箱地址(必填)`},{flags:`--page <page>`,description:`页码(默认: 1)`},{flags:`--pageSize <size>`,description:`每页条数(默认: 20)`},{flags:`--unread-only`,description:`仅显示未读邮件`},{flags:`--start-time <time>`,description:`起始时间过滤`},{flags:`--subject <subject>`,description:`按主题过滤`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await Zr.run({address:e.address,page:e.page?Number(e.page):void 0,pageSize:e.pageSize?Number(e.pageSize):void 0,unreadOnly:e.unreadOnly,startTime:e.startTime,subject:e.subject,pre:e.pre},t)})},{name:`mail-received-detail`,description:`查询收件详情`,options:[{flags:`--address <address>`,description:`邮箱地址(必填)`},{flags:`--email-id <emailId>`,description:`邮件 ID(必填)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await Qr.run(e,t)})},{name:`mail-config-set`,description:`设置邮箱配置项`,options:[{flags:`-k, --key <key>`,description:`配置项键名(与 --tag 二选一)`},{flags:`-V, --value <value>`,description:`配置项值(必填)`},{flags:`--tag <tag>`,description:`邮箱标签,自动设置 {tag}_mailbox 键名`}],action:async e=>{await ni.run(`set`,e)}},{name:`mail-config-get`,description:`获取邮箱配置项`,options:[{flags:`-k, --key <key>`,description:`配置项键名(必填)`}],action:async e=>{await ni.run(`get`,e)}},{name:`mail-config-list`,description:`列出所有邮箱配置项`,options:[],action:async()=>{await ni.run(`list`,{})}},{name:`vault-set`,description:`存储或更新秘钥(同名则覆盖)`,options:[{flags:`--name <name>`,description:`秘钥名称(必填)`},{flags:`--value <value>`,description:`秘钥值(明文,必填)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await ri.run(e,t)})},{name:`vault-get`,description:`根据名称获取秘钥明文值`,options:[{flags:`--name <name>`,description:`秘钥名称(必填)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await ii.run(e,t)})},{name:`vault-list`,description:`列出所有秘钥(不返回值)`,options:[{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await ai.run(e,t)})},{name:`vault-delete`,description:`根据名称删除秘钥`,options:[{flags:`--name <name>`,description:`秘钥名称(必填)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Z(async(e,t)=>{await oi.run(e,t)})}];function Hi(e){Ni._pkgInfo=e}const Ui=[` _ _ _ _ _ _ `,` ___| | _(_) | | __ _| |_| | __ _ ___ `," / __| |/ / | | |_____ / _` | __| |/ _` / __|",` \\__ \\ <| | | |_____| (_| | |_| | (_| \\__ \\`,` |___/_|\\_\\_|_|_| \\__,_|\\__|_|\\__,_|___/`];function Wi(){try{return JSON.parse(t(new URL(`../package.json`,import.meta.url),`utf8`))}catch{return{name:`skill-atlas`,version:`1.0.0`}}}function Gi(){Ui.forEach(e=>console.log(e)),console.log()}function Ki(){return process.stdin.isTTY?!process.argv.includes(`-y`)&&!process.argv.includes(`--yes`):!1}let $=`0.0.0`;function qi(e){let t={};if(!e.length)return t;for(let n=0;n<e.length-1;n++){let r=e[n];r!=null&&(t[`arg_${n}`]=String(r))}let n=e[e.length-1];if(n&&typeof n==`object`&&!Array.isArray(n))for(let[e,r]of Object.entries(n))e!==`--`&&(r==null||r===!1||(t[`arg_${e}`]=r===!0?`true`:String(r)));return t}function Ji(e,t){return async(...n)=>{let r=Date.now(),i=e.split(/\s+/)[0],a=qi(n);ji.trackEvent(`command_start`,i,$,a);try{await t(...n);let e=Date.now()-r;ji.trackEvent(`command_success`,i,$,{duration:e,...a})}catch(e){let t=Date.now()-r;throw ji.trackEvent(`command_error`,i,$,{duration:t,error:e,...a}),e}finally{await ji.flush()}}}function Yi(e,t){let n=e.command(t.name,t.description);t.options?.forEach(e=>{n.option(e.flags,e.description)}),n.action(Ji(t.name,t.action))}function Xi(e){Vi.forEach(t=>Yi(e,t))}function Zi(e){let t=e,n=t.message||String(e);if(t.name===`CACError`){let e=n.match(/Unknown option `(.+?)`/);if(e){let t=e[1];a.error(`未知选项: ${t}`),a.info(`提示: 使用 skill-atlas <command> --help 查看可用选项`),process.exit(1)}let t=n.match(/Missing required arg for option `(.+?)`/);if(t){let e=t[1];a.error(`选项 ${e} 缺少必需的参数值`),a.info(`提示: 使用 skill-atlas <command> --help 查看参数用法`),process.exit(1)}let r=n.match(/option (.+?) value is missing/);if(r){let e=r[1];a.error(`选项 ${e} 需要提供一个值`),a.info(`提示: 使用 skill-atlas <command> --help 查看参数用法`),process.exit(1)}a.error(`命令解析错误: ${n}`),a.info(`提示: 使用 skill-atlas --help 查看帮助`),process.exit(1)}(n.includes(`canceled`)||n.includes(`cancelled`))&&(a.info(`操作已取消`),process.exit(0)),a.error(`执行出错: ${n}`),process.exit(1)}async function Qi(){let e=Wi();$=e.version,Hi(e),await i(e),Ki()&&Gi();let t=process.argv.slice(2).length===0?[...process.argv.slice(0,2),`--help`]:process.argv,a=n(`skill-atlas`);Xi(a),a.help(e=>(e.push({body:r.green(`
|
|
77
77
|
虾小宝官网: https://skillatlas.cn`)}),e)),a.version(e.version);try{a.parse(t)}catch(e){Zi(e)}}process.on(`unhandledRejection`,Zi),Qi().catch(Zi);export{};
|
package/lib/index.js
CHANGED
|
@@ -46,7 +46,7 @@ Example: skill-atlas install my-skill`});let n=await u.text({message:`Enter skil
|
|
|
46
46
|
`),M.default.green(`已发布技能 (${e.length})`))}function mr(e){if(e instanceof N)switch(e.code){case`AGENT_NOT_FOUND`:return`Agent 不存在`;default:return e.message||`请求失败`}return e instanceof Error?e.message:String(e)}var hr={run:async(e={})=>{u.intro(M.default.bold(`skill-atlas skill-published`)),Z(e.pre);let t=A.getAgentId();t||(u.log.error(`缺少 agentId,请先执行 agent-register 注册`),process.exit(1));let n=!process.stdout.isTTY||!process.stdin.isTTY,r=J.createProgressReporter(n);r.start(`正在查询已发布技能...`);try{let e=await Nt(t);e.success||(r.stop(`查询失败`),u.log.error(e.message||`查询已发布技能失败`),process.exit(1)),r.stop(`查询完成`),pr(e.data?.items??[]),u.outro(M.default.green(`完成!`))}catch(e){r.stop(`查询失败`),u.log.error(mr(e)),process.exit(1)}}};function Q(e){switch(e){case`passed`:return M.default.green(e);case`rejected`:return M.default.red(e);case`reviewing`:return M.default.yellow(e);case`pending`:return M.default.dim(e);default:return e}}function gr(e,t,n){if(e.length===0){u.log.info(`暂无上传记录`);return}let r=e.map((e,t)=>[`${M.default.bold(M.default.cyan(`${t+1}. ${e.slug}`))} ${M.default.dim(`v${e.version}`)}`,` ${M.default.dim(`状态:`)} ${Q(e.status)}`,` ${M.default.dim(`安全审核:`)} ${Q(e.securityStatus)} | ${M.default.dim(`完整性:`)} ${Q(e.integrityStatus)} | ${M.default.dim(`可用性:`)} ${Q(e.availabilityStatus)}`,` ${M.default.dim(`创建时间:`)} ${X(e.createdAt)}`].join(`
|
|
47
47
|
`));u.note(r.join(`
|
|
48
48
|
|
|
49
|
-
`),M.default.green(`上传记录 (第 ${t} 页,共 ${n} 条)`))}function _r(e){if(e instanceof N)switch(e.code){case`UNAUTHORIZED`:return`认证失败,请重新执行 agent-register`;default:return e.message||`请求失败`}return e instanceof Error?e.message:String(e)}var vr={run:async(e,t)=>{u.intro(M.default.bold(`skill-atlas skill-upload-list`));let n=!process.stdout.isTTY||!process.stdin.isTTY,r=J.createProgressReporter(n);r.start(`正在查询上传记录...`);try{let n=await Pt({slug:e.slug,status:e.status,page:e.page,pageSize:e.pageSize},t.token);n.success||(r.stop(`查询失败`),u.log.error(n.message||`查询上传记录失败`),process.exit(1)),r.stop(`查询完成`),gr(n.data?.items??[],n.data?.page??1,n.data?.total??0),u.outro(M.default.green(`完成!`))}catch(e){r.stop(`查询失败`),u.log.error(_r(e)),process.exit(1)}}};function yr(e){return e.serviceCode?.trim()?e.payload?.trim()?{valid:!0}:{valid:!1,error:`缺少必需参数: --payload`}:{valid:!1,error:`缺少必需参数: --service-code`}}function br(e){try{let t=JSON.parse(e);return typeof t!=`object`||!t||Array.isArray(t)?{valid:!1,error:`payload 必须是有效的 JSON 对象`}:{valid:!0,payload:t}}catch{return{valid:!1,error:`payload 必须是有效的 JSON 格式`}}}function xr(e,t){let n={payload:e};return t.clientRequestId?.trim()&&(n.clientRequestId=t.clientRequestId.trim()),n}function Sr(e){if(e instanceof N)switch(e.code){case`SERVICE_DISABLED`:return`服务凭据冷却中,请稍后重试`;case`UPSTREAM_ERROR`:return`第三方服务拒绝请求`;case`UPSTREAM_TIMEOUT_CHARGED`:return`上游服务超时,已按消费处理`;case`UNAUTHORIZED`:return`认证失败,请重新执行 agent-register`;case`INSUFFICIENT_CREDITS`:return`Credits 余额不足`;default:return e.message||`请求失败`}return e instanceof Error?e.message:String(e)}function Cr(e,t){return`本次扣费: ${e} credits | 剩余: ${t} credits`}var wr={run:async(e,t)=>{u.intro(M.default.bold(`skill-atlas service-gateway-invoke`));let n=yr(e);n.valid||(u.log.error(n.error),process.exit(1));let r=br(e.payload);r.valid||(u.log.error(r.error),process.exit(1));let i=xr(r.payload,e),a=e.serviceCode.trim(),o=!process.stdout.isTTY||!process.stdin.isTTY,s=J.createProgressReporter(o);s.start(`正在调用服务: ${a}...`);try{let e=await It(a,i,t.token,void 0,18e4);e.success||(s.stop(`调用失败`),u.log.error(e.message||`服务调用失败`),e.data?.creditsCharged!==void 0&&e.data?.creditsBalance!==void 0&&u.log.info(Cr(e.data.creditsCharged,e.data.creditsBalance)),process.exit(1)),s.stop(`服务调用成功`);let n=e.data,r=[` ${M.default.green(`服务编码:`)} ${n.serviceCode}`,` ${M.default.green(`调用状态:`)} ${n.invokeStatus}`];n.creditsCharged!==void 0&&r.push(` ${M.default.green(`本次扣费:`)} ${n.creditsCharged} credits`),n.creditsBalance!==void 0&&r.push(` ${M.default.green(`剩余余额:`)} ${n.creditsBalance} credits`),u.note(r.join(`
|
|
49
|
+
`),M.default.green(`上传记录 (第 ${t} 页,共 ${n} 条)`))}function _r(e){if(e instanceof N)switch(e.code){case`UNAUTHORIZED`:return`认证失败,请重新执行 agent-register`;default:return e.message||`请求失败`}return e instanceof Error?e.message:String(e)}var vr={run:async(e,t)=>{u.intro(M.default.bold(`skill-atlas skill-upload-list`));let n=!process.stdout.isTTY||!process.stdin.isTTY,r=J.createProgressReporter(n);r.start(`正在查询上传记录...`);try{let n=await Pt({slug:e.slug,status:e.status,page:e.page,pageSize:e.pageSize},t.token);n.success||(r.stop(`查询失败`),u.log.error(n.message||`查询上传记录失败`),process.exit(1)),r.stop(`查询完成`),gr(n.data?.items??[],n.data?.page??1,n.data?.total??0),u.outro(M.default.green(`完成!`))}catch(e){r.stop(`查询失败`),u.log.error(_r(e)),process.exit(1)}}};function yr(e){return e.serviceCode?.trim()?e.payload?.trim()?{valid:!0}:{valid:!1,error:`缺少必需参数: --payload`}:{valid:!1,error:`缺少必需参数: --service-code`}}function br(e){try{let t=JSON.parse(e);return typeof t!=`object`||!t||Array.isArray(t)?{valid:!1,error:`payload 必须是有效的 JSON 对象`}:{valid:!0,payload:t}}catch{return{valid:!1,error:`payload 必须是有效的 JSON 格式`}}}function xr(e,t){let n={payload:e};return t.clientRequestId?.trim()&&(n.clientRequestId=t.clientRequestId.trim()),t.skillExecutionId?.trim()&&(n.skillExecutionId=t.skillExecutionId.trim()),t.skillSlug?.trim()&&(n.skillSlug=t.skillSlug.trim()),n}function Sr(e){if(e instanceof N)switch(e.code){case`SERVICE_DISABLED`:return`服务凭据冷却中,请稍后重试`;case`UPSTREAM_ERROR`:return`第三方服务拒绝请求`;case`UPSTREAM_TIMEOUT_CHARGED`:return`上游服务超时,已按消费处理`;case`UNAUTHORIZED`:return`认证失败,请重新执行 agent-register`;case`INSUFFICIENT_CREDITS`:return`Credits 余额不足`;default:return e.message||`请求失败`}return e instanceof Error?e.message:String(e)}function Cr(e,t){return`本次扣费: ${e} credits | 剩余: ${t} credits`}var wr={run:async(e,t)=>{u.intro(M.default.bold(`skill-atlas service-gateway-invoke`));let n=yr(e);n.valid||(u.log.error(n.error),process.exit(1));let r=br(e.payload);r.valid||(u.log.error(r.error),process.exit(1));let i=xr(r.payload,e),a=e.serviceCode.trim(),o=!process.stdout.isTTY||!process.stdin.isTTY,s=J.createProgressReporter(o);s.start(`正在调用服务: ${a}...`);try{let e=await It(a,i,t.token,void 0,18e4);e.success||(s.stop(`调用失败`),u.log.error(e.message||`服务调用失败`),e.data?.creditsCharged!==void 0&&e.data?.creditsBalance!==void 0&&u.log.info(Cr(e.data.creditsCharged,e.data.creditsBalance)),process.exit(1)),s.stop(`服务调用成功`);let n=e.data,r=[` ${M.default.green(`服务编码:`)} ${n.serviceCode}`,` ${M.default.green(`调用状态:`)} ${n.invokeStatus}`];n.creditsCharged!==void 0&&r.push(` ${M.default.green(`本次扣费:`)} ${n.creditsCharged} credits`),n.creditsBalance!==void 0&&r.push(` ${M.default.green(`剩余余额:`)} ${n.creditsBalance} credits`),u.note(r.join(`
|
|
50
50
|
`),M.default.green(`调用结果`)),n.result!==void 0&&(console.log(`
|
|
51
51
|
`+M.default.bold(`返回数据:`)),console.log(JSON.stringify(n.result,null,2))),u.outro(M.default.green(`完成!`))}catch(e){s.stop(`调用失败`);let t=Sr(e);if(u.log.error(t),e instanceof N&&e.responseData){let t=e.responseData;t.data?.creditsCharged!==void 0&&t.data?.creditsBalance!==void 0&&u.log.info(Cr(t.data.creditsCharged,t.data.creditsBalance))}process.exit(1)}}};const Tr=process.env.SKILLATLAS_CONFIG_DIR||a.join(c.homedir(),`.skillatlas`),Er=a.join(Tr,`mail-config.json`);function Dr(){e.existsSync(Tr)||e.mkdirSync(Tr,{recursive:!0})}function Or(){if(!e.existsSync(Er))return{};try{let t=e.readFileSync(Er,`utf-8`);return JSON.parse(t)}catch{return{}}}function kr(t){Dr(),t.updatedAt=new Date().toISOString(),e.writeFileSync(Er,JSON.stringify(t,null,2)+`
|
|
52
52
|
`)}function Ar(e,t){let n=Or();n[e]=t,kr(n)}function jr(e){let t=Or()[e];if(t!=null)return String(t)}function Mr(){let e=Or(),t=[];for(let[n,r]of Object.entries(e))n!==`updatedAt`&&r!=null&&t.push({key:n,value:String(r)});return t}function Nr(e){return e in Or()&&e!==`updatedAt`}const Pr=[`主邮箱`,`工作`,`学习`,`金融`,`购物`,`社交`,`订阅`,`临时`,`项目`,`备用`];function Fr(){return jr(`mailbox`)}const Ir={production:`skillatlas.cn`,pre:`pre-skillhub.aliyun-inc.com`};function Lr(e,t,n){return`https://${n?Ir.pre:Ir.production}/agents/${e}?token=${t}`}var Rr={run:async(e,t)=>{u.intro(M.default.bold(`skill-atlas agent-info`));let{agentId:n,token:r}=t,i=e.pre??!1,a=Lr(n,r,i),o=i?`预发环境`:`生产环境`,s=null,c=!1,l=J.createProgressReporter();l.start(`正在获取 Agent 信息...`);try{let e=await Rt(n,r);e.success&&e.data&&(s=e.data),l.stop(`获取成功`)}catch{c=!0,l.stop(`无法连接服务器,仅显示本地信息`)}let d=[];if(d.push(` ${M.default.green(`Agent ID:`)} ${n}`),d.push(` ${M.default.green(`环境:`)} ${o}`),s?.metadata&&(d.push(` ${M.default.green(`名称:`)} ${s.metadata.name}`),s.metadata.avatar&&d.push(` ${M.default.green(`头像:`)} ${s.metadata.avatar}`)),s?.creditAccount){let e=s.creditAccount;d.push(``),d.push(` ${M.default.cyan(`--- 虾小宝 Credits 账户 ---`)}`),d.push(` ${M.default.green(`可用 Credits:`)} ${e.availableCredits}`),d.push(` ${M.default.green(`冻结 Credits:`)} ${e.frozenCredits}`),d.push(` ${M.default.green(`累计发放:`)} ${e.totalGrantedCredits}`),d.push(` ${M.default.green(`累计消费:`)} ${e.totalConsumedCredits}`),e.welcomeBonus&&d.push(` ${M.default.green(`Welcome Bonus:`)} ${e.welcomeBonus.grantStatus}`)}let f=jr(`mailbox`);f&&(d.push(``),d.push(` ${M.default.cyan(`--- 邮箱信息 ---`)}`),d.push(` ${M.default.green(`默认邮箱 ID:`)} ${f}`)),d.push(``),d.push(` ${M.default.green(`虾小宝主页链接:`)}`),d.push(` [您的虾小宝Agent 主页](${a})`),u.note(d.join(`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skill-atlas-cli",
|
|
3
|
-
"version": "0.7.0-beta.
|
|
3
|
+
"version": "0.7.0-beta.2",
|
|
4
4
|
"description": "skill-atlas CLI - 虾小宝 命令行工具",
|
|
5
5
|
"homepage": "https://skillatlas.cn/",
|
|
6
6
|
"type": "module",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"start:pre": "SKILLATLAS_ENV=pre node bin/cli.js",
|
|
21
21
|
"mock:register": "SKILLATLAS_API_BASE=http://localhost:3456 node bin/cli.js agent-register",
|
|
22
22
|
"prepare": "npm run build",
|
|
23
|
-
"prepublishOnly": "npm run
|
|
23
|
+
"prepublishOnly": "npm run build",
|
|
24
24
|
"release": "npm run test && node scripts/release.js",
|
|
25
25
|
"oss:upload": "node scripts/oss-upload.js"
|
|
26
26
|
},
|