@kubb/cli 5.0.0-beta.4 → 5.0.0-beta.40

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 (155) hide show
  1. package/README.md +198 -36
  2. package/dist/agent-DQerNyd8.cjs +70 -0
  3. package/dist/agent-DQerNyd8.cjs.map +1 -0
  4. package/dist/agent-ZKJkTTGN.js +68 -0
  5. package/dist/agent-ZKJkTTGN.js.map +1 -0
  6. package/dist/{chunk--u3MIqq1.js → chunk-CRm0XQPb.js} +1 -0
  7. package/dist/constants-84a47qA-.js +35 -0
  8. package/dist/constants-84a47qA-.js.map +1 -0
  9. package/dist/constants-AHhyFH15.cjs +139 -0
  10. package/dist/constants-AHhyFH15.cjs.map +1 -0
  11. package/dist/constants-BtmponZ3.cjs +58 -0
  12. package/dist/constants-BtmponZ3.cjs.map +1 -0
  13. package/dist/constants-C94RKp3A.js +116 -0
  14. package/dist/constants-C94RKp3A.js.map +1 -0
  15. package/dist/{define-Bdn8j5VM.cjs → define-C4AB3POr.cjs} +2 -2
  16. package/dist/{define-Bdn8j5VM.cjs.map → define-C4AB3POr.cjs.map} +1 -1
  17. package/dist/{define-Ctii4bel.js → define-DNG1U8ha.js} +2 -2
  18. package/dist/{define-Ctii4bel.js.map → define-DNG1U8ha.js.map} +1 -1
  19. package/dist/{errors-CjPmyZHy.js → errors-CoxrNXaA.js} +2 -2
  20. package/dist/{errors-CjPmyZHy.js.map → errors-CoxrNXaA.js.map} +1 -1
  21. package/dist/{errors-CLCjoSg0.cjs → errors-DykI11xo.cjs} +2 -2
  22. package/dist/{errors-CLCjoSg0.cjs.map → errors-DykI11xo.cjs.map} +1 -1
  23. package/dist/generate-40x9PP4o.js +77 -0
  24. package/dist/generate-40x9PP4o.js.map +1 -0
  25. package/dist/generate-DQLvFw4z.cjs +76 -0
  26. package/dist/generate-DQLvFw4z.cjs.map +1 -0
  27. package/dist/index.cjs +23 -14
  28. package/dist/index.cjs.map +1 -1
  29. package/dist/index.d.ts +1 -1
  30. package/dist/index.js +23 -14
  31. package/dist/index.js.map +1 -1
  32. package/dist/init-CT9RChdK.js +53 -0
  33. package/dist/init-CT9RChdK.js.map +1 -0
  34. package/dist/init-sEaUN7Dj.cjs +53 -0
  35. package/dist/init-sEaUN7Dj.cjs.map +1 -0
  36. package/dist/mcp-Siyb6fTT.cjs +39 -0
  37. package/dist/mcp-Siyb6fTT.cjs.map +1 -0
  38. package/dist/mcp-cjPrOeot.js +39 -0
  39. package/dist/mcp-cjPrOeot.js.map +1 -0
  40. package/dist/{package-BapVyQ-w.cjs → package-BJ6qam2Y.cjs} +2 -2
  41. package/dist/package-BJ6qam2Y.cjs.map +1 -0
  42. package/dist/package-CR5vEK4K.js +6 -0
  43. package/dist/package-CR5vEK4K.js.map +1 -0
  44. package/dist/{agent-sdYBBgrd.js → run-BQ3Qj0xB.js} +46 -43
  45. package/dist/run-BQ3Qj0xB.js.map +1 -0
  46. package/dist/run-BQzoaxjR.js +32 -0
  47. package/dist/run-BQzoaxjR.js.map +1 -0
  48. package/dist/run-CGf0KEts.js +51 -0
  49. package/dist/run-CGf0KEts.js.map +1 -0
  50. package/dist/{generate-CNrRLY4n.js → run-CHZKHTv0.js} +832 -828
  51. package/dist/run-CHZKHTv0.js.map +1 -0
  52. package/dist/{init-CZ5Xq2Hd.cjs → run-C_NMctua.cjs} +107 -149
  53. package/dist/run-C_NMctua.cjs.map +1 -0
  54. package/dist/{generate-B1Pa2ho-.cjs → run-CcQawFNK.cjs} +784 -780
  55. package/dist/run-CcQawFNK.cjs.map +1 -0
  56. package/dist/run-CkTpemme.cjs +52 -0
  57. package/dist/run-CkTpemme.cjs.map +1 -0
  58. package/dist/run-Cl4SrSob.cjs +33 -0
  59. package/dist/run-Cl4SrSob.cjs.map +1 -0
  60. package/dist/{agent-B4cAAab2.cjs → run-D-s2LdlW.cjs} +46 -43
  61. package/dist/run-D-s2LdlW.cjs.map +1 -0
  62. package/dist/{init-eNRlotJK.js → run-D8dCWepS.js} +107 -149
  63. package/dist/run-D8dCWepS.js.map +1 -0
  64. package/dist/{shell-DLzN4fRo.js → shell-BrqyJdB7.js} +2 -2
  65. package/dist/{shell-DLzN4fRo.js.map → shell-BrqyJdB7.js.map} +1 -1
  66. package/dist/{shell-475fQKaX.cjs → shell-Lh-vLWwH.cjs} +2 -2
  67. package/dist/{shell-475fQKaX.cjs.map → shell-Lh-vLWwH.cjs.map} +1 -1
  68. package/dist/validate-8pgfxUTy.js +26 -0
  69. package/dist/validate-8pgfxUTy.js.map +1 -0
  70. package/dist/validate-CstV7Pc2.cjs +26 -0
  71. package/dist/validate-CstV7Pc2.cjs.map +1 -0
  72. package/package.json +16 -15
  73. package/src/commands/agent/start.ts +10 -7
  74. package/src/commands/agent.ts +3 -1
  75. package/src/commands/generate.ts +21 -13
  76. package/src/commands/init.ts +34 -3
  77. package/src/commands/mcp.ts +28 -4
  78. package/src/commands/validate.ts +6 -4
  79. package/src/constants.ts +3 -74
  80. package/src/index.ts +6 -4
  81. package/src/loggers/clackLogger.ts +143 -181
  82. package/src/loggers/githubActionsLogger.ts +119 -121
  83. package/src/loggers/plainLogger.ts +50 -100
  84. package/src/loggers/types.ts +6 -0
  85. package/src/loggers/utils.ts +190 -18
  86. package/src/runners/agent/run.ts +113 -0
  87. package/src/runners/agent/utils.ts +98 -0
  88. package/src/runners/generate/run.ts +411 -0
  89. package/src/runners/generate/utils.ts +222 -0
  90. package/src/runners/init/run.ts +212 -0
  91. package/src/{utils/packageManager.ts → runners/init/utils.ts} +12 -2
  92. package/src/runners/mcp/run.ts +37 -0
  93. package/src/runners/validate/run.ts +63 -0
  94. package/dist/agent-B4cAAab2.cjs.map +0 -1
  95. package/dist/agent-CR6Z96og.js +0 -56
  96. package/dist/agent-CR6Z96og.js.map +0 -1
  97. package/dist/agent-Dmxzqg4d.cjs +0 -58
  98. package/dist/agent-Dmxzqg4d.cjs.map +0 -1
  99. package/dist/agent-sdYBBgrd.js.map +0 -1
  100. package/dist/constants-CnDXa1R6.cjs +0 -148
  101. package/dist/constants-CnDXa1R6.cjs.map +0 -1
  102. package/dist/constants-aL3CP_Wq.js +0 -95
  103. package/dist/constants-aL3CP_Wq.js.map +0 -1
  104. package/dist/generate-B1Pa2ho-.cjs.map +0 -1
  105. package/dist/generate-BDGOOsBM.cjs +0 -65
  106. package/dist/generate-BDGOOsBM.cjs.map +0 -1
  107. package/dist/generate-CNrRLY4n.js.map +0 -1
  108. package/dist/generate-DuhxPLGr.js +0 -66
  109. package/dist/generate-DuhxPLGr.js.map +0 -1
  110. package/dist/init-CZ5Xq2Hd.cjs.map +0 -1
  111. package/dist/init-CnZXHrbq.js +0 -25
  112. package/dist/init-CnZXHrbq.js.map +0 -1
  113. package/dist/init-NYJSZJSb.cjs +0 -25
  114. package/dist/init-NYJSZJSb.cjs.map +0 -1
  115. package/dist/init-eNRlotJK.js.map +0 -1
  116. package/dist/mcp-CYOgxB82.cjs +0 -47
  117. package/dist/mcp-CYOgxB82.cjs.map +0 -1
  118. package/dist/mcp-CdFWyrwi.cjs +0 -16
  119. package/dist/mcp-CdFWyrwi.cjs.map +0 -1
  120. package/dist/mcp-DhSxuDMD.js +0 -16
  121. package/dist/mcp-DhSxuDMD.js.map +0 -1
  122. package/dist/mcp-DmJm3TrU.js +0 -46
  123. package/dist/mcp-DmJm3TrU.js.map +0 -1
  124. package/dist/package-BapVyQ-w.cjs.map +0 -1
  125. package/dist/package-DyJE-qNq.js +0 -6
  126. package/dist/package-DyJE-qNq.js.map +0 -1
  127. package/dist/telemetry-DN95_2pF.cjs +0 -282
  128. package/dist/telemetry-DN95_2pF.cjs.map +0 -1
  129. package/dist/telemetry-LgT_sdPe.js +0 -245
  130. package/dist/telemetry-LgT_sdPe.js.map +0 -1
  131. package/dist/validate-C6npXzel.cjs +0 -25
  132. package/dist/validate-C6npXzel.cjs.map +0 -1
  133. package/dist/validate-kLJoT_hi.js +0 -33
  134. package/dist/validate-kLJoT_hi.js.map +0 -1
  135. package/dist/validate-n38Rh-Y7.js +0 -25
  136. package/dist/validate-n38Rh-Y7.js.map +0 -1
  137. package/dist/validate-yKKzqEZ5.cjs +0 -34
  138. package/dist/validate-yKKzqEZ5.cjs.map +0 -1
  139. package/src/loggers/fileSystemLogger.ts +0 -138
  140. package/src/runners/agent.ts +0 -155
  141. package/src/runners/generate.ts +0 -333
  142. package/src/runners/init.ts +0 -296
  143. package/src/runners/mcp.ts +0 -51
  144. package/src/runners/validate.ts +0 -39
  145. package/src/types.ts +0 -11
  146. package/src/utils/Writables.ts +0 -17
  147. package/src/utils/executeHooks.ts +0 -45
  148. package/src/utils/flags.ts +0 -9
  149. package/src/utils/getConfig.ts +0 -10
  150. package/src/utils/getCosmiConfig.ts +0 -80
  151. package/src/utils/getSummary.ts +0 -68
  152. package/src/utils/runHook.ts +0 -91
  153. package/src/utils/telemetry.ts +0 -273
  154. package/src/utils/watcher.ts +0 -19
  155. /package/dist/{chunk-ByKO4r7w.cjs → chunk-Bx3C2hgW.cjs} +0 -0
@@ -1,25 +0,0 @@
1
- require("./chunk-ByKO4r7w.cjs");
2
- const require_define = require("./define-Bdn8j5VM.cjs");
3
- const require_package = require("./package-BapVyQ-w.cjs");
4
- //#region src/commands/validate.ts
5
- const command = require_define.defineCommand({
6
- name: "validate",
7
- description: "Validate a Swagger/OpenAPI file",
8
- options: { input: {
9
- type: "string",
10
- description: "Path to Swagger/OpenAPI file",
11
- short: "i",
12
- required: true
13
- } },
14
- async run({ values }) {
15
- const { runValidate } = await Promise.resolve().then(() => require("./validate-yKKzqEZ5.cjs"));
16
- await runValidate({
17
- input: values.input,
18
- version: require_package.version
19
- });
20
- }
21
- });
22
- //#endregion
23
- exports.command = command;
24
-
25
- //# sourceMappingURL=validate-C6npXzel.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate-C6npXzel.cjs","names":["defineCommand"],"sources":["../src/commands/validate.ts"],"sourcesContent":["import { defineCommand } from '@internals/utils'\nimport { version } from '../../package.json'\n\nexport const command = defineCommand({\n name: 'validate',\n description: 'Validate a Swagger/OpenAPI file',\n options: {\n input: {\n type: 'string',\n description: 'Path to Swagger/OpenAPI file',\n short: 'i',\n required: true,\n },\n },\n async run({ values }) {\n const { runValidate } = await import('../runners/validate.ts')\n\n await runValidate({ input: values.input, version })\n },\n})\n"],"mappings":";;;;AAGA,MAAa,UAAUA,eAAAA,cAAc;CACnC,MAAM;CACN,aAAa;CACb,SAAS,EACP,OAAO;EACL,MAAM;EACN,aAAa;EACb,OAAO;EACP,UAAU;EACX,EACF;CACD,MAAM,IAAI,EAAE,UAAU;EACpB,MAAM,EAAE,gBAAgB,MAAA,QAAA,SAAA,CAAA,WAAA,QAAM,0BAAA,CAAA;AAE9B,QAAM,YAAY;GAAE,OAAO,OAAO;GAAO,SAAA,gBAAA;GAAS,CAAC;;CAEtD,CAAC"}
@@ -1,33 +0,0 @@
1
- import "./chunk--u3MIqq1.js";
2
- import { t as getErrorMessage } from "./errors-CjPmyZHy.js";
3
- import { r as sendTelemetry, t as buildTelemetryEvent } from "./telemetry-LgT_sdPe.js";
4
- import process from "node:process";
5
- import { parseDocument, validateDocument } from "@kubb/adapter-oas";
6
- //#region src/runners/validate.ts
7
- async function runValidate({ input, version }) {
8
- const hrStart = process.hrtime();
9
- try {
10
- await validateDocument(await parseDocument(input), { throwOnError: true });
11
- await sendTelemetry(buildTelemetryEvent({
12
- command: "validate",
13
- kubbVersion: version,
14
- hrStart,
15
- status: "success"
16
- }));
17
- console.log("✅ Validation success");
18
- } catch (error) {
19
- await sendTelemetry(buildTelemetryEvent({
20
- command: "validate",
21
- kubbVersion: version,
22
- hrStart,
23
- status: "failed"
24
- }));
25
- console.error("❌ Validation failed");
26
- console.error(getErrorMessage(error));
27
- process.exit(1);
28
- }
29
- }
30
- //#endregion
31
- export { runValidate };
32
-
33
- //# sourceMappingURL=validate-kLJoT_hi.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate-kLJoT_hi.js","names":[],"sources":["../src/runners/validate.ts"],"sourcesContent":["import process from 'node:process'\nimport { getErrorMessage } from '@internals/utils'\nimport { parseDocument, validateDocument } from '@kubb/adapter-oas'\nimport { buildTelemetryEvent, sendTelemetry } from '../utils/telemetry.ts'\n\ntype ValidateOptions = {\n input: string\n version: string\n}\n\nexport async function runValidate({ input, version }: ValidateOptions): Promise<void> {\n const hrStart = process.hrtime()\n try {\n const document = await parseDocument(input)\n await validateDocument(document, { throwOnError: true })\n\n await sendTelemetry(\n buildTelemetryEvent({\n command: 'validate',\n kubbVersion: version,\n hrStart,\n status: 'success',\n }),\n )\n console.log('✅ Validation success')\n } catch (error) {\n await sendTelemetry(\n buildTelemetryEvent({\n command: 'validate',\n kubbVersion: version,\n hrStart,\n status: 'failed',\n }),\n )\n console.error('❌ Validation failed')\n console.error(getErrorMessage(error))\n process.exit(1)\n }\n}\n"],"mappings":";;;;;;AAUA,eAAsB,YAAY,EAAE,OAAO,WAA2C;CACpF,MAAM,UAAU,QAAQ,QAAQ;AAChC,KAAI;AAEF,QAAM,iBAAiB,MADA,cAAc,MAAM,EACV,EAAE,cAAc,MAAM,CAAC;AAExD,QAAM,cACJ,oBAAoB;GAClB,SAAS;GACT,aAAa;GACb;GACA,QAAQ;GACT,CAAC,CACH;AACD,UAAQ,IAAI,uBAAuB;UAC5B,OAAO;AACd,QAAM,cACJ,oBAAoB;GAClB,SAAS;GACT,aAAa;GACb;GACA,QAAQ;GACT,CAAC,CACH;AACD,UAAQ,MAAM,sBAAsB;AACpC,UAAQ,MAAM,gBAAgB,MAAM,CAAC;AACrC,UAAQ,KAAK,EAAE"}
@@ -1,25 +0,0 @@
1
- import "./chunk--u3MIqq1.js";
2
- import { n as defineCommand } from "./define-Ctii4bel.js";
3
- import { t as version } from "./package-DyJE-qNq.js";
4
- //#region src/commands/validate.ts
5
- const command = defineCommand({
6
- name: "validate",
7
- description: "Validate a Swagger/OpenAPI file",
8
- options: { input: {
9
- type: "string",
10
- description: "Path to Swagger/OpenAPI file",
11
- short: "i",
12
- required: true
13
- } },
14
- async run({ values }) {
15
- const { runValidate } = await import("./validate-kLJoT_hi.js");
16
- await runValidate({
17
- input: values.input,
18
- version
19
- });
20
- }
21
- });
22
- //#endregion
23
- export { command };
24
-
25
- //# sourceMappingURL=validate-n38Rh-Y7.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate-n38Rh-Y7.js","names":[],"sources":["../src/commands/validate.ts"],"sourcesContent":["import { defineCommand } from '@internals/utils'\nimport { version } from '../../package.json'\n\nexport const command = defineCommand({\n name: 'validate',\n description: 'Validate a Swagger/OpenAPI file',\n options: {\n input: {\n type: 'string',\n description: 'Path to Swagger/OpenAPI file',\n short: 'i',\n required: true,\n },\n },\n async run({ values }) {\n const { runValidate } = await import('../runners/validate.ts')\n\n await runValidate({ input: values.input, version })\n },\n})\n"],"mappings":";;;;AAGA,MAAa,UAAU,cAAc;CACnC,MAAM;CACN,aAAa;CACb,SAAS,EACP,OAAO;EACL,MAAM;EACN,aAAa;EACb,OAAO;EACP,UAAU;EACX,EACF;CACD,MAAM,IAAI,EAAE,UAAU;EACpB,MAAM,EAAE,gBAAgB,MAAM,OAAO;AAErC,QAAM,YAAY;GAAE,OAAO,OAAO;GAAO;GAAS,CAAC;;CAEtD,CAAC"}
@@ -1,34 +0,0 @@
1
- const require_chunk = require("./chunk-ByKO4r7w.cjs");
2
- const require_errors = require("./errors-CLCjoSg0.cjs");
3
- const require_telemetry = require("./telemetry-DN95_2pF.cjs");
4
- let node_process = require("node:process");
5
- node_process = require_chunk.__toESM(node_process, 1);
6
- let _kubb_adapter_oas = require("@kubb/adapter-oas");
7
- //#region src/runners/validate.ts
8
- async function runValidate({ input, version }) {
9
- const hrStart = node_process.default.hrtime();
10
- try {
11
- await (0, _kubb_adapter_oas.validateDocument)(await (0, _kubb_adapter_oas.parseDocument)(input), { throwOnError: true });
12
- await require_telemetry.sendTelemetry(require_telemetry.buildTelemetryEvent({
13
- command: "validate",
14
- kubbVersion: version,
15
- hrStart,
16
- status: "success"
17
- }));
18
- console.log("✅ Validation success");
19
- } catch (error) {
20
- await require_telemetry.sendTelemetry(require_telemetry.buildTelemetryEvent({
21
- command: "validate",
22
- kubbVersion: version,
23
- hrStart,
24
- status: "failed"
25
- }));
26
- console.error("❌ Validation failed");
27
- console.error(require_errors.getErrorMessage(error));
28
- node_process.default.exit(1);
29
- }
30
- }
31
- //#endregion
32
- exports.runValidate = runValidate;
33
-
34
- //# sourceMappingURL=validate-yKKzqEZ5.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate-yKKzqEZ5.cjs","names":["process","sendTelemetry","buildTelemetryEvent","getErrorMessage"],"sources":["../src/runners/validate.ts"],"sourcesContent":["import process from 'node:process'\nimport { getErrorMessage } from '@internals/utils'\nimport { parseDocument, validateDocument } from '@kubb/adapter-oas'\nimport { buildTelemetryEvent, sendTelemetry } from '../utils/telemetry.ts'\n\ntype ValidateOptions = {\n input: string\n version: string\n}\n\nexport async function runValidate({ input, version }: ValidateOptions): Promise<void> {\n const hrStart = process.hrtime()\n try {\n const document = await parseDocument(input)\n await validateDocument(document, { throwOnError: true })\n\n await sendTelemetry(\n buildTelemetryEvent({\n command: 'validate',\n kubbVersion: version,\n hrStart,\n status: 'success',\n }),\n )\n console.log('✅ Validation success')\n } catch (error) {\n await sendTelemetry(\n buildTelemetryEvent({\n command: 'validate',\n kubbVersion: version,\n hrStart,\n status: 'failed',\n }),\n )\n console.error('❌ Validation failed')\n console.error(getErrorMessage(error))\n process.exit(1)\n }\n}\n"],"mappings":";;;;;;;AAUA,eAAsB,YAAY,EAAE,OAAO,WAA2C;CACpF,MAAM,UAAUA,aAAAA,QAAQ,QAAQ;AAChC,KAAI;AAEF,SAAA,GAAA,kBAAA,kBAAuB,OAAA,GAAA,kBAAA,eADc,MAAM,EACV,EAAE,cAAc,MAAM,CAAC;AAExD,QAAMC,kBAAAA,cACJC,kBAAAA,oBAAoB;GAClB,SAAS;GACT,aAAa;GACb;GACA,QAAQ;GACT,CAAC,CACH;AACD,UAAQ,IAAI,uBAAuB;UAC5B,OAAO;AACd,QAAMD,kBAAAA,cACJC,kBAAAA,oBAAoB;GAClB,SAAS;GACT,aAAa;GACb;GACA,QAAQ;GACT,CAAC,CACH;AACD,UAAQ,MAAM,sBAAsB;AACpC,UAAQ,MAAMC,eAAAA,gBAAgB,MAAM,CAAC;AACrC,eAAA,QAAQ,KAAK,EAAE"}
@@ -1,138 +0,0 @@
1
- import { relative, resolve } from 'node:path'
2
- import process from 'node:process'
3
- import { formatMs, write } from '@internals/utils'
4
- import { defineLogger } from '@kubb/core'
5
-
6
- type CachedEvent = {
7
- date: Date
8
- logs: string[]
9
- fileName?: string
10
- }
11
-
12
- /**
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.
15
- */
16
- export const fileSystemLogger = defineLogger({
17
- name: 'filesystem',
18
- install(context) {
19
- const state = {
20
- cachedLogs: new Set<CachedEvent>(),
21
- startDate: Date.now(),
22
- }
23
-
24
- function reset() {
25
- state.cachedLogs = new Set<CachedEvent>()
26
- state.startDate = Date.now()
27
- }
28
-
29
- async function writeLogs(name?: string) {
30
- if (state.cachedLogs.size === 0) {
31
- return []
32
- }
33
-
34
- const files: Record<string, string[]> = {}
35
-
36
- for (const log of state.cachedLogs) {
37
- const baseName = log.fileName || `${['kubb', name, state.startDate].filter(Boolean).join('-')}.log`
38
- const pathName = resolve(process.cwd(), '.kubb', baseName)
39
-
40
- if (!files[pathName]) {
41
- files[pathName] = []
42
- }
43
-
44
- if (log.logs.length > 0) {
45
- const timestamp = log.date.toLocaleString()
46
- files[pathName].push(`[${timestamp}]\n${log.logs.join('\n')}`)
47
- }
48
- }
49
-
50
- for (const [fileName, logs] of Object.entries(files)) {
51
- await write(fileName, logs.join('\n\n'))
52
- }
53
-
54
- return Object.keys(files)
55
- }
56
-
57
- context.on('kubb:info', ({ message, info }) => {
58
- state.cachedLogs.add({
59
- date: new Date(),
60
- logs: [`ℹ ${message} ${info}`],
61
- })
62
- })
63
-
64
- context.on('kubb:success', ({ message, info }) => {
65
- state.cachedLogs.add({
66
- date: new Date(),
67
- logs: [`✓ ${message} ${info}`],
68
- })
69
- })
70
-
71
- context.on('kubb:warn', ({ message, info }) => {
72
- state.cachedLogs.add({
73
- date: new Date(),
74
- logs: [`⚠ ${message} ${info}`],
75
- })
76
- })
77
-
78
- context.on('kubb:error', ({ error }) => {
79
- state.cachedLogs.add({
80
- date: new Date(),
81
- logs: [`✗ ${error.message}`, error.stack || 'unknown stack'],
82
- })
83
- })
84
-
85
- context.on('kubb:debug', (message) => {
86
- state.cachedLogs.add({
87
- date: new Date(),
88
- logs: message.logs,
89
- })
90
- })
91
-
92
- context.on('kubb:plugin:start', ({ plugin }) => {
93
- state.cachedLogs.add({
94
- date: new Date(),
95
- logs: [`Generating ${plugin.name}`],
96
- })
97
- })
98
-
99
- context.on('kubb:plugin:end', ({ plugin, duration, success }) => {
100
- const durationStr = formatMs(duration)
101
-
102
- state.cachedLogs.add({
103
- date: new Date(),
104
- logs: [success ? `${plugin.name} completed in ${durationStr}` : `${plugin.name} failed in ${durationStr}`],
105
- })
106
- })
107
-
108
- context.on('kubb:files:processing:start', ({ files }) => {
109
- state.cachedLogs.add({
110
- date: new Date(),
111
- logs: [`Start ${files.length} writing:`, ...files.map((file) => file.path)],
112
- })
113
- })
114
-
115
- context.on('kubb:generation:end', async ({ config }) => {
116
- const writtenFilePaths = await writeLogs(config.name)
117
- if (writtenFilePaths.length > 0) {
118
- const files = writtenFilePaths.map((f) => relative(process.cwd(), f))
119
- await context.emit('kubb:info', { message: 'Debug files written to:', info: files.join(', ') })
120
- }
121
- reset()
122
- })
123
-
124
- // Fallback: Write logs on process exit to handle crashes
125
- const exitHandler = () => {
126
- // Synchronous write on exit - best effort
127
- if (state.cachedLogs.size > 0) {
128
- writeLogs().catch(() => {
129
- // Ignore errors on exit
130
- })
131
- }
132
- }
133
-
134
- process.once('exit', exitHandler)
135
- process.once('SIGINT', exitHandler)
136
- process.once('SIGTERM', exitHandler)
137
- },
138
- })
@@ -1,155 +0,0 @@
1
- import net from 'node:net'
2
- import path from 'node:path'
3
- import * as process from 'node:process'
4
- import { fileURLToPath } from 'node:url'
5
- import { styleText } from 'node:util'
6
- import * as clack from '@clack/prompts'
7
- import { spawnAsync } from '@internals/utils'
8
- import { agentDefaults } from '../constants.ts'
9
- import { buildTelemetryEvent, sendTelemetry } from '../utils/telemetry.ts'
10
-
11
- type AgentStartOptions = {
12
- port: string | undefined
13
- host: string
14
- configPath: string | undefined
15
- allowWrite: boolean
16
- allowAll: boolean
17
- version: string
18
- }
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
-
61
- function isPortAvailable(port: number, host: string): Promise<boolean> {
62
- return new Promise((resolve) => {
63
- const server = net.createServer()
64
- server.once('error', () => resolve(false))
65
- server.once('listening', () => {
66
- server.close()
67
- resolve(true)
68
- })
69
- server.listen(port, host)
70
- })
71
- }
72
-
73
- export async function runAgentStart({ port, host, configPath, allowWrite, allowAll, version }: AgentStartOptions): Promise<void> {
74
- const hrStart = process.hrtime()
75
-
76
- try {
77
- // Load .env file into process.env using Node.js built-in (v20.12.0+)
78
- try {
79
- process.loadEnvFile()
80
- } catch {
81
- // .env file may not exist; ignore
82
- }
83
-
84
- // Resolve the @kubb/agent package path
85
- let agentPkgUrl: string
86
- try {
87
- agentPkgUrl = import.meta.resolve('@kubb/agent/package.json')
88
- } catch (_e) {
89
- console.error(styleText('red', 'The @kubb/agent package is not installed.'))
90
- console.error('')
91
- console.error('Install it with:')
92
- console.error(styleText('cyan', ' npm install @kubb/agent'))
93
- console.error(styleText('cyan', ' # or'))
94
- console.error(styleText('cyan', ' pnpm install @kubb/agent'))
95
- console.error('')
96
- process.exit(1)
97
- }
98
- const agentPkgPath = fileURLToPath(agentPkgUrl)
99
- const agentDir = path.dirname(agentPkgPath)
100
- const serverPath = path.join(agentDir, agentDefaults.serverEntryPath)
101
-
102
- const resolvedEnv = resolveAgentStartEnvironment({
103
- port,
104
- host,
105
- configPath,
106
- allowWrite,
107
- allowAll,
108
- })
109
- const numericPort = Number(resolvedEnv.port)
110
-
111
- if (!Number.isInteger(numericPort) || numericPort <= 0) {
112
- throw new Error(`Invalid port "${resolvedEnv.port}". Provide a positive integer with --port or PORT.`)
113
- }
114
-
115
- clack.log.step(styleText('cyan', 'Starting agent server...'))
116
- clack.log.info(styleText('dim', `Config: ${resolvedEnv.agentConfigPath}`))
117
- clack.log.info(styleText('dim', `Host: ${resolvedEnv.host}`))
118
- clack.log.info(styleText('dim', `Port: ${resolvedEnv.port}`))
119
- if (!resolvedEnv.allowWrite && !resolvedEnv.allowAll) {
120
- clack.log.warn(styleText('yellow', 'Filesystem writes disabled. Use --allow-write or --allow-all to enable.'))
121
- }
122
-
123
- if (!(await isPortAvailable(numericPort, resolvedEnv.host))) {
124
- clack.log.error(styleText('red', `Port ${resolvedEnv.port} is already in use. Stop the existing process or choose a different port with --port.`))
125
- process.exit(1)
126
- }
127
-
128
- // Spawns the server as a detached background process so the CLI can exit independently.
129
- await spawnAsync('node', [serverPath], {
130
- env: resolvedEnv.env,
131
- cwd: process.cwd(),
132
- })
133
-
134
- await sendTelemetry(
135
- buildTelemetryEvent({
136
- command: 'agent',
137
- kubbVersion: version,
138
- hrStart,
139
- status: 'success',
140
- }),
141
- )
142
- } catch (error) {
143
- await sendTelemetry(
144
- buildTelemetryEvent({
145
- command: 'agent',
146
- kubbVersion: version,
147
- hrStart,
148
- status: 'failed',
149
- }),
150
- )
151
- clack.log.error(styleText('red', 'Failed to start agent server'))
152
- console.error(error)
153
- process.exit(1)
154
- }
155
- }