skillfree 0.1.20 → 0.1.21

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/install.sh CHANGED
@@ -1,136 +1,118 @@
1
1
  #!/usr/bin/env bash
2
- # install.sh — SkillFree 一键安装脚本
3
- # curl -fsSL https://skillfree.tech/install.sh | bash
4
-
5
- set -e
6
-
7
- CYAN='\033[0;36m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; NC='\033[0m'
8
- info() { echo -e "${CYAN}[SkillFree]${NC} $*"; }
9
- success() { echo -e "${GREEN}[SkillFree]${NC} ✓ $*"; }
10
- warn() { echo -e "${YELLOW}[SkillFree]${NC} ⚠ $*"; }
11
- err() { echo -e "${RED}[SkillFree]${NC} ✗ $*"; exit 1; }
12
-
2
+ # SkillFree 一键安装脚本
3
+ # curl -fsSL https://cdn.jsdelivr.net/gh/ChongC1990/install@main/install.sh | bash
4
+
5
+ # ── 颜色定义 ─────────────────────────────────────────────────────────────────
6
+ CYAN='\033[0;36m'
7
+ BOLD_CYAN='\033[1;36m'
8
+ GREEN='\033[0;32m'
9
+ BOLD_GREEN='\033[1;32m'
10
+ YELLOW='\033[1;33m'
11
+ RED='\033[0;31m'
12
+ BOLD='\033[1m'
13
+ DIM='\033[2m'
14
+ NC='\033[0m'
15
+
16
+ info() { echo -e "${CYAN} →${NC} $*"; }
17
+ success() { echo -e "${BOLD_GREEN} ✓${NC} $*"; }
18
+ warn() { echo -e "${YELLOW} ⚠${NC} $*"; }
19
+ err() { echo -e "${RED} ✗${NC} $*"; exit 1; }
20
+ step() { echo -e "\n${BOLD}$*${NC}"; }
21
+
22
+ # ── ASCII Banner ──────────────────────────────────────────────────────────────
23
+ clear
13
24
  echo ""
14
- echo -e "${CYAN}🦞 SkillFree 安装程序${NC}"
15
- echo -e " 一个 API,满足所有龙虾技能需求"
25
+ echo -e "${BOLD_CYAN}"
26
+ cat << 'EOF'
27
+ ███████╗██╗ ██╗██╗██╗ ██╗ ███████╗██████╗ ███████╗███████╗
28
+ ██╔════╝██║ ██╔╝██║██║ ██║ ██╔════╝██╔══██╗██╔════╝██╔════╝
29
+ ███████╗█████╔╝ ██║██║ ██║ █████╗ ██████╔╝█████╗ █████╗
30
+ ╚════██║██╔═██╗ ██║██║ ██║ ██╔══╝ ██╔══██╗██╔══╝ ██╔══╝
31
+ ███████║██║ ██╗██║███████╗███████╗██║ ██║ ██║███████╗███████╗
32
+ ╚══════╝╚═╝ ╚═╝╚═╝╚══════╝╚══════╝╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝
33
+ EOF
34
+ echo -e "${NC}"
35
+ echo -e " ${DIM}🦞 一个 Key,调用 53+ 顶级 AI 模型${NC}"
36
+ echo -e " ${DIM} Chat · Image · Video · TTS · Music · OCR · Search${NC}"
16
37
  echo ""
38
+ echo -e " ${DIM}────────────────────────────────────────────────────${NC}"
39
+ echo ""
40
+
41
+ # ── Step 1: 检查环境 ──────────────────────────────────────────────────────────
42
+ step "[ 1 / 3 ] 检查环境"
17
43
 
18
- # ── 1. 检查 Node.js ──────────────────────────────────────────────────────────
19
44
  if ! command -v node &>/dev/null; then
20
- err "需要 Node.js 18+,请先安装:https://nodejs.org"
45
+ err "未检测到 Node.js,请先安装:https://nodejs.org(需要 18+)"
21
46
  fi
22
47
  NODE_VER=$(node -e "process.stdout.write(process.versions.node.split('.')[0])")
23
- [ "$NODE_VER" -lt 18 ] && err "Node.js 版本过低(当前 v$NODE_VER),需要 18+"
48
+ if [ "$NODE_VER" -lt 18 ]; then
49
+ err "Node.js 版本过低(当前 v$(node -v)),需要 18+"
50
+ fi
51
+ success "Node.js $(node -v)"
24
52
 
25
- # ── 2. 安装 CLI ────────────────────────────────────────────────────────────
26
- info "安装 skillfree CLI..."
27
- npm install -g skillfree --quiet 2>/dev/null \
28
- || npx --yes skillfree --version &>/dev/null \
29
- || warn "全局安装需要权限,尝试 sudo npm install -g skillfree"
30
- success "CLI 安装完成"
53
+ if ! command -v npm &>/dev/null; then
54
+ err "未检测到 npm,请检查 Node.js 安装"
55
+ fi
56
+ success "npm $(npm -v)"
31
57
 
32
- # ── 3. 输入 API Key ───────────────────────────────────────────────────────────
58
+ # ── Step 2: 安装 CLI ──────────────────────────────────────────────────────────
59
+ step "[ 2 / 3 ] 安装 SkillFree CLI"
60
+ echo ""
61
+ echo -e " ${DIM}正在从 npm 安装 skillfree...${NC}"
33
62
  echo ""
34
- echo -e " 请前往 ${CYAN}https://skillfree.tech/app${NC} 获取 API Key"
35
- read -rp " 输入你的 API Key (sk-sf-...): " API_KEY
36
63
 
37
- if [[ -z "$API_KEY" || "$API_KEY" != sk-sf-* ]]; then
38
- warn "未输入有效 Key,跳过配置(稍后可运行 skillfree auth login)"
64
+ INSTALL_OK=false
65
+ if npm install -g skillfree 2>&1 | sed 's/^/ /'; then
66
+ INSTALL_OK=true
39
67
  else
40
- # ── 4. 写入环境变量 ─────────────────────────────────────────────────────────
41
- SHELL_RC="$HOME/.zshrc"
42
- [[ "$SHELL" == *bash* ]] && SHELL_RC="$HOME/.bashrc"
43
- if ! grep -q "SKILLFREE_API_KEY" "$SHELL_RC" 2>/dev/null; then
44
- echo "" >> "$SHELL_RC"
45
- echo "# SkillFree" >> "$SHELL_RC"
46
- echo "export SKILLFREE_API_KEY=\"$API_KEY\"" >> "$SHELL_RC"
47
- else
48
- sed -i.bak "s/export SKILLFREE_API_KEY=.*/export SKILLFREE_API_KEY=\"$API_KEY\"/" "$SHELL_RC"
49
- fi
50
- export SKILLFREE_API_KEY="$API_KEY"
51
- success "API Key 已写入 $SHELL_RC"
52
-
53
- # ── 5. 自动配置各 AI 工具 ────────────────────────────────────────────────────
54
- SKILL_SRC_DIR="$HOME/.skillfree/skill"
55
- mkdir -p "$SKILL_SRC_DIR"
56
-
57
- # 获取已安装包里的 SKILL.md(优先用本地,否则下载)
58
- NPM_SKILL_MD="$(npm root -g 2>/dev/null)/skillfree/SKILL.md"
59
- if [ -f "$NPM_SKILL_MD" ]; then
60
- cp "$NPM_SKILL_MD" "$SKILL_SRC_DIR/SKILL.md"
61
- else
62
- curl -fsSL "https://skillfree.tech/skill/SKILL.md" -o "$SKILL_SRC_DIR/SKILL.md" 2>/dev/null \
63
- || echo "# SkillFree\nUse skillfree CLI for AI tasks." > "$SKILL_SRC_DIR/SKILL.md"
68
+ echo ""
69
+ warn "权限不足,尝试 sudo..."
70
+ echo ""
71
+ if sudo npm install -g skillfree 2>&1 | sed 's/^/ /'; then
72
+ INSTALL_OK=true
64
73
  fi
74
+ fi
65
75
 
66
- # ── OpenClaw:写入 ~/.openclaw/skills/ 并注入 openclaw.json ────────────────
67
- OPENCLAW_SKILLS_DIR="$HOME/.openclaw/skills/skillfree"
68
- OPENCLAW_CFG="$HOME/.openclaw/openclaw.json"
69
- mkdir -p "$OPENCLAW_SKILLS_DIR"
70
- cp "$SKILL_SRC_DIR/SKILL.md" "$OPENCLAW_SKILLS_DIR/SKILL.md"
71
- success "OpenClaw skill 已安装 → $OPENCLAW_SKILLS_DIR/"
76
+ if [ "$INSTALL_OK" = false ]; then
77
+ err "安装失败,请手动运行:sudo npm install -g skillfree"
78
+ fi
72
79
 
73
- # 写入 openclaw.json(注入 API Key,让 skill 自动生效)
74
- if command -v node &>/dev/null; then
75
- node - <<NODEJS
76
- const fs = require('fs'), path = require('path')
77
- const cfgPath = '$OPENCLAW_CFG'
78
- let cfg = {}
79
- try { cfg = JSON.parse(fs.readFileSync(cfgPath, 'utf8')) } catch {}
80
- cfg.skills = cfg.skills || {}
81
- cfg.skills.entries = cfg.skills.entries || {}
82
- cfg.skills.entries['skillfree'] = {
83
- enabled: true,
84
- apiKey: '$API_KEY'
85
- }
86
- // 确保 ~/.openclaw/skills 在扫描路径里(通常已内置,但加上无妨)
87
- cfg.skills.load = cfg.skills.load || {}
88
- fs.mkdirSync(path.dirname(cfgPath), { recursive: true })
89
- fs.writeFileSync(cfgPath, JSON.stringify(cfg, null, 2))
90
- console.log('openclaw.json 已更新')
91
- NODEJS
92
- success "openclaw.json 已注入 API Key(skill 下次启动自动生效)"
93
- fi
80
+ echo ""
81
+ success "SkillFree CLI 安装完成"
94
82
 
95
- # 同时放一份到 workspace skills(兼容旧路径)
96
- for dir in "$HOME/.agents/skills" "$HOME/.openclaw/workspace/skills"; do
97
- if [ -d "$dir" ]; then
98
- mkdir -p "$dir/skillfree"
99
- cp "$SKILL_SRC_DIR/SKILL.md" "$dir/skillfree/SKILL.md"
100
- success "已同步到 $dir/skillfree/"
101
- fi
102
- done
83
+ # 刷新 PATH(nvm 等工具安装后 CLI 可能还不在当前 shell 的 PATH 里)
84
+ hash -r 2>/dev/null || true
85
+ export PATH="$(npm root -g)/../bin:$PATH"
103
86
 
104
- # ── Claude Code ────────────────────────────────────────────────────────────
105
- if [ -d "$HOME/.claude" ]; then
106
- mkdir -p "$HOME/.claude/skills/skillfree"
107
- cp "$SKILL_SRC_DIR/SKILL.md" "$HOME/.claude/skills/skillfree/SKILL.md"
108
- success "Claude Code 配置完成 → ~/.claude/skills/skillfree/"
109
- fi
87
+ if ! command -v skillfree &>/dev/null; then
88
+ warn "CLI 已安装,但当前终端 PATH 未更新"
89
+ warn "请新开一个终端窗口,然后运行:skillfree auth login"
90
+ echo ""
91
+ exit 0
92
+ fi
110
93
 
111
- # ── Codex CLI ──────────────────────────────────────────────────────────────
112
- if [ -d "$HOME/.codex" ]; then
113
- mkdir -p "$HOME/.codex/skills/skillfree"
114
- cp "$SKILL_SRC_DIR/SKILL.md" "$HOME/.codex/skills/skillfree/SKILL.md"
115
- success "Codex 配置完成~/.codex/skills/skillfree/"
116
- fi
94
+ # ── Step 3: 登录 ──────────────────────────────────────────────────────────────
95
+ step "[ 3 / 3 ] 登录账号"
96
+ echo ""
97
+ echo -e " 还没有账号?${CYAN}https://skillfree.tech/app${NC} 免费注册"
98
+ echo -e " 注册后进入控制台 API Keys 创建一个 Key,粘贴到下方"
99
+ echo ""
117
100
 
118
- # ── Continue.dev ───────────────────────────────────────────────────────────
119
- if [ -d "$HOME/.continue" ]; then
120
- mkdir -p "$HOME/.continue/skills/skillfree"
121
- cp "$SKILL_SRC_DIR/SKILL.md" "$HOME/.continue/skills/skillfree/SKILL.md"
122
- success "Continue.dev 配置完成 → ~/.continue/skills/skillfree/"
123
- fi
124
- fi
101
+ skillfree auth login
125
102
 
126
- # ── 6. 完成 ───────────────────────────────────────────────────────────────────
103
+ # ── 完成 ──────────────────────────────────────────────────────────────────────
104
+ echo ""
105
+ echo -e " ${DIM}────────────────────────────────────────────────────${NC}"
106
+ echo ""
107
+ echo -e "${BOLD_GREEN} 🎉 全部搞定!开始召唤龙虾吧${NC}"
127
108
  echo ""
128
- echo -e "${GREEN}🎉 安装完成!${NC}"
109
+ echo -e " ${BOLD}快速体验:${NC}"
110
+ echo -e " ${CYAN} $ skillfree pilot --type chat --prompt \"你好\"${NC}"
111
+ echo -e " ${CYAN} $ skillfree pilot --type image --prompt \"赛博朋克的上海\" --output ./img.png${NC}"
112
+ echo -e " ${CYAN} $ skillfree pilot --type search --prompt \"今天的 AI 新闻\"${NC}"
129
113
  echo ""
130
- echo -e " ${CYAN}快速开始:${NC}"
131
- echo -e " $ skillfree pilot --type chat --prompt \"你好龙虾\""
132
- echo -e " $ skillfree pilot --type image --prompt \"赛博朋克的上海\" --output ./img.png"
114
+ echo -e " ${DIM} skillfree models # 查看所有模型${NC}"
115
+ echo -e " ${DIM} skillfree credits # 查看积分余额${NC}"
133
116
  echo ""
134
- echo -e " ${CYAN}充值积分:${NC} https://skillfree.tech/app/topup"
135
- echo -e " ${CYAN}查看文档:${NC} https://skillfree.tech/app/docs"
117
+ echo -e " ${DIM}充值积分:${NC}${CYAN}https://skillfree.tech/app/topup${NC}"
136
118
  echo ""
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skillfree",
3
- "version": "0.1.20",
3
+ "version": "0.1.21",
4
4
  "description": "🦞 一个 API,满足所有龙虾技能需求",
5
5
  "main": "bin/skillfree.js",
6
6
  "bin": {
@@ -61,40 +61,55 @@ function injectToOpenclaw(apiKey) {
61
61
 
62
62
  async function authLogin() {
63
63
  console.log(`\n🦞 SkillFree 登录`)
64
- console.log(` 控制台:${BASE_URL}/app\n`)
64
+ console.log(` 还没有账号?前往注册:${BASE_URL}/app`)
65
+ console.log(` 注册后在控制台 → API Keys → 创建 Key\n`)
65
66
 
66
67
  const rl = readline.createInterface({ input: process.stdin, output: process.stdout })
67
68
  const ask = (q) => new Promise(resolve => rl.question(q, resolve))
68
69
 
69
- console.log('请前往控制台 API Keys → 创建 Key,然后粘贴到此处。')
70
- const key = (await ask('API Key (sk-sf-...): ')).trim()
71
- rl.close()
70
+ let success = false
71
+ while (!success) {
72
+ const key = (await ask('请粘贴 API Key (sk-sf-...),输入 q 跳过: ')).trim()
72
73
 
73
- if (!key.startsWith('sk-sf-')) {
74
- console.error(' 格式不正确,Key 应以 sk-sf- 开头')
75
- process.exit(1)
76
- }
74
+ if (key === 'q' || key === '') {
75
+ console.log('\n⏭ 已跳过登录,稍后可运行 skillfree auth login 完成配置')
76
+ rl.close()
77
+ return
78
+ }
77
79
 
78
- // 验证 key 是否有效
79
- process.stdout.write('验证中...')
80
- try {
81
- const res = await fetch(`${BASE_URL}/v1/balance`, {
82
- headers: { 'Authorization': `Bearer ${key}` }
83
- })
84
- if (!res.ok) throw new Error(res.status)
85
- const data = await res.json()
86
- saveConfig({ apiKey: key })
87
- injectToOpenclaw(key)
88
- console.log(` ✅\n`)
89
- console.log(`🎉 登录成功!当前积分:${data.credits}`)
90
- console.log(`\n快速开始:`)
91
- console.log(` skillfree pilot --type chat --model DeepSeek-V3.2-Fast --prompt "你好"`)
92
- console.log(` skillfree pilot --type chat --model claude-sonnet-4-6 --prompt "你好"`)
93
- console.log(` skillfree models # 查看所有可用模型`)
94
- } catch (e) {
95
- console.log(` ❌\nAPI Key 无效,请重新检查`)
96
- process.exit(1)
80
+ if (!key.startsWith('sk-sf-')) {
81
+ console.log('❌ 格式不对,Key 应以 sk-sf- 开头,请重新输入\n')
82
+ continue
83
+ }
84
+
85
+ // 验证 key 是否有效
86
+ process.stdout.write('验证中...')
87
+ try {
88
+ const res = await fetch(`${BASE_URL}/v1/balance`, {
89
+ headers: { 'Authorization': `Bearer ${key}` }
90
+ })
91
+ if (!res.ok) {
92
+ console.log(` ❌ (HTTP ${res.status})`)
93
+ console.log('API Key 无效,请检查后重新输入\n')
94
+ continue
95
+ }
96
+ const data = await res.json()
97
+ saveConfig({ apiKey: key })
98
+ injectToOpenclaw(key)
99
+ console.log(` ✅\n`)
100
+ console.log(`🎉 登录成功!当前积分:${data.credits}`)
101
+ console.log(`\n快速开始:`)
102
+ console.log(` skillfree pilot --type chat --model DeepSeek-V3.2-Fast --prompt "你好"`)
103
+ console.log(` skillfree pilot --type chat --model claude-sonnet-4-6 --prompt "你好"`)
104
+ console.log(` skillfree models # 查看所有可用模型`)
105
+ success = true
106
+ } catch (e) {
107
+ console.log(` ❌`)
108
+ console.log(`网络错误(${e.message}),请检查网络后重试\n`)
109
+ }
97
110
  }
111
+
112
+ rl.close()
98
113
  }
99
114
 
100
115
  async function authStatus() {