@cicore/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/bin/ci.js +13 -0
- package/dist/commands/addon/api-actions.d.ts +45 -0
- package/dist/commands/addon/api-actions.d.ts.map +1 -0
- package/dist/commands/addon/api-actions.js +281 -0
- package/dist/commands/addon/api-actions.js.map +1 -0
- package/dist/commands/addon/build.d.ts +11 -0
- package/dist/commands/addon/build.d.ts.map +1 -0
- package/dist/commands/addon/build.js +182 -0
- package/dist/commands/addon/build.js.map +1 -0
- package/dist/commands/addon/create.d.ts +11 -0
- package/dist/commands/addon/create.d.ts.map +1 -0
- package/dist/commands/addon/create.js +1186 -0
- package/dist/commands/addon/create.js.map +1 -0
- package/dist/commands/addon/delete.d.ts +13 -0
- package/dist/commands/addon/delete.d.ts.map +1 -0
- package/dist/commands/addon/delete.js +83 -0
- package/dist/commands/addon/delete.js.map +1 -0
- package/dist/commands/addon/deploy.d.ts +27 -0
- package/dist/commands/addon/deploy.d.ts.map +1 -0
- package/dist/commands/addon/deploy.js +459 -0
- package/dist/commands/addon/deploy.js.map +1 -0
- package/dist/commands/addon/dev-deploy.d.ts +31 -0
- package/dist/commands/addon/dev-deploy.d.ts.map +1 -0
- package/dist/commands/addon/dev-deploy.js +128 -0
- package/dist/commands/addon/dev-deploy.js.map +1 -0
- package/dist/commands/addon/dev.d.ts +36 -0
- package/dist/commands/addon/dev.d.ts.map +1 -0
- package/dist/commands/addon/dev.js +323 -0
- package/dist/commands/addon/dev.js.map +1 -0
- package/dist/commands/addon/extract-classes.d.ts +23 -0
- package/dist/commands/addon/extract-classes.d.ts.map +1 -0
- package/dist/commands/addon/extract-classes.js +281 -0
- package/dist/commands/addon/extract-classes.js.map +1 -0
- package/dist/commands/addon/generate-safelist.d.ts +24 -0
- package/dist/commands/addon/generate-safelist.d.ts.map +1 -0
- package/dist/commands/addon/generate-safelist.js +276 -0
- package/dist/commands/addon/generate-safelist.js.map +1 -0
- package/dist/commands/addon/index.d.ts +19 -0
- package/dist/commands/addon/index.d.ts.map +1 -0
- package/dist/commands/addon/index.js +296 -0
- package/dist/commands/addon/index.js.map +1 -0
- package/dist/commands/addon/init-repo.d.ts +25 -0
- package/dist/commands/addon/init-repo.d.ts.map +1 -0
- package/dist/commands/addon/init-repo.js +171 -0
- package/dist/commands/addon/init-repo.js.map +1 -0
- package/dist/commands/addon/install.d.ts +23 -0
- package/dist/commands/addon/install.d.ts.map +1 -0
- package/dist/commands/addon/install.js +84 -0
- package/dist/commands/addon/install.js.map +1 -0
- package/dist/commands/addon/list.d.ts +10 -0
- package/dist/commands/addon/list.d.ts.map +1 -0
- package/dist/commands/addon/list.js +102 -0
- package/dist/commands/addon/list.js.map +1 -0
- package/dist/commands/addon/manifest-refresh.d.ts +17 -0
- package/dist/commands/addon/manifest-refresh.d.ts.map +1 -0
- package/dist/commands/addon/manifest-refresh.js +48 -0
- package/dist/commands/addon/manifest-refresh.js.map +1 -0
- package/dist/commands/addon/migrate.d.ts +40 -0
- package/dist/commands/addon/migrate.d.ts.map +1 -0
- package/dist/commands/addon/migrate.js +236 -0
- package/dist/commands/addon/migrate.js.map +1 -0
- package/dist/commands/addon/publish.d.ts +33 -0
- package/dist/commands/addon/publish.d.ts.map +1 -0
- package/dist/commands/addon/publish.js +236 -0
- package/dist/commands/addon/publish.js.map +1 -0
- package/dist/commands/addon/scaffold-quality.d.ts +21 -0
- package/dist/commands/addon/scaffold-quality.d.ts.map +1 -0
- package/dist/commands/addon/scaffold-quality.js +90 -0
- package/dist/commands/addon/scaffold-quality.js.map +1 -0
- package/dist/commands/addon/sign.d.ts +9 -0
- package/dist/commands/addon/sign.d.ts.map +1 -0
- package/dist/commands/addon/sign.js +83 -0
- package/dist/commands/addon/sign.js.map +1 -0
- package/dist/commands/addon/toggle.d.ts +6 -0
- package/dist/commands/addon/toggle.d.ts.map +1 -0
- package/dist/commands/addon/toggle.js +46 -0
- package/dist/commands/addon/toggle.js.map +1 -0
- package/dist/commands/agent/index.d.ts +34 -0
- package/dist/commands/agent/index.d.ts.map +1 -0
- package/dist/commands/agent/index.js +564 -0
- package/dist/commands/agent/index.js.map +1 -0
- package/dist/commands/brand/index.d.ts +54 -0
- package/dist/commands/brand/index.d.ts.map +1 -0
- package/dist/commands/brand/index.js +367 -0
- package/dist/commands/brand/index.js.map +1 -0
- package/dist/commands/build/index.d.ts +53 -0
- package/dist/commands/build/index.d.ts.map +1 -0
- package/dist/commands/build/index.js +726 -0
- package/dist/commands/build/index.js.map +1 -0
- package/dist/commands/cache/flush-local.d.ts +31 -0
- package/dist/commands/cache/flush-local.d.ts.map +1 -0
- package/dist/commands/cache/flush-local.js +161 -0
- package/dist/commands/cache/flush-local.js.map +1 -0
- package/dist/commands/cache/index.d.ts +14 -0
- package/dist/commands/cache/index.d.ts.map +1 -0
- package/dist/commands/cache/index.js +453 -0
- package/dist/commands/cache/index.js.map +1 -0
- package/dist/commands/check/index.d.ts +8 -0
- package/dist/commands/check/index.d.ts.map +1 -0
- package/dist/commands/check/index.js +1316 -0
- package/dist/commands/check/index.js.map +1 -0
- package/dist/commands/cloudflare/index.d.ts +8 -0
- package/dist/commands/cloudflare/index.d.ts.map +1 -0
- package/dist/commands/cloudflare/index.js +453 -0
- package/dist/commands/cloudflare/index.js.map +1 -0
- package/dist/commands/core/create.d.ts +12 -0
- package/dist/commands/core/create.d.ts.map +1 -0
- package/dist/commands/core/create.js +206 -0
- package/dist/commands/core/create.js.map +1 -0
- package/dist/commands/core/delete.d.ts +11 -0
- package/dist/commands/core/delete.d.ts.map +1 -0
- package/dist/commands/core/delete.js +64 -0
- package/dist/commands/core/delete.js.map +1 -0
- package/dist/commands/core/env.d.ts +12 -0
- package/dist/commands/core/env.d.ts.map +1 -0
- package/dist/commands/core/env.js +95 -0
- package/dist/commands/core/env.js.map +1 -0
- package/dist/commands/core/health.d.ts +6 -0
- package/dist/commands/core/health.d.ts.map +1 -0
- package/dist/commands/core/health.js +215 -0
- package/dist/commands/core/health.js.map +1 -0
- package/dist/commands/core/index.d.ts +15 -0
- package/dist/commands/core/index.d.ts.map +1 -0
- package/dist/commands/core/index.js +86 -0
- package/dist/commands/core/index.js.map +1 -0
- package/dist/commands/core/list.d.ts +11 -0
- package/dist/commands/core/list.d.ts.map +1 -0
- package/dist/commands/core/list.js +58 -0
- package/dist/commands/core/list.js.map +1 -0
- package/dist/commands/core/rebuild.d.ts +13 -0
- package/dist/commands/core/rebuild.d.ts.map +1 -0
- package/dist/commands/core/rebuild.js +119 -0
- package/dist/commands/core/rebuild.js.map +1 -0
- package/dist/commands/db/index.d.ts +23 -0
- package/dist/commands/db/index.d.ts.map +1 -0
- package/dist/commands/db/index.js +355 -0
- package/dist/commands/db/index.js.map +1 -0
- package/dist/commands/db/promote-silo.d.ts +320 -0
- package/dist/commands/db/promote-silo.d.ts.map +1 -0
- package/dist/commands/db/promote-silo.js +930 -0
- package/dist/commands/db/promote-silo.js.map +1 -0
- package/dist/commands/db/relocate.d.ts +41 -0
- package/dist/commands/db/relocate.d.ts.map +1 -0
- package/dist/commands/db/relocate.js +482 -0
- package/dist/commands/db/relocate.js.map +1 -0
- package/dist/commands/db/rollback-silo.d.ts +44 -0
- package/dist/commands/db/rollback-silo.d.ts.map +1 -0
- package/dist/commands/db/rollback-silo.js +402 -0
- package/dist/commands/db/rollback-silo.js.map +1 -0
- package/dist/commands/deploy/index.d.ts +26 -0
- package/dist/commands/deploy/index.d.ts.map +1 -0
- package/dist/commands/deploy/index.js +107 -0
- package/dist/commands/deploy/index.js.map +1 -0
- package/dist/commands/devops/index.d.ts +6 -0
- package/dist/commands/devops/index.d.ts.map +1 -0
- package/dist/commands/devops/index.js +220 -0
- package/dist/commands/devops/index.js.map +1 -0
- package/dist/commands/domain/index.d.ts +8 -0
- package/dist/commands/domain/index.d.ts.map +1 -0
- package/dist/commands/domain/index.js +386 -0
- package/dist/commands/domain/index.js.map +1 -0
- package/dist/commands/image/index.d.ts +8 -0
- package/dist/commands/image/index.d.ts.map +1 -0
- package/dist/commands/image/index.js +308 -0
- package/dist/commands/image/index.js.map +1 -0
- package/dist/commands/install/factory-reset.d.ts +21 -0
- package/dist/commands/install/factory-reset.d.ts.map +1 -0
- package/dist/commands/install/factory-reset.js +83 -0
- package/dist/commands/install/factory-reset.js.map +1 -0
- package/dist/commands/install/index.d.ts +17 -0
- package/dist/commands/install/index.d.ts.map +1 -0
- package/dist/commands/install/index.js +44 -0
- package/dist/commands/install/index.js.map +1 -0
- package/dist/commands/install/install.d.ts +35 -0
- package/dist/commands/install/install.d.ts.map +1 -0
- package/dist/commands/install/install.js +171 -0
- package/dist/commands/install/install.js.map +1 -0
- package/dist/commands/login/index.d.ts +15 -0
- package/dist/commands/login/index.d.ts.map +1 -0
- package/dist/commands/login/index.js +58 -0
- package/dist/commands/login/index.js.map +1 -0
- package/dist/commands/nginx/index.d.ts +11 -0
- package/dist/commands/nginx/index.d.ts.map +1 -0
- package/dist/commands/nginx/index.js +580 -0
- package/dist/commands/nginx/index.js.map +1 -0
- package/dist/commands/server/bootstrap.d.ts +25 -0
- package/dist/commands/server/bootstrap.d.ts.map +1 -0
- package/dist/commands/server/bootstrap.js +260 -0
- package/dist/commands/server/bootstrap.js.map +1 -0
- package/dist/commands/server/index.d.ts +8 -0
- package/dist/commands/server/index.d.ts.map +1 -0
- package/dist/commands/server/index.js +2524 -0
- package/dist/commands/server/index.js.map +1 -0
- package/dist/commands/setup/index.d.ts +34 -0
- package/dist/commands/setup/index.d.ts.map +1 -0
- package/dist/commands/setup/index.js +423 -0
- package/dist/commands/setup/index.js.map +1 -0
- package/dist/commands/ssl/index.d.ts +8 -0
- package/dist/commands/ssl/index.d.ts.map +1 -0
- package/dist/commands/ssl/index.js +275 -0
- package/dist/commands/ssl/index.js.map +1 -0
- package/dist/commands/superadmin/index.d.ts +16 -0
- package/dist/commands/superadmin/index.d.ts.map +1 -0
- package/dist/commands/superadmin/index.js +81 -0
- package/dist/commands/superadmin/index.js.map +1 -0
- package/dist/commands/tenant/index.d.ts +6 -0
- package/dist/commands/tenant/index.d.ts.map +1 -0
- package/dist/commands/tenant/index.js +192 -0
- package/dist/commands/tenant/index.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/addon-sign.d.ts +23 -0
- package/dist/lib/addon-sign.d.ts.map +1 -0
- package/dist/lib/addon-sign.js +39 -0
- package/dist/lib/addon-sign.js.map +1 -0
- package/dist/lib/addon-sign.test.d.ts +2 -0
- package/dist/lib/addon-sign.test.d.ts.map +1 -0
- package/dist/lib/addon-sign.test.js +27 -0
- package/dist/lib/addon-sign.test.js.map +1 -0
- package/dist/lib/cdn.d.ts +25 -0
- package/dist/lib/cdn.d.ts.map +1 -0
- package/dist/lib/cdn.js +131 -0
- package/dist/lib/cdn.js.map +1 -0
- package/dist/lib/cloudflare.d.ts +133 -0
- package/dist/lib/cloudflare.d.ts.map +1 -0
- package/dist/lib/cloudflare.js +435 -0
- package/dist/lib/cloudflare.js.map +1 -0
- package/dist/lib/config.d.ts +96 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +132 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/env.d.ts +8 -0
- package/dist/lib/env.d.ts.map +1 -0
- package/dist/lib/env.js +64 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/hosts.d.ts +194 -0
- package/dist/lib/hosts.d.ts.map +1 -0
- package/dist/lib/hosts.js +183 -0
- package/dist/lib/hosts.js.map +1 -0
- package/dist/lib/logger.d.ts +68 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +130 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/nginx-config.d.ts +78 -0
- package/dist/lib/nginx-config.d.ts.map +1 -0
- package/dist/lib/nginx-config.js +736 -0
- package/dist/lib/nginx-config.js.map +1 -0
- package/dist/lib/ops/addon-dev.d.ts +93 -0
- package/dist/lib/ops/addon-dev.d.ts.map +1 -0
- package/dist/lib/ops/addon-dev.js +237 -0
- package/dist/lib/ops/addon-dev.js.map +1 -0
- package/dist/lib/ops/addon-quality.d.ts +38 -0
- package/dist/lib/ops/addon-quality.d.ts.map +1 -0
- package/dist/lib/ops/addon-quality.js +338 -0
- package/dist/lib/ops/addon-quality.js.map +1 -0
- package/dist/lib/ops/addon-routes.d.ts +49 -0
- package/dist/lib/ops/addon-routes.d.ts.map +1 -0
- package/dist/lib/ops/addon-routes.js +189 -0
- package/dist/lib/ops/addon-routes.js.map +1 -0
- package/dist/lib/ops/addon.d.ts +120 -0
- package/dist/lib/ops/addon.d.ts.map +1 -0
- package/dist/lib/ops/addon.js +260 -0
- package/dist/lib/ops/addon.js.map +1 -0
- package/dist/lib/ops/cdn.d.ts +87 -0
- package/dist/lib/ops/cdn.d.ts.map +1 -0
- package/dist/lib/ops/cdn.js +170 -0
- package/dist/lib/ops/cdn.js.map +1 -0
- package/dist/lib/ops/cf.d.ts +36 -0
- package/dist/lib/ops/cf.d.ts.map +1 -0
- package/dist/lib/ops/cf.js +114 -0
- package/dist/lib/ops/cf.js.map +1 -0
- package/dist/lib/ops/compose.d.ts +95 -0
- package/dist/lib/ops/compose.d.ts.map +1 -0
- package/dist/lib/ops/compose.js +165 -0
- package/dist/lib/ops/compose.js.map +1 -0
- package/dist/lib/ops/core.d.ts +117 -0
- package/dist/lib/ops/core.d.ts.map +1 -0
- package/dist/lib/ops/core.js +322 -0
- package/dist/lib/ops/core.js.map +1 -0
- package/dist/lib/ops/db.d.ts +116 -0
- package/dist/lib/ops/db.d.ts.map +1 -0
- package/dist/lib/ops/db.js +351 -0
- package/dist/lib/ops/db.js.map +1 -0
- package/dist/lib/ops/dns.d.ts +111 -0
- package/dist/lib/ops/dns.d.ts.map +1 -0
- package/dist/lib/ops/dns.js +306 -0
- package/dist/lib/ops/dns.js.map +1 -0
- package/dist/lib/ops/image.d.ts +94 -0
- package/dist/lib/ops/image.d.ts.map +1 -0
- package/dist/lib/ops/image.js +159 -0
- package/dist/lib/ops/image.js.map +1 -0
- package/dist/lib/ops/nginx.d.ts +114 -0
- package/dist/lib/ops/nginx.d.ts.map +1 -0
- package/dist/lib/ops/nginx.js +388 -0
- package/dist/lib/ops/nginx.js.map +1 -0
- package/dist/lib/ops/redis.d.ts +7 -0
- package/dist/lib/ops/redis.d.ts.map +1 -0
- package/dist/lib/ops/redis.js +35 -0
- package/dist/lib/ops/redis.js.map +1 -0
- package/dist/lib/ops/ssh.d.ts +127 -0
- package/dist/lib/ops/ssh.d.ts.map +1 -0
- package/dist/lib/ops/ssh.js +269 -0
- package/dist/lib/ops/ssh.js.map +1 -0
- package/dist/lib/prompts.d.ts +46 -0
- package/dist/lib/prompts.d.ts.map +1 -0
- package/dist/lib/prompts.js +113 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/sast.d.ts +43 -0
- package/dist/lib/sast.d.ts.map +1 -0
- package/dist/lib/sast.js +79 -0
- package/dist/lib/sast.js.map +1 -0
- package/dist/lib/sast.test.d.ts +2 -0
- package/dist/lib/sast.test.d.ts.map +1 -0
- package/dist/lib/sast.test.js +33 -0
- package/dist/lib/sast.test.js.map +1 -0
- package/dist/lib/shell.d.ts +61 -0
- package/dist/lib/shell.d.ts.map +1 -0
- package/dist/lib/shell.js +183 -0
- package/dist/lib/shell.js.map +1 -0
- package/dist/lib/ssh-config.d.ts +37 -0
- package/dist/lib/ssh-config.d.ts.map +1 -0
- package/dist/lib/ssh-config.js +122 -0
- package/dist/lib/ssh-config.js.map +1 -0
- package/dist/lib/tenant-scope.d.ts +38 -0
- package/dist/lib/tenant-scope.d.ts.map +1 -0
- package/dist/lib/tenant-scope.js +129 -0
- package/dist/lib/tenant-scope.js.map +1 -0
- package/dist/lib/tenant-scope.test.d.ts +2 -0
- package/dist/lib/tenant-scope.test.d.ts.map +1 -0
- package/dist/lib/tenant-scope.test.js +223 -0
- package/dist/lib/tenant-scope.test.js.map +1 -0
- package/package.json +58 -0
- package/templates/bootstrap/.env.template +54 -0
- package/templates/bootstrap/docker-compose.yml +145 -0
- package/templates/vhost.conf.tmpl +446 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/image/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwD5D"}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CiCore CLI - Docker Image Management
|
|
3
|
+
*
|
|
4
|
+
* Build, push, and pull Docker images
|
|
5
|
+
*/
|
|
6
|
+
import { log, spinner } from '../../lib/logger.js';
|
|
7
|
+
import { exec } from '../../lib/shell.js';
|
|
8
|
+
import { paths, getDockerRegistry } from '../../lib/config.js';
|
|
9
|
+
import { confirm } from '../../lib/prompts.js';
|
|
10
|
+
import { getSSHHost, buildSSHCommand } from '../../lib/ssh-config.js';
|
|
11
|
+
const IMAGES = {
|
|
12
|
+
nuxt: {
|
|
13
|
+
name: 'vucore-nuxt',
|
|
14
|
+
dockerfile: 'Dockerfile.nuxt.production',
|
|
15
|
+
description: 'Nuxt.js frontend application',
|
|
16
|
+
},
|
|
17
|
+
php: {
|
|
18
|
+
name: 'vucore-php',
|
|
19
|
+
dockerfile: 'Dockerfile.php.production',
|
|
20
|
+
description: 'PHP backend API',
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
export function registerImageCommands(program) {
|
|
24
|
+
const image = program
|
|
25
|
+
.command('image')
|
|
26
|
+
.description('Docker image management');
|
|
27
|
+
// vu image:build
|
|
28
|
+
image
|
|
29
|
+
.command('build')
|
|
30
|
+
.description('Build Docker image locally')
|
|
31
|
+
.option('-i, --image <type>', 'Image type (nuxt, php)', 'nuxt')
|
|
32
|
+
.option('-t, --tag <tag>', 'Image tag', 'latest')
|
|
33
|
+
.option('--no-cache', 'Build without cache')
|
|
34
|
+
.action(async (options) => {
|
|
35
|
+
await buildImage(options);
|
|
36
|
+
});
|
|
37
|
+
// vu image:push
|
|
38
|
+
image
|
|
39
|
+
.command('push')
|
|
40
|
+
.description('Push image to Docker Hub')
|
|
41
|
+
.option('-i, --image <type>', 'Image type (nuxt, php)', 'nuxt')
|
|
42
|
+
.option('-t, --tag <tag>', 'Image tag', 'latest')
|
|
43
|
+
.action(async (options) => {
|
|
44
|
+
await pushImage(options);
|
|
45
|
+
});
|
|
46
|
+
// vu image:pull
|
|
47
|
+
image
|
|
48
|
+
.command('pull')
|
|
49
|
+
.description('Pull image on remote server')
|
|
50
|
+
.option('-h, --host <host>', 'SSH host name', 'cicore')
|
|
51
|
+
.option('-i, --image <type>', 'Image type (nuxt, php)', 'nuxt')
|
|
52
|
+
.option('-t, --tag <tag>', 'Image tag', 'latest')
|
|
53
|
+
.option('--rebuild', 'Rebuild container after pull')
|
|
54
|
+
.action(async (options) => {
|
|
55
|
+
await pullImage(options);
|
|
56
|
+
});
|
|
57
|
+
// vu image:list
|
|
58
|
+
image
|
|
59
|
+
.command('list')
|
|
60
|
+
.alias('ls')
|
|
61
|
+
.description('List local ciCore images')
|
|
62
|
+
.action(async () => {
|
|
63
|
+
await listImages();
|
|
64
|
+
});
|
|
65
|
+
// vu image:prune
|
|
66
|
+
image
|
|
67
|
+
.command('prune')
|
|
68
|
+
.description('Remove old/unused images')
|
|
69
|
+
.option('-h, --host <host>', 'SSH host (or "local" for local)', 'local')
|
|
70
|
+
.option('-f, --force', 'Skip confirmation')
|
|
71
|
+
.action(async (options) => {
|
|
72
|
+
await pruneImages(options);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
// ============================================
|
|
76
|
+
// BUILD IMAGE (with live progress)
|
|
77
|
+
// ============================================
|
|
78
|
+
async function buildImage(options) {
|
|
79
|
+
const imageType = options.image;
|
|
80
|
+
const imageConfig = IMAGES[imageType];
|
|
81
|
+
if (!imageConfig) {
|
|
82
|
+
log.error(`Unknown image type: ${imageType}`);
|
|
83
|
+
log.info('Available: nuxt, php');
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const registry = getDockerRegistry();
|
|
87
|
+
const fullImageName = `${registry}/${imageConfig.name}:${options.tag}`;
|
|
88
|
+
log.title(`🔨 Build Image: ${imageConfig.name}`);
|
|
89
|
+
log.kv('Dockerfile', imageConfig.dockerfile);
|
|
90
|
+
log.kv('Tag', fullImageName);
|
|
91
|
+
log.kv('Cache', options.cache !== false ? 'Yes' : 'No');
|
|
92
|
+
log.blank();
|
|
93
|
+
const shouldBuild = await confirm('Start build?', true);
|
|
94
|
+
if (!shouldBuild) {
|
|
95
|
+
log.warn('Cancelled');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const startTime = Date.now();
|
|
99
|
+
log.info('Building image (live output)...');
|
|
100
|
+
log.blank();
|
|
101
|
+
const args = [
|
|
102
|
+
'build',
|
|
103
|
+
'-f', imageConfig.dockerfile,
|
|
104
|
+
'-t', fullImageName,
|
|
105
|
+
];
|
|
106
|
+
if (options.cache === false) {
|
|
107
|
+
args.push('--no-cache');
|
|
108
|
+
}
|
|
109
|
+
args.push('.');
|
|
110
|
+
// Use streaming exec for live output
|
|
111
|
+
const result = await exec('docker', args, {
|
|
112
|
+
cwd: paths.dev.root,
|
|
113
|
+
silent: false, // Show live output
|
|
114
|
+
stream: true
|
|
115
|
+
});
|
|
116
|
+
log.blank();
|
|
117
|
+
if (!result.success) {
|
|
118
|
+
log.error('❌ Build failed');
|
|
119
|
+
if (result.stderr) {
|
|
120
|
+
log.error(result.stderr);
|
|
121
|
+
}
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
125
|
+
log.success(`✅ Image built: ${fullImageName} (${elapsed}s)`);
|
|
126
|
+
// Show image size
|
|
127
|
+
const sizeResult = await exec('docker', ['images', fullImageName, '--format', '{{.Size}}'], { silent: true });
|
|
128
|
+
if (sizeResult.success) {
|
|
129
|
+
log.kv('Size', sizeResult.stdout.trim());
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// ============================================
|
|
133
|
+
// PUSH IMAGE (with live progress)
|
|
134
|
+
// ============================================
|
|
135
|
+
async function pushImage(options) {
|
|
136
|
+
const imageType = options.image;
|
|
137
|
+
const imageConfig = IMAGES[imageType];
|
|
138
|
+
if (!imageConfig) {
|
|
139
|
+
log.error(`Unknown image type: ${imageType}`);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const registry = getDockerRegistry();
|
|
143
|
+
const fullImageName = `${registry}/${imageConfig.name}:${options.tag}`;
|
|
144
|
+
log.title(`📤 Push Image: ${imageConfig.name}`);
|
|
145
|
+
log.kv('Image', fullImageName);
|
|
146
|
+
log.kv('Registry', registry);
|
|
147
|
+
log.blank();
|
|
148
|
+
// Check if image exists locally
|
|
149
|
+
const checkResult = await exec('docker', ['images', '-q', fullImageName], { silent: true });
|
|
150
|
+
if (!checkResult.stdout.trim()) {
|
|
151
|
+
log.error(`Image not found locally: ${fullImageName}`);
|
|
152
|
+
log.info('Build first: vu image build --image ' + imageType);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const shouldPush = await confirm('Push to Docker Hub?', true);
|
|
156
|
+
if (!shouldPush) {
|
|
157
|
+
log.warn('Cancelled');
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const startTime = Date.now();
|
|
161
|
+
log.info('Pushing to Docker Hub (live progress)...');
|
|
162
|
+
log.blank();
|
|
163
|
+
// Stream push output for real-time progress
|
|
164
|
+
const result = await exec('docker', ['push', fullImageName], {
|
|
165
|
+
silent: false,
|
|
166
|
+
stream: true
|
|
167
|
+
});
|
|
168
|
+
log.blank();
|
|
169
|
+
if (!result.success) {
|
|
170
|
+
log.error('❌ Push failed');
|
|
171
|
+
log.info('Make sure you are logged in: docker login');
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
175
|
+
log.success(`✅ Image pushed: ${fullImageName} (${elapsed}s)`);
|
|
176
|
+
}
|
|
177
|
+
// ============================================
|
|
178
|
+
// PULL IMAGE (with live progress)
|
|
179
|
+
// ============================================
|
|
180
|
+
async function pullImage(options) {
|
|
181
|
+
const imageType = options.image;
|
|
182
|
+
const imageConfig = IMAGES[imageType];
|
|
183
|
+
if (!imageConfig) {
|
|
184
|
+
log.error(`Unknown image type: ${imageType}`);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const host = await getSSHHost(options.host);
|
|
188
|
+
if (!host) {
|
|
189
|
+
log.error(`SSH host "${options.host}" not found`);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const registry = getDockerRegistry();
|
|
193
|
+
const fullImageName = `${registry}/${imageConfig.name}:${options.tag}`;
|
|
194
|
+
log.title(`📥 Pull Image: ${imageConfig.name}`);
|
|
195
|
+
log.kv('Image', fullImageName);
|
|
196
|
+
log.kv('Server', `${host.name} (${host.hostname})`);
|
|
197
|
+
log.kv('Rebuild', options.rebuild ? 'Yes' : 'No');
|
|
198
|
+
log.blank();
|
|
199
|
+
const shouldPull = await confirm('Pull image on server?', true);
|
|
200
|
+
if (!shouldPull) {
|
|
201
|
+
log.warn('Cancelled');
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const startTime = Date.now();
|
|
205
|
+
log.info('Pulling image on server (live progress)...');
|
|
206
|
+
log.blank();
|
|
207
|
+
// Stream pull output for real-time progress
|
|
208
|
+
const args = buildSSHCommand(host, `docker pull ${fullImageName}`);
|
|
209
|
+
const result = await exec('ssh', args, { silent: false, stream: true });
|
|
210
|
+
log.blank();
|
|
211
|
+
if (!result.success) {
|
|
212
|
+
log.error('❌ Pull failed');
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
216
|
+
log.success(`✅ Image pulled (${elapsed}s)`);
|
|
217
|
+
// Rebuild container if requested
|
|
218
|
+
if (options.rebuild) {
|
|
219
|
+
log.blank();
|
|
220
|
+
log.info('Rebuilding container...');
|
|
221
|
+
log.blank();
|
|
222
|
+
const composeFile = imageType === 'nuxt'
|
|
223
|
+
? '/home/services/docker-core-nuxt.yml'
|
|
224
|
+
: '/home/services/docker-core-php.yml';
|
|
225
|
+
const service = imageType === 'nuxt' ? 'nuxt' : 'php';
|
|
226
|
+
const rebuildCmd = `docker compose -f ${composeFile} up -d ${service} --force-recreate`;
|
|
227
|
+
const rebuildArgs = buildSSHCommand(host, rebuildCmd);
|
|
228
|
+
const rebuildResult = await exec('ssh', rebuildArgs, { silent: false, stream: true });
|
|
229
|
+
log.blank();
|
|
230
|
+
if (!rebuildResult.success) {
|
|
231
|
+
log.error('❌ Rebuild failed');
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
log.success('✅ Container rebuilt');
|
|
235
|
+
}
|
|
236
|
+
log.blank();
|
|
237
|
+
log.success('🎉 Done!');
|
|
238
|
+
}
|
|
239
|
+
// ============================================
|
|
240
|
+
// LIST IMAGES
|
|
241
|
+
// ============================================
|
|
242
|
+
async function listImages() {
|
|
243
|
+
log.title('Local ciCore Images');
|
|
244
|
+
const registry = getDockerRegistry();
|
|
245
|
+
const result = await exec('docker', [
|
|
246
|
+
'images',
|
|
247
|
+
'--filter', `reference=${registry}/cicore-*`,
|
|
248
|
+
'--format', 'table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedSince}}'
|
|
249
|
+
], { silent: true });
|
|
250
|
+
if (!result.success) {
|
|
251
|
+
log.error('Failed to list images');
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
if (!result.stdout.trim()) {
|
|
255
|
+
log.info('No ciCore images found');
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
console.log(result.stdout);
|
|
259
|
+
}
|
|
260
|
+
// ============================================
|
|
261
|
+
// PRUNE IMAGES
|
|
262
|
+
// ============================================
|
|
263
|
+
async function pruneImages(options) {
|
|
264
|
+
log.title('🧹 Prune Images');
|
|
265
|
+
if (options.host === 'local') {
|
|
266
|
+
// Local prune
|
|
267
|
+
if (!options.force) {
|
|
268
|
+
const shouldPrune = await confirm('Remove unused Docker images?', false);
|
|
269
|
+
if (!shouldPrune) {
|
|
270
|
+
log.warn('Cancelled');
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
const pruneSpinner = spinner('Removing unused images...').start();
|
|
275
|
+
const result = await exec('docker', ['image', 'prune', '-af'], { silent: true });
|
|
276
|
+
if (!result.success) {
|
|
277
|
+
pruneSpinner.fail('Prune failed');
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
pruneSpinner.succeed('Unused images removed');
|
|
281
|
+
log.info(result.stdout);
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
// Remote prune
|
|
285
|
+
const host = await getSSHHost(options.host);
|
|
286
|
+
if (!host) {
|
|
287
|
+
log.error(`SSH host "${options.host}" not found`);
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
if (!options.force) {
|
|
291
|
+
const shouldPrune = await confirm(`Remove unused images on ${host.name}?`, false);
|
|
292
|
+
if (!shouldPrune) {
|
|
293
|
+
log.warn('Cancelled');
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
const pruneSpinner = spinner('Removing unused images on server...').start();
|
|
298
|
+
const args = buildSSHCommand(host, 'docker image prune -af');
|
|
299
|
+
const result = await exec('ssh', args, { silent: true });
|
|
300
|
+
if (!result.success) {
|
|
301
|
+
pruneSpinner.fail('Prune failed');
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
pruneSpinner.succeed('Unused images removed');
|
|
305
|
+
log.info(result.stdout);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/image/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ci factory-reset — interactive CLI front for SetupController::factoryReset
|
|
3
|
+
*
|
|
4
|
+
* Calls the `/install/factoryreset` endpoint after a two-step danger
|
|
5
|
+
* confirmation: a yes/no prompt, then re-typing the literal string
|
|
6
|
+
* "FACTORY RESET" (mirrors the double-confirm pattern from the web UI).
|
|
7
|
+
* Operator must also provide the current super-admin password — the
|
|
8
|
+
* backend uses it to prove ownership before dropping the database.
|
|
9
|
+
*
|
|
10
|
+
* Used for: wiping a dev/staging install back to factory state without
|
|
11
|
+
* spinning down the stack. Production should never run this — there is
|
|
12
|
+
* no rollback once the DROP DATABASE commits.
|
|
13
|
+
*/
|
|
14
|
+
export interface FactoryResetOptions {
|
|
15
|
+
readonly apiBase?: string;
|
|
16
|
+
readonly dbName?: string;
|
|
17
|
+
readonly password?: string;
|
|
18
|
+
readonly yes?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function runFactoryReset(options: FactoryResetOptions): Promise<void>;
|
|
21
|
+
//# sourceMappingURL=factory-reset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory-reset.d.ts","sourceRoot":"","sources":["../../../src/commands/install/factory-reset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CACvB;AAOD,wBAAsB,eAAe,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEjF"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ci factory-reset — interactive CLI front for SetupController::factoryReset
|
|
3
|
+
*
|
|
4
|
+
* Calls the `/install/factoryreset` endpoint after a two-step danger
|
|
5
|
+
* confirmation: a yes/no prompt, then re-typing the literal string
|
|
6
|
+
* "FACTORY RESET" (mirrors the double-confirm pattern from the web UI).
|
|
7
|
+
* Operator must also provide the current super-admin password — the
|
|
8
|
+
* backend uses it to prove ownership before dropping the database.
|
|
9
|
+
*
|
|
10
|
+
* Used for: wiping a dev/staging install back to factory state without
|
|
11
|
+
* spinning down the stack. Production should never run this — there is
|
|
12
|
+
* no rollback once the DROP DATABASE commits.
|
|
13
|
+
*/
|
|
14
|
+
import { input, confirm, password as passwordPrompt } from '../../lib/prompts.js';
|
|
15
|
+
import { log, spinner } from '../../lib/logger.js';
|
|
16
|
+
import chalk from 'chalk';
|
|
17
|
+
// Backend expects this exact string in the `confirm_dangerous` field —
|
|
18
|
+
// changing it on the CLI side without matching the backend would silently
|
|
19
|
+
// fail every reset. Keep in sync with SetupController::factoryReset.
|
|
20
|
+
const CONFIRM_PHRASE = 'RESET_EVERYTHING';
|
|
21
|
+
export async function runFactoryReset(options) {
|
|
22
|
+
const apiBase = (options.apiBase ?? 'http://localhost:3080').replace(/\/$/, '');
|
|
23
|
+
log.blank();
|
|
24
|
+
log.warn(chalk.red.bold('⚠ DANGER — Factory Reset'));
|
|
25
|
+
log.warn('This will DROP the application database and wipe all data.');
|
|
26
|
+
log.warn('There is NO recovery from this. Backups must be taken first.');
|
|
27
|
+
log.info(`Target API: ${apiBase}`);
|
|
28
|
+
log.blank();
|
|
29
|
+
if (options.yes !== true) {
|
|
30
|
+
const first = await confirm('Do you really want to factory-reset this installation?', false);
|
|
31
|
+
if (!first) {
|
|
32
|
+
log.info('Cancelled');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const typed = await input(`Type ${chalk.red.bold(CONFIRM_PHRASE)} to confirm`);
|
|
36
|
+
if (typed.trim() !== CONFIRM_PHRASE) {
|
|
37
|
+
log.warn('Confirmation phrase mismatch — cancelled');
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Backend asks for the current super-admin password before dropping. If
|
|
42
|
+
// the system was never fully installed (no users table, no super admin
|
|
43
|
+
// yet) the backend's verifySuperAdminPassword returns false and a
|
|
44
|
+
// reset is allowed regardless — we still ask, to be consistent.
|
|
45
|
+
const password = options.password ?? (await passwordPrompt('Super admin password (hidden)'));
|
|
46
|
+
const dbName = options.dbName ?? '';
|
|
47
|
+
const spin = spinner('Dropping database + resetting install state...').start();
|
|
48
|
+
let res;
|
|
49
|
+
try {
|
|
50
|
+
res = await fetch(`${apiBase}/setup/factory-reset`, {
|
|
51
|
+
method: 'POST',
|
|
52
|
+
headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
|
|
53
|
+
body: JSON.stringify({
|
|
54
|
+
super_admin_password: password,
|
|
55
|
+
confirm_dangerous: CONFIRM_PHRASE,
|
|
56
|
+
...(dbName !== '' ? { db_name: dbName } : {}),
|
|
57
|
+
}),
|
|
58
|
+
signal: AbortSignal.timeout(2 * 60 * 1000),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
spin.fail('Request failed');
|
|
63
|
+
log.error(err instanceof Error ? err.message : String(err));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
let body = {};
|
|
67
|
+
try {
|
|
68
|
+
body = (await res.json());
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
spin.fail(`HTTP ${res.status} — non-JSON response`);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (!res.ok || body.success === false) {
|
|
75
|
+
spin.fail('Factory reset failed');
|
|
76
|
+
log.error(body.message ?? `HTTP ${res.status}`);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
spin.succeed('Factory reset complete');
|
|
80
|
+
log.blank();
|
|
81
|
+
log.success(body.message ?? 'Installation wiped. Run `ci install` to set up again.');
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=factory-reset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory-reset.js","sourceRoot":"","sources":["../../../src/commands/install/factory-reset.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ci install` + `ci factory-reset` — top-level installation commands.
|
|
3
|
+
*
|
|
4
|
+
* These mirror the web UI at `/install/setup` and `/install/factoryreset`
|
|
5
|
+
* for operators who would rather drive the four-step wizard from a
|
|
6
|
+
* terminal than a browser. Backend stays the same (SetupController +
|
|
7
|
+
* SetupService); these commands are pure clients.
|
|
8
|
+
*
|
|
9
|
+
* Not to be confused with `ci setup <core>`, which provisions the
|
|
10
|
+
* filesystem + nginx + SSL skeleton for a brand-new core on a remote
|
|
11
|
+
* host. Setup runs once per core, before the app DB exists; `ci install`
|
|
12
|
+
* runs once per core, after the stack is up, to create the DB + super
|
|
13
|
+
* admin + run migrations.
|
|
14
|
+
*/
|
|
15
|
+
import type { Command } from 'commander';
|
|
16
|
+
export declare function registerInstallCommands(program: Command): void;
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/install/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAIxC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2B9D"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ci install` + `ci factory-reset` — top-level installation commands.
|
|
3
|
+
*
|
|
4
|
+
* These mirror the web UI at `/install/setup` and `/install/factoryreset`
|
|
5
|
+
* for operators who would rather drive the four-step wizard from a
|
|
6
|
+
* terminal than a browser. Backend stays the same (SetupController +
|
|
7
|
+
* SetupService); these commands are pure clients.
|
|
8
|
+
*
|
|
9
|
+
* Not to be confused with `ci setup <core>`, which provisions the
|
|
10
|
+
* filesystem + nginx + SSL skeleton for a brand-new core on a remote
|
|
11
|
+
* host. Setup runs once per core, before the app DB exists; `ci install`
|
|
12
|
+
* runs once per core, after the stack is up, to create the DB + super
|
|
13
|
+
* admin + run migrations.
|
|
14
|
+
*/
|
|
15
|
+
import { runInstall } from './install.js';
|
|
16
|
+
import { runFactoryReset } from './factory-reset.js';
|
|
17
|
+
export function registerInstallCommands(program) {
|
|
18
|
+
program
|
|
19
|
+
.command('install')
|
|
20
|
+
.description('Interactive app install: DB + super admin + migrations (POST /setup/install)')
|
|
21
|
+
.option('--api-base <url>', 'Backend API base URL', 'http://localhost:3080')
|
|
22
|
+
.option('--db-name <name>', 'Database name (skips prompt)')
|
|
23
|
+
.option('--gateway <gateway>', 'Database gateway: local | managed')
|
|
24
|
+
.option('--admin-name <name>', 'Super admin display name (skips prompt)')
|
|
25
|
+
.option('--admin-email <email>', 'Super admin email (skips prompt)')
|
|
26
|
+
.option('--admin-password <pw>', 'Super admin password (skips prompt — avoid on shared TTYs)')
|
|
27
|
+
.option('--tenant-mode <mode>', 'Tenant mode: subdomain | path')
|
|
28
|
+
.option('--tenant-name <name>', 'Tenant display name (skips prompt)')
|
|
29
|
+
.option('-y, --yes', 'Skip final confirmation', false)
|
|
30
|
+
.action(async (options) => {
|
|
31
|
+
await runInstall(options);
|
|
32
|
+
});
|
|
33
|
+
program
|
|
34
|
+
.command('factory-reset')
|
|
35
|
+
.description('DANGER: drop DB + reset install state (POST /setup/factory-reset)')
|
|
36
|
+
.option('--api-base <url>', 'Backend API base URL', 'http://localhost:3080')
|
|
37
|
+
.option('--db-name <name>', 'Database name (optional, backend auto-detects from .env)')
|
|
38
|
+
.option('--password <pw>', 'Super admin password (skips prompt)')
|
|
39
|
+
.option('-y, --yes', 'Skip both confirmation steps (DANGEROUS — use only in CI)', false)
|
|
40
|
+
.action(async (options) => {
|
|
41
|
+
await runFactoryReset(options);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/install/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEpD,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,8EAA8E,CAAC;SAC3F,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,uBAAuB,CAAC;SAC3E,MAAM,CAAC,kBAAkB,EAAE,8BAA8B,CAAC;SAC1D,MAAM,CAAC,qBAAqB,EAAE,mCAAmC,CAAC;SAClE,MAAM,CAAC,qBAAqB,EAAE,yCAAyC,CAAC;SACxE,MAAM,CAAC,uBAAuB,EAAE,kCAAkC,CAAC;SACnE,MAAM,CAAC,uBAAuB,EAAE,4DAA4D,CAAC;SAC7F,MAAM,CAAC,sBAAsB,EAAE,+BAA+B,CAAC;SAC/D,MAAM,CAAC,sBAAsB,EAAE,oCAAoC,CAAC;SACpE,MAAM,CAAC,WAAW,EAAE,yBAAyB,EAAE,KAAK,CAAC;SACrD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,UAAU,CAAC,OAAO,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEJ,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,mEAAmE,CAAC;SAChF,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,uBAAuB,CAAC;SAC3E,MAAM,CAAC,kBAAkB,EAAE,0DAA0D,CAAC;SACtF,MAAM,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;SAChE,MAAM,CAAC,WAAW,EAAE,2DAA2D,EAAE,KAAK,CAAC;SACvF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,eAAe,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ci install — interactive CLI front for SetupController::install
|
|
3
|
+
*
|
|
4
|
+
* Walks the operator through the four-step setup wizard that previously
|
|
5
|
+
* lived only in the `/install/setup` Nuxt page:
|
|
6
|
+
*
|
|
7
|
+
* 1. Database (name + gateway)
|
|
8
|
+
* 2. Super admin (name, email, password)
|
|
9
|
+
* 3. Tenant (mode + display name)
|
|
10
|
+
* 4. Confirm + POST → backend runs migrations + tenant/user creation
|
|
11
|
+
* inside a transaction; rolls back the whole thing on failure.
|
|
12
|
+
*
|
|
13
|
+
* Every prompt accepts a corresponding `--flag` so the same code path
|
|
14
|
+
* also runs in non-interactive contexts (CI, scripted setups). Required
|
|
15
|
+
* fields default to interactive when neither flag nor prompt value is
|
|
16
|
+
* provided.
|
|
17
|
+
*
|
|
18
|
+
* Talks to the API over plain HTTP — the backend exposes /install/* as
|
|
19
|
+
* unauthenticated only when the system is in initial-setup state; once
|
|
20
|
+
* the first super admin lands, the same endpoints require a super-admin
|
|
21
|
+
* session (handling that auth flow is FUTURE).
|
|
22
|
+
*/
|
|
23
|
+
export interface InstallOptions {
|
|
24
|
+
readonly apiBase?: string;
|
|
25
|
+
readonly dbName?: string;
|
|
26
|
+
readonly gateway?: string;
|
|
27
|
+
readonly adminName?: string;
|
|
28
|
+
readonly adminEmail?: string;
|
|
29
|
+
readonly adminPassword?: string;
|
|
30
|
+
readonly tenantMode?: string;
|
|
31
|
+
readonly tenantName?: string;
|
|
32
|
+
readonly yes?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export declare function runInstall(options: InstallOptions): Promise<void>;
|
|
35
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/commands/install/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CACvB;AAiBD,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA2JvE"}
|