agentic-engineering-harness 0.7.0 → 0.8.1

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 (88) hide show
  1. package/dist/cli.js +17 -6
  2. package/dist/cli.js.map +1 -1
  3. package/dist/context/gateway.js +23 -0
  4. package/dist/context/gateway.js.map +1 -1
  5. package/dist/context/retrieval/gateway.js +18 -2
  6. package/dist/context/retrieval/gateway.js.map +1 -1
  7. package/dist/core/config.js +4 -4
  8. package/dist/core/config.js.map +1 -1
  9. package/dist/core/sdd.js +2 -2
  10. package/dist/core/sdd.js.map +1 -1
  11. package/dist/core/types.d.ts +28 -1
  12. package/dist/delivery/finalize.d.ts +1 -1
  13. package/dist/delivery/finalize.js +6 -1
  14. package/dist/delivery/finalize.js.map +1 -1
  15. package/dist/entry.js +20 -2
  16. package/dist/entry.js.map +1 -1
  17. package/dist/evidence/graph.d.ts +1 -0
  18. package/dist/evidence/graph.js +4 -4
  19. package/dist/evidence/graph.js.map +1 -1
  20. package/dist/issues/intake.d.ts +1 -1
  21. package/dist/maturity/inventory.d.ts +30 -0
  22. package/dist/maturity/inventory.js +53 -0
  23. package/dist/maturity/inventory.js.map +1 -0
  24. package/dist/operations/completion.js +57 -0
  25. package/dist/operations/completion.js.map +1 -1
  26. package/dist/operations/controller.d.ts +6 -0
  27. package/dist/operations/controller.js +3 -3
  28. package/dist/operations/controller.js.map +1 -1
  29. package/dist/operations/state.d.ts +10 -0
  30. package/dist/operations/state.js +24 -2
  31. package/dist/operations/state.js.map +1 -1
  32. package/dist/paseo/deterministicSession.d.ts +47 -0
  33. package/dist/paseo/deterministicSession.js +108 -0
  34. package/dist/paseo/deterministicSession.js.map +1 -0
  35. package/dist/provenance/generate.d.ts +12 -1
  36. package/dist/provenance/generate.js +86 -10
  37. package/dist/provenance/generate.js.map +1 -1
  38. package/dist/providers/validation/bddExecution.d.ts +15 -0
  39. package/dist/providers/validation/bddExecution.js +107 -0
  40. package/dist/providers/validation/bddExecution.js.map +1 -0
  41. package/dist/providers/validation/integrationEnvironment.d.ts +12 -0
  42. package/dist/providers/validation/integrationEnvironment.js +101 -0
  43. package/dist/providers/validation/integrationEnvironment.js.map +1 -0
  44. package/dist/providers/validation/pact.d.ts +15 -0
  45. package/dist/providers/validation/pact.js +79 -0
  46. package/dist/providers/validation/pact.js.map +1 -0
  47. package/dist/providers/validation/protocol.d.ts +7 -0
  48. package/dist/providers/validation/protocol.js +35 -0
  49. package/dist/providers/validation/protocol.js.map +1 -0
  50. package/dist/providers/validation/providerUtils.d.ts +18 -0
  51. package/dist/providers/validation/providerUtils.js +40 -0
  52. package/dist/providers/validation/providerUtils.js.map +1 -0
  53. package/dist/providers/validation/registry.d.ts +21 -0
  54. package/dist/providers/validation/registry.js +59 -0
  55. package/dist/providers/validation/registry.js.map +1 -0
  56. package/dist/providers/validation/reqnroll.d.ts +7 -0
  57. package/dist/providers/validation/reqnroll.js +50 -0
  58. package/dist/providers/validation/reqnroll.js.map +1 -0
  59. package/dist/providers/validation/testExecution.d.ts +15 -0
  60. package/dist/providers/validation/testExecution.js +122 -0
  61. package/dist/providers/validation/testExecution.js.map +1 -0
  62. package/dist/providers/validation/types.d.ts +158 -0
  63. package/dist/providers/validation/types.js +2 -0
  64. package/dist/providers/validation/types.js.map +1 -0
  65. package/dist/spec/openspec.js +12 -7
  66. package/dist/spec/openspec.js.map +1 -1
  67. package/dist/validators/external.js +8 -5
  68. package/dist/validators/external.js.map +1 -1
  69. package/dist/validators/gherkin.js +5 -56
  70. package/dist/validators/gherkin.js.map +1 -1
  71. package/dist/validators/registry.js +42 -3
  72. package/dist/validators/registry.js.map +1 -1
  73. package/dist/validators/toolEvidence.d.ts +5 -0
  74. package/dist/validators/toolEvidence.js +38 -8
  75. package/dist/validators/toolEvidence.js.map +1 -1
  76. package/dist/validators/types.d.ts +2 -1
  77. package/docs/ARCHITECTURE.md +60 -2
  78. package/docs/COMPONENT_MATURITY.md +11 -11
  79. package/docs/OSS_STACK.md +5 -4
  80. package/docs/V0.2.md +4 -1
  81. package/docs/VALIDATION.md +54 -3
  82. package/docs/VALIDATION_COMPATIBILITY.md +19 -0
  83. package/docs/component-maturity.json +5 -5
  84. package/maturity/components.yaml +59 -0
  85. package/package.json +9 -2
  86. package/schemas/project.schema.json +2 -2
  87. package/schemas/validation-result.schema.json +84 -0
  88. package/templates/project.yaml +1 -0
@@ -0,0 +1,79 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { commandExists } from "../../utils/process.js";
4
+ import { normalizePactOutput } from "../../validators/toolEvidence.js";
5
+ import { configuredCommand, doctorForCommand, executePlan, fileExists, resolveCwd } from "./providerUtils.js";
6
+ import { parseJson, persistRawArtifact } from "./protocol.js";
7
+ export class PactContractTestingProvider {
8
+ id = "pact";
9
+ capabilities = ["contract-test"];
10
+ async detect(context) {
11
+ const explicit = await configuredCommand(context);
12
+ if (explicit.command)
13
+ return { provider: explicit.provider, command: explicit.command, runtime: explicit.runtime, reason: "explicit Pact verifier command" };
14
+ const pactFile = optionString(context, "pactFile");
15
+ if (!pactFile || !(await fileExists(path.resolve(context.root, pactFile))))
16
+ return undefined;
17
+ if (await commandExists("pact", context.root))
18
+ return { provider: "pact-cli", command: "pact verifier", runtime: "pact-ffi", reason: "local Pact file and Pact CLI" };
19
+ if (await commandExists("pact_verifier_cli", context.root))
20
+ return { provider: "pact-verifier-cli", command: "pact_verifier_cli", runtime: "pact-ffi", reason: "local Pact file and standalone verifier" };
21
+ return { provider: "pact", command: undefined, runtime: "pact-ffi", reason: "local Pact file found but no official verifier executable is installed" };
22
+ }
23
+ async doctor(context) {
24
+ const detection = await this.detect(context);
25
+ if (!detection?.command)
26
+ return { provider: this.id, available: false, message: "Pact file is configured but the official Pact verifier is unavailable.", details: { pactFile: optionString(context, "pactFile") } };
27
+ return doctorForCommand(detection.command, resolveCwd(context), detection.provider, { runtime: detection.runtime });
28
+ }
29
+ async plan(context, detection) {
30
+ const selected = detection ?? await this.detect(context);
31
+ const configured = await configuredCommand(context);
32
+ if (configured.command && context.spec?.command)
33
+ return { provider: selected?.provider ?? configured.provider, capability: "contract-test", command: renderCommand(configured.command, context), cwd: resolveCwd(context), runtime: selected?.runtime ?? configured.runtime, options: { timeoutMs: (context.spec.timeoutSeconds ?? 900) * 1000 } };
34
+ const pactFile = optionString(context, "pactFile");
35
+ if (!pactFile)
36
+ throw new Error("Pact provider requires options.pactFile.");
37
+ const report = path.resolve(context.root, context.rawArtifactDirectory, `${context.spec?.id ?? "pact"}.report.json`);
38
+ const host = optionString(context, "hostname") ?? "127.0.0.1";
39
+ const port = optionNumber(context, "port") ?? 8080;
40
+ const command = selected?.provider === "pact-verifier-cli" ? `pact_verifier_cli -f ${quote(path.resolve(context.root, pactFile))} -h ${quote(host)} -p ${port} -j ${quote(report)}` : `pact verifier --file ${quote(path.resolve(context.root, pactFile))} --hostname ${quote(host)} --port ${port} --json ${quote(report)}`;
41
+ return { provider: selected?.provider ?? "pact", capability: "contract-test", command, cwd: resolveCwd(context), runtime: selected?.runtime ?? "pact-ffi", options: { timeoutMs: (context.spec?.timeoutSeconds ?? context.providerSpec?.timeoutSeconds ?? 900) * 1000, pactFile, report } };
42
+ }
43
+ async execute(context, plan) {
44
+ const execution = await executePlan(plan);
45
+ const id = context.spec?.id ?? context.providerSpec?.id ?? "pact";
46
+ return { ...execution, rawArtifact: await persistRawArtifact(context.root, context.rawArtifactDirectory, id, execution.stdout, execution.stderr) };
47
+ }
48
+ async normalize(context, execution) {
49
+ const report = typeof execution.plan.options?.report === "string" ? await readJson(path.resolve(execution.plan.cwd, execution.plan.options.report)) : undefined;
50
+ const parsed = report ?? parseJson(execution.stdout);
51
+ const failures = normalizePactOutput(parsed).map((finding) => ({ id: finding.rule, message: finding.message ?? "Pact interaction failed" }));
52
+ const summary = pactSummary(parsed, execution, failures.length);
53
+ const passed = execution.exitCode === 0 && failures.length === 0;
54
+ return { version: 1, provider: execution.plan.provider, capability: "contract-test", status: passed ? "PASS" : "FAIL", verifierCommand: execution.plan.command, pactFile: typeof execution.plan.options?.pactFile === "string" ? execution.plan.options.pactFile : undefined, providerUrl: providerUrl(execution.plan), summary, failures, requirements: requirementIds(context), rawArtifact: execution.rawArtifact };
55
+ }
56
+ }
57
+ export async function runPactVerification(context, provider = new PactContractTestingProvider()) {
58
+ const detection = await provider.detect(context);
59
+ if (!detection?.command)
60
+ return { result: { version: 1, provider: provider.id, capability: "contract-test", status: "SKIP", verifierCommand: "", summary: { total: 0, passed: 0, failed: 0, durationMs: 0 }, failures: [{ message: "An official Pact verifier command is required." }], requirements: requirementIds(context), rawArtifact: "" }, required: context.spec?.required ?? context.providerSpec?.required ?? true };
61
+ const plan = await provider.plan(context, detection);
62
+ const execution = await provider.execute(context, plan);
63
+ return { result: await provider.normalize(context, execution), required: context.spec?.required ?? context.providerSpec?.required ?? true };
64
+ }
65
+ function optionString(context, key) { const value = context.spec?.options?.[key] ?? context.providerSpec?.options?.[key]; return typeof value === "string" ? value : undefined; }
66
+ function requirementIds(context) { return (context.contract.requirements ?? []).filter((item) => item.capabilities?.includes("contract-test") || !item.capabilities?.length).map((item) => item.id); }
67
+ function optionNumber(context, key) { const value = context.spec?.options?.[key] ?? context.providerSpec?.options?.[key]; return typeof value === "number" ? value : undefined; }
68
+ function renderCommand(command, context) { return command.replaceAll("{taskId}", context.contract.task.id).replaceAll("{baseRef}", context.baseRef ?? "HEAD"); }
69
+ function quote(value) { return `'${value.replaceAll("'", "'\\''")}'`; }
70
+ async function readJson(file) { try {
71
+ return JSON.parse(await fs.readFile(file, "utf8"));
72
+ }
73
+ catch {
74
+ return undefined;
75
+ } }
76
+ function pactSummary(value, execution, failureCount) { const record = value && typeof value === "object" && !Array.isArray(value) ? value : {}; const results = Array.isArray(record.interactionResults) ? record.interactionResults : []; const interactionCount = results.length || (Array.isArray(record.interactions) ? record.interactions.length : 0); const resultFailures = results.filter((item) => !["ok", "passed", "success", "verified"].includes(String(item?.result ?? "").toLowerCase())).length; const total = Number(record.total ?? record.summary?.total ?? 0) || interactionCount || failureCount; const failed = Number(record.failed ?? record.summary?.failed ?? 0) || resultFailures || failureCount; return { total: Math.max(total, failed), passed: Math.max(0, total - failed), failed, durationMs: execution.durationMs }; }
77
+ function providerUrl(plan) { const match = plan.command.match(/--hostname\s+'([^']+)'\s+--port\s+(\d+)|-h\s+'([^']+)'\s+-p\s+(\d+)/); if (!match)
78
+ return undefined; const host = match[1] ?? match[3]; const port = match[2] ?? match[4]; return `http://${host}:${port}`; }
79
+ //# sourceMappingURL=pact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pact.js","sourceRoot":"","sources":["../../../src/providers/validation/pact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ValidationCheck } from "../../core/types.js";
2
+ import type { BddExecutionResult, ContractVerificationResult, IntegrationEnvironmentResult, TestExecutionResult } from "./types.js";
3
+ export type NormalizedValidationResult = TestExecutionResult | BddExecutionResult | IntegrationEnvironmentResult | ContractVerificationResult;
4
+ export declare function persistRawArtifact(root: string, directory: string, id: string, stdout: string, stderr: string): Promise<string>;
5
+ export declare function resultCheck(id: string, category: string, result: NormalizedValidationResult, required: boolean): ValidationCheck;
6
+ export declare function parseJson(value: string): unknown;
7
+ export declare function stableFingerprint(value: unknown): string;
@@ -0,0 +1,35 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ export async function persistRawArtifact(root, directory, id, stdout, stderr) {
5
+ const safe = id.replace(/[^A-Za-z0-9._-]/g, "-");
6
+ const output = path.resolve(root, directory, `${safe}.raw`);
7
+ await fs.mkdir(path.dirname(output), { recursive: true });
8
+ const body = `${stdout}${stderr ? `\n--- stderr ---\n${stderr}` : ""}`;
9
+ await fs.writeFile(output, body, "utf8");
10
+ return path.relative(root, output).replaceAll("\\", "/");
11
+ }
12
+ export function resultCheck(id, category, result, required) {
13
+ const failed = result.status === "FAIL";
14
+ const skipped = result.status === "SKIP";
15
+ return {
16
+ id,
17
+ category,
18
+ status: failed ? "FAIL" : skipped ? (required ? "FAIL" : "SKIP") : "PASS",
19
+ message: failed ? `${result.provider} ${category} failed.` : skipped ? `${result.provider} ${category} was skipped.` : `${result.provider} ${category} passed.`,
20
+ durationMs: "summary" in result ? result.summary.durationMs : result.lifecycle.durationMs,
21
+ details: { provider: result.provider, capability: result.capability, result, rawArtifact: result.rawArtifact }
22
+ };
23
+ }
24
+ export function parseJson(value) {
25
+ try {
26
+ return JSON.parse(value);
27
+ }
28
+ catch {
29
+ return undefined;
30
+ }
31
+ }
32
+ export function stableFingerprint(value) {
33
+ return crypto.createHash("sha256").update(JSON.stringify(value)).digest("hex");
34
+ }
35
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/providers/validation/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAM7B,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY,EAAE,SAAiB,EAAE,EAAU,EAAE,MAAc,EAAE,MAAc;IAClH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;IAC5D,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACvE,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAU,EAAE,QAAgB,EAAE,MAAkC,EAAE,QAAiB;IAC7G,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC;IACxC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC;IACzC,OAAO;QACL,EAAE;QACF,QAAQ;QACR,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM;QACzE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,QAAQ,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,QAAQ,eAAe,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,QAAQ,UAAU;QAC/J,UAAU,EAAE,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU;QACzF,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE;KAC/G,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,SAAS,CAAC;IAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjF,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { ProviderExecution, ProviderPlan, ValidationProviderContext } from "./types.js";
2
+ export declare function fileExists(file: string): Promise<boolean>;
3
+ export declare function readJsonFile<T>(file: string): Promise<T | undefined>;
4
+ export declare function configuredCommand(context: ValidationProviderContext, fallback?: string): Promise<{
5
+ command?: string;
6
+ runtime?: string;
7
+ provider: string;
8
+ }>;
9
+ export declare function doctorForCommand(command: string | undefined, cwd: string, provider: string, details?: Record<string, unknown>): Promise<{
10
+ provider: string;
11
+ available: boolean;
12
+ message: string;
13
+ details: {
14
+ executable: string | undefined;
15
+ };
16
+ }>;
17
+ export declare function executePlan(plan: ProviderPlan): Promise<ProviderExecution>;
18
+ export declare function resolveCwd(context: ValidationProviderContext): string;
@@ -0,0 +1,40 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { commandExists, runProcess } from "../../utils/process.js";
4
+ export async function fileExists(file) {
5
+ try {
6
+ await fs.access(file);
7
+ return true;
8
+ }
9
+ catch {
10
+ return false;
11
+ }
12
+ }
13
+ export async function readJsonFile(file) {
14
+ try {
15
+ return JSON.parse(await fs.readFile(file, "utf8"));
16
+ }
17
+ catch {
18
+ return undefined;
19
+ }
20
+ }
21
+ export async function configuredCommand(context, fallback) {
22
+ const providerSpec = context.providerSpec;
23
+ const spec = context.spec;
24
+ const command = providerSpec?.command ?? spec?.command ?? fallback;
25
+ const provider = providerSpec?.provider ?? spec?.options?.provider;
26
+ return { command, runtime: typeof spec?.options?.runtime === "string" ? spec.options.runtime : undefined, provider: typeof provider === "string" ? provider : "configured-command" };
27
+ }
28
+ export async function doctorForCommand(command, cwd, provider, details = {}) {
29
+ const executable = command?.trim().split(/\s+/, 1)[0];
30
+ const available = Boolean(executable) && await commandExists(executable, cwd);
31
+ return { provider, available, message: available ? `${provider} is available.` : `${provider} command is unavailable.`, details: { ...details, executable } };
32
+ }
33
+ export async function executePlan(plan) {
34
+ const result = await runProcess(plan.command, { cwd: plan.cwd, timeoutMs: Number(plan.options?.timeoutMs ?? 900_000), env: plan.env });
35
+ return { plan, ...result, rawArtifact: "" };
36
+ }
37
+ export function resolveCwd(context) {
38
+ return path.resolve(context.root, context.providerSpec?.workingDirectory ?? context.spec?.workingDirectory ?? ".");
39
+ }
40
+ //# sourceMappingURL=providerUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerUtils.js","sourceRoot":"","sources":["../../../src/providers/validation/providerUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGnE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,IAAI,CAAC;QAAC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,IAAY;IAChD,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAM,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,SAAS,CAAC;IAAC,CAAC;AAC9F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAkC,EAAE,QAAiB;IAC3F,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAM,OAAO,GAAG,YAAY,EAAE,OAAO,IAAI,IAAI,EAAE,OAAO,IAAI,QAAQ,CAAC;IACnE,MAAM,QAAQ,GAAG,YAAY,EAAE,QAAQ,IAAI,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC;IACnE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,OAAO,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC;AACvL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAA2B,EAAE,GAAW,EAAE,QAAgB,EAAE,UAAmC,EAAE;IACtI,MAAM,UAAU,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,MAAM,aAAa,CAAC,UAAW,EAAE,GAAG,CAAC,CAAC;IAC/E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,QAAQ,gBAAgB,CAAC,CAAC,CAAC,GAAG,QAAQ,0BAA0B,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC;AAChK,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAkB;IAClD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,IAAI,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACvI,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAkC;IAC3D,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE,gBAAgB,IAAI,OAAO,CAAC,IAAI,EAAE,gBAAgB,IAAI,GAAG,CAAC,CAAC;AACrH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { HarnessProjectConfig, TaskContract, ValidationCapability, ValidationProviderSpec, ValidatorSpec } from "../../core/types.js";
2
+ import { resultCheck } from "./protocol.js";
3
+ import type { BddExecutionResult, ContractVerificationResult, IntegrationEnvironmentResult, TestExecutionResult, ValidationProvider, ValidationProviderContext } from "./types.js";
4
+ export type ValidationProviderResult = TestExecutionResult | BddExecutionResult | IntegrationEnvironmentResult | ContractVerificationResult;
5
+ export interface CapabilityResolution {
6
+ capability: ValidationCapability;
7
+ provider: string;
8
+ source: "explicit" | "detected" | "fallback";
9
+ command?: string;
10
+ }
11
+ export declare class ValidationCapabilityRegistry {
12
+ private readonly providers;
13
+ constructor();
14
+ register(provider: ValidationProvider<ValidationProviderResult>): void;
15
+ list(capability?: ValidationCapability): string[];
16
+ resolve(context: ValidationProviderContext): Promise<CapabilityResolution | undefined>;
17
+ }
18
+ export declare const validationCapabilityRegistry: ValidationCapabilityRegistry;
19
+ export declare function runCapabilityValidator(context: ValidationProviderContext, id: string, capability: ValidationCapability, required: boolean): Promise<ReturnType<typeof resultCheck>>;
20
+ export declare function providerSpecFor(config: HarnessProjectConfig, capability: ValidationCapability, spec?: ValidatorSpec): ValidationProviderSpec | undefined;
21
+ export declare function capabilityRequirements(contract: TaskContract): ValidationCapability[];
@@ -0,0 +1,59 @@
1
+ import { GenericBddExecutionProvider, runBddExecution } from "./bddExecution.js";
2
+ import { IntegrationEnvironmentProvider } from "./integrationEnvironment.js";
3
+ import { PactContractTestingProvider, runPactVerification } from "./pact.js";
4
+ import { ReqnrollBddProvider } from "./reqnroll.js";
5
+ import { resultCheck } from "./protocol.js";
6
+ import { ProjectNativeTestExecutionProvider, runTestExecution } from "./testExecution.js";
7
+ export class ValidationCapabilityRegistry {
8
+ providers = [];
9
+ constructor() {
10
+ this.register(new ProjectNativeTestExecutionProvider());
11
+ this.register(new GenericBddExecutionProvider());
12
+ this.register(new IntegrationEnvironmentProvider());
13
+ this.register(new PactContractTestingProvider());
14
+ }
15
+ register(provider) { this.providers.push(provider); }
16
+ list(capability) { return this.providers.filter((provider) => !capability || provider.capabilities.includes(capability)).map((provider) => provider.id); }
17
+ async resolve(context) {
18
+ const candidates = this.providers.filter((candidate) => candidate.capabilities.includes(context.capability));
19
+ const provider = (context.providerSpec?.provider ? candidates.find((candidate) => candidate.id === context.providerSpec?.provider) : undefined) ?? candidates[0];
20
+ if (!provider)
21
+ return undefined;
22
+ const detection = await provider.detect(context);
23
+ if (!detection)
24
+ return undefined;
25
+ return { capability: context.capability, provider: detection.provider, source: context.providerSpec || context.spec?.command ? "explicit" : "detected", command: detection.command };
26
+ }
27
+ }
28
+ export const validationCapabilityRegistry = new ValidationCapabilityRegistry();
29
+ export async function runCapabilityValidator(context, id, capability, required) {
30
+ const effective = { ...context, capability };
31
+ if (capability === "bdd") {
32
+ const execution = await runBddExecution(effective, effective.spec?.options?.provider === "reqnroll" ? new ReqnrollBddProvider() : undefined);
33
+ return resultCheck(id, "bdd", execution.result, required);
34
+ }
35
+ if (capability === "contract-test")
36
+ return resultCheck(id, "contract", (await runPactVerification(effective)).result, required);
37
+ if (effective.spec?.adapter === "integration-environment" || ["integration-environment", "oci", "docker", "podman"].includes(effective.providerSpec?.provider ?? "") || typeof (effective.spec?.options ?? effective.providerSpec?.options)?.provisionCommand === "string") {
38
+ const provider = new IntegrationEnvironmentProvider();
39
+ const doctor = await provider.doctor(effective);
40
+ if (!doctor.available)
41
+ return resultCheck(id, "integration-environment", { version: 1, provider: doctor.provider, capability: "integration-test", status: doctor.details?.securityFailures ? "FAIL" : "SKIP", requirements: [], lifecycle: { provisioned: false, ready: false, tested: false, cleaned: false, durationMs: 0 }, rawArtifact: "" }, required);
42
+ const detection = await provider.detect(effective);
43
+ if (!detection)
44
+ return resultCheck(id, "integration-environment", { version: 1, provider: provider.id, capability: "integration-test", status: "SKIP", requirements: [], lifecycle: { provisioned: false, ready: false, tested: false, cleaned: false, durationMs: 0 }, rawArtifact: "" }, required);
45
+ const plan = await provider.plan(effective, detection);
46
+ const execution = await provider.execute(effective, plan);
47
+ return resultCheck(id, "integration-environment", await provider.normalize(effective, execution), required);
48
+ }
49
+ return resultCheck(id, capability, (await runTestExecution(effective)).result, required);
50
+ }
51
+ export function providerSpecFor(config, capability, spec) {
52
+ const providerName = typeof spec?.options?.provider === "string" ? spec.options.provider : undefined;
53
+ return config.validation?.providers?.find((item) => item.capability === capability && (!providerName || item.provider === providerName || item.id === providerName));
54
+ }
55
+ export function capabilityRequirements(contract) {
56
+ const declared = [...(contract.verification?.capabilities ?? []), ...(contract.requirements ?? []).flatMap((item) => item.capabilities ?? [])];
57
+ return [...new Set(declared)];
58
+ }
59
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/providers/validation/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,kCAAkC,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAY1F,MAAM,OAAO,4BAA4B;IACtB,SAAS,GAAwD,EAAE,CAAC;IAErF;QACE,IAAI,CAAC,QAAQ,CAAC,IAAI,kCAAkC,EAAkD,CAAC,CAAC;QACxG,IAAI,CAAC,QAAQ,CAAC,IAAI,2BAA2B,EAAkD,CAAC,CAAC;QACjG,IAAI,CAAC,QAAQ,CAAC,IAAI,8BAA8B,EAAkD,CAAC,CAAC;QACpG,IAAI,CAAC,QAAQ,CAAC,IAAI,2BAA2B,EAAkD,CAAC,CAAC;IACnG,CAAC;IAED,QAAQ,CAAC,QAAsD,IAAU,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEzG,IAAI,CAAC,UAAiC,IAAc,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,UAAU,IAAI,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE3L,KAAK,CAAC,OAAO,CAAC,OAAkC;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAC7G,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QACjK,IAAI,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC;QAChC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAAC,IAAI,CAAC,SAAS;YAAE,OAAO,SAAS,CAAC;QACnF,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC;IACvL,CAAC;CACF;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,4BAA4B,EAAE,CAAC;AAE/E,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAAkC,EAAE,EAAU,EAAE,UAAgC,EAAE,QAAiB;IAC9I,MAAM,SAAS,GAAG,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,CAAC;IAC7C,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,mBAAmB,EAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACpJ,OAAO,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,UAAU,KAAK,eAAe;QAAE,OAAO,WAAW,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,MAAM,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChI,IAAI,SAAS,CAAC,IAAI,EAAE,OAAO,KAAK,yBAAyB,IAAI,CAAC,yBAAyB,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,EAAE,QAAQ,IAAI,EAAE,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,IAAI,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QAC3Q,MAAM,QAAQ,GAAG,IAAI,8BAA8B,EAAE,CAAC;QAAC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAAC,IAAI,CAAC,MAAM,CAAC,SAAS;YAAE,OAAO,WAAW,CAAC,EAAE,EAAE,yBAAyB,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;QAAC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAAC,IAAI,CAAC,SAAS;YAAE,OAAO,WAAW,CAAC,EAAE,EAAE,yBAAyB,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;QAAC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAAC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAAC,OAAO,WAAW,CAAC,EAAE,EAAE,yBAAyB,EAAE,MAAM,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC;IAChgC,CAAC;IACD,OAAO,WAAW,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAA4B,EAAE,UAAgC,EAAE,IAAoB;IAClH,MAAM,YAAY,GAAG,OAAO,IAAI,EAAE,OAAO,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACrG,OAAO,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,UAAU,IAAI,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY,IAAI,IAAI,CAAC,EAAE,KAAK,YAAY,CAAC,CAAC,CAAC;AACvK,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAsB;IAC3D,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,EAAE,YAAY,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC;IAAC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AAChL,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { GenericBddExecutionProvider } from "./bddExecution.js";
2
+ import type { ProviderDetection, ValidationProviderContext } from "./types.js";
3
+ /** Optional compatibility adapter. It is never selected by the generic BDD path. */
4
+ export declare class ReqnrollBddProvider extends GenericBddExecutionProvider {
5
+ readonly id: string;
6
+ detect(context: ValidationProviderContext): Promise<ProviderDetection | undefined>;
7
+ }
@@ -0,0 +1,50 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { commandExists } from "../../utils/process.js";
4
+ import { GenericBddExecutionProvider } from "./bddExecution.js";
5
+ /** Optional compatibility adapter. It is never selected by the generic BDD path. */
6
+ export class ReqnrollBddProvider extends GenericBddExecutionProvider {
7
+ id = "reqnroll";
8
+ async detect(context) {
9
+ const explicit = await super.detect(context);
10
+ if (explicit)
11
+ return explicit;
12
+ if (!(await commandExists("dotnet", context.root)))
13
+ return undefined;
14
+ const project = await findProject(context.root);
15
+ if (!project)
16
+ return undefined;
17
+ const content = await fs.readFile(project, "utf8");
18
+ const filterProperty = /Reqnroll\.xUnit/i.test(content) ? "Category" : "TestCategory";
19
+ return { provider: "reqnroll", command: `dotnet test '${project.replaceAll("'", "'\\''")}' --filter '${filterProperty}=${context.contract.task.id}'`, runtime: ".NET", reason: "explicit optional Reqnroll compatibility adapter" };
20
+ }
21
+ }
22
+ async function findProject(root) {
23
+ for (const file of await walk(root)) {
24
+ if (!file.endsWith(".csproj"))
25
+ continue;
26
+ try {
27
+ if (/Reqnroll\./i.test(await fs.readFile(file, "utf8")))
28
+ return file;
29
+ }
30
+ catch { /* generated/vendor project */ }
31
+ }
32
+ return undefined;
33
+ }
34
+ async function walk(root) {
35
+ const output = [];
36
+ const visit = async (directory) => {
37
+ for (const entry of await fs.readdir(directory, { withFileTypes: true })) {
38
+ if ([".git", "node_modules", "bin", "obj"].includes(entry.name))
39
+ continue;
40
+ const file = path.join(directory, entry.name);
41
+ if (entry.isDirectory())
42
+ await visit(file);
43
+ else
44
+ output.push(file);
45
+ }
46
+ };
47
+ await visit(root);
48
+ return output;
49
+ }
50
+ //# sourceMappingURL=reqnroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reqnroll.js","sourceRoot":"","sources":["../../../src/providers/validation/reqnroll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAGhE,oFAAoF;AACpF,MAAM,OAAO,mBAAoB,SAAQ,2BAA2B;IAChD,EAAE,GAAW,UAAU,CAAC;IAEjC,KAAK,CAAC,MAAM,CAAC,OAAkC;QACtD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,IAAI,CAAC,CAAC,MAAM,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QACrE,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAAC,MAAM,cAAc,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC;QAC1I,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,eAAe,cAAc,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,kDAAkD,EAAE,CAAC;IACtO,CAAC;CACF;AAED,KAAK,UAAU,WAAW,CAAC,IAAY;IACrC,KAAK,MAAM,IAAI,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,SAAS;QACxC,IAAI,CAAC;YAAC,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;IACxH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,IAAY;IAC9B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,KAAK,EAAE,SAAiB,EAAiB,EAAE;QACvD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACzE,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAAC,IAAI,KAAK,CAAC,WAAW,EAAE;gBAAE,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;;gBAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpH,CAAC;IACH,CAAC,CAAC;IACF,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IAAC,OAAO,MAAM,CAAC;AACnC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ValidationCapability } from "../../core/types.js";
2
+ import type { ProviderDetection, ProviderDoctorResult, ProviderExecution, ProviderPlan, TestExecutionResult, ValidationProvider, ValidationProviderContext } from "./types.js";
3
+ export declare class ProjectNativeTestExecutionProvider implements ValidationProvider<TestExecutionResult> {
4
+ readonly id = "project-native-test";
5
+ readonly capabilities: ValidationCapability[];
6
+ detect(context: ValidationProviderContext): Promise<ProviderDetection | undefined>;
7
+ doctor(context: ValidationProviderContext): Promise<ProviderDoctorResult>;
8
+ plan(context: ValidationProviderContext, detection?: ProviderDetection): Promise<ProviderPlan>;
9
+ execute(context: ValidationProviderContext, plan: ProviderPlan): Promise<ProviderExecution>;
10
+ normalize(context: ValidationProviderContext, execution: ProviderExecution): Promise<TestExecutionResult>;
11
+ }
12
+ export declare function runTestExecution(context: ValidationProviderContext, provider?: ValidationProvider<TestExecutionResult>): Promise<{
13
+ result: TestExecutionResult;
14
+ checkRequired: boolean;
15
+ }>;
@@ -0,0 +1,122 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { commandExists } from "../../utils/process.js";
4
+ import { configuredCommand, doctorForCommand, executePlan, fileExists, resolveCwd } from "./providerUtils.js";
5
+ import { parseJson, persistRawArtifact } from "./protocol.js";
6
+ export class ProjectNativeTestExecutionProvider {
7
+ id = "project-native-test";
8
+ capabilities = ["unit-test", "integration-test"];
9
+ async detect(context) {
10
+ const explicit = await configuredCommand(context);
11
+ if (explicit.command)
12
+ return { provider: explicit.provider, command: explicit.command, runtime: explicit.runtime, reason: "explicit project provider configuration" };
13
+ const packageJson = await readPackageJson(context.root);
14
+ if (packageJson?.scripts?.test)
15
+ return { provider: "node-project-test", command: "npm test", runtime: "node", reason: "package.json test script" };
16
+ if (await fileExists(path.join(context.root, "pyproject.toml")) || await fileExists(path.join(context.root, "setup.cfg")) || await fileExists(path.join(context.root, "pytest.ini"))) {
17
+ if (await commandExists("pytest", context.root))
18
+ return { provider: "python-pytest", command: "pytest -q", runtime: "python", reason: "Python test configuration and pytest executable" };
19
+ if (await commandExists("python3", context.root))
20
+ return { provider: "python-unittest", command: "python3 -m unittest discover", runtime: "python", reason: "Python test configuration and Python runtime" };
21
+ }
22
+ if (await fileExists(path.join(context.root, "go.mod")) && await commandExists("go", context.root))
23
+ return { provider: "go-test", command: "go test ./...", runtime: "go", reason: "go.mod and Go runtime" };
24
+ if (await fileExists(path.join(context.root, "Cargo.toml")) && await commandExists("cargo", context.root))
25
+ return { provider: "cargo-test", command: "cargo test", runtime: "rust", reason: "Cargo manifest and Rust runtime" };
26
+ return undefined;
27
+ }
28
+ async doctor(context) {
29
+ const detection = await this.detect(context);
30
+ if (!detection)
31
+ return { provider: this.id, available: false, message: "No project-native test provider was detected." };
32
+ return doctorForCommand(detection.command, resolveCwd(context), detection.provider, { runtime: detection.runtime, reason: detection.reason });
33
+ }
34
+ async plan(context, detection) {
35
+ const selected = detection ?? await this.detect(context);
36
+ if (!selected?.command)
37
+ throw new Error("No test execution provider or command is configured.");
38
+ return { provider: selected.provider, capability: context.capability, command: renderCommand(selected.command, context), cwd: resolveCwd(context), runtime: selected.runtime, options: { timeoutMs: (context.spec?.timeoutSeconds ?? context.providerSpec?.timeoutSeconds ?? 900) * 1000 } };
39
+ }
40
+ async execute(context, plan) {
41
+ const execution = await executePlan(plan);
42
+ const id = context.spec?.id ?? context.providerSpec?.id ?? `${context.capability}-${plan.provider}`;
43
+ return { ...execution, rawArtifact: await persistRawArtifact(context.root, context.rawArtifactDirectory, id, execution.stdout, execution.stderr) };
44
+ }
45
+ async normalize(context, execution) {
46
+ const parsed = parseJson(execution.stdout);
47
+ const result = normalizeStructured(parsed, execution, context.capability) ?? normalizeText(execution.stdout, execution.stderr, execution, context.capability);
48
+ result.requirements = requirementIds(context);
49
+ result.rawArtifact = execution.rawArtifact;
50
+ return result;
51
+ }
52
+ }
53
+ export async function runTestExecution(context, provider = new ProjectNativeTestExecutionProvider()) {
54
+ const detection = await provider.detect(context);
55
+ if (!detection) {
56
+ return { result: { version: 1, provider: provider.id, capability: context.capability, command: "", status: "SKIP", summary: { total: 0, passed: 0, failed: 0, skipped: 0, durationMs: 0 }, failures: [{ message: "No project-native test command was detected." }], requirements: requirementIds(context), rawArtifact: "" }, checkRequired: context.spec?.required ?? context.providerSpec?.required ?? true };
57
+ }
58
+ const plan = await provider.plan(context, detection);
59
+ const execution = await provider.execute(context, plan);
60
+ const result = await provider.normalize(context, execution);
61
+ return { result, checkRequired: context.spec?.required ?? context.providerSpec?.required ?? true };
62
+ }
63
+ function renderCommand(command, context) {
64
+ return command.replaceAll("{taskId}", context.contract.task.id).replaceAll("{baseRef}", context.baseRef ?? "HEAD").replaceAll("{acceptance}", context.contract.source?.acceptance ?? "");
65
+ }
66
+ async function readPackageJson(root) {
67
+ try {
68
+ return JSON.parse(await fs.readFile(path.join(root, "package.json"), "utf8"));
69
+ }
70
+ catch {
71
+ return undefined;
72
+ }
73
+ }
74
+ function requirementIds(context) {
75
+ return (context.contract.requirements ?? []).filter((item) => item.capabilities?.includes(context.capability) || !item.capabilities?.length).map((item) => item.id);
76
+ }
77
+ function normalizeStructured(value, execution, capability) {
78
+ if (!value || typeof value !== "object" || Array.isArray(value))
79
+ return undefined;
80
+ const record = value;
81
+ if (record.version === 1 && typeof record.provider === "string" && record.summary && typeof record.summary === "object") {
82
+ const summary = record.summary;
83
+ return { version: 1, provider: String(record.provider), capability, command: execution.plan.command, runtime: execution.plan.runtime, status: asStatus(record.status, execution.exitCode), summary: { total: number(summary.total), passed: number(summary.passed), failed: number(summary.failed), skipped: number(summary.skipped), durationMs: number(summary.durationMs) || execution.durationMs }, failures: failures(record.failures), requirements: [], rawArtifact: execution.rawArtifact };
84
+ }
85
+ const tests = Array.isArray(record.tests) ? record.tests : Array.isArray(record.testResults) ? record.testResults : [];
86
+ if (!tests.length && !record.summary)
87
+ return undefined;
88
+ const parsedFailures = tests.flatMap((test) => { const item = asRecord(test); const status = String(item.status ?? "").toLowerCase(); return status === "failed" || status === "fail" ? [{ id: stringValue(item.id ?? item.name), message: String(item.message ?? item.error ?? "test failed"), source: source(item) }] : []; });
89
+ const summary = asRecord(record.summary);
90
+ const total = number(summary.total) || tests.length;
91
+ const failed = number(summary.failed) || parsedFailures.length;
92
+ const skipped = number(summary.skipped);
93
+ const passed = number(summary.passed) || Math.max(0, total - failed - skipped);
94
+ return { version: 1, provider: execution.plan.provider, capability, command: execution.plan.command, runtime: execution.plan.runtime, status: asStatus(record.status, execution.exitCode), summary: { total, passed, failed, skipped, durationMs: number(summary.durationMs) || execution.durationMs }, failures: parsedFailures, requirements: [], rawArtifact: execution.rawArtifact };
95
+ }
96
+ function normalizeText(stdout, stderr, execution, capability) {
97
+ const text = `${stdout}\n${stderr}`;
98
+ const failures = [];
99
+ for (const line of text.split(/\r?\n/))
100
+ if (/^\s*(not ok|FAIL(?:ED)?\b)/i.test(line))
101
+ failures.push({ id: line.replace(/^\s*(not ok|FAIL(?:ED)?\s*:?)\s*/i, "").trim(), message: line.trim() || "test failed" });
102
+ const total = firstNumber(text, [/1\.\.(\d+)/, /(?:tests?|total)\D+(\d+)/i]) ?? 0;
103
+ const skipped = firstNumber(text, [/(\d+)\s+skipped/i, /#\s*skip/gi]) ?? countMatches(text, /#\s*skip/gi);
104
+ const failed = firstNumber(text, [/(\d+)\s+(?:failed|failures)/i]) ?? failures.length;
105
+ const passed = firstNumber(text, [/(\d+)\s+passed/i, /ok\s+(\d+)/i]) ?? Math.max(0, total - failed - skipped);
106
+ const inferredTotal = Math.max(total, passed + failed + skipped);
107
+ return { version: 1, provider: execution.plan.provider, capability, command: execution.plan.command, runtime: execution.plan.runtime, status: execution.exitCode === 0 && failed === 0 ? "PASS" : "FAIL", summary: { total: inferredTotal, passed, failed, skipped, durationMs: execution.durationMs }, failures, requirements: [], rawArtifact: execution.rawArtifact };
108
+ }
109
+ function asStatus(value, exitCode) { const normalized = String(value ?? "").toUpperCase(); if (normalized === "SKIP")
110
+ return "SKIP"; return exitCode === 0 && normalized !== "FAIL" ? "PASS" : "FAIL"; }
111
+ function asRecord(value) { return value && typeof value === "object" && !Array.isArray(value) ? value : {}; }
112
+ function number(value) { return typeof value === "number" && Number.isFinite(value) ? value : 0; }
113
+ function stringValue(value) { return typeof value === "string" || typeof value === "number" ? String(value) : undefined; }
114
+ function source(item) { const source = asRecord(item.source ?? item.location); const file = stringValue(source.file ?? source.path); const line = number(source.line); const column = number(source.column); return file || line || column ? { file, line: line || undefined, column: column || undefined } : undefined; }
115
+ function failures(value) { return Array.isArray(value) ? value.map((item) => { const record = asRecord(item); return { id: stringValue(record.id ?? record.name), message: String(record.message ?? record.error ?? "test failed"), source: source(record) }; }) : []; }
116
+ function firstNumber(value, patterns) { for (const pattern of patterns) {
117
+ const match = value.match(pattern);
118
+ if (match?.[1])
119
+ return Number(match[1]);
120
+ } return undefined; }
121
+ function countMatches(value, pattern) { return [...value.matchAll(pattern)].length; }
122
+ //# sourceMappingURL=testExecution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testExecution.js","sourceRoot":"","sources":["../../../src/providers/validation/testExecution.ts"],"names":[],"mappings":"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"}