stackkit-cli 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.
Files changed (64) hide show
  1. package/README.md +119 -0
  2. package/bin/stackkit.js +2 -0
  3. package/dist/commands/add.d.ts +9 -0
  4. package/dist/commands/add.d.ts.map +1 -0
  5. package/dist/commands/add.js +201 -0
  6. package/dist/commands/add.js.map +1 -0
  7. package/dist/commands/init.d.ts +11 -0
  8. package/dist/commands/init.d.ts.map +1 -0
  9. package/dist/commands/init.js +153 -0
  10. package/dist/commands/init.js.map +1 -0
  11. package/dist/commands/list.d.ts +7 -0
  12. package/dist/commands/list.d.ts.map +1 -0
  13. package/dist/commands/list.js +107 -0
  14. package/dist/commands/list.js.map +1 -0
  15. package/dist/index.d.ts +3 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +50 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/types/index.d.ts +65 -0
  20. package/dist/types/index.d.ts.map +1 -0
  21. package/dist/types/index.js +3 -0
  22. package/dist/types/index.js.map +1 -0
  23. package/dist/utils/code-inject.d.ts +15 -0
  24. package/dist/utils/code-inject.d.ts.map +1 -0
  25. package/dist/utils/code-inject.js +71 -0
  26. package/dist/utils/code-inject.js.map +1 -0
  27. package/dist/utils/detect.d.ts +5 -0
  28. package/dist/utils/detect.d.ts.map +1 -0
  29. package/dist/utils/detect.js +79 -0
  30. package/dist/utils/detect.js.map +1 -0
  31. package/dist/utils/env-editor.d.ts +11 -0
  32. package/dist/utils/env-editor.d.ts.map +1 -0
  33. package/dist/utils/env-editor.js +92 -0
  34. package/dist/utils/env-editor.js.map +1 -0
  35. package/dist/utils/files.d.ts +7 -0
  36. package/dist/utils/files.d.ts.map +1 -0
  37. package/dist/utils/files.js +51 -0
  38. package/dist/utils/files.js.map +1 -0
  39. package/dist/utils/json-editor.d.ts +9 -0
  40. package/dist/utils/json-editor.d.ts.map +1 -0
  41. package/dist/utils/json-editor.js +50 -0
  42. package/dist/utils/json-editor.js.map +1 -0
  43. package/dist/utils/logger.d.ts +17 -0
  44. package/dist/utils/logger.d.ts.map +1 -0
  45. package/dist/utils/logger.js +58 -0
  46. package/dist/utils/logger.js.map +1 -0
  47. package/dist/utils/package-manager.d.ts +6 -0
  48. package/dist/utils/package-manager.d.ts.map +1 -0
  49. package/dist/utils/package-manager.js +79 -0
  50. package/dist/utils/package-manager.js.map +1 -0
  51. package/package.json +51 -0
  52. package/src/commands/add.ts +261 -0
  53. package/src/commands/init.ts +182 -0
  54. package/src/commands/list.ts +124 -0
  55. package/src/index.ts +53 -0
  56. package/src/types/index.ts +71 -0
  57. package/src/utils/code-inject.ts +85 -0
  58. package/src/utils/detect.ts +89 -0
  59. package/src/utils/env-editor.ts +127 -0
  60. package/src/utils/files.ts +59 -0
  61. package/src/utils/json-editor.ts +64 -0
  62. package/src/utils/logger.ts +62 -0
  63. package/src/utils/package-manager.ts +85 -0
  64. package/tsconfig.json +9 -0
package/README.md ADDED
@@ -0,0 +1,119 @@
1
+ # StackKit CLI
2
+
3
+ The main CLI package for StackKit - a production-ready project generator and module system.
4
+
5
+ ## Development
6
+
7
+ ### Build
8
+
9
+ ```bash
10
+ pnpm build
11
+ ```
12
+
13
+ ### Watch Mode
14
+
15
+ ```bash
16
+ pnpm dev
17
+ ```
18
+
19
+ ### Test Locally
20
+
21
+ ```bash
22
+ # Link globally
23
+ pnpm link --global
24
+
25
+ # Use it anywhere
26
+ stackkit init my-app
27
+ stackkit list
28
+ stackkit add auth
29
+ ```
30
+
31
+ ## Commands
32
+
33
+ ### `stackkit init [project-name]`
34
+
35
+ Create a new project from a template.
36
+
37
+ **Options:**
38
+
39
+ - `-t, --template <template>` - Template to use
40
+ - `--pm <pm>` - Package manager (npm, yarn, pnpm)
41
+ - `--no-install` - Skip installing dependencies
42
+ - `--no-git` - Skip git initialization
43
+ - `-y, --yes` - Skip prompts and use defaults
44
+
45
+ **Example:**
46
+
47
+ ```bash
48
+ stackkit init my-app --template next-prisma-postgres-shadcn --pm pnpm
49
+ ```
50
+
51
+ ### `stackkit list`
52
+
53
+ List available templates and modules.
54
+
55
+ **Options:**
56
+
57
+ - `-t, --templates` - List only templates
58
+ - `-m, --modules` - List only modules
59
+
60
+ **Example:**
61
+
62
+ ```bash
63
+ stackkit list
64
+ stackkit list --modules
65
+ ```
66
+
67
+ ### `stackkit add <module>`
68
+
69
+ Add a module to your existing project.
70
+
71
+ **Options:**
72
+
73
+ - `--provider <provider>` - Specific provider/variant
74
+ - `--force` - Overwrite existing files
75
+ - `--dry-run` - Show what would be changed
76
+ - `--no-install` - Skip installing dependencies
77
+
78
+ **Example:**
79
+
80
+ ```bash
81
+ stackkit add auth
82
+ stackkit add auth --dry-run
83
+ stackkit add auth --force
84
+ ```
85
+
86
+ ## Architecture
87
+
88
+ ### Commands (`src/commands/`)
89
+
90
+ - `init.ts` - Project initialization
91
+ - `list.ts` - List resources
92
+ - `add.ts` - Add modules
93
+
94
+ ### Utils (`src/utils/`)
95
+
96
+ - `detect.ts` - Project detection (framework, router, language)
97
+ - `files.ts` - File operations (copy, create, read)
98
+ - `package-manager.ts` - Package manager detection and execution
99
+ - `json-editor.ts` - Safe JSON file editing
100
+ - `env-editor.ts` - Environment variable management
101
+ - `code-inject.ts` - Idempotent code injection
102
+ - `logger.ts` - Consistent CLI output
103
+
104
+ ### Types (`src/types/`)
105
+
106
+ TypeScript type definitions for templates, modules, and options.
107
+
108
+ ## Publishing
109
+
110
+ Before publishing to npm:
111
+
112
+ 1. Update version in package.json
113
+ 2. Build the package: `pnpm build`
114
+ 3. Test locally: `pnpm link --global`
115
+ 4. Publish: `npm publish --access public`
116
+
117
+ ## License
118
+
119
+ MIT
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ require('../dist/index.js');
@@ -0,0 +1,9 @@
1
+ interface AddOptions {
2
+ provider?: string;
3
+ force?: boolean;
4
+ dryRun?: boolean;
5
+ install?: boolean;
6
+ }
7
+ export declare function addCommand(module: string, options: AddOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAWA,UAAU,UAAU;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA6GnF"}
@@ -0,0 +1,201 @@
1
+ "use strict";
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.addCommand = addCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ const inquirer_1 = __importDefault(require("inquirer"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const detect_1 = require("../utils/detect");
12
+ const env_editor_1 = require("../utils/env-editor");
13
+ const files_1 = require("../utils/files");
14
+ const logger_1 = require("../utils/logger");
15
+ const package_manager_1 = require("../utils/package-manager");
16
+ async function addCommand(module, options) {
17
+ try {
18
+ const projectRoot = process.cwd();
19
+ // Detect project info
20
+ const spinner = logger_1.logger.startSpinner('Detecting project...');
21
+ const projectInfo = await (0, detect_1.detectProjectInfo)(projectRoot);
22
+ spinner.succeed(`Detected ${projectInfo.framework} (${projectInfo.router} router, ${projectInfo.language})`);
23
+ // Load module metadata
24
+ const modulesDir = path_1.default.join(__dirname, '..', '..', '..', '..', 'modules');
25
+ const moduleMetadata = await loadModuleMetadata(modulesDir, module, options.provider);
26
+ if (!moduleMetadata) {
27
+ logger_1.logger.error(`Module "${module}" not found`);
28
+ process.exit(1);
29
+ }
30
+ // Check if framework is supported
31
+ if (!moduleMetadata.supportedFrameworks.includes(projectInfo.framework)) {
32
+ logger_1.logger.error(`Module "${module}" does not support ${projectInfo.framework}. Supported: ${moduleMetadata.supportedFrameworks.join(', ')}`);
33
+ process.exit(1);
34
+ }
35
+ // Check for conflicts
36
+ if (module === 'auth' && projectInfo.hasAuth && !options.force) {
37
+ logger_1.logger.warn('Auth library already detected in this project');
38
+ const { proceed } = await inquirer_1.default.prompt([
39
+ {
40
+ type: 'confirm',
41
+ name: 'proceed',
42
+ message: 'Continue anyway? (use --force to skip this prompt)',
43
+ default: false,
44
+ },
45
+ ]);
46
+ if (!proceed) {
47
+ logger_1.logger.info('Cancelled');
48
+ process.exit(0);
49
+ }
50
+ }
51
+ if (options.dryRun) {
52
+ logger_1.logger.warn('Dry run mode - no changes will be made');
53
+ logger_1.logger.newLine();
54
+ }
55
+ // Apply module patches
56
+ await applyModulePatches(projectRoot, projectInfo, moduleMetadata, modulesDir, module, options);
57
+ // Add dependencies
58
+ if (Object.keys(moduleMetadata.dependencies).length > 0 && options.install !== false) {
59
+ const deps = Object.entries(moduleMetadata.dependencies).map(([name, version]) => `${name}@${version}`);
60
+ if (!options.dryRun) {
61
+ await (0, package_manager_1.addDependencies)(projectRoot, projectInfo.packageManager, deps, false);
62
+ }
63
+ else {
64
+ logger_1.logger.info(`Would add dependencies: ${deps.join(', ')}`);
65
+ }
66
+ }
67
+ // Add dev dependencies
68
+ if (moduleMetadata.devDependencies &&
69
+ Object.keys(moduleMetadata.devDependencies).length > 0 &&
70
+ options.install !== false) {
71
+ const devDeps = Object.entries(moduleMetadata.devDependencies).map(([name, version]) => `${name}@${version}`);
72
+ if (!options.dryRun) {
73
+ await (0, package_manager_1.addDependencies)(projectRoot, projectInfo.packageManager, devDeps, true);
74
+ }
75
+ else {
76
+ logger_1.logger.info(`Would add dev dependencies: ${devDeps.join(', ')}`);
77
+ }
78
+ }
79
+ // Add environment variables
80
+ if (moduleMetadata.envVars.length > 0) {
81
+ if (!options.dryRun) {
82
+ await (0, env_editor_1.addEnvVariables)(projectRoot, moduleMetadata.envVars, { force: options.force });
83
+ }
84
+ else {
85
+ logger_1.logger.log(` ${chalk_1.default.dim('~')} .env.example`);
86
+ }
87
+ }
88
+ logger_1.logger.newLine();
89
+ logger_1.logger.success(`Added ${chalk_1.default.bold(moduleMetadata.displayName)}`);
90
+ logger_1.logger.newLine();
91
+ // Print next steps
92
+ if (moduleMetadata.envVars.some((v) => v.required)) {
93
+ logger_1.logger.log('Next: Fill in environment variables in .env');
94
+ }
95
+ logger_1.logger.newLine();
96
+ }
97
+ catch (error) {
98
+ logger_1.logger.error(`Failed to add module: ${error.message}`);
99
+ if (error instanceof Error && error.stack) {
100
+ logger_1.logger.log(chalk_1.default.gray(error.stack));
101
+ }
102
+ process.exit(1);
103
+ }
104
+ }
105
+ async function loadModuleMetadata(modulesDir, moduleName, provider) {
106
+ if (!(await fs_extra_1.default.pathExists(modulesDir))) {
107
+ return null;
108
+ }
109
+ // Try to find module in any category
110
+ const categories = await fs_extra_1.default.readdir(modulesDir);
111
+ for (const category of categories) {
112
+ const categoryPath = path_1.default.join(modulesDir, category);
113
+ const stat = await fs_extra_1.default.stat(categoryPath);
114
+ if (!stat.isDirectory())
115
+ continue;
116
+ // Get all modules in this category
117
+ const moduleDirs = await fs_extra_1.default.readdir(categoryPath);
118
+ for (const moduleDir of moduleDirs) {
119
+ const modulePath = path_1.default.join(categoryPath, moduleDir);
120
+ const moduleStat = await fs_extra_1.default.stat(modulePath);
121
+ if (!moduleStat.isDirectory())
122
+ continue;
123
+ const metadataPath = path_1.default.join(modulePath, 'module.json');
124
+ if (await fs_extra_1.default.pathExists(metadataPath)) {
125
+ const metadata = await fs_extra_1.default.readJSON(metadataPath);
126
+ // Match by module name or provider
127
+ if (metadata.name === moduleName || (provider && moduleDir === provider)) {
128
+ return metadata;
129
+ }
130
+ }
131
+ }
132
+ }
133
+ return null;
134
+ }
135
+ async function applyModulePatches(projectRoot, projectInfo, moduleMetadata, modulesDir, moduleName, options) {
136
+ const moduleBasePath = await findModulePath(modulesDir, moduleName, options.provider);
137
+ if (!moduleBasePath) {
138
+ throw new Error('Module files not found');
139
+ }
140
+ for (const patch of moduleMetadata.patches) {
141
+ if (patch.type === 'create-file') {
142
+ const filePatch = patch;
143
+ // Check conditions
144
+ if (filePatch.condition) {
145
+ if (filePatch.condition.router && filePatch.condition.router !== projectInfo.router) {
146
+ continue; // Skip this patch
147
+ }
148
+ if (filePatch.condition.language && filePatch.condition.language !== projectInfo.language) {
149
+ continue; // Skip this patch
150
+ }
151
+ }
152
+ const sourceFile = path_1.default.join(moduleBasePath, 'files', filePatch.source);
153
+ let destFile = path_1.default.join(projectRoot, filePatch.destination);
154
+ // Replace placeholders in destination
155
+ destFile = destFile
156
+ .replace('{{router}}', (0, detect_1.getRouterBasePath)(projectInfo))
157
+ .replace('{{lib}}', (0, detect_1.getLibPath)(projectInfo));
158
+ if (!options.dryRun) {
159
+ if (await (0, files_1.fileExists)(sourceFile)) {
160
+ const content = await fs_extra_1.default.readFile(sourceFile, 'utf-8');
161
+ await (0, files_1.createFile)(destFile, content, { force: options.force });
162
+ const relativePath = path_1.default.relative(projectRoot, destFile);
163
+ logger_1.logger.log(` ${chalk_1.default.green('+')} ${relativePath}`);
164
+ }
165
+ else {
166
+ logger_1.logger.warn(`Source file not found: ${filePatch.source}`);
167
+ }
168
+ }
169
+ else {
170
+ const relativePath = path_1.default.relative(projectRoot, destFile);
171
+ logger_1.logger.log(` ${chalk_1.default.dim('+')} ${relativePath}`);
172
+ }
173
+ }
174
+ }
175
+ }
176
+ async function findModulePath(modulesDir, moduleName, provider) {
177
+ const categories = await fs_extra_1.default.readdir(modulesDir);
178
+ for (const category of categories) {
179
+ const categoryPath = path_1.default.join(modulesDir, category);
180
+ const stat = await fs_extra_1.default.stat(categoryPath);
181
+ if (!stat.isDirectory())
182
+ continue;
183
+ const moduleDirs = await fs_extra_1.default.readdir(categoryPath);
184
+ for (const moduleDir of moduleDirs) {
185
+ const modulePath = path_1.default.join(categoryPath, moduleDir);
186
+ const moduleStat = await fs_extra_1.default.stat(modulePath);
187
+ if (!moduleStat.isDirectory())
188
+ continue;
189
+ const metadataPath = path_1.default.join(modulePath, 'module.json');
190
+ if (await fs_extra_1.default.pathExists(metadataPath)) {
191
+ const metadata = await fs_extra_1.default.readJSON(metadataPath);
192
+ // Match by module name or provider
193
+ if (metadata.name === moduleName || (provider && moduleDir === provider)) {
194
+ return modulePath;
195
+ }
196
+ }
197
+ }
198
+ }
199
+ return null;
200
+ }
201
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { PackageManager } from '../utils/package-manager';
2
+ interface InitOptions {
3
+ template?: string;
4
+ pm?: PackageManager;
5
+ install?: boolean;
6
+ git?: boolean;
7
+ yes?: boolean;
8
+ }
9
+ export declare function initCommand(projectName: string | undefined, options: InitOptions): Promise<void>;
10
+ export {};
11
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAQA,OAAO,EAAgC,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAExF,UAAU,WAAW;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,cAAc,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CA6If"}
@@ -0,0 +1,153 @@
1
+ "use strict";
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.initCommand = initCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ const inquirer_1 = __importDefault(require("inquirer"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const validate_npm_package_name_1 = __importDefault(require("validate-npm-package-name"));
12
+ const files_1 = require("../utils/files");
13
+ const logger_1 = require("../utils/logger");
14
+ const package_manager_1 = require("../utils/package-manager");
15
+ async function initCommand(projectName, options) {
16
+ try {
17
+ // Validate package manager option
18
+ if (options.pm && !['npm', 'yarn', 'pnpm'].includes(options.pm)) {
19
+ logger_1.logger.error(`Invalid package manager: ${options.pm}. Use npm, yarn, or pnpm.`);
20
+ process.exit(1);
21
+ }
22
+ // Get available templates
23
+ const templatesDir = path_1.default.join(__dirname, '..', '..', '..', '..', 'templates');
24
+ const templates = await getAvailableTemplates(templatesDir);
25
+ if (templates.length === 0) {
26
+ logger_1.logger.error('No templates found');
27
+ process.exit(1);
28
+ }
29
+ // Prompt for project details if not using --yes
30
+ let answers;
31
+ if (options.yes) {
32
+ answers = {
33
+ projectName: projectName || 'my-app',
34
+ template: options.template || templates[0].name,
35
+ packageManager: options.pm || 'pnpm',
36
+ install: options.install !== false,
37
+ git: options.git !== false,
38
+ };
39
+ }
40
+ else {
41
+ const prompted = await inquirer_1.default.prompt([
42
+ {
43
+ type: 'input',
44
+ name: 'projectName',
45
+ message: 'Project name:',
46
+ default: projectName || 'my-app',
47
+ when: !projectName,
48
+ validate: (input) => {
49
+ const validation = (0, validate_npm_package_name_1.default)(input);
50
+ if (!validation.validForNewPackages) {
51
+ return validation.errors?.[0] || 'Invalid package name';
52
+ }
53
+ return true;
54
+ },
55
+ },
56
+ {
57
+ type: 'list',
58
+ name: 'template',
59
+ message: 'Select a template:',
60
+ choices: templates.map((t) => ({
61
+ name: `${t.displayName} - ${t.description}`,
62
+ value: t.name,
63
+ })),
64
+ when: !options.template,
65
+ },
66
+ {
67
+ type: 'list',
68
+ name: 'packageManager',
69
+ message: 'Select a package manager:',
70
+ choices: ['pnpm', 'npm', 'yarn'],
71
+ default: 'pnpm',
72
+ when: !options.pm,
73
+ },
74
+ {
75
+ type: 'confirm',
76
+ name: 'install',
77
+ message: 'Install dependencies?',
78
+ default: true,
79
+ when: options.install !== false,
80
+ },
81
+ {
82
+ type: 'confirm',
83
+ name: 'git',
84
+ message: 'Initialize git repository?',
85
+ default: true,
86
+ when: options.git !== false,
87
+ },
88
+ ]);
89
+ answers = {
90
+ projectName: projectName || prompted.projectName,
91
+ template: options.template || prompted.template,
92
+ packageManager: options.pm || prompted.packageManager,
93
+ install: options.install !== false && (prompted.install ?? true),
94
+ git: options.git !== false && (prompted.git ?? true),
95
+ };
96
+ }
97
+ const targetDir = path_1.default.join(process.cwd(), answers.projectName);
98
+ // Check if directory exists
99
+ if (await fs_extra_1.default.pathExists(targetDir)) {
100
+ logger_1.logger.error(`Directory "${answers.projectName}" already exists`);
101
+ logger_1.logger.info('Please choose a different name or remove the existing directory.');
102
+ process.exit(1);
103
+ }
104
+ // Validate template exists
105
+ const selectedTemplate = templates.find((t) => t.name === answers.template);
106
+ if (!selectedTemplate) {
107
+ logger_1.logger.error(`Template "${answers.template}" not found`);
108
+ process.exit(1);
109
+ }
110
+ logger_1.logger.newLine();
111
+ // Copy template
112
+ const templatePath = path_1.default.join(templatesDir, answers.template);
113
+ await (0, files_1.copyTemplate)(templatePath, targetDir, answers.projectName);
114
+ // Install dependencies
115
+ if (answers.install) {
116
+ await (0, package_manager_1.installDependencies)(targetDir, answers.packageManager);
117
+ }
118
+ // Initialize git
119
+ if (answers.git) {
120
+ await (0, package_manager_1.initGit)(targetDir);
121
+ }
122
+ logger_1.logger.newLine();
123
+ logger_1.logger.success(`Created ${chalk_1.default.bold(answers.projectName)}`);
124
+ logger_1.logger.newLine();
125
+ logger_1.logger.log(`Next steps:`);
126
+ logger_1.logger.log(` ${chalk_1.default.cyan('cd')} ${answers.projectName}`);
127
+ if (!answers.install) {
128
+ logger_1.logger.log(` ${chalk_1.default.cyan(answers.packageManager)} install`);
129
+ }
130
+ logger_1.logger.log(` ${chalk_1.default.cyan(answers.packageManager)} ${answers.packageManager === 'npm' ? 'run ' : ''}dev`);
131
+ logger_1.logger.newLine();
132
+ }
133
+ catch (error) {
134
+ logger_1.logger.error(`Failed to create project: ${error.message}`);
135
+ process.exit(1);
136
+ }
137
+ }
138
+ async function getAvailableTemplates(templatesDir) {
139
+ if (!(await fs_extra_1.default.pathExists(templatesDir))) {
140
+ return [];
141
+ }
142
+ const templateDirs = await fs_extra_1.default.readdir(templatesDir);
143
+ const templates = [];
144
+ for (const dir of templateDirs) {
145
+ const metadataPath = path_1.default.join(templatesDir, dir, 'template.json');
146
+ if (await fs_extra_1.default.pathExists(metadataPath)) {
147
+ const metadata = await fs_extra_1.default.readJSON(metadataPath);
148
+ templates.push(metadata);
149
+ }
150
+ }
151
+ return templates;
152
+ }
153
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ interface ListOptions {
2
+ templates?: boolean;
3
+ modules?: boolean;
4
+ }
5
+ export declare function listCommand(options: ListOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAMA,UAAU,WAAW;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiErE"}
@@ -0,0 +1,107 @@
1
+ "use strict";
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.listCommand = listCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const logger_1 = require("../utils/logger");
11
+ async function listCommand(options) {
12
+ const showTemplates = !options.modules || options.templates;
13
+ const showModules = !options.templates || options.modules;
14
+ try {
15
+ // List templates
16
+ if (showTemplates) {
17
+ const templatesDir = path_1.default.join(__dirname, '..', '..', '..', '..', 'templates');
18
+ const templates = await getAvailableTemplates(templatesDir);
19
+ logger_1.logger.log(chalk_1.default.bold('📦 Templates'));
20
+ logger_1.logger.newLine();
21
+ if (templates.length === 0) {
22
+ logger_1.logger.warn(' No templates found');
23
+ }
24
+ else {
25
+ for (const template of templates) {
26
+ logger_1.logger.log(chalk_1.default.bold(` ${template.displayName}`));
27
+ logger_1.logger.log(chalk_1.default.gray(` ${template.description}`));
28
+ logger_1.logger.log(chalk_1.default.blue(` Command: stackkit init --template ${template.name}`));
29
+ logger_1.logger.log(chalk_1.default.gray(` Features: ${template.features.join(', ')}`));
30
+ logger_1.logger.newLine();
31
+ }
32
+ }
33
+ }
34
+ // List modules
35
+ if (showModules) {
36
+ const modulesDir = path_1.default.join(__dirname, '..', '..', '..', '..', 'modules');
37
+ const modules = await getAvailableModules(modulesDir);
38
+ logger_1.logger.log(chalk_1.default.bold('🔧 Modules'));
39
+ logger_1.logger.newLine();
40
+ if (modules.length === 0) {
41
+ logger_1.logger.warn(' No modules found');
42
+ }
43
+ else {
44
+ // Group by category
45
+ const grouped = modules.reduce((acc, mod) => {
46
+ if (!acc[mod.category]) {
47
+ acc[mod.category] = [];
48
+ }
49
+ acc[mod.category].push(mod);
50
+ return acc;
51
+ }, {});
52
+ for (const [category, mods] of Object.entries(grouped)) {
53
+ logger_1.logger.log(chalk_1.default.yellow(` ${category.toUpperCase()}:`));
54
+ for (const mod of mods) {
55
+ logger_1.logger.log(chalk_1.default.bold(` ${mod.displayName}`));
56
+ logger_1.logger.log(chalk_1.default.gray(` ${mod.description}`));
57
+ logger_1.logger.log(chalk_1.default.blue(` Command: stackkit add ${mod.name}`));
58
+ logger_1.logger.log(chalk_1.default.gray(` Supports: ${mod.supportedFrameworks.join(', ')}`));
59
+ logger_1.logger.newLine();
60
+ }
61
+ }
62
+ }
63
+ }
64
+ }
65
+ catch (error) {
66
+ logger_1.logger.error(`Failed to list resources: ${error.message}`);
67
+ process.exit(1);
68
+ }
69
+ }
70
+ async function getAvailableTemplates(templatesDir) {
71
+ if (!(await fs_extra_1.default.pathExists(templatesDir))) {
72
+ return [];
73
+ }
74
+ const templateDirs = await fs_extra_1.default.readdir(templatesDir);
75
+ const templates = [];
76
+ for (const dir of templateDirs) {
77
+ const metadataPath = path_1.default.join(templatesDir, dir, 'template.json');
78
+ if (await fs_extra_1.default.pathExists(metadataPath)) {
79
+ const metadata = await fs_extra_1.default.readJSON(metadataPath);
80
+ templates.push(metadata);
81
+ }
82
+ }
83
+ return templates;
84
+ }
85
+ async function getAvailableModules(modulesDir) {
86
+ if (!(await fs_extra_1.default.pathExists(modulesDir))) {
87
+ return [];
88
+ }
89
+ const modules = [];
90
+ const categories = await fs_extra_1.default.readdir(modulesDir);
91
+ for (const category of categories) {
92
+ const categoryPath = path_1.default.join(modulesDir, category);
93
+ const stat = await fs_extra_1.default.stat(categoryPath);
94
+ if (!stat.isDirectory())
95
+ continue;
96
+ const moduleDirs = await fs_extra_1.default.readdir(categoryPath);
97
+ for (const moduleDir of moduleDirs) {
98
+ const metadataPath = path_1.default.join(categoryPath, moduleDir, 'module.json');
99
+ if (await fs_extra_1.default.pathExists(metadataPath)) {
100
+ const metadata = await fs_extra_1.default.readJSON(metadataPath);
101
+ modules.push(metadata);
102
+ }
103
+ }
104
+ }
105
+ return modules;
106
+ }
107
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}