@rotorsoft/contui 1.0.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 (94) hide show
  1. package/README.md +192 -0
  2. package/dist/components/App.d.ts +3 -0
  3. package/dist/components/App.d.ts.map +1 -0
  4. package/dist/components/App.js +365 -0
  5. package/dist/components/App.js.map +1 -0
  6. package/dist/components/ConfirmDialog.d.ts +9 -0
  7. package/dist/components/ConfirmDialog.d.ts.map +1 -0
  8. package/dist/components/ConfirmDialog.js +14 -0
  9. package/dist/components/ConfirmDialog.js.map +1 -0
  10. package/dist/components/ContainersView.d.ts +10 -0
  11. package/dist/components/ContainersView.d.ts.map +1 -0
  12. package/dist/components/ContainersView.js +46 -0
  13. package/dist/components/ContainersView.js.map +1 -0
  14. package/dist/components/CreateDialog.d.ts +9 -0
  15. package/dist/components/CreateDialog.d.ts.map +1 -0
  16. package/dist/components/CreateDialog.js +19 -0
  17. package/dist/components/CreateDialog.js.map +1 -0
  18. package/dist/components/DetailView.d.ts +9 -0
  19. package/dist/components/DetailView.d.ts.map +1 -0
  20. package/dist/components/DetailView.js +38 -0
  21. package/dist/components/DetailView.js.map +1 -0
  22. package/dist/components/HelpOverlay.d.ts +7 -0
  23. package/dist/components/HelpOverlay.d.ts.map +1 -0
  24. package/dist/components/HelpOverlay.js +54 -0
  25. package/dist/components/HelpOverlay.js.map +1 -0
  26. package/dist/components/ImagesView.d.ts +10 -0
  27. package/dist/components/ImagesView.d.ts.map +1 -0
  28. package/dist/components/ImagesView.js +17 -0
  29. package/dist/components/ImagesView.js.map +1 -0
  30. package/dist/components/LogsView.d.ts +9 -0
  31. package/dist/components/LogsView.d.ts.map +1 -0
  32. package/dist/components/LogsView.js +7 -0
  33. package/dist/components/LogsView.js.map +1 -0
  34. package/dist/components/NetworksView.d.ts +10 -0
  35. package/dist/components/NetworksView.d.ts.map +1 -0
  36. package/dist/components/NetworksView.js +16 -0
  37. package/dist/components/NetworksView.js.map +1 -0
  38. package/dist/components/PullDialog.d.ts +8 -0
  39. package/dist/components/PullDialog.d.ts.map +1 -0
  40. package/dist/components/PullDialog.js +19 -0
  41. package/dist/components/PullDialog.js.map +1 -0
  42. package/dist/components/SearchInput.d.ts +9 -0
  43. package/dist/components/SearchInput.d.ts.map +1 -0
  44. package/dist/components/SearchInput.js +7 -0
  45. package/dist/components/SearchInput.js.map +1 -0
  46. package/dist/components/StatusBar.d.ts +13 -0
  47. package/dist/components/StatusBar.d.ts.map +1 -0
  48. package/dist/components/StatusBar.js +31 -0
  49. package/dist/components/StatusBar.js.map +1 -0
  50. package/dist/components/TabBar.d.ts +8 -0
  51. package/dist/components/TabBar.d.ts.map +1 -0
  52. package/dist/components/TabBar.js +13 -0
  53. package/dist/components/TabBar.js.map +1 -0
  54. package/dist/components/Table.d.ts +16 -0
  55. package/dist/components/Table.d.ts.map +1 -0
  56. package/dist/components/Table.js +19 -0
  57. package/dist/components/Table.js.map +1 -0
  58. package/dist/components/VolumesView.d.ts +10 -0
  59. package/dist/components/VolumesView.d.ts.map +1 -0
  60. package/dist/components/VolumesView.js +16 -0
  61. package/dist/components/VolumesView.js.map +1 -0
  62. package/dist/hooks/useContainerData.d.ts +13 -0
  63. package/dist/hooks/useContainerData.d.ts.map +1 -0
  64. package/dist/hooks/useContainerData.js +46 -0
  65. package/dist/hooks/useContainerData.js.map +1 -0
  66. package/dist/hooks/useKeyboard.d.ts +18 -0
  67. package/dist/hooks/useKeyboard.d.ts.map +1 -0
  68. package/dist/hooks/useKeyboard.js +122 -0
  69. package/dist/hooks/useKeyboard.js.map +1 -0
  70. package/dist/hooks/useReleaseCheck.d.ts +15 -0
  71. package/dist/hooks/useReleaseCheck.d.ts.map +1 -0
  72. package/dist/hooks/useReleaseCheck.js +60 -0
  73. package/dist/hooks/useReleaseCheck.js.map +1 -0
  74. package/dist/index.d.ts +3 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +18 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/services/container-cli.d.ts +33 -0
  79. package/dist/services/container-cli.d.ts.map +1 -0
  80. package/dist/services/container-cli.js +241 -0
  81. package/dist/services/container-cli.js.map +1 -0
  82. package/dist/services/health-check.d.ts +8 -0
  83. package/dist/services/health-check.d.ts.map +1 -0
  84. package/dist/services/health-check.js +59 -0
  85. package/dist/services/health-check.js.map +1 -0
  86. package/dist/types/index.d.ts +79 -0
  87. package/dist/types/index.d.ts.map +1 -0
  88. package/dist/types/index.js +2 -0
  89. package/dist/types/index.js.map +1 -0
  90. package/dist/utils/app-version.d.ts +2 -0
  91. package/dist/utils/app-version.d.ts.map +1 -0
  92. package/dist/utils/app-version.js +18 -0
  93. package/dist/utils/app-version.js.map +1 -0
  94. package/package.json +70 -0
@@ -0,0 +1,59 @@
1
+ import { exec } from "child_process";
2
+ import { promisify } from "util";
3
+ const execAsync = promisify(exec);
4
+ const CLI_COMMAND = "container";
5
+ export async function checkCliInstalled() {
6
+ try {
7
+ const { stdout } = await execAsync(`which ${CLI_COMMAND}`);
8
+ if (!stdout.trim()) {
9
+ return { installed: false };
10
+ }
11
+ const { stdout: version } = await execAsync(`${CLI_COMMAND} --version`);
12
+ return { installed: true, version: version.trim() };
13
+ }
14
+ catch {
15
+ return { installed: false };
16
+ }
17
+ }
18
+ export async function checkServiceRunning() {
19
+ try {
20
+ // Use 'ls' command - macOS container CLI uses 'ls' not 'ps'
21
+ await execAsync(`${CLI_COMMAND} ls`, { timeout: 5000 });
22
+ return true;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ export async function performHealthCheck() {
29
+ const cliCheck = await checkCliInstalled();
30
+ if (!cliCheck.installed) {
31
+ return {
32
+ cliInstalled: false,
33
+ serviceRunning: false,
34
+ error: "The 'container' CLI is not installed. Please install it to use this application.\n\n" +
35
+ "On macOS, you can use Homebrew:\n" +
36
+ " brew install container\n\n" +
37
+ "Or download from the official website.",
38
+ };
39
+ }
40
+ const serviceRunning = await checkServiceRunning();
41
+ if (!serviceRunning) {
42
+ return {
43
+ cliInstalled: true,
44
+ cliVersion: cliCheck.version,
45
+ serviceRunning: false,
46
+ error: "The container service is not running. Please start it to use this application.\n\n" +
47
+ "You can start the service with:\n" +
48
+ " container system start\n\n" +
49
+ "Or verify by running:\n" +
50
+ " container ps",
51
+ };
52
+ }
53
+ return {
54
+ cliInstalled: true,
55
+ cliVersion: cliCheck.version,
56
+ serviceRunning: true,
57
+ };
58
+ }
59
+ //# sourceMappingURL=health-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-check.js","sourceRoot":"","sources":["../../src/services/health-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,WAAW,GAAG,WAAW,CAAC;AAEhC,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC9B,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,WAAW,YAAY,CAAC,CAAC;QACxE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,CAAC;QACH,4DAA4D;QAC5D,MAAM,SAAS,CAAC,GAAG,WAAW,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAE3C,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACxB,OAAO;YACL,YAAY,EAAE,KAAK;YACnB,cAAc,EAAE,KAAK;YACrB,KAAK,EACH,sFAAsF;gBACtF,mCAAmC;gBACnC,8BAA8B;gBAC9B,wCAAwC;SAC3C,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAEnD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO;YACL,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,QAAQ,CAAC,OAAO;YAC5B,cAAc,EAAE,KAAK;YACrB,KAAK,EACH,oFAAoF;gBACpF,mCAAmC;gBACnC,8BAA8B;gBAC9B,yBAAyB;gBACzB,gBAAgB;SACnB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,QAAQ,CAAC,OAAO;QAC5B,cAAc,EAAE,IAAI;KACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,79 @@
1
+ export interface Container {
2
+ id: string;
3
+ name: string;
4
+ image: string;
5
+ status: ContainerStatus;
6
+ state: string;
7
+ ports: PortMapping[];
8
+ created: string;
9
+ command?: string;
10
+ }
11
+ export type ContainerStatus = "running" | "stopped" | "paused" | "restarting" | "created" | "dead";
12
+ export interface PortMapping {
13
+ hostPort: number;
14
+ containerPort: number;
15
+ protocol: "tcp" | "udp";
16
+ }
17
+ export interface Image {
18
+ id: string;
19
+ repository: string;
20
+ tag: string;
21
+ size: string;
22
+ created: string;
23
+ reference: string;
24
+ }
25
+ export interface Network {
26
+ id: string;
27
+ name: string;
28
+ driver: string;
29
+ scope: string;
30
+ ipam?: {
31
+ subnet?: string;
32
+ gateway?: string;
33
+ };
34
+ }
35
+ export interface Volume {
36
+ name: string;
37
+ driver: string;
38
+ mountpoint: string;
39
+ scope: string;
40
+ created?: string;
41
+ }
42
+ export interface ContainerDetails extends Container {
43
+ networkSettings?: {
44
+ ipAddress?: string;
45
+ gateway?: string;
46
+ networks?: Record<string, {
47
+ ipAddress?: string;
48
+ }>;
49
+ };
50
+ mounts?: Array<{
51
+ type: string;
52
+ source: string;
53
+ destination: string;
54
+ }>;
55
+ config?: {
56
+ env?: string[];
57
+ workingDir?: string;
58
+ entrypoint?: string[];
59
+ cmd?: string[];
60
+ };
61
+ }
62
+ export interface HealthStatus {
63
+ cliInstalled: boolean;
64
+ cliVersion?: string;
65
+ serviceRunning: boolean;
66
+ error?: string;
67
+ }
68
+ export type Tab = "containers" | "images" | "networks" | "volumes";
69
+ export interface AppState {
70
+ activeTab: Tab;
71
+ selectedIndex: number;
72
+ searchQuery: string;
73
+ showHelp: boolean;
74
+ showLogs: boolean;
75
+ showInspect: boolean;
76
+ error?: string;
77
+ loading: boolean;
78
+ }
79
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,SAAS,GAAG,MAAM,CAAC;AAEnG,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,KAAK,GAAG,KAAK,CAAC;CACzB;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,eAAe,CAAC,EAAE;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACnD,CAAC;IACF,MAAM,CAAC,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,MAAM,CAAC,EAAE;QACP,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,GAAG,GAAG,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAEnE,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,GAAG,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare function getAppVersion(): string;
2
+ //# sourceMappingURL=app-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-version.d.ts","sourceRoot":"","sources":["../../src/utils/app-version.ts"],"names":[],"mappings":"AAeA,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
@@ -0,0 +1,18 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ function readVersionFromPackageJson() {
5
+ try {
6
+ const packagePath = resolve(dirname(fileURLToPath(import.meta.url)), "../../package.json");
7
+ const contents = readFileSync(packagePath, "utf8");
8
+ const parsed = JSON.parse(contents);
9
+ return parsed.version ?? null;
10
+ }
11
+ catch {
12
+ return null;
13
+ }
14
+ }
15
+ export function getAppVersion() {
16
+ return process.env.npm_package_version ?? readVersionFromPackageJson() ?? "unknown";
17
+ }
18
+ //# sourceMappingURL=app-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-version.js","sourceRoot":"","sources":["../../src/utils/app-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,SAAS,0BAA0B;IACjC,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAC3F,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAyB,CAAC;QAC5D,OAAO,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,0BAA0B,EAAE,IAAI,SAAS,CAAC;AACtF,CAAC"}
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "@rotorsoft/contui",
3
+ "version": "1.0.1",
4
+ "description": "Terminal UI for macOS native container management",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "contui": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "publishConfig": {
14
+ "access": "public"
15
+ },
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "start": "node dist/index.js",
19
+ "dev": "tsx src/index.tsx",
20
+ "typecheck": "tsc --noEmit",
21
+ "lint": "eslint src --ext .ts,.tsx",
22
+ "lint:fix": "eslint src --ext .ts,.tsx --fix",
23
+ "format": "prettier --write \"src/**/*.{ts,tsx}\"",
24
+ "test": "NODE_OPTIONS='--experimental-vm-modules' jest",
25
+ "test:watch": "NODE_OPTIONS='--experimental-vm-modules' jest --watch",
26
+ "test:coverage": "NODE_OPTIONS='--experimental-vm-modules' jest --coverage",
27
+ "prepare": "husky"
28
+ },
29
+ "keywords": [
30
+ "container",
31
+ "docker",
32
+ "tui",
33
+ "terminal",
34
+ "macos"
35
+ ],
36
+ "author": "",
37
+ "license": "MIT",
38
+ "dependencies": {
39
+ "ink": "^5.0.1",
40
+ "ink-select-input": "^6.0.0",
41
+ "ink-spinner": "^5.0.0",
42
+ "ink-text-input": "^6.0.0",
43
+ "react": "^18.3.1"
44
+ },
45
+ "devDependencies": {
46
+ "@commitlint/cli": "^19.6.1",
47
+ "@commitlint/config-conventional": "^19.6.0",
48
+ "@eslint/js": "^9.17.0",
49
+ "@semantic-release/changelog": "^6.0.3",
50
+ "@semantic-release/git": "^10.0.1",
51
+ "@types/jest": "^29.5.14",
52
+ "@types/node": "^22.10.2",
53
+ "@types/react": "^18.3.12",
54
+ "eslint": "^9.17.0",
55
+ "eslint-plugin-react": "^7.37.2",
56
+ "eslint-plugin-react-hooks": "^5.1.0",
57
+ "husky": "^9.1.7",
58
+ "ink-testing-library": "^4.0.0",
59
+ "jest": "^29.7.0",
60
+ "prettier": "^3.4.2",
61
+ "semantic-release": "^24.2.1",
62
+ "ts-jest": "^29.2.5",
63
+ "tsx": "^4.19.2",
64
+ "typescript": "^5.7.2",
65
+ "typescript-eslint": "^8.18.0"
66
+ },
67
+ "engines": {
68
+ "node": ">=18.0.0"
69
+ }
70
+ }