@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.
- package/README.md +198 -36
- package/dist/agent-DQerNyd8.cjs +70 -0
- package/dist/agent-DQerNyd8.cjs.map +1 -0
- package/dist/agent-ZKJkTTGN.js +68 -0
- package/dist/agent-ZKJkTTGN.js.map +1 -0
- package/dist/{chunk--u3MIqq1.js → chunk-CRm0XQPb.js} +1 -0
- package/dist/constants-84a47qA-.js +35 -0
- package/dist/constants-84a47qA-.js.map +1 -0
- package/dist/constants-AHhyFH15.cjs +139 -0
- package/dist/constants-AHhyFH15.cjs.map +1 -0
- package/dist/constants-BtmponZ3.cjs +58 -0
- package/dist/constants-BtmponZ3.cjs.map +1 -0
- package/dist/constants-C94RKp3A.js +116 -0
- package/dist/constants-C94RKp3A.js.map +1 -0
- package/dist/{define-Bdn8j5VM.cjs → define-C4AB3POr.cjs} +2 -2
- package/dist/{define-Bdn8j5VM.cjs.map → define-C4AB3POr.cjs.map} +1 -1
- package/dist/{define-Ctii4bel.js → define-DNG1U8ha.js} +2 -2
- package/dist/{define-Ctii4bel.js.map → define-DNG1U8ha.js.map} +1 -1
- package/dist/{errors-CjPmyZHy.js → errors-CoxrNXaA.js} +2 -2
- package/dist/{errors-CjPmyZHy.js.map → errors-CoxrNXaA.js.map} +1 -1
- package/dist/{errors-CLCjoSg0.cjs → errors-DykI11xo.cjs} +2 -2
- package/dist/{errors-CLCjoSg0.cjs.map → errors-DykI11xo.cjs.map} +1 -1
- package/dist/generate-40x9PP4o.js +77 -0
- package/dist/generate-40x9PP4o.js.map +1 -0
- package/dist/generate-DQLvFw4z.cjs +76 -0
- package/dist/generate-DQLvFw4z.cjs.map +1 -0
- package/dist/index.cjs +23 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +23 -14
- package/dist/index.js.map +1 -1
- package/dist/init-CT9RChdK.js +53 -0
- package/dist/init-CT9RChdK.js.map +1 -0
- package/dist/init-sEaUN7Dj.cjs +53 -0
- package/dist/init-sEaUN7Dj.cjs.map +1 -0
- package/dist/mcp-Siyb6fTT.cjs +39 -0
- package/dist/mcp-Siyb6fTT.cjs.map +1 -0
- package/dist/mcp-cjPrOeot.js +39 -0
- package/dist/mcp-cjPrOeot.js.map +1 -0
- package/dist/{package-BapVyQ-w.cjs → package-BJ6qam2Y.cjs} +2 -2
- package/dist/package-BJ6qam2Y.cjs.map +1 -0
- package/dist/package-CR5vEK4K.js +6 -0
- package/dist/package-CR5vEK4K.js.map +1 -0
- package/dist/{agent-sdYBBgrd.js → run-BQ3Qj0xB.js} +46 -43
- package/dist/run-BQ3Qj0xB.js.map +1 -0
- package/dist/run-BQzoaxjR.js +32 -0
- package/dist/run-BQzoaxjR.js.map +1 -0
- package/dist/run-CGf0KEts.js +51 -0
- package/dist/run-CGf0KEts.js.map +1 -0
- package/dist/{generate-CNrRLY4n.js → run-CHZKHTv0.js} +832 -828
- package/dist/run-CHZKHTv0.js.map +1 -0
- package/dist/{init-CZ5Xq2Hd.cjs → run-C_NMctua.cjs} +107 -149
- package/dist/run-C_NMctua.cjs.map +1 -0
- package/dist/{generate-B1Pa2ho-.cjs → run-CcQawFNK.cjs} +784 -780
- package/dist/run-CcQawFNK.cjs.map +1 -0
- package/dist/run-CkTpemme.cjs +52 -0
- package/dist/run-CkTpemme.cjs.map +1 -0
- package/dist/run-Cl4SrSob.cjs +33 -0
- package/dist/run-Cl4SrSob.cjs.map +1 -0
- package/dist/{agent-B4cAAab2.cjs → run-D-s2LdlW.cjs} +46 -43
- package/dist/run-D-s2LdlW.cjs.map +1 -0
- package/dist/{init-eNRlotJK.js → run-D8dCWepS.js} +107 -149
- package/dist/run-D8dCWepS.js.map +1 -0
- package/dist/{shell-DLzN4fRo.js → shell-BrqyJdB7.js} +2 -2
- package/dist/{shell-DLzN4fRo.js.map → shell-BrqyJdB7.js.map} +1 -1
- package/dist/{shell-475fQKaX.cjs → shell-Lh-vLWwH.cjs} +2 -2
- package/dist/{shell-475fQKaX.cjs.map → shell-Lh-vLWwH.cjs.map} +1 -1
- package/dist/validate-8pgfxUTy.js +26 -0
- package/dist/validate-8pgfxUTy.js.map +1 -0
- package/dist/validate-CstV7Pc2.cjs +26 -0
- package/dist/validate-CstV7Pc2.cjs.map +1 -0
- package/package.json +16 -15
- package/src/commands/agent/start.ts +10 -7
- package/src/commands/agent.ts +3 -1
- package/src/commands/generate.ts +21 -13
- package/src/commands/init.ts +34 -3
- package/src/commands/mcp.ts +28 -4
- package/src/commands/validate.ts +6 -4
- package/src/constants.ts +3 -74
- package/src/index.ts +6 -4
- package/src/loggers/clackLogger.ts +143 -181
- package/src/loggers/githubActionsLogger.ts +119 -121
- package/src/loggers/plainLogger.ts +50 -100
- package/src/loggers/types.ts +6 -0
- package/src/loggers/utils.ts +190 -18
- package/src/runners/agent/run.ts +113 -0
- package/src/runners/agent/utils.ts +98 -0
- package/src/runners/generate/run.ts +411 -0
- package/src/runners/generate/utils.ts +222 -0
- package/src/runners/init/run.ts +212 -0
- package/src/{utils/packageManager.ts → runners/init/utils.ts} +12 -2
- package/src/runners/mcp/run.ts +37 -0
- package/src/runners/validate/run.ts +63 -0
- package/dist/agent-B4cAAab2.cjs.map +0 -1
- package/dist/agent-CR6Z96og.js +0 -56
- package/dist/agent-CR6Z96og.js.map +0 -1
- package/dist/agent-Dmxzqg4d.cjs +0 -58
- package/dist/agent-Dmxzqg4d.cjs.map +0 -1
- package/dist/agent-sdYBBgrd.js.map +0 -1
- package/dist/constants-CnDXa1R6.cjs +0 -148
- package/dist/constants-CnDXa1R6.cjs.map +0 -1
- package/dist/constants-aL3CP_Wq.js +0 -95
- package/dist/constants-aL3CP_Wq.js.map +0 -1
- package/dist/generate-B1Pa2ho-.cjs.map +0 -1
- package/dist/generate-BDGOOsBM.cjs +0 -65
- package/dist/generate-BDGOOsBM.cjs.map +0 -1
- package/dist/generate-CNrRLY4n.js.map +0 -1
- package/dist/generate-DuhxPLGr.js +0 -66
- package/dist/generate-DuhxPLGr.js.map +0 -1
- package/dist/init-CZ5Xq2Hd.cjs.map +0 -1
- package/dist/init-CnZXHrbq.js +0 -25
- package/dist/init-CnZXHrbq.js.map +0 -1
- package/dist/init-NYJSZJSb.cjs +0 -25
- package/dist/init-NYJSZJSb.cjs.map +0 -1
- package/dist/init-eNRlotJK.js.map +0 -1
- package/dist/mcp-CYOgxB82.cjs +0 -47
- package/dist/mcp-CYOgxB82.cjs.map +0 -1
- package/dist/mcp-CdFWyrwi.cjs +0 -16
- package/dist/mcp-CdFWyrwi.cjs.map +0 -1
- package/dist/mcp-DhSxuDMD.js +0 -16
- package/dist/mcp-DhSxuDMD.js.map +0 -1
- package/dist/mcp-DmJm3TrU.js +0 -46
- package/dist/mcp-DmJm3TrU.js.map +0 -1
- package/dist/package-BapVyQ-w.cjs.map +0 -1
- package/dist/package-DyJE-qNq.js +0 -6
- package/dist/package-DyJE-qNq.js.map +0 -1
- package/dist/telemetry-DN95_2pF.cjs +0 -282
- package/dist/telemetry-DN95_2pF.cjs.map +0 -1
- package/dist/telemetry-LgT_sdPe.js +0 -245
- package/dist/telemetry-LgT_sdPe.js.map +0 -1
- package/dist/validate-C6npXzel.cjs +0 -25
- package/dist/validate-C6npXzel.cjs.map +0 -1
- package/dist/validate-kLJoT_hi.js +0 -33
- package/dist/validate-kLJoT_hi.js.map +0 -1
- package/dist/validate-n38Rh-Y7.js +0 -25
- package/dist/validate-n38Rh-Y7.js.map +0 -1
- package/dist/validate-yKKzqEZ5.cjs +0 -34
- package/dist/validate-yKKzqEZ5.cjs.map +0 -1
- package/src/loggers/fileSystemLogger.ts +0 -138
- package/src/runners/agent.ts +0 -155
- package/src/runners/generate.ts +0 -333
- package/src/runners/init.ts +0 -296
- package/src/runners/mcp.ts +0 -51
- package/src/runners/validate.ts +0 -39
- package/src/types.ts +0 -11
- package/src/utils/Writables.ts +0 -17
- package/src/utils/executeHooks.ts +0 -45
- package/src/utils/flags.ts +0 -9
- package/src/utils/getConfig.ts +0 -10
- package/src/utils/getCosmiConfig.ts +0 -80
- package/src/utils/getSummary.ts +0 -68
- package/src/utils/runHook.ts +0 -91
- package/src/utils/telemetry.ts +0 -273
- package/src/utils/watcher.ts +0 -19
- /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
|
-
})
|
package/src/runners/agent.ts
DELETED
|
@@ -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
|
-
}
|