@kb-labs/qa-entry 2.14.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.
- package/README.md +1 -0
- package/dist/cli/commands/baseline-status.d.ts +10 -0
- package/dist/cli/commands/baseline-status.js +32 -0
- package/dist/cli/commands/baseline-status.js.map +1 -0
- package/dist/cli/commands/baseline-update.d.ts +10 -0
- package/dist/cli/commands/baseline-update.js +33 -0
- package/dist/cli/commands/baseline-update.js.map +1 -0
- package/dist/cli/commands/flags.d.ts +106 -0
- package/dist/cli/commands/flags.js +99 -0
- package/dist/cli/commands/flags.js.map +1 -0
- package/dist/cli/commands/qa-history.d.ts +10 -0
- package/dist/cli/commands/qa-history.js +41 -0
- package/dist/cli/commands/qa-history.js.map +1 -0
- package/dist/cli/commands/qa-regressions.d.ts +10 -0
- package/dist/cli/commands/qa-regressions.js +33 -0
- package/dist/cli/commands/qa-regressions.js.map +1 -0
- package/dist/cli/commands/qa-run.d.ts +16 -0
- package/dist/cli/commands/qa-run.js +159 -0
- package/dist/cli/commands/qa-run.js.map +1 -0
- package/dist/cli/commands/qa-save.d.ts +10 -0
- package/dist/cli/commands/qa-save.js +69 -0
- package/dist/cli/commands/qa-save.js.map +1 -0
- package/dist/cli/commands/qa-trends.d.ts +10 -0
- package/dist/cli/commands/qa-trends.js +35 -0
- package/dist/cli/commands/qa-trends.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +390 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +198 -0
- package/dist/manifest.js +391 -0
- package/dist/manifest.js.map +1 -0
- package/dist/rest/handlers/baseline-diff-handler.d.ts +33 -0
- package/dist/rest/handlers/baseline-diff-handler.js +51 -0
- package/dist/rest/handlers/baseline-diff-handler.js.map +1 -0
- package/dist/rest/handlers/baseline-handler.d.ts +19 -0
- package/dist/rest/handlers/baseline-handler.js +14 -0
- package/dist/rest/handlers/baseline-handler.js.map +1 -0
- package/dist/rest/handlers/baseline-update-handler.d.ts +20 -0
- package/dist/rest/handlers/baseline-update-handler.js +23 -0
- package/dist/rest/handlers/baseline-update-handler.js.map +1 -0
- package/dist/rest/handlers/details-handler.d.ts +61 -0
- package/dist/rest/handlers/details-handler.js +70 -0
- package/dist/rest/handlers/details-handler.js.map +1 -0
- package/dist/rest/handlers/error-groups-handler.d.ts +15 -0
- package/dist/rest/handlers/error-groups-handler.js +17 -0
- package/dist/rest/handlers/error-groups-handler.js.map +1 -0
- package/dist/rest/handlers/history-handler.d.ts +25 -0
- package/dist/rest/handlers/history-handler.js +22 -0
- package/dist/rest/handlers/history-handler.js.map +1 -0
- package/dist/rest/handlers/latest-handler.d.ts +22 -0
- package/dist/rest/handlers/latest-handler.js +17 -0
- package/dist/rest/handlers/latest-handler.js.map +1 -0
- package/dist/rest/handlers/package-timeline-handler.d.ts +26 -0
- package/dist/rest/handlers/package-timeline-handler.js +18 -0
- package/dist/rest/handlers/package-timeline-handler.js.map +1 -0
- package/dist/rest/handlers/regressions-handler.d.ts +16 -0
- package/dist/rest/handlers/regressions-handler.js +14 -0
- package/dist/rest/handlers/regressions-handler.js.map +1 -0
- package/dist/rest/handlers/run-check-handler.d.ts +20 -0
- package/dist/rest/handlers/run-check-handler.js +58 -0
- package/dist/rest/handlers/run-check-handler.js.map +1 -0
- package/dist/rest/handlers/run-handler.d.ts +33 -0
- package/dist/rest/handlers/run-handler.js +75 -0
- package/dist/rest/handlers/run-handler.js.map +1 -0
- package/dist/rest/handlers/summary-handler.d.ts +26 -0
- package/dist/rest/handlers/summary-handler.js +35 -0
- package/dist/rest/handlers/summary-handler.js.map +1 -0
- package/dist/rest/handlers/trends-handler.d.ts +48 -0
- package/dist/rest/handlers/trends-handler.js +30 -0
- package/dist/rest/handlers/trends-handler.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
+
import { loadBaseline, loadLastRun, compareWithBaseline } from '@kb-labs/qa-core';
|
|
3
|
+
|
|
4
|
+
// src/rest/handlers/baseline-diff-handler.ts
|
|
5
|
+
var baseline_diff_handler_default = defineHandler({
|
|
6
|
+
async execute(ctx, _input) {
|
|
7
|
+
const rootDir = ctx.cwd;
|
|
8
|
+
const baseline = loadBaseline(rootDir);
|
|
9
|
+
const lastRun = loadLastRun(rootDir);
|
|
10
|
+
if (!baseline || !lastRun) {
|
|
11
|
+
return {
|
|
12
|
+
hasDiff: false,
|
|
13
|
+
diff: {},
|
|
14
|
+
baseline: baseline ?? null,
|
|
15
|
+
current: lastRun ? {
|
|
16
|
+
timestamp: lastRun.timestamp,
|
|
17
|
+
summary: buildSummaryFromResults(lastRun.results)
|
|
18
|
+
} : null
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const diff = compareWithBaseline(lastRun.results, baseline);
|
|
22
|
+
const hasDiff = Object.keys(diff).some((ct) => {
|
|
23
|
+
const d = diff[ct];
|
|
24
|
+
return d.newFailures.length > 0 || d.fixed.length > 0;
|
|
25
|
+
});
|
|
26
|
+
return {
|
|
27
|
+
hasDiff,
|
|
28
|
+
diff,
|
|
29
|
+
baseline,
|
|
30
|
+
current: {
|
|
31
|
+
timestamp: lastRun.timestamp,
|
|
32
|
+
summary: buildSummaryFromResults(lastRun.results)
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
function buildSummaryFromResults(results) {
|
|
38
|
+
const summary = {};
|
|
39
|
+
for (const ct of Object.keys(results)) {
|
|
40
|
+
const r = results[ct];
|
|
41
|
+
summary[ct] = {
|
|
42
|
+
passed: r?.passed.length ?? 0,
|
|
43
|
+
failed: r?.failed.length ?? 0
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
return summary;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export { baseline_diff_handler_default as default };
|
|
50
|
+
//# sourceMappingURL=baseline-diff-handler.js.map
|
|
51
|
+
//# sourceMappingURL=baseline-diff-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/rest/handlers/baseline-diff-handler.ts"],"names":[],"mappings":";;;;AAWA,IAAO,gCAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,GAAA,EACA,MAAA,EACiC;AACjC,IAAA,MAAM,UAAU,GAAA,CAAI,GAAA;AAEpB,IAAA,MAAM,QAAA,GAAW,aAAa,OAAO,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,YAAY,OAAO,CAAA;AAGnC,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,OAAA,EAAS;AACzB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,MAAM,EAAC;AAAA,QACP,UAAU,QAAA,IAAY,IAAA;AAAA,QACtB,SAAS,OAAA,GAAU;AAAA,UACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,UACnB,OAAA,EAAS,uBAAA,CAAwB,OAAA,CAAQ,OAAO;AAAA,SAClD,GAAI;AAAA,OACN;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,OAAA,CAAQ,OAAA,EAAS,QAAQ,CAAA;AAG1D,IAAA,MAAM,UAAU,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,EAAA,KAAO;AAC7C,MAAA,MAAM,CAAA,GAAI,KAAK,EAAE,CAAA;AACjB,MAAA,OAAO,EAAE,WAAA,CAAY,MAAA,GAAS,CAAA,IAAK,CAAA,CAAE,MAAM,MAAA,GAAS,CAAA;AAAA,IACtD,CAAC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,OAAA,EAAS,uBAAA,CAAwB,OAAA,CAAQ,OAAO;AAAA;AAClD,KACF;AAAA,EACF;AACF,CAAC;AAED,SAAS,wBACP,OAAA,EACoD;AACpD,EAAA,MAAM,UAA8D,EAAC;AACrE,EAAA,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAG;AACrC,IAAA,MAAM,CAAA,GAAI,QAAQ,EAAE,CAAA;AACpB,IAAA,OAAA,CAAQ,EAAE,CAAA,GAAI;AAAA,MACZ,MAAA,EAAQ,CAAA,EAAG,MAAA,CAAO,MAAA,IAAU,CAAA;AAAA,MAC5B,MAAA,EAAQ,CAAA,EAAG,MAAA,CAAO,MAAA,IAAU;AAAA,KAC9B;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT","file":"baseline-diff-handler.js","sourcesContent":["/**\n * GET /baseline/diff handler\n *\n * Compares current QA state (from last run) with saved baseline.\n * Shows new failures, fixed packages, and still-failing.\n */\n\nimport { defineHandler, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { loadBaseline, loadLastRun, compareWithBaseline } from '@kb-labs/qa-core';\nimport type { QABaselineDiffRequest, QABaselineDiffResponse } from '@kb-labs/qa-contracts';\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n _input: RestInput<QABaselineDiffRequest, unknown>,\n ): Promise<QABaselineDiffResponse> {\n const rootDir = ctx.cwd;\n\n const baseline = loadBaseline(rootDir);\n const lastRun = loadLastRun(rootDir);\n\n // No baseline or no last run — return empty diff\n if (!baseline || !lastRun) {\n return {\n hasDiff: false,\n diff: {} as QABaselineDiffResponse['diff'],\n baseline: baseline ?? null,\n current: lastRun ? {\n timestamp: lastRun.timestamp,\n summary: buildSummaryFromResults(lastRun.results),\n } : null,\n };\n }\n\n const diff = compareWithBaseline(lastRun.results, baseline);\n\n // Check if there's any actual diff\n const hasDiff = Object.keys(diff).some((ct) => {\n const d = diff[ct]!;\n return d.newFailures.length > 0 || d.fixed.length > 0;\n });\n\n return {\n hasDiff,\n diff,\n baseline,\n current: {\n timestamp: lastRun.timestamp,\n summary: buildSummaryFromResults(lastRun.results),\n },\n };\n },\n});\n\nfunction buildSummaryFromResults(\n results: Record<string, { passed: string[]; failed: string[] }>,\n): Record<string, { passed: number; failed: number }> {\n const summary: Record<string, { passed: number; failed: number }> = {};\n for (const ct of Object.keys(results)) {\n const r = results[ct];\n summary[ct] = {\n passed: r?.passed.length ?? 0,\n failed: r?.failed.length ?? 0,\n };\n }\n return summary;\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<{}, unknown, unknown>, {
|
|
5
|
+
baseline: {
|
|
6
|
+
git: {
|
|
7
|
+
commit: string;
|
|
8
|
+
branch: string;
|
|
9
|
+
};
|
|
10
|
+
timestamp: string;
|
|
11
|
+
results: Record<string, {
|
|
12
|
+
passed: number;
|
|
13
|
+
failed: number;
|
|
14
|
+
failedPackages: string[];
|
|
15
|
+
}>;
|
|
16
|
+
} | null;
|
|
17
|
+
}>;
|
|
18
|
+
|
|
19
|
+
export { _default as default };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
+
import { loadBaseline } from '@kb-labs/qa-core';
|
|
3
|
+
|
|
4
|
+
// src/rest/handlers/baseline-handler.ts
|
|
5
|
+
var baseline_handler_default = defineHandler({
|
|
6
|
+
async execute(ctx, _input) {
|
|
7
|
+
const baseline = loadBaseline(ctx.cwd);
|
|
8
|
+
return { baseline: baseline ?? null };
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export { baseline_handler_default as default };
|
|
13
|
+
//# sourceMappingURL=baseline-handler.js.map
|
|
14
|
+
//# sourceMappingURL=baseline-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/rest/handlers/baseline-handler.ts"],"names":[],"mappings":";;;;AAUA,IAAO,2BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,GAAA,EACA,MAAA,EAC6B;AAC7B,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AACrC,IAAA,OAAO,EAAE,QAAA,EAAU,QAAA,IAAY,IAAA,EAAK;AAAA,EACtC;AACF,CAAC","file":"baseline-handler.js","sourcesContent":["/**\n * GET /baseline handler\n *\n * Returns the current baseline snapshot.\n */\n\nimport { defineHandler, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { loadBaseline } from '@kb-labs/qa-core';\nimport type { QABaselineRequest, QABaselineResponse } from '@kb-labs/qa-contracts';\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n _input: RestInput<QABaselineRequest, unknown>,\n ): Promise<QABaselineResponse> {\n const baseline = loadBaseline(ctx.cwd);\n return { baseline: baseline ?? null };\n },\n});\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<unknown, {}, unknown>, {
|
|
5
|
+
baseline: {
|
|
6
|
+
git: {
|
|
7
|
+
commit: string;
|
|
8
|
+
branch: string;
|
|
9
|
+
};
|
|
10
|
+
timestamp: string;
|
|
11
|
+
results: Record<string, {
|
|
12
|
+
passed: number;
|
|
13
|
+
failed: number;
|
|
14
|
+
failedPackages: string[];
|
|
15
|
+
}>;
|
|
16
|
+
};
|
|
17
|
+
success: boolean;
|
|
18
|
+
}>;
|
|
19
|
+
|
|
20
|
+
export { _default as default };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
+
import { loadLastRun, createBaselineFromResults, saveBaseline } from '@kb-labs/qa-core';
|
|
3
|
+
|
|
4
|
+
// src/rest/handlers/baseline-update-handler.ts
|
|
5
|
+
var baseline_update_handler_default = defineHandler({
|
|
6
|
+
async execute(ctx, _input) {
|
|
7
|
+
const rootDir = ctx.cwd;
|
|
8
|
+
const lastRun = loadLastRun(rootDir);
|
|
9
|
+
if (!lastRun) {
|
|
10
|
+
throw new Error("No last run data available. Run QA first (POST /run).");
|
|
11
|
+
}
|
|
12
|
+
const baseline = createBaselineFromResults(lastRun.results, rootDir);
|
|
13
|
+
saveBaseline(rootDir, baseline);
|
|
14
|
+
return {
|
|
15
|
+
success: true,
|
|
16
|
+
baseline
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export { baseline_update_handler_default as default };
|
|
22
|
+
//# sourceMappingURL=baseline-update-handler.js.map
|
|
23
|
+
//# sourceMappingURL=baseline-update-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/rest/handlers/baseline-update-handler.ts"],"names":[],"mappings":";;;;AAWA,IAAO,kCAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,GAAA,EACA,MAAA,EACmC;AACnC,IAAA,MAAM,UAAU,GAAA,CAAI,GAAA;AAEpB,IAAA,MAAM,OAAA,GAAU,YAAY,OAAO,CAAA;AACnC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,IACzE;AAEA,IAAA,MAAM,QAAA,GAAW,yBAAA,CAA0B,OAAA,CAAQ,OAAA,EAAS,OAAO,CAAA;AACnE,IAAA,YAAA,CAAa,SAAS,QAAQ,CAAA;AAE9B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AACF,CAAC","file":"baseline-update-handler.js","sourcesContent":["/**\n * POST /baseline/update handler\n *\n * Creates a new baseline from the last QA run results.\n * Does NOT re-run QA — uses stored last-run data.\n */\n\nimport { defineHandler, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { loadLastRun, createBaselineFromResults, saveBaseline } from '@kb-labs/qa-core';\nimport type { QABaselineUpdateRequest, QABaselineUpdateResponse } from '@kb-labs/qa-contracts';\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n _input: RestInput<unknown, QABaselineUpdateRequest>,\n ): Promise<QABaselineUpdateResponse> {\n const rootDir = ctx.cwd;\n\n const lastRun = loadLastRun(rootDir);\n if (!lastRun) {\n throw new Error('No last run data available. Run QA first (POST /run).');\n }\n\n const baseline = createBaselineFromResults(lastRun.results, rootDir);\n saveBaseline(rootDir, baseline);\n\n return {\n success: true,\n baseline,\n };\n },\n});\n"]}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<{}, unknown, unknown>, {
|
|
5
|
+
git: {
|
|
6
|
+
commit: string;
|
|
7
|
+
branch: string;
|
|
8
|
+
message: string;
|
|
9
|
+
} | null;
|
|
10
|
+
checks: Record<string, {
|
|
11
|
+
passed: {
|
|
12
|
+
status: "passed" | "failed" | "skipped";
|
|
13
|
+
name: string;
|
|
14
|
+
repo: string;
|
|
15
|
+
error?: string | undefined;
|
|
16
|
+
submodule?: {
|
|
17
|
+
commit: string;
|
|
18
|
+
branch: string;
|
|
19
|
+
dirty: boolean;
|
|
20
|
+
message: string;
|
|
21
|
+
name: string;
|
|
22
|
+
} | undefined;
|
|
23
|
+
}[];
|
|
24
|
+
failed: {
|
|
25
|
+
status: "passed" | "failed" | "skipped";
|
|
26
|
+
name: string;
|
|
27
|
+
repo: string;
|
|
28
|
+
error?: string | undefined;
|
|
29
|
+
submodule?: {
|
|
30
|
+
commit: string;
|
|
31
|
+
branch: string;
|
|
32
|
+
dirty: boolean;
|
|
33
|
+
message: string;
|
|
34
|
+
name: string;
|
|
35
|
+
} | undefined;
|
|
36
|
+
}[];
|
|
37
|
+
skipped: {
|
|
38
|
+
status: "passed" | "failed" | "skipped";
|
|
39
|
+
name: string;
|
|
40
|
+
repo: string;
|
|
41
|
+
error?: string | undefined;
|
|
42
|
+
submodule?: {
|
|
43
|
+
commit: string;
|
|
44
|
+
branch: string;
|
|
45
|
+
dirty: boolean;
|
|
46
|
+
message: string;
|
|
47
|
+
name: string;
|
|
48
|
+
} | undefined;
|
|
49
|
+
}[];
|
|
50
|
+
}>;
|
|
51
|
+
timestamp: string | null;
|
|
52
|
+
submodules?: Record<string, {
|
|
53
|
+
commit: string;
|
|
54
|
+
branch: string;
|
|
55
|
+
dirty: boolean;
|
|
56
|
+
message: string;
|
|
57
|
+
name: string;
|
|
58
|
+
}> | undefined;
|
|
59
|
+
}>;
|
|
60
|
+
|
|
61
|
+
export { _default as default };
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
+
import { loadLastRun } from '@kb-labs/qa-core';
|
|
3
|
+
|
|
4
|
+
// src/rest/handlers/details-handler.ts
|
|
5
|
+
var details_handler_default = defineHandler({
|
|
6
|
+
async execute(ctx, _input) {
|
|
7
|
+
const lastRun = loadLastRun(ctx.cwd);
|
|
8
|
+
if (!lastRun) {
|
|
9
|
+
return {
|
|
10
|
+
timestamp: null,
|
|
11
|
+
git: null,
|
|
12
|
+
checks: {}
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
const { results, packages, submodules, timestamp } = lastRun;
|
|
16
|
+
const pkgMap = new Map(packages.map((p) => [p.name, p]));
|
|
17
|
+
let git = null;
|
|
18
|
+
try {
|
|
19
|
+
const { execSync } = await import('child_process');
|
|
20
|
+
const commit = execSync("git rev-parse --short HEAD", { cwd: ctx.cwd, encoding: "utf-8" }).trim();
|
|
21
|
+
const branch = execSync("git rev-parse --abbrev-ref HEAD", { cwd: ctx.cwd, encoding: "utf-8" }).trim();
|
|
22
|
+
const message = execSync("git log -1 --format=%s", { cwd: ctx.cwd, encoding: "utf-8" }).trim();
|
|
23
|
+
git = { commit, branch, message };
|
|
24
|
+
} catch {
|
|
25
|
+
}
|
|
26
|
+
const checks = {};
|
|
27
|
+
for (const ct of Object.keys(results)) {
|
|
28
|
+
const checkResult = results[ct];
|
|
29
|
+
const passed = checkResult.passed.map((name) => {
|
|
30
|
+
const pkg = pkgMap.get(name);
|
|
31
|
+
return {
|
|
32
|
+
name,
|
|
33
|
+
repo: pkg?.repo ?? "unknown",
|
|
34
|
+
status: "passed",
|
|
35
|
+
submodule: pkg?.submodule
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
const failed = checkResult.failed.map((name) => {
|
|
39
|
+
const pkg = pkgMap.get(name);
|
|
40
|
+
return {
|
|
41
|
+
name,
|
|
42
|
+
repo: pkg?.repo ?? "unknown",
|
|
43
|
+
status: "failed",
|
|
44
|
+
error: checkResult.errors[name],
|
|
45
|
+
submodule: pkg?.submodule
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
const skipped = checkResult.skipped.map((name) => {
|
|
49
|
+
const pkg = pkgMap.get(name);
|
|
50
|
+
return {
|
|
51
|
+
name,
|
|
52
|
+
repo: pkg?.repo ?? "unknown",
|
|
53
|
+
status: "skipped",
|
|
54
|
+
submodule: pkg?.submodule
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
checks[ct] = { passed, failed, skipped };
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
timestamp,
|
|
61
|
+
git,
|
|
62
|
+
submodules,
|
|
63
|
+
checks
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
export { details_handler_default as default };
|
|
69
|
+
//# sourceMappingURL=details-handler.js.map
|
|
70
|
+
//# sourceMappingURL=details-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/rest/handlers/details-handler.ts"],"names":[],"mappings":"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","file":"details-handler.js","sourcesContent":["/**\n * GET /details handler\n *\n * Returns per-package details with error text from the last QA run.\n * Data comes from last-run.json (saved by qa-orchestrator after each run).\n */\n\nimport { defineHandler, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { loadLastRun } from '@kb-labs/qa-core';\nimport type { QADetailsRequest, QADetailsResponse } from '@kb-labs/qa-contracts';\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n _input: RestInput<QADetailsRequest, unknown>,\n ): Promise<QADetailsResponse> {\n const lastRun = loadLastRun(ctx.cwd);\n\n if (!lastRun) {\n // No last run data — return empty structure\n return {\n timestamp: null,\n git: null,\n checks: {} as QADetailsResponse['checks'],\n };\n }\n\n const { results, packages, submodules, timestamp } = lastRun;\n\n // Build a lookup: package name → package metadata\n const pkgMap = new Map(packages.map((p) => [p.name, p]));\n\n // Get git info from the latest history entry (last-run doesn't store git directly)\n // We'll use execSync to get current git info as a fallback\n let git: QADetailsResponse['git'] = null;\n try {\n const { execSync } = await import('node:child_process');\n const commit = execSync('git rev-parse --short HEAD', { cwd: ctx.cwd, encoding: 'utf-8' }).trim();\n const branch = execSync('git rev-parse --abbrev-ref HEAD', { cwd: ctx.cwd, encoding: 'utf-8' }).trim();\n const message = execSync('git log -1 --format=%s', { cwd: ctx.cwd, encoding: 'utf-8' }).trim();\n git = { commit, branch, message };\n } catch {\n // git not available\n }\n\n const checks: QADetailsResponse['checks'] = {} as QADetailsResponse['checks'];\n\n for (const ct of Object.keys(results)) {\n const checkResult = results[ct]!;\n const passed = checkResult.passed.map((name) => {\n const pkg = pkgMap.get(name);\n return {\n name,\n repo: pkg?.repo ?? 'unknown',\n status: 'passed' as const,\n submodule: pkg?.submodule,\n };\n });\n const failed = checkResult.failed.map((name) => {\n const pkg = pkgMap.get(name);\n return {\n name,\n repo: pkg?.repo ?? 'unknown',\n status: 'failed' as const,\n error: checkResult.errors[name],\n submodule: pkg?.submodule,\n };\n });\n const skipped = checkResult.skipped.map((name) => {\n const pkg = pkgMap.get(name);\n return {\n name,\n repo: pkg?.repo ?? 'unknown',\n status: 'skipped' as const,\n submodule: pkg?.submodule,\n };\n });\n\n checks[ct] = { passed, failed, skipped };\n }\n\n return {\n timestamp,\n git,\n submodules,\n checks,\n };\n },\n});\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<{}, unknown, unknown>, {
|
|
5
|
+
groups: {
|
|
6
|
+
checkType: string;
|
|
7
|
+
count: number;
|
|
8
|
+
pattern: string;
|
|
9
|
+
packages: string[];
|
|
10
|
+
example: string;
|
|
11
|
+
}[];
|
|
12
|
+
ungrouped: number;
|
|
13
|
+
}>;
|
|
14
|
+
|
|
15
|
+
export { _default as default };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
+
import { loadLastRun, groupErrors } from '@kb-labs/qa-core';
|
|
3
|
+
|
|
4
|
+
// src/rest/handlers/error-groups-handler.ts
|
|
5
|
+
var error_groups_handler_default = defineHandler({
|
|
6
|
+
async execute(ctx, _input) {
|
|
7
|
+
const lastRun = loadLastRun(ctx.cwd);
|
|
8
|
+
if (!lastRun) {
|
|
9
|
+
return { groups: [], ungrouped: 0 };
|
|
10
|
+
}
|
|
11
|
+
return groupErrors(lastRun.results);
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
export { error_groups_handler_default as default };
|
|
16
|
+
//# sourceMappingURL=error-groups-handler.js.map
|
|
17
|
+
//# sourceMappingURL=error-groups-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/rest/handlers/error-groups-handler.ts"],"names":[],"mappings":";;;;AAWA,IAAO,+BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,GAAA,EACA,MAAA,EACgC;AAChC,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAEnC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,EAAE,MAAA,EAAQ,EAAC,EAAG,WAAW,CAAA,EAAE;AAAA,IACpC;AAEA,IAAA,OAAO,WAAA,CAAY,QAAQ,OAAO,CAAA;AAAA,EACpC;AACF,CAAC","file":"error-groups-handler.js","sourcesContent":["/**\n * GET /errors/groups handler\n *\n * Groups errors from the last QA run by pattern (ESLint rule, TS code, etc.).\n * Helps identify the most impactful errors to fix first.\n */\n\nimport { defineHandler, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { loadLastRun, groupErrors } from '@kb-labs/qa-core';\nimport type { QAErrorGroupsRequest, QAErrorGroupsResponse } from '@kb-labs/qa-contracts';\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n _input: RestInput<QAErrorGroupsRequest, unknown>,\n ): Promise<QAErrorGroupsResponse> {\n const lastRun = loadLastRun(ctx.cwd);\n\n if (!lastRun) {\n return { groups: [], ungrouped: 0 };\n }\n\n return groupErrors(lastRun.results);\n },\n});\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<{
|
|
5
|
+
limit?: number | undefined;
|
|
6
|
+
}, unknown, unknown>, {
|
|
7
|
+
entries: {
|
|
8
|
+
status: "passed" | "failed";
|
|
9
|
+
git: {
|
|
10
|
+
commit: string;
|
|
11
|
+
branch: string;
|
|
12
|
+
message: string;
|
|
13
|
+
};
|
|
14
|
+
timestamp: string;
|
|
15
|
+
summary: Record<string, {
|
|
16
|
+
passed: number;
|
|
17
|
+
failed: number;
|
|
18
|
+
skipped: number;
|
|
19
|
+
}>;
|
|
20
|
+
failedPackages: Record<string, string[]>;
|
|
21
|
+
}[];
|
|
22
|
+
total: number;
|
|
23
|
+
}>;
|
|
24
|
+
|
|
25
|
+
export { _default as default };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
+
import { loadHistory } from '@kb-labs/qa-core';
|
|
3
|
+
|
|
4
|
+
// src/rest/handlers/history-handler.ts
|
|
5
|
+
var history_handler_default = defineHandler({
|
|
6
|
+
async execute(ctx, input) {
|
|
7
|
+
const limit = input.query?.limit;
|
|
8
|
+
const allEntries = loadHistory(ctx.cwd);
|
|
9
|
+
let entries = [...allEntries].reverse();
|
|
10
|
+
if (limit && limit > 0) {
|
|
11
|
+
entries = entries.slice(0, limit);
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
entries,
|
|
15
|
+
total: allEntries.length
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
export { history_handler_default as default };
|
|
21
|
+
//# sourceMappingURL=history-handler.js.map
|
|
22
|
+
//# sourceMappingURL=history-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/rest/handlers/history-handler.ts"],"names":[],"mappings":";;;;AAUA,IAAO,0BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,GAAA,EACA,KAAA,EAC4B;AAC5B,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,EAAO,KAAA;AAC3B,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAGtC,IAAA,IAAI,OAAA,GAAU,CAAC,GAAG,UAAU,EAAE,OAAA,EAAQ;AACtC,IAAA,IAAI,KAAA,IAAS,QAAQ,CAAA,EAAG;AACtB,MAAA,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAAA,IAClC;AAEA,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,OAAO,UAAA,CAAW;AAAA,KACpB;AAAA,EACF;AACF,CAAC","file":"history-handler.js","sourcesContent":["/**\n * GET /history handler\n *\n * Returns QA run history, newest first. Supports ?limit=N.\n */\n\nimport { defineHandler, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { loadHistory } from '@kb-labs/qa-core';\nimport type { QAHistoryRequest, QAHistoryResponse } from '@kb-labs/qa-contracts';\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<QAHistoryRequest, unknown>,\n ): Promise<QAHistoryResponse> {\n const limit = input.query?.limit;\n const allEntries = loadHistory(ctx.cwd);\n\n // Return newest first\n let entries = [...allEntries].reverse();\n if (limit && limit > 0) {\n entries = entries.slice(0, limit);\n }\n\n return {\n entries,\n total: allEntries.length,\n };\n },\n});\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<{}, unknown, unknown>, {
|
|
5
|
+
entry: {
|
|
6
|
+
status: "passed" | "failed";
|
|
7
|
+
git: {
|
|
8
|
+
commit: string;
|
|
9
|
+
branch: string;
|
|
10
|
+
message: string;
|
|
11
|
+
};
|
|
12
|
+
timestamp: string;
|
|
13
|
+
summary: Record<string, {
|
|
14
|
+
passed: number;
|
|
15
|
+
failed: number;
|
|
16
|
+
skipped: number;
|
|
17
|
+
}>;
|
|
18
|
+
failedPackages: Record<string, string[]>;
|
|
19
|
+
} | null;
|
|
20
|
+
}>;
|
|
21
|
+
|
|
22
|
+
export { _default as default };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
+
import { loadHistory } from '@kb-labs/qa-core';
|
|
3
|
+
|
|
4
|
+
// src/rest/handlers/latest-handler.ts
|
|
5
|
+
var latest_handler_default = defineHandler({
|
|
6
|
+
async execute(ctx, _input) {
|
|
7
|
+
const history = loadHistory(ctx.cwd);
|
|
8
|
+
if (history.length === 0) {
|
|
9
|
+
return { entry: null };
|
|
10
|
+
}
|
|
11
|
+
return { entry: history[history.length - 1] };
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
export { latest_handler_default as default };
|
|
16
|
+
//# sourceMappingURL=latest-handler.js.map
|
|
17
|
+
//# sourceMappingURL=latest-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/rest/handlers/latest-handler.ts"],"names":[],"mappings":";;;;AAUA,IAAO,yBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,GAAA,EACA,MAAA,EAC2B;AAC3B,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAEnC,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,IACvB;AAEA,IAAA,OAAO,EAAE,KAAA,EAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,EAAG;AAAA,EAC/C;AACF,CAAC","file":"latest-handler.js","sourcesContent":["/**\n * GET /latest handler\n *\n * Returns the most recent QA run from history.\n */\n\nimport { defineHandler, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { loadHistory } from '@kb-labs/qa-core';\nimport type { QALatestRequest, QALatestResponse } from '@kb-labs/qa-contracts';\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n _input: RestInput<QALatestRequest, unknown>,\n ): Promise<QALatestResponse> {\n const history = loadHistory(ctx.cwd);\n\n if (history.length === 0) {\n return { entry: null };\n }\n\n return { entry: history[history.length - 1]! };\n },\n});\n"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<{}, unknown, unknown>, {
|
|
5
|
+
entries: {
|
|
6
|
+
git: {
|
|
7
|
+
commit: string;
|
|
8
|
+
branch: string;
|
|
9
|
+
message: string;
|
|
10
|
+
};
|
|
11
|
+
checks: Record<string, "passed" | "failed" | "skipped">;
|
|
12
|
+
timestamp: string;
|
|
13
|
+
submoduleCommit?: string | undefined;
|
|
14
|
+
}[];
|
|
15
|
+
repo: string;
|
|
16
|
+
packageName: string;
|
|
17
|
+
flakyScore: number;
|
|
18
|
+
flakyChecks: string[];
|
|
19
|
+
currentStreak: {
|
|
20
|
+
status: "passing" | "failing";
|
|
21
|
+
count: number;
|
|
22
|
+
};
|
|
23
|
+
firstFailure?: string | undefined;
|
|
24
|
+
}>;
|
|
25
|
+
|
|
26
|
+
export { _default as default };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
+
import { loadHistory, getPackageTimeline } from '@kb-labs/qa-core';
|
|
3
|
+
|
|
4
|
+
// src/rest/handlers/package-timeline-handler.ts
|
|
5
|
+
var package_timeline_handler_default = defineHandler({
|
|
6
|
+
async execute(ctx, input) {
|
|
7
|
+
const packageName = input.params?.name;
|
|
8
|
+
if (!packageName) {
|
|
9
|
+
throw new Error("Package name is required (path param :name)");
|
|
10
|
+
}
|
|
11
|
+
const history = loadHistory(ctx.cwd);
|
|
12
|
+
return getPackageTimeline(history, packageName);
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
export { package_timeline_handler_default as default };
|
|
17
|
+
//# sourceMappingURL=package-timeline-handler.js.map
|
|
18
|
+
//# sourceMappingURL=package-timeline-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/rest/handlers/package-timeline-handler.ts"],"names":[],"mappings":";;;;AAWA,IAAO,mCAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,GAAA,EACA,KAAA,EACoC;AACpC,IAAA,MAAM,WAAA,GAAe,MAAc,MAAA,EAAQ,IAAA;AAE3C,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,IAC/D;AAEA,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AACnC,IAAA,OAAO,kBAAA,CAAmB,SAAS,WAAW,CAAA;AAAA,EAChD;AACF,CAAC","file":"package-timeline-handler.js","sourcesContent":["/**\n * GET /packages/:name/timeline handler\n *\n * Returns per-package QA timeline across history entries.\n * Computes flaky score, current streak, and first failure.\n */\n\nimport { defineHandler, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { loadHistory, getPackageTimeline } from '@kb-labs/qa-core';\nimport type { QAPackageTimelineRequest, QAPackageTimelineResponse } from '@kb-labs/qa-contracts';\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<QAPackageTimelineRequest, unknown>,\n ): Promise<QAPackageTimelineResponse> {\n const packageName = (input as any).params?.name as string | undefined;\n\n if (!packageName) {\n throw new Error('Package name is required (path param :name)');\n }\n\n const history = loadHistory(ctx.cwd);\n return getPackageTimeline(history, packageName);\n },\n});\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<{
|
|
5
|
+
scope?: string | undefined;
|
|
6
|
+
}, unknown, unknown>, {
|
|
7
|
+
hasRegressions: boolean;
|
|
8
|
+
regressions: {
|
|
9
|
+
checkType: string;
|
|
10
|
+
delta: number;
|
|
11
|
+
newFailures: string[];
|
|
12
|
+
}[];
|
|
13
|
+
scope?: string | undefined;
|
|
14
|
+
}>;
|
|
15
|
+
|
|
16
|
+
export { _default as default };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
+
import { loadHistory, detectRegressions } from '@kb-labs/qa-core';
|
|
3
|
+
|
|
4
|
+
// src/rest/handlers/regressions-handler.ts
|
|
5
|
+
var regressions_handler_default = defineHandler({
|
|
6
|
+
async execute(ctx, _input) {
|
|
7
|
+
const history = loadHistory(ctx.cwd);
|
|
8
|
+
return detectRegressions(history);
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export { regressions_handler_default as default };
|
|
13
|
+
//# sourceMappingURL=regressions-handler.js.map
|
|
14
|
+
//# sourceMappingURL=regressions-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/rest/handlers/regressions-handler.ts"],"names":[],"mappings":";;;;AAUA,IAAO,8BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,GAAA,EACA,MAAA,EACgC;AAChC,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AACnC,IAAA,OAAO,kBAAkB,OAAO,CAAA;AAAA,EAClC;AACF,CAAC","file":"regressions-handler.js","sourcesContent":["/**\n * GET /regressions handler\n *\n * Detects regressions by comparing the last two history entries.\n */\n\nimport { defineHandler, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { loadHistory, detectRegressions } from '@kb-labs/qa-core';\nimport type { QARegressionsRequest, QARegressionsResponse } from '@kb-labs/qa-contracts';\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n _input: RestInput<QARegressionsRequest, unknown>,\n ): Promise<QARegressionsResponse> {\n const history = loadHistory(ctx.cwd);\n return detectRegressions(history);\n },\n});\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<unknown, {
|
|
5
|
+
checkType: string;
|
|
6
|
+
repo?: string | undefined;
|
|
7
|
+
package?: string | undefined;
|
|
8
|
+
}, unknown>, {
|
|
9
|
+
status: "passed" | "failed";
|
|
10
|
+
checkType: string;
|
|
11
|
+
durationMs: number;
|
|
12
|
+
result: {
|
|
13
|
+
passed: string[];
|
|
14
|
+
failed: string[];
|
|
15
|
+
skipped: string[];
|
|
16
|
+
errors: Record<string, string>;
|
|
17
|
+
};
|
|
18
|
+
}>;
|
|
19
|
+
|
|
20
|
+
export { _default as default };
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
+
import { getWorkspacePackages, runTestCheck, runTypeCheck, runLintCheck } from '@kb-labs/qa-core';
|
|
3
|
+
|
|
4
|
+
// src/rest/handlers/run-check-handler.ts
|
|
5
|
+
var run_check_handler_default = defineHandler({
|
|
6
|
+
async execute(ctx, input) {
|
|
7
|
+
const rootDir = ctx.cwd;
|
|
8
|
+
const startTime = Date.now();
|
|
9
|
+
const body = input.body;
|
|
10
|
+
const { checkType, repo, package: packageFilter } = body;
|
|
11
|
+
let packages = getWorkspacePackages(rootDir);
|
|
12
|
+
if (repo) {
|
|
13
|
+
packages = packages.filter((p) => p.repo === repo);
|
|
14
|
+
}
|
|
15
|
+
if (packageFilter) {
|
|
16
|
+
packages = packages.filter((p) => p.name === packageFilter || p.name.includes(packageFilter));
|
|
17
|
+
}
|
|
18
|
+
let result;
|
|
19
|
+
switch (checkType) {
|
|
20
|
+
case "lint":
|
|
21
|
+
result = runLintCheck({ rootDir, packages });
|
|
22
|
+
break;
|
|
23
|
+
case "typeCheck":
|
|
24
|
+
result = runTypeCheck({ rootDir, packages });
|
|
25
|
+
break;
|
|
26
|
+
case "test":
|
|
27
|
+
result = runTestCheck({ rootDir, packages });
|
|
28
|
+
break;
|
|
29
|
+
default:
|
|
30
|
+
result = { passed: [], failed: [], skipped: [], errors: {} };
|
|
31
|
+
}
|
|
32
|
+
const hasFailed = result.failed.length > 0;
|
|
33
|
+
const durationMs = Date.now() - startTime;
|
|
34
|
+
const analytics = ctx.platform.analytics;
|
|
35
|
+
if (analytics) {
|
|
36
|
+
await analytics.track("qa.check.completed", {
|
|
37
|
+
checkType,
|
|
38
|
+
status: hasFailed ? "failed" : "passed",
|
|
39
|
+
passed: result.passed.length,
|
|
40
|
+
failed: result.failed.length,
|
|
41
|
+
skipped: result.skipped.length,
|
|
42
|
+
durationMs,
|
|
43
|
+
repo: repo || void 0,
|
|
44
|
+
package: packageFilter || void 0
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
checkType,
|
|
49
|
+
status: hasFailed ? "failed" : "passed",
|
|
50
|
+
result,
|
|
51
|
+
durationMs
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
export { run_check_handler_default as default };
|
|
57
|
+
//# sourceMappingURL=run-check-handler.js.map
|
|
58
|
+
//# sourceMappingURL=run-check-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/rest/handlers/run-check-handler.ts"],"names":[],"mappings":";;;;AAYA,IAAO,4BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,GAAA,EACA,KAAA,EAC6B;AAC7B,IAAA,MAAM,UAAU,GAAA,CAAI,GAAA;AACpB,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AAEnB,IAAA,MAAM,EAAE,SAAA,EAAW,IAAA,EAAM,OAAA,EAAS,eAAc,GAAI,IAAA;AAGpD,IAAA,IAAI,QAAA,GAAW,qBAAqB,OAAO,CAAA;AAG3C,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,QAAA,GAAW,SAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,IACnD;AAGA,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,aAAA,IAAiB,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,aAAa,CAAC,CAAA;AAAA,IAC9F;AAGA,IAAA,IAAI,MAAA;AACJ,IAAA,QAAQ,SAAA;AAAW,MACjB,KAAK,MAAA;AACH,QAAA,MAAA,GAAS,YAAA,CAAa,EAAE,OAAA,EAAS,QAAA,EAAU,CAAA;AAC3C,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,MAAA,GAAS,YAAA,CAAa,EAAE,OAAA,EAAS,QAAA,EAAU,CAAA;AAC3C,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,MAAA,GAAS,YAAA,CAAa,EAAE,OAAA,EAAS,QAAA,EAAU,CAAA;AAC3C,QAAA;AAAA,MACF;AACE,QAAA,MAAA,GAAS,EAAE,MAAA,EAAQ,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAG,OAAA,EAAS,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AAAA;AAG/D,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAA;AACzC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAGhC,IAAA,MAAM,SAAA,GAAY,IAAI,QAAA,CAAS,SAAA;AAC/B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,SAAA,CAAU,MAAM,oBAAA,EAAsB;AAAA,QAC1C,SAAA;AAAA,QACA,MAAA,EAAQ,YAAY,QAAA,GAAW,QAAA;AAAA,QAC/B,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAA;AAAA,QACtB,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAA;AAAA,QACtB,OAAA,EAAS,OAAO,OAAA,CAAQ,MAAA;AAAA,QACxB,UAAA;AAAA,QACA,MAAM,IAAA,IAAQ,MAAA;AAAA,QACd,SAAS,aAAA,IAAiB;AAAA,OAC3B,CAAA;AAAA,IACH;AAEA,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,MAAA,EAAQ,YAAY,QAAA,GAAW,QAAA;AAAA,MAC/B,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF,CAAC","file":"run-check-handler.js","sourcesContent":["/**\n * POST /run/check handler\n *\n * Runs a single check type (lint, typeCheck, or test) with optional filtering\n * by repo or package name. Useful for quick re-checks from the UI.\n */\n\nimport { defineHandler, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { getWorkspacePackages, runLintCheck, runTypeCheck, runTestCheck } from '@kb-labs/qa-core';\nimport type { QARunCheckRequest, QARunCheckResponse } from '@kb-labs/qa-contracts';\nimport type { CheckResult } from '@kb-labs/qa-contracts';\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<unknown, QARunCheckRequest>,\n ): Promise<QARunCheckResponse> {\n const rootDir = ctx.cwd;\n const startTime = Date.now();\n const body = input.body!;\n\n const { checkType, repo, package: packageFilter } = body;\n\n // Discover workspace packages\n let packages = getWorkspacePackages(rootDir);\n\n // Filter by repo if specified\n if (repo) {\n packages = packages.filter((p) => p.repo === repo);\n }\n\n // Filter by package name if specified\n if (packageFilter) {\n packages = packages.filter((p) => p.name === packageFilter || p.name.includes(packageFilter));\n }\n\n // Run the specified check\n let result: CheckResult;\n switch (checkType) {\n case 'lint':\n result = runLintCheck({ rootDir, packages });\n break;\n case 'typeCheck':\n result = runTypeCheck({ rootDir, packages });\n break;\n case 'test':\n result = runTestCheck({ rootDir, packages });\n break;\n default:\n result = { passed: [], failed: [], skipped: [], errors: {} };\n }\n\n const hasFailed = result.failed.length > 0;\n const durationMs = Date.now() - startTime;\n\n // Track analytics event\n const analytics = ctx.platform.analytics;\n if (analytics) {\n await analytics.track('qa.check.completed', {\n checkType,\n status: hasFailed ? 'failed' : 'passed',\n passed: result.passed.length,\n failed: result.failed.length,\n skipped: result.skipped.length,\n durationMs,\n repo: repo || undefined,\n package: packageFilter || undefined,\n });\n }\n\n return {\n checkType,\n status: hasFailed ? 'failed' : 'passed',\n result,\n durationMs,\n };\n },\n});\n"]}
|