@kb-labs/qa-entry 2.109.0 → 2.110.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.
Files changed (59) hide show
  1. package/dist/cli/commands/baseline-diff.d.ts +1 -3
  2. package/dist/cli/commands/baseline-diff.js +3 -3
  3. package/dist/cli/commands/baseline-diff.js.map +1 -1
  4. package/dist/cli/commands/baseline-status.d.ts +1 -3
  5. package/dist/cli/commands/baseline-status.js +1 -1
  6. package/dist/cli/commands/baseline-status.js.map +1 -1
  7. package/dist/cli/commands/baseline-update.d.ts +1 -3
  8. package/dist/cli/commands/baseline-update.js +1 -1
  9. package/dist/cli/commands/baseline-update.js.map +1 -1
  10. package/dist/cli/commands/flags.d.ts +70 -1
  11. package/dist/cli/commands/flags.js +67 -1
  12. package/dist/cli/commands/flags.js.map +1 -1
  13. package/dist/cli/commands/qa-check.d.ts +1 -3
  14. package/dist/cli/commands/qa-check.js +1 -1
  15. package/dist/cli/commands/qa-check.js.map +1 -1
  16. package/dist/cli/commands/qa-ci-evidence-capture.d.ts +29 -0
  17. package/dist/cli/commands/qa-ci-evidence-capture.js +59 -0
  18. package/dist/cli/commands/qa-ci-evidence-capture.js.map +1 -0
  19. package/dist/cli/commands/qa-ci-evidence-sync.d.ts +31 -0
  20. package/dist/cli/commands/qa-ci-evidence-sync.js +51 -0
  21. package/dist/cli/commands/qa-ci-evidence-sync.js.map +1 -0
  22. package/dist/cli/commands/qa-ci-overview.d.ts +21 -0
  23. package/dist/cli/commands/qa-ci-overview.js +49 -0
  24. package/dist/cli/commands/qa-ci-overview.js.map +1 -0
  25. package/dist/cli/commands/qa-e2e-flaky.d.ts +1 -3
  26. package/dist/cli/commands/qa-e2e-flaky.js +6 -6
  27. package/dist/cli/commands/qa-e2e-flaky.js.map +1 -1
  28. package/dist/cli/commands/qa-gate.d.ts +1 -3
  29. package/dist/cli/commands/qa-gate.js +1 -1
  30. package/dist/cli/commands/qa-gate.js.map +1 -1
  31. package/dist/cli/commands/qa-history.d.ts +1 -3
  32. package/dist/cli/commands/qa-history.js +1 -1
  33. package/dist/cli/commands/qa-history.js.map +1 -1
  34. package/dist/cli/commands/qa-regressions.d.ts +1 -3
  35. package/dist/cli/commands/qa-regressions.js +1 -1
  36. package/dist/cli/commands/qa-regressions.js.map +1 -1
  37. package/dist/cli/commands/qa-run.d.ts +1 -3
  38. package/dist/cli/commands/qa-run.js +1 -1
  39. package/dist/cli/commands/qa-run.js.map +1 -1
  40. package/dist/cli/commands/qa-stats.d.ts +1 -3
  41. package/dist/cli/commands/qa-stats.js +1 -1
  42. package/dist/cli/commands/qa-stats.js.map +1 -1
  43. package/dist/cli/commands/qa-trends.d.ts +1 -3
  44. package/dist/cli/commands/qa-trends.js +1 -1
  45. package/dist/cli/commands/qa-trends.js.map +1 -1
  46. package/dist/index.js +99 -3
  47. package/dist/index.js.map +1 -1
  48. package/dist/manifest.d.ts +4 -0
  49. package/dist/manifest.js +99 -3
  50. package/dist/manifest.js.map +1 -1
  51. package/dist/manifest.json +245 -12
  52. package/dist/rest/handlers/ci-overview-handler.d.ts +7 -0
  53. package/dist/rest/handlers/ci-overview-handler.js +19 -0
  54. package/dist/rest/handlers/ci-overview-handler.js.map +1 -0
  55. package/dist/widgets/__federation_expose_QADashboard.js +1 -1
  56. package/dist/widgets/mf-manifest.json +5 -5
  57. package/dist/widgets/mf-stats.json +5 -5
  58. package/dist/widgets/remoteEntry.js +2 -2
  59. package/package.json +4 -4
@@ -7,8 +7,6 @@ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CL
7
7
  description: string;
8
8
  default: false;
9
9
  };
10
- }>>, {
11
- exitCode: number;
12
- }>;
10
+ }>>, unknown>;
13
11
 
14
12
  export { _default as default };
@@ -14,13 +14,13 @@ var baseline_diff_default = defineCommand({
14
14
  const baseline = store.loadBaseline();
15
15
  if (!baseline) {
16
16
  ctx.ui?.error?.("No baseline found. Run `qa baseline update` first.");
17
- return { exitCode: 1 };
17
+ return { ok: false, error: "Command failed" };
18
18
  }
19
19
  const latestCheck = store.latestCheck();
20
20
  const latestStats = store.latestStats();
21
21
  if (!latestCheck || !latestStats) {
22
22
  ctx.ui?.error?.("No check/stats snapshots found. Run `qa check` and `qa stats` first.");
23
- return { exitCode: 1 };
23
+ return { ok: false, error: "Command failed" };
24
24
  }
25
25
  const diff = compareWithBaseline(latestCheck.raw, latestStats.raw, baseline);
26
26
  if (flags.json) {
@@ -30,7 +30,7 @@ var baseline_diff_default = defineCommand({
30
30
  ctx.ui?.success?.(`${section.header}`, { sections: [{ items: section.lines }] });
31
31
  }
32
32
  }
33
- return { exitCode: diff.newIssueCount > 0 ? 1 : 0 };
33
+ return diff.newIssueCount > 0 ? { ok: false, error: "New issues found", result: diff } : { ok: true, result: diff };
34
34
  }
35
35
  }
36
36
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/baseline-diff.ts"],"names":[],"mappings":";;;;AAcA,IAAO,wBAAQ,aAAA,CAA0E;AAAA,EACvF,EAAA,EAAI,kBAAA;AAAA,EACJ,WAAA,EAAa,qCAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAmE;AACrG,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,UAAU,CAAA,EAAE;AAAA,MACvB;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,UAAU,CAAA,EAAE;AAAA,MACvB;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,EAAE,QAAA,EAAU,IAAA,CAAK,aAAA,GAAgB,CAAA,GAAI,IAAI,CAAA,EAAE;AAAA,IACpD;AAAA;AAEJ,CAAC","file":"baseline-diff.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\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>, { exitCode: number }>({\n id: 'qa:baseline:diff',\n description: 'Diff current state against baseline',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<BaselineDiffFlags>): Promise<{ exitCode: number }> {\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 { exitCode: 1 };\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 { exitCode: 1 };\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 { exitCode: diff.newIssueCount > 0 ? 1 : 0 };\n },\n },\n});\n"]}
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"]}
@@ -7,8 +7,6 @@ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CL
7
7
  description: string;
8
8
  default: false;
9
9
  };
10
- }>>, {
11
- exitCode: number;
12
- }>;
10
+ }>>, unknown>;
13
11
 
14
12
  export { _default as default };
@@ -19,7 +19,7 @@ var baseline_status_default = defineCommand({
19
19
  ctx.ui?.success?.(`${section.header}`, { sections: [{ items: section.lines }] });
20
20
  }
21
21
  }
22
- return { exitCode: 0 };
22
+ return { ok: true };
23
23
  }
24
24
  }
25
25
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/baseline-status.ts"],"names":[],"mappings":";;;;AAaA,IAAO,0BAAQ,aAAA,CAA4E;AAAA,EACzF,EAAA,EAAI,oBAAA;AAAA,EACJ,WAAA,EAAa,uBAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAqE;AACvG,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,UAAU,CAAA,EAAE;AAAA,IACvB;AAAA;AAEJ,CAAC","file":"baseline-status.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\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>, { exitCode: number }>({\n id: 'qa:baseline:status',\n description: 'Show current baseline',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<BaselineStatusFlags>): Promise<{ exitCode: number }> {\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 { exitCode: 0 };\n },\n },\n});\n"]}
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"]}
@@ -7,8 +7,6 @@ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CL
7
7
  description: string;
8
8
  default: false;
9
9
  };
10
- }>>, {
11
- exitCode: number;
12
- }>;
10
+ }>>, unknown>;
13
11
 
14
12
  export { _default as default };
@@ -31,7 +31,7 @@ var baseline_update_default = defineCommand({
31
31
  ctx.ui?.success?.(`${section.header}`, { sections: [{ items: section.lines }] });
32
32
  }
33
33
  }
34
- return { exitCode: 0 };
34
+ return { ok: true };
35
35
  }
36
36
  }
37
37
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/baseline-update.ts"],"names":[],"mappings":";;;;AAgBA,IAAO,0BAAQ,aAAA,CAA4E;AAAA,EACzF,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,EAAqE;AACvG,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,UAAU,CAAA,EAAE;AAAA,IACvB;AAAA;AAEJ,CAAC","file":"baseline-update.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\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>, { exitCode: number }>({\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<{ exitCode: number }> {\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 { exitCode: 0 };\n },\n },\n});\n"]}
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"]}
@@ -113,6 +113,75 @@ declare const qaE2eFlakyFlags: _kb_labs_shared_command_kit.FlagSchemaWithInfer<{
113
113
  };
114
114
  }>;
115
115
  type QaE2eFlakyFlags = typeof qaE2eFlakyFlags.infer;
116
+ declare const qaCiEvidenceCaptureFlags: _kb_labs_shared_command_kit.FlagSchemaWithInfer<{
117
+ runId: {
118
+ type: "string";
119
+ description: string;
120
+ };
121
+ repository: {
122
+ type: "string";
123
+ description: string;
124
+ };
125
+ output: {
126
+ type: "string";
127
+ description: string;
128
+ default: string;
129
+ };
130
+ excludeJob: {
131
+ type: "string";
132
+ description: string;
133
+ };
134
+ json: {
135
+ type: "boolean";
136
+ description: string;
137
+ default: false;
138
+ };
139
+ }>;
140
+ type QaCiEvidenceCaptureFlags = typeof qaCiEvidenceCaptureFlags.infer;
141
+ declare const qaCiEvidenceSyncFlags: _kb_labs_shared_command_kit.FlagSchemaWithInfer<{
142
+ repository: {
143
+ type: "string";
144
+ description: string;
145
+ };
146
+ workflow: {
147
+ type: "string";
148
+ description: string;
149
+ default: string;
150
+ };
151
+ limit: {
152
+ type: "number";
153
+ description: string;
154
+ default: number;
155
+ };
156
+ output: {
157
+ type: "string";
158
+ description: string;
159
+ default: string;
160
+ };
161
+ json: {
162
+ type: "boolean";
163
+ description: string;
164
+ default: false;
165
+ };
166
+ }>;
167
+ type QaCiEvidenceSyncFlags = typeof qaCiEvidenceSyncFlags.infer;
168
+ declare const qaCiOverviewFlags: _kb_labs_shared_command_kit.FlagSchemaWithInfer<{
169
+ input: {
170
+ type: "string";
171
+ description: string;
172
+ default: string;
173
+ };
174
+ output: {
175
+ type: "string";
176
+ description: string;
177
+ };
178
+ json: {
179
+ type: "boolean";
180
+ description: string;
181
+ default: false;
182
+ };
183
+ }>;
184
+ type QaCiOverviewFlags = typeof qaCiOverviewFlags.infer;
116
185
  declare const qaRegressionsFlags: _kb_labs_shared_command_kit.FlagSchemaWithInfer<{
117
186
  json: {
118
187
  type: "boolean";
@@ -146,4 +215,4 @@ declare const baselineDiffFlags: _kb_labs_shared_command_kit.FlagSchemaWithInfer
146
215
  }>;
147
216
  type BaselineDiffFlags = typeof baselineDiffFlags.infer;
148
217
 
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 };
218
+ export { type BaselineDiffFlags, type BaselineStatusFlags, type BaselineUpdateFlags, type QaCheckFlags, type QaCiEvidenceCaptureFlags, type QaCiEvidenceSyncFlags, type QaCiOverviewFlags, type QaE2eFlakyFlags, type QaGateFlags, type QaHistoryFlags, type QaRegressionsFlags, type QaRunFlags, type QaStatsFlags, type QaTrendsFlags, baselineDiffFlags, baselineStatusFlags, baselineUpdateFlags, qaCheckFlags, qaCiEvidenceCaptureFlags, qaCiEvidenceSyncFlags, qaCiOverviewFlags, qaE2eFlakyFlags, qaGateFlags, qaHistoryFlags, qaRegressionsFlags, qaRunFlags, qaStatsFlags, qaTrendsFlags };
@@ -107,6 +107,72 @@ var qaE2eFlakyFlags = defineFlags({
107
107
  description: "CI-only: directory of per-shard flaky-report.json files to merge and save as a new snapshot"
108
108
  }
109
109
  });
110
+ var qaCiEvidenceCaptureFlags = defineFlags({
111
+ runId: {
112
+ type: "string",
113
+ description: "GitHub Actions run ID (defaults to GITHUB_RUN_ID)"
114
+ },
115
+ repository: {
116
+ type: "string",
117
+ description: "GitHub repository in owner/name form (defaults to GITHUB_REPOSITORY)"
118
+ },
119
+ output: {
120
+ type: "string",
121
+ description: "Path for the immutable dossier JSON",
122
+ default: ".kb/qa/ci/dossier.json"
123
+ },
124
+ excludeJob: {
125
+ type: "string",
126
+ description: "Comma-separated job names to exclude from evidence (for example, the collector job itself)"
127
+ },
128
+ json: {
129
+ type: "boolean",
130
+ description: "Output the captured dossier as JSON",
131
+ default: false
132
+ }
133
+ });
134
+ var qaCiEvidenceSyncFlags = defineFlags({
135
+ repository: {
136
+ type: "string",
137
+ description: "GitHub repository in owner/name form (defaults to config or GITHUB_REPOSITORY)"
138
+ },
139
+ workflow: {
140
+ type: "string",
141
+ description: "GitHub Actions workflow file or name",
142
+ default: "e2e-platform.yml"
143
+ },
144
+ limit: {
145
+ type: "number",
146
+ description: "Recent workflow runs to inspect for evidence artifacts",
147
+ default: 50
148
+ },
149
+ output: {
150
+ type: "string",
151
+ description: "Local evidence cache directory",
152
+ default: ".kb/qa/ci/evidence"
153
+ },
154
+ json: {
155
+ type: "boolean",
156
+ description: "Output sync details as JSON",
157
+ default: false
158
+ }
159
+ });
160
+ var qaCiOverviewFlags = defineFlags({
161
+ input: {
162
+ type: "string",
163
+ description: "Dossier JSON file or directory containing dossier.json files",
164
+ default: ".kb/qa/ci"
165
+ },
166
+ output: {
167
+ type: "string",
168
+ description: "Optional file to receive the compact agent-ready JSON overview"
169
+ },
170
+ json: {
171
+ type: "boolean",
172
+ description: "Output the agent-ready reliability overview as JSON",
173
+ default: false
174
+ }
175
+ });
110
176
  var qaRegressionsFlags = defineFlags({
111
177
  json: {
112
178
  type: "boolean",
@@ -136,6 +202,6 @@ var baselineDiffFlags = defineFlags({
136
202
  }
137
203
  });
138
204
 
139
- export { baselineDiffFlags, baselineStatusFlags, baselineUpdateFlags, qaCheckFlags, qaE2eFlakyFlags, qaGateFlags, qaHistoryFlags, qaRegressionsFlags, qaRunFlags, qaStatsFlags, qaTrendsFlags };
205
+ export { baselineDiffFlags, baselineStatusFlags, baselineUpdateFlags, qaCheckFlags, qaCiEvidenceCaptureFlags, qaCiEvidenceSyncFlags, qaCiOverviewFlags, qaE2eFlakyFlags, qaGateFlags, qaHistoryFlags, qaRegressionsFlags, qaRunFlags, qaStatsFlags, qaTrendsFlags };
140
206
  //# sourceMappingURL=flags.js.map
141
207
  //# 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 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"]}
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"]}
@@ -12,8 +12,6 @@ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CL
12
12
  description: string;
13
13
  default: false;
14
14
  };
15
- }>>, {
16
- exitCode: number;
17
- }>;
15
+ }>>, unknown>;
18
16
 
19
17
  export { _default as default };
@@ -33,7 +33,7 @@ var qa_check_default = defineCommand({
33
33
  ctx.ui?.success?.(`${section.header}`, { sections: [{ items: section.lines }] });
34
34
  }
35
35
  }
36
- return { exitCode: raw.ok ? 0 : 1 };
36
+ return raw.ok ? { ok: true, result: raw } : { ok: false, error: "QA check failed", result: raw };
37
37
  }
38
38
  }
39
39
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/qa-check.ts"],"names":[],"mappings":";;;;AAiBA,IAAO,mBAAQ,aAAA,CAAqE;AAAA,EAClF,EAAA,EAAI,UAAA;AAAA,EACJ,WAAA,EAAa,8BAAA;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,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,QAAA,EAAU,GAAA,CAAI,EAAA,GAAK,IAAI,CAAA,EAAE;AAAA,IACpC;AAAA;AAEJ,CAAC","file":"qa-check.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\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>, { exitCode: number }>({\n id: 'qa:check',\n description: 'Run devkit structural checks',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<QaCheckFlags>): Promise<{ exitCode: number }> {\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 { exitCode: raw.ok ? 0 : 1 };\n },\n },\n});\n"]}
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"]}
@@ -0,0 +1,29 @@
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
+ runId: {
6
+ type: "string";
7
+ description: string;
8
+ };
9
+ repository: {
10
+ type: "string";
11
+ description: string;
12
+ };
13
+ output: {
14
+ type: "string";
15
+ description: string;
16
+ default: string;
17
+ };
18
+ excludeJob: {
19
+ type: "string";
20
+ description: string;
21
+ };
22
+ json: {
23
+ type: "boolean";
24
+ description: string;
25
+ default: false;
26
+ };
27
+ }>>, unknown>;
28
+
29
+ export { _default as default };
@@ -0,0 +1,59 @@
1
+ import { mkdirSync, writeFileSync } from 'fs';
2
+ import { resolve, dirname } from 'path';
3
+ import { defineCommand, useConfig } from '@kb-labs/sdk';
4
+ import { GithubActionsProvider } from '@kb-labs/qa-core';
5
+
6
+ // src/cli/commands/qa-ci-evidence-capture.ts
7
+ var qa_ci_evidence_capture_default = defineCommand({
8
+ id: "qa:ci-evidence-capture",
9
+ description: "Capture a compact GitHub Actions run dossier for later QA analysis",
10
+ handler: {
11
+ async execute(ctx, input) {
12
+ const config = await useConfig();
13
+ const repository = input.flags.repository ?? config?.ci?.repository ?? process.env.GITHUB_REPOSITORY;
14
+ const runId = input.flags.runId ?? process.env.GITHUB_RUN_ID;
15
+ if (!repository || !runId) {
16
+ ctx.ui?.error?.("GitHub repository and run ID are required. Pass --repository/--run-id or run inside GitHub Actions.");
17
+ return { ok: false, error: "GitHub repository and run ID are required" };
18
+ }
19
+ try {
20
+ const cwd = ctx.cwd ?? process.cwd();
21
+ const provider = new GithubActionsProvider(ctx.api.shell, cwd);
22
+ const excludeJobNames = input.flags.excludeJob?.split(",").map((name) => name.trim()).filter(Boolean);
23
+ const dossier = await provider.captureRun({
24
+ repository,
25
+ runId,
26
+ workflowPath: process.env.GITHUB_WORKFLOW_REF?.split("@")[0],
27
+ workflowSha: process.env.GITHUB_SHA,
28
+ excludeJobNames
29
+ });
30
+ const output = resolve(cwd, input.flags.output);
31
+ mkdirSync(dirname(output), { recursive: true });
32
+ writeFileSync(output, `${JSON.stringify(dossier, null, 2)}
33
+ `);
34
+ if (input.flags.json) {
35
+ ctx.ui?.json?.(dossier);
36
+ } else {
37
+ ctx.ui?.success?.(`Captured CI evidence for run ${dossier.run.id}`, {
38
+ sections: [
39
+ { header: "Evidence", items: [
40
+ `workflow: ${dossier.workflow.name}`,
41
+ `jobs: ${dossier.jobs.length}`,
42
+ `collection: ${dossier.collectionStatus}`,
43
+ `saved: ${output}`
44
+ ] }
45
+ ]
46
+ });
47
+ }
48
+ return { ok: true };
49
+ } catch (error) {
50
+ ctx.ui?.error?.(`Unable to capture CI evidence: ${error instanceof Error ? error.message : String(error)}`);
51
+ return { ok: false, error: error instanceof Error ? error.message : String(error) };
52
+ }
53
+ }
54
+ }
55
+ });
56
+
57
+ export { qa_ci_evidence_capture_default as default };
58
+ //# sourceMappingURL=qa-ci-evidence-capture.js.map
59
+ //# sourceMappingURL=qa-ci-evidence-capture.js.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,31 @@
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
+ repository: {
6
+ type: "string";
7
+ description: string;
8
+ };
9
+ workflow: {
10
+ type: "string";
11
+ description: string;
12
+ default: string;
13
+ };
14
+ limit: {
15
+ type: "number";
16
+ description: string;
17
+ default: number;
18
+ };
19
+ output: {
20
+ type: "string";
21
+ description: string;
22
+ default: string;
23
+ };
24
+ json: {
25
+ type: "boolean";
26
+ description: string;
27
+ default: false;
28
+ };
29
+ }>>, unknown>;
30
+
31
+ export { _default as default };
@@ -0,0 +1,51 @@
1
+ import { mkdirSync } from 'fs';
2
+ import { resolve } from 'path';
3
+ import { defineCommand, useConfig } from '@kb-labs/sdk';
4
+ import { GithubActionsProvider } from '@kb-labs/qa-core';
5
+
6
+ // src/cli/commands/qa-ci-evidence-sync.ts
7
+ var qa_ci_evidence_sync_default = defineCommand({
8
+ id: "qa:ci-evidence-sync",
9
+ description: "Download new CI evidence artifacts into the local QA cache",
10
+ handler: {
11
+ async execute(ctx, input) {
12
+ const config = await useConfig();
13
+ const repository = input.flags.repository ?? config?.ci?.repository ?? process.env.GITHUB_REPOSITORY;
14
+ if (!repository) {
15
+ ctx.ui?.error?.("GitHub repository is required. Pass --repository or configure qa.ci.repository.");
16
+ return { ok: false, error: "GitHub repository and run ID are required" };
17
+ }
18
+ const cwd = ctx.cwd ?? process.cwd();
19
+ const output = resolve(cwd, input.flags.output);
20
+ mkdirSync(output, { recursive: true });
21
+ try {
22
+ const result = await new GithubActionsProvider(ctx.api.shell, cwd).syncDossiers({
23
+ repository,
24
+ workflow: input.flags.workflow,
25
+ limit: input.flags.limit,
26
+ outputDir: output
27
+ });
28
+ if (input.flags.json) {
29
+ ctx.ui?.json?.(result);
30
+ } else {
31
+ ctx.ui?.success?.("Synced CI evidence", {
32
+ sections: [{ header: "Runs", items: [
33
+ `downloaded: ${result.downloadedRunIds.length}`,
34
+ `cached: ${result.cachedRunIds.length}`,
35
+ `unavailable: ${result.unavailableRunIds.length}`,
36
+ `cache: ${output}`
37
+ ] }]
38
+ });
39
+ }
40
+ return { ok: true };
41
+ } catch (error) {
42
+ ctx.ui?.error?.(`Unable to sync CI evidence: ${error instanceof Error ? error.message : String(error)}`);
43
+ return { ok: false, error: error instanceof Error ? error.message : String(error) };
44
+ }
45
+ }
46
+ }
47
+ });
48
+
49
+ export { qa_ci_evidence_sync_default as default };
50
+ //# sourceMappingURL=qa-ci-evidence-sync.js.map
51
+ //# sourceMappingURL=qa-ci-evidence-sync.js.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,21 @@
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
+ input: {
6
+ type: "string";
7
+ description: string;
8
+ default: string;
9
+ };
10
+ output: {
11
+ type: "string";
12
+ description: string;
13
+ };
14
+ json: {
15
+ type: "boolean";
16
+ description: string;
17
+ default: false;
18
+ };
19
+ }>>, unknown>;
20
+
21
+ export { _default as default };