@developers-homelab/runestone-cli 1.0.0

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 (120) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +107 -0
  3. package/bin/runestone +17 -0
  4. package/dist/cli.d.ts +4 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +78 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/certs.d.ts +3 -0
  9. package/dist/commands/certs.d.ts.map +1 -0
  10. package/dist/commands/certs.js +110 -0
  11. package/dist/commands/certs.js.map +1 -0
  12. package/dist/commands/down.d.ts +3 -0
  13. package/dist/commands/down.d.ts.map +1 -0
  14. package/dist/commands/down.js +59 -0
  15. package/dist/commands/down.js.map +1 -0
  16. package/dist/commands/keys.d.ts +3 -0
  17. package/dist/commands/keys.d.ts.map +1 -0
  18. package/dist/commands/keys.js +51 -0
  19. package/dist/commands/keys.js.map +1 -0
  20. package/dist/commands/setup.d.ts +15 -0
  21. package/dist/commands/setup.d.ts.map +1 -0
  22. package/dist/commands/setup.js +641 -0
  23. package/dist/commands/setup.js.map +1 -0
  24. package/dist/commands/status.d.ts +3 -0
  25. package/dist/commands/status.d.ts.map +1 -0
  26. package/dist/commands/status.js +57 -0
  27. package/dist/commands/status.js.map +1 -0
  28. package/dist/commands/stop.d.ts +3 -0
  29. package/dist/commands/stop.d.ts.map +1 -0
  30. package/dist/commands/stop.js +25 -0
  31. package/dist/commands/stop.js.map +1 -0
  32. package/dist/commands/up.d.ts +3 -0
  33. package/dist/commands/up.d.ts.map +1 -0
  34. package/dist/commands/up.js +72 -0
  35. package/dist/commands/up.js.map +1 -0
  36. package/dist/i18n/index.d.ts +316 -0
  37. package/dist/i18n/index.d.ts.map +1 -0
  38. package/dist/i18n/index.js +378 -0
  39. package/dist/i18n/index.js.map +1 -0
  40. package/dist/services/cert-manager.d.ts +38 -0
  41. package/dist/services/cert-manager.d.ts.map +1 -0
  42. package/dist/services/cert-manager.js +260 -0
  43. package/dist/services/cert-manager.js.map +1 -0
  44. package/dist/services/docker-compose.d.ts +24 -0
  45. package/dist/services/docker-compose.d.ts.map +1 -0
  46. package/dist/services/docker-compose.js +132 -0
  47. package/dist/services/docker-compose.js.map +1 -0
  48. package/dist/services/docker-exec.d.ts +10 -0
  49. package/dist/services/docker-exec.d.ts.map +1 -0
  50. package/dist/services/docker-exec.js +39 -0
  51. package/dist/services/docker-exec.js.map +1 -0
  52. package/dist/services/docker-network.d.ts +13 -0
  53. package/dist/services/docker-network.d.ts.map +1 -0
  54. package/dist/services/docker-network.js +58 -0
  55. package/dist/services/docker-network.js.map +1 -0
  56. package/dist/services/docker-run.d.ts +18 -0
  57. package/dist/services/docker-run.d.ts.map +1 -0
  58. package/dist/services/docker-run.js +56 -0
  59. package/dist/services/docker-run.js.map +1 -0
  60. package/dist/services/docker-volume.d.ts +12 -0
  61. package/dist/services/docker-volume.d.ts.map +1 -0
  62. package/dist/services/docker-volume.js +57 -0
  63. package/dist/services/docker-volume.js.map +1 -0
  64. package/dist/services/domain-checker.d.ts +29 -0
  65. package/dist/services/domain-checker.d.ts.map +1 -0
  66. package/dist/services/domain-checker.js +149 -0
  67. package/dist/services/domain-checker.js.map +1 -0
  68. package/dist/services/port-checker.d.ts +3 -0
  69. package/dist/services/port-checker.d.ts.map +1 -0
  70. package/dist/services/port-checker.js +45 -0
  71. package/dist/services/port-checker.js.map +1 -0
  72. package/dist/services/ssh-manager.d.ts +7 -0
  73. package/dist/services/ssh-manager.d.ts.map +1 -0
  74. package/dist/services/ssh-manager.js +125 -0
  75. package/dist/services/ssh-manager.js.map +1 -0
  76. package/dist/utils/command.d.ts +6 -0
  77. package/dist/utils/command.d.ts.map +1 -0
  78. package/dist/utils/command.js +34 -0
  79. package/dist/utils/command.js.map +1 -0
  80. package/dist/utils/docker-checker.d.ts +5 -0
  81. package/dist/utils/docker-checker.d.ts.map +1 -0
  82. package/dist/utils/docker-checker.js +31 -0
  83. package/dist/utils/docker-checker.js.map +1 -0
  84. package/dist/utils/env-loader.d.ts +32 -0
  85. package/dist/utils/env-loader.d.ts.map +1 -0
  86. package/dist/utils/env-loader.js +113 -0
  87. package/dist/utils/env-loader.js.map +1 -0
  88. package/dist/utils/logger.d.ts +8 -0
  89. package/dist/utils/logger.d.ts.map +1 -0
  90. package/dist/utils/logger.js +25 -0
  91. package/dist/utils/logger.js.map +1 -0
  92. package/dist/utils/logo.d.ts +2 -0
  93. package/dist/utils/logo.d.ts.map +1 -0
  94. package/dist/utils/logo.js +15 -0
  95. package/dist/utils/logo.js.map +1 -0
  96. package/dist/utils/os-detector.d.ts +10 -0
  97. package/dist/utils/os-detector.d.ts.map +1 -0
  98. package/dist/utils/os-detector.js +76 -0
  99. package/dist/utils/os-detector.js.map +1 -0
  100. package/dist/utils/path-helpers.d.ts +9 -0
  101. package/dist/utils/path-helpers.d.ts.map +1 -0
  102. package/dist/utils/path-helpers.js +96 -0
  103. package/dist/utils/path-helpers.js.map +1 -0
  104. package/dist/utils/port-checker.d.ts +3 -0
  105. package/dist/utils/port-checker.d.ts.map +1 -0
  106. package/dist/utils/port-checker.js +45 -0
  107. package/dist/utils/port-checker.js.map +1 -0
  108. package/dist/utils/project-files.d.ts +7 -0
  109. package/dist/utils/project-files.d.ts.map +1 -0
  110. package/dist/utils/project-files.js +97 -0
  111. package/dist/utils/project-files.js.map +1 -0
  112. package/dist/utils/spawn.d.ts +7 -0
  113. package/dist/utils/spawn.d.ts.map +1 -0
  114. package/dist/utils/spawn.js +31 -0
  115. package/dist/utils/spawn.js.map +1 -0
  116. package/dist/utils/tool-state.d.ts +16 -0
  117. package/dist/utils/tool-state.d.ts.map +1 -0
  118. package/dist/utils/tool-state.js +86 -0
  119. package/dist/utils/tool-state.js.map +1 -0
  120. package/package.json +63 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 cymondez
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,107 @@
1
+ # Runestone
2
+
3
+ English | [繁體中文](https://github.com/cymondez/runestone/blob/main/docs/README/README.zh-TW.md) | [日本語](https://github.com/cymondez/runestone/blob/main/docs/README/README.ja-JP.md)
4
+
5
+ ![logo](https://raw.githubusercontent.com/cymondez/runestone/main/logos/runestone_icon_gray_large.png)
6
+
7
+ This project was forked from [druidfi/stonehenge 5.2](https://github.com/druidfi/stonehenge).
8
+ The main change is replacing Makefile-based installation and management with an npm global tool that is easier to use across platforms.
9
+ If you like this project, please also support the original idea by starring [druidfi/stonehenge 5.2](https://github.com/druidfi/stonehenge).
10
+
11
+ ## Introduction
12
+
13
+ 1. Local frontend and backend projects can be tested with `SSL certificates` and a `local domain`, avoiding many localhost-related issues.
14
+ 2. Ports 80 and 443 can be reused, reducing port conflicts between multiple local projects.
15
+ 3. You do not need to edit the hosts file just to use a `local domain`.
16
+
17
+ ## Core Components
18
+
19
+ - traefik: Reverse proxy that routes requests to the matching project.
20
+ - mailpit: SMTP testing tool that captures and displays sent emails.
21
+ - npm tool: Command line tool for managing and running Runestone.
22
+ - @mkcert/node: Generates locally trusted SSL certificates.
23
+
24
+ ## Requirements
25
+
26
+ - Latest Ubuntu LTS, or Windows 10/11 with WSL2 installed.
27
+ - Docker 29.0+ with Docker Compose V2.
28
+ - Node.js 22.0+.
29
+
30
+ ## Installation And Usage
31
+
32
+ ### Install
33
+
34
+ ```bash
35
+ npm install -g @developers-homelab/runestone-cli
36
+ ```
37
+
38
+ ### Start
39
+
40
+ The first time you run it, an interactive setup wizard will appear. To change settings later, run `runestone setup`.
41
+
42
+ ```bash
43
+ runestone up
44
+ ```
45
+
46
+ ### Stop Or Shut Down
47
+
48
+ Note: If Runestone was not stopped before shutting down your system, it will start automatically on the next boot.
49
+
50
+ Stop:
51
+
52
+ ```bash
53
+ runestone stop
54
+ ```
55
+
56
+ Shut down (stop and remove containers):
57
+
58
+ ```bash
59
+ runestone down
60
+ ```
61
+
62
+ ## Certificate Management
63
+
64
+ ### List Certificates
65
+
66
+ Shows the certificate list from the `.runestone/certs` directory.
67
+
68
+ ```bash
69
+ runestone certs list
70
+ ```
71
+
72
+ ### Add Certificate
73
+
74
+ Adds a certificate generated by `@mkcert/node` to the `.runestone/certs` directory and creates the dynamic Traefik configuration.
75
+
76
+ ```bash
77
+ runestone certs create <domain>
78
+ ```
79
+
80
+ ### Remove Certificate
81
+
82
+ Removes the certificate from the `.runestone/certs` directory and deletes the matching dynamic configuration.
83
+
84
+ ```bash
85
+ runestone certs remove <domain>
86
+ ```
87
+
88
+ ## More Help
89
+
90
+ ```bash
91
+ runestone --help
92
+ ```
93
+
94
+ ## Todo
95
+
96
+ - [ ] Test on macOS (M1/M2/M3/M4/M5).
97
+
98
+ ## References
99
+
100
+ - [druidfi/stonehenge](https://github.com/druidfi/stonehenge)
101
+ - [axllent/mailpit](https://github.com/axllent/mailpit)
102
+ - [FiloSottile/mkcert](https://github.com/FiloSottile/mkcert)
103
+ - [traefik.io](https://traefik.io/)
104
+
105
+ ## License
106
+
107
+ [MIT License](LICENSE)
package/bin/runestone ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { resolve } = require('path');
4
+
5
+ // Suppress experimental warnings
6
+ process.env.NODE_ENV = process.env.NODE_ENV || 'production';
7
+
8
+ try {
9
+ require(resolve(__dirname, '../dist/cli.js')).run();
10
+ } catch (error) {
11
+ if (error.code === 'MODULE_NOT_FOUND') {
12
+ console.error('Error: dist/ directory not found. Run `npm run build` first.');
13
+ } else {
14
+ console.error('Error:', error.message);
15
+ }
16
+ process.exit(1);
17
+ }
package/dist/cli.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ export declare function createProgram(): Command;
3
+ export declare function run(argv?: string[]): void;
4
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,wBAAgB,aAAa,IAAI,OAAO,CAYvC;AAED,wBAAgB,GAAG,CAAC,IAAI,WAAe,GAAG,IAAI,CAE7C"}
package/dist/cli.js ADDED
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createProgram = createProgram;
37
+ exports.run = run;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const certs_1 = require("./commands/certs");
41
+ const down_1 = require("./commands/down");
42
+ const keys_1 = require("./commands/keys");
43
+ const setup_1 = require("./commands/setup");
44
+ const status_1 = require("./commands/status");
45
+ const stop_1 = require("./commands/stop");
46
+ const up_1 = require("./commands/up");
47
+ const i18n_1 = require("./i18n");
48
+ const command_1 = require("./utils/command");
49
+ function packageVersion() {
50
+ try {
51
+ const packagePath = path.resolve(__dirname, '..', 'package.json');
52
+ const parsed = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
53
+ return parsed.version ?? '0.0.0';
54
+ }
55
+ catch {
56
+ return '0.0.0';
57
+ }
58
+ }
59
+ function createProgram() {
60
+ return (0, command_1.createCommand)()
61
+ .name('runestone')
62
+ .description((0, i18n_1.t)('cli.description'))
63
+ .version(packageVersion())
64
+ .addCommand((0, setup_1.createSetupCommand)())
65
+ .addCommand((0, up_1.createUpCommand)())
66
+ .addCommand((0, stop_1.createStopCommand)())
67
+ .addCommand((0, down_1.createDownCommand)())
68
+ .addCommand((0, status_1.createStatusCommand)())
69
+ .addCommand((0, certs_1.createCertsCommand)())
70
+ .addCommand((0, keys_1.createKeysCommand)());
71
+ }
72
+ function run(argv = process.argv) {
73
+ createProgram().parse(argv);
74
+ }
75
+ if (require.main === module) {
76
+ run();
77
+ }
78
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,sCAYC;AAED,kBAEC;AAtCD,uCAAyB;AACzB,2CAA6B;AAC7B,4CAAsD;AACtD,0CAAoD;AACpD,0CAAoD;AACpD,4CAAsD;AACtD,8CAAwD;AACxD,0CAAoD;AACpD,sCAAgD;AAChD,iCAA2B;AAC3B,6CAAgD;AAEhD,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAyB,CAAC;QACxF,OAAO,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAgB,aAAa;IAC3B,OAAO,IAAA,uBAAa,GAAE;SACnB,IAAI,CAAC,WAAW,CAAC;SACjB,WAAW,CAAC,IAAA,QAAC,EAAC,iBAAiB,CAAC,CAAC;SACjC,OAAO,CAAC,cAAc,EAAE,CAAC;SACzB,UAAU,CAAC,IAAA,0BAAkB,GAAE,CAAC;SAChC,UAAU,CAAC,IAAA,oBAAe,GAAE,CAAC;SAC7B,UAAU,CAAC,IAAA,wBAAiB,GAAE,CAAC;SAC/B,UAAU,CAAC,IAAA,wBAAiB,GAAE,CAAC;SAC/B,UAAU,CAAC,IAAA,4BAAmB,GAAE,CAAC;SACjC,UAAU,CAAC,IAAA,0BAAkB,GAAE,CAAC;SAChC,UAAU,CAAC,IAAA,wBAAiB,GAAE,CAAC,CAAC;AACrC,CAAC;AAED,SAAgB,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;IACrC,aAAa,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,GAAG,EAAE,CAAC;AACR,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createCertsCommand(): Command;
3
+ //# sourceMappingURL=certs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"certs.d.ts","sourceRoot":"","sources":["../../src/commands/certs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+CpC,wBAAgB,kBAAkB,IAAI,OAAO,CA2E5C"}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCertsCommand = createCertsCommand;
4
+ const cert_manager_1 = require("../services/cert-manager");
5
+ const docker_compose_1 = require("../services/docker-compose");
6
+ const env_loader_1 = require("../utils/env-loader");
7
+ const logger_1 = require("../utils/logger");
8
+ const i18n_1 = require("../i18n");
9
+ const command_1 = require("../utils/command");
10
+ function shouldRestartOnWindows(changed) {
11
+ return changed && process.platform === 'win32';
12
+ }
13
+ function restartIfRunningOnWindows(composePath, changed) {
14
+ if (!shouldRestartOnWindows(changed)) {
15
+ return;
16
+ }
17
+ const running = docker_compose_1.composeService.ps(composePath).some((container) => container.State === 'running');
18
+ if (!running) {
19
+ logger_1.logger.warn('Certificate files changed, but no runestone container is running to restart.');
20
+ return;
21
+ }
22
+ logger_1.logger.info('Restarting runestone container so Docker Desktop picks up certificate/config changes');
23
+ docker_compose_1.composeService.restart(composePath);
24
+ }
25
+ function formatCertificateTable(items, options) {
26
+ const rows = items.map((item) => [
27
+ item.status,
28
+ item.sans.length > 0 ? item.sans.join(', ') : '-',
29
+ item.issuer || '-',
30
+ item.validUntil || '-',
31
+ item.expiry || '-'
32
+ ]);
33
+ const allRows = options.header ? [['Status', 'SANs', 'Issuer', 'Valid Until', 'Expiry'], ...rows] : rows;
34
+ const widths = allRows.reduce((next, row) => row.map((cell, index) => Math.max(next[index] ?? 0, cell.length)), []);
35
+ return allRows
36
+ .map((row) => row.map((cell, index) => cell.padEnd(widths[index])).join(' ').trimEnd())
37
+ .join('\n');
38
+ }
39
+ function createCertsCommand() {
40
+ const command = (0, command_1.createCommand)('certs')
41
+ .alias('cert')
42
+ .description((0, i18n_1.t)('commands.certs.description'));
43
+ command
44
+ .addCommand((0, command_1.createCommand)('create')
45
+ .alias('c')
46
+ .description((0, i18n_1.t)('commands.certs.create.description'))
47
+ .argument('<domain>', (0, i18n_1.t)('arguments.domain.create'))
48
+ .action(async (domain) => {
49
+ try {
50
+ const config = env_loader_1.envLoader.load();
51
+ const result = await (0, cert_manager_1.createDomainCertificate)(config.PROJECT_DIR, domain);
52
+ restartIfRunningOnWindows(config.COMPOSE_FILE_PATH, result.certificateChanged || result.dynamicConfigChanged);
53
+ logger_1.logger.success(`Certificate configuration ready for '${result.artifacts.domain}'`);
54
+ console.log(` Certificate: ${result.artifacts.certFile}`);
55
+ console.log(` Key: ${result.artifacts.keyFile}`);
56
+ console.log(` Traefik TLS config: ${result.artifacts.dynamicConfigFile}`);
57
+ }
58
+ catch (error) {
59
+ const message = error instanceof Error ? error.message : String(error);
60
+ logger_1.logger.error(`Failed to create certificate: ${message}`);
61
+ process.exit(1);
62
+ }
63
+ }));
64
+ command
65
+ .addCommand((0, command_1.createCommand)('list')
66
+ .alias('ls')
67
+ .description((0, i18n_1.t)('commands.certs.list.description'))
68
+ .option('--no-header', (0, i18n_1.t)('options.noHeader.description'))
69
+ .action((options) => {
70
+ try {
71
+ const config = env_loader_1.envLoader.load();
72
+ const table = formatCertificateTable((0, cert_manager_1.listDomainCertificates)(config.PROJECT_DIR), { header: options.header });
73
+ if (table) {
74
+ console.log(table);
75
+ }
76
+ }
77
+ catch (error) {
78
+ const message = error instanceof Error ? error.message : String(error);
79
+ logger_1.logger.error(`Failed to list certificates: ${message}`);
80
+ process.exit(1);
81
+ }
82
+ }));
83
+ command
84
+ .addCommand((0, command_1.createCommand)('remove')
85
+ .alias('rm')
86
+ .alias('del')
87
+ .description((0, i18n_1.t)('commands.certs.remove.description'))
88
+ .argument('<domain>', (0, i18n_1.t)('arguments.domain.remove'))
89
+ .action((domain) => {
90
+ try {
91
+ const config = env_loader_1.envLoader.load();
92
+ const result = (0, cert_manager_1.removeDomainCertificate)(config.PROJECT_DIR, domain);
93
+ const changed = result.certificateChanged || result.dynamicConfigChanged;
94
+ restartIfRunningOnWindows(config.COMPOSE_FILE_PATH, changed);
95
+ if (changed) {
96
+ logger_1.logger.success(`Certificate configuration removed for '${result.artifacts.domain}'`);
97
+ }
98
+ else {
99
+ logger_1.logger.warn(`No certificate configuration found for '${result.artifacts.domain}'`);
100
+ }
101
+ }
102
+ catch (error) {
103
+ const message = error instanceof Error ? error.message : String(error);
104
+ logger_1.logger.error(`Failed to remove certificate: ${message}`);
105
+ process.exit(1);
106
+ }
107
+ }));
108
+ return command;
109
+ }
110
+ //# sourceMappingURL=certs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"certs.js","sourceRoot":"","sources":["../../src/commands/certs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createDownCommand(): Command;
3
+ //# sourceMappingURL=down.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"down.d.ts","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,wBAAgB,iBAAiB,IAAI,OAAO,CA4C3C"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDownCommand = createDownCommand;
4
+ const docker_compose_1 = require("../services/docker-compose");
5
+ const docker_network_1 = require("../services/docker-network");
6
+ const docker_volume_1 = require("../services/docker-volume");
7
+ const env_loader_1 = require("../utils/env-loader");
8
+ const logger_1 = require("../utils/logger");
9
+ const i18n_1 = require("../i18n");
10
+ const command_1 = require("../utils/command");
11
+ function ignoreMissingResource(error) {
12
+ const message = error instanceof Error ? error.message : String(error);
13
+ return /not found|no such/i.test(message);
14
+ }
15
+ function createDownCommand() {
16
+ return (0, command_1.createCommand)('down')
17
+ .description((0, i18n_1.t)('commands.down.description'))
18
+ .option('--remove-network', (0, i18n_1.t)('options.removeNetwork.description'))
19
+ .option('--remove-volumes', (0, i18n_1.t)('options.removeVolumes.description'))
20
+ .option('--purge', (0, i18n_1.t)('options.purge.description'))
21
+ .action((options) => {
22
+ try {
23
+ const config = env_loader_1.envLoader.load();
24
+ const removeVolumes = Boolean(options.removeVolumes || options.purge);
25
+ const removeNetwork = Boolean(options.removeNetwork || options.purge);
26
+ docker_compose_1.composeService.down(config.COMPOSE_FILE_PATH, {
27
+ removeVolumes,
28
+ removeImages: Boolean(options.purge)
29
+ });
30
+ if (removeNetwork) {
31
+ try {
32
+ docker_network_1.networkService.removeNetwork(config.NETWORK_NAME);
33
+ }
34
+ catch (error) {
35
+ if (!ignoreMissingResource(error)) {
36
+ throw error;
37
+ }
38
+ }
39
+ }
40
+ if (removeVolumes) {
41
+ try {
42
+ docker_volume_1.volumeService.removeVolume(config.SSH_VOLUME_NAME);
43
+ }
44
+ catch (error) {
45
+ if (!ignoreMissingResource(error)) {
46
+ throw error;
47
+ }
48
+ }
49
+ }
50
+ logger_1.logger.success(options.purge ? 'Full purge complete.' : 'Teardown complete.');
51
+ }
52
+ catch (error) {
53
+ const message = error instanceof Error ? error.message : String(error);
54
+ logger_1.logger.error(`Failed to tear down environment: ${message}`);
55
+ process.exit(1);
56
+ }
57
+ });
58
+ }
59
+ //# sourceMappingURL=down.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"down.js","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":";;AAoBA,8CA4CC;AA/DD,+DAA4D;AAC5D,+DAA4D;AAC5D,6DAA0D;AAC1D,oDAAgD;AAChD,4CAAyC;AACzC,kCAA4B;AAC5B,8CAAiD;AAQjD,SAAS,qBAAqB,CAAC,KAAc;IAC3C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,SAAgB,iBAAiB;IAC/B,OAAO,IAAA,uBAAa,EAAC,MAAM,CAAC;SACzB,WAAW,CAAC,IAAA,QAAC,EAAC,2BAA2B,CAAC,CAAC;SAC3C,MAAM,CAAC,kBAAkB,EAAE,IAAA,QAAC,EAAC,mCAAmC,CAAC,CAAC;SAClE,MAAM,CAAC,kBAAkB,EAAE,IAAA,QAAC,EAAC,mCAAmC,CAAC,CAAC;SAClE,MAAM,CAAC,SAAS,EAAE,IAAA,QAAC,EAAC,2BAA2B,CAAC,CAAC;SACjD,MAAM,CAAC,CAAC,OAAoB,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,sBAAS,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;YACtE,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;YAEtE,+BAAc,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE;gBAC5C,aAAa;gBACb,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;aACrC,CAAC,CAAC;YAEH,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,CAAC;oBACH,+BAAc,CAAC,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBACpD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;wBAClC,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,CAAC;oBACH,6BAAa,CAAC,YAAY,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBACrD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;wBAClC,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,CAAC;YACH,CAAC;YAED,eAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;QAChF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,eAAM,CAAC,KAAK,CAAC,oCAAoC,OAAO,EAAE,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createKeysCommand(): Command;
3
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/commands/keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,iBAAiB,IAAI,OAAO,CA0C3C"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createKeysCommand = createKeysCommand;
4
+ const kleur_1 = require("kleur");
5
+ const ssh_manager_1 = require("../services/ssh-manager");
6
+ const env_loader_1 = require("../utils/env-loader");
7
+ const logger_1 = require("../utils/logger");
8
+ const i18n_1 = require("../i18n");
9
+ const command_1 = require("../utils/command");
10
+ function createKeysCommand() {
11
+ const command = (0, command_1.createCommand)('keys')
12
+ .description((0, i18n_1.t)('commands.keys.description'));
13
+ command
14
+ .addCommand((0, command_1.createCommand)('ls')
15
+ .alias('list')
16
+ .description((0, i18n_1.t)('commands.keys.ls.description'))
17
+ .action(() => {
18
+ try {
19
+ const config = env_loader_1.envLoader.load();
20
+ const keys = ssh_manager_1.sshManager.listKeys(config.SSH_VOLUME_NAME);
21
+ if (keys.length === 0) {
22
+ logger_1.logger.warn('No injected SSH keys found.');
23
+ return;
24
+ }
25
+ keys.forEach((key) => console.log(` ${(0, kleur_1.green)('+')} ${key}`));
26
+ }
27
+ catch (error) {
28
+ const message = error instanceof Error ? error.message : String(error);
29
+ logger_1.logger.error(`Failed to list SSH keys: ${message}`);
30
+ process.exit(1);
31
+ }
32
+ }));
33
+ command
34
+ .addCommand((0, command_1.createCommand)('add')
35
+ .description((0, i18n_1.t)('commands.keys.add.description'))
36
+ .argument('<path>', (0, i18n_1.t)('arguments.keyPath'))
37
+ .action((keyPath) => {
38
+ try {
39
+ const config = env_loader_1.envLoader.load();
40
+ ssh_manager_1.sshManager.addKey(keyPath, config.SSH_VOLUME_NAME);
41
+ logger_1.logger.success('SSH key added successfully.');
42
+ }
43
+ catch (error) {
44
+ const message = error instanceof Error ? error.message : String(error);
45
+ logger_1.logger.error(`Failed to add SSH key: ${message}`);
46
+ process.exit(1);
47
+ }
48
+ }));
49
+ return command;
50
+ }
51
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/commands/keys.ts"],"names":[],"mappings":";;AAQA,8CA0CC;AAjDD,iCAA8B;AAC9B,yDAAqD;AACrD,oDAAgD;AAChD,4CAAyC;AACzC,kCAA4B;AAC5B,8CAAiD;AAEjD,SAAgB,iBAAiB;IAC/B,MAAM,OAAO,GAAG,IAAA,uBAAa,EAAC,MAAM,CAAC;SAClC,WAAW,CAAC,IAAA,QAAC,EAAC,2BAA2B,CAAC,CAAC,CAAC;IAE/C,OAAO;SACJ,UAAU,CAAC,IAAA,uBAAa,EAAC,IAAI,CAAC;SAC9B,KAAK,CAAC,MAAM,CAAC;SACb,WAAW,CAAC,IAAA,QAAC,EAAC,8BAA8B,CAAC,CAAC;SAC9C,MAAM,CAAC,GAAG,EAAE;QACX,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,sBAAS,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,wBAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YACzD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,eAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;gBAC3C,OAAO;YACT,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAA,aAAK,EAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,eAAM,CAAC,KAAK,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC,CAAC;IAEN,OAAO;SACJ,UAAU,CAAC,IAAA,uBAAa,EAAC,KAAK,CAAC;SAC/B,WAAW,CAAC,IAAA,QAAC,EAAC,+BAA+B,CAAC,CAAC;SAC/C,QAAQ,CAAC,QAAQ,EAAE,IAAA,QAAC,EAAC,mBAAmB,CAAC,CAAC;SAC1C,MAAM,CAAC,CAAC,OAAe,EAAE,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,sBAAS,CAAC,IAAI,EAAE,CAAC;YAChC,wBAAU,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;YACnD,eAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,eAAM,CAAC,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC,CAAC;IAEN,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { Command } from 'commander';
2
+ import { RunestoneEnv } from '../utils/env-loader';
3
+ export interface SetupOptions {
4
+ envPath?: string;
5
+ project?: string;
6
+ }
7
+ declare function enableBackHotkey(prompt: unknown, canBack: boolean): void;
8
+ export declare const setupPromptTestHooks: {
9
+ enableBackHotkey: typeof enableBackHotkey;
10
+ STEP_BACK: symbol;
11
+ };
12
+ export declare function runSetup(options?: SetupOptions): Promise<RunestoneEnv>;
13
+ export declare function createSetupCommand(): Command;
14
+ export {};
15
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,OAAO,EAAyB,YAAY,EAAa,MAAM,qBAAqB,CAAC;AAYrF,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA8GD,iBAAS,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAmBjE;AAED,eAAO,MAAM,oBAAoB;;;CAGhC,CAAC;AAiVF,wBAAsB,QAAQ,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAoShF;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAY5C"}