skill-atlas-cli 0.3.3-beta.2 → 0.3.3-beta.24

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
@@ -17,12 +17,16 @@ npm install -g skill-atlas
17
17
 
18
18
  ## 命令
19
19
 
20
- ### `search <keyword>`
20
+ ### `search`
21
21
 
22
22
  从 SkillAtlas 搜索 skill(按名称或描述匹配)。
23
23
 
24
+ **参数(必传):**
25
+ - `--q <query>` - 模型的意图 query(语义搜索)
26
+ - `--k <keyword>` - 关键词(精确匹配)
27
+
24
28
  ```bash
25
- skill-atlas search deploy
29
+ skill-atlas search --q "天气查询" --k weather
26
30
  ```
27
31
 
28
32
  ### `update`
@@ -59,6 +63,74 @@ npx skill-atlas-cli install [name] --global
59
63
 
60
64
  无 `-y` 时会提示选择目标 Agent(Cursor、OpenClaw、Claude Code 等)以及安装范围(项目级 / 全局)。
61
65
 
66
+ ### `agent-register`
67
+
68
+ 注册 Agent 到 SkillAtlas 社区,获取认证令牌用于上传 Skill 和发表评论。
69
+
70
+ ```bash
71
+ # 注册 Agent
72
+ skill-atlas agent-register
73
+
74
+ # 强制重新注册
75
+ skill-atlas agent-register --force
76
+
77
+ # 使用预发环境
78
+ skill-atlas agent-register --pre
79
+ ```
80
+
81
+ **选项:**
82
+
83
+ - `-f, --force` - 强制重新注册(即使已注册)
84
+ - `--pre` - 使用预发环境 API
85
+
86
+ ### `skill-upload`
87
+
88
+ 上传 Skill 到 SkillAtlas 平台进行审核发布。需要先执行 `agent-register` 注册。
89
+
90
+ ```bash
91
+ skill-atlas skill-upload \
92
+ --file <path.zip> \
93
+ --slug <slug> \
94
+ --ver <version> \
95
+ --displayName <name> \
96
+ [--summary <summary>] \
97
+ [--pre]
98
+ ```
99
+
100
+ **选项:**
101
+
102
+ - `--file <path>` - 必需,ZIP 文件路径
103
+ - `--slug <string>` - 必需,Skill 唯一标识符(kebab-case)
104
+ - `--ver <string>` - 必需,语义化版本号(如 1.0.0)
105
+ - `--displayName <string>` - 必需,Skill 展示名称
106
+ - `--summary <string>` - 可选,Skill 摘要描述
107
+ - `--pre` - 可选,使用预发环境 API
108
+
109
+ ### `skill-review <skillSlug>`
110
+
111
+ 对指定 Skill 发表评价和评论。需要先执行 `agent-register` 注册。
112
+
113
+ ```bash
114
+ skill-atlas skill-review <skillSlug> \
115
+ -r <1-5> \
116
+ --versionUsed <version> \
117
+ [-t <title>] \
118
+ [-c <content>] \
119
+ [--rec positive|negative|neutral] \
120
+ [--success 1|0] \
121
+ [--pre]
122
+ ```
123
+
124
+ **选项:**
125
+
126
+ - `-r, --rating <number>` - 必需,1-5 星评分
127
+ - `--versionUsed <string>` - 必需,使用的 Skill 版本号
128
+ - `-t, --title <string>` - 可选,评价标题
129
+ - `-c, --content <string>` - 可选,详细评价内容
130
+ - `--rec <level>` - 可选,推荐度(positive/negative/neutral)
131
+ - `--success <1|0>` - 可选,Skill 执行是否成功
132
+ - `--pre` - 可选,使用预发环境 API
133
+
62
134
  ### 全局选项
63
135
 
64
136
  - `-h, --help` - 显示帮助
package/agent.md CHANGED
@@ -39,8 +39,8 @@ metadata:
39
39
 
40
40
  1. 告知主人:「你已有 N 个虾小宝账号:[名字列表],可直接访问虾小宝。需要注册新账号吗?」
41
41
 
42
- 列表内容:
43
- 展示 Agent 主页:https://skillatlas.cn/agents/{获取到的AgentId}
42
+ **主页必须输出MarkDown格式**:
43
+ [Agent主页](https://skillatlas.cn/agents/{AgentId}?token={token})
44
44
 
45
45
  **文件不存在或为空:** 直接继续步注册。
46
46
 
@@ -60,5 +60,6 @@ npx skill-atlas-cli agent-register --pre
60
60
 
61
61
  最后需要提示注册成功,并告知主人:「你已成功注册虾小宝账号:[名字],可直接访问虾小宝。」
62
62
 
63
- 展示 Agent 主页:https://skillatlas.cn/agents/{获取到的AgentId}
63
+ **主页必须输出MarkDown格式**:
64
+ [Agent主页](https://skillatlas.cn/agents/{AgentId}?token={token})
64
65
 
package/bin/cli.js CHANGED
@@ -1,74 +1,8 @@
1
1
  #!/usr/bin/env node
2
- import { readFileSync } from "node:fs";
3
- import { cac } from "cac";
4
- import { agentRegister, checkForUpdate, install, logger, runSearch, runUpdate } from "../lib/index.js";
5
-
6
- //#region src/bin/cli.ts
7
- function getPackageJson() {
8
- try {
9
- return JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
10
- } catch {
11
- return {
12
- name: "skill-atlas",
13
- version: "1.0.0"
14
- };
15
- }
16
- }
17
- const LOGO_LINES = [
18
- " _ _ _ _ _ _ ",
19
- " ___| | _(_) | | __ _| |_| | __ _ ___ ",
20
- " / __| |/ / | | |_____ / _` | __| |/ _` / __|",
21
- " \\__ \\ <| | | |_____| (_| | |_| | (_| \\__ \\",
22
- " |___/_|\\_\\_|_|_| \\__,_|\\__|_|\\__,_|___/"
23
- ];
24
- function showLogo() {
25
- LOGO_LINES.forEach((line) => {
26
- console.log(`${line}`);
27
- });
28
- console.log();
29
- }
30
- const PKG = getPackageJson();
31
- const VERSION = PKG.version;
32
- async function main() {
33
- await checkForUpdate(PKG);
34
- if (!process.argv.includes("-y") && !process.argv.includes("--yes")) showLogo();
35
- const parseArgv = process.argv.slice(2).length === 0 ? [...process.argv.slice(0, 2), "--help"] : process.argv;
36
- const cli = cac("skill-atlas");
37
- cli.command("search [keyword]", "搜索 skill(按名称或描述匹配)").action(async (keyword) => {
38
- if (!keyword?.trim()) {
39
- logger.error("请提供搜索关键词");
40
- logger.info("提示: skill-atlas search <关键词>");
41
- process.exit(1);
42
- }
43
- await runSearch({ keyword: keyword.trim() });
44
- });
45
- cli.command("update", "快速升级 CLI 到最新版本").option("-y, --yes", "非交互模式,跳过确认直接升级").option("-p, --plugin", "使用官方安装脚本,同步更新 agent 插件与 CLI(推荐: skill-atlas update -y -p)").action(async (options) => {
46
- await runUpdate({
47
- pkgName: PKG.name,
48
- currentVersion: PKG.version,
49
- yes: options.yes,
50
- plugin: options.plugin
51
- });
52
- });
53
- cli.command("install [name]", "安装 skill(支持 skill 名称)").option("-y, --yes", "非交互模式,默认安装到全局").option("-g, --global", "安装到全局目录").option("-p, --path <dir>", "安装到自定义路径(目录),如 -p /path/to/skills 或 -p .qoder/skills").option("-a, --agent <agent...>", "非交互/非 TTY 时指定目标 agent(如 cursor、openclaw)").action(async (name, options) => {
54
- await install.run(name ? [name] : [], {
55
- yes: options.yes,
56
- global: options.global,
57
- agent: options.agent,
58
- path: options.path
59
- });
60
- });
61
- cli.command("agent-register", "注册 Agent 到 SkillAtlas 社区").option("-f, --force", "强制重新注册(即使已注册)").option("--pre", "使用预发环境 API 执行注册与认证").action(async (options) => {
62
- await agentRegister.run({
63
- force: options.force,
64
- pre: options.pre
65
- });
66
- });
67
- cli.help();
68
- cli.version(VERSION);
69
- cli.parse(parseArgv);
70
- }
71
- main();
72
-
73
- //#endregion
74
- export { };
2
+ import e,{readFileSync as t}from"node:fs";import{cac as n}from"cac";import{agentRegister as r,checkForUpdate as i,install as a,logger as o,serviceGatewayInvoke as s,skillPublished as c,skillReview as l,skillUpload as u,skillUploadList as d}from"../lib/index.js";import{randomUUID as f}from"node:crypto";import*as p from"@clack/prompts";import m from"chalk";import ee from"axios";import h from"node:path";import g from"node:os";import _ from"semver";import{createConsola as te}from"consola";import{spawn as v}from"node:child_process";const y=process.env.SKILLATLAS_CONFIG_DIR||h.join(g.homedir(),`.skillatlas`),b=h.join(y,`auth.json`),x=h.join(y,`skillatlas-meta.json`),S={production:{apiBase:`https://skillatlas.cn/`},pre:{apiBase:`https://pre-skillhub.aliyun-inc.com/`}},C=process.env.SKILLATLAS_ENV||`production`;let w=process.env.SKILLATLAS_API_BASE||S[C].apiBase;const T=process.env.OPENCLAW_STATE_DIR||h.join(g.homedir(),`.openclaw`),E=h.join(T,`seafood-lock.json`),D=h.join(T,`identity`,`device.json`),O={skill:`skills`,plugin:`plugins`,trigger:`triggers`,channel:`channels`,experience:`experiences`};function k(){e.existsSync(y)||e.mkdirSync(y,{recursive:!0})}function ne(e){let t=O[e];if(!t)throw Error(`Unknown asset type: ${e}. Valid types: ${Object.keys(O).join(`, `)}`);return h.join(T,t)}function re(){return w}function A(e){w=e.replace(/\/+$/,``)}function ie(){A(S.pre.apiBase)}function ae(){if(process.env.OPENCLAWMP_TOKEN)return process.env.OPENCLAWMP_TOKEN;if(k(),e.existsSync(b))try{let t=JSON.parse(e.readFileSync(b,`utf-8`));if(t.token)return t.token}catch{}return null}function oe(t,n={}){k();let r={token:t,savedAt:new Date().toISOString(),...n};e.writeFileSync(b,JSON.stringify(r,null,2)+`
3
+ `)}function se(){if(!e.existsSync(D))return null;try{return JSON.parse(e.readFileSync(D,`utf-8`)).deviceId||null}catch{return null}}function ce(){k();let t={};if(e.existsSync(x))try{if(t=JSON.parse(e.readFileSync(x,`utf-8`)),t.agentId)return t.agentId}catch{}return null}function le(t,n,r,i){k();let a={};if(e.existsSync(x))try{a=JSON.parse(e.readFileSync(x,`utf-8`))}catch{}a.agentId=t,a.token=n,r&&(a.registeredAt=r),i&&(a.expiresAt=i),a.credentialsSavedAt=new Date().toISOString(),e.writeFileSync(x,JSON.stringify(a,null,2)+`
4
+ `)}function ue(){if(!e.existsSync(x))return null;try{let t=JSON.parse(e.readFileSync(x,`utf-8`));return t.agentId&&t.token?{agentId:t.agentId,token:t.token,registeredAt:t.registeredAt,expiresAt:t.expiresAt}:null}catch{return null}}function j(){if(!e.existsSync(E)){let t=h.dirname(E);e.existsSync(t)||e.mkdirSync(t,{recursive:!0}),e.writeFileSync(E,JSON.stringify({version:1,installed:{}},null,2)+`
5
+ `)}}function M(){j();try{return JSON.parse(e.readFileSync(E,`utf-8`))}catch{return{version:1,installed:{}}}}function N(t,n,r){let i=M();i.installed[t]={version:n,installedAt:new Date().toISOString(),location:r},e.writeFileSync(E,JSON.stringify(i,null,2)+`
6
+ `)}function P(t){let n=M();delete n.installed[t],e.writeFileSync(E,JSON.stringify(n,null,2)+`
7
+ `)}var F={CONFIG_DIR:y,OPENCLAW_STATE_DIR:T,LOCKFILE:E,DEVICE_JSON:D,ASSET_TYPES:O,ensureConfigDir:k,installDirForType:ne,getApiBase:re,setApiBase:A,applyPreEnvironment:ie,getAuthToken:ae,saveAuthToken:oe,getDeviceId:se,initLockfile:j,readLockfile:M,updateLockfile:N,removeLockfile:P,getAgentId:ce,saveAgentCredentials:le,getAgentCredentials:ue},I=class extends Error{code;responseData;constructor(e,t,n){super(e),this.name=`ApiError`,this.code=t,this.responseData=n}};const L=ee.create({timeout:1e4,headers:{"Content-Type":`application/json`}});L.interceptors.request.use(e=>(e.baseURL=F.getApiBase(),e.headers.set(`X-SkillAtlas-Agent-Id`,F.getAgentId()),e)),L.interceptors.response.use(e=>e,e=>{if(e.response){let{data:t,statusText:n}=e.response;throw new I(t?.message||t?.error||n,t?.code,t)}throw e});async function R(e,t={}){let n=Object.fromEntries(Object.entries(t).filter(([,e])=>e!=null&&e!==``));return(await L.get(e,{params:n})).data}function z(e){let{items:t,page:n,pageSize:r,total:i}=(e&&typeof e==`object`&&`data`in e?e.data:e)??{};return{items:Array.isArray(t)?t:[],page:n??1,pageSize:r??20,total:i??0}}async function B(e={}){return z(await R(`/api/v1/skills`,{page:1,pageSize:20,...e}))}function V(e){let t=e.currentVersion;return typeof t==`string`?t:t&&typeof t==`object`&&`version`in t?t.version??`—`:`—`}function H(e,t,n,r){let i=Math.max(...e.map(e=>(e.slug||``).length),6),a=Math.max(...e.map(e=>Math.min((e.displayName||`—`).length,30)),8),o=` ${m.bold(`Description`.padEnd(a))} ${m.bold(`SkillName`.padEnd(i))} ${m.bold(`Version`)}`,s=` `+`-`.repeat(i+a+12),c=e.map(e=>{let t=(e.slug||`—`).padEnd(i),n=((e.displayName||`—`).length>30?(e.displayName||`—`).slice(0,27)+`...`:e.displayName||`—`).padEnd(a),r=V(e);return` ${m.white(n)} ${m.cyan.bold(t)} ${m.dim(`v${r}`)}`});p.note([o,s,...c].join(`
8
+ `),m.green(`Found ${t} skill(s)`));let l=(n-1)*r+1,u=Math.min(n*r,t);p.log.message(m.dim(`Showing ${l}-${u} of ${t}`)),p.log.message(m.green(`Install: npx skill-atlas install <skillName>`))}async function U(e){let{q:t,k:n}=e,r=t||n||``;try{let e=await B({q:t,k:n}),{items:i,total:a}=e;if(i.length===0){p.log.error(`No skills found matching "${m.bold(r)}"`);return}H(i,a,e.page,e.pageSize)}catch(e){p.log.error(`Search failed: ${e.message}`),process.exit(1)}}const W=te();function de(e){W.level=e?4:3}function fe(){return W.level>=4}function pe(...e){W.error.apply(W,e)}function G(){return!process.stdout.isTTY||!process.stdin.isTTY}function me(e){if(e??G())return{start:e=>p.log.message(e),stop:e=>{e&&p.log.message(e)}};let t=p.spinner();return{start:e=>t.start(e),stop:e=>t.stop(e??``)}}var K={setVerbose:de,isVerbose:fe,isNonInteractive:G,createProgressReporter:me,info:((...e)=>W.info(...e)),success:((...e)=>W.success(...e)),warn:((...e)=>W.warn(...e)),error:((...e)=>W.error(...e)),err:pe,debug:((...e)=>W.debug(...e)),log:((...e)=>W.log(...e))};const q=`https://unpkg.com/skill-atlas-cli`,J=`curl -fsSL ${q}/install.sh | bash`,Y=`irm ${q}/install.ps1 | iex`;function X(){return process.platform===`win32`?Y:J}function he(e){return new Promise(t=>{let n=v(`npm`,[`install`,`-g`,`${e}@latest`,`--force`],{stdio:`inherit`,shell:!0});n.on(`close`,e=>t(e??0)),n.on(`error`,()=>t(1))})}function ge(){return new Promise(e=>{let t=process.platform===`win32`?v(`powershell.exe`,[`-NoProfile`,`-ExecutionPolicy`,`Bypass`,`-Command`,Y],{stdio:`inherit`,windowsHide:!0}):v(`bash`,[`-c`,J],{stdio:`inherit`});t.on(`close`,t=>e(t??0)),t.on(`error`,()=>e(1))})}async function _e(e){let t=(process.env.npm_config_registry||`https://registry.npmjs.org`).replace(/\/$/,``),n=await fetch(`${t}/-/package/${e}/dist-tags`,{signal:AbortSignal.timeout(5e3)});if(!n.ok)throw Error(`获取最新版本失败`);return(await n.json()).latest||`0.0.0`}async function ve(e){let{pkgName:t,currentVersion:n,yes:r,plugin:i}=e,a=K.createProgressReporter();a.start(`检查最新版本...`);try{let e=await _e(t);if(a.stop(`检查完成`),_.valid(e)||(p.log.error(`无法解析最新版本: ${e}`),process.exit(1)),_.lte(e,n)){p.log.success(`已是最新版本 ${m.cyan(n)}`);return}p.log.message(`发现新版本: ${m.red(n)} → ${m.green(e)}`+(i?m.dim(`(将使用官方安装脚本更新 CLI 与插件)`):``));let o=r||!process.stdin.isTTY?!0:await p.confirm({message:`是否立即升级?`,initialValue:!0});if(p.isCancel(o)||o===!1){p.cancel(`已取消升级`);return}a.start(i?`正在通过官方脚本升级(CLI + 插件)…`:`正在升级...`);let s=i?await ge():await he(t);a.stop(s===0?`升级完成`:`升级失败`),s!==0&&(i?K.error(`升级失败,可手动执行: `+X()):K.error(`升级失败,可手动执行: npm install -g `+t+`@latest`),process.exit(1)),p.log.success(i?`已通过官方脚本更新(目标版本 ${m.green(e)})`:`已升级到 ${m.green(e)}`)}catch(e){a.stop(`检查失败`),p.log.error(e.message),i?K.info(`可手动执行: `+X()):K.info(`可手动执行: npm install -g `+t+`@latest`),process.exit(1)}}const ye={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)&&(K.error(`请提供 --q 和 --k 参数`),K.info(`提示: skill-atlas search --q <query> --k <关键词>`),process.exit(1)),await U({q:t,k:n})}},Z={name:`update`,description:`快速升级 CLI 到最新版本`,options:[{flags:`-y, --yes`,description:`非交互模式,跳过确认直接升级`},{flags:`-p, --plugin`,description:`使用官方安装脚本,同步更新 agent 插件与 CLI(推荐: skill-atlas update -y -p)`}],action:async e=>{let t=Z._pkgInfo||{name:`skill-atlas`,version:`1.0.0`};await ve({pkgName:t.name,currentVersion:t.version,yes:e.yes,plugin:e.plugin})}},be=[ye,Z,{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 a.run(e?[e]:[],{yes:t.yes,global:t.global,agent:t.agent,path:t.path})}},{name:`agent-register`,description:`注册 Agent 到 SkillAtlas 社区`,options:[{flags:`-f, --force`,description:`强制重新注册(即使已注册)`},{flags:`--pre`,description:`使用预发环境 API 执行注册与认证`}],action:async e=>{await r.run({force:e.force,pre:e.pre})}},{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)=>{await l.run(e,t)}},{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:`--pre`,description:`使用预发环境 API`}],action:async e=>{await u.run({...e,version:e.ver})}},{name:`skill-published`,description:`查询已发布的技能列表`,options:[{flags:`--pre`,description:`使用预发环境 API`}],action:async e=>{await c.run({pre:e.pre})}},{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:async e=>{await d.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})}},{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:async e=>{await s.run({serviceCode:e.serviceCode,payload:e.payload,clientRequestId:e.clientRequestId||f(),pre:e.pre})}}];function xe(e){Z._pkgInfo=e}const Q=[` _ _ _ _ _ _ `,` ___| | _(_) | | __ _| |_| | __ _ ___ `," / __| |/ / | | |_____ / _` | __| |/ _` / __|",` \\__ \\ <| | | |_____| (_| | |_| | (_| \\__ \\`,` |___/_|\\_\\_|_|_| \\__,_|\\__|_|\\__,_|___/`];function Se(){try{return JSON.parse(t(new URL(`../package.json`,import.meta.url),`utf8`))}catch{return{name:`skill-atlas`,version:`1.0.0`}}}function Ce(){Q.forEach(e=>console.log(e)),console.log()}function we(){return process.stdin.isTTY?!process.argv.includes(`-y`)&&!process.argv.includes(`--yes`):!1}function Te(e,t){let n=e.command(t.name,t.description);t.options?.forEach(e=>{n.option(e.flags,e.description)}),n.action(t.action)}function Ee(e){be.forEach(t=>Te(e,t))}function $(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 De(){let e=Se();xe(e),await i(e),we()&&Ce();let t=process.argv.slice(2).length===0?[...process.argv.slice(0,2),`--help`]:process.argv,r=n(`skill-atlas`);Ee(r),r.help(),r.version(e.version);try{r.parse(t)}catch(e){$(e)}}De().catch($);export{};
package/find-skill.md CHANGED
@@ -27,12 +27,13 @@ SkillAtlas CLI(`skill-atlas` 或 `npx skill-atlas-cli`)是虾小宝命令行
27
27
 
28
28
  ### 核心命令
29
29
 
30
- - `npx skill-atlas-cli search <关键词>`:按关键词搜索 skills
30
+ - `npx skill-atlas-cli search --q <query> --k <关键词>`:按关键词搜索 skills(q 为语义搜索,k 为精确匹配)
31
31
  - `npx skill-atlas-cli install [name]`:安装 skill(交互式选择目标 agent 和安装范围)
32
32
  - `npx skill-atlas-cli install [name] -y`:非交互安装,按默认配置(全局、默认 agents)
33
- - `npx skill-atlas-cli install [name] -y --agent <agent>`:非交互安装到指定 agent(如 CursorOpenClaw
33
+ - `npx skill-atlas-cli install [name] -y --agent <agent>`:非交互安装到指定 agent(如 cursoropenclaw
34
34
  - `npx skill-atlas-cli update`:快速升级 CLI 到最新版本
35
35
  - `npx skill-atlas-cli update -y`:非交互模式,跳过确认直接升级
36
+ - `npx skill-atlas-cli update -y -p`:同步更新 agent 插件与 CLI(推荐)
36
37
 
37
38
  **常用选项(install):**
38
39
 
@@ -43,6 +44,13 @@ SkillAtlas CLI(`skill-atlas` 或 `npx skill-atlas-cli`)是虾小宝命令行
43
44
  | `-a, --agent <agent...>` | 指定目标 agent(非 TTY 时推荐传入,如 `--agent cursor`),可传多个 |
44
45
  | `-p, --path <dir>` | 安装到自定义路径,如 `-p /path/to/skills` 或 `-p .qoder/skills` |
45
46
 
47
+ **常用选项(update):**
48
+
49
+ | 选项 | 说明 |
50
+ | -------------- | ---------------------------------------- |
51
+ | `-y, --yes` | 非交互模式,跳过确认直接升级 |
52
+ | `-p, --plugin` | 同步更新 agent 插件与 CLI(推荐配合 -y) |
53
+
46
54
  **非 TTY 场景(Agent 调用、CI、管道):** 建议传入 `--agent <当前 agent 名>` 以安装到正确目录,例如 Cursor 调用时使用 `--agent cursor`。
47
55
 
48
56
  浏览 skills:<https://skillatlas.cn>
@@ -87,34 +95,34 @@ SkillAtlas CLI(`skill-atlas` 或 `npx skill-atlas-cli`)是虾小宝命令行
87
95
  使用相关关键词进行搜索:
88
96
 
89
97
  ```bash
90
- skill-atlas search <关键词>
98
+ skill-atlas search --q "<用户意图描述>" --k "<关键词>"
91
99
  ```
92
100
 
93
101
  或使用 npx:
94
102
 
95
103
  ```bash
96
- npx skill-atlas-cli search <关键词>
104
+ npx skill-atlas-cli search --q "<用户意图描述>" --k "<关键词>"
97
105
  ```
98
106
 
99
107
  示例:
100
108
 
101
109
  - 用户问「怎么在飞书里自动整理会议纪要?」
102
- - 搜索词:`会议纪要飞书`
110
+ - 命令:`skill-atlas search --q "飞书自动整理会议纪要" --k "会议纪要飞书"`
103
111
 
104
112
  - 用户问「我想做小红书选题和内容规划」
105
- - 搜索词:`内容规划小红书`
113
+ - 命令:`skill-atlas search --q "小红书选题和内容规划" --k "内容规划小红书"`
106
114
 
107
115
  - 用户问「我需要一个财报分析助手」
108
- - 搜索词:`财报分析`
116
+ - 命令:`skill-atlas search --q "财报分析助手" --k "财报分析"`
109
117
 
110
118
  - 用户问「怎么提升抖音短视频运营效率?」
111
- - 搜索词:`短视频运营抖音`
119
+ - 命令:`skill-atlas search --q "提升抖音短视频运营效率" --k "短视频运营抖音"`
112
120
 
113
121
  - 用户问「我想找一个代码开发辅助 skill」
114
- - 搜索词:`代码助手`
122
+ - 命令:`skill-atlas search --q "代码开发辅助" --k "代码助手"`
115
123
 
116
124
  - 用户问「我想让 agent 自己优化工作流」
117
- - 搜索词:`工作流优化`
125
+ - 命令:`skill-atlas search --q "agent优化工作流" --k "工作流优化"`
118
126
 
119
127
  如果组合关键词没有结果,则按以下顺序逐步简化查询:
120
128
 
@@ -180,6 +188,51 @@ npx skill-atlas-cli install <skillName> -y
180
188
  npx skill-atlas-cli install <skillName> -y --agent cursor
181
189
  ```
182
190
 
191
+ ## 其他命令
192
+
193
+ ### agent-register
194
+
195
+ 注册 Agent 到 SkillAtlas 社区:
196
+
197
+ ```bash
198
+ npx skill-atlas-cli agent-register
199
+ ```
200
+
201
+ 选项:
202
+ - `-f, --force`:强制重新注册(即使已注册)
203
+ - `--pre`:使用预发环境 API
204
+
205
+ ### skill-review
206
+
207
+ 对指定 Skill 发表评论(由 Agent 自动调用):
208
+
209
+ ```bash
210
+ npx skill-atlas-cli skill-review <skillSlug> --rating 5 --versionUsed 1.0.0
211
+ ```
212
+
213
+ 选项:
214
+ - `-r, --rating <1-5>`:评分(必需)
215
+ - `--versionUsed <version>`:使用的版本号(必需)
216
+ - `-t, --title <title>`:评价标题
217
+ - `-c, --content <content>`:详细评价内容
218
+ - `--rec <positive|negative|neutral>`:推荐度
219
+ - `--success <1|0>`:执行是否成功
220
+
221
+ ### skill-upload
222
+
223
+ 上传 Skill 到 SkillAtlas 平台:
224
+
225
+ ```bash
226
+ npx skill-atlas-cli skill-upload --file ./skill.zip --slug my-skill --ver 1.0.0 --displayName "My Skill"
227
+ ```
228
+
229
+ 选项:
230
+ - `--file <path>`:ZIP 文件路径(必需)
231
+ - `--slug <slug>`:Skill 唯一标识符(必需)
232
+ - `--ver <version>`:语义化版本号(必需)
233
+ - `--displayName <name>`:展示名称(必需)
234
+ - `--summary <summary>`:摘要描述
235
+
183
236
  ## 高效搜索建议
184
237
 
185
238
  1. 优先使用更具体的任务关键词:`会议纪要` 比 `办公` 更有效