@ghenya/clinn 0.7.10 → 0.7.12

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.
@@ -2,6 +2,6 @@
2
2
  ██ ██ ██ ████ ██ ████ ██
3
3
  ██ ██ ██ ██ ██ ██ ██ ██ ██
4
4
  ██ ██ ██ ██ ██ ██ ██ ██ ██
5
- ██████ ███████ ██ ██ ████ ██ █0.7.10
5
+ ██████ ███████ ██ ██ ████ ██ █0.7.12
6
6
 
7
7
 
package/config.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "agent": {
3
3
  "name": "Clinn",
4
- "version": "0.7.10",
4
+ "version": "0.7.12",
5
5
  "description": "控制台智能体助手"
6
6
  },
7
7
  "llm": {
package/install.bat ADDED
@@ -0,0 +1,93 @@
1
+ @echo off
2
+ setlocal enabledelayedexpansion
3
+ title Clinn v0.7.11 强力安装
4
+
5
+ set "VER=0.7.11"
6
+ set "SRC=%~dp0"
7
+
8
+ where node >nul 2>&1
9
+ if %errorlevel% neq 0 (
10
+ echo [X] Node.js not found. Install Node.js ^>= 18: https://nodejs.org
11
+ pause
12
+ exit /b 1
13
+ )
14
+
15
+ net session >nul 2>&1
16
+ if !errorlevel! equ 0 (set "DEST=%ProgramFiles%\Clinn") else (set "DEST=%LOCALAPPDATA%\Programs\Clinn")
17
+
18
+ echo.
19
+ echo ============================================
20
+ echo Clinn v!VER! — 强力安装 (Win)
21
+ echo ============================================
22
+ echo.
23
+ echo 目标目录: !DEST!
24
+
25
+ set "OLDKEY="
26
+ if exist "!DEST!\config.json" (
27
+ for /f "tokens=1,* delims=:" %%A in ('findstr /c:"apiKey" "!DEST!\config.json"') do (
28
+ for /f tokens^=* %%K in ("%%B") do set "OLDKEY=%%~K"
29
+ )
30
+ set "OLDKEY=!OLDKEY:"=!"
31
+ set "OLDKEY=!OLDKEY: =!"
32
+ )
33
+
34
+ echo 正在清除旧安装...
35
+ if exist "!DEST!" rmdir /s /q "!DEST!" >nul 2>&1
36
+ if exist "!DEST!" (
37
+ timeout /t 2 /nobreak >nul
38
+ rmdir /s /q "!DEST!" >nul 2>&1
39
+ )
40
+
41
+ echo 正在清理 PATH 环境变量中的旧条目...
42
+ for %%V in (User Machine) do (
43
+ for /f "tokens=1,* delims=;" %%A in ('powershell -NoProfile -Command "[Environment]::GetEnvironmentVariable('Path', '%%V')" 2^>nul') do (
44
+ set "LINE=%%A;%%B"
45
+ )
46
+ if defined LINE (
47
+ set "NEWPATH="
48
+ for %%P in ("!LINE:;=" "!") do (
49
+ set "ENTRY=%%~P"
50
+ set "ENTRY=!ENTRY:"=!"
51
+ if /i not "!ENTRY!"=="!DEST!" (
52
+ if not "!ENTRY!"=="" (
53
+ if not "!ENTRY!"=="/" (
54
+ if defined NEWPATH (set "NEWPATH=!NEWPATH!;!ENTRY!") else (set "NEWPATH=!ENTRY!")
55
+ )
56
+ )
57
+ )
58
+ )
59
+ powershell -NoProfile -Command "[Environment]::SetEnvironmentVariable('Path', '!NEWPATH!', '%%V')" >nul 2>&1
60
+ )
61
+ )
62
+
63
+ echo 正在复制文件...
64
+ mkdir "!DEST!" >nul 2>&1
65
+
66
+ for %%D in (Src Tools Mem Logos bin) do (
67
+ if exist "%SRC%%%D" robocopy "%SRC%%%D" "!DEST!\%%D" /E /NFL /NDL /NJH /NJS >nul 2>&1
68
+ )
69
+
70
+ copy /Y "%SRC%config.json" "!DEST!\config.json" >nul
71
+
72
+ if not "!OLDKEY!"=="" if not "!OLDKEY!"=="YOUR_API_KEY" if not "!OLDKEY!"=="YOUR_DEEPSEEK_API_KEY_HERE" (
73
+ echo 正在恢复旧 API Key...
74
+ powershell -NoProfile -Command "(Get-Content '!DEST!\config.json' -Raw) -replace '""apiKey"":\s*"".*?""', '""apiKey"": ""!OLDKEY!""' | Set-Content '!DEST!\config.json' -NoNewline" >nul 2>&1
75
+ )
76
+
77
+ mkdir "!DEST!\Tools\custom" >nul 2>&1
78
+
79
+ echo @echo off> "!DEST!\clinn.bat"
80
+ echo node "!DEST!\Src\index.js" %%*>> "!DEST!\clinn.bat"
81
+
82
+ echo 正在添加到 PATH...
83
+ powershell -NoProfile -Command "[Environment]::SetEnvironmentVariable('Path', [Environment]::GetEnvironmentVariable('Path', 'User') + ';!DEST!', 'User')" >nul 2>&1
84
+
85
+ echo.
86
+ echo ============================================
87
+ echo 安装完成! 打开新终端输入 clinn 即可启动
88
+ echo ============================================
89
+ echo.
90
+ echo 配置: !DEST!\config.json
91
+ echo 卸载: rmdir /s /q "!DEST!"
92
+ echo.
93
+ endlocal
package/install.js ADDED
@@ -0,0 +1,138 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ const os = require("os");
5
+ const fs = require("fs");
6
+ const path = require("path");
7
+ const { execSync } = require("child_process");
8
+
9
+ const VER = "0.7.12";
10
+ const GREEN = "\x1b[0;32m";
11
+ const CYAN = "\x1b[0;36m";
12
+ const YELLOW = "\x1b[0;33m";
13
+ const RED = "\x1b[0;31m";
14
+ const NC = "\x1b[0m";
15
+ const DIM = "\x1b[2m";
16
+
17
+ const IS_WIN = process.platform === "win32";
18
+ const SRC = __dirname;
19
+
20
+ function run(cmd, silent) {
21
+ try {
22
+ return execSync(cmd, { encoding: "utf-8", stdio: silent ? "pipe" : "inherit" });
23
+ } catch (_) {
24
+ return "";
25
+ }
26
+ }
27
+
28
+ function panic(msg) {
29
+ console.error(`${RED}${msg}${NC}`);
30
+ process.exit(1);
31
+ }
32
+
33
+ console.log("");
34
+ console.log(` ${CYAN}============================================${NC}`);
35
+ console.log(` ${CYAN} Clinn v${VER} — npm 强力安装${NC}`);
36
+ console.log(` ${CYAN}============================================${NC}`);
37
+ console.log("");
38
+
39
+ try { run("node --version", true); } catch (_) { panic("Node.js not found >= 18"); }
40
+
41
+ let DEST;
42
+ if (IS_WIN) {
43
+ try { run("net session", true); DEST = path.join(process.env.ProgramFiles, "Clinn"); }
44
+ catch (_) { DEST = path.join(process.env.LOCALAPPDATA, "Programs", "Clinn"); }
45
+ } else {
46
+ DEST = "/usr/local/lib/clinn";
47
+ }
48
+
49
+ console.log(` ${DIM}目标目录: ${DEST}${NC}`);
50
+
51
+ let oldKey = "";
52
+ const oldConfig = path.join(DEST, "config.json");
53
+ if (fs.existsSync(oldConfig)) {
54
+ try {
55
+ oldKey = require(oldConfig).llm?.apiKey || "";
56
+ } catch (_) {}
57
+ }
58
+
59
+ console.log(` ${YELLOW}正在清除旧安装...${NC}`);
60
+ if (fs.existsSync(DEST)) fs.rmSync(DEST, { recursive: true, force: true });
61
+ if (!IS_WIN) {
62
+ for (const bin of ["/usr/local/bin/clinn", "/usr/bin/clinn", "/usr/local/sbin/clinn"]) {
63
+ try { fs.unlinkSync(bin); } catch (_) {}
64
+ }
65
+ }
66
+
67
+ function cleanShellRC() {
68
+ if (IS_WIN) return;
69
+ const home = os.homedir();
70
+ const files = [".bashrc", ".zshrc", ".bash_profile", ".profile"];
71
+ for (const f of files) {
72
+ const p = path.join(home, f);
73
+ if (!fs.existsSync(p)) continue;
74
+ let content = fs.readFileSync(p, "utf-8");
75
+ const lines = content.split("\n").filter(l => !/clinn/i.test(l));
76
+ fs.writeFileSync(p, lines.join("\n"), "utf-8");
77
+ }
78
+ }
79
+ cleanShellRC();
80
+
81
+ console.log(` ${CYAN}正在复制文件...${NC}`);
82
+ const dirs = ["Src", "Tools", "Mem", "Logos", "bin"];
83
+ fs.mkdirSync(DEST, { recursive: true });
84
+ for (const d of dirs) {
85
+ const src = path.join(SRC, d);
86
+ if (fs.existsSync(src)) fs.cpSync(src, path.join(DEST, d), { recursive: true });
87
+ }
88
+ const cfgSrc = path.join(SRC, "config.json");
89
+ if (fs.existsSync(cfgSrc)) fs.copyFileSync(cfgSrc, path.join(DEST, "config.json"));
90
+ fs.mkdirSync(path.join(DEST, "Tools", "custom"), { recursive: true });
91
+
92
+ if (oldKey && oldKey !== "YOUR_API_KEY" && oldKey !== "YOUR_DEEPSEEK_API_KEY_HERE") {
93
+ console.log(` ${YELLOW}正在恢复旧 API Key...${NC}`);
94
+ try {
95
+ const cfg = JSON.parse(fs.readFileSync(path.join(DEST, "config.json"), "utf-8"));
96
+ cfg.llm.apiKey = oldKey;
97
+ fs.writeFileSync(path.join(DEST, "config.json"), JSON.stringify(cfg, null, 2), "utf-8");
98
+ } catch (_) {}
99
+ }
100
+
101
+ function updatePATH() {
102
+ if (IS_WIN) {
103
+ const levels = ["User", "Machine"];
104
+ for (const level of levels) {
105
+ let raw = "";
106
+ try {
107
+ raw = execSync(`powershell -NoProfile -Command "[Environment]::GetEnvironmentVariable('Path', '${level}')"`, { encoding: "utf-8", windowsHide: true }).trim();
108
+ } catch (_) { continue; }
109
+ const parts = raw.split(";").filter(p => p && p.toLowerCase().replace(/\//g, "\\") !== DEST.toLowerCase().replace(/\//g, "\\"));
110
+ const clean = parts.join(";") + ";" + DEST;
111
+ try {
112
+ execSync(`powershell -NoProfile -Command "[Environment]::SetEnvironmentVariable('Path', '${clean.replace(/\\/g, "\\\\")}', '${level}')"`, { windowsHide: true });
113
+ } catch (_) {}
114
+ }
115
+ } else {
116
+ const launcher = `#!/usr/bin/env bash\nexec node ${DEST}/Src/index.js "$@"\n`;
117
+ const binPath = "/usr/local/bin/clinn";
118
+ try { fs.writeFileSync(binPath, launcher, { mode: 0o755 }); }
119
+ catch (_) { try { run(`sudo bash -c 'cat > ${binPath} && chmod +x ${binPath}' <<< "${launcher}"`, false); } catch (_) {} }
120
+ }
121
+ }
122
+ updatePATH();
123
+
124
+ if (IS_WIN) {
125
+ const bat = `@echo off\r\nnode "${DEST}\\Src\\index.js" %*\r\n`;
126
+ fs.writeFileSync(path.join(DEST, "clinn.bat"), bat, "utf-8");
127
+ }
128
+
129
+ console.log("");
130
+ console.log(` ${GREEN}============================================${NC}`);
131
+ console.log(` ${GREEN} 安装完成! 输入 clinn 即可启动${NC}`);
132
+ console.log(` ${GREEN}============================================${NC}`);
133
+ console.log("");
134
+ console.log(` 运行: ${CYAN}clinn${NC}`);
135
+ console.log(` 版本: ${CYAN}clinn --version${NC}`);
136
+ console.log(` 配置: ${CYAN}${DEST}/config.json${NC}`);
137
+ console.log(` 卸载: ${CYAN}${IS_WIN ? `rmdir /s /q "${DEST}"` : `sudo rm -rf ${DEST} /usr/local/bin/clinn`}${NC}`);
138
+ console.log("");
package/install.sh ADDED
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ VER="0.7.11"
5
+ INSTALL_LIB="/usr/local/lib/clinn"
6
+ INSTALL_BIN="/usr/local/bin/clinn"
7
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
8
+
9
+ RED='\033[0;31m'; GREEN='\033[0;32m'; CYAN='\033[0;36m'; YELLOW='\033[0;33m'; NC='\033[0m'
10
+
11
+ command -v node &>/dev/null || { echo -e "${RED}Node.js not found. Install Node.js >= 18: https://nodejs.org${NC}"; exit 1; }
12
+
13
+ NEED_SUDO=""
14
+ if [ ! -w "/usr/local/lib" ] || [ ! -w "/usr/local/bin" ]; then
15
+ command -v sudo &>/dev/null || { echo -e "${RED}sudo required to write to /usr/local${NC}"; exit 1; }
16
+ NEED_SUDO="sudo"
17
+ fi
18
+
19
+ echo ""
20
+ echo -e " ${CYAN}============================================${NC}"
21
+ echo -e " ${CYAN} Clinn v${VER} — 强力安装 (Unix)${NC}"
22
+ echo -e " ${CYAN}============================================${NC}"
23
+ echo ""
24
+
25
+ OLD_KEY=""
26
+ if [ -f "$INSTALL_LIB/config.json" ]; then
27
+ OLD_KEY=$(node -e "try{process.stdout.write(require('$INSTALL_LIB/config.json').llm?.apiKey||'')}catch(e){}" 2>/dev/null)
28
+ fi
29
+
30
+ echo -e " ${YELLOW}正在清除旧安装...${NC}"
31
+
32
+ $NEED_SUDO rm -rf "$INSTALL_LIB" 2>/dev/null || true
33
+ $NEED_SUDO rm -f "$INSTALL_BIN" 2>/dev/null || true
34
+ $NEED_SUDO rm -f "/usr/bin/clinn" 2>/dev/null || true
35
+ $NEED_SUDO rm -f "/usr/local/sbin/clinn" 2>/dev/null || true
36
+
37
+ echo -e " ${YELLOW}正在清理旧 PATH 条目...${NC}"
38
+ for RC in "$HOME/.bashrc" "$HOME/.zshrc" "$HOME/.bash_profile" "$HOME/.profile"; do
39
+ if [ -f "$RC" ]; then
40
+ sed -i.bak '/# Clinn PATH/d' "$RC" 2>/dev/null || true
41
+ sed -i.bak '/clinn/d' "$RC" 2>/dev/null || true
42
+ rm -f "${RC}.bak" 2>/dev/null || true
43
+ fi
44
+ done
45
+
46
+ echo -e " ${CYAN}正在复制文件到 ${INSTALL_LIB}${NC}"
47
+ $NEED_SUDO mkdir -p "$INSTALL_LIB"
48
+ for D in Src Tools Mem Logos bin; do
49
+ if [ -d "$SCRIPT_DIR/$D" ]; then
50
+ $NEED_SUDO cp -r "$SCRIPT_DIR/$D" "$INSTALL_LIB/"
51
+ fi
52
+ done
53
+ $NEED_SUDO cp "$SCRIPT_DIR/config.json" "$INSTALL_LIB/config.json"
54
+ $NEED_SUDO mkdir -p "$INSTALL_LIB/Tools/custom"
55
+
56
+ if [ -n "$OLD_KEY" ] && [ "$OLD_KEY" != "YOUR_API_KEY" ] && [ "$OLD_KEY" != "YOUR_DEEPSEEK_API_KEY_HERE" ]; then
57
+ echo -e " ${YELLOW}正在恢复旧 API Key...${NC}"
58
+ $NEED_SUDO node -e "
59
+ const fs=require('fs');
60
+ const cfg=JSON.parse(fs.readFileSync('$INSTALL_LIB/config.json','utf-8'));
61
+ cfg.llm.apiKey='$OLD_KEY';
62
+ fs.writeFileSync('$INSTALL_LIB/config.json',JSON.stringify(cfg,null,2));
63
+ "
64
+ fi
65
+
66
+ $NEED_SUDO bash -c "cat > $INSTALL_BIN" << 'LAUNCHER'
67
+ #!/usr/bin/env bash
68
+ exec node /usr/local/lib/clinn/Src/index.js "$@"
69
+ LAUNCHER
70
+ $NEED_SUDO chmod +x "$INSTALL_BIN"
71
+
72
+ echo ""
73
+ echo -e " ${GREEN}============================================${NC}"
74
+ echo -e " ${GREEN} 安装完成! 输入 clinn 即可启动${NC}"
75
+ echo -e " ${GREEN}============================================${NC}"
76
+ echo ""
77
+ echo -e " 运行: ${CYAN}clinn${NC}"
78
+ echo -e " 配置: ${CYAN}${INSTALL_LIB}/config.json${NC}"
79
+ echo -e " 卸载: ${CYAN}sudo rm -rf ${INSTALL_LIB} ${INSTALL_BIN}${NC}"
80
+ echo ""
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ghenya/clinn",
3
- "version": "0.7.10",
3
+ "version": "0.7.12",
4
4
  "description": "终端原生 AI 编程助手 — DeepSeek 驱动,50+ 工具,对话记忆,虚拟浏览器",
5
5
  "main": "Src/index.js",
6
6
  "bin": {
@@ -13,7 +13,10 @@
13
13
  "Logos/",
14
14
  "bin/",
15
15
  "config.json",
16
- "README.md"
16
+ "README.md",
17
+ "install.js",
18
+ "install.sh",
19
+ "install.bat"
17
20
  ],
18
21
  "scripts": {
19
22
  "start": "node Src/index.js",