skill-atlas-cli 0.9.0 → 0.9.1

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/README.md CHANGED
@@ -160,15 +160,8 @@ skill-atlas skill-review <skillSlug> \
160
160
  ```bash
161
161
  # 查看 Agent 信息
162
162
  skill-atlas agent-info
163
-
164
- # 使用预发环境主页地址
165
- skill-atlas agent-info --pre
166
163
  ```
167
164
 
168
- **选项:**
169
-
170
- - `--pre` - 使用预发环境主页地址
171
-
172
165
  ### `agent-credits-record`
173
166
 
174
167
  查询当前登录 Agent 的 credits 流水记录,支持分页和流水类型过滤。需要先执行 `agent-register` 注册。
package/bin/cli.js CHANGED
@@ -54,8 +54,8 @@ Example: skill-atlas install-batch weather search-tool`});let a=X.createProgress
54
54
  `),j.default.green(`上传记录 (第 ${t} 页,共 ${n} 条)`))}function Wr(e){if(e instanceof F)switch(e.code){case`UNAUTHORIZED`:return`认证失败,请重新执行 agent-register`;default:return e.message||`请求失败`}return e instanceof Error?e.message:String(e)}var Gr={run:async(e,t)=>{h.intro(j.default.bold(`skill-atlas skill-upload-list`));let n=!process.stdout.isTTY||!process.stdin.isTTY,r=X.createProgressReporter(n);r.start(`正在查询上传记录...`);try{let n=await qt({slug:e.slug,status:e.status,page:e.page,pageSize:e.pageSize},t.token);n.success||(r.stop(`查询失败`),h.log.error(n.message||`查询上传记录失败`),process.exit(1)),r.stop(`查询完成`),Ur(n.data?.items??[],n.data?.page??1,n.data?.total??0),h.outro(j.default.green(`完成!`))}catch(e){r.stop(`查询失败`),h.log.error(Wr(e)),process.exit(1)}}};function Kr(e){return e.serviceCode?.trim()?e.payload?.trim()?{valid:!0}:{valid:!1,error:`缺少必需参数: --payload`}:{valid:!1,error:`缺少必需参数: --service-code`}}function qr(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 Jr(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 Yr(e){if(e instanceof F)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 Xr(e,t){return`本次扣费: ${e} credits | 剩余: ${t} credits`}var Zr={run:async(e,t)=>{h.intro(j.default.bold(`skill-atlas service-gateway-invoke`));let n=Kr(e);if(!n.valid){h.log.error(n.error),process.exit(1);return}let r=qr(e.payload);if(!r.valid){h.log.error(r.error),process.exit(1);return}let i=Jr(r.payload,e),a=e.serviceCode.trim(),o=!process.stdout.isTTY||!process.stdin.isTTY,s=X.createProgressReporter(o);s.start(`正在调用服务: ${a}...`);let c;try{c=await Yt(a,i,t.token,void 0,18e4)}catch(e){s.stop(`调用失败`);let t=Yr(e);if(h.log.error(t),e instanceof F&&e.responseData){let t=e.responseData;t.data?.creditsCharged!==void 0&&t.data?.creditsBalance!==void 0&&h.log.info(Xr(t.data.creditsCharged,t.data.creditsBalance))}P.setLastError(e),process.exit(1);return}if(!c.success){s.stop(`调用失败`),h.log.error(c.message||`服务调用失败`),c.data?.creditsCharged!==void 0&&c.data?.creditsBalance!==void 0&&h.log.info(Xr(c.data.creditsCharged,c.data.creditsBalance)),P.setLastError(new F(c.message||`服务调用失败`,c.code,c)),process.exit(1);return}s.stop(`服务调用成功`);let l=c.data,u=[` ${j.default.green(`服务编码:`)} ${l.serviceCode}`,` ${j.default.green(`调用状态:`)} ${l.invokeStatus}`];l.creditsCharged!==void 0&&u.push(` ${j.default.green(`本次扣费:`)} ${l.creditsCharged} credits`),l.creditsBalance!==void 0&&u.push(` ${j.default.green(`剩余余额:`)} ${l.creditsBalance} credits`),h.note(u.join(`
55
55
  `),j.default.green(`调用结果`)),l.result!==void 0&&(console.log(`
56
56
  `+j.default.bold(`返回数据:`)),console.log(JSON.stringify(l.result,null,2))),h.outro(j.default.green(`完成!`))}};const Qr=process.env.SKILLATLAS_CONFIG_DIR||u.join(p.homedir(),`.skillatlas`),$r=u.join(Qr,`mail-config.json`);function ei(){e.existsSync(Qr)||e.mkdirSync(Qr,{recursive:!0})}function ti(){if(!e.existsSync($r))return{};try{let t=e.readFileSync($r,`utf-8`);return JSON.parse(t)}catch{return{}}}function ni(t){ei(),t.updatedAt=new Date().toISOString(),e.writeFileSync($r,JSON.stringify(t,null,2)+`
57
- `)}function ri(e,t){let n=ti();n[e]=t,ni(n)}function ii(e){let t=ti()[e];if(t!=null)return String(t)}function ai(){let e=ti(),t=[];for(let[n,r]of Object.entries(e))n!==`updatedAt`&&r!=null&&t.push({key:n,value:String(r)});return t}function oi(e){return e in ti()&&e!==`updatedAt`}const si=[`主邮箱`,`工作`,`学习`,`金融`,`购物`,`社交`,`订阅`,`临时`,`项目`,`备用`];function ci(){return ii(`mailbox`)}const li={production:`skillatlas.cn`,pre:`pre-skillhub.aliyun-inc.com`};function ui(e,t,n){return`https://${n?li.pre:li.production}/agents/${e}?token=${t}`}var di={run:async(e,t)=>{h.intro(j.default.bold(`skill-atlas agent-info`));let{agentId:n,token:r}=t,i=e.pre??!1,a=ui(n,r,i),o=i?`预发环境`:`生产环境`,s=null,c=!1,l=X.createProgressReporter();l.start(`正在获取 Agent 信息...`);try{let e=await Zt(n,r);e.success&&e.data&&(s=e.data),l.stop(`获取成功`)}catch{c=!0,l.stop(`无法连接服务器,仅显示本地信息`)}let u=[];if(u.push(` ${j.default.green(`Agent ID:`)} ${n}`),u.push(` ${j.default.green(`环境:`)} ${o}`),s?.metadata&&(u.push(` ${j.default.green(`名称:`)} ${s.metadata.name}`),s.metadata.avatar&&u.push(` ${j.default.green(`头像:`)} ${s.metadata.avatar}`)),s?.creditAccount){let e=s.creditAccount;u.push(``),u.push(` ${j.default.cyan(`--- 虾小宝 Credits 账户 ---`)}`),u.push(` ${j.default.green(`可用 Credits:`)} ${e.availableCredits}`),u.push(` ${j.default.green(`冻结 Credits:`)} ${e.frozenCredits}`),u.push(` ${j.default.green(`累计发放:`)} ${e.totalGrantedCredits}`),u.push(` ${j.default.green(`累计消费:`)} ${e.totalConsumedCredits}`),e.welcomeBonus&&u.push(` ${j.default.green(`Welcome Bonus:`)} ${e.welcomeBonus.grantStatus}`)}let d=ii(`mailbox`);d&&(u.push(``),u.push(` ${j.default.cyan(`--- 邮箱信息 ---`)}`),u.push(` ${j.default.green(`默认邮箱 ID:`)} ${d}`)),u.push(``),u.push(` ${j.default.green(`虾小宝主页链接:`)}`),u.push(` [您的虾小宝Agent 主页](${a})`),h.note(u.join(`
58
- `),j.default.green(`Agent 信息`)),c&&h.log.warn(`无法获取在线信息,部分数据可能不完整`),h.outro(j.default.green(`完成!`))}};function fi(e){switch(e){case`consume`:return j.default.red(e);case`grant`:return j.default.green(e);case`refund`:return j.default.yellow(e);default:return e}}function pi(e){return e>0?j.default.green(`+${e}`):e<0?j.default.red(`${e}`):`${e}`}function mi(e,t,n){if(e.length===0){h.log.info(`暂无流水记录`);return}let r=e.map((e,t)=>[`${j.default.bold(j.default.cyan(`${t+1}. #${e.id}`))} ${fi(e.changeType)}`,` ${j.default.dim(`变更额度:`)} ${pi(e.deltaCredits)} | ${j.default.dim(`变更后余额:`)} ${e.balanceAfter}`,` ${j.default.dim(`服务编码:`)} ${e.serviceCode||j.default.dim(`N/A`)}`,` ${j.default.dim(`时间:`)} ${Z(e.createdAt)}`].join(`
57
+ `)}function ri(e,t){let n=ti();n[e]=t,ni(n)}function ii(e){let t=ti()[e];if(t!=null)return String(t)}function ai(){let e=ti(),t=[];for(let[n,r]of Object.entries(e))n!==`updatedAt`&&r!=null&&t.push({key:n,value:String(r)});return t}function oi(e){return e in ti()&&e!==`updatedAt`}const si=[`主邮箱`,`工作`,`学习`,`金融`,`购物`,`社交`,`订阅`,`临时`,`项目`,`备用`];function ci(){return ii(`mailbox`)}const li={production:`xiaxiaobao.cn`};function ui(e,t){return`https://${li.production}/agents/${e}?token=${t}`}var di={run:async(e,t)=>{h.intro(j.default.bold(`skill-atlas agent-info`));let{agentId:n,token:r}=t,i=ui(n,r),a=null,o=!1,s=X.createProgressReporter();s.start(`正在获取 Agent 信息...`);try{let e=await Zt(n,r);e.success&&e.data&&(a=e.data),s.stop(`获取成功`)}catch{o=!0,s.stop(`无法连接服务器,仅显示本地信息`)}let c=[];if(c.push(` ${j.default.green(`Agent ID:`)} ${n}`),c.push(` ${j.default.green(`环境:`)} 生产环境`),a?.metadata&&(c.push(` ${j.default.green(`名称:`)} ${a.metadata.name}`),a.metadata.avatar&&c.push(` ${j.default.green(`头像:`)} ${a.metadata.avatar}`)),a?.creditAccount){let e=a.creditAccount;c.push(``),c.push(` ${j.default.cyan(`--- 虾小宝 Credits 账户 ---`)}`),c.push(` ${j.default.green(`可用 Credits:`)} ${e.availableCredits}`),c.push(` ${j.default.green(`冻结 Credits:`)} ${e.frozenCredits}`),c.push(` ${j.default.green(`累计发放:`)} ${e.totalGrantedCredits}`),c.push(` ${j.default.green(`累计消费:`)} ${e.totalConsumedCredits}`),e.welcomeBonus&&c.push(` ${j.default.green(`Welcome Bonus:`)} ${e.welcomeBonus.grantStatus}`)}let l=ii(`mailbox`);l&&(c.push(``),c.push(` ${j.default.cyan(`--- 邮箱信息 ---`)}`),c.push(` ${j.default.green(`默认邮箱 ID:`)} ${l}`)),c.push(``),c.push(` ${j.default.green(`虾小宝主页链接:`)}`),c.push(` [您的虾小宝Agent 主页](${i})`),h.note(c.join(`
58
+ `),j.default.green(`Agent 信息`)),o&&h.log.warn(`无法获取在线信息,部分数据可能不完整`),h.outro(j.default.green(`完成!`))}};function fi(e){switch(e){case`consume`:return j.default.red(e);case`grant`:return j.default.green(e);case`refund`:return j.default.yellow(e);default:return e}}function pi(e){return e>0?j.default.green(`+${e}`):e<0?j.default.red(`${e}`):`${e}`}function mi(e,t,n){if(e.length===0){h.log.info(`暂无流水记录`);return}let r=e.map((e,t)=>[`${j.default.bold(j.default.cyan(`${t+1}. #${e.id}`))} ${fi(e.changeType)}`,` ${j.default.dim(`变更额度:`)} ${pi(e.deltaCredits)} | ${j.default.dim(`变更后余额:`)} ${e.balanceAfter}`,` ${j.default.dim(`服务编码:`)} ${e.serviceCode||j.default.dim(`N/A`)}`,` ${j.default.dim(`时间:`)} ${Z(e.createdAt)}`].join(`
59
59
  `));h.note(r.join(`
60
60
 
61
61
  `),j.default.green(`Credits 流水记录 (第 ${t} 页,共 ${n} 条)`))}function hi(e){if(e instanceof F)switch(e.code){case`UNAUTHORIZED`:return`认证失败,请重新执行 agent-register`;default:return e.message||`请求失败`}return e instanceof Error?e.message:String(e)}var gi={run:async(e,t)=>{h.intro(j.default.bold(`skill-atlas agent-credits-record`));let n=!process.stdout.isTTY||!process.stdin.isTTY,r=X.createProgressReporter(n);r.start(`正在查询流水记录...`);try{let n=await Qt({page:e.page,pageSize:e.pageSize,changeType:e.changeType},t.token);n.success||(r.stop(`查询失败`),h.log.error(n.message||`查询流水记录失败`),process.exit(1)),r.stop(`查询完成`),mi(n.data?.items??[],n.data?.page??1,n.data?.total??0),h.outro(j.default.green(`完成!`))}catch(e){r.stop(`查询失败`),h.log.error(hi(e)),process.exit(1)}}};const _i=[`主邮箱`,`工作`,`学习`,`金融`,`购物`,`社交`,`订阅`,`临时`,`项目`,`备用`];var vi={run:async(e,t)=>{h.intro(j.default.bold(`skill-atlas mail-create`));let n=e.address?.trim();n||(h.log.error(`请提供 --address 参数(邮箱地址)`),process.exit(1));let r=e.tags?e.tags.split(`,`).map(e=>e.trim()).filter(Boolean):void 0;if(r?.length){let e=r.filter(e=>!_i.includes(e));e.length&&(h.log.error(`无效标签: ${e.join(`, `)}`),h.log.info(`可选标签: ${_i.join(`、`)}`),process.exit(1))}let i=!process.stdout.isTTY||!process.stdin.isTTY,a=X.createProgressReporter(i);a.start(`正在创建邮箱...`);try{let e=await en({address:n,tags:r},t.token);e.success||(a.stop(`创建失败`),h.log.error(e.message||`创建邮箱失败`),process.exit(1)),a.stop(`创建成功`);let i=e.data;if(i){let e=[` ${j.default.green(`邮箱 ID:`)} ${i.id}`,` ${j.default.green(`地址:`)} ${i.address}`,` ${j.default.green(`创建时间:`)} ${Z(i.createdAt)}`];h.note(e.join(`
@@ -78,5 +78,5 @@ Example: skill-atlas install-batch weather search-tool`});let a=X.createProgress
78
78
  `),j.default.green(`秘钥列表(共 ${r.length} 条)`)),h.outro(j.default.green(`完成!`))}catch(e){n.stop(`获取失败`);let t=e instanceof F||e instanceof Error?e.message:String(e);h.log.error(t),process.exit(1)}}},Li={run:async(e,t)=>{h.intro(j.default.bold(`skill-atlas vault-delete`)),e.name?.trim()||(h.log.error(`缺少必需参数: --name`),process.exit(1));let n=e.name.trim(),r=X.createProgressReporter();r.start(`正在删除秘钥...`);try{let e=await dn(n,t.token);e.success||(r.stop(`删除失败`),h.log.error(e.message||`秘钥删除失败`),process.exit(1)),r.stop(`删除成功`),h.note(` ${j.default.green(`秘钥名称:`)} ${n}\n ${j.default.green(`状态:`)} 已删除`,j.default.green(`删除结果`)),h.outro(j.default.green(`完成!`))}catch(e){r.stop(`删除失败`);let t=e instanceof F||e instanceof Error?e.message:String(e);h.log.error(t),process.exit(1)}}};function Ri(e){let t=e.currentVersion;return typeof t==`string`?t:t&&typeof t==`object`&&`version`in t?t.version??`—`:`—`}function zi(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=Ri(e);return` ${r.white(n)} ${r.cyan.bold(t)} ${r.dim(`v${i}`)}`});h.note([s,c,...l].join(`
79
79
  `));let u=(n-1)*i+1,d=Math.min(n*i,t);h.log.message(r.dim(`Showing ${u}-${d} of ${t}`)),h.log.message(r.green(`Install: npx skill-atlas install <skillName>`))}async function Bi(e){let{q:t,k:n}=e,i=t||n||``;try{let e=await Ft({q:t,k:n}),{items:a,total:o}=e;if(a.length===0){h.log.error(`No skills found matching "${r.bold(i)}"`);return}zi(a,o,e.page,e.pageSize)}catch(e){h.log.error(`Search failed: ${e.message}`),process.exit(1)}}var Vi={run:Bi};function Hi(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(`
80
80
  `)}function Ui(e,t){if(e.length===0){h.log.warn(`No skill combinations found for "${r.bold(t)}"`);return}h.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(Hi(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(`
81
- `+r.dim(`─`.repeat(50))),h.log.message(r.green(`Install: npx skill-atlas install <skillName>`))}async function Wi(e){let{q:t,k:n,certLevel:r,pre:i}=e;(!t||!n)&&(h.log.error(`Missing required parameters: --q and --k are required`),process.exit(1)),yr(i);let a=n;try{Ui(await Xt({q:t,k:n,certLevel:r}),a)}catch(e){h.log.error(`Search failed: ${e.message}`),process.exit(1)}}var Gi={run:Wi};async function Ki(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 qi(e){let{pkgName:t,currentVersion:n,yes:i,plugin:a,pre:o}=e,s=o?`beta`:`latest`,c=X.createProgressReporter();c.start(o?`检查最新 beta 版本...`:`检查最新版本...`);try{let e=await Ki(t,s);if(c.stop(`检查完成`),f.valid(e)||(h.log.error(`无法解析最新版本: ${e}`),process.exit(1)),f.lte(e,n)){h.log.success(`已是最新版本 ${r.cyan(n)}`);return}let l=o?r.yellow(`[beta] `):``;h.log.message(l+`发现新版本: ${r.red(n)} → ${r.green(e)}`+(a?r.dim(`(将使用官方安装脚本更新 CLI 与插件)`):``));let u=i||!process.stdin.isTTY?!0:await h.confirm({message:`是否立即升级?`,initialValue:!0});if(h.isCancel(u)||u===!1){h.cancel(`已取消升级`);return}c.start(a?`正在通过官方脚本升级(CLI + 插件)…`:`正在升级...`);let d=a?await ut():await lt(t,s);c.stop(d===0?`升级完成`:`升级失败`),d!==0&&(a?X.error(`升级失败,可手动执行: `+ct()):X.error(`升级失败,可手动执行: npm install -g `+t+`@`+s),process.exit(1)),h.log.success(a?`已通过官方脚本更新(目标版本 ${r.green(e)})`:`已升级到 ${r.green(e)}`)}catch(e){c.stop(`检查失败`),h.log.error(e.message),a?X.info(`可手动执行: `+ct()):X.info(`可手动执行: npm install -g `+t+`@`+s),process.exit(1)}}var Ji={run:qi};async function Yi(e){let{yes:t}=e,n=t||X.isNonInteractive();if(h.intro(r.bold(`skill-atlas uninstall`)),!n){let e=await h.confirm({message:`确认要卸载 skill-atlas CLI 吗?`,initialValue:!1});if(h.isCancel(e)||e===!1){h.cancel(`已取消卸载`);return}}let i=X.createProgressReporter(n);i.start(`正在执行卸载脚本...`);try{let e=await ht();i.stop(e===0?`卸载完成`:`卸载失败`),e!==0&&(X.error(`卸载失败,可手动执行: `+mt()),process.exit(1)),h.log.success(r.green(`skill-atlas CLI 已卸载`))}catch(e){i.stop(`卸载失败`),h.log.error(e.message),X.info(`可手动执行: `+mt()),process.exit(1)}}var Xi={run:Yi};const Zi={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)&&(X.error(`请提供 --q 和 --k 参数`),X.info(`提示: skill-atlas search --q <query> --k <关键词>`),process.exit(1)),await Vi.run({q:t,k:n})}},Qi={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=Qi._pkgInfo||{name:`skill-atlas`,version:`1.0.0`};await Ji.run({pkgName:t.name,currentVersion:t.version,yes:e.yes,plugin:e.plugin,pre:e.pre})}},$i={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 dr.run(e?[e]:[],{yes:t.yes,global:t.global,agent:t.agent,path:t.path})}},ea={name:`install-batch <...names>`,description:`批量安装多个 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 vr.run(e,{yes:t.yes,global:t.global,agent:t.agent,path:t.path})}},ta={name:`agent-register`,description:`注册 Agent 到 SkillAtlas 社区`,options:[{flags:`-f, --force`,description:`强制重新注册(即使已注册)`},{flags:`--pre`,description:`使用预发环境 API 执行注册与认证`},{flags:`--utm-source <source>`,description:`注册来源参数,透传给 register 接口的 utm_source 字段`}],action:async e=>{await Ar.run({force:e.force,pre:e.pre,utmSource:e.utmSource})}},na={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=br(t.pre);await Pr.run(e,t,n)}},ra={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:Q(async(e,t)=>{await zr.run({...e,version:e.ver},t)})},ia={name:`skill-published`,description:`查询已发布的技能列表`,options:[{flags:`--pre`,description:`使用预发环境 API`}],action:async e=>{await Hr.run({pre:e.pre})}},aa={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:Q(async(e,t)=>{await Gr.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)})},oa={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:Q(async(e,t)=>{await Zr.run({serviceCode:e.serviceCode,payload:e.payload,clientRequestId:e.clientRequestId||l(),skillExecutionId:e.skillExecutionId,skillSlug:e.skillSlug,pre:e.pre},t)})},sa=[Zi,{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)&&(X.error(`请提供 --q 和 --k 参数`),X.info(`提示: skill-atlas search-combinations --q <query> --k <关键词>`),process.exit(1)),await Gi.run({q:t,k:n,certLevel:e.certLevel,pre:e.pre})}},Qi,$i,ea,ta,{name:`agent-info`,description:`查看当前已注册 Agent 的信息`,options:[{flags:`--pre`,description:`使用预发环境主页地址`}],action:Q(async(e,t)=>{await di.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:Q(async(e,t)=>{await gi.run({page:e.page?Number(e.page):void 0,pageSize:e.pageSize?Number(e.pageSize):void 0,changeType:e.changeType,pre:e.pre},t)})},na,ra,ia,aa,oa,{name:`uninstall`,description:`卸载 skill-atlas CLI`,options:[{flags:`-y, --yes`,description:`非交互模式,跳过确认直接卸载`}],action:async e=>{await Xi.run({yes:e.yes})}},{name:`mail-create`,description:`创建邮箱`,options:[{flags:`--address <address>`,description:`邮箱地址(必填)`},{flags:`--tags <tags>`,description:`标签(逗号分隔,可选值: 主邮箱/工作/学习/金融/购物/社交/订阅/临时/项目/备用)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Q(async(e,t)=>{await vi.run(e,t)})},{name:`mail-list`,description:`查询邮箱列表`,options:[{flags:`--page <page>`,description:`页码(默认: 1)`},{flags:`--pageSize <size>`,description:`每页条数(默认: 20)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Q(async(e,t)=>{await bi.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:Q(async(e,t)=>{await Si.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:Q(async(e,t)=>{await Ti.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:Q(async(e,t)=>{await Ei.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:Q(async(e,t)=>{await Oi.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:Q(async(e,t)=>{await ki.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:Q(async(e,t)=>{await Pi.run(e,t)})},{name:`vault-get`,description:`根据名称获取秘钥明文值`,options:[{flags:`--name <name>`,description:`秘钥名称(必填)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Q(async(e,t)=>{await Fi.run(e,t)})},{name:`vault-list`,description:`列出所有秘钥(不返回值)`,options:[{flags:`--pre`,description:`使用预发环境 API`}],action:Q(async(e,t)=>{await Ii.run(e,t)})},{name:`vault-delete`,description:`根据名称删除秘钥`,options:[{flags:`--name <name>`,description:`秘钥名称(必填)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Q(async(e,t)=>{await Li.run(e,t)})}];function ca(e){Qi._pkgInfo=e}var la=class extends Error{constructor(e){super(`process.exit(${e})`),this.code=e,this.name=`ExitError`}};const ua=[` _ _ _ _ _ _ `,` ___| | _(_) | | __ _| |_| | __ _ ___ `," / __| |/ / | | |_____ / _` | __| |/ _` / __|",` \\__ \\ <| | | |_____| (_| | |_| | (_| \\__ \\`,` |___/_|\\_\\_|_|_| \\__,_|\\__|_|\\__,_|___/`];function da(){try{return JSON.parse(t(new URL(`../package.json`,import.meta.url),`utf8`))}catch{return{name:`skill-atlas`,version:`1.0.0`}}}function fa(){ua.forEach(e=>console.log(e)),console.log()}function pa(){return process.stdin.isTTY?!process.argv.includes(`-y`)&&!process.argv.includes(`--yes`):!1}let ma=`0.0.0`;function ha(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 ga(e){if(!e.length)return;let t=e[e.length-1];if(t&&typeof t==`object`&&!Array.isArray(t)){let e=t.pre;return typeof e==`boolean`?e:void 0}}async function _a(e,t){if(e.split(/\s+/)[0]===`agent-register`||A.getAgentCredentials()?.token)return;let n=ga(t);await i.run({pre:n,silent:!0}),A.getAgentCredentials()?.token||(o.error(`Agent 注册未完成,无法继续执行命令`),process.exit(1))}function va(e,t){return async(...n)=>{let r=Date.now(),i=e.split(/\s+/)[0],a=ha(n),o=process.exit.bind(process);process.exit=(e=>{throw new la(typeof e==`number`?e:Number(e??0)||0)});let s=async(e,t)=>{P.trackEvent(e,i,ma,{duration:Date.now()-r,...t,...a}),await P.flush(),process.exit=o};P.trackEvent(`command_start`,i,ma,a);try{await _a(e,n),await t(...n),await s(`command_success`,{});return}catch(e){if(!(e instanceof la))throw await s(`command_error`,{error:e}),e;let t=e.code===0,n=t?void 0:P.consumeLastError()??Error(`process.exit(${e.code})`);await s(t?`command_success`:`command_error`,{exitCode:e.code,...n!==void 0&&{error:n}}),o(e.code)}}}function ya(e,t){let n=e.command(t.name,t.description);t.options?.forEach(e=>{n.option(e.flags,e.description)}),n.action(va(t.name,t.action))}function ba(e){sa.forEach(t=>ya(e,t))}function xa(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];o.error(`未知选项: ${t}`),o.info(`提示: 使用 skill-atlas <command> --help 查看可用选项`),process.exit(1)}let t=n.match(/Missing required arg for option `(.+?)`/);if(t){let e=t[1];o.error(`选项 ${e} 缺少必需的参数值`),o.info(`提示: 使用 skill-atlas <command> --help 查看参数用法`),process.exit(1)}let r=n.match(/option (.+?) value is missing/);if(r){let e=r[1];o.error(`选项 ${e} 需要提供一个值`),o.info(`提示: 使用 skill-atlas <command> --help 查看参数用法`),process.exit(1)}o.error(`命令解析错误: ${n}`),o.info(`提示: 使用 skill-atlas --help 查看帮助`),process.exit(1)}(n.includes(`canceled`)||n.includes(`cancelled`))&&(o.info(`操作已取消`),process.exit(0)),o.error(`执行出错: ${n}`),process.exit(1)}async function Sa(){let e=da();ma=e.version,ca(e),await a(e),pa()&&fa();let t=process.argv.slice(2).length===0?[...process.argv.slice(0,2),`--help`]:process.argv,i=n(`skill-atlas`);ba(i),i.help(e=>(e.push({body:r.green(`
81
+ `+r.dim(`─`.repeat(50))),h.log.message(r.green(`Install: npx skill-atlas install <skillName>`))}async function Wi(e){let{q:t,k:n,certLevel:r,pre:i}=e;(!t||!n)&&(h.log.error(`Missing required parameters: --q and --k are required`),process.exit(1)),yr(i);let a=n;try{Ui(await Xt({q:t,k:n,certLevel:r}),a)}catch(e){h.log.error(`Search failed: ${e.message}`),process.exit(1)}}var Gi={run:Wi};async function Ki(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 qi(e){let{pkgName:t,currentVersion:n,yes:i,plugin:a,pre:o}=e,s=o?`beta`:`latest`,c=X.createProgressReporter();c.start(o?`检查最新 beta 版本...`:`检查最新版本...`);try{let e=await Ki(t,s);if(c.stop(`检查完成`),f.valid(e)||(h.log.error(`无法解析最新版本: ${e}`),process.exit(1)),f.lte(e,n)){h.log.success(`已是最新版本 ${r.cyan(n)}`);return}let l=o?r.yellow(`[beta] `):``;h.log.message(l+`发现新版本: ${r.red(n)} → ${r.green(e)}`+(a?r.dim(`(将使用官方安装脚本更新 CLI 与插件)`):``));let u=i||!process.stdin.isTTY?!0:await h.confirm({message:`是否立即升级?`,initialValue:!0});if(h.isCancel(u)||u===!1){h.cancel(`已取消升级`);return}c.start(a?`正在通过官方脚本升级(CLI + 插件)…`:`正在升级...`);let d=a?await ut():await lt(t,s);c.stop(d===0?`升级完成`:`升级失败`),d!==0&&(a?X.error(`升级失败,可手动执行: `+ct()):X.error(`升级失败,可手动执行: npm install -g `+t+`@`+s),process.exit(1)),h.log.success(a?`已通过官方脚本更新(目标版本 ${r.green(e)})`:`已升级到 ${r.green(e)}`)}catch(e){c.stop(`检查失败`),h.log.error(e.message),a?X.info(`可手动执行: `+ct()):X.info(`可手动执行: npm install -g `+t+`@`+s),process.exit(1)}}var Ji={run:qi};async function Yi(e){let{yes:t}=e,n=t||X.isNonInteractive();if(h.intro(r.bold(`skill-atlas uninstall`)),!n){let e=await h.confirm({message:`确认要卸载 skill-atlas CLI 吗?`,initialValue:!1});if(h.isCancel(e)||e===!1){h.cancel(`已取消卸载`);return}}let i=X.createProgressReporter(n);i.start(`正在执行卸载脚本...`);try{let e=await ht();i.stop(e===0?`卸载完成`:`卸载失败`),e!==0&&(X.error(`卸载失败,可手动执行: `+mt()),process.exit(1)),h.log.success(r.green(`skill-atlas CLI 已卸载`))}catch(e){i.stop(`卸载失败`),h.log.error(e.message),X.info(`可手动执行: `+mt()),process.exit(1)}}var Xi={run:Yi};const Zi={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)&&(X.error(`请提供 --q 和 --k 参数`),X.info(`提示: skill-atlas search --q <query> --k <关键词>`),process.exit(1)),await Vi.run({q:t,k:n})}},Qi={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=Qi._pkgInfo||{name:`skill-atlas`,version:`1.0.0`};await Ji.run({pkgName:t.name,currentVersion:t.version,yes:e.yes,plugin:e.plugin,pre:e.pre})}},$i={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 dr.run(e?[e]:[],{yes:t.yes,global:t.global,agent:t.agent,path:t.path})}},ea={name:`install-batch <...names>`,description:`批量安装多个 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 vr.run(e,{yes:t.yes,global:t.global,agent:t.agent,path:t.path})}},ta={name:`agent-register`,description:`注册 Agent 到 SkillAtlas 社区`,options:[{flags:`-f, --force`,description:`强制重新注册(即使已注册)`},{flags:`--pre`,description:`使用预发环境 API 执行注册与认证`},{flags:`--utm-source <source>`,description:`注册来源参数,透传给 register 接口的 utm_source 字段`}],action:async e=>{await Ar.run({force:e.force,pre:e.pre,utmSource:e.utmSource})}},na={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=br(t.pre);await Pr.run(e,t,n)}},ra={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:Q(async(e,t)=>{await zr.run({...e,version:e.ver},t)})},ia={name:`skill-published`,description:`查询已发布的技能列表`,options:[{flags:`--pre`,description:`使用预发环境 API`}],action:async e=>{await Hr.run({pre:e.pre})}},aa={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:Q(async(e,t)=>{await Gr.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)})},oa={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:Q(async(e,t)=>{await Zr.run({serviceCode:e.serviceCode,payload:e.payload,clientRequestId:e.clientRequestId||l(),skillExecutionId:e.skillExecutionId,skillSlug:e.skillSlug,pre:e.pre},t)})},sa=[Zi,{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)&&(X.error(`请提供 --q 和 --k 参数`),X.info(`提示: skill-atlas search-combinations --q <query> --k <关键词>`),process.exit(1)),await Gi.run({q:t,k:n,certLevel:e.certLevel,pre:e.pre})}},Qi,$i,ea,ta,{name:`agent-info`,description:`查看当前已注册 Agent 的信息`,options:[],action:Q(async(e,t)=>{await di.run({},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:Q(async(e,t)=>{await gi.run({page:e.page?Number(e.page):void 0,pageSize:e.pageSize?Number(e.pageSize):void 0,changeType:e.changeType,pre:e.pre},t)})},na,ra,ia,aa,oa,{name:`uninstall`,description:`卸载 skill-atlas CLI`,options:[{flags:`-y, --yes`,description:`非交互模式,跳过确认直接卸载`}],action:async e=>{await Xi.run({yes:e.yes})}},{name:`mail-create`,description:`创建邮箱`,options:[{flags:`--address <address>`,description:`邮箱地址(必填)`},{flags:`--tags <tags>`,description:`标签(逗号分隔,可选值: 主邮箱/工作/学习/金融/购物/社交/订阅/临时/项目/备用)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Q(async(e,t)=>{await vi.run(e,t)})},{name:`mail-list`,description:`查询邮箱列表`,options:[{flags:`--page <page>`,description:`页码(默认: 1)`},{flags:`--pageSize <size>`,description:`每页条数(默认: 20)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Q(async(e,t)=>{await bi.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:Q(async(e,t)=>{await Si.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:Q(async(e,t)=>{await Ti.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:Q(async(e,t)=>{await Ei.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:Q(async(e,t)=>{await Oi.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:Q(async(e,t)=>{await ki.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:Q(async(e,t)=>{await Pi.run(e,t)})},{name:`vault-get`,description:`根据名称获取秘钥明文值`,options:[{flags:`--name <name>`,description:`秘钥名称(必填)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Q(async(e,t)=>{await Fi.run(e,t)})},{name:`vault-list`,description:`列出所有秘钥(不返回值)`,options:[{flags:`--pre`,description:`使用预发环境 API`}],action:Q(async(e,t)=>{await Ii.run(e,t)})},{name:`vault-delete`,description:`根据名称删除秘钥`,options:[{flags:`--name <name>`,description:`秘钥名称(必填)`},{flags:`--pre`,description:`使用预发环境 API`}],action:Q(async(e,t)=>{await Li.run(e,t)})}];function ca(e){Qi._pkgInfo=e}var la=class extends Error{constructor(e){super(`process.exit(${e})`),this.code=e,this.name=`ExitError`}};const ua=[` _ _ _ _ _ _ `,` ___| | _(_) | | __ _| |_| | __ _ ___ `," / __| |/ / | | |_____ / _` | __| |/ _` / __|",` \\__ \\ <| | | |_____| (_| | |_| | (_| \\__ \\`,` |___/_|\\_\\_|_|_| \\__,_|\\__|_|\\__,_|___/`];function da(){try{return JSON.parse(t(new URL(`../package.json`,import.meta.url),`utf8`))}catch{return{name:`skill-atlas`,version:`1.0.0`}}}function fa(){ua.forEach(e=>console.log(e)),console.log()}function pa(){return process.stdin.isTTY?!process.argv.includes(`-y`)&&!process.argv.includes(`--yes`):!1}let ma=`0.0.0`;function ha(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 ga(e){if(!e.length)return;let t=e[e.length-1];if(t&&typeof t==`object`&&!Array.isArray(t)){let e=t.pre;return typeof e==`boolean`?e:void 0}}async function _a(e,t){if(e.split(/\s+/)[0]===`agent-register`||A.getAgentCredentials()?.token)return;let n=ga(t);await i.run({pre:n,silent:!0}),A.getAgentCredentials()?.token||(o.error(`Agent 注册未完成,无法继续执行命令`),process.exit(1))}function va(e,t){return async(...n)=>{let r=Date.now(),i=e.split(/\s+/)[0],a=ha(n),o=process.exit.bind(process);process.exit=(e=>{throw new la(typeof e==`number`?e:Number(e??0)||0)});let s=async(e,t)=>{P.trackEvent(e,i,ma,{duration:Date.now()-r,...t,...a}),await P.flush(),process.exit=o};P.trackEvent(`command_start`,i,ma,a);try{await _a(e,n),await t(...n),await s(`command_success`,{});return}catch(e){if(!(e instanceof la))throw await s(`command_error`,{error:e}),e;let t=e.code===0,n=t?void 0:P.consumeLastError()??Error(`process.exit(${e.code})`);await s(t?`command_success`:`command_error`,{exitCode:e.code,...n!==void 0&&{error:n}}),o(e.code)}}}function ya(e,t){let n=e.command(t.name,t.description);t.options?.forEach(e=>{n.option(e.flags,e.description)}),n.action(va(t.name,t.action))}function ba(e){sa.forEach(t=>ya(e,t))}function xa(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];o.error(`未知选项: ${t}`),o.info(`提示: 使用 skill-atlas <command> --help 查看可用选项`),process.exit(1)}let t=n.match(/Missing required arg for option `(.+?)`/);if(t){let e=t[1];o.error(`选项 ${e} 缺少必需的参数值`),o.info(`提示: 使用 skill-atlas <command> --help 查看参数用法`),process.exit(1)}let r=n.match(/option (.+?) value is missing/);if(r){let e=r[1];o.error(`选项 ${e} 需要提供一个值`),o.info(`提示: 使用 skill-atlas <command> --help 查看参数用法`),process.exit(1)}o.error(`命令解析错误: ${n}`),o.info(`提示: 使用 skill-atlas --help 查看帮助`),process.exit(1)}(n.includes(`canceled`)||n.includes(`cancelled`))&&(o.info(`操作已取消`),process.exit(0)),o.error(`执行出错: ${n}`),process.exit(1)}async function Sa(){let e=da();ma=e.version,ca(e),await a(e),pa()&&fa();let t=process.argv.slice(2).length===0?[...process.argv.slice(0,2),`--help`]:process.argv,i=n(`skill-atlas`);ba(i),i.help(e=>(e.push({body:r.green(`
82
82
  虾小宝官网: https://skillatlas.cn`)}),e)),i.version(e.version);try{i.parse(t)}catch(e){xa(e)}}process.on(`unhandledRejection`,xa),Sa().catch(xa);export{};
package/lib/index.js CHANGED
@@ -54,8 +54,8 @@ Example: skill-atlas install-batch weather search-tool`});let i=Z.createProgress
54
54
  `),O.default.green(`上传记录 (第 ${t} 页,共 ${n} 条)`))}function Jr(e){if(e instanceof M)switch(e.code){case`UNAUTHORIZED`:return`认证失败,请重新执行 agent-register`;default:return e.message||`请求失败`}return e instanceof Error?e.message:String(e)}var Yr={run:async(e,t)=>{u.intro(O.default.bold(`skill-atlas skill-upload-list`));let n=!process.stdout.isTTY||!process.stdin.isTTY,r=Z.createProgressReporter(n);r.start(`正在查询上传记录...`);try{let n=await en({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(`查询完成`),qr(n.data?.items??[],n.data?.page??1,n.data?.total??0),u.outro(O.default.green(`完成!`))}catch(e){r.stop(`查询失败`),u.log.error(Jr(e)),process.exit(1)}}};function Xr(e){return e.serviceCode?.trim()?e.payload?.trim()?{valid:!0}:{valid:!1,error:`缺少必需参数: --payload`}:{valid:!1,error:`缺少必需参数: --service-code`}}function Zr(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 Qr(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 $r(e){if(e instanceof M)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 ei(e,t){return`本次扣费: ${e} credits | 剩余: ${t} credits`}var ti={run:async(e,t)=>{u.intro(O.default.bold(`skill-atlas service-gateway-invoke`));let n=Xr(e);if(!n.valid){u.log.error(n.error),process.exit(1);return}let r=Zr(e.payload);if(!r.valid){u.log.error(r.error),process.exit(1);return}let i=Qr(r.payload,e),a=e.serviceCode.trim(),o=!process.stdout.isTTY||!process.stdin.isTTY,s=Z.createProgressReporter(o);s.start(`正在调用服务: ${a}...`);let c;try{c=await nn(a,i,t.token,void 0,18e4)}catch(e){s.stop(`调用失败`);let t=$r(e);if(u.log.error(t),e instanceof M&&e.responseData){let t=e.responseData;t.data?.creditsCharged!==void 0&&t.data?.creditsBalance!==void 0&&u.log.info(ei(t.data.creditsCharged,t.data.creditsBalance))}j.setLastError(e),process.exit(1);return}if(!c.success){s.stop(`调用失败`),u.log.error(c.message||`服务调用失败`),c.data?.creditsCharged!==void 0&&c.data?.creditsBalance!==void 0&&u.log.info(ei(c.data.creditsCharged,c.data.creditsBalance)),j.setLastError(new M(c.message||`服务调用失败`,c.code,c)),process.exit(1);return}s.stop(`服务调用成功`);let l=c.data,d=[` ${O.default.green(`服务编码:`)} ${l.serviceCode}`,` ${O.default.green(`调用状态:`)} ${l.invokeStatus}`];l.creditsCharged!==void 0&&d.push(` ${O.default.green(`本次扣费:`)} ${l.creditsCharged} credits`),l.creditsBalance!==void 0&&d.push(` ${O.default.green(`剩余余额:`)} ${l.creditsBalance} credits`),u.note(d.join(`
55
55
  `),O.default.green(`调用结果`)),l.result!==void 0&&(console.log(`
56
56
  `+O.default.bold(`返回数据:`)),console.log(JSON.stringify(l.result,null,2))),u.outro(O.default.green(`完成!`))}};const ni=process.env.SKILLATLAS_CONFIG_DIR||a.join(c.homedir(),`.skillatlas`),ri=a.join(ni,`mail-config.json`);function ii(){e.existsSync(ni)||e.mkdirSync(ni,{recursive:!0})}function ai(){if(!e.existsSync(ri))return{};try{let t=e.readFileSync(ri,`utf-8`);return JSON.parse(t)}catch{return{}}}function oi(t){ii(),t.updatedAt=new Date().toISOString(),e.writeFileSync(ri,JSON.stringify(t,null,2)+`
57
- `)}function si(e,t){let n=ai();n[e]=t,oi(n)}function ci(e){let t=ai()[e];if(t!=null)return String(t)}function li(){let e=ai(),t=[];for(let[n,r]of Object.entries(e))n!==`updatedAt`&&r!=null&&t.push({key:n,value:String(r)});return t}function ui(e){return e in ai()&&e!==`updatedAt`}const di=[`主邮箱`,`工作`,`学习`,`金融`,`购物`,`社交`,`订阅`,`临时`,`项目`,`备用`];function fi(){return ci(`mailbox`)}const pi={production:`skillatlas.cn`,pre:`pre-skillhub.aliyun-inc.com`};function mi(e,t,n){return`https://${n?pi.pre:pi.production}/agents/${e}?token=${t}`}var hi={run:async(e,t)=>{u.intro(O.default.bold(`skill-atlas agent-info`));let{agentId:n,token:r}=t,i=e.pre??!1,a=mi(n,r,i),o=i?`预发环境`:`生产环境`,s=null,c=!1,l=Z.createProgressReporter();l.start(`正在获取 Agent 信息...`);try{let e=await an(n,r);e.success&&e.data&&(s=e.data),l.stop(`获取成功`)}catch{c=!0,l.stop(`无法连接服务器,仅显示本地信息`)}let d=[];if(d.push(` ${O.default.green(`Agent ID:`)} ${n}`),d.push(` ${O.default.green(`环境:`)} ${o}`),s?.metadata&&(d.push(` ${O.default.green(`名称:`)} ${s.metadata.name}`),s.metadata.avatar&&d.push(` ${O.default.green(`头像:`)} ${s.metadata.avatar}`)),s?.creditAccount){let e=s.creditAccount;d.push(``),d.push(` ${O.default.cyan(`--- 虾小宝 Credits 账户 ---`)}`),d.push(` ${O.default.green(`可用 Credits:`)} ${e.availableCredits}`),d.push(` ${O.default.green(`冻结 Credits:`)} ${e.frozenCredits}`),d.push(` ${O.default.green(`累计发放:`)} ${e.totalGrantedCredits}`),d.push(` ${O.default.green(`累计消费:`)} ${e.totalConsumedCredits}`),e.welcomeBonus&&d.push(` ${O.default.green(`Welcome Bonus:`)} ${e.welcomeBonus.grantStatus}`)}let f=ci(`mailbox`);f&&(d.push(``),d.push(` ${O.default.cyan(`--- 邮箱信息 ---`)}`),d.push(` ${O.default.green(`默认邮箱 ID:`)} ${f}`)),d.push(``),d.push(` ${O.default.green(`虾小宝主页链接:`)}`),d.push(` [您的虾小宝Agent 主页](${a})`),u.note(d.join(`
58
- `),O.default.green(`Agent 信息`)),c&&u.log.warn(`无法获取在线信息,部分数据可能不完整`),u.outro(O.default.green(`完成!`))}};function gi(e){switch(e){case`consume`:return O.default.red(e);case`grant`:return O.default.green(e);case`refund`:return O.default.yellow(e);default:return e}}function _i(e){return e>0?O.default.green(`+${e}`):e<0?O.default.red(`${e}`):`${e}`}function vi(e,t,n){if(e.length===0){u.log.info(`暂无流水记录`);return}let r=e.map((e,t)=>[`${O.default.bold(O.default.cyan(`${t+1}. #${e.id}`))} ${gi(e.changeType)}`,` ${O.default.dim(`变更额度:`)} ${_i(e.deltaCredits)} | ${O.default.dim(`变更后余额:`)} ${e.balanceAfter}`,` ${O.default.dim(`服务编码:`)} ${e.serviceCode||O.default.dim(`N/A`)}`,` ${O.default.dim(`时间:`)} ${Q(e.createdAt)}`].join(`
57
+ `)}function si(e,t){let n=ai();n[e]=t,oi(n)}function ci(e){let t=ai()[e];if(t!=null)return String(t)}function li(){let e=ai(),t=[];for(let[n,r]of Object.entries(e))n!==`updatedAt`&&r!=null&&t.push({key:n,value:String(r)});return t}function ui(e){return e in ai()&&e!==`updatedAt`}const di=[`主邮箱`,`工作`,`学习`,`金融`,`购物`,`社交`,`订阅`,`临时`,`项目`,`备用`];function fi(){return ci(`mailbox`)}const pi={production:`xiaxiaobao.cn`};function mi(e,t){return`https://${pi.production}/agents/${e}?token=${t}`}var hi={run:async(e,t)=>{u.intro(O.default.bold(`skill-atlas agent-info`));let{agentId:n,token:r}=t,i=mi(n,r),a=null,o=!1,s=Z.createProgressReporter();s.start(`正在获取 Agent 信息...`);try{let e=await an(n,r);e.success&&e.data&&(a=e.data),s.stop(`获取成功`)}catch{o=!0,s.stop(`无法连接服务器,仅显示本地信息`)}let c=[];if(c.push(` ${O.default.green(`Agent ID:`)} ${n}`),c.push(` ${O.default.green(`环境:`)} 生产环境`),a?.metadata&&(c.push(` ${O.default.green(`名称:`)} ${a.metadata.name}`),a.metadata.avatar&&c.push(` ${O.default.green(`头像:`)} ${a.metadata.avatar}`)),a?.creditAccount){let e=a.creditAccount;c.push(``),c.push(` ${O.default.cyan(`--- 虾小宝 Credits 账户 ---`)}`),c.push(` ${O.default.green(`可用 Credits:`)} ${e.availableCredits}`),c.push(` ${O.default.green(`冻结 Credits:`)} ${e.frozenCredits}`),c.push(` ${O.default.green(`累计发放:`)} ${e.totalGrantedCredits}`),c.push(` ${O.default.green(`累计消费:`)} ${e.totalConsumedCredits}`),e.welcomeBonus&&c.push(` ${O.default.green(`Welcome Bonus:`)} ${e.welcomeBonus.grantStatus}`)}let l=ci(`mailbox`);l&&(c.push(``),c.push(` ${O.default.cyan(`--- 邮箱信息 ---`)}`),c.push(` ${O.default.green(`默认邮箱 ID:`)} ${l}`)),c.push(``),c.push(` ${O.default.green(`虾小宝主页链接:`)}`),c.push(` [您的虾小宝Agent 主页](${i})`),u.note(c.join(`
58
+ `),O.default.green(`Agent 信息`)),o&&u.log.warn(`无法获取在线信息,部分数据可能不完整`),u.outro(O.default.green(`完成!`))}};function gi(e){switch(e){case`consume`:return O.default.red(e);case`grant`:return O.default.green(e);case`refund`:return O.default.yellow(e);default:return e}}function _i(e){return e>0?O.default.green(`+${e}`):e<0?O.default.red(`${e}`):`${e}`}function vi(e,t,n){if(e.length===0){u.log.info(`暂无流水记录`);return}let r=e.map((e,t)=>[`${O.default.bold(O.default.cyan(`${t+1}. #${e.id}`))} ${gi(e.changeType)}`,` ${O.default.dim(`变更额度:`)} ${_i(e.deltaCredits)} | ${O.default.dim(`变更后余额:`)} ${e.balanceAfter}`,` ${O.default.dim(`服务编码:`)} ${e.serviceCode||O.default.dim(`N/A`)}`,` ${O.default.dim(`时间:`)} ${Q(e.createdAt)}`].join(`
59
59
  `));u.note(r.join(`
60
60
 
61
61
  `),O.default.green(`Credits 流水记录 (第 ${t} 页,共 ${n} 条)`))}function yi(e){if(e instanceof M)switch(e.code){case`UNAUTHORIZED`:return`认证失败,请重新执行 agent-register`;default:return e.message||`请求失败`}return e instanceof Error?e.message:String(e)}var bi={run:async(e,t)=>{u.intro(O.default.bold(`skill-atlas agent-credits-record`));let n=!process.stdout.isTTY||!process.stdin.isTTY,r=Z.createProgressReporter(n);r.start(`正在查询流水记录...`);try{let n=await on({page:e.page,pageSize:e.pageSize,changeType:e.changeType},t.token);n.success||(r.stop(`查询失败`),u.log.error(n.message||`查询流水记录失败`),process.exit(1)),r.stop(`查询完成`),vi(n.data?.items??[],n.data?.page??1,n.data?.total??0),u.outro(O.default.green(`完成!`))}catch(e){r.stop(`查询失败`),u.log.error(yi(e)),process.exit(1)}}};const xi=[`主邮箱`,`工作`,`学习`,`金融`,`购物`,`社交`,`订阅`,`临时`,`项目`,`备用`];var Si={run:async(e,t)=>{u.intro(O.default.bold(`skill-atlas mail-create`));let n=e.address?.trim();n||(u.log.error(`请提供 --address 参数(邮箱地址)`),process.exit(1));let r=e.tags?e.tags.split(`,`).map(e=>e.trim()).filter(Boolean):void 0;if(r?.length){let e=r.filter(e=>!xi.includes(e));e.length&&(u.log.error(`无效标签: ${e.join(`, `)}`),u.log.info(`可选标签: ${xi.join(`、`)}`),process.exit(1))}let i=!process.stdout.isTTY||!process.stdin.isTTY,a=Z.createProgressReporter(i);a.start(`正在创建邮箱...`);try{let e=await cn({address:n,tags:r},t.token);e.success||(a.stop(`创建失败`),u.log.error(e.message||`创建邮箱失败`),process.exit(1)),a.stop(`创建成功`);let i=e.data;if(i){let e=[` ${O.default.green(`邮箱 ID:`)} ${i.id}`,` ${O.default.green(`地址:`)} ${i.address}`,` ${O.default.green(`创建时间:`)} ${Q(i.createdAt)}`];u.note(e.join(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skill-atlas-cli",
3
- "version": "0.9.0",
3
+ "version": "0.9.1",
4
4
  "description": "skill-atlas CLI - 虾小宝 命令行工具",
5
5
  "homepage": "https://skillatlas.cn/",
6
6
  "type": "module",