@genfeedai/create 0.1.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 ADDED
@@ -0,0 +1,27 @@
1
+ # genfeedai
2
+
3
+ Bootstrap a self-hosted Genfeed Core project from the official template.
4
+
5
+ ## Usage
6
+
7
+ ```bash
8
+ npx genfeedai init my-app
9
+ ```
10
+
11
+ This command:
12
+
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
+
17
+ ## Example
18
+
19
+ ```bash
20
+ npx genfeedai init my-app
21
+ cd my-app
22
+ bun run dev
23
+ ```
24
+
25
+ ## License
26
+
27
+ AGPL-3.0
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ interface InstallCommand {
3
+ command: string;
4
+ args: string[];
5
+ label: string;
6
+ }
7
+ export declare function commandExists(command: string): boolean;
8
+ export declare function getInstallCommand(hasCommand?: (command: string) => boolean): InstallCommand;
9
+ export declare function copyDotEnvIfPresent(projectDirectory: string): Promise<void>;
10
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,118 @@
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.copyDotEnvIfPresent = copyDotEnvIfPresent;
7
+ const promises_1 = require("node:fs/promises");
8
+ const node_fs_1 = require("node:fs");
9
+ const node_path_1 = require("node:path");
10
+ const node_child_process_1 = require("node:child_process");
11
+ const commander_1 = require("commander");
12
+ const consola_1 = require("consola");
13
+ const giget_1 = require("giget");
14
+ const TEMPLATE_REPOSITORY = 'github:genfeedai/core#master';
15
+ function commandExists(command) {
16
+ const result = (0, node_child_process_1.spawnSync)(command, ['--version'], { stdio: 'ignore' });
17
+ return result.status === 0;
18
+ }
19
+ function getInstallCommand(hasCommand = commandExists) {
20
+ if (hasCommand('bun')) {
21
+ return {
22
+ args: ['install'],
23
+ command: 'bun',
24
+ label: 'bun install',
25
+ };
26
+ }
27
+ return {
28
+ args: ['install'],
29
+ command: 'npm',
30
+ label: 'npm install',
31
+ };
32
+ }
33
+ async function fileExists(filePath) {
34
+ try {
35
+ await (0, promises_1.access)(filePath, node_fs_1.constants.F_OK);
36
+ return true;
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ }
42
+ async function copyDotEnvIfPresent(projectDirectory) {
43
+ const envExamplePath = (0, node_path_1.join)(projectDirectory, '.env.example');
44
+ const envPath = (0, node_path_1.join)(projectDirectory, '.env');
45
+ const hasEnvExample = await fileExists(envExamplePath);
46
+ const hasEnv = await fileExists(envPath);
47
+ if (!hasEnvExample || hasEnv) {
48
+ return;
49
+ }
50
+ await (0, promises_1.copyFile)(envExamplePath, envPath);
51
+ consola_1.consola.success('Created .env from .env.example');
52
+ }
53
+ async function runInstall(projectDirectory) {
54
+ const installCommand = getInstallCommand();
55
+ await new Promise((resolvePromise, rejectPromise) => {
56
+ const child = (0, node_child_process_1.spawn)(installCommand.command, installCommand.args, {
57
+ cwd: projectDirectory,
58
+ env: {
59
+ ...process.env,
60
+ HUSKY: '0',
61
+ },
62
+ stdio: 'inherit',
63
+ });
64
+ child.on('error', (error) => {
65
+ rejectPromise(error);
66
+ });
67
+ child.on('close', (code) => {
68
+ if (code === 0) {
69
+ resolvePromise();
70
+ return;
71
+ }
72
+ rejectPromise(new Error(`${installCommand.label} failed with exit code ${code ?? 'unknown'}`));
73
+ });
74
+ });
75
+ return installCommand;
76
+ }
77
+ async function scaffoldProject(projectName) {
78
+ const projectDirectory = (0, node_path_1.resolve)(process.cwd(), projectName);
79
+ consola_1.consola.start(`Scaffolding ${projectName} from ${TEMPLATE_REPOSITORY}`);
80
+ await (0, giget_1.downloadTemplate)(TEMPLATE_REPOSITORY, {
81
+ dir: projectDirectory,
82
+ force: false,
83
+ });
84
+ consola_1.consola.success(`Downloaded template into ${projectDirectory}`);
85
+ await copyDotEnvIfPresent(projectDirectory);
86
+ const installCommand = await runInstall(projectDirectory);
87
+ consola_1.consola.success(`Dependencies installed with ${installCommand.label}`);
88
+ consola_1.consola.box([
89
+ `Genfeed Core is ready in ${projectName}.`,
90
+ '',
91
+ `Next steps:`,
92
+ ` cd ${projectName}`,
93
+ ` ${installCommand.command === 'bun' ? 'bun run dev' : 'npm run dev'}`,
94
+ ].join('\n'));
95
+ }
96
+ async function main() {
97
+ const program = new commander_1.Command()
98
+ .name('genfeedai')
99
+ .description('Genfeed Core — AI workflow engine. Self-host for free.')
100
+ .version('0.1.0')
101
+ .argument('<project-name>', 'Directory name for the new project')
102
+ .action(async (projectName) => {
103
+ await scaffoldProject(projectName);
104
+ })
105
+ .showHelpAfterError();
106
+ try {
107
+ await program.parseAsync(process.argv);
108
+ }
109
+ catch (error) {
110
+ const normalizedError = error instanceof Error ? error : new Error('Unknown CLI error');
111
+ consola_1.consola.error(normalizedError.message);
112
+ process.exitCode = 1;
113
+ }
114
+ }
115
+ if (require.main === module) {
116
+ void main();
117
+ }
118
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@genfeedai/create",
3
+ "version": "0.1.0",
4
+ "description": "Genfeed Core — AI workflow engine. Self-host for free.",
5
+ "license": "AGPL-3.0",
6
+ "homepage": "https://github.com/genfeedai/packages/tree/master/create",
7
+ "bugs": {
8
+ "url": "https://github.com/genfeedai/packages/issues"
9
+ },
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/genfeedai/packages.git",
13
+ "directory": "create"
14
+ },
15
+ "keywords": [
16
+ "genfeedai",
17
+ "genfeed",
18
+ "workflow",
19
+ "ai",
20
+ "scaffolder"
21
+ ],
22
+ "bin": {
23
+ "genfeedai": "dist/index.js"
24
+ },
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "files": [
29
+ "dist"
30
+ ],
31
+ "scripts": {
32
+ "build": "tsc -p tsconfig.json",
33
+ "check": "tsc --noEmit -p tsconfig.json",
34
+ "test": "vitest run"
35
+ },
36
+ "dependencies": {
37
+ "commander": "14.0.3",
38
+ "consola": "3.4.2",
39
+ "giget": "3.2.0"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "25.5.0",
43
+ "typescript": "6.0.2",
44
+ "vitest": "4.1.2"
45
+ }
46
+ }