@genfeedai/create 0.1.2 → 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,201 +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}).`);
44
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.');
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
- async function writeDefaultEnv(projectDirectory) {
76
- const envPath = (0, node_path_1.join)(projectDirectory, '.env');
77
- const hasEnv = await fileExists(envPath);
78
- if (hasEnv) {
79
- return;
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.');
70
+ }
71
+ return manifest.version;
72
+ }
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}`);
80
81
  }
81
- await (0, promises_1.writeFile)(envPath, DEFAULT_ENV, 'utf-8');
82
- consola_1.consola.success('Created .env with working defaults');
82
+ await writeFile(destination, new Uint8Array(await response.arrayBuffer()));
83
83
  }
84
- /**
85
- * Open a URL in the system default browser.
86
- * Supports macOS, Linux (xdg-open), and Windows.
87
- */
88
- function openBrowser(url) {
89
- const platform = process.platform;
90
- if (platform === 'darwin') {
91
- (0, node_child_process_1.execFile)('open', [url]);
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.');
92
89
  }
93
- else if (platform === 'linux') {
94
- (0, node_child_process_1.execFile)('xdg-open', [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
95
  }
96
- else if (platform === 'win32') {
97
- (0, node_child_process_1.execFile)('cmd', ['/c', 'start', '', url]);
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
+ }
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}.`);
98
111
  }
112
+ return {
113
+ image,
114
+ releaseTag,
115
+ schemaVersion,
116
+ };
99
117
  }
100
- async function runInstall(projectDirectory) {
101
- const installCommand = getInstallCommand();
118
+ function commandExists(command, args = ['--version']) {
119
+ return spawnSync(command, args, { stdio: 'ignore' }).status === 0;
120
+ }
121
+ async function runCommand(command, args, options = {}) {
102
122
  await new Promise((resolvePromise, rejectPromise) => {
103
- const child = (0, node_child_process_1.spawn)(installCommand.command, installCommand.args, {
104
- cwd: projectDirectory,
105
- env: {
106
- ...process.env,
107
- HUSKY: '0',
108
- },
109
- stdio: 'inherit',
110
- });
111
- child.on('error', (error) => {
112
- rejectPromise(error);
123
+ const child = spawn(command, args, {
124
+ cwd: options.cwd,
125
+ stdio: options.stdio ?? 'inherit',
113
126
  });
114
- child.on('close', (code) => {
127
+ child.once('error', rejectPromise);
128
+ child.once('close', (code, signal) => {
115
129
  if (code === 0) {
116
130
  resolvePromise();
117
131
  return;
118
132
  }
119
- rejectPromise(new Error(`${installCommand.label} failed with exit code ${code ?? 'unknown'}`));
133
+ rejectPromise(new Error(`${command} ${args.join(' ')} failed with ${code ?? signal ?? 'an unknown error'}.`));
120
134
  });
121
135
  });
122
- return installCommand;
123
- }
124
- async function replaceEnvValue(projectDirectory, key, value) {
125
- const envPath = (0, node_path_1.join)(projectDirectory, '.env');
126
- const content = await (0, promises_1.readFile)(envPath, 'utf-8');
127
- const pattern = new RegExp(`^${key}=.*$`, 'm');
128
- if (pattern.test(content)) {
129
- await (0, promises_1.writeFile)(envPath, content.replace(pattern, `${key}=${value}`), 'utf-8');
130
- }
131
- else {
132
- await (0, promises_1.appendFile)(envPath, `\n${key}=${value}`, 'utf-8');
133
- }
134
- }
135
- /**
136
- * Ask the user whether to use managed MongoDB or provide their own URI,
137
- * then update the project's .env file accordingly.
138
- *
139
- * - Managed path: downloads the mongod binary (cached after first run),
140
- * sets MONGODB_URI + GENFEED_MANAGED_MONGO=true.
141
- * - Custom path: prompts for a URI and sets only MONGODB_URI.
142
- */
143
- async function setupMongoDB(projectDirectory) {
144
- const hasOwnMongo = await consola_1.consola.prompt('Do you have an existing MongoDB instance? (press Enter to use managed MongoDB)', {
145
- initial: false,
146
- type: 'confirm',
147
- });
148
- if (hasOwnMongo) {
149
- const uri = await consola_1.consola.prompt('Enter your MongoDB URI:', {
150
- initial: MANAGED_MONGO_URI,
151
- type: 'text',
152
- });
153
- await replaceEnvValue(projectDirectory, 'MONGODB_URI', String(uri));
154
- consola_1.consola.success('MongoDB URI saved to .env');
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) {
146
+ const start = Date.now();
147
+ while (Date.now() - start < timeoutMs) {
148
+ try {
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)) {
154
+ return true;
155
+ }
156
+ }
157
+ catch {
158
+ // The container is still starting.
159
+ }
160
+ await new Promise((resolvePromise) => setTimeout(resolvePromise, 2_000));
161
+ }
162
+ return false;
163
+ }
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) {
155
180
  return;
156
181
  }
157
- consola_1.consola.start('Downloading MongoDB binary (cached after first run)…');
158
- await mongodb_memory_server_1.MongoBinary.getPath({});
159
- consola_1.consola.success('MongoDB binary ready');
160
- await replaceEnvValue(projectDirectory, 'MONGODB_URI', MANAGED_MONGO_URI);
161
- await replaceEnvValue(projectDirectory, 'GENFEED_MANAGED_MONGO', 'true');
162
- consola_1.consola.success('Managed MongoDB configured — will auto-start on `bun run dev`');
163
- }
164
- async function scaffoldProject(projectName) {
165
- const projectDirectory = (0, node_path_1.resolve)(process.cwd(), projectName);
166
- consola_1.consola.start(`Scaffolding ${projectName} from ${TEMPLATE_REPOSITORY}`);
167
- await (0, giget_1.downloadTemplate)(TEMPLATE_REPOSITORY, {
168
- dir: projectDirectory,
169
- force: false,
170
- });
171
- consola_1.consola.success(`Downloaded template into ${projectDirectory}`);
172
- await writeDefaultEnv(projectDirectory);
173
- const installCommand = await runInstall(projectDirectory);
174
- consola_1.consola.success(`Dependencies installed with ${installCommand.label}`);
175
- await setupMongoDB(projectDirectory);
176
- consola_1.consola.box([
177
- `Genfeed Core is ready in ${projectName}.`,
178
- '',
179
- `Starting dev server… visit ${ONBOARDING_URL} to get started.`,
180
- ].join('\n'));
181
- openBrowser(ONBOARDING_URL);
182
- const devCommand = installCommand.command === 'bun' ? 'bun' : 'npm';
183
- const child = (0, node_child_process_1.spawn)(devCommand, ['run', 'dev'], {
184
- cwd: projectDirectory,
185
- stdio: 'inherit',
186
- });
187
- child.on('close', (code) => {
188
- process.exitCode = code ?? 0;
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.
189
185
  });
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;
198
+ }
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);
239
+ }
240
+ else {
241
+ consola.warn(`The containers started, but ${APP_URL} is not ready yet.`);
242
+ }
243
+ }
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 });
255
+ }
190
256
  }
191
257
  async function main() {
192
- const program = new commander_1.Command()
258
+ const program = new Command()
193
259
  .name('genfeedai')
194
- .description('Genfeed Core — AI workflow engine. Self-host for free.')
195
- .version('0.1.2')
196
- .argument('<project-name>', 'Directory name for the new project')
197
- .action(async (projectName) => {
198
- 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);
199
267
  })
200
268
  .showHelpAfterError();
201
269
  try {
@@ -203,11 +271,22 @@ async function main() {
203
271
  }
204
272
  catch (error) {
205
273
  const normalizedError = error instanceof Error ? error : new Error('Unknown CLI error');
206
- consola_1.consola.error(normalizedError.message);
274
+ consola.error(normalizedError.message);
207
275
  process.exitCode = 1;
208
276
  }
209
277
  }
210
- 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()) {
211
290
  void main();
212
291
  }
213
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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"}