@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":"create.js","sourceRoot":"","sources":["../../../src/commands/addon/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vu addon:delete <name> <core>
|
|
3
|
+
*
|
|
4
|
+
* Delete addon from server and optionally drop database tables
|
|
5
|
+
*/
|
|
6
|
+
interface DeleteOptions {
|
|
7
|
+
force?: boolean;
|
|
8
|
+
host?: string;
|
|
9
|
+
dropTables?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function deleteAddon(name: string, core: string, options: DeleteOptions): Promise<void>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=delete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/addon/delete.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AA8BD,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgEnG"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vu addon:delete <name> <core>
|
|
3
|
+
*
|
|
4
|
+
* Delete addon from server and optionally drop database tables
|
|
5
|
+
*/
|
|
6
|
+
import { log, spinner } from '../../lib/logger.js';
|
|
7
|
+
import { exec } from '../../lib/shell.js';
|
|
8
|
+
import { dangerConfirm, select } from '../../lib/prompts.js';
|
|
9
|
+
import { parseSSHConfig } from '../../lib/ssh-config.js';
|
|
10
|
+
// Get SSH host from config
|
|
11
|
+
async function getHost(hostName) {
|
|
12
|
+
const hosts = await parseSSHConfig();
|
|
13
|
+
if (hostName) {
|
|
14
|
+
const host = hosts.get(hostName);
|
|
15
|
+
if (!host) {
|
|
16
|
+
log.error(`Host "${hostName}" not found in SSH config`);
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return host;
|
|
20
|
+
}
|
|
21
|
+
// Interactive selection
|
|
22
|
+
if (hosts.size === 0) {
|
|
23
|
+
log.error('No SSH hosts found in ~/.ssh/config');
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
const choices = Array.from(hosts.values()).map(h => ({
|
|
27
|
+
name: h.name,
|
|
28
|
+
message: `${h.name} (${h.user}@${h.hostname})`
|
|
29
|
+
}));
|
|
30
|
+
const selected = await select('Select SSH host:', choices);
|
|
31
|
+
return hosts.get(selected) || null;
|
|
32
|
+
}
|
|
33
|
+
export async function deleteAddon(name, core, options) {
|
|
34
|
+
log.title(`Delete Addon: ${name} from ${core}`);
|
|
35
|
+
// Get SSH host
|
|
36
|
+
const host = await getHost(options.host);
|
|
37
|
+
if (!host) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// Helper to run SSH commands
|
|
41
|
+
const runSSH = async (cmd, silent = true) => {
|
|
42
|
+
return exec('ssh', [host.name, cmd], { silent });
|
|
43
|
+
};
|
|
44
|
+
const addonPath = `/home/cores/${core}/addons/${name}`;
|
|
45
|
+
const containerAddonPath = `/var/www/cores/${core}/addons/${name}`;
|
|
46
|
+
// Check addon exists
|
|
47
|
+
log.info(`Checking addon on ${host.name}...`);
|
|
48
|
+
const checkResult = await runSSH(`test -d ${addonPath} && echo "exists"`);
|
|
49
|
+
if (!checkResult.stdout.includes('exists')) {
|
|
50
|
+
log.error(`Addon "${name}" not found in ${core}`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// Confirm deletion
|
|
54
|
+
if (!options.force) {
|
|
55
|
+
const confirmed = await dangerConfirm(`Delete addon "${name}" from ${core}?`, name.toUpperCase());
|
|
56
|
+
if (!confirmed) {
|
|
57
|
+
log.warn('Cancelled');
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Delete addon files
|
|
62
|
+
const deleteSpinner = spinner('Deleting addon files...').start();
|
|
63
|
+
const result = await runSSH(`rm -rf ${addonPath}`);
|
|
64
|
+
if (!result.success) {
|
|
65
|
+
deleteSpinner.fail('Failed to delete addon');
|
|
66
|
+
log.error(result.stderr);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
deleteSpinner.succeed('Addon files deleted');
|
|
70
|
+
// Clear addon cache
|
|
71
|
+
const cacheSpinner = spinner('Clearing addon cache...').start();
|
|
72
|
+
await runSSH(`rm -rf /home/cores/${core}/storage/cache/addon_* 2>/dev/null || true`);
|
|
73
|
+
await runSSH(`docker exec cicore_php rm -rf /var/www/cores/${core}/storage/cache/addon_* 2>/dev/null || true`);
|
|
74
|
+
cacheSpinner.succeed('Cache cleared');
|
|
75
|
+
// Restart PHP to reload addon registry
|
|
76
|
+
const restartSpinner = spinner('Restarting PHP...').start();
|
|
77
|
+
await runSSH('docker restart cicore_php');
|
|
78
|
+
restartSpinner.succeed('PHP restarted');
|
|
79
|
+
log.blank();
|
|
80
|
+
log.success(`Addon "${name}" deleted from ${core}`);
|
|
81
|
+
log.info(`Server: ${host.name}`);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/addon/delete.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAW,MAAM,yBAAyB,CAAC;AAQlE,2BAA2B;AAC3B,KAAK,UAAU,OAAO,CAAC,QAAiB;IACtC,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAC;IAErC,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,KAAK,CAAC,SAAS,QAAQ,2BAA2B,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wBAAwB;IACxB,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACrB,GAAG,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnD,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,GAAG;KAC/C,CAAC,CAAC,CAAC;IAEJ,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAC3D,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,IAAY,EAAE,OAAsB;IAClF,GAAG,CAAC,KAAK,CAAC,iBAAiB,IAAI,SAAS,IAAI,EAAE,CAAC,CAAC;IAEhD,eAAe;IACf,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IAED,6BAA6B;IAC7B,MAAM,MAAM,GAAG,KAAK,EAAE,GAAW,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE;QAClD,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,eAAe,IAAI,WAAW,IAAI,EAAE,CAAC;IACvD,MAAM,kBAAkB,GAAG,kBAAkB,IAAI,WAAW,IAAI,EAAE,CAAC;IAEnE,qBAAqB;IACrB,GAAG,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,WAAW,SAAS,mBAAmB,CAAC,CAAC;IAE1E,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,kBAAkB,IAAI,EAAE,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IAED,mBAAmB;IACnB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,SAAS,GAAG,MAAM,aAAa,CACnC,iBAAiB,IAAI,UAAU,IAAI,GAAG,EACtC,IAAI,CAAC,WAAW,EAAE,CACnB,CAAC;QAEF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,MAAM,aAAa,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;IACjE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,SAAS,EAAE,CAAC,CAAC;IAEnD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,aAAa,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC7C,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IACD,aAAa,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAE7C,oBAAoB;IACpB,MAAM,YAAY,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;IAChE,MAAM,MAAM,CAAC,sBAAsB,IAAI,4CAA4C,CAAC,CAAC;IACrF,MAAM,MAAM,CAAC,gDAAgD,IAAI,4CAA4C,CAAC,CAAC;IAC/G,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAEtC,uCAAuC;IACvC,MAAM,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC;IAC5D,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;IAC1C,cAAc,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAExC,GAAG,CAAC,KAAK,EAAE,CAAC;IACZ,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,kBAAkB,IAAI,EAAE,CAAC,CAAC;IACpD,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ci addon deploy [--core <cicore|vucore>] [--path <addon-dir>]
|
|
3
|
+
*
|
|
4
|
+
* Personnel-friendly addon deploy. Differs from `ci addon install` in three
|
|
5
|
+
* ways suited to the addon-developer flow:
|
|
6
|
+
*
|
|
7
|
+
* - addon path defaults to the current working directory (the developer
|
|
8
|
+
* runs this from inside their cloned addon repo), not the monorepo's
|
|
9
|
+
* `addons/` tree.
|
|
10
|
+
* - host is implicit cicore (the staging instance hosts both tenants).
|
|
11
|
+
* - `--core` accepts only `cicore` or `vucore` — the two tenants
|
|
12
|
+
* served by the multi-tenant runtime — and is required.
|
|
13
|
+
*
|
|
14
|
+
* Everything downstream of packaging (upload to /home/cicore-deploy/
|
|
15
|
+
* incoming/, install-addon.sh trigger, container restarts) reuses the
|
|
16
|
+
* same primitives as `ci addon install`, so server-side behaviour and
|
|
17
|
+
* audit trail are identical.
|
|
18
|
+
*/
|
|
19
|
+
export interface DeployOptions {
|
|
20
|
+
readonly core?: string;
|
|
21
|
+
readonly path?: string;
|
|
22
|
+
readonly force?: boolean;
|
|
23
|
+
readonly dryRun?: boolean;
|
|
24
|
+
readonly quality?: boolean;
|
|
25
|
+
}
|
|
26
|
+
export declare function deployAddon(options: DeployOptions): Promise<void>;
|
|
27
|
+
//# sourceMappingURL=deploy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/addon/deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAoBH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IAIzB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAC3B;AASD,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAkJvE"}
|
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ci addon deploy [--core <cicore|vucore>] [--path <addon-dir>]
|
|
3
|
+
*
|
|
4
|
+
* Personnel-friendly addon deploy. Differs from `ci addon install` in three
|
|
5
|
+
* ways suited to the addon-developer flow:
|
|
6
|
+
*
|
|
7
|
+
* - addon path defaults to the current working directory (the developer
|
|
8
|
+
* runs this from inside their cloned addon repo), not the monorepo's
|
|
9
|
+
* `addons/` tree.
|
|
10
|
+
* - host is implicit cicore (the staging instance hosts both tenants).
|
|
11
|
+
* - `--core` accepts only `cicore` or `vucore` — the two tenants
|
|
12
|
+
* served by the multi-tenant runtime — and is required.
|
|
13
|
+
*
|
|
14
|
+
* Everything downstream of packaging (upload to /home/cicore-deploy/
|
|
15
|
+
* incoming/, install-addon.sh trigger, container restarts) reuses the
|
|
16
|
+
* same primitives as `ci addon install`, so server-side behaviour and
|
|
17
|
+
* audit trail are identical.
|
|
18
|
+
*/
|
|
19
|
+
import path from 'path';
|
|
20
|
+
import os from 'node:os';
|
|
21
|
+
import { execSync, spawnSync } from 'node:child_process';
|
|
22
|
+
import { glob } from 'glob';
|
|
23
|
+
import fs from 'fs-extra';
|
|
24
|
+
import enquirer from 'enquirer';
|
|
25
|
+
import { log, spinner } from '../../lib/logger.js';
|
|
26
|
+
import { getHostConfig } from '../../lib/hosts.js';
|
|
27
|
+
import { isDryRun } from '../../lib/config.js';
|
|
28
|
+
import { findShellRoot } from '../../lib/ops/addon-dev.js';
|
|
29
|
+
import { addonPackageBackend, addonInstallBackend, addonCleanupPackage, } from '../../lib/ops/addon.js';
|
|
30
|
+
import { confirm } from '../../lib/prompts.js';
|
|
31
|
+
import { analyzeTenantScope } from '../../lib/tenant-scope.js';
|
|
32
|
+
const ALLOWED_CORES = new Set(['cicore', 'vucore']);
|
|
33
|
+
// Both allowed cores are production tenants today. We treat any deploy
|
|
34
|
+
// to either as a production deploy and require the typed confirmation;
|
|
35
|
+
// staging tenant separation is tracked in plan FUTURE.
|
|
36
|
+
const PRODUCTION_CORES = new Set(['cicore', 'vucore']);
|
|
37
|
+
const DEPLOY_CONFIRMATION_PHRASE = 'DEPLOY TO PRODUCTION';
|
|
38
|
+
export async function deployAddon(options) {
|
|
39
|
+
log.title('Deploy Addon → cicore staging');
|
|
40
|
+
if (options.core === undefined || options.core === '') {
|
|
41
|
+
log.error('--core is required (cicore | vucore). Pass --core <name>.');
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (!ALLOWED_CORES.has(options.core)) {
|
|
45
|
+
log.error(`Invalid --core "${options.core}". Allowed: cicore | vucore.`);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const core = options.core;
|
|
49
|
+
const addonDir = path.resolve(options.path ?? process.cwd());
|
|
50
|
+
const addonJsonPath = path.join(addonDir, 'addon.json');
|
|
51
|
+
if (!(await fs.pathExists(addonJsonPath))) {
|
|
52
|
+
log.error(`addon.json not found at ${addonJsonPath}`);
|
|
53
|
+
log.info('Run this command from an addon directory, or pass --path <addon-dir>.');
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
let addonName;
|
|
57
|
+
try {
|
|
58
|
+
const addonJson = (await fs.readJson(addonJsonPath));
|
|
59
|
+
addonName = String(addonJson.name ?? '');
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
log.error(`Failed to read addon.json: ${err instanceof Error ? err.message : String(err)}`);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (!/^[A-Za-z0-9_-]+$/.test(addonName)) {
|
|
66
|
+
log.error(`Invalid addon name "${addonName}" in addon.json — only [A-Za-z0-9_-].`);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
log.info(`Addon: ${addonName}`);
|
|
70
|
+
log.info(`Source: ${addonDir}`);
|
|
71
|
+
log.info(`Target: cores/${core} on cicore staging`);
|
|
72
|
+
// Soft warning if the addon is a git repo with uncommitted changes — what
|
|
73
|
+
// gets deployed is the current filesystem state, not the last commit, so
|
|
74
|
+
// surfacing this prevents "wait, that's not what I pushed" surprises.
|
|
75
|
+
const dirty = isGitDirty(addonDir);
|
|
76
|
+
if (dirty === 'dirty') {
|
|
77
|
+
log.warn('addon directory has uncommitted changes — deploying current working tree, not the last commit.');
|
|
78
|
+
}
|
|
79
|
+
else if (dirty === 'untracked') {
|
|
80
|
+
log.warn('addon directory has untracked files — they will be included in the deploy.');
|
|
81
|
+
}
|
|
82
|
+
// ─── Quality gate ────────────────────────────────────────────────
|
|
83
|
+
// Runs before packaging so we don't waste a round-trip for a deploy
|
|
84
|
+
// we'd reject anyway. Each check is opt-in by file presence — addons
|
|
85
|
+
// without an eslint config don't fail eslint; addons without TS don't
|
|
86
|
+
// fail vue-tsc. addon.json schema is the only always-on check.
|
|
87
|
+
// --no-quality bypasses everything, audited so it shows up in the
|
|
88
|
+
// deploy log next to who chose to skip.
|
|
89
|
+
let bypassedQuality = false;
|
|
90
|
+
if (options.quality === false) {
|
|
91
|
+
bypassedQuality = true;
|
|
92
|
+
log.warn('Quality gate bypassed via --no-quality — this is audited.');
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
const gate = await runQualityGate(addonDir, addonName);
|
|
96
|
+
if (!gate.ok) {
|
|
97
|
+
log.error('Quality gate failed — deploy refused. Fix the issues below, then retry:');
|
|
98
|
+
for (const issue of gate.issues)
|
|
99
|
+
log.item(issue);
|
|
100
|
+
log.blank();
|
|
101
|
+
log.info('Bypass (emergency only): rerun with --no-quality (your decision is recorded).');
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (gate.notes.length > 0) {
|
|
105
|
+
log.info('Quality gate notes:');
|
|
106
|
+
for (const note of gate.notes)
|
|
107
|
+
log.item(note);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// `--dry-run` is a top-level program option (src/index.ts) so commander
|
|
111
|
+
// catches it before the subcommand sees it — read from global config.
|
|
112
|
+
// We still keep options.dryRun on the type as a future-proofing seam in
|
|
113
|
+
// case the global option is ever removed.
|
|
114
|
+
const dryRun = isDryRun() || options.dryRun === true;
|
|
115
|
+
if (dryRun) {
|
|
116
|
+
log.info('Dry-run mode — no upload, no install.');
|
|
117
|
+
log.kv('Would-deploy', `${addonName} → cores/${core}`);
|
|
118
|
+
log.kv('Source path', addonDir);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// ─── Production confirmation friction ────────────────────────────
|
|
122
|
+
// Both currently-allowed cores are production tenants. A wrong-tab
|
|
123
|
+
// `ci addon deploy --core cicore` should not be a single Enter away
|
|
124
|
+
// from rewriting the live customer's addon. The literal phrase forces
|
|
125
|
+
// intentionality — autocomplete and "yes" reflexes don't match it.
|
|
126
|
+
// --force skips this (audited) for legitimate scripted workflows
|
|
127
|
+
// like CI/CD pipelines.
|
|
128
|
+
let bypassedConfirmation = false;
|
|
129
|
+
if (PRODUCTION_CORES.has(core)) {
|
|
130
|
+
if (options.force === true) {
|
|
131
|
+
bypassedConfirmation = true;
|
|
132
|
+
log.warn(`Confirmation bypassed via --force — deploying ${addonName} to ${core} (production).`);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
const ok = await requireProductionConfirmation(addonName, core, addonDir);
|
|
136
|
+
if (!ok) {
|
|
137
|
+
log.warn('Cancelled');
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else if (options.force !== true) {
|
|
143
|
+
// Non-production cores keep the lighter prompt for muscle memory.
|
|
144
|
+
const ok = await confirm(`Deploy "${addonName}" to ${core}?`, true);
|
|
145
|
+
if (!ok) {
|
|
146
|
+
log.warn('Cancelled');
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
await appendDeployAudit({ addonName, core, force: options.force === true, bypassedQuality, bypassedConfirmation });
|
|
151
|
+
const cfg = getHostConfig('cicore');
|
|
152
|
+
const packSpinner = spinner('Packaging addon ...').start();
|
|
153
|
+
let pack;
|
|
154
|
+
try {
|
|
155
|
+
pack = await addonPackageBackend(addonName, addonDir);
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
packSpinner.fail('Packaging failed');
|
|
159
|
+
log.error(err instanceof Error ? err.message : String(err));
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
packSpinner.succeed(`Packaged: ${(pack.sizeBytes / 1024).toFixed(1)} KiB`);
|
|
163
|
+
try {
|
|
164
|
+
const installSpinner = spinner('Uploading + installing on cicore staging ...').start();
|
|
165
|
+
const result = await addonInstallBackend(cfg, pack.zipPath, addonName, core);
|
|
166
|
+
if (!result.success) {
|
|
167
|
+
installSpinner.fail('Server install failed');
|
|
168
|
+
log.error(result.stderr || result.stdout);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
installSpinner.succeed('Deploy complete');
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
await addonCleanupPackage(pack.zipPath);
|
|
175
|
+
}
|
|
176
|
+
log.blank();
|
|
177
|
+
log.success(`"${addonName}" deployed to cores/${core}/addons on cicore staging`);
|
|
178
|
+
log.info(`Verify in browser: https://${core}.com.tr/admin/addon-market`);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Quick git-status probe. Returns 'clean' when the directory is a git
|
|
182
|
+
* working tree with no pending changes, 'dirty' when tracked files are
|
|
183
|
+
* modified, 'untracked' when only untracked files exist, and 'unknown'
|
|
184
|
+
* when the directory isn't a git repo or git isn't available. We only
|
|
185
|
+
* surface this as a warning, never block — addons mid-development might
|
|
186
|
+
* legitimately want to ship working-tree state.
|
|
187
|
+
*/
|
|
188
|
+
function isGitDirty(dir) {
|
|
189
|
+
try {
|
|
190
|
+
const out = execSync('git status --porcelain', {
|
|
191
|
+
cwd: dir,
|
|
192
|
+
encoding: 'utf8',
|
|
193
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
194
|
+
}).trim();
|
|
195
|
+
if (out === '')
|
|
196
|
+
return 'clean';
|
|
197
|
+
const lines = out.split('\n');
|
|
198
|
+
const hasTracked = lines.some((l) => !l.startsWith('??'));
|
|
199
|
+
return hasTracked ? 'dirty' : 'untracked';
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
return 'unknown';
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Run every applicable pre-deploy check. Each block is opt-in by file
|
|
207
|
+
* presence so existing addons don't suddenly fail to deploy when the
|
|
208
|
+
* Faz 5 quality template ships — they just skip the checks they aren't
|
|
209
|
+
* configured for. The addon.json validation is always on because every
|
|
210
|
+
* addon must have a parseable manifest.
|
|
211
|
+
*
|
|
212
|
+
* php -l runs inside the dev-shell php container when available — that
|
|
213
|
+
* way personnel doesn't need a host PHP install. If neither host nor
|
|
214
|
+
* container PHP is available the check is skipped with a note.
|
|
215
|
+
*/
|
|
216
|
+
async function runQualityGate(addonDir, addonName) {
|
|
217
|
+
const issues = [];
|
|
218
|
+
const notes = [];
|
|
219
|
+
// ── addon.json schema (always on) ─────────────────────────────────
|
|
220
|
+
try {
|
|
221
|
+
const manifest = await fs.readJson(path.join(addonDir, 'addon.json'));
|
|
222
|
+
const schemaIssues = validateAddonManifest(manifest, addonName);
|
|
223
|
+
issues.push(...schemaIssues);
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
issues.push(`addon.json could not be parsed: ${err instanceof Error ? err.message : String(err)}`);
|
|
227
|
+
}
|
|
228
|
+
// Faz 5 addons don't ship their own node_modules — the toolchain
|
|
229
|
+
// (eslint, vue-tsc, prettier) lives in dev-shell's top-level
|
|
230
|
+
// node_modules so a single `npm install` covers every addon on the
|
|
231
|
+
// machine. We resolve binaries by checking addon-local first (in
|
|
232
|
+
// case someone HAS installed deps locally) then fall back to
|
|
233
|
+
// dev-shell. Without this fallback the quality gate would silently
|
|
234
|
+
// skip checks for every Faz-5-shaped addon.
|
|
235
|
+
const shellRoot = findShellRoot(addonDir) ?? findShellRoot(process.cwd());
|
|
236
|
+
const findBin = async (binName) => {
|
|
237
|
+
const local = path.join(addonDir, 'node_modules', '.bin', binName);
|
|
238
|
+
if (await fs.pathExists(local))
|
|
239
|
+
return local;
|
|
240
|
+
if (shellRoot) {
|
|
241
|
+
const shared = path.join(shellRoot, 'node_modules', '.bin', binName);
|
|
242
|
+
if (await fs.pathExists(shared))
|
|
243
|
+
return shared;
|
|
244
|
+
}
|
|
245
|
+
return null;
|
|
246
|
+
};
|
|
247
|
+
// ── vue-tsc (only when addon ships TS + the tool is resolvable) ───
|
|
248
|
+
const tsconfig = path.join(addonDir, 'tsconfig.json');
|
|
249
|
+
if (await fs.pathExists(tsconfig)) {
|
|
250
|
+
const vueTsc = await findBin('vue-tsc');
|
|
251
|
+
if (vueTsc) {
|
|
252
|
+
const sp = spinner('vue-tsc --noEmit ...').start();
|
|
253
|
+
const result = spawnSync(vueTsc, ['--noEmit'], { cwd: addonDir, encoding: 'utf8' });
|
|
254
|
+
if (result.status === 0) {
|
|
255
|
+
sp.succeed('vue-tsc clean');
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
sp.fail('vue-tsc reported errors');
|
|
259
|
+
const out = String(result.stdout || '') + String(result.stderr || '');
|
|
260
|
+
issues.push(`vue-tsc errors:\n${truncate(out, 2000)}`);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
notes.push('tsconfig.json present but vue-tsc not resolvable (neither addon-local nor dev-shell node_modules). Run `npm install` in dev-shell.');
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// ── eslint (only when addon ships an eslint config + the tool) ────
|
|
268
|
+
const eslintConfigs = ['.eslintrc.json', '.eslintrc.js', 'eslint.config.js', 'eslint.config.mjs'];
|
|
269
|
+
const hasEslintConfig = await Promise.any(eslintConfigs.map((c) => fs.pathExists(path.join(addonDir, c)).then((ok) => (ok ? c : Promise.reject())))).catch(() => null);
|
|
270
|
+
if (hasEslintConfig) {
|
|
271
|
+
const eslintBin = await findBin('eslint');
|
|
272
|
+
if (eslintBin) {
|
|
273
|
+
const sp = spinner(`eslint . (config: ${hasEslintConfig}) ...`).start();
|
|
274
|
+
const result = spawnSync(eslintBin, ['.', '--max-warnings', '0'], { cwd: addonDir, encoding: 'utf8' });
|
|
275
|
+
if (result.status === 0) {
|
|
276
|
+
sp.succeed('eslint clean');
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
sp.fail('eslint reported errors');
|
|
280
|
+
issues.push(`eslint errors:\n${truncate(String(result.stdout || '') + String(result.stderr || ''), 2000)}`);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
notes.push(`${hasEslintConfig} present but eslint not resolvable. Run \`npm install\` in dev-shell.`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// ── php -l on every backend file ─────────────────────────────────
|
|
288
|
+
const phpFiles = await glob('Backend/**/*.php', { cwd: addonDir, absolute: false });
|
|
289
|
+
if (phpFiles.length > 0) {
|
|
290
|
+
const phpCmd = await findPhpForLint(addonDir);
|
|
291
|
+
if (phpCmd) {
|
|
292
|
+
const sp = spinner(`php -l on ${phpFiles.length} backend file${phpFiles.length === 1 ? '' : 's'} ...`).start();
|
|
293
|
+
const failures = [];
|
|
294
|
+
for (const rel of phpFiles) {
|
|
295
|
+
const result = phpCmd.run([rel]);
|
|
296
|
+
if (result.status !== 0) {
|
|
297
|
+
failures.push(`${rel}: ${truncate(String(result.stdout || '') + String(result.stderr || ''), 200)}`);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
if (failures.length === 0) {
|
|
301
|
+
sp.succeed(`php -l clean (${phpFiles.length} files)`);
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
sp.fail(`php -l failed on ${failures.length} file${failures.length === 1 ? '' : 's'}`);
|
|
305
|
+
issues.push(`PHP syntax errors:\n${failures.join('\n')}`);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
notes.push('No PHP available (neither on host PATH nor in addon_dev_php container) — skipped php -l syntax check.');
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// ── tenant-scope static analysis (T-C trust-boundary gate) ──────────
|
|
313
|
+
// Backend PHP dosyası olan her addon için zorunlu: TenantContext/TenantDbResolver
|
|
314
|
+
// kullanımı + DatabaseService::getConnection() direkt çağrısı yasak.
|
|
315
|
+
// Violation → deploy REDDEDILIR (fail-closed).
|
|
316
|
+
const backendPhpFiles = await glob('Backend/**/*.php', { cwd: addonDir, absolute: false });
|
|
317
|
+
if (backendPhpFiles.length > 0) {
|
|
318
|
+
const sp = spinner(`tenant-scope analysis (${backendPhpFiles.length} backend file(s)) ...`).start();
|
|
319
|
+
const fileContents = await Promise.all(backendPhpFiles.map(async (rel) => ({
|
|
320
|
+
path: rel,
|
|
321
|
+
content: await fs.readFile(path.join(addonDir, rel), 'utf8'),
|
|
322
|
+
})));
|
|
323
|
+
const scopeResult = analyzeTenantScope(fileContents);
|
|
324
|
+
if (scopeResult.ok) {
|
|
325
|
+
sp.succeed('tenant-scope clean');
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
sp.fail(`tenant-scope violation(s): ${scopeResult.violations.length} found`);
|
|
329
|
+
for (const v of scopeResult.violations) {
|
|
330
|
+
const loc = v.line > 0 ? `:${v.line}` : '';
|
|
331
|
+
issues.push(`[tenant-scope:${v.rule}] ${v.file}${loc} — ${v.detail}`);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return { ok: issues.length === 0, issues, notes };
|
|
336
|
+
}
|
|
337
|
+
/** Schema check for addon.json. Keep this in lock-step with the SDK
|
|
338
|
+
* reference in docs/addon-sdk/addon-json-schema.md (Faz 6B). */
|
|
339
|
+
function validateAddonManifest(manifest, expectedName) {
|
|
340
|
+
const issues = [];
|
|
341
|
+
const requiredString = (key) => {
|
|
342
|
+
const v = manifest[key];
|
|
343
|
+
if (typeof v !== 'string' || v.trim() === '') {
|
|
344
|
+
issues.push(`addon.json: field "${key}" is required and must be a non-empty string`);
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
requiredString('name');
|
|
348
|
+
requiredString('version');
|
|
349
|
+
requiredString('description');
|
|
350
|
+
requiredString('author');
|
|
351
|
+
if (typeof manifest['enabled'] !== 'boolean') {
|
|
352
|
+
issues.push('addon.json: field "enabled" is required and must be a boolean');
|
|
353
|
+
}
|
|
354
|
+
if (manifest['name'] !== expectedName) {
|
|
355
|
+
issues.push(`addon.json: "name" ("${manifest['name']}") does not match addon directory ("${expectedName}")`);
|
|
356
|
+
}
|
|
357
|
+
const licensing = manifest['licensing'];
|
|
358
|
+
if (licensing && typeof licensing === 'object') {
|
|
359
|
+
const model = licensing['model'];
|
|
360
|
+
const allowedModels = new Set(['free', 'system', 'one_time', 'subscription', 'tiered', 'usage']);
|
|
361
|
+
if (model !== undefined && typeof model === 'string' && !allowedModels.has(model)) {
|
|
362
|
+
issues.push(`addon.json: licensing.model "${model}" is not in [${Array.from(allowedModels).join(', ')}]`);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
return issues;
|
|
366
|
+
}
|
|
367
|
+
/** Locate a PHP we can use for `-l` linting. Host PHP wins on speed
|
|
368
|
+
* (no docker exec overhead). Falls back to the dev-shell PHP container
|
|
369
|
+
* when running on a personnel laptop without PHP installed. */
|
|
370
|
+
async function findPhpForLint(addonDir) {
|
|
371
|
+
const hostCheck = spawnSync('php', ['-v'], { encoding: 'utf8' });
|
|
372
|
+
if (hostCheck.status === 0) {
|
|
373
|
+
return {
|
|
374
|
+
run: (rel) => spawnSync('php', ['-l', ...rel], { cwd: addonDir, encoding: 'utf8' }),
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
const containerCheck = spawnSync('docker', ['ps', '--filter', 'name=addon_dev_php', '--format', '{{.Names}}'], { encoding: 'utf8' });
|
|
378
|
+
if (containerCheck.status === 0 && (containerCheck.stdout || '').trim() === 'addon_dev_php') {
|
|
379
|
+
// The addon is bind-mounted into the php container at /var/www/cores/dev/addons/<name>.
|
|
380
|
+
// We resolve the container path by basename of addonDir — only works when the dev-shell
|
|
381
|
+
// layout is /home/cores/<core>/addons/<name>. If the user passed --path to a non-dev-shell
|
|
382
|
+
// location we'd lint wrongly, so we double-check the basename matches.
|
|
383
|
+
const addonName = path.basename(addonDir);
|
|
384
|
+
const containerPath = `/var/www/cores/dev/addons/${addonName}`;
|
|
385
|
+
return {
|
|
386
|
+
run: (rel) => spawnSync('docker', [
|
|
387
|
+
'exec', 'addon_dev_php', 'sh', '-c',
|
|
388
|
+
`cd ${containerPath} && for f in ${rel.map((r) => `'${r}'`).join(' ')}; do php -l "$f" || exit 1; done`,
|
|
389
|
+
], { encoding: 'utf8' }),
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
return null;
|
|
393
|
+
}
|
|
394
|
+
/** Production deploy confirmation. Prompts for the literal phrase
|
|
395
|
+
* defined in DEPLOY_CONFIRMATION_PHRASE — exact match only, so muscle
|
|
396
|
+
* memory "y" or "yes" doesn't pass. A 5-second pause before the
|
|
397
|
+
* prompt gives personnel a moment to spot the diff summary and
|
|
398
|
+
* abort with Ctrl-C if the target is wrong. */
|
|
399
|
+
async function requireProductionConfirmation(addonName, core, addonDir) {
|
|
400
|
+
log.blank();
|
|
401
|
+
log.warn(`⚠️ Production deploy: ${addonName} → cores/${core}`);
|
|
402
|
+
log.kv('Source', addonDir);
|
|
403
|
+
// Diff vs last commit summary — best-effort.
|
|
404
|
+
try {
|
|
405
|
+
const diffStat = execSync('git diff --shortstat HEAD', { cwd: addonDir, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
|
|
406
|
+
if (diffStat)
|
|
407
|
+
log.kv('Working tree vs HEAD', diffStat);
|
|
408
|
+
const lastCommit = execSync('git log -1 --format=%h%x09%s', { cwd: addonDir, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
|
|
409
|
+
if (lastCommit)
|
|
410
|
+
log.kv('Last commit', lastCommit);
|
|
411
|
+
}
|
|
412
|
+
catch {
|
|
413
|
+
// Not a git repo, or git not installed — skip the summary, deploy
|
|
414
|
+
// still proceeds. The literal-phrase prompt is the real gate.
|
|
415
|
+
}
|
|
416
|
+
log.blank();
|
|
417
|
+
log.info(`A 5-second pause follows so you can re-read the target. Press Ctrl-C now to abort without confirming.`);
|
|
418
|
+
for (let i = 5; i > 0; i--) {
|
|
419
|
+
process.stdout.write(` ${i}…\r`);
|
|
420
|
+
await new Promise((r) => setTimeout(r, 1000));
|
|
421
|
+
}
|
|
422
|
+
process.stdout.write(' \n');
|
|
423
|
+
const { phrase } = await enquirer.prompt({
|
|
424
|
+
type: 'input',
|
|
425
|
+
name: 'phrase',
|
|
426
|
+
message: `Type exactly "${DEPLOY_CONFIRMATION_PHRASE}" to confirm:`,
|
|
427
|
+
});
|
|
428
|
+
if (phrase !== DEPLOY_CONFIRMATION_PHRASE) {
|
|
429
|
+
log.error(`Phrase didn't match. Expected exactly: ${DEPLOY_CONFIRMATION_PHRASE}`);
|
|
430
|
+
return false;
|
|
431
|
+
}
|
|
432
|
+
return true;
|
|
433
|
+
}
|
|
434
|
+
/** Append a one-line audit record to ~/.cicore/deploy-audit.log. The
|
|
435
|
+
* log is local to the personnel's machine; it's an honesty trail for
|
|
436
|
+
* bypasses (--force / --no-quality), not a centralized audit. A real
|
|
437
|
+
* centralized audit ships in the install-addon.sh receiver on the
|
|
438
|
+
* cicore server. */
|
|
439
|
+
async function appendDeployAudit(entry) {
|
|
440
|
+
try {
|
|
441
|
+
const dir = path.join(os.homedir(), '.cicore');
|
|
442
|
+
await fs.ensureDir(dir);
|
|
443
|
+
const line = JSON.stringify({
|
|
444
|
+
ts: new Date().toISOString(),
|
|
445
|
+
user: os.userInfo().username,
|
|
446
|
+
...entry,
|
|
447
|
+
}) + '\n';
|
|
448
|
+
await fs.appendFile(path.join(dir, 'deploy-audit.log'), line, 'utf8');
|
|
449
|
+
}
|
|
450
|
+
catch {
|
|
451
|
+
// Audit failure must not block a deploy — emergencies happen.
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
function truncate(s, max) {
|
|
455
|
+
if (s.length <= max)
|
|
456
|
+
return s;
|
|
457
|
+
return s.slice(0, max) + `\n... (${s.length - max} more chars truncated)`;
|
|
458
|
+
}
|
|
459
|
+
//# sourceMappingURL=deploy.js.map
|