@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 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/devcc/processes/graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export interface ProjectEntry {
|
|
2
|
+
/** Absolute path; the identity of a project. */
|
|
3
|
+
path: string;
|
|
4
|
+
name: string;
|
|
5
|
+
/** How devcc knows about it. */
|
|
6
|
+
source: "current" | "recent" | "configured" | "discovered";
|
|
7
|
+
/** Last time it was opened in devcc, for recents. */
|
|
8
|
+
lastOpenedAt?: Date;
|
|
9
|
+
hasGit: boolean;
|
|
10
|
+
hasPackageJson: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function isProjectDirectory(path: string, exists?: (p: string) => boolean): boolean;
|
|
13
|
+
/** Read `name` from a package.json, falling back to the directory name. */
|
|
14
|
+
export declare function projectNameFor(path: string): string;
|
|
15
|
+
export interface DiscoverOptions {
|
|
16
|
+
/** Directories whose immediate children are candidate projects. */
|
|
17
|
+
searchDirs: readonly string[];
|
|
18
|
+
/** Maximum entries to return per search directory. */
|
|
19
|
+
limit?: number;
|
|
20
|
+
readdir?: (dir: string) => string[];
|
|
21
|
+
exists?: (path: string) => boolean;
|
|
22
|
+
isDirectory?: (path: string) => boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Find sibling projects one level below each search directory.
|
|
26
|
+
*
|
|
27
|
+
* Deliberately shallow: a recursive walk of a developer's home directory is slow
|
|
28
|
+
* and finds far more than anyone wants in a picker.
|
|
29
|
+
*/
|
|
30
|
+
export declare function discoverProjects(options: DiscoverOptions): ProjectEntry[];
|
|
31
|
+
/** Where the cross-project recents list lives. */
|
|
32
|
+
export declare function recentsPath(home?: string): string;
|
|
33
|
+
export declare function readRecents(path?: string, limit?: number): ProjectEntry[];
|
|
34
|
+
/** Record a project as most-recently opened. Failure is never fatal. */
|
|
35
|
+
export declare function recordRecent(projectPath: string, path?: string, limit?: number): string | null;
|
|
36
|
+
export interface BuildProjectListOptions {
|
|
37
|
+
currentPath: string;
|
|
38
|
+
/** Explicit paths from project config. */
|
|
39
|
+
configured?: readonly string[];
|
|
40
|
+
/** Extra directories to scan for siblings. Defaults to the parent directory. */
|
|
41
|
+
searchDirs?: readonly string[];
|
|
42
|
+
recents?: readonly ProjectEntry[];
|
|
43
|
+
discovered?: readonly ProjectEntry[];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Merge the sources into one de-duplicated, ranked list:
|
|
47
|
+
* current project first, then recents, then configured, then discovered.
|
|
48
|
+
*/
|
|
49
|
+
export declare function buildProjectList(options: BuildProjectListOptions): ProjectEntry[];
|
|
50
|
+
/** Default search directories: the parent of the current project. */
|
|
51
|
+
export declare function defaultSearchDirs(currentPath: string): string[];
|
|
52
|
+
//# sourceMappingURL=ProjectRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectRegistry.d.ts","sourceRoot":"","sources":["../../../src/devcc/projects/ProjectRegistry.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,gCAAgC;IAChC,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,CAAA;IAC1D,qDAAqD;IACrD,YAAY,CAAC,EAAE,IAAI,CAAA;IACnB,MAAM,EAAE,OAAO,CAAA;IACf,cAAc,EAAE,OAAO,CAAA;CACxB;AAgBD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAoB,GAAG,OAAO,CAErG;AAED,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASnD;AAED,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;IAC7B,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EAAE,CAAA;IACnC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;IAClC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CACxC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,YAAY,EAAE,CAwCzE;AAMD,kDAAkD;AAClD,wBAAgB,WAAW,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,CAE5D;AAED,wBAAgB,WAAW,CAAC,IAAI,GAAE,MAAsB,EAAE,KAAK,SAAK,GAAG,YAAY,EAAE,CAyBpF;AAED,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,MAAsB,EAAE,KAAK,SAAK,GAAG,MAAM,GAAG,IAAI,CAezG;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC9B,gFAAgF;IAChF,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC9B,OAAO,CAAC,EAAE,SAAS,YAAY,EAAE,CAAA;IACjC,UAAU,CAAC,EAAE,SAAS,YAAY,EAAE,CAAA;CACrC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,YAAY,EAAE,CAwCjF;AAED,qEAAqE;AACrE,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAE/D"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
4
|
+
import { errorMessage } from "../utils/errors.js";
|
|
5
|
+
/** Directories that are never worth scanning into. */
|
|
6
|
+
const IGNORED_DIRECTORIES = new Set([
|
|
7
|
+
"node_modules",
|
|
8
|
+
".git",
|
|
9
|
+
".next",
|
|
10
|
+
"dist",
|
|
11
|
+
"build",
|
|
12
|
+
"target",
|
|
13
|
+
"vendor",
|
|
14
|
+
"coverage",
|
|
15
|
+
".turbo",
|
|
16
|
+
".cache",
|
|
17
|
+
]);
|
|
18
|
+
export function isProjectDirectory(path, exists = existsSync) {
|
|
19
|
+
return exists(join(path, "package.json")) || exists(join(path, ".git"));
|
|
20
|
+
}
|
|
21
|
+
/** Read `name` from a package.json, falling back to the directory name. */
|
|
22
|
+
export function projectNameFor(path) {
|
|
23
|
+
try {
|
|
24
|
+
const raw = JSON.parse(readFileSync(join(path, "package.json"), "utf8"));
|
|
25
|
+
const name = typeof raw === "object" && raw !== null ? raw.name : undefined;
|
|
26
|
+
if (typeof name === "string" && name.length > 0)
|
|
27
|
+
return name;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Fall through to the directory name.
|
|
31
|
+
}
|
|
32
|
+
return basename(path);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Find sibling projects one level below each search directory.
|
|
36
|
+
*
|
|
37
|
+
* Deliberately shallow: a recursive walk of a developer's home directory is slow
|
|
38
|
+
* and finds far more than anyone wants in a picker.
|
|
39
|
+
*/
|
|
40
|
+
export function discoverProjects(options) {
|
|
41
|
+
const readdir = options.readdir ?? ((dir) => readdirSync(dir));
|
|
42
|
+
const exists = options.exists ?? existsSync;
|
|
43
|
+
const isDirectory = options.isDirectory ?? ((path) => statSync(path).isDirectory());
|
|
44
|
+
const limit = options.limit ?? 200;
|
|
45
|
+
const found = new Map();
|
|
46
|
+
for (const searchDir of options.searchDirs) {
|
|
47
|
+
let entries;
|
|
48
|
+
try {
|
|
49
|
+
entries = readdir(searchDir);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
for (const entry of entries) {
|
|
55
|
+
if (found.size >= limit)
|
|
56
|
+
break;
|
|
57
|
+
if (entry.startsWith(".") || IGNORED_DIRECTORIES.has(entry))
|
|
58
|
+
continue;
|
|
59
|
+
const path = join(searchDir, entry);
|
|
60
|
+
try {
|
|
61
|
+
if (!isDirectory(path))
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (!isProjectDirectory(path, exists))
|
|
68
|
+
continue;
|
|
69
|
+
if (found.has(path))
|
|
70
|
+
continue;
|
|
71
|
+
found.set(path, {
|
|
72
|
+
path,
|
|
73
|
+
name: entry,
|
|
74
|
+
source: "discovered",
|
|
75
|
+
hasGit: exists(join(path, ".git")),
|
|
76
|
+
hasPackageJson: exists(join(path, "package.json")),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return [...found.values()];
|
|
81
|
+
}
|
|
82
|
+
/** Where the cross-project recents list lives. */
|
|
83
|
+
export function recentsPath(home = homedir()) {
|
|
84
|
+
return join(home, ".devcc", "recent-projects.json");
|
|
85
|
+
}
|
|
86
|
+
export function readRecents(path = recentsPath(), limit = 20) {
|
|
87
|
+
try {
|
|
88
|
+
if (!existsSync(path))
|
|
89
|
+
return [];
|
|
90
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
91
|
+
const entries = Array.isArray(parsed.projects) ? parsed.projects : [];
|
|
92
|
+
return entries
|
|
93
|
+
.map((entry) => {
|
|
94
|
+
const projectPath = typeof entry.path === "string" ? entry.path : null;
|
|
95
|
+
if (!projectPath)
|
|
96
|
+
return null;
|
|
97
|
+
const openedAt = typeof entry.lastOpenedAt === "string" ? new Date(entry.lastOpenedAt) : undefined;
|
|
98
|
+
return {
|
|
99
|
+
path: projectPath,
|
|
100
|
+
name: basename(projectPath),
|
|
101
|
+
source: "recent",
|
|
102
|
+
lastOpenedAt: openedAt && !Number.isNaN(openedAt.getTime()) ? openedAt : undefined,
|
|
103
|
+
hasGit: existsSync(join(projectPath, ".git")),
|
|
104
|
+
hasPackageJson: existsSync(join(projectPath, "package.json")),
|
|
105
|
+
};
|
|
106
|
+
})
|
|
107
|
+
.filter((entry) => entry !== null && existsSync(entry.path))
|
|
108
|
+
.slice(0, limit);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** Record a project as most-recently opened. Failure is never fatal. */
|
|
115
|
+
export function recordRecent(projectPath, path = recentsPath(), limit = 20) {
|
|
116
|
+
try {
|
|
117
|
+
const existing = readRecents(path, limit).filter((entry) => entry.path !== projectPath);
|
|
118
|
+
const next = [{ path: projectPath, lastOpenedAt: new Date().toISOString() }].concat(existing.map((entry) => ({
|
|
119
|
+
path: entry.path,
|
|
120
|
+
lastOpenedAt: (entry.lastOpenedAt ?? new Date()).toISOString(),
|
|
121
|
+
})));
|
|
122
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
123
|
+
writeFileSync(path, `${JSON.stringify({ projects: next.slice(0, limit) }, null, 2)}\n`, "utf8");
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
return errorMessage(error);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Merge the sources into one de-duplicated, ranked list:
|
|
132
|
+
* current project first, then recents, then configured, then discovered.
|
|
133
|
+
*/
|
|
134
|
+
export function buildProjectList(options) {
|
|
135
|
+
const current = resolve(options.currentPath);
|
|
136
|
+
const byPath = new Map();
|
|
137
|
+
const add = (entry) => {
|
|
138
|
+
const path = resolve(entry.path);
|
|
139
|
+
const existing = byPath.get(path);
|
|
140
|
+
if (existing) {
|
|
141
|
+
// Keep the highest-priority source but carry over a known open time.
|
|
142
|
+
if (entry.lastOpenedAt && !existing.lastOpenedAt)
|
|
143
|
+
existing.lastOpenedAt = entry.lastOpenedAt;
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
byPath.set(path, { ...entry, path });
|
|
147
|
+
};
|
|
148
|
+
add({
|
|
149
|
+
path: current,
|
|
150
|
+
name: projectNameFor(current),
|
|
151
|
+
source: "current",
|
|
152
|
+
hasGit: existsSync(join(current, ".git")),
|
|
153
|
+
hasPackageJson: existsSync(join(current, "package.json")),
|
|
154
|
+
});
|
|
155
|
+
for (const entry of options.recents ?? [])
|
|
156
|
+
add(entry);
|
|
157
|
+
for (const configured of options.configured ?? []) {
|
|
158
|
+
const path = resolve(current, configured);
|
|
159
|
+
if (!existsSync(path))
|
|
160
|
+
continue;
|
|
161
|
+
add({
|
|
162
|
+
path,
|
|
163
|
+
name: basename(path),
|
|
164
|
+
source: "configured",
|
|
165
|
+
hasGit: existsSync(join(path, ".git")),
|
|
166
|
+
hasPackageJson: existsSync(join(path, "package.json")),
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
for (const entry of options.discovered ?? [])
|
|
170
|
+
add(entry);
|
|
171
|
+
return [...byPath.values()];
|
|
172
|
+
}
|
|
173
|
+
/** Default search directories: the parent of the current project. */
|
|
174
|
+
export function defaultSearchDirs(currentPath) {
|
|
175
|
+
return [dirname(resolve(currentPath))];
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=ProjectRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectRegistry.js","sourceRoot":"","sources":["../../../src/devcc/projects/ProjectRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { TypedEmitter } from "../core/events.js";
|
|
2
|
+
import { DevccError } from "../utils/errors.js";
|
|
3
|
+
import type { ScopedLogger } from "../utils/logger.js";
|
|
4
|
+
import type { ServiceActionContext, ServiceAdapter, ServiceSnapshot } from "./types.js";
|
|
5
|
+
export type ServiceManagerEvents = {
|
|
6
|
+
"service:list": [ServiceSnapshot[]];
|
|
7
|
+
"service:changed": [ServiceSnapshot];
|
|
8
|
+
"service:error": [DevccError];
|
|
9
|
+
};
|
|
10
|
+
export interface ServiceManagerOptions {
|
|
11
|
+
logger: ScopedLogger;
|
|
12
|
+
/** Poll interval for status refreshes. */
|
|
13
|
+
intervalMs?: number;
|
|
14
|
+
/** Per-adapter budget; a slow adapter must not stall the others. */
|
|
15
|
+
statusTimeoutMs?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Runs detection once at startup (off the critical path) and then polls the
|
|
19
|
+
* adapters that reported themselves relevant.
|
|
20
|
+
*
|
|
21
|
+
* All adapters are queried concurrently with an individual timeout, so one
|
|
22
|
+
* unresponsive daemon cannot freeze the panel.
|
|
23
|
+
*/
|
|
24
|
+
export declare class ServiceManager extends TypedEmitter<ServiceManagerEvents> {
|
|
25
|
+
private readonly options;
|
|
26
|
+
private readonly adapters;
|
|
27
|
+
private readonly detected;
|
|
28
|
+
private readonly snapshots;
|
|
29
|
+
private timer;
|
|
30
|
+
private refreshing;
|
|
31
|
+
private readonly intervalMs;
|
|
32
|
+
private readonly statusTimeoutMs;
|
|
33
|
+
constructor(options: ServiceManagerOptions);
|
|
34
|
+
register(adapter: ServiceAdapter): void;
|
|
35
|
+
registerAll(adapters: readonly ServiceAdapter[]): void;
|
|
36
|
+
list(): ServiceSnapshot[];
|
|
37
|
+
get(id: string): ServiceSnapshot | undefined;
|
|
38
|
+
getAdapter(id: string): ServiceAdapter | undefined;
|
|
39
|
+
/** Ask every adapter whether it is relevant here. Failures mean "not relevant". */
|
|
40
|
+
detectAll(): Promise<ServiceSnapshot[]>;
|
|
41
|
+
start(): void;
|
|
42
|
+
stop(): void;
|
|
43
|
+
/** Refresh all detected adapters concurrently. Overlapping calls are skipped. */
|
|
44
|
+
refresh(): Promise<ServiceSnapshot[]>;
|
|
45
|
+
runAction(id: string, action: "start" | "stop" | "restart", context: ServiceActionContext): Promise<void>;
|
|
46
|
+
private setSnapshot;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=ServiceManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServiceManager.d.ts","sourceRoot":"","sources":["../../../src/devcc/services/ServiceManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,UAAU,EAA8B,MAAM,oBAAoB,CAAA;AAE3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,eAAe,EAAiB,MAAM,YAAY,CAAA;AAEtG,MAAM,MAAM,oBAAoB,GAAG;IACjC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,CAAA;IACnC,iBAAiB,EAAE,CAAC,eAAe,CAAC,CAAA;IACpC,eAAe,EAAE,CAAC,UAAU,CAAC,CAAA;CAC9B,CAAA;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,YAAY,CAAA;IACpB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,oEAAoE;IACpE,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAQD;;;;;;GAMG;AACH,qBAAa,cAAe,SAAQ,YAAY,CAAC,oBAAoB,CAAC;IASxD,OAAO,CAAC,QAAQ,CAAC,OAAO;IARpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;IAC7D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqC;IAC/D,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;gBAEX,OAAO,EAAE,qBAAqB;IAM3D,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAIvC,WAAW,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,GAAG,IAAI;IAItD,IAAI,IAAI,eAAe,EAAE;IAIzB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI5C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIlD,mFAAmF;IAC7E,SAAS,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAuB7C,KAAK,IAAI,IAAI;IAMb,IAAI,IAAI,IAAI;IAMZ,iFAAiF;IAC3E,OAAO,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAoCrC,SAAS,CACb,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,EACpC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC;IAqBhB,OAAO,CAAC,WAAW;CAapB"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { TypedEmitter } from "../core/events.js";
|
|
2
|
+
import { DevccError, errorMessage, toDevccError } from "../utils/errors.js";
|
|
3
|
+
import { withTimeout } from "../utils/exec.js";
|
|
4
|
+
const STALLED_STATUS = {
|
|
5
|
+
state: "unknown",
|
|
6
|
+
detail: "status check timed out",
|
|
7
|
+
checkedAt: new Date(0),
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Runs detection once at startup (off the critical path) and then polls the
|
|
11
|
+
* adapters that reported themselves relevant.
|
|
12
|
+
*
|
|
13
|
+
* All adapters are queried concurrently with an individual timeout, so one
|
|
14
|
+
* unresponsive daemon cannot freeze the panel.
|
|
15
|
+
*/
|
|
16
|
+
export class ServiceManager extends TypedEmitter {
|
|
17
|
+
options;
|
|
18
|
+
adapters = new Map();
|
|
19
|
+
detected = new Set();
|
|
20
|
+
snapshots = new Map();
|
|
21
|
+
timer = null;
|
|
22
|
+
refreshing = false;
|
|
23
|
+
intervalMs;
|
|
24
|
+
statusTimeoutMs;
|
|
25
|
+
constructor(options) {
|
|
26
|
+
super();
|
|
27
|
+
this.options = options;
|
|
28
|
+
this.intervalMs = options.intervalMs ?? 5_000;
|
|
29
|
+
this.statusTimeoutMs = options.statusTimeoutMs ?? 4_000;
|
|
30
|
+
}
|
|
31
|
+
register(adapter) {
|
|
32
|
+
this.adapters.set(adapter.id, adapter);
|
|
33
|
+
}
|
|
34
|
+
registerAll(adapters) {
|
|
35
|
+
for (const adapter of adapters)
|
|
36
|
+
this.register(adapter);
|
|
37
|
+
}
|
|
38
|
+
list() {
|
|
39
|
+
return [...this.snapshots.values()];
|
|
40
|
+
}
|
|
41
|
+
get(id) {
|
|
42
|
+
return this.snapshots.get(id);
|
|
43
|
+
}
|
|
44
|
+
getAdapter(id) {
|
|
45
|
+
return this.adapters.get(id);
|
|
46
|
+
}
|
|
47
|
+
/** Ask every adapter whether it is relevant here. Failures mean "not relevant". */
|
|
48
|
+
async detectAll() {
|
|
49
|
+
const results = await Promise.all([...this.adapters.values()].map(async (adapter) => {
|
|
50
|
+
try {
|
|
51
|
+
const relevant = await withTimeout(adapter.detect(), this.statusTimeoutMs, false);
|
|
52
|
+
return { adapter, relevant };
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
this.options.logger.debug("service detect failed", { id: adapter.id, error: errorMessage(error) });
|
|
56
|
+
return { adapter, relevant: false };
|
|
57
|
+
}
|
|
58
|
+
}));
|
|
59
|
+
this.detected.clear();
|
|
60
|
+
for (const { adapter, relevant } of results) {
|
|
61
|
+
if (relevant)
|
|
62
|
+
this.detected.add(adapter.id);
|
|
63
|
+
else
|
|
64
|
+
this.snapshots.delete(adapter.id);
|
|
65
|
+
}
|
|
66
|
+
await this.refresh();
|
|
67
|
+
return this.list();
|
|
68
|
+
}
|
|
69
|
+
start() {
|
|
70
|
+
if (this.timer)
|
|
71
|
+
return;
|
|
72
|
+
this.timer = setInterval(() => void this.refresh(), this.intervalMs);
|
|
73
|
+
this.timer.unref?.();
|
|
74
|
+
}
|
|
75
|
+
stop() {
|
|
76
|
+
if (!this.timer)
|
|
77
|
+
return;
|
|
78
|
+
clearInterval(this.timer);
|
|
79
|
+
this.timer = null;
|
|
80
|
+
}
|
|
81
|
+
/** Refresh all detected adapters concurrently. Overlapping calls are skipped. */
|
|
82
|
+
async refresh() {
|
|
83
|
+
if (this.refreshing)
|
|
84
|
+
return this.list();
|
|
85
|
+
this.refreshing = true;
|
|
86
|
+
try {
|
|
87
|
+
const targets = [...this.detected]
|
|
88
|
+
.map((id) => this.adapters.get(id))
|
|
89
|
+
.filter((a) => !!a);
|
|
90
|
+
await Promise.all(targets.map(async (adapter) => {
|
|
91
|
+
const status = await withTimeout(adapter.getStatus().catch((error) => {
|
|
92
|
+
this.options.logger.debug("service status failed", {
|
|
93
|
+
id: adapter.id,
|
|
94
|
+
error: errorMessage(error),
|
|
95
|
+
});
|
|
96
|
+
return {
|
|
97
|
+
state: "unknown",
|
|
98
|
+
detail: errorMessage(error),
|
|
99
|
+
checkedAt: new Date(),
|
|
100
|
+
};
|
|
101
|
+
}), this.statusTimeoutMs, { ...STALLED_STATUS, checkedAt: new Date() });
|
|
102
|
+
this.setSnapshot(adapter, status);
|
|
103
|
+
}));
|
|
104
|
+
this.emit("service:list", this.list());
|
|
105
|
+
return this.list();
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
this.refreshing = false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async runAction(id, action, context) {
|
|
112
|
+
const adapter = this.adapters.get(id);
|
|
113
|
+
if (!adapter)
|
|
114
|
+
throw new DevccError({ scope: "service", message: `Unknown service "${id}"` });
|
|
115
|
+
const handler = adapter[action];
|
|
116
|
+
if (!handler) {
|
|
117
|
+
throw new DevccError({ scope: "service", message: `${adapter.name} does not support ${action}` });
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
await handler.call(adapter, context);
|
|
121
|
+
this.options.logger.info("service action ok", { id, action });
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
const devccError = toDevccError(error, "service", `${adapter.name} ${action} failed`);
|
|
125
|
+
this.emit("service:error", devccError);
|
|
126
|
+
throw devccError;
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
await this.refresh();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
setSnapshot(adapter, status) {
|
|
133
|
+
const snapshot = {
|
|
134
|
+
id: adapter.id,
|
|
135
|
+
name: adapter.name,
|
|
136
|
+
category: adapter.category,
|
|
137
|
+
status,
|
|
138
|
+
canStart: typeof adapter.start === "function",
|
|
139
|
+
canStop: typeof adapter.stop === "function",
|
|
140
|
+
canRestart: typeof adapter.restart === "function",
|
|
141
|
+
};
|
|
142
|
+
this.snapshots.set(adapter.id, snapshot);
|
|
143
|
+
this.emit("service:changed", snapshot);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=ServiceManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServiceManager.js","sourceRoot":"","sources":["../../../src/devcc/services/ServiceManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ServiceActionContext, ServiceAdapter, ServiceStatus, ServiceStatusItem } from "./types.js";
|
|
2
|
+
export declare function findComposeFile(rootDir: string, exists?: (path: string) => boolean): string | null;
|
|
3
|
+
/**
|
|
4
|
+
* `docker compose ps --format json` emits either a JSON array or one JSON
|
|
5
|
+
* object per line depending on the CLI version. Handle both.
|
|
6
|
+
*/
|
|
7
|
+
export declare function parseComposePs(output: string): ServiceStatusItem[];
|
|
8
|
+
export interface DockerServiceOptions {
|
|
9
|
+
rootDir: string;
|
|
10
|
+
timeoutMs?: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Docker / Docker Compose adapter.
|
|
14
|
+
*
|
|
15
|
+
* `stop` runs `docker compose stop` (not `down`): stopping must never remove
|
|
16
|
+
* containers, networks or volumes without an explicit confirmation.
|
|
17
|
+
*/
|
|
18
|
+
export declare class DockerService implements ServiceAdapter {
|
|
19
|
+
private readonly options;
|
|
20
|
+
readonly id = "docker";
|
|
21
|
+
readonly name = "Docker Compose";
|
|
22
|
+
readonly category: "container";
|
|
23
|
+
private composeFile;
|
|
24
|
+
private readonly timeoutMs;
|
|
25
|
+
constructor(options: DockerServiceOptions);
|
|
26
|
+
get hasCompose(): boolean;
|
|
27
|
+
detect(): Promise<boolean>;
|
|
28
|
+
getStatus(): Promise<ServiceStatus>;
|
|
29
|
+
start(): Promise<void>;
|
|
30
|
+
stop(): Promise<void>;
|
|
31
|
+
restart(): Promise<void>;
|
|
32
|
+
/** `docker compose down` removes containers and networks, so it must be confirmed. */
|
|
33
|
+
down(context: ServiceActionContext, removeVolumes?: boolean): Promise<void>;
|
|
34
|
+
private requireCompose;
|
|
35
|
+
private compose;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=docker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../../src/devcc/services/docker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,oBAAoB,EACpB,cAAc,EAEd,aAAa,EACb,iBAAiB,EAClB,MAAM,YAAY,CAAA;AAUnB,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAoB,GAC7C,MAAM,GAAG,IAAI,CAKf;AAWD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAiClE;AAoBD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;GAKG;AACH,qBAAa,aAAc,YAAW,cAAc;IAQtC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAPpC,QAAQ,CAAC,EAAE,YAAW;IACtB,QAAQ,CAAC,IAAI,oBAAmB;IAChC,QAAQ,CAAC,QAAQ,EAAG,WAAW,CAAS;IAExC,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAEL,OAAO,EAAE,oBAAoB;IAK1D,IAAI,UAAU,IAAI,OAAO,CAExB;IAEK,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAM1B,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC;IA2CnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B,sFAAsF;IAChF,IAAI,CAAC,OAAO,EAAE,oBAAoB,EAAE,aAAa,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/E,OAAO,CAAC,cAAc;YAMR,OAAO;CAUtB"}
|