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.
Files changed (45) hide show
  1. package/README.md +191 -181
  2. package/dist/browser.d.ts.map +1 -1
  3. package/dist/browser.js +4 -1
  4. package/dist/browser.js.map +1 -1
  5. package/dist/cli.js +67 -2
  6. package/dist/cli.js.map +1 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +22 -6
  9. package/dist/index.js.map +1 -1
  10. package/dist/quick/presets/coverage.d.ts +3 -0
  11. package/dist/quick/presets/coverage.d.ts.map +1 -0
  12. package/dist/quick/presets/coverage.js +362 -0
  13. package/dist/quick/presets/coverage.js.map +1 -0
  14. package/dist/quick/presets/deps.d.ts +3 -0
  15. package/dist/quick/presets/deps.d.ts.map +1 -0
  16. package/dist/quick/presets/deps.js +194 -0
  17. package/dist/quick/presets/deps.js.map +1 -0
  18. package/dist/quick/presets/docker.d.ts +3 -0
  19. package/dist/quick/presets/docker.d.ts.map +1 -0
  20. package/dist/quick/presets/docker.js +100 -0
  21. package/dist/quick/presets/docker.js.map +1 -0
  22. package/dist/quick/presets/git.d.ts +3 -0
  23. package/dist/quick/presets/git.d.ts.map +1 -0
  24. package/dist/quick/presets/git.js +116 -0
  25. package/dist/quick/presets/git.js.map +1 -0
  26. package/dist/quick/presets/ps.d.ts +3 -0
  27. package/dist/quick/presets/ps.d.ts.map +1 -0
  28. package/dist/quick/presets/ps.js +168 -0
  29. package/dist/quick/presets/ps.js.map +1 -0
  30. package/dist/quick/presets/runner.d.ts +3 -0
  31. package/dist/quick/presets/runner.d.ts.map +1 -0
  32. package/dist/quick/presets/runner.js +20 -0
  33. package/dist/quick/presets/runner.js.map +1 -0
  34. package/dist/quick/presets/types.d.ts +7 -0
  35. package/dist/quick/presets/types.d.ts.map +1 -0
  36. package/dist/quick/presets/types.js +2 -0
  37. package/dist/quick/presets/types.js.map +1 -0
  38. package/dist/types.d.ts +1 -1
  39. package/dist/types.d.ts.map +1 -1
  40. package/examples/preset-deps.png +0 -0
  41. package/examples/preset-docker.png +0 -0
  42. package/examples/preset-git.png +0 -0
  43. package/examples/preset-ps.png +0 -0
  44. package/examples/test-presets.ts +91 -0
  45. 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,3 @@
1
+ import type { PresetResult } from './types.js';
2
+ export declare function dockerPreset(): PresetResult;
3
+ //# sourceMappingURL=docker.d.ts.map
@@ -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,3 @@
1
+ import type { PresetResult } from './types.js';
2
+ export declare function gitPreset(): PresetResult;
3
+ //# sourceMappingURL=git.d.ts.map
@@ -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,3 @@
1
+ import type { PresetResult } from './types.js';
2
+ export declare function psPreset(): PresetResult;
3
+ //# sourceMappingURL=ps.d.ts.map
@@ -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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"}