logggai
Version:
AI-powered CLI for transforming your development work into professional content
243 lines • 11.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.contextCommand = contextCommand;
exports.switchCommand = switchCommand;
exports.useCommand = useCommand;
const chalk = require("chalk");
const ora_1 = require("ora");
const { isLoggedIn, getConfig, setConfig, getCurrentContext, getCurrentOrganizationId } = require('../lib/config');
const api_1 = require("../lib/api");
const auth_1 = require("../lib/auth");
async function contextCommand(options = {}) {
return (0, auth_1.withAuth)(async () => {
await _contextCommand(options);
});
}
async function _contextCommand(options = {}) {
// Si aucune option, afficher le contexte actuel
if (!options.list && !options.switch && !options.personal) {
await showCurrentContext();
return;
}
// Lister les contextes disponibles
if (options.list) {
await listAvailableContexts();
return;
}
// Switch vers personal
if (options.personal) {
await switchToPersonal();
return;
}
// Switch vers une organisation
if (options.switch) {
await switchToOrganization(options.switch);
return;
}
}
async function showCurrentContext() {
try {
// Vérifier d'abord la configuration locale
const currentContext = getCurrentContext() || 'personal';
const currentOrgId = getCurrentOrganizationId();
console.log(chalk.default.blue('\n📍 Current Context'));
console.log('─'.repeat(30));
if (currentContext === 'personal' || !currentOrgId) {
console.log(chalk.default.green('🌍 Personal Workspace'));
console.log(chalk.default.gray(' Your personal content and integrations'));
}
else {
// Si on a un contexte organisation, essayer de récupérer les détails
try {
const spinner = (0, ora_1.default)('Getting organization details...').start();
const contextData = await api_1.apiClient.getCurrentContext();
spinner.stop();
const orgName = contextData?.organization?.name || 'Unknown Organization';
console.log(chalk.default.cyan(`👥 ${orgName}`));
console.log(chalk.default.gray(` Organization (${currentOrgId})`));
}
catch (error) {
// Fallback si erreur API
console.log(chalk.default.cyan(`👥 Organization`));
console.log(chalk.default.gray(` Organization (${currentOrgId}) - ${chalk.default.yellow('Details unavailable')}`));
}
}
console.log(chalk.default.gray('\nUse `logggai context list` to see all available contexts'));
console.log(chalk.default.gray('Use `logggai context switch <org>` to change context'));
}
catch (error) {
console.log(chalk.default.red('Failed to get current context'));
console.log(chalk.default.red(error.message));
}
}
async function listAvailableContexts() {
try {
const spinner = (0, ora_1.default)('Loading available contexts...').start();
let userOrgs = null;
let currentContextData = null;
// Essayer de récupérer les organisations
try {
userOrgs = await api_1.apiClient.getUserOrganizations();
}
catch (error) {
console.log(chalk.default.yellow(`\n⚠️ Warning: Could not load organizations: ${error.message}`));
}
// Essayer de récupérer le contexte actuel (optionnel)
try {
currentContextData = await api_1.apiClient.getCurrentContext();
}
catch (error) {
// Ce n'est pas critique, on peut continuer sans
console.log(chalk.default.gray(`\n(Could not load current context details: ${error.message})`));
}
spinner.stop();
const currentContext = getCurrentContext() || 'personal';
const currentOrgId = getCurrentOrganizationId();
console.log(chalk.default.blue('\n🔗 Available Contexts'));
console.log('─'.repeat(40));
// Personal context - toujours disponible
const isPersonalCurrent = currentContext === 'personal';
const personalIndicator = isPersonalCurrent ? chalk.default.green('● (current)') : chalk.default.gray('○');
console.log(`${personalIndicator} ${chalk.default.white('Personal Workspace')}`);
console.log(chalk.default.gray(' Your personal content and integrations'));
// Organizations - si on a pu les récupérer
if (userOrgs && userOrgs.organizations && userOrgs.organizations.length > 0) {
console.log('');
userOrgs.organizations.forEach((org) => {
const isOrgCurrent = currentContext === 'organization' && currentOrgId === org.id;
const orgIndicator = isOrgCurrent ? chalk.default.green('● (current)') : chalk.default.gray('○');
const roleColor = getRoleColor(org.role);
// Check if organization requires checkout
const requiresCheckout = org.requiresCheckout || false;
const statusText = requiresCheckout ? chalk.default.yellow('(paiement requis)') : '';
console.log(`${orgIndicator} ${chalk.default.white(org.name)} ${statusText}`);
console.log(chalk.default.gray(` Organization • ${roleColor(org.role)} • ${org.slug}`));
if (requiresCheckout) {
console.log(chalk.default.gray(` ${chalk.default.yellow('→ Choose a Team plan to activate this organization')}`));
}
});
}
else if (userOrgs && userOrgs.organizations && userOrgs.organizations.length === 0) {
console.log(chalk.default.gray('\nNo organizations found. You can create one from the web dashboard.'));
}
console.log(chalk.default.gray('\nSwitch contexts with:'));
console.log(chalk.default.gray(' logggai context personal'));
console.log(chalk.default.gray(' logggai context switch <organization>'));
}
catch (error) {
console.log(chalk.default.red('Failed to load contexts'));
console.log(chalk.default.red(error.message));
// Fallback: au moins afficher le contexte personnel
console.log(chalk.default.blue('\n🔗 Available Contexts (Limited)'));
console.log('─'.repeat(40));
console.log(`${chalk.default.green('● (current)')} ${chalk.default.white('Personal Workspace')}`);
console.log(chalk.default.gray(' Your personal content and integrations'));
console.log(chalk.default.gray('\nNote: Could not load organization contexts. Try again later.'));
}
}
async function switchToPersonal() {
try {
const spinner = (0, ora_1.default)('Switching to personal context...').start();
// Mettre à jour la config locale
setConfig('currentContext', 'personal');
setConfig('currentOrganizationId', undefined);
// Informer le serveur du changement de contexte
await api_1.apiClient.switchContext();
spinner.stop();
console.log(chalk.default.green('✓ Switched to Personal Workspace'));
console.log(chalk.default.gray(' All commands will now use your personal context'));
}
catch (error) {
console.log(chalk.default.red('Failed to switch to personal context'));
console.log(chalk.default.red(error.message));
}
}
async function switchToOrganization(orgIdentifier) {
try {
const spinner = (0, ora_1.default)('Loading organizations...').start();
const userOrgs = await api_1.apiClient.getUserOrganizations();
spinner.stop();
if (!userOrgs.organizations || userOrgs.organizations.length === 0) {
console.log(chalk.default.yellow('No organizations available'));
console.log(chalk.default.gray('You need to be invited to an organization first'));
return;
}
// Chercher l'organisation par nom ou slug
const org = userOrgs.organizations.find((o) => o.name.toLowerCase() === orgIdentifier.toLowerCase() ||
o.slug.toLowerCase() === orgIdentifier.toLowerCase() ||
o.id === orgIdentifier);
if (!org) {
console.log(chalk.default.red(`Organization "${orgIdentifier}" not found`));
console.log(chalk.default.gray('\nAvailable organizations:'));
userOrgs.organizations.forEach((o) => {
const statusText = o.requiresCheckout ? chalk.default.yellow('(paiement requis)') : '';
console.log(chalk.default.gray(` • ${o.name} (${o.slug}) ${statusText}`));
});
return;
}
// Vérifier si l'organisation nécessite un checkout
if (org.requiresCheckout) {
console.log(chalk.default.red(`❌ Cannot switch to "${org.name}"`));
console.log(chalk.default.yellow('This organization requires a Team plan to be used.'));
console.log(chalk.default.gray('Visit the dashboard to choose a plan and activate your organization:'));
console.log(chalk.default.blue(` ${process.env.NEXT_PUBLIC_APP_URL || 'https://logggai.run'}/organization/choose-plan?org=${org.id}`));
console.log(chalk.default.gray('\nOnce you have a plan, you can switch to this organization.'));
return;
}
const switchSpinner = (0, ora_1.default)(`Switching to ${org.name}...`).start();
try {
// Mettre à jour la config locale
setConfig('currentContext', 'organization');
setConfig('currentOrganizationId', org.id);
// Informer le serveur du changement de contexte
await api_1.apiClient.switchContext(org.id);
switchSpinner.stop();
const roleColor = getRoleColor(org.role);
console.log(chalk.default.green(`✓ Switched to ${org.name}`));
console.log(chalk.default.gray(` Role: ${roleColor(org.role)} • Slug: ${org.slug}`));
console.log(chalk.default.gray(' All commands will now use this organization context'));
}
catch (error) {
switchSpinner.stop();
throw error;
}
}
catch (error) {
console.log(chalk.default.red(`Failed to switch to organization "${orgIdentifier}"`));
console.log(chalk.default.red(error.message));
}
}
function getRoleColor(role) {
switch (role.toLowerCase()) {
case 'owner':
return chalk.default.red;
case 'admin':
return chalk.default.yellow;
case 'editor':
return chalk.default.blue;
case 'member':
return chalk.default.green;
case 'viewer':
return chalk.default.gray;
default:
return chalk.default.white;
}
}
// Commandes alternatives pour UX
async function switchCommand(orgIdentifier) {
if (!orgIdentifier) {
await contextCommand({ list: true });
return;
}
if (orgIdentifier.toLowerCase() === 'personal') {
await contextCommand({ personal: true });
}
else {
await contextCommand({ switch: orgIdentifier });
}
}
async function useCommand(contextIdentifier) {
// Alias pour switch command avec syntaxe plus courte
await switchCommand(contextIdentifier);
}
//# sourceMappingURL=context.js.map