teamstats 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 +143 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +289 -0
- package/dist/cli.js.map +1 -0
- package/package.json +40 -0
package/README.md
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# teamstats
|
|
2
|
+
|
|
3
|
+
Interactive developer statistics report generator - analyze git commits and code changes with Excel export.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- 📊 **Interactive CLI** - Easy-to-use prompts for all parameters
|
|
8
|
+
- 📈 **Git Statistics** - Analyzes commits, lines added/deleted per author
|
|
9
|
+
- 📅 **Date Range** - Flexible date selection with sensible defaults
|
|
10
|
+
- 📁 **Branch Support** - Works with any git branch
|
|
11
|
+
- 🎯 **Author Filtering** - View stats for specific authors or all committers
|
|
12
|
+
- 📋 **Excel Export** - Professional Excel reports with formatting
|
|
13
|
+
- ⚡ **Fast** - Leverages native git commands for performance
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install -g teamstats
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
|
|
23
|
+
Simply run the command:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
teamstats
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Interactive Prompts
|
|
30
|
+
|
|
31
|
+
1. **Select branch** (default: current branch)
|
|
32
|
+
- Press Enter to use current branch
|
|
33
|
+
- Or enter a different branch name
|
|
34
|
+
|
|
35
|
+
2. **Start date** (default: 1st of current month)
|
|
36
|
+
- Format: `YYYY-MM-DD`
|
|
37
|
+
- Press Enter to use default
|
|
38
|
+
|
|
39
|
+
3. **End date** (default: last day of current month)
|
|
40
|
+
- Format: `YYYY-MM-DD`
|
|
41
|
+
- Press Enter to use default
|
|
42
|
+
|
|
43
|
+
4. **Authors** (default: all committers)
|
|
44
|
+
- Space-separated email addresses
|
|
45
|
+
- Example: `john@example.com jane@example.com`
|
|
46
|
+
- Press Enter to include all authors
|
|
47
|
+
|
|
48
|
+
5. **Save as Excel?** (default: yes)
|
|
49
|
+
- Type `yes` or `y` to save
|
|
50
|
+
- File saves to `~/Downloads/`
|
|
51
|
+
|
|
52
|
+
### Example Output
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
╔════════════════════════════════════════════════╗
|
|
56
|
+
║ Dev Statistics Report Generator ║
|
|
57
|
+
╚════════════════════════════════════════════════╝
|
|
58
|
+
|
|
59
|
+
Select branch (default: dev):
|
|
60
|
+
Start date YYYY-MM-DD (default: 2026-02-01):
|
|
61
|
+
End date YYYY-MM-DD (default: 2026-02-28):
|
|
62
|
+
Authors - space-separated emails (leave empty for all):
|
|
63
|
+
|
|
64
|
+
Git Statistics Report
|
|
65
|
+
Branch: dev | Period: 2026-02-01 to 2026-02-28
|
|
66
|
+
─────────────────────────────────────────────────────────────
|
|
67
|
+
Author | Added | Deleted | Commits
|
|
68
|
+
─────────────────────────────────────────────────────────────
|
|
69
|
+
john.doe@company.com | 2450 | 1230 | 15
|
|
70
|
+
jane.smith@company.com | 1890 | 950 | 12
|
|
71
|
+
─────────────────────────────────────────────────────────────
|
|
72
|
+
|
|
73
|
+
Save as Excel file? (yes/no) (default: yes):
|
|
74
|
+
|
|
75
|
+
✓ Report saved to: /Users/username/Downloads/teamstats-dev-2026-02-01_to_2026-02-28.xlsx
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Excel Report Features
|
|
79
|
+
|
|
80
|
+
- 📑 Title and period information
|
|
81
|
+
- 🎨 Color-coded header (blue background, white text)
|
|
82
|
+
- 📌 Frozen header row for easy scrolling
|
|
83
|
+
- 📏 Auto-sized columns
|
|
84
|
+
- 🔲 Professional borders and alignment
|
|
85
|
+
- 📊 Right-aligned numbers for better readability
|
|
86
|
+
|
|
87
|
+
## Requirements
|
|
88
|
+
|
|
89
|
+
- Node.js 18+
|
|
90
|
+
- Git installed and available in PATH
|
|
91
|
+
|
|
92
|
+
## Excluded Files & Directories
|
|
93
|
+
|
|
94
|
+
The tool **always excludes** these files/directories from statistics:
|
|
95
|
+
- `node_modules/` - Node.js dependencies
|
|
96
|
+
- `dist/` - Build output
|
|
97
|
+
- `package-lock.json` - npm lock file
|
|
98
|
+
- `yarn.lock` - Yarn lock file
|
|
99
|
+
|
|
100
|
+
**Plus**, any patterns defined in your project's `.gitignore` file are automatically excluded as well.
|
|
101
|
+
|
|
102
|
+
This ensures accurate developer statistics by ignoring build artifacts, lock files, and other ignored files defined in your project.
|
|
103
|
+
|
|
104
|
+
## Options
|
|
105
|
+
|
|
106
|
+
### Global Installation
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
npm install -g teamstats
|
|
110
|
+
teamstats
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Local Development
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
npm install
|
|
117
|
+
npm run build
|
|
118
|
+
npm start
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Development Mode (with TypeScript)
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
npm install
|
|
125
|
+
npm run dev
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Output
|
|
129
|
+
|
|
130
|
+
- **Console output**: Formatted table with all statistics
|
|
131
|
+
- **Excel file**: Saved to `~/Downloads/teamstats-{branch}-{startDate}_to_{endDate}.xlsx`
|
|
132
|
+
|
|
133
|
+
## License
|
|
134
|
+
|
|
135
|
+
MIT
|
|
136
|
+
|
|
137
|
+
## Author
|
|
138
|
+
|
|
139
|
+
Salih Kesepara <salih.kesepara@logiwa.com>
|
|
140
|
+
|
|
141
|
+
## Support
|
|
142
|
+
|
|
143
|
+
For issues or feature requests, please open an issue on the repository.
|
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,289 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
const child_process_1 = require("child_process");
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const readline = __importStar(require("readline"));
|
|
44
|
+
const exceljs_1 = __importDefault(require("exceljs"));
|
|
45
|
+
const rl = readline.createInterface({
|
|
46
|
+
input: process.stdin,
|
|
47
|
+
output: process.stdout,
|
|
48
|
+
});
|
|
49
|
+
function question(prompt, defaultValue) {
|
|
50
|
+
return new Promise((resolve) => {
|
|
51
|
+
const displayPrompt = defaultValue ? `${prompt} (default: ${defaultValue}): ` : `${prompt}: `;
|
|
52
|
+
rl.question(displayPrompt, (answer) => {
|
|
53
|
+
resolve(answer.trim() || defaultValue || '');
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function getCurrentBranch() {
|
|
58
|
+
try {
|
|
59
|
+
return (0, child_process_1.execSync)('git rev-parse --abbrev-ref HEAD', { encoding: 'utf-8' }).trim();
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
throw new Error('Not a git repository');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function getCurrentMonthDates() {
|
|
66
|
+
const now = new Date();
|
|
67
|
+
const year = now.getFullYear();
|
|
68
|
+
const month = String(now.getMonth() + 1).padStart(2, '0');
|
|
69
|
+
const start = `${year}-${month}-01`;
|
|
70
|
+
const lastDay = new Date(year, parseInt(month), 0).getDate();
|
|
71
|
+
const end = `${year}-${month}-${String(lastDay).padStart(2, '0')}`;
|
|
72
|
+
return { start, end };
|
|
73
|
+
}
|
|
74
|
+
function getGitignorePatterns() {
|
|
75
|
+
try {
|
|
76
|
+
const gitignorePath = '.gitignore';
|
|
77
|
+
if (!fs.existsSync(gitignorePath)) {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
const content = fs.readFileSync(gitignorePath, 'utf-8');
|
|
81
|
+
const patterns = [];
|
|
82
|
+
for (const line of content.split('\n')) {
|
|
83
|
+
const trimmed = line.trim();
|
|
84
|
+
// Skip comments, empty lines, and negation patterns
|
|
85
|
+
if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('!')) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
// Remove trailing slashes
|
|
89
|
+
const pattern = trimmed.replace(/\/$/, '');
|
|
90
|
+
patterns.push(`:(exclude)${pattern}`);
|
|
91
|
+
}
|
|
92
|
+
return patterns;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function buildPathspec() {
|
|
99
|
+
// Always exclude these by default
|
|
100
|
+
const defaultExcludes = [
|
|
101
|
+
':(exclude)node_modules',
|
|
102
|
+
':(exclude)dist',
|
|
103
|
+
':(exclude)package-lock.json',
|
|
104
|
+
':(exclude)yarn.lock',
|
|
105
|
+
];
|
|
106
|
+
// Add patterns from .gitignore if it exists
|
|
107
|
+
const gitignorePatterns = getGitignorePatterns();
|
|
108
|
+
// Combine all patterns and quote them for shell safety
|
|
109
|
+
const allPatterns = [...defaultExcludes, ...gitignorePatterns];
|
|
110
|
+
const quotedPatterns = allPatterns.map((p) => `'${p}'`);
|
|
111
|
+
const pathspec = quotedPatterns.length > 0 ? `. ${quotedPatterns.join(' ')}` : '.';
|
|
112
|
+
return pathspec;
|
|
113
|
+
}
|
|
114
|
+
function getGitAuthors(branch, startDate, endDate) {
|
|
115
|
+
try {
|
|
116
|
+
const pathspec = buildPathspec();
|
|
117
|
+
const output = (0, child_process_1.execSync)(`git log --since="${startDate}" --until="${endDate}" --format="%ae" "${branch}" -- ${pathspec} 2>/dev/null | sort -u`, { encoding: 'utf-8', shell: '/bin/bash' });
|
|
118
|
+
return output.split('\n').filter((line) => line.trim());
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function getAuthorStats(author, branch, startDate, endDate) {
|
|
125
|
+
try {
|
|
126
|
+
const pathspec = buildPathspec();
|
|
127
|
+
const numstatOutput = (0, child_process_1.execSync)(`git log --author="${author}" --since="${startDate}" --until="${endDate}" --numstat "${branch}" -- ${pathspec} 2>/dev/null`, { encoding: 'utf-8', shell: '/bin/bash' });
|
|
128
|
+
let added = 0;
|
|
129
|
+
let deleted = 0;
|
|
130
|
+
for (const line of numstatOutput.split('\n')) {
|
|
131
|
+
const parts = line.trim().split(/\s+/);
|
|
132
|
+
if (parts.length >= 2 && /^\d+$/.test(parts[0]) && /^\d+$/.test(parts[1])) {
|
|
133
|
+
added += parseInt(parts[0], 10);
|
|
134
|
+
deleted += parseInt(parts[1], 10);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const commitsOutput = (0, child_process_1.execSync)(`git log --author="${author}" --since="${startDate}" --until="${endDate}" --oneline "${branch}" -- ${pathspec} 2>/dev/null | wc -l`, { encoding: 'utf-8', shell: '/bin/bash' });
|
|
138
|
+
const commits = parseInt(commitsOutput.trim(), 10);
|
|
139
|
+
return { author, added, deleted, commits };
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return { author, added: 0, deleted: 0, commits: 0 };
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function printTable(stats) {
|
|
146
|
+
console.log('');
|
|
147
|
+
console.log('Git Statistics Report');
|
|
148
|
+
console.log('─'.repeat(65));
|
|
149
|
+
const header = 'Author'.padEnd(30) + ' | ' + 'Added'.padStart(10) + ' | ' + 'Deleted'.padStart(10) + ' | ' + 'Commits'.padStart(10);
|
|
150
|
+
console.log(header);
|
|
151
|
+
console.log('─'.repeat(65));
|
|
152
|
+
for (const stat of stats) {
|
|
153
|
+
const line = stat.author.padEnd(30) +
|
|
154
|
+
' | ' +
|
|
155
|
+
String(stat.added).padStart(10) +
|
|
156
|
+
' | ' +
|
|
157
|
+
String(stat.deleted).padStart(10) +
|
|
158
|
+
' | ' +
|
|
159
|
+
String(stat.commits).padStart(10);
|
|
160
|
+
console.log(line);
|
|
161
|
+
}
|
|
162
|
+
console.log('─'.repeat(65));
|
|
163
|
+
console.log('');
|
|
164
|
+
}
|
|
165
|
+
async function createExcelFile(stats, branch, startDate, endDate, filePath) {
|
|
166
|
+
const workbook = new exceljs_1.default.Workbook();
|
|
167
|
+
const worksheet = workbook.addWorksheet('Git Stats');
|
|
168
|
+
// Title
|
|
169
|
+
worksheet.mergeCells('A1:D1');
|
|
170
|
+
const titleCell = worksheet.getCell('A1');
|
|
171
|
+
titleCell.value = 'Git Statistics Report';
|
|
172
|
+
titleCell.font = { bold: true, size: 14, color: { argb: 'FF1F4E78' } };
|
|
173
|
+
titleCell.alignment = { horizontal: 'left', vertical: 'middle' };
|
|
174
|
+
// Period
|
|
175
|
+
worksheet.mergeCells('A2:D2');
|
|
176
|
+
const periodCell = worksheet.getCell('A2');
|
|
177
|
+
periodCell.value = `Branch: ${branch} | Period: ${startDate} to ${endDate}`;
|
|
178
|
+
periodCell.font = { italic: true, size: 11, color: { argb: 'FF595959' } };
|
|
179
|
+
periodCell.alignment = { horizontal: 'left', vertical: 'middle' };
|
|
180
|
+
// Empty row
|
|
181
|
+
worksheet.getRow(3).height = 5;
|
|
182
|
+
// Header
|
|
183
|
+
const headerRow = worksheet.getRow(4);
|
|
184
|
+
const headers = ['Author', 'Added', 'Deleted', 'Commits'];
|
|
185
|
+
headers.forEach((header, index) => {
|
|
186
|
+
const cell = headerRow.getCell(index + 1);
|
|
187
|
+
cell.value = header;
|
|
188
|
+
cell.font = { bold: true, color: { argb: 'FFFFFFFF' }, size: 11 };
|
|
189
|
+
cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FF4472C4' } };
|
|
190
|
+
cell.alignment = { horizontal: 'center', vertical: 'middle' };
|
|
191
|
+
cell.border = {
|
|
192
|
+
left: { style: 'thin' },
|
|
193
|
+
right: { style: 'thin' },
|
|
194
|
+
top: { style: 'thin' },
|
|
195
|
+
bottom: { style: 'thin' },
|
|
196
|
+
};
|
|
197
|
+
});
|
|
198
|
+
// Data rows
|
|
199
|
+
stats.forEach((stat, index) => {
|
|
200
|
+
const row = worksheet.getRow(5 + index);
|
|
201
|
+
row.getCell(1).value = stat.author;
|
|
202
|
+
row.getCell(2).value = stat.added;
|
|
203
|
+
row.getCell(3).value = stat.deleted;
|
|
204
|
+
row.getCell(4).value = stat.commits;
|
|
205
|
+
for (let i = 1; i <= 4; i++) {
|
|
206
|
+
const cell = row.getCell(i);
|
|
207
|
+
cell.alignment = {
|
|
208
|
+
horizontal: i === 1 ? 'left' : 'right',
|
|
209
|
+
vertical: 'middle',
|
|
210
|
+
};
|
|
211
|
+
cell.border = {
|
|
212
|
+
left: { style: 'thin', color: { argb: 'FFD3D3D3' } },
|
|
213
|
+
right: { style: 'thin', color: { argb: 'FFD3D3D3' } },
|
|
214
|
+
top: { style: 'thin', color: { argb: 'FFD3D3D3' } },
|
|
215
|
+
bottom: { style: 'thin', color: { argb: 'FFD3D3D3' } },
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
// Column widths
|
|
220
|
+
worksheet.columns = [
|
|
221
|
+
{ width: 32 },
|
|
222
|
+
{ width: 14 },
|
|
223
|
+
{ width: 14 },
|
|
224
|
+
{ width: 14 },
|
|
225
|
+
];
|
|
226
|
+
// Freeze header
|
|
227
|
+
worksheet.views = [{ state: 'frozen', ySplit: 4 }];
|
|
228
|
+
await workbook.xlsx.writeFile(filePath);
|
|
229
|
+
}
|
|
230
|
+
async function main() {
|
|
231
|
+
try {
|
|
232
|
+
console.log('');
|
|
233
|
+
console.log('╔════════════════════════════════════════════════╗');
|
|
234
|
+
console.log('║ Dev Statistics Report Generator ║');
|
|
235
|
+
console.log('╚════════════════════════════════════════════════╝');
|
|
236
|
+
console.log('');
|
|
237
|
+
const currentBranch = getCurrentBranch();
|
|
238
|
+
const { start: defaultStart, end: defaultEnd } = getCurrentMonthDates();
|
|
239
|
+
// Get inputs
|
|
240
|
+
const branch = await question('Select branch', currentBranch);
|
|
241
|
+
const startDate = await question('Start date (YYYY-MM-DD)', defaultStart);
|
|
242
|
+
const endDate = await question('End date (YYYY-MM-DD)', defaultEnd);
|
|
243
|
+
const authorsInput = await question('Authors - space-separated emails (leave empty for all)');
|
|
244
|
+
let authors = [];
|
|
245
|
+
if (authorsInput) {
|
|
246
|
+
authors = authorsInput.split(/\s+/).filter((a) => a);
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
authors = getGitAuthors(branch, startDate, endDate);
|
|
250
|
+
}
|
|
251
|
+
if (authors.length === 0) {
|
|
252
|
+
console.log('❌ No commits found in the specified period');
|
|
253
|
+
rl.close();
|
|
254
|
+
process.exit(1);
|
|
255
|
+
}
|
|
256
|
+
// Collect statistics
|
|
257
|
+
const stats = [];
|
|
258
|
+
for (const author of authors) {
|
|
259
|
+
const authorStats = getAuthorStats(author, branch, startDate, endDate);
|
|
260
|
+
stats.push(authorStats);
|
|
261
|
+
}
|
|
262
|
+
// Display table
|
|
263
|
+
console.log('');
|
|
264
|
+
console.log(`Git Statistics Report`);
|
|
265
|
+
console.log(`Branch: ${branch} | Period: ${startDate} to ${endDate}`);
|
|
266
|
+
printTable(stats);
|
|
267
|
+
// Save option
|
|
268
|
+
const saveResponse = await question('Save as Excel file? (yes/no)', 'yes');
|
|
269
|
+
const shouldSave = saveResponse.toLowerCase() === 'yes' || saveResponse.toLowerCase() === 'y';
|
|
270
|
+
if (shouldSave) {
|
|
271
|
+
const filename = `teamstats-${branch}-${startDate}_to_${endDate}.xlsx`;
|
|
272
|
+
const filePath = path.join(process.env.HOME || '', 'Downloads', filename);
|
|
273
|
+
await createExcelFile(stats, branch, startDate, endDate, filePath);
|
|
274
|
+
console.log('');
|
|
275
|
+
console.log(`✓ Report saved to: ${filePath}`);
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
console.log('Report not saved');
|
|
279
|
+
}
|
|
280
|
+
rl.close();
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
console.error('❌ Error:', error instanceof Error ? error.message : String(error));
|
|
284
|
+
rl.close();
|
|
285
|
+
process.exit(1);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
main();
|
|
289
|
+
//# 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/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "teamstats",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Interactive developer statistics report generator - analyze git commits and code changes",
|
|
5
|
+
"main": "dist/cli.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"teamstats": "dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"prepare": "npm run build",
|
|
12
|
+
"prepublishOnly": "npm run build",
|
|
13
|
+
"dev": "ts-node src/cli.ts",
|
|
14
|
+
"start": "node dist/cli.js"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"git",
|
|
18
|
+
"statistics",
|
|
19
|
+
"developer",
|
|
20
|
+
"analytics",
|
|
21
|
+
"report",
|
|
22
|
+
"excel"
|
|
23
|
+
],
|
|
24
|
+
"author": "Salih Kesepara <salih.kesepara@logiwa.com>",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"exceljs": "^4.3.0"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/node": "^20.0.0",
|
|
31
|
+
"typescript": "^5.3.0"
|
|
32
|
+
},
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=18.0.0"
|
|
35
|
+
},
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "https://github.com/yourusername/teamstats.git"
|
|
39
|
+
}
|
|
40
|
+
}
|