@kb-labs/qa-entry 2.119.0 → 2.119.1-canary.a6aa9b388
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/dist/cli/commands/baseline-diff.js.map +1 -1
- package/dist/cli/commands/baseline-status.js.map +1 -1
- package/dist/cli/commands/baseline-update.js.map +1 -1
- package/dist/cli/commands/flags.js.map +1 -1
- package/dist/cli/commands/qa-check.js.map +1 -1
- package/dist/cli/commands/qa-ci-evidence-capture.js.map +1 -1
- package/dist/cli/commands/qa-ci-evidence-sync.js.map +1 -1
- package/dist/cli/commands/qa-ci-overview.js.map +1 -1
- package/dist/cli/commands/qa-e2e-flaky.js.map +1 -1
- package/dist/cli/commands/qa-gate.js.map +1 -1
- package/dist/cli/commands/qa-history.js.map +1 -1
- package/dist/cli/commands/qa-regressions.js.map +1 -1
- package/dist/cli/commands/qa-run.js.map +1 -1
- package/dist/cli/commands/qa-stats.js.map +1 -1
- package/dist/cli/commands/qa-trends.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/manifest.js.map +1 -1
- package/dist/manifest.json +1019 -0
- package/dist/rest/handlers/baseline-diff-handler.js.map +1 -1
- package/dist/rest/handlers/baseline-handler.js.map +1 -1
- package/dist/rest/handlers/baseline-update-handler.js.map +1 -1
- package/dist/rest/handlers/check-handler.js.map +1 -1
- package/dist/rest/handlers/ci-overview-handler.js.map +1 -1
- package/dist/rest/handlers/gate-handler.js.map +1 -1
- package/dist/rest/handlers/history-handler.js.map +1 -1
- package/dist/rest/handlers/package-timeline-handler.js.map +1 -1
- package/dist/rest/handlers/regressions-handler.js.map +1 -1
- package/dist/rest/handlers/run-handler.js.map +1 -1
- package/dist/rest/handlers/stats-handler.js.map +1 -1
- package/dist/rest/handlers/summary-handler.js.map +1 -1
- package/dist/rest/handlers/tasks-handler.js.map +1 -1
- package/dist/rest/handlers/trends-handler.js.map +1 -1
- package/dist/widgets/117.js +32 -0
- package/dist/widgets/165.js +1 -0
- package/dist/widgets/326.js +1 -0
- package/dist/widgets/370.js +1 -0
- package/dist/widgets/405.js +1 -0
- package/dist/widgets/46.js +445 -0
- package/dist/widgets/50.js +1 -0
- package/dist/widgets/546.js +1 -0
- package/dist/widgets/648.js +1 -0
- package/dist/widgets/669.js +1 -0
- package/dist/widgets/707.js +1 -0
- package/dist/widgets/775.js +1 -0
- package/dist/widgets/78.js +1 -0
- package/dist/widgets/823.js +1 -0
- package/dist/widgets/832.js +96 -0
- package/dist/widgets/875.js +25 -0
- package/dist/widgets/945.js +1 -0
- package/dist/widgets/968.js +9 -0
- package/dist/widgets/__federation_expose_QADashboard.js +1 -0
- package/dist/widgets/mf-manifest.json +230 -0
- package/dist/widgets/mf-stats.json +250 -0
- package/dist/widgets/remoteEntry.js +7 -0
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/baseline-diff.ts"],"names":[],"mappings":";;;;AAeA,IAAO,wBAAQ,aAAA,CAA6D;AAAA,EAC1E,EAAA,EAAI,kBAAA;AAAA,EACJ,WAAA,EAAa,qCAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAA4D;AAC9F,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAA0B;AAC/C,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAEnC,MAAA,MAAM,KAAA,GAAQ,IAAI,aAAA,CAAc,GAAA,EAAK,QAAQ,iBAAiB,CAAA;AAC9D,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,EAAa;AAEpC,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,oDAAoD,CAAA;AACpE,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MAC9C;AAEA,MAAA,MAAM,WAAA,GAAc,MAAM,WAAA,EAAY;AACtC,MAAA,MAAM,WAAA,GAAc,MAAM,WAAA,EAAY;AAEtC,MAAA,IAAI,CAAC,WAAA,IAAe,CAAC,WAAA,EAAa;AAChC,QAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,sEAAsE,CAAA;AACtF,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MAC9C;AAEA,MAAA,MAAM,OAAO,mBAAA,CAAoB,WAAA,CAAY,GAAA,EAAK,WAAA,CAAY,KAAK,QAAQ,CAAA;AAE3E,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,IAAI,CAAA;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,KAAA,MAAW,OAAA,IAAW,uBAAA,CAAwB,IAAI,CAAA,EAAG;AACnD,UAAA,GAAA,CAAI,EAAA,EAAI,OAAA,GAAU,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,EAAE,QAAA,EAAU,CAAC,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAAA,QACjF;AAAA,MACF;AAEA,MAAA,OAAO,IAAA,CAAK,aAAA,GAAgB,CAAA,GACxB,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,kBAAA,EAAoB,MAAA,EAAQ,MAAK,GACrD,EAAE,EAAA,EAAI,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA,IAC/B;AAAA;AAEJ,CAAC","file":"baseline-diff.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport {\n SnapshotStore,\n compareWithBaseline,\n buildBaselineDiffReport,\n} from '@kb-labs/qa-core';\nimport { type QAPluginConfig } from '@kb-labs/qa-contracts';\nimport type { BaselineDiffFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<BaselineDiffFlags>, unknown>({\n id: 'qa:baseline:diff',\n description: 'Diff current state against baseline',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<BaselineDiffFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QAPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n\n const store = new SnapshotStore(cwd, config?.historyMaxEntries);\n const baseline = store.loadBaseline();\n\n if (!baseline) {\n ctx.ui?.error?.('No baseline found. Run `qa baseline update` first.');\n return { ok: false, error: 'Command failed' };\n }\n\n const latestCheck = store.latestCheck();\n const latestStats = store.latestStats();\n\n if (!latestCheck || !latestStats) {\n ctx.ui?.error?.('No check/stats snapshots found. Run `qa check` and `qa stats` first.');\n return { ok: false, error: 'Command failed' };\n }\n\n const diff = compareWithBaseline(latestCheck.raw, latestStats.raw, baseline);\n\n if (flags.json) {\n ctx.ui?.json?.(diff);\n } else {\n for (const section of buildBaselineDiffReport(diff)) {\n ctx.ui?.success?.(`${section.header}`, { sections: [{ items: section.lines }] });\n }\n }\n\n return diff.newIssueCount > 0\n ? { ok: false, error: 'New issues found', result: diff }\n : { ok: true, result: diff };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/baseline-status.ts"],"names":[],"mappings":";;;;AAcA,IAAO,0BAAQ,aAAA,CAA+D;AAAA,EAC5E,EAAA,EAAI,oBAAA;AAAA,EACJ,WAAA,EAAa,uBAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAA8D;AAChG,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAA0B;AAC/C,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAEnC,MAAA,MAAM,KAAA,GAAQ,IAAI,aAAA,CAAc,GAAA,EAAK,QAAQ,iBAAiB,CAAA;AAC9D,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,EAAa;AAEpC,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,QAAQ,CAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,KAAA,MAAW,OAAA,IAAW,mBAAA,CAAoB,QAAQ,CAAA,EAAG;AACnD,UAAA,GAAA,CAAI,EAAA,EAAI,OAAA,GAAU,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,EAAE,QAAA,EAAU,CAAC,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAAA,QACjF;AAAA,MACF;AAEA,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IACpB;AAAA;AAEJ,CAAC","file":"baseline-status.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport {\n SnapshotStore,\n buildBaselineReport,\n} from '@kb-labs/qa-core';\nimport { type QAPluginConfig } from '@kb-labs/qa-contracts';\nimport type { BaselineStatusFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<BaselineStatusFlags>, unknown>({\n id: 'qa:baseline:status',\n description: 'Show current baseline',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<BaselineStatusFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QAPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n\n const store = new SnapshotStore(cwd, config?.historyMaxEntries);\n const baseline = store.loadBaseline();\n\n if (flags.json) {\n ctx.ui?.json?.(baseline);\n } else {\n for (const section of buildBaselineReport(baseline)) {\n ctx.ui?.success?.(`${section.header}`, { sections: [{ items: section.lines }] });\n }\n }\n\n return { ok: true };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/baseline-update.ts"],"names":[],"mappings":";;;;AAiBA,IAAO,0BAAQ,aAAA,CAA+D;AAAA,EAC5E,EAAA,EAAI,oBAAA;AAAA,EACJ,WAAA,EAAa,4CAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,MAAA,CAAO,IAAA,EAAuB,MAAA,EAAuC;AACzE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,+CAAA;AAAA,QACT,UAAA,EAAY;AAAA,UACV,EAAE,MAAM,QAAA,EAAmB,QAAA,EAAU,QAAQ,OAAA,EAAS,EAAE,IAAA,EAAM,sBAAA,EAAuB;AAAE;AACzF,OACF;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAA8D;AAChG,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAA0B;AAC/C,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAEnC,MAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,GAAA,EAAK,MAAA,EAAQ,UAAU,CAAA;AAC3D,MAAA,MAAM,OAAA,GAAU,IAAI,aAAA,CAAc,EAAE,UAAA,EAAY,KAAK,KAAA,EAAO,GAAA,CAAI,GAAA,CAAI,KAAA,EAAO,CAAA;AAC3E,MAAA,MAAM,KAAA,GAAQ,IAAI,aAAA,CAAc,GAAA,EAAK,QAAQ,iBAAiB,CAAA;AAE9D,MAAA,MAAM,MAAM,MAAM,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,OAAO,GAAG,CAAA;AAE/C,MAAA,MAAM,CAAC,KAAA,EAAO,KAAK,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,OAAA,CAAQ,KAAA,EAAM,EAAG,OAAA,CAAQ,KAAA,EAAO,CAAC,CAAA;AAC3E,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,YAAA,CAAa,KAAA,EAAO,OAAO,GAAG,CAAA;AAErD,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,QAAQ,CAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,KAAA,MAAW,OAAA,IAAW,mBAAA,CAAoB,QAAQ,CAAA,EAAG;AACnD,UAAA,GAAA,CAAI,EAAA,EAAI,OAAA,GAAU,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,EAAE,QAAA,EAAU,CAAC,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAAA,QACjF;AAAA,MACF;AAEA,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IACpB;AAAA;AAEJ,CAAC","file":"baseline-update.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport {\n DevkitAdapter,\n SnapshotStore,\n resolveDevkitBin,\n captureGit,\n buildBaselineReport,\n} from '@kb-labs/qa-core';\nimport { type QAPluginConfig } from '@kb-labs/qa-contracts';\nimport type { BaselineUpdateFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<BaselineUpdateFlags>, unknown>({\n id: 'qa:baseline:update',\n description: 'Run check + stats and save as new baseline',\n\n handler: {\n async intent(_ctx: PluginContextV3, _input: CLIInput<BaselineUpdateFlags>) {\n return {\n summary: 'Run QA check + stats and save as new baseline',\n operations: [\n { type: 'create' as const, resource: 'file', details: { path: '.kb/qa/baseline.json' } },\n ],\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<BaselineUpdateFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QAPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n\n const binaryPath = resolveDevkitBin(cwd, config?.devkitPath);\n const adapter = new DevkitAdapter({ binaryPath, cwd, shell: ctx.api.shell });\n const store = new SnapshotStore(cwd, config?.historyMaxEntries);\n\n const git = await captureGit(ctx.api.shell, cwd);\n\n const [check, stats] = await Promise.all([adapter.check(), adapter.stats()]);\n const baseline = store.saveBaseline(check, stats, git);\n\n if (flags.json) {\n ctx.ui?.json?.(baseline);\n } else {\n for (const section of buildBaselineReport(baseline)) {\n ctx.ui?.success?.(`${section.header}`, { sections: [{ items: section.lines }] });\n }\n }\n\n return { ok: true };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
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 qaCiEvidenceCaptureFlags = defineFlags({\n runId: {\n type: 'string',\n description: 'GitHub Actions run ID (defaults to GITHUB_RUN_ID)',\n },\n repository: {\n type: 'string',\n description: 'GitHub repository in owner/name form (defaults to GITHUB_REPOSITORY)',\n },\n output: {\n type: 'string',\n description: 'Path for the immutable dossier JSON',\n default: '.kb/qa/ci/dossier.json',\n },\n excludeJob: {\n type: 'string',\n description: 'Comma-separated job names to exclude from evidence (for example, the collector job itself)',\n },\n json: {\n type: 'boolean',\n description: 'Output the captured dossier as JSON',\n default: false,\n },\n});\nexport type QaCiEvidenceCaptureFlags = typeof qaCiEvidenceCaptureFlags.infer;\n\nexport const qaCiEvidenceSyncFlags = defineFlags({\n repository: {\n type: 'string',\n description: 'GitHub repository in owner/name form (defaults to config or GITHUB_REPOSITORY)',\n },\n workflow: {\n type: 'string',\n description: 'GitHub Actions workflow file or name',\n default: 'e2e-platform.yml',\n },\n limit: {\n type: 'number',\n description: 'Recent workflow runs to inspect for evidence artifacts',\n default: 50,\n },\n output: {\n type: 'string',\n description: 'Local evidence cache directory',\n default: '.kb/qa/ci/evidence',\n },\n json: {\n type: 'boolean',\n description: 'Output sync details as JSON',\n default: false,\n },\n});\nexport type QaCiEvidenceSyncFlags = typeof qaCiEvidenceSyncFlags.infer;\n\nexport const qaCiOverviewFlags = defineFlags({\n input: {\n type: 'string',\n description: 'Dossier JSON file or directory containing dossier.json files',\n default: '.kb/qa/ci',\n },\n output: {\n type: 'string',\n description: 'Optional file to receive the compact agent-ready JSON overview',\n },\n json: {\n type: 'boolean',\n description: 'Output the agent-ready reliability overview as JSON',\n default: false,\n },\n});\nexport type QaCiOverviewFlags = typeof qaCiOverviewFlags.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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/qa-check.ts"],"names":[],"mappings":";;;;AAkBA,IAAO,mBAAQ,aAAA,CAAwD;AAAA,EACrE,EAAA,EAAI,UAAA;AAAA,EACJ,WAAA,EAAa,8BAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAuD;AACzF,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAA0B;AAC/C,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAEnC,MAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,GAAA,EAAK,MAAA,EAAQ,UAAU,CAAA;AAC3D,MAAA,MAAM,OAAA,GAAU,IAAI,aAAA,CAAc,EAAE,UAAA,EAAY,KAAK,KAAA,EAAO,GAAA,CAAI,GAAA,CAAI,KAAA,EAAO,CAAA;AAC3E,MAAA,MAAM,KAAA,GAAQ,IAAI,aAAA,CAAc,GAAA,EAAK,QAAQ,iBAAiB,CAAA;AAE9D,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,KAAS,KAAA;AAC5B,MAAA,MAAM,MAAM,MAAM,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,OAAO,GAAG,CAAA;AAE/C,MAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,KAAA,EAAM;AAChC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAEhC,MAAA,MAAM,OAAO,IAAA,GAAO,KAAA,CAAM,UAAU,GAAA,EAAK,UAAA,EAAY,GAAG,CAAA,GAAI,IAAA;AAC5D,MAAA,MAAM,YAA2D,IAAA,IAAQ;AAAA,QACvE,IAAA,EAAM,OAAA;AAAA,QAAS,EAAA,EAAI,EAAA;AAAA,QAAI,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAAG,UAAA;AAAA,QAAY;AAAA,OAC1E;AAEA,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,oBAAA,CAAqB,SAAS,CAAC,CAAA;AAAA,MAChD,CAAA,MAAO;AACL,QAAA,KAAA,MAAW,OAAA,IAAW,gBAAA,CAAiB,SAAS,CAAA,EAAG;AACjD,UAAA,GAAA,CAAI,EAAA,EAAI,OAAA,GAAU,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,EAAE,QAAA,EAAU,CAAC,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAAA,QACjF;AAAA,MACF;AAEA,MAAA,OAAO,GAAA,CAAI,EAAA,GAAK,EAAE,EAAA,EAAI,MAAM,MAAA,EAAQ,GAAA,EAAI,GAAI,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,iBAAA,EAAmB,QAAQ,GAAA,EAAI;AAAA,IACjG;AAAA;AAEJ,CAAC","file":"qa-check.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport {\n DevkitAdapter,\n SnapshotStore,\n resolveDevkitBin,\n captureGit,\n buildCheckReport,\n buildCheckJsonReport,\n} from '@kb-labs/qa-core';\nimport { type QAPluginConfig } from '@kb-labs/qa-contracts';\nimport type { QaCheckFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<QaCheckFlags>, unknown>({\n id: 'qa:check',\n description: 'Run devkit structural checks',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<QaCheckFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QAPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n\n const binaryPath = resolveDevkitBin(cwd, config?.devkitPath);\n const adapter = new DevkitAdapter({ binaryPath, cwd, shell: ctx.api.shell });\n const store = new SnapshotStore(cwd, config?.historyMaxEntries);\n\n const save = flags.save !== false;\n const git = await captureGit(ctx.api.shell, cwd);\n\n const start = Date.now();\n const raw = await adapter.check();\n const durationMs = Date.now() - start;\n\n const snap = save ? store.saveCheck(raw, durationMs, git) : null;\n const effective: import('@kb-labs/qa-contracts').CheckSnapshot = snap ?? {\n kind: 'check', id: '', timestamp: new Date().toISOString(), durationMs, raw,\n };\n\n if (flags.json) {\n ctx.ui?.json?.(buildCheckJsonReport(effective));\n } else {\n for (const section of buildCheckReport(effective)) {\n ctx.ui?.success?.(`${section.header}`, { sections: [{ items: section.lines }] });\n }\n }\n\n return raw.ok ? { ok: true, result: raw } : { ok: false, error: 'QA check failed', result: raw };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/qa-ci-evidence-capture.ts"],"names":[],"mappings":"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","file":"qa-ci-evidence-capture.js","sourcesContent":["import { mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { defineCommand, useConfig, type CLIInput, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { GithubActionsProvider } from '@kb-labs/qa-core';\nimport type { QAPluginConfig } from '@kb-labs/qa-contracts';\nimport type { QaCiEvidenceCaptureFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<QaCiEvidenceCaptureFlags>, unknown>({\n id: 'qa:ci-evidence-capture',\n description: 'Capture a compact GitHub Actions run dossier for later QA analysis',\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<QaCiEvidenceCaptureFlags>): Promise<CommandResult> {\n const config = await useConfig<QAPluginConfig>();\n const repository = input.flags.repository ?? config?.ci?.repository ?? process.env.GITHUB_REPOSITORY;\n const runId = input.flags.runId ?? process.env.GITHUB_RUN_ID;\n if (!repository || !runId) {\n ctx.ui?.error?.('GitHub repository and run ID are required. Pass --repository/--run-id or run inside GitHub Actions.');\n return { ok: false, error: 'GitHub repository and run ID are required' };\n }\n try {\n const cwd = ctx.cwd ?? process.cwd();\n const provider = new GithubActionsProvider(ctx.api.shell, cwd);\n const excludeJobNames = input.flags.excludeJob\n ?.split(',')\n .map(name => name.trim())\n .filter(Boolean);\n const dossier = await provider.captureRun({\n repository,\n runId,\n workflowPath: process.env.GITHUB_WORKFLOW_REF?.split('@')[0],\n workflowSha: process.env.GITHUB_SHA,\n excludeJobNames,\n });\n const output = resolve(cwd, input.flags.output);\n mkdirSync(dirname(output), { recursive: true });\n writeFileSync(output, `${JSON.stringify(dossier, null, 2)}\\n`);\n if (input.flags.json) {\n ctx.ui?.json?.(dossier);\n } else {\n ctx.ui?.success?.(`Captured CI evidence for run ${dossier.run.id}`, {\n sections: [\n { header: 'Evidence', items: [\n `workflow: ${dossier.workflow.name}`,\n `jobs: ${dossier.jobs.length}`,\n `collection: ${dossier.collectionStatus}`,\n `saved: ${output}`,\n ] },\n ],\n });\n }\n return { ok: true };\n } catch (error) {\n ctx.ui?.error?.(`Unable to capture CI evidence: ${error instanceof Error ? error.message : String(error)}`);\n return { ok: false, error: error instanceof Error ? error.message : String(error) };\n }\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/qa-ci-evidence-sync.ts"],"names":[],"mappings":";;;;;;AAOA,IAAO,8BAAQ,aAAA,CAAiE;AAAA,EAC9E,EAAA,EAAI,qBAAA;AAAA,EACJ,WAAA,EAAa,4DAAA;AAAA,EACb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAgE;AAClG,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAA0B;AAC/C,MAAA,MAAM,UAAA,GAAa,MAAM,KAAA,CAAM,UAAA,IAAc,QAAQ,EAAA,EAAI,UAAA,IAAc,QAAQ,GAAA,CAAI,iBAAA;AACnF,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,iFAAiF,CAAA;AACjG,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,2CAAA,EAA4C;AAAA,MACzE;AACA,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACnC,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,EAAK,KAAA,CAAM,MAAM,MAAM,CAAA;AAC9C,MAAA,SAAA,CAAU,MAAA,EAAQ,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACrC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAI,qBAAA,CAAsB,IAAI,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA,CAAE,YAAA,CAAa;AAAA,UAC9E,UAAA;AAAA,UAAY,QAAA,EAAU,MAAM,KAAA,CAAM,QAAA;AAAA,UAAU,KAAA,EAAO,MAAM,KAAA,CAAM,KAAA;AAAA,UAAO,SAAA,EAAW;AAAA,SAClF,CAAA;AACD,QAAA,IAAI,KAAA,CAAM,MAAM,IAAA,EAAM;AACpB,UAAA,GAAA,CAAI,EAAA,EAAI,OAAO,MAAM,CAAA;AAAA,QACvB,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,EAAA,EAAI,UAAU,oBAAA,EAAsB;AAAA,YACtC,QAAA,EAAU,CAAC,EAAE,MAAA,EAAQ,QAAQ,KAAA,EAAO;AAAA,cAClC,CAAA,YAAA,EAAe,MAAA,CAAO,gBAAA,CAAiB,MAAM,CAAA,CAAA;AAAA,cAC7C,CAAA,QAAA,EAAW,MAAA,CAAO,YAAA,CAAa,MAAM,CAAA,CAAA;AAAA,cACrC,CAAA,aAAA,EAAgB,MAAA,CAAO,iBAAA,CAAkB,MAAM,CAAA,CAAA;AAAA,cAC/C,UAAU,MAAM,CAAA;AAAA,eACf;AAAA,WACJ,CAAA;AAAA,QACH;AACA,QAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,MACpB,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,KAAA,GAAQ,CAAA,4BAAA,EAA+B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AACvG,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,MACpF;AAAA,IACF;AAAA;AAEJ,CAAC","file":"qa-ci-evidence-sync.js","sourcesContent":["import { mkdirSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { defineCommand, useConfig, type CLIInput, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { GithubActionsProvider } from '@kb-labs/qa-core';\nimport type { QAPluginConfig } from '@kb-labs/qa-contracts';\nimport type { QaCiEvidenceSyncFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<QaCiEvidenceSyncFlags>, unknown>({\n id: 'qa:ci-evidence-sync',\n description: 'Download new CI evidence artifacts into the local QA cache',\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<QaCiEvidenceSyncFlags>): Promise<CommandResult> {\n const config = await useConfig<QAPluginConfig>();\n const repository = input.flags.repository ?? config?.ci?.repository ?? process.env.GITHUB_REPOSITORY;\n if (!repository) {\n ctx.ui?.error?.('GitHub repository is required. Pass --repository or configure qa.ci.repository.');\n return { ok: false, error: 'GitHub repository and run ID are required' };\n }\n const cwd = ctx.cwd ?? process.cwd();\n const output = resolve(cwd, input.flags.output);\n mkdirSync(output, { recursive: true });\n try {\n const result = await new GithubActionsProvider(ctx.api.shell, cwd).syncDossiers({\n repository, workflow: input.flags.workflow, limit: input.flags.limit, outputDir: output,\n });\n if (input.flags.json) {\n ctx.ui?.json?.(result);\n } else {\n ctx.ui?.success?.('Synced CI evidence', {\n sections: [{ header: 'Runs', items: [\n `downloaded: ${result.downloadedRunIds.length}`,\n `cached: ${result.cachedRunIds.length}`,\n `unavailable: ${result.unavailableRunIds.length}`,\n `cache: ${output}`,\n ] }],\n });\n }\n return { ok: true };\n } catch (error) {\n ctx.ui?.error?.(`Unable to sync CI evidence: ${error instanceof Error ? error.message : String(error)}`);\n return { ok: false, error: error instanceof Error ? error.message : String(error) };\n }\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/qa-ci-overview.ts"],"names":[],"mappings":"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","file":"qa-ci-overview.js","sourcesContent":["import { mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { defineCommand, type CLIInput, type PluginContextV3 , type CommandResult} from '@kb-labs/sdk';\nimport { analyzeCiReliability, loadCiDossiers } from '@kb-labs/qa-core';\nimport type { QaCiOverviewFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<QaCiOverviewFlags>, unknown>({\n id: 'qa:ci-overview',\n description: 'Show a compact CI reliability overview from captured dossiers',\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<QaCiOverviewFlags>): Promise<CommandResult> {\n const cwd = ctx.cwd ?? process.cwd();\n const inputPath = resolve(cwd, input.flags.input);\n const dossiers = loadCiDossiers(inputPath);\n if (dossiers.length === 0) {\n ctx.ui?.error?.(`No CI dossiers found under ${inputPath}. Run \\`kb qa ci evidence capture\\` in CI first.`);\n return { ok: false, error: 'Command failed' };\n }\n const overview = analyzeCiReliability(dossiers);\n if (input.flags.output) {\n const output = resolve(cwd, input.flags.output);\n mkdirSync(dirname(output), { recursive: true });\n writeFileSync(output, `${JSON.stringify(overview, null, 2)}\\n`);\n }\n if (input.flags.json) {\n ctx.ui?.json?.(overview);\n } else {\n ctx.ui?.success?.(`CI reliability (${overview.runsAnalyzed} run${overview.runsAnalyzed === 1 ? '' : 's'})`, {\n sections: [\n { header: 'Summary', items: [\n `failed runs: ${overview.failedRuns}`,\n `failed before tests: ${overview.failedBeforeTests}`,\n `evidence: ${overview.collection.complete} complete, ${overview.collection.partial} partial`,\n ...(input.flags.output ? [`saved JSON: ${resolve(cwd, input.flags.output)}`] : []),\n ] },\n { header: 'Top findings', items: overview.findings.length > 0\n ? overview.findings.map(finding => `${finding.fingerprint} — ${finding.occurrences} occurrence(s), ${(finding.confidence * 100).toFixed(0)}% confidence; ${finding.affectedJobs.join(', ')}`)\n : ['No failed CI steps in the captured evidence.'] },\n { header: 'Drill down', items: overview.drillDown.runIds.map(runId => `kb qa ci run --run-id ${runId} --json`) },\n ],\n });\n }\n return { ok: true };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/qa/entry/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 type CommandResult,\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<CommandResult> {\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 { ok: false, error: 'Command failed' };\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 { ok: true };\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>, unknown>({\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<CommandResult> {\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 { ok: false, error: 'Command failed' };}\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 { ok: false, error: 'Command failed' };\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 { ok: true };\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 { ok: true };\n },\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/qa-e2e-flaky.ts"],"names":[],"mappings":";;;;;;;AAkBA,eAAe,SAAA,CACb,GAAA,EACA,GAAA,EACA,KAAA,EACA,GAAA,EACwB;AACxB,EAAA,MAAM,QAAyB,EAAC;AAChC,EAAA,IAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACnB,IAAA,KAAA,MAAW,SAAS,WAAA,CAAY,GAAA,EAAK,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA,EAAG;AAC7D,MAAA,MAAM,OAAO,KAAA,CAAM,WAAA,EAAY,GAC3B,IAAA,CAAK,KAAK,KAAA,CAAM,IAAA,EAAM,mBAAmB,CAAA,GACzC,MAAM,IAAA,KAAS,mBAAA,GAAsB,KAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AACjE,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,UAAA,CAAW,IAAI,CAAA,EAAG;AAAC,QAAA;AAAA,MAAS;AAC1C,MAAA,IAAI;AACF,QAAA,KAAA,CAAM,IAAA,CAAK,GAAI,IAAA,CAAK,KAAA,CAAM,aAAa,IAAA,EAAM,OAAO,CAAC,CAAqB,CAAA;AAAA,MAC5E,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAKtB,IAAA,GAAA,CAAI,EAAA,EAAI,KAAA,GAAQ,CAAA,uCAAA,EAA0C,GAAG,CAAA,0BAAA,CAAuB,CAAA;AACpF,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,EAC9C;AAEA,EAAA,MAAM,MAAM,MAAM,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,OAAO,GAAG,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,YAAA,CAAa,KAAA,EAAO,GAAG,GAAG,CAAA;AAC7C,EAAA,GAAA,CAAI,EAAA,EAAI,UAAU,CAAA,SAAA,EAAY,KAAA,CAAM,MAAM,CAAA,yBAAA,EAA4B,GAAG,CAAA,mBAAA,CAAA,EAAuB,EAAE,CAAA;AAClG,EAAA,GAAA,CAAI,EAAA,EAAI,OAAO,IAAI,CAAA;AACnB,EAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AACpB;AAEA,eAAe,OAAA,CAAQ,KAAsB,GAAA,EAA+B;AAC1E,EAAA,MAAM,QAAQ,MAAM,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,KAAK,KAAA,EAAO,CAAC,OAAA,EAAS,QAAA,EAAU,SAAS,CAAA,EAAG,EAAE,GAAA,EAAK,YAAA,EAAc,OAAO,CAAA;AAC1G,EAAA,IAAI,CAAC,MAAM,EAAA,EAAI;AACb,IAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,8EAAyE,CAAA;AACzF,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,IAAA;AAAA,IAC/B,KAAA;AAAA,IACA,CAAC,MAAA,EAAQ,CAAA,eAAA,EAAkB,KAAA,CAAM,mBAAmB,CAAA,CAAE,CAAA;AAAA,IACtD,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA;AAAM,GAC7B;AACA,EAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACZ,IAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,+EAA0E,CAAA;AAC1F,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,mBAAmB,CAAA;AAClD,EAAA,SAAA,CAAU,QAAQ,MAAM,CAAA,EAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC9C,EAAA,aAAA,CAAc,MAAA,EAAQ,KAAK,MAAM,CAAA;AACjC,EAAA,OAAO,IAAA;AACT;AAEA,IAAO,uBAAQ,aAAA,CAA2D;AAAA,EACxE,EAAA,EAAI,cAAA;AAAA,EACJ,WAAA,EAAa,yGAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAA0D;AAC5F,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAA0B;AAC/C,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACnC,MAAA,MAAM,KAAA,GAAQ,IAAI,aAAA,CAAc,GAAA,EAAK,QAAQ,iBAAiB,CAAA;AAC9D,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,IAAA;AAKlC,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AACrC,QAAA,IAAI,CAAC,MAAA,EAAQ;AAAC,UAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,QAAE;AAAA,MAC9D;AAEA,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,OAAO,SAAA,CAAU,GAAA,EAAK,GAAA,EAAK,KAAA,EAAO,MAAM,MAAM,CAAA;AAAA,MAChD;AAEA,MAAA,MAAM,OAAA,GAAU,MAAM,mBAAA,EAAoB;AAC1C,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,IAAU,aAAA;AAE/B,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,MAAM,QAAA,GAAW,kBAAkB,OAAA,CAAQ,KAAA,CAAM,CAAC,MAAM,CAAA,EAAG,MAAM,IAAI,CAAA;AACrE,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,GAAA,CAAI,EAAA,EAAI,KAAA,GAAQ,CAAA,2BAAA,EAA8B,KAAA,CAAM,IAAI,CAAA,yDAAA,CAA2D,CAAA;AACnH,UAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,QAC9C;AACA,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,GAAA,CAAI,EAAA,EAAI,OAAO,QAAQ,CAAA;AAAA,QACzB,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,EAAA,EAAI,OAAA,GAAU,CAAA,eAAA,EAAkB,QAAA,CAAS,OAAO,CAAA,CAAA,EAAI;AAAA,YACtD,QAAA,EAAU;AAAA,cACR,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO;AAAA,gBAC1B,CAAA,YAAA,EAAe,SAAS,UAAU,CAAA,CAAA;AAAA,gBAClC,WAAW,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA,EAAA,EAAK,QAAA,CAAS,cAAc,KAAK,CAAA,CAAA;AAAA,gBACzE,CAAA,cAAA,EAAiB,QAAA,CAAS,YAAA,IAAgB,MAAM,CAAA;AAAA,eAClD,EAAE;AAAA,cACF,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,SAAS,OAAA,CAAQ,GAAA;AAAA,gBAC3C,CAAA,CAAA,KAAK,GAAG,CAAA,CAAE,SAAS,KAAK,CAAA,CAAE,SAAS,KAAK,CAAA,CAAE,MAAM,GAAG,CAAA,CAAE,aAAA,GAAgB,KAAK,CAAA,CAAE,aAAa,KAAK,CAAA,CAAE,YAAA,IAAgB,EAAE,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA;AAAA,eAC5H;AAAE;AACJ,WACD,CAAA;AAAA,QACH;AACA,QAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,MACpB;AAEA,MAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,OAAA,EAAS,MAAM,CAAA;AAClD,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,QAAQ,CAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,EAAA,EAAI,OAAA,GAAU,CAAA,yBAAA,EAA4B,QAAA,CAAS,YAAY,CAAA,MAAA,CAAA,EAAU;AAAA,UAC3E,QAAA,EAAU;AAAA,YACR,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO;AAAA,cAC1B,CAAA,YAAA,EAAe,QAAA,CAAS,UAAU,CAAA,cAAA,EAAiB,SAAS,UAAU,CAAA,CAAA;AAAA,cACtE,CAAA,QAAA,EAAW,QAAA,CAAS,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA,OAAA,EAAU,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,QAAA,EAAW,QAAA,CAAS,KAAA,CAAM,UAAU,MAAM,CAAA,UAAA;AAAA,aACrH,EAAE;AAAA,YACF,EAAE,MAAA,EAAQ,iBAAA,EAAmB,KAAA,EAAO,SAAS,GAAA,CAAI,GAAA;AAAA,cAC/C,CAAA,CAAA,KAAK,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,cAAA,EAAY,CAAA,CAAE,UAAU,CAAA,EAAA,EAAK,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK,CAAA,CAAE,QAAQ,CAAA;AAAA,aACpE;AAAE;AACJ,SACD,CAAA;AAAA,MACH;AACA,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IACpB;AAAA;AAEJ,CAAC","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 type CommandResult,\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<CommandResult> {\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 { ok: false, error: 'Command failed' };\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 { ok: true };\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>, unknown>({\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<CommandResult> {\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 { ok: false, error: 'Command failed' };}\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 { ok: false, error: 'Command failed' };\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 { ok: true };\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 { ok: true };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/qa-gate.ts"],"names":[],"mappings":";;;;AAgBA,IAAO,kBAAQ,aAAA,CAAuD;AAAA,EACpE,EAAA,EAAI,SAAA;AAAA,EACJ,WAAA,EAAa,yDAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAsD;AACxF,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAA0B;AAC/C,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAEnC,MAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,GAAA,EAAK,MAAA,EAAQ,UAAU,CAAA;AAC3D,MAAA,MAAM,OAAA,GAAU,IAAI,aAAA,CAAc,EAAE,UAAA,EAAY,KAAK,KAAA,EAAO,GAAA,CAAI,GAAA,CAAI,KAAA,EAAO,CAAA;AAC3E,MAAA,MAAM,KAAA,GAAQ,IAAI,aAAA,CAAc,GAAA,EAAK,QAAQ,iBAAiB,CAAA;AAE9D,MAAA,MAAM,MAAM,MAAM,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,OAAO,GAAG,CAAA;AAE/C,MAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,IAAA,EAAK;AAC/B,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAEhC,MAAA,IAAI,MAAM,IAAA,EAAM,KAAA,CAAM,QAAA,CAAS,GAAA,EAAK,YAAY,GAAG,CAAA;AAEnD,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,GAAG,CAAA;AAAA,MACpB,CAAA,MAAA,IAAW,IAAI,EAAA,EAAI;AACjB,QAAA,GAAA,CAAI,EAAA,EAAI,OAAA,GAAU,CAAA,aAAA,EAAgB,GAAA,CAAI,YAAY,CAAA,+BAAA,CAAiC,CAAA;AAAA,MACrF,CAAA,MAAO;AACL,QAAA,MAAM,QAAQ,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAA,CAAA,KAAK,IAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,EAAA,EAAK,CAAA,CAAE,KAAK,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAC9F,QAAA,GAAA,CAAI,EAAA,EAAI,KAAA,GAAQ,aAAA,EAAe,EAAE,QAAA,EAAU,CAAC,EAAE,MAAA,EAAQ,YAAA,EAAc,KAAA,EAAO,CAAA,EAAG,CAAA;AAAA,MAChF;AAEA,MAAA,OAAO,GAAA,CAAI,EAAA,GAAK,EAAE,EAAA,EAAI,MAAM,MAAA,EAAQ,GAAA,EAAI,GAAI,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAkB,QAAQ,GAAA,EAAI;AAAA,IAChG;AAAA;AAEJ,CAAC","file":"qa-gate.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport {\n DevkitAdapter,\n SnapshotStore,\n resolveDevkitBin,\n captureGit,\n} from '@kb-labs/qa-core';\nimport { type QAPluginConfig } from '@kb-labs/qa-contracts';\nimport type { QaGateFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<QaGateFlags>, unknown>({\n id: 'qa:gate',\n description: 'Run pre-commit gate check (exits 1 if violations found)',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<QaGateFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QAPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n\n const binaryPath = resolveDevkitBin(cwd, config?.devkitPath);\n const adapter = new DevkitAdapter({ binaryPath, cwd, shell: ctx.api.shell });\n const store = new SnapshotStore(cwd, config?.historyMaxEntries);\n\n const git = await captureGit(ctx.api.shell, cwd);\n\n const start = Date.now();\n const raw = await adapter.gate();\n const durationMs = Date.now() - start;\n\n if (flags.save) store.saveGate(raw, durationMs, git);\n\n if (flags.json) {\n ctx.ui?.json?.(raw);\n } else if (raw.ok) {\n ctx.ui?.success?.(`Gate passed. ${raw.staged_files} staged file(s), no violations.`);\n } else {\n const items = raw.violations.map(v => `[${v.severity}] ${v.package} ${v.check}: ${v.message}`);\n ctx.ui?.error?.('Gate failed', { sections: [{ header: 'Violations', items }] });\n }\n\n return raw.ok ? { ok: true, result: raw } : { ok: false, error: 'QA gate failed', result: raw };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/qa-history.ts"],"names":[],"mappings":";;;;AAcA,IAAO,qBAAQ,aAAA,CAA0D;AAAA,EACvE,EAAA,EAAI,YAAA;AAAA,EACJ,WAAA,EAAa,qBAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAyD;AAC3F,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAA0B;AAC/C,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAEnC,MAAA,MAAM,KAAA,GAAQ,IAAI,aAAA,CAAc,GAAA,EAAK,QAAQ,iBAAiB,CAAA;AAC9D,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,EAAA;AAC7B,MAAA,MAAM,OAAA,GAAU,MAAM,cAAA,EAAe;AAErC,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,CAAC,GAAG,OAAO,CAAA,CAAE,OAAA,EAAQ,CAAE,KAAA,CAAM,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,MACvD,CAAA,MAAO;AACL,QAAA,KAAA,MAAW,OAAA,IAAW,iBAAA,CAAkB,OAAA,EAAS,KAAK,CAAA,EAAG;AACvD,UAAA,GAAA,CAAI,EAAA,EAAI,OAAA,GAAU,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,EAAE,QAAA,EAAU,CAAC,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAAA,QACjF;AAAA,MACF;AAEA,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IACpB;AAAA;AAEJ,CAAC","file":"qa-history.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport {\n SnapshotStore,\n buildHistoryTable,\n} from '@kb-labs/qa-core';\nimport { type QAPluginConfig } from '@kb-labs/qa-contracts';\nimport type { QaHistoryFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<QaHistoryFlags>, unknown>({\n id: 'qa:history',\n description: 'Show QA run history',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<QaHistoryFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QAPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n\n const store = new SnapshotStore(cwd, config?.historyMaxEntries);\n const limit = flags.limit ?? 20;\n const history = store.loadRunHistory();\n\n if (flags.json) {\n ctx.ui?.json?.([...history].reverse().slice(0, limit));\n } else {\n for (const section of buildHistoryTable(history, limit)) {\n ctx.ui?.success?.(`${section.header}`, { sections: [{ items: section.lines }] });\n }\n }\n\n return { ok: true };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/qa-regressions.ts"],"names":[],"mappings":";;;;AAeA,IAAO,yBAAQ,aAAA,CAA8D;AAAA,EAC3E,EAAA,EAAI,gBAAA;AAAA,EACJ,WAAA,EAAa,mCAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAA6D;AAC/F,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAA0B;AAC/C,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAEnC,MAAA,MAAM,KAAA,GAAQ,IAAI,aAAA,CAAc,GAAA,EAAK,QAAQ,iBAAiB,CAAA;AAC9D,MAAA,MAAM,OAAA,GAAU,MAAM,cAAA,EAAe;AACrC,MAAA,MAAM,SAAA,GAAY,kBAAkB,OAAO,CAAA;AAE3C,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,SAAS,CAAA;AAAA,MAC1B,CAAA,MAAO;AACL,QAAA,KAAA,MAAW,OAAA,IAAW,sBAAA,CAAuB,SAAS,CAAA,EAAG;AACvD,UAAA,GAAA,CAAI,EAAA,EAAI,OAAA,GAAU,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,EAAE,QAAA,EAAU,CAAC,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAAA,QACjF;AAAA,MACF;AAEA,MAAA,OAAO,SAAA,CAAU,cAAA,GACb,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,mBAAA,EAAqB,MAAA,EAAQ,SAAA,EAAU,GAC3D,EAAE,EAAA,EAAI,IAAA,EAAM,QAAQ,SAAA,EAAU;AAAA,IACpC;AAAA;AAEJ,CAAC","file":"qa-regressions.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport {\n SnapshotStore,\n detectRegressions,\n buildRegressionsReport,\n} from '@kb-labs/qa-core';\nimport { type QAPluginConfig } from '@kb-labs/qa-contracts';\nimport type { QaRegressionsFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<QaRegressionsFlags>, unknown>({\n id: 'qa:regressions',\n description: 'Detect regressions since last run',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<QaRegressionsFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QAPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n\n const store = new SnapshotStore(cwd, config?.historyMaxEntries);\n const history = store.loadRunHistory();\n const detection = detectRegressions(history);\n\n if (flags.json) {\n ctx.ui?.json?.(detection);\n } else {\n for (const section of buildRegressionsReport(detection)) {\n ctx.ui?.success?.(`${section.header}`, { sections: [{ items: section.lines }] });\n }\n }\n\n return detection.hasRegressions\n ? { ok: false, error: 'Regressions found', result: detection }\n : { ok: true, result: detection };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/qa-run.ts"],"names":[],"mappings":";;;;;AAkBA,IAAO,iBAAQ,aAAA,CAAsD;AAAA,EACnE,EAAA,EAAI,QAAA;AAAA,EACJ,WAAA,EAAa,qCAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAqD;AACvF,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAA0B;AAC/C,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAEnC,MAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,GAAA,EAAK,MAAA,EAAQ,UAAU,CAAA;AAC3D,MAAA,MAAM,OAAA,GAAU,IAAI,aAAA,CAAc,EAAE,UAAA,EAAY,KAAK,KAAA,EAAO,GAAA,CAAI,GAAA,CAAI,KAAA,EAAO,CAAA;AAC3E,MAAA,MAAM,KAAA,GAAQ,IAAI,aAAA,CAAc,GAAA,EAAK,QAAQ,iBAAiB,CAAA;AAE9D,MAAA,MAAM,KAAA,GAAkB,MAAM,KAAA,GAC1B,KAAA,CAAM,MAAM,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,GACxD,MAAA,EAAQ,cAAc,KAAA,EAAM,IAAK,CAAC,GAAG,aAAa,CAAA;AACtD,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,KAAS,KAAA;AAE5B,MAAA,MAAM,MAAM,MAAM,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,OAAO,GAAG,CAAA;AAE/C,MAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AACnC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAEhC,MAAA,MAAM,IAAA,GAAO,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,KAAA,EAAO,UAAA,EAAY,GAAG,CAAA,GAAI,IAAA;AACjE,MAAA,MAAM,YAAyD,IAAA,IAAQ;AAAA,QACrE,IAAA,EAAM,KAAA;AAAA,QAAO,EAAA,EAAI,EAAA;AAAA,QAAI,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAAG,UAAA;AAAA,QAAY,KAAA;AAAA,QAAO;AAAA,OAC/E;AAEA,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,kBAAA,CAAmB,SAAS,CAAC,CAAA;AAAA,MAC9C,CAAA,MAAO;AACL,QAAA,KAAA,MAAW,OAAA,IAAW,cAAA,CAAe,SAAS,CAAA,EAAG;AAC/C,UAAA,GAAA,CAAI,EAAA,EAAI,OAAA,GAAU,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,EAAE,QAAA,EAAU,CAAC,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAAA,QACjF;AAAA,MACF;AAEA,MAAA,OAAO,GAAA,CAAI,EAAA,GAAK,EAAE,EAAA,EAAI,MAAM,MAAA,EAAQ,GAAA,EAAI,GAAI,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,eAAA,EAAiB,QAAQ,GAAA,EAAI;AAAA,IAC/F;AAAA;AAEJ,CAAC","file":"qa-run.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport {\n DevkitAdapter,\n SnapshotStore,\n resolveDevkitBin,\n captureGit,\n buildRunReport,\n buildRunJsonReport,\n} from '@kb-labs/qa-core';\nimport { DEFAULT_TASKS, type QAPluginConfig } from '@kb-labs/qa-contracts';\nimport type { QaRunFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<QaRunFlags>, unknown>({\n id: 'qa:run',\n description: 'Run devkit tasks and record results',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<QaRunFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QAPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n\n const binaryPath = resolveDevkitBin(cwd, config?.devkitPath);\n const adapter = new DevkitAdapter({ binaryPath, cwd, shell: ctx.api.shell });\n const store = new SnapshotStore(cwd, config?.historyMaxEntries);\n\n const tasks: string[] = flags.tasks\n ? flags.tasks.split(',').map(s => s.trim()).filter(Boolean)\n : config?.defaultTasks?.slice() ?? [...DEFAULT_TASKS];\n const save = flags.save !== false;\n\n const git = await captureGit(ctx.api.shell, cwd);\n\n const start = Date.now();\n const raw = await adapter.run(tasks);\n const durationMs = Date.now() - start;\n\n const snap = save ? store.saveRun(raw, tasks, durationMs, git) : null;\n const effective: import('@kb-labs/qa-contracts').RunSnapshot = snap ?? {\n kind: 'run', id: '', timestamp: new Date().toISOString(), durationMs, tasks, raw,\n };\n\n if (flags.json) {\n ctx.ui?.json?.(buildRunJsonReport(effective));\n } else {\n for (const section of buildRunReport(effective)) {\n ctx.ui?.success?.(`${section.header}`, { sections: [{ items: section.lines }] });\n }\n }\n\n return raw.ok ? { ok: true, result: raw } : { ok: false, error: 'QA run failed', result: raw };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/qa-stats.ts"],"names":[],"mappings":";;;;AAkBA,IAAO,mBAAQ,aAAA,CAAwD;AAAA,EACrE,EAAA,EAAI,UAAA;AAAA,EACJ,WAAA,EAAa,iDAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAuD;AACzF,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAA0B;AAC/C,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAEnC,MAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,GAAA,EAAK,MAAA,EAAQ,UAAU,CAAA;AAC3D,MAAA,MAAM,OAAA,GAAU,IAAI,aAAA,CAAc,EAAE,UAAA,EAAY,KAAK,KAAA,EAAO,GAAA,CAAI,GAAA,CAAI,KAAA,EAAO,CAAA;AAC3E,MAAA,MAAM,KAAA,GAAQ,IAAI,aAAA,CAAc,GAAA,EAAK,QAAQ,iBAAiB,CAAA;AAE9D,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,KAAS,KAAA;AAC5B,MAAA,MAAM,MAAM,MAAM,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,OAAO,GAAG,CAAA;AAE/C,MAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,KAAA,EAAM;AAChC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAEhC,MAAA,MAAM,OAAO,IAAA,GAAO,KAAA,CAAM,UAAU,GAAA,EAAK,UAAA,EAAY,GAAG,CAAA,GAAI,IAAA;AAC5D,MAAA,MAAM,YAA2D,IAAA,IAAQ;AAAA,QACvE,IAAA,EAAM,OAAA;AAAA,QAAS,EAAA,EAAI,EAAA;AAAA,QAAI,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAAG,UAAA;AAAA,QAAY;AAAA,OAC1E;AAEA,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,oBAAA,CAAqB,SAAS,CAAC,CAAA;AAAA,MAChD,CAAA,MAAO;AACL,QAAA,KAAA,MAAW,OAAA,IAAW,gBAAA,CAAiB,SAAS,CAAA,EAAG;AACjD,UAAA,GAAA,CAAI,EAAA,EAAI,OAAA,GAAU,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,EAAE,QAAA,EAAU,CAAC,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAAA,QACjF;AAAA,MACF;AAEA,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IACpB;AAAA;AAEJ,CAAC","file":"qa-stats.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport {\n DevkitAdapter,\n SnapshotStore,\n resolveDevkitBin,\n captureGit,\n buildStatsReport,\n buildStatsJsonReport,\n} from '@kb-labs/qa-core';\nimport { type QAPluginConfig } from '@kb-labs/qa-contracts';\nimport type { QaStatsFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<QaStatsFlags>, unknown>({\n id: 'qa:stats',\n description: 'Show devkit health score and category breakdown',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<QaStatsFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QAPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n\n const binaryPath = resolveDevkitBin(cwd, config?.devkitPath);\n const adapter = new DevkitAdapter({ binaryPath, cwd, shell: ctx.api.shell });\n const store = new SnapshotStore(cwd, config?.historyMaxEntries);\n\n const save = flags.save !== false;\n const git = await captureGit(ctx.api.shell, cwd);\n\n const start = Date.now();\n const raw = await adapter.stats();\n const durationMs = Date.now() - start;\n\n const snap = save ? store.saveStats(raw, durationMs, git) : null;\n const effective: import('@kb-labs/qa-contracts').StatsSnapshot = snap ?? {\n kind: 'stats', id: '', timestamp: new Date().toISOString(), durationMs, raw,\n };\n\n if (flags.json) {\n ctx.ui?.json?.(buildStatsJsonReport(effective));\n } else {\n for (const section of buildStatsReport(effective)) {\n ctx.ui?.success?.(`${section.header}`, { sections: [{ items: section.lines }] });\n }\n }\n\n return { ok: true };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/qa-trends.ts"],"names":[],"mappings":";;;;;AAeA,IAAO,oBAAQ,aAAA,CAAyD;AAAA,EACtE,EAAA,EAAI,WAAA;AAAA,EACJ,WAAA,EAAa,kCAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAwD;AAC1F,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAA0B;AAC/C,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAEnC,MAAA,MAAM,KAAA,GAAQ,IAAI,aAAA,CAAc,GAAA,EAAK,QAAQ,iBAAiB,CAAA;AAC9D,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,IAAU,aAAA;AAC/B,MAAA,MAAM,OAAA,GAAU,MAAM,cAAA,EAAe;AACrC,MAAA,MAAM,QAAA,GAAW,aAAA,CAAc,OAAA,EAAS,MAAM,CAAA;AAE9C,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,QAAQ,CAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,KAAA,MAAW,OAAA,IAAW,iBAAA,CAAkB,QAAQ,CAAA,EAAG;AACjD,UAAA,GAAA,CAAI,EAAA,EAAI,OAAA,GAAU,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,EAAE,QAAA,EAAU,CAAC,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAAA,QACjF;AAAA,MACF;AAEA,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IACpB;AAAA;AAEJ,CAAC","file":"qa-trends.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport {\n SnapshotStore,\n analyzeTrends,\n buildTrendsReport,\n} from '@kb-labs/qa-core';\nimport { TRENDS_WINDOW, type QAPluginConfig } from '@kb-labs/qa-contracts';\nimport type { QaTrendsFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<QaTrendsFlags>, unknown>({\n id: 'qa:trends',\n description: 'Show QA quality trends over time',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<QaTrendsFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QAPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n\n const store = new SnapshotStore(cwd, config?.historyMaxEntries);\n const window = flags.window ?? TRENDS_WINDOW;\n const history = store.loadRunHistory();\n const analysis = analyzeTrends(history, window);\n\n if (flags.json) {\n ctx.ui?.json?.(analysis);\n } else {\n for (const section of buildTrendsReport(analysis)) {\n ctx.ui?.success?.(`${section.header}`, { sections: [{ items: section.lines }] });\n }\n }\n\n return { ok: true };\n },\n },\n});\n"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../home/runner/work/kb-labs/kb-labs/plugins/qa/entry/src/cli/commands/flags.ts","../../home/runner/work/kb-labs/kb-labs/plugins/qa/entry/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 qaCiEvidenceCaptureFlags = defineFlags({\n runId: {\n type: 'string',\n description: 'GitHub Actions run ID (defaults to GITHUB_RUN_ID)',\n },\n repository: {\n type: 'string',\n description: 'GitHub repository in owner/name form (defaults to GITHUB_REPOSITORY)',\n },\n output: {\n type: 'string',\n description: 'Path for the immutable dossier JSON',\n default: '.kb/qa/ci/dossier.json',\n },\n excludeJob: {\n type: 'string',\n description: 'Comma-separated job names to exclude from evidence (for example, the collector job itself)',\n },\n json: {\n type: 'boolean',\n description: 'Output the captured dossier as JSON',\n default: false,\n },\n});\nexport type QaCiEvidenceCaptureFlags = typeof qaCiEvidenceCaptureFlags.infer;\n\nexport const qaCiEvidenceSyncFlags = defineFlags({\n repository: {\n type: 'string',\n description: 'GitHub repository in owner/name form (defaults to config or GITHUB_REPOSITORY)',\n },\n workflow: {\n type: 'string',\n description: 'GitHub Actions workflow file or name',\n default: 'e2e-platform.yml',\n },\n limit: {\n type: 'number',\n description: 'Recent workflow runs to inspect for evidence artifacts',\n default: 50,\n },\n output: {\n type: 'string',\n description: 'Local evidence cache directory',\n default: '.kb/qa/ci/evidence',\n },\n json: {\n type: 'boolean',\n description: 'Output sync details as JSON',\n default: false,\n },\n});\nexport type QaCiEvidenceSyncFlags = typeof qaCiEvidenceSyncFlags.infer;\n\nexport const qaCiOverviewFlags = defineFlags({\n input: {\n type: 'string',\n description: 'Dossier JSON file or directory containing dossier.json files',\n default: '.kb/qa/ci',\n },\n output: {\n type: 'string',\n description: 'Optional file to receive the compact agent-ready JSON overview',\n },\n json: {\n type: 'boolean',\n description: 'Output the agent-ready reliability overview as JSON',\n default: false,\n },\n});\nexport type QaCiOverviewFlags = typeof qaCiOverviewFlags.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 qaCiEvidenceCaptureFlags,\n qaCiEvidenceSyncFlags,\n qaCiOverviewFlags,\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', 'gh'],\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 { path: 'qa ci', describe: 'CI evidence and reliability analysis' },\n { path: 'qa ci evidence', describe: 'Immutable CI evidence capture' },\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 ci evidence capture',\n category: 'CI',\n describe: 'Capture a GitHub Actions run dossier (CI producer command)',\n operationType: 'execute' as const,\n handler: './cli/commands/qa-ci-evidence-capture.js#default',\n flags: defineCommandFlags(qaCiEvidenceCaptureFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa ci evidence sync',\n category: 'CI',\n describe: 'Download new CI evidence artifacts into a local cache',\n operationType: 'execute' as const,\n handler: './cli/commands/qa-ci-evidence-sync.js#default',\n flags: defineCommandFlags(qaCiEvidenceSyncFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa ci overview',\n category: 'CI',\n describe: 'Show a compact CI reliability overview',\n operationType: 'read' as const,\n handler: './cli/commands/qa-ci-overview.js#default',\n flags: defineCommandFlags(qaCiOverviewFlags.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 { method: 'GET', path: QA_ROUTES.CI_OVERVIEW, handler: './rest/handlers/ci-overview-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 qaCiEvidenceCaptureFlags = defineFlags({\n runId: {\n type: 'string',\n description: 'GitHub Actions run ID (defaults to GITHUB_RUN_ID)',\n },\n repository: {\n type: 'string',\n description: 'GitHub repository in owner/name form (defaults to GITHUB_REPOSITORY)',\n },\n output: {\n type: 'string',\n description: 'Path for the immutable dossier JSON',\n default: '.kb/qa/ci/dossier.json',\n },\n excludeJob: {\n type: 'string',\n description: 'Comma-separated job names to exclude from evidence (for example, the collector job itself)',\n },\n json: {\n type: 'boolean',\n description: 'Output the captured dossier as JSON',\n default: false,\n },\n});\nexport type QaCiEvidenceCaptureFlags = typeof qaCiEvidenceCaptureFlags.infer;\n\nexport const qaCiEvidenceSyncFlags = defineFlags({\n repository: {\n type: 'string',\n description: 'GitHub repository in owner/name form (defaults to config or GITHUB_REPOSITORY)',\n },\n workflow: {\n type: 'string',\n description: 'GitHub Actions workflow file or name',\n default: 'e2e-platform.yml',\n },\n limit: {\n type: 'number',\n description: 'Recent workflow runs to inspect for evidence artifacts',\n default: 50,\n },\n output: {\n type: 'string',\n description: 'Local evidence cache directory',\n default: '.kb/qa/ci/evidence',\n },\n json: {\n type: 'boolean',\n description: 'Output sync details as JSON',\n default: false,\n },\n});\nexport type QaCiEvidenceSyncFlags = typeof qaCiEvidenceSyncFlags.infer;\n\nexport const qaCiOverviewFlags = defineFlags({\n input: {\n type: 'string',\n description: 'Dossier JSON file or directory containing dossier.json files',\n default: '.kb/qa/ci',\n },\n output: {\n type: 'string',\n description: 'Optional file to receive the compact agent-ready JSON overview',\n },\n json: {\n type: 'boolean',\n description: 'Output the agent-ready reliability overview as JSON',\n default: false,\n },\n});\nexport type QaCiOverviewFlags = typeof qaCiOverviewFlags.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 qaCiEvidenceCaptureFlags,\n qaCiEvidenceSyncFlags,\n qaCiOverviewFlags,\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', 'gh'],\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 { path: 'qa ci', describe: 'CI evidence and reliability analysis' },\n { path: 'qa ci evidence', describe: 'Immutable CI evidence capture' },\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 ci evidence capture',\n category: 'CI',\n describe: 'Capture a GitHub Actions run dossier (CI producer command)',\n operationType: 'execute' as const,\n handler: './cli/commands/qa-ci-evidence-capture.js#default',\n flags: defineCommandFlags(qaCiEvidenceCaptureFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa ci evidence sync',\n category: 'CI',\n describe: 'Download new CI evidence artifacts into a local cache',\n operationType: 'execute' as const,\n handler: './cli/commands/qa-ci-evidence-sync.js#default',\n flags: defineCommandFlags(qaCiEvidenceSyncFlags.schema),\n permissions: pluginPermissions,\n },\n {\n path: 'qa ci overview',\n category: 'CI',\n describe: 'Show a compact CI reliability overview',\n operationType: 'read' as const,\n handler: './cli/commands/qa-ci-overview.js#default',\n flags: defineCommandFlags(qaCiOverviewFlags.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 { method: 'GET', path: QA_ROUTES.CI_OVERVIEW, handler: './rest/handlers/ci-overview-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"]}
|