skill-atlas-cli 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -0
- package/bin/cli.js +56 -0
- package/lib/index.d.ts +63 -0
- package/lib/index.js +1128 -0
- package/package.json +56 -0
- package/setup.sh +397 -0
package/README.md
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Skill-Atlas CLI
|
|
2
|
+
|
|
3
|
+
虾小宝 SkillAtlas 命令行工具,用于从 [skillatlas.cn](https://skillatlas.cn) 搜索并安装 skill 到各类 AI 编程助手(Cursor、OpenClaw、Claude Code、Cline 等)。
|
|
4
|
+
|
|
5
|
+
## 环境要求
|
|
6
|
+
|
|
7
|
+
- Node.js >= 20.19
|
|
8
|
+
|
|
9
|
+
## 安装
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
|
|
13
|
+
# 或通过 npm 全局安装
|
|
14
|
+
npm install -g skill-atlas
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## 命令
|
|
19
|
+
|
|
20
|
+
### `search <keyword>`
|
|
21
|
+
|
|
22
|
+
从 SkillAtlas 搜索 skill(按名称或描述匹配)。
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
skill-atlas search deploy
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### `install [name]`
|
|
29
|
+
|
|
30
|
+
从 SkillAtlas 安装 skill。支持指定 skill 名称(slug),或进入交互式输入。
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# 直接指定 skill 安装
|
|
34
|
+
skill-atlas install [name]
|
|
35
|
+
|
|
36
|
+
# 交互式输入(无参数时)
|
|
37
|
+
skill-atlas install
|
|
38
|
+
|
|
39
|
+
# 非交互模式,默认安装到全局(跳过 Agent 与范围选择)
|
|
40
|
+
skill-atlas install [name] -y
|
|
41
|
+
|
|
42
|
+
# 显式安装到全局目录
|
|
43
|
+
skill-atlas install [name] --global
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**选项:**
|
|
47
|
+
|
|
48
|
+
- `-y, --yes` - 非交互模式,默认安装到全局(使用默认 Agent:Claude Code、OpenClaw)
|
|
49
|
+
- `-g, --global` - 安装到全局目录
|
|
50
|
+
|
|
51
|
+
无 `-y` 时会提示选择目标 Agent(Cursor、OpenClaw、Claude Code 等)以及安装范围(项目级 / 全局)。
|
|
52
|
+
|
|
53
|
+
### 全局选项
|
|
54
|
+
|
|
55
|
+
- `-h, --help` - 显示帮助
|
|
56
|
+
- `-v, --version` - 显示版本
|
|
57
|
+
|
|
58
|
+
## 支持的 Agent
|
|
59
|
+
|
|
60
|
+
| Agent | 项目目录 | 全局目录 |
|
|
61
|
+
| -------------- | ---------------- | -------------------------------------- |
|
|
62
|
+
| Cursor | `.agents/skills` | `~/.cursor/skills` |
|
|
63
|
+
| OpenClaw | `skills` | `~/.openclaw/skills` |
|
|
64
|
+
| Claude Code | `.claude/skills` | `~/.claude/skills` |
|
|
65
|
+
| Cline | `.agents/skills` | `~/.agents/skills` |
|
|
66
|
+
| Codex | `.agents/skills` | `~/.codex/skills` |
|
|
67
|
+
| Gemini CLI | `.agents/skills` | `~/.gemini/skills` |
|
|
68
|
+
| Qwen Code | `.qwen/skills` | `~/.qwen/skills` |
|
|
69
|
+
| GitHub Copilot | `.agents/skills` | `~/.copilot/skills` |
|
|
70
|
+
| iFlow CLI | `.iflow/skills` | `~/.iflow/skills` |
|
|
71
|
+
| Kimi Code CLI | `.agents/skills` | `~/.config/agents/skills` |
|
|
72
|
+
| Qoder | `.qoder/skills` | `~/.qoder/skills` |
|
|
73
|
+
| Trae / Trae CN | `.trae/skills` | `~/.trae/skills` / `~/.trae-cn/skills` |
|
|
74
|
+
| Antigravity | `.agent/skills` | `~/.gemini/antigravity/skills` |
|
|
75
|
+
|
|
76
|
+
## 别名
|
|
77
|
+
|
|
78
|
+
可通过以下任一命令名调用:
|
|
79
|
+
|
|
80
|
+
- `skill-atlas`
|
|
81
|
+
- `skill-atlas-cli`
|
|
82
|
+
- `skillatlas`
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { cac } from "cac";
|
|
4
|
+
import { checkForUpdate, install, logger, runSearch } from "../lib/index.js";
|
|
5
|
+
//#region src/bin/cli.ts
|
|
6
|
+
function getPackageJson() {
|
|
7
|
+
try {
|
|
8
|
+
return JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
|
|
9
|
+
} catch {
|
|
10
|
+
return {
|
|
11
|
+
name: "skill-atlas",
|
|
12
|
+
version: "1.0.0"
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const LOGO_LINES = [
|
|
17
|
+
" _ _ _ _ _ _ ",
|
|
18
|
+
" ___| | _(_) | | __ _| |_| | __ _ ___ ",
|
|
19
|
+
" / __| |/ / | | |_____ / _` | __| |/ _` / __|",
|
|
20
|
+
" \\__ \\ <| | | |_____| (_| | |_| | (_| \\__ \\",
|
|
21
|
+
" |___/_|\\_\\_|_|_| \\__,_|\\__|_|\\__,_|___/"
|
|
22
|
+
];
|
|
23
|
+
function showLogo() {
|
|
24
|
+
LOGO_LINES.forEach((line) => {
|
|
25
|
+
console.log(`${line}`);
|
|
26
|
+
});
|
|
27
|
+
console.log();
|
|
28
|
+
}
|
|
29
|
+
const PKG = getPackageJson();
|
|
30
|
+
const VERSION = PKG.version;
|
|
31
|
+
async function main() {
|
|
32
|
+
checkForUpdate(PKG);
|
|
33
|
+
showLogo();
|
|
34
|
+
const parseArgv = process.argv.slice(2).length === 0 ? [...process.argv.slice(0, 2), "--help"] : process.argv;
|
|
35
|
+
const cli = cac("skill-atlas");
|
|
36
|
+
cli.command("search [keyword]", "搜索 skill(按名称或描述匹配)").action(async (keyword) => {
|
|
37
|
+
if (!keyword?.trim()) {
|
|
38
|
+
logger.error("请提供搜索关键词");
|
|
39
|
+
logger.info("提示: skill-atlas search <关键词>");
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
await runSearch({ keyword: keyword.trim() });
|
|
43
|
+
});
|
|
44
|
+
cli.command("install [name]", "安装 skill(支持 skill 名称)").option("-y, --yes", "非交互模式,默认安装到全局").option("-g, --global", "安装到全局目录").action(async (name, options) => {
|
|
45
|
+
await install.run(name ? [name] : [], {
|
|
46
|
+
yes: options.yes,
|
|
47
|
+
global: options.global
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
cli.help();
|
|
51
|
+
cli.version(VERSION);
|
|
52
|
+
cli.parse(parseArgv);
|
|
53
|
+
}
|
|
54
|
+
main();
|
|
55
|
+
//#endregion
|
|
56
|
+
export {};
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
//#region src/core/update-notifier.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* 检查更新,有新版本时输出提示(无需重装,直接 update)
|
|
4
|
+
*/
|
|
5
|
+
declare function checkForUpdate(pkg: {
|
|
6
|
+
name: string;
|
|
7
|
+
version: string;
|
|
8
|
+
}): void;
|
|
9
|
+
//#endregion
|
|
10
|
+
//#region src/commands/install.d.ts
|
|
11
|
+
interface AddOptions {
|
|
12
|
+
global?: boolean;
|
|
13
|
+
agent?: string[];
|
|
14
|
+
yes?: boolean;
|
|
15
|
+
skill?: string[];
|
|
16
|
+
list?: boolean;
|
|
17
|
+
all?: boolean;
|
|
18
|
+
fullDepth?: boolean;
|
|
19
|
+
copy?: boolean;
|
|
20
|
+
}
|
|
21
|
+
declare const _default: {
|
|
22
|
+
run: (args: string[], options?: AddOptions) => Promise<void>;
|
|
23
|
+
};
|
|
24
|
+
//#endregion
|
|
25
|
+
//#region src/commands/search.d.ts
|
|
26
|
+
/**
|
|
27
|
+
* 根据接口文档 /api/v1/skills 搜索 skill
|
|
28
|
+
* q 有值时执行搜索;q 为空时按热度排序返回列表
|
|
29
|
+
*/
|
|
30
|
+
interface SearchOptions {
|
|
31
|
+
/** 搜索关键词 */
|
|
32
|
+
keyword: string;
|
|
33
|
+
}
|
|
34
|
+
declare function runSearch(options: SearchOptions): Promise<void>;
|
|
35
|
+
//#endregion
|
|
36
|
+
//#region src/core/logger.d.ts
|
|
37
|
+
/**
|
|
38
|
+
* 设置 verbose 模式(启用 debug 输出)
|
|
39
|
+
* consola level: 3=info, 4=debug
|
|
40
|
+
*/
|
|
41
|
+
declare function setVerbose(enabled: boolean): void;
|
|
42
|
+
/**
|
|
43
|
+
* 检查是否启用 verbose
|
|
44
|
+
*/
|
|
45
|
+
declare function isVerbose(): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* 错误别名(兼容 err 调用)
|
|
48
|
+
*/
|
|
49
|
+
declare function err(...args: unknown[]): void;
|
|
50
|
+
type LogFn = (...a: unknown[]) => void;
|
|
51
|
+
declare const _default$1: {
|
|
52
|
+
setVerbose: typeof setVerbose;
|
|
53
|
+
isVerbose: typeof isVerbose;
|
|
54
|
+
info: LogFn;
|
|
55
|
+
success: LogFn;
|
|
56
|
+
warn: LogFn;
|
|
57
|
+
error: LogFn;
|
|
58
|
+
err: typeof err;
|
|
59
|
+
debug: LogFn;
|
|
60
|
+
log: LogFn;
|
|
61
|
+
};
|
|
62
|
+
//#endregion
|
|
63
|
+
export { checkForUpdate, _default as install, _default$1 as logger, runSearch };
|