@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/LICENSE +661 -0
- package/README.md +19 -12
- package/dist/index.d.ts +21 -20
- package/dist/index.js +251 -172
- package/dist/index.js.map +1 -1
- package/package.json +18 -15
package/README.md
CHANGED
|
@@ -1,27 +1,34 @@
|
|
|
1
|
-
# genfeedai
|
|
1
|
+
# @genfeedai/create
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Install a checksummed Genfeed.ai Community release with Docker Compose.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Quick Start
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npx genfeedai
|
|
8
|
+
npx @genfeedai/create my-genfeed
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
label: string;
|
|
2
|
+
interface CliOptions {
|
|
3
|
+
release?: string;
|
|
4
|
+
start: boolean;
|
|
6
5
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
function
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
33
|
-
|
|
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
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
return true;
|
|
42
|
+
export async function resolveReleaseTag(requestedRelease, fetchImplementation = fetch) {
|
|
43
|
+
if (requestedRelease) {
|
|
44
|
+
return normalizeReleaseTag(requestedRelease);
|
|
41
45
|
}
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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 (
|
|
82
|
-
consola_1.consola.success('Created .env with working defaults');
|
|
82
|
+
await writeFile(destination, new Uint8Array(await response.arrayBuffer()));
|
|
83
83
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
|
|
94
|
-
|
|
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
|
-
|
|
97
|
-
|
|
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
|
-
|
|
101
|
-
|
|
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 =
|
|
104
|
-
cwd:
|
|
105
|
-
|
|
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.
|
|
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(`${
|
|
133
|
+
rejectPromise(new Error(`${command} ${args.join(' ')} failed with ${code ?? signal ?? 'an unknown error'}.`));
|
|
120
134
|
});
|
|
121
135
|
});
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
|
258
|
+
const program = new Command()
|
|
193
259
|
.name('genfeedai')
|
|
194
|
-
.description('
|
|
195
|
-
.version(
|
|
196
|
-
.argument('<project-name>', 'Directory
|
|
197
|
-
.
|
|
198
|
-
|
|
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
|
-
|
|
274
|
+
consola.error(normalizedError.message);
|
|
207
275
|
process.exitCode = 1;
|
|
208
276
|
}
|
|
209
277
|
}
|
|
210
|
-
|
|
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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"}
|