@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,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateNextConfig = generateNextConfig;
4
+ exports.generateTsConfig = generateTsConfig;
5
+ exports.generateTailwindConfig = generateTailwindConfig;
6
+ exports.generatePostcssConfig = generatePostcssConfig;
7
+ exports.generateGlobalsCss = generateGlobalsCss;
8
+ function generateNextConfig() {
9
+ return `// @chimerai component=NextConfig version=1.0
10
+ /** @type {import('next').NextConfig} */
11
+ const nextConfig = {
12
+ reactStrictMode: true,
13
+ };
14
+
15
+ module.exports = nextConfig;
16
+ `;
17
+ }
18
+ function generateTsConfig() {
19
+ return `{
20
+ "compilerOptions": {
21
+ "target": "ES2017",
22
+ "lib": ["dom", "dom.iterable", "esnext"],
23
+ "allowJs": true,
24
+ "skipLibCheck": true,
25
+ "strict": true,
26
+ "noEmit": true,
27
+ "esModuleInterop": true,
28
+ "module": "esnext",
29
+ "moduleResolution": "bundler",
30
+ "resolveJsonModule": true,
31
+ "isolatedModules": true,
32
+ "jsx": "preserve",
33
+ "incremental": true,
34
+ "plugins": [
35
+ {
36
+ "name": "next"
37
+ }
38
+ ],
39
+ "paths": {
40
+ "@/*": ["./*"]
41
+ }
42
+ },
43
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
44
+ "exclude": ["node_modules"]
45
+ }
46
+ `;
47
+ }
48
+ function generateTailwindConfig() {
49
+ return `// @chimerai component=TailwindConfig version=1.0
50
+ /** @type {import('tailwindcss').Config} */
51
+ module.exports = {
52
+ darkMode: 'class',
53
+ content: [
54
+ './pages/**/*.{js,ts,jsx,tsx,mdx}',
55
+ './components/**/*.{js,ts,jsx,tsx,mdx}',
56
+ './app/**/*.{js,ts,jsx,tsx,mdx}',
57
+ ],
58
+ theme: {
59
+ extend: {},
60
+ },
61
+ plugins: [],
62
+ };
63
+ `;
64
+ }
65
+ function generatePostcssConfig() {
66
+ return `module.exports = {
67
+ plugins: {
68
+ tailwindcss: {},
69
+ autoprefixer: {},
70
+ },
71
+ };
72
+ `;
73
+ }
74
+ function generateGlobalsCss() {
75
+ return `/* @chimerai component=GlobalsCss version=1.3 */
76
+ @tailwind base;
77
+ @tailwind components;
78
+ @tailwind utilities;
79
+
80
+ @layer base {
81
+ body {
82
+ @apply bg-background text-foreground;
83
+ }
84
+ }
85
+ `;
86
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Docker & Deploy Template Generators
3
+ * Generates Dockerfile, .dockerignore, and docker-compose configurations
4
+ * for both development and production deployments.
5
+ */
6
+ /**
7
+ * Multi-stage Dockerfile for Next.js standalone production build.
8
+ * Stages: base → deps → builder → runner
9
+ */
10
+ export declare function generateDockerfile(): string;
11
+ /**
12
+ * Standard .dockerignore for Next.js projects.
13
+ */
14
+ export declare function generateDockerignore(): string;
15
+ /**
16
+ * Production docker-compose with Next.js app + PostgreSQL.
17
+ * Includes healthchecks and proper restart policies.
18
+ */
19
+ export declare function generateDockerComposeProd(): string;
20
+ /**
21
+ * Development docker-compose with PostgreSQL + Redis.
22
+ * Used by `chimerai create` for local development setup.
23
+ */
24
+ export declare function generateDockerComposeDev(): string;
25
+ //# sourceMappingURL=docker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/templates/docker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAsC3C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAe7C;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CA2ClD;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAuCjD"}
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ /**
3
+ * Docker & Deploy Template Generators
4
+ * Generates Dockerfile, .dockerignore, and docker-compose configurations
5
+ * for both development and production deployments.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.generateDockerfile = generateDockerfile;
9
+ exports.generateDockerignore = generateDockerignore;
10
+ exports.generateDockerComposeProd = generateDockerComposeProd;
11
+ exports.generateDockerComposeDev = generateDockerComposeDev;
12
+ /**
13
+ * Multi-stage Dockerfile for Next.js standalone production build.
14
+ * Stages: base → deps → builder → runner
15
+ */
16
+ function generateDockerfile() {
17
+ return `# @chimerai component=Dockerfile version=1.0
18
+ # ---- Base ----
19
+ FROM node:20-alpine AS base
20
+ RUN corepack enable && corepack prepare pnpm@latest --activate
21
+ WORKDIR /app
22
+
23
+ # ---- Dependencies ----
24
+ FROM base AS deps
25
+ COPY package.json pnpm-lock.yaml* ./
26
+ COPY prisma ./prisma/
27
+ RUN pnpm install --frozen-lockfile
28
+ RUN npx prisma generate
29
+
30
+ # ---- Build ----
31
+ FROM base AS builder
32
+ COPY --from=deps /app/node_modules ./node_modules
33
+ COPY . .
34
+ ENV NEXT_TELEMETRY_DISABLED=1
35
+ RUN pnpm build
36
+
37
+ # ---- Production ----
38
+ FROM base AS runner
39
+ ENV NODE_ENV=production
40
+ ENV NEXT_TELEMETRY_DISABLED=1
41
+ RUN addgroup --system --gid 1001 nodejs
42
+ RUN adduser --system --uid 1001 nextjs
43
+ COPY --from=builder /app/public ./public
44
+ COPY --from=builder /app/.next/standalone ./
45
+ COPY --from=builder /app/.next/static ./.next/static
46
+ COPY --from=builder /app/prisma ./prisma
47
+ COPY --from=deps /app/node_modules/.prisma ./node_modules/.prisma
48
+ USER nextjs
49
+ EXPOSE 3000
50
+ ENV PORT=3000
51
+ ENV HOSTNAME="0.0.0.0"
52
+ CMD ["node", "server.js"]
53
+ `;
54
+ }
55
+ /**
56
+ * Standard .dockerignore for Next.js projects.
57
+ */
58
+ function generateDockerignore() {
59
+ return `# @chimerai component=Dockerignore version=1.0
60
+ node_modules
61
+ .next
62
+ .git
63
+ .env
64
+ .env.local
65
+ .env*.local
66
+ *.md
67
+ .vscode
68
+ .idea
69
+ coverage
70
+ .turbo
71
+ dist
72
+ `;
73
+ }
74
+ /**
75
+ * Production docker-compose with Next.js app + PostgreSQL.
76
+ * Includes healthchecks and proper restart policies.
77
+ */
78
+ function generateDockerComposeProd() {
79
+ return `# @chimerai component=DockerComposeProd version=1.0
80
+ services:
81
+ app:
82
+ build: .
83
+ container_name: chimerai-app
84
+ restart: unless-stopped
85
+ ports:
86
+ - '3000:3000'
87
+ environment:
88
+ - DATABASE_URL=\${DATABASE_URL}
89
+ - NEXTAUTH_SECRET=\${NEXTAUTH_SECRET}
90
+ - NEXTAUTH_URL=\${NEXTAUTH_URL}
91
+ depends_on:
92
+ postgres:
93
+ condition: service_healthy
94
+ healthcheck:
95
+ test: ["CMD", "wget", "--spider", "-q", "http://localhost:3000/api/health"]
96
+ interval: 30s
97
+ timeout: 10s
98
+ retries: 3
99
+
100
+ postgres:
101
+ image: postgres:16-alpine
102
+ container_name: chimerai-postgres
103
+ restart: unless-stopped
104
+ environment:
105
+ POSTGRES_USER: \${POSTGRES_USER:-postgres}
106
+ POSTGRES_PASSWORD: \${POSTGRES_PASSWORD:-postgres}
107
+ POSTGRES_DB: \${POSTGRES_DB:-chimerai_db}
108
+ ports:
109
+ - '5432:5432'
110
+ volumes:
111
+ - postgres_data:/var/lib/postgresql/data
112
+ healthcheck:
113
+ test: ["CMD-SHELL", "pg_isready -U postgres"]
114
+ interval: 10s
115
+ timeout: 5s
116
+ retries: 5
117
+
118
+ volumes:
119
+ postgres_data:
120
+ `;
121
+ }
122
+ /**
123
+ * Development docker-compose with PostgreSQL + Redis.
124
+ * Used by `chimerai create` for local development setup.
125
+ */
126
+ function generateDockerComposeDev() {
127
+ return `# @chimerai component=DockerComposeDev version=1.0
128
+ services:
129
+ postgres:
130
+ image: postgres:16-alpine
131
+ container_name: myapp-postgres
132
+ restart: unless-stopped
133
+ environment:
134
+ POSTGRES_USER: postgres
135
+ POSTGRES_PASSWORD: postgres
136
+ POSTGRES_DB: myapp_db
137
+ ports:
138
+ - '5432:5432'
139
+ volumes:
140
+ - postgres_data:/var/lib/postgresql/data
141
+ healthcheck:
142
+ test: ["CMD-SHELL", "pg_isready -U postgres"]
143
+ interval: 10s
144
+ timeout: 5s
145
+ retries: 5
146
+
147
+ redis:
148
+ image: redis:7-alpine
149
+ container_name: myapp-redis
150
+ restart: unless-stopped
151
+ ports:
152
+ - '6379:6379'
153
+ volumes:
154
+ - redis_data:/data
155
+ healthcheck:
156
+ test: ["CMD", "redis-cli", "ping"]
157
+ interval: 10s
158
+ timeout: 5s
159
+ retries: 5
160
+
161
+ volumes:
162
+ postgres_data:
163
+ redis_data:
164
+ `;
165
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * GDPR Compliance Templates
3
+ * Consent management, data export, account deletion
4
+ */
5
+ /** lib/gdpr.ts — GDPR helpers */
6
+ export declare function generateGdprLib(): string;
7
+ /** app/gdpr/page.tsx — GDPR self-service portal */
8
+ export declare function generateGdprPage(): string;
9
+ /** app/api/gdpr/consent/route.ts */
10
+ export declare function generateGdprConsentRoute(): string;
11
+ /**
12
+ * Prisma schema extension: ConsentLog model for GDPR consent tracking.
13
+ * SQLite-safe: no @db.Text, no Json, no arrays.
14
+ */
15
+ export declare const GDPR_SCHEMA_EXTENSION = "\nmodel ConsentLog {\n id String @id @default(cuid())\n userId String\n type String\n granted Boolean\n createdAt DateTime @default(now())\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@index([userId])\n @@index([type])\n}\n";
16
+ //# sourceMappingURL=gdpr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gdpr.d.ts","sourceRoot":"","sources":["../../src/templates/gdpr.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iCAAiC;AACjC,wBAAgB,eAAe,IAAI,MAAM,CAsExC;AAED,mDAAmD;AACnD,wBAAgB,gBAAgB,IAAI,MAAM,CAwIzC;AAED,oCAAoC;AACpC,wBAAgB,wBAAwB,IAAI,MAAM,CAoBjD;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,6SAYjC,CAAC"}
@@ -0,0 +1,259 @@
1
+ "use strict";
2
+ /**
3
+ * GDPR Compliance Templates
4
+ * Consent management, data export, account deletion
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.GDPR_SCHEMA_EXTENSION = void 0;
8
+ exports.generateGdprLib = generateGdprLib;
9
+ exports.generateGdprPage = generateGdprPage;
10
+ exports.generateGdprConsentRoute = generateGdprConsentRoute;
11
+ /** lib/gdpr.ts — GDPR helpers */
12
+ function generateGdprLib() {
13
+ return `// @chimerai component=GdprLib version=1.0
14
+ import { prisma } from '@/lib/prisma';
15
+
16
+ /**
17
+ * Export all personal data for a user as a JSON object.
18
+ */
19
+ export async function exportUserData(userId: string): Promise<Record<string, unknown>> {
20
+ const user = await (prisma as any).user.findUnique({
21
+ where: { id: userId },
22
+ include: {
23
+ sessions: true,
24
+ accounts: true,
25
+ },
26
+ });
27
+
28
+ if (!user) throw new Error('User not found');
29
+
30
+ // Remove sensitive internal fields
31
+ const { password, mfaSecret, ...safeUser } = user as any;
32
+
33
+ return {
34
+ exportedAt: new Date().toISOString(),
35
+ user: safeUser,
36
+ };
37
+ }
38
+
39
+ /**
40
+ * Delete all personal data for a user (GDPR right to erasure).
41
+ * Deletes sessions, accounts and the user record itself.
42
+ */
43
+ export async function deleteUserData(userId: string): Promise<void> {
44
+ await (prisma as any).session.deleteMany({ where: { userId } });
45
+ await (prisma as any).account.deleteMany({ where: { userId } });
46
+ await (prisma as any).user.delete({ where: { id: userId } });
47
+ }
48
+
49
+ /**
50
+ * Record a consent decision for a user.
51
+ */
52
+ export async function recordConsent(
53
+ userId: string,
54
+ type: string,
55
+ granted: boolean
56
+ ): Promise<void> {
57
+ await (prisma as any).consentLog.create({
58
+ data: { userId, type, granted },
59
+ });
60
+ }
61
+
62
+ /**
63
+ * Get the latest consent status for each type for a user.
64
+ */
65
+ export async function getConsentStatus(
66
+ userId: string
67
+ ): Promise<Record<string, boolean>> {
68
+ const logs = await (prisma as any).consentLog.findMany({
69
+ where: { userId },
70
+ orderBy: { createdAt: 'desc' },
71
+ });
72
+
73
+ const result: Record<string, boolean> = {};
74
+ for (const log of logs as any[]) {
75
+ if (!(log.type in result)) {
76
+ result[log.type] = log.granted;
77
+ }
78
+ }
79
+ return result;
80
+ }
81
+ `;
82
+ }
83
+ /** app/gdpr/page.tsx — GDPR self-service portal */
84
+ function generateGdprPage() {
85
+ return `// @chimerai component=GdprPage version=1.0
86
+ 'use client';
87
+
88
+ import { useState } from 'react';
89
+
90
+ type ConsentState = Record<string, boolean>;
91
+
92
+ export default function GdprPage() {
93
+ const [consent, setConsent] = useState<ConsentState>({
94
+ analytics: false,
95
+ marketing: false,
96
+ });
97
+ const [exportStatus, setExportStatus] = useState<'idle' | 'loading' | 'done'>('idle');
98
+ const [deleteStatus, setDeleteStatus] = useState<'idle' | 'confirm' | 'loading' | 'done'>('idle');
99
+ const [saveStatus, setSaveStatus] = useState<'idle' | 'saving' | 'saved'>('idle');
100
+
101
+ async function saveConsent() {
102
+ setSaveStatus('saving');
103
+ await fetch('/api/gdpr/consent', {
104
+ method: 'POST',
105
+ headers: { 'Content-Type': 'application/json' },
106
+ body: JSON.stringify({ consent }),
107
+ });
108
+ setSaveStatus('saved');
109
+ setTimeout(() => setSaveStatus('idle'), 2000);
110
+ }
111
+
112
+ async function exportData() {
113
+ setExportStatus('loading');
114
+ const res = await fetch('/api/gdpr/export');
115
+ const blob = await res.blob();
116
+ const url = URL.createObjectURL(blob);
117
+ const a = document.createElement('a');
118
+ a.href = url;
119
+ a.download = \`my-data-\${new Date().toISOString().slice(0, 10)}.json\`;
120
+ a.click();
121
+ setExportStatus('done');
122
+ setTimeout(() => setExportStatus('idle'), 3000);
123
+ }
124
+
125
+ async function deleteAccount() {
126
+ setDeleteStatus('loading');
127
+ const res = await fetch('/api/gdpr/delete', { method: 'DELETE' });
128
+ if (res.ok) {
129
+ setDeleteStatus('done');
130
+ setTimeout(() => (window.location.href = '/'), 2000);
131
+ }
132
+ }
133
+
134
+ return (
135
+ <div className="max-w-2xl mx-auto py-10 px-4 space-y-10">
136
+ <div>
137
+ <h1 className="text-2xl font-bold mb-1">Privacy & Data</h1>
138
+ <p className="text-gray-500 text-sm">Manage your personal data and consent preferences.</p>
139
+ </div>
140
+
141
+ {/* Consent */}
142
+ <section className="border rounded-xl p-6 space-y-4">
143
+ <h2 className="text-lg font-semibold">Consent Preferences</h2>
144
+ {Object.keys(consent).map((key) => (
145
+ <label key={key} className="flex items-center gap-3 cursor-pointer">
146
+ <input
147
+ type="checkbox"
148
+ checked={consent[key]}
149
+ onChange={(e) => setConsent((c) => ({ ...c, [key]: e.target.checked }))}
150
+ className="w-4 h-4 rounded"
151
+ />
152
+ <span className="capitalize text-sm">{key}</span>
153
+ </label>
154
+ ))}
155
+ <button
156
+ onClick={saveConsent}
157
+ disabled={saveStatus === 'saving'}
158
+ className="mt-2 bg-blue-600 text-white px-4 py-2 rounded-lg text-sm hover:bg-blue-700 disabled:opacity-50"
159
+ >
160
+ {saveStatus === 'saved' ? '✓ Saved' : saveStatus === 'saving' ? 'Saving...' : 'Save Preferences'}
161
+ </button>
162
+ </section>
163
+
164
+ {/* Export */}
165
+ <section className="border rounded-xl p-6 space-y-3">
166
+ <h2 className="text-lg font-semibold">Export My Data</h2>
167
+ <p className="text-sm text-gray-500">
168
+ Download a copy of all personal data we hold about you (JSON format).
169
+ </p>
170
+ <button
171
+ onClick={exportData}
172
+ disabled={exportStatus === 'loading'}
173
+ className="bg-gray-800 text-white px-4 py-2 rounded-lg text-sm hover:bg-gray-700 disabled:opacity-50"
174
+ >
175
+ {exportStatus === 'loading' ? 'Preparing...' : exportStatus === 'done' ? '✓ Downloaded' : 'Download My Data'}
176
+ </button>
177
+ </section>
178
+
179
+ {/* Delete */}
180
+ <section className="border border-red-200 rounded-xl p-6 space-y-3">
181
+ <h2 className="text-lg font-semibold text-red-700">Delete My Account</h2>
182
+ <p className="text-sm text-gray-500">
183
+ Permanently delete your account and all associated data. This action cannot be undone.
184
+ </p>
185
+ {deleteStatus === 'idle' && (
186
+ <button
187
+ onClick={() => setDeleteStatus('confirm')}
188
+ className="bg-red-600 text-white px-4 py-2 rounded-lg text-sm hover:bg-red-700"
189
+ >
190
+ Delete My Account
191
+ </button>
192
+ )}
193
+ {deleteStatus === 'confirm' && (
194
+ <div className="space-y-2">
195
+ <p className="text-sm font-medium text-red-700">Are you sure? This cannot be undone.</p>
196
+ <div className="flex gap-2">
197
+ <button
198
+ onClick={deleteAccount}
199
+ className="bg-red-600 text-white px-4 py-2 rounded-lg text-sm hover:bg-red-700"
200
+ >
201
+ Yes, delete everything
202
+ </button>
203
+ <button
204
+ onClick={() => setDeleteStatus('idle')}
205
+ className="border px-4 py-2 rounded-lg text-sm hover:bg-gray-50"
206
+ >
207
+ Cancel
208
+ </button>
209
+ </div>
210
+ </div>
211
+ )}
212
+ {deleteStatus === 'done' && (
213
+ <p className="text-sm text-green-700">✓ Account deleted. Redirecting...</p>
214
+ )}
215
+ </section>
216
+ </div>
217
+ );
218
+ }
219
+ `;
220
+ }
221
+ /** app/api/gdpr/consent/route.ts */
222
+ function generateGdprConsentRoute() {
223
+ return `// @chimerai component=GdprConsentRoute version=1.0
224
+ import { NextRequest, NextResponse } from 'next/server';
225
+ import { getServerSession } from 'next-auth';
226
+ import { authOptions } from '@/lib/auth';
227
+ import { recordConsent } from '@/lib/gdpr';
228
+
229
+ export async function POST(req: NextRequest) {
230
+ const session = await getServerSession(authOptions);
231
+ if (!session?.user?.id) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
232
+
233
+ const { consent } = await req.json() as { consent: Record<string, boolean> };
234
+
235
+ for (const [type, granted] of Object.entries(consent)) {
236
+ await recordConsent(session.user.id, type, granted);
237
+ }
238
+
239
+ return NextResponse.json({ success: true });
240
+ }
241
+ `;
242
+ }
243
+ /**
244
+ * Prisma schema extension: ConsentLog model for GDPR consent tracking.
245
+ * SQLite-safe: no @db.Text, no Json, no arrays.
246
+ */
247
+ exports.GDPR_SCHEMA_EXTENSION = `
248
+ model ConsentLog {
249
+ id String @id @default(cuid())
250
+ userId String
251
+ type String
252
+ granted Boolean
253
+ createdAt DateTime @default(now())
254
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
255
+
256
+ @@index([userId])
257
+ @@index([type])
258
+ }
259
+ `;
@@ -0,0 +1,77 @@
1
+ /**
2
+ * ChimerAI CLI Template Generators - Main Export
3
+ *
4
+ * This module exports all template generator functions for use in CLI commands.
5
+ * Each generator function returns a string of TypeScript/TSX/CSS code that can be
6
+ * written to a file in the generated project.
7
+ */
8
+ export { generateNextConfig, generateTsConfig, generateTailwindConfig, generatePostcssConfig, generateGlobalsCss, } from './config.js';
9
+ export { generateAppLayout, generateAppLayoutWithAuth, generateAppPage, generateAuthBasicLayout, generateDashboardLayout, generateDashboardPage, generateProfilePage, generateUserProfileRoute, generateSettingsPage, generateUseAppNameHook, } from './layout.js';
10
+ export { generateNextAuthRoute, generateLoginPage, generateSessionProvider, generateLogoutButton, generateNextAuthTypes, generateAuthLib, generateResolveAuth, } from './auth.js';
11
+ export { generateChatPage, generateUseChatHook, generateChatMessage, generateChatInput, generateChatSidebar, generateModelSelector, generateChatStreamRouteWithPersistence, generateConversationsRoute, generateConversationDetailRoute, } from './chat.js';
12
+ export { generateAdminLayout, generateAdminDashboardPage, generateAdminUsersPage, generateAdminRolesPage, generateAdminSettingsPage, generateAdminLogsPage, generateAuditLogHelper, generatePermissionsLib, generateRequirePermissionLib, } from './admin.js';
13
+ export { generateModelProvidersPage, generatePromptManagementPage, generatePromptSelector } from './components.js';
14
+ export { generateAdminUsersRoute, generateAdminUsersIdRoute, generateAdminRolesRoute, generateAdminRolesIdRoute, generatePromptsRoute, generatePromptsIdRoute, generatePromptsSetDefaultRoute, generateHealthRoute, generateModelsRoute, generateV1ModelsRoute, generateAuditLogRoute, generateGdprDataExportRoute, generateGdprAccountDeleteRoute, generateAdminSettingsRoute, generateAppSettingsRoute, } from './api-routes.js';
15
+ export { generateProviderCrudRoute, generateProviderIdRoute, generateProviderTestRoute, generateProviderSyncRoute, generateInternalProvidersRoute, generateInternalProviderIdRoute, generateInternalProviderUsageRoute, generateNotifyProviderChangeLib, } from './provider-routes.js';
16
+ export { generatePrismaLib, generateEncryptionLib, generateApiKeyAuthLib, generateApiProtectionLib, generatePrismaSchema, } from './prisma.js';
17
+ export { generateMiddleware } from './middleware.js';
18
+ export { generateStripeLib, generateBillingPage, generateCheckoutRoute, generatePortalRoute, generateSubscriptionRoute, generateStripeWebhookRoute, } from './billing.js';
19
+ export { generateRagLib, generateRagPage, generateRagUploadRoute, generateRagQueryRoute, generateRagStatsRoute, generateRagClearRoute, generateRagDeleteRoute, } from './rag.js';
20
+ export { generateWidgetBundle, generateWidgetLoader, generateApiKeyManagementPage, generateApiKeysRoute, generateApiKeyIdRoute, generateRateLimiter, } from './widget.js';
21
+ export { generateMfaLib, generateMfaSetupRoute, generateMfaVerifyRoute, generateMfaDisableRoute, generateMfaPage, MFA_SCHEMA_EXTENSION, MFA_USER_FIELDS, } from './mfa.js';
22
+ export { generateGdprLib, generateGdprPage, generateGdprConsentRoute, GDPR_SCHEMA_EXTENSION, } from './gdpr.js';
23
+ export { generateDockerfile, generateDockerignore, generateDockerComposeProd, generateDockerComposeDev, } from './docker.js';
24
+ export { readAiManifest, writeAiManifest, TOOL_INFO, generateProviderClient, generateServicesInit, generateChatService, generateModelService, generateModerationService, generateEmbeddingService, generateRagService, generateVectorStore, generateGuardrailsService, generateAiServiceMain, generateAiServiceConfig, generateAiServiceModels, generateAiServiceRequirements, generateAiServiceDockerfile, generateAiServiceReadme, generateDockerComposeAiService, generateFileExtractor, } from './ai-service.js';
25
+ export type { AiServiceManifest, ToolInfo } from './ai-service.js';
26
+ export { generateChatRoutes, generateRagRoutes, generateGuardrailsRoutes, generateToolsRoutes, generateRoutesInit, } from './ai-routes.js';
27
+ export { generateWebTools, generateDocumentTools, generateCodeTools, generateNlpTools, generateVisionTools, generateGoogleSheetsTools, generateAirtableTools, generateDeeplTools, generateWebhookTools, generateToolsInit, TOOL_GENERATORS, } from './ai-service-tools.js';
28
+ /**
29
+ * All available templates organized by category
30
+ * Used for listing and querying templates programmatically
31
+ */
32
+ export declare const ALL_TEMPLATES: {
33
+ config: string[];
34
+ layout: string[];
35
+ auth: string[];
36
+ chat: string[];
37
+ admin: string[];
38
+ components: string[];
39
+ apiRoutes: string[];
40
+ prisma: string[];
41
+ widget: string[];
42
+ };
43
+ /**
44
+ * Template groups by feature
45
+ * Useful for feature installation commands
46
+ */
47
+ export declare const FEATURE_TEMPLATES: {
48
+ auth: {
49
+ name: string;
50
+ templates: string[];
51
+ };
52
+ chat: {
53
+ name: string;
54
+ templates: string[];
55
+ };
56
+ rbac: {
57
+ name: string;
58
+ templates: string[];
59
+ };
60
+ providers: {
61
+ name: string;
62
+ templates: string[];
63
+ };
64
+ widget: {
65
+ name: string;
66
+ templates: string[];
67
+ };
68
+ prompts: {
69
+ name: string;
70
+ templates: string[];
71
+ };
72
+ aiService: {
73
+ name: string;
74
+ templates: string[];
75
+ };
76
+ };
77
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"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"}