UNPKG

logggai

Version:

AI-powered CLI for transforming your development work into professional content

171 lines 6.14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.readProjectConfig = readProjectConfig; exports.writeProjectConfig = writeProjectConfig; exports.getCloudProjectId = getCloudProjectId; exports.createProjectFlow = createProjectFlow; exports.checkAutoSync = checkAutoSync; const inquirer_1 = require("inquirer"); const chalk = require("chalk"); const api_1 = require("./api"); const fs = require("fs"); const path = require("path"); // type ProjectConfig = { projectId: string, name: string, repo: string, lastSyncedCommit: string } const PROJECT_CONFIG_FILENAME = '.logggai-project.json'; const projectConfigPath = path.join(process.cwd(), PROJECT_CONFIG_FILENAME); function readProjectConfig() { try { if (!fs.existsSync(projectConfigPath)) return null; const raw = fs.readFileSync(projectConfigPath, 'utf-8'); return JSON.parse(raw); } catch (err) { console.error(chalk.default.red('Error reading project mapping (.logggai-project.json):'), err.message); return null; } } function writeProjectConfig(config) { try { fs.writeFileSync(projectConfigPath, JSON.stringify(config, null, 2), { encoding: 'utf-8', mode: 0o600 }); } catch (err) { throw new Error('Failed to write .logggai-project.json: ' + err.message); } } function getCloudProjectId() { const config = readProjectConfig(); if (config && config.projectId) return config.projectId; return null; } async function createProjectFlow() { // 1. Interactive prompts const answers = await inquirer_1.default.prompt([ { type: 'input', name: 'name', message: 'Project name:', validate: (input) => input.trim() ? true : 'Project name is required.' }, { type: 'input', name: 'repo', message: 'Repository URL (optional):', default: '' }, { type: 'list', name: 'contextType', message: 'Project context:', choices: [ { name: 'Personal', value: 'personal' }, { name: 'Organization', value: 'organization' } ], default: 'personal' } ]); let contextId = undefined; if (answers.contextType === 'organization') { // Fetch orgs from API and prompt user const orgsData = await api_1.apiClient.getUserOrganizations(); const orgs = orgsData.organizations || []; if (!orgs.length) { throw new Error('No organizations found. Please create an organization first.'); } const { chosenOrgId } = await inquirer_1.default.prompt([ { type: 'list', name: 'chosenOrgId', message: 'Select organization:', choices: orgs.map((org) => ({ name: org.name, value: org.id })) } ]); contextId = chosenOrgId; } // 2. API call to create project on SaaS console.log(chalk.default.gray('\nCreating project on SaaS...')); let project; try { project = await api_1.apiClient.createProject({ name: answers.name, repo: answers.repo, contextType: answers.contextType, contextId }); } catch (error) { throw new Error(error.message || 'API error while creating project'); } // 3. Get HEAD commit hash for initial sync point const simpleGit = require('simple-git'); const git = simpleGit(); let headCommit = ''; try { headCommit = await git.revparse(['HEAD']); } catch (err) { headCommit = ''; // fallback: no git repo } // 4. Write local mapping const mapping = { projectId: project.projectId || project.id, name: answers.name, repo: answers.repo, lastSyncedCommit: headCommit, // <-- HEAD at project creation contextType: answers.contextType, contextId: contextId || undefined }; try { writeProjectConfig(mapping); } catch (err) { throw new Error('Failed to write local mapping (.logggai-project.json)'); } // Note: Tinybird push for projects should be handled server-side if needed // === Launch auto-sync daemon in background === try { const fs = require('fs'); const path = require('path'); const { spawn } = require('child_process'); function isDaemonRunning() { const pidFile = path.join(process.cwd(), '.logggai-daemon.pid'); if (!fs.existsSync(pidFile)) return false; try { const pid = parseInt(fs.readFileSync(pidFile, 'utf-8')); process.kill(pid, 0); return true; } catch { return false; } } if (!isDaemonRunning()) { const daemonPath = path.resolve(__dirname, '../autosync-daemon.js'); const child = spawn('node', [daemonPath], { cwd: process.cwd(), detached: true, stdio: 'ignore', }); child.unref(); console.log('Logggai auto-sync daemon started in background.'); } } catch (err) { console.log('Warning: Could not launch auto-sync daemon in background.'); } console.log(chalk.default.green('Local mapping saved (.logggai-project.json)')); console.log(chalk.default.yellow('By default, only commits created after project initialization will be synchronized.')); } const AUTOSYNC_THRESHOLD = 20; // Hardcoded by Logggai, not user-configurable async function checkAutoSync(projectConfig) { const { getCommitsSince } = require('./git'); const unsyncedCommits = await getCommitsSince(projectConfig.lastSyncedCommit || null); if (unsyncedCommits.length >= AUTOSYNC_THRESHOLD) { // Always trigger sync automatically, no prompt, no opt-out return true; } return false; } //# sourceMappingURL=project.js.map