logggai
Version:
AI-powered CLI for transforming your development work into professional content
171 lines • 6.14 kB
JavaScript
;
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