forgestack-os-cli 0.3.0 → 0.3.1
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 +78 -0
- package/dist/commands/create.js +52 -55
- package/dist/commands/create.js.map +1 -1
- package/dist/generators/api.js +29 -36
- package/dist/generators/api.js.map +1 -1
- package/dist/generators/auth.js +37 -43
- package/dist/generators/auth.js.map +1 -1
- package/dist/generators/backend.js +64 -70
- package/dist/generators/backend.js.map +1 -1
- package/dist/generators/common.js +48 -13
- package/dist/generators/common.js.map +1 -1
- package/dist/generators/database.js +18 -24
- package/dist/generators/database.js.map +1 -1
- package/dist/generators/docker.js +10 -16
- package/dist/generators/docker.js.map +1 -1
- package/dist/generators/frontend.js +43 -49
- package/dist/generators/frontend.js.map +1 -1
- package/dist/generators/index.js +40 -46
- package/dist/generators/index.js.map +1 -1
- package/dist/index.js +10 -7
- package/dist/index.js.map +1 -1
- package/dist/types.js +1 -2
- package/dist/utils/logger.js +9 -15
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/prompts.d.ts +15 -1
- package/dist/utils/prompts.js +108 -32
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/security.js +3 -9
- package/dist/utils/security.js.map +1 -1
- package/dist/utils/validators.js +7 -9
- package/dist/utils/validators.js.map +1 -1
- package/package.json +25 -3
package/dist/utils/logger.js
CHANGED
|
@@ -1,29 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.logger = void 0;
|
|
7
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
-
const ora_1 = __importDefault(require("ora"));
|
|
9
|
-
exports.logger = {
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
export const logger = {
|
|
10
4
|
info: (message) => {
|
|
11
|
-
console.log(
|
|
5
|
+
console.log(chalk.blue('ℹ'), message);
|
|
12
6
|
},
|
|
13
7
|
success: (message) => {
|
|
14
|
-
console.log(
|
|
8
|
+
console.log(chalk.green('✔'), message);
|
|
15
9
|
},
|
|
16
10
|
error: (message) => {
|
|
17
|
-
console.log(
|
|
11
|
+
console.log(chalk.red('✖'), message);
|
|
18
12
|
},
|
|
19
13
|
warning: (message) => {
|
|
20
|
-
console.log(
|
|
14
|
+
console.log(chalk.yellow('⚠'), message);
|
|
21
15
|
},
|
|
22
16
|
title: (message) => {
|
|
23
|
-
console.log(
|
|
17
|
+
console.log(chalk.bold.cyan(`\n${message}\n`));
|
|
24
18
|
},
|
|
25
19
|
spinner: (text) => {
|
|
26
|
-
return (
|
|
20
|
+
return ora({
|
|
27
21
|
text,
|
|
28
22
|
color: 'cyan',
|
|
29
23
|
}).start();
|
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAY,MAAM,KAAK,CAAC;AAE/B,MAAM,CAAC,MAAM,MAAM,GAAG;IAClB,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,EAAE,CAAC,IAAY,EAAO,EAAE;QAC3B,OAAO,GAAG,CAAC;YACP,IAAI;YACJ,KAAK,EAAE,MAAM;SAChB,CAAC,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACJ,CAAC"}
|
package/dist/utils/prompts.d.ts
CHANGED
|
@@ -1,2 +1,16 @@
|
|
|
1
1
|
import { StackConfig } from '../types';
|
|
2
|
-
|
|
2
|
+
type CLIOptions = {
|
|
3
|
+
frontend?: string;
|
|
4
|
+
backend?: string;
|
|
5
|
+
auth?: string;
|
|
6
|
+
database?: string;
|
|
7
|
+
api?: string;
|
|
8
|
+
preset?: string;
|
|
9
|
+
stack?: string;
|
|
10
|
+
docker?: boolean;
|
|
11
|
+
multiTenant?: boolean;
|
|
12
|
+
skipInstall?: boolean;
|
|
13
|
+
skipGit?: boolean;
|
|
14
|
+
};
|
|
15
|
+
export declare function promptForStack(projectName: string, options?: CLIOptions): Promise<StackConfig>;
|
|
16
|
+
export {};
|
package/dist/utils/prompts.js
CHANGED
|
@@ -1,10 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import inquirer from 'inquirer';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
const PRESETS = {
|
|
6
|
+
'next-nest-clerk-pg': {
|
|
7
|
+
frontend: 'nextjs',
|
|
8
|
+
backend: 'nestjs',
|
|
9
|
+
auth: 'clerk',
|
|
10
|
+
database: 'postgresql',
|
|
11
|
+
apiStyle: 'rest',
|
|
12
|
+
docker: true,
|
|
13
|
+
multiTenant: true,
|
|
14
|
+
},
|
|
15
|
+
'react-express-jwt-mongo': {
|
|
16
|
+
frontend: 'react-vite',
|
|
17
|
+
backend: 'express',
|
|
18
|
+
auth: 'jwt',
|
|
19
|
+
database: 'mongodb',
|
|
20
|
+
apiStyle: 'graphql',
|
|
21
|
+
docker: true,
|
|
22
|
+
multiTenant: false,
|
|
23
|
+
},
|
|
24
|
+
'next-fastify-supabase-trpc': {
|
|
25
|
+
frontend: 'nextjs',
|
|
26
|
+
backend: 'fastify',
|
|
27
|
+
auth: 'supabase',
|
|
28
|
+
database: 'supabase-db',
|
|
29
|
+
apiStyle: 'trpc',
|
|
30
|
+
docker: true,
|
|
31
|
+
multiTenant: true,
|
|
32
|
+
},
|
|
4
33
|
};
|
|
5
|
-
|
|
6
|
-
exports.promptForStack = promptForStack;
|
|
7
|
-
const inquirer_1 = __importDefault(require("inquirer"));
|
|
34
|
+
const LAST_CONFIG_PATH = path.join(os.homedir(), '.forgestack', 'config.json');
|
|
8
35
|
/**
|
|
9
36
|
* Normalizes input strings for consistency (e.g., 'Next.js 14' -> 'nextjs')
|
|
10
37
|
*/
|
|
@@ -61,26 +88,73 @@ function normalizeInput(category, value) {
|
|
|
61
88
|
};
|
|
62
89
|
return mappings[category][v] || v;
|
|
63
90
|
}
|
|
64
|
-
async function
|
|
91
|
+
async function loadLastConfig() {
|
|
92
|
+
try {
|
|
93
|
+
const raw = await fs.readJSON(LAST_CONFIG_PATH);
|
|
94
|
+
return raw.lastStack || {};
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return {};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async function saveLastConfig(config) {
|
|
101
|
+
try {
|
|
102
|
+
await fs.ensureDir(path.dirname(LAST_CONFIG_PATH));
|
|
103
|
+
await fs.writeJSON(LAST_CONFIG_PATH, { lastStack: config }, { spaces: 2 });
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// non-blocking persistence
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function parseApiStyle(api) {
|
|
110
|
+
if (api === 'trpc')
|
|
111
|
+
return 'trpc';
|
|
112
|
+
if (api === 'graphql')
|
|
113
|
+
return 'graphql';
|
|
114
|
+
return 'rest';
|
|
115
|
+
}
|
|
116
|
+
function buildConfigFromOptions(projectName, options, last) {
|
|
117
|
+
let base = {};
|
|
118
|
+
if (options.preset) {
|
|
119
|
+
const preset = PRESETS[options.preset];
|
|
120
|
+
if (!preset) {
|
|
121
|
+
throw new Error(`Unknown preset "${options.preset}". Available: ${Object.keys(PRESETS).join(', ')}`);
|
|
122
|
+
}
|
|
123
|
+
base = { ...preset };
|
|
124
|
+
}
|
|
125
|
+
if (options.stack) {
|
|
126
|
+
try {
|
|
127
|
+
const parsed = JSON.parse(options.stack);
|
|
128
|
+
base = { ...base, ...parsed };
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
throw new Error('Failed to parse --stack JSON. Ensure it is valid JSON.');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const merged = {
|
|
135
|
+
projectName,
|
|
136
|
+
frontend: normalizeInput('frontend', options.frontend || base.frontend || last.frontend || 'react-vite'),
|
|
137
|
+
backend: normalizeInput('backend', options.backend || base.backend || last.backend || 'express'),
|
|
138
|
+
auth: normalizeInput('auth', options.auth || base.auth || last.auth || 'jwt'),
|
|
139
|
+
database: normalizeInput('database', options.database || base.database || last.database || 'postgresql'),
|
|
140
|
+
apiStyle: parseApiStyle(options.api || base.apiStyle || last.apiStyle),
|
|
141
|
+
docker: options.docker !== undefined ? Boolean(options.docker) : (base.docker ?? last.docker ?? true),
|
|
142
|
+
multiTenant: options.multiTenant !== undefined ? Boolean(options.multiTenant) : (base.multiTenant ?? last.multiTenant ?? false),
|
|
143
|
+
skipInstall: Boolean(options.skipInstall),
|
|
144
|
+
skipGit: Boolean(options.skipGit),
|
|
145
|
+
};
|
|
146
|
+
return merged;
|
|
147
|
+
}
|
|
148
|
+
export async function promptForStack(projectName, options = {}) {
|
|
65
149
|
console.log('\n');
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
auth: normalizeInput('auth', options.auth || 'jwt'),
|
|
73
|
-
database: normalizeInput('database', options.database || 'postgresql'),
|
|
74
|
-
apiStyle: options.api // 'api' option maps to 'apiStyle' in config
|
|
75
|
-
? (options.api === 'trpc' ? 'trpc' : options.api === 'graphql' ? 'graphql' : 'rest')
|
|
76
|
-
: 'rest',
|
|
77
|
-
docker: options.docker !== false, // Default to true unless --no-docker
|
|
78
|
-
multiTenant: !!options.multiTenant,
|
|
79
|
-
skipInstall: !!options.skipInstall,
|
|
80
|
-
skipGit: !!options.skipGit,
|
|
81
|
-
};
|
|
150
|
+
const lastConfig = await loadLastConfig();
|
|
151
|
+
// Non-interactive: use flags, preset, or stack JSON
|
|
152
|
+
if (options.frontend || options.backend || options.auth || options.database || options.preset || options.stack) {
|
|
153
|
+
const config = buildConfigFromOptions(projectName, options, lastConfig);
|
|
154
|
+
await saveLastConfig(config);
|
|
155
|
+
return config;
|
|
82
156
|
}
|
|
83
|
-
const answers = await
|
|
157
|
+
const answers = await inquirer.prompt([
|
|
84
158
|
{
|
|
85
159
|
type: 'list',
|
|
86
160
|
name: 'frontend',
|
|
@@ -91,7 +165,7 @@ async function promptForStack(projectName, options = {}) {
|
|
|
91
165
|
{ name: 'Vue + Vite', value: 'vue-vite', disabled: 'Coming in Phase 5' },
|
|
92
166
|
{ name: 'SvelteKit', value: 'sveltekit', disabled: 'Coming in Phase 5' },
|
|
93
167
|
],
|
|
94
|
-
default: 'react-vite',
|
|
168
|
+
default: lastConfig.frontend || 'react-vite',
|
|
95
169
|
},
|
|
96
170
|
{
|
|
97
171
|
type: 'list',
|
|
@@ -104,7 +178,7 @@ async function promptForStack(projectName, options = {}) {
|
|
|
104
178
|
{ name: 'Bun + Elysia', value: 'bun-elysia' },
|
|
105
179
|
{ name: 'Go + Fiber (Experimental)', value: 'go-fiber', disabled: 'Coming in Phase 6' },
|
|
106
180
|
],
|
|
107
|
-
default: 'express',
|
|
181
|
+
default: lastConfig.backend || 'express',
|
|
108
182
|
},
|
|
109
183
|
{
|
|
110
184
|
type: 'list',
|
|
@@ -117,7 +191,7 @@ async function promptForStack(projectName, options = {}) {
|
|
|
117
191
|
{ name: 'Auth.js (NextAuth)', value: 'authjs' },
|
|
118
192
|
{ name: 'Firebase Auth', value: 'firebase' },
|
|
119
193
|
],
|
|
120
|
-
default: 'jwt',
|
|
194
|
+
default: lastConfig.auth || 'jwt',
|
|
121
195
|
},
|
|
122
196
|
{
|
|
123
197
|
type: 'list',
|
|
@@ -130,7 +204,7 @@ async function promptForStack(projectName, options = {}) {
|
|
|
130
204
|
{ name: 'SQLite (Local)', value: 'sqlite' },
|
|
131
205
|
{ name: 'Supabase DB', value: 'supabase-db' },
|
|
132
206
|
],
|
|
133
|
-
default: 'postgresql',
|
|
207
|
+
default: lastConfig.database || 'postgresql',
|
|
134
208
|
},
|
|
135
209
|
{
|
|
136
210
|
type: 'list',
|
|
@@ -141,24 +215,26 @@ async function promptForStack(projectName, options = {}) {
|
|
|
141
215
|
{ name: 'GraphQL', value: 'graphql' },
|
|
142
216
|
{ name: 'tRPC (Type-safe)', value: 'trpc' },
|
|
143
217
|
],
|
|
144
|
-
default: 'rest',
|
|
218
|
+
default: lastConfig.apiStyle || 'rest',
|
|
145
219
|
},
|
|
146
220
|
{
|
|
147
221
|
type: 'confirm',
|
|
148
222
|
name: 'docker',
|
|
149
223
|
message: 'Include Docker configuration?',
|
|
150
|
-
default: true,
|
|
224
|
+
default: lastConfig.docker ?? true,
|
|
151
225
|
},
|
|
152
226
|
{
|
|
153
227
|
type: 'confirm',
|
|
154
228
|
name: 'multiTenant',
|
|
155
229
|
message: 'Enable multi-tenancy support?',
|
|
156
|
-
default: false,
|
|
230
|
+
default: lastConfig.multiTenant ?? false,
|
|
157
231
|
},
|
|
158
232
|
]);
|
|
159
|
-
|
|
233
|
+
const config = {
|
|
160
234
|
projectName,
|
|
161
235
|
...answers,
|
|
162
236
|
};
|
|
237
|
+
await saveLastConfig(config);
|
|
238
|
+
return config;
|
|
163
239
|
}
|
|
164
240
|
//# sourceMappingURL=prompts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/security.js
CHANGED
|
@@ -1,14 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.generateRandomSecret = generateRandomSecret;
|
|
7
|
-
const crypto_1 = __importDefault(require("crypto"));
|
|
1
|
+
import crypto from 'crypto';
|
|
8
2
|
/**
|
|
9
3
|
* Generates a cryptographically secure random secret string.
|
|
10
4
|
*/
|
|
11
|
-
function generateRandomSecret(bytes = 32) {
|
|
12
|
-
return
|
|
5
|
+
export function generateRandomSecret(bytes = 32) {
|
|
6
|
+
return crypto.randomBytes(bytes).toString('hex');
|
|
13
7
|
}
|
|
14
8
|
//# sourceMappingURL=security.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE;IACnD,OAAO,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACrD,CAAC"}
|
package/dist/utils/validators.js
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.validateStackConfig = validateStackConfig;
|
|
7
|
-
const validate_npm_package_name_1 = __importDefault(require("validate-npm-package-name"));
|
|
8
|
-
function validateStackConfig(config) {
|
|
1
|
+
import validateNpmPackageName from 'validate-npm-package-name';
|
|
2
|
+
export function validateStackConfig(config) {
|
|
9
3
|
const errors = [];
|
|
10
4
|
const warnings = [];
|
|
11
5
|
// Validate project name
|
|
12
|
-
const nameValidation = (
|
|
6
|
+
const nameValidation = validateNpmPackageName(config.projectName);
|
|
13
7
|
if (!nameValidation.validForNewPackages) {
|
|
14
8
|
errors.push(`Invalid project name: ${nameValidation.errors?.join(', ')}`);
|
|
15
9
|
}
|
|
10
|
+
// Next.js pairs best with NestJS for SSR/edge features
|
|
11
|
+
if (config.frontend === 'nextjs' && config.backend === 'express') {
|
|
12
|
+
errors.push('Next.js works best with NestJS backend');
|
|
13
|
+
}
|
|
16
14
|
// tRPC requires TypeScript backend
|
|
17
15
|
if (config.apiStyle === 'trpc') {
|
|
18
16
|
if (config.backend === 'go-fiber') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AACA,OAAO,sBAAsB,MAAM,2BAA2B,CAAC;AAE/D,MAAM,UAAU,mBAAmB,CAAC,MAAmB;IACnD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,wBAAwB;IACxB,MAAM,cAAc,GAAG,sBAAsB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAClE,IAAI,CAAC,cAAc,CAAC,mBAAmB,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,yBAAyB,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,uDAAuD;IACvD,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAC1D,CAAC;IAED,mCAAmC;IACnC,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;QAC/F,CAAC;IACL,CAAC;IAED,wBAAwB;IACxB,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,MAAM,CAAC,OAAO,KAAK,YAAY,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YACnE,QAAQ,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;IACL,CAAC;IAED,qCAAqC;IACrC,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;QAClE,QAAQ,CAAC,IAAI,CAAC,6FAA6F,CAAC,CAAC;IACjH,CAAC;IAED,6BAA6B;IAC7B,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QAChC,QAAQ,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IAED,yBAAyB;IACzB,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACrB,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QACtF,CAAC;IACL,CAAC;IAED,OAAO;QACH,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;QACN,QAAQ;KACX,CAAC;AACN,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "forgestack-os-cli",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "ForgeStack OS CLI - Generate production-ready full-stack SaaS applications",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"import": "./dist/index.js",
|
|
10
|
+
"require": "./dist/index.js"
|
|
11
|
+
},
|
|
12
|
+
"./package.json": "./package.json"
|
|
13
|
+
},
|
|
14
|
+
"type": "module",
|
|
6
15
|
"bin": {
|
|
7
16
|
"forgestack": "./dist/index.js"
|
|
8
17
|
},
|
|
@@ -14,8 +23,10 @@
|
|
|
14
23
|
"scripts": {
|
|
15
24
|
"dev": "tsx watch src/index.ts",
|
|
16
25
|
"build": "tsc",
|
|
17
|
-
"test": "vitest",
|
|
18
|
-
"lint": "eslint src --ext .ts"
|
|
26
|
+
"test": "vitest run",
|
|
27
|
+
"lint": "eslint src --ext .ts",
|
|
28
|
+
"prepare": "npm run build",
|
|
29
|
+
"prepublishOnly": "npm run lint && npm run test && npm run build"
|
|
19
30
|
},
|
|
20
31
|
"keywords": [
|
|
21
32
|
"cli",
|
|
@@ -28,6 +39,17 @@
|
|
|
28
39
|
"url": "https://github.com/halloffame12"
|
|
29
40
|
},
|
|
30
41
|
"license": "MIT",
|
|
42
|
+
"repository": {
|
|
43
|
+
"type": "git",
|
|
44
|
+
"url": "https://github.com/halloffame12/forgestack-os.git"
|
|
45
|
+
},
|
|
46
|
+
"bugs": {
|
|
47
|
+
"url": "https://github.com/halloffame12/forgestack-os/issues"
|
|
48
|
+
},
|
|
49
|
+
"homepage": "https://github.com/halloffame12/forgestack-os#readme",
|
|
50
|
+
"engines": {
|
|
51
|
+
"node": ">=20"
|
|
52
|
+
},
|
|
31
53
|
"dependencies": {
|
|
32
54
|
"chalk": "^4.1.2",
|
|
33
55
|
"commander": "^13.0.0",
|