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 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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -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
+ }