@genfeedai/create 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,27 +1,34 @@
1
- # genfeedai
1
+ # @genfeedai/create
2
2
 
3
- Bootstrap a self-hosted Genfeed Core project from the official template.
3
+ Install a checksummed Genfeed.ai Community release with Docker Compose.
4
4
 
5
- ## Usage
5
+ ## Quick Start
6
6
 
7
7
  ```bash
8
- npx genfeedai init my-app
8
+ npx @genfeedai/create my-genfeed
9
9
  ```
10
10
 
11
- This command:
11
+ The installer resolves the latest GitHub release, downloads its public
12
+ self-hosted bundle, verifies the SHA-256 checksum and release manifest, then
13
+ starts the exact GHCR image associated with that release. The app is available
14
+ at `http://localhost:3000`.
12
15
 
13
- - downloads the latest `genfeedai/core` template
14
- - copies `.env.example` to `.env` when present
15
- - installs dependencies with `bun install` when Bun is available, otherwise `npm install`
16
+ Install a specific release reproducibly:
16
17
 
17
- ## Example
18
+ ```bash
19
+ npx @genfeedai/create my-genfeed --release v0.5.0
20
+ ```
21
+
22
+ Prepare and validate the installation without starting containers:
18
23
 
19
24
  ```bash
20
- npx genfeedai init my-app
21
- cd my-app
22
- bun run dev
25
+ npx @genfeedai/create my-genfeed --release v0.5.0 --no-start
23
26
  ```
24
27
 
28
+ Node.js 24, Docker Compose, and `tar` must be installed. The generated directory
29
+ contains the release manifest, pinned environment, Compose file, and
30
+ installation guide.
31
+
25
32
  ## License
26
33
 
27
34
  AGPL-3.0
package/dist/index.d.ts CHANGED
@@ -1,24 +1,25 @@
1
1
  #!/usr/bin/env node
2
- interface InstallCommand {
3
- command: string;
4
- args: string[];
5
- label: string;
2
+ interface CliOptions {
3
+ release?: string;
4
+ start: boolean;
6
5
  }
7
- export declare function commandExists(command: string): boolean;
8
- export declare function getInstallCommand(hasCommand?: (command: string) => boolean): InstallCommand;
9
- export declare function writeDefaultEnv(projectDirectory: string): Promise<void>;
10
- /**
11
- * Open a URL in the system default browser.
12
- * Supports macOS, Linux (xdg-open), and Windows.
13
- */
6
+ interface ReleaseManifest {
7
+ schemaVersion: number;
8
+ releaseTag: string;
9
+ image: string;
10
+ }
11
+ interface ReleaseAssetUrls {
12
+ archive: string;
13
+ checksum: string;
14
+ }
15
+ type FetchImplementation = typeof fetch;
16
+ export declare function normalizeReleaseTag(value: string): string;
17
+ export declare function imageTagFromReleaseTag(releaseTag: string): string;
18
+ export declare function getReleaseAssetUrls(releaseTag: string, downloadBaseUrl?: string): ReleaseAssetUrls;
19
+ export declare function resolveReleaseTag(requestedRelease?: string, fetchImplementation?: FetchImplementation): Promise<string>;
20
+ export declare function readPackageVersion(packageJsonUrl?: URL): string;
21
+ export declare function verifyReleaseChecksum(archivePath: string, checksumPath: string): Promise<void>;
22
+ export declare function parseReleaseManifest(content: string, expectedReleaseTag: string): ReleaseManifest;
14
23
  export declare function openBrowser(url: string): void;
15
- /**
16
- * Ask the user whether to use managed MongoDB or provide their own URI,
17
- * then update the project's .env file accordingly.
18
- *
19
- * - Managed path: downloads the mongod binary (cached after first run),
20
- * sets MONGODB_URI + GENFEED_MANAGED_MONGO=true.
21
- * - Custom path: prompts for a URI and sets only MONGODB_URI.
22
- */
23
- export declare function setupMongoDB(projectDirectory: string): Promise<void>;
24
+ export declare function installRelease(projectName: string, options: CliOptions, fetchImplementation?: FetchImplementation): Promise<void>;
24
25
  export {};
package/dist/index.js CHANGED
@@ -1,240 +1,269 @@
1
1
  #!/usr/bin/env node
2
- "use strict";
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.commandExists = commandExists;
5
- exports.getInstallCommand = getInstallCommand;
6
- exports.writeDefaultEnv = writeDefaultEnv;
7
- exports.openBrowser = openBrowser;
8
- exports.setupMongoDB = setupMongoDB;
9
- const commander_1 = require("commander");
10
- const consola_1 = require("consola");
11
- const giget_1 = require("giget");
12
- const mongodb_memory_server_1 = require("mongodb-memory-server");
13
- const node_child_process_1 = require("node:child_process");
14
- const promises_1 = require("node:fs/promises");
15
- const node_path_1 = require("node:path");
16
- const TEMPLATE_REPOSITORY = 'github:genfeedai/core#master';
17
- const MANAGED_MONGO_URI = 'mongodb://127.0.0.1:27017/genfeed';
18
- const ONBOARDING_URL = 'http://localhost:3000/onboarding';
19
- function commandExists(command) {
20
- const result = (0, node_child_process_1.spawnSync)(command, ['--version'], { stdio: 'ignore' });
21
- return result.status === 0;
22
- }
23
- function getInstallCommand(hasCommand = commandExists) {
24
- if (hasCommand('bun')) {
25
- return {
26
- args: ['install'],
27
- command: 'bun',
28
- label: 'bun install',
29
- };
2
+ import { spawn, spawnSync } from 'node:child_process';
3
+ import { createHash } from 'node:crypto';
4
+ import { constants, readFileSync, realpathSync } from 'node:fs';
5
+ import { access, copyFile, mkdir, mkdtemp, readFile, rm, writeFile, } from 'node:fs/promises';
6
+ import { tmpdir } from 'node:os';
7
+ import { join, resolve } from 'node:path';
8
+ import { fileURLToPath } from 'node:url';
9
+ import { Command } from 'commander';
10
+ import { consola } from 'consola';
11
+ const REPOSITORY = 'genfeedai/genfeed.ai';
12
+ const RELEASE_API_URL = `https://api.github.com/repos/${REPOSITORY}/releases/latest`;
13
+ const DEFAULT_DOWNLOAD_BASE_URL = `https://github.com/${REPOSITORY}/releases/download`;
14
+ const RELEASE_ARCHIVE_NAME = 'genfeed-selfhosted.tar.gz';
15
+ const RELEASE_CHECKSUM_NAME = `${RELEASE_ARCHIVE_NAME}.sha256`;
16
+ const RELEASE_MANIFEST_NAME = 'release.json';
17
+ const EXPECTED_IMAGE_REPOSITORY = 'ghcr.io/genfeedai/genfeed.ai';
18
+ const APP_URL = 'http://localhost:3000';
19
+ function isRecord(value) {
20
+ return typeof value === 'object' && value !== null;
21
+ }
22
+ export function normalizeReleaseTag(value) {
23
+ const trimmed = value.trim();
24
+ const releaseTag = trimmed.startsWith('v') ? trimmed : `v${trimmed}`;
25
+ if (!/^v\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(releaseTag)) {
26
+ throw new Error(`Invalid release "${value}". Expected vX.Y.Z (for example, v0.5.0).`);
30
27
  }
28
+ return releaseTag;
29
+ }
30
+ export function imageTagFromReleaseTag(releaseTag) {
31
+ return normalizeReleaseTag(releaseTag).slice(1);
32
+ }
33
+ export function getReleaseAssetUrls(releaseTag, downloadBaseUrl = process.env.GENFEED_RELEASE_DOWNLOAD_BASE_URL ??
34
+ DEFAULT_DOWNLOAD_BASE_URL) {
35
+ const normalizedTag = normalizeReleaseTag(releaseTag);
36
+ const baseUrl = downloadBaseUrl.replace(/\/$/, '');
31
37
  return {
32
- args: ['install'],
33
- command: 'npm',
34
- label: 'npm install',
38
+ archive: `${baseUrl}/${normalizedTag}/${RELEASE_ARCHIVE_NAME}`,
39
+ checksum: `${baseUrl}/${normalizedTag}/${RELEASE_CHECKSUM_NAME}`,
35
40
  };
36
41
  }
37
- async function fileExists(filePath) {
38
- try {
39
- await (0, promises_1.access)(filePath);
40
- return true;
42
+ export async function resolveReleaseTag(requestedRelease, fetchImplementation = fetch) {
43
+ if (requestedRelease) {
44
+ return normalizeReleaseTag(requestedRelease);
41
45
  }
42
- catch {
43
- return false;
46
+ const response = await fetchImplementation(RELEASE_API_URL, {
47
+ headers: {
48
+ Accept: 'application/vnd.github+json',
49
+ 'User-Agent': '@genfeedai/create',
50
+ },
51
+ signal: AbortSignal.timeout(30_000),
52
+ });
53
+ if (!response.ok) {
54
+ throw new Error(`Could not resolve the latest Genfeed.ai release (HTTP ${response.status}).`);
55
+ }
56
+ const payload = await response.json();
57
+ if (!isRecord(payload)) {
58
+ throw new Error('GitHub returned invalid latest-release metadata.');
59
+ }
60
+ const tagName = payload.tag_name;
61
+ if (typeof tagName !== 'string') {
62
+ throw new Error('GitHub latest release did not include a release tag.');
44
63
  }
64
+ return normalizeReleaseTag(tagName);
45
65
  }
46
- const DEFAULT_ENV = `# ─── Required ───────────────────────────────────────────────────────
47
- MONGODB_URI=mongodb://127.0.0.1:27017/genfeed
48
-
49
- # ─── API Server ─────────────────────────────────────────────────────
50
- PORT=3001
51
- CORS_ORIGIN=http://localhost:3000
52
- API_BASE_URL=http://localhost:3001
53
-
54
- # ─── Redis (BullMQ job queue) ──────────────────────────────────────
55
- REDIS_HOST=localhost
56
- REDIS_PORT=6379
57
- # REDIS_PASSWORD=
58
-
59
- # ─── AI Providers (add your keys during onboarding) ────────────────
60
- # REPLICATE_API_TOKEN=
61
- # FAL_API_KEY=
62
- # ELEVENLABS_API_KEY=
63
- # HF_API_TOKEN=
64
-
65
- # ─── Ollama (local LLM — optional) ────────────────────────────────
66
- # OLLAMA_ENABLED=false
67
- # OLLAMA_BASE_URL=http://localhost:11434
68
- # OLLAMA_DEFAULT_MODEL=llama3.1
69
-
70
- # ─── Frontend ──────────────────────────────────────────────────────
71
- NEXT_PUBLIC_API_URL=http://localhost:3001/api
72
- # NEXT_PUBLIC_URL=http://localhost:3000
73
- # NEXT_PUBLIC_TTS_ENABLED=false
74
- `;
75
- const ENV_LOCATIONS = ['.env', 'apps/api/.env'];
76
- async function writeDefaultEnv(projectDirectory) {
77
- for (const location of ENV_LOCATIONS) {
78
- const envPath = (0, node_path_1.join)(projectDirectory, location);
79
- const hasEnv = await fileExists(envPath);
80
- if (!hasEnv) {
81
- await (0, promises_1.mkdir)((0, node_path_1.dirname)(envPath), { recursive: true });
82
- await (0, promises_1.writeFile)(envPath, DEFAULT_ENV, 'utf-8');
83
- }
66
+ export function readPackageVersion(packageJsonUrl = new URL('../package.json', import.meta.url)) {
67
+ const manifest = JSON.parse(readFileSync(fileURLToPath(packageJsonUrl), 'utf8'));
68
+ if (!isRecord(manifest) || typeof manifest.version !== 'string') {
69
+ throw new Error('Could not read the @genfeedai/create package version.');
84
70
  }
85
- consola_1.consola.success('Created .env with working defaults');
71
+ return manifest.version;
86
72
  }
87
- /**
88
- * Open a URL in the system default browser.
89
- * Supports macOS, Linux (xdg-open), and Windows.
90
- */
91
- function openBrowser(url) {
92
- const platform = process.platform;
93
- if (platform === 'darwin') {
94
- (0, node_child_process_1.execFile)('open', [url]);
73
+ async function downloadFile(url, destination, fetchImplementation) {
74
+ const response = await fetchImplementation(url, {
75
+ headers: { 'User-Agent': '@genfeedai/create' },
76
+ redirect: 'follow',
77
+ signal: AbortSignal.timeout(120_000),
78
+ });
79
+ if (!response.ok) {
80
+ throw new Error(`Download failed (HTTP ${response.status}): ${url}`);
95
81
  }
96
- else if (platform === 'linux') {
97
- (0, node_child_process_1.execFile)('xdg-open', [url]);
82
+ await writeFile(destination, new Uint8Array(await response.arrayBuffer()));
83
+ }
84
+ export async function verifyReleaseChecksum(archivePath, checksumPath) {
85
+ const checksumContent = await readFile(checksumPath, 'utf8');
86
+ const match = checksumContent.match(/^([a-fA-F0-9]{64})\s+/);
87
+ if (!match) {
88
+ throw new Error('Release checksum file is malformed.');
98
89
  }
99
- else if (platform === 'win32') {
100
- (0, node_child_process_1.execFile)('cmd', ['/c', 'start', '', url]);
90
+ const archive = await readFile(archivePath);
91
+ const actualChecksum = createHash('sha256').update(archive).digest('hex');
92
+ const expectedChecksum = match[1].toLowerCase();
93
+ if (actualChecksum !== expectedChecksum) {
94
+ throw new Error(`Release checksum mismatch: expected ${expectedChecksum}, received ${actualChecksum}.`);
95
+ }
96
+ }
97
+ export function parseReleaseManifest(content, expectedReleaseTag) {
98
+ const parsed = JSON.parse(content);
99
+ if (!isRecord(parsed)) {
100
+ throw new Error('Release manifest is not an object.');
101
101
  }
102
+ const normalizedTag = normalizeReleaseTag(expectedReleaseTag);
103
+ const expectedImage = `${EXPECTED_IMAGE_REPOSITORY}:${imageTagFromReleaseTag(normalizedTag)}`;
104
+ const schemaVersion = parsed.schemaVersion;
105
+ const releaseTag = parsed.releaseTag;
106
+ const image = parsed.image;
107
+ if (schemaVersion !== 1 ||
108
+ releaseTag !== normalizedTag ||
109
+ image !== expectedImage) {
110
+ throw new Error(`Release manifest does not match ${normalizedTag} and ${expectedImage}.`);
111
+ }
112
+ return {
113
+ image,
114
+ releaseTag,
115
+ schemaVersion,
116
+ };
117
+ }
118
+ function commandExists(command, args = ['--version']) {
119
+ return spawnSync(command, args, { stdio: 'ignore' }).status === 0;
102
120
  }
103
- async function waitForServer(url, timeoutMs = 120_000) {
121
+ async function runCommand(command, args, options = {}) {
122
+ await new Promise((resolvePromise, rejectPromise) => {
123
+ const child = spawn(command, args, {
124
+ cwd: options.cwd,
125
+ stdio: options.stdio ?? 'inherit',
126
+ });
127
+ child.once('error', rejectPromise);
128
+ child.once('close', (code, signal) => {
129
+ if (code === 0) {
130
+ resolvePromise();
131
+ return;
132
+ }
133
+ rejectPromise(new Error(`${command} ${args.join(' ')} failed with ${code ?? signal ?? 'an unknown error'}.`));
134
+ });
135
+ });
136
+ }
137
+ function assertInstallPrerequisites() {
138
+ if (!commandExists('tar')) {
139
+ throw new Error('tar is required to extract the Genfeed.ai release bundle.');
140
+ }
141
+ if (!commandExists('docker', ['compose', 'version'])) {
142
+ throw new Error('Docker Compose is required. Install Docker Desktop or the Docker Compose plugin.');
143
+ }
144
+ }
145
+ async function waitForApp(fetchImplementation, timeoutMs = 180_000) {
104
146
  const start = Date.now();
105
147
  while (Date.now() - start < timeoutMs) {
106
148
  try {
107
- const response = await fetch(url, { signal: AbortSignal.timeout(2000) });
108
- if (response.ok || response.status === 404) {
149
+ const response = await fetchImplementation(APP_URL, {
150
+ redirect: 'manual',
151
+ signal: AbortSignal.timeout(2_000),
152
+ });
153
+ if (response.ok || (response.status >= 300 && response.status < 400)) {
109
154
  return true;
110
155
  }
111
156
  }
112
157
  catch {
113
- // Server not ready yet
158
+ // The container is still starting.
114
159
  }
115
- await new Promise((r) => setTimeout(r, 1500));
160
+ await new Promise((resolvePromise) => setTimeout(resolvePromise, 2_000));
116
161
  }
117
162
  return false;
118
163
  }
119
- async function runInstall(projectDirectory) {
120
- const installCommand = getInstallCommand();
121
- await new Promise((resolvePromise, rejectPromise) => {
122
- const child = (0, node_child_process_1.spawn)(installCommand.command, installCommand.args, {
123
- cwd: projectDirectory,
124
- env: {
125
- ...process.env,
126
- HUSKY: '0',
127
- },
128
- stdio: 'inherit',
129
- });
130
- child.on('error', (error) => {
131
- rejectPromise(error);
132
- });
133
- child.on('close', (code) => {
134
- if (code === 0) {
135
- resolvePromise();
136
- return;
137
- }
138
- rejectPromise(new Error(`${installCommand.label} failed with exit code ${code ?? 'unknown'}`));
139
- });
164
+ export function openBrowser(url) {
165
+ let command;
166
+ let args = [];
167
+ if (process.platform === 'darwin') {
168
+ command = 'open';
169
+ args = [url];
170
+ }
171
+ else if (process.platform === 'linux') {
172
+ command = 'xdg-open';
173
+ args = [url];
174
+ }
175
+ else if (process.platform === 'win32') {
176
+ command = 'cmd';
177
+ args = ['/c', 'start', '', url];
178
+ }
179
+ if (!command) {
180
+ return;
181
+ }
182
+ const child = spawn(command, args, { detached: true, stdio: 'ignore' });
183
+ child.once('error', () => {
184
+ // Opening a browser is a convenience; the installation is already ready.
140
185
  });
141
- return installCommand;
142
- }
143
- async function replaceEnvValue(projectDirectory, key, value) {
144
- const pattern = new RegExp(`^${key}=.*$`, 'm');
145
- for (const location of ENV_LOCATIONS) {
146
- const envPath = (0, node_path_1.join)(projectDirectory, location);
147
- const exists = await fileExists(envPath);
148
- if (!exists) {
149
- continue;
186
+ child.unref();
187
+ }
188
+ export async function installRelease(projectName, options, fetchImplementation = fetch) {
189
+ assertInstallPrerequisites();
190
+ const projectDirectory = resolve(process.cwd(), projectName);
191
+ try {
192
+ await access(projectDirectory);
193
+ throw new Error(`Destination already exists: ${projectDirectory}`);
194
+ }
195
+ catch (error) {
196
+ if (error instanceof Error && error.message.startsWith('Destination')) {
197
+ throw error;
150
198
  }
151
- const content = await (0, promises_1.readFile)(envPath, 'utf-8');
152
- if (pattern.test(content)) {
153
- await (0, promises_1.writeFile)(envPath, content.replace(pattern, `${key}=${value}`), 'utf-8');
199
+ }
200
+ const releaseTag = await resolveReleaseTag(options.release, fetchImplementation);
201
+ const assetUrls = getReleaseAssetUrls(releaseTag);
202
+ const temporaryDirectory = await mkdtemp(join(tmpdir(), 'genfeed-create-release-'));
203
+ const archivePath = join(temporaryDirectory, RELEASE_ARCHIVE_NAME);
204
+ const checksumPath = join(temporaryDirectory, RELEASE_CHECKSUM_NAME);
205
+ let createdProjectDirectory = false;
206
+ let startAttempted = false;
207
+ consola.start(`Downloading Genfeed.ai ${releaseTag}`);
208
+ try {
209
+ await Promise.all([
210
+ downloadFile(assetUrls.archive, archivePath, fetchImplementation),
211
+ downloadFile(assetUrls.checksum, checksumPath, fetchImplementation),
212
+ ]);
213
+ await verifyReleaseChecksum(archivePath, checksumPath);
214
+ await mkdir(projectDirectory);
215
+ createdProjectDirectory = true;
216
+ await runCommand('tar', ['-xzf', archivePath, '-C', projectDirectory, '--strip-components=1'], { stdio: 'ignore' });
217
+ const releaseManifest = parseReleaseManifest(await readFile(join(projectDirectory, RELEASE_MANIFEST_NAME), 'utf8'), releaseTag);
218
+ await copyFile(join(projectDirectory, '.env.example'), join(projectDirectory, '.env'), constants.COPYFILE_EXCL);
219
+ await runCommand('docker', [
220
+ 'compose',
221
+ '--env-file',
222
+ '.env',
223
+ '-f',
224
+ 'compose.yml',
225
+ 'config',
226
+ '--quiet',
227
+ ], { cwd: projectDirectory, stdio: 'ignore' });
228
+ consola.success(`Installed ${releaseManifest.releaseTag} (${releaseManifest.image}) in ${projectDirectory}`);
229
+ if (!options.start) {
230
+ consola.info(`Start later with: cd ${projectName} && docker compose --env-file .env -f compose.yml up -d`);
231
+ return;
232
+ }
233
+ startAttempted = true;
234
+ await runCommand('docker', ['compose', '--env-file', '.env', '-f', 'compose.yml', 'up', '-d'], { cwd: projectDirectory });
235
+ consola.start('Waiting for Genfeed.ai to become ready…');
236
+ if (await waitForApp(fetchImplementation)) {
237
+ consola.success(`Genfeed.ai is running at ${APP_URL}`);
238
+ openBrowser(APP_URL);
154
239
  }
155
240
  else {
156
- await (0, promises_1.appendFile)(envPath, `\n${key}=${value}`, 'utf-8');
241
+ consola.warn(`The containers started, but ${APP_URL} is not ready yet.`);
157
242
  }
158
243
  }
159
- }
160
- /**
161
- * Ask the user whether to use managed MongoDB or provide their own URI,
162
- * then update the project's .env file accordingly.
163
- *
164
- * - Managed path: downloads the mongod binary (cached after first run),
165
- * sets MONGODB_URI + GENFEED_MANAGED_MONGO=true.
166
- * - Custom path: prompts for a URI and sets only MONGODB_URI.
167
- */
168
- async function setupMongoDB(projectDirectory) {
169
- const hasOwnMongo = await consola_1.consola.prompt('Do you have an existing MongoDB instance? (press Enter to use managed MongoDB)', {
170
- initial: false,
171
- type: 'confirm',
172
- });
173
- if (hasOwnMongo) {
174
- const uri = await consola_1.consola.prompt('Enter your MongoDB URI:', {
175
- initial: MANAGED_MONGO_URI,
176
- type: 'text',
177
- });
178
- await replaceEnvValue(projectDirectory, 'MONGODB_URI', String(uri));
179
- consola_1.consola.success('MongoDB URI saved to .env');
180
- return;
244
+ catch (error) {
245
+ if (createdProjectDirectory && !startAttempted) {
246
+ await rm(projectDirectory, { force: true, recursive: true });
247
+ }
248
+ else if (startAttempted) {
249
+ consola.warn(`Startup failed. Installation files were preserved at ${projectDirectory} for inspection or recovery.`);
250
+ }
251
+ throw error;
252
+ }
253
+ finally {
254
+ await rm(temporaryDirectory, { force: true, recursive: true });
181
255
  }
182
- consola_1.consola.start('Downloading MongoDB binary (cached after first run)…');
183
- await mongodb_memory_server_1.MongoBinary.getPath({});
184
- consola_1.consola.success('MongoDB binary ready');
185
- await replaceEnvValue(projectDirectory, 'MONGODB_URI', MANAGED_MONGO_URI);
186
- await replaceEnvValue(projectDirectory, 'GENFEED_MANAGED_MONGO', 'true');
187
- consola_1.consola.success('Managed MongoDB configured — will auto-start on `bun run dev`');
188
- }
189
- async function scaffoldProject(projectName) {
190
- const projectDirectory = (0, node_path_1.resolve)(process.cwd(), projectName);
191
- consola_1.consola.start(`Scaffolding ${projectName} from ${TEMPLATE_REPOSITORY}`);
192
- await (0, giget_1.downloadTemplate)(TEMPLATE_REPOSITORY, {
193
- dir: projectDirectory,
194
- force: false,
195
- });
196
- consola_1.consola.success(`Downloaded template into ${projectDirectory}`);
197
- await writeDefaultEnv(projectDirectory);
198
- const installCommand = await runInstall(projectDirectory);
199
- consola_1.consola.success(`Dependencies installed with ${installCommand.label}`);
200
- await setupMongoDB(projectDirectory);
201
- const devCommand = installCommand.command === 'bun' ? 'bun' : 'npm';
202
- const child = (0, node_child_process_1.spawn)(devCommand, ['run', 'dev'], {
203
- cwd: projectDirectory,
204
- stdio: 'inherit',
205
- });
206
- consola_1.consola.start('Waiting for dev servers to start…');
207
- const [apiReady, webReady] = await Promise.all([
208
- waitForServer('http://localhost:3001/api'),
209
- waitForServer('http://localhost:3000'),
210
- ]);
211
- if (apiReady && webReady) {
212
- consola_1.consola.box([
213
- `Genfeed Core is running.`,
214
- '',
215
- `Opening ${ONBOARDING_URL}`,
216
- ].join('\n'));
217
- openBrowser(ONBOARDING_URL);
218
- }
219
- else {
220
- consola_1.consola.warn('Servers did not start in time. Open manually:');
221
- consola_1.consola.info(ONBOARDING_URL);
222
- }
223
- await new Promise((resolvePromise) => {
224
- child.on('close', (code) => {
225
- process.exitCode = code ?? 0;
226
- resolvePromise();
227
- });
228
- });
229
256
  }
230
257
  async function main() {
231
- const program = new commander_1.Command()
258
+ const program = new Command()
232
259
  .name('genfeedai')
233
- .description('Genfeed Core — AI workflow engine. Self-host for free.')
234
- .version('0.1.3')
235
- .argument('<project-name>', 'Directory name for the new project')
236
- .action(async (projectName) => {
237
- await scaffoldProject(projectName);
260
+ .description('Install a public Genfeed.ai Community release.')
261
+ .version(readPackageVersion())
262
+ .argument('<project-name>', 'Directory for the self-hosted installation')
263
+ .option('--release <tag>', 'Install an exact release (for example, v0.5.0)')
264
+ .option('--no-start', 'Prepare and verify the installation without starting it')
265
+ .action(async (projectName, options) => {
266
+ await installRelease(projectName, options);
238
267
  })
239
268
  .showHelpAfterError();
240
269
  try {
@@ -242,11 +271,22 @@ async function main() {
242
271
  }
243
272
  catch (error) {
244
273
  const normalizedError = error instanceof Error ? error : new Error('Unknown CLI error');
245
- consola_1.consola.error(normalizedError.message);
274
+ consola.error(normalizedError.message);
246
275
  process.exitCode = 1;
247
276
  }
248
277
  }
249
- if (require.main === module) {
278
+ function isMainModule() {
279
+ if (!process.argv[1]) {
280
+ return false;
281
+ }
282
+ try {
283
+ return realpathSync(process.argv[1]) === fileURLToPath(import.meta.url);
284
+ }
285
+ catch {
286
+ return false;
287
+ }
288
+ }
289
+ if (isMainModule()) {
250
290
  void main();
251
291
  }
252
292
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}