@chimerai/cli 0.2.73
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 +21 -0
- package/README.md +293 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +317 -0
- package/dist/commands/add.d.ts +11 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +2126 -0
- package/dist/commands/create.d.ts +12 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +1703 -0
- package/dist/commands/deploy.d.ts +11 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +219 -0
- package/dist/commands/dev.d.ts +17 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +206 -0
- package/dist/commands/doctor.d.ts +11 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +728 -0
- package/dist/commands/generate.d.ts +19 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +429 -0
- package/dist/commands/init.d.ts +11 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +269 -0
- package/dist/commands/list.d.ts +12 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +328 -0
- package/dist/commands/migrate.d.ts +14 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +197 -0
- package/dist/commands/plugin.d.ts +10 -0
- package/dist/commands/plugin.d.ts.map +1 -0
- package/dist/commands/plugin.js +239 -0
- package/dist/commands/remove.d.ts +11 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +472 -0
- package/dist/commands/secret.d.ts +12 -0
- package/dist/commands/secret.d.ts.map +1 -0
- package/dist/commands/secret.js +102 -0
- package/dist/commands/setup.d.ts +9 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +788 -0
- package/dist/commands/update.d.ts +14 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +211 -0
- package/dist/commands/use.d.ts +9 -0
- package/dist/commands/use.d.ts.map +1 -0
- package/dist/commands/use.js +51 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/license.d.ts +55 -0
- package/dist/license.d.ts.map +1 -0
- package/dist/license.js +258 -0
- package/dist/scanner.d.ts +31 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +113 -0
- package/dist/schema-manager.d.ts +26 -0
- package/dist/schema-manager.d.ts.map +1 -0
- package/dist/schema-manager.js +132 -0
- package/dist/templates/admin.d.ts +49 -0
- package/dist/templates/admin.d.ts.map +1 -0
- package/dist/templates/admin.js +1358 -0
- package/dist/templates/ai-routes.d.ts +17 -0
- package/dist/templates/ai-routes.d.ts.map +1 -0
- package/dist/templates/ai-routes.js +1130 -0
- package/dist/templates/ai-service-tools.d.ts +22 -0
- package/dist/templates/ai-service-tools.d.ts.map +1 -0
- package/dist/templates/ai-service-tools.js +1424 -0
- package/dist/templates/ai-service.d.ts +66 -0
- package/dist/templates/ai-service.d.ts.map +1 -0
- package/dist/templates/ai-service.js +2202 -0
- package/dist/templates/api-routes.d.ts +108 -0
- package/dist/templates/api-routes.d.ts.map +1 -0
- package/dist/templates/api-routes.js +1219 -0
- package/dist/templates/auth.d.ts +48 -0
- package/dist/templates/auth.d.ts.map +1 -0
- package/dist/templates/auth.js +381 -0
- package/dist/templates/billing.d.ts +44 -0
- package/dist/templates/billing.d.ts.map +1 -0
- package/dist/templates/billing.js +551 -0
- package/dist/templates/chat.d.ts +63 -0
- package/dist/templates/chat.d.ts.map +1 -0
- package/dist/templates/chat.js +1979 -0
- package/dist/templates/components.d.ts +22 -0
- package/dist/templates/components.d.ts.map +1 -0
- package/dist/templates/components.js +672 -0
- package/dist/templates/config.d.ts +6 -0
- package/dist/templates/config.d.ts.map +1 -0
- package/dist/templates/config.js +86 -0
- package/dist/templates/docker.d.ts +25 -0
- package/dist/templates/docker.d.ts.map +1 -0
- package/dist/templates/docker.js +165 -0
- package/dist/templates/gdpr.d.ts +16 -0
- package/dist/templates/gdpr.d.ts.map +1 -0
- package/dist/templates/gdpr.js +259 -0
- package/dist/templates/index.d.ts +77 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +339 -0
- package/dist/templates/layout.d.ts +67 -0
- package/dist/templates/layout.d.ts.map +1 -0
- package/dist/templates/layout.js +670 -0
- package/dist/templates/mfa.d.ts +23 -0
- package/dist/templates/mfa.d.ts.map +1 -0
- package/dist/templates/mfa.js +353 -0
- package/dist/templates/middleware.d.ts +12 -0
- package/dist/templates/middleware.d.ts.map +1 -0
- package/dist/templates/middleware.js +116 -0
- package/dist/templates/prisma.d.ts +35 -0
- package/dist/templates/prisma.d.ts.map +1 -0
- package/dist/templates/prisma.js +724 -0
- package/dist/templates/provider-routes.d.ts +21 -0
- package/dist/templates/provider-routes.d.ts.map +1 -0
- package/dist/templates/provider-routes.js +1203 -0
- package/dist/templates/rag.d.ts +48 -0
- package/dist/templates/rag.d.ts.map +1 -0
- package/dist/templates/rag.js +532 -0
- package/dist/templates/widget.d.ts +64 -0
- package/dist/templates/widget.d.ts.map +1 -0
- package/dist/templates/widget.js +1360 -0
- package/dist/utils/provider-db.d.ts +63 -0
- package/dist/utils/provider-db.d.ts.map +1 -0
- package/dist/utils/provider-db.js +300 -0
- package/dist/utils.d.ts +78 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +330 -0
- package/package.json +60 -0
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Init Command - Initialize RBAC or complete project
|
|
4
|
+
* REFACTORED: Uses generic installFeature() instead of individual install functions (PHASE 2.1)
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
40
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
41
|
+
};
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.initCommand = initCommand;
|
|
44
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
45
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
46
|
+
const ora_1 = __importDefault(require("ora"));
|
|
47
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
48
|
+
const path_1 = __importDefault(require("path"));
|
|
49
|
+
const templates = __importStar(require("../templates/index.js"));
|
|
50
|
+
const utils_js_1 = require("../utils.js");
|
|
51
|
+
/**
|
|
52
|
+
* Feature configurations - centralized, eliminates 5 separate install* functions
|
|
53
|
+
* Reduces code from 337 to ~150 lines through abstraction
|
|
54
|
+
*/
|
|
55
|
+
const FEATURE_CONFIGS = {
|
|
56
|
+
rbac: {
|
|
57
|
+
name: 'rbac',
|
|
58
|
+
displayName: 'RBAC (Role-Based Access Control)',
|
|
59
|
+
description: 'Complete role and permission management',
|
|
60
|
+
files: [
|
|
61
|
+
{ template: 'rbac/schema', target: 'prisma/schema.prisma' },
|
|
62
|
+
{ template: 'rbac/api', target: 'app/api/admin' },
|
|
63
|
+
{ template: 'rbac/pages', target: 'app/admin' },
|
|
64
|
+
],
|
|
65
|
+
dependencies: {
|
|
66
|
+
// RBAC code is generated inline ā no external packages needed for standalone projects
|
|
67
|
+
},
|
|
68
|
+
postInstallMessage: 'RBAC installed successfully',
|
|
69
|
+
},
|
|
70
|
+
auth: {
|
|
71
|
+
name: 'auth',
|
|
72
|
+
displayName: 'Authentication (NextAuth)',
|
|
73
|
+
description: 'NextAuth.js authentication configuration',
|
|
74
|
+
files: [{ template: 'auth/auth', target: 'lib/auth.ts' }],
|
|
75
|
+
dependencies: {
|
|
76
|
+
'next-auth': '^4.24.7',
|
|
77
|
+
'@auth/prisma-adapter': '^2.11.1',
|
|
78
|
+
},
|
|
79
|
+
postInstallMessage: 'Authentication installed successfully',
|
|
80
|
+
},
|
|
81
|
+
chat: {
|
|
82
|
+
name: 'chat',
|
|
83
|
+
displayName: 'AI Chat Interface',
|
|
84
|
+
description: 'Streaming chat interface with model support',
|
|
85
|
+
files: [
|
|
86
|
+
{ template: 'chat/page', target: 'app/chat/page.tsx' },
|
|
87
|
+
{ template: 'chat/streaming', target: 'components/StreamingChat.tsx' },
|
|
88
|
+
{ template: 'chat/stream-api', target: 'app/api/v1/chat/stream/route.ts' },
|
|
89
|
+
{ template: 'chat/api', target: 'app/api/chat/route.ts' },
|
|
90
|
+
],
|
|
91
|
+
dependencies: {
|
|
92
|
+
openai: '^4.0.0',
|
|
93
|
+
'@anthropic-ai/sdk': '^0.27.0',
|
|
94
|
+
},
|
|
95
|
+
envVars: [
|
|
96
|
+
{ key: 'OPENAI_API_KEY', description: 'OpenAI API key' },
|
|
97
|
+
{ key: 'ANTHROPIC_API_KEY', description: 'Anthropic API key (optional)' },
|
|
98
|
+
],
|
|
99
|
+
postInstallMessage: 'Chat interface installed\n š” Run: pnpm install && chimerai setup providers',
|
|
100
|
+
},
|
|
101
|
+
billing: {
|
|
102
|
+
name: 'billing',
|
|
103
|
+
displayName: 'Billing & Subscriptions',
|
|
104
|
+
description: 'Stripe integration for billing',
|
|
105
|
+
files: [
|
|
106
|
+
{ template: 'billing/page', target: 'app/billing/page.tsx' },
|
|
107
|
+
{ template: 'billing/stripe-lib', target: 'lib/stripe.ts' },
|
|
108
|
+
{ template: 'billing/subscription-api', target: 'app/api/billing/subscription/route.ts' },
|
|
109
|
+
{ template: 'billing/checkout-api', target: 'app/api/billing/checkout/route.ts' },
|
|
110
|
+
{ template: 'billing/portal-api', target: 'app/api/billing/portal/route.ts' },
|
|
111
|
+
{ template: 'billing/webhook', target: 'app/api/webhooks/stripe/route.ts' },
|
|
112
|
+
],
|
|
113
|
+
dependencies: {
|
|
114
|
+
stripe: '^14.0.0',
|
|
115
|
+
},
|
|
116
|
+
envVars: [
|
|
117
|
+
{ key: 'STRIPE_PUBLIC_KEY', description: 'Stripe publishable key' },
|
|
118
|
+
{ key: 'STRIPE_SECRET_KEY', description: 'Stripe secret key' },
|
|
119
|
+
{ key: 'STRIPE_WEBHOOK_SECRET', description: 'Stripe webhook signing secret' },
|
|
120
|
+
],
|
|
121
|
+
postInstallMessage: 'Billing system installed\n š” Run: pnpm install && chimerai setup stripe',
|
|
122
|
+
},
|
|
123
|
+
rag: {
|
|
124
|
+
name: 'rag',
|
|
125
|
+
displayName: 'RAG (Document Q&A)',
|
|
126
|
+
description: 'Retrieval-Augmented Generation for document processing',
|
|
127
|
+
files: [
|
|
128
|
+
{ template: 'rag/rag-lib', target: 'lib/rag.ts' },
|
|
129
|
+
{ template: 'rag/page', target: 'app/rag/page.tsx' },
|
|
130
|
+
{ template: 'rag/upload-api', target: 'app/api/rag/route.ts' },
|
|
131
|
+
{ template: 'rag/query-api', target: 'app/api/rag/query/route.ts' },
|
|
132
|
+
],
|
|
133
|
+
dependencies: {
|
|
134
|
+
langchain: '^0.3.0',
|
|
135
|
+
'@langchain/openai': '^0.3.0',
|
|
136
|
+
'pdf-parse': '^1.1.1',
|
|
137
|
+
},
|
|
138
|
+
envVars: [{ key: 'VECTOR_STORE_URL', description: 'Vector database connection URL' }],
|
|
139
|
+
postInstallMessage: 'RAG system installed\n š” Run: pnpm install && chimerai setup openai\n Note: Ensure vector storage (e.g pgvector) is configured',
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
/**
|
|
143
|
+
* Generic feature installation function (PHASE 2.1 refactoring)
|
|
144
|
+
* Replaces 5 separate installRBAC/installAuth/installChat/etc functions
|
|
145
|
+
*/
|
|
146
|
+
async function installFeature(config, targetDir) {
|
|
147
|
+
const spinner = (0, ora_1.default)(`Installing ${config.displayName}...`).start();
|
|
148
|
+
try {
|
|
149
|
+
// 1. Update package.json dependencies
|
|
150
|
+
const packageJsonPath = path_1.default.join(targetDir, 'package.json');
|
|
151
|
+
if (fs_extra_1.default.existsSync(packageJsonPath)) {
|
|
152
|
+
const packageJson = await fs_extra_1.default.readJson(packageJsonPath);
|
|
153
|
+
packageJson.dependencies = packageJson.dependencies || {};
|
|
154
|
+
packageJson.devDependencies = packageJson.devDependencies || {};
|
|
155
|
+
Object.entries(config.dependencies).forEach(([dep, version]) => {
|
|
156
|
+
packageJson.dependencies[dep] = packageJson.dependencies[dep] || version;
|
|
157
|
+
});
|
|
158
|
+
if (config.devDependencies) {
|
|
159
|
+
Object.entries(config.devDependencies).forEach(([dep, version]) => {
|
|
160
|
+
packageJson.devDependencies[dep] = packageJson.devDependencies[dep] || version;
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
await fs_extra_1.default.writeJson(packageJsonPath, packageJson, { spaces: 2 });
|
|
164
|
+
}
|
|
165
|
+
// 2. Create files from templates
|
|
166
|
+
for (const file of config.files) {
|
|
167
|
+
const targetPath = path_1.default.join(targetDir, file.target);
|
|
168
|
+
const dirPath = path_1.default.dirname(targetPath);
|
|
169
|
+
await fs_extra_1.default.ensureDir(dirPath);
|
|
170
|
+
const content = generateTemplateContent(file.template, config.name);
|
|
171
|
+
await fs_extra_1.default.writeFile(targetPath, content);
|
|
172
|
+
}
|
|
173
|
+
// 3. Log success and env vars
|
|
174
|
+
spinner.succeed(chalk_1.default.green(config.postInstallMessage));
|
|
175
|
+
if (config.envVars && config.envVars.length > 0) {
|
|
176
|
+
console.log(chalk_1.default.yellow('\n Environment variables to configure:'));
|
|
177
|
+
config.envVars.forEach((envVar) => {
|
|
178
|
+
console.log(chalk_1.default.gray(` - ${envVar.key}: ${envVar.description}`));
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
console.log(chalk_1.default.cyan('\n Files created:'));
|
|
182
|
+
config.files.forEach((file) => {
|
|
183
|
+
console.log(chalk_1.default.cyan(` ā ${file.target}`));
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
spinner.fail(chalk_1.default.red(`Failed to install ${config.displayName}`));
|
|
188
|
+
console.error(error.message);
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Template name ā generator function mapping
|
|
194
|
+
* Connects FeatureConfig template names to actual inline generators
|
|
195
|
+
*/
|
|
196
|
+
const TEMPLATE_GENERATORS = {
|
|
197
|
+
// RBAC
|
|
198
|
+
'rbac/schema': () => templates.generatePrismaSchema(),
|
|
199
|
+
'rbac/api': () => templates.generateAdminUsersRoute(),
|
|
200
|
+
'rbac/pages': () => templates.generateAdminDashboardPage(),
|
|
201
|
+
// Auth
|
|
202
|
+
'auth/auth': () => templates.generateAuthLib(),
|
|
203
|
+
// Chat
|
|
204
|
+
'chat/page': () => templates.generateChatPage(),
|
|
205
|
+
'chat/stream-api': () => templates.generateChatStreamRouteWithPersistence(),
|
|
206
|
+
// Billing
|
|
207
|
+
'billing/page': () => templates.generateBillingPage(),
|
|
208
|
+
'billing/stripe-lib': () => templates.generateStripeLib(),
|
|
209
|
+
'billing/subscription-api': () => templates.generateSubscriptionRoute(),
|
|
210
|
+
'billing/checkout-api': () => templates.generateCheckoutRoute(),
|
|
211
|
+
'billing/portal-api': () => templates.generatePortalRoute(),
|
|
212
|
+
'billing/webhook': () => templates.generateStripeWebhookRoute(),
|
|
213
|
+
// RAG
|
|
214
|
+
'rag/rag-lib': () => templates.generateRagLib(),
|
|
215
|
+
'rag/page': () => templates.generateRagPage(),
|
|
216
|
+
'rag/upload-api': () => templates.generateRagUploadRoute(),
|
|
217
|
+
'rag/query-api': () => templates.generateRagQueryRoute(),
|
|
218
|
+
};
|
|
219
|
+
function generateTemplateContent(templateName, _feature) {
|
|
220
|
+
const generator = TEMPLATE_GENERATORS[templateName];
|
|
221
|
+
if (generator) {
|
|
222
|
+
return generator();
|
|
223
|
+
}
|
|
224
|
+
// Fallback: return a minimal placeholder with header comment
|
|
225
|
+
return `// @chimerai component=${_feature} version=1.0.0\n// Template: ${templateName}\n`;
|
|
226
|
+
}
|
|
227
|
+
async function initCommand(feature, options) {
|
|
228
|
+
console.log(chalk_1.default.bold.cyan('\nš ChimerAI Initialization Wizard\n'));
|
|
229
|
+
const targetDir = (0, utils_js_1.resolveTargetDir)(options.dir);
|
|
230
|
+
let selectedFeatures = [];
|
|
231
|
+
if (!options.yes) {
|
|
232
|
+
const featureChoices = Object.values(FEATURE_CONFIGS).map((config) => ({
|
|
233
|
+
name: `${config.displayName} - ${config.description}`,
|
|
234
|
+
value: config.name,
|
|
235
|
+
checked: config.name === 'rbac' || config.name === 'auth',
|
|
236
|
+
}));
|
|
237
|
+
const answers = await inquirer_1.default.prompt([
|
|
238
|
+
{
|
|
239
|
+
type: 'checkbox',
|
|
240
|
+
name: 'features',
|
|
241
|
+
message: 'Which features would you like to install?',
|
|
242
|
+
choices: featureChoices,
|
|
243
|
+
},
|
|
244
|
+
]);
|
|
245
|
+
selectedFeatures = answers.features;
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
selectedFeatures = feature === 'all' ? ['rbac', 'auth'] : [feature];
|
|
249
|
+
}
|
|
250
|
+
console.log(chalk_1.default.green('\nā
Installing features:'), selectedFeatures.join(', '));
|
|
251
|
+
for (const featureName of selectedFeatures) {
|
|
252
|
+
const config = FEATURE_CONFIGS[featureName];
|
|
253
|
+
if (config) {
|
|
254
|
+
await installFeature(config, targetDir);
|
|
255
|
+
console.log('');
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
console.log(chalk_1.default.red(`ā Unknown feature: ${featureName}`));
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
console.log(chalk_1.default.bold.green('\n⨠Installation complete!\n'));
|
|
262
|
+
console.log(chalk_1.default.cyan('Next steps:'));
|
|
263
|
+
console.log(chalk_1.default.white(' 1. Run: pnpm install'));
|
|
264
|
+
console.log(chalk_1.default.white(' 2. Configure your .env file'));
|
|
265
|
+
console.log(chalk_1.default.white(' 3. Run: pnpm db:push'));
|
|
266
|
+
console.log(chalk_1.default.white(' 4. Run: pnpm dev\n'));
|
|
267
|
+
// Register project in global registry
|
|
268
|
+
(0, utils_js_1.registerProject)(path_1.default.basename(targetDir), targetDir);
|
|
269
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List Command - Show installed and available components
|
|
3
|
+
*/
|
|
4
|
+
interface ListOptions {
|
|
5
|
+
dir: string;
|
|
6
|
+
json: boolean;
|
|
7
|
+
installed: boolean;
|
|
8
|
+
available: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function listCommand(options: ListOptions): Promise<void>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,UAAU,WAAW;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAmLD,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,iBAkIrD"}
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* List Command - Show installed and available components
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.listCommand = listCommand;
|
|
10
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
11
|
+
const ora_1 = __importDefault(require("ora"));
|
|
12
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
const utils_js_1 = require("../utils.js");
|
|
15
|
+
const ai_service_js_1 = require("../templates/ai-service.js");
|
|
16
|
+
const license_js_1 = require("../license.js");
|
|
17
|
+
const COMPONENT_REGISTRY = [
|
|
18
|
+
{
|
|
19
|
+
name: 'auth',
|
|
20
|
+
description: 'NextAuth authentication system',
|
|
21
|
+
category: 'Core',
|
|
22
|
+
dependencies: [],
|
|
23
|
+
files: [
|
|
24
|
+
'app/api/auth/[...nextauth]/route.ts',
|
|
25
|
+
'app/login/page.tsx',
|
|
26
|
+
'components/SessionProvider.tsx',
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: 'users-table',
|
|
31
|
+
description: 'Users management CRUD',
|
|
32
|
+
category: 'Admin',
|
|
33
|
+
dependencies: ['auth'],
|
|
34
|
+
files: ['app/admin/users/page.tsx', 'app/api/admin/users/route.ts'],
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: 'roles-table',
|
|
38
|
+
description: 'Roles management CRUD',
|
|
39
|
+
category: 'Admin',
|
|
40
|
+
dependencies: ['auth'],
|
|
41
|
+
files: ['app/admin/roles/page.tsx', 'app/api/admin/roles/route.ts'],
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: 'chat-ui',
|
|
45
|
+
description: 'Chat interface with streaming',
|
|
46
|
+
category: 'AI',
|
|
47
|
+
dependencies: ['auth', 'model-providers'],
|
|
48
|
+
files: ['app/chat/page.tsx', 'components/StreamingChat.tsx', 'app/api/v1/chat/stream/route.ts'],
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'chat-widget',
|
|
52
|
+
description: 'Embeddable chat widget + API-key management',
|
|
53
|
+
category: 'AI',
|
|
54
|
+
dependencies: ['auth'],
|
|
55
|
+
files: [
|
|
56
|
+
'public/widget/chat.js',
|
|
57
|
+
'public/widget/loader.js',
|
|
58
|
+
'app/(app)/settings/api-keys/page.tsx',
|
|
59
|
+
'app/api/v1/api-keys/route.ts',
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'model-providers',
|
|
64
|
+
description: 'AI provider management',
|
|
65
|
+
category: 'AI',
|
|
66
|
+
dependencies: ['auth'],
|
|
67
|
+
files: ['app/providers-demo/page.tsx', 'app/api/providers/route.ts'],
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: 'prompt-management',
|
|
71
|
+
description: 'Prompt template system',
|
|
72
|
+
category: 'AI',
|
|
73
|
+
dependencies: [],
|
|
74
|
+
files: [
|
|
75
|
+
'app/dashboard/prompts/page.tsx',
|
|
76
|
+
'app/(app)/dashboard/prompts/page.tsx',
|
|
77
|
+
'app/api/prompts/route.ts',
|
|
78
|
+
'app/api/prompts/[id]/route.ts',
|
|
79
|
+
'app/api/prompts/[id]/set-default/route.ts',
|
|
80
|
+
'components/chat/prompt-selector.tsx',
|
|
81
|
+
],
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: 'billing',
|
|
85
|
+
description: 'Stripe billing & subscriptions',
|
|
86
|
+
category: 'Business',
|
|
87
|
+
dependencies: ['auth'],
|
|
88
|
+
files: ['app/billing/page.tsx', 'lib/stripe.ts'],
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: 'admin-dashboard',
|
|
92
|
+
description: 'Admin dashboard overview',
|
|
93
|
+
category: 'Admin',
|
|
94
|
+
dependencies: ['auth'],
|
|
95
|
+
files: ['app/admin/page.tsx'],
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: 'webhooks',
|
|
99
|
+
description: 'Webhook dispatch with HMAC signing',
|
|
100
|
+
category: 'Enterprise',
|
|
101
|
+
dependencies: [],
|
|
102
|
+
files: ['lib/webhook-dispatcher.ts'],
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: 'gdpr',
|
|
106
|
+
description: 'GDPR compliance (export, deletion, consent)',
|
|
107
|
+
category: 'Enterprise',
|
|
108
|
+
dependencies: ['auth'],
|
|
109
|
+
files: ['lib/gdpr.ts'],
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: 'mfa',
|
|
113
|
+
description: 'Multi-factor authentication (TOTP)',
|
|
114
|
+
category: 'Security',
|
|
115
|
+
dependencies: ['auth'],
|
|
116
|
+
files: ['lib/mfa.ts'],
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: 'audit-log',
|
|
120
|
+
description: 'Audit logging for compliance',
|
|
121
|
+
category: 'Enterprise',
|
|
122
|
+
dependencies: [],
|
|
123
|
+
files: ['lib/audit-log.ts'],
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
name: 'theming',
|
|
127
|
+
description: 'Dynamic theme engine',
|
|
128
|
+
category: 'UI',
|
|
129
|
+
dependencies: [],
|
|
130
|
+
files: ['lib/theme-engine.ts'],
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
name: 'analytics',
|
|
134
|
+
description: 'API usage analytics',
|
|
135
|
+
category: 'Business',
|
|
136
|
+
dependencies: [],
|
|
137
|
+
files: ['lib/analytics.ts'],
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
name: 'sentry',
|
|
141
|
+
description: 'Error tracking & monitoring',
|
|
142
|
+
category: 'Infrastructure',
|
|
143
|
+
dependencies: [],
|
|
144
|
+
files: ['sentry.client.config.ts', 'sentry.server.config.ts'],
|
|
145
|
+
},
|
|
146
|
+
// AI Service Backend Modules
|
|
147
|
+
{
|
|
148
|
+
name: 'ai-chat',
|
|
149
|
+
description: 'AI chat backend (FastAPI + LiteLLM)',
|
|
150
|
+
category: 'AI Service',
|
|
151
|
+
dependencies: [],
|
|
152
|
+
files: [
|
|
153
|
+
'services/ai/main.py',
|
|
154
|
+
'services/ai/services/chat_service.py',
|
|
155
|
+
'services/ai/routes/chat.py',
|
|
156
|
+
],
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
name: 'rag',
|
|
160
|
+
description: 'RAG pipeline with vector search',
|
|
161
|
+
category: 'AI Service',
|
|
162
|
+
dependencies: ['ai-chat'],
|
|
163
|
+
files: [
|
|
164
|
+
'services/ai/services/rag_service.py',
|
|
165
|
+
'services/ai/services/vector_store.py',
|
|
166
|
+
'services/ai/routes/rag.py',
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
name: 'guardrails',
|
|
171
|
+
description: 'Content safety, PII detection, prompt injection filter',
|
|
172
|
+
category: 'AI Service',
|
|
173
|
+
dependencies: [],
|
|
174
|
+
files: ['services/ai/services/guardrails_service.py', 'services/ai/routes/guardrails.py'],
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
name: 'ai-tools',
|
|
178
|
+
description: 'AI tools (web search, NLP, vision, docs, etc.)',
|
|
179
|
+
category: 'AI Service',
|
|
180
|
+
dependencies: ['ai-chat'],
|
|
181
|
+
files: ['services/ai/tools/__init__.py', 'services/ai/routes/tools.py'],
|
|
182
|
+
},
|
|
183
|
+
];
|
|
184
|
+
async function listCommand(options) {
|
|
185
|
+
console.log(chalk_1.default.bold.cyan('\nš¦ ChimerAI Component Manager\n'));
|
|
186
|
+
// --available: Show available components (no project needed)
|
|
187
|
+
if (options.available) {
|
|
188
|
+
console.log(chalk_1.default.bold.yellow('Available Components:\n'));
|
|
189
|
+
const categories = new Map();
|
|
190
|
+
for (const comp of COMPONENT_REGISTRY) {
|
|
191
|
+
const cat = categories.get(comp.category) || [];
|
|
192
|
+
cat.push(comp);
|
|
193
|
+
categories.set(comp.category, cat);
|
|
194
|
+
}
|
|
195
|
+
const edition = (0, license_js_1.getEdition)();
|
|
196
|
+
if (edition === 'free') {
|
|
197
|
+
console.log(chalk_1.default.gray(' Edition: Free ā paid components are marked\n'));
|
|
198
|
+
}
|
|
199
|
+
else if (edition === 'enterprise') {
|
|
200
|
+
console.log(chalk_1.default.green(' Edition: Enterprise ā
\n'));
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
console.log(chalk_1.default.magenta(' Edition: Enterprise Pro ā
\n'));
|
|
204
|
+
}
|
|
205
|
+
for (const [category, comps] of categories) {
|
|
206
|
+
console.log(chalk_1.default.bold.yellow(` ${category}:`));
|
|
207
|
+
for (const comp of comps) {
|
|
208
|
+
const required = (0, license_js_1.getRequiredEdition)(comp.name);
|
|
209
|
+
const locked = required !== null &&
|
|
210
|
+
required !== 'free' &&
|
|
211
|
+
!(required === 'enterprise'
|
|
212
|
+
? edition === 'enterprise' || edition === 'enterprise-pro'
|
|
213
|
+
: edition === 'enterprise-pro');
|
|
214
|
+
const badge = required === 'enterprise-pro' && locked
|
|
215
|
+
? chalk_1.default.magenta(' š Ent.Pro')
|
|
216
|
+
: required === 'enterprise' && locked
|
|
217
|
+
? chalk_1.default.yellow(' š Enterprise')
|
|
218
|
+
: '';
|
|
219
|
+
console.log(` ā ${chalk_1.default.white(comp.name.padEnd(22))} ${chalk_1.default.gray(comp.description)}${badge}`);
|
|
220
|
+
}
|
|
221
|
+
console.log('');
|
|
222
|
+
}
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
const targetDir = (0, utils_js_1.resolveTargetDir)(options.dir);
|
|
226
|
+
const spinner = (0, ora_1.default)('Scanning project...').start();
|
|
227
|
+
try {
|
|
228
|
+
const components = scanComponents(targetDir);
|
|
229
|
+
spinner.stop();
|
|
230
|
+
if (options.json) {
|
|
231
|
+
console.log(JSON.stringify(components, null, 2));
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
console.log(chalk_1.default.bold.cyan('\nš¦ ChimerAI Components\n'));
|
|
235
|
+
console.log(chalk_1.default.gray(` Project: ${targetDir}\n`));
|
|
236
|
+
const categories = new Map();
|
|
237
|
+
for (const comp of components) {
|
|
238
|
+
if (options.installed && comp.status === 'not-installed')
|
|
239
|
+
continue;
|
|
240
|
+
if (options.available && comp.status === 'installed')
|
|
241
|
+
continue;
|
|
242
|
+
const cat = categories.get(comp.category) || [];
|
|
243
|
+
cat.push(comp);
|
|
244
|
+
categories.set(comp.category, cat);
|
|
245
|
+
}
|
|
246
|
+
if (categories.size === 0) {
|
|
247
|
+
console.log(options.installed
|
|
248
|
+
? chalk_1.default.yellow(' No components installed yet.\n Run: chimerai add <component>\n')
|
|
249
|
+
: chalk_1.default.yellow(' All components already installed! š\n'));
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
const editionStatus = (0, license_js_1.getEdition)();
|
|
253
|
+
for (const [category, comps] of categories) {
|
|
254
|
+
console.log(chalk_1.default.bold.yellow(` ${category}:`));
|
|
255
|
+
for (const comp of comps) {
|
|
256
|
+
const required = (0, license_js_1.getRequiredEdition)(comp.name);
|
|
257
|
+
const locked = required !== null &&
|
|
258
|
+
required !== 'free' &&
|
|
259
|
+
!(required === 'enterprise'
|
|
260
|
+
? editionStatus === 'enterprise' || editionStatus === 'enterprise-pro'
|
|
261
|
+
: editionStatus === 'enterprise-pro');
|
|
262
|
+
const icon = locked
|
|
263
|
+
? required === 'enterprise-pro'
|
|
264
|
+
? chalk_1.default.magenta('š')
|
|
265
|
+
: chalk_1.default.yellow('š')
|
|
266
|
+
: comp.status === 'installed'
|
|
267
|
+
? chalk_1.default.green('ā
')
|
|
268
|
+
: chalk_1.default.gray('ā ');
|
|
269
|
+
const label = locked
|
|
270
|
+
? required === 'enterprise-pro'
|
|
271
|
+
? chalk_1.default.magenta('Ent.Pro')
|
|
272
|
+
: chalk_1.default.yellow('Enterprise')
|
|
273
|
+
: comp.status === 'installed'
|
|
274
|
+
? chalk_1.default.green('installed')
|
|
275
|
+
: chalk_1.default.gray('not installed');
|
|
276
|
+
console.log(` ${icon} ${chalk_1.default.white(comp.name.padEnd(22))} ${label} ${chalk_1.default.gray(comp.description)}`);
|
|
277
|
+
if (locked) {
|
|
278
|
+
const url = required === 'enterprise-pro'
|
|
279
|
+
? 'https://chimerai.dev/enterprise-pro'
|
|
280
|
+
: 'https://chimerai.dev/enterprise';
|
|
281
|
+
console.log(chalk_1.default.gray(` āā chimerai activate <KEY> or ${url}`));
|
|
282
|
+
}
|
|
283
|
+
else if (comp.status === 'not-installed' && comp.dependencies.length > 0) {
|
|
284
|
+
console.log(chalk_1.default.gray(` āā requires: ${comp.dependencies.join(', ')}`));
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
console.log('');
|
|
288
|
+
}
|
|
289
|
+
const installed = components.filter((c) => c.status === 'installed').length;
|
|
290
|
+
console.log(chalk_1.default.bold(` š ${installed}/${components.length} components installed\n`));
|
|
291
|
+
if (installed < components.length) {
|
|
292
|
+
console.log(chalk_1.default.cyan(` š” Install: ${chalk_1.default.white('chimerai add <component>')}\n`));
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
spinner.fail('Failed to scan project');
|
|
297
|
+
console.error(chalk_1.default.red(error.message));
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
const AI_MODULE_NAMES = new Set(['ai-chat', 'rag', 'guardrails', 'ai-tools']);
|
|
301
|
+
function scanComponents(targetDir) {
|
|
302
|
+
// Read AI manifest for accurate AI module detection
|
|
303
|
+
// readAiManifest expects the project root ā it builds services/ai/.chimerai-ai internally
|
|
304
|
+
const installedAiModules = new Set();
|
|
305
|
+
const manifest = (0, ai_service_js_1.readAiManifest)(targetDir);
|
|
306
|
+
if (manifest) {
|
|
307
|
+
if (manifest.modules.includes('chat'))
|
|
308
|
+
installedAiModules.add('ai-chat');
|
|
309
|
+
if (manifest.modules.includes('rag'))
|
|
310
|
+
installedAiModules.add('rag');
|
|
311
|
+
if (manifest.modules.includes('guardrails'))
|
|
312
|
+
installedAiModules.add('guardrails');
|
|
313
|
+
if (manifest.tools.length > 0)
|
|
314
|
+
installedAiModules.add('ai-tools');
|
|
315
|
+
}
|
|
316
|
+
return COMPONENT_REGISTRY.map((reg) => {
|
|
317
|
+
// For AI modules: prefer manifest-based detection
|
|
318
|
+
if (AI_MODULE_NAMES.has(reg.name) && installedAiModules.has(reg.name)) {
|
|
319
|
+
return { ...reg, status: 'installed' };
|
|
320
|
+
}
|
|
321
|
+
return {
|
|
322
|
+
...reg,
|
|
323
|
+
status: reg.files.some((f) => fs_extra_1.default.existsSync(path_1.default.join(targetDir, f)))
|
|
324
|
+
? 'installed'
|
|
325
|
+
: 'not-installed',
|
|
326
|
+
};
|
|
327
|
+
});
|
|
328
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migrate Command - Simplified Prisma migration management
|
|
3
|
+
*/
|
|
4
|
+
interface MigrateOptions {
|
|
5
|
+
dir: string;
|
|
6
|
+
seed: boolean;
|
|
7
|
+
reset: boolean;
|
|
8
|
+
status: boolean;
|
|
9
|
+
rollback: boolean;
|
|
10
|
+
name: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function migrateCommand(options: MigrateOptions): Promise<void>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,UAAU,cAAc;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,iBAW3D"}
|