@qx-wz/create-qx-agw-skill 1.0.0
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 +46 -0
- package/dist/index.js +15 -0
- package/package.json +35 -0
package/README.md
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# create-qx-agw-skill
|
|
2
|
+
|
|
3
|
+
一键同步 AI Skill 配置到各平台的 CLI 工具。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npx create-qx-agw-skill
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 使用
|
|
12
|
+
|
|
13
|
+
### 交互模式
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npx create-qx-agw-skill
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
使用 ↑/↓ 导航,空格选择平台,回车确认安装。
|
|
20
|
+
|
|
21
|
+
### 非交互模式
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npx create-qx-agw-skill --platforms=cursor,claude
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 支持的平台
|
|
28
|
+
|
|
29
|
+
| 平台 ID | 平台名称 | 目标路径 |
|
|
30
|
+
|------------|----------------|-----------------------------------|
|
|
31
|
+
| cursor | Cursor | ~/.cursor/rules |
|
|
32
|
+
| windsurf | Windsurf | ~/.windsurf/rules |
|
|
33
|
+
| trae | Trae | ~/.trae/rules |
|
|
34
|
+
| claude | Claude Desktop | ~/Library/Application Support/Claude/skills (macOS) |
|
|
35
|
+
| qwenpaw | Qwenpaw | ~/.qwenpaw/skills |
|
|
36
|
+
| hermes | Hermes Agent | ~/.hermes/skills |
|
|
37
|
+
| codex | Codex | ~/.codex/skills |
|
|
38
|
+
|
|
39
|
+
## 备份
|
|
40
|
+
|
|
41
|
+
所有安装的文件都会自动备份到 `~/.agents/skills/<platform>/` 目录。
|
|
42
|
+
|
|
43
|
+
## 要求
|
|
44
|
+
|
|
45
|
+
- Node.js >= 18
|
|
46
|
+
- Git
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import le from"react";import{render as ce}from"ink";import ae from"meow";import $ from"chalk";import n,{useState as b,useEffect as ie,useCallback as J}from"react";import{Box as A,Text as x,Newline as ne,useApp as se}from"ink";import M from"ink-spinner";import C from"os";import S from"path";var P="qx-agw",h=[{id:"claude",name:"Claude Code",getTargetDir:()=>S.join(C.homedir(),".Claude","skills",P)},{id:"qwenpaw",name:"Qwenpaw",getTargetDir:()=>S.join(C.homedir(),".copaw","workspaces","default","skills",P)},{id:"hermes",name:"Hermes Agent",getTargetDir:()=>S.join(C.homedir(),".hermes","skills",P)},{id:"codex",name:"Codex",getTargetDir:()=>S.join(C.homedir(),".codex","skills",P)}],V=()=>S.join(C.homedir(),".agents","skills",P),F=e=>h.find(r=>r.id===e);import W from"path";import X from"os";import{execa as Y}from"execa";var Z="https://code.wz-inc.com/sd-fe/qx-agw-skill.git";async function z(e){let r=W.join(X.tmpdir(),`qx-agw-skill-${Date.now()}`);e?.("\u6B63\u5728\u514B\u9686\u4ED3\u5E93...");try{await Y("git",["clone","--depth","1","--filter=blob:none",Z,r])}catch(t){throw new Error(`\u514B\u9686\u4ED3\u5E93\u5931\u8D25: ${t instanceof Error?t.message:"\u672A\u77E5\u9519\u8BEF"}
|
|
3
|
+
\u8BF7\u68C0\u67E5 Git \u51ED\u8BC1\u662F\u5426\u914D\u7F6E\u6B63\u786E`)}return r}import R from"path";import u from"fs-extra";async function O(e,r,t){let l=[],o=V(),c=!1;for(let T of r){let g=F(T);if(!g){console.warn(`\u8B66\u544A: \u672A\u627E\u5230\u5E73\u53F0 ${T}`);continue}t?.(`\u6B63\u5728\u5B89\u88C5 ${g.name}...`);let w=e,m=g.getTargetDir();await u.remove(m),await u.ensureDir(m),await u.copy(w,m,{filter:i=>!i.includes(".git")}),c||(await u.remove(o),await u.ensureDir(o),await u.copy(w,o,{filter:i=>!i.includes(".git")}),c=!0);let k=await G(m);l.push({platform:g.name,targetDir:m,backupDir:o,filesCopied:k})}return l}async function G(e){let r=0,t=await u.readdir(e,{withFileTypes:!0});for(let l of t)l.isDirectory()?r+=await G(R.join(e,l.name)):r++;return r}async function j(e){await u.remove(e)}import{execaSync as ee}from"execa";function N(){let e=[],r=!1;try{ee("git",["--version"]),r=!0}catch{e.push("Git \u672A\u5B89\u88C5\uFF0C\u8BF7\u5148\u5B89\u88C5 Git: https://git-scm.com/downloads")}return parseInt(process.version.slice(1).split(".")[0],10)<18&&e.push(`Node.js \u7248\u672C\u8FC7\u4F4E: ${process.version}\uFF0C\u9700\u8981 >= 18`),{git:r,nodeVersion:process.version,isValid:e.length===0,errors:e}}import f,{useState as U,useCallback as E}from"react";import{Box as v,Text as B,useInput as re,useApp as oe}from"ink";import H from"chalk";function _({platforms:e,onSelect:r}){let[t,l]=U(0),[o,c]=U(new Set),{exit:T}=oe(),g=o.size,w=E(()=>{let i=e[t];c(a=>{let s=new Set(a);return s.has(i.id)?s.delete(i.id):s.add(i.id),s})},[t,e]),m=E(()=>{o.size===e.length?c(new Set):c(new Set(e.map(i=>i.id)))},[o.size,e]),k=E(()=>{o.size>0&&r(Array.from(o))},[o,r]);return re((i,a)=>{a.upArrow?l(s=>s>0?s-1:e.length-1):a.downArrow?l(s=>s<e.length-1?s+1:0):i===" "?w():i.toLowerCase()==="a"?m():a.return?k():(i.toLowerCase()==="q"||a.escape)&&T()},{isActive:!0}),f.createElement(v,{flexDirection:"column",padding:1},f.createElement(v,{marginBottom:1},f.createElement(B,{bold:!0},"\u8BF7\u9009\u62E9\u8981\u5B89\u88C5\u7684\u5E73\u53F0\uFF1A")),e.map((i,a)=>{let s=o.has(i.id),p=a===t,d=s?H.green("\u25C9"):"\u25CB",D=p?H.cyan.bold(`> ${d} ${i.name}`):` ${d} ${i.name}`;return f.createElement(v,{key:i.id},f.createElement(B,null,D))}),f.createElement(v,{marginTop:1,flexDirection:"column"},f.createElement(B,{dimColor:!0},"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),f.createElement(B,{dimColor:!0},"\u2191/\u2193 \u5BFC\u822A | \u7A7A\u683C\u9009\u62E9 | a \u5168\u9009 | \u56DE\u8F66\u786E\u8BA4 | q \u9000\u51FA"),f.createElement(B,{dimColor:!0},"\u5DF2\u9009\u62E9: ",g," \u4E2A\u5E73\u53F0")))}import{Box as I,Newline as te,Text as q}from"ink";import y from"react";function Q({results:e}){return y.createElement(I,{flexDirection:"column",padding:1},y.createElement(I,{marginBottom:1},y.createElement(q,{bold:!0,color:"green"},"\u2713 \u5B89\u88C5\u5B8C\u6210\uFF01")),y.createElement(te,null),e.map(r=>y.createElement(I,{key:r.platform,flexDirection:"column",marginBottom:1},y.createElement(q,{bold:!0},r.platform," (",r.filesCopied," \u4E2A\u6587\u4EF6)"),y.createElement(q,{dimColor:!0}," \u76EE\u6807: ",r.targetDir))))}function K({cliPlatforms:e}){let[r,t]=b("checking"),[l,o]=b(e||[]),[c,T]=b([]),[g,w]=b(""),[m,k]=b(""),{exit:i}=se();ie(()=>{let p=N();if(!p.isValid){w(p.errors.join(`
|
|
4
|
+
`)),t("error");return}e&&e.length>0?a(e):t("selecting")},[]);let a=J(async p=>{o(p),t("cloning");let d="";try{d=await z(k),t("copying");let D=await O(d,p,k);await j(d),T(D),t("done"),setTimeout(()=>i(),100)}catch(D){d&&await j(d).catch(()=>{}),w(D instanceof Error?D.message:"\u672A\u77E5\u9519\u8BEF"),t("error")}},[]),s=J(p=>{a(p)},[a]);return r==="error"?n.createElement(A,{flexDirection:"column",padding:1},n.createElement(x,{bold:!0,color:"red"},"\u2717 \u5B89\u88C5\u5931\u8D25"),n.createElement(ne,null),n.createElement(x,{color:"red"},g)):r==="checking"?n.createElement(A,{padding:1},n.createElement(x,null,n.createElement(x,{color:"cyan"},n.createElement(M,{type:"dots"}))," ","\u68C0\u67E5\u73AF\u5883...")):r==="selecting"?n.createElement(_,{platforms:h,onSelect:s}):r==="cloning"?n.createElement(A,{padding:1},n.createElement(x,null,n.createElement(x,{color:"cyan"},n.createElement(M,{type:"dots"}))," ",m||"\u6B63\u5728\u514B\u9686\u4ED3\u5E93...")):r==="copying"?n.createElement(A,{padding:1},n.createElement(x,null,n.createElement(x,{color:"cyan"},n.createElement(M,{type:"dots"}))," ",m||"\u6B63\u5728\u5B89\u88C5\u6587\u4EF6...")):r==="done"?n.createElement(Q,{results:c}):null}var L=ae(`
|
|
5
|
+
Usage
|
|
6
|
+
$ npx create-qx-agw-skill
|
|
7
|
+
$ npx create-qx-agw-skill --platforms=cursor,claude
|
|
8
|
+
|
|
9
|
+
Options
|
|
10
|
+
--platforms \u9017\u53F7\u5206\u9694\u7684\u5E73\u53F0\u5217\u8868\uFF0C\u8DF3\u8FC7\u4EA4\u4E92\u754C\u9762
|
|
11
|
+
|
|
12
|
+
Examples
|
|
13
|
+
$ npx create-qx-agw-skill
|
|
14
|
+
$ npx create-qx-agw-skill --platforms=cursor,windsurf
|
|
15
|
+
`,{importMeta:import.meta,flags:{platforms:{type:"string",shortFlag:"p"}}});function me(e){if(!e)return null;let r=e.split(",").map(o=>o.trim().toLowerCase()).filter(o=>o.length>0);if(r.length===0)return null;let t=r.filter(o=>h.some(c=>c.id===o)),l=r.filter(o=>!h.some(c=>c.id===o));return l.length>0&&(console.error($.yellow(`\u8B66\u544A: \u65E0\u6548\u7684\u5E73\u53F0 ID: ${l.join(", ")}`)),console.error($.dim(`\u6709\u6548\u5E73\u53F0: ${h.map(o=>o.id).join(", ")}`))),t.length>0?t:null}async function pe(){let e=me(L.flags.platforms);if(L.flags.platforms&&!e){console.error($.red("\u9519\u8BEF: \u6CA1\u6709\u6709\u6548\u7684\u5E73\u53F0")),L.showHelp(1);return}ce(le.createElement(K,{cliPlatforms:e||void 0}))}pe().catch(e=>{console.error($.red("\u53D1\u751F\u9519\u8BEF:")),console.error(e),process.exit(1)});
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@qx-wz/create-qx-agw-skill",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "一键同步 AI Skill 配置到各平台",
|
|
6
|
+
"bin": {
|
|
7
|
+
"create-qx-agw-skill": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsup",
|
|
14
|
+
"dev": "tsup --watch"
|
|
15
|
+
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"ink": "^5.0.1",
|
|
18
|
+
"ink-spinner": "^5.0.0",
|
|
19
|
+
"react": "^18.3.1",
|
|
20
|
+
"meow": "^13.2.0",
|
|
21
|
+
"execa": "^9.5.0",
|
|
22
|
+
"fs-extra": "^11.2.0",
|
|
23
|
+
"chalk": "^5.3.0"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/fs-extra": "^11.0.4",
|
|
27
|
+
"@types/react": "^18.3.3",
|
|
28
|
+
"tsup": "^8.3.0",
|
|
29
|
+
"typescript": "^5.6.0",
|
|
30
|
+
"@types/node": "^22.0.0"
|
|
31
|
+
},
|
|
32
|
+
"engines": {
|
|
33
|
+
"node": ">=18"
|
|
34
|
+
}
|
|
35
|
+
}
|