@kubb/cli 5.0.0-alpha.9 → 5.0.0-beta.2

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 (135) hide show
  1. package/README.md +4 -2
  2. package/bin/kubb.js +6 -0
  3. package/dist/{agent-BKphjOIF.cjs → agent-0Nk--lcr.cjs} +5 -5
  4. package/dist/agent-0Nk--lcr.cjs.map +1 -0
  5. package/dist/agent-B_pirbeB.cjs +116 -0
  6. package/dist/agent-B_pirbeB.cjs.map +1 -0
  7. package/dist/{agent-5mmp7QzF.js → agent-DKeVuiUC.js} +5 -5
  8. package/dist/agent-DKeVuiUC.js.map +1 -0
  9. package/dist/agent-Ev5hU5hH.js +112 -0
  10. package/dist/agent-Ev5hU5hH.js.map +1 -0
  11. package/dist/{constants-D0XHAHeZ.cjs → constants-CnDXa1R6.cjs} +30 -60
  12. package/dist/constants-CnDXa1R6.cjs.map +1 -0
  13. package/dist/{constants-DJM9zCXm.js → constants-aL3CP_Wq.js} +23 -59
  14. package/dist/constants-aL3CP_Wq.js.map +1 -0
  15. package/dist/define-Bdn8j5VM.cjs +54 -0
  16. package/dist/define-Bdn8j5VM.cjs.map +1 -0
  17. package/dist/define-Ctii4bel.js +43 -0
  18. package/dist/define-Ctii4bel.js.map +1 -0
  19. package/dist/{errors-DBW0N9w4.cjs → errors-CLCjoSg0.cjs} +22 -6
  20. package/dist/errors-CLCjoSg0.cjs.map +1 -0
  21. package/dist/errors-CjPmyZHy.js +43 -0
  22. package/dist/errors-CjPmyZHy.js.map +1 -0
  23. package/dist/{generate-Rly1EXBN.js → generate-B3PZ6Dp-.js} +3 -3
  24. package/dist/generate-B3PZ6Dp-.js.map +1 -0
  25. package/dist/{generate-Cq5RDTBL.cjs → generate-B3jl4ukb.cjs} +559 -265
  26. package/dist/generate-B3jl4ukb.cjs.map +1 -0
  27. package/dist/{generate-DU5zzc54.cjs → generate-DL_7a7Wd.cjs} +3 -3
  28. package/dist/generate-DL_7a7Wd.cjs.map +1 -0
  29. package/dist/{generate-BHNyeQXl.js → generate-Dt_r0ELY.js} +552 -258
  30. package/dist/generate-Dt_r0ELY.js.map +1 -0
  31. package/dist/index.cjs +40 -18
  32. package/dist/index.cjs.map +1 -1
  33. package/dist/index.js +40 -18
  34. package/dist/index.js.map +1 -1
  35. package/dist/{init-iN7e1XwI.js → init-Bj94Nvt8.js} +4 -4
  36. package/dist/init-Bj94Nvt8.js.map +1 -0
  37. package/dist/{init-BK6inBTR.cjs → init-CZ5Xq2Hd.cjs} +45 -58
  38. package/dist/init-CZ5Xq2Hd.cjs.map +1 -0
  39. package/dist/{init-CN1JFyGX.cjs → init-CyN1oyTF.cjs} +4 -4
  40. package/dist/init-CyN1oyTF.cjs.map +1 -0
  41. package/dist/{init-BQ6zfsnw.js → init-eNRlotJK.js} +41 -54
  42. package/dist/init-eNRlotJK.js.map +1 -0
  43. package/dist/{mcp-eP1S40LZ.js → mcp-BzW703d7.js} +4 -4
  44. package/dist/{mcp-eP1S40LZ.js.map → mcp-BzW703d7.js.map} +1 -1
  45. package/dist/{mcp-CONmm_xT.cjs → mcp-CLcDV4Jm.cjs} +5 -6
  46. package/dist/mcp-CLcDV4Jm.cjs.map +1 -0
  47. package/dist/{mcp-BiGUvbWP.js → mcp-D7EIR9fR.js} +4 -5
  48. package/dist/mcp-D7EIR9fR.js.map +1 -0
  49. package/dist/{mcp-T7Q4nWbT.cjs → mcp-ZY-ONTOp.cjs} +4 -4
  50. package/dist/{mcp-T7Q4nWbT.cjs.map → mcp-ZY-ONTOp.cjs.map} +1 -1
  51. package/dist/{package-BJ6ionm6.cjs → package-D8wlStAg.cjs} +2 -2
  52. package/dist/package-D8wlStAg.cjs.map +1 -0
  53. package/dist/package-Yo-9_m5C.js +6 -0
  54. package/dist/package-Yo-9_m5C.js.map +1 -0
  55. package/dist/{shell-7HPrTCJ5.cjs → shell-475fQKaX.cjs} +8 -3
  56. package/dist/shell-475fQKaX.cjs.map +1 -0
  57. package/dist/{shell-DqqWsHCD.js → shell-DLzN4fRo.js} +8 -3
  58. package/dist/shell-DLzN4fRo.js.map +1 -0
  59. package/dist/{telemetry-DZ7IrLAU.cjs → telemetry-DN95_2pF.cjs} +50 -8
  60. package/dist/telemetry-DN95_2pF.cjs.map +1 -0
  61. package/dist/{telemetry-BF3SMlH6.js → telemetry-LgT_sdPe.js} +48 -6
  62. package/dist/telemetry-LgT_sdPe.js.map +1 -0
  63. package/dist/{validate-DAZdX_0i.js → validate-Dplr99xO.js} +4 -4
  64. package/dist/validate-Dplr99xO.js.map +1 -0
  65. package/dist/{validate-DucFMytl.cjs → validate-_8mBa63G.cjs} +4 -4
  66. package/dist/validate-_8mBa63G.cjs.map +1 -0
  67. package/dist/{validate-BImbbx1t.js → validate-kLJoT_hi.js} +5 -13
  68. package/dist/validate-kLJoT_hi.js.map +1 -0
  69. package/dist/{validate-ujLCYSWU.cjs → validate-yKKzqEZ5.cjs} +6 -14
  70. package/dist/validate-yKKzqEZ5.cjs.map +1 -0
  71. package/package.json +47 -46
  72. package/src/commands/agent/start.ts +20 -4
  73. package/src/commands/generate.ts +35 -6
  74. package/src/commands/init.ts +6 -1
  75. package/src/commands/validate.ts +6 -1
  76. package/src/constants.ts +19 -38
  77. package/src/index.ts +7 -10
  78. package/src/loggers/clackLogger.ts +54 -46
  79. package/src/loggers/fileSystemLogger.ts +15 -16
  80. package/src/loggers/githubActionsLogger.ts +23 -24
  81. package/src/loggers/plainLogger.ts +22 -23
  82. package/src/runners/agent.ts +81 -34
  83. package/src/runners/generate.ts +90 -100
  84. package/src/runners/init.ts +24 -51
  85. package/src/runners/mcp.ts +17 -4
  86. package/src/runners/validate.ts +19 -15
  87. package/src/utils/executeHooks.ts +15 -15
  88. package/src/utils/flags.ts +1 -2
  89. package/src/utils/getConfig.ts +10 -0
  90. package/src/utils/getCosmiConfig.ts +21 -12
  91. package/src/utils/getSummary.ts +1 -1
  92. package/src/utils/runHook.ts +29 -13
  93. package/src/utils/telemetry.ts +16 -3
  94. package/bin/kubb.cjs +0 -18
  95. package/dist/agent-5mmp7QzF.js.map +0 -1
  96. package/dist/agent-BKphjOIF.cjs.map +0 -1
  97. package/dist/agent-BapvKB4r.cjs +0 -92
  98. package/dist/agent-BapvKB4r.cjs.map +0 -1
  99. package/dist/agent-CBrpIMMU.js +0 -88
  100. package/dist/agent-CBrpIMMU.js.map +0 -1
  101. package/dist/constants-D0XHAHeZ.cjs.map +0 -1
  102. package/dist/constants-DJM9zCXm.js.map +0 -1
  103. package/dist/define--M_JMcDC.js +0 -25
  104. package/dist/define--M_JMcDC.js.map +0 -1
  105. package/dist/define-D6Kfm7-Z.cjs +0 -36
  106. package/dist/define-D6Kfm7-Z.cjs.map +0 -1
  107. package/dist/errors-6mF_WKxg.js +0 -27
  108. package/dist/errors-6mF_WKxg.js.map +0 -1
  109. package/dist/errors-DBW0N9w4.cjs.map +0 -1
  110. package/dist/generate-BHNyeQXl.js.map +0 -1
  111. package/dist/generate-Cq5RDTBL.cjs.map +0 -1
  112. package/dist/generate-DU5zzc54.cjs.map +0 -1
  113. package/dist/generate-Rly1EXBN.js.map +0 -1
  114. package/dist/init-BK6inBTR.cjs.map +0 -1
  115. package/dist/init-BQ6zfsnw.js.map +0 -1
  116. package/dist/init-CN1JFyGX.cjs.map +0 -1
  117. package/dist/init-iN7e1XwI.js.map +0 -1
  118. package/dist/jiti-Cd3S0xwr.cjs +0 -16
  119. package/dist/jiti-Cd3S0xwr.cjs.map +0 -1
  120. package/dist/jiti-e08mD2Ph.js +0 -11
  121. package/dist/jiti-e08mD2Ph.js.map +0 -1
  122. package/dist/mcp-BiGUvbWP.js.map +0 -1
  123. package/dist/mcp-CONmm_xT.cjs.map +0 -1
  124. package/dist/package-BJ6ionm6.cjs.map +0 -1
  125. package/dist/package-BKZ0H3Zf.js +0 -6
  126. package/dist/package-BKZ0H3Zf.js.map +0 -1
  127. package/dist/shell-7HPrTCJ5.cjs.map +0 -1
  128. package/dist/shell-DqqWsHCD.js.map +0 -1
  129. package/dist/telemetry-BF3SMlH6.js.map +0 -1
  130. package/dist/telemetry-DZ7IrLAU.cjs.map +0 -1
  131. package/dist/validate-BImbbx1t.js.map +0 -1
  132. package/dist/validate-DAZdX_0i.js.map +0 -1
  133. package/dist/validate-DucFMytl.cjs.map +0 -1
  134. package/dist/validate-ujLCYSWU.cjs.map +0 -1
  135. package/src/utils/jiti.ts +0 -9
@@ -10,11 +10,8 @@ type CachedEvent = {
10
10
  }
11
11
 
12
12
  /**
13
- * FileSystem logger for debug log persistence
14
- * Captures debug and verbose events and writes them to files in .kubb directory
15
- *
16
- * Note: Logs are written on lifecycle:end or process exit. If the process crashes
17
- * before these events, some cached logs may be lost.
13
+ * FileSystem logger that captures debug events and writes them to `.kubb` directory files.
14
+ * Note: Logs write on `lifecycle:end` or process exit. Cached logs may be lost if the process crashes before these events.
18
15
  */
19
16
  export const fileSystemLogger = defineLogger({
20
17
  name: 'filesystem',
@@ -50,54 +47,56 @@ export const fileSystemLogger = defineLogger({
50
47
  }
51
48
  }
52
49
 
53
- await Promise.all(Object.entries(files).map(([fileName, logs]) => write(fileName, logs.join('\n\n'))))
50
+ for (const [fileName, logs] of Object.entries(files)) {
51
+ await write(fileName, logs.join('\n\n'))
52
+ }
54
53
 
55
54
  return Object.keys(files)
56
55
  }
57
56
 
58
- context.on('info', (message, info) => {
57
+ context.on('kubb:info', ({ message, info }) => {
59
58
  state.cachedLogs.add({
60
59
  date: new Date(),
61
60
  logs: [`ℹ ${message} ${info}`],
62
61
  })
63
62
  })
64
63
 
65
- context.on('success', (message, info) => {
64
+ context.on('kubb:success', ({ message, info }) => {
66
65
  state.cachedLogs.add({
67
66
  date: new Date(),
68
67
  logs: [`✓ ${message} ${info}`],
69
68
  })
70
69
  })
71
70
 
72
- context.on('warn', (message, info) => {
71
+ context.on('kubb:warn', ({ message, info }) => {
73
72
  state.cachedLogs.add({
74
73
  date: new Date(),
75
74
  logs: [`⚠ ${message} ${info}`],
76
75
  })
77
76
  })
78
77
 
79
- context.on('error', (error) => {
78
+ context.on('kubb:error', ({ error }) => {
80
79
  state.cachedLogs.add({
81
80
  date: new Date(),
82
81
  logs: [`✗ ${error.message}`, error.stack || 'unknown stack'],
83
82
  })
84
83
  })
85
84
 
86
- context.on('debug', (message) => {
85
+ context.on('kubb:debug', (message) => {
87
86
  state.cachedLogs.add({
88
87
  date: new Date(),
89
88
  logs: message.logs,
90
89
  })
91
90
  })
92
91
 
93
- context.on('plugin:start', (plugin) => {
92
+ context.on('kubb:plugin:start', ({ plugin }) => {
94
93
  state.cachedLogs.add({
95
94
  date: new Date(),
96
95
  logs: [`Generating ${plugin.name}`],
97
96
  })
98
97
  })
99
98
 
100
- context.on('plugin:end', (plugin, { duration, success }) => {
99
+ context.on('kubb:plugin:end', ({ plugin, duration, success }) => {
101
100
  const durationStr = formatMs(duration)
102
101
 
103
102
  state.cachedLogs.add({
@@ -106,18 +105,18 @@ export const fileSystemLogger = defineLogger({
106
105
  })
107
106
  })
108
107
 
109
- context.on('files:processing:start', (files) => {
108
+ context.on('kubb:files:processing:start', ({ files }) => {
110
109
  state.cachedLogs.add({
111
110
  date: new Date(),
112
111
  logs: [`Start ${files.length} writing:`, ...files.map((file) => file.path)],
113
112
  })
114
113
  })
115
114
 
116
- context.on('generation:end', async (config) => {
115
+ context.on('kubb:generation:end', async ({ config }) => {
117
116
  const writtenFilePaths = await writeLogs(config.name)
118
117
  if (writtenFilePaths.length > 0) {
119
118
  const files = writtenFilePaths.map((f) => relative(process.cwd(), f))
120
- await context.emit('info', 'Debug files written to:', files.join(', '))
119
+ await context.emit('kubb:info', { message: 'Debug files written to:', info: files.join(', ') })
121
120
  }
122
121
  reset()
123
122
  })
@@ -5,8 +5,7 @@ import { runHook } from '../utils/runHook.ts'
5
5
  import { buildProgressLine, formatCommandWithArgs, formatMessage } from './utils.ts'
6
6
 
7
7
  /**
8
- * GitHub Actions adapter for CI environments
9
- * Uses Github group annotations for collapsible sections
8
+ * GitHub Actions logger using group annotations for collapsible sections in CI.
10
9
  */
11
10
  export const githubActionsLogger = defineLogger({
12
11
  name: 'github-actions',
@@ -55,7 +54,7 @@ export const githubActionsLogger = defineLogger({
55
54
  console.log('::endgroup::')
56
55
  }
57
56
 
58
- context.on('info', (message, info = '') => {
57
+ context.on('kubb:info', ({ message, info = '' }) => {
59
58
  if (logLevel <= logLevelMap.silent) {
60
59
  return
61
60
  }
@@ -65,7 +64,7 @@ export const githubActionsLogger = defineLogger({
65
64
  console.log(text)
66
65
  })
67
66
 
68
- context.on('success', (message, info = '') => {
67
+ context.on('kubb:success', ({ message, info = '' }) => {
69
68
  if (logLevel <= logLevelMap.silent) {
70
69
  return
71
70
  }
@@ -75,7 +74,7 @@ export const githubActionsLogger = defineLogger({
75
74
  console.log(text)
76
75
  })
77
76
 
78
- context.on('warn', (message, info = '') => {
77
+ context.on('kubb:warn', ({ message, info = '' }) => {
79
78
  if (logLevel <= logLevelMap.silent) {
80
79
  return
81
80
  }
@@ -85,7 +84,7 @@ export const githubActionsLogger = defineLogger({
85
84
  console.warn(`::warning::${text}`)
86
85
  })
87
86
 
88
- context.on('error', (error) => {
87
+ context.on('kubb:error', ({ error }) => {
89
88
  const caused = toCause(error)
90
89
 
91
90
  if (logLevel <= logLevelMap.silent) {
@@ -112,12 +111,12 @@ export const githubActionsLogger = defineLogger({
112
111
  }
113
112
  })
114
113
 
115
- context.on('lifecycle:start', (version) => {
114
+ context.on('kubb:lifecycle:start', ({ version }) => {
116
115
  console.log(styleText('yellow', `Kubb ${version} 🧩`))
117
116
  reset()
118
117
  })
119
118
 
120
- context.on('config:start', () => {
119
+ context.on('kubb:config:start', () => {
121
120
  if (logLevel <= logLevelMap.silent) {
122
121
  return
123
122
  }
@@ -129,7 +128,7 @@ export const githubActionsLogger = defineLogger({
129
128
  console.log(text)
130
129
  })
131
130
 
132
- context.on('config:end', (configs) => {
131
+ context.on('kubb:config:end', ({ configs }) => {
133
132
  state.currentConfigs = configs
134
133
 
135
134
  if (logLevel <= logLevelMap.silent) {
@@ -143,7 +142,7 @@ export const githubActionsLogger = defineLogger({
143
142
  closeGroup('Configuration')
144
143
  })
145
144
 
146
- context.on('generation:start', (config) => {
145
+ context.on('kubb:generation:start', ({ config }) => {
147
146
  reset()
148
147
 
149
148
  // Initialize progress tracking for this generation
@@ -160,7 +159,7 @@ export const githubActionsLogger = defineLogger({
160
159
  }
161
160
  })
162
161
 
163
- context.on('plugin:start', (plugin) => {
162
+ context.on('kubb:plugin:start', ({ plugin }) => {
164
163
  if (logLevel <= logLevelMap.silent) {
165
164
  return
166
165
  }
@@ -173,7 +172,7 @@ export const githubActionsLogger = defineLogger({
173
172
  console.log(text)
174
173
  })
175
174
 
176
- context.on('plugin:end', (plugin, { duration, success }) => {
175
+ context.on('kubb:plugin:end', ({ plugin, duration, success }) => {
177
176
  if (logLevel <= logLevelMap.silent) {
178
177
  return
179
178
  }
@@ -204,7 +203,7 @@ export const githubActionsLogger = defineLogger({
204
203
  showProgressStep()
205
204
  })
206
205
 
207
- context.on('files:processing:start', (files) => {
206
+ context.on('kubb:files:processing:start', ({ files }) => {
208
207
  if (logLevel <= logLevelMap.silent) {
209
208
  return
210
209
  }
@@ -220,7 +219,7 @@ export const githubActionsLogger = defineLogger({
220
219
  console.log(text)
221
220
  })
222
221
 
223
- context.on('files:processing:end', () => {
222
+ context.on('kubb:files:processing:end', () => {
224
223
  if (logLevel <= logLevelMap.silent) {
225
224
  return
226
225
  }
@@ -236,7 +235,7 @@ export const githubActionsLogger = defineLogger({
236
235
  showProgressStep()
237
236
  })
238
237
 
239
- context.on('file:processing:update', () => {
238
+ context.on('kubb:file:processing:update', () => {
240
239
  if (logLevel <= logLevelMap.silent) {
241
240
  return
242
241
  }
@@ -244,7 +243,7 @@ export const githubActionsLogger = defineLogger({
244
243
  state.processedFiles++
245
244
  })
246
245
 
247
- context.on('generation:end', (config) => {
246
+ context.on('kubb:generation:end', ({ config }) => {
248
247
  const text = getMessage(
249
248
  config.name ? `${styleText('blue', '✓')} Generation completed for ${styleText('dim', config.name)}` : `${styleText('blue', '✓')} Generation completed`,
250
249
  )
@@ -252,7 +251,7 @@ export const githubActionsLogger = defineLogger({
252
251
  console.log(text)
253
252
  })
254
253
 
255
- context.on('format:start', () => {
254
+ context.on('kubb:format:start', () => {
256
255
  if (logLevel <= logLevelMap.silent) {
257
256
  return
258
257
  }
@@ -266,7 +265,7 @@ export const githubActionsLogger = defineLogger({
266
265
  console.log(text)
267
266
  })
268
267
 
269
- context.on('format:end', () => {
268
+ context.on('kubb:format:end', () => {
270
269
  if (logLevel <= logLevelMap.silent) {
271
270
  return
272
271
  }
@@ -280,7 +279,7 @@ export const githubActionsLogger = defineLogger({
280
279
  }
281
280
  })
282
281
 
283
- context.on('lint:start', () => {
282
+ context.on('kubb:lint:start', () => {
284
283
  if (logLevel <= logLevelMap.silent) {
285
284
  return
286
285
  }
@@ -294,7 +293,7 @@ export const githubActionsLogger = defineLogger({
294
293
  console.log(text)
295
294
  })
296
295
 
297
- context.on('lint:end', () => {
296
+ context.on('kubb:lint:end', () => {
298
297
  if (logLevel <= logLevelMap.silent) {
299
298
  return
300
299
  }
@@ -308,7 +307,7 @@ export const githubActionsLogger = defineLogger({
308
307
  }
309
308
  })
310
309
 
311
- context.on('hook:start', async ({ id, command, args }) => {
310
+ context.on('kubb:hook:start', async ({ id, command, args }) => {
312
311
  const commandWithArgs = formatCommandWithArgs(command, args)
313
312
  const text = getMessage(`Hook ${styleText('dim', commandWithArgs)} started`)
314
313
 
@@ -338,7 +337,7 @@ export const githubActionsLogger = defineLogger({
338
337
  })
339
338
  })
340
339
 
341
- context.on('hook:end', ({ command, args }) => {
340
+ context.on('kubb:hook:end', ({ command, args }) => {
342
341
  if (logLevel <= logLevelMap.silent) {
343
342
  return
344
343
  }
@@ -353,7 +352,7 @@ export const githubActionsLogger = defineLogger({
353
352
  }
354
353
  })
355
354
 
356
- context.on('generation:summary', (config, { status, hrStart, failedPlugins }) => {
355
+ context.on('kubb:generation:summary', ({ config, status, hrStart, failedPlugins }) => {
357
356
  const pluginsCount = config.plugins?.length ?? 0
358
357
  const successCount = pluginsCount - failedPlugins.size
359
358
  const duration = formatHrtime(hrStart)
@@ -373,7 +372,7 @@ export const githubActionsLogger = defineLogger({
373
372
  }
374
373
  })
375
374
 
376
- context.on('lifecycle:end', () => {
375
+ context.on('kubb:lifecycle:end', () => {
377
376
  reset()
378
377
  })
379
378
  },
@@ -7,8 +7,7 @@ import { runHook } from '../utils/runHook.ts'
7
7
  import { formatCommandWithArgs, formatMessage } from './utils.ts'
8
8
 
9
9
  /**
10
- * Plain console adapter for non-TTY environments
11
- * Simple console.log output with indentation
10
+ * Plain console adapter for non-TTY environments with simple `console.log` output.
12
11
  */
13
12
  export const plainLogger = defineLogger({
14
13
  name: 'plain',
@@ -19,7 +18,7 @@ export const plainLogger = defineLogger({
19
18
  return formatMessage(message, logLevel)
20
19
  }
21
20
 
22
- context.on('info', (message, info) => {
21
+ context.on('kubb:info', ({ message, info }) => {
23
22
  if (logLevel <= logLevelMap.silent) {
24
23
  return
25
24
  }
@@ -29,7 +28,7 @@ export const plainLogger = defineLogger({
29
28
  console.log(text)
30
29
  })
31
30
 
32
- context.on('success', (message, info = '') => {
31
+ context.on('kubb:success', ({ message, info = '' }) => {
33
32
  if (logLevel <= logLevelMap.silent) {
34
33
  return
35
34
  }
@@ -39,7 +38,7 @@ export const plainLogger = defineLogger({
39
38
  console.log(text)
40
39
  })
41
40
 
42
- context.on('warn', (message, info) => {
41
+ context.on('kubb:warn', ({ message, info }) => {
43
42
  if (logLevel < logLevelMap.warn) {
44
43
  return
45
44
  }
@@ -49,7 +48,7 @@ export const plainLogger = defineLogger({
49
48
  console.log(text)
50
49
  })
51
50
 
52
- context.on('error', (error) => {
51
+ context.on('kubb:error', ({ error }) => {
53
52
  const caused = toCause(error)
54
53
 
55
54
  const text = getMessage(['✗', error.message].join(' '))
@@ -74,11 +73,11 @@ export const plainLogger = defineLogger({
74
73
  }
75
74
  })
76
75
 
77
- context.on('lifecycle:start', () => {
76
+ context.on('kubb:lifecycle:start', () => {
78
77
  console.log('Kubb CLI 🧩')
79
78
  })
80
79
 
81
- context.on('config:start', () => {
80
+ context.on('kubb:config:start', () => {
82
81
  if (logLevel <= logLevelMap.silent) {
83
82
  return
84
83
  }
@@ -88,7 +87,7 @@ export const plainLogger = defineLogger({
88
87
  console.log(text)
89
88
  })
90
89
 
91
- context.on('config:end', () => {
90
+ context.on('kubb:config:end', () => {
92
91
  if (logLevel <= logLevelMap.silent) {
93
92
  return
94
93
  }
@@ -98,13 +97,13 @@ export const plainLogger = defineLogger({
98
97
  console.log(text)
99
98
  })
100
99
 
101
- context.on('generation:start', () => {
100
+ context.on('kubb:generation:start', () => {
102
101
  const text = getMessage('Generation started')
103
102
 
104
103
  console.log(text)
105
104
  })
106
105
 
107
- context.on('plugin:start', (plugin) => {
106
+ context.on('kubb:plugin:start', ({ plugin }) => {
108
107
  if (logLevel <= logLevelMap.silent) {
109
108
  return
110
109
  }
@@ -113,7 +112,7 @@ export const plainLogger = defineLogger({
113
112
  console.log(text)
114
113
  })
115
114
 
116
- context.on('plugin:end', (plugin, { duration, success }) => {
115
+ context.on('kubb:plugin:end', ({ plugin, duration, success }) => {
117
116
  if (logLevel <= logLevelMap.silent) {
118
117
  return
119
118
  }
@@ -124,7 +123,7 @@ export const plainLogger = defineLogger({
124
123
  console.log(text)
125
124
  })
126
125
 
127
- context.on('files:processing:start', (files) => {
126
+ context.on('kubb:files:processing:start', ({ files }) => {
128
127
  if (logLevel <= logLevelMap.silent) {
129
128
  return
130
129
  }
@@ -134,7 +133,7 @@ export const plainLogger = defineLogger({
134
133
  console.log(text)
135
134
  })
136
135
 
137
- context.on('file:processing:update', ({ file, config }) => {
136
+ context.on('kubb:file:processing:update', ({ file, config }) => {
138
137
  if (logLevel <= logLevelMap.silent) {
139
138
  return
140
139
  }
@@ -144,7 +143,7 @@ export const plainLogger = defineLogger({
144
143
  console.log(text)
145
144
  })
146
145
 
147
- context.on('files:processing:end', () => {
146
+ context.on('kubb:files:processing:end', () => {
148
147
  if (logLevel <= logLevelMap.silent) {
149
148
  return
150
149
  }
@@ -154,13 +153,13 @@ export const plainLogger = defineLogger({
154
153
  console.log(text)
155
154
  })
156
155
 
157
- context.on('generation:end', (config) => {
156
+ context.on('kubb:generation:end', ({ config }) => {
158
157
  const text = getMessage(config.name ? `Generation completed for ${config.name}` : 'Generation completed')
159
158
 
160
159
  console.log(text)
161
160
  })
162
161
 
163
- context.on('format:start', () => {
162
+ context.on('kubb:format:start', () => {
164
163
  if (logLevel <= logLevelMap.silent) {
165
164
  return
166
165
  }
@@ -170,7 +169,7 @@ export const plainLogger = defineLogger({
170
169
  console.log(text)
171
170
  })
172
171
 
173
- context.on('format:end', () => {
172
+ context.on('kubb:format:end', () => {
174
173
  if (logLevel <= logLevelMap.silent) {
175
174
  return
176
175
  }
@@ -180,7 +179,7 @@ export const plainLogger = defineLogger({
180
179
  console.log(text)
181
180
  })
182
181
 
183
- context.on('lint:start', () => {
182
+ context.on('kubb:lint:start', () => {
184
183
  if (logLevel <= logLevelMap.silent) {
185
184
  return
186
185
  }
@@ -190,7 +189,7 @@ export const plainLogger = defineLogger({
190
189
  console.log(text)
191
190
  })
192
191
 
193
- context.on('lint:end', () => {
192
+ context.on('kubb:lint:end', () => {
194
193
  if (logLevel <= logLevelMap.silent) {
195
194
  return
196
195
  }
@@ -200,7 +199,7 @@ export const plainLogger = defineLogger({
200
199
  console.log(text)
201
200
  })
202
201
 
203
- context.on('hook:start', async ({ id, command, args }) => {
202
+ context.on('kubb:hook:start', async ({ id, command, args }) => {
204
203
  const commandWithArgs = formatCommandWithArgs(command, args)
205
204
  const text = getMessage(`Hook ${commandWithArgs} started`)
206
205
 
@@ -226,7 +225,7 @@ export const plainLogger = defineLogger({
226
225
  })
227
226
  })
228
227
 
229
- context.on('hook:end', ({ command, args }) => {
228
+ context.on('kubb:hook:end', ({ command, args }) => {
230
229
  if (logLevel <= logLevelMap.silent) {
231
230
  return
232
231
  }
@@ -237,7 +236,7 @@ export const plainLogger = defineLogger({
237
236
  console.log(text)
238
237
  })
239
238
 
240
- context.on('generation:summary', (config, { pluginTimings, status, hrStart, failedPlugins, filesCreated }) => {
239
+ context.on('kubb:generation:summary', ({ config, pluginTimings, status, hrStart, failedPlugins, filesCreated }) => {
241
240
  const summary = getSummary({
242
241
  failedPlugins,
243
242
  filesCreated,
@@ -17,6 +17,47 @@ type AgentStartOptions = {
17
17
  version: string
18
18
  }
19
19
 
20
+ type ResolvedAgentStartEnvironment = {
21
+ port: string
22
+ host: string
23
+ allowWrite: boolean
24
+ allowAll: boolean
25
+ agentConfigPath: string
26
+ env: NodeJS.ProcessEnv
27
+ }
28
+
29
+ /**
30
+ * Resolves the environment passed to the detached agent process using CLI values first, then environment values, then CLI defaults.
31
+ */
32
+ function resolveAgentStartEnvironment({ port, host, configPath, allowWrite, allowAll }: Omit<AgentStartOptions, 'version'>): ResolvedAgentStartEnvironment {
33
+ const resolvedPort = port ?? process.env.PORT ?? agentDefaults.port
34
+ const resolvedHost = host !== agentDefaults.host ? host : (process.env.HOST ?? agentDefaults.host)
35
+ const resolvedAllowAll = allowAll || process.env.KUBB_AGENT_ALLOW_ALL === 'true'
36
+ const resolvedAllowWrite = resolvedAllowAll || allowWrite || process.env.KUBB_AGENT_ALLOW_WRITE === 'true'
37
+ const agentRoot = process.env.KUBB_AGENT_ROOT ?? process.cwd()
38
+ const agentConfigPath = path.resolve(process.cwd(), configPath || process.env.KUBB_AGENT_CONFIG || agentDefaults.configFile)
39
+
40
+ return {
41
+ port: resolvedPort,
42
+ host: resolvedHost,
43
+ allowWrite: resolvedAllowWrite,
44
+ allowAll: resolvedAllowAll,
45
+ agentConfigPath,
46
+ env: {
47
+ ...process.env,
48
+ PORT: resolvedPort,
49
+ HOST: resolvedHost,
50
+ KUBB_AGENT_ROOT: agentRoot,
51
+ KUBB_AGENT_CONFIG: agentConfigPath,
52
+ KUBB_AGENT_ALLOW_WRITE: String(resolvedAllowWrite),
53
+ KUBB_AGENT_ALLOW_ALL: String(resolvedAllowAll),
54
+ KUBB_AGENT_TOKEN: process.env.KUBB_AGENT_TOKEN,
55
+ KUBB_AGENT_RETRY_TIMEOUT: process.env.KUBB_AGENT_RETRY_TIMEOUT ?? agentDefaults.retryTimeout,
56
+ KUBB_STUDIO_URL: process.env.KUBB_STUDIO_URL ?? agentDefaults.studioUrl,
57
+ },
58
+ }
59
+ }
60
+
20
61
  function isPortAvailable(port: number, host: string): Promise<boolean> {
21
62
  return new Promise((resolve) => {
22
63
  const server = net.createServer()
@@ -41,60 +82,66 @@ export async function runAgentStart({ port, host, configPath, allowWrite, allowA
41
82
  }
42
83
 
43
84
  // Resolve the @kubb/agent package path
44
- const agentPkgUrl = import.meta.resolve('@kubb/agent/package.json')
85
+ let agentPkgUrl: string
86
+ try {
87
+ agentPkgUrl = import.meta.resolve('@kubb/agent/package.json')
88
+ } catch (_e) {
89
+ console.error(`Import of '@kubb/agent' is required to start the Agent server`)
90
+ process.exit(1)
91
+ }
45
92
  const agentPkgPath = fileURLToPath(agentPkgUrl)
46
93
  const agentDir = path.dirname(agentPkgPath)
47
94
  const serverPath = path.join(agentDir, agentDefaults.serverEntryPath)
48
95
 
49
- // CLI params take priority over process.env; process.env fills in what the CLI didn't specify;
50
- // agentDefaults are the last resort. Build env as: defaults ← process.env ← CLI.
51
- const PORT = port !== undefined ? port : (process.env.PORT ?? agentDefaults.port)
52
- const HOST = host !== agentDefaults.host ? host : (process.env.HOST ?? agentDefaults.host)
53
- const KUBB_AGENT_ROOT = process.env.KUBB_AGENT_ROOT ?? process.cwd()
54
- const KUBB_AGENT_CONFIG = path.resolve(process.cwd(), configPath || process.env.KUBB_AGENT_CONFIG || agentDefaults.configFile)
55
- const KUBB_AGENT_ALLOW_WRITE = allowAll || allowWrite ? 'true' : (process.env.KUBB_AGENT_ALLOW_WRITE ?? 'false')
56
- const KUBB_AGENT_ALLOW_ALL = allowAll ? 'true' : (process.env.KUBB_AGENT_ALLOW_ALL ?? 'false')
57
- const KUBB_AGENT_TOKEN = process.env.KUBB_AGENT_TOKEN
58
- const KUBB_AGENT_RETRY_TIMEOUT = process.env.KUBB_AGENT_RETRY_TIMEOUT ?? agentDefaults.retryTimeout
59
- const KUBB_STUDIO_URL = process.env.KUBB_STUDIO_URL ?? agentDefaults.studioUrl
96
+ const resolvedEnv = resolveAgentStartEnvironment({
97
+ port,
98
+ host,
99
+ configPath,
100
+ allowWrite,
101
+ allowAll,
102
+ })
103
+ const numericPort = Number(resolvedEnv.port)
60
104
 
61
- const env = {
62
- ...process.env,
63
- PORT,
64
- HOST,
65
- KUBB_AGENT_ROOT,
66
- KUBB_AGENT_CONFIG,
67
- KUBB_AGENT_ALLOW_WRITE,
68
- KUBB_AGENT_ALLOW_ALL,
69
- KUBB_AGENT_TOKEN,
70
- KUBB_AGENT_RETRY_TIMEOUT,
71
- KUBB_STUDIO_URL,
105
+ if (!Number.isInteger(numericPort) || numericPort <= 0) {
106
+ throw new Error(`Invalid port "${resolvedEnv.port}". Provide a positive integer with --port or PORT.`)
72
107
  }
73
108
 
74
109
  clack.log.step(styleText('cyan', 'Starting agent server...'))
75
- clack.log.info(styleText('dim', `Config: ${KUBB_AGENT_CONFIG}`))
76
- clack.log.info(styleText('dim', `Host: ${HOST}`))
77
- clack.log.info(styleText('dim', `Port: ${PORT}`))
78
- if (!KUBB_AGENT_ALLOW_WRITE && !KUBB_AGENT_ALLOW_ALL) {
110
+ clack.log.info(styleText('dim', `Config: ${resolvedEnv.agentConfigPath}`))
111
+ clack.log.info(styleText('dim', `Host: ${resolvedEnv.host}`))
112
+ clack.log.info(styleText('dim', `Port: ${resolvedEnv.port}`))
113
+ if (!resolvedEnv.allowWrite && !resolvedEnv.allowAll) {
79
114
  clack.log.warn(styleText('yellow', 'Filesystem writes disabled. Use --allow-write or --allow-all to enable.'))
80
115
  }
81
116
 
82
- if (!(await isPortAvailable(Number(PORT), HOST))) {
83
- clack.log.error(styleText('red', `Port ${PORT} is already in use. Stop the existing process or choose a different port with --port.`))
117
+ if (!(await isPortAvailable(numericPort, resolvedEnv.host))) {
118
+ clack.log.error(styleText('red', `Port ${resolvedEnv.port} is already in use. Stop the existing process or choose a different port with --port.`))
84
119
  process.exit(1)
85
120
  }
86
121
 
87
- console.log(env)
88
-
89
122
  // Spawns the server as a detached background process so the CLI can exit independently.
90
123
  await spawnAsync('node', [serverPath], {
91
- env,
124
+ env: resolvedEnv.env,
92
125
  cwd: process.cwd(),
93
126
  })
94
127
 
95
- await sendTelemetry(buildTelemetryEvent({ command: 'agent', kubbVersion: version, hrStart, status: 'success' }))
128
+ await sendTelemetry(
129
+ buildTelemetryEvent({
130
+ command: 'agent',
131
+ kubbVersion: version,
132
+ hrStart,
133
+ status: 'success',
134
+ }),
135
+ )
96
136
  } catch (error) {
97
- await sendTelemetry(buildTelemetryEvent({ command: 'agent', kubbVersion: version, hrStart, status: 'failed' }))
137
+ await sendTelemetry(
138
+ buildTelemetryEvent({
139
+ command: 'agent',
140
+ kubbVersion: version,
141
+ hrStart,
142
+ status: 'failed',
143
+ }),
144
+ )
98
145
  clack.log.error(styleText('red', 'Failed to start agent server'))
99
146
  console.error(error)
100
147
  process.exit(1)