create-chaaskit 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 (122) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +25 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/add-infra.d.ts +6 -0
  6. package/dist/commands/add-infra.d.ts.map +1 -0
  7. package/dist/commands/add-infra.js +160 -0
  8. package/dist/commands/add-infra.js.map +1 -0
  9. package/dist/commands/build.d.ts +2 -0
  10. package/dist/commands/build.d.ts.map +1 -0
  11. package/dist/commands/build.js +63 -0
  12. package/dist/commands/build.js.map +1 -0
  13. package/dist/commands/db-sync.d.ts +13 -0
  14. package/dist/commands/db-sync.d.ts.map +1 -0
  15. package/dist/commands/db-sync.js +108 -0
  16. package/dist/commands/db-sync.js.map +1 -0
  17. package/dist/commands/dev.d.ts +7 -0
  18. package/dist/commands/dev.d.ts.map +1 -0
  19. package/dist/commands/dev.js +61 -0
  20. package/dist/commands/dev.js.map +1 -0
  21. package/dist/commands/init.d.ts +9 -0
  22. package/dist/commands/init.d.ts.map +1 -0
  23. package/dist/commands/init.js +214 -0
  24. package/dist/commands/init.js.map +1 -0
  25. package/dist/index.d.ts +3 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +57 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/templates/.env.example +24 -0
  30. package/dist/templates/README.md +81 -0
  31. package/dist/templates/app/components/AcceptInviteClient.tsx +10 -0
  32. package/dist/templates/app/components/AdminDashboardClient.tsx +10 -0
  33. package/dist/templates/app/components/AdminTeamClient.tsx +10 -0
  34. package/dist/templates/app/components/AdminTeamsClient.tsx +10 -0
  35. package/dist/templates/app/components/AdminUsersClient.tsx +10 -0
  36. package/dist/templates/app/components/ApiKeysClient.tsx +10 -0
  37. package/dist/templates/app/components/AutomationsClient.tsx +10 -0
  38. package/dist/templates/app/components/ChatClient.tsx +13 -0
  39. package/dist/templates/app/components/ClientOnly.tsx +6 -0
  40. package/dist/templates/app/components/DocumentsClient.tsx +10 -0
  41. package/dist/templates/app/components/OAuthConsentClient.tsx +10 -0
  42. package/dist/templates/app/components/PricingClient.tsx +10 -0
  43. package/dist/templates/app/components/TeamSettingsClient.tsx +10 -0
  44. package/dist/templates/app/components/VerifyEmailClient.tsx +10 -0
  45. package/dist/templates/app/entry.client.tsx +12 -0
  46. package/dist/templates/app/entry.server.tsx +67 -0
  47. package/dist/templates/app/root.tsx +91 -0
  48. package/dist/templates/app/routes/_index.tsx +82 -0
  49. package/dist/templates/app/routes/admin._index.tsx +57 -0
  50. package/dist/templates/app/routes/admin.teams.$teamId.tsx +57 -0
  51. package/dist/templates/app/routes/admin.teams._index.tsx +57 -0
  52. package/dist/templates/app/routes/admin.users.tsx +57 -0
  53. package/dist/templates/app/routes/api-keys.tsx +57 -0
  54. package/dist/templates/app/routes/automations.tsx +57 -0
  55. package/dist/templates/app/routes/chat._index.tsx +11 -0
  56. package/dist/templates/app/routes/chat.admin._index.tsx +10 -0
  57. package/dist/templates/app/routes/chat.admin.teams.$teamId.tsx +10 -0
  58. package/dist/templates/app/routes/chat.admin.teams._index.tsx +10 -0
  59. package/dist/templates/app/routes/chat.admin.users.tsx +10 -0
  60. package/dist/templates/app/routes/chat.api-keys.tsx +10 -0
  61. package/dist/templates/app/routes/chat.automations.tsx +10 -0
  62. package/dist/templates/app/routes/chat.documents.tsx +10 -0
  63. package/dist/templates/app/routes/chat.team.$teamId.settings.tsx +10 -0
  64. package/dist/templates/app/routes/chat.thread.$threadId.tsx +11 -0
  65. package/dist/templates/app/routes/chat.tsx +39 -0
  66. package/dist/templates/app/routes/documents.tsx +57 -0
  67. package/dist/templates/app/routes/invite.$token.tsx +10 -0
  68. package/dist/templates/app/routes/login.tsx +334 -0
  69. package/dist/templates/app/routes/oauth.consent.tsx +10 -0
  70. package/dist/templates/app/routes/pricing.tsx +10 -0
  71. package/dist/templates/app/routes/privacy.tsx +197 -0
  72. package/dist/templates/app/routes/register.tsx +398 -0
  73. package/dist/templates/app/routes/shared.$shareId.tsx +226 -0
  74. package/dist/templates/app/routes/team.$teamId.settings.tsx +57 -0
  75. package/dist/templates/app/routes/terms.tsx +173 -0
  76. package/dist/templates/app/routes/thread.$threadId.tsx +102 -0
  77. package/dist/templates/app/routes/verify-email.tsx +10 -0
  78. package/dist/templates/app/routes.ts +47 -0
  79. package/dist/templates/config/app.config.ts +216 -0
  80. package/dist/templates/docs/admin.md +257 -0
  81. package/dist/templates/docs/api-keys.md +403 -0
  82. package/dist/templates/docs/authentication.md +247 -0
  83. package/dist/templates/docs/configuration.md +1212 -0
  84. package/dist/templates/docs/custom-pages.md +466 -0
  85. package/dist/templates/docs/deployment.md +362 -0
  86. package/dist/templates/docs/development.md +411 -0
  87. package/dist/templates/docs/documents.md +293 -0
  88. package/dist/templates/docs/extensions.md +639 -0
  89. package/dist/templates/docs/index.md +139 -0
  90. package/dist/templates/docs/installation.md +286 -0
  91. package/dist/templates/docs/mcp.md +952 -0
  92. package/dist/templates/docs/native-tools.md +688 -0
  93. package/dist/templates/docs/queue.md +514 -0
  94. package/dist/templates/docs/scheduled-prompts.md +279 -0
  95. package/dist/templates/docs/settings.md +415 -0
  96. package/dist/templates/docs/slack.md +318 -0
  97. package/dist/templates/docs/styling.md +288 -0
  98. package/dist/templates/extensions/agents/.gitkeep +0 -0
  99. package/dist/templates/extensions/pages/.gitkeep +0 -0
  100. package/dist/templates/extensions/payment-plans/.gitkeep +0 -0
  101. package/dist/templates/index.html +16 -0
  102. package/dist/templates/infra-aws/.github/workflows/deploy.yml +95 -0
  103. package/dist/templates/infra-aws/README.md +207 -0
  104. package/dist/templates/infra-aws/bin/cdk.ts +18 -0
  105. package/dist/templates/infra-aws/cdk.json +43 -0
  106. package/dist/templates/infra-aws/config/deployment.ts +156 -0
  107. package/dist/templates/infra-aws/lib/chaaskit-stack.ts +419 -0
  108. package/dist/templates/infra-aws/package.json +27 -0
  109. package/dist/templates/infra-aws/scripts/build-app.sh +63 -0
  110. package/dist/templates/infra-aws/tsconfig.json +25 -0
  111. package/dist/templates/package.json +46 -0
  112. package/dist/templates/prisma/schema/base.prisma +584 -0
  113. package/dist/templates/prisma/schema/custom.prisma +24 -0
  114. package/dist/templates/prisma/schema.prisma +271 -0
  115. package/dist/templates/public/favicon.svg +4 -0
  116. package/dist/templates/public/logo.svg +4 -0
  117. package/dist/templates/react-router.config.ts +11 -0
  118. package/dist/templates/server.js +52 -0
  119. package/dist/templates/src/main.tsx +8 -0
  120. package/dist/templates/tsconfig.json +26 -0
  121. package/dist/templates/vite.config.ts +26 -0
  122. package/package.json +46 -0
@@ -0,0 +1,214 @@
1
+ import path from 'path';
2
+ import fs from 'fs-extra';
3
+ import { fileURLToPath } from 'url';
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ import prompts from 'prompts';
7
+ import { spawn } from 'child_process';
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+ // Convert project name to database name (replace dashes/spaces with underscores, lowercase)
11
+ function toDbName(name) {
12
+ return name.toLowerCase().replace(/[-\s]+/g, '_');
13
+ }
14
+ export async function init(projectName, options) {
15
+ console.log();
16
+ console.log(chalk.bold('🚀 Create ChaasKit App'));
17
+ console.log();
18
+ // Prompt for project name if not provided
19
+ if (!projectName) {
20
+ const response = await prompts({
21
+ type: 'text',
22
+ name: 'projectName',
23
+ message: 'What is your project named?',
24
+ initial: 'my-chat-app',
25
+ });
26
+ if (!response.projectName) {
27
+ console.log(chalk.red('Project name is required'));
28
+ process.exit(1);
29
+ }
30
+ projectName = response.projectName;
31
+ }
32
+ // At this point projectName is guaranteed to be defined
33
+ const finalProjectName = projectName;
34
+ const projectPath = path.resolve(process.cwd(), finalProjectName);
35
+ // Check if directory exists
36
+ if (await fs.pathExists(projectPath)) {
37
+ const response = await prompts({
38
+ type: 'confirm',
39
+ name: 'overwrite',
40
+ message: `Directory ${finalProjectName} already exists. Overwrite?`,
41
+ initial: false,
42
+ });
43
+ if (!response.overwrite) {
44
+ console.log(chalk.yellow('Aborted.'));
45
+ process.exit(0);
46
+ }
47
+ await fs.remove(projectPath);
48
+ }
49
+ // Create project directory
50
+ await fs.ensureDir(projectPath);
51
+ const spinner = ora('Creating project files...').start();
52
+ try {
53
+ // Copy template files
54
+ const templatesPath = path.join(__dirname, '../templates');
55
+ await copyTemplateFiles(templatesPath, projectPath, finalProjectName);
56
+ spinner.succeed('Project files created');
57
+ // Determine package manager
58
+ const packageManager = options.useYarn ? 'yarn' : options.useNpm ? 'npm' : 'pnpm';
59
+ // Install dependencies
60
+ if (!options.skipInstall) {
61
+ const installSpinner = ora(`Installing dependencies with ${packageManager}...`).start();
62
+ try {
63
+ await runCommand(packageManager, ['install'], { cwd: projectPath });
64
+ installSpinner.succeed('Dependencies installed');
65
+ }
66
+ catch (error) {
67
+ installSpinner.fail('Failed to install dependencies');
68
+ console.log(chalk.yellow(`\nYou can install dependencies manually by running:`));
69
+ console.log(chalk.cyan(` cd ${finalProjectName}`));
70
+ console.log(chalk.cyan(` ${packageManager} install`));
71
+ }
72
+ }
73
+ // Print success message
74
+ console.log();
75
+ console.log(chalk.green('✅ Success!') + ` Created ${finalProjectName} at ${projectPath}`);
76
+ console.log();
77
+ console.log('Inside that directory, you can run:');
78
+ console.log();
79
+ console.log(chalk.cyan(` ${packageManager} dev`));
80
+ console.log(' Starts the development servers');
81
+ console.log();
82
+ console.log(chalk.cyan(` ${packageManager} build`));
83
+ console.log(' Builds the app for production');
84
+ console.log();
85
+ console.log(chalk.cyan(` ${packageManager} db:push`));
86
+ console.log(' Push database schema changes');
87
+ console.log();
88
+ console.log('We suggest that you begin by:');
89
+ console.log();
90
+ console.log(chalk.cyan(` cd ${finalProjectName}`));
91
+ console.log(chalk.cyan(' cp .env.example .env'));
92
+ console.log(chalk.cyan(' # Edit .env with your DATABASE_URL and API keys'));
93
+ console.log(chalk.cyan(` ${packageManager} db:push`));
94
+ console.log(chalk.cyan(` ${packageManager} dev`));
95
+ console.log();
96
+ }
97
+ catch (error) {
98
+ spinner.fail('Failed to create project');
99
+ throw error;
100
+ }
101
+ }
102
+ async function copyTemplateFiles(templatesPath, targetPath, projectName) {
103
+ // Create directory structure for React Router v7 app
104
+ await fs.ensureDir(path.join(targetPath, 'app', 'routes'));
105
+ await fs.ensureDir(path.join(targetPath, 'app', 'components'));
106
+ await fs.ensureDir(path.join(targetPath, 'app', 'pages'));
107
+ await fs.ensureDir(path.join(targetPath, 'config'));
108
+ await fs.ensureDir(path.join(targetPath, 'extensions', 'agents'));
109
+ await fs.ensureDir(path.join(targetPath, 'extensions', 'payment-plans'));
110
+ await fs.ensureDir(path.join(targetPath, 'extensions', 'pages'));
111
+ await fs.ensureDir(path.join(targetPath, 'prisma', 'schema'));
112
+ await fs.ensureDir(path.join(targetPath, 'public'));
113
+ // Copy template files
114
+ // Note: Client wrapper components (*Client.tsx) and documentation files are now
115
+ // provided by @chaaskit/client package - routes import directly from there.
116
+ const templates = [
117
+ // React Router app files
118
+ { src: 'app/routes.ts', dest: 'app/routes.ts' },
119
+ { src: 'app/root.tsx', dest: 'app/root.tsx' },
120
+ { src: 'app/entry.client.tsx', dest: 'app/entry.client.tsx' },
121
+ { src: 'app/entry.server.tsx', dest: 'app/entry.server.tsx' },
122
+ // ClientOnly re-export for convenience
123
+ { src: 'app/components/ClientOnly.tsx', dest: 'app/components/ClientOnly.tsx' },
124
+ // Public routes (no basePath prefix)
125
+ { src: 'app/routes/_index.tsx', dest: 'app/routes/_index.tsx' },
126
+ { src: 'app/routes/login.tsx', dest: 'app/routes/login.tsx' },
127
+ { src: 'app/routes/register.tsx', dest: 'app/routes/register.tsx' },
128
+ { src: 'app/routes/shared.$shareId.tsx', dest: 'app/routes/shared.$shareId.tsx' },
129
+ { src: 'app/routes/terms.tsx', dest: 'app/routes/terms.tsx' },
130
+ { src: 'app/routes/privacy.tsx', dest: 'app/routes/privacy.tsx' },
131
+ { src: 'app/routes/verify-email.tsx', dest: 'app/routes/verify-email.tsx' },
132
+ { src: 'app/routes/invite.$token.tsx', dest: 'app/routes/invite.$token.tsx' },
133
+ { src: 'app/routes/pricing.tsx', dest: 'app/routes/pricing.tsx' },
134
+ { src: 'app/routes/oauth.consent.tsx', dest: 'app/routes/oauth.consent.tsx' },
135
+ // Authenticated routes (under basePath, e.g., /chat/*)
136
+ // Layout route that handles authentication for all chat.* routes
137
+ { src: 'app/routes/chat.tsx', dest: 'app/routes/chat.tsx' },
138
+ { src: 'app/routes/chat._index.tsx', dest: 'app/routes/chat._index.tsx' },
139
+ { src: 'app/routes/chat.thread.$threadId.tsx', dest: 'app/routes/chat.thread.$threadId.tsx' },
140
+ { src: 'app/routes/chat.api-keys.tsx', dest: 'app/routes/chat.api-keys.tsx' },
141
+ { src: 'app/routes/chat.documents.tsx', dest: 'app/routes/chat.documents.tsx' },
142
+ { src: 'app/routes/chat.automations.tsx', dest: 'app/routes/chat.automations.tsx' },
143
+ { src: 'app/routes/chat.team.$teamId.settings.tsx', dest: 'app/routes/chat.team.$teamId.settings.tsx' },
144
+ { src: 'app/routes/chat.admin._index.tsx', dest: 'app/routes/chat.admin._index.tsx' },
145
+ { src: 'app/routes/chat.admin.users.tsx', dest: 'app/routes/chat.admin.users.tsx' },
146
+ { src: 'app/routes/chat.admin.teams._index.tsx', dest: 'app/routes/chat.admin.teams._index.tsx' },
147
+ { src: 'app/routes/chat.admin.teams.$teamId.tsx', dest: 'app/routes/chat.admin.teams.$teamId.tsx' },
148
+ // Config
149
+ { src: 'config/app.config.ts', dest: 'config/app.config.ts' },
150
+ { src: 'react-router.config.ts', dest: 'react-router.config.ts' },
151
+ { src: 'vite.config.ts', dest: 'vite.config.ts' },
152
+ // Extensions
153
+ { src: 'extensions/agents/.gitkeep', dest: 'extensions/agents/.gitkeep' },
154
+ { src: 'extensions/payment-plans/.gitkeep', dest: 'extensions/payment-plans/.gitkeep' },
155
+ { src: 'extensions/pages/.gitkeep', dest: 'extensions/pages/.gitkeep' },
156
+ // Public assets
157
+ { src: 'public/logo.svg', dest: 'public/logo.svg' },
158
+ { src: 'public/favicon.svg', dest: 'public/favicon.svg' },
159
+ // Root files
160
+ {
161
+ src: '.env.example',
162
+ dest: '.env.example',
163
+ transform: (content) => content.replace(/\{\{DB_NAME\}\}/g, toDbName(projectName)),
164
+ },
165
+ { src: '.gitignore', dest: '.gitignore' },
166
+ {
167
+ src: 'package.json',
168
+ dest: 'package.json',
169
+ transform: (content) => content.replace(/\{\{PROJECT_NAME\}\}/g, projectName),
170
+ },
171
+ { src: 'tsconfig.json', dest: 'tsconfig.json' },
172
+ { src: 'server.js', dest: 'server.js' },
173
+ { src: 'README.md', dest: 'README.md', transform: (content) => content.replace(/\{\{PROJECT_NAME\}\}/g, projectName) },
174
+ // Prisma
175
+ { src: 'prisma/schema/base.prisma', dest: 'prisma/schema/base.prisma' },
176
+ { src: 'prisma/schema/custom.prisma', dest: 'prisma/schema/custom.prisma' },
177
+ ];
178
+ for (const template of templates) {
179
+ const srcPath = path.join(templatesPath, template.src);
180
+ const destPath = path.join(targetPath, template.dest);
181
+ if (await fs.pathExists(srcPath)) {
182
+ let content = await fs.readFile(srcPath, 'utf-8');
183
+ if (template.transform) {
184
+ content = template.transform(content);
185
+ }
186
+ await fs.outputFile(destPath, content);
187
+ }
188
+ else {
189
+ // Create empty file for .gitkeep files
190
+ if (template.src.endsWith('.gitkeep')) {
191
+ await fs.outputFile(destPath, '');
192
+ }
193
+ }
194
+ }
195
+ }
196
+ function runCommand(command, args, options) {
197
+ return new Promise((resolve, reject) => {
198
+ const child = spawn(command, args, {
199
+ ...options,
200
+ stdio: 'inherit',
201
+ shell: true,
202
+ });
203
+ child.on('close', (code) => {
204
+ if (code === 0) {
205
+ resolve();
206
+ }
207
+ else {
208
+ reject(new Error(`Command failed with code ${code}`));
209
+ }
210
+ });
211
+ child.on('error', reject);
212
+ });
213
+ }
214
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,4FAA4F;AAC5F,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AACpD,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,WAA+B,EAAE,OAAoB;IAC9E,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,0CAA0C;IAC1C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;YAC7B,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,6BAA6B;YACtC,OAAO,EAAE,aAAa;SACvB,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;IACrC,CAAC;IAED,wDAAwD;IACxD,MAAM,gBAAgB,GAAG,WAAqB,CAAC;IAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAElE,4BAA4B;IAC5B,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;YAC7B,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,aAAa,gBAAgB,6BAA6B;YACnE,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED,2BAA2B;IAC3B,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAEhC,MAAM,OAAO,GAAG,GAAG,CAAC,2BAA2B,CAAC,CAAC,KAAK,EAAE,CAAC;IAEzD,IAAI,CAAC;QACH,sBAAsB;QACtB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAC3D,MAAM,iBAAiB,CAAC,aAAa,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;QAEtE,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QAEzC,4BAA4B;QAC5B,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAElF,uBAAuB;QACvB,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,cAAc,GAAG,GAAG,CAAC,gCAAgC,cAAc,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;YAExF,IAAI,CAAC;gBACH,MAAM,UAAU,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;gBACpE,cAAc,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,cAAc,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qDAAqD,CAAC,CAAC,CAAC;gBACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,gBAAgB,EAAE,CAAC,CAAC,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,cAAc,UAAU,CAAC,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,YAAY,gBAAgB,OAAO,WAAW,EAAE,CAAC,CAAC;QAC1F,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,cAAc,MAAM,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,cAAc,QAAQ,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,cAAc,UAAU,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,gBAAgB,EAAE,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,cAAc,UAAU,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,cAAc,MAAM,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEhB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACzC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,aAAqB,EAAE,UAAkB,EAAE,WAAmB;IAC7F,qDAAqD;IACrD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC3D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;IAC/D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;IAClE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC;IACzE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IACjE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEpD,sBAAsB;IACtB,gFAAgF;IAChF,4EAA4E;IAC5E,MAAM,SAAS,GAAkF;QAC/F,yBAAyB;QACzB,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE;QAC/C,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE;QAC7C,EAAE,GAAG,EAAE,sBAAsB,EAAE,IAAI,EAAE,sBAAsB,EAAE;QAC7D,EAAE,GAAG,EAAE,sBAAsB,EAAE,IAAI,EAAE,sBAAsB,EAAE;QAC7D,uCAAuC;QACvC,EAAE,GAAG,EAAE,+BAA+B,EAAE,IAAI,EAAE,+BAA+B,EAAE;QAC/E,qCAAqC;QACrC,EAAE,GAAG,EAAE,uBAAuB,EAAE,IAAI,EAAE,uBAAuB,EAAE;QAC/D,EAAE,GAAG,EAAE,sBAAsB,EAAE,IAAI,EAAE,sBAAsB,EAAE;QAC7D,EAAE,GAAG,EAAE,yBAAyB,EAAE,IAAI,EAAE,yBAAyB,EAAE;QACnE,EAAE,GAAG,EAAE,gCAAgC,EAAE,IAAI,EAAE,gCAAgC,EAAE;QACjF,EAAE,GAAG,EAAE,sBAAsB,EAAE,IAAI,EAAE,sBAAsB,EAAE;QAC7D,EAAE,GAAG,EAAE,wBAAwB,EAAE,IAAI,EAAE,wBAAwB,EAAE;QACjE,EAAE,GAAG,EAAE,6BAA6B,EAAE,IAAI,EAAE,6BAA6B,EAAE;QAC3E,EAAE,GAAG,EAAE,8BAA8B,EAAE,IAAI,EAAE,8BAA8B,EAAE;QAC7E,EAAE,GAAG,EAAE,wBAAwB,EAAE,IAAI,EAAE,wBAAwB,EAAE;QACjE,EAAE,GAAG,EAAE,8BAA8B,EAAE,IAAI,EAAE,8BAA8B,EAAE;QAC7E,uDAAuD;QACvD,iEAAiE;QACjE,EAAE,GAAG,EAAE,qBAAqB,EAAE,IAAI,EAAE,qBAAqB,EAAE;QAC3D,EAAE,GAAG,EAAE,4BAA4B,EAAE,IAAI,EAAE,4BAA4B,EAAE;QACzE,EAAE,GAAG,EAAE,sCAAsC,EAAE,IAAI,EAAE,sCAAsC,EAAE;QAC7F,EAAE,GAAG,EAAE,8BAA8B,EAAE,IAAI,EAAE,8BAA8B,EAAE;QAC7E,EAAE,GAAG,EAAE,+BAA+B,EAAE,IAAI,EAAE,+BAA+B,EAAE;QAC/E,EAAE,GAAG,EAAE,iCAAiC,EAAE,IAAI,EAAE,iCAAiC,EAAE;QACnF,EAAE,GAAG,EAAE,2CAA2C,EAAE,IAAI,EAAE,2CAA2C,EAAE;QACvG,EAAE,GAAG,EAAE,kCAAkC,EAAE,IAAI,EAAE,kCAAkC,EAAE;QACrF,EAAE,GAAG,EAAE,iCAAiC,EAAE,IAAI,EAAE,iCAAiC,EAAE;QACnF,EAAE,GAAG,EAAE,wCAAwC,EAAE,IAAI,EAAE,wCAAwC,EAAE;QACjG,EAAE,GAAG,EAAE,yCAAyC,EAAE,IAAI,EAAE,yCAAyC,EAAE;QACnG,SAAS;QACT,EAAE,GAAG,EAAE,sBAAsB,EAAE,IAAI,EAAE,sBAAsB,EAAE;QAC7D,EAAE,GAAG,EAAE,wBAAwB,EAAE,IAAI,EAAE,wBAAwB,EAAE;QACjE,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,EAAE;QACjD,aAAa;QACb,EAAE,GAAG,EAAE,4BAA4B,EAAE,IAAI,EAAE,4BAA4B,EAAE;QACzE,EAAE,GAAG,EAAE,mCAAmC,EAAE,IAAI,EAAE,mCAAmC,EAAE;QACvF,EAAE,GAAG,EAAE,2BAA2B,EAAE,IAAI,EAAE,2BAA2B,EAAE;QACvE,gBAAgB;QAChB,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,EAAE;QACnD,EAAE,GAAG,EAAE,oBAAoB,EAAE,IAAI,EAAE,oBAAoB,EAAE;QACzD,aAAa;QACb;YACE,GAAG,EAAE,cAAc;YACnB,IAAI,EAAE,cAAc;YACpB,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;SACnF;QACD,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE;QACzC;YACE,GAAG,EAAE,cAAc;YACnB,IAAI,EAAE,cAAc;YACpB,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,EAAE,WAAW,CAAC;SAC9E;QACD,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE;QAC/C,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE;QACvC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,EAAE,WAAW,CAAC,EAAE;QACtH,SAAS;QACT,EAAE,GAAG,EAAE,2BAA2B,EAAE,IAAI,EAAE,2BAA2B,EAAE;QACvE,EAAE,GAAG,EAAE,6BAA6B,EAAE,IAAI,EAAE,6BAA6B,EAAE;KAC5E,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEtD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,IAAI,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAClD,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACvB,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACxC,CAAC;YACD,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,uCAAuC;YACvC,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACtC,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,IAAc,EAAE,OAAwB;IAC3E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACjC,GAAG,OAAO;YACV,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { init } from './commands/init.js';
4
+ import { dev } from './commands/dev.js';
5
+ import { build } from './commands/build.js';
6
+ import { dbSync } from './commands/db-sync.js';
7
+ import { addInfra } from './commands/add-infra.js';
8
+ const program = new Command();
9
+ program
10
+ .name('chaaskit')
11
+ .description('Create and manage ChaasKit applications')
12
+ .version('0.1.0');
13
+ // Create a new project
14
+ program
15
+ .command('create [project-name]')
16
+ .description('Create a new ChaasKit project')
17
+ .option('--template <template>', 'Template to use', 'default')
18
+ .option('--skip-install', 'Skip dependency installation')
19
+ .option('--use-npm', 'Use npm instead of pnpm')
20
+ .option('--use-yarn', 'Use yarn instead of pnpm')
21
+ .action(async (projectName, options) => {
22
+ await init(projectName, options);
23
+ });
24
+ // Dev server (for use inside a project)
25
+ program
26
+ .command('dev')
27
+ .description('Start development servers')
28
+ .option('-p, --port <port>', 'Backend port', '3000')
29
+ .option('--client-port <port>', 'Frontend port', '5173')
30
+ .action(async (options) => {
31
+ await dev(options);
32
+ });
33
+ // Build (for use inside a project)
34
+ program
35
+ .command('build')
36
+ .description('Build for production')
37
+ .action(async () => {
38
+ await build();
39
+ });
40
+ // Sync database schema
41
+ program
42
+ .command('db:sync')
43
+ .description('Sync Prisma schema from @chaaskit/db (preserves custom models)')
44
+ .option('-f, --force', 'Force update of modified core models')
45
+ .action(async (options) => {
46
+ await dbSync(options);
47
+ });
48
+ // Add infrastructure-as-code
49
+ program
50
+ .command('add-infra <provider>')
51
+ .description('Add infrastructure-as-code to your project (aws)')
52
+ .option('-n, --service-name <name>', 'Service name for AWS resources')
53
+ .action(async (provider, options) => {
54
+ await addInfra(provider, options);
55
+ });
56
+ program.parse();
57
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,yCAAyC,CAAC;KACtD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,uBAAuB;AACvB,OAAO;KACJ,OAAO,CAAC,uBAAuB,CAAC;KAChC,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,uBAAuB,EAAE,iBAAiB,EAAE,SAAS,CAAC;KAC7D,MAAM,CAAC,gBAAgB,EAAE,8BAA8B,CAAC;KACxD,MAAM,CAAC,WAAW,EAAE,yBAAyB,CAAC;KAC9C,MAAM,CAAC,YAAY,EAAE,0BAA0B,CAAC;KAChD,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE;IACrC,MAAM,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEL,wCAAwC;AACxC,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,2BAA2B,CAAC;KACxC,MAAM,CAAC,mBAAmB,EAAE,cAAc,EAAE,MAAM,CAAC;KACnD,MAAM,CAAC,sBAAsB,EAAE,eAAe,EAAE,MAAM,CAAC;KACvD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC,CAAC,CAAC;AAEL,mCAAmC;AACnC,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,KAAK,EAAE,CAAC;AAChB,CAAC,CAAC,CAAC;AAEL,uBAAuB;AACvB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,aAAa,EAAE,sCAAsC,CAAC;KAC7D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC;AAEL,6BAA6B;AAC7B,OAAO;KACJ,OAAO,CAAC,sBAAsB,CAAC;KAC/B,WAAW,CAAC,kDAAkD,CAAC;KAC/D,MAAM,CAAC,2BAA2B,EAAE,gCAAgC,CAAC;KACrE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;IAClC,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,24 @@
1
+ # Application URLs
2
+ APP_URL=http://localhost:5173
3
+ API_URL=http://localhost:3000
4
+
5
+ # Database
6
+ DATABASE_URL="postgresql://user:password@localhost:5432/{{DB_NAME}}?schema=public"
7
+
8
+ # Authentication Secrets (generate with: openssl rand -base64 32)
9
+ SESSION_SECRET=your-session-secret-min-32-characters-here
10
+ JWT_SECRET=your-jwt-secret-min-32-characters-here
11
+
12
+ # AI Provider (at least one required)
13
+ OPENAI_API_KEY=
14
+ ANTHROPIC_API_KEY=
15
+
16
+ # Optional: Stripe (for payments)
17
+ STRIPE_SECRET_KEY=
18
+ STRIPE_WEBHOOK_SECRET=
19
+
20
+ # Optional: OAuth Providers
21
+ GOOGLE_CLIENT_ID=
22
+ GOOGLE_CLIENT_SECRET=
23
+ GITHUB_CLIENT_ID=
24
+ GITHUB_CLIENT_SECRET=
@@ -0,0 +1,81 @@
1
+ # {{PROJECT_NAME}}
2
+
3
+ AI-powered chat application built with ChaasKit.
4
+
5
+ ## Getting Started
6
+
7
+ 1. **Install dependencies**
8
+ ```bash
9
+ pnpm install
10
+ ```
11
+
12
+ 2. **Configure environment**
13
+ ```bash
14
+ cp .env.example .env
15
+ # Edit .env with your API keys and database URL
16
+ ```
17
+
18
+ 3. **Setup database**
19
+ ```bash
20
+ pnpm db:push
21
+ ```
22
+
23
+ 4. **Start development**
24
+ ```bash
25
+ pnpm dev
26
+ ```
27
+
28
+ ## Configuration
29
+
30
+ Edit `config/app.config.ts` to customize:
31
+ - App name and branding
32
+ - Theme colors
33
+ - Authentication methods
34
+ - AI provider and model
35
+ - Payment plans
36
+ - And more...
37
+
38
+ ## Extensions
39
+
40
+ Add custom functionality in the `extensions/` directory:
41
+
42
+ - `extensions/agents/` - Custom AI agents
43
+ - `extensions/payment-plans/` - Custom pricing plans
44
+ - `extensions/pages/` - Custom pages for the frontend
45
+
46
+ ## Commands
47
+
48
+ - `pnpm dev` - Start development servers
49
+ - `pnpm build` - Build for production
50
+ - `pnpm start` - Start production server
51
+ - `pnpm db:push` - Push database schema
52
+ - `pnpm db:studio` - Open database GUI
53
+
54
+ ## Using Local/Development Packages
55
+
56
+ To test unreleased features or contribute to the core packages:
57
+
58
+ ```bash
59
+ # Clone the monorepo
60
+ git clone https://github.com/your-repo/chaaskit
61
+ cd chaaskit
62
+
63
+ # Build and link packages globally
64
+ pnpm build
65
+ pnpm -r exec pnpm link --global
66
+
67
+ # In your project directory, link the local packages
68
+ cd /path/to/your-project
69
+ pnpm link --global @chaaskit/server @chaaskit/client @chaaskit/db @chaaskit/shared
70
+ ```
71
+
72
+ After making changes to the monorepo, rebuild to update linked packages:
73
+
74
+ ```bash
75
+ cd /path/to/chaaskit
76
+ pnpm build
77
+ ```
78
+
79
+ ## Documentation
80
+
81
+ For full documentation, see the `docs/` directory or visit the [ChaasKit docs](https://github.com/your-repo/chat-saas).
@@ -0,0 +1,10 @@
1
+ // Client-only component for Accept Invite page
2
+ import { ChatProviders, AcceptInvitePage } from '@chaaskit/client';
3
+
4
+ export default function AcceptInviteClient() {
5
+ return (
6
+ <ChatProviders>
7
+ <AcceptInvitePage />
8
+ </ChatProviders>
9
+ );
10
+ }
@@ -0,0 +1,10 @@
1
+ // Client-only component for Admin Dashboard page
2
+ import { ChatProviders, AdminDashboardPage } from '@chaaskit/client';
3
+
4
+ export default function AdminDashboardClient() {
5
+ return (
6
+ <ChatProviders>
7
+ <AdminDashboardPage />
8
+ </ChatProviders>
9
+ );
10
+ }
@@ -0,0 +1,10 @@
1
+ // Client-only component for Admin Team detail page
2
+ import { ChatProviders, AdminTeamPage } from '@chaaskit/client';
3
+
4
+ export default function AdminTeamClient() {
5
+ return (
6
+ <ChatProviders>
7
+ <AdminTeamPage />
8
+ </ChatProviders>
9
+ );
10
+ }
@@ -0,0 +1,10 @@
1
+ // Client-only component for Admin Teams page
2
+ import { ChatProviders, AdminTeamsPage } from '@chaaskit/client';
3
+
4
+ export default function AdminTeamsClient() {
5
+ return (
6
+ <ChatProviders>
7
+ <AdminTeamsPage />
8
+ </ChatProviders>
9
+ );
10
+ }
@@ -0,0 +1,10 @@
1
+ // Client-only component for Admin Users page
2
+ import { ChatProviders, AdminUsersPage } from '@chaaskit/client';
3
+
4
+ export default function AdminUsersClient() {
5
+ return (
6
+ <ChatProviders>
7
+ <AdminUsersPage />
8
+ </ChatProviders>
9
+ );
10
+ }
@@ -0,0 +1,10 @@
1
+ // Client-only component for API Keys page
2
+ import { ChatProviders, ApiKeysPage } from '@chaaskit/client';
3
+
4
+ export default function ApiKeysClient() {
5
+ return (
6
+ <ChatProviders>
7
+ <ApiKeysPage />
8
+ </ChatProviders>
9
+ );
10
+ }
@@ -0,0 +1,10 @@
1
+ // Client-only component for Automations (Scheduled Prompts) page
2
+ import { ChatProviders, ScheduledPromptsPage } from '@chaaskit/client';
3
+
4
+ export default function AutomationsClient() {
5
+ return (
6
+ <ChatProviders>
7
+ <ScheduledPromptsPage />
8
+ </ChatProviders>
9
+ );
10
+ }
@@ -0,0 +1,13 @@
1
+ // This file is only imported on the client side via dynamic import
2
+ // It uses @chaaskit/client components directly
3
+ import { ChatProviders, MainLayout, ChatPage } from '@chaaskit/client';
4
+
5
+ export default function ChatClient() {
6
+ return (
7
+ <ChatProviders>
8
+ <MainLayout>
9
+ <ChatPage />
10
+ </MainLayout>
11
+ </ChatProviders>
12
+ );
13
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Re-export ClientOnly from @chaaskit/client/ssr-utils for convenience.
3
+ * This allows routes to import from local components if needed.
4
+ * Uses ssr-utils to avoid pulling in browser-only dependencies during SSR.
5
+ */
6
+ export { ClientOnly } from '@chaaskit/client/ssr-utils';
@@ -0,0 +1,10 @@
1
+ // Client-only component for Documents page
2
+ import { ChatProviders, DocumentsPage } from '@chaaskit/client';
3
+
4
+ export default function DocumentsClient() {
5
+ return (
6
+ <ChatProviders>
7
+ <DocumentsPage />
8
+ </ChatProviders>
9
+ );
10
+ }
@@ -0,0 +1,10 @@
1
+ // Client-only component for OAuth Consent page
2
+ import { ChatProviders, OAuthConsentPage } from '@chaaskit/client';
3
+
4
+ export default function OAuthConsentClient() {
5
+ return (
6
+ <ChatProviders>
7
+ <OAuthConsentPage />
8
+ </ChatProviders>
9
+ );
10
+ }
@@ -0,0 +1,10 @@
1
+ // Client-only component for Pricing page
2
+ import { ChatProviders, PricingPage } from '@chaaskit/client';
3
+
4
+ export default function PricingClient() {
5
+ return (
6
+ <ChatProviders>
7
+ <PricingPage />
8
+ </ChatProviders>
9
+ );
10
+ }
@@ -0,0 +1,10 @@
1
+ // Client-only component for Team Settings page
2
+ import { ChatProviders, TeamSettingsPage } from '@chaaskit/client';
3
+
4
+ export default function TeamSettingsClient() {
5
+ return (
6
+ <ChatProviders>
7
+ <TeamSettingsPage />
8
+ </ChatProviders>
9
+ );
10
+ }
@@ -0,0 +1,10 @@
1
+ // Client-only component for Email Verification page
2
+ import { ChatProviders, VerifyEmailPage } from '@chaaskit/client';
3
+
4
+ export default function VerifyEmailClient() {
5
+ return (
6
+ <ChatProviders>
7
+ <VerifyEmailPage />
8
+ </ChatProviders>
9
+ );
10
+ }
@@ -0,0 +1,12 @@
1
+ import { startTransition, StrictMode } from 'react';
2
+ import { hydrateRoot } from 'react-dom/client';
3
+ import { HydratedRouter } from 'react-router/dom';
4
+
5
+ startTransition(() => {
6
+ hydrateRoot(
7
+ document,
8
+ <StrictMode>
9
+ <HydratedRouter />
10
+ </StrictMode>
11
+ );
12
+ });
@@ -0,0 +1,67 @@
1
+ import { PassThrough } from 'node:stream';
2
+ import { isbot } from 'isbot';
3
+ import { renderToPipeableStream } from 'react-dom/server';
4
+ import { ServerRouter } from 'react-router';
5
+ import { createReadableStreamFromReadable } from '@react-router/node';
6
+ import type { EntryContext } from 'react-router';
7
+
8
+ const ABORT_DELAY = 5_000;
9
+
10
+ export default function handleRequest(
11
+ request: Request,
12
+ responseStatusCode: number,
13
+ responseHeaders: Headers,
14
+ routerContext: EntryContext
15
+ ) {
16
+ return new Promise((resolve, reject) => {
17
+ let shellRendered = false;
18
+ const userAgent = request.headers.get('user-agent');
19
+ const isBotRequest = userAgent && isbot(userAgent);
20
+
21
+ const { pipe, abort } = renderToPipeableStream(
22
+ <ServerRouter context={routerContext} url={request.url} />,
23
+ {
24
+ onShellReady() {
25
+ shellRendered = true;
26
+ // For bots, wait for onAllReady instead
27
+ if (!isBotRequest) {
28
+ const body = new PassThrough();
29
+ responseHeaders.set('Content-Type', 'text/html');
30
+ resolve(
31
+ new Response(createReadableStreamFromReadable(body), {
32
+ headers: responseHeaders,
33
+ status: responseStatusCode,
34
+ })
35
+ );
36
+ pipe(body);
37
+ }
38
+ },
39
+ onAllReady() {
40
+ // For bots, send the full rendered content
41
+ if (isBotRequest) {
42
+ const body = new PassThrough();
43
+ responseHeaders.set('Content-Type', 'text/html');
44
+ resolve(
45
+ new Response(createReadableStreamFromReadable(body), {
46
+ headers: responseHeaders,
47
+ status: responseStatusCode,
48
+ })
49
+ );
50
+ pipe(body);
51
+ }
52
+ },
53
+ onShellError(error: unknown) {
54
+ reject(error);
55
+ },
56
+ onError(error: unknown) {
57
+ responseStatusCode = 500;
58
+ if (shellRendered) {
59
+ console.error(error);
60
+ }
61
+ },
62
+ }
63
+ );
64
+
65
+ setTimeout(abort, ABORT_DELAY);
66
+ });
67
+ }