tuimon 0.2.0 → 0.3.1
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 +191 -181
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +4 -1
- package/dist/browser.js.map +1 -1
- package/dist/cli.js +67 -2
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -6
- package/dist/index.js.map +1 -1
- package/dist/quick/presets/coverage.d.ts +3 -0
- package/dist/quick/presets/coverage.d.ts.map +1 -0
- package/dist/quick/presets/coverage.js +362 -0
- package/dist/quick/presets/coverage.js.map +1 -0
- package/dist/quick/presets/deps.d.ts +3 -0
- package/dist/quick/presets/deps.d.ts.map +1 -0
- package/dist/quick/presets/deps.js +194 -0
- package/dist/quick/presets/deps.js.map +1 -0
- package/dist/quick/presets/docker.d.ts +3 -0
- package/dist/quick/presets/docker.d.ts.map +1 -0
- package/dist/quick/presets/docker.js +100 -0
- package/dist/quick/presets/docker.js.map +1 -0
- package/dist/quick/presets/git.d.ts +3 -0
- package/dist/quick/presets/git.d.ts.map +1 -0
- package/dist/quick/presets/git.js +116 -0
- package/dist/quick/presets/git.js.map +1 -0
- package/dist/quick/presets/ps.d.ts +3 -0
- package/dist/quick/presets/ps.d.ts.map +1 -0
- package/dist/quick/presets/ps.js +168 -0
- package/dist/quick/presets/ps.js.map +1 -0
- package/dist/quick/presets/runner.d.ts +3 -0
- package/dist/quick/presets/runner.d.ts.map +1 -0
- package/dist/quick/presets/runner.js +20 -0
- package/dist/quick/presets/runner.js.map +1 -0
- package/dist/quick/presets/types.d.ts +7 -0
- package/dist/quick/presets/types.d.ts.map +1 -0
- package/dist/quick/presets/types.js +2 -0
- package/dist/quick/presets/types.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/examples/preset-deps.png +0 -0
- package/examples/preset-docker.png +0 -0
- package/examples/preset-git.png +0 -0
- package/examples/preset-ps.png +0 -0
- package/examples/test-presets.ts +91 -0
- package/package.json +2 -1
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
function extractPackageName(path) {
|
|
4
|
+
// node_modules/@scope/name or node_modules/name
|
|
5
|
+
const match = path.match(/node_modules\/(.+)$/);
|
|
6
|
+
if (match !== null)
|
|
7
|
+
return match[1] ?? path;
|
|
8
|
+
return path;
|
|
9
|
+
}
|
|
10
|
+
function collectDepsV3(packages, pkgJson) {
|
|
11
|
+
const allDeps = [];
|
|
12
|
+
const dependedOnCount = new Map();
|
|
13
|
+
const versionMap = new Map();
|
|
14
|
+
const devDepNames = new Set(Object.keys(pkgJson.devDependencies ?? {}));
|
|
15
|
+
for (const [path, entry] of Object.entries(packages)) {
|
|
16
|
+
if (path === '')
|
|
17
|
+
continue; // root package
|
|
18
|
+
const name = extractPackageName(path);
|
|
19
|
+
const version = entry.version ?? 'unknown';
|
|
20
|
+
const isDev = entry.dev === true || devDepNames.has(name);
|
|
21
|
+
allDeps.push({ name, version, dev: isDev });
|
|
22
|
+
const versions = versionMap.get(name) ?? new Set();
|
|
23
|
+
versions.add(version);
|
|
24
|
+
versionMap.set(name, versions);
|
|
25
|
+
// Count what this package depends on
|
|
26
|
+
const deps = { ...entry.dependencies, ...entry.requires };
|
|
27
|
+
for (const depName of Object.keys(deps)) {
|
|
28
|
+
dependedOnCount.set(depName, (dependedOnCount.get(depName) ?? 0) + 1);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return { allDeps, dependedOnCount, versionMap };
|
|
32
|
+
}
|
|
33
|
+
function collectDepsV2(dependencies, pkgJson) {
|
|
34
|
+
const allDeps = [];
|
|
35
|
+
const dependedOnCount = new Map();
|
|
36
|
+
const versionMap = new Map();
|
|
37
|
+
const devDepNames = new Set(Object.keys(pkgJson.devDependencies ?? {}));
|
|
38
|
+
function walk(deps, parentName) {
|
|
39
|
+
for (const [name, entry] of Object.entries(deps)) {
|
|
40
|
+
const version = entry.version ?? 'unknown';
|
|
41
|
+
const isDev = entry.dev === true || devDepNames.has(name);
|
|
42
|
+
allDeps.push({ name, version, dev: isDev });
|
|
43
|
+
const versions = versionMap.get(name) ?? new Set();
|
|
44
|
+
versions.add(version);
|
|
45
|
+
versionMap.set(name, versions);
|
|
46
|
+
if (parentName !== undefined) {
|
|
47
|
+
dependedOnCount.set(name, (dependedOnCount.get(name) ?? 0) + 1);
|
|
48
|
+
}
|
|
49
|
+
// Count requires
|
|
50
|
+
if (entry.requires !== undefined) {
|
|
51
|
+
for (const depName of Object.keys(entry.requires)) {
|
|
52
|
+
dependedOnCount.set(depName, (dependedOnCount.get(depName) ?? 0) + 1);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Nested dependencies
|
|
56
|
+
if (entry.dependencies !== undefined) {
|
|
57
|
+
walk(entry.dependencies, name);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
walk(dependencies);
|
|
62
|
+
return { allDeps, dependedOnCount, versionMap };
|
|
63
|
+
}
|
|
64
|
+
export function depsPreset(filePath) {
|
|
65
|
+
const layout = {
|
|
66
|
+
title: 'Dependencies',
|
|
67
|
+
stats: [
|
|
68
|
+
{ id: 'totalDeps', label: 'Total Dependencies', type: 'stat' },
|
|
69
|
+
{ id: 'directDeps', label: 'Direct', type: 'stat' },
|
|
70
|
+
{ id: 'devDeps', label: 'Dev Dependencies', type: 'stat' },
|
|
71
|
+
{ id: 'duplicates', label: 'Duplicates', type: 'stat' },
|
|
72
|
+
],
|
|
73
|
+
panels: [
|
|
74
|
+
{ id: 'depList', label: 'All Dependencies', type: 'table', span: 2 },
|
|
75
|
+
{ id: 'topByDeps', label: 'Most Depended On', type: 'bar' },
|
|
76
|
+
{ id: 'versionConflicts', label: 'Version Conflicts', type: 'event-log' },
|
|
77
|
+
],
|
|
78
|
+
};
|
|
79
|
+
const data = () => {
|
|
80
|
+
let lockContent;
|
|
81
|
+
try {
|
|
82
|
+
lockContent = readFileSync(filePath, 'utf-8');
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
throw new Error(`[tuimon] Could not read lock file: ${filePath}. Make sure the file exists and is readable.`);
|
|
86
|
+
}
|
|
87
|
+
let lockData;
|
|
88
|
+
try {
|
|
89
|
+
lockData = JSON.parse(lockContent);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
throw new Error(`[tuimon] Could not parse lock file: ${filePath}. Make sure it is valid JSON.`);
|
|
93
|
+
}
|
|
94
|
+
// Read package.json from same directory
|
|
95
|
+
const dir = dirname(filePath);
|
|
96
|
+
const pkgJsonPath = join(dir, 'package.json');
|
|
97
|
+
let pkgJson;
|
|
98
|
+
try {
|
|
99
|
+
pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
throw new Error(`[tuimon] Could not read package.json at ${pkgJsonPath}. Make sure it exists alongside the lock file.`);
|
|
103
|
+
}
|
|
104
|
+
const lockVersion = lockData.lockfileVersion ?? 1;
|
|
105
|
+
let allDeps;
|
|
106
|
+
let dependedOnCount;
|
|
107
|
+
let versionMap;
|
|
108
|
+
if (lockVersion >= 3 && lockData.packages !== undefined) {
|
|
109
|
+
const result = collectDepsV3(lockData.packages, pkgJson);
|
|
110
|
+
allDeps = result.allDeps;
|
|
111
|
+
dependedOnCount = result.dependedOnCount;
|
|
112
|
+
versionMap = result.versionMap;
|
|
113
|
+
}
|
|
114
|
+
else if (lockData.packages !== undefined) {
|
|
115
|
+
// lockfileVersion 2 also has packages
|
|
116
|
+
const result = collectDepsV3(lockData.packages, pkgJson);
|
|
117
|
+
allDeps = result.allDeps;
|
|
118
|
+
dependedOnCount = result.dependedOnCount;
|
|
119
|
+
versionMap = result.versionMap;
|
|
120
|
+
}
|
|
121
|
+
else if (lockData.dependencies !== undefined) {
|
|
122
|
+
const result = collectDepsV2(lockData.dependencies, pkgJson);
|
|
123
|
+
allDeps = result.allDeps;
|
|
124
|
+
dependedOnCount = result.dependedOnCount;
|
|
125
|
+
versionMap = result.versionMap;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
throw new Error(`[tuimon] Unsupported lock file format in ${filePath}. Expected lockfileVersion 2 or 3 with packages or dependencies.`);
|
|
129
|
+
}
|
|
130
|
+
// Unique package names
|
|
131
|
+
const uniqueNames = new Set(allDeps.map((d) => d.name));
|
|
132
|
+
const totalDeps = uniqueNames.size;
|
|
133
|
+
// Direct deps count
|
|
134
|
+
const directDepNames = [
|
|
135
|
+
...Object.keys(pkgJson.dependencies ?? {}),
|
|
136
|
+
...Object.keys(pkgJson.devDependencies ?? {}),
|
|
137
|
+
];
|
|
138
|
+
const directDeps = directDepNames.length;
|
|
139
|
+
// Dev deps count
|
|
140
|
+
const devDeps = Object.keys(pkgJson.devDependencies ?? {}).length;
|
|
141
|
+
// Duplicates: packages with multiple versions
|
|
142
|
+
let duplicates = 0;
|
|
143
|
+
for (const [, versions] of versionMap) {
|
|
144
|
+
if (versions.size > 1)
|
|
145
|
+
duplicates++;
|
|
146
|
+
}
|
|
147
|
+
// Deduplicate for table — keep unique name+version combos
|
|
148
|
+
const seen = new Set();
|
|
149
|
+
const uniqueDeps = [];
|
|
150
|
+
const sorted = [...allDeps].sort((a, b) => a.name.localeCompare(b.name));
|
|
151
|
+
for (const dep of sorted) {
|
|
152
|
+
const key = `${dep.name}@${dep.version}`;
|
|
153
|
+
if (!seen.has(key)) {
|
|
154
|
+
seen.add(key);
|
|
155
|
+
uniqueDeps.push(dep);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Table data
|
|
159
|
+
const depList = {
|
|
160
|
+
columns: ['Name', 'Version', 'Dev'],
|
|
161
|
+
rows: uniqueDeps.map((d) => [d.name, d.version, d.dev ? 'Yes' : 'No']),
|
|
162
|
+
};
|
|
163
|
+
// Top by dependents (most depended on)
|
|
164
|
+
const sortedByCount = [...dependedOnCount.entries()]
|
|
165
|
+
.sort((a, b) => b[1] - a[1])
|
|
166
|
+
.slice(0, 10);
|
|
167
|
+
const topByDeps = {};
|
|
168
|
+
for (const [name, count] of sortedByCount) {
|
|
169
|
+
topByDeps[name] = count;
|
|
170
|
+
}
|
|
171
|
+
// Version conflicts
|
|
172
|
+
const versionConflicts = [];
|
|
173
|
+
for (const [name, versions] of versionMap) {
|
|
174
|
+
if (versions.size > 1) {
|
|
175
|
+
const versionList = [...versions].join(', ');
|
|
176
|
+
versionConflicts.push({
|
|
177
|
+
text: `${name}: ${versionList}`,
|
|
178
|
+
type: 'warning',
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
totalDeps,
|
|
184
|
+
directDeps,
|
|
185
|
+
devDeps,
|
|
186
|
+
duplicates,
|
|
187
|
+
depList,
|
|
188
|
+
topByDeps,
|
|
189
|
+
versionConflicts,
|
|
190
|
+
};
|
|
191
|
+
};
|
|
192
|
+
return { layout, data };
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=deps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deps.js","sourceRoot":"","sources":["../../../src/quick/presets/deps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../../src/quick/presets/docker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAuC9C,wBAAgB,YAAY,IAAI,YAAY,CAqF3C"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
function parsePercent(value) {
|
|
3
|
+
return parseFloat(value.replace('%', '')) || 0;
|
|
4
|
+
}
|
|
5
|
+
function execCommand(cmd) {
|
|
6
|
+
try {
|
|
7
|
+
return execSync(cmd, { encoding: 'utf-8', timeout: 10_000 });
|
|
8
|
+
}
|
|
9
|
+
catch (err) {
|
|
10
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
11
|
+
if (msg.includes('ENOENT') || msg.includes('not found') || msg.includes('command not found')) {
|
|
12
|
+
throw new Error('[tuimon] Docker not found. Make sure Docker is installed and running.');
|
|
13
|
+
}
|
|
14
|
+
throw err;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function parseJsonLines(output) {
|
|
18
|
+
return output
|
|
19
|
+
.trim()
|
|
20
|
+
.split('\n')
|
|
21
|
+
.filter((line) => line.trim() !== '')
|
|
22
|
+
.map((line) => JSON.parse(line));
|
|
23
|
+
}
|
|
24
|
+
export function dockerPreset() {
|
|
25
|
+
// Verify docker is available on init
|
|
26
|
+
try {
|
|
27
|
+
execSync('docker --version', { encoding: 'utf-8', stdio: 'pipe' });
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
throw new Error('[tuimon] Docker not found. Make sure Docker is installed and running.');
|
|
31
|
+
}
|
|
32
|
+
const layout = {
|
|
33
|
+
title: 'Docker',
|
|
34
|
+
stats: [
|
|
35
|
+
{ id: 'containers', label: 'Containers', type: 'stat' },
|
|
36
|
+
{ id: 'running', label: 'Running', type: 'stat' },
|
|
37
|
+
{ id: 'totalCpu', label: 'CPU Usage', type: 'gauge' },
|
|
38
|
+
{ id: 'totalMem', label: 'Memory', type: 'gauge' },
|
|
39
|
+
],
|
|
40
|
+
panels: [
|
|
41
|
+
{ id: 'cpuHistory', label: 'CPU per Container', type: 'line', span: 2 },
|
|
42
|
+
{ id: 'health', label: 'Container Status', type: 'status-grid' },
|
|
43
|
+
{ id: 'memUsage', label: 'Memory per Container', type: 'bar' },
|
|
44
|
+
{ id: 'events', label: 'Recent Events', type: 'event-log', throttle: 3000 },
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
const data = () => {
|
|
48
|
+
const statsOutput = execCommand("docker stats --no-stream --format '{{json .}}'");
|
|
49
|
+
const statsEntries = parseJsonLines(statsOutput);
|
|
50
|
+
const psOutput = execCommand("docker ps --format '{{json .}}'");
|
|
51
|
+
const psEntries = parseJsonLines(psOutput);
|
|
52
|
+
const totalContainers = psEntries.length;
|
|
53
|
+
const runningCount = psEntries.filter((c) => c.State === 'running').length;
|
|
54
|
+
const totalCpu = statsEntries.reduce((sum, e) => sum + parsePercent(e.CPUPerc), 0);
|
|
55
|
+
const totalMem = statsEntries.length > 0
|
|
56
|
+
? statsEntries.reduce((sum, e) => sum + parsePercent(e.MemPerc), 0) / statsEntries.length
|
|
57
|
+
: 0;
|
|
58
|
+
const cpuHistory = {};
|
|
59
|
+
for (const entry of statsEntries) {
|
|
60
|
+
cpuHistory[entry.Name] = parsePercent(entry.CPUPerc);
|
|
61
|
+
}
|
|
62
|
+
const health = psEntries.map((c) => ({
|
|
63
|
+
label: c.Names,
|
|
64
|
+
status: c.State === 'running' ? 'ok' : c.State === 'exited' ? 'error' : 'warn',
|
|
65
|
+
}));
|
|
66
|
+
const memUsage = {};
|
|
67
|
+
for (const entry of statsEntries) {
|
|
68
|
+
memUsage[entry.Name] = parsePercent(entry.MemPerc);
|
|
69
|
+
}
|
|
70
|
+
let events = [];
|
|
71
|
+
try {
|
|
72
|
+
const eventsOutput = execCommand("docker events --since 60s --until 0s --format '{{json .}}'");
|
|
73
|
+
const lines = eventsOutput
|
|
74
|
+
.trim()
|
|
75
|
+
.split('\n')
|
|
76
|
+
.filter((line) => line.trim() !== '');
|
|
77
|
+
events = lines.map((line) => {
|
|
78
|
+
const parsed = JSON.parse(line);
|
|
79
|
+
const name = parsed.Actor?.Attributes?.name ?? 'unknown';
|
|
80
|
+
const action = parsed.Action ?? 'unknown';
|
|
81
|
+
return { text: `${name}: ${action}`, type: 'info' };
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
events = [];
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
containers: totalContainers,
|
|
89
|
+
running: runningCount,
|
|
90
|
+
totalCpu: Math.round(totalCpu * 100) / 100,
|
|
91
|
+
totalMem: Math.round(totalMem * 100) / 100,
|
|
92
|
+
cpuHistory,
|
|
93
|
+
health,
|
|
94
|
+
memUsage,
|
|
95
|
+
events,
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
return { layout, data, refresh: 1000 };
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=docker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../../src/quick/presets/docker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/quick/presets/git.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAiB9C,wBAAgB,SAAS,IAAI,YAAY,CA+GxC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
function execGit(cmd) {
|
|
3
|
+
try {
|
|
4
|
+
return execSync(cmd, { encoding: 'utf-8', timeout: 30_000, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
5
|
+
}
|
|
6
|
+
catch (err) {
|
|
7
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
8
|
+
if (msg.includes('not a git repository') || msg.includes('Not a git repository')) {
|
|
9
|
+
throw new Error('[tuimon] Not a git repository. Run this command from inside a git repo.');
|
|
10
|
+
}
|
|
11
|
+
if (msg.includes('ENOENT') || msg.includes('not found') || msg.includes('command not found')) {
|
|
12
|
+
throw new Error('[tuimon] Git not found. Make sure git is installed.');
|
|
13
|
+
}
|
|
14
|
+
throw err;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function gitPreset() {
|
|
18
|
+
// Verify we're in a git repo on init
|
|
19
|
+
try {
|
|
20
|
+
execSync('git rev-parse --is-inside-work-tree', { encoding: 'utf-8', stdio: 'pipe' });
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
throw new Error('[tuimon] Not a git repository. Run this command from inside a git repo.');
|
|
24
|
+
}
|
|
25
|
+
const layout = {
|
|
26
|
+
title: 'Git',
|
|
27
|
+
stats: [
|
|
28
|
+
{ id: 'commits', label: 'Total Commits', type: 'stat' },
|
|
29
|
+
{ id: 'contributors', label: 'Contributors', type: 'stat' },
|
|
30
|
+
{ id: 'branches', label: 'Branches', type: 'stat' },
|
|
31
|
+
{ id: 'filesChanged', label: 'Files Changed (30d)', type: 'stat' },
|
|
32
|
+
],
|
|
33
|
+
panels: [
|
|
34
|
+
{ id: 'frequency', label: 'Commits per Day (30 days)', type: 'bar', span: 2 },
|
|
35
|
+
{ id: 'topContributors', label: 'Top Contributors', type: 'bar' },
|
|
36
|
+
{ id: 'topFiles', label: 'Most Changed Files', type: 'bar' },
|
|
37
|
+
{ id: 'recentCommits', label: 'Recent Commits', type: 'event-log', span: 2 },
|
|
38
|
+
],
|
|
39
|
+
};
|
|
40
|
+
const data = () => {
|
|
41
|
+
// Total commits
|
|
42
|
+
const commitCountStr = execGit('git rev-list --count HEAD').trim();
|
|
43
|
+
const commits = parseInt(commitCountStr, 10) || 0;
|
|
44
|
+
// Contributors
|
|
45
|
+
const shortlogOutput = execGit('git shortlog -sn --no-merges HEAD');
|
|
46
|
+
const contributorLines = shortlogOutput
|
|
47
|
+
.trim()
|
|
48
|
+
.split('\n')
|
|
49
|
+
.filter((line) => line.trim() !== '');
|
|
50
|
+
const contributorEntries = contributorLines.map((line) => {
|
|
51
|
+
const match = line.trim().match(/^(\d+)\t(.+)$/);
|
|
52
|
+
return match ? { count: parseInt(match[1] ?? '0', 10), name: match[2] ?? 'unknown' } : null;
|
|
53
|
+
}).filter((e) => e !== null);
|
|
54
|
+
const contributorsCount = contributorEntries.length;
|
|
55
|
+
const topContributors = {};
|
|
56
|
+
for (const entry of contributorEntries.slice(0, 10)) {
|
|
57
|
+
topContributors[entry.name] = entry.count;
|
|
58
|
+
}
|
|
59
|
+
// Branches
|
|
60
|
+
const branchOutput = execGit('git branch --list');
|
|
61
|
+
const branchCount = branchOutput
|
|
62
|
+
.trim()
|
|
63
|
+
.split('\n')
|
|
64
|
+
.filter((line) => line.trim() !== '').length;
|
|
65
|
+
// Commits per day (30 days)
|
|
66
|
+
const dateOutput = execGit('git log --since="30 days ago" --format="%ad" --date=short');
|
|
67
|
+
const dates = dateOutput
|
|
68
|
+
.trim()
|
|
69
|
+
.split('\n')
|
|
70
|
+
.filter((line) => line.trim() !== '');
|
|
71
|
+
const frequency = {};
|
|
72
|
+
for (const date of dates) {
|
|
73
|
+
const d = date.trim();
|
|
74
|
+
frequency[d] = (frequency[d] ?? 0) + 1;
|
|
75
|
+
}
|
|
76
|
+
// Files changed in 30 days
|
|
77
|
+
const filesOutput = execGit('git log --since="30 days ago" --name-only --format=""');
|
|
78
|
+
const allFiles = filesOutput
|
|
79
|
+
.trim()
|
|
80
|
+
.split('\n')
|
|
81
|
+
.filter((line) => line.trim() !== '')
|
|
82
|
+
.map((line) => line.trim());
|
|
83
|
+
const fileCounts = new Map();
|
|
84
|
+
for (const file of allFiles) {
|
|
85
|
+
fileCounts.set(file, (fileCounts.get(file) ?? 0) + 1);
|
|
86
|
+
}
|
|
87
|
+
const uniqueFilesChanged = fileCounts.size;
|
|
88
|
+
// Top 10 most changed files
|
|
89
|
+
const sortedFiles = [...fileCounts.entries()]
|
|
90
|
+
.sort((a, b) => b[1] - a[1])
|
|
91
|
+
.slice(0, 10);
|
|
92
|
+
const topFiles = {};
|
|
93
|
+
for (const [file, count] of sortedFiles) {
|
|
94
|
+
topFiles[file] = count;
|
|
95
|
+
}
|
|
96
|
+
// Recent commits
|
|
97
|
+
const recentOutput = execGit('git log -20 --format="%h %s (%an, %ar)"');
|
|
98
|
+
const recentCommits = recentOutput
|
|
99
|
+
.trim()
|
|
100
|
+
.split('\n')
|
|
101
|
+
.filter((line) => line.trim() !== '')
|
|
102
|
+
.map((line) => ({ text: line.trim(), type: 'info' }));
|
|
103
|
+
return {
|
|
104
|
+
commits,
|
|
105
|
+
contributors: contributorsCount,
|
|
106
|
+
branches: branchCount,
|
|
107
|
+
filesChanged: uniqueFilesChanged,
|
|
108
|
+
frequency,
|
|
109
|
+
topContributors,
|
|
110
|
+
topFiles,
|
|
111
|
+
recentCommits,
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
return { layout, data };
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/quick/presets/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ps.d.ts","sourceRoot":"","sources":["../../../src/quick/presets/ps.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AA4F9C,wBAAgB,QAAQ,IAAI,YAAY,CA0FvC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
function execCommand(cmd) {
|
|
4
|
+
try {
|
|
5
|
+
return execSync(cmd, { encoding: 'utf-8', timeout: 5000 });
|
|
6
|
+
}
|
|
7
|
+
catch (err) {
|
|
8
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
9
|
+
if (msg.includes('ENOENT') || msg.includes('not found') || msg.includes('command not found')) {
|
|
10
|
+
throw new Error('[tuimon] ps command not found. This preset requires a Unix-like system (Linux/macOS). Windows is not supported.');
|
|
11
|
+
}
|
|
12
|
+
throw err;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function readFile(path) {
|
|
16
|
+
try {
|
|
17
|
+
return readFileSync(path, 'utf-8');
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function parseLoadAvg() {
|
|
24
|
+
const content = readFile('/proc/loadavg');
|
|
25
|
+
if (content === undefined)
|
|
26
|
+
return undefined;
|
|
27
|
+
const parts = content.trim().split(/\s+/);
|
|
28
|
+
const one = parts[0];
|
|
29
|
+
const five = parts[1];
|
|
30
|
+
const fifteen = parts[2];
|
|
31
|
+
if (one === undefined || five === undefined || fifteen === undefined)
|
|
32
|
+
return undefined;
|
|
33
|
+
return `${one} / ${five} / ${fifteen}`;
|
|
34
|
+
}
|
|
35
|
+
function parseMemPercent() {
|
|
36
|
+
const content = readFile('/proc/meminfo');
|
|
37
|
+
if (content === undefined)
|
|
38
|
+
return undefined;
|
|
39
|
+
const totalMatch = content.match(/MemTotal:\s+(\d+)/);
|
|
40
|
+
const availMatch = content.match(/MemAvailable:\s+(\d+)/);
|
|
41
|
+
if (totalMatch === null || availMatch === null)
|
|
42
|
+
return undefined;
|
|
43
|
+
const total = parseInt(totalMatch[1] ?? '0', 10);
|
|
44
|
+
const avail = parseInt(availMatch[1] ?? '0', 10);
|
|
45
|
+
if (total === 0)
|
|
46
|
+
return undefined;
|
|
47
|
+
return Math.round(((total - avail) / total) * 10000) / 100;
|
|
48
|
+
}
|
|
49
|
+
function parsePsOutput(output) {
|
|
50
|
+
const lines = output.trim().split('\n');
|
|
51
|
+
// Skip header line
|
|
52
|
+
const entries = [];
|
|
53
|
+
for (let i = 1; i < lines.length; i++) {
|
|
54
|
+
const line = lines[i];
|
|
55
|
+
if (line === undefined || line.trim() === '')
|
|
56
|
+
continue;
|
|
57
|
+
const parts = line.trim().split(/\s+/);
|
|
58
|
+
const user = parts[0];
|
|
59
|
+
const pid = parts[1];
|
|
60
|
+
const cpuStr = parts[2];
|
|
61
|
+
const memStr = parts[3];
|
|
62
|
+
if (user === undefined || pid === undefined || cpuStr === undefined || memStr === undefined)
|
|
63
|
+
continue;
|
|
64
|
+
// Command is everything from column index 10 onward
|
|
65
|
+
const command = parts.slice(10).join(' ') || parts.slice(4).join(' ');
|
|
66
|
+
entries.push({
|
|
67
|
+
user,
|
|
68
|
+
pid,
|
|
69
|
+
cpu: parseFloat(cpuStr) || 0,
|
|
70
|
+
mem: parseFloat(memStr) || 0,
|
|
71
|
+
command,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return entries;
|
|
75
|
+
}
|
|
76
|
+
function getLoadAvgFallback() {
|
|
77
|
+
try {
|
|
78
|
+
const output = execCommand('uptime');
|
|
79
|
+
const match = output.match(/load averages?:\s*([\d.]+)[,\s]+([\d.]+)[,\s]+([\d.]+)/);
|
|
80
|
+
if (match !== null) {
|
|
81
|
+
return `${match[1] ?? '?'} / ${match[2] ?? '?'} / ${match[3] ?? '?'}`;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// ignore
|
|
86
|
+
}
|
|
87
|
+
return '? / ? / ?';
|
|
88
|
+
}
|
|
89
|
+
export function psPreset() {
|
|
90
|
+
// Verify ps is available
|
|
91
|
+
if (process.platform === 'win32') {
|
|
92
|
+
throw new Error('[tuimon] ps preset requires a Unix-like system (Linux/macOS). Windows is not supported. Consider using PowerShell\'s Get-Process instead.');
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
execSync('ps --version 2>&1 || ps aux > /dev/null 2>&1', { encoding: 'utf-8', stdio: 'pipe', timeout: 5000 });
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
throw new Error('[tuimon] ps command not available on this system.');
|
|
99
|
+
}
|
|
100
|
+
const layout = {
|
|
101
|
+
title: 'Processes',
|
|
102
|
+
stats: [
|
|
103
|
+
{ id: 'total', label: 'Total Processes', type: 'stat' },
|
|
104
|
+
{ id: 'cpuUsage', label: 'CPU Usage', type: 'gauge' },
|
|
105
|
+
{ id: 'memUsage', label: 'Memory Usage', type: 'gauge' },
|
|
106
|
+
{ id: 'loadAvg', label: 'Load Average', type: 'stat' },
|
|
107
|
+
],
|
|
108
|
+
panels: [
|
|
109
|
+
{ id: 'topCpu', label: 'Top CPU Processes', type: 'bar', span: 2 },
|
|
110
|
+
{ id: 'topMem', label: 'Top Memory Processes', type: 'bar' },
|
|
111
|
+
{ id: 'cpuHistory', label: 'CPU History', type: 'line' },
|
|
112
|
+
{ id: 'processList', label: 'Process List', type: 'event-log', span: 2, throttle: 2000 },
|
|
113
|
+
],
|
|
114
|
+
};
|
|
115
|
+
const data = () => {
|
|
116
|
+
const psOutput = execCommand('ps aux --sort=-%cpu | head -11');
|
|
117
|
+
const processes = parsePsOutput(psOutput);
|
|
118
|
+
const top10 = processes.slice(0, 10);
|
|
119
|
+
// Total process count
|
|
120
|
+
const countOutput = execCommand('ps aux');
|
|
121
|
+
const totalLines = countOutput.trim().split('\n');
|
|
122
|
+
const total = Math.max(0, totalLines.length - 1); // subtract header
|
|
123
|
+
// CPU usage: sum of top processes, capped at 100
|
|
124
|
+
const cpuSum = top10.reduce((sum, p) => sum + p.cpu, 0);
|
|
125
|
+
const cpuUsage = Math.min(100, Math.round(cpuSum * 100) / 100);
|
|
126
|
+
// Memory usage: try /proc/meminfo first, fallback to process sum
|
|
127
|
+
const procMem = parseMemPercent();
|
|
128
|
+
const memUsage = procMem !== undefined
|
|
129
|
+
? procMem
|
|
130
|
+
: Math.min(100, Math.round(top10.reduce((sum, p) => sum + p.mem, 0) * 100) / 100);
|
|
131
|
+
// Load average: try /proc/loadavg first, fallback to uptime
|
|
132
|
+
const loadAvg = parseLoadAvg() ?? getLoadAvgFallback();
|
|
133
|
+
// Top CPU bar chart
|
|
134
|
+
const topCpu = {};
|
|
135
|
+
for (const p of top10) {
|
|
136
|
+
const name = p.command.split('/').pop()?.split(' ')[0] ?? p.command;
|
|
137
|
+
const key = name || `pid:${p.pid}`;
|
|
138
|
+
topCpu[key] = (topCpu[key] ?? 0) + p.cpu;
|
|
139
|
+
}
|
|
140
|
+
// Top Memory bar chart — re-sort by memory
|
|
141
|
+
const byMem = [...processes].sort((a, b) => b.mem - a.mem).slice(0, 10);
|
|
142
|
+
const topMem = {};
|
|
143
|
+
for (const p of byMem) {
|
|
144
|
+
const name = p.command.split('/').pop()?.split(' ')[0] ?? p.command;
|
|
145
|
+
const key = name || `pid:${p.pid}`;
|
|
146
|
+
topMem[key] = (topMem[key] ?? 0) + p.mem;
|
|
147
|
+
}
|
|
148
|
+
// CPU history — single data point per refresh, line chart accumulates
|
|
149
|
+
const cpuHistory = { CPU: cpuUsage };
|
|
150
|
+
// Process list — event-log entries
|
|
151
|
+
const processList = top10.map((p) => {
|
|
152
|
+
const name = p.command.split('/').pop()?.split(' ')[0] ?? p.command;
|
|
153
|
+
return `${name} ${p.cpu}% CPU ${p.mem}% MEM ${p.command}`;
|
|
154
|
+
});
|
|
155
|
+
return {
|
|
156
|
+
total,
|
|
157
|
+
cpuUsage,
|
|
158
|
+
memUsage,
|
|
159
|
+
loadAvg,
|
|
160
|
+
topCpu,
|
|
161
|
+
topMem,
|
|
162
|
+
cpuHistory,
|
|
163
|
+
processList,
|
|
164
|
+
};
|
|
165
|
+
};
|
|
166
|
+
return { layout, data, refresh: 1000 };
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=ps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ps.js","sourceRoot":"","sources":["../../../src/quick/presets/ps.ts"],"names":[],"mappings":"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"}
|