@hazeljs/cli 0.5.3 → 0.6.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 (103) hide show
  1. package/@template-ai-native/package.json +1 -1
  2. package/@template-ai-native/prisma/schema.prisma +4 -4
  3. package/@template-ai-native/prisma/seed.ts +12 -8
  4. package/README.md +122 -591
  5. package/dist/commands/add.js +26 -126
  6. package/dist/commands/generate-app.js +17 -230
  7. package/dist/commands/generate-simple.d.ts +27 -0
  8. package/dist/commands/generate-simple.js +448 -0
  9. package/dist/commands/generate-simple.test.js +100 -0
  10. package/dist/index.js +5 -47
  11. package/dist/index.list.test.js +8 -22
  12. package/dist/index.test.js +19 -56
  13. package/dist/utils/generator-registry.js +29 -65
  14. package/dist/utils/generator.d.ts +0 -1
  15. package/dist/utils/generator.js +0 -22
  16. package/dist/utils/generator.test.js +0 -28
  17. package/dist/utils/packages-registry.d.ts +25 -0
  18. package/dist/utils/packages-registry.js +371 -0
  19. package/package.json +3 -5
  20. package/dist/commands/build.d.ts +0 -2
  21. package/dist/commands/build.js +0 -52
  22. package/dist/commands/generate-agent.d.ts +0 -4
  23. package/dist/commands/generate-agent.js +0 -64
  24. package/dist/commands/generate-agent.test.js +0 -36
  25. package/dist/commands/generate-ai-service.d.ts +0 -4
  26. package/dist/commands/generate-ai-service.js +0 -54
  27. package/dist/commands/generate-ai-service.test.d.ts +0 -1
  28. package/dist/commands/generate-ai-service.test.js +0 -41
  29. package/dist/commands/generate-cache.d.ts +0 -4
  30. package/dist/commands/generate-cache.js +0 -66
  31. package/dist/commands/generate-cache.test.d.ts +0 -1
  32. package/dist/commands/generate-cache.test.js +0 -36
  33. package/dist/commands/generate-config.d.ts +0 -4
  34. package/dist/commands/generate-config.js +0 -59
  35. package/dist/commands/generate-config.test.d.ts +0 -1
  36. package/dist/commands/generate-config.test.js +0 -35
  37. package/dist/commands/generate-controller.d.ts +0 -4
  38. package/dist/commands/generate-controller.js +0 -66
  39. package/dist/commands/generate-controller.test.d.ts +0 -1
  40. package/dist/commands/generate-controller.test.js +0 -48
  41. package/dist/commands/generate-cron.d.ts +0 -4
  42. package/dist/commands/generate-cron.js +0 -61
  43. package/dist/commands/generate-cron.test.d.ts +0 -1
  44. package/dist/commands/generate-cron.test.js +0 -42
  45. package/dist/commands/generate-discovery.d.ts +0 -4
  46. package/dist/commands/generate-discovery.js +0 -63
  47. package/dist/commands/generate-discovery.test.d.ts +0 -1
  48. package/dist/commands/generate-discovery.test.js +0 -36
  49. package/dist/commands/generate-exception-filter.d.ts +0 -4
  50. package/dist/commands/generate-exception-filter.js +0 -54
  51. package/dist/commands/generate-exception-filter.test.d.ts +0 -1
  52. package/dist/commands/generate-exception-filter.test.js +0 -43
  53. package/dist/commands/generate-guard.d.ts +0 -4
  54. package/dist/commands/generate-guard.js +0 -42
  55. package/dist/commands/generate-guard.test.d.ts +0 -1
  56. package/dist/commands/generate-guard.test.js +0 -41
  57. package/dist/commands/generate-interceptor.d.ts +0 -4
  58. package/dist/commands/generate-interceptor.js +0 -43
  59. package/dist/commands/generate-interceptor.test.d.ts +0 -1
  60. package/dist/commands/generate-interceptor.test.js +0 -41
  61. package/dist/commands/generate-middleware.d.ts +0 -4
  62. package/dist/commands/generate-middleware.js +0 -47
  63. package/dist/commands/generate-middleware.test.d.ts +0 -1
  64. package/dist/commands/generate-middleware.test.js +0 -41
  65. package/dist/commands/generate-pipe.d.ts +0 -4
  66. package/dist/commands/generate-pipe.js +0 -39
  67. package/dist/commands/generate-pipe.test.d.ts +0 -1
  68. package/dist/commands/generate-pipe.test.js +0 -35
  69. package/dist/commands/generate-rag.d.ts +0 -4
  70. package/dist/commands/generate-rag.js +0 -68
  71. package/dist/commands/generate-rag.test.d.ts +0 -1
  72. package/dist/commands/generate-rag.test.js +0 -35
  73. package/dist/commands/generate-repository.d.ts +0 -4
  74. package/dist/commands/generate-repository.js +0 -46
  75. package/dist/commands/generate-repository.test.d.ts +0 -1
  76. package/dist/commands/generate-repository.test.js +0 -41
  77. package/dist/commands/generate-serverless-handler.d.ts +0 -4
  78. package/dist/commands/generate-serverless-handler.js +0 -57
  79. package/dist/commands/generate-serverless-handler.test.d.ts +0 -1
  80. package/dist/commands/generate-serverless-handler.test.js +0 -42
  81. package/dist/commands/generate-service.d.ts +0 -4
  82. package/dist/commands/generate-service.js +0 -58
  83. package/dist/commands/generate-service.test.d.ts +0 -1
  84. package/dist/commands/generate-service.test.js +0 -41
  85. package/dist/commands/generate-setup.d.ts +0 -4
  86. package/dist/commands/generate-setup.js +0 -187
  87. package/dist/commands/generate-setup.test.d.ts +0 -1
  88. package/dist/commands/generate-setup.test.js +0 -50
  89. package/dist/commands/generate-websocket-gateway.d.ts +0 -4
  90. package/dist/commands/generate-websocket-gateway.js +0 -53
  91. package/dist/commands/generate-websocket-gateway.test.d.ts +0 -1
  92. package/dist/commands/generate-websocket-gateway.test.js +0 -41
  93. package/dist/commands/pdf-to-audio.d.ts +0 -2
  94. package/dist/commands/pdf-to-audio.js +0 -170
  95. package/dist/commands/pdf-to-audio.test.d.ts +0 -1
  96. package/dist/commands/pdf-to-audio.test.js +0 -92
  97. package/dist/commands/start.d.ts +0 -2
  98. package/dist/commands/start.js +0 -61
  99. package/dist/commands/test.d.ts +0 -2
  100. package/dist/commands/test.js +0 -63
  101. package/dist/commands/utility-commands.test.d.ts +0 -1
  102. package/dist/commands/utility-commands.test.js +0 -95
  103. /package/dist/commands/{generate-agent.test.d.ts → generate-simple.test.d.ts} +0 -0
@@ -0,0 +1,371 @@
1
+ "use strict";
2
+ /**
3
+ * Single source of truth for all HazelJS package metadata.
4
+ * Used by: `hazel add`, `hazel new --interactive`, and `scaffoldPackageBoilerplate`.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.PACKAGES_BY_NAME = exports.HAZEL_PACKAGES = void 0;
8
+ exports.findPackage = findPackage;
9
+ exports.HAZEL_PACKAGES = [
10
+ {
11
+ shortName: 'ai',
12
+ npm: '@hazeljs/ai',
13
+ label: 'AI Integration (@hazeljs/ai)',
14
+ hint: 'import { AIModule } from "@hazeljs/ai";',
15
+ moduleImport: "import { AIModule } from '@hazeljs/ai';",
16
+ moduleExpression: 'AIModule',
17
+ setupTemplate: null,
18
+ },
19
+ {
20
+ shortName: 'agent',
21
+ npm: '@hazeljs/agent',
22
+ label: 'AI Agents (@hazeljs/agent)',
23
+ hint: 'import { AgentModule } from "@hazeljs/agent";',
24
+ moduleImport: "import { AgentModule } from '@hazeljs/agent';",
25
+ moduleExpression: 'AgentModule',
26
+ setupTemplate: null,
27
+ },
28
+ {
29
+ shortName: 'audit',
30
+ npm: '@hazeljs/audit',
31
+ label: 'Audit Logging (@hazeljs/audit)',
32
+ hint: 'import { AuditModule, ConsoleAuditTransport } from "@hazeljs/audit";\n // AuditModule.forRoot({ transports: [new ConsoleAuditTransport()] })',
33
+ moduleImport: "import { AuditModule, ConsoleAuditTransport } from '@hazeljs/audit';",
34
+ moduleExpression: "AuditModule.forRoot({ transports: [new ConsoleAuditTransport()] })",
35
+ setupTemplate: `import { AuditModule, ConsoleAuditTransport } from '@hazeljs/audit';
36
+
37
+ // Add AuditModule.forRoot(...) to your HazelModule imports.
38
+ export const auditImports = [AuditModule.forRoot({ transports: [new ConsoleAuditTransport()] })];
39
+ `,
40
+ },
41
+ {
42
+ shortName: 'auth',
43
+ npm: '@hazeljs/auth',
44
+ label: 'Authentication (@hazeljs/auth)',
45
+ hint: 'import { JwtModule } from "@hazeljs/auth";\n // JwtModule.forRoot({ secret: "your-secret", expiresIn: "1d" })',
46
+ moduleImport: "import { JwtModule } from '@hazeljs/auth';",
47
+ moduleExpression: "JwtModule.forRoot({ secret: process.env.JWT_SECRET || 'change-me', expiresIn: '1d' })",
48
+ setupTemplate: null,
49
+ },
50
+ {
51
+ shortName: 'oauth',
52
+ npm: '@hazeljs/oauth',
53
+ label: 'OAuth - Google/Microsoft/GitHub (@hazeljs/oauth)',
54
+ hint: 'import { OAuthModule } from "@hazeljs/oauth";\n // OAuthModule.forRoot({ providers: { google: {...}, microsoft: {...}, github: {...} } })',
55
+ moduleImport: "import { OAuthModule } from '@hazeljs/oauth';",
56
+ moduleExpression: "OAuthModule.forRoot({ providers: { google: { clientId: process.env.GOOGLE_CLIENT_ID!, clientSecret: process.env.GOOGLE_CLIENT_SECRET!, redirectUri: process.env.OAUTH_REDIRECT_URI! } } })",
57
+ setupTemplate: `import { OAuthModule } from '@hazeljs/oauth';
58
+
59
+ // Example (Google). Put secrets in env vars:
60
+ // GOOGLE_CLIENT_ID=...
61
+ // GOOGLE_CLIENT_SECRET=...
62
+ // OAUTH_REDIRECT_URI=...
63
+ export const oauthImports = [
64
+ OAuthModule.forRoot({
65
+ providers: {
66
+ google: {
67
+ clientId: process.env.GOOGLE_CLIENT_ID!,
68
+ clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
69
+ redirectUri: process.env.OAUTH_REDIRECT_URI!,
70
+ },
71
+ },
72
+ }),
73
+ ];
74
+ `,
75
+ },
76
+ {
77
+ shortName: 'cache',
78
+ npm: '@hazeljs/cache',
79
+ label: 'Caching (@hazeljs/cache)',
80
+ hint: 'import { CacheModule } from "@hazeljs/cache";',
81
+ moduleImport: "import { CacheModule } from '@hazeljs/cache';",
82
+ moduleExpression: 'CacheModule',
83
+ setupTemplate: null,
84
+ },
85
+ {
86
+ shortName: 'config',
87
+ npm: '@hazeljs/config',
88
+ label: 'Configuration (@hazeljs/config)',
89
+ hint: 'import { ConfigModule } from "@hazeljs/config";\n // ConfigModule.forRoot({ envFilePath: ".env" })',
90
+ moduleImport: "import { ConfigModule } from '@hazeljs/config';",
91
+ moduleExpression: "ConfigModule.forRoot({ envFilePath: '.env' })",
92
+ setupTemplate: null,
93
+ },
94
+ {
95
+ shortName: 'cron',
96
+ npm: '@hazeljs/cron',
97
+ label: 'Cron Jobs (@hazeljs/cron)',
98
+ hint: 'import { CronModule } from "@hazeljs/cron";',
99
+ moduleImport: "import { CronModule } from '@hazeljs/cron';",
100
+ moduleExpression: 'CronModule',
101
+ setupTemplate: null,
102
+ },
103
+ {
104
+ shortName: 'data',
105
+ npm: '@hazeljs/data',
106
+ label: 'Data/ETL (@hazeljs/data)',
107
+ hint: 'import { DataModule } from "@hazeljs/data";',
108
+ moduleImport: "import { DataModule } from '@hazeljs/data';",
109
+ moduleExpression: 'DataModule.forRoot()',
110
+ setupTemplate: `import { DataModule } from '@hazeljs/data';
111
+
112
+ // Add DataModule.forRoot() to your HazelModule imports.
113
+ export const dataImports = [DataModule.forRoot()];
114
+ `,
115
+ },
116
+ {
117
+ shortName: 'discovery',
118
+ npm: '@hazeljs/discovery',
119
+ label: 'Service Discovery (@hazeljs/discovery)',
120
+ hint: 'import { ServiceRegistry, DiscoveryClient } from "@hazeljs/discovery";',
121
+ moduleImport: null,
122
+ moduleExpression: null,
123
+ setupTemplate: null,
124
+ },
125
+ {
126
+ shortName: 'event-emitter',
127
+ npm: '@hazeljs/event-emitter',
128
+ label: 'Event Emitter (@hazeljs/event-emitter)',
129
+ hint: 'import { EventEmitterModule } from "@hazeljs/event-emitter";',
130
+ moduleImport: "import { EventEmitterModule } from '@hazeljs/event-emitter';",
131
+ moduleExpression: 'EventEmitterModule.forRoot()',
132
+ setupTemplate: `import { EventEmitterModule } from '@hazeljs/event-emitter';
133
+
134
+ // Add EventEmitterModule.forRoot() to your HazelModule imports.
135
+ export const eventEmitterImports = [EventEmitterModule.forRoot()];
136
+ `,
137
+ },
138
+ {
139
+ shortName: 'gateway',
140
+ npm: '@hazeljs/gateway',
141
+ label: 'API Gateway (@hazeljs/gateway)',
142
+ hint: 'import { GatewayModule } from "@hazeljs/gateway";',
143
+ moduleImport: "import { GatewayModule } from '@hazeljs/gateway';",
144
+ moduleExpression: 'GatewayModule',
145
+ setupTemplate: `import { GatewayModule } from '@hazeljs/gateway';
146
+
147
+ // Add GatewayModule to your HazelModule imports.
148
+ export const gatewayImports = [GatewayModule];
149
+ `,
150
+ },
151
+ {
152
+ shortName: 'guardrails',
153
+ npm: '@hazeljs/guardrails',
154
+ label: 'Guardrails (@hazeljs/guardrails)',
155
+ hint: 'import { GuardrailsModule } from "@hazeljs/guardrails";\n // GuardrailsModule.forRoot({ redactPIIByDefault: true })',
156
+ moduleImport: "import { GuardrailsModule } from '@hazeljs/guardrails';",
157
+ moduleExpression: "GuardrailsModule.forRoot({ redactPIIByDefault: true })",
158
+ setupTemplate: null,
159
+ },
160
+ {
161
+ shortName: 'graphql',
162
+ npm: '@hazeljs/graphql',
163
+ label: 'GraphQL (@hazeljs/graphql)',
164
+ hint: 'import { GraphQLModule } from "@hazeljs/graphql";',
165
+ moduleImport: "import { GraphQLModule } from '@hazeljs/graphql';",
166
+ moduleExpression: 'GraphQLModule',
167
+ setupTemplate: `import { GraphQLModule } from '@hazeljs/graphql';
168
+
169
+ // Add GraphQLModule to your HazelModule imports.
170
+ export const graphqlImports = [GraphQLModule];
171
+ `,
172
+ },
173
+ {
174
+ shortName: 'grpc',
175
+ npm: '@hazeljs/grpc',
176
+ label: 'gRPC (@hazeljs/grpc)',
177
+ hint: 'import { GrpcModule } from "@hazeljs/grpc";',
178
+ moduleImport: "import { GrpcModule } from '@hazeljs/grpc';",
179
+ moduleExpression: 'GrpcModule',
180
+ setupTemplate: `import { GrpcModule } from '@hazeljs/grpc';
181
+
182
+ // Add GrpcModule to your HazelModule imports. Define services in your module.
183
+ export const grpcImports = [GrpcModule];
184
+ `,
185
+ },
186
+ {
187
+ shortName: 'kafka',
188
+ npm: '@hazeljs/kafka',
189
+ label: 'Kafka (@hazeljs/kafka)',
190
+ hint: 'import { KafkaModule } from "@hazeljs/kafka";',
191
+ moduleImport: "import { KafkaModule } from '@hazeljs/kafka';",
192
+ moduleExpression: 'KafkaModule',
193
+ setupTemplate: `import { KafkaModule } from '@hazeljs/kafka';
194
+
195
+ // Add KafkaModule to your HazelModule imports and configure brokers via env/config.
196
+ export const kafkaImports = [KafkaModule];
197
+ `,
198
+ },
199
+ {
200
+ shortName: 'messaging',
201
+ npm: '@hazeljs/messaging',
202
+ label: 'Messaging - WhatsApp/Telegram (@hazeljs/messaging)',
203
+ hint: 'import { MessagingModule } from "@hazeljs/messaging";',
204
+ moduleImport: "import { MessagingModule } from '@hazeljs/messaging';",
205
+ moduleExpression: 'MessagingModule',
206
+ setupTemplate: `import { MessagingModule } from '@hazeljs/messaging';
207
+
208
+ // Add MessagingModule to your HazelModule imports. Configure channels (WhatsApp/Telegram) via env/config.
209
+ export const messagingImports = [MessagingModule];
210
+ `,
211
+ },
212
+ {
213
+ shortName: 'ml',
214
+ npm: '@hazeljs/ml',
215
+ label: 'Machine Learning (@hazeljs/ml)',
216
+ hint: 'import { MLModule } from "@hazeljs/ml";',
217
+ moduleImport: "import { MLModule } from '@hazeljs/ml';",
218
+ moduleExpression: 'MLModule.forRoot()',
219
+ setupTemplate: `import { MLModule } from '@hazeljs/ml';
220
+
221
+ // Add MLModule.forRoot() to your HazelModule imports.
222
+ export const mlImports = [MLModule.forRoot()];
223
+ `,
224
+ },
225
+ {
226
+ shortName: 'mcp',
227
+ npm: '@hazeljs/mcp',
228
+ label: 'MCP - Model Context Protocol (@hazeljs/mcp)',
229
+ hint: 'import { createMcpServer } from "@hazeljs/mcp";\n // createMcpServer({ name, version, toolRegistry }).listenStdio();',
230
+ moduleImport: null,
231
+ moduleExpression: null,
232
+ setupTemplate: `import { createMcpServer } from '@hazeljs/mcp';
233
+
234
+ // Minimal MCP server example:
235
+ const server = createMcpServer({ name: 'hazel-mcp', version: '0.1.0' });
236
+ server.start();
237
+ `,
238
+ },
239
+ {
240
+ shortName: 'pdf-to-audio',
241
+ npm: '@hazeljs/pdf-to-audio',
242
+ label: 'PDF to Audio (@hazeljs/pdf-to-audio)',
243
+ hint: 'import { PdfToAudioModule } from "@hazeljs/pdf-to-audio";\n // PdfToAudioModule converts PDFs to audio via TTS',
244
+ moduleImport: "import { PdfToAudioModule } from '@hazeljs/pdf-to-audio';",
245
+ moduleExpression: 'PdfToAudioModule',
246
+ setupTemplate: `import { PdfToAudioModule } from '@hazeljs/pdf-to-audio';
247
+
248
+ // Add PdfToAudioModule to your HazelModule imports.
249
+ export const pdfToAudioImports = [PdfToAudioModule];
250
+ `,
251
+ },
252
+ {
253
+ shortName: 'prompts',
254
+ npm: '@hazeljs/prompts',
255
+ label: 'Prompts - typed templates (@hazeljs/prompts)',
256
+ hint: 'import { PromptTemplate, PromptRegistry } from "@hazeljs/prompts";',
257
+ moduleImport: null,
258
+ moduleExpression: null,
259
+ setupTemplate: `import { PromptTemplate } from '@hazeljs/prompts';
260
+
261
+ export const helloPrompt = new PromptTemplate({
262
+ name: 'hello',
263
+ template: 'Hello {{name}}',
264
+ });
265
+ `,
266
+ },
267
+ {
268
+ shortName: 'prisma',
269
+ npm: '@hazeljs/prisma',
270
+ label: 'Prisma ORM (@hazeljs/prisma)',
271
+ hint: 'import { PrismaModule } from "@hazeljs/prisma";',
272
+ moduleImport: "import { PrismaModule } from '@hazeljs/prisma';",
273
+ moduleExpression: 'PrismaModule',
274
+ setupTemplate: `import { PrismaModule } from '@hazeljs/prisma';
275
+
276
+ // Add PrismaModule to your HazelModule imports.
277
+ export const prismaImports = [PrismaModule];
278
+ `,
279
+ },
280
+ {
281
+ shortName: 'typeorm',
282
+ npm: '@hazeljs/typeorm',
283
+ label: 'TypeORM (@hazeljs/typeorm)',
284
+ hint: 'import { TypeOrmModule } from "@hazeljs/typeorm";',
285
+ moduleImport: "import { TypeOrmModule } from '@hazeljs/typeorm';",
286
+ moduleExpression: 'TypeOrmModule',
287
+ setupTemplate: `import { TypeOrmModule } from '@hazeljs/typeorm';
288
+
289
+ // Add TypeOrmModule to your HazelModule imports.
290
+ export const typeormImports = [TypeOrmModule];
291
+ `,
292
+ },
293
+ {
294
+ shortName: 'queue',
295
+ npm: '@hazeljs/queue',
296
+ label: 'Queue/BullMQ (@hazeljs/queue)',
297
+ hint: 'import { QueueModule } from "@hazeljs/queue";',
298
+ moduleImport: "import { QueueModule } from '@hazeljs/queue';",
299
+ moduleExpression: 'QueueModule',
300
+ setupTemplate: `import { QueueModule } from '@hazeljs/queue';
301
+
302
+ // Add QueueModule to your HazelModule imports. Configure Redis / BullMQ via env/config.
303
+ export const queueImports = [QueueModule];
304
+ `,
305
+ },
306
+ {
307
+ shortName: 'rag',
308
+ npm: '@hazeljs/rag',
309
+ label: 'RAG/Vector Search (@hazeljs/rag)',
310
+ hint: 'import { RAGPipeline } from "@hazeljs/rag";',
311
+ moduleImport: "import { RAGModule } from '@hazeljs/rag';",
312
+ moduleExpression: 'RAGModule',
313
+ setupTemplate: null,
314
+ },
315
+ {
316
+ shortName: 'resilience',
317
+ npm: '@hazeljs/resilience',
318
+ label: 'Resilience - Circuit Breaker (@hazeljs/resilience)',
319
+ hint: 'import { CircuitBreaker, WithRetry, WithTimeout } from "@hazeljs/resilience";',
320
+ moduleImport: null,
321
+ moduleExpression: null,
322
+ setupTemplate: `import { CircuitBreaker, WithRetry } from '@hazeljs/resilience';
323
+
324
+ export class ExampleResilienceService {
325
+ @WithRetry({ retries: 3 })
326
+ @CircuitBreaker({ failureThreshold: 5, resetTimeoutMs: 10000 })
327
+ async callRemote(): Promise<string> {
328
+ return 'ok';
329
+ }
330
+ }
331
+ `,
332
+ },
333
+ {
334
+ shortName: 'serverless',
335
+ npm: '@hazeljs/serverless',
336
+ label: 'Serverless (@hazeljs/serverless)',
337
+ hint: 'import { createLambdaHandler } from "@hazeljs/serverless";',
338
+ moduleImport: null,
339
+ moduleExpression: null,
340
+ setupTemplate: null,
341
+ },
342
+ {
343
+ shortName: 'swagger',
344
+ npm: '@hazeljs/swagger',
345
+ label: 'Swagger/OpenAPI (@hazeljs/swagger)',
346
+ hint: 'import { SwaggerModule } from "@hazeljs/swagger";',
347
+ moduleImport: "import { SwaggerModule } from '@hazeljs/swagger';",
348
+ moduleExpression: 'SwaggerModule',
349
+ setupTemplate: `import { SwaggerModule } from '@hazeljs/swagger';
350
+ import { AppModule } from './app.module';
351
+
352
+ // Setup Swagger once before creating your app:
353
+ SwaggerModule.setRootModule(AppModule);
354
+ `,
355
+ },
356
+ {
357
+ shortName: 'websocket',
358
+ npm: '@hazeljs/websocket',
359
+ label: 'WebSocket (@hazeljs/websocket)',
360
+ hint: 'import { WebSocketModule } from "@hazeljs/websocket";',
361
+ moduleImport: "import { WebSocketModule } from '@hazeljs/websocket';",
362
+ moduleExpression: 'WebSocketModule',
363
+ setupTemplate: null,
364
+ },
365
+ ];
366
+ /** Lookup by short name (e.g. 'ai') or full npm name (e.g. '@hazeljs/ai') */
367
+ function findPackage(nameOrNpm) {
368
+ return exports.HAZEL_PACKAGES.find((p) => p.shortName === nameOrNpm || p.npm === nameOrNpm);
369
+ }
370
+ /** Map of shortName → HazelPackageMeta for quick lookup */
371
+ exports.PACKAGES_BY_NAME = Object.fromEntries(exports.HAZEL_PACKAGES.map((p) => [p.shortName, p]));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hazeljs/cli",
3
- "version": "0.5.3",
3
+ "version": "0.6.0",
4
4
  "description": "Command-line interface for scaffolding and generating HazelJS applications and components",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -22,10 +22,8 @@
22
22
  "dependencies": {
23
23
  "chalk": "^4.1.2",
24
24
  "commander": "^11.1.0",
25
- "form-data": "^4.0.0",
26
25
  "inquirer": "^8.2.6",
27
- "mustache": "^4.2.0",
28
- "ora": "^5.4.1"
26
+ "mustache": "^4.2.0"
29
27
  },
30
28
  "devDependencies": {
31
29
  "@types/inquirer": "^8.2.6",
@@ -70,5 +68,5 @@
70
68
  "type": "opencollective",
71
69
  "url": "https://opencollective.com/hazeljs"
72
70
  },
73
- "gitHead": "dd6ca4e3f2221c07b3b2c80c649ae8018b9c2526"
71
+ "gitHead": "27bc86031befce190871d3f07be4156544f37f94"
74
72
  }
@@ -1,2 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function buildCommand(program: Command): void;
@@ -1,52 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.buildCommand = buildCommand;
7
- const child_process_1 = require("child_process");
8
- const chalk_1 = __importDefault(require("chalk"));
9
- const fs_1 = __importDefault(require("fs"));
10
- const path_1 = __importDefault(require("path"));
11
- function buildCommand(program) {
12
- program
13
- .command('build')
14
- .description('Build the HazelJS project')
15
- .option('-w, --watch', 'Watch mode')
16
- .option('-p, --production', 'Production build')
17
- .action((options) => {
18
- try {
19
- const packageJsonPath = path_1.default.join(process.cwd(), 'package.json');
20
- if (!fs_1.default.existsSync(packageJsonPath)) {
21
- console.log(chalk_1.default.red('✗ No package.json found'));
22
- console.log(chalk_1.default.gray('Run this command from your project root'));
23
- process.exit(1);
24
- }
25
- const packageJson = JSON.parse(fs_1.default.readFileSync(packageJsonPath, 'utf-8'));
26
- if (!packageJson.scripts?.build) {
27
- console.log(chalk_1.default.yellow('⚠ No build script found in package.json'));
28
- console.log(chalk_1.default.gray('\nAdd a build script to your package.json:'));
29
- console.log(chalk_1.default.gray(' "scripts": {'));
30
- console.log(chalk_1.default.gray(' "build": "tsc"'));
31
- console.log(chalk_1.default.gray(' }'));
32
- process.exit(1);
33
- }
34
- console.log(chalk_1.default.blue('🔨 Building project...\n'));
35
- let command = 'npm run build';
36
- if (options.watch) {
37
- command = 'npm run build -- --watch';
38
- }
39
- if (options.production) {
40
- process.env.NODE_ENV = 'production';
41
- }
42
- (0, child_process_1.execSync)(command, { stdio: 'inherit' });
43
- if (!options.watch) {
44
- console.log(chalk_1.default.green('\n✓ Build completed successfully'));
45
- }
46
- }
47
- catch {
48
- console.error(chalk_1.default.red('\n✗ Build failed'));
49
- process.exit(1);
50
- }
51
- });
52
- }
@@ -1,4 +0,0 @@
1
- import { Command } from 'commander';
2
- import { GenerateResult, GenerateCLIOptions } from '../utils/generator';
3
- export declare function runAgent(name: string, options: GenerateCLIOptions): Promise<GenerateResult>;
4
- export declare function generateAgent(program: Command): void;
@@ -1,64 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runAgent = runAgent;
4
- exports.generateAgent = generateAgent;
5
- const generator_1 = require("../utils/generator");
6
- const AGENT_TEMPLATE = `import { Agent, Tool } from '@hazeljs/agent';
7
-
8
- @Agent({
9
- name: '{{fileName}}',
10
- description: '{{description}}',
11
- systemPrompt: 'You are a helpful {{className}} agent.',
12
- enableMemory: true,
13
- enableRAG: true,
14
- })
15
- export class {{className}}Agent {
16
- @Tool({
17
- description: 'Example tool for {{fileName}}',
18
- parameters: [
19
- {
20
- name: 'input',
21
- type: 'string',
22
- description: 'Input parameter',
23
- required: true,
24
- },
25
- ],
26
- })
27
- async exampleTool(input: { input: string }): Promise<{ result: string }> {
28
- // Implement your tool logic here
29
- return {
30
- result: \`Processed: \${input.input}\`,
31
- };
32
- }
33
- }
34
- `;
35
- class AgentGenerator extends generator_1.Generator {
36
- constructor() {
37
- super(...arguments);
38
- this.suffix = 'agent';
39
- }
40
- getDefaultTemplate() {
41
- return AGENT_TEMPLATE;
42
- }
43
- }
44
- async function runAgent(name, options) {
45
- const generator = new AgentGenerator();
46
- return generator.generate({
47
- name,
48
- path: options.path,
49
- dryRun: options.dryRun,
50
- data: { description: `A ${name} agent` },
51
- });
52
- }
53
- function generateAgent(program) {
54
- program
55
- .command('agent <name>')
56
- .description('Generate a new AI agent with @Agent and @Tool decorators')
57
- .option('-p, --path <path>', 'Path where the agent should be generated')
58
- .option('--dry-run', 'Preview files without writing them')
59
- .option('--json', 'Output result as JSON')
60
- .action(async (name, options) => {
61
- const result = await runAgent(name, options);
62
- (0, generator_1.printGenerateResult)(result, { json: options.json });
63
- });
64
- }
@@ -1,36 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const fs_1 = __importDefault(require("fs"));
7
- const commander_1 = require("commander");
8
- const generate_agent_1 = require("./generate-agent");
9
- jest.mock('fs');
10
- describe('generateAgent', () => {
11
- const mockFs = fs_1.default;
12
- let program;
13
- beforeEach(() => {
14
- jest.clearAllMocks();
15
- mockFs.existsSync.mockReturnValue(true);
16
- mockFs.writeFileSync.mockImplementation(() => { });
17
- jest.spyOn(console, 'log').mockImplementation();
18
- program = new commander_1.Command();
19
- });
20
- afterEach(() => {
21
- jest.restoreAllMocks();
22
- });
23
- it('should generate an agent file with correct suffix', async () => {
24
- (0, generate_agent_1.generateAgent)(program);
25
- await program.parseAsync(['node', 'test', 'agent', 'research']);
26
- expect(mockFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining('research.agent.ts'), expect.stringContaining('ResearchAgent'));
27
- });
28
- it('should import from @hazeljs/agent', async () => {
29
- (0, generate_agent_1.generateAgent)(program);
30
- await program.parseAsync(['node', 'test', 'agent', 'research']);
31
- const writtenContent = mockFs.writeFileSync.mock.calls[0][1];
32
- expect(writtenContent).toContain("from '@hazeljs/agent'");
33
- expect(writtenContent).toContain('@Agent');
34
- expect(writtenContent).toContain('@Tool');
35
- });
36
- });
@@ -1,4 +0,0 @@
1
- import { Command } from 'commander';
2
- import { GenerateResult, GenerateCLIOptions } from '../utils/generator';
3
- export declare function runAIService(name: string, options: GenerateCLIOptions): Promise<GenerateResult>;
4
- export declare function generateAIService(program: Command): void;
@@ -1,54 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runAIService = runAIService;
4
- exports.generateAIService = generateAIService;
5
- const generator_1 = require("../utils/generator");
6
- const AI_SERVICE_TEMPLATE = `import { Service } from '@hazeljs/core';
7
- import { AIService, AIFunction, AIPrompt } from '@hazeljs/ai';
8
-
9
- @Service()
10
- export class {{className}}AIService {
11
- constructor(private readonly aiService: AIService) {}
12
-
13
- @AIFunction({
14
- provider: 'openai',
15
- model: 'gpt-4',
16
- streaming: false,
17
- })
18
- async {{camelName}}Task(@AIPrompt() prompt: string): Promise<unknown> {
19
- const result = await this.aiService.complete({
20
- provider: 'openai',
21
- model: 'gpt-4',
22
- messages: [{ role: 'user', content: prompt }],
23
- });
24
-
25
- return result;
26
- }
27
- }
28
- `;
29
- class AIServiceGenerator extends generator_1.Generator {
30
- constructor() {
31
- super(...arguments);
32
- this.suffix = 'ai-service';
33
- }
34
- getDefaultTemplate() {
35
- return AI_SERVICE_TEMPLATE;
36
- }
37
- }
38
- async function runAIService(name, options) {
39
- const generator = new AIServiceGenerator();
40
- return generator.generate({ name, path: options.path, dryRun: options.dryRun });
41
- }
42
- function generateAIService(program) {
43
- program
44
- .command('ai-service <name>')
45
- .description('Generate a new AI service with decorators')
46
- .alias('ai')
47
- .option('-p, --path <path>', 'Path where the AI service should be generated')
48
- .option('--dry-run', 'Preview files without writing them')
49
- .option('--json', 'Output result as JSON')
50
- .action(async (name, options) => {
51
- const result = await runAIService(name, options);
52
- (0, generator_1.printGenerateResult)(result, { json: options.json });
53
- });
54
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,41 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const fs_1 = __importDefault(require("fs"));
7
- const commander_1 = require("commander");
8
- const generate_ai_service_1 = require("./generate-ai-service");
9
- jest.mock('fs');
10
- describe('generateAIService', () => {
11
- const mockFs = fs_1.default;
12
- let program;
13
- beforeEach(() => {
14
- jest.clearAllMocks();
15
- mockFs.existsSync.mockReturnValue(true);
16
- mockFs.writeFileSync.mockImplementation(() => { });
17
- jest.spyOn(console, 'log').mockImplementation();
18
- program = new commander_1.Command();
19
- });
20
- afterEach(() => {
21
- jest.restoreAllMocks();
22
- });
23
- it('should register the ai-service command with alias', () => {
24
- (0, generate_ai_service_1.generateAIService)(program);
25
- const cmd = program.commands.find(c => c.name() === 'ai-service');
26
- expect(cmd).toBeDefined();
27
- expect(cmd?.alias()).toBe('ai');
28
- });
29
- it('should generate an AI service file with correct suffix', async () => {
30
- (0, generate_ai_service_1.generateAIService)(program);
31
- await program.parseAsync(['node', 'test', 'ai-service', 'chat']);
32
- expect(mockFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining('chat.ai-service.ts'), expect.stringContaining('ChatAIService'));
33
- });
34
- it('should import from @hazeljs/ai', async () => {
35
- (0, generate_ai_service_1.generateAIService)(program);
36
- await program.parseAsync(['node', 'test', 'ai-service', 'chat']);
37
- const writtenContent = mockFs.writeFileSync.mock.calls[0][1];
38
- expect(writtenContent).toContain("from '@hazeljs/ai'");
39
- expect(writtenContent).toContain('AIFunction');
40
- });
41
- });
@@ -1,4 +0,0 @@
1
- import { Command } from 'commander';
2
- import { GenerateResult, GenerateCLIOptions } from '../utils/generator';
3
- export declare function runCache(name: string, options: GenerateCLIOptions): Promise<GenerateResult>;
4
- export declare function generateCache(command: Command): void;