@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.
- package/LICENSE +21 -0
- package/README.md +107 -0
- package/bin/runestone +17 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +78 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/certs.d.ts +3 -0
- package/dist/commands/certs.d.ts.map +1 -0
- package/dist/commands/certs.js +110 -0
- package/dist/commands/certs.js.map +1 -0
- package/dist/commands/down.d.ts +3 -0
- package/dist/commands/down.d.ts.map +1 -0
- package/dist/commands/down.js +59 -0
- package/dist/commands/down.js.map +1 -0
- package/dist/commands/keys.d.ts +3 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +51 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/setup.d.ts +15 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +641 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +57 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +3 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +25 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/up.d.ts +3 -0
- package/dist/commands/up.d.ts.map +1 -0
- package/dist/commands/up.js +72 -0
- package/dist/commands/up.js.map +1 -0
- package/dist/i18n/index.d.ts +316 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +378 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/services/cert-manager.d.ts +38 -0
- package/dist/services/cert-manager.d.ts.map +1 -0
- package/dist/services/cert-manager.js +260 -0
- package/dist/services/cert-manager.js.map +1 -0
- package/dist/services/docker-compose.d.ts +24 -0
- package/dist/services/docker-compose.d.ts.map +1 -0
- package/dist/services/docker-compose.js +132 -0
- package/dist/services/docker-compose.js.map +1 -0
- package/dist/services/docker-exec.d.ts +10 -0
- package/dist/services/docker-exec.d.ts.map +1 -0
- package/dist/services/docker-exec.js +39 -0
- package/dist/services/docker-exec.js.map +1 -0
- package/dist/services/docker-network.d.ts +13 -0
- package/dist/services/docker-network.d.ts.map +1 -0
- package/dist/services/docker-network.js +58 -0
- package/dist/services/docker-network.js.map +1 -0
- package/dist/services/docker-run.d.ts +18 -0
- package/dist/services/docker-run.d.ts.map +1 -0
- package/dist/services/docker-run.js +56 -0
- package/dist/services/docker-run.js.map +1 -0
- package/dist/services/docker-volume.d.ts +12 -0
- package/dist/services/docker-volume.d.ts.map +1 -0
- package/dist/services/docker-volume.js +57 -0
- package/dist/services/docker-volume.js.map +1 -0
- package/dist/services/domain-checker.d.ts +29 -0
- package/dist/services/domain-checker.d.ts.map +1 -0
- package/dist/services/domain-checker.js +149 -0
- package/dist/services/domain-checker.js.map +1 -0
- package/dist/services/port-checker.d.ts +3 -0
- package/dist/services/port-checker.d.ts.map +1 -0
- package/dist/services/port-checker.js +45 -0
- package/dist/services/port-checker.js.map +1 -0
- package/dist/services/ssh-manager.d.ts +7 -0
- package/dist/services/ssh-manager.d.ts.map +1 -0
- package/dist/services/ssh-manager.js +125 -0
- package/dist/services/ssh-manager.js.map +1 -0
- package/dist/utils/command.d.ts +6 -0
- package/dist/utils/command.d.ts.map +1 -0
- package/dist/utils/command.js +34 -0
- package/dist/utils/command.js.map +1 -0
- package/dist/utils/docker-checker.d.ts +5 -0
- package/dist/utils/docker-checker.d.ts.map +1 -0
- package/dist/utils/docker-checker.js +31 -0
- package/dist/utils/docker-checker.js.map +1 -0
- package/dist/utils/env-loader.d.ts +32 -0
- package/dist/utils/env-loader.d.ts.map +1 -0
- package/dist/utils/env-loader.js +113 -0
- package/dist/utils/env-loader.js.map +1 -0
- package/dist/utils/logger.d.ts +8 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +25 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/logo.d.ts +2 -0
- package/dist/utils/logo.d.ts.map +1 -0
- package/dist/utils/logo.js +15 -0
- package/dist/utils/logo.js.map +1 -0
- package/dist/utils/os-detector.d.ts +10 -0
- package/dist/utils/os-detector.d.ts.map +1 -0
- package/dist/utils/os-detector.js +76 -0
- package/dist/utils/os-detector.js.map +1 -0
- package/dist/utils/path-helpers.d.ts +9 -0
- package/dist/utils/path-helpers.d.ts.map +1 -0
- package/dist/utils/path-helpers.js +96 -0
- package/dist/utils/path-helpers.js.map +1 -0
- package/dist/utils/port-checker.d.ts +3 -0
- package/dist/utils/port-checker.d.ts.map +1 -0
- package/dist/utils/port-checker.js +45 -0
- package/dist/utils/port-checker.js.map +1 -0
- package/dist/utils/project-files.d.ts +7 -0
- package/dist/utils/project-files.d.ts.map +1 -0
- package/dist/utils/project-files.js +97 -0
- package/dist/utils/project-files.js.map +1 -0
- package/dist/utils/spawn.d.ts +7 -0
- package/dist/utils/spawn.d.ts.map +1 -0
- package/dist/utils/spawn.js +31 -0
- package/dist/utils/spawn.js.map +1 -0
- package/dist/utils/tool-state.d.ts +16 -0
- package/dist/utils/tool-state.d.ts.map +1 -0
- package/dist/utils/tool-state.js +86 -0
- package/dist/utils/tool-state.js.map +1 -0
- 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
|
+

|
|
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 @@
|
|
|
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
|
package/dist/cli.js.map
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|