aihezu 1.4.0 → 1.5.2

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/bin/ccclear.js CHANGED
@@ -1,27 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- const { execSync } = require('child_process');
4
3
  const path = require('path');
5
4
  const os = require('os');
6
5
  const fs = require('fs');
7
6
  const { modifyHostsFile } = require('../lib/hosts');
7
+ const { cleanCache, getLocalTimestamp } = require('../lib/cache');
8
8
 
9
9
  const homeDir = os.homedir();
10
10
 
11
- // 生成本地时间戳,格式:YYYYMMDDHHMMSS
12
- function getLocalTimestamp() {
13
- const now = new Date();
14
- const year = now.getFullYear();
15
- const month = String(now.getMonth() + 1).padStart(2, '0');
16
- const day = String(now.getDate()).padStart(2, '0');
17
- const hours = String(now.getHours()).padStart(2, '0');
18
- const minutes = String(now.getMinutes()).padStart(2, '0');
19
- const seconds = String(now.getSeconds()).padStart(2, '0');
20
- return `${year}${month}${day}${hours}${minutes}${seconds}`;
21
- }
22
-
23
- const timestamp = getLocalTimestamp();
24
-
25
11
  console.log('🧹 Claude Code CLI 清理工具');
26
12
  console.log('🌐 Powered by https://aihezu.dev\n');
27
13
 
@@ -32,105 +18,28 @@ try {
32
18
 
33
19
  console.log('\n=== 步骤 2: 清理 Claude Code 缓存 ===\n');
34
20
 
35
- // 检查文件是否存在
36
- const claudeDir = path.join(homeDir, '.claude');
37
21
  const claudeJson = path.join(homeDir, '.claude.json');
38
-
39
- // 定义需要清理的缓存文件和文件夹
40
- const cacheItems = [
41
- 'history.jsonl', // 历史记录
42
- 'debug', // 调试信息
43
- 'file-history', // 文件历史
44
- 'session-env', // 会话环境
45
- 'shell-snapshots', // Shell 快照
46
- 'statsig', // 统计信息
47
- 'todos' // 待办事项
48
- ];
49
-
50
- // 需要保留的配置和工具(不清理)
51
- // - settings.json (配置文件)
52
- // - commands/ (自定义命令)
53
- // - skills/ (技能)
54
- // - mcp/ (MCP 服务器)
55
- // - projects/ (项目信息)
56
- // - ide/ (IDE 配置)
57
-
58
- let hasFiles = false;
59
- let cleanedCount = 0;
60
-
61
- if (fs.existsSync(claudeDir)) {
62
- console.log('📂 开始清理 ~/.claude 目录下的缓存文件...\n');
63
-
64
- // 遍历并清理缓存项
65
- for (const item of cacheItems) {
66
- const itemPath = path.join(claudeDir, item);
67
-
68
- try {
69
- if (fs.existsSync(itemPath)) {
70
- const stat = fs.statSync(itemPath);
71
- const backupPath = `${itemPath}-backup-${timestamp}`;
72
-
73
- if (stat.isDirectory()) {
74
- console.log(`📦 备份并清理目录: ${item}/`);
75
- execSync(`mv "${itemPath}" "${backupPath}"`);
76
- } else {
77
- console.log(`📦 备份并清理文件: ${item}`);
78
- execSync(`mv "${itemPath}" "${backupPath}"`);
79
- }
80
-
81
- cleanedCount++;
82
- hasFiles = true;
83
- }
84
- } catch (e) {
85
- console.log(`⚠️ 处理 ${item} 时出错: ${e.message}`);
86
- }
87
- }
88
-
89
- // 清理旧的备份文件夹(.claude-* 格式)
90
- try {
91
- const items = fs.readdirSync(claudeDir);
92
- for (const item of items) {
93
- if (item.startsWith('.claude-') || item.startsWith('backup-')) {
94
- const itemPath = path.join(claudeDir, item);
95
- const stat = fs.statSync(itemPath);
96
-
97
- if (stat.isDirectory()) {
98
- console.log(`🗑️ 删除旧备份: ${item}/`);
99
- execSync(`rm -rf "${itemPath}"`);
100
- cleanedCount++;
101
- hasFiles = true;
102
- }
103
- }
104
- }
105
- } catch (e) {
106
- // 忽略错误
107
- }
108
-
109
- console.log('\n✅ 已保留以下配置和工具:');
110
- console.log(' - settings.json (配置文件)');
111
- console.log(' - commands/ (自定义命令)');
112
- console.log(' - skills/ (技能)');
113
- console.log(' - mcp/ (MCP 服务器)');
114
- console.log(' - projects/ (项目信息)');
115
- console.log(' - ide/ (IDE 配置)');
116
- } else {
117
- console.log('ℹ️ 未找到 ~/.claude 目录');
118
- }
22
+ const cleanedCount = cleanCache();
119
23
 
120
24
  // 备份 .claude.json 文件
25
+ let hasClaudeJson = false;
121
26
  try {
122
27
  if (fs.existsSync(claudeJson)) {
28
+ const timestamp = getLocalTimestamp();
123
29
  const backupJson = `${claudeJson}-backup-${timestamp}`;
124
30
  console.log(`\n📦 备份 ~/.claude.json 到 ${path.basename(backupJson)}`);
125
- execSync(`mv "${claudeJson}" "${backupJson}"`);
126
- hasFiles = true;
31
+ // 使用 Node.js 原生 API,跨平台兼容
32
+ fs.renameSync(claudeJson, backupJson);
33
+ hasClaudeJson = true;
127
34
  }
128
35
  } catch (e) {
129
36
  console.log('ℹ️ 未找到 ~/.claude.json 文件');
130
37
  }
131
38
 
132
- if (hasFiles) {
133
- console.log(`\n✅ Claude Code 缓存已清理完成!(共处理 ${cleanedCount} 项)`);
39
+ const totalCleaned = cleanedCount + (hasClaudeJson ? 1 : 0);
40
+
41
+ if (totalCleaned > 0) {
42
+ console.log(`\n✅ Claude Code 缓存已清理完成!(共处理 ${totalCleaned} 项)`);
134
43
  console.log('💡 配置和工具已保留,下次启动 Claude Code 可直接使用');
135
44
  console.log(`📁 备份文件保存在 ~/.claude/ 目录下`);
136
45
  } else {
package/bin/ccinstall.js CHANGED
@@ -5,9 +5,11 @@ const path = require('path');
5
5
  const os = require('os');
6
6
  const fs = require('fs');
7
7
  const { modifyHostsFile } = require('../lib/hosts');
8
+ const { cleanCache } = require('../lib/cache');
8
9
 
9
10
  const homeDir = os.homedir();
10
11
  const settingsPath = path.join(homeDir, '.claude', 'settings.json');
12
+ const claudeDir = path.join(homeDir, '.claude');
11
13
 
12
14
  console.log('🔧 Claude Code API 配置工具');
13
15
  console.log('🌐 Powered by https://aihezu.dev\n');
@@ -18,8 +20,25 @@ const rl = readline.createInterface({
18
20
  output: process.stdout
19
21
  });
20
22
 
21
- // 提示用户输入 API Key
22
- rl.question('请输入您的 API Key: ', (apiKey) => {
23
+
24
+ // 询问是否需要清理缓存
25
+ rl.question('您是从其他服务切换过来的吗?(y/n,如果是首次使用请输入 n): ', (answer) => {
26
+ const needClean = answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';
27
+
28
+ if (needClean) {
29
+ try {
30
+ console.log('\n=== 清理旧缓存 ===');
31
+ const count = cleanCache({ showHeader: false });
32
+ console.log(`\n✅ 缓存清理完成!(共处理 ${count} 项)`);
33
+ console.log('💡 配置文件已保留,即将配置新的 API Key\n');
34
+ } catch (error) {
35
+ console.error('⚠️ 清理缓存时出错:', error.message);
36
+ console.log('继续配置流程...\n');
37
+ }
38
+ }
39
+
40
+ // 提示用户输入 API Key
41
+ rl.question('请输入您的 API Key: ', (apiKey) => {
23
42
  if (!apiKey || apiKey.trim() === '') {
24
43
  console.error('❌ API Key 不能为空');
25
44
  rl.close();
@@ -30,7 +49,6 @@ rl.question('请输入您的 API Key: ', (apiKey) => {
30
49
 
31
50
  try {
32
51
  // 确保 .claude 目录存在
33
- const claudeDir = path.join(homeDir, '.claude');
34
52
  if (!fs.existsSync(claudeDir)) {
35
53
  console.log('📁 创建 ~/.claude 目录...');
36
54
  fs.mkdirSync(claudeDir, { recursive: true });
@@ -53,19 +71,17 @@ rl.question('请输入您的 API Key: ', (apiKey) => {
53
71
  }
54
72
  }
55
73
 
56
- // 确保 env 对象存在
57
- if (!settings.env) {
58
- settings.env = {};
59
- }
60
-
61
- // 设置配置
62
- settings.env.ANTHROPIC_AUTH_TOKEN = apiKey;
63
- settings.env.ANTHROPIC_BASE_URL = 'https://cc.aihezu.dev/api';
74
+ // 完全替换 env 对象,清除所有旧的环境变量配置
75
+ // 这样可以避免旧配置(如 ANTHROPIC_MODEL 等)干扰新配置
76
+ settings.env = {
77
+ ANTHROPIC_AUTH_TOKEN: apiKey,
78
+ ANTHROPIC_BASE_URL: 'https://cc.aihezu.dev/api'
79
+ };
64
80
 
65
81
  // 写入配置文件
66
82
  fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf8');
67
83
 
68
- console.log('\n=== 步骤 1: API 配置 ===\n');
84
+ console.log('\n=== API 配置 ===\n');
69
85
  console.log('✅ 配置成功!');
70
86
  console.log('📝 已更新配置文件:', settingsPath);
71
87
  console.log('\n配置内容:');
@@ -73,7 +89,7 @@ rl.question('请输入您的 API Key: ', (apiKey) => {
73
89
  console.log(' ANTHROPIC_BASE_URL:', 'https://cc.aihezu.dev/api');
74
90
 
75
91
  // 修改 hosts 文件
76
- console.log('\n=== 步骤 2: 修改 hosts 文件 ===\n');
92
+ console.log('\n=== 修改 hosts 文件 ===\n');
77
93
  modifyHostsFile();
78
94
 
79
95
  console.log('\n=== 全部完成 ===');
@@ -86,4 +102,5 @@ rl.question('请输入您的 API Key: ', (apiKey) => {
86
102
  } finally {
87
103
  rl.close();
88
104
  }
89
- });
105
+ });
106
+ });
package/lib/cache.js ADDED
@@ -0,0 +1,113 @@
1
+ const path = require('path');
2
+ const os = require('os');
3
+ const fs = require('fs');
4
+
5
+ const homeDir = os.homedir();
6
+ const claudeDir = path.join(homeDir, '.claude');
7
+
8
+ // 生成本地时间戳,格式:YYYYMMDDHHMMSS
9
+ function getLocalTimestamp() {
10
+ const now = new Date();
11
+ const year = now.getFullYear();
12
+ const month = String(now.getMonth() + 1).padStart(2, '0');
13
+ const day = String(now.getDate()).padStart(2, '0');
14
+ const hours = String(now.getHours()).padStart(2, '0');
15
+ const minutes = String(now.getMinutes()).padStart(2, '0');
16
+ const seconds = String(now.getSeconds()).padStart(2, '0');
17
+ return `${year}${month}${day}${hours}${minutes}${seconds}`;
18
+ }
19
+
20
+ // 清理缓存函数
21
+ function cleanCache(options = {}) {
22
+ const { showHeader = true } = options;
23
+
24
+ if (showHeader) {
25
+ console.log('\n=== 清理缓存 ===\n');
26
+ }
27
+
28
+ const timestamp = getLocalTimestamp();
29
+ const cacheItems = [
30
+ 'history.jsonl', // 历史记录
31
+ 'debug', // 调试信息
32
+ 'file-history', // 文件历史
33
+ 'session-env', // 会话环境
34
+ 'shell-snapshots', // Shell 快照
35
+ 'statsig', // 统计信息
36
+ 'todos' // 待办事项
37
+ ];
38
+
39
+ // 需要保留的配置和工具(不清理)
40
+ // - settings.json (配置文件)
41
+ // - commands/ (自定义命令)
42
+ // - skills/ (技能)
43
+ // - mcp/ (MCP 服务器)
44
+ // - projects/ (项目信息)
45
+ // - ide/ (IDE 配置)
46
+
47
+ let cleanedCount = 0;
48
+
49
+ if (fs.existsSync(claudeDir)) {
50
+ console.log('📂 开始清理 ~/.claude 目录下的缓存文件...\n');
51
+
52
+ // 遍历并清理缓存项
53
+ for (const item of cacheItems) {
54
+ const itemPath = path.join(claudeDir, item);
55
+
56
+ try {
57
+ if (fs.existsSync(itemPath)) {
58
+ const stat = fs.statSync(itemPath);
59
+ const backupPath = `${itemPath}-backup-${timestamp}`;
60
+
61
+ if (stat.isDirectory()) {
62
+ console.log(`📦 备份并清理目录: ${item}/`);
63
+ } else {
64
+ console.log(`📦 备份并清理文件: ${item}`);
65
+ }
66
+
67
+ // 使用 Node.js 原生 API,跨平台兼容
68
+ fs.renameSync(itemPath, backupPath);
69
+ cleanedCount++;
70
+ }
71
+ } catch (e) {
72
+ console.log(`⚠️ 处理 ${item} 时出错: ${e.message}`);
73
+ }
74
+ }
75
+
76
+ // 清理旧的备份文件夹(.claude-* 格式)
77
+ try {
78
+ const items = fs.readdirSync(claudeDir);
79
+ for (const item of items) {
80
+ if (item.startsWith('.claude-') || item.startsWith('backup-')) {
81
+ const itemPath = path.join(claudeDir, item);
82
+ const stat = fs.statSync(itemPath);
83
+
84
+ if (stat.isDirectory()) {
85
+ console.log(`🗑️ 删除旧备份: ${item}/`);
86
+ // 使用 Node.js 原生 API,跨平台兼容
87
+ fs.rmSync(itemPath, { recursive: true, force: true });
88
+ cleanedCount++;
89
+ }
90
+ }
91
+ }
92
+ } catch (e) {
93
+ // 忽略错误
94
+ }
95
+
96
+ console.log('\n✅ 已保留以下配置和工具:');
97
+ console.log(' - settings.json (配置文件)');
98
+ console.log(' - commands/ (自定义命令)');
99
+ console.log(' - skills/ (技能)');
100
+ console.log(' - mcp/ (MCP 服务器)');
101
+ console.log(' - projects/ (项目信息)');
102
+ console.log(' - ide/ (IDE 配置)');
103
+ } else {
104
+ console.log('ℹ️ 未找到 ~/.claude 目录');
105
+ }
106
+
107
+ return cleanedCount;
108
+ }
109
+
110
+ module.exports = {
111
+ cleanCache,
112
+ getLocalTimestamp
113
+ };
package/lib/hosts.js CHANGED
@@ -86,18 +86,37 @@ function modifyHostsFile() {
86
86
  console.log(' - api.anthropic.com -> 127.0.0.1');
87
87
 
88
88
  // 刷新 DNS 缓存
89
+ console.log('🔄 刷新 DNS 缓存...');
89
90
  try {
90
91
  if (isWindows) {
91
- execSync('ipconfig /flushdns', { stdio: 'ignore' });
92
+ // Windows: 需要管理员权限
93
+ execSync('ipconfig /flushdns', { stdio: 'pipe' });
94
+ console.log(' ✅ DNS 缓存已刷新');
92
95
  } else if (os.platform() === 'darwin') {
93
- execSync('sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder', { stdio: 'ignore' });
96
+ // macOS: 如果已经是 root/sudo 运行,直接执行;否则会失败但不影响主要功能
97
+ try {
98
+ execSync('dscacheutil -flushcache; killall -HUP mDNSResponder', { stdio: 'pipe' });
99
+ console.log(' ✅ DNS 缓存已刷新');
100
+ } catch (e) {
101
+ console.log(' ⚠️ DNS 缓存刷新失败,请稍后手动执行:');
102
+ console.log(' sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder');
103
+ }
94
104
  } else {
95
105
  // Linux
96
- execSync('sudo systemd-resolve --flush-caches 2>/dev/null || sudo service nscd restart 2>/dev/null || true', { stdio: 'ignore' });
106
+ try {
107
+ execSync('systemd-resolve --flush-caches 2>/dev/null || service nscd restart 2>/dev/null', { stdio: 'pipe' });
108
+ console.log(' ✅ DNS 缓存已刷新');
109
+ } catch (e) {
110
+ console.log(' ⚠️ DNS 缓存刷新失败,请稍后手动执行:');
111
+ console.log(' sudo systemd-resolve --flush-caches');
112
+ }
97
113
  }
98
- console.log('🔄 DNS 缓存已刷新');
99
114
  } catch (e) {
100
- console.log('ℹ️ DNS 缓存刷新失败(可能需要手动刷新)');
115
+ if (isWindows) {
116
+ console.log(' ⚠️ DNS 缓存刷新失败,请以管理员身份运行命令提示符');
117
+ } else {
118
+ console.log(' ℹ️ DNS 缓存刷新失败(可能需要 root 权限)');
119
+ }
101
120
  }
102
121
 
103
122
  return true;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aihezu",
3
- "version": "1.4.0",
3
+ "version": "1.5.2",
4
4
  "description": "Claude Code CLI 清理工具 - 快速备份和清理 Claude Code 的本地配置和缓存,同时修改 hosts 文件实现本地代理",
5
5
  "main": "bin/ccclear.js",
6
6
  "bin": {