@habeetat/cli 0.1.0-dev.20260423214949.af95b06 → 0.1.0-dev.20260424063302.01f2802
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/dist/bin.mjs +4 -3
- package/dist/bin.mjs.map +1 -1
- package/package.json +1 -1
package/dist/bin.mjs
CHANGED
|
@@ -1099,7 +1099,8 @@ async function destroyCommand(options) {
|
|
|
1099
1099
|
process.exit(1);
|
|
1100
1100
|
}
|
|
1101
1101
|
}
|
|
1102
|
-
var
|
|
1102
|
+
var __cli_dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
1103
|
+
var SEED_SCRIPT_PATH = path.resolve(__cli_dirname, "scripts/nhp-seed-dev.ts");
|
|
1103
1104
|
var SEED_SCRIPT_REMOTE = "/app/apps/habeetat-backend/nhp-seed-dev-tmp.ts";
|
|
1104
1105
|
function loadEnv2(projectDir) {
|
|
1105
1106
|
const envPath = path.join(projectDir, ".env");
|
|
@@ -1405,9 +1406,9 @@ function registerSeedCommand(program2) {
|
|
|
1405
1406
|
}
|
|
1406
1407
|
|
|
1407
1408
|
// src/bin.ts
|
|
1408
|
-
var
|
|
1409
|
+
var __dirname$1 = path.dirname(fileURLToPath(import.meta.url));
|
|
1409
1410
|
var pkg = JSON.parse(
|
|
1410
|
-
readFileSync(path.resolve(
|
|
1411
|
+
readFileSync(path.resolve(__dirname$1, "..", "package.json"), "utf-8")
|
|
1411
1412
|
);
|
|
1412
1413
|
var program = new Command();
|
|
1413
1414
|
program.name("habeetat").description("Habeetat Platform CLI \u2014 manage your platform instances").version(pkg.version);
|
package/dist/bin.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/logger.ts","../src/constants.ts","../src/utils/config.ts","../src/utils/docker.ts","../src/commands/init.ts","../src/commands/up.ts","../src/commands/down.ts","../src/commands/status.ts","../src/commands/logs.ts","../src/commands/restart.ts","../src/commands/update.ts","../src/commands/doctor.ts","../src/commands/destroy.ts","../src/commands/seed.ts","../src/bin.ts"],"names":["chalk","fs","path","execaCommand","ora","loadEnv","execa","program","__dirname"],"mappings":"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","file":"bin.mjs","sourcesContent":["import chalk from 'chalk';\n\nconst prefix = chalk.cyan('[habeetat]');\n\nexport const logger = {\n info: (msg: string) => console.log(`${prefix} ${msg}`),\n success: (msg: string) => console.log(`${prefix} ${chalk.green('✓')} ${msg}`),\n warn: (msg: string) => console.log(`${prefix} ${chalk.yellow('⚠')} ${msg}`),\n error: (msg: string) => console.error(`${prefix} ${chalk.red('✗')} ${msg}`),\n phase: (msg: string) => {\n console.log('');\n console.log(chalk.cyan('═'.repeat(56)));\n console.log(chalk.cyan(` ${msg}`));\n console.log(chalk.cyan('═'.repeat(56)));\n console.log('');\n },\n banner: () => {\n console.log('');\n console.log(chalk.cyan('╔══════════════════════════════════════════════╗'));\n console.log(chalk.cyan('║ ║'));\n console.log(chalk.cyan('║ Habeetat Platform CLI ║'));\n console.log(chalk.cyan('║ ║'));\n console.log(chalk.cyan('╚══════════════════════════════════════════════╝'));\n console.log('');\n },\n};\n","export const CONFIG_FILE = 'habeetat.json';\nexport const ENV_FILE = '.env';\nexport const COMPOSE_FILE = 'docker-compose.yml';\n\nexport const DOCKER_REGISTRY = 'docker.io/capriisland';\n\nexport const IMAGES = {\n backend: 'capriisland/habeetat-backend',\n launcher: 'capriisland/habeetat-launcher',\n orgManager: 'capriisland/habeetat-org-manager',\n platformManager: 'capriisland/habeetat-platform-manager',\n analytics: 'capriisland/habeetat-analytics',\n sampleCrm: 'capriisland/habeetat-sample-crm',\n logtoConfig: 'capriisland/habeetat-logto-config',\n} as const;\n\nexport const THIRD_PARTY_IMAGES = {\n postgres: 'postgres:15-alpine',\n logto: 'svhd/logto:1.33',\n nginx: 'nginx:1.25-alpine',\n certbot: 'certbot/certbot',\n zookeeper: 'zookeeper:3.7',\n clickhouse: 'clickhouse/clickhouse-server:24.1.2-alpine',\n signozSchemaMigrator: 'signoz/signoz-schema-migrator:0.88.22',\n signozOtelCollector: 'signoz/signoz-otel-collector:0.88.22',\n signozQuery: 'signoz/query-service:0.45.0',\n signozFrontend: 'signoz/frontend:0.45.0',\n} as const;\n\nexport const DEFAULT_PORTS = {\n http: 80,\n https: 443,\n hostNginx: 8080,\n} as const;\n\nexport const SERVICES = [\n 'logto-db',\n 'platform-db',\n 'logto-core',\n 'backend',\n 'launcher',\n 'organization-manager',\n 'platform-manager',\n 'analytics',\n 'sample-crm',\n 'nginx',\n 'zookeeper',\n 'clickhouse',\n 'otel-collector-migrator',\n 'otel-collector',\n 'signoz-query-service',\n 'signoz-frontend',\n] as const;\n\nexport type ServiceName = (typeof SERVICES)[number];\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { CONFIG_FILE } from '../constants.js';\nimport type { HabeetatConfig } from '../types.js';\n\nexport function findProjectRoot(startDir: string = process.cwd()): string | null {\n let dir = startDir;\n while (dir !== path.dirname(dir)) {\n if (fs.existsSync(path.join(dir, CONFIG_FILE))) {\n return dir;\n }\n dir = path.dirname(dir);\n }\n return null;\n}\n\nexport function loadConfig(projectDir?: string): HabeetatConfig {\n const dir = projectDir || findProjectRoot();\n if (!dir) {\n throw new Error(\n `Could not find ${CONFIG_FILE}. Are you inside a Habeetat project directory?`,\n );\n }\n const configPath = path.join(dir, CONFIG_FILE);\n const raw = fs.readFileSync(configPath, 'utf-8');\n return JSON.parse(raw) as HabeetatConfig;\n}\n\nexport function saveConfig(config: HabeetatConfig, projectDir: string): void {\n const configPath = path.join(projectDir, CONFIG_FILE);\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n}\n\nexport function getProjectDir(): string {\n const dir = findProjectRoot();\n if (!dir) {\n throw new Error(\n `Could not find ${CONFIG_FILE}. Are you inside a Habeetat project directory?`,\n );\n }\n return dir;\n}\n","import { execaCommand } from 'execa';\nimport { logger } from './logger.js';\n\nexport async function checkDocker(): Promise<boolean> {\n try {\n const { stdout } = await execaCommand('docker --version');\n const match = stdout.match(/Docker version (\\d+)/);\n if (match && parseInt(match[1], 10) >= 20) {\n return true;\n }\n logger.error(`Docker >= 20.0 required. Found: ${stdout.trim()}`);\n return false;\n } catch {\n logger.error('Docker is not installed or not in PATH');\n logger.info('Install Docker: https://docs.docker.com/get-docker/');\n return false;\n }\n}\n\nexport async function checkDockerCompose(): Promise<boolean> {\n try {\n await execaCommand('docker compose version');\n return true;\n } catch {\n logger.error('Docker Compose V2 is not available');\n logger.info('Docker Compose V2 is included with Docker Desktop');\n return false;\n }\n}\n\nexport async function checkPrerequisites(): Promise<boolean> {\n const docker = await checkDocker();\n const compose = await checkDockerCompose();\n return docker && compose;\n}\n\nexport interface ComposeExecOptions {\n cwd: string;\n composeFile?: string;\n silent?: boolean;\n}\n\nexport async function composeUp(opts: ComposeExecOptions): Promise<void> {\n const file = opts.composeFile || 'docker-compose.yml';\n await execaCommand(`docker compose -f ${file} up -d`, {\n cwd: opts.cwd,\n stdio: opts.silent ? 'pipe' : 'inherit',\n });\n}\n\nexport async function composeDown(opts: ComposeExecOptions): Promise<void> {\n const file = opts.composeFile || 'docker-compose.yml';\n await execaCommand(`docker compose -f ${file} down`, {\n cwd: opts.cwd,\n stdio: opts.silent ? 'pipe' : 'inherit',\n });\n}\n\nexport async function composeDestroy(opts: ComposeExecOptions): Promise<void> {\n const file = opts.composeFile || 'docker-compose.yml';\n await execaCommand(`docker compose -f ${file} down -v --remove-orphans`, {\n cwd: opts.cwd,\n stdio: opts.silent ? 'pipe' : 'inherit',\n });\n}\n\nexport async function composePs(opts: ComposeExecOptions): Promise<string> {\n const file = opts.composeFile || 'docker-compose.yml';\n const { stdout } = await execaCommand(`docker compose -f ${file} ps`, {\n cwd: opts.cwd,\n });\n return stdout;\n}\n\nexport async function composeLogs(\n opts: ComposeExecOptions & { service?: string; follow?: boolean; tail?: number },\n): Promise<void> {\n const file = opts.composeFile || 'docker-compose.yml';\n const parts = ['docker', 'compose', '-f', file, 'logs'];\n if (opts.follow) parts.push('-f');\n if (opts.tail) parts.push('--tail', String(opts.tail));\n if (opts.service) parts.push(opts.service);\n\n await execaCommand(parts.join(' '), {\n cwd: opts.cwd,\n stdio: 'inherit',\n });\n}\n\nexport async function composeRestart(\n opts: ComposeExecOptions & { service?: string },\n): Promise<void> {\n const file = opts.composeFile || 'docker-compose.yml';\n const cmd = opts.service\n ? `docker compose -f ${file} restart ${opts.service}`\n : `docker compose -f ${file} restart`;\n\n await execaCommand(cmd, {\n cwd: opts.cwd,\n stdio: opts.silent ? 'pipe' : 'inherit',\n });\n}\n\nexport async function composeExec(\n opts: ComposeExecOptions & { service: string; command: string },\n): Promise<string> {\n const file = opts.composeFile || 'docker-compose.yml';\n const { stdout } = await execaCommand(\n `docker compose -f ${file} exec -T ${opts.service} ${opts.command}`,\n { cwd: opts.cwd },\n );\n return stdout;\n}\n\nexport async function dockerPull(image: string): Promise<void> {\n await execaCommand(`docker pull ${image}`, { stdio: 'inherit' });\n}\n","import ora from 'ora';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { execa, execaCommand } from 'execa';\nimport { logger } from '../utils/logger.js';\nimport { getProjectDir, loadConfig } from '../utils/config.js';\nimport { COMPOSE_FILE } from '../constants.js';\n\nconst INITIALIZED_FILE = '.initialized';\n\nexport function isInitialized(projectDir: string): boolean {\n return fs.existsSync(path.join(projectDir, INITIALIZED_FILE));\n}\n\nfunction markInitialized(projectDir: string): void {\n fs.writeFileSync(\n path.join(projectDir, INITIALIZED_FILE),\n JSON.stringify({ initializedAt: new Date().toISOString() }, null, 2) + '\\n',\n );\n}\n\nfunction loadEnv(projectDir: string): Record<string, string> {\n const envPath = path.join(projectDir, '.env');\n if (!fs.existsSync(envPath)) return {};\n const lines = fs.readFileSync(envPath, 'utf-8').split('\\n');\n const env: Record<string, string> = {};\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIdx = trimmed.indexOf('=');\n if (eqIdx === -1) continue;\n env[trimmed.slice(0, eqIdx)] = trimmed.slice(eqIdx + 1);\n }\n return env;\n}\n\nasync function execCompose(projectDir: string, args: string): Promise<string> {\n const { stdout } = await execaCommand(\n `docker compose -f ${COMPOSE_FILE} ${args}`,\n { cwd: projectDir },\n );\n return stdout;\n}\n\nasync function waitForService(\n projectDir: string,\n service: string,\n checkCmd: string,\n timeoutSec: number,\n): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutSec * 1000) {\n try {\n await execCompose(projectDir, `exec -T ${service} ${checkCmd}`);\n return true;\n } catch {\n await new Promise((r) => setTimeout(r, 3000));\n }\n }\n return false;\n}\n\nasync function getContainerState(\n projectDir: string,\n service: string,\n): Promise<{ state: string; health: string } | null> {\n try {\n const { stdout } = await execaCommand(\n `docker compose -f ${COMPOSE_FILE} ps ${service} --format json`,\n { cwd: projectDir },\n );\n const lines = stdout.trim().split('\\n');\n for (const line of lines) {\n try {\n const info = JSON.parse(line);\n return { state: info.State || '', health: info.Health || '' };\n } catch { /* skip non-json lines */ }\n }\n } catch { /* container may not exist yet */ }\n return null;\n}\n\nasync function waitForDockerRunning(\n projectDir: string,\n service: string,\n timeoutSec: number,\n): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutSec * 1000) {\n const info = await getContainerState(projectDir, service);\n if (info && info.state === 'running') return true;\n await new Promise((r) => setTimeout(r, 3000));\n }\n return false;\n}\n\nasync function waitForDockerHealthy(\n projectDir: string,\n service: string,\n timeoutSec: number,\n): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutSec * 1000) {\n const info = await getContainerState(projectDir, service);\n if (info) {\n if (info.health === 'healthy') return true;\n if (info.state === 'running' && !info.health) return true;\n }\n await new Promise((r) => setTimeout(r, 5000));\n }\n return false;\n}\n\nfunction buildSeedLogtoAppsSql(env: Record<string, string>): string {\n const protocol = env.PROTOCOL || 'https';\n const domain = env.DOMAIN || 'localhost';\n const launcherUrl = env.LAUNCHER_URL || `${protocol}://launcher.${domain}`;\n const orgManagerUrl = env.ORG_MANAGER_URL || `${protocol}://organization-manager.${domain}`;\n const platformManagerUrl = env.PLATFORM_MANAGER_URL || `${protocol}://platform-manager.${domain}`;\n const analyticsUrl = env.ANALYTICS_URL || `${protocol}://analytics.${domain}`;\n const apiResource = env.IAM_AUDIENCE || `${protocol}://api.${domain}/api`;\n const m2mAppId = 'nhp-m2m-config';\n const m2mAppSecret = env.LOGTO_M2M_APP_SECRET || '';\n\n return `BEGIN;\n\n-- API Resource\nINSERT INTO resources (tenant_id, id, name, indicator, is_default, access_token_ttl)\nVALUES ('default', 'nhp-backend-resource', 'NHP Backend API', '${apiResource}', false, 3600)\nON CONFLICT (id) DO UPDATE\nSET name = EXCLUDED.name, indicator = EXCLUDED.indicator, access_token_ttl = EXCLUDED.access_token_ttl;\n\n-- Scope for API Resource\nINSERT INTO scopes (tenant_id, id, resource_id, name, description)\nVALUES ('default', 'nhp-backend-scope', 'nhp-backend-resource', 'nhp:all', 'Full access to NHP backend API')\nON CONFLICT (id) DO UPDATE\nSET resource_id = EXCLUDED.resource_id, name = EXCLUDED.name, description = EXCLUDED.description;\n\n-- Launcher SPA\nINSERT INTO applications (tenant_id, id, name, secret, description, type, oidc_client_metadata, custom_client_metadata, is_third_party)\nVALUES (\n 'default', 'nhp-launcher', 'Habeetat Launcher', 'spa-secret-nhp-launcher', 'Main launcher application', 'SPA',\n jsonb_build_object('redirectUris', ARRAY['${launcherUrl}', '${launcherUrl}/callback'], 'postLogoutRedirectUris', ARRAY['${launcherUrl}']),\n '{}'::jsonb, false\n) ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, description = EXCLUDED.description, type = EXCLUDED.type, oidc_client_metadata = EXCLUDED.oidc_client_metadata;\n\n-- Organization Manager SPA\nINSERT INTO applications (tenant_id, id, name, secret, description, type, oidc_client_metadata, custom_client_metadata, is_third_party)\nVALUES (\n 'default', 'nhp-org-manager', 'Organization Manager', 'spa-secret-nhp-org-manager', 'Organization management application', 'SPA',\n jsonb_build_object('redirectUris', ARRAY['${orgManagerUrl}', '${orgManagerUrl}/callback'], 'postLogoutRedirectUris', ARRAY['${orgManagerUrl}']),\n '{}'::jsonb, false\n) ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, description = EXCLUDED.description, type = EXCLUDED.type, oidc_client_metadata = EXCLUDED.oidc_client_metadata;\n\n-- Platform Manager SPA\nINSERT INTO applications (tenant_id, id, name, secret, description, type, oidc_client_metadata, custom_client_metadata, is_third_party)\nVALUES (\n 'default', 'nhp-plat-mgr', 'Platform Manager', 'spa-secret-nhp-plat-mgr', 'Platform administration application', 'SPA',\n jsonb_build_object('redirectUris', ARRAY['${platformManagerUrl}', '${platformManagerUrl}/callback'], 'postLogoutRedirectUris', ARRAY['${platformManagerUrl}']),\n '{}'::jsonb, false\n) ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, description = EXCLUDED.description, type = EXCLUDED.type, oidc_client_metadata = EXCLUDED.oidc_client_metadata;\n\n-- Analytics SPA\nINSERT INTO applications (tenant_id, id, name, secret, description, type, oidc_client_metadata, custom_client_metadata, is_third_party)\nVALUES (\n 'default', 'nhp-analytics', 'Product Analytics', 'spa-secret-nhp-analytics', 'Product analytics dashboard', 'SPA',\n jsonb_build_object('redirectUris', ARRAY['${analyticsUrl}', '${analyticsUrl}/callback'], 'postLogoutRedirectUris', ARRAY['${analyticsUrl}']),\n '{}'::jsonb, false\n) ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, description = EXCLUDED.description, type = EXCLUDED.type, oidc_client_metadata = EXCLUDED.oidc_client_metadata;\n\n-- M2M Application for backend\nINSERT INTO applications (tenant_id, id, name, secret, description, type, oidc_client_metadata, custom_client_metadata, is_third_party)\nVALUES (\n 'default', '${m2mAppId}', 'NHP M2M Config', '${m2mAppSecret}', 'Machine-to-machine application for backend services', 'MachineToMachine',\n jsonb_build_object('redirectUris', ARRAY[]::text[], 'postLogoutRedirectUris', ARRAY[]::text[]),\n '{}'::jsonb, false\n) ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, secret = EXCLUDED.secret, description = EXCLUDED.description, type = EXCLUDED.type;\n\n-- Assign Management API role to M2M app\nDO $$\nDECLARE\n v_role_id TEXT;\nBEGIN\n SELECT id INTO v_role_id FROM roles\n WHERE tenant_id = 'default' AND name = 'Logto Management API access' AND type = 'MachineToMachine'\n LIMIT 1;\n\n IF v_role_id IS NULL THEN\n v_role_id := 'role_m2m_mgmt_api';\n INSERT INTO roles (tenant_id, id, name, description, type)\n VALUES ('default', v_role_id, 'Logto Management API access', 'Access to Logto Management API', 'MachineToMachine');\n\n INSERT INTO roles_scopes (tenant_id, id, role_id, scope_id)\n SELECT 'default', 'rs_' || s.id, v_role_id, s.id\n FROM scopes s WHERE s.resource_id = 'management-api' AND s.tenant_id = 'default'\n ON CONFLICT DO NOTHING;\n END IF;\n\n INSERT INTO applications_roles (tenant_id, id, application_id, role_id)\n VALUES ('default', 'ar_m2m_${m2mAppId}', '${m2mAppId}', v_role_id)\n ON CONFLICT DO NOTHING;\nEND $$;\n\n-- Update admin-console redirect URIs\nUPDATE applications\nSET oidc_client_metadata = jsonb_build_object(\n 'redirectUris', ARRAY['${protocol}://iam-console.${domain}/callback'],\n 'postLogoutRedirectUris', ARRAY['${protocol}://iam-console.${domain}']\n)\nWHERE id = 'admin-console' AND tenant_id = 'admin';\n\nCOMMIT;`;\n}\n\nfunction buildInitPlatformSql(env: Record<string, string>): string {\n const protocol = env.PROTOCOL || 'https';\n const domain = env.DOMAIN || 'localhost';\n const adminEmail = env.PLATFORM_ADMIN_EMAIL || 'admin@habeetat.local';\n const orgName = env.ORGANIZATION_NAME || 'Default Organization';\n const orgSlug = orgName.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n\n return `\n-- Seed system applications\nINSERT INTO applications (id, slug, name, description, category, is_internal, is_system_app, is_hidden, auto_install, status, logto_app_id, created_at, updated_at)\nVALUES\n ('app_launcher', 'habeetat-launcher', 'Habeetat Launcher', 'Main launcher and navigation hub', 'system', true, true, true, true, 'PUBLISHED', 'nhp-launcher', NOW(), NOW()),\n ('app_org_manager', 'organization-manager', 'Organization Manager', 'Manage organizations, users and roles', 'system', true, true, false, true, 'PUBLISHED', 'nhp-org-manager', NOW(), NOW()),\n ('app_plat_manager', 'platform-manager', 'Platform Manager', 'Platform administration and configuration', 'system', true, true, true, false, 'PUBLISHED', 'nhp-plat-mgr', NOW(), NOW()),\n ('app_analytics', 'product-analytics', 'Product Analytics', 'Track events, analyze funnels, measure retention, and understand user behavior', 'system', true, true, false, true, 'PUBLISHED', 'nhp-analytics', NOW(), NOW())\nON CONFLICT (slug) DO UPDATE SET\n name = EXCLUDED.name,\n description = EXCLUDED.description,\n logto_app_id = EXCLUDED.logto_app_id,\n is_system_app = EXCLUDED.is_system_app,\n is_hidden = EXCLUDED.is_hidden,\n auto_install = EXCLUDED.auto_install,\n status = EXCLUDED.status;\n\n-- Create initial versions for system apps\nINSERT INTO application_versions (id, app_id, version, manifest, status, created_at)\nVALUES\n ('ver_launcher_100', 'app_launcher', '1.0.0', jsonb_build_object('endpoints', jsonb_build_object('main', '${protocol}://launcher.${domain}')), 'ACTIVE', NOW()),\n ('ver_org_manager_100', 'app_org_manager', '1.0.0', jsonb_build_object('endpoints', jsonb_build_object('main', '${protocol}://organization-manager.${domain}')), 'ACTIVE', NOW()),\n ('ver_plat_manager_100', 'app_plat_manager', '1.0.0', jsonb_build_object('endpoints', jsonb_build_object('main', '${protocol}://platform-manager.${domain}')), 'ACTIVE', NOW()),\n ('ver_analytics_100', 'app_analytics', '1.0.0', jsonb_build_object('endpoints', jsonb_build_object('main', '${protocol}://analytics.${domain}')), 'ACTIVE', NOW())\nON CONFLICT (app_id, version) DO UPDATE SET manifest = EXCLUDED.manifest;\n\n-- Create default tenant\nINSERT INTO tenants (id, display_name, slug, status, created_at, updated_at)\nSELECT\n 'tenant_${orgSlug}',\n '${orgName}',\n '${orgSlug}',\n 'ACTIVE',\n NOW(),\n NOW()\nWHERE NOT EXISTS (\n SELECT 1 FROM tenants WHERE slug = '${orgSlug}'\n);\n\n-- Initialize tenant, admin user, roles, memberships, and app installations\nDO $$\nDECLARE\n v_tenant_id TEXT;\n v_user_id TEXT;\n v_admin_role_id TEXT;\nBEGIN\n SELECT id INTO v_tenant_id FROM tenants WHERE slug = '${orgSlug}' LIMIT 1;\n\n IF v_tenant_id IS NULL THEN\n RAISE NOTICE 'Tenant not found, skipping user setup';\n RETURN;\n END IF;\n\n SELECT id INTO v_user_id FROM users\n WHERE external_identity_id = 'usr_admin01'\n OR primary_email = '${adminEmail}'\n LIMIT 1;\n\n IF v_user_id IS NULL THEN\n v_user_id := 'usr_plat_admin01';\n INSERT INTO users (id, external_identity_id, primary_email, username, display_name, status, created_at, updated_at)\n VALUES (v_user_id, 'usr_admin01', '${adminEmail}', 'admin', 'Platform Admin', 'ACTIVE', NOW(), NOW());\n ELSE\n UPDATE users SET external_identity_id = 'usr_admin01'\n WHERE id = v_user_id AND external_identity_id IS NULL;\n END IF;\n\n SELECT id INTO v_admin_role_id FROM tenant_roles WHERE name = 'TENANT_ADMIN' LIMIT 1;\n\n IF v_admin_role_id IS NULL THEN\n v_admin_role_id := 'role_tenant_admin';\n INSERT INTO tenant_roles (id, name, description, created_at, updated_at)\n VALUES (v_admin_role_id, 'TENANT_ADMIN', 'Tenant Administrator', NOW(), NOW());\n END IF;\n\n INSERT INTO tenant_memberships (id, user_id, tenant_id, status, created_at, updated_at)\n SELECT 'tm_admin_${orgSlug}', v_user_id, v_tenant_id, 'ACTIVE', NOW(), NOW()\n WHERE NOT EXISTS (\n SELECT 1 FROM tenant_memberships WHERE user_id = v_user_id AND tenant_id = v_tenant_id\n );\n\n INSERT INTO tenant_membership_roles (id, membership_id, role_id, created_at)\n SELECT 'tmr_admin_${orgSlug}', 'tm_admin_${orgSlug}', v_admin_role_id, NOW()\n WHERE NOT EXISTS (\n SELECT 1 FROM tenant_membership_roles\n WHERE membership_id = 'tm_admin_${orgSlug}' AND role_id = v_admin_role_id\n );\nEND $$;\n\n-- Auto-install published non-hidden apps for the default tenant\nINSERT INTO tenant_application_installations (id, tenant_id, app_id, app_version_id, status, is_enabled, installed_at, updated_at)\nSELECT 'tai_${orgSlug}_' || a.slug, t.id, a.id, v.id, 'INSTALLED', true, NOW(), NOW()\nFROM tenants t\nJOIN applications a ON a.status = 'PUBLISHED' AND a.is_hidden = false\nJOIN application_versions v ON v.app_id = a.id AND v.version = '1.0.0'\nWHERE t.slug = '${orgSlug}'\nON CONFLICT (tenant_id, app_id) DO NOTHING;`;\n}\n\nfunction buildClickhouseAnalyticsSeedSql(tenantId: string, adminUserId: string): string {\n const now = new Date();\n const rows: string[] = [];\n\n const users = [adminUserId, 'usr_demo_001', 'usr_demo_002', 'usr_demo_003', 'usr_demo_004'];\n const events = [\n { name: 'page_view', props: (page: string) => `{\"page\":\"${page}\",\"referrer\":\"direct\"}` },\n { name: 'user_login', props: () => `{\"method\":\"password\"}` },\n { name: 'feature_used', props: (f: string) => `{\"feature\":\"${f}\"}` },\n { name: 'report_created', props: () => `{\"type\":\"insight\"}` },\n { name: 'dashboard_viewed', props: () => `{\"dashboard\":\"main\"}` },\n { name: 'user_logout', props: () => `{}` },\n ];\n const pages = ['/dashboard', '/analytics', '/users', '/settings', '/reports'];\n const features = ['insights', 'funnels', 'retention', 'user-feed', 'dashboards'];\n\n // Generate ~200 events spread across last 30 days\n for (let day = 29; day >= 0; day--) {\n const date = new Date(now);\n date.setDate(date.getDate() - day);\n const eventsPerDay = 4 + Math.floor(Math.random() * 10);\n\n for (let i = 0; i < eventsPerDay; i++) {\n const userId = users[Math.floor(Math.random() * users.length)];\n const hour = 8 + Math.floor(Math.random() * 10);\n const minute = Math.floor(Math.random() * 60);\n const ts = `${date.toISOString().split('T')[0]} ${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}:00`;\n\n const sessionId = `sess_${day}_${i}`;\n\n // Always add a login at start of day\n if (i === 0) {\n rows.push(`('${tenantId}','${userId}','${sessionId}','user_login','{\"method\":\"password\"}','${ts}')`);\n }\n\n const eventIdx = Math.floor(Math.random() * events.length);\n const ev = events[eventIdx];\n let props = '';\n if (ev.name === 'page_view') props = ev.props(pages[Math.floor(Math.random() * pages.length)]);\n else if (ev.name === 'feature_used') props = ev.props(features[Math.floor(Math.random() * features.length)]);\n else props = (ev.props as () => string)();\n\n rows.push(`('${tenantId}','${userId}','${sessionId}','${ev.name}','${props}','${ts}')`);\n }\n }\n\n return `INSERT INTO nhp_analytics.events (tenant_id, user_id, session_id, event_name, properties, timestamp) VALUES ${rows.join(',\\n')};`;\n}\n\nfunction buildAnalyticsObjectsSql(tenantId: string, adminUserId: string): string {\n return `\n-- Analytics dashboard\nINSERT INTO analytics_dashboards (id, tenant_id, name, description, layout, created_by, created_at, updated_at)\nVALUES (\n 'dash_default_${tenantId.replace(/-/g, '_')}',\n '${tenantId}',\n 'Overview',\n 'Main analytics dashboard',\n '[{\"i\":\"ins_pv\",\"x\":0,\"y\":0,\"w\":6,\"h\":3},{\"i\":\"ins_fl\",\"x\":6,\"y\":0,\"w\":6,\"h\":3},{\"i\":\"ins_fu\",\"x\":0,\"y\":3,\"w\":12,\"h\":3}]',\n '${adminUserId}',\n NOW(), NOW()\n) ON CONFLICT (id) DO NOTHING;\n\n-- Insight: Page views trend\nINSERT INTO analytics_insights (id, tenant_id, name, type, config, created_by, created_at, updated_at)\nVALUES (\n 'ins_pv',\n '${tenantId}',\n 'Page Views (last 30d)',\n 'TREND',\n '{\"eventName\":\"page_view\",\"aggregation\":\"count\",\"interval\":\"day\",\"filters\":[]}',\n '${adminUserId}',\n NOW(), NOW()\n) ON CONFLICT (id) DO NOTHING;\n\n-- Insight: Feature usage breakdown\nINSERT INTO analytics_insights (id, tenant_id, name, type, config, created_by, created_at, updated_at)\nVALUES (\n 'ins_fl',\n '${tenantId}',\n 'Feature Usage Breakdown',\n 'PIE',\n '{\"eventName\":\"feature_used\",\"aggregation\":\"count\",\"interval\":\"day\",\"groupBy\":\"feature\",\"filters\":[]}',\n '${adminUserId}',\n NOW(), NOW()\n) ON CONFLICT (id) DO NOTHING;\n\n-- Insight: Unique active users\nINSERT INTO analytics_insights (id, tenant_id, name, type, config, created_by, created_at, updated_at)\nVALUES (\n 'ins_fu',\n '${tenantId}',\n 'Unique Active Users (last 30d)',\n 'TREND',\n '{\"eventName\":\"user_login\",\"aggregation\":\"count_unique\",\"interval\":\"day\",\"filters\":[]}',\n '${adminUserId}',\n NOW(), NOW()\n) ON CONFLICT (id) DO NOTHING;\n\n-- Funnel: Login → Feature → Report\nINSERT INTO analytics_funnels (id, tenant_id, name, steps, window_seconds, created_by, created_at, updated_at)\nVALUES (\n 'fun_onboarding_${tenantId.replace(/-/g, '_')}',\n '${tenantId}',\n 'Login → Feature → Report',\n '[{\"eventName\":\"user_login\"},{\"eventName\":\"feature_used\"},{\"eventName\":\"report_created\"}]',\n 86400,\n '${adminUserId}',\n NOW(), NOW()\n) ON CONFLICT (id) DO NOTHING;\n\n-- Funnel: Login → Dashboard → Feature\nINSERT INTO analytics_funnels (id, tenant_id, name, steps, window_seconds, created_by, created_at, updated_at)\nVALUES (\n 'fun_engagement_${tenantId.replace(/-/g, '_')}',\n '${tenantId}',\n 'Login → Dashboard → Feature',\n '[{\"eventName\":\"user_login\"},{\"eventName\":\"dashboard_viewed\"},{\"eventName\":\"feature_used\"}]',\n 3600,\n '${adminUserId}',\n NOW(), NOW()\n) ON CONFLICT (id) DO NOTHING;\n\n-- Retention: Login → return login (weekly)\nINSERT INTO analytics_retentions (id, tenant_id, name, start_event, return_event, period, created_by, created_at, updated_at)\nVALUES (\n 'ret_login_${tenantId.replace(/-/g, '_')}',\n '${tenantId}',\n 'Weekly Login Retention',\n 'user_login',\n 'user_login',\n 'WEEK',\n '${adminUserId}',\n NOW(), NOW()\n) ON CONFLICT (id) DO NOTHING;\n\n-- Retention: Feature adoption (daily)\nINSERT INTO analytics_retentions (id, tenant_id, name, start_event, return_event, period, created_by, created_at, updated_at)\nVALUES (\n 'ret_feature_${tenantId.replace(/-/g, '_')}',\n '${tenantId}',\n 'Feature Adoption Retention',\n 'feature_used',\n 'feature_used',\n 'DAY',\n '${adminUserId}',\n NOW(), NOW()\n) ON CONFLICT (id) DO NOTHING;\n`;\n}\n\nexport async function initPlatform(projectDir: string): Promise<void> {\n const config = loadConfig(projectDir);\n const env = loadEnv(projectDir);\n const domain = config.platform.domain;\n\n // --- Phase 1: Wait for databases ---\n const dbSpinner = ora('Waiting for databases...').start();\n\n const logtoDbReady = await waitForService(\n projectDir, 'logto-db', 'pg_isready -U logto -d logto', 60,\n );\n if (!logtoDbReady) {\n dbSpinner.fail('logto-db did not become ready');\n throw new Error('logto-db timeout');\n }\n\n const platformDbReady = await waitForService(\n projectDir, 'platform-db',\n `pg_isready -U ${env.PLATFORM_DB_USER || 'habeetat'} -d ${env.PLATFORM_DB_NAME || 'habeetat_platform'}`,\n 60,\n );\n if (!platformDbReady) {\n dbSpinner.fail('platform-db did not become ready');\n throw new Error('platform-db timeout');\n }\n dbSpinner.succeed('Databases ready');\n\n // --- Phase 1b: Initialize ClickHouse schema ---\n const clickhouseSpinner = ora('Initializing ClickHouse analytics schema...').start();\n try {\n const clickhouseSql = [\n 'CREATE DATABASE IF NOT EXISTS nhp_analytics',\n `CREATE TABLE IF NOT EXISTS nhp_analytics.events (event_id UUID DEFAULT generateUUIDv4(), tenant_id String, user_id String, session_id String DEFAULT '', app_id LowCardinality(String) DEFAULT '', event_name LowCardinality(String), properties String DEFAULT '{}', timestamp DateTime64(3, 'UTC'), inserted_at DateTime DEFAULT now()) ENGINE = MergeTree PARTITION BY toYYYYMM(timestamp) ORDER BY (tenant_id, event_name, timestamp, user_id) TTL toDateTime(timestamp) + INTERVAL 365 DAY DELETE SETTINGS index_granularity = 8192`,\n 'ALTER TABLE nhp_analytics.events ADD INDEX IF NOT EXISTS idx_user_id user_id TYPE bloom_filter(0.01) GRANULARITY 4',\n 'ALTER TABLE nhp_analytics.events ADD INDEX IF NOT EXISTS idx_session_id session_id TYPE bloom_filter(0.01) GRANULARITY 4',\n ];\n for (const sql of clickhouseSql) {\n await execa('docker', [\n 'compose', '-f', COMPOSE_FILE, 'exec', '-T', 'clickhouse',\n 'clickhouse-client', '--query', sql,\n ], { cwd: projectDir, stdio: 'pipe' });\n }\n clickhouseSpinner.succeed('ClickHouse analytics schema initialized');\n } catch (err) {\n clickhouseSpinner.warn('ClickHouse schema initialization failed — analytics may not work');\n logger.error(String(err));\n logger.info('Run manually: docker compose exec clickhouse clickhouse-client --query \"CREATE DATABASE IF NOT EXISTS nhp_analytics\"');\n }\n\n // --- Phase 2: Wait for Logto to be healthy ---\n const logtoSpinner = ora('Waiting for Logto to be healthy (this may take up to 2 min)...').start();\n const logtoReady = await waitForService(\n projectDir, 'logto-core',\n 'wget -q --spider http://localhost:3001/oidc/.well-known/openid-configuration',\n 180,\n );\n if (!logtoReady) {\n logtoSpinner.fail('logto-core did not become healthy');\n throw new Error('logto-core timeout');\n }\n logtoSpinner.succeed('Logto is healthy');\n\n // --- Phase 3: Seed Logto applications (SQL) ---\n const logtoSeedSpinner = ora('Seeding Logto applications...').start();\n try {\n const sql = buildSeedLogtoAppsSql(env);\n await execaCommand(\n `docker compose -f ${COMPOSE_FILE} exec -T logto-db psql -U logto -d logto`,\n { cwd: projectDir, input: sql },\n );\n logtoSeedSpinner.succeed('Logto applications seeded');\n } catch (err) {\n logtoSeedSpinner.fail('Failed to seed Logto applications');\n logger.error(String(err));\n throw err;\n }\n\n // --- Phase 4: Bootstrap Logto users/orgs/roles (via Node container) ---\n const bootstrapSpinner = ora('Bootstrapping Logto users and organizations...').start();\n try {\n const orgName = env.ORGANIZATION_NAME || config.platform.organization || 'Default';\n const orgSlug = orgName.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n const adminEmail = env.PLATFORM_ADMIN_EMAIL || config.platform.adminEmail;\n const adminPassword = env.PLATFORM_ADMIN_PASSWORD || 'Habeetat_01';\n const adminUsername = adminEmail.split('@')[0];\n const logtoDbUrl = `postgres://${env.LOGTO_DB_USER || 'logto'}:${env.LOGTO_DB_PASSWORD || 'logto'}@logto-db:5432/${env.LOGTO_DB_NAME || 'logto'}`;\n\n const bootstrapScriptPath = path.join(projectDir, 'scripts', 'nhp-seed-logto-bootstrap.mjs');\n const hasLocalScript = fs.existsSync(bootstrapScriptPath);\n\n if (hasLocalScript) {\n await execa('docker', [\n 'run', '--rm', '--network', 'habeetat_habeetat-network',\n '-e', `NHP_LOGTO_DB_URL=${logtoDbUrl}`,\n '-e', `NHP_PLATFORM_ADMIN_USERNAME=${adminUsername}`,\n '-e', `NHP_PLATFORM_ADMIN_EMAIL=${adminEmail}`,\n '-e', `NHP_PLATFORM_ADMIN_PASSWORD=${adminPassword}`,\n '-e', `NHP_PLATFORM_ADMIN_DISPLAY_NAME=Platform Admin`,\n '-e', `NHP_DEFAULT_TENANT_NAME=${orgName}`,\n '-e', `NHP_DEFAULT_TENANT_SLUG=${orgSlug}`,\n '-v', `${bootstrapScriptPath}:/app/bootstrap.mjs:ro`,\n '-w', '/app',\n 'node:20-alpine',\n 'sh', '-c', 'npm init -y >/dev/null 2>&1 && npm install --no-package-lock pg hash-wasm nanoid 2>/dev/null && node bootstrap.mjs',\n ],\n { cwd: projectDir, stdio: 'pipe' },\n );\n bootstrapSpinner.succeed('Logto users and organizations bootstrapped');\n } else {\n bootstrapSpinner.warn('Bootstrap script not found — skipping Logto user/org setup');\n logger.info('You may need to create the admin user manually via the Logto admin console');\n }\n } catch (err) {\n bootstrapSpinner.fail('Logto bootstrap failed');\n logger.error(String(err));\n logger.info('You may need to create the admin user manually via the Logto admin console');\n }\n\n // --- Phase 5: Wait for backend container to be running ---\n const backendRunSpinner = ora('Waiting for backend container to start...').start();\n const backendRunning = await waitForDockerRunning(projectDir, 'backend', 90);\n if (!backendRunning) {\n backendRunSpinner.fail('Backend container did not start');\n throw new Error('backend container timeout');\n }\n backendRunSpinner.succeed('Backend container is running');\n\n // --- Phase 6: Run Prisma migrations (before health check — tables must exist first) ---\n const migrateSpinner = ora('Running database migrations...').start();\n try {\n await execCompose(projectDir, 'exec -T backend npx prisma migrate deploy');\n migrateSpinner.succeed('Database migrations completed');\n } catch (err) {\n migrateSpinner.fail('Migrations failed');\n logger.error(String(err));\n logger.info('Run manually: docker compose exec backend npx prisma migrate deploy');\n }\n\n // --- Phase 7: Run Prisma seed ---\n const seedSpinner = ora('Seeding platform database...').start();\n try {\n const orgName = env.ORGANIZATION_NAME || config.platform.organization || 'Default';\n const orgSlug = orgName.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n const adminEmail = env.PLATFORM_ADMIN_EMAIL || config.platform.adminEmail;\n\n await execa('docker', [\n 'compose', '-f', COMPOSE_FILE, 'exec', '-T',\n '-e', `NHP_PLATFORM_ADMIN_USER=${adminEmail.split('@')[0]}`,\n '-e', `NHP_PLATFORM_ADMIN_EMAIL=${adminEmail}`,\n '-e', `NHP_PLATFORM_ADMIN_DISPLAY_NAME=Platform Admin`,\n '-e', `NHP_DEFAULT_TENANT_NAME=${orgName}`,\n '-e', `NHP_DEFAULT_TENANT_SLUG=${orgSlug}`,\n 'backend', 'npx', 'tsx', 'prisma/seed.ts',\n ], { cwd: projectDir, stdio: 'pipe' });\n seedSpinner.succeed('Platform database seeded');\n } catch {\n seedSpinner.warn('Prisma seed skipped (may not be available in Docker image)');\n }\n\n // --- Phase 8: Wait for backend to become healthy (tables now exist) ---\n const backendSpinner = ora('Waiting for backend to be healthy...').start();\n const backendReady = await waitForDockerHealthy(\n projectDir, 'backend', 180,\n );\n if (!backendReady) {\n backendSpinner.fail('Backend did not become healthy');\n logger.info('Check logs: docker compose logs backend');\n } else {\n backendSpinner.succeed('Backend is healthy');\n }\n\n // --- Phase 9: Initialize platform SQL (system apps, tenant, admin) ---\n const platformSpinner = ora('Initializing platform data...').start();\n try {\n const sql = buildInitPlatformSql(env);\n await execaCommand(\n `docker compose -f ${COMPOSE_FILE} exec -T platform-db psql -U ${env.PLATFORM_DB_USER || 'habeetat'} -d ${env.PLATFORM_DB_NAME || 'habeetat_platform'}`,\n { cwd: projectDir, input: sql },\n );\n platformSpinner.succeed('Platform data initialized');\n } catch (err) {\n platformSpinner.fail('Platform initialization failed');\n logger.error(String(err));\n logger.info('You may need to initialize the platform manually after first login');\n }\n\n // --- Phase 10: Seed analytics demo data ---\n const analyticsSpinner = ora('Seeding analytics demo data...').start();\n try {\n const orgName = env.ORGANIZATION_NAME || config.platform.organization || 'Default';\n const orgSlug = orgName.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n const adminUserId = 'usr_plat_admin01';\n\n // Seed ClickHouse events (raw analytics data)\n const chSql = buildClickhouseAnalyticsSeedSql(orgSlug, adminUserId);\n await execa('docker', [\n 'compose', '-f', COMPOSE_FILE, 'exec', '-T', 'clickhouse',\n 'clickhouse-client',\n ], { cwd: projectDir, input: chSql, stdio: ['pipe', 'pipe', 'pipe'] });\n\n // Seed Postgres analytics objects (dashboards, insights, funnels, retentions)\n const pgSql = buildAnalyticsObjectsSql(orgSlug, adminUserId);\n await execaCommand(\n `docker compose -f ${COMPOSE_FILE} exec -T platform-db psql -U ${env.PLATFORM_DB_USER || 'habeetat'} -d ${env.PLATFORM_DB_NAME || 'habeetat_platform'}`,\n { cwd: projectDir, input: pgSql },\n );\n\n analyticsSpinner.succeed('Analytics demo data seeded');\n } catch (err) {\n analyticsSpinner.warn('Analytics demo data seeding failed — app will start empty');\n logger.error(String(err));\n }\n\n // --- Phase 11: Create SigNoz admin user ---\n if (config.services.signoz) {\n const signozUserSpinner = ora('Creating SigNoz admin user...').start();\n try {\n const signozReady = await waitForDockerHealthy(projectDir, 'signoz-query-service', 120);\n if (!signozReady) {\n signozUserSpinner.warn('SigNoz query service not healthy — skipping admin user creation');\n } else {\n const adminEmail = env.PLATFORM_ADMIN_EMAIL || config.platform.adminEmail;\n const adminPassword = env.PLATFORM_ADMIN_PASSWORD || '';\n const orgName = env.ORGANIZATION_NAME || config.platform.organization || 'Default';\n\n const jsonBody = JSON.stringify({\n name: 'Platform Admin',\n email: adminEmail,\n password: adminPassword,\n organizationName: orgName,\n });\n\n try {\n await execa('docker', [\n 'compose', '-f', COMPOSE_FILE, 'exec', '-T',\n 'signoz-query-service',\n 'wget', '-q', '-O-',\n '--header=Content-Type: application/json',\n `--post-data=${jsonBody}`,\n 'http://localhost:8080/api/v1/register',\n ], { cwd: projectDir, stdio: 'pipe' });\n signozUserSpinner.succeed('SigNoz admin user created');\n } catch {\n signozUserSpinner.warn('SigNoz admin user already exists or registration not available');\n }\n }\n } catch (err) {\n signozUserSpinner.warn('SigNoz admin user setup skipped');\n logger.error(String(err));\n }\n }\n\n // Mark as initialized\n markInitialized(projectDir);\n\n console.log('');\n logger.info(`✓ Platform initialized for ${domain}`);\n logger.info(` Admin: ${env.PLATFORM_ADMIN_EMAIL || config.platform.adminEmail}`);\n logger.info(` Organization: ${env.ORGANIZATION_NAME || config.platform.organization}`);\n}\n","import ora from 'ora';\nimport { logger } from '../utils/logger.js';\nimport { getProjectDir, loadConfig } from '../utils/config.js';\nimport { composeUp, checkPrerequisites } from '../utils/docker.js';\nimport { isInitialized, initPlatform } from './init.js';\n\nexport async function upCommand(): Promise<void> {\n const projectDir = getProjectDir();\n const config = loadConfig(projectDir);\n\n logger.info(`Starting Habeetat Platform (${config.platform.domain})...`);\n\n if (!(await checkPrerequisites())) {\n process.exit(1);\n }\n\n const freshInstall = !isInitialized(projectDir);\n const spinner = ora('Starting services...').start();\n\n try {\n await composeUp({ cwd: projectDir });\n spinner.succeed('All services started');\n } catch (err) {\n spinner.fail('Failed to start services');\n logger.error(String(err));\n process.exit(1);\n }\n\n if (freshInstall) {\n console.log('');\n logger.info('First run detected — initializing platform...');\n console.log('');\n try {\n await initPlatform(projectDir);\n } catch (err) {\n logger.error('Platform initialization failed');\n logger.error(String(err));\n logger.info('You can retry with: npx habeetat init');\n process.exit(1);\n }\n }\n\n const proto = config.platform.protocol;\n const domain = config.platform.domain;\n\n console.log('');\n logger.info('Platform URLs:');\n console.log(` Launcher: ${proto}://launcher.${domain}`);\n console.log(` Organization Manager: ${proto}://organization-manager.${domain}`);\n console.log(` Platform Manager: ${proto}://platform-manager.${domain}`);\n if (config.services.analytics) {\n console.log(` Analytics: ${proto}://analytics.${domain}`);\n }\n console.log(` Backend API: ${proto}://api.${domain}`);\n console.log(` Logto IAM: ${proto}://iam.${domain}`);\n console.log(` Logto Admin Console: ${proto}://iam-console.${domain}`);\n if (config.services.signoz) {\n console.log(` SigNoz Logs & Traces: ${proto}://logs.${domain}`);\n }\n console.log('');\n logger.info('Run `habeetat status` to check service health');\n}\n","import ora from 'ora';\nimport { logger } from '../utils/logger.js';\nimport { getProjectDir } from '../utils/config.js';\nimport { composeDown } from '../utils/docker.js';\n\nexport async function downCommand(): Promise<void> {\n const projectDir = getProjectDir();\n const spinner = ora('Stopping services...').start();\n\n try {\n await composeDown({ cwd: projectDir });\n spinner.succeed('All services stopped');\n } catch (err) {\n spinner.fail('Failed to stop services');\n logger.error(String(err));\n process.exit(1);\n }\n}\n","import { logger } from '../utils/logger.js';\nimport { getProjectDir, loadConfig } from '../utils/config.js';\nimport { composePs } from '../utils/docker.js';\n\nexport async function statusCommand(): Promise<void> {\n const projectDir = getProjectDir();\n const config = loadConfig(projectDir);\n\n logger.info(`Habeetat Platform — ${config.platform.domain}`);\n logger.info(`Version: ${config.version}`);\n logger.info(`Image tag: ${config.docker.imageTag}`);\n console.log('');\n\n try {\n const output = await composePs({ cwd: projectDir });\n console.log(output);\n } catch (err) {\n logger.error('Could not get service status. Is the platform running?');\n logger.info('Run `habeetat up` to start the platform');\n process.exit(1);\n }\n}\n","import { logger } from '../utils/logger.js';\nimport { getProjectDir } from '../utils/config.js';\nimport { composeLogs } from '../utils/docker.js';\nimport { SERVICES } from '../constants.js';\n\nexport async function logsCommand(\n service?: string,\n options?: { follow?: boolean; tail?: number },\n): Promise<void> {\n const projectDir = getProjectDir();\n\n if (service && !(SERVICES as readonly string[]).includes(service)) {\n logger.error(`Unknown service: ${service}`);\n logger.info(`Available services: ${SERVICES.join(', ')}`);\n process.exit(1);\n }\n\n try {\n await composeLogs({\n cwd: projectDir,\n service,\n follow: options?.follow,\n tail: options?.tail,\n });\n } catch {\n // User interrupted with Ctrl+C — that's fine\n }\n}\n","import ora from 'ora';\nimport { logger } from '../utils/logger.js';\nimport { getProjectDir } from '../utils/config.js';\nimport { composeRestart } from '../utils/docker.js';\nimport { SERVICES } from '../constants.js';\n\nexport async function restartCommand(service?: string): Promise<void> {\n const projectDir = getProjectDir();\n\n if (service && !(SERVICES as readonly string[]).includes(service)) {\n logger.error(`Unknown service: ${service}`);\n logger.info(`Available services: ${SERVICES.join(', ')}`);\n process.exit(1);\n }\n\n const label = service || 'all services';\n const spinner = ora(`Restarting ${label}...`).start();\n\n try {\n await composeRestart({ cwd: projectDir, service });\n spinner.succeed(`Restarted ${label}`);\n } catch (err) {\n spinner.fail(`Failed to restart ${label}`);\n logger.error(String(err));\n process.exit(1);\n }\n}\n","import ora from 'ora';\nimport { logger } from '../utils/logger.js';\nimport { getProjectDir, loadConfig } from '../utils/config.js';\nimport { composeUp, checkPrerequisites } from '../utils/docker.js';\nimport { execaCommand } from 'execa';\nimport { COMPOSE_FILE } from '../constants.js';\n\nasync function composePull(opts: { cwd: string; service?: string }): Promise<void> {\n const cmd = opts.service\n ? `docker compose -f ${COMPOSE_FILE} pull ${opts.service}`\n : `docker compose -f ${COMPOSE_FILE} pull`;\n\n await execaCommand(cmd, {\n cwd: opts.cwd,\n stdio: 'inherit',\n });\n}\n\nexport async function updateCommand(service?: string): Promise<void> {\n const projectDir = getProjectDir();\n const config = loadConfig(projectDir);\n\n logger.info(`Updating Habeetat Platform (${config.platform.domain})...`);\n\n if (!(await checkPrerequisites())) {\n process.exit(1);\n }\n\n const label = service ? `service '${service}'` : 'all services';\n\n const pullSpinner = ora(`Pulling latest images for ${label}...`).start();\n try {\n await composePull({ cwd: projectDir, service });\n pullSpinner.succeed('Images pulled');\n } catch (err) {\n pullSpinner.fail('Failed to pull images');\n logger.error(String(err));\n process.exit(1);\n }\n\n const upSpinner = ora('Restarting updated containers...').start();\n try {\n await composeUp({ cwd: projectDir });\n upSpinner.succeed('Platform updated and running');\n } catch (err) {\n upSpinner.fail('Failed to restart containers');\n logger.error(String(err));\n process.exit(1);\n }\n\n console.log('');\n logger.info('Update complete. Run `habeetat status` to verify all services are healthy.');\n}\n","import chalk from 'chalk';\nimport { logger } from '../utils/logger.js';\nimport { checkDocker, checkDockerCompose } from '../utils/docker.js';\nimport { findProjectRoot, loadConfig } from '../utils/config.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { CONFIG_FILE, COMPOSE_FILE, ENV_FILE } from '../constants.js';\n\nexport async function doctorCommand(): Promise<void> {\n logger.phase('Habeetat Doctor — Diagnostics');\n let issues = 0;\n\n // Check Docker\n const dockerOk = await checkDocker();\n console.log(` Docker: ${dockerOk ? chalk.green('✓ Installed') : chalk.red('✗ Not found')}`);\n if (!dockerOk) issues++;\n\n // Check Docker Compose\n const composeOk = await checkDockerCompose();\n console.log(` Docker Compose: ${composeOk ? chalk.green('✓ Available') : chalk.red('✗ Not found')}`);\n if (!composeOk) issues++;\n\n // Check project directory\n const projectDir = findProjectRoot();\n console.log(` Project dir: ${projectDir ? chalk.green(`✓ ${projectDir}`) : chalk.yellow('⚠ Not in a Habeetat project')}`);\n if (!projectDir) {\n issues++;\n console.log('');\n logger.info(`Run \\`npm create habeetat my-platform\\` to create a new project`);\n return;\n }\n\n // Check config file\n const configExists = fs.existsSync(path.join(projectDir, CONFIG_FILE));\n console.log(` ${CONFIG_FILE}: ${configExists ? chalk.green('✓ Found') : chalk.red('✗ Missing')}`);\n if (!configExists) issues++;\n\n // Check compose file\n const composeExists = fs.existsSync(path.join(projectDir, COMPOSE_FILE));\n console.log(` ${COMPOSE_FILE}: ${composeExists ? chalk.green('✓ Found') : chalk.red('✗ Missing')}`);\n if (!composeExists) issues++;\n\n // Check env file\n const envExists = fs.existsSync(path.join(projectDir, ENV_FILE));\n console.log(` ${ENV_FILE}: ${envExists ? chalk.green('✓ Found') : chalk.red('✗ Missing')}`);\n if (!envExists) issues++;\n\n // Check nginx config\n const nginxExists = fs.existsSync(path.join(projectDir, 'nginx', 'platform.conf'));\n console.log(` nginx/platform.conf: ${nginxExists ? chalk.green('✓ Found') : chalk.red('✗ Missing')}`);\n if (!nginxExists) issues++;\n\n // Load config and check images\n if (configExists) {\n try {\n const config = loadConfig(projectDir);\n console.log(` Version: ${chalk.cyan(config.version)}`);\n console.log(` Domain: ${chalk.cyan(config.platform.domain)}`);\n console.log(` Protocol: ${chalk.cyan(config.platform.protocol)}`);\n } catch (err) {\n console.log(` Config: ${chalk.red('✗ Invalid JSON')}`);\n issues++;\n }\n }\n\n console.log('');\n if (issues === 0) {\n logger.success('No issues found');\n } else {\n logger.warn(`${issues} issue(s) found`);\n }\n}\n","import ora from 'ora';\nimport { createInterface } from 'node:readline';\nimport { logger } from '../utils/logger.js';\nimport { getProjectDir, loadConfig } from '../utils/config.js';\nimport { composeDestroy } from '../utils/docker.js';\n\nasync function confirm(message: string): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(`${message} (y/N) `, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === 'y');\n });\n });\n}\n\nexport async function destroyCommand(options: { force?: boolean }): Promise<void> {\n const projectDir = getProjectDir();\n const config = loadConfig(projectDir);\n const domain = config.platform.domain;\n\n logger.warn(`This will permanently destroy the Habeetat Platform (${domain}):`);\n console.log(' - Stop and remove all containers');\n console.log(' - Delete all Docker volumes (databases, data)');\n console.log(' - Remove orphan containers');\n console.log('');\n\n if (!options.force) {\n const ok = await confirm('Are you sure you want to continue?');\n if (!ok) {\n logger.info('Aborted');\n return;\n }\n }\n\n const spinner = ora('Destroying platform...').start();\n\n try {\n await composeDestroy({ cwd: projectDir });\n spinner.succeed('Platform destroyed — all containers and volumes removed');\n console.log('');\n logger.info('To reinstall, run: npx habeetat up');\n } catch (err) {\n spinner.fail('Failed to destroy platform');\n logger.error(String(err));\n process.exit(1);\n }\n}\n","import ora from 'ora';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport chalk from 'chalk';\nimport { execa } from 'execa';\nimport type { Command } from 'commander';\nimport { logger } from '../utils/logger.js';\nimport { getProjectDir, loadConfig } from '../utils/config.js';\nimport { COMPOSE_FILE } from '../constants.js';\n\n// Path to the seed script bundled with the CLI package.\n// __dirname is dist/ at runtime; tsup copies scripts/ → dist/scripts/ during build.\nconst SEED_SCRIPT_PATH = path.resolve(__dirname, 'scripts/nhp-seed-dev.ts');\n// Script is placed in the backend app directory so tsx resolves @prisma/client\n// and other workspace packages from the local node_modules there.\nconst SEED_SCRIPT_REMOTE = '/app/apps/habeetat-backend/nhp-seed-dev-tmp.ts';\n\nfunction loadEnv(projectDir: string): Record<string, string> {\n const envPath = path.join(projectDir, '.env');\n if (!fs.existsSync(envPath)) return {};\n const lines = fs.readFileSync(envPath, 'utf-8').split('\\n');\n const env: Record<string, string> = {};\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIdx = trimmed.indexOf('=');\n if (eqIdx === -1) continue;\n env[trimmed.slice(0, eqIdx)] = trimmed.slice(eqIdx + 1);\n }\n return env;\n}\n\nasync function runSeedScript(\n projectDir: string,\n command: string,\n args: string[],\n): Promise<Record<string, unknown>> {\n // Inject the script into the container via stdin so it works regardless\n // of whether the Docker image was built with or without scripts/.\n if (!fs.existsSync(SEED_SCRIPT_PATH)) {\n throw new Error(\n `Seed script not found at ${SEED_SCRIPT_PATH}. ` +\n `This is a bug — please reinstall @habeetat/cli.`,\n );\n }\n const scriptContent = fs.readFileSync(SEED_SCRIPT_PATH, 'utf-8');\n\n // Inject script into the backend app directory (not /tmp/) so that tsx\n // resolves @prisma/client and other workspace packages from the local node_modules.\n await execa(\n 'docker',\n ['compose', '-f', COMPOSE_FILE, 'exec', '-T', 'backend', 'sh', '-c',\n `cat > ${SEED_SCRIPT_REMOTE}`],\n { cwd: projectDir, input: scriptContent, stdio: 'pipe' },\n );\n\n let stdout = '';\n let stderr = '';\n try {\n // The WORKDIR in the backend container is /app/apps/habeetat-backend/,\n // so tsx resolves the script filename relative to that directory.\n const scriptFilename = SEED_SCRIPT_REMOTE.split('/').pop()!;\n ({ stdout, stderr } = await execa(\n 'docker',\n [\n 'compose', '-f', COMPOSE_FILE, 'exec', '-T', 'backend',\n 'npx', 'tsx', scriptFilename,\n command,\n ...args,\n ],\n { cwd: projectDir, stdio: 'pipe' },\n ));\n } finally {\n // Best-effort cleanup of the injected script\n await execa(\n 'docker',\n ['compose', '-f', COMPOSE_FILE, 'exec', '-T', 'backend', 'sh', '-c',\n `rm -f ${SEED_SCRIPT_REMOTE}`],\n { cwd: projectDir, stdio: 'pipe' },\n ).catch(() => {});\n }\n\n // Forward container stderr to our stderr for debugging\n if (stderr) process.stderr.write(stderr + '\\n');\n\n const jsonLine = stdout.trim().split('\\n').pop() ?? '';\n try {\n return JSON.parse(jsonLine) as Record<string, unknown>;\n } catch {\n throw new Error(`Script produced unexpected output: ${stdout}`);\n }\n}\n\nfunction printSdkConfig(\n config: { protocol: string; domain: string },\n env: Record<string, string>,\n parts: {\n tenant?: string;\n logtoAppId?: string;\n m2mClientId?: string;\n m2mClientSecret?: string;\n email?: string;\n password?: string;\n },\n) {\n const protocol = config.protocol || 'https';\n const domain = config.domain;\n const iamUrl = env.LOGTO_EXTERNAL_ENDPOINT || `${protocol}://iam.${domain}`;\n const iamAudience = env.IAM_AUDIENCE || `${protocol}://api.${domain}/api`;\n const apiUrl = iamAudience.replace(/\\/api$/, '');\n\n console.log('');\n console.log(chalk.cyan('═'.repeat(60)));\n console.log(chalk.cyan(' SDK Configuration'));\n console.log(chalk.cyan('═'.repeat(60)));\n console.log('');\n\n if (parts.logtoAppId) {\n console.log(chalk.bold(' Frontend SDK (@habeetat/sdk-react)'));\n console.log(chalk.dim(' ' + '─'.repeat(54)));\n console.log(` VITE_LOGTO_ENDPOINT=${chalk.green(iamUrl)}`);\n console.log(` VITE_LOGTO_APP_ID=${chalk.green(parts.logtoAppId)}`);\n console.log(` VITE_LOGTO_API_RESOURCE=${chalk.green(iamAudience)}`);\n if (parts.tenant) {\n console.log(` VITE_APP_TENANT=${chalk.green(parts.tenant)}`);\n }\n console.log('');\n }\n\n if (parts.m2mClientId) {\n console.log(chalk.bold(' Backend SDK (@habeetat/sdk-node)'));\n console.log(chalk.dim(' ' + '─'.repeat(54)));\n console.log(` HABEETAT_ENDPOINT=${chalk.green(apiUrl)}`);\n console.log(` HABEETAT_LOGTO_ENDPOINT=${chalk.green(iamUrl)}`);\n console.log(` HABEETAT_IAM_AUDIENCE=${chalk.green(iamAudience)}`);\n if (parts.tenant) {\n console.log(` HABEETAT_TENANT_SLUG=${chalk.green(parts.tenant)}`);\n }\n console.log(` HABEETAT_M2M_CLIENT_ID=${chalk.green(parts.m2mClientId)}`);\n console.log(` HABEETAT_M2M_CLIENT_SECRET=${chalk.green(parts.m2mClientSecret ?? '')}`);\n console.log('');\n } else if (parts.tenant && !parts.logtoAppId) {\n // tenant-only output (seed tenant command)\n console.log(chalk.bold(' Backend SDK (@habeetat/sdk-node)'));\n console.log(chalk.dim(' ' + '─'.repeat(54)));\n console.log(` HABEETAT_ENDPOINT=${chalk.green(apiUrl)}`);\n console.log(` HABEETAT_TENANT_SLUG=${chalk.green(parts.tenant)}`);\n console.log('');\n }\n\n if (parts.email && parts.password) {\n console.log(chalk.bold(' Test credentials'));\n console.log(chalk.dim(' ' + '─'.repeat(54)));\n console.log(` Email: ${chalk.green(parts.email)}`);\n console.log(` Password: ${chalk.green(parts.password)}`);\n console.log(` IAM: ${chalk.green(iamUrl)}`);\n console.log('');\n }\n\n console.log(chalk.cyan('═'.repeat(60)));\n console.log('');\n}\n\n// ---------------------------------------------------------------------------\n// Slug validation\n// ---------------------------------------------------------------------------\nfunction validateSlug(slug: string, entity: string): void {\n if (!/^[a-z0-9][a-z0-9-]*[a-z0-9]$/.test(slug) && !/^[a-z0-9]$/.test(slug)) {\n logger.error(\n `Invalid ${entity} slug \"${slug}\": must be lowercase alphanumeric with hyphens (e.g. get-master)`,\n );\n process.exit(1);\n }\n}\n\n// ---------------------------------------------------------------------------\n// seed tenant\n// ---------------------------------------------------------------------------\nexport async function seedTenantCommand(options: {\n name: string;\n slug: string;\n description?: string;\n}) {\n validateSlug(options.slug, 'tenant');\n const projectDir = getProjectDir();\n const config = loadConfig(projectDir);\n const env = loadEnv(projectDir);\n\n const args = [\n '--name', options.name,\n '--slug', options.slug,\n ...(options.description ? ['--description', options.description] : []),\n ];\n\n const spinner = ora(`Creating tenant \"${options.slug}\"...`).start();\n let result: Record<string, unknown>;\n try {\n result = await runSeedScript(projectDir, 'create-tenant', args);\n spinner.succeed(`Tenant created: ${chalk.bold(result.slug)} (${result.displayName})`);\n } catch (err) {\n spinner.fail('Failed to create tenant');\n logger.error(String(err));\n process.exit(1);\n }\n\n logger.info(` ID: ${result.id}`);\n logger.info(` Logto Org ID: ${result.logtoOrganizationId}`);\n\n printSdkConfig(config.platform, env, { tenant: result.slug as string });\n}\n\n// ---------------------------------------------------------------------------\n// seed app\n// ---------------------------------------------------------------------------\nexport async function seedAppCommand(options: {\n name: string;\n slug: string;\n redirectUri?: string[];\n logoutUri?: string[];\n corsOrigin?: string[];\n description?: string;\n tenant?: string;\n internal?: boolean;\n noM2m?: boolean;\n}) {\n validateSlug(options.slug, 'app');\n const projectDir = getProjectDir();\n const config = loadConfig(projectDir);\n const env = loadEnv(projectDir);\n\n const args: string[] = [\n '--name', options.name,\n '--slug', options.slug,\n ...(options.description ? ['--description', options.description] : []),\n ...(options.tenant ? ['--tenant', options.tenant] : []),\n ...(options.redirectUri?.flatMap((u) => ['--redirect-uri', u]) ?? []),\n ...(options.logoutUri?.flatMap((u) => ['--logout-uri', u]) ?? []),\n ...(options.corsOrigin?.flatMap((o) => ['--cors-origin', o]) ?? []),\n ...(options.internal ? ['--internal'] : []),\n ...(options.noM2m ? ['--no-m2m'] : []),\n ];\n\n const spinner = ora(`Creating app \"${options.slug}\"...`).start();\n let result: Record<string, unknown>;\n try {\n result = await runSeedScript(projectDir, 'create-app', args);\n spinner.succeed(`App created: ${chalk.bold(result.slug)} (Logto app: ${result.logtoAppId})`);\n } catch (err) {\n spinner.fail('Failed to create app');\n logger.error(String(err));\n process.exit(1);\n }\n\n logger.info(` ID: ${result.id}`);\n logger.info(` Logto App ID: ${result.logtoAppId}`);\n if (result.m2mClientId) {\n logger.info(` M2M Client ID: ${result.m2mClientId}`);\n logger.info(` M2M Client Secret: ${result.m2mClientSecret}`);\n }\n if (result.redirectUris && (result.redirectUris as string[]).length > 0) {\n logger.info(` Redirect URIs: ${(result.redirectUris as string[]).join(', ')}`);\n }\n if (result.tenantSlug) {\n logger.info(` Installed on: ${result.tenantSlug}`);\n }\n\n printSdkConfig(config.platform, env, {\n tenant: (result.tenantSlug as string) || options.tenant,\n logtoAppId: result.logtoAppId as string,\n m2mClientId: result.m2mClientId as string | undefined,\n m2mClientSecret: result.m2mClientSecret as string | undefined,\n });\n}\n\n// ---------------------------------------------------------------------------\n// seed update-app\n// ---------------------------------------------------------------------------\nexport async function seedUpdateAppCommand(options: {\n slug: string;\n redirectUri?: string[];\n logoutUri?: string[];\n corsOrigin?: string[];\n}) {\n const projectDir = getProjectDir();\n\n const args: string[] = [\n '--slug', options.slug,\n ...(options.redirectUri?.flatMap((u) => ['--redirect-uri', u]) ?? []),\n ...(options.logoutUri?.flatMap((u) => ['--logout-uri', u]) ?? []),\n ...(options.corsOrigin?.flatMap((o) => ['--cors-origin', o]) ?? []),\n ];\n\n const spinner = ora(`Updating app \"${options.slug}\"...`).start();\n let result: Record<string, unknown>;\n try {\n result = await runSeedScript(projectDir, 'update-app', args);\n spinner.succeed(`App updated: ${chalk.bold(result.slug)}`);\n } catch (err) {\n spinner.fail('Failed to update app');\n logger.error(String(err));\n process.exit(1);\n }\n\n if (result.redirectUris && (result.redirectUris as string[]).length > 0) {\n logger.info(` Redirect URIs: ${(result.redirectUris as string[]).join(', ')}`);\n }\n if (result.postLogoutRedirectUris && (result.postLogoutRedirectUris as string[]).length > 0) {\n logger.info(` Post-logout URIs: ${(result.postLogoutRedirectUris as string[]).join(', ')}`);\n }\n if (result.corsAllowedOrigins && (result.corsAllowedOrigins as string[]).length > 0) {\n logger.info(` CORS Origins: ${(result.corsAllowedOrigins as string[]).join(', ')}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// seed user\n// ---------------------------------------------------------------------------\nexport async function seedUserCommand(options: {\n email: string;\n password: string;\n tenant: string;\n username?: string;\n displayName?: string;\n role?: string;\n}) {\n const projectDir = getProjectDir();\n const config = loadConfig(projectDir);\n const env = loadEnv(projectDir);\n\n const args: string[] = [\n '--email', options.email,\n '--password', options.password,\n '--tenant', options.tenant,\n ...(options.username ? ['--username', options.username] : []),\n ...(options.displayName ? ['--display-name', options.displayName] : []),\n ...(options.role ? ['--role', options.role] : []),\n ];\n\n const spinner = ora(`Creating user \"${options.email}\" in tenant \"${options.tenant}\"...`).start();\n let result: Record<string, unknown>;\n try {\n result = await runSeedScript(projectDir, 'create-user', args);\n spinner.succeed(`User created: ${chalk.bold(result.email)} (Logto ID: ${result.logtoUserId})`);\n } catch (err) {\n spinner.fail('Failed to create user');\n logger.error(String(err));\n process.exit(1);\n }\n\n logger.info(` Logto User ID: ${result.logtoUserId}`);\n logger.info(` Username: ${result.username}`);\n logger.info(` Tenant: ${result.tenantSlug}`);\n logger.info(` Role: ${result.role}${result.roleAssigned ? '' : ' (not assigned — role not found in Logto)'}`);\n if (result.note) logger.info(` Note: ${result.note}`);\n\n printSdkConfig(config.platform, env, {\n tenant: result.tenantSlug as string,\n email: result.email as string,\n password: result.password as string,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Command registration\n// ---------------------------------------------------------------------------\nexport function registerSeedCommand(program: Command) {\n const seed = program\n .command('seed')\n .description('Seed dev data — create tenants, apps and users for local development');\n\n seed\n .command('tenant')\n .description('Create a new tenant (Logto org + platform DB)')\n .requiredOption('--name <name>', 'Display name (e.g. \"Acme Corp\")')\n .requiredOption('--slug <slug>', 'Unique slug, lowercase alphanumeric + hyphens (e.g. acme)')\n .option('--description <desc>', 'Optional description')\n .action((opts: { name: string; slug: string; description?: string }) => {\n return seedTenantCommand(opts);\n });\n\n seed\n .command('app')\n .description('Create a new OIDC application (Logto SPA app + platform DB)')\n .requiredOption('--name <name>', 'App display name (e.g. \"My CRM\")')\n .requiredOption('--slug <slug>', 'Unique slug, lowercase alphanumeric + hyphens (e.g. my-crm)')\n .option('--redirect-uri <uri...>', 'OIDC redirect URI(s) (e.g. http://localhost:3000/callback)')\n .option('--logout-uri <uri...>', 'Post-logout redirect URI(s)')\n .option('--cors-origin <origin...>', 'CORS allowed origin(s)')\n .option('--description <desc>', 'Optional description')\n .option('--tenant <slug>', 'Install app on this tenant after creation')\n .option('--internal', 'Mark app as internal/system app (default: false)')\n .option('--no-m2m', 'Skip M2M Logto application creation (frontend-only apps)')\n .action(\n (opts: {\n name: string;\n slug: string;\n redirectUri?: string[];\n logoutUri?: string[];\n corsOrigin?: string[];\n description?: string;\n tenant?: string;\n internal?: boolean;\n m2m?: boolean;\n }) => {\n return seedAppCommand({ ...opts, noM2m: opts.m2m === false });\n },\n );\n\n seed\n .command('update-app')\n .description('Update an existing app\\'s OIDC URIs and CORS origins')\n .requiredOption('--slug <slug>', 'App slug to update')\n .option('--redirect-uri <uri...>', 'Replace OIDC redirect URI(s)')\n .option('--logout-uri <uri...>', 'Replace post-logout redirect URI(s)')\n .option('--cors-origin <origin...>', 'Replace CORS allowed origin(s)')\n .action(\n (opts: {\n slug: string;\n redirectUri?: string[];\n logoutUri?: string[];\n corsOrigin?: string[];\n }) => {\n return seedUpdateAppCommand(opts);\n },\n );\n\n seed\n .command('user')\n .description('Create a new user in Logto and add to a tenant organization')\n .requiredOption('--email <email>', 'User email address')\n .requiredOption('--password <password>', 'User password')\n .requiredOption('--tenant <slug>', 'Tenant slug to add the user to')\n .option('--username <username>', 'Logto username (defaults to email prefix)')\n .option('--display-name <name>', 'Display name (defaults to username)')\n .option('--role <role>', 'Organization role to assign (default: TENANT_ADMIN)', 'TENANT_ADMIN')\n .action(\n (opts: {\n email: string;\n password: string;\n tenant: string;\n username?: string;\n displayName?: string;\n role?: string;\n }) => {\n return seedUserCommand(opts);\n },\n );\n}\n","import { Command } from 'commander';\nimport { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport path from 'node:path';\nimport { upCommand } from './commands/up.js';\nimport { downCommand } from './commands/down.js';\nimport { statusCommand } from './commands/status.js';\nimport { logsCommand } from './commands/logs.js';\nimport { restartCommand } from './commands/restart.js';\nimport { updateCommand } from './commands/update.js';\nimport { doctorCommand } from './commands/doctor.js';\nimport { destroyCommand } from './commands/destroy.js';\nimport { initPlatform } from './commands/init.js';\nimport { registerSeedCommand } from './commands/seed.js';\nimport { getProjectDir } from './utils/config.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nconst pkg = JSON.parse(\n readFileSync(path.resolve(__dirname, '..', 'package.json'), 'utf-8'),\n);\n\nconst program = new Command();\n\nprogram\n .name('habeetat')\n .description('Habeetat Platform CLI — manage your platform instances')\n .version(pkg.version);\n\nprogram\n .command('up')\n .description('Start the platform')\n .action(upCommand);\n\nprogram\n .command('down')\n .description('Stop the platform')\n .action(downCommand);\n\nprogram\n .command('status')\n .description('Show platform service status')\n .action(statusCommand);\n\nprogram\n .command('logs [service]')\n .description('View service logs')\n .option('-f, --follow', 'Follow log output')\n .option('-n, --tail <lines>', 'Number of lines to show', parseInt)\n .action((service: string | undefined, options: { follow?: boolean; tail?: number }) => {\n return logsCommand(service, options);\n });\n\nprogram\n .command('restart [service]')\n .description('Restart services')\n .action(restartCommand);\n\nprogram\n .command('update [service]')\n .description('Pull latest images and restart updated containers')\n .action(updateCommand);\n\nprogram\n .command('doctor')\n .description('Diagnose common issues')\n .action(doctorCommand);\n\nprogram\n .command('destroy')\n .description('Destroy the platform — remove all containers and volumes')\n .option('-f, --force', 'Skip confirmation prompt')\n .action((options: { force?: boolean }) => {\n return destroyCommand(options);\n });\n\nprogram\n .command('init')\n .description('Initialize platform (seed Logto apps, create admin user, setup database)')\n .action(() => {\n return initPlatform(getProjectDir());\n });\n\nregisterSeedCommand(program);\n\nprogram.parse();\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/logger.ts","../src/constants.ts","../src/utils/config.ts","../src/utils/docker.ts","../src/commands/init.ts","../src/commands/up.ts","../src/commands/down.ts","../src/commands/status.ts","../src/commands/logs.ts","../src/commands/restart.ts","../src/commands/update.ts","../src/commands/doctor.ts","../src/commands/destroy.ts","../src/commands/seed.ts","../src/bin.ts"],"names":["chalk","fs","path","execaCommand","ora","loadEnv","execa","program","__dirname","fileURLToPath"],"mappings":"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","file":"bin.mjs","sourcesContent":["import chalk from 'chalk';\n\nconst prefix = chalk.cyan('[habeetat]');\n\nexport const logger = {\n info: (msg: string) => console.log(`${prefix} ${msg}`),\n success: (msg: string) => console.log(`${prefix} ${chalk.green('✓')} ${msg}`),\n warn: (msg: string) => console.log(`${prefix} ${chalk.yellow('⚠')} ${msg}`),\n error: (msg: string) => console.error(`${prefix} ${chalk.red('✗')} ${msg}`),\n phase: (msg: string) => {\n console.log('');\n console.log(chalk.cyan('═'.repeat(56)));\n console.log(chalk.cyan(` ${msg}`));\n console.log(chalk.cyan('═'.repeat(56)));\n console.log('');\n },\n banner: () => {\n console.log('');\n console.log(chalk.cyan('╔══════════════════════════════════════════════╗'));\n console.log(chalk.cyan('║ ║'));\n console.log(chalk.cyan('║ Habeetat Platform CLI ║'));\n console.log(chalk.cyan('║ ║'));\n console.log(chalk.cyan('╚══════════════════════════════════════════════╝'));\n console.log('');\n },\n};\n","export const CONFIG_FILE = 'habeetat.json';\nexport const ENV_FILE = '.env';\nexport const COMPOSE_FILE = 'docker-compose.yml';\n\nexport const DOCKER_REGISTRY = 'docker.io/capriisland';\n\nexport const IMAGES = {\n backend: 'capriisland/habeetat-backend',\n launcher: 'capriisland/habeetat-launcher',\n orgManager: 'capriisland/habeetat-org-manager',\n platformManager: 'capriisland/habeetat-platform-manager',\n analytics: 'capriisland/habeetat-analytics',\n sampleCrm: 'capriisland/habeetat-sample-crm',\n logtoConfig: 'capriisland/habeetat-logto-config',\n} as const;\n\nexport const THIRD_PARTY_IMAGES = {\n postgres: 'postgres:15-alpine',\n logto: 'svhd/logto:1.33',\n nginx: 'nginx:1.25-alpine',\n certbot: 'certbot/certbot',\n zookeeper: 'zookeeper:3.7',\n clickhouse: 'clickhouse/clickhouse-server:24.1.2-alpine',\n signozSchemaMigrator: 'signoz/signoz-schema-migrator:0.88.22',\n signozOtelCollector: 'signoz/signoz-otel-collector:0.88.22',\n signozQuery: 'signoz/query-service:0.45.0',\n signozFrontend: 'signoz/frontend:0.45.0',\n} as const;\n\nexport const DEFAULT_PORTS = {\n http: 80,\n https: 443,\n hostNginx: 8080,\n} as const;\n\nexport const SERVICES = [\n 'logto-db',\n 'platform-db',\n 'logto-core',\n 'backend',\n 'launcher',\n 'organization-manager',\n 'platform-manager',\n 'analytics',\n 'sample-crm',\n 'nginx',\n 'zookeeper',\n 'clickhouse',\n 'otel-collector-migrator',\n 'otel-collector',\n 'signoz-query-service',\n 'signoz-frontend',\n] as const;\n\nexport type ServiceName = (typeof SERVICES)[number];\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { CONFIG_FILE } from '../constants.js';\nimport type { HabeetatConfig } from '../types.js';\n\nexport function findProjectRoot(startDir: string = process.cwd()): string | null {\n let dir = startDir;\n while (dir !== path.dirname(dir)) {\n if (fs.existsSync(path.join(dir, CONFIG_FILE))) {\n return dir;\n }\n dir = path.dirname(dir);\n }\n return null;\n}\n\nexport function loadConfig(projectDir?: string): HabeetatConfig {\n const dir = projectDir || findProjectRoot();\n if (!dir) {\n throw new Error(\n `Could not find ${CONFIG_FILE}. Are you inside a Habeetat project directory?`,\n );\n }\n const configPath = path.join(dir, CONFIG_FILE);\n const raw = fs.readFileSync(configPath, 'utf-8');\n return JSON.parse(raw) as HabeetatConfig;\n}\n\nexport function saveConfig(config: HabeetatConfig, projectDir: string): void {\n const configPath = path.join(projectDir, CONFIG_FILE);\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n}\n\nexport function getProjectDir(): string {\n const dir = findProjectRoot();\n if (!dir) {\n throw new Error(\n `Could not find ${CONFIG_FILE}. Are you inside a Habeetat project directory?`,\n );\n }\n return dir;\n}\n","import { execaCommand } from 'execa';\nimport { logger } from './logger.js';\n\nexport async function checkDocker(): Promise<boolean> {\n try {\n const { stdout } = await execaCommand('docker --version');\n const match = stdout.match(/Docker version (\\d+)/);\n if (match && parseInt(match[1], 10) >= 20) {\n return true;\n }\n logger.error(`Docker >= 20.0 required. Found: ${stdout.trim()}`);\n return false;\n } catch {\n logger.error('Docker is not installed or not in PATH');\n logger.info('Install Docker: https://docs.docker.com/get-docker/');\n return false;\n }\n}\n\nexport async function checkDockerCompose(): Promise<boolean> {\n try {\n await execaCommand('docker compose version');\n return true;\n } catch {\n logger.error('Docker Compose V2 is not available');\n logger.info('Docker Compose V2 is included with Docker Desktop');\n return false;\n }\n}\n\nexport async function checkPrerequisites(): Promise<boolean> {\n const docker = await checkDocker();\n const compose = await checkDockerCompose();\n return docker && compose;\n}\n\nexport interface ComposeExecOptions {\n cwd: string;\n composeFile?: string;\n silent?: boolean;\n}\n\nexport async function composeUp(opts: ComposeExecOptions): Promise<void> {\n const file = opts.composeFile || 'docker-compose.yml';\n await execaCommand(`docker compose -f ${file} up -d`, {\n cwd: opts.cwd,\n stdio: opts.silent ? 'pipe' : 'inherit',\n });\n}\n\nexport async function composeDown(opts: ComposeExecOptions): Promise<void> {\n const file = opts.composeFile || 'docker-compose.yml';\n await execaCommand(`docker compose -f ${file} down`, {\n cwd: opts.cwd,\n stdio: opts.silent ? 'pipe' : 'inherit',\n });\n}\n\nexport async function composeDestroy(opts: ComposeExecOptions): Promise<void> {\n const file = opts.composeFile || 'docker-compose.yml';\n await execaCommand(`docker compose -f ${file} down -v --remove-orphans`, {\n cwd: opts.cwd,\n stdio: opts.silent ? 'pipe' : 'inherit',\n });\n}\n\nexport async function composePs(opts: ComposeExecOptions): Promise<string> {\n const file = opts.composeFile || 'docker-compose.yml';\n const { stdout } = await execaCommand(`docker compose -f ${file} ps`, {\n cwd: opts.cwd,\n });\n return stdout;\n}\n\nexport async function composeLogs(\n opts: ComposeExecOptions & { service?: string; follow?: boolean; tail?: number },\n): Promise<void> {\n const file = opts.composeFile || 'docker-compose.yml';\n const parts = ['docker', 'compose', '-f', file, 'logs'];\n if (opts.follow) parts.push('-f');\n if (opts.tail) parts.push('--tail', String(opts.tail));\n if (opts.service) parts.push(opts.service);\n\n await execaCommand(parts.join(' '), {\n cwd: opts.cwd,\n stdio: 'inherit',\n });\n}\n\nexport async function composeRestart(\n opts: ComposeExecOptions & { service?: string },\n): Promise<void> {\n const file = opts.composeFile || 'docker-compose.yml';\n const cmd = opts.service\n ? `docker compose -f ${file} restart ${opts.service}`\n : `docker compose -f ${file} restart`;\n\n await execaCommand(cmd, {\n cwd: opts.cwd,\n stdio: opts.silent ? 'pipe' : 'inherit',\n });\n}\n\nexport async function composeExec(\n opts: ComposeExecOptions & { service: string; command: string },\n): Promise<string> {\n const file = opts.composeFile || 'docker-compose.yml';\n const { stdout } = await execaCommand(\n `docker compose -f ${file} exec -T ${opts.service} ${opts.command}`,\n { cwd: opts.cwd },\n );\n return stdout;\n}\n\nexport async function dockerPull(image: string): Promise<void> {\n await execaCommand(`docker pull ${image}`, { stdio: 'inherit' });\n}\n","import ora from 'ora';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { execa, execaCommand } from 'execa';\nimport { logger } from '../utils/logger.js';\nimport { getProjectDir, loadConfig } from '../utils/config.js';\nimport { COMPOSE_FILE } from '../constants.js';\n\nconst INITIALIZED_FILE = '.initialized';\n\nexport function isInitialized(projectDir: string): boolean {\n return fs.existsSync(path.join(projectDir, INITIALIZED_FILE));\n}\n\nfunction markInitialized(projectDir: string): void {\n fs.writeFileSync(\n path.join(projectDir, INITIALIZED_FILE),\n JSON.stringify({ initializedAt: new Date().toISOString() }, null, 2) + '\\n',\n );\n}\n\nfunction loadEnv(projectDir: string): Record<string, string> {\n const envPath = path.join(projectDir, '.env');\n if (!fs.existsSync(envPath)) return {};\n const lines = fs.readFileSync(envPath, 'utf-8').split('\\n');\n const env: Record<string, string> = {};\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIdx = trimmed.indexOf('=');\n if (eqIdx === -1) continue;\n env[trimmed.slice(0, eqIdx)] = trimmed.slice(eqIdx + 1);\n }\n return env;\n}\n\nasync function execCompose(projectDir: string, args: string): Promise<string> {\n const { stdout } = await execaCommand(\n `docker compose -f ${COMPOSE_FILE} ${args}`,\n { cwd: projectDir },\n );\n return stdout;\n}\n\nasync function waitForService(\n projectDir: string,\n service: string,\n checkCmd: string,\n timeoutSec: number,\n): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutSec * 1000) {\n try {\n await execCompose(projectDir, `exec -T ${service} ${checkCmd}`);\n return true;\n } catch {\n await new Promise((r) => setTimeout(r, 3000));\n }\n }\n return false;\n}\n\nasync function getContainerState(\n projectDir: string,\n service: string,\n): Promise<{ state: string; health: string } | null> {\n try {\n const { stdout } = await execaCommand(\n `docker compose -f ${COMPOSE_FILE} ps ${service} --format json`,\n { cwd: projectDir },\n );\n const lines = stdout.trim().split('\\n');\n for (const line of lines) {\n try {\n const info = JSON.parse(line);\n return { state: info.State || '', health: info.Health || '' };\n } catch { /* skip non-json lines */ }\n }\n } catch { /* container may not exist yet */ }\n return null;\n}\n\nasync function waitForDockerRunning(\n projectDir: string,\n service: string,\n timeoutSec: number,\n): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutSec * 1000) {\n const info = await getContainerState(projectDir, service);\n if (info && info.state === 'running') return true;\n await new Promise((r) => setTimeout(r, 3000));\n }\n return false;\n}\n\nasync function waitForDockerHealthy(\n projectDir: string,\n service: string,\n timeoutSec: number,\n): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < timeoutSec * 1000) {\n const info = await getContainerState(projectDir, service);\n if (info) {\n if (info.health === 'healthy') return true;\n if (info.state === 'running' && !info.health) return true;\n }\n await new Promise((r) => setTimeout(r, 5000));\n }\n return false;\n}\n\nfunction buildSeedLogtoAppsSql(env: Record<string, string>): string {\n const protocol = env.PROTOCOL || 'https';\n const domain = env.DOMAIN || 'localhost';\n const launcherUrl = env.LAUNCHER_URL || `${protocol}://launcher.${domain}`;\n const orgManagerUrl = env.ORG_MANAGER_URL || `${protocol}://organization-manager.${domain}`;\n const platformManagerUrl = env.PLATFORM_MANAGER_URL || `${protocol}://platform-manager.${domain}`;\n const analyticsUrl = env.ANALYTICS_URL || `${protocol}://analytics.${domain}`;\n const apiResource = env.IAM_AUDIENCE || `${protocol}://api.${domain}/api`;\n const m2mAppId = 'nhp-m2m-config';\n const m2mAppSecret = env.LOGTO_M2M_APP_SECRET || '';\n\n return `BEGIN;\n\n-- API Resource\nINSERT INTO resources (tenant_id, id, name, indicator, is_default, access_token_ttl)\nVALUES ('default', 'nhp-backend-resource', 'NHP Backend API', '${apiResource}', false, 3600)\nON CONFLICT (id) DO UPDATE\nSET name = EXCLUDED.name, indicator = EXCLUDED.indicator, access_token_ttl = EXCLUDED.access_token_ttl;\n\n-- Scope for API Resource\nINSERT INTO scopes (tenant_id, id, resource_id, name, description)\nVALUES ('default', 'nhp-backend-scope', 'nhp-backend-resource', 'nhp:all', 'Full access to NHP backend API')\nON CONFLICT (id) DO UPDATE\nSET resource_id = EXCLUDED.resource_id, name = EXCLUDED.name, description = EXCLUDED.description;\n\n-- Launcher SPA\nINSERT INTO applications (tenant_id, id, name, secret, description, type, oidc_client_metadata, custom_client_metadata, is_third_party)\nVALUES (\n 'default', 'nhp-launcher', 'Habeetat Launcher', 'spa-secret-nhp-launcher', 'Main launcher application', 'SPA',\n jsonb_build_object('redirectUris', ARRAY['${launcherUrl}', '${launcherUrl}/callback'], 'postLogoutRedirectUris', ARRAY['${launcherUrl}']),\n '{}'::jsonb, false\n) ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, description = EXCLUDED.description, type = EXCLUDED.type, oidc_client_metadata = EXCLUDED.oidc_client_metadata;\n\n-- Organization Manager SPA\nINSERT INTO applications (tenant_id, id, name, secret, description, type, oidc_client_metadata, custom_client_metadata, is_third_party)\nVALUES (\n 'default', 'nhp-org-manager', 'Organization Manager', 'spa-secret-nhp-org-manager', 'Organization management application', 'SPA',\n jsonb_build_object('redirectUris', ARRAY['${orgManagerUrl}', '${orgManagerUrl}/callback'], 'postLogoutRedirectUris', ARRAY['${orgManagerUrl}']),\n '{}'::jsonb, false\n) ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, description = EXCLUDED.description, type = EXCLUDED.type, oidc_client_metadata = EXCLUDED.oidc_client_metadata;\n\n-- Platform Manager SPA\nINSERT INTO applications (tenant_id, id, name, secret, description, type, oidc_client_metadata, custom_client_metadata, is_third_party)\nVALUES (\n 'default', 'nhp-plat-mgr', 'Platform Manager', 'spa-secret-nhp-plat-mgr', 'Platform administration application', 'SPA',\n jsonb_build_object('redirectUris', ARRAY['${platformManagerUrl}', '${platformManagerUrl}/callback'], 'postLogoutRedirectUris', ARRAY['${platformManagerUrl}']),\n '{}'::jsonb, false\n) ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, description = EXCLUDED.description, type = EXCLUDED.type, oidc_client_metadata = EXCLUDED.oidc_client_metadata;\n\n-- Analytics SPA\nINSERT INTO applications (tenant_id, id, name, secret, description, type, oidc_client_metadata, custom_client_metadata, is_third_party)\nVALUES (\n 'default', 'nhp-analytics', 'Product Analytics', 'spa-secret-nhp-analytics', 'Product analytics dashboard', 'SPA',\n jsonb_build_object('redirectUris', ARRAY['${analyticsUrl}', '${analyticsUrl}/callback'], 'postLogoutRedirectUris', ARRAY['${analyticsUrl}']),\n '{}'::jsonb, false\n) ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, description = EXCLUDED.description, type = EXCLUDED.type, oidc_client_metadata = EXCLUDED.oidc_client_metadata;\n\n-- M2M Application for backend\nINSERT INTO applications (tenant_id, id, name, secret, description, type, oidc_client_metadata, custom_client_metadata, is_third_party)\nVALUES (\n 'default', '${m2mAppId}', 'NHP M2M Config', '${m2mAppSecret}', 'Machine-to-machine application for backend services', 'MachineToMachine',\n jsonb_build_object('redirectUris', ARRAY[]::text[], 'postLogoutRedirectUris', ARRAY[]::text[]),\n '{}'::jsonb, false\n) ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, secret = EXCLUDED.secret, description = EXCLUDED.description, type = EXCLUDED.type;\n\n-- Assign Management API role to M2M app\nDO $$\nDECLARE\n v_role_id TEXT;\nBEGIN\n SELECT id INTO v_role_id FROM roles\n WHERE tenant_id = 'default' AND name = 'Logto Management API access' AND type = 'MachineToMachine'\n LIMIT 1;\n\n IF v_role_id IS NULL THEN\n v_role_id := 'role_m2m_mgmt_api';\n INSERT INTO roles (tenant_id, id, name, description, type)\n VALUES ('default', v_role_id, 'Logto Management API access', 'Access to Logto Management API', 'MachineToMachine');\n\n INSERT INTO roles_scopes (tenant_id, id, role_id, scope_id)\n SELECT 'default', 'rs_' || s.id, v_role_id, s.id\n FROM scopes s WHERE s.resource_id = 'management-api' AND s.tenant_id = 'default'\n ON CONFLICT DO NOTHING;\n END IF;\n\n INSERT INTO applications_roles (tenant_id, id, application_id, role_id)\n VALUES ('default', 'ar_m2m_${m2mAppId}', '${m2mAppId}', v_role_id)\n ON CONFLICT DO NOTHING;\nEND $$;\n\n-- Update admin-console redirect URIs\nUPDATE applications\nSET oidc_client_metadata = jsonb_build_object(\n 'redirectUris', ARRAY['${protocol}://iam-console.${domain}/callback'],\n 'postLogoutRedirectUris', ARRAY['${protocol}://iam-console.${domain}']\n)\nWHERE id = 'admin-console' AND tenant_id = 'admin';\n\nCOMMIT;`;\n}\n\nfunction buildInitPlatformSql(env: Record<string, string>): string {\n const protocol = env.PROTOCOL || 'https';\n const domain = env.DOMAIN || 'localhost';\n const adminEmail = env.PLATFORM_ADMIN_EMAIL || 'admin@habeetat.local';\n const orgName = env.ORGANIZATION_NAME || 'Default Organization';\n const orgSlug = orgName.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n\n return `\n-- Seed system applications\nINSERT INTO applications (id, slug, name, description, category, is_internal, is_system_app, is_hidden, auto_install, status, logto_app_id, created_at, updated_at)\nVALUES\n ('app_launcher', 'habeetat-launcher', 'Habeetat Launcher', 'Main launcher and navigation hub', 'system', true, true, true, true, 'PUBLISHED', 'nhp-launcher', NOW(), NOW()),\n ('app_org_manager', 'organization-manager', 'Organization Manager', 'Manage organizations, users and roles', 'system', true, true, false, true, 'PUBLISHED', 'nhp-org-manager', NOW(), NOW()),\n ('app_plat_manager', 'platform-manager', 'Platform Manager', 'Platform administration and configuration', 'system', true, true, true, false, 'PUBLISHED', 'nhp-plat-mgr', NOW(), NOW()),\n ('app_analytics', 'product-analytics', 'Product Analytics', 'Track events, analyze funnels, measure retention, and understand user behavior', 'system', true, true, false, true, 'PUBLISHED', 'nhp-analytics', NOW(), NOW())\nON CONFLICT (slug) DO UPDATE SET\n name = EXCLUDED.name,\n description = EXCLUDED.description,\n logto_app_id = EXCLUDED.logto_app_id,\n is_system_app = EXCLUDED.is_system_app,\n is_hidden = EXCLUDED.is_hidden,\n auto_install = EXCLUDED.auto_install,\n status = EXCLUDED.status;\n\n-- Create initial versions for system apps\nINSERT INTO application_versions (id, app_id, version, manifest, status, created_at)\nVALUES\n ('ver_launcher_100', 'app_launcher', '1.0.0', jsonb_build_object('endpoints', jsonb_build_object('main', '${protocol}://launcher.${domain}')), 'ACTIVE', NOW()),\n ('ver_org_manager_100', 'app_org_manager', '1.0.0', jsonb_build_object('endpoints', jsonb_build_object('main', '${protocol}://organization-manager.${domain}')), 'ACTIVE', NOW()),\n ('ver_plat_manager_100', 'app_plat_manager', '1.0.0', jsonb_build_object('endpoints', jsonb_build_object('main', '${protocol}://platform-manager.${domain}')), 'ACTIVE', NOW()),\n ('ver_analytics_100', 'app_analytics', '1.0.0', jsonb_build_object('endpoints', jsonb_build_object('main', '${protocol}://analytics.${domain}')), 'ACTIVE', NOW())\nON CONFLICT (app_id, version) DO UPDATE SET manifest = EXCLUDED.manifest;\n\n-- Create default tenant\nINSERT INTO tenants (id, display_name, slug, status, created_at, updated_at)\nSELECT\n 'tenant_${orgSlug}',\n '${orgName}',\n '${orgSlug}',\n 'ACTIVE',\n NOW(),\n NOW()\nWHERE NOT EXISTS (\n SELECT 1 FROM tenants WHERE slug = '${orgSlug}'\n);\n\n-- Initialize tenant, admin user, roles, memberships, and app installations\nDO $$\nDECLARE\n v_tenant_id TEXT;\n v_user_id TEXT;\n v_admin_role_id TEXT;\nBEGIN\n SELECT id INTO v_tenant_id FROM tenants WHERE slug = '${orgSlug}' LIMIT 1;\n\n IF v_tenant_id IS NULL THEN\n RAISE NOTICE 'Tenant not found, skipping user setup';\n RETURN;\n END IF;\n\n SELECT id INTO v_user_id FROM users\n WHERE external_identity_id = 'usr_admin01'\n OR primary_email = '${adminEmail}'\n LIMIT 1;\n\n IF v_user_id IS NULL THEN\n v_user_id := 'usr_plat_admin01';\n INSERT INTO users (id, external_identity_id, primary_email, username, display_name, status, created_at, updated_at)\n VALUES (v_user_id, 'usr_admin01', '${adminEmail}', 'admin', 'Platform Admin', 'ACTIVE', NOW(), NOW());\n ELSE\n UPDATE users SET external_identity_id = 'usr_admin01'\n WHERE id = v_user_id AND external_identity_id IS NULL;\n END IF;\n\n SELECT id INTO v_admin_role_id FROM tenant_roles WHERE name = 'TENANT_ADMIN' LIMIT 1;\n\n IF v_admin_role_id IS NULL THEN\n v_admin_role_id := 'role_tenant_admin';\n INSERT INTO tenant_roles (id, name, description, created_at, updated_at)\n VALUES (v_admin_role_id, 'TENANT_ADMIN', 'Tenant Administrator', NOW(), NOW());\n END IF;\n\n INSERT INTO tenant_memberships (id, user_id, tenant_id, status, created_at, updated_at)\n SELECT 'tm_admin_${orgSlug}', v_user_id, v_tenant_id, 'ACTIVE', NOW(), NOW()\n WHERE NOT EXISTS (\n SELECT 1 FROM tenant_memberships WHERE user_id = v_user_id AND tenant_id = v_tenant_id\n );\n\n INSERT INTO tenant_membership_roles (id, membership_id, role_id, created_at)\n SELECT 'tmr_admin_${orgSlug}', 'tm_admin_${orgSlug}', v_admin_role_id, NOW()\n WHERE NOT EXISTS (\n SELECT 1 FROM tenant_membership_roles\n WHERE membership_id = 'tm_admin_${orgSlug}' AND role_id = v_admin_role_id\n );\nEND $$;\n\n-- Auto-install published non-hidden apps for the default tenant\nINSERT INTO tenant_application_installations (id, tenant_id, app_id, app_version_id, status, is_enabled, installed_at, updated_at)\nSELECT 'tai_${orgSlug}_' || a.slug, t.id, a.id, v.id, 'INSTALLED', true, NOW(), NOW()\nFROM tenants t\nJOIN applications a ON a.status = 'PUBLISHED' AND a.is_hidden = false\nJOIN application_versions v ON v.app_id = a.id AND v.version = '1.0.0'\nWHERE t.slug = '${orgSlug}'\nON CONFLICT (tenant_id, app_id) DO NOTHING;`;\n}\n\nfunction buildClickhouseAnalyticsSeedSql(tenantId: string, adminUserId: string): string {\n const now = new Date();\n const rows: string[] = [];\n\n const users = [adminUserId, 'usr_demo_001', 'usr_demo_002', 'usr_demo_003', 'usr_demo_004'];\n const events = [\n { name: 'page_view', props: (page: string) => `{\"page\":\"${page}\",\"referrer\":\"direct\"}` },\n { name: 'user_login', props: () => `{\"method\":\"password\"}` },\n { name: 'feature_used', props: (f: string) => `{\"feature\":\"${f}\"}` },\n { name: 'report_created', props: () => `{\"type\":\"insight\"}` },\n { name: 'dashboard_viewed', props: () => `{\"dashboard\":\"main\"}` },\n { name: 'user_logout', props: () => `{}` },\n ];\n const pages = ['/dashboard', '/analytics', '/users', '/settings', '/reports'];\n const features = ['insights', 'funnels', 'retention', 'user-feed', 'dashboards'];\n\n // Generate ~200 events spread across last 30 days\n for (let day = 29; day >= 0; day--) {\n const date = new Date(now);\n date.setDate(date.getDate() - day);\n const eventsPerDay = 4 + Math.floor(Math.random() * 10);\n\n for (let i = 0; i < eventsPerDay; i++) {\n const userId = users[Math.floor(Math.random() * users.length)];\n const hour = 8 + Math.floor(Math.random() * 10);\n const minute = Math.floor(Math.random() * 60);\n const ts = `${date.toISOString().split('T')[0]} ${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}:00`;\n\n const sessionId = `sess_${day}_${i}`;\n\n // Always add a login at start of day\n if (i === 0) {\n rows.push(`('${tenantId}','${userId}','${sessionId}','user_login','{\"method\":\"password\"}','${ts}')`);\n }\n\n const eventIdx = Math.floor(Math.random() * events.length);\n const ev = events[eventIdx];\n let props = '';\n if (ev.name === 'page_view') props = ev.props(pages[Math.floor(Math.random() * pages.length)]);\n else if (ev.name === 'feature_used') props = ev.props(features[Math.floor(Math.random() * features.length)]);\n else props = (ev.props as () => string)();\n\n rows.push(`('${tenantId}','${userId}','${sessionId}','${ev.name}','${props}','${ts}')`);\n }\n }\n\n return `INSERT INTO nhp_analytics.events (tenant_id, user_id, session_id, event_name, properties, timestamp) VALUES ${rows.join(',\\n')};`;\n}\n\nfunction buildAnalyticsObjectsSql(tenantId: string, adminUserId: string): string {\n return `\n-- Analytics dashboard\nINSERT INTO analytics_dashboards (id, tenant_id, name, description, layout, created_by, created_at, updated_at)\nVALUES (\n 'dash_default_${tenantId.replace(/-/g, '_')}',\n '${tenantId}',\n 'Overview',\n 'Main analytics dashboard',\n '[{\"i\":\"ins_pv\",\"x\":0,\"y\":0,\"w\":6,\"h\":3},{\"i\":\"ins_fl\",\"x\":6,\"y\":0,\"w\":6,\"h\":3},{\"i\":\"ins_fu\",\"x\":0,\"y\":3,\"w\":12,\"h\":3}]',\n '${adminUserId}',\n NOW(), NOW()\n) ON CONFLICT (id) DO NOTHING;\n\n-- Insight: Page views trend\nINSERT INTO analytics_insights (id, tenant_id, name, type, config, created_by, created_at, updated_at)\nVALUES (\n 'ins_pv',\n '${tenantId}',\n 'Page Views (last 30d)',\n 'TREND',\n '{\"eventName\":\"page_view\",\"aggregation\":\"count\",\"interval\":\"day\",\"filters\":[]}',\n '${adminUserId}',\n NOW(), NOW()\n) ON CONFLICT (id) DO NOTHING;\n\n-- Insight: Feature usage breakdown\nINSERT INTO analytics_insights (id, tenant_id, name, type, config, created_by, created_at, updated_at)\nVALUES (\n 'ins_fl',\n '${tenantId}',\n 'Feature Usage Breakdown',\n 'PIE',\n '{\"eventName\":\"feature_used\",\"aggregation\":\"count\",\"interval\":\"day\",\"groupBy\":\"feature\",\"filters\":[]}',\n '${adminUserId}',\n NOW(), NOW()\n) ON CONFLICT (id) DO NOTHING;\n\n-- Insight: Unique active users\nINSERT INTO analytics_insights (id, tenant_id, name, type, config, created_by, created_at, updated_at)\nVALUES (\n 'ins_fu',\n '${tenantId}',\n 'Unique Active Users (last 30d)',\n 'TREND',\n '{\"eventName\":\"user_login\",\"aggregation\":\"count_unique\",\"interval\":\"day\",\"filters\":[]}',\n '${adminUserId}',\n NOW(), NOW()\n) ON CONFLICT (id) DO NOTHING;\n\n-- Funnel: Login → Feature → Report\nINSERT INTO analytics_funnels (id, tenant_id, name, steps, window_seconds, created_by, created_at, updated_at)\nVALUES (\n 'fun_onboarding_${tenantId.replace(/-/g, '_')}',\n '${tenantId}',\n 'Login → Feature → Report',\n '[{\"eventName\":\"user_login\"},{\"eventName\":\"feature_used\"},{\"eventName\":\"report_created\"}]',\n 86400,\n '${adminUserId}',\n NOW(), NOW()\n) ON CONFLICT (id) DO NOTHING;\n\n-- Funnel: Login → Dashboard → Feature\nINSERT INTO analytics_funnels (id, tenant_id, name, steps, window_seconds, created_by, created_at, updated_at)\nVALUES (\n 'fun_engagement_${tenantId.replace(/-/g, '_')}',\n '${tenantId}',\n 'Login → Dashboard → Feature',\n '[{\"eventName\":\"user_login\"},{\"eventName\":\"dashboard_viewed\"},{\"eventName\":\"feature_used\"}]',\n 3600,\n '${adminUserId}',\n NOW(), NOW()\n) ON CONFLICT (id) DO NOTHING;\n\n-- Retention: Login → return login (weekly)\nINSERT INTO analytics_retentions (id, tenant_id, name, start_event, return_event, period, created_by, created_at, updated_at)\nVALUES (\n 'ret_login_${tenantId.replace(/-/g, '_')}',\n '${tenantId}',\n 'Weekly Login Retention',\n 'user_login',\n 'user_login',\n 'WEEK',\n '${adminUserId}',\n NOW(), NOW()\n) ON CONFLICT (id) DO NOTHING;\n\n-- Retention: Feature adoption (daily)\nINSERT INTO analytics_retentions (id, tenant_id, name, start_event, return_event, period, created_by, created_at, updated_at)\nVALUES (\n 'ret_feature_${tenantId.replace(/-/g, '_')}',\n '${tenantId}',\n 'Feature Adoption Retention',\n 'feature_used',\n 'feature_used',\n 'DAY',\n '${adminUserId}',\n NOW(), NOW()\n) ON CONFLICT (id) DO NOTHING;\n`;\n}\n\nexport async function initPlatform(projectDir: string): Promise<void> {\n const config = loadConfig(projectDir);\n const env = loadEnv(projectDir);\n const domain = config.platform.domain;\n\n // --- Phase 1: Wait for databases ---\n const dbSpinner = ora('Waiting for databases...').start();\n\n const logtoDbReady = await waitForService(\n projectDir, 'logto-db', 'pg_isready -U logto -d logto', 60,\n );\n if (!logtoDbReady) {\n dbSpinner.fail('logto-db did not become ready');\n throw new Error('logto-db timeout');\n }\n\n const platformDbReady = await waitForService(\n projectDir, 'platform-db',\n `pg_isready -U ${env.PLATFORM_DB_USER || 'habeetat'} -d ${env.PLATFORM_DB_NAME || 'habeetat_platform'}`,\n 60,\n );\n if (!platformDbReady) {\n dbSpinner.fail('platform-db did not become ready');\n throw new Error('platform-db timeout');\n }\n dbSpinner.succeed('Databases ready');\n\n // --- Phase 1b: Initialize ClickHouse schema ---\n const clickhouseSpinner = ora('Initializing ClickHouse analytics schema...').start();\n try {\n const clickhouseSql = [\n 'CREATE DATABASE IF NOT EXISTS nhp_analytics',\n `CREATE TABLE IF NOT EXISTS nhp_analytics.events (event_id UUID DEFAULT generateUUIDv4(), tenant_id String, user_id String, session_id String DEFAULT '', app_id LowCardinality(String) DEFAULT '', event_name LowCardinality(String), properties String DEFAULT '{}', timestamp DateTime64(3, 'UTC'), inserted_at DateTime DEFAULT now()) ENGINE = MergeTree PARTITION BY toYYYYMM(timestamp) ORDER BY (tenant_id, event_name, timestamp, user_id) TTL toDateTime(timestamp) + INTERVAL 365 DAY DELETE SETTINGS index_granularity = 8192`,\n 'ALTER TABLE nhp_analytics.events ADD INDEX IF NOT EXISTS idx_user_id user_id TYPE bloom_filter(0.01) GRANULARITY 4',\n 'ALTER TABLE nhp_analytics.events ADD INDEX IF NOT EXISTS idx_session_id session_id TYPE bloom_filter(0.01) GRANULARITY 4',\n ];\n for (const sql of clickhouseSql) {\n await execa('docker', [\n 'compose', '-f', COMPOSE_FILE, 'exec', '-T', 'clickhouse',\n 'clickhouse-client', '--query', sql,\n ], { cwd: projectDir, stdio: 'pipe' });\n }\n clickhouseSpinner.succeed('ClickHouse analytics schema initialized');\n } catch (err) {\n clickhouseSpinner.warn('ClickHouse schema initialization failed — analytics may not work');\n logger.error(String(err));\n logger.info('Run manually: docker compose exec clickhouse clickhouse-client --query \"CREATE DATABASE IF NOT EXISTS nhp_analytics\"');\n }\n\n // --- Phase 2: Wait for Logto to be healthy ---\n const logtoSpinner = ora('Waiting for Logto to be healthy (this may take up to 2 min)...').start();\n const logtoReady = await waitForService(\n projectDir, 'logto-core',\n 'wget -q --spider http://localhost:3001/oidc/.well-known/openid-configuration',\n 180,\n );\n if (!logtoReady) {\n logtoSpinner.fail('logto-core did not become healthy');\n throw new Error('logto-core timeout');\n }\n logtoSpinner.succeed('Logto is healthy');\n\n // --- Phase 3: Seed Logto applications (SQL) ---\n const logtoSeedSpinner = ora('Seeding Logto applications...').start();\n try {\n const sql = buildSeedLogtoAppsSql(env);\n await execaCommand(\n `docker compose -f ${COMPOSE_FILE} exec -T logto-db psql -U logto -d logto`,\n { cwd: projectDir, input: sql },\n );\n logtoSeedSpinner.succeed('Logto applications seeded');\n } catch (err) {\n logtoSeedSpinner.fail('Failed to seed Logto applications');\n logger.error(String(err));\n throw err;\n }\n\n // --- Phase 4: Bootstrap Logto users/orgs/roles (via Node container) ---\n const bootstrapSpinner = ora('Bootstrapping Logto users and organizations...').start();\n try {\n const orgName = env.ORGANIZATION_NAME || config.platform.organization || 'Default';\n const orgSlug = orgName.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n const adminEmail = env.PLATFORM_ADMIN_EMAIL || config.platform.adminEmail;\n const adminPassword = env.PLATFORM_ADMIN_PASSWORD || 'Habeetat_01';\n const adminUsername = adminEmail.split('@')[0];\n const logtoDbUrl = `postgres://${env.LOGTO_DB_USER || 'logto'}:${env.LOGTO_DB_PASSWORD || 'logto'}@logto-db:5432/${env.LOGTO_DB_NAME || 'logto'}`;\n\n const bootstrapScriptPath = path.join(projectDir, 'scripts', 'nhp-seed-logto-bootstrap.mjs');\n const hasLocalScript = fs.existsSync(bootstrapScriptPath);\n\n if (hasLocalScript) {\n await execa('docker', [\n 'run', '--rm', '--network', 'habeetat_habeetat-network',\n '-e', `NHP_LOGTO_DB_URL=${logtoDbUrl}`,\n '-e', `NHP_PLATFORM_ADMIN_USERNAME=${adminUsername}`,\n '-e', `NHP_PLATFORM_ADMIN_EMAIL=${adminEmail}`,\n '-e', `NHP_PLATFORM_ADMIN_PASSWORD=${adminPassword}`,\n '-e', `NHP_PLATFORM_ADMIN_DISPLAY_NAME=Platform Admin`,\n '-e', `NHP_DEFAULT_TENANT_NAME=${orgName}`,\n '-e', `NHP_DEFAULT_TENANT_SLUG=${orgSlug}`,\n '-v', `${bootstrapScriptPath}:/app/bootstrap.mjs:ro`,\n '-w', '/app',\n 'node:20-alpine',\n 'sh', '-c', 'npm init -y >/dev/null 2>&1 && npm install --no-package-lock pg hash-wasm nanoid 2>/dev/null && node bootstrap.mjs',\n ],\n { cwd: projectDir, stdio: 'pipe' },\n );\n bootstrapSpinner.succeed('Logto users and organizations bootstrapped');\n } else {\n bootstrapSpinner.warn('Bootstrap script not found — skipping Logto user/org setup');\n logger.info('You may need to create the admin user manually via the Logto admin console');\n }\n } catch (err) {\n bootstrapSpinner.fail('Logto bootstrap failed');\n logger.error(String(err));\n logger.info('You may need to create the admin user manually via the Logto admin console');\n }\n\n // --- Phase 5: Wait for backend container to be running ---\n const backendRunSpinner = ora('Waiting for backend container to start...').start();\n const backendRunning = await waitForDockerRunning(projectDir, 'backend', 90);\n if (!backendRunning) {\n backendRunSpinner.fail('Backend container did not start');\n throw new Error('backend container timeout');\n }\n backendRunSpinner.succeed('Backend container is running');\n\n // --- Phase 6: Run Prisma migrations (before health check — tables must exist first) ---\n const migrateSpinner = ora('Running database migrations...').start();\n try {\n await execCompose(projectDir, 'exec -T backend npx prisma migrate deploy');\n migrateSpinner.succeed('Database migrations completed');\n } catch (err) {\n migrateSpinner.fail('Migrations failed');\n logger.error(String(err));\n logger.info('Run manually: docker compose exec backend npx prisma migrate deploy');\n }\n\n // --- Phase 7: Run Prisma seed ---\n const seedSpinner = ora('Seeding platform database...').start();\n try {\n const orgName = env.ORGANIZATION_NAME || config.platform.organization || 'Default';\n const orgSlug = orgName.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n const adminEmail = env.PLATFORM_ADMIN_EMAIL || config.platform.adminEmail;\n\n await execa('docker', [\n 'compose', '-f', COMPOSE_FILE, 'exec', '-T',\n '-e', `NHP_PLATFORM_ADMIN_USER=${adminEmail.split('@')[0]}`,\n '-e', `NHP_PLATFORM_ADMIN_EMAIL=${adminEmail}`,\n '-e', `NHP_PLATFORM_ADMIN_DISPLAY_NAME=Platform Admin`,\n '-e', `NHP_DEFAULT_TENANT_NAME=${orgName}`,\n '-e', `NHP_DEFAULT_TENANT_SLUG=${orgSlug}`,\n 'backend', 'npx', 'tsx', 'prisma/seed.ts',\n ], { cwd: projectDir, stdio: 'pipe' });\n seedSpinner.succeed('Platform database seeded');\n } catch {\n seedSpinner.warn('Prisma seed skipped (may not be available in Docker image)');\n }\n\n // --- Phase 8: Wait for backend to become healthy (tables now exist) ---\n const backendSpinner = ora('Waiting for backend to be healthy...').start();\n const backendReady = await waitForDockerHealthy(\n projectDir, 'backend', 180,\n );\n if (!backendReady) {\n backendSpinner.fail('Backend did not become healthy');\n logger.info('Check logs: docker compose logs backend');\n } else {\n backendSpinner.succeed('Backend is healthy');\n }\n\n // --- Phase 9: Initialize platform SQL (system apps, tenant, admin) ---\n const platformSpinner = ora('Initializing platform data...').start();\n try {\n const sql = buildInitPlatformSql(env);\n await execaCommand(\n `docker compose -f ${COMPOSE_FILE} exec -T platform-db psql -U ${env.PLATFORM_DB_USER || 'habeetat'} -d ${env.PLATFORM_DB_NAME || 'habeetat_platform'}`,\n { cwd: projectDir, input: sql },\n );\n platformSpinner.succeed('Platform data initialized');\n } catch (err) {\n platformSpinner.fail('Platform initialization failed');\n logger.error(String(err));\n logger.info('You may need to initialize the platform manually after first login');\n }\n\n // --- Phase 10: Seed analytics demo data ---\n const analyticsSpinner = ora('Seeding analytics demo data...').start();\n try {\n const orgName = env.ORGANIZATION_NAME || config.platform.organization || 'Default';\n const orgSlug = orgName.toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n const adminUserId = 'usr_plat_admin01';\n\n // Seed ClickHouse events (raw analytics data)\n const chSql = buildClickhouseAnalyticsSeedSql(orgSlug, adminUserId);\n await execa('docker', [\n 'compose', '-f', COMPOSE_FILE, 'exec', '-T', 'clickhouse',\n 'clickhouse-client',\n ], { cwd: projectDir, input: chSql, stdio: ['pipe', 'pipe', 'pipe'] });\n\n // Seed Postgres analytics objects (dashboards, insights, funnels, retentions)\n const pgSql = buildAnalyticsObjectsSql(orgSlug, adminUserId);\n await execaCommand(\n `docker compose -f ${COMPOSE_FILE} exec -T platform-db psql -U ${env.PLATFORM_DB_USER || 'habeetat'} -d ${env.PLATFORM_DB_NAME || 'habeetat_platform'}`,\n { cwd: projectDir, input: pgSql },\n );\n\n analyticsSpinner.succeed('Analytics demo data seeded');\n } catch (err) {\n analyticsSpinner.warn('Analytics demo data seeding failed — app will start empty');\n logger.error(String(err));\n }\n\n // --- Phase 11: Create SigNoz admin user ---\n if (config.services.signoz) {\n const signozUserSpinner = ora('Creating SigNoz admin user...').start();\n try {\n const signozReady = await waitForDockerHealthy(projectDir, 'signoz-query-service', 120);\n if (!signozReady) {\n signozUserSpinner.warn('SigNoz query service not healthy — skipping admin user creation');\n } else {\n const adminEmail = env.PLATFORM_ADMIN_EMAIL || config.platform.adminEmail;\n const adminPassword = env.PLATFORM_ADMIN_PASSWORD || '';\n const orgName = env.ORGANIZATION_NAME || config.platform.organization || 'Default';\n\n const jsonBody = JSON.stringify({\n name: 'Platform Admin',\n email: adminEmail,\n password: adminPassword,\n organizationName: orgName,\n });\n\n try {\n await execa('docker', [\n 'compose', '-f', COMPOSE_FILE, 'exec', '-T',\n 'signoz-query-service',\n 'wget', '-q', '-O-',\n '--header=Content-Type: application/json',\n `--post-data=${jsonBody}`,\n 'http://localhost:8080/api/v1/register',\n ], { cwd: projectDir, stdio: 'pipe' });\n signozUserSpinner.succeed('SigNoz admin user created');\n } catch {\n signozUserSpinner.warn('SigNoz admin user already exists or registration not available');\n }\n }\n } catch (err) {\n signozUserSpinner.warn('SigNoz admin user setup skipped');\n logger.error(String(err));\n }\n }\n\n // Mark as initialized\n markInitialized(projectDir);\n\n console.log('');\n logger.info(`✓ Platform initialized for ${domain}`);\n logger.info(` Admin: ${env.PLATFORM_ADMIN_EMAIL || config.platform.adminEmail}`);\n logger.info(` Organization: ${env.ORGANIZATION_NAME || config.platform.organization}`);\n}\n","import ora from 'ora';\nimport { logger } from '../utils/logger.js';\nimport { getProjectDir, loadConfig } from '../utils/config.js';\nimport { composeUp, checkPrerequisites } from '../utils/docker.js';\nimport { isInitialized, initPlatform } from './init.js';\n\nexport async function upCommand(): Promise<void> {\n const projectDir = getProjectDir();\n const config = loadConfig(projectDir);\n\n logger.info(`Starting Habeetat Platform (${config.platform.domain})...`);\n\n if (!(await checkPrerequisites())) {\n process.exit(1);\n }\n\n const freshInstall = !isInitialized(projectDir);\n const spinner = ora('Starting services...').start();\n\n try {\n await composeUp({ cwd: projectDir });\n spinner.succeed('All services started');\n } catch (err) {\n spinner.fail('Failed to start services');\n logger.error(String(err));\n process.exit(1);\n }\n\n if (freshInstall) {\n console.log('');\n logger.info('First run detected — initializing platform...');\n console.log('');\n try {\n await initPlatform(projectDir);\n } catch (err) {\n logger.error('Platform initialization failed');\n logger.error(String(err));\n logger.info('You can retry with: npx habeetat init');\n process.exit(1);\n }\n }\n\n const proto = config.platform.protocol;\n const domain = config.platform.domain;\n\n console.log('');\n logger.info('Platform URLs:');\n console.log(` Launcher: ${proto}://launcher.${domain}`);\n console.log(` Organization Manager: ${proto}://organization-manager.${domain}`);\n console.log(` Platform Manager: ${proto}://platform-manager.${domain}`);\n if (config.services.analytics) {\n console.log(` Analytics: ${proto}://analytics.${domain}`);\n }\n console.log(` Backend API: ${proto}://api.${domain}`);\n console.log(` Logto IAM: ${proto}://iam.${domain}`);\n console.log(` Logto Admin Console: ${proto}://iam-console.${domain}`);\n if (config.services.signoz) {\n console.log(` SigNoz Logs & Traces: ${proto}://logs.${domain}`);\n }\n console.log('');\n logger.info('Run `habeetat status` to check service health');\n}\n","import ora from 'ora';\nimport { logger } from '../utils/logger.js';\nimport { getProjectDir } from '../utils/config.js';\nimport { composeDown } from '../utils/docker.js';\n\nexport async function downCommand(): Promise<void> {\n const projectDir = getProjectDir();\n const spinner = ora('Stopping services...').start();\n\n try {\n await composeDown({ cwd: projectDir });\n spinner.succeed('All services stopped');\n } catch (err) {\n spinner.fail('Failed to stop services');\n logger.error(String(err));\n process.exit(1);\n }\n}\n","import { logger } from '../utils/logger.js';\nimport { getProjectDir, loadConfig } from '../utils/config.js';\nimport { composePs } from '../utils/docker.js';\n\nexport async function statusCommand(): Promise<void> {\n const projectDir = getProjectDir();\n const config = loadConfig(projectDir);\n\n logger.info(`Habeetat Platform — ${config.platform.domain}`);\n logger.info(`Version: ${config.version}`);\n logger.info(`Image tag: ${config.docker.imageTag}`);\n console.log('');\n\n try {\n const output = await composePs({ cwd: projectDir });\n console.log(output);\n } catch (err) {\n logger.error('Could not get service status. Is the platform running?');\n logger.info('Run `habeetat up` to start the platform');\n process.exit(1);\n }\n}\n","import { logger } from '../utils/logger.js';\nimport { getProjectDir } from '../utils/config.js';\nimport { composeLogs } from '../utils/docker.js';\nimport { SERVICES } from '../constants.js';\n\nexport async function logsCommand(\n service?: string,\n options?: { follow?: boolean; tail?: number },\n): Promise<void> {\n const projectDir = getProjectDir();\n\n if (service && !(SERVICES as readonly string[]).includes(service)) {\n logger.error(`Unknown service: ${service}`);\n logger.info(`Available services: ${SERVICES.join(', ')}`);\n process.exit(1);\n }\n\n try {\n await composeLogs({\n cwd: projectDir,\n service,\n follow: options?.follow,\n tail: options?.tail,\n });\n } catch {\n // User interrupted with Ctrl+C — that's fine\n }\n}\n","import ora from 'ora';\nimport { logger } from '../utils/logger.js';\nimport { getProjectDir } from '../utils/config.js';\nimport { composeRestart } from '../utils/docker.js';\nimport { SERVICES } from '../constants.js';\n\nexport async function restartCommand(service?: string): Promise<void> {\n const projectDir = getProjectDir();\n\n if (service && !(SERVICES as readonly string[]).includes(service)) {\n logger.error(`Unknown service: ${service}`);\n logger.info(`Available services: ${SERVICES.join(', ')}`);\n process.exit(1);\n }\n\n const label = service || 'all services';\n const spinner = ora(`Restarting ${label}...`).start();\n\n try {\n await composeRestart({ cwd: projectDir, service });\n spinner.succeed(`Restarted ${label}`);\n } catch (err) {\n spinner.fail(`Failed to restart ${label}`);\n logger.error(String(err));\n process.exit(1);\n }\n}\n","import ora from 'ora';\nimport { logger } from '../utils/logger.js';\nimport { getProjectDir, loadConfig } from '../utils/config.js';\nimport { composeUp, checkPrerequisites } from '../utils/docker.js';\nimport { execaCommand } from 'execa';\nimport { COMPOSE_FILE } from '../constants.js';\n\nasync function composePull(opts: { cwd: string; service?: string }): Promise<void> {\n const cmd = opts.service\n ? `docker compose -f ${COMPOSE_FILE} pull ${opts.service}`\n : `docker compose -f ${COMPOSE_FILE} pull`;\n\n await execaCommand(cmd, {\n cwd: opts.cwd,\n stdio: 'inherit',\n });\n}\n\nexport async function updateCommand(service?: string): Promise<void> {\n const projectDir = getProjectDir();\n const config = loadConfig(projectDir);\n\n logger.info(`Updating Habeetat Platform (${config.platform.domain})...`);\n\n if (!(await checkPrerequisites())) {\n process.exit(1);\n }\n\n const label = service ? `service '${service}'` : 'all services';\n\n const pullSpinner = ora(`Pulling latest images for ${label}...`).start();\n try {\n await composePull({ cwd: projectDir, service });\n pullSpinner.succeed('Images pulled');\n } catch (err) {\n pullSpinner.fail('Failed to pull images');\n logger.error(String(err));\n process.exit(1);\n }\n\n const upSpinner = ora('Restarting updated containers...').start();\n try {\n await composeUp({ cwd: projectDir });\n upSpinner.succeed('Platform updated and running');\n } catch (err) {\n upSpinner.fail('Failed to restart containers');\n logger.error(String(err));\n process.exit(1);\n }\n\n console.log('');\n logger.info('Update complete. Run `habeetat status` to verify all services are healthy.');\n}\n","import chalk from 'chalk';\nimport { logger } from '../utils/logger.js';\nimport { checkDocker, checkDockerCompose } from '../utils/docker.js';\nimport { findProjectRoot, loadConfig } from '../utils/config.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { CONFIG_FILE, COMPOSE_FILE, ENV_FILE } from '../constants.js';\n\nexport async function doctorCommand(): Promise<void> {\n logger.phase('Habeetat Doctor — Diagnostics');\n let issues = 0;\n\n // Check Docker\n const dockerOk = await checkDocker();\n console.log(` Docker: ${dockerOk ? chalk.green('✓ Installed') : chalk.red('✗ Not found')}`);\n if (!dockerOk) issues++;\n\n // Check Docker Compose\n const composeOk = await checkDockerCompose();\n console.log(` Docker Compose: ${composeOk ? chalk.green('✓ Available') : chalk.red('✗ Not found')}`);\n if (!composeOk) issues++;\n\n // Check project directory\n const projectDir = findProjectRoot();\n console.log(` Project dir: ${projectDir ? chalk.green(`✓ ${projectDir}`) : chalk.yellow('⚠ Not in a Habeetat project')}`);\n if (!projectDir) {\n issues++;\n console.log('');\n logger.info(`Run \\`npm create habeetat my-platform\\` to create a new project`);\n return;\n }\n\n // Check config file\n const configExists = fs.existsSync(path.join(projectDir, CONFIG_FILE));\n console.log(` ${CONFIG_FILE}: ${configExists ? chalk.green('✓ Found') : chalk.red('✗ Missing')}`);\n if (!configExists) issues++;\n\n // Check compose file\n const composeExists = fs.existsSync(path.join(projectDir, COMPOSE_FILE));\n console.log(` ${COMPOSE_FILE}: ${composeExists ? chalk.green('✓ Found') : chalk.red('✗ Missing')}`);\n if (!composeExists) issues++;\n\n // Check env file\n const envExists = fs.existsSync(path.join(projectDir, ENV_FILE));\n console.log(` ${ENV_FILE}: ${envExists ? chalk.green('✓ Found') : chalk.red('✗ Missing')}`);\n if (!envExists) issues++;\n\n // Check nginx config\n const nginxExists = fs.existsSync(path.join(projectDir, 'nginx', 'platform.conf'));\n console.log(` nginx/platform.conf: ${nginxExists ? chalk.green('✓ Found') : chalk.red('✗ Missing')}`);\n if (!nginxExists) issues++;\n\n // Load config and check images\n if (configExists) {\n try {\n const config = loadConfig(projectDir);\n console.log(` Version: ${chalk.cyan(config.version)}`);\n console.log(` Domain: ${chalk.cyan(config.platform.domain)}`);\n console.log(` Protocol: ${chalk.cyan(config.platform.protocol)}`);\n } catch (err) {\n console.log(` Config: ${chalk.red('✗ Invalid JSON')}`);\n issues++;\n }\n }\n\n console.log('');\n if (issues === 0) {\n logger.success('No issues found');\n } else {\n logger.warn(`${issues} issue(s) found`);\n }\n}\n","import ora from 'ora';\nimport { createInterface } from 'node:readline';\nimport { logger } from '../utils/logger.js';\nimport { getProjectDir, loadConfig } from '../utils/config.js';\nimport { composeDestroy } from '../utils/docker.js';\n\nasync function confirm(message: string): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(`${message} (y/N) `, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === 'y');\n });\n });\n}\n\nexport async function destroyCommand(options: { force?: boolean }): Promise<void> {\n const projectDir = getProjectDir();\n const config = loadConfig(projectDir);\n const domain = config.platform.domain;\n\n logger.warn(`This will permanently destroy the Habeetat Platform (${domain}):`);\n console.log(' - Stop and remove all containers');\n console.log(' - Delete all Docker volumes (databases, data)');\n console.log(' - Remove orphan containers');\n console.log('');\n\n if (!options.force) {\n const ok = await confirm('Are you sure you want to continue?');\n if (!ok) {\n logger.info('Aborted');\n return;\n }\n }\n\n const spinner = ora('Destroying platform...').start();\n\n try {\n await composeDestroy({ cwd: projectDir });\n spinner.succeed('Platform destroyed — all containers and volumes removed');\n console.log('');\n logger.info('To reinstall, run: npx habeetat up');\n } catch (err) {\n spinner.fail('Failed to destroy platform');\n logger.error(String(err));\n process.exit(1);\n }\n}\n","import ora from 'ora';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport chalk from 'chalk';\nimport { execa } from 'execa';\nimport type { Command } from 'commander';\nimport { logger } from '../utils/logger.js';\nimport { getProjectDir, loadConfig } from '../utils/config.js';\nimport { COMPOSE_FILE } from '../constants.js';\n\nconst __cli_dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// Path to the seed script bundled with the CLI package.\n// __cli_dirname is dist/ at runtime; tsup copies scripts/ → dist/scripts/ during build.\nconst SEED_SCRIPT_PATH = path.resolve(__cli_dirname, 'scripts/nhp-seed-dev.ts');\n// Script is placed in the backend app directory so tsx resolves @prisma/client\n// and other workspace packages from the local node_modules there.\nconst SEED_SCRIPT_REMOTE = '/app/apps/habeetat-backend/nhp-seed-dev-tmp.ts';\n\nfunction loadEnv(projectDir: string): Record<string, string> {\n const envPath = path.join(projectDir, '.env');\n if (!fs.existsSync(envPath)) return {};\n const lines = fs.readFileSync(envPath, 'utf-8').split('\\n');\n const env: Record<string, string> = {};\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIdx = trimmed.indexOf('=');\n if (eqIdx === -1) continue;\n env[trimmed.slice(0, eqIdx)] = trimmed.slice(eqIdx + 1);\n }\n return env;\n}\n\nasync function runSeedScript(\n projectDir: string,\n command: string,\n args: string[],\n): Promise<Record<string, unknown>> {\n // Inject the script into the container via stdin so it works regardless\n // of whether the Docker image was built with or without scripts/.\n if (!fs.existsSync(SEED_SCRIPT_PATH)) {\n throw new Error(\n `Seed script not found at ${SEED_SCRIPT_PATH}. ` +\n `This is a bug — please reinstall @habeetat/cli.`,\n );\n }\n const scriptContent = fs.readFileSync(SEED_SCRIPT_PATH, 'utf-8');\n\n // Inject script into the backend app directory (not /tmp/) so that tsx\n // resolves @prisma/client and other workspace packages from the local node_modules.\n await execa(\n 'docker',\n ['compose', '-f', COMPOSE_FILE, 'exec', '-T', 'backend', 'sh', '-c',\n `cat > ${SEED_SCRIPT_REMOTE}`],\n { cwd: projectDir, input: scriptContent, stdio: 'pipe' },\n );\n\n let stdout = '';\n let stderr = '';\n try {\n // The WORKDIR in the backend container is /app/apps/habeetat-backend/,\n // so tsx resolves the script filename relative to that directory.\n const scriptFilename = SEED_SCRIPT_REMOTE.split('/').pop()!;\n ({ stdout, stderr } = await execa(\n 'docker',\n [\n 'compose', '-f', COMPOSE_FILE, 'exec', '-T', 'backend',\n 'npx', 'tsx', scriptFilename,\n command,\n ...args,\n ],\n { cwd: projectDir, stdio: 'pipe' },\n ));\n } finally {\n // Best-effort cleanup of the injected script\n await execa(\n 'docker',\n ['compose', '-f', COMPOSE_FILE, 'exec', '-T', 'backend', 'sh', '-c',\n `rm -f ${SEED_SCRIPT_REMOTE}`],\n { cwd: projectDir, stdio: 'pipe' },\n ).catch(() => {});\n }\n\n // Forward container stderr to our stderr for debugging\n if (stderr) process.stderr.write(stderr + '\\n');\n\n const jsonLine = stdout.trim().split('\\n').pop() ?? '';\n try {\n return JSON.parse(jsonLine) as Record<string, unknown>;\n } catch {\n throw new Error(`Script produced unexpected output: ${stdout}`);\n }\n}\n\nfunction printSdkConfig(\n config: { protocol: string; domain: string },\n env: Record<string, string>,\n parts: {\n tenant?: string;\n logtoAppId?: string;\n m2mClientId?: string;\n m2mClientSecret?: string;\n email?: string;\n password?: string;\n },\n) {\n const protocol = config.protocol || 'https';\n const domain = config.domain;\n const iamUrl = env.LOGTO_EXTERNAL_ENDPOINT || `${protocol}://iam.${domain}`;\n const iamAudience = env.IAM_AUDIENCE || `${protocol}://api.${domain}/api`;\n const apiUrl = iamAudience.replace(/\\/api$/, '');\n\n console.log('');\n console.log(chalk.cyan('═'.repeat(60)));\n console.log(chalk.cyan(' SDK Configuration'));\n console.log(chalk.cyan('═'.repeat(60)));\n console.log('');\n\n if (parts.logtoAppId) {\n console.log(chalk.bold(' Frontend SDK (@habeetat/sdk-react)'));\n console.log(chalk.dim(' ' + '─'.repeat(54)));\n console.log(` VITE_LOGTO_ENDPOINT=${chalk.green(iamUrl)}`);\n console.log(` VITE_LOGTO_APP_ID=${chalk.green(parts.logtoAppId)}`);\n console.log(` VITE_LOGTO_API_RESOURCE=${chalk.green(iamAudience)}`);\n if (parts.tenant) {\n console.log(` VITE_APP_TENANT=${chalk.green(parts.tenant)}`);\n }\n console.log('');\n }\n\n if (parts.m2mClientId) {\n console.log(chalk.bold(' Backend SDK (@habeetat/sdk-node)'));\n console.log(chalk.dim(' ' + '─'.repeat(54)));\n console.log(` HABEETAT_ENDPOINT=${chalk.green(apiUrl)}`);\n console.log(` HABEETAT_LOGTO_ENDPOINT=${chalk.green(iamUrl)}`);\n console.log(` HABEETAT_IAM_AUDIENCE=${chalk.green(iamAudience)}`);\n if (parts.tenant) {\n console.log(` HABEETAT_TENANT_SLUG=${chalk.green(parts.tenant)}`);\n }\n console.log(` HABEETAT_M2M_CLIENT_ID=${chalk.green(parts.m2mClientId)}`);\n console.log(` HABEETAT_M2M_CLIENT_SECRET=${chalk.green(parts.m2mClientSecret ?? '')}`);\n console.log('');\n } else if (parts.tenant && !parts.logtoAppId) {\n // tenant-only output (seed tenant command)\n console.log(chalk.bold(' Backend SDK (@habeetat/sdk-node)'));\n console.log(chalk.dim(' ' + '─'.repeat(54)));\n console.log(` HABEETAT_ENDPOINT=${chalk.green(apiUrl)}`);\n console.log(` HABEETAT_TENANT_SLUG=${chalk.green(parts.tenant)}`);\n console.log('');\n }\n\n if (parts.email && parts.password) {\n console.log(chalk.bold(' Test credentials'));\n console.log(chalk.dim(' ' + '─'.repeat(54)));\n console.log(` Email: ${chalk.green(parts.email)}`);\n console.log(` Password: ${chalk.green(parts.password)}`);\n console.log(` IAM: ${chalk.green(iamUrl)}`);\n console.log('');\n }\n\n console.log(chalk.cyan('═'.repeat(60)));\n console.log('');\n}\n\n// ---------------------------------------------------------------------------\n// Slug validation\n// ---------------------------------------------------------------------------\nfunction validateSlug(slug: string, entity: string): void {\n if (!/^[a-z0-9][a-z0-9-]*[a-z0-9]$/.test(slug) && !/^[a-z0-9]$/.test(slug)) {\n logger.error(\n `Invalid ${entity} slug \"${slug}\": must be lowercase alphanumeric with hyphens (e.g. get-master)`,\n );\n process.exit(1);\n }\n}\n\n// ---------------------------------------------------------------------------\n// seed tenant\n// ---------------------------------------------------------------------------\nexport async function seedTenantCommand(options: {\n name: string;\n slug: string;\n description?: string;\n}) {\n validateSlug(options.slug, 'tenant');\n const projectDir = getProjectDir();\n const config = loadConfig(projectDir);\n const env = loadEnv(projectDir);\n\n const args = [\n '--name', options.name,\n '--slug', options.slug,\n ...(options.description ? ['--description', options.description] : []),\n ];\n\n const spinner = ora(`Creating tenant \"${options.slug}\"...`).start();\n let result: Record<string, unknown>;\n try {\n result = await runSeedScript(projectDir, 'create-tenant', args);\n spinner.succeed(`Tenant created: ${chalk.bold(result.slug)} (${result.displayName})`);\n } catch (err) {\n spinner.fail('Failed to create tenant');\n logger.error(String(err));\n process.exit(1);\n }\n\n logger.info(` ID: ${result.id}`);\n logger.info(` Logto Org ID: ${result.logtoOrganizationId}`);\n\n printSdkConfig(config.platform, env, { tenant: result.slug as string });\n}\n\n// ---------------------------------------------------------------------------\n// seed app\n// ---------------------------------------------------------------------------\nexport async function seedAppCommand(options: {\n name: string;\n slug: string;\n redirectUri?: string[];\n logoutUri?: string[];\n corsOrigin?: string[];\n description?: string;\n tenant?: string;\n internal?: boolean;\n noM2m?: boolean;\n}) {\n validateSlug(options.slug, 'app');\n const projectDir = getProjectDir();\n const config = loadConfig(projectDir);\n const env = loadEnv(projectDir);\n\n const args: string[] = [\n '--name', options.name,\n '--slug', options.slug,\n ...(options.description ? ['--description', options.description] : []),\n ...(options.tenant ? ['--tenant', options.tenant] : []),\n ...(options.redirectUri?.flatMap((u) => ['--redirect-uri', u]) ?? []),\n ...(options.logoutUri?.flatMap((u) => ['--logout-uri', u]) ?? []),\n ...(options.corsOrigin?.flatMap((o) => ['--cors-origin', o]) ?? []),\n ...(options.internal ? ['--internal'] : []),\n ...(options.noM2m ? ['--no-m2m'] : []),\n ];\n\n const spinner = ora(`Creating app \"${options.slug}\"...`).start();\n let result: Record<string, unknown>;\n try {\n result = await runSeedScript(projectDir, 'create-app', args);\n spinner.succeed(`App created: ${chalk.bold(result.slug)} (Logto app: ${result.logtoAppId})`);\n } catch (err) {\n spinner.fail('Failed to create app');\n logger.error(String(err));\n process.exit(1);\n }\n\n logger.info(` ID: ${result.id}`);\n logger.info(` Logto App ID: ${result.logtoAppId}`);\n if (result.m2mClientId) {\n logger.info(` M2M Client ID: ${result.m2mClientId}`);\n logger.info(` M2M Client Secret: ${result.m2mClientSecret}`);\n }\n if (result.redirectUris && (result.redirectUris as string[]).length > 0) {\n logger.info(` Redirect URIs: ${(result.redirectUris as string[]).join(', ')}`);\n }\n if (result.tenantSlug) {\n logger.info(` Installed on: ${result.tenantSlug}`);\n }\n\n printSdkConfig(config.platform, env, {\n tenant: (result.tenantSlug as string) || options.tenant,\n logtoAppId: result.logtoAppId as string,\n m2mClientId: result.m2mClientId as string | undefined,\n m2mClientSecret: result.m2mClientSecret as string | undefined,\n });\n}\n\n// ---------------------------------------------------------------------------\n// seed update-app\n// ---------------------------------------------------------------------------\nexport async function seedUpdateAppCommand(options: {\n slug: string;\n redirectUri?: string[];\n logoutUri?: string[];\n corsOrigin?: string[];\n}) {\n const projectDir = getProjectDir();\n\n const args: string[] = [\n '--slug', options.slug,\n ...(options.redirectUri?.flatMap((u) => ['--redirect-uri', u]) ?? []),\n ...(options.logoutUri?.flatMap((u) => ['--logout-uri', u]) ?? []),\n ...(options.corsOrigin?.flatMap((o) => ['--cors-origin', o]) ?? []),\n ];\n\n const spinner = ora(`Updating app \"${options.slug}\"...`).start();\n let result: Record<string, unknown>;\n try {\n result = await runSeedScript(projectDir, 'update-app', args);\n spinner.succeed(`App updated: ${chalk.bold(result.slug)}`);\n } catch (err) {\n spinner.fail('Failed to update app');\n logger.error(String(err));\n process.exit(1);\n }\n\n if (result.redirectUris && (result.redirectUris as string[]).length > 0) {\n logger.info(` Redirect URIs: ${(result.redirectUris as string[]).join(', ')}`);\n }\n if (result.postLogoutRedirectUris && (result.postLogoutRedirectUris as string[]).length > 0) {\n logger.info(` Post-logout URIs: ${(result.postLogoutRedirectUris as string[]).join(', ')}`);\n }\n if (result.corsAllowedOrigins && (result.corsAllowedOrigins as string[]).length > 0) {\n logger.info(` CORS Origins: ${(result.corsAllowedOrigins as string[]).join(', ')}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// seed user\n// ---------------------------------------------------------------------------\nexport async function seedUserCommand(options: {\n email: string;\n password: string;\n tenant: string;\n username?: string;\n displayName?: string;\n role?: string;\n}) {\n const projectDir = getProjectDir();\n const config = loadConfig(projectDir);\n const env = loadEnv(projectDir);\n\n const args: string[] = [\n '--email', options.email,\n '--password', options.password,\n '--tenant', options.tenant,\n ...(options.username ? ['--username', options.username] : []),\n ...(options.displayName ? ['--display-name', options.displayName] : []),\n ...(options.role ? ['--role', options.role] : []),\n ];\n\n const spinner = ora(`Creating user \"${options.email}\" in tenant \"${options.tenant}\"...`).start();\n let result: Record<string, unknown>;\n try {\n result = await runSeedScript(projectDir, 'create-user', args);\n spinner.succeed(`User created: ${chalk.bold(result.email)} (Logto ID: ${result.logtoUserId})`);\n } catch (err) {\n spinner.fail('Failed to create user');\n logger.error(String(err));\n process.exit(1);\n }\n\n logger.info(` Logto User ID: ${result.logtoUserId}`);\n logger.info(` Username: ${result.username}`);\n logger.info(` Tenant: ${result.tenantSlug}`);\n logger.info(` Role: ${result.role}${result.roleAssigned ? '' : ' (not assigned — role not found in Logto)'}`);\n if (result.note) logger.info(` Note: ${result.note}`);\n\n printSdkConfig(config.platform, env, {\n tenant: result.tenantSlug as string,\n email: result.email as string,\n password: result.password as string,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Command registration\n// ---------------------------------------------------------------------------\nexport function registerSeedCommand(program: Command) {\n const seed = program\n .command('seed')\n .description('Seed dev data — create tenants, apps and users for local development');\n\n seed\n .command('tenant')\n .description('Create a new tenant (Logto org + platform DB)')\n .requiredOption('--name <name>', 'Display name (e.g. \"Acme Corp\")')\n .requiredOption('--slug <slug>', 'Unique slug, lowercase alphanumeric + hyphens (e.g. acme)')\n .option('--description <desc>', 'Optional description')\n .action((opts: { name: string; slug: string; description?: string }) => {\n return seedTenantCommand(opts);\n });\n\n seed\n .command('app')\n .description('Create a new OIDC application (Logto SPA app + platform DB)')\n .requiredOption('--name <name>', 'App display name (e.g. \"My CRM\")')\n .requiredOption('--slug <slug>', 'Unique slug, lowercase alphanumeric + hyphens (e.g. my-crm)')\n .option('--redirect-uri <uri...>', 'OIDC redirect URI(s) (e.g. http://localhost:3000/callback)')\n .option('--logout-uri <uri...>', 'Post-logout redirect URI(s)')\n .option('--cors-origin <origin...>', 'CORS allowed origin(s)')\n .option('--description <desc>', 'Optional description')\n .option('--tenant <slug>', 'Install app on this tenant after creation')\n .option('--internal', 'Mark app as internal/system app (default: false)')\n .option('--no-m2m', 'Skip M2M Logto application creation (frontend-only apps)')\n .action(\n (opts: {\n name: string;\n slug: string;\n redirectUri?: string[];\n logoutUri?: string[];\n corsOrigin?: string[];\n description?: string;\n tenant?: string;\n internal?: boolean;\n m2m?: boolean;\n }) => {\n return seedAppCommand({ ...opts, noM2m: opts.m2m === false });\n },\n );\n\n seed\n .command('update-app')\n .description('Update an existing app\\'s OIDC URIs and CORS origins')\n .requiredOption('--slug <slug>', 'App slug to update')\n .option('--redirect-uri <uri...>', 'Replace OIDC redirect URI(s)')\n .option('--logout-uri <uri...>', 'Replace post-logout redirect URI(s)')\n .option('--cors-origin <origin...>', 'Replace CORS allowed origin(s)')\n .action(\n (opts: {\n slug: string;\n redirectUri?: string[];\n logoutUri?: string[];\n corsOrigin?: string[];\n }) => {\n return seedUpdateAppCommand(opts);\n },\n );\n\n seed\n .command('user')\n .description('Create a new user in Logto and add to a tenant organization')\n .requiredOption('--email <email>', 'User email address')\n .requiredOption('--password <password>', 'User password')\n .requiredOption('--tenant <slug>', 'Tenant slug to add the user to')\n .option('--username <username>', 'Logto username (defaults to email prefix)')\n .option('--display-name <name>', 'Display name (defaults to username)')\n .option('--role <role>', 'Organization role to assign (default: TENANT_ADMIN)', 'TENANT_ADMIN')\n .action(\n (opts: {\n email: string;\n password: string;\n tenant: string;\n username?: string;\n displayName?: string;\n role?: string;\n }) => {\n return seedUserCommand(opts);\n },\n );\n}\n","import { Command } from 'commander';\nimport { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport path from 'node:path';\nimport { upCommand } from './commands/up.js';\nimport { downCommand } from './commands/down.js';\nimport { statusCommand } from './commands/status.js';\nimport { logsCommand } from './commands/logs.js';\nimport { restartCommand } from './commands/restart.js';\nimport { updateCommand } from './commands/update.js';\nimport { doctorCommand } from './commands/doctor.js';\nimport { destroyCommand } from './commands/destroy.js';\nimport { initPlatform } from './commands/init.js';\nimport { registerSeedCommand } from './commands/seed.js';\nimport { getProjectDir } from './utils/config.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nconst pkg = JSON.parse(\n readFileSync(path.resolve(__dirname, '..', 'package.json'), 'utf-8'),\n);\n\nconst program = new Command();\n\nprogram\n .name('habeetat')\n .description('Habeetat Platform CLI — manage your platform instances')\n .version(pkg.version);\n\nprogram\n .command('up')\n .description('Start the platform')\n .action(upCommand);\n\nprogram\n .command('down')\n .description('Stop the platform')\n .action(downCommand);\n\nprogram\n .command('status')\n .description('Show platform service status')\n .action(statusCommand);\n\nprogram\n .command('logs [service]')\n .description('View service logs')\n .option('-f, --follow', 'Follow log output')\n .option('-n, --tail <lines>', 'Number of lines to show', parseInt)\n .action((service: string | undefined, options: { follow?: boolean; tail?: number }) => {\n return logsCommand(service, options);\n });\n\nprogram\n .command('restart [service]')\n .description('Restart services')\n .action(restartCommand);\n\nprogram\n .command('update [service]')\n .description('Pull latest images and restart updated containers')\n .action(updateCommand);\n\nprogram\n .command('doctor')\n .description('Diagnose common issues')\n .action(doctorCommand);\n\nprogram\n .command('destroy')\n .description('Destroy the platform — remove all containers and volumes')\n .option('-f, --force', 'Skip confirmation prompt')\n .action((options: { force?: boolean }) => {\n return destroyCommand(options);\n });\n\nprogram\n .command('init')\n .description('Initialize platform (seed Logto apps, create admin user, setup database)')\n .action(() => {\n return initPlatform(getProjectDir());\n });\n\nregisterSeedCommand(program);\n\nprogram.parse();\n"]}
|
package/package.json
CHANGED