@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.
Files changed (129) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +293 -0
  3. package/dist/cli.d.ts +7 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +317 -0
  6. package/dist/commands/add.d.ts +11 -0
  7. package/dist/commands/add.d.ts.map +1 -0
  8. package/dist/commands/add.js +2126 -0
  9. package/dist/commands/create.d.ts +12 -0
  10. package/dist/commands/create.d.ts.map +1 -0
  11. package/dist/commands/create.js +1703 -0
  12. package/dist/commands/deploy.d.ts +11 -0
  13. package/dist/commands/deploy.d.ts.map +1 -0
  14. package/dist/commands/deploy.js +219 -0
  15. package/dist/commands/dev.d.ts +17 -0
  16. package/dist/commands/dev.d.ts.map +1 -0
  17. package/dist/commands/dev.js +206 -0
  18. package/dist/commands/doctor.d.ts +11 -0
  19. package/dist/commands/doctor.d.ts.map +1 -0
  20. package/dist/commands/doctor.js +728 -0
  21. package/dist/commands/generate.d.ts +19 -0
  22. package/dist/commands/generate.d.ts.map +1 -0
  23. package/dist/commands/generate.js +429 -0
  24. package/dist/commands/init.d.ts +11 -0
  25. package/dist/commands/init.d.ts.map +1 -0
  26. package/dist/commands/init.js +269 -0
  27. package/dist/commands/list.d.ts +12 -0
  28. package/dist/commands/list.d.ts.map +1 -0
  29. package/dist/commands/list.js +328 -0
  30. package/dist/commands/migrate.d.ts +14 -0
  31. package/dist/commands/migrate.d.ts.map +1 -0
  32. package/dist/commands/migrate.js +197 -0
  33. package/dist/commands/plugin.d.ts +10 -0
  34. package/dist/commands/plugin.d.ts.map +1 -0
  35. package/dist/commands/plugin.js +239 -0
  36. package/dist/commands/remove.d.ts +11 -0
  37. package/dist/commands/remove.d.ts.map +1 -0
  38. package/dist/commands/remove.js +472 -0
  39. package/dist/commands/secret.d.ts +12 -0
  40. package/dist/commands/secret.d.ts.map +1 -0
  41. package/dist/commands/secret.js +102 -0
  42. package/dist/commands/setup.d.ts +9 -0
  43. package/dist/commands/setup.d.ts.map +1 -0
  44. package/dist/commands/setup.js +788 -0
  45. package/dist/commands/update.d.ts +14 -0
  46. package/dist/commands/update.d.ts.map +1 -0
  47. package/dist/commands/update.js +211 -0
  48. package/dist/commands/use.d.ts +9 -0
  49. package/dist/commands/use.d.ts.map +1 -0
  50. package/dist/commands/use.js +51 -0
  51. package/dist/index.d.ts +22 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +45 -0
  54. package/dist/license.d.ts +55 -0
  55. package/dist/license.d.ts.map +1 -0
  56. package/dist/license.js +258 -0
  57. package/dist/scanner.d.ts +31 -0
  58. package/dist/scanner.d.ts.map +1 -0
  59. package/dist/scanner.js +113 -0
  60. package/dist/schema-manager.d.ts +26 -0
  61. package/dist/schema-manager.d.ts.map +1 -0
  62. package/dist/schema-manager.js +132 -0
  63. package/dist/templates/admin.d.ts +49 -0
  64. package/dist/templates/admin.d.ts.map +1 -0
  65. package/dist/templates/admin.js +1358 -0
  66. package/dist/templates/ai-routes.d.ts +17 -0
  67. package/dist/templates/ai-routes.d.ts.map +1 -0
  68. package/dist/templates/ai-routes.js +1130 -0
  69. package/dist/templates/ai-service-tools.d.ts +22 -0
  70. package/dist/templates/ai-service-tools.d.ts.map +1 -0
  71. package/dist/templates/ai-service-tools.js +1424 -0
  72. package/dist/templates/ai-service.d.ts +66 -0
  73. package/dist/templates/ai-service.d.ts.map +1 -0
  74. package/dist/templates/ai-service.js +2202 -0
  75. package/dist/templates/api-routes.d.ts +108 -0
  76. package/dist/templates/api-routes.d.ts.map +1 -0
  77. package/dist/templates/api-routes.js +1219 -0
  78. package/dist/templates/auth.d.ts +48 -0
  79. package/dist/templates/auth.d.ts.map +1 -0
  80. package/dist/templates/auth.js +381 -0
  81. package/dist/templates/billing.d.ts +44 -0
  82. package/dist/templates/billing.d.ts.map +1 -0
  83. package/dist/templates/billing.js +551 -0
  84. package/dist/templates/chat.d.ts +63 -0
  85. package/dist/templates/chat.d.ts.map +1 -0
  86. package/dist/templates/chat.js +1979 -0
  87. package/dist/templates/components.d.ts +22 -0
  88. package/dist/templates/components.d.ts.map +1 -0
  89. package/dist/templates/components.js +672 -0
  90. package/dist/templates/config.d.ts +6 -0
  91. package/dist/templates/config.d.ts.map +1 -0
  92. package/dist/templates/config.js +86 -0
  93. package/dist/templates/docker.d.ts +25 -0
  94. package/dist/templates/docker.d.ts.map +1 -0
  95. package/dist/templates/docker.js +165 -0
  96. package/dist/templates/gdpr.d.ts +16 -0
  97. package/dist/templates/gdpr.d.ts.map +1 -0
  98. package/dist/templates/gdpr.js +259 -0
  99. package/dist/templates/index.d.ts +77 -0
  100. package/dist/templates/index.d.ts.map +1 -0
  101. package/dist/templates/index.js +339 -0
  102. package/dist/templates/layout.d.ts +67 -0
  103. package/dist/templates/layout.d.ts.map +1 -0
  104. package/dist/templates/layout.js +670 -0
  105. package/dist/templates/mfa.d.ts +23 -0
  106. package/dist/templates/mfa.d.ts.map +1 -0
  107. package/dist/templates/mfa.js +353 -0
  108. package/dist/templates/middleware.d.ts +12 -0
  109. package/dist/templates/middleware.d.ts.map +1 -0
  110. package/dist/templates/middleware.js +116 -0
  111. package/dist/templates/prisma.d.ts +35 -0
  112. package/dist/templates/prisma.d.ts.map +1 -0
  113. package/dist/templates/prisma.js +724 -0
  114. package/dist/templates/provider-routes.d.ts +21 -0
  115. package/dist/templates/provider-routes.d.ts.map +1 -0
  116. package/dist/templates/provider-routes.js +1203 -0
  117. package/dist/templates/rag.d.ts +48 -0
  118. package/dist/templates/rag.d.ts.map +1 -0
  119. package/dist/templates/rag.js +532 -0
  120. package/dist/templates/widget.d.ts +64 -0
  121. package/dist/templates/widget.d.ts.map +1 -0
  122. package/dist/templates/widget.js +1360 -0
  123. package/dist/utils/provider-db.d.ts +63 -0
  124. package/dist/utils/provider-db.d.ts.map +1 -0
  125. package/dist/utils/provider-db.js +300 -0
  126. package/dist/utils.d.ts +78 -0
  127. package/dist/utils.d.ts.map +1 -0
  128. package/dist/utils.js +330 -0
  129. 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"}