@habeetat/cli 0.1.0-dev.20260323164114.3a5aac3
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/README.md +35 -0
- package/dist/bin.js +321 -0
- package/dist/bin.js.map +1 -0
- package/dist/index.d.mts +107 -0
- package/dist/index.d.ts +107 -0
- package/dist/index.js +592 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +568 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +58 -0
package/README.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# @habeetat/cli
|
|
2
|
+
|
|
3
|
+
Habeetat Platform CLI — manage your platform instances from the command line.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @habeetat/cli
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Or use it locally within a Habeetat project (installed automatically by `create-habeetat`).
|
|
12
|
+
|
|
13
|
+
## Commands
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
habeetat up # Start the platform
|
|
17
|
+
habeetat down # Stop the platform
|
|
18
|
+
habeetat status # Show service status
|
|
19
|
+
habeetat logs [service] # View logs (-f to follow)
|
|
20
|
+
habeetat restart [svc] # Restart services
|
|
21
|
+
habeetat doctor # Diagnose issues
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Usage
|
|
25
|
+
|
|
26
|
+
This CLI is designed to work inside a Habeetat project directory (created by `npm create habeetat`). It reads `habeetat.json` for configuration and manages Docker services via `docker compose`.
|
|
27
|
+
|
|
28
|
+
## Requirements
|
|
29
|
+
|
|
30
|
+
- Docker >= 20.0 with Compose V2
|
|
31
|
+
- Node.js >= 18
|
|
32
|
+
|
|
33
|
+
## License
|
|
34
|
+
|
|
35
|
+
MIT
|
package/dist/bin.js
ADDED
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var commander = require('commander');
|
|
5
|
+
var fs2 = require('fs');
|
|
6
|
+
var path = require('path');
|
|
7
|
+
var ora = require('ora');
|
|
8
|
+
var chalk2 = require('chalk');
|
|
9
|
+
var execa = require('execa');
|
|
10
|
+
|
|
11
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
|
|
13
|
+
var fs2__default = /*#__PURE__*/_interopDefault(fs2);
|
|
14
|
+
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
15
|
+
var ora__default = /*#__PURE__*/_interopDefault(ora);
|
|
16
|
+
var chalk2__default = /*#__PURE__*/_interopDefault(chalk2);
|
|
17
|
+
|
|
18
|
+
var prefix = chalk2__default.default.cyan("[habeetat]");
|
|
19
|
+
var logger = {
|
|
20
|
+
info: (msg) => console.log(`${prefix} ${msg}`),
|
|
21
|
+
success: (msg) => console.log(`${prefix} ${chalk2__default.default.green("\u2713")} ${msg}`),
|
|
22
|
+
warn: (msg) => console.log(`${prefix} ${chalk2__default.default.yellow("\u26A0")} ${msg}`),
|
|
23
|
+
error: (msg) => console.error(`${prefix} ${chalk2__default.default.red("\u2717")} ${msg}`),
|
|
24
|
+
phase: (msg) => {
|
|
25
|
+
console.log("");
|
|
26
|
+
console.log(chalk2__default.default.cyan("\u2550".repeat(56)));
|
|
27
|
+
console.log(chalk2__default.default.cyan(` ${msg}`));
|
|
28
|
+
console.log(chalk2__default.default.cyan("\u2550".repeat(56)));
|
|
29
|
+
console.log("");
|
|
30
|
+
},
|
|
31
|
+
banner: () => {
|
|
32
|
+
console.log("");
|
|
33
|
+
console.log(chalk2__default.default.cyan("\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
|
|
34
|
+
console.log(chalk2__default.default.cyan("\u2551 \u2551"));
|
|
35
|
+
console.log(chalk2__default.default.cyan("\u2551 Habeetat Platform CLI \u2551"));
|
|
36
|
+
console.log(chalk2__default.default.cyan("\u2551 \u2551"));
|
|
37
|
+
console.log(chalk2__default.default.cyan("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
|
|
38
|
+
console.log("");
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// src/constants.ts
|
|
43
|
+
var CONFIG_FILE = "habeetat.json";
|
|
44
|
+
var ENV_FILE = ".env";
|
|
45
|
+
var COMPOSE_FILE = "docker-compose.yml";
|
|
46
|
+
var SERVICES = [
|
|
47
|
+
"logto-db",
|
|
48
|
+
"platform-db",
|
|
49
|
+
"logto-core",
|
|
50
|
+
"backend",
|
|
51
|
+
"launcher",
|
|
52
|
+
"organization-manager",
|
|
53
|
+
"platform-manager",
|
|
54
|
+
"sample-crm",
|
|
55
|
+
"nginx"
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
// src/utils/config.ts
|
|
59
|
+
function findProjectRoot(startDir = process.cwd()) {
|
|
60
|
+
let dir = startDir;
|
|
61
|
+
while (dir !== path__default.default.dirname(dir)) {
|
|
62
|
+
if (fs2__default.default.existsSync(path__default.default.join(dir, CONFIG_FILE))) {
|
|
63
|
+
return dir;
|
|
64
|
+
}
|
|
65
|
+
dir = path__default.default.dirname(dir);
|
|
66
|
+
}
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
function loadConfig(projectDir) {
|
|
70
|
+
const dir = projectDir || findProjectRoot();
|
|
71
|
+
if (!dir) {
|
|
72
|
+
throw new Error(
|
|
73
|
+
`Could not find ${CONFIG_FILE}. Are you inside a Habeetat project directory?`
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
const configPath = path__default.default.join(dir, CONFIG_FILE);
|
|
77
|
+
const raw = fs2__default.default.readFileSync(configPath, "utf-8");
|
|
78
|
+
return JSON.parse(raw);
|
|
79
|
+
}
|
|
80
|
+
function getProjectDir() {
|
|
81
|
+
const dir = findProjectRoot();
|
|
82
|
+
if (!dir) {
|
|
83
|
+
throw new Error(
|
|
84
|
+
`Could not find ${CONFIG_FILE}. Are you inside a Habeetat project directory?`
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
return dir;
|
|
88
|
+
}
|
|
89
|
+
async function checkDocker() {
|
|
90
|
+
try {
|
|
91
|
+
const { stdout } = await execa.execaCommand("docker --version");
|
|
92
|
+
const match = stdout.match(/Docker version (\d+)/);
|
|
93
|
+
if (match && parseInt(match[1], 10) >= 20) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
logger.error(`Docker >= 20.0 required. Found: ${stdout.trim()}`);
|
|
97
|
+
return false;
|
|
98
|
+
} catch {
|
|
99
|
+
logger.error("Docker is not installed or not in PATH");
|
|
100
|
+
logger.info("Install Docker: https://docs.docker.com/get-docker/");
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async function checkDockerCompose() {
|
|
105
|
+
try {
|
|
106
|
+
await execa.execaCommand("docker compose version");
|
|
107
|
+
return true;
|
|
108
|
+
} catch {
|
|
109
|
+
logger.error("Docker Compose V2 is not available");
|
|
110
|
+
logger.info("Docker Compose V2 is included with Docker Desktop");
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function checkPrerequisites() {
|
|
115
|
+
const docker = await checkDocker();
|
|
116
|
+
const compose = await checkDockerCompose();
|
|
117
|
+
return docker && compose;
|
|
118
|
+
}
|
|
119
|
+
async function composeUp(opts) {
|
|
120
|
+
const file = opts.composeFile || "docker-compose.yml";
|
|
121
|
+
await execa.execaCommand(`docker compose -f ${file} up -d`, {
|
|
122
|
+
cwd: opts.cwd,
|
|
123
|
+
stdio: opts.silent ? "pipe" : "inherit"
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
async function composeDown(opts) {
|
|
127
|
+
const file = opts.composeFile || "docker-compose.yml";
|
|
128
|
+
await execa.execaCommand(`docker compose -f ${file} down`, {
|
|
129
|
+
cwd: opts.cwd,
|
|
130
|
+
stdio: opts.silent ? "pipe" : "inherit"
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
async function composePs(opts) {
|
|
134
|
+
const file = opts.composeFile || "docker-compose.yml";
|
|
135
|
+
const { stdout } = await execa.execaCommand(`docker compose -f ${file} ps`, {
|
|
136
|
+
cwd: opts.cwd
|
|
137
|
+
});
|
|
138
|
+
return stdout;
|
|
139
|
+
}
|
|
140
|
+
async function composeLogs(opts) {
|
|
141
|
+
const file = opts.composeFile || "docker-compose.yml";
|
|
142
|
+
const parts = ["docker", "compose", "-f", file, "logs"];
|
|
143
|
+
if (opts.follow) parts.push("-f");
|
|
144
|
+
if (opts.tail) parts.push("--tail", String(opts.tail));
|
|
145
|
+
if (opts.service) parts.push(opts.service);
|
|
146
|
+
await execa.execaCommand(parts.join(" "), {
|
|
147
|
+
cwd: opts.cwd,
|
|
148
|
+
stdio: "inherit"
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
async function composeRestart(opts) {
|
|
152
|
+
const file = opts.composeFile || "docker-compose.yml";
|
|
153
|
+
const cmd = opts.service ? `docker compose -f ${file} restart ${opts.service}` : `docker compose -f ${file} restart`;
|
|
154
|
+
await execa.execaCommand(cmd, {
|
|
155
|
+
cwd: opts.cwd,
|
|
156
|
+
stdio: opts.silent ? "pipe" : "inherit"
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// src/commands/up.ts
|
|
161
|
+
async function upCommand() {
|
|
162
|
+
const projectDir = getProjectDir();
|
|
163
|
+
const config = loadConfig(projectDir);
|
|
164
|
+
logger.info(`Starting Habeetat Platform (${config.platform.domain})...`);
|
|
165
|
+
if (!await checkPrerequisites()) {
|
|
166
|
+
process.exit(1);
|
|
167
|
+
}
|
|
168
|
+
const spinner = ora__default.default("Starting services...").start();
|
|
169
|
+
try {
|
|
170
|
+
await composeUp({ cwd: projectDir });
|
|
171
|
+
spinner.succeed("All services started");
|
|
172
|
+
const proto = config.platform.protocol;
|
|
173
|
+
const domain = config.platform.domain;
|
|
174
|
+
console.log("");
|
|
175
|
+
logger.info("Platform URLs:");
|
|
176
|
+
console.log(` Launcher: ${proto}://launcher.${domain}`);
|
|
177
|
+
console.log(` Organization Manager: ${proto}://organization-manager.${domain}`);
|
|
178
|
+
console.log(` Platform Manager: ${proto}://platform-manager.${domain}`);
|
|
179
|
+
console.log(` Backend API: ${proto}://api.${domain}`);
|
|
180
|
+
console.log(` Logto IAM: ${proto}://iam.${domain}`);
|
|
181
|
+
console.log(` Logto Admin Console: ${proto}://iam-console.${domain}`);
|
|
182
|
+
console.log("");
|
|
183
|
+
logger.info("Run `habeetat status` to check service health");
|
|
184
|
+
} catch (err) {
|
|
185
|
+
spinner.fail("Failed to start services");
|
|
186
|
+
logger.error(String(err));
|
|
187
|
+
process.exit(1);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
async function downCommand() {
|
|
191
|
+
const projectDir = getProjectDir();
|
|
192
|
+
const spinner = ora__default.default("Stopping services...").start();
|
|
193
|
+
try {
|
|
194
|
+
await composeDown({ cwd: projectDir });
|
|
195
|
+
spinner.succeed("All services stopped");
|
|
196
|
+
} catch (err) {
|
|
197
|
+
spinner.fail("Failed to stop services");
|
|
198
|
+
logger.error(String(err));
|
|
199
|
+
process.exit(1);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// src/commands/status.ts
|
|
204
|
+
async function statusCommand() {
|
|
205
|
+
const projectDir = getProjectDir();
|
|
206
|
+
const config = loadConfig(projectDir);
|
|
207
|
+
logger.info(`Habeetat Platform \u2014 ${config.platform.domain}`);
|
|
208
|
+
logger.info(`Version: ${config.version}`);
|
|
209
|
+
logger.info(`Image tag: ${config.docker.imageTag}`);
|
|
210
|
+
console.log("");
|
|
211
|
+
try {
|
|
212
|
+
const output = await composePs({ cwd: projectDir });
|
|
213
|
+
console.log(output);
|
|
214
|
+
} catch (err) {
|
|
215
|
+
logger.error("Could not get service status. Is the platform running?");
|
|
216
|
+
logger.info("Run `habeetat up` to start the platform");
|
|
217
|
+
process.exit(1);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// src/commands/logs.ts
|
|
222
|
+
async function logsCommand(service, options) {
|
|
223
|
+
const projectDir = getProjectDir();
|
|
224
|
+
if (service && !SERVICES.includes(service)) {
|
|
225
|
+
logger.error(`Unknown service: ${service}`);
|
|
226
|
+
logger.info(`Available services: ${SERVICES.join(", ")}`);
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
229
|
+
try {
|
|
230
|
+
await composeLogs({
|
|
231
|
+
cwd: projectDir,
|
|
232
|
+
service,
|
|
233
|
+
follow: options?.follow,
|
|
234
|
+
tail: options?.tail
|
|
235
|
+
});
|
|
236
|
+
} catch {
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
async function restartCommand(service) {
|
|
240
|
+
const projectDir = getProjectDir();
|
|
241
|
+
if (service && !SERVICES.includes(service)) {
|
|
242
|
+
logger.error(`Unknown service: ${service}`);
|
|
243
|
+
logger.info(`Available services: ${SERVICES.join(", ")}`);
|
|
244
|
+
process.exit(1);
|
|
245
|
+
}
|
|
246
|
+
const label = service || "all services";
|
|
247
|
+
const spinner = ora__default.default(`Restarting ${label}...`).start();
|
|
248
|
+
try {
|
|
249
|
+
await composeRestart({ cwd: projectDir, service });
|
|
250
|
+
spinner.succeed(`Restarted ${label}`);
|
|
251
|
+
} catch (err) {
|
|
252
|
+
spinner.fail(`Failed to restart ${label}`);
|
|
253
|
+
logger.error(String(err));
|
|
254
|
+
process.exit(1);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
async function doctorCommand() {
|
|
258
|
+
logger.phase("Habeetat Doctor \u2014 Diagnostics");
|
|
259
|
+
let issues = 0;
|
|
260
|
+
const dockerOk = await checkDocker();
|
|
261
|
+
console.log(` Docker: ${dockerOk ? chalk2__default.default.green("\u2713 Installed") : chalk2__default.default.red("\u2717 Not found")}`);
|
|
262
|
+
if (!dockerOk) issues++;
|
|
263
|
+
const composeOk = await checkDockerCompose();
|
|
264
|
+
console.log(` Docker Compose: ${composeOk ? chalk2__default.default.green("\u2713 Available") : chalk2__default.default.red("\u2717 Not found")}`);
|
|
265
|
+
if (!composeOk) issues++;
|
|
266
|
+
const projectDir = findProjectRoot();
|
|
267
|
+
console.log(` Project dir: ${projectDir ? chalk2__default.default.green(`\u2713 ${projectDir}`) : chalk2__default.default.yellow("\u26A0 Not in a Habeetat project")}`);
|
|
268
|
+
if (!projectDir) {
|
|
269
|
+
issues++;
|
|
270
|
+
console.log("");
|
|
271
|
+
logger.info(`Run \`npm create habeetat my-platform\` to create a new project`);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
const configExists = fs2__default.default.existsSync(path__default.default.join(projectDir, CONFIG_FILE));
|
|
275
|
+
console.log(` ${CONFIG_FILE}: ${configExists ? chalk2__default.default.green("\u2713 Found") : chalk2__default.default.red("\u2717 Missing")}`);
|
|
276
|
+
if (!configExists) issues++;
|
|
277
|
+
const composeExists = fs2__default.default.existsSync(path__default.default.join(projectDir, COMPOSE_FILE));
|
|
278
|
+
console.log(` ${COMPOSE_FILE}: ${composeExists ? chalk2__default.default.green("\u2713 Found") : chalk2__default.default.red("\u2717 Missing")}`);
|
|
279
|
+
if (!composeExists) issues++;
|
|
280
|
+
const envExists = fs2__default.default.existsSync(path__default.default.join(projectDir, ENV_FILE));
|
|
281
|
+
console.log(` ${ENV_FILE}: ${envExists ? chalk2__default.default.green("\u2713 Found") : chalk2__default.default.red("\u2717 Missing")}`);
|
|
282
|
+
if (!envExists) issues++;
|
|
283
|
+
const nginxExists = fs2__default.default.existsSync(path__default.default.join(projectDir, "nginx", "platform.conf"));
|
|
284
|
+
console.log(` nginx/platform.conf: ${nginxExists ? chalk2__default.default.green("\u2713 Found") : chalk2__default.default.red("\u2717 Missing")}`);
|
|
285
|
+
if (!nginxExists) issues++;
|
|
286
|
+
if (configExists) {
|
|
287
|
+
try {
|
|
288
|
+
const config = loadConfig(projectDir);
|
|
289
|
+
console.log(` Version: ${chalk2__default.default.cyan(config.version)}`);
|
|
290
|
+
console.log(` Domain: ${chalk2__default.default.cyan(config.platform.domain)}`);
|
|
291
|
+
console.log(` Protocol: ${chalk2__default.default.cyan(config.platform.protocol)}`);
|
|
292
|
+
} catch (err) {
|
|
293
|
+
console.log(` Config: ${chalk2__default.default.red("\u2717 Invalid JSON")}`);
|
|
294
|
+
issues++;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
console.log("");
|
|
298
|
+
if (issues === 0) {
|
|
299
|
+
logger.success("No issues found");
|
|
300
|
+
} else {
|
|
301
|
+
logger.warn(`${issues} issue(s) found`);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// src/bin.ts
|
|
306
|
+
var pkg = JSON.parse(
|
|
307
|
+
fs2.readFileSync(path__default.default.resolve(__dirname, "..", "package.json"), "utf-8")
|
|
308
|
+
);
|
|
309
|
+
var program = new commander.Command();
|
|
310
|
+
program.name("habeetat").description("Habeetat Platform CLI \u2014 manage your platform instances").version(pkg.version);
|
|
311
|
+
program.command("up").description("Start the platform").action(upCommand);
|
|
312
|
+
program.command("down").description("Stop the platform").action(downCommand);
|
|
313
|
+
program.command("status").description("Show platform service status").action(statusCommand);
|
|
314
|
+
program.command("logs [service]").description("View service logs").option("-f, --follow", "Follow log output").option("-n, --tail <lines>", "Number of lines to show", parseInt).action((service, options) => {
|
|
315
|
+
return logsCommand(service, options);
|
|
316
|
+
});
|
|
317
|
+
program.command("restart [service]").description("Restart services").action(restartCommand);
|
|
318
|
+
program.command("doctor").description("Diagnose common issues").action(doctorCommand);
|
|
319
|
+
program.parse();
|
|
320
|
+
//# sourceMappingURL=bin.js.map
|
|
321
|
+
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/logger.ts","../src/constants.ts","../src/utils/config.ts","../src/utils/docker.ts","../src/commands/up.ts","../src/commands/down.ts","../src/commands/status.ts","../src/commands/logs.ts","../src/commands/restart.ts","../src/commands/doctor.ts","../src/bin.ts"],"names":["chalk","path","fs","execaCommand","ora","readFileSync","Command"],"mappings":"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","file":"bin.js","sourcesContent":["import chalk from 'chalk';\n\nconst prefix = chalk.cyan('[habeetat]');\n\nexport const logger = {\n info: (msg: string) => console.log(`${prefix} ${msg}`),\n success: (msg: string) => console.log(`${prefix} ${chalk.green('✓')} ${msg}`),\n warn: (msg: string) => console.log(`${prefix} ${chalk.yellow('⚠')} ${msg}`),\n error: (msg: string) => console.error(`${prefix} ${chalk.red('✗')} ${msg}`),\n phase: (msg: string) => {\n console.log('');\n console.log(chalk.cyan('═'.repeat(56)));\n console.log(chalk.cyan(` ${msg}`));\n console.log(chalk.cyan('═'.repeat(56)));\n console.log('');\n },\n banner: () => {\n console.log('');\n console.log(chalk.cyan('╔══════════════════════════════════════════════╗'));\n console.log(chalk.cyan('║ ║'));\n console.log(chalk.cyan('║ Habeetat Platform CLI ║'));\n console.log(chalk.cyan('║ ║'));\n console.log(chalk.cyan('╚══════════════════════════════════════════════╝'));\n console.log('');\n },\n};\n","export const CONFIG_FILE = 'habeetat.json';\nexport const ENV_FILE = '.env';\nexport const COMPOSE_FILE = 'docker-compose.yml';\n\nexport const DOCKER_REGISTRY = 'docker.io/capriisland';\n\nexport const IMAGES = {\n backend: 'capriisland/habeetat-backend',\n launcher: 'capriisland/habeetat-launcher',\n orgManager: 'capriisland/habeetat-org-manager',\n platformManager: 'capriisland/habeetat-platform-manager',\n sampleCrm: 'capriisland/habeetat-sample-crm',\n logtoConfig: 'capriisland/habeetat-logto-config',\n} as const;\n\nexport const THIRD_PARTY_IMAGES = {\n postgres: 'postgres:15-alpine',\n logto: 'svhd/logto:1.33',\n nginx: 'nginx:1.25-alpine',\n certbot: 'certbot/certbot',\n} as const;\n\nexport const DEFAULT_PORTS = {\n http: 80,\n https: 443,\n} as const;\n\nexport const SERVICES = [\n 'logto-db',\n 'platform-db',\n 'logto-core',\n 'backend',\n 'launcher',\n 'organization-manager',\n 'platform-manager',\n 'sample-crm',\n 'nginx',\n] as const;\n\nexport type ServiceName = (typeof SERVICES)[number];\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { CONFIG_FILE } from '../constants.js';\nimport type { HabeetatConfig } from '../types.js';\n\nexport function findProjectRoot(startDir: string = process.cwd()): string | null {\n let dir = startDir;\n while (dir !== path.dirname(dir)) {\n if (fs.existsSync(path.join(dir, CONFIG_FILE))) {\n return dir;\n }\n dir = path.dirname(dir);\n }\n return null;\n}\n\nexport function loadConfig(projectDir?: string): HabeetatConfig {\n const dir = projectDir || findProjectRoot();\n if (!dir) {\n throw new Error(\n `Could not find ${CONFIG_FILE}. Are you inside a Habeetat project directory?`,\n );\n }\n const configPath = path.join(dir, CONFIG_FILE);\n const raw = fs.readFileSync(configPath, 'utf-8');\n return JSON.parse(raw) as HabeetatConfig;\n}\n\nexport function saveConfig(config: HabeetatConfig, projectDir: string): void {\n const configPath = path.join(projectDir, CONFIG_FILE);\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n}\n\nexport function getProjectDir(): string {\n const dir = findProjectRoot();\n if (!dir) {\n throw new Error(\n `Could not find ${CONFIG_FILE}. Are you inside a Habeetat project directory?`,\n );\n }\n return dir;\n}\n","import { execaCommand } from 'execa';\nimport { logger } from './logger.js';\n\nexport async function checkDocker(): Promise<boolean> {\n try {\n const { stdout } = await execaCommand('docker --version');\n const match = stdout.match(/Docker version (\\d+)/);\n if (match && parseInt(match[1], 10) >= 20) {\n return true;\n }\n logger.error(`Docker >= 20.0 required. Found: ${stdout.trim()}`);\n return false;\n } catch {\n logger.error('Docker is not installed or not in PATH');\n logger.info('Install Docker: https://docs.docker.com/get-docker/');\n return false;\n }\n}\n\nexport async function checkDockerCompose(): Promise<boolean> {\n try {\n await execaCommand('docker compose version');\n return true;\n } catch {\n logger.error('Docker Compose V2 is not available');\n logger.info('Docker Compose V2 is included with Docker Desktop');\n return false;\n }\n}\n\nexport async function checkPrerequisites(): Promise<boolean> {\n const docker = await checkDocker();\n const compose = await checkDockerCompose();\n return docker && compose;\n}\n\nexport interface ComposeExecOptions {\n cwd: string;\n composeFile?: string;\n silent?: boolean;\n}\n\nexport async function composeUp(opts: ComposeExecOptions): Promise<void> {\n const file = opts.composeFile || 'docker-compose.yml';\n await execaCommand(`docker compose -f ${file} up -d`, {\n cwd: opts.cwd,\n stdio: opts.silent ? 'pipe' : 'inherit',\n });\n}\n\nexport async function composeDown(opts: ComposeExecOptions): Promise<void> {\n const file = opts.composeFile || 'docker-compose.yml';\n await execaCommand(`docker compose -f ${file} down`, {\n cwd: opts.cwd,\n stdio: opts.silent ? 'pipe' : 'inherit',\n });\n}\n\nexport async function composePs(opts: ComposeExecOptions): Promise<string> {\n const file = opts.composeFile || 'docker-compose.yml';\n const { stdout } = await execaCommand(`docker compose -f ${file} ps`, {\n cwd: opts.cwd,\n });\n return stdout;\n}\n\nexport async function composeLogs(\n opts: ComposeExecOptions & { service?: string; follow?: boolean; tail?: number },\n): Promise<void> {\n const file = opts.composeFile || 'docker-compose.yml';\n const parts = ['docker', 'compose', '-f', file, 'logs'];\n if (opts.follow) parts.push('-f');\n if (opts.tail) parts.push('--tail', String(opts.tail));\n if (opts.service) parts.push(opts.service);\n\n await execaCommand(parts.join(' '), {\n cwd: opts.cwd,\n stdio: 'inherit',\n });\n}\n\nexport async function composeRestart(\n opts: ComposeExecOptions & { service?: string },\n): Promise<void> {\n const file = opts.composeFile || 'docker-compose.yml';\n const cmd = opts.service\n ? `docker compose -f ${file} restart ${opts.service}`\n : `docker compose -f ${file} restart`;\n\n await execaCommand(cmd, {\n cwd: opts.cwd,\n stdio: opts.silent ? 'pipe' : 'inherit',\n });\n}\n\nexport async function composeExec(\n opts: ComposeExecOptions & { service: string; command: string },\n): Promise<string> {\n const file = opts.composeFile || 'docker-compose.yml';\n const { stdout } = await execaCommand(\n `docker compose -f ${file} exec -T ${opts.service} ${opts.command}`,\n { cwd: opts.cwd },\n );\n return stdout;\n}\n\nexport async function dockerPull(image: string): Promise<void> {\n await execaCommand(`docker pull ${image}`, { stdio: 'inherit' });\n}\n","import ora from 'ora';\nimport { logger } from '../utils/logger.js';\nimport { getProjectDir, loadConfig } from '../utils/config.js';\nimport { composeUp, checkPrerequisites } from '../utils/docker.js';\n\nexport async function upCommand(): Promise<void> {\n const projectDir = getProjectDir();\n const config = loadConfig(projectDir);\n\n logger.info(`Starting Habeetat Platform (${config.platform.domain})...`);\n\n if (!(await checkPrerequisites())) {\n process.exit(1);\n }\n\n const spinner = ora('Starting services...').start();\n\n try {\n await composeUp({ cwd: projectDir });\n spinner.succeed('All services started');\n\n const proto = config.platform.protocol;\n const domain = config.platform.domain;\n\n console.log('');\n logger.info('Platform URLs:');\n console.log(` Launcher: ${proto}://launcher.${domain}`);\n console.log(` Organization Manager: ${proto}://organization-manager.${domain}`);\n console.log(` Platform Manager: ${proto}://platform-manager.${domain}`);\n console.log(` Backend API: ${proto}://api.${domain}`);\n console.log(` Logto IAM: ${proto}://iam.${domain}`);\n console.log(` Logto Admin Console: ${proto}://iam-console.${domain}`);\n console.log('');\n logger.info('Run `habeetat status` to check service health');\n } catch (err) {\n spinner.fail('Failed to start services');\n logger.error(String(err));\n process.exit(1);\n }\n}\n","import ora from 'ora';\nimport { logger } from '../utils/logger.js';\nimport { getProjectDir } from '../utils/config.js';\nimport { composeDown } from '../utils/docker.js';\n\nexport async function downCommand(): Promise<void> {\n const projectDir = getProjectDir();\n const spinner = ora('Stopping services...').start();\n\n try {\n await composeDown({ cwd: projectDir });\n spinner.succeed('All services stopped');\n } catch (err) {\n spinner.fail('Failed to stop services');\n logger.error(String(err));\n process.exit(1);\n }\n}\n","import { logger } from '../utils/logger.js';\nimport { getProjectDir, loadConfig } from '../utils/config.js';\nimport { composePs } from '../utils/docker.js';\n\nexport async function statusCommand(): Promise<void> {\n const projectDir = getProjectDir();\n const config = loadConfig(projectDir);\n\n logger.info(`Habeetat Platform — ${config.platform.domain}`);\n logger.info(`Version: ${config.version}`);\n logger.info(`Image tag: ${config.docker.imageTag}`);\n console.log('');\n\n try {\n const output = await composePs({ cwd: projectDir });\n console.log(output);\n } catch (err) {\n logger.error('Could not get service status. Is the platform running?');\n logger.info('Run `habeetat up` to start the platform');\n process.exit(1);\n }\n}\n","import { logger } from '../utils/logger.js';\nimport { getProjectDir } from '../utils/config.js';\nimport { composeLogs } from '../utils/docker.js';\nimport { SERVICES } from '../constants.js';\n\nexport async function logsCommand(\n service?: string,\n options?: { follow?: boolean; tail?: number },\n): Promise<void> {\n const projectDir = getProjectDir();\n\n if (service && !(SERVICES as readonly string[]).includes(service)) {\n logger.error(`Unknown service: ${service}`);\n logger.info(`Available services: ${SERVICES.join(', ')}`);\n process.exit(1);\n }\n\n try {\n await composeLogs({\n cwd: projectDir,\n service,\n follow: options?.follow,\n tail: options?.tail,\n });\n } catch {\n // User interrupted with Ctrl+C — that's fine\n }\n}\n","import ora from 'ora';\nimport { logger } from '../utils/logger.js';\nimport { getProjectDir } from '../utils/config.js';\nimport { composeRestart } from '../utils/docker.js';\nimport { SERVICES } from '../constants.js';\n\nexport async function restartCommand(service?: string): Promise<void> {\n const projectDir = getProjectDir();\n\n if (service && !(SERVICES as readonly string[]).includes(service)) {\n logger.error(`Unknown service: ${service}`);\n logger.info(`Available services: ${SERVICES.join(', ')}`);\n process.exit(1);\n }\n\n const label = service || 'all services';\n const spinner = ora(`Restarting ${label}...`).start();\n\n try {\n await composeRestart({ cwd: projectDir, service });\n spinner.succeed(`Restarted ${label}`);\n } catch (err) {\n spinner.fail(`Failed to restart ${label}`);\n logger.error(String(err));\n process.exit(1);\n }\n}\n","import chalk from 'chalk';\nimport { logger } from '../utils/logger.js';\nimport { checkDocker, checkDockerCompose } from '../utils/docker.js';\nimport { findProjectRoot, loadConfig } from '../utils/config.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { CONFIG_FILE, COMPOSE_FILE, ENV_FILE } from '../constants.js';\n\nexport async function doctorCommand(): Promise<void> {\n logger.phase('Habeetat Doctor — Diagnostics');\n let issues = 0;\n\n // Check Docker\n const dockerOk = await checkDocker();\n console.log(` Docker: ${dockerOk ? chalk.green('✓ Installed') : chalk.red('✗ Not found')}`);\n if (!dockerOk) issues++;\n\n // Check Docker Compose\n const composeOk = await checkDockerCompose();\n console.log(` Docker Compose: ${composeOk ? chalk.green('✓ Available') : chalk.red('✗ Not found')}`);\n if (!composeOk) issues++;\n\n // Check project directory\n const projectDir = findProjectRoot();\n console.log(` Project dir: ${projectDir ? chalk.green(`✓ ${projectDir}`) : chalk.yellow('⚠ Not in a Habeetat project')}`);\n if (!projectDir) {\n issues++;\n console.log('');\n logger.info(`Run \\`npm create habeetat my-platform\\` to create a new project`);\n return;\n }\n\n // Check config file\n const configExists = fs.existsSync(path.join(projectDir, CONFIG_FILE));\n console.log(` ${CONFIG_FILE}: ${configExists ? chalk.green('✓ Found') : chalk.red('✗ Missing')}`);\n if (!configExists) issues++;\n\n // Check compose file\n const composeExists = fs.existsSync(path.join(projectDir, COMPOSE_FILE));\n console.log(` ${COMPOSE_FILE}: ${composeExists ? chalk.green('✓ Found') : chalk.red('✗ Missing')}`);\n if (!composeExists) issues++;\n\n // Check env file\n const envExists = fs.existsSync(path.join(projectDir, ENV_FILE));\n console.log(` ${ENV_FILE}: ${envExists ? chalk.green('✓ Found') : chalk.red('✗ Missing')}`);\n if (!envExists) issues++;\n\n // Check nginx config\n const nginxExists = fs.existsSync(path.join(projectDir, 'nginx', 'platform.conf'));\n console.log(` nginx/platform.conf: ${nginxExists ? chalk.green('✓ Found') : chalk.red('✗ Missing')}`);\n if (!nginxExists) issues++;\n\n // Load config and check images\n if (configExists) {\n try {\n const config = loadConfig(projectDir);\n console.log(` Version: ${chalk.cyan(config.version)}`);\n console.log(` Domain: ${chalk.cyan(config.platform.domain)}`);\n console.log(` Protocol: ${chalk.cyan(config.platform.protocol)}`);\n } catch (err) {\n console.log(` Config: ${chalk.red('✗ Invalid JSON')}`);\n issues++;\n }\n }\n\n console.log('');\n if (issues === 0) {\n logger.success('No issues found');\n } else {\n logger.warn(`${issues} issue(s) found`);\n }\n}\n","import { Command } from 'commander';\nimport { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport path from 'node:path';\nimport { upCommand } from './commands/up.js';\nimport { downCommand } from './commands/down.js';\nimport { statusCommand } from './commands/status.js';\nimport { logsCommand } from './commands/logs.js';\nimport { restartCommand } from './commands/restart.js';\nimport { doctorCommand } from './commands/doctor.js';\n\nconst pkg = JSON.parse(\n readFileSync(path.resolve(__dirname, '..', 'package.json'), 'utf-8'),\n);\n\nconst program = new Command();\n\nprogram\n .name('habeetat')\n .description('Habeetat Platform CLI — manage your platform instances')\n .version(pkg.version);\n\nprogram\n .command('up')\n .description('Start the platform')\n .action(upCommand);\n\nprogram\n .command('down')\n .description('Stop the platform')\n .action(downCommand);\n\nprogram\n .command('status')\n .description('Show platform service status')\n .action(statusCommand);\n\nprogram\n .command('logs [service]')\n .description('View service logs')\n .option('-f, --follow', 'Follow log output')\n .option('-n, --tail <lines>', 'Number of lines to show', parseInt)\n .action((service: string | undefined, options: { follow?: boolean; tail?: number }) => {\n return logsCommand(service, options);\n });\n\nprogram\n .command('restart [service]')\n .description('Restart services')\n .action(restartCommand);\n\nprogram\n .command('doctor')\n .description('Diagnose common issues')\n .action(doctorCommand);\n\nprogram.parse();\n"]}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
interface HabeetatConfig {
|
|
2
|
+
version: string;
|
|
3
|
+
platform: {
|
|
4
|
+
domain: string;
|
|
5
|
+
protocol: 'http' | 'https';
|
|
6
|
+
organization: string;
|
|
7
|
+
adminEmail: string;
|
|
8
|
+
};
|
|
9
|
+
docker: {
|
|
10
|
+
registry: string;
|
|
11
|
+
imageTag: string;
|
|
12
|
+
};
|
|
13
|
+
services: {
|
|
14
|
+
backend: boolean;
|
|
15
|
+
launcher: boolean;
|
|
16
|
+
organizationManager: boolean;
|
|
17
|
+
platformManager: boolean;
|
|
18
|
+
sampleCrm: boolean;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
interface PlatformEnv {
|
|
22
|
+
DOMAIN: string;
|
|
23
|
+
PROTOCOL: string;
|
|
24
|
+
LOGTO_ENDPOINT: string;
|
|
25
|
+
LOGTO_ADMIN_ENDPOINT: string;
|
|
26
|
+
LAUNCHER_URL: string;
|
|
27
|
+
ORG_MANAGER_URL: string;
|
|
28
|
+
PLATFORM_MANAGER_URL: string;
|
|
29
|
+
SAMPLE_CRM_URL: string;
|
|
30
|
+
BACKEND_API_URL: string;
|
|
31
|
+
CORS_ORIGINS: string;
|
|
32
|
+
LOGTO_DB_USER: string;
|
|
33
|
+
LOGTO_DB_PASSWORD: string;
|
|
34
|
+
LOGTO_DB_NAME: string;
|
|
35
|
+
PLATFORM_DB_USER: string;
|
|
36
|
+
PLATFORM_DB_PASSWORD: string;
|
|
37
|
+
PLATFORM_DB_NAME: string;
|
|
38
|
+
LOGTO_ADMIN_USERNAME: string;
|
|
39
|
+
LOGTO_ADMIN_PASSWORD: string;
|
|
40
|
+
IAM_ISSUER_URL: string;
|
|
41
|
+
IAM_AUDIENCE: string;
|
|
42
|
+
SDK_API_RESOURCE: string;
|
|
43
|
+
LOGTO_M2M_APP_SECRET: string;
|
|
44
|
+
ENCRYPTION_KEY: string;
|
|
45
|
+
PLATFORM_ADMIN_EMAIL: string;
|
|
46
|
+
PLATFORM_ADMIN_PASSWORD: string;
|
|
47
|
+
ORGANIZATION_NAME: string;
|
|
48
|
+
}
|
|
49
|
+
interface CreateOptions {
|
|
50
|
+
domain: string;
|
|
51
|
+
adminEmail: string;
|
|
52
|
+
adminPassword: string;
|
|
53
|
+
organizationName: string;
|
|
54
|
+
ssl: boolean;
|
|
55
|
+
tag: string;
|
|
56
|
+
skipStart: boolean;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
declare const CONFIG_FILE = "habeetat.json";
|
|
60
|
+
declare const ENV_FILE = ".env";
|
|
61
|
+
declare const COMPOSE_FILE = "docker-compose.yml";
|
|
62
|
+
declare const DOCKER_REGISTRY = "docker.io/capriisland";
|
|
63
|
+
declare const IMAGES: {
|
|
64
|
+
readonly backend: "capriisland/habeetat-backend";
|
|
65
|
+
readonly launcher: "capriisland/habeetat-launcher";
|
|
66
|
+
readonly orgManager: "capriisland/habeetat-org-manager";
|
|
67
|
+
readonly platformManager: "capriisland/habeetat-platform-manager";
|
|
68
|
+
readonly sampleCrm: "capriisland/habeetat-sample-crm";
|
|
69
|
+
readonly logtoConfig: "capriisland/habeetat-logto-config";
|
|
70
|
+
};
|
|
71
|
+
declare const THIRD_PARTY_IMAGES: {
|
|
72
|
+
readonly postgres: "postgres:15-alpine";
|
|
73
|
+
readonly logto: "svhd/logto:1.33";
|
|
74
|
+
readonly nginx: "nginx:1.25-alpine";
|
|
75
|
+
readonly certbot: "certbot/certbot";
|
|
76
|
+
};
|
|
77
|
+
declare const SERVICES: readonly ["logto-db", "platform-db", "logto-core", "backend", "launcher", "organization-manager", "platform-manager", "sample-crm", "nginx"];
|
|
78
|
+
|
|
79
|
+
declare function generateDockerCompose(config: HabeetatConfig): string;
|
|
80
|
+
|
|
81
|
+
declare function generateNginxConf(config: HabeetatConfig): string;
|
|
82
|
+
|
|
83
|
+
declare function generateEnvFile(opts: CreateOptions): string;
|
|
84
|
+
|
|
85
|
+
declare const logger: {
|
|
86
|
+
info: (msg: string) => void;
|
|
87
|
+
success: (msg: string) => void;
|
|
88
|
+
warn: (msg: string) => void;
|
|
89
|
+
error: (msg: string) => void;
|
|
90
|
+
phase: (msg: string) => void;
|
|
91
|
+
banner: () => void;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
declare function checkPrerequisites(): Promise<boolean>;
|
|
95
|
+
|
|
96
|
+
declare function findProjectRoot(startDir?: string): string | null;
|
|
97
|
+
declare function loadConfig(projectDir?: string): HabeetatConfig;
|
|
98
|
+
declare function saveConfig(config: HabeetatConfig, projectDir: string): void;
|
|
99
|
+
|
|
100
|
+
declare function generateSecrets(): {
|
|
101
|
+
logtoDbPassword: string;
|
|
102
|
+
platformDbPassword: string;
|
|
103
|
+
encryptionKey: string;
|
|
104
|
+
logtoM2mAppSecret: string;
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
export { COMPOSE_FILE, CONFIG_FILE, type CreateOptions, DOCKER_REGISTRY, ENV_FILE, type HabeetatConfig, IMAGES, type PlatformEnv, SERVICES, THIRD_PARTY_IMAGES, checkPrerequisites, findProjectRoot, generateDockerCompose, generateEnvFile, generateNginxConf, generateSecrets, loadConfig, logger, saveConfig };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
interface HabeetatConfig {
|
|
2
|
+
version: string;
|
|
3
|
+
platform: {
|
|
4
|
+
domain: string;
|
|
5
|
+
protocol: 'http' | 'https';
|
|
6
|
+
organization: string;
|
|
7
|
+
adminEmail: string;
|
|
8
|
+
};
|
|
9
|
+
docker: {
|
|
10
|
+
registry: string;
|
|
11
|
+
imageTag: string;
|
|
12
|
+
};
|
|
13
|
+
services: {
|
|
14
|
+
backend: boolean;
|
|
15
|
+
launcher: boolean;
|
|
16
|
+
organizationManager: boolean;
|
|
17
|
+
platformManager: boolean;
|
|
18
|
+
sampleCrm: boolean;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
interface PlatformEnv {
|
|
22
|
+
DOMAIN: string;
|
|
23
|
+
PROTOCOL: string;
|
|
24
|
+
LOGTO_ENDPOINT: string;
|
|
25
|
+
LOGTO_ADMIN_ENDPOINT: string;
|
|
26
|
+
LAUNCHER_URL: string;
|
|
27
|
+
ORG_MANAGER_URL: string;
|
|
28
|
+
PLATFORM_MANAGER_URL: string;
|
|
29
|
+
SAMPLE_CRM_URL: string;
|
|
30
|
+
BACKEND_API_URL: string;
|
|
31
|
+
CORS_ORIGINS: string;
|
|
32
|
+
LOGTO_DB_USER: string;
|
|
33
|
+
LOGTO_DB_PASSWORD: string;
|
|
34
|
+
LOGTO_DB_NAME: string;
|
|
35
|
+
PLATFORM_DB_USER: string;
|
|
36
|
+
PLATFORM_DB_PASSWORD: string;
|
|
37
|
+
PLATFORM_DB_NAME: string;
|
|
38
|
+
LOGTO_ADMIN_USERNAME: string;
|
|
39
|
+
LOGTO_ADMIN_PASSWORD: string;
|
|
40
|
+
IAM_ISSUER_URL: string;
|
|
41
|
+
IAM_AUDIENCE: string;
|
|
42
|
+
SDK_API_RESOURCE: string;
|
|
43
|
+
LOGTO_M2M_APP_SECRET: string;
|
|
44
|
+
ENCRYPTION_KEY: string;
|
|
45
|
+
PLATFORM_ADMIN_EMAIL: string;
|
|
46
|
+
PLATFORM_ADMIN_PASSWORD: string;
|
|
47
|
+
ORGANIZATION_NAME: string;
|
|
48
|
+
}
|
|
49
|
+
interface CreateOptions {
|
|
50
|
+
domain: string;
|
|
51
|
+
adminEmail: string;
|
|
52
|
+
adminPassword: string;
|
|
53
|
+
organizationName: string;
|
|
54
|
+
ssl: boolean;
|
|
55
|
+
tag: string;
|
|
56
|
+
skipStart: boolean;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
declare const CONFIG_FILE = "habeetat.json";
|
|
60
|
+
declare const ENV_FILE = ".env";
|
|
61
|
+
declare const COMPOSE_FILE = "docker-compose.yml";
|
|
62
|
+
declare const DOCKER_REGISTRY = "docker.io/capriisland";
|
|
63
|
+
declare const IMAGES: {
|
|
64
|
+
readonly backend: "capriisland/habeetat-backend";
|
|
65
|
+
readonly launcher: "capriisland/habeetat-launcher";
|
|
66
|
+
readonly orgManager: "capriisland/habeetat-org-manager";
|
|
67
|
+
readonly platformManager: "capriisland/habeetat-platform-manager";
|
|
68
|
+
readonly sampleCrm: "capriisland/habeetat-sample-crm";
|
|
69
|
+
readonly logtoConfig: "capriisland/habeetat-logto-config";
|
|
70
|
+
};
|
|
71
|
+
declare const THIRD_PARTY_IMAGES: {
|
|
72
|
+
readonly postgres: "postgres:15-alpine";
|
|
73
|
+
readonly logto: "svhd/logto:1.33";
|
|
74
|
+
readonly nginx: "nginx:1.25-alpine";
|
|
75
|
+
readonly certbot: "certbot/certbot";
|
|
76
|
+
};
|
|
77
|
+
declare const SERVICES: readonly ["logto-db", "platform-db", "logto-core", "backend", "launcher", "organization-manager", "platform-manager", "sample-crm", "nginx"];
|
|
78
|
+
|
|
79
|
+
declare function generateDockerCompose(config: HabeetatConfig): string;
|
|
80
|
+
|
|
81
|
+
declare function generateNginxConf(config: HabeetatConfig): string;
|
|
82
|
+
|
|
83
|
+
declare function generateEnvFile(opts: CreateOptions): string;
|
|
84
|
+
|
|
85
|
+
declare const logger: {
|
|
86
|
+
info: (msg: string) => void;
|
|
87
|
+
success: (msg: string) => void;
|
|
88
|
+
warn: (msg: string) => void;
|
|
89
|
+
error: (msg: string) => void;
|
|
90
|
+
phase: (msg: string) => void;
|
|
91
|
+
banner: () => void;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
declare function checkPrerequisites(): Promise<boolean>;
|
|
95
|
+
|
|
96
|
+
declare function findProjectRoot(startDir?: string): string | null;
|
|
97
|
+
declare function loadConfig(projectDir?: string): HabeetatConfig;
|
|
98
|
+
declare function saveConfig(config: HabeetatConfig, projectDir: string): void;
|
|
99
|
+
|
|
100
|
+
declare function generateSecrets(): {
|
|
101
|
+
logtoDbPassword: string;
|
|
102
|
+
platformDbPassword: string;
|
|
103
|
+
encryptionKey: string;
|
|
104
|
+
logtoM2mAppSecret: string;
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
export { COMPOSE_FILE, CONFIG_FILE, type CreateOptions, DOCKER_REGISTRY, ENV_FILE, type HabeetatConfig, IMAGES, type PlatformEnv, SERVICES, THIRD_PARTY_IMAGES, checkPrerequisites, findProjectRoot, generateDockerCompose, generateEnvFile, generateNginxConf, generateSecrets, loadConfig, logger, saveConfig };
|