cc-code-status 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 +114 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +147 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +359 -0
- package/dist/index.js.map +1 -0
- package/package.json +45 -0
- package/scripts/postinstall.js +100 -0
package/README.md
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# CC Code Status
|
|
2
|
+
|
|
3
|
+
Claude Code 状态栏插件,显示 Git 用户名、对话次数和代码统计。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
在 Claude Code 状态栏实时显示:
|
|
8
|
+
- **Git 用户名** - 从 `git config user.name` 获取
|
|
9
|
+
- **对话次数** - 统计真实用户提问(排除系统命令如 `/clear`, `/exit` 等)
|
|
10
|
+
- **代码统计** - Claude Code 修改的代码行数(新增/删除)
|
|
11
|
+
|
|
12
|
+
**显示格式**: `qilin | Chat: 106 | Code: 5376/103`
|
|
13
|
+
- Git 用户名(青色)
|
|
14
|
+
- Chat: 对话次数(黄色)
|
|
15
|
+
- Code: 新增行数(绿色)/ 删除行数(红色)
|
|
16
|
+
|
|
17
|
+
## 安装
|
|
18
|
+
|
|
19
|
+
### 方式 1: 全局安装(推荐)
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install -g cc-code-status
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
安装后会自动配置 Claude Code。
|
|
26
|
+
|
|
27
|
+
### 方式 2: 本地开发
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# 克隆项目
|
|
31
|
+
git clone https://github.com/yourusername/cc-code-status.git
|
|
32
|
+
cd cc-code-status
|
|
33
|
+
|
|
34
|
+
# 安装依赖
|
|
35
|
+
npm install
|
|
36
|
+
|
|
37
|
+
# 编译
|
|
38
|
+
npm run build
|
|
39
|
+
|
|
40
|
+
# 配置本地插件
|
|
41
|
+
./setup-local.sh
|
|
42
|
+
|
|
43
|
+
# 重启 Claude Code
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## 使用
|
|
47
|
+
|
|
48
|
+
安装后,Claude Code 状态栏会自动显示信息。无需任何配置。
|
|
49
|
+
|
|
50
|
+
## 手动配置
|
|
51
|
+
|
|
52
|
+
如果自动配置失败,可以手动运行:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
cc-code-status setup
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## 卸载
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
cc-code-status uninstall
|
|
62
|
+
npm uninstall -g cc-code-status
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 命令
|
|
66
|
+
|
|
67
|
+
- `cc-code-status` - 运行状态栏插件(由 Claude Code 调用)
|
|
68
|
+
- `cc-code-status setup` - 配置 Claude Code
|
|
69
|
+
- `cc-code-status uninstall` - 移除配置
|
|
70
|
+
- `cc-code-status help` - 显示帮助
|
|
71
|
+
|
|
72
|
+
## 技术实现
|
|
73
|
+
|
|
74
|
+
### 数据来源
|
|
75
|
+
|
|
76
|
+
1. **Git 用户名**: 执行 `git config user.name`
|
|
77
|
+
2. **对话次数**: 解析 `~/.claude/history.jsonl`
|
|
78
|
+
- 过滤掉以 `/` 开头的系统命令
|
|
79
|
+
- 只统计真实的用户提问
|
|
80
|
+
3. **代码统计**: 分析 `~/.claude/projects/`
|
|
81
|
+
- 扫描所有项目的 JSONL 文件
|
|
82
|
+
- 查找 `Edit` 和 `Write` 工具调用
|
|
83
|
+
- 计算新增和删除的行数
|
|
84
|
+
|
|
85
|
+
### 跨平台兼容
|
|
86
|
+
|
|
87
|
+
- 使用 `os.homedir()` 获取用户目录
|
|
88
|
+
- 支持 Mac 和 Windows
|
|
89
|
+
- 所有路径处理使用 `path.join()`
|
|
90
|
+
|
|
91
|
+
### 性能优化
|
|
92
|
+
|
|
93
|
+
- 异步读取文件
|
|
94
|
+
- 错误容错处理
|
|
95
|
+
- 100ms stdin 超时保护
|
|
96
|
+
|
|
97
|
+
## 开发
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# 修改源代码
|
|
101
|
+
vim src/index.ts
|
|
102
|
+
|
|
103
|
+
# 重新编译
|
|
104
|
+
npm run build
|
|
105
|
+
|
|
106
|
+
# 测试
|
|
107
|
+
./test.sh
|
|
108
|
+
|
|
109
|
+
# 本地配置已生效,重启 Claude Code 即可看到效果
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## 许可证
|
|
113
|
+
|
|
114
|
+
MIT
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const os = __importStar(require("os"));
|
|
40
|
+
// CLI 用于全局安装 - 处理状态栏执行和设置
|
|
41
|
+
const args = process.argv.slice(2);
|
|
42
|
+
const command = args[0];
|
|
43
|
+
if (command === 'setup' || command === 'install') {
|
|
44
|
+
// 运行设置
|
|
45
|
+
setup();
|
|
46
|
+
}
|
|
47
|
+
else if (command === 'uninstall') {
|
|
48
|
+
// 运行卸载
|
|
49
|
+
uninstall();
|
|
50
|
+
}
|
|
51
|
+
else if (command === 'help' || command === '--help' || command === '-h') {
|
|
52
|
+
// 显示帮助
|
|
53
|
+
showHelp();
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// 默认:作为状态栏插件运行(用于 Claude Code)
|
|
57
|
+
require('./index');
|
|
58
|
+
}
|
|
59
|
+
function setup() {
|
|
60
|
+
console.log('🚀 设置 CC Code Status 插件...');
|
|
61
|
+
const claudeSettingsDir = path.join(os.homedir(), '.claude');
|
|
62
|
+
const claudeSettingsFile = path.join(claudeSettingsDir, 'settings.json');
|
|
63
|
+
// 如果 .claude 目录不存在则创建
|
|
64
|
+
if (!fs.existsSync(claudeSettingsDir)) {
|
|
65
|
+
console.log('📁 创建 Claude 设置目录...');
|
|
66
|
+
fs.mkdirSync(claudeSettingsDir, { recursive: true });
|
|
67
|
+
}
|
|
68
|
+
// 获取全局命令路径
|
|
69
|
+
const commandPath = 'cc-code-status';
|
|
70
|
+
// 创建或更新 settings.json
|
|
71
|
+
let settings = {};
|
|
72
|
+
if (fs.existsSync(claudeSettingsFile)) {
|
|
73
|
+
console.log('📝 更新现有 settings.json...');
|
|
74
|
+
// 备份现有设置
|
|
75
|
+
const backupFile = `${claudeSettingsFile}.backup`;
|
|
76
|
+
fs.copyFileSync(claudeSettingsFile, backupFile);
|
|
77
|
+
console.log(` 备份保存至: ${backupFile}`);
|
|
78
|
+
try {
|
|
79
|
+
const existingContent = fs.readFileSync(claudeSettingsFile, 'utf8');
|
|
80
|
+
settings = JSON.parse(existingContent);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
console.error('⚠️ 读取现有设置出错,创建新设置...');
|
|
84
|
+
settings = {};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
console.log('📝 创建新的 settings.json...');
|
|
89
|
+
}
|
|
90
|
+
// 更新 statusLine 配置
|
|
91
|
+
settings.statusLine = {
|
|
92
|
+
type: 'command',
|
|
93
|
+
command: commandPath
|
|
94
|
+
};
|
|
95
|
+
// 写入更新后的设置
|
|
96
|
+
fs.writeFileSync(claudeSettingsFile, JSON.stringify(settings, null, 2));
|
|
97
|
+
console.log('✅ 设置更新成功!');
|
|
98
|
+
console.log('');
|
|
99
|
+
console.log('🎉 CC Code Status 插件已配置完成!');
|
|
100
|
+
console.log('');
|
|
101
|
+
console.log('插件将显示:');
|
|
102
|
+
console.log(' 📁 当前目录名称');
|
|
103
|
+
console.log(' 👤 Git 用户名');
|
|
104
|
+
console.log('');
|
|
105
|
+
console.log('卸载: npm uninstall -g cc-code-status');
|
|
106
|
+
}
|
|
107
|
+
function uninstall() {
|
|
108
|
+
console.log('🗑️ 移除 CC Code Status 插件配置...');
|
|
109
|
+
const claudeSettingsFile = path.join(os.homedir(), '.claude', 'settings.json');
|
|
110
|
+
if (!fs.existsSync(claudeSettingsFile)) {
|
|
111
|
+
console.log('⚠️ 未找到 Claude 设置文件。');
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
const content = fs.readFileSync(claudeSettingsFile, 'utf8');
|
|
116
|
+
const settings = JSON.parse(content);
|
|
117
|
+
if (settings.statusLine) {
|
|
118
|
+
delete settings.statusLine;
|
|
119
|
+
fs.writeFileSync(claudeSettingsFile, JSON.stringify(settings, null, 2));
|
|
120
|
+
console.log('✅ StatusLine 配置已从 Claude 设置中移除。');
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
console.log('⚠️ 设置中未找到 statusLine 配置。');
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
console.error('❌ 更新设置时出错:', error);
|
|
128
|
+
}
|
|
129
|
+
console.log('');
|
|
130
|
+
console.log('完成卸载请运行:');
|
|
131
|
+
console.log(' npm uninstall -g cc-code-status');
|
|
132
|
+
}
|
|
133
|
+
function showHelp() {
|
|
134
|
+
console.log('CC Code Status Plugin - Claude Code git 用户信息显示');
|
|
135
|
+
console.log('');
|
|
136
|
+
console.log('用法:');
|
|
137
|
+
console.log(' cc-code-status 作为状态栏插件运行(由 Claude Code 使用)');
|
|
138
|
+
console.log(' cc-code-status setup 配置 Claude Code 使用此插件');
|
|
139
|
+
console.log(' cc-code-status uninstall 从 Claude Code 中移除插件配置');
|
|
140
|
+
console.log(' cc-code-status help 显示此帮助信息');
|
|
141
|
+
console.log('');
|
|
142
|
+
console.log('安装:');
|
|
143
|
+
console.log(' npm install -g cc-code-status');
|
|
144
|
+
console.log('');
|
|
145
|
+
console.log('安装后插件会自动配置。');
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const os = __importStar(require("os"));
|
|
40
|
+
const child_process_1 = require("child_process");
|
|
41
|
+
class StatusLinePlugin {
|
|
42
|
+
constructor() {
|
|
43
|
+
this.CACHE_DIR = path.join(os.homedir(), '.cc-code-status');
|
|
44
|
+
this.CACHE_FILE = path.join(this.CACHE_DIR, 'current.json');
|
|
45
|
+
this.CACHE_TTL = 5 * 60 * 1000; // 5分钟
|
|
46
|
+
}
|
|
47
|
+
async run() {
|
|
48
|
+
try {
|
|
49
|
+
// 读取 stdin 输入
|
|
50
|
+
const input = await this.readStdin();
|
|
51
|
+
const claudeInput = this.parseInput(input);
|
|
52
|
+
// 获取当前目录
|
|
53
|
+
const currentDir = claudeInput?.workspace?.current_dir || process.cwd();
|
|
54
|
+
// 检查缓存
|
|
55
|
+
let data = null;
|
|
56
|
+
if (this.isCacheValid()) {
|
|
57
|
+
data = this.readCache();
|
|
58
|
+
}
|
|
59
|
+
// 缓存无效或不存在,重新分析
|
|
60
|
+
if (!data) {
|
|
61
|
+
data = this.analyzeAndCache(currentDir);
|
|
62
|
+
}
|
|
63
|
+
// 格式化输出
|
|
64
|
+
const statusLine = this.formatStatusLine(data);
|
|
65
|
+
console.log(statusLine);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.log('Error');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async readStdin() {
|
|
72
|
+
return new Promise((resolve) => {
|
|
73
|
+
let data = '';
|
|
74
|
+
process.stdin.setEncoding('utf8');
|
|
75
|
+
process.stdin.on('data', (chunk) => {
|
|
76
|
+
data += chunk;
|
|
77
|
+
});
|
|
78
|
+
process.stdin.on('end', () => {
|
|
79
|
+
resolve(data);
|
|
80
|
+
});
|
|
81
|
+
// 超时保护
|
|
82
|
+
setTimeout(() => {
|
|
83
|
+
resolve(data || '{}');
|
|
84
|
+
}, 100);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
parseInput(input) {
|
|
88
|
+
try {
|
|
89
|
+
return JSON.parse(input);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// ========== 缓存相关 ==========
|
|
96
|
+
ensureCacheDir() {
|
|
97
|
+
if (!fs.existsSync(this.CACHE_DIR)) {
|
|
98
|
+
fs.mkdirSync(this.CACHE_DIR, { recursive: true });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
isCacheValid() {
|
|
102
|
+
try {
|
|
103
|
+
if (!fs.existsSync(this.CACHE_FILE)) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
const stats = fs.statSync(this.CACHE_FILE);
|
|
107
|
+
const age = Date.now() - stats.mtimeMs;
|
|
108
|
+
return age < this.CACHE_TTL;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
readCache() {
|
|
115
|
+
try {
|
|
116
|
+
const content = fs.readFileSync(this.CACHE_FILE, 'utf8');
|
|
117
|
+
return JSON.parse(content);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
writeCache(data) {
|
|
124
|
+
try {
|
|
125
|
+
this.ensureCacheDir();
|
|
126
|
+
fs.writeFileSync(this.CACHE_FILE, JSON.stringify(data, null, 2));
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// 忽略写入错误
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// ========== 周维度辅助函数 ==========
|
|
133
|
+
getMonday(date) {
|
|
134
|
+
const d = new Date(date);
|
|
135
|
+
const day = d.getDay();
|
|
136
|
+
const diff = d.getDate() - day + (day === 0 ? -6 : 1); // 周日特殊处理
|
|
137
|
+
d.setDate(diff);
|
|
138
|
+
d.setHours(0, 0, 0, 0);
|
|
139
|
+
return d;
|
|
140
|
+
}
|
|
141
|
+
getSunday(date) {
|
|
142
|
+
const monday = this.getMonday(date);
|
|
143
|
+
const sunday = new Date(monday);
|
|
144
|
+
sunday.setDate(monday.getDate() + 6);
|
|
145
|
+
sunday.setHours(23, 59, 59, 999);
|
|
146
|
+
return sunday;
|
|
147
|
+
}
|
|
148
|
+
isNewWeek(weekStart) {
|
|
149
|
+
const currentMonday = this.getMonday(new Date());
|
|
150
|
+
const storedMonday = new Date(weekStart);
|
|
151
|
+
return currentMonday > storedMonday;
|
|
152
|
+
}
|
|
153
|
+
getDateString(date) {
|
|
154
|
+
return date.toISOString().split('T')[0];
|
|
155
|
+
}
|
|
156
|
+
// ========== 数据分析 ==========
|
|
157
|
+
analyzeAndCache(currentDir) {
|
|
158
|
+
// 读取现有缓存
|
|
159
|
+
let data = this.readCache();
|
|
160
|
+
// 检查是否需要初始化新周
|
|
161
|
+
if (!data || this.isNewWeek(data.weekStart)) {
|
|
162
|
+
data = this.initializeWeekData(currentDir);
|
|
163
|
+
}
|
|
164
|
+
// 分析本周数据
|
|
165
|
+
const weekStart = new Date(data.weekStart);
|
|
166
|
+
const weekEnd = new Date(data.weekEnd);
|
|
167
|
+
const conversations = this.countWeeklyConversations(weekStart, weekEnd);
|
|
168
|
+
const codeStats = this.analyzeWeeklyCodeChanges(weekStart, weekEnd);
|
|
169
|
+
// 更新每日数据
|
|
170
|
+
data.daily = {};
|
|
171
|
+
for (const date in conversations) {
|
|
172
|
+
data.daily[date] = {
|
|
173
|
+
conversations: conversations[date] || 0,
|
|
174
|
+
codeAdded: codeStats[date]?.added || 0,
|
|
175
|
+
codeDeleted: codeStats[date]?.deleted || 0
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
// 合并代码统计中的日期
|
|
179
|
+
for (const date in codeStats) {
|
|
180
|
+
if (!data.daily[date]) {
|
|
181
|
+
data.daily[date] = {
|
|
182
|
+
conversations: 0,
|
|
183
|
+
codeAdded: codeStats[date]?.added || 0,
|
|
184
|
+
codeDeleted: codeStats[date]?.deleted || 0
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// 计算周总计
|
|
189
|
+
data.weekTotal = {
|
|
190
|
+
conversations: Object.values(conversations).reduce((sum, count) => sum + count, 0),
|
|
191
|
+
codeAdded: Object.values(codeStats).reduce((sum, stats) => sum + stats.added, 0),
|
|
192
|
+
codeDeleted: Object.values(codeStats).reduce((sum, stats) => sum + stats.deleted, 0)
|
|
193
|
+
};
|
|
194
|
+
data.lastUpdated = new Date().toISOString();
|
|
195
|
+
// 写入缓存
|
|
196
|
+
this.writeCache(data);
|
|
197
|
+
return data;
|
|
198
|
+
}
|
|
199
|
+
initializeWeekData(currentDir) {
|
|
200
|
+
const now = new Date();
|
|
201
|
+
const monday = this.getMonday(now);
|
|
202
|
+
const sunday = this.getSunday(now);
|
|
203
|
+
return {
|
|
204
|
+
weekStart: this.getDateString(monday),
|
|
205
|
+
weekEnd: this.getDateString(sunday),
|
|
206
|
+
username: this.getGitUser(currentDir),
|
|
207
|
+
daily: {},
|
|
208
|
+
weekTotal: { conversations: 0, codeAdded: 0, codeDeleted: 0 },
|
|
209
|
+
lastUpdated: new Date().toISOString(),
|
|
210
|
+
version: '1.0.0'
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
getGitUser(dir) {
|
|
214
|
+
try {
|
|
215
|
+
const userName = (0, child_process_1.execSync)('git config user.name', {
|
|
216
|
+
cwd: dir,
|
|
217
|
+
encoding: 'utf8',
|
|
218
|
+
stdio: ['pipe', 'pipe', 'ignore']
|
|
219
|
+
}).trim();
|
|
220
|
+
if (userName) {
|
|
221
|
+
return userName;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
// 忽略错误
|
|
226
|
+
}
|
|
227
|
+
return 'Unknown';
|
|
228
|
+
}
|
|
229
|
+
countWeeklyConversations(weekStart, weekEnd) {
|
|
230
|
+
try {
|
|
231
|
+
const historyPath = path.join(os.homedir(), '.claude', 'history.jsonl');
|
|
232
|
+
if (!fs.existsSync(historyPath)) {
|
|
233
|
+
return {};
|
|
234
|
+
}
|
|
235
|
+
const dailyCount = {};
|
|
236
|
+
const content = fs.readFileSync(historyPath, 'utf8');
|
|
237
|
+
const lines = content.trim().split('\n').filter(line => line.trim());
|
|
238
|
+
for (const line of lines) {
|
|
239
|
+
try {
|
|
240
|
+
const entry = JSON.parse(line);
|
|
241
|
+
const display = entry.display?.trim() || '';
|
|
242
|
+
// 排除系统命令
|
|
243
|
+
if (!display || display.startsWith('/')) {
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
// 获取时间戳
|
|
247
|
+
const timestamp = new Date(entry.timestamp || entry.createdAt || 0);
|
|
248
|
+
// 过滤本周数据
|
|
249
|
+
if (timestamp < weekStart || timestamp > weekEnd) {
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
// 按日期统计
|
|
253
|
+
const date = this.getDateString(timestamp);
|
|
254
|
+
dailyCount[date] = (dailyCount[date] || 0) + 1;
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
// 忽略解析错误
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return dailyCount;
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
return {};
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
analyzeWeeklyCodeChanges(weekStart, weekEnd) {
|
|
267
|
+
try {
|
|
268
|
+
const projectsDir = path.join(os.homedir(), '.claude', 'projects');
|
|
269
|
+
if (!fs.existsSync(projectsDir)) {
|
|
270
|
+
return {};
|
|
271
|
+
}
|
|
272
|
+
const dailyStats = {};
|
|
273
|
+
const projectDirs = fs.readdirSync(projectsDir);
|
|
274
|
+
for (const dir of projectDirs) {
|
|
275
|
+
const dirPath = path.join(projectsDir, dir);
|
|
276
|
+
if (!fs.statSync(dirPath).isDirectory())
|
|
277
|
+
continue;
|
|
278
|
+
const files = fs.readdirSync(dirPath).filter(f => f.endsWith('.jsonl'));
|
|
279
|
+
for (const file of files) {
|
|
280
|
+
const filePath = path.join(dirPath, file);
|
|
281
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
282
|
+
const lines = content.trim().split('\n');
|
|
283
|
+
for (const line of lines) {
|
|
284
|
+
try {
|
|
285
|
+
const record = JSON.parse(line);
|
|
286
|
+
// 获取时间戳
|
|
287
|
+
if (!record.timestamp)
|
|
288
|
+
continue;
|
|
289
|
+
const timestamp = new Date(record.timestamp);
|
|
290
|
+
// 过滤本周数据
|
|
291
|
+
if (timestamp < weekStart || timestamp > weekEnd) {
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
const date = this.getDateString(timestamp);
|
|
295
|
+
if (!dailyStats[date]) {
|
|
296
|
+
dailyStats[date] = { added: 0, deleted: 0 };
|
|
297
|
+
}
|
|
298
|
+
// 分析 Edit/Write 工具调用
|
|
299
|
+
if (record.type === 'assistant' && record.message?.content) {
|
|
300
|
+
for (const item of record.message.content) {
|
|
301
|
+
if (item.type === 'tool_use' && item.input) {
|
|
302
|
+
const { name, input } = item;
|
|
303
|
+
if (name === 'Edit') {
|
|
304
|
+
const oldLines = (input.old_string || '').split('\n').length;
|
|
305
|
+
const newLines = (input.new_string || '').split('\n').length;
|
|
306
|
+
if (newLines > oldLines) {
|
|
307
|
+
dailyStats[date].added += newLines - oldLines;
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
dailyStats[date].deleted += oldLines - newLines;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
else if (name === 'Write') {
|
|
314
|
+
const lines = (input.content || '').split('\n').length;
|
|
315
|
+
dailyStats[date].added += lines;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
// 忽略解析错误
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return dailyStats;
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
return {};
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
// ========== 格式化输出 ==========
|
|
334
|
+
formatStatusLine(data) {
|
|
335
|
+
const today = this.getDateString(new Date());
|
|
336
|
+
const todayStats = data.daily[today] || { conversations: 0, codeAdded: 0, codeDeleted: 0 };
|
|
337
|
+
const reset = '\x1b[0m';
|
|
338
|
+
const cyan = '\x1b[96m';
|
|
339
|
+
const gray = '\x1b[90m';
|
|
340
|
+
const yellow = '\x1b[93m';
|
|
341
|
+
const green = '\x1b[92m';
|
|
342
|
+
const red = '\x1b[91m';
|
|
343
|
+
const username = `${cyan}${data.username}${reset}`;
|
|
344
|
+
const separator = `${gray}|${reset}`;
|
|
345
|
+
const chatTotal = `${yellow}${data.weekTotal.conversations}${reset}`;
|
|
346
|
+
const chatToday = `${yellow}${todayStats.conversations}${reset}`;
|
|
347
|
+
const codeAddedTotal = `${green}${data.weekTotal.codeAdded}${reset}`;
|
|
348
|
+
const codeDeletedTotal = `${red}${data.weekTotal.codeDeleted}${reset}`;
|
|
349
|
+
const codeAddedToday = `${green}${todayStats.codeAdded}${reset}`;
|
|
350
|
+
const codeDeletedToday = `${red}${todayStats.codeDeleted}${reset}`;
|
|
351
|
+
return `${username} ${separator} Chat: ${chatTotal}(${chatToday}) ${separator} Code: ${codeAddedTotal}/${codeDeletedTotal}(${codeAddedToday}/${codeDeletedToday})`;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
// 运行插件
|
|
355
|
+
const plugin = new StatusLinePlugin();
|
|
356
|
+
plugin.run().catch(() => {
|
|
357
|
+
console.log('⚠️ Plugin error');
|
|
358
|
+
});
|
|
359
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "cc-code-status",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Claude Code statusline plugin for displaying git user, chat count, and code statistics",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"cc-code-status": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"postinstall": "node scripts/postinstall.js || exit 0",
|
|
12
|
+
"prepack": "npm run build"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist/",
|
|
16
|
+
"scripts/",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"keywords": [
|
|
20
|
+
"claude-code",
|
|
21
|
+
"statusline",
|
|
22
|
+
"plugin",
|
|
23
|
+
"git",
|
|
24
|
+
"cli",
|
|
25
|
+
"statistics",
|
|
26
|
+
"weekly-stats"
|
|
27
|
+
],
|
|
28
|
+
"author": "qilin",
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "https://github.com/willflow/cc-code-status.git"
|
|
33
|
+
},
|
|
34
|
+
"bugs": {
|
|
35
|
+
"url": "https://github.com/willflow/cc-code-status/issues"
|
|
36
|
+
},
|
|
37
|
+
"homepage": "https://github.com/willflow/cc-code-status#readme",
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/node": "^20.11.10",
|
|
40
|
+
"typescript": "^5.3.3"
|
|
41
|
+
},
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=16.0.0"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const os = require('os');
|
|
6
|
+
|
|
7
|
+
// 修复 CLI 的可执行权限
|
|
8
|
+
const cliPath = path.join(__dirname, '..', 'dist', 'cli.js');
|
|
9
|
+
if (fs.existsSync(cliPath)) {
|
|
10
|
+
try {
|
|
11
|
+
fs.chmodSync(cliPath, '755');
|
|
12
|
+
console.log('✅ 已设置 CLI 可执行权限');
|
|
13
|
+
} catch (err) {
|
|
14
|
+
console.warn('⚠️ 无法设置可执行权限:', err.message);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// 检查是否为全局安装
|
|
19
|
+
const isGlobal = process.env.npm_config_global === 'true' ||
|
|
20
|
+
process.env.npm_config_global === true ||
|
|
21
|
+
(process.argv.includes('-g') || process.argv.includes('--global'));
|
|
22
|
+
|
|
23
|
+
// 总是显示一些信息
|
|
24
|
+
console.log('');
|
|
25
|
+
console.log('========================================');
|
|
26
|
+
console.log(' CC Code Status 插件安装 ');
|
|
27
|
+
console.log('========================================');
|
|
28
|
+
console.log('');
|
|
29
|
+
|
|
30
|
+
if (isGlobal) {
|
|
31
|
+
console.log('✨ 全局安装 CC Code Status 插件...');
|
|
32
|
+
console.log('');
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
// 直接在这里配置 Claude Code 设置
|
|
36
|
+
const claudeSettingsDir = path.join(os.homedir(), '.claude');
|
|
37
|
+
const claudeSettingsFile = path.join(claudeSettingsDir, 'settings.json');
|
|
38
|
+
|
|
39
|
+
// 如果 .claude 目录不存在则创建
|
|
40
|
+
if (!fs.existsSync(claudeSettingsDir)) {
|
|
41
|
+
console.log('📁 创建 Claude 设置目录...');
|
|
42
|
+
fs.mkdirSync(claudeSettingsDir, { recursive: true });
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// 读取或创建设置
|
|
46
|
+
let settings = {};
|
|
47
|
+
if (fs.existsSync(claudeSettingsFile)) {
|
|
48
|
+
console.log('📝 更新现有 Claude Code 设置...');
|
|
49
|
+
try {
|
|
50
|
+
const existingContent = fs.readFileSync(claudeSettingsFile, 'utf8');
|
|
51
|
+
settings = JSON.parse(existingContent);
|
|
52
|
+
// 备份
|
|
53
|
+
fs.writeFileSync(`${claudeSettingsFile}.backup`, existingContent);
|
|
54
|
+
} catch (error) {
|
|
55
|
+
console.log('⚠️ 无法解析现有设置,创建新设置...');
|
|
56
|
+
settings = {};
|
|
57
|
+
}
|
|
58
|
+
} else {
|
|
59
|
+
console.log('📝 创建新的 Claude Code 设置...');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// 更新 statusLine 配置
|
|
63
|
+
settings.statusLine = {
|
|
64
|
+
type: 'command',
|
|
65
|
+
command: 'cc-code-status'
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// 写入更新后的设置
|
|
69
|
+
fs.writeFileSync(claudeSettingsFile, JSON.stringify(settings, null, 2));
|
|
70
|
+
|
|
71
|
+
console.log('✅ Claude Code 配置成功!');
|
|
72
|
+
console.log('');
|
|
73
|
+
console.log('🎉 安装完成!');
|
|
74
|
+
console.log('');
|
|
75
|
+
console.log('状态栏将显示:');
|
|
76
|
+
console.log(' 📁 当前目录名称');
|
|
77
|
+
console.log(' 👤 Git 用户名');
|
|
78
|
+
console.log('');
|
|
79
|
+
console.log('可用命令:');
|
|
80
|
+
console.log(' cc-code-status setup - 重新配置 Claude Code');
|
|
81
|
+
console.log(' cc-code-status uninstall - 从 Claude Code 中移除');
|
|
82
|
+
console.log(' cc-code-status help - 显示帮助');
|
|
83
|
+
console.log('');
|
|
84
|
+
|
|
85
|
+
} catch (error) {
|
|
86
|
+
console.error('⚠️ 无法自动配置 Claude Code');
|
|
87
|
+
console.error('');
|
|
88
|
+
console.error('请在安装后手动运行:');
|
|
89
|
+
console.error(' cc-code-status setup');
|
|
90
|
+
console.error('');
|
|
91
|
+
console.error('错误详情:', error.message);
|
|
92
|
+
}
|
|
93
|
+
} else {
|
|
94
|
+
console.log('📦 CC Code Status 插件已本地安装。');
|
|
95
|
+
console.log('');
|
|
96
|
+
console.log('要与 Claude Code 一起使用,请全局安装。');
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
console.log('========================================');
|
|
100
|
+
console.log('');
|