@kb-labs/qa-entry 2.98.0 → 2.100.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.
@@ -82,6 +82,37 @@ declare const qaTrendsFlags: _kb_labs_shared_command_kit.FlagSchemaWithInfer<{
82
82
  };
83
83
  }>;
84
84
  type QaTrendsFlags = typeof qaTrendsFlags.infer;
85
+ declare const qaE2eFlakyFlags: _kb_labs_shared_command_kit.FlagSchemaWithInfer<{
86
+ agent: {
87
+ type: "boolean";
88
+ description: string;
89
+ default: false;
90
+ };
91
+ json: {
92
+ type: "boolean";
93
+ description: string;
94
+ default: false;
95
+ };
96
+ case: {
97
+ type: "string";
98
+ description: string;
99
+ };
100
+ window: {
101
+ type: "number";
102
+ description: string;
103
+ default: number;
104
+ };
105
+ sync: {
106
+ type: "boolean";
107
+ description: string;
108
+ default: false;
109
+ };
110
+ ingest: {
111
+ type: "string";
112
+ description: string;
113
+ };
114
+ }>;
115
+ type QaE2eFlakyFlags = typeof qaE2eFlakyFlags.infer;
85
116
  declare const qaRegressionsFlags: _kb_labs_shared_command_kit.FlagSchemaWithInfer<{
86
117
  json: {
87
118
  type: "boolean";
@@ -115,4 +146,4 @@ declare const baselineDiffFlags: _kb_labs_shared_command_kit.FlagSchemaWithInfer
115
146
  }>;
116
147
  type BaselineDiffFlags = typeof baselineDiffFlags.infer;
117
148
 
118
- export { type BaselineDiffFlags, type BaselineStatusFlags, type BaselineUpdateFlags, type QaCheckFlags, type QaGateFlags, type QaHistoryFlags, type QaRegressionsFlags, type QaRunFlags, type QaStatsFlags, type QaTrendsFlags, baselineDiffFlags, baselineStatusFlags, baselineUpdateFlags, qaCheckFlags, qaGateFlags, qaHistoryFlags, qaRegressionsFlags, qaRunFlags, qaStatsFlags, qaTrendsFlags };
149
+ export { type BaselineDiffFlags, type BaselineStatusFlags, type BaselineUpdateFlags, type QaCheckFlags, type QaE2eFlakyFlags, type QaGateFlags, type QaHistoryFlags, type QaRegressionsFlags, type QaRunFlags, type QaStatsFlags, type QaTrendsFlags, baselineDiffFlags, baselineStatusFlags, baselineUpdateFlags, qaCheckFlags, qaE2eFlakyFlags, qaGateFlags, qaHistoryFlags, qaRegressionsFlags, qaRunFlags, qaStatsFlags, qaTrendsFlags };
@@ -77,6 +77,36 @@ var qaTrendsFlags = defineFlags({
77
77
  default: false
78
78
  }
79
79
  });
80
+ var qaE2eFlakyFlags = defineFlags({
81
+ agent: {
82
+ type: "boolean",
83
+ description: "Emit compact machine-readable agent JSON (alias for --json)",
84
+ default: false
85
+ },
86
+ json: {
87
+ type: "boolean",
88
+ description: "Output JSON",
89
+ default: false
90
+ },
91
+ case: {
92
+ type: "string",
93
+ description: `Drill down into one case: "<suite>/<spec>#<testId>" (from the overview's "top" list)`
94
+ },
95
+ window: {
96
+ type: "number",
97
+ description: "Number of e2e-flaky history entries (runs) to analyze",
98
+ default: 10
99
+ },
100
+ sync: {
101
+ type: "boolean",
102
+ description: 'Fetch the latest flaky history from the "ci-data" branch before analyzing',
103
+ default: false
104
+ },
105
+ ingest: {
106
+ type: "string",
107
+ description: "CI-only: directory of per-shard flaky-report.json files to merge and save as a new snapshot"
108
+ }
109
+ });
80
110
  var qaRegressionsFlags = defineFlags({
81
111
  json: {
82
112
  type: "boolean",
@@ -106,6 +136,6 @@ var baselineDiffFlags = defineFlags({
106
136
  }
107
137
  });
108
138
 
109
- export { baselineDiffFlags, baselineStatusFlags, baselineUpdateFlags, qaCheckFlags, qaGateFlags, qaHistoryFlags, qaRegressionsFlags, qaRunFlags, qaStatsFlags, qaTrendsFlags };
139
+ export { baselineDiffFlags, baselineStatusFlags, baselineUpdateFlags, qaCheckFlags, qaE2eFlakyFlags, qaGateFlags, qaHistoryFlags, qaRegressionsFlags, qaRunFlags, qaStatsFlags, qaTrendsFlags };
110
140
  //# sourceMappingURL=flags.js.map
111
141
  //# sourceMappingURL=flags.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/flags.ts"],"names":[],"mappings":"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","file":"flags.js","sourcesContent":["import { defineFlags } from '@kb-labs/sdk';\n\nexport const qaRunFlags = defineFlags({\n tasks: {\n type: 'string',\n description: 'Comma-separated tasks to run (default: build,lint,type-check,test)',\n },\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: true,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaRunFlags = typeof qaRunFlags.infer;\n\nexport const qaCheckFlags = defineFlags({\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: true,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaCheckFlags = typeof qaCheckFlags.infer;\n\nexport const qaStatsFlags = defineFlags({\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: true,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaStatsFlags = typeof qaStatsFlags.infer;\n\nexport const qaGateFlags = defineFlags({\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaGateFlags = typeof qaGateFlags.infer;\n\nexport const qaHistoryFlags = defineFlags({\n limit: {\n type: 'number',\n description: 'Max entries to show',\n default: 20,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaHistoryFlags = typeof qaHistoryFlags.infer;\n\nexport const qaTrendsFlags = defineFlags({\n window: {\n type: 'number',\n description: 'Number of history entries to analyze',\n default: 10,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaTrendsFlags = typeof qaTrendsFlags.infer;\n\nexport const qaRegressionsFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaRegressionsFlags = typeof qaRegressionsFlags.infer;\n\nexport const baselineUpdateFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type BaselineUpdateFlags = typeof baselineUpdateFlags.infer;\n\nexport const baselineStatusFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type BaselineStatusFlags = typeof baselineStatusFlags.infer;\n\nexport const baselineDiffFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type BaselineDiffFlags = typeof baselineDiffFlags.infer;\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/flags.ts"],"names":[],"mappings":"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","file":"flags.js","sourcesContent":["import { defineFlags } from '@kb-labs/sdk';\n\nexport const qaRunFlags = defineFlags({\n tasks: {\n type: 'string',\n description: 'Comma-separated tasks to run (default: build,lint,type-check,test)',\n },\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: true,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaRunFlags = typeof qaRunFlags.infer;\n\nexport const qaCheckFlags = defineFlags({\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: true,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaCheckFlags = typeof qaCheckFlags.infer;\n\nexport const qaStatsFlags = defineFlags({\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: true,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaStatsFlags = typeof qaStatsFlags.infer;\n\nexport const qaGateFlags = defineFlags({\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaGateFlags = typeof qaGateFlags.infer;\n\nexport const qaHistoryFlags = defineFlags({\n limit: {\n type: 'number',\n description: 'Max entries to show',\n default: 20,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaHistoryFlags = typeof qaHistoryFlags.infer;\n\nexport const qaTrendsFlags = defineFlags({\n window: {\n type: 'number',\n description: 'Number of history entries to analyze',\n default: 10,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaTrendsFlags = typeof qaTrendsFlags.infer;\n\nexport const qaE2eFlakyFlags = defineFlags({\n agent: {\n type: 'boolean',\n description: 'Emit compact machine-readable agent JSON (alias for --json)',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n case: {\n type: 'string',\n description: 'Drill down into one case: \"<suite>/<spec>#<testId>\" (from the overview\\'s \"top\" list)',\n },\n window: {\n type: 'number',\n description: 'Number of e2e-flaky history entries (runs) to analyze',\n default: 10,\n },\n sync: {\n type: 'boolean',\n description: 'Fetch the latest flaky history from the \"ci-data\" branch before analyzing',\n default: false,\n },\n ingest: {\n type: 'string',\n description: 'CI-only: directory of per-shard flaky-report.json files to merge and save as a new snapshot',\n },\n});\nexport type QaE2eFlakyFlags = typeof qaE2eFlakyFlags.infer;\n\nexport const qaRegressionsFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaRegressionsFlags = typeof qaRegressionsFlags.infer;\n\nexport const baselineUpdateFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type BaselineUpdateFlags = typeof baselineUpdateFlags.infer;\n\nexport const baselineStatusFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type BaselineStatusFlags = typeof baselineStatusFlags.infer;\n\nexport const baselineDiffFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type BaselineDiffFlags = typeof baselineDiffFlags.infer;\n"]}
@@ -0,0 +1,37 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+ import { CLIInput } from '@kb-labs/sdk';
3
+
4
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<_kb_labs_shared_command_kit.InferFlags<{
5
+ agent: {
6
+ type: "boolean";
7
+ description: string;
8
+ default: false;
9
+ };
10
+ json: {
11
+ type: "boolean";
12
+ description: string;
13
+ default: false;
14
+ };
15
+ case: {
16
+ type: "string";
17
+ description: string;
18
+ };
19
+ window: {
20
+ type: "number";
21
+ description: string;
22
+ default: number;
23
+ };
24
+ sync: {
25
+ type: "boolean";
26
+ description: string;
27
+ default: false;
28
+ };
29
+ ingest: {
30
+ type: "string";
31
+ description: string;
32
+ };
33
+ }>>, {
34
+ exitCode: number;
35
+ }>;
36
+
37
+ export { _default as default };
@@ -0,0 +1,120 @@
1
+ import { mkdirSync, writeFileSync, existsSync, readdirSync, readFileSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ import { defineCommand, useConfig } from '@kb-labs/sdk';
4
+ import { SnapshotStore, buildCaseTimeline, analyzeFlakyCases, captureGit } from '@kb-labs/qa-core';
5
+ import { TRENDS_WINDOW, PATHS } from '@kb-labs/qa-contracts';
6
+
7
+ // src/cli/commands/qa-e2e-flaky.ts
8
+ async function runIngest(ctx, cwd, store, dir) {
9
+ const cases = [];
10
+ if (existsSync(dir)) {
11
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
12
+ const file = entry.isDirectory() ? join(dir, entry.name, "flaky-report.json") : entry.name === "flaky-report.json" ? join(dir, entry.name) : null;
13
+ if (!file || !existsSync(file)) {
14
+ continue;
15
+ }
16
+ try {
17
+ cases.push(...JSON.parse(readFileSync(file, "utf-8")));
18
+ } catch {
19
+ }
20
+ }
21
+ }
22
+ if (cases.length === 0) {
23
+ ctx.ui?.error?.(`No flaky-report.json files found under ${dir} \u2014 nothing to ingest.`);
24
+ return { exitCode: 1 };
25
+ }
26
+ const git = await captureGit(ctx.api.shell, cwd);
27
+ const snap = store.saveE2eFlaky(cases, 0, git);
28
+ ctx.ui?.success?.(`Ingested ${cases.length} e2e case result(s) from ${dir} into flaky history`, {});
29
+ ctx.ui?.json?.(snap);
30
+ return { exitCode: 0 };
31
+ }
32
+ async function runSync(ctx, cwd) {
33
+ const fetch = await ctx.api.shell.exec("git", ["fetch", "origin", "ci-data"], { cwd, throwOnError: false });
34
+ if (!fetch.ok) {
35
+ ctx.ui?.error?.('No flaky history yet \u2014 the "ci-data" branch has not been created by CI.');
36
+ return false;
37
+ }
38
+ const show = await ctx.api.shell.exec(
39
+ "git",
40
+ ["show", `origin/ci-data:${PATHS.SNAPSHOTS_E2E_FLAKY}`],
41
+ { cwd, throwOnError: false }
42
+ );
43
+ if (!show.ok) {
44
+ ctx.ui?.error?.('No flaky history yet \u2014 "ci-data" branch exists but has no snapshot file.');
45
+ return false;
46
+ }
47
+ const target = join(cwd, PATHS.SNAPSHOTS_E2E_FLAKY);
48
+ mkdirSync(dirname(target), { recursive: true });
49
+ writeFileSync(target, show.stdout);
50
+ return true;
51
+ }
52
+ var qa_e2e_flaky_default = defineCommand({
53
+ id: "qa:e2e-flaky",
54
+ description: "Track flaky e2e cases across CI runs \u2014 compact overview by default, per-case drill-down on request",
55
+ handler: {
56
+ async execute(ctx, input) {
57
+ const { flags } = input;
58
+ const config = await useConfig();
59
+ const cwd = ctx.cwd ?? process.cwd();
60
+ const store = new SnapshotStore(cwd, config?.historyMaxEntries);
61
+ const json = flags.agent || flags.json;
62
+ if (flags.sync) {
63
+ const synced = await runSync(ctx, cwd);
64
+ if (!synced) {
65
+ return { exitCode: 1 };
66
+ }
67
+ }
68
+ if (flags.ingest) {
69
+ return runIngest(ctx, cwd, store, flags.ingest);
70
+ }
71
+ const history = store.loadE2eFlakyHistory();
72
+ const window = flags.window ?? TRENDS_WINDOW;
73
+ if (flags.case) {
74
+ const timeline = buildCaseTimeline(history.slice(-window), flags.case);
75
+ if (!timeline) {
76
+ ctx.ui?.error?.(`No history found for case "${flags.case}". Run with --agent to see the "top" list of known cases.`);
77
+ return { exitCode: 1 };
78
+ }
79
+ if (json) {
80
+ ctx.ui?.json?.(timeline);
81
+ } else {
82
+ ctx.ui?.success?.(`Case timeline: ${timeline.caseKey}`, {
83
+ sections: [
84
+ { header: "Summary", items: [
85
+ `flakyScore: ${timeline.flakyScore}`,
86
+ `streak: ${timeline.currentStreak.status} x${timeline.currentStreak.count}`,
87
+ `firstFailure: ${timeline.firstFailure ?? "none"}`
88
+ ] },
89
+ { header: "History", items: timeline.history.map(
90
+ (h) => `${h.timestamp} [${h.gitCommit}] ${h.status}${h.errorCategory ? ` (${h.errorCategory}: ${h.errorMessage ?? ""})` : ""}`
91
+ ) }
92
+ ]
93
+ });
94
+ }
95
+ return { exitCode: 0 };
96
+ }
97
+ const overview = analyzeFlakyCases(history, window);
98
+ if (json) {
99
+ ctx.ui?.json?.(overview);
100
+ } else {
101
+ ctx.ui?.success?.(`E2E flaky overview (last ${overview.runsAnalyzed} runs)`, {
102
+ sections: [
103
+ { header: "Summary", items: [
104
+ `totalCases: ${overview.totalCases}, flakyCases: ${overview.flakyCases}`,
105
+ `delta: +${overview.delta.new.length} new, -${overview.delta.fixed.length} fixed, ${overview.delta.unchanged.length} unchanged`
106
+ ] },
107
+ { header: "Top flaky cases", items: overview.top.map(
108
+ (t) => `${t.case} \u2014 score ${t.flakyScore}, ${t.streak}, ${t.category}`
109
+ ) }
110
+ ]
111
+ });
112
+ }
113
+ return { exitCode: 0 };
114
+ }
115
+ }
116
+ });
117
+
118
+ export { qa_e2e_flaky_default as default };
119
+ //# sourceMappingURL=qa-e2e-flaky.js.map
120
+ //# sourceMappingURL=qa-e2e-flaky.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/cli/commands/qa-e2e-flaky.ts"],"names":[],"mappings":"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","file":"qa-e2e-flaky.js","sourcesContent":["import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n} from '@kb-labs/sdk';\nimport {\n SnapshotStore,\n captureGit,\n analyzeFlakyCases,\n buildCaseTimeline,\n} from '@kb-labs/qa-core';\nimport { PATHS, TRENDS_WINDOW, type QAPluginConfig, type E2eCaseResult } from '@kb-labs/qa-contracts';\nimport type { QaE2eFlakyFlags } from './flags.js';\n\nasync function runIngest(\n ctx: PluginContextV3,\n cwd: string,\n store: SnapshotStore,\n dir: string,\n): Promise<{ exitCode: number }> {\n const cases: E2eCaseResult[] = [];\n if (existsSync(dir)) {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const file = entry.isDirectory()\n ? join(dir, entry.name, 'flaky-report.json')\n : entry.name === 'flaky-report.json' ? join(dir, entry.name) : null;\n if (!file || !existsSync(file)) {continue;}\n try {\n cases.push(...(JSON.parse(readFileSync(file, 'utf-8')) as E2eCaseResult[]));\n } catch {\n // A crashed/partial shard shouldn't block ingesting the rest.\n }\n }\n }\n\n if (cases.length === 0) {\n // No flaky-report.json files found under any shard — most likely every\n // shard failed before Playwright's reporter ever ran. Don't push an\n // empty snapshot into history; it would silently dilute the flip-rate\n // window with a run that carried no real signal.\n ctx.ui?.error?.(`No flaky-report.json files found under ${dir} — nothing to ingest.`);\n return { exitCode: 1 };\n }\n\n const git = await captureGit(ctx.api.shell, cwd);\n const snap = store.saveE2eFlaky(cases, 0, git);\n ctx.ui?.success?.(`Ingested ${cases.length} e2e case result(s) from ${dir} into flaky history`, {});\n ctx.ui?.json?.(snap);\n return { exitCode: 0 };\n}\n\nasync function runSync(ctx: PluginContextV3, cwd: string): Promise<boolean> {\n const fetch = await ctx.api.shell.exec('git', ['fetch', 'origin', 'ci-data'], { cwd, throwOnError: false });\n if (!fetch.ok) {\n ctx.ui?.error?.('No flaky history yet — the \"ci-data\" branch has not been created by CI.');\n return false;\n }\n const show = await ctx.api.shell.exec(\n 'git',\n ['show', `origin/ci-data:${PATHS.SNAPSHOTS_E2E_FLAKY}`],\n { cwd, throwOnError: false },\n );\n if (!show.ok) {\n ctx.ui?.error?.('No flaky history yet — \"ci-data\" branch exists but has no snapshot file.');\n return false;\n }\n const target = join(cwd, PATHS.SNAPSHOTS_E2E_FLAKY);\n mkdirSync(dirname(target), { recursive: true });\n writeFileSync(target, show.stdout);\n return true;\n}\n\nexport default defineCommand<unknown, CLIInput<QaE2eFlakyFlags>, { exitCode: number }>({\n id: 'qa:e2e-flaky',\n description: 'Track flaky e2e cases across CI runs — compact overview by default, per-case drill-down on request',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<QaE2eFlakyFlags>): Promise<{ exitCode: number }> {\n const { flags } = input;\n const config = await useConfig<QAPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n const store = new SnapshotStore(cwd, config?.historyMaxEntries);\n const json = flags.agent || flags.json;\n\n // --sync runs first so --ingest (if also passed) builds on the synced\n // history instead of silently ignoring --sync — the two compose rather\n // than one implicitly winning.\n if (flags.sync) {\n const synced = await runSync(ctx, cwd);\n if (!synced) {return { exitCode: 1 };}\n }\n\n if (flags.ingest) {\n return runIngest(ctx, cwd, store, flags.ingest);\n }\n\n const history = store.loadE2eFlakyHistory();\n const window = flags.window ?? TRENDS_WINDOW;\n\n if (flags.case) {\n const timeline = buildCaseTimeline(history.slice(-window), flags.case);\n if (!timeline) {\n ctx.ui?.error?.(`No history found for case \"${flags.case}\". Run with --agent to see the \"top\" list of known cases.`);\n return { exitCode: 1 };\n }\n if (json) {\n ctx.ui?.json?.(timeline);\n } else {\n ctx.ui?.success?.(`Case timeline: ${timeline.caseKey}`, {\n sections: [\n { header: 'Summary', items: [\n `flakyScore: ${timeline.flakyScore}`,\n `streak: ${timeline.currentStreak.status} x${timeline.currentStreak.count}`,\n `firstFailure: ${timeline.firstFailure ?? 'none'}`,\n ] },\n { header: 'History', items: timeline.history.map(\n h => `${h.timestamp} [${h.gitCommit}] ${h.status}${h.errorCategory ? ` (${h.errorCategory}: ${h.errorMessage ?? ''})` : ''}`,\n ) },\n ],\n });\n }\n return { exitCode: 0 };\n }\n\n const overview = analyzeFlakyCases(history, window);\n if (json) {\n ctx.ui?.json?.(overview);\n } else {\n ctx.ui?.success?.(`E2E flaky overview (last ${overview.runsAnalyzed} runs)`, {\n sections: [\n { header: 'Summary', items: [\n `totalCases: ${overview.totalCases}, flakyCases: ${overview.flakyCases}`,\n `delta: +${overview.delta.new.length} new, -${overview.delta.fixed.length} fixed, ${overview.delta.unchanged.length} unchanged`,\n ] },\n { header: 'Top flaky cases', items: overview.top.map(\n t => `${t.case} — score ${t.flakyScore}, ${t.streak}, ${t.category}`,\n ) },\n ],\n });\n }\n return { exitCode: 0 };\n },\n },\n});\n"]}
package/dist/index.js CHANGED
@@ -78,6 +78,36 @@ var qaTrendsFlags = defineFlags({
78
78
  default: false
79
79
  }
80
80
  });
81
+ var qaE2eFlakyFlags = defineFlags({
82
+ agent: {
83
+ type: "boolean",
84
+ description: "Emit compact machine-readable agent JSON (alias for --json)",
85
+ default: false
86
+ },
87
+ json: {
88
+ type: "boolean",
89
+ description: "Output JSON",
90
+ default: false
91
+ },
92
+ case: {
93
+ type: "string",
94
+ description: `Drill down into one case: "<suite>/<spec>#<testId>" (from the overview's "top" list)`
95
+ },
96
+ window: {
97
+ type: "number",
98
+ description: "Number of e2e-flaky history entries (runs) to analyze",
99
+ default: 10
100
+ },
101
+ sync: {
102
+ type: "boolean",
103
+ description: 'Fetch the latest flaky history from the "ci-data" branch before analyzing',
104
+ default: false
105
+ },
106
+ ingest: {
107
+ type: "string",
108
+ description: "CI-only: directory of per-shard flaky-report.json files to merge and save as a new snapshot"
109
+ }
110
+ });
81
111
  var qaRegressionsFlags = defineFlags({
82
112
  json: {
83
113
  type: "boolean",
@@ -191,6 +221,15 @@ var manifest = {
191
221
  flags: defineCommandFlags(qaTrendsFlags.schema),
192
222
  permissions: pluginPermissions
193
223
  },
224
+ {
225
+ path: "qa e2e-flaky",
226
+ category: "History",
227
+ describe: "Track flaky e2e cases across CI runs (agent-first overview + drill-down)",
228
+ operationType: "read",
229
+ handler: "./cli/commands/qa-e2e-flaky.js#default",
230
+ flags: defineCommandFlags(qaE2eFlakyFlags.schema),
231
+ permissions: pluginPermissions
232
+ },
194
233
  {
195
234
  path: "qa regressions",
196
235
  category: "History",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/commands/flags.ts","../src/manifest.ts"],"names":[],"mappings":";;;;AAEO,IAAM,aAAa,WAAA,CAAY;AAAA,EACpC,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,0BAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAGM,IAAM,eAAe,WAAA,CAAY;AAAA,EACtC,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,0BAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAGM,IAAM,eAAe,WAAA,CAAY;AAAA,EACtC,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,0BAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAGM,IAAM,cAAc,WAAA,CAAY;AAAA,EACrC,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,0BAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAGM,IAAM,iBAAiB,WAAA,CAAY;AAAA,EACxC,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,qBAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAGM,IAAM,gBAAgB,WAAA,CAAY;AAAA,EACvC,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,sCAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAGM,IAAM,qBAAqB,WAAA,CAAY;AAAA,EAC5C,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAGM,IAAM,sBAAsB,WAAA,CAAY;AAAA,EAC7C,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAGM,IAAM,sBAAsB,WAAA,CAAY;AAAA,EAC7C,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAGM,IAAM,oBAAoB,WAAA,CAAY;AAAA,EAC3C,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;ACxGD,IAAM,oBAAoB,kBAAA,EAAmB,CAC1C,IAAA,CAAK,gBAAgB,EACrB,MAAA,CAAO;AAAA,EACN,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO,CAAC,IAAI;AACd,CAAC,EACA,SAAA,CAAU;AAAA,EACT,KAAA,EAAO,CAAC,WAAA,EAAa,KAAK;AAC5B,CAAC,EACA,YAAA,CAAa;AAAA,EACZ,SAAA,EAAW;AACb,CAAC,EACA,UAAA,CAAW;AAAA,EACV,SAAA,EAAW,GAAA;AAAA,EACX,QAAA,EAAU;AACZ,CAAC,EACA,KAAA,EAAM;AAEF,IAAM,QAAA,GAAW;AAAA,EACtB,MAAA,EAAQ,aAAA;AAAA,EACR,EAAA,EAAI,aAAA;AAAA,EACJ,OAAA,EAAS,OAAA;AAAA,EAET,aAAA,EAAe,IAAA;AAAA,EAEf,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa,wFAAA;AAAA,IACb,MAAM,CAAC,IAAA,EAAM,SAAA,EAAW,UAAA,EAAY,cAAc,QAAQ;AAAA,GAC5D;AAAA,EAEA,QAAA,EAAU;AAAA,IACR,UAAU,EAAC;AAAA,IACX,QAAA,EAAU,CAAC,OAAA,EAAS,WAAA,EAAa,QAAQ;AAAA,GAC3C;AAAA,EAEA,GAAA,EAAK;AAAA,IACH,SAAA,EAAW;AAAA,MACT,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,wCAAA,EAAyC;AAAA,MACjE,EAAE,IAAA,EAAM,aAAA,EAAe,QAAA,EAAU,qBAAA;AAAsB,KACzD;AAAA,IACA,QAAA,EAAU;AAAA,MACR;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,QAAA,EAAU,KAAA;AAAA,QACV,QAAA,EAAU,qCAAA;AAAA,QACV,aAAA,EAAe,SAAA;AAAA,QACf,OAAA,EAAS,kCAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,UAAA,CAAW,MAAM,CAAA;AAAA,QAC3C,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,QAAA,EAAU,KAAA;AAAA,QACV,QAAA,EAAU,8BAAA;AAAA,QACV,aAAA,EAAe,SAAA;AAAA,QACf,OAAA,EAAS,oCAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,YAAA,CAAa,MAAM,CAAA;AAAA,QAC7C,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,QAAA,EAAU,KAAA;AAAA,QACV,QAAA,EAAU,iDAAA;AAAA,QACV,aAAA,EAAe,MAAA;AAAA,QACf,OAAA,EAAS,oCAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,YAAA,CAAa,MAAM,CAAA;AAAA,QAC7C,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,SAAA;AAAA,QACN,QAAA,EAAU,KAAA;AAAA,QACV,QAAA,EAAU,yDAAA;AAAA,QACV,aAAA,EAAe,SAAA;AAAA,QACf,OAAA,EAAS,mCAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,WAAA,CAAY,MAAM,CAAA;AAAA,QAC5C,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,YAAA;AAAA,QACN,QAAA,EAAU,SAAA;AAAA,QACV,QAAA,EAAU,qBAAA;AAAA,QACV,aAAA,EAAe,MAAA;AAAA,QACf,OAAA,EAAS,sCAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,cAAA,CAAe,MAAM,CAAA;AAAA,QAC/C,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,WAAA;AAAA,QACN,QAAA,EAAU,SAAA;AAAA,QACV,QAAA,EAAU,kCAAA;AAAA,QACV,aAAA,EAAe,MAAA;AAAA,QACf,OAAA,EAAS,qCAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,aAAA,CAAc,MAAM,CAAA;AAAA,QAC9C,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,gBAAA;AAAA,QACN,QAAA,EAAU,SAAA;AAAA,QACV,QAAA,EAAU,mCAAA;AAAA,QACV,aAAA,EAAe,MAAA;AAAA,QACf,OAAA,EAAS,0CAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,kBAAA,CAAmB,MAAM,CAAA;AAAA,QACnD,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,oBAAA;AAAA,QACN,QAAA,EAAU,UAAA;AAAA,QACV,QAAA,EAAU,4CAAA;AAAA,QACV,aAAA,EAAe,QAAA;AAAA,QACf,OAAA,EAAS,2CAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,mBAAA,CAAoB,MAAM,CAAA;AAAA,QACpD,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,oBAAA;AAAA,QACN,QAAA,EAAU,UAAA;AAAA,QACV,QAAA,EAAU,uBAAA;AAAA,QACV,aAAA,EAAe,MAAA;AAAA,QACf,OAAA,EAAS,2CAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,mBAAA,CAAoB,MAAM,CAAA;AAAA,QACpD,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,kBAAA;AAAA,QACN,QAAA,EAAU,UAAA;AAAA,QACV,QAAA,EAAU,qCAAA;AAAA,QACV,aAAA,EAAe,MAAA;AAAA,QACf,OAAA,EAAS,yCAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,iBAAA,CAAkB,MAAM,CAAA;AAAA,QAClD,WAAA,EAAa;AAAA;AACf;AACF,GACF;AAAA,EAEA,IAAA,EAAM;AAAA,IACJ,QAAA,EAAU,YAAA;AAAA,IACV,MAAA,EAAQ;AAAA,MACN,EAAE,MAAA,EAAQ,KAAA,EAAQ,MAAM,SAAA,CAAU,OAAA,EAAkB,SAAS,4CAAA,EAA6C;AAAA,MAC1G,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,SAAA,CAAU,GAAA,EAAmB,SAAS,wCAAA,EAAyC;AAAA,MACvG,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,SAAA,CAAU,KAAA,EAAmB,SAAS,0CAAA,EAA2C;AAAA,MACzG,EAAE,MAAA,EAAQ,KAAA,EAAQ,MAAM,SAAA,CAAU,KAAA,EAAmB,SAAS,0CAAA,EAA2C;AAAA,MACzG,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,SAAA,CAAU,IAAA,EAAmB,SAAS,yCAAA,EAA0C;AAAA,MACxG,EAAE,MAAA,EAAQ,KAAA,EAAQ,MAAM,SAAA,CAAU,OAAA,EAAmB,SAAS,4CAAA,EAA6C;AAAA,MAC3G,EAAE,MAAA,EAAQ,KAAA,EAAQ,MAAM,SAAA,CAAU,MAAA,EAAmB,SAAS,2CAAA,EAA4C;AAAA,MAC1G,EAAE,MAAA,EAAQ,KAAA,EAAQ,MAAM,SAAA,CAAU,WAAA,EAAmB,SAAS,gDAAA,EAAiD;AAAA,MAC/G,EAAE,MAAA,EAAQ,KAAA,EAAQ,MAAM,SAAA,CAAU,QAAA,EAAmB,SAAS,6CAAA,EAA8C;AAAA,MAC5G,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,SAAA,CAAU,eAAA,EAAmB,SAAS,oDAAA,EAAqD;AAAA,MACnH,EAAE,MAAA,EAAQ,KAAA,EAAQ,MAAM,SAAA,CAAU,aAAA,EAAmB,SAAS,kDAAA,EAAmD;AAAA,MACjH,EAAE,MAAA,EAAQ,KAAA,EAAQ,MAAM,SAAA,CAAU,gBAAA,EAAmB,SAAS,qDAAA,EAAsD;AAAA,MACpH,EAAE,MAAA,EAAQ,KAAA,EAAQ,MAAM,SAAA,CAAU,KAAA,EAAmB,SAAS,0CAAA;AAA2C;AAC3G,GACF;AAAA,EAEA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY,UAAA;AAAA,IACZ,KAAA,EAAO;AAAA,MACL;AAAA,QACE,EAAA,EAAI,aAAA;AAAA,QACJ,KAAA,EAAO,IAAA;AAAA,QACP,IAAA,EAAM,oBAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,KAAA,EAAO,eAAA;AAAA,QACP,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL;AAAA,QACE,EAAA,EAAI,IAAA;AAAA,QACJ,KAAA,EAAO,IAAA;AAAA,QACP,IAAA,EAAM,oBAAA;AAAA,QACN,MAAA,EAAQ,aAAA;AAAA,QACR,KAAA,EAAO;AAAA;AACT;AACF,GACF;AAAA,EAEA,WAAA,EAAa;AACf","file":"index.js","sourcesContent":["import { defineFlags } from '@kb-labs/sdk';\n\nexport const qaRunFlags = defineFlags({\n tasks: {\n type: 'string',\n description: 'Comma-separated tasks to run (default: build,lint,type-check,test)',\n },\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: true,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaRunFlags = typeof qaRunFlags.infer;\n\nexport const qaCheckFlags = defineFlags({\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: true,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaCheckFlags = typeof qaCheckFlags.infer;\n\nexport const qaStatsFlags = defineFlags({\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: true,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaStatsFlags = typeof qaStatsFlags.infer;\n\nexport const qaGateFlags = defineFlags({\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaGateFlags = typeof qaGateFlags.infer;\n\nexport const qaHistoryFlags = defineFlags({\n limit: {\n type: 'number',\n description: 'Max entries to show',\n default: 20,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaHistoryFlags = typeof qaHistoryFlags.infer;\n\nexport const qaTrendsFlags = defineFlags({\n window: {\n type: 'number',\n description: 'Number of history entries to analyze',\n default: 10,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaTrendsFlags = typeof qaTrendsFlags.infer;\n\nexport const qaRegressionsFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaRegressionsFlags = typeof qaRegressionsFlags.infer;\n\nexport const baselineUpdateFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type BaselineUpdateFlags = typeof baselineUpdateFlags.infer;\n\nexport const baselineStatusFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type BaselineStatusFlags = typeof baselineStatusFlags.infer;\n\nexport const baselineDiffFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type BaselineDiffFlags = typeof baselineDiffFlags.infer;\n","import {\n combinePermissions,\n kbPlatformPreset,\n defineCommandFlags,\n} from '@kb-labs/sdk';\nimport {\n qaRunFlags,\n qaCheckFlags,\n qaStatsFlags,\n qaGateFlags,\n qaHistoryFlags,\n qaTrendsFlags,\n qaRegressionsFlags,\n baselineUpdateFlags,\n baselineStatusFlags,\n baselineDiffFlags,\n} from './cli/commands/flags.js';\nimport { QA_BASE_PATH, QA_ROUTES } from '@kb-labs/qa-contracts';\n\nconst pluginPermissions = combinePermissions()\n .with(kbPlatformPreset)\n .withFs({\n mode: 'readWrite',\n allow: ['**'],\n })\n .withShell({\n allow: ['kb-devkit', 'git'],\n })\n .withPlatform({\n analytics: true,\n })\n .withQuotas({\n timeoutMs: 600_000,\n memoryMb: 512,\n })\n .build();\n\nexport const manifest = {\n schema: 'kb.plugin/3',\n id: '@kb-labs/qa',\n version: '0.1.0',\n\n configSection: 'qa',\n\n display: {\n name: 'QA Plugin',\n description: 'Smart wrapper around kb-devkit — history, trends, baseline diffing, and health UI',\n tags: ['qa', 'quality', 'baseline', 'regression', 'devkit'],\n },\n\n platform: {\n requires: [],\n optional: ['cache', 'analytics', 'logger'],\n },\n\n cli: {\n groupMeta: [\n { path: 'qa', describe: 'Quality assurance powered by kb-devkit' },\n { path: 'qa baseline', describe: 'Baseline management' },\n ],\n commands: [\n {\n path: 'qa run',\n category: 'Run',\n describe: 'Run devkit tasks and record results',\n operationType: 'execute' as const,\n handler: './cli/commands/qa-run.js#default',\n flags: defineCommandFlags(qaRunFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa check',\n category: 'Run',\n describe: 'Run devkit structural checks',\n operationType: 'analyze' as const,\n handler: './cli/commands/qa-check.js#default',\n flags: defineCommandFlags(qaCheckFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa stats',\n category: 'Run',\n describe: 'Show devkit health score and category breakdown',\n operationType: 'read' as const,\n handler: './cli/commands/qa-stats.js#default',\n flags: defineCommandFlags(qaStatsFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa gate',\n category: 'Run',\n describe: 'Run pre-commit gate check (exits 1 if violations found)',\n operationType: 'analyze' as const,\n handler: './cli/commands/qa-gate.js#default',\n flags: defineCommandFlags(qaGateFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa history',\n category: 'History',\n describe: 'Show QA run history',\n operationType: 'read' as const,\n handler: './cli/commands/qa-history.js#default',\n flags: defineCommandFlags(qaHistoryFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa trends',\n category: 'History',\n describe: 'Show QA quality trends over time',\n operationType: 'read' as const,\n handler: './cli/commands/qa-trends.js#default',\n flags: defineCommandFlags(qaTrendsFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa regressions',\n category: 'History',\n describe: 'Detect regressions since last run',\n operationType: 'read' as const,\n handler: './cli/commands/qa-regressions.js#default',\n flags: defineCommandFlags(qaRegressionsFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa baseline update',\n category: 'Baseline',\n describe: 'Run check + stats and save as new baseline',\n operationType: 'mutate' as const,\n handler: './cli/commands/baseline-update.js#default',\n flags: defineCommandFlags(baselineUpdateFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa baseline status',\n category: 'Baseline',\n describe: 'Show current baseline',\n operationType: 'read' as const,\n handler: './cli/commands/baseline-status.js#default',\n flags: defineCommandFlags(baselineStatusFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa baseline diff',\n category: 'Baseline',\n describe: 'Diff current state against baseline',\n operationType: 'read' as const,\n handler: './cli/commands/baseline-diff.js#default',\n flags: defineCommandFlags(baselineDiffFlags.schema),\n permissions: pluginPermissions,\n },\n ],\n },\n\n rest: {\n basePath: QA_BASE_PATH,\n routes: [\n { method: 'GET', path: QA_ROUTES.SUMMARY, handler: './rest/handlers/summary-handler.js#default' },\n { method: 'POST', path: QA_ROUTES.RUN, handler: './rest/handlers/run-handler.js#default' },\n { method: 'POST', path: QA_ROUTES.CHECK, handler: './rest/handlers/check-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.STATS, handler: './rest/handlers/stats-handler.js#default' },\n { method: 'POST', path: QA_ROUTES.GATE, handler: './rest/handlers/gate-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.HISTORY, handler: './rest/handlers/history-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.TRENDS, handler: './rest/handlers/trends-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.REGRESSIONS, handler: './rest/handlers/regressions-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.BASELINE, handler: './rest/handlers/baseline-handler.js#default' },\n { method: 'POST', path: QA_ROUTES.BASELINE_UPDATE, handler: './rest/handlers/baseline-update-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.BASELINE_DIFF, handler: './rest/handlers/baseline-diff-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.PACKAGE_TIMELINE, handler: './rest/handlers/package-timeline-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.TASKS, handler: './rest/handlers/tasks-handler.js#default' },\n ],\n },\n\n studio: {\n version: 2 as const,\n remoteName: 'qaPlugin',\n pages: [\n {\n id: 'qa.overview',\n title: 'QA',\n icon: 'ExperimentOutlined',\n route: '/p/qa',\n entry: './QADashboard',\n order: 1,\n },\n ],\n menus: [\n {\n id: 'qa',\n label: 'QA',\n icon: 'ExperimentOutlined',\n target: 'qa.overview',\n order: 50,\n },\n ],\n },\n\n permissions: pluginPermissions,\n};\n\nexport default manifest;\n"]}
1
+ {"version":3,"sources":["../src/cli/commands/flags.ts","../src/manifest.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { defineFlags } from '@kb-labs/sdk';\n\nexport const qaRunFlags = defineFlags({\n tasks: {\n type: 'string',\n description: 'Comma-separated tasks to run (default: build,lint,type-check,test)',\n },\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: true,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaRunFlags = typeof qaRunFlags.infer;\n\nexport const qaCheckFlags = defineFlags({\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: true,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaCheckFlags = typeof qaCheckFlags.infer;\n\nexport const qaStatsFlags = defineFlags({\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: true,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaStatsFlags = typeof qaStatsFlags.infer;\n\nexport const qaGateFlags = defineFlags({\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaGateFlags = typeof qaGateFlags.infer;\n\nexport const qaHistoryFlags = defineFlags({\n limit: {\n type: 'number',\n description: 'Max entries to show',\n default: 20,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaHistoryFlags = typeof qaHistoryFlags.infer;\n\nexport const qaTrendsFlags = defineFlags({\n window: {\n type: 'number',\n description: 'Number of history entries to analyze',\n default: 10,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaTrendsFlags = typeof qaTrendsFlags.infer;\n\nexport const qaE2eFlakyFlags = defineFlags({\n agent: {\n type: 'boolean',\n description: 'Emit compact machine-readable agent JSON (alias for --json)',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n case: {\n type: 'string',\n description: 'Drill down into one case: \"<suite>/<spec>#<testId>\" (from the overview\\'s \"top\" list)',\n },\n window: {\n type: 'number',\n description: 'Number of e2e-flaky history entries (runs) to analyze',\n default: 10,\n },\n sync: {\n type: 'boolean',\n description: 'Fetch the latest flaky history from the \"ci-data\" branch before analyzing',\n default: false,\n },\n ingest: {\n type: 'string',\n description: 'CI-only: directory of per-shard flaky-report.json files to merge and save as a new snapshot',\n },\n});\nexport type QaE2eFlakyFlags = typeof qaE2eFlakyFlags.infer;\n\nexport const qaRegressionsFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaRegressionsFlags = typeof qaRegressionsFlags.infer;\n\nexport const baselineUpdateFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type BaselineUpdateFlags = typeof baselineUpdateFlags.infer;\n\nexport const baselineStatusFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type BaselineStatusFlags = typeof baselineStatusFlags.infer;\n\nexport const baselineDiffFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type BaselineDiffFlags = typeof baselineDiffFlags.infer;\n","import {\n combinePermissions,\n kbPlatformPreset,\n defineCommandFlags,\n} from '@kb-labs/sdk';\nimport {\n qaRunFlags,\n qaCheckFlags,\n qaStatsFlags,\n qaGateFlags,\n qaHistoryFlags,\n qaTrendsFlags,\n qaE2eFlakyFlags,\n qaRegressionsFlags,\n baselineUpdateFlags,\n baselineStatusFlags,\n baselineDiffFlags,\n} from './cli/commands/flags.js';\nimport { QA_BASE_PATH, QA_ROUTES } from '@kb-labs/qa-contracts';\n\nconst pluginPermissions = combinePermissions()\n .with(kbPlatformPreset)\n .withFs({\n mode: 'readWrite',\n allow: ['**'],\n })\n .withShell({\n allow: ['kb-devkit', 'git'],\n })\n .withPlatform({\n analytics: true,\n })\n .withQuotas({\n timeoutMs: 600_000,\n memoryMb: 512,\n })\n .build();\n\nexport const manifest = {\n schema: 'kb.plugin/3',\n id: '@kb-labs/qa',\n version: '0.1.0',\n\n configSection: 'qa',\n\n display: {\n name: 'QA Plugin',\n description: 'Smart wrapper around kb-devkit — history, trends, baseline diffing, and health UI',\n tags: ['qa', 'quality', 'baseline', 'regression', 'devkit'],\n },\n\n platform: {\n requires: [],\n optional: ['cache', 'analytics', 'logger'],\n },\n\n cli: {\n groupMeta: [\n { path: 'qa', describe: 'Quality assurance powered by kb-devkit' },\n { path: 'qa baseline', describe: 'Baseline management' },\n ],\n commands: [\n {\n path: 'qa run',\n category: 'Run',\n describe: 'Run devkit tasks and record results',\n operationType: 'execute' as const,\n handler: './cli/commands/qa-run.js#default',\n flags: defineCommandFlags(qaRunFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa check',\n category: 'Run',\n describe: 'Run devkit structural checks',\n operationType: 'analyze' as const,\n handler: './cli/commands/qa-check.js#default',\n flags: defineCommandFlags(qaCheckFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa stats',\n category: 'Run',\n describe: 'Show devkit health score and category breakdown',\n operationType: 'read' as const,\n handler: './cli/commands/qa-stats.js#default',\n flags: defineCommandFlags(qaStatsFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa gate',\n category: 'Run',\n describe: 'Run pre-commit gate check (exits 1 if violations found)',\n operationType: 'analyze' as const,\n handler: './cli/commands/qa-gate.js#default',\n flags: defineCommandFlags(qaGateFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa history',\n category: 'History',\n describe: 'Show QA run history',\n operationType: 'read' as const,\n handler: './cli/commands/qa-history.js#default',\n flags: defineCommandFlags(qaHistoryFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa trends',\n category: 'History',\n describe: 'Show QA quality trends over time',\n operationType: 'read' as const,\n handler: './cli/commands/qa-trends.js#default',\n flags: defineCommandFlags(qaTrendsFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa e2e-flaky',\n category: 'History',\n describe: 'Track flaky e2e cases across CI runs (agent-first overview + drill-down)',\n operationType: 'read' as const,\n handler: './cli/commands/qa-e2e-flaky.js#default',\n flags: defineCommandFlags(qaE2eFlakyFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa regressions',\n category: 'History',\n describe: 'Detect regressions since last run',\n operationType: 'read' as const,\n handler: './cli/commands/qa-regressions.js#default',\n flags: defineCommandFlags(qaRegressionsFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa baseline update',\n category: 'Baseline',\n describe: 'Run check + stats and save as new baseline',\n operationType: 'mutate' as const,\n handler: './cli/commands/baseline-update.js#default',\n flags: defineCommandFlags(baselineUpdateFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa baseline status',\n category: 'Baseline',\n describe: 'Show current baseline',\n operationType: 'read' as const,\n handler: './cli/commands/baseline-status.js#default',\n flags: defineCommandFlags(baselineStatusFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa baseline diff',\n category: 'Baseline',\n describe: 'Diff current state against baseline',\n operationType: 'read' as const,\n handler: './cli/commands/baseline-diff.js#default',\n flags: defineCommandFlags(baselineDiffFlags.schema),\n permissions: pluginPermissions,\n },\n ],\n },\n\n rest: {\n basePath: QA_BASE_PATH,\n routes: [\n { method: 'GET', path: QA_ROUTES.SUMMARY, handler: './rest/handlers/summary-handler.js#default' },\n { method: 'POST', path: QA_ROUTES.RUN, handler: './rest/handlers/run-handler.js#default' },\n { method: 'POST', path: QA_ROUTES.CHECK, handler: './rest/handlers/check-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.STATS, handler: './rest/handlers/stats-handler.js#default' },\n { method: 'POST', path: QA_ROUTES.GATE, handler: './rest/handlers/gate-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.HISTORY, handler: './rest/handlers/history-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.TRENDS, handler: './rest/handlers/trends-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.REGRESSIONS, handler: './rest/handlers/regressions-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.BASELINE, handler: './rest/handlers/baseline-handler.js#default' },\n { method: 'POST', path: QA_ROUTES.BASELINE_UPDATE, handler: './rest/handlers/baseline-update-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.BASELINE_DIFF, handler: './rest/handlers/baseline-diff-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.PACKAGE_TIMELINE, handler: './rest/handlers/package-timeline-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.TASKS, handler: './rest/handlers/tasks-handler.js#default' },\n ],\n },\n\n studio: {\n version: 2 as const,\n remoteName: 'qaPlugin',\n pages: [\n {\n id: 'qa.overview',\n title: 'QA',\n icon: 'ExperimentOutlined',\n route: '/p/qa',\n entry: './QADashboard',\n order: 1,\n },\n ],\n menus: [\n {\n id: 'qa',\n label: 'QA',\n icon: 'ExperimentOutlined',\n target: 'qa.overview',\n order: 50,\n },\n ],\n },\n\n permissions: pluginPermissions,\n};\n\nexport default manifest;\n"]}
package/dist/manifest.js CHANGED
@@ -78,6 +78,36 @@ var qaTrendsFlags = defineFlags({
78
78
  default: false
79
79
  }
80
80
  });
81
+ var qaE2eFlakyFlags = defineFlags({
82
+ agent: {
83
+ type: "boolean",
84
+ description: "Emit compact machine-readable agent JSON (alias for --json)",
85
+ default: false
86
+ },
87
+ json: {
88
+ type: "boolean",
89
+ description: "Output JSON",
90
+ default: false
91
+ },
92
+ case: {
93
+ type: "string",
94
+ description: `Drill down into one case: "<suite>/<spec>#<testId>" (from the overview's "top" list)`
95
+ },
96
+ window: {
97
+ type: "number",
98
+ description: "Number of e2e-flaky history entries (runs) to analyze",
99
+ default: 10
100
+ },
101
+ sync: {
102
+ type: "boolean",
103
+ description: 'Fetch the latest flaky history from the "ci-data" branch before analyzing',
104
+ default: false
105
+ },
106
+ ingest: {
107
+ type: "string",
108
+ description: "CI-only: directory of per-shard flaky-report.json files to merge and save as a new snapshot"
109
+ }
110
+ });
81
111
  var qaRegressionsFlags = defineFlags({
82
112
  json: {
83
113
  type: "boolean",
@@ -191,6 +221,15 @@ var manifest = {
191
221
  flags: defineCommandFlags(qaTrendsFlags.schema),
192
222
  permissions: pluginPermissions
193
223
  },
224
+ {
225
+ path: "qa e2e-flaky",
226
+ category: "History",
227
+ describe: "Track flaky e2e cases across CI runs (agent-first overview + drill-down)",
228
+ operationType: "read",
229
+ handler: "./cli/commands/qa-e2e-flaky.js#default",
230
+ flags: defineCommandFlags(qaE2eFlakyFlags.schema),
231
+ permissions: pluginPermissions
232
+ },
194
233
  {
195
234
  path: "qa regressions",
196
235
  category: "History",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/commands/flags.ts","../src/manifest.ts"],"names":[],"mappings":"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","file":"manifest.js","sourcesContent":["import { defineFlags } from '@kb-labs/sdk';\n\nexport const qaRunFlags = defineFlags({\n tasks: {\n type: 'string',\n description: 'Comma-separated tasks to run (default: build,lint,type-check,test)',\n },\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: true,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaRunFlags = typeof qaRunFlags.infer;\n\nexport const qaCheckFlags = defineFlags({\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: true,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaCheckFlags = typeof qaCheckFlags.infer;\n\nexport const qaStatsFlags = defineFlags({\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: true,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaStatsFlags = typeof qaStatsFlags.infer;\n\nexport const qaGateFlags = defineFlags({\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaGateFlags = typeof qaGateFlags.infer;\n\nexport const qaHistoryFlags = defineFlags({\n limit: {\n type: 'number',\n description: 'Max entries to show',\n default: 20,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaHistoryFlags = typeof qaHistoryFlags.infer;\n\nexport const qaTrendsFlags = defineFlags({\n window: {\n type: 'number',\n description: 'Number of history entries to analyze',\n default: 10,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaTrendsFlags = typeof qaTrendsFlags.infer;\n\nexport const qaRegressionsFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaRegressionsFlags = typeof qaRegressionsFlags.infer;\n\nexport const baselineUpdateFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type BaselineUpdateFlags = typeof baselineUpdateFlags.infer;\n\nexport const baselineStatusFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type BaselineStatusFlags = typeof baselineStatusFlags.infer;\n\nexport const baselineDiffFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type BaselineDiffFlags = typeof baselineDiffFlags.infer;\n","import {\n combinePermissions,\n kbPlatformPreset,\n defineCommandFlags,\n} from '@kb-labs/sdk';\nimport {\n qaRunFlags,\n qaCheckFlags,\n qaStatsFlags,\n qaGateFlags,\n qaHistoryFlags,\n qaTrendsFlags,\n qaRegressionsFlags,\n baselineUpdateFlags,\n baselineStatusFlags,\n baselineDiffFlags,\n} from './cli/commands/flags.js';\nimport { QA_BASE_PATH, QA_ROUTES } from '@kb-labs/qa-contracts';\n\nconst pluginPermissions = combinePermissions()\n .with(kbPlatformPreset)\n .withFs({\n mode: 'readWrite',\n allow: ['**'],\n })\n .withShell({\n allow: ['kb-devkit', 'git'],\n })\n .withPlatform({\n analytics: true,\n })\n .withQuotas({\n timeoutMs: 600_000,\n memoryMb: 512,\n })\n .build();\n\nexport const manifest = {\n schema: 'kb.plugin/3',\n id: '@kb-labs/qa',\n version: '0.1.0',\n\n configSection: 'qa',\n\n display: {\n name: 'QA Plugin',\n description: 'Smart wrapper around kb-devkit — history, trends, baseline diffing, and health UI',\n tags: ['qa', 'quality', 'baseline', 'regression', 'devkit'],\n },\n\n platform: {\n requires: [],\n optional: ['cache', 'analytics', 'logger'],\n },\n\n cli: {\n groupMeta: [\n { path: 'qa', describe: 'Quality assurance powered by kb-devkit' },\n { path: 'qa baseline', describe: 'Baseline management' },\n ],\n commands: [\n {\n path: 'qa run',\n category: 'Run',\n describe: 'Run devkit tasks and record results',\n operationType: 'execute' as const,\n handler: './cli/commands/qa-run.js#default',\n flags: defineCommandFlags(qaRunFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa check',\n category: 'Run',\n describe: 'Run devkit structural checks',\n operationType: 'analyze' as const,\n handler: './cli/commands/qa-check.js#default',\n flags: defineCommandFlags(qaCheckFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa stats',\n category: 'Run',\n describe: 'Show devkit health score and category breakdown',\n operationType: 'read' as const,\n handler: './cli/commands/qa-stats.js#default',\n flags: defineCommandFlags(qaStatsFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa gate',\n category: 'Run',\n describe: 'Run pre-commit gate check (exits 1 if violations found)',\n operationType: 'analyze' as const,\n handler: './cli/commands/qa-gate.js#default',\n flags: defineCommandFlags(qaGateFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa history',\n category: 'History',\n describe: 'Show QA run history',\n operationType: 'read' as const,\n handler: './cli/commands/qa-history.js#default',\n flags: defineCommandFlags(qaHistoryFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa trends',\n category: 'History',\n describe: 'Show QA quality trends over time',\n operationType: 'read' as const,\n handler: './cli/commands/qa-trends.js#default',\n flags: defineCommandFlags(qaTrendsFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa regressions',\n category: 'History',\n describe: 'Detect regressions since last run',\n operationType: 'read' as const,\n handler: './cli/commands/qa-regressions.js#default',\n flags: defineCommandFlags(qaRegressionsFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa baseline update',\n category: 'Baseline',\n describe: 'Run check + stats and save as new baseline',\n operationType: 'mutate' as const,\n handler: './cli/commands/baseline-update.js#default',\n flags: defineCommandFlags(baselineUpdateFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa baseline status',\n category: 'Baseline',\n describe: 'Show current baseline',\n operationType: 'read' as const,\n handler: './cli/commands/baseline-status.js#default',\n flags: defineCommandFlags(baselineStatusFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa baseline diff',\n category: 'Baseline',\n describe: 'Diff current state against baseline',\n operationType: 'read' as const,\n handler: './cli/commands/baseline-diff.js#default',\n flags: defineCommandFlags(baselineDiffFlags.schema),\n permissions: pluginPermissions,\n },\n ],\n },\n\n rest: {\n basePath: QA_BASE_PATH,\n routes: [\n { method: 'GET', path: QA_ROUTES.SUMMARY, handler: './rest/handlers/summary-handler.js#default' },\n { method: 'POST', path: QA_ROUTES.RUN, handler: './rest/handlers/run-handler.js#default' },\n { method: 'POST', path: QA_ROUTES.CHECK, handler: './rest/handlers/check-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.STATS, handler: './rest/handlers/stats-handler.js#default' },\n { method: 'POST', path: QA_ROUTES.GATE, handler: './rest/handlers/gate-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.HISTORY, handler: './rest/handlers/history-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.TRENDS, handler: './rest/handlers/trends-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.REGRESSIONS, handler: './rest/handlers/regressions-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.BASELINE, handler: './rest/handlers/baseline-handler.js#default' },\n { method: 'POST', path: QA_ROUTES.BASELINE_UPDATE, handler: './rest/handlers/baseline-update-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.BASELINE_DIFF, handler: './rest/handlers/baseline-diff-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.PACKAGE_TIMELINE, handler: './rest/handlers/package-timeline-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.TASKS, handler: './rest/handlers/tasks-handler.js#default' },\n ],\n },\n\n studio: {\n version: 2 as const,\n remoteName: 'qaPlugin',\n pages: [\n {\n id: 'qa.overview',\n title: 'QA',\n icon: 'ExperimentOutlined',\n route: '/p/qa',\n entry: './QADashboard',\n order: 1,\n },\n ],\n menus: [\n {\n id: 'qa',\n label: 'QA',\n icon: 'ExperimentOutlined',\n target: 'qa.overview',\n order: 50,\n },\n ],\n },\n\n permissions: pluginPermissions,\n};\n\nexport default manifest;\n"]}
1
+ {"version":3,"sources":["../src/cli/commands/flags.ts","../src/manifest.ts"],"names":[],"mappings":";;;;AAEO,IAAM,aAAa,WAAA,CAAY;AAAA,EACpC,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,0BAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAGM,IAAM,eAAe,WAAA,CAAY;AAAA,EACtC,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,0BAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAGM,IAAM,eAAe,WAAA,CAAY;AAAA,EACtC,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,0BAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAGM,IAAM,cAAc,WAAA,CAAY;AAAA,EACrC,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,0BAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAGM,IAAM,iBAAiB,WAAA,CAAY;AAAA,EACxC,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,qBAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAGM,IAAM,gBAAgB,WAAA,CAAY;AAAA,EACvC,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,sCAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAGM,IAAM,kBAAkB,WAAA,CAAY;AAAA,EACzC,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,6DAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,CAAA,oFAAA;AAAA,GACf;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,uDAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,2EAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa;AAAA;AAEjB,CAAC,CAAA;AAGM,IAAM,qBAAqB,WAAA,CAAY;AAAA,EAC5C,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAGM,IAAM,sBAAsB,WAAA,CAAY;AAAA,EAC7C,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAGM,IAAM,sBAAsB,WAAA,CAAY;AAAA,EAC7C,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAGM,IAAM,oBAAoB,WAAA,CAAY;AAAA,EAC3C,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;ACvID,IAAM,oBAAoB,kBAAA,EAAmB,CAC1C,IAAA,CAAK,gBAAgB,EACrB,MAAA,CAAO;AAAA,EACN,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO,CAAC,IAAI;AACd,CAAC,EACA,SAAA,CAAU;AAAA,EACT,KAAA,EAAO,CAAC,WAAA,EAAa,KAAK;AAC5B,CAAC,EACA,YAAA,CAAa;AAAA,EACZ,SAAA,EAAW;AACb,CAAC,EACA,UAAA,CAAW;AAAA,EACV,SAAA,EAAW,GAAA;AAAA,EACX,QAAA,EAAU;AACZ,CAAC,EACA,KAAA,EAAM;AAEF,IAAM,QAAA,GAAW;AAAA,EACtB,MAAA,EAAQ,aAAA;AAAA,EACR,EAAA,EAAI,aAAA;AAAA,EACJ,OAAA,EAAS,OAAA;AAAA,EAET,aAAA,EAAe,IAAA;AAAA,EAEf,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa,wFAAA;AAAA,IACb,MAAM,CAAC,IAAA,EAAM,SAAA,EAAW,UAAA,EAAY,cAAc,QAAQ;AAAA,GAC5D;AAAA,EAEA,QAAA,EAAU;AAAA,IACR,UAAU,EAAC;AAAA,IACX,QAAA,EAAU,CAAC,OAAA,EAAS,WAAA,EAAa,QAAQ;AAAA,GAC3C;AAAA,EAEA,GAAA,EAAK;AAAA,IACH,SAAA,EAAW;AAAA,MACT,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,wCAAA,EAAyC;AAAA,MACjE,EAAE,IAAA,EAAM,aAAA,EAAe,QAAA,EAAU,qBAAA;AAAsB,KACzD;AAAA,IACA,QAAA,EAAU;AAAA,MACR;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,QAAA,EAAU,KAAA;AAAA,QACV,QAAA,EAAU,qCAAA;AAAA,QACV,aAAA,EAAe,SAAA;AAAA,QACf,OAAA,EAAS,kCAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,UAAA,CAAW,MAAM,CAAA;AAAA,QAC3C,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,QAAA,EAAU,KAAA;AAAA,QACV,QAAA,EAAU,8BAAA;AAAA,QACV,aAAA,EAAe,SAAA;AAAA,QACf,OAAA,EAAS,oCAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,YAAA,CAAa,MAAM,CAAA;AAAA,QAC7C,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,QAAA,EAAU,KAAA;AAAA,QACV,QAAA,EAAU,iDAAA;AAAA,QACV,aAAA,EAAe,MAAA;AAAA,QACf,OAAA,EAAS,oCAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,YAAA,CAAa,MAAM,CAAA;AAAA,QAC7C,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,SAAA;AAAA,QACN,QAAA,EAAU,KAAA;AAAA,QACV,QAAA,EAAU,yDAAA;AAAA,QACV,aAAA,EAAe,SAAA;AAAA,QACf,OAAA,EAAS,mCAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,WAAA,CAAY,MAAM,CAAA;AAAA,QAC5C,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,YAAA;AAAA,QACN,QAAA,EAAU,SAAA;AAAA,QACV,QAAA,EAAU,qBAAA;AAAA,QACV,aAAA,EAAe,MAAA;AAAA,QACf,OAAA,EAAS,sCAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,cAAA,CAAe,MAAM,CAAA;AAAA,QAC/C,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,WAAA;AAAA,QACN,QAAA,EAAU,SAAA;AAAA,QACV,QAAA,EAAU,kCAAA;AAAA,QACV,aAAA,EAAe,MAAA;AAAA,QACf,OAAA,EAAS,qCAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,aAAA,CAAc,MAAM,CAAA;AAAA,QAC9C,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,cAAA;AAAA,QACN,QAAA,EAAU,SAAA;AAAA,QACV,QAAA,EAAU,0EAAA;AAAA,QACV,aAAA,EAAe,MAAA;AAAA,QACf,OAAA,EAAS,wCAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,eAAA,CAAgB,MAAM,CAAA;AAAA,QAChD,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,gBAAA;AAAA,QACN,QAAA,EAAU,SAAA;AAAA,QACV,QAAA,EAAU,mCAAA;AAAA,QACV,aAAA,EAAe,MAAA;AAAA,QACf,OAAA,EAAS,0CAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,kBAAA,CAAmB,MAAM,CAAA;AAAA,QACnD,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,oBAAA;AAAA,QACN,QAAA,EAAU,UAAA;AAAA,QACV,QAAA,EAAU,4CAAA;AAAA,QACV,aAAA,EAAe,QAAA;AAAA,QACf,OAAA,EAAS,2CAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,mBAAA,CAAoB,MAAM,CAAA;AAAA,QACpD,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,oBAAA;AAAA,QACN,QAAA,EAAU,UAAA;AAAA,QACV,QAAA,EAAU,uBAAA;AAAA,QACV,aAAA,EAAe,MAAA;AAAA,QACf,OAAA,EAAS,2CAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,mBAAA,CAAoB,MAAM,CAAA;AAAA,QACpD,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,kBAAA;AAAA,QACN,QAAA,EAAU,UAAA;AAAA,QACV,QAAA,EAAU,qCAAA;AAAA,QACV,aAAA,EAAe,MAAA;AAAA,QACf,OAAA,EAAS,yCAAA;AAAA,QACT,KAAA,EAAO,kBAAA,CAAmB,iBAAA,CAAkB,MAAM,CAAA;AAAA,QAClD,WAAA,EAAa;AAAA;AACf;AACF,GACF;AAAA,EAEA,IAAA,EAAM;AAAA,IACJ,QAAA,EAAU,YAAA;AAAA,IACV,MAAA,EAAQ;AAAA,MACN,EAAE,MAAA,EAAQ,KAAA,EAAQ,MAAM,SAAA,CAAU,OAAA,EAAkB,SAAS,4CAAA,EAA6C;AAAA,MAC1G,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,SAAA,CAAU,GAAA,EAAmB,SAAS,wCAAA,EAAyC;AAAA,MACvG,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,SAAA,CAAU,KAAA,EAAmB,SAAS,0CAAA,EAA2C;AAAA,MACzG,EAAE,MAAA,EAAQ,KAAA,EAAQ,MAAM,SAAA,CAAU,KAAA,EAAmB,SAAS,0CAAA,EAA2C;AAAA,MACzG,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,SAAA,CAAU,IAAA,EAAmB,SAAS,yCAAA,EAA0C;AAAA,MACxG,EAAE,MAAA,EAAQ,KAAA,EAAQ,MAAM,SAAA,CAAU,OAAA,EAAmB,SAAS,4CAAA,EAA6C;AAAA,MAC3G,EAAE,MAAA,EAAQ,KAAA,EAAQ,MAAM,SAAA,CAAU,MAAA,EAAmB,SAAS,2CAAA,EAA4C;AAAA,MAC1G,EAAE,MAAA,EAAQ,KAAA,EAAQ,MAAM,SAAA,CAAU,WAAA,EAAmB,SAAS,gDAAA,EAAiD;AAAA,MAC/G,EAAE,MAAA,EAAQ,KAAA,EAAQ,MAAM,SAAA,CAAU,QAAA,EAAmB,SAAS,6CAAA,EAA8C;AAAA,MAC5G,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,SAAA,CAAU,eAAA,EAAmB,SAAS,oDAAA,EAAqD;AAAA,MACnH,EAAE,MAAA,EAAQ,KAAA,EAAQ,MAAM,SAAA,CAAU,aAAA,EAAmB,SAAS,kDAAA,EAAmD;AAAA,MACjH,EAAE,MAAA,EAAQ,KAAA,EAAQ,MAAM,SAAA,CAAU,gBAAA,EAAmB,SAAS,qDAAA,EAAsD;AAAA,MACpH,EAAE,MAAA,EAAQ,KAAA,EAAQ,MAAM,SAAA,CAAU,KAAA,EAAmB,SAAS,0CAAA;AAA2C;AAC3G,GACF;AAAA,EAEA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY,UAAA;AAAA,IACZ,KAAA,EAAO;AAAA,MACL;AAAA,QACE,EAAA,EAAI,aAAA;AAAA,QACJ,KAAA,EAAO,IAAA;AAAA,QACP,IAAA,EAAM,oBAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,KAAA,EAAO,eAAA;AAAA,QACP,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL;AAAA,QACE,EAAA,EAAI,IAAA;AAAA,QACJ,KAAA,EAAO,IAAA;AAAA,QACP,IAAA,EAAM,oBAAA;AAAA,QACN,MAAA,EAAQ,aAAA;AAAA,QACR,KAAA,EAAO;AAAA;AACT;AACF,GACF;AAAA,EAEA,WAAA,EAAa;AACf;AAEA,IAAO,gBAAA,GAAQ","file":"manifest.js","sourcesContent":["import { defineFlags } from '@kb-labs/sdk';\n\nexport const qaRunFlags = defineFlags({\n tasks: {\n type: 'string',\n description: 'Comma-separated tasks to run (default: build,lint,type-check,test)',\n },\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: true,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaRunFlags = typeof qaRunFlags.infer;\n\nexport const qaCheckFlags = defineFlags({\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: true,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaCheckFlags = typeof qaCheckFlags.infer;\n\nexport const qaStatsFlags = defineFlags({\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: true,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaStatsFlags = typeof qaStatsFlags.infer;\n\nexport const qaGateFlags = defineFlags({\n save: {\n type: 'boolean',\n description: 'Save snapshot to history',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaGateFlags = typeof qaGateFlags.infer;\n\nexport const qaHistoryFlags = defineFlags({\n limit: {\n type: 'number',\n description: 'Max entries to show',\n default: 20,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaHistoryFlags = typeof qaHistoryFlags.infer;\n\nexport const qaTrendsFlags = defineFlags({\n window: {\n type: 'number',\n description: 'Number of history entries to analyze',\n default: 10,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaTrendsFlags = typeof qaTrendsFlags.infer;\n\nexport const qaE2eFlakyFlags = defineFlags({\n agent: {\n type: 'boolean',\n description: 'Emit compact machine-readable agent JSON (alias for --json)',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n case: {\n type: 'string',\n description: 'Drill down into one case: \"<suite>/<spec>#<testId>\" (from the overview\\'s \"top\" list)',\n },\n window: {\n type: 'number',\n description: 'Number of e2e-flaky history entries (runs) to analyze',\n default: 10,\n },\n sync: {\n type: 'boolean',\n description: 'Fetch the latest flaky history from the \"ci-data\" branch before analyzing',\n default: false,\n },\n ingest: {\n type: 'string',\n description: 'CI-only: directory of per-shard flaky-report.json files to merge and save as a new snapshot',\n },\n});\nexport type QaE2eFlakyFlags = typeof qaE2eFlakyFlags.infer;\n\nexport const qaRegressionsFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type QaRegressionsFlags = typeof qaRegressionsFlags.infer;\n\nexport const baselineUpdateFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type BaselineUpdateFlags = typeof baselineUpdateFlags.infer;\n\nexport const baselineStatusFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type BaselineStatusFlags = typeof baselineStatusFlags.infer;\n\nexport const baselineDiffFlags = defineFlags({\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\nexport type BaselineDiffFlags = typeof baselineDiffFlags.infer;\n","import {\n combinePermissions,\n kbPlatformPreset,\n defineCommandFlags,\n} from '@kb-labs/sdk';\nimport {\n qaRunFlags,\n qaCheckFlags,\n qaStatsFlags,\n qaGateFlags,\n qaHistoryFlags,\n qaTrendsFlags,\n qaE2eFlakyFlags,\n qaRegressionsFlags,\n baselineUpdateFlags,\n baselineStatusFlags,\n baselineDiffFlags,\n} from './cli/commands/flags.js';\nimport { QA_BASE_PATH, QA_ROUTES } from '@kb-labs/qa-contracts';\n\nconst pluginPermissions = combinePermissions()\n .with(kbPlatformPreset)\n .withFs({\n mode: 'readWrite',\n allow: ['**'],\n })\n .withShell({\n allow: ['kb-devkit', 'git'],\n })\n .withPlatform({\n analytics: true,\n })\n .withQuotas({\n timeoutMs: 600_000,\n memoryMb: 512,\n })\n .build();\n\nexport const manifest = {\n schema: 'kb.plugin/3',\n id: '@kb-labs/qa',\n version: '0.1.0',\n\n configSection: 'qa',\n\n display: {\n name: 'QA Plugin',\n description: 'Smart wrapper around kb-devkit — history, trends, baseline diffing, and health UI',\n tags: ['qa', 'quality', 'baseline', 'regression', 'devkit'],\n },\n\n platform: {\n requires: [],\n optional: ['cache', 'analytics', 'logger'],\n },\n\n cli: {\n groupMeta: [\n { path: 'qa', describe: 'Quality assurance powered by kb-devkit' },\n { path: 'qa baseline', describe: 'Baseline management' },\n ],\n commands: [\n {\n path: 'qa run',\n category: 'Run',\n describe: 'Run devkit tasks and record results',\n operationType: 'execute' as const,\n handler: './cli/commands/qa-run.js#default',\n flags: defineCommandFlags(qaRunFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa check',\n category: 'Run',\n describe: 'Run devkit structural checks',\n operationType: 'analyze' as const,\n handler: './cli/commands/qa-check.js#default',\n flags: defineCommandFlags(qaCheckFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa stats',\n category: 'Run',\n describe: 'Show devkit health score and category breakdown',\n operationType: 'read' as const,\n handler: './cli/commands/qa-stats.js#default',\n flags: defineCommandFlags(qaStatsFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa gate',\n category: 'Run',\n describe: 'Run pre-commit gate check (exits 1 if violations found)',\n operationType: 'analyze' as const,\n handler: './cli/commands/qa-gate.js#default',\n flags: defineCommandFlags(qaGateFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa history',\n category: 'History',\n describe: 'Show QA run history',\n operationType: 'read' as const,\n handler: './cli/commands/qa-history.js#default',\n flags: defineCommandFlags(qaHistoryFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa trends',\n category: 'History',\n describe: 'Show QA quality trends over time',\n operationType: 'read' as const,\n handler: './cli/commands/qa-trends.js#default',\n flags: defineCommandFlags(qaTrendsFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa e2e-flaky',\n category: 'History',\n describe: 'Track flaky e2e cases across CI runs (agent-first overview + drill-down)',\n operationType: 'read' as const,\n handler: './cli/commands/qa-e2e-flaky.js#default',\n flags: defineCommandFlags(qaE2eFlakyFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa regressions',\n category: 'History',\n describe: 'Detect regressions since last run',\n operationType: 'read' as const,\n handler: './cli/commands/qa-regressions.js#default',\n flags: defineCommandFlags(qaRegressionsFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa baseline update',\n category: 'Baseline',\n describe: 'Run check + stats and save as new baseline',\n operationType: 'mutate' as const,\n handler: './cli/commands/baseline-update.js#default',\n flags: defineCommandFlags(baselineUpdateFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa baseline status',\n category: 'Baseline',\n describe: 'Show current baseline',\n operationType: 'read' as const,\n handler: './cli/commands/baseline-status.js#default',\n flags: defineCommandFlags(baselineStatusFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa baseline diff',\n category: 'Baseline',\n describe: 'Diff current state against baseline',\n operationType: 'read' as const,\n handler: './cli/commands/baseline-diff.js#default',\n flags: defineCommandFlags(baselineDiffFlags.schema),\n permissions: pluginPermissions,\n },\n ],\n },\n\n rest: {\n basePath: QA_BASE_PATH,\n routes: [\n { method: 'GET', path: QA_ROUTES.SUMMARY, handler: './rest/handlers/summary-handler.js#default' },\n { method: 'POST', path: QA_ROUTES.RUN, handler: './rest/handlers/run-handler.js#default' },\n { method: 'POST', path: QA_ROUTES.CHECK, handler: './rest/handlers/check-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.STATS, handler: './rest/handlers/stats-handler.js#default' },\n { method: 'POST', path: QA_ROUTES.GATE, handler: './rest/handlers/gate-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.HISTORY, handler: './rest/handlers/history-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.TRENDS, handler: './rest/handlers/trends-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.REGRESSIONS, handler: './rest/handlers/regressions-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.BASELINE, handler: './rest/handlers/baseline-handler.js#default' },\n { method: 'POST', path: QA_ROUTES.BASELINE_UPDATE, handler: './rest/handlers/baseline-update-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.BASELINE_DIFF, handler: './rest/handlers/baseline-diff-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.PACKAGE_TIMELINE, handler: './rest/handlers/package-timeline-handler.js#default' },\n { method: 'GET', path: QA_ROUTES.TASKS, handler: './rest/handlers/tasks-handler.js#default' },\n ],\n },\n\n studio: {\n version: 2 as const,\n remoteName: 'qaPlugin',\n pages: [\n {\n id: 'qa.overview',\n title: 'QA',\n icon: 'ExperimentOutlined',\n route: '/p/qa',\n entry: './QADashboard',\n order: 1,\n },\n ],\n menus: [\n {\n id: 'qa',\n label: 'QA',\n icon: 'ExperimentOutlined',\n target: 'qa.overview',\n order: 50,\n },\n ],\n },\n\n permissions: pluginPermissions,\n};\n\nexport default manifest;\n"]}