@doriandev/devcc 0.1.2
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/LICENSE +15 -0
- package/README.md +659 -0
- package/bin/devcc.mjs +66 -0
- package/dist/devcc/app/App.d.ts +178 -0
- package/dist/devcc/app/App.d.ts.map +1 -0
- package/dist/devcc/app/App.js +1255 -0
- package/dist/devcc/app/App.js.map +1 -0
- package/dist/devcc/app/builtinCommands.d.ts +17 -0
- package/dist/devcc/app/builtinCommands.d.ts.map +1 -0
- package/dist/devcc/app/builtinCommands.js +389 -0
- package/dist/devcc/app/builtinCommands.js.map +1 -0
- package/dist/devcc/app/keymap.d.ts +21 -0
- package/dist/devcc/app/keymap.d.ts.map +1 -0
- package/dist/devcc/app/keymap.js +162 -0
- package/dist/devcc/app/keymap.js.map +1 -0
- package/dist/devcc/app/theme.d.ts +49 -0
- package/dist/devcc/app/theme.d.ts.map +1 -0
- package/dist/devcc/app/theme.js +68 -0
- package/dist/devcc/app/theme.js.map +1 -0
- package/dist/devcc/cli.d.ts +3 -0
- package/dist/devcc/cli.d.ts.map +1 -0
- package/dist/devcc/cli.js +113 -0
- package/dist/devcc/cli.js.map +1 -0
- package/dist/devcc/components/CommandPalette.d.ts +26 -0
- package/dist/devcc/components/CommandPalette.d.ts.map +1 -0
- package/dist/devcc/components/CommandPalette.js +113 -0
- package/dist/devcc/components/CommandPalette.js.map +1 -0
- package/dist/devcc/components/ConfirmDialog.d.ts +31 -0
- package/dist/devcc/components/ConfirmDialog.d.ts.map +1 -0
- package/dist/devcc/components/ConfirmDialog.js +147 -0
- package/dist/devcc/components/ConfirmDialog.js.map +1 -0
- package/dist/devcc/components/Footer.d.ts +22 -0
- package/dist/devcc/components/Footer.d.ts.map +1 -0
- package/dist/devcc/components/Footer.js +72 -0
- package/dist/devcc/components/Footer.js.map +1 -0
- package/dist/devcc/components/Header.d.ts +12 -0
- package/dist/devcc/components/Header.d.ts.map +1 -0
- package/dist/devcc/components/Header.js +84 -0
- package/dist/devcc/components/Header.js.map +1 -0
- package/dist/devcc/components/HelpOverlay.d.ts +18 -0
- package/dist/devcc/components/HelpOverlay.d.ts.map +1 -0
- package/dist/devcc/components/HelpOverlay.js +48 -0
- package/dist/devcc/components/HelpOverlay.js.map +1 -0
- package/dist/devcc/components/Overlay.d.ts +31 -0
- package/dist/devcc/components/Overlay.d.ts.map +1 -0
- package/dist/devcc/components/Overlay.js +60 -0
- package/dist/devcc/components/Overlay.js.map +1 -0
- package/dist/devcc/components/ProjectPicker.d.ts +26 -0
- package/dist/devcc/components/ProjectPicker.d.ts.map +1 -0
- package/dist/devcc/components/ProjectPicker.js +114 -0
- package/dist/devcc/components/ProjectPicker.js.map +1 -0
- package/dist/devcc/components/Sidebar.d.ts +42 -0
- package/dist/devcc/components/Sidebar.d.ts.map +1 -0
- package/dist/devcc/components/Sidebar.js +127 -0
- package/dist/devcc/components/Sidebar.js.map +1 -0
- package/dist/devcc/components/StatusBadge.d.ts +16 -0
- package/dist/devcc/components/StatusBadge.d.ts.map +1 -0
- package/dist/devcc/components/StatusBadge.js +30 -0
- package/dist/devcc/components/StatusBadge.js.map +1 -0
- package/dist/devcc/components/primitives.d.ts +62 -0
- package/dist/devcc/components/primitives.d.ts.map +1 -0
- package/dist/devcc/components/primitives.js +169 -0
- package/dist/devcc/components/primitives.js.map +1 -0
- package/dist/devcc/components/styled.d.ts +16 -0
- package/dist/devcc/components/styled.d.ts.map +1 -0
- package/dist/devcc/components/styled.js +35 -0
- package/dist/devcc/components/styled.js.map +1 -0
- package/dist/devcc/core/commands.d.ts +89 -0
- package/dist/devcc/core/commands.d.ts.map +1 -0
- package/dist/devcc/core/commands.js +68 -0
- package/dist/devcc/core/commands.js.map +1 -0
- package/dist/devcc/core/config.d.ts +81 -0
- package/dist/devcc/core/config.d.ts.map +1 -0
- package/dist/devcc/core/config.js +313 -0
- package/dist/devcc/core/config.js.map +1 -0
- package/dist/devcc/core/events.d.ts +21 -0
- package/dist/devcc/core/events.d.ts.map +1 -0
- package/dist/devcc/core/events.js +27 -0
- package/dist/devcc/core/events.js.map +1 -0
- package/dist/devcc/core/state.d.ts +104 -0
- package/dist/devcc/core/state.d.ts.map +1 -0
- package/dist/devcc/core/state.js +139 -0
- package/dist/devcc/core/state.js.map +1 -0
- package/dist/devcc/deps/DependencyService.d.ts +50 -0
- package/dist/devcc/deps/DependencyService.d.ts.map +1 -0
- package/dist/devcc/deps/DependencyService.js +109 -0
- package/dist/devcc/deps/DependencyService.js.map +1 -0
- package/dist/devcc/deps/parse.d.ts +49 -0
- package/dist/devcc/deps/parse.d.ts.map +1 -0
- package/dist/devcc/deps/parse.js +158 -0
- package/dist/devcc/deps/parse.js.map +1 -0
- package/dist/devcc/git/GitService.d.ts +60 -0
- package/dist/devcc/git/GitService.d.ts.map +1 -0
- package/dist/devcc/git/GitService.js +160 -0
- package/dist/devcc/git/GitService.js.map +1 -0
- package/dist/devcc/git/parse.d.ts +57 -0
- package/dist/devcc/git/parse.d.ts.map +1 -0
- package/dist/devcc/git/parse.js +174 -0
- package/dist/devcc/git/parse.js.map +1 -0
- package/dist/devcc/index.d.ts +37 -0
- package/dist/devcc/index.d.ts.map +1 -0
- package/dist/devcc/index.js +36 -0
- package/dist/devcc/index.js.map +1 -0
- package/dist/devcc/logs/LogBuffer.d.ts +86 -0
- package/dist/devcc/logs/LogBuffer.d.ts.map +1 -0
- package/dist/devcc/logs/LogBuffer.js +200 -0
- package/dist/devcc/logs/LogBuffer.js.map +1 -0
- package/dist/devcc/logs/merge.d.ts +36 -0
- package/dist/devcc/logs/merge.d.ts.map +1 -0
- package/dist/devcc/logs/merge.js +71 -0
- package/dist/devcc/logs/merge.js.map +1 -0
- package/dist/devcc/processes/ManagedProcess.d.ts +129 -0
- package/dist/devcc/processes/ManagedProcess.d.ts.map +1 -0
- package/dist/devcc/processes/ManagedProcess.js +80 -0
- package/dist/devcc/processes/ManagedProcess.js.map +1 -0
- package/dist/devcc/processes/ProcessManager.d.ts +112 -0
- package/dist/devcc/processes/ProcessManager.d.ts.map +1 -0
- package/dist/devcc/processes/ProcessManager.js +525 -0
- package/dist/devcc/processes/ProcessManager.js.map +1 -0
- package/dist/devcc/processes/graph.d.ts +35 -0
- package/dist/devcc/processes/graph.d.ts.map +1 -0
- package/dist/devcc/processes/graph.js +68 -0
- package/dist/devcc/processes/graph.js.map +1 -0
- package/dist/devcc/projects/ProjectRegistry.d.ts +52 -0
- package/dist/devcc/projects/ProjectRegistry.d.ts.map +1 -0
- package/dist/devcc/projects/ProjectRegistry.js +177 -0
- package/dist/devcc/projects/ProjectRegistry.js.map +1 -0
- package/dist/devcc/services/ServiceManager.d.ts +48 -0
- package/dist/devcc/services/ServiceManager.d.ts.map +1 -0
- package/dist/devcc/services/ServiceManager.js +146 -0
- package/dist/devcc/services/ServiceManager.js.map +1 -0
- package/dist/devcc/services/docker.d.ts +37 -0
- package/dist/devcc/services/docker.d.ts.map +1 -0
- package/dist/devcc/services/docker.js +179 -0
- package/dist/devcc/services/docker.js.map +1 -0
- package/dist/devcc/services/node.d.ts +40 -0
- package/dist/devcc/services/node.d.ts.map +1 -0
- package/dist/devcc/services/node.js +107 -0
- package/dist/devcc/services/node.js.map +1 -0
- package/dist/devcc/services/ollama.d.ts +27 -0
- package/dist/devcc/services/ollama.d.ts.map +1 -0
- package/dist/devcc/services/ollama.js +66 -0
- package/dist/devcc/services/ollama.js.map +1 -0
- package/dist/devcc/services/postgres.d.ts +30 -0
- package/dist/devcc/services/postgres.d.ts.map +1 -0
- package/dist/devcc/services/postgres.js +47 -0
- package/dist/devcc/services/postgres.js.map +1 -0
- package/dist/devcc/services/redis.d.ts +20 -0
- package/dist/devcc/services/redis.d.ts.map +1 -0
- package/dist/devcc/services/redis.js +39 -0
- package/dist/devcc/services/redis.js.map +1 -0
- package/dist/devcc/services/types.d.ts +51 -0
- package/dist/devcc/services/types.d.ts.map +1 -0
- package/dist/devcc/services/types.js +10 -0
- package/dist/devcc/services/types.js.map +1 -0
- package/dist/devcc/system/SystemMonitor.d.ts +87 -0
- package/dist/devcc/system/SystemMonitor.d.ts.map +1 -0
- package/dist/devcc/system/SystemMonitor.js +142 -0
- package/dist/devcc/system/SystemMonitor.js.map +1 -0
- package/dist/devcc/utils/errors.d.ts +31 -0
- package/dist/devcc/utils/errors.d.ts.map +1 -0
- package/dist/devcc/utils/errors.js +52 -0
- package/dist/devcc/utils/errors.js.map +1 -0
- package/dist/devcc/utils/exec.d.ts +41 -0
- package/dist/devcc/utils/exec.d.ts.map +1 -0
- package/dist/devcc/utils/exec.js +112 -0
- package/dist/devcc/utils/exec.js.map +1 -0
- package/dist/devcc/utils/format.d.ts +18 -0
- package/dist/devcc/utils/format.d.ts.map +1 -0
- package/dist/devcc/utils/format.js +85 -0
- package/dist/devcc/utils/format.js.map +1 -0
- package/dist/devcc/utils/fuzzy.d.ts +12 -0
- package/dist/devcc/utils/fuzzy.d.ts.map +1 -0
- package/dist/devcc/utils/fuzzy.js +20 -0
- package/dist/devcc/utils/fuzzy.js.map +1 -0
- package/dist/devcc/utils/logger.d.ts +41 -0
- package/dist/devcc/utils/logger.d.ts.map +1 -0
- package/dist/devcc/utils/logger.js +117 -0
- package/dist/devcc/utils/logger.js.map +1 -0
- package/dist/devcc/utils/packageManager.d.ts +39 -0
- package/dist/devcc/utils/packageManager.d.ts.map +1 -0
- package/dist/devcc/utils/packageManager.js +85 -0
- package/dist/devcc/utils/packageManager.js.map +1 -0
- package/dist/devcc/utils/paths.d.ts +12 -0
- package/dist/devcc/utils/paths.d.ts.map +1 -0
- package/dist/devcc/utils/paths.js +39 -0
- package/dist/devcc/utils/paths.js.map +1 -0
- package/dist/devcc/views/DependenciesView.d.ts +34 -0
- package/dist/devcc/views/DependenciesView.d.ts.map +1 -0
- package/dist/devcc/views/DependenciesView.js +170 -0
- package/dist/devcc/views/DependenciesView.js.map +1 -0
- package/dist/devcc/views/GitView.d.ts +29 -0
- package/dist/devcc/views/GitView.d.ts.map +1 -0
- package/dist/devcc/views/GitView.js +226 -0
- package/dist/devcc/views/GitView.js.map +1 -0
- package/dist/devcc/views/LogsView.d.ts +39 -0
- package/dist/devcc/views/LogsView.d.ts.map +1 -0
- package/dist/devcc/views/LogsView.js +249 -0
- package/dist/devcc/views/LogsView.js.map +1 -0
- package/dist/devcc/views/OverviewView.d.ts +16 -0
- package/dist/devcc/views/OverviewView.d.ts.map +1 -0
- package/dist/devcc/views/OverviewView.js +135 -0
- package/dist/devcc/views/OverviewView.js.map +1 -0
- package/dist/devcc/views/ProcessesView.d.ts +26 -0
- package/dist/devcc/views/ProcessesView.d.ts.map +1 -0
- package/dist/devcc/views/ProcessesView.js +161 -0
- package/dist/devcc/views/ProcessesView.js.map +1 -0
- package/dist/devcc/views/ScriptsView.d.ts +30 -0
- package/dist/devcc/views/ScriptsView.d.ts.map +1 -0
- package/dist/devcc/views/ScriptsView.js +168 -0
- package/dist/devcc/views/ScriptsView.js.map +1 -0
- package/dist/devcc/views/ServicesView.d.ts +28 -0
- package/dist/devcc/views/ServicesView.d.ts.map +1 -0
- package/dist/devcc/views/ServicesView.js +153 -0
- package/dist/devcc/views/ServicesView.js.map +1 -0
- package/dist/devcc/views/SettingsView.d.ts +20 -0
- package/dist/devcc/views/SettingsView.d.ts.map +1 -0
- package/dist/devcc/views/SettingsView.js +114 -0
- package/dist/devcc/views/SettingsView.js.map +1 -0
- package/dist/devcc/views/SystemView.d.ts +13 -0
- package/dist/devcc/views/SystemView.d.ts.map +1 -0
- package/dist/devcc/views/SystemView.js +82 -0
- package/dist/devcc/views/SystemView.js.map +1 -0
- package/dist/devcc/views/View.d.ts +35 -0
- package/dist/devcc/views/View.d.ts.map +1 -0
- package/dist/devcc/views/View.js +42 -0
- package/dist/devcc/views/View.js.map +1 -0
- package/package.json +79 -0
- package/src/devcc/app/App.ts +1463 -0
- package/src/devcc/app/builtinCommands.ts +429 -0
- package/src/devcc/app/keymap.ts +167 -0
- package/src/devcc/app/theme.ts +83 -0
- package/src/devcc/cli.ts +122 -0
- package/src/devcc/components/CommandPalette.ts +136 -0
- package/src/devcc/components/ConfirmDialog.ts +174 -0
- package/src/devcc/components/Footer.ts +85 -0
- package/src/devcc/components/Header.ts +93 -0
- package/src/devcc/components/HelpOverlay.ts +62 -0
- package/src/devcc/components/Overlay.ts +91 -0
- package/src/devcc/components/ProjectPicker.ts +138 -0
- package/src/devcc/components/Sidebar.ts +163 -0
- package/src/devcc/components/StatusBadge.ts +36 -0
- package/src/devcc/components/primitives.ts +213 -0
- package/src/devcc/components/styled.ts +44 -0
- package/src/devcc/core/commands.ts +140 -0
- package/src/devcc/core/config.ts +405 -0
- package/src/devcc/core/events.ts +41 -0
- package/src/devcc/core/state.ts +236 -0
- package/src/devcc/deps/DependencyService.ts +152 -0
- package/src/devcc/deps/parse.ts +210 -0
- package/src/devcc/git/GitService.ts +205 -0
- package/src/devcc/git/parse.ts +203 -0
- package/src/devcc/index.ts +115 -0
- package/src/devcc/logs/LogBuffer.ts +237 -0
- package/src/devcc/logs/merge.ts +87 -0
- package/src/devcc/processes/ManagedProcess.ts +195 -0
- package/src/devcc/processes/ProcessManager.ts +625 -0
- package/src/devcc/processes/graph.ts +98 -0
- package/src/devcc/projects/ProjectRegistry.ts +219 -0
- package/src/devcc/services/ServiceManager.ts +180 -0
- package/src/devcc/services/docker.ts +220 -0
- package/src/devcc/services/node.ts +137 -0
- package/src/devcc/services/ollama.ts +80 -0
- package/src/devcc/services/postgres.ts +57 -0
- package/src/devcc/services/redis.ts +47 -0
- package/src/devcc/services/types.ts +59 -0
- package/src/devcc/system/SystemMonitor.ts +207 -0
- package/src/devcc/utils/errors.ts +64 -0
- package/src/devcc/utils/exec.ts +165 -0
- package/src/devcc/utils/format.ts +83 -0
- package/src/devcc/utils/fuzzy.ts +44 -0
- package/src/devcc/utils/logger.ts +140 -0
- package/src/devcc/utils/packageManager.ts +112 -0
- package/src/devcc/utils/paths.ts +39 -0
- package/src/devcc/views/DependenciesView.ts +206 -0
- package/src/devcc/views/GitView.ts +259 -0
- package/src/devcc/views/LogsView.ts +300 -0
- package/src/devcc/views/OverviewView.ts +187 -0
- package/src/devcc/views/ProcessesView.ts +177 -0
- package/src/devcc/views/ScriptsView.ts +187 -0
- package/src/devcc/views/ServicesView.ts +188 -0
- package/src/devcc/views/SettingsView.ts +146 -0
- package/src/devcc/views/SystemView.ts +110 -0
- package/src/devcc/views/View.ts +63 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/** Formatting helpers shared by the views. Pure functions, easy to test. */
|
|
2
|
+
export function formatBytes(bytes, fractionDigits = 1) {
|
|
3
|
+
if (!Number.isFinite(bytes) || bytes < 0)
|
|
4
|
+
return "-";
|
|
5
|
+
const units = ["B", "KB", "MB", "GB", "TB", "PB"];
|
|
6
|
+
let value = bytes;
|
|
7
|
+
let unit = 0;
|
|
8
|
+
while (value >= 1024 && unit < units.length - 1) {
|
|
9
|
+
value /= 1024;
|
|
10
|
+
unit += 1;
|
|
11
|
+
}
|
|
12
|
+
const digits = unit === 0 ? 0 : fractionDigits;
|
|
13
|
+
return `${value.toFixed(digits)} ${units[unit]}`;
|
|
14
|
+
}
|
|
15
|
+
/** Bytes rendered in GB without a unit suffix, for `7.2 / 36 GB` style pairs. */
|
|
16
|
+
export function toGigabytes(bytes, fractionDigits = 1) {
|
|
17
|
+
return (bytes / 1024 ** 3).toFixed(fractionDigits);
|
|
18
|
+
}
|
|
19
|
+
export function formatPercent(ratio, fractionDigits = 0) {
|
|
20
|
+
if (!Number.isFinite(ratio))
|
|
21
|
+
return "-";
|
|
22
|
+
return `${(ratio * 100).toFixed(fractionDigits)}%`;
|
|
23
|
+
}
|
|
24
|
+
/** Compact duration: `4s`, `2m 10s`, `1h 04m`, `3d 02h`. */
|
|
25
|
+
export function formatDuration(ms) {
|
|
26
|
+
if (!Number.isFinite(ms) || ms < 0)
|
|
27
|
+
return "-";
|
|
28
|
+
const seconds = Math.floor(ms / 1000);
|
|
29
|
+
if (seconds < 60)
|
|
30
|
+
return `${seconds}s`;
|
|
31
|
+
const minutes = Math.floor(seconds / 60);
|
|
32
|
+
if (minutes < 60)
|
|
33
|
+
return `${minutes}m ${String(seconds % 60).padStart(2, "0")}s`;
|
|
34
|
+
const hours = Math.floor(minutes / 60);
|
|
35
|
+
if (hours < 24)
|
|
36
|
+
return `${hours}h ${String(minutes % 60).padStart(2, "0")}m`;
|
|
37
|
+
const days = Math.floor(hours / 24);
|
|
38
|
+
return `${days}d ${String(hours % 24).padStart(2, "0")}h`;
|
|
39
|
+
}
|
|
40
|
+
export function formatClock(date) {
|
|
41
|
+
return `${String(date.getHours()).padStart(2, "0")}:${String(date.getMinutes()).padStart(2, "0")}`;
|
|
42
|
+
}
|
|
43
|
+
export function formatTimestamp(date) {
|
|
44
|
+
return (`${String(date.getHours()).padStart(2, "0")}:` +
|
|
45
|
+
`${String(date.getMinutes()).padStart(2, "0")}:` +
|
|
46
|
+
`${String(date.getSeconds()).padStart(2, "0")}.` +
|
|
47
|
+
`${String(date.getMilliseconds()).padStart(3, "0")}`);
|
|
48
|
+
}
|
|
49
|
+
/** Pad or truncate to an exact display width. */
|
|
50
|
+
export function fit(text, width) {
|
|
51
|
+
if (width <= 0)
|
|
52
|
+
return "";
|
|
53
|
+
if (text.length === width)
|
|
54
|
+
return text;
|
|
55
|
+
if (text.length < width)
|
|
56
|
+
return text.padEnd(width, " ");
|
|
57
|
+
if (width === 1)
|
|
58
|
+
return "…";
|
|
59
|
+
return `${text.slice(0, width - 1)}…`;
|
|
60
|
+
}
|
|
61
|
+
export function truncate(text, maxLength) {
|
|
62
|
+
if (maxLength <= 0)
|
|
63
|
+
return "";
|
|
64
|
+
if (text.length <= maxLength)
|
|
65
|
+
return text;
|
|
66
|
+
if (maxLength === 1)
|
|
67
|
+
return "…";
|
|
68
|
+
return `${text.slice(0, maxLength - 1)}…`;
|
|
69
|
+
}
|
|
70
|
+
/** Single-line preview of a possibly multi-line string. */
|
|
71
|
+
export function singleLine(text, maxLength = 120) {
|
|
72
|
+
return truncate(text.replace(/\s+/gu, " ").trim(), maxLength);
|
|
73
|
+
}
|
|
74
|
+
/** A small horizontal meter, e.g. `████░░░░░░`. */
|
|
75
|
+
export function meter(ratio, width = 10, filledChar = "█", emptyChar = "░") {
|
|
76
|
+
if (width <= 0)
|
|
77
|
+
return "";
|
|
78
|
+
const clamped = Math.max(0, Math.min(1, Number.isFinite(ratio) ? ratio : 0));
|
|
79
|
+
const filled = Math.round(clamped * width);
|
|
80
|
+
return filledChar.repeat(filled) + emptyChar.repeat(width - filled);
|
|
81
|
+
}
|
|
82
|
+
export function pluralise(count, singular, plural = `${singular}s`) {
|
|
83
|
+
return `${count} ${count === 1 ? singular : plural}`;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/devcc/utils/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface FuzzyMatch<T> {
|
|
2
|
+
item: T;
|
|
3
|
+
score: number;
|
|
4
|
+
/** Indices of matched characters in the haystack, for highlighting. */
|
|
5
|
+
positions: number[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Thin wrapper over the `fzf` package so the command palette and the script
|
|
9
|
+
* list share one ranking implementation (and one place to tune it).
|
|
10
|
+
*/
|
|
11
|
+
export declare function fuzzyFilter<T>(items: readonly T[], query: string, selector: (item: T) => string, limit?: number): FuzzyMatch<T>[];
|
|
12
|
+
//# sourceMappingURL=fuzzy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fuzzy.d.ts","sourceRoot":"","sources":["../../../src/devcc/utils/fuzzy.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,EAAE,MAAM,CAAA;IACb,uEAAuE;IACvE,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAcD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,EAC7B,KAAK,SAAK,GACT,UAAU,CAAC,CAAC,CAAC,EAAE,CAajB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Fzf } from "fzf";
|
|
2
|
+
const TypedFzf = Fzf;
|
|
3
|
+
/**
|
|
4
|
+
* Thin wrapper over the `fzf` package so the command palette and the script
|
|
5
|
+
* list share one ranking implementation (and one place to tune it).
|
|
6
|
+
*/
|
|
7
|
+
export function fuzzyFilter(items, query, selector, limit = 50) {
|
|
8
|
+
if (items.length === 0)
|
|
9
|
+
return [];
|
|
10
|
+
if (query.trim() === "") {
|
|
11
|
+
return items.slice(0, limit).map((item) => ({ item, score: 0, positions: [] }));
|
|
12
|
+
}
|
|
13
|
+
const finder = new TypedFzf(items, { selector, limit });
|
|
14
|
+
return finder.find(query).map((entry) => ({
|
|
15
|
+
item: entry.item,
|
|
16
|
+
score: entry.score,
|
|
17
|
+
positions: [...entry.positions].sort((a, b) => a - b),
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=fuzzy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fuzzy.js","sourceRoot":"","sources":["../../../src/devcc/utils/fuzzy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAsB,MAAM,KAAK,CAAA;AAmB7C,MAAM,QAAQ,GAAG,GAAgC,CAAA;AAEjD;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,KAAmB,EACnB,KAAa,EACb,QAA6B,EAC7B,KAAK,GAAG,EAAE;IAEV,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAEjC,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;IACjF,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAI,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;IAC1D,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACxC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;KACtD,CAAC,CAAC,CAAA;AACL,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal diagnostics logger.
|
|
3
|
+
*
|
|
4
|
+
* Writes to `.devcc/devcc.log` inside the project. Never writes to stdout/stderr
|
|
5
|
+
* while the TUI owns the terminal - that would corrupt the rendered frame.
|
|
6
|
+
*/
|
|
7
|
+
export declare const LOG_LEVELS: readonly ["debug", "info", "warn", "error", "silent"];
|
|
8
|
+
export type LogLevel = (typeof LOG_LEVELS)[number];
|
|
9
|
+
export declare function isLogLevel(value: string): value is LogLevel;
|
|
10
|
+
export interface LoggerOptions {
|
|
11
|
+
level?: LogLevel;
|
|
12
|
+
filePath?: string | null;
|
|
13
|
+
/** Extra sink, used by tests and by the in-app diagnostics panel. */
|
|
14
|
+
sink?: (line: string, level: LogLevel) => void;
|
|
15
|
+
}
|
|
16
|
+
export declare class Logger {
|
|
17
|
+
private level;
|
|
18
|
+
private filePath;
|
|
19
|
+
private sink;
|
|
20
|
+
private failed;
|
|
21
|
+
constructor(options?: LoggerOptions);
|
|
22
|
+
setLevel(level: LogLevel): void;
|
|
23
|
+
getLevel(): LogLevel;
|
|
24
|
+
getFilePath(): string | null;
|
|
25
|
+
child(namespace: string): ScopedLogger;
|
|
26
|
+
enabled(level: LogLevel): boolean;
|
|
27
|
+
log(level: LogLevel, namespace: string, message: string, data?: unknown): void;
|
|
28
|
+
}
|
|
29
|
+
export declare class ScopedLogger {
|
|
30
|
+
private readonly logger;
|
|
31
|
+
private readonly namespace;
|
|
32
|
+
constructor(logger: Logger, namespace: string);
|
|
33
|
+
debug(message: string, data?: unknown): void;
|
|
34
|
+
info(message: string, data?: unknown): void;
|
|
35
|
+
warn(message: string, data?: unknown): void;
|
|
36
|
+
error(message: string, data?: unknown): void;
|
|
37
|
+
child(namespace: string): ScopedLogger;
|
|
38
|
+
}
|
|
39
|
+
export declare function defaultLogFilePath(rootDir: string): string;
|
|
40
|
+
export declare function createLogger(rootDir: string, level?: LogLevel): Logger;
|
|
41
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/devcc/utils/logger.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AAEH,eAAO,MAAM,UAAU,uDAAwD,CAAA;AAC/E,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAA;AAUlD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,QAAQ,CAE3D;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,qEAAqE;IACrE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;CAC/C;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,IAAI,CAAuD;IACnE,OAAO,CAAC,MAAM,CAAQ;gBAEV,OAAO,GAAE,aAAkB;IAMvC,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI/B,QAAQ,IAAI,QAAQ;IAIpB,WAAW,IAAI,MAAM,GAAG,IAAI;IAI5B,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY;IAItC,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO;IAIjC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;CAkB/E;AAED,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM;IAGpC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI3C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI5C,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY;CAGvC;AAsBD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,GAAG,MAAM,CAItE"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { appendFileSync, existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Internal diagnostics logger.
|
|
5
|
+
*
|
|
6
|
+
* Writes to `.devcc/devcc.log` inside the project. Never writes to stdout/stderr
|
|
7
|
+
* while the TUI owns the terminal - that would corrupt the rendered frame.
|
|
8
|
+
*/
|
|
9
|
+
export const LOG_LEVELS = ["debug", "info", "warn", "error", "silent"];
|
|
10
|
+
const LEVEL_WEIGHT = {
|
|
11
|
+
debug: 10,
|
|
12
|
+
info: 20,
|
|
13
|
+
warn: 30,
|
|
14
|
+
error: 40,
|
|
15
|
+
silent: 100,
|
|
16
|
+
};
|
|
17
|
+
export function isLogLevel(value) {
|
|
18
|
+
return LOG_LEVELS.includes(value);
|
|
19
|
+
}
|
|
20
|
+
export class Logger {
|
|
21
|
+
level;
|
|
22
|
+
filePath;
|
|
23
|
+
sink;
|
|
24
|
+
failed = false;
|
|
25
|
+
constructor(options = {}) {
|
|
26
|
+
this.level = options.level ?? "info";
|
|
27
|
+
this.filePath = options.filePath ?? null;
|
|
28
|
+
this.sink = options.sink;
|
|
29
|
+
}
|
|
30
|
+
setLevel(level) {
|
|
31
|
+
this.level = level;
|
|
32
|
+
}
|
|
33
|
+
getLevel() {
|
|
34
|
+
return this.level;
|
|
35
|
+
}
|
|
36
|
+
getFilePath() {
|
|
37
|
+
return this.filePath;
|
|
38
|
+
}
|
|
39
|
+
child(namespace) {
|
|
40
|
+
return new ScopedLogger(this, namespace);
|
|
41
|
+
}
|
|
42
|
+
enabled(level) {
|
|
43
|
+
return LEVEL_WEIGHT[level] >= LEVEL_WEIGHT[this.level];
|
|
44
|
+
}
|
|
45
|
+
log(level, namespace, message, data) {
|
|
46
|
+
if (!this.enabled(level) || level === "silent")
|
|
47
|
+
return;
|
|
48
|
+
const stamp = new Date().toISOString();
|
|
49
|
+
const suffix = data === undefined ? "" : ` ${safeSerialise(data)}`;
|
|
50
|
+
const line = `${stamp} ${level.toUpperCase().padEnd(5)} [${namespace}] ${message}${suffix}`;
|
|
51
|
+
this.sink?.(line, level);
|
|
52
|
+
if (!this.filePath || this.failed)
|
|
53
|
+
return;
|
|
54
|
+
try {
|
|
55
|
+
ensureLogDirectory(dirname(this.filePath));
|
|
56
|
+
appendFileSync(this.filePath, `${line}\n`, "utf8");
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Never let logging take the app down; disable the file sink instead.
|
|
60
|
+
this.failed = true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export class ScopedLogger {
|
|
65
|
+
logger;
|
|
66
|
+
namespace;
|
|
67
|
+
constructor(logger, namespace) {
|
|
68
|
+
this.logger = logger;
|
|
69
|
+
this.namespace = namespace;
|
|
70
|
+
}
|
|
71
|
+
debug(message, data) {
|
|
72
|
+
this.logger.log("debug", this.namespace, message, data);
|
|
73
|
+
}
|
|
74
|
+
info(message, data) {
|
|
75
|
+
this.logger.log("info", this.namespace, message, data);
|
|
76
|
+
}
|
|
77
|
+
warn(message, data) {
|
|
78
|
+
this.logger.log("warn", this.namespace, message, data);
|
|
79
|
+
}
|
|
80
|
+
error(message, data) {
|
|
81
|
+
this.logger.log("error", this.namespace, message, data);
|
|
82
|
+
}
|
|
83
|
+
child(namespace) {
|
|
84
|
+
return this.logger.child(`${this.namespace}:${namespace}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Create `.devcc/` and self-ignore it, so devcc's own diagnostics never show up
|
|
89
|
+
* as untracked changes in the user's repository.
|
|
90
|
+
*/
|
|
91
|
+
function ensureLogDirectory(directory) {
|
|
92
|
+
mkdirSync(directory, { recursive: true });
|
|
93
|
+
const ignorePath = join(directory, ".gitignore");
|
|
94
|
+
if (!existsSync(ignorePath))
|
|
95
|
+
writeFileSync(ignorePath, "*\n", "utf8");
|
|
96
|
+
}
|
|
97
|
+
function safeSerialise(data) {
|
|
98
|
+
if (data instanceof Error)
|
|
99
|
+
return `${data.name}: ${data.message}`;
|
|
100
|
+
if (typeof data === "string")
|
|
101
|
+
return data;
|
|
102
|
+
try {
|
|
103
|
+
return JSON.stringify(data);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return String(data);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export function defaultLogFilePath(rootDir) {
|
|
110
|
+
return join(rootDir, ".devcc", "devcc.log");
|
|
111
|
+
}
|
|
112
|
+
export function createLogger(rootDir, level) {
|
|
113
|
+
const envLevel = process.env.DEVCC_LOG_LEVEL;
|
|
114
|
+
const resolved = level ?? (envLevel && isLogLevel(envLevel) ? envLevel : "info");
|
|
115
|
+
return new Logger({ level: resolved, filePath: defaultLogFilePath(rootDir) });
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/devcc/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC9E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEzC;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAU,CAAA;AAG/E,MAAM,YAAY,GAA6B;IAC7C,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,EAAE;IACR,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,GAAG;CACZ,CAAA;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAQ,UAAgC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAC1D,CAAC;AASD,MAAM,OAAO,MAAM;IACT,KAAK,CAAU;IACf,QAAQ,CAAe;IACvB,IAAI,CAAuD;IAC3D,MAAM,GAAG,KAAK,CAAA;IAEtB,YAAY,UAAyB,EAAE;QACrC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAAA;QACpC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAA;QACxC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;IAC1B,CAAC;IAED,QAAQ,CAAC,KAAe;QACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED,KAAK,CAAC,SAAiB;QACrB,OAAO,IAAI,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IAC1C,CAAC;IAED,OAAO,CAAC,KAAe;QACrB,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACxD,CAAC;IAED,GAAG,CAAC,KAAe,EAAE,SAAiB,EAAE,OAAe,EAAE,IAAc;QACrE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,QAAQ;YAAE,OAAM;QAEtD,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QACtC,MAAM,MAAM,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAA;QAClE,MAAM,IAAI,GAAG,GAAG,KAAK,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,KAAK,OAAO,GAAG,MAAM,EAAE,CAAA;QAE3F,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAExB,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM;YAAE,OAAM;QACzC,IAAI,CAAC;YACH,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;YAC1C,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,IAAI,EAAE,MAAM,CAAC,CAAA;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,sEAAsE;YACtE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QACpB,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,YAAY;IAEJ;IACA;IAFnB,YACmB,MAAc,EACd,SAAiB;QADjB,WAAM,GAAN,MAAM,CAAQ;QACd,cAAS,GAAT,SAAS,CAAQ;IACjC,CAAC;IAEJ,KAAK,CAAC,OAAe,EAAE,IAAc;QACnC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;IACzD,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAAc;QAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;IACxD,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAAc;QAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;IACxD,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAAc;QACnC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;IACzD,CAAC;IAED,KAAK,CAAC,SAAiB;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC,CAAA;IAC5D,CAAC;CACF;AAED;;;GAGG;AACH,SAAS,kBAAkB,CAAC,SAAiB;IAC3C,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;IAChD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,aAAa,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;AACvE,CAAC;AAED,SAAS,aAAa,CAAC,IAAa;IAClC,IAAI,IAAI,YAAY,KAAK;QAAE,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,CAAA;IACjE,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACzC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,KAAgB;IAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAA;IAC5C,MAAM,QAAQ,GAAa,KAAK,IAAI,CAAC,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IAC1F,OAAO,IAAI,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;AAC/E,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export declare const PACKAGE_MANAGERS: readonly ["pnpm", "yarn", "npm", "bun"];
|
|
2
|
+
export type PackageManager = (typeof PACKAGE_MANAGERS)[number];
|
|
3
|
+
export interface PackageManagerDetection {
|
|
4
|
+
manager: PackageManager;
|
|
5
|
+
/** How the decision was made - surfaced in the Settings view. */
|
|
6
|
+
source: "packageManager-field" | "lockfile" | "user-agent" | "default";
|
|
7
|
+
/** The lockfile that decided it, when applicable. */
|
|
8
|
+
evidence?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Parse the `packageManager` field of a package.json (corepack format,
|
|
12
|
+
* e.g. `pnpm@10.26.2+sha512...`).
|
|
13
|
+
*/
|
|
14
|
+
export declare function parsePackageManagerField(value: unknown): PackageManager | null;
|
|
15
|
+
/** Parse the `npm_config_user_agent` env var, e.g. `pnpm/10.26.2 npm/? node/v24`. */
|
|
16
|
+
export declare function parseUserAgent(userAgent: string | undefined): PackageManager | null;
|
|
17
|
+
export interface DetectPackageManagerInput {
|
|
18
|
+
rootDir: string;
|
|
19
|
+
packageJson?: Record<string, unknown> | null;
|
|
20
|
+
userAgent?: string | undefined;
|
|
21
|
+
/** Injected for tests. */
|
|
22
|
+
fileExists?: (path: string) => boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Detect the package manager, preferring explicit declarations over guesses:
|
|
26
|
+
* `packageManager` field -> lockfile -> the manager that launched us -> npm.
|
|
27
|
+
*/
|
|
28
|
+
export declare function detectPackageManager(input: DetectPackageManagerInput): PackageManagerDetection;
|
|
29
|
+
/** The argv needed to run a package.json script with the given manager. */
|
|
30
|
+
export declare function runScriptArgs(manager: PackageManager, script: string): string[];
|
|
31
|
+
/** Read and parse package.json, returning `null` when absent or invalid. */
|
|
32
|
+
export declare function readPackageJson(rootDir: string): Record<string, unknown> | null;
|
|
33
|
+
export interface PackageScript {
|
|
34
|
+
name: string;
|
|
35
|
+
command: string;
|
|
36
|
+
}
|
|
37
|
+
/** Extract `scripts` from a parsed package.json as a stable, sorted-by-declaration list. */
|
|
38
|
+
export declare function readScripts(packageJson: Record<string, unknown> | null): PackageScript[];
|
|
39
|
+
//# sourceMappingURL=packageManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageManager.d.ts","sourceRoot":"","sources":["../../../src/devcc/utils/packageManager.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,gBAAgB,yCAA0C,CAAA;AACvE,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE9D,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,cAAc,CAAA;IACvB,iEAAiE;IACjE,MAAM,EAAE,sBAAsB,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,CAAA;IACtE,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAeD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAI9E;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,IAAI,CAInF;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IAC5C,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,0BAA0B;IAC1B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CACvC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,GAAG,uBAAuB,CAgB9F;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAU/E;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAS/E;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,4FAA4F;AAC5F,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,aAAa,EAAE,CAMxF"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export const PACKAGE_MANAGERS = ["pnpm", "yarn", "npm", "bun"];
|
|
4
|
+
const LOCKFILES = [
|
|
5
|
+
{ file: "pnpm-lock.yaml", manager: "pnpm" },
|
|
6
|
+
{ file: "bun.lock", manager: "bun" },
|
|
7
|
+
{ file: "bun.lockb", manager: "bun" },
|
|
8
|
+
{ file: "yarn.lock", manager: "yarn" },
|
|
9
|
+
{ file: "package-lock.json", manager: "npm" },
|
|
10
|
+
{ file: "npm-shrinkwrap.json", manager: "npm" },
|
|
11
|
+
];
|
|
12
|
+
function isPackageManager(value) {
|
|
13
|
+
return PACKAGE_MANAGERS.includes(value);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Parse the `packageManager` field of a package.json (corepack format,
|
|
17
|
+
* e.g. `pnpm@10.26.2+sha512...`).
|
|
18
|
+
*/
|
|
19
|
+
export function parsePackageManagerField(value) {
|
|
20
|
+
if (typeof value !== "string")
|
|
21
|
+
return null;
|
|
22
|
+
const name = value.split("@")[0]?.trim().toLowerCase();
|
|
23
|
+
return name && isPackageManager(name) ? name : null;
|
|
24
|
+
}
|
|
25
|
+
/** Parse the `npm_config_user_agent` env var, e.g. `pnpm/10.26.2 npm/? node/v24`. */
|
|
26
|
+
export function parseUserAgent(userAgent) {
|
|
27
|
+
if (!userAgent)
|
|
28
|
+
return null;
|
|
29
|
+
const name = userAgent.split("/")[0]?.trim().toLowerCase();
|
|
30
|
+
return name && isPackageManager(name) ? name : null;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Detect the package manager, preferring explicit declarations over guesses:
|
|
34
|
+
* `packageManager` field -> lockfile -> the manager that launched us -> npm.
|
|
35
|
+
*/
|
|
36
|
+
export function detectPackageManager(input) {
|
|
37
|
+
const fileExists = input.fileExists ?? existsSync;
|
|
38
|
+
const declared = parsePackageManagerField(input.packageJson?.packageManager);
|
|
39
|
+
if (declared)
|
|
40
|
+
return { manager: declared, source: "packageManager-field" };
|
|
41
|
+
for (const { file, manager } of LOCKFILES) {
|
|
42
|
+
if (fileExists(join(input.rootDir, file))) {
|
|
43
|
+
return { manager, source: "lockfile", evidence: file };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const fromAgent = parseUserAgent(input.userAgent);
|
|
47
|
+
if (fromAgent)
|
|
48
|
+
return { manager: fromAgent, source: "user-agent" };
|
|
49
|
+
return { manager: "npm", source: "default" };
|
|
50
|
+
}
|
|
51
|
+
/** The argv needed to run a package.json script with the given manager. */
|
|
52
|
+
export function runScriptArgs(manager, script) {
|
|
53
|
+
switch (manager) {
|
|
54
|
+
case "npm":
|
|
55
|
+
return ["run", script];
|
|
56
|
+
case "yarn":
|
|
57
|
+
return [script];
|
|
58
|
+
case "pnpm":
|
|
59
|
+
case "bun":
|
|
60
|
+
return ["run", script];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Read and parse package.json, returning `null` when absent or invalid. */
|
|
64
|
+
export function readPackageJson(rootDir) {
|
|
65
|
+
const path = join(rootDir, "package.json");
|
|
66
|
+
try {
|
|
67
|
+
if (!existsSync(path))
|
|
68
|
+
return null;
|
|
69
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
70
|
+
return typeof parsed === "object" && parsed !== null ? parsed : null;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** Extract `scripts` from a parsed package.json as a stable, sorted-by-declaration list. */
|
|
77
|
+
export function readScripts(packageJson) {
|
|
78
|
+
const scripts = packageJson?.scripts;
|
|
79
|
+
if (typeof scripts !== "object" || scripts === null)
|
|
80
|
+
return [];
|
|
81
|
+
return Object.entries(scripts)
|
|
82
|
+
.filter((entry) => typeof entry[1] === "string")
|
|
83
|
+
.map(([name, command]) => ({ name, command }));
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=packageManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageManager.js","sourceRoot":"","sources":["../../../src/devcc/utils/packageManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Walk upwards from `startDir` looking for a project root marker.
|
|
3
|
+
* Falls back to `startDir` so the app always has somewhere to run.
|
|
4
|
+
*/
|
|
5
|
+
export declare function findProjectRoot(startDir?: string): string;
|
|
6
|
+
/** Directory holding devcc's own runtime artefacts (logs, future state). */
|
|
7
|
+
export declare function devccDir(rootDir: string): string;
|
|
8
|
+
/** Replace the home directory with `~` for compact display. */
|
|
9
|
+
export declare function tildify(path: string, home?: string): string;
|
|
10
|
+
/** Truncate a path from the left so the most specific segments stay visible. */
|
|
11
|
+
export declare function truncatePath(path: string, maxLength: number): string;
|
|
12
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/devcc/utils/paths.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,CAWxE;AAED,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,+DAA+D;AAC/D,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAyB,GAAG,MAAM,CAG3E;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAIpE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { dirname, join, resolve } from "node:path";
|
|
3
|
+
const PROJECT_MARKERS = ["package.json", ".git", "pnpm-workspace.yaml", "deno.json", "Cargo.toml"];
|
|
4
|
+
/**
|
|
5
|
+
* Walk upwards from `startDir` looking for a project root marker.
|
|
6
|
+
* Falls back to `startDir` so the app always has somewhere to run.
|
|
7
|
+
*/
|
|
8
|
+
export function findProjectRoot(startDir = process.cwd()) {
|
|
9
|
+
let current = resolve(startDir);
|
|
10
|
+
for (;;) {
|
|
11
|
+
for (const marker of PROJECT_MARKERS) {
|
|
12
|
+
if (existsSync(join(current, marker)))
|
|
13
|
+
return current;
|
|
14
|
+
}
|
|
15
|
+
const parent = dirname(current);
|
|
16
|
+
if (parent === current)
|
|
17
|
+
return resolve(startDir);
|
|
18
|
+
current = parent;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/** Directory holding devcc's own runtime artefacts (logs, future state). */
|
|
22
|
+
export function devccDir(rootDir) {
|
|
23
|
+
return join(rootDir, ".devcc");
|
|
24
|
+
}
|
|
25
|
+
/** Replace the home directory with `~` for compact display. */
|
|
26
|
+
export function tildify(path, home = process.env.HOME ?? "") {
|
|
27
|
+
if (home && path.startsWith(home))
|
|
28
|
+
return `~${path.slice(home.length)}`;
|
|
29
|
+
return path;
|
|
30
|
+
}
|
|
31
|
+
/** Truncate a path from the left so the most specific segments stay visible. */
|
|
32
|
+
export function truncatePath(path, maxLength) {
|
|
33
|
+
if (path.length <= maxLength)
|
|
34
|
+
return path;
|
|
35
|
+
if (maxLength <= 1)
|
|
36
|
+
return path.slice(-maxLength);
|
|
37
|
+
return `…${path.slice(-(maxLength - 1))}`;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/devcc/utils/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAElD,MAAM,eAAe,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,qBAAqB,EAAE,WAAW,EAAE,YAAY,CAAU,CAAA;AAE3G;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IAC9D,IAAI,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAE/B,SAAS,CAAC;QACR,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;YACrC,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAAE,OAAO,OAAO,CAAA;QACvD,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAC/B,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAA;QAChD,OAAO,GAAG,MAAM,CAAA;IAClB,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AAChC,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;IACjE,IAAI,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAA;IACvE,OAAO,IAAI,CAAA;AACb,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,SAAiB;IAC1D,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,IAAI,CAAA;IACzC,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAA;IACjD,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;AAC3C,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { KeyEvent } from "@opentui/core";
|
|
2
|
+
import type { KeyHint } from "../components/Footer.js";
|
|
3
|
+
import { type AppState, type ViewId } from "../core/state.js";
|
|
4
|
+
import { View, type ViewDeps } from "./View.js";
|
|
5
|
+
/**
|
|
6
|
+
* Rows rendered above the package list (summary + spacer).
|
|
7
|
+
*
|
|
8
|
+
* Fixed so the view and the palette command agree on what
|
|
9
|
+
* `ui.selection.dependencies` points at.
|
|
10
|
+
*/
|
|
11
|
+
export declare const DEPENDENCY_HEADER_ROWS = 2;
|
|
12
|
+
/** Map a selection index to an index into the package list. */
|
|
13
|
+
export declare function selectedPackageIndex(selection: number): number;
|
|
14
|
+
/**
|
|
15
|
+
* Outdated dependencies, grouped by how big the jump is.
|
|
16
|
+
*
|
|
17
|
+
* This is the only panel that never refreshes on a timer: it queries the
|
|
18
|
+
* registry over the network, so it runs when you ask it to (`r`) and not before.
|
|
19
|
+
*/
|
|
20
|
+
export declare class DependenciesView extends View {
|
|
21
|
+
readonly id: ViewId;
|
|
22
|
+
readonly title = "Dependencies";
|
|
23
|
+
private readonly list;
|
|
24
|
+
private packages;
|
|
25
|
+
constructor(deps: ViewDeps);
|
|
26
|
+
update(state: AppState): void;
|
|
27
|
+
handleKey(key: KeyEvent, state: AppState): boolean;
|
|
28
|
+
hints(): KeyHint[];
|
|
29
|
+
onActivate(state: AppState): void;
|
|
30
|
+
private firstPackageRow;
|
|
31
|
+
private summaryRow;
|
|
32
|
+
private updateSelected;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=DependenciesView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DependenciesView.d.ts","sourceRoot":"","sources":["../../../src/devcc/views/DependenciesView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AAGtD,OAAO,EAAgB,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAI3E,OAAO,EAAE,IAAI,EAAE,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAA;AAE/C;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAA;AAEvC,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;;;;GAKG;AACH,qBAAa,gBAAiB,SAAQ,IAAI;IACxC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAiB;IACpC,QAAQ,CAAC,KAAK,kBAAiB;IAE/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAwB;gBAE5B,IAAI,EAAE,QAAQ;IAM1B,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IA6DpB,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO;IA6BlD,KAAK,IAAI,OAAO,EAAE;IASlB,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAO1C,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,UAAU;YAiBJ,cAAc;CAK7B"}
|