@launchframe/cli 1.0.2 → 1.0.4

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.
@@ -6,7 +6,8 @@
6
6
  "Bash(node -c:*)",
7
7
  "Bash(node:*)",
8
8
  "Bash(git checkout:*)",
9
- "Bash(grep:*)"
9
+ "Bash(grep:*)",
10
+ "Bash(mv:*)"
10
11
  ]
11
12
  }
12
13
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@launchframe/cli",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "Production-ready B2B SaaS boilerplate with subscriptions, credits, and multi-tenancy",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -1,5 +1,21 @@
1
1
  // Module configuration - defines files, sections, and dependencies for each module
2
2
  const MODULE_CONFIG = {
3
+ ai: {
4
+ backend: {
5
+ files: ['src/domain/ai'],
6
+ sections: {
7
+ 'src/core/app/app.module.ts': ['EXTRA_MODULE_IMPORT', 'EXTRA_MODULE'],
8
+ },
9
+ dependencies: {
10
+ '@anthropic-ai/sdk': '^0.39.0',
11
+ },
12
+ },
13
+ infrastructure: {
14
+ sections: {
15
+ '.env.example': ['EXTRA_ENV_VARS'],
16
+ },
17
+ },
18
+ },
3
19
  blog: {
4
20
  website: {
5
21
  files: [
@@ -6,6 +6,13 @@ const MODULE_REGISTRY = {
6
6
  description: 'Markdown-based blog using local .md files with YAML front-matter — no database required',
7
7
  services: ['website'],
8
8
  version: '1.0.0'
9
+ },
10
+ ai: {
11
+ name: 'ai',
12
+ displayName: 'AI',
13
+ description: 'LLM integration via Anthropic SDK — call generateResponse() from LLMService in any backend service',
14
+ services: ['backend'],
15
+ version: '1.0.0'
9
16
  }
10
17
  };
11
18
 
@@ -20,30 +20,30 @@ const VARIANT_CONFIG = {
20
20
  'multi-tenant': {
21
21
  // Complete files/folders to copy
22
22
  files: [
23
- 'src/modules/domain/projects', // Entire projects module
24
- 'src/guards/project-ownership.guard.ts', // Project ownership guard (header-based)
25
- 'src/guards/project-param.guard.ts', // Project param guard (route-based)
26
- 'src/modules/users/users.service.ts', // Users service with multi-tenant support
27
- 'src/modules/users/users.controller.ts', // Users controller with multi-tenant support
28
- 'src/modules/users/create-user.dto.ts' // CreateUserDto with businessId
23
+ 'src/domain/projects', // Entire projects module
24
+ 'src/core/guards/project-ownership.guard.ts', // Project ownership guard (header-based)
25
+ 'src/core/guards/project-param.guard.ts', // Project param guard (route-based)
26
+ 'src/core/users/users.service.ts', // Users service with multi-tenant support
27
+ 'src/core/users/users.controller.ts', // Users controller with multi-tenant support
28
+ 'src/core/users/create-user.dto.ts' // CreateUserDto with businessId
29
29
  ],
30
30
 
31
31
  // Code sections to insert into base template files
32
32
  // Note: main.ts uses PRIMARY_DOMAIN env var for dynamic CORS - no sections needed
33
33
  sections: {
34
- 'src/modules/app/app.module.ts': [
34
+ 'src/core/app/app.module.ts': [
35
35
  'PROJECTS_MODULE_IMPORT', // Add ProjectsModule import
36
36
  'PROJECTS_MODULE' // Add ProjectsModule to imports array
37
37
  ],
38
- 'src/modules/auth/auth.module.ts': [
38
+ 'src/core/auth/auth.module.ts': [
39
39
  'MULTI_TENANT_IMPORTS', // Add Project entity import
40
40
  'MULTI_TENANT_TYPEORM' // Add Project to TypeOrmModule
41
41
  ],
42
- 'src/modules/users/user.entity.ts': [
42
+ 'src/core/users/user.entity.ts': [
43
43
  'PROJECTS_RELATIONSHIP_IMPORT', // Add Project entity import
44
44
  'PROJECTS_RELATIONSHIP' // Add projects relationship
45
45
  ],
46
- 'src/modules/users/users.module.ts': [
46
+ 'src/core/users/users.module.ts': [
47
47
  'MULTI_TENANT_IMPORTS', // Add Projects-related imports
48
48
  'MULTI_TENANT_ENTITIES', // Add Project entities to TypeORM
49
49
  'MULTI_TENANT_MODULE_IMPORTS', // Add ProjectsModule to imports
@@ -56,25 +56,25 @@ const VARIANT_CONFIG = {
56
56
  'b2b2c': {
57
57
  // Complete files to copy
58
58
  files: [
59
- 'src/modules/users/user-business.entity.ts', // Business-to-user linking entity
60
- 'src/modules/auth/auth-customer.ts', // Customer auth config (regular_user, customer_ cookie)
61
- 'src/modules/auth/better-auth-customer.controller.ts', // Customer auth controller (/api/auth/customer)
62
- 'src/modules/auth/auth.module.ts', // Auth module with customer controller
63
- 'src/modules/auth/better-auth.guard.ts', // Guard handling both auth instances
59
+ 'src/core/users/user-business.entity.ts', // Business-to-user linking entity
60
+ 'src/core/auth/auth-customer.ts', // Customer auth config (regular_user, customer_ cookie)
61
+ 'src/core/auth/better-auth-customer.controller.ts', // Customer auth controller (/api/auth/customer)
62
+ 'src/core/auth/auth.module.ts', // Auth module with customer controller
63
+ 'src/core/auth/better-auth.guard.ts', // Guard handling both auth instances
64
64
  ],
65
65
 
66
66
  // Code sections to insert
67
67
  sections: {
68
- 'src/modules/users/user.entity.ts': [
68
+ 'src/core/users/user.entity.ts': [
69
69
  'B2B2C_IMPORTS', // Add UserBusiness import
70
70
  'B2B2C_USER_ROLE', // Add REGULAR_USER enum value
71
71
  'B2B2C_RELATIONSHIPS' // Add userBusinesses relationship
72
72
  ],
73
- 'src/modules/users/users.module.ts': [
73
+ 'src/core/users/users.module.ts': [
74
74
  'B2B2C_IMPORTS', // Add UserBusiness import
75
75
  'B2B2C_ENTITIES' // Add UserBusiness to TypeORM
76
76
  ],
77
- 'src/database/migrations/1764300000001-CreateSessionsTable.ts': [
77
+ 'src/core/database/migrations/1764300000001-CreateSessionsTable.ts': [
78
78
  'B2B2C_TENANT_COLUMN' // Add tenant_id column for session scoping
79
79
  ]
80
80
  }
@@ -84,36 +84,36 @@ const VARIANT_CONFIG = {
84
84
  'b2b2c_single-tenant': {
85
85
  // Complete files to copy (B2B2C features without multi-tenant projects)
86
86
  files: [
87
- 'src/guards/business-scoping.guard.ts', // Business scoping guard
88
- 'src/modules/domain/business/business.controller.ts', // Business lookup controller
89
- 'src/modules/domain/business/business.service.ts', // Business lookup service
90
- 'src/modules/domain/business/business.module.ts', // Business module
91
- 'src/modules/domain/business/entities/business.entity.ts', // Business entity
92
- 'src/modules/domain/business/dto/business-response.dto.ts', // Business response DTO
93
- 'src/modules/domain/business/dto/create-business.dto.ts', // Business create DTO
94
- 'src/database/migrations/1766688416362-CreateBusinessesTable.ts', // Businesses table migration
95
- 'src/modules/domain/items/items.controller.ts', // Items with business scoping
96
- 'src/modules/domain/items/items.service.ts', // Items service with business scoping
97
- 'src/modules/domain/items/item.entity.ts', // Item entity with businessId
98
- 'src/modules/domain/items/dto/create-item.dto.ts', // Create item DTO
99
- 'src/modules/domain/items/dto/update-item.dto.ts', // Update item DTO
100
- 'src/modules/auth/auth.module.ts', // Auth module with Business entity
101
- 'src/modules/auth/auth.controller.ts', // Auth controller with magic-link (B2B2C)
102
- 'src/modules/auth/auth.service.ts', // Auth service with magic-link (B2B2C)
103
- 'src/modules/auth/jwt-auth.guard.ts', // JWT authentication guard
104
- 'src/modules/users/user-business.entity.ts', // Business-to-user linking entity
105
- 'src/modules/users/users.module.ts', // Users module with Business entity
106
- 'src/modules/users/users.controller.ts', // Users controller (B2B2C)
107
- 'src/modules/users/users.service.ts', // Users service (B2B2C)
108
- 'src/modules/users/create-user.dto.ts' // CreateUserDto with businessId
87
+ 'src/core/guards/business-scoping.guard.ts', // Business scoping guard
88
+ 'src/domain/business/business.controller.ts', // Business lookup controller
89
+ 'src/domain/business/business.service.ts', // Business lookup service
90
+ 'src/domain/business/business.module.ts', // Business module
91
+ 'src/domain/business/entities/business.entity.ts', // Business entity
92
+ 'src/domain/business/dto/business-response.dto.ts', // Business response DTO
93
+ 'src/domain/business/dto/create-business.dto.ts', // Business create DTO
94
+ 'src/core/database/migrations/1766688416362-CreateBusinessesTable.ts', // Businesses table migration
95
+ 'src/domain/items/items.controller.ts', // Items with business scoping
96
+ 'src/domain/items/items.service.ts', // Items service with business scoping
97
+ 'src/domain/items/item.entity.ts', // Item entity with businessId
98
+ 'src/domain/items/dto/create-item.dto.ts', // Create item DTO
99
+ 'src/domain/items/dto/update-item.dto.ts', // Update item DTO
100
+ 'src/core/auth/auth.module.ts', // Auth module with Business entity
101
+ 'src/core/auth/auth.controller.ts', // Auth controller with magic-link (B2B2C)
102
+ 'src/core/auth/auth.service.ts', // Auth service with magic-link (B2B2C)
103
+ 'src/core/auth/jwt-auth.guard.ts', // JWT authentication guard
104
+ 'src/core/users/user-business.entity.ts', // Business-to-user linking entity
105
+ 'src/core/users/users.module.ts', // Users module with Business entity
106
+ 'src/core/users/users.controller.ts', // Users controller (B2B2C)
107
+ 'src/core/users/users.service.ts', // Users service (B2B2C)
108
+ 'src/core/users/create-user.dto.ts' // CreateUserDto with businessId
109
109
  ],
110
110
 
111
111
  sections: {
112
- 'src/modules/app/app.module.ts': [
112
+ 'src/core/app/app.module.ts': [
113
113
  'BUSINESS_MODULE_IMPORT', // Import BusinessModule
114
114
  'BUSINESS_MODULE' // Add BusinessModule to imports
115
115
  ],
116
- 'src/modules/users/user.entity.ts': [
116
+ 'src/core/users/user.entity.ts': [
117
117
  'BUSINESS_RELATIONSHIP_IMPORT', // Import Business entity
118
118
  'BUSINESS_RELATIONSHIP' // Add business relationship
119
119
  ]
@@ -124,11 +124,11 @@ const VARIANT_CONFIG = {
124
124
  'b2b2c_multi-tenant': {
125
125
  // Complete files to copy (has both multi-tenant and B2B2C features)
126
126
  files: [
127
- 'src/modules/users/user-business.entity.ts', // Business-to-user linking entity
128
- 'src/modules/auth/auth.ts', // Combined Better Auth config
129
- 'src/modules/users/users.service.ts', // Combined users service
130
- 'src/modules/users/users.controller.ts', // Combined users controller
131
- 'src/modules/domain/projects/projects.module.ts' // Projects module with UserBusiness
127
+ 'src/core/users/user-business.entity.ts', // Business-to-user linking entity
128
+ 'src/core/auth/auth.ts', // Combined Better Auth config
129
+ 'src/core/users/users.service.ts', // Combined users service
130
+ 'src/core/users/users.controller.ts', // Combined users controller
131
+ 'src/domain/projects/projects.module.ts' // Projects module with UserBusiness
132
132
  ],
133
133
 
134
134
  // No sections needed - complete files already have all features
@@ -18,7 +18,7 @@ async function installModule(moduleName, moduleConfig) {
18
18
  const serviceDir = path.join(cwd, serviceName);
19
19
 
20
20
  // Copy files
21
- for (const filePath of config.files) {
21
+ for (const filePath of (config.files || [])) {
22
22
  const src = path.join(moduleFilesDir, filePath);
23
23
  const dest = path.join(serviceDir, filePath);
24
24
  console.log(` Adding ${filePath}`);
@@ -26,7 +26,7 @@ async function installModule(moduleName, moduleConfig) {
26
26
  }
27
27
 
28
28
  // Inject sections
29
- for (const [targetFile, markerNames] of Object.entries(config.sections)) {
29
+ for (const [targetFile, markerNames] of Object.entries(config.sections || {})) {
30
30
  const targetFilePath = path.join(serviceDir, targetFile);
31
31
  const targetBasename = path.basename(targetFile);
32
32
 
@@ -34,7 +34,11 @@ async function installModule(moduleName, moduleConfig) {
34
34
  const sectionFile = path.join(moduleSectionsDir, `${targetBasename}.${markerName}`);
35
35
  console.log(` Injecting ${markerName} into ${targetFile}`);
36
36
  const sectionContent = await fs.readFile(sectionFile, 'utf8');
37
- await replaceSection(targetFilePath, markerName, sectionContent);
37
+ try {
38
+ await replaceSection(targetFilePath, markerName, sectionContent);
39
+ } catch (err) {
40
+ console.warn(` ⚠ Skipping ${markerName} in ${targetFile}: ${err.message}`);
41
+ }
38
42
  }
39
43
  }
40
44