forgecraft-mcp 1.3.2 → 1.6.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.
- package/README.md +2 -2
- package/dist/analyzers/anchors/anchor-loader.d.ts +47 -0
- package/dist/analyzers/anchors/anchor-loader.d.ts.map +1 -0
- package/dist/analyzers/anchors/anchor-loader.js +113 -0
- package/dist/analyzers/anchors/anchor-loader.js.map +1 -0
- package/dist/analyzers/anti-pattern.d.ts.map +1 -1
- package/dist/analyzers/anti-pattern.js +38 -26
- package/dist/analyzers/anti-pattern.js.map +1 -1
- package/dist/analyzers/completeness-helpers.d.ts +5 -0
- package/dist/analyzers/completeness-helpers.d.ts.map +1 -1
- package/dist/analyzers/completeness-helpers.js +17 -0
- package/dist/analyzers/completeness-helpers.js.map +1 -1
- package/dist/analyzers/completeness.d.ts.map +1 -1
- package/dist/analyzers/completeness.js +4 -4
- package/dist/analyzers/completeness.js.map +1 -1
- package/dist/analyzers/gs-scorer.d.ts +3 -1
- package/dist/analyzers/gs-scorer.d.ts.map +1 -1
- package/dist/analyzers/gs-scorer.js +5 -2
- package/dist/analyzers/gs-scorer.js.map +1 -1
- package/dist/analyzers/scorers/composable-scorer.d.ts +4 -2
- package/dist/analyzers/scorers/composable-scorer.d.ts.map +1 -1
- package/dist/analyzers/scorers/composable-scorer.js +50 -2
- package/dist/analyzers/scorers/composable-scorer.js.map +1 -1
- package/dist/analyzers/scorers/executable-scorer.d.ts +3 -2
- package/dist/analyzers/scorers/executable-scorer.d.ts.map +1 -1
- package/dist/analyzers/scorers/executable-scorer.js +64 -4
- package/dist/analyzers/scorers/executable-scorer.js.map +1 -1
- package/dist/analyzers/scorers/scorer-utils.d.ts +5 -3
- package/dist/analyzers/scorers/scorer-utils.d.ts.map +1 -1
- package/dist/analyzers/scorers/scorer-utils.js +34 -9
- package/dist/analyzers/scorers/scorer-utils.js.map +1 -1
- package/dist/analyzers/scorers/self-describing-scorer.d.ts +7 -4
- package/dist/analyzers/scorers/self-describing-scorer.d.ts.map +1 -1
- package/dist/analyzers/scorers/self-describing-scorer.js +17 -18
- package/dist/analyzers/scorers/self-describing-scorer.js.map +1 -1
- package/dist/artifacts/commit-hooks.d.ts +1 -1
- package/dist/artifacts/commit-hooks.d.ts.map +1 -1
- package/dist/artifacts/commit-hooks.js +2 -0
- package/dist/artifacts/commit-hooks.js.map +1 -1
- package/dist/cli/commands.d.ts +35 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +109 -2
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +7 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +10 -1
- package/dist/cli.js.map +1 -1
- package/dist/disciplines/catalog.d.ts +16 -0
- package/dist/disciplines/catalog.d.ts.map +1 -0
- package/dist/disciplines/catalog.js +196 -0
- package/dist/disciplines/catalog.js.map +1 -0
- package/dist/disciplines/runner.d.ts +13 -0
- package/dist/disciplines/runner.d.ts.map +1 -0
- package/dist/disciplines/runner.js +35 -0
- package/dist/disciplines/runner.js.map +1 -0
- package/dist/registry/remote-gates.js +1 -1
- package/dist/registry/remote-gates.js.map +1 -1
- package/dist/sentinel/detect.d.ts +41 -0
- package/dist/sentinel/detect.d.ts.map +1 -0
- package/dist/sentinel/detect.js +122 -0
- package/dist/sentinel/detect.js.map +1 -0
- package/dist/sentinel/write.d.ts +54 -0
- package/dist/sentinel/write.d.ts.map +1 -0
- package/dist/sentinel/write.js +75 -0
- package/dist/sentinel/write.js.map +1 -0
- package/dist/shared/cnt-health.d.ts.map +1 -1
- package/dist/shared/cnt-health.js +12 -4
- package/dist/shared/cnt-health.js.map +1 -1
- package/dist/shared/config.d.ts +8 -0
- package/dist/shared/config.d.ts.map +1 -1
- package/dist/shared/config.js +23 -0
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/project-gates-helpers.d.ts +9 -0
- package/dist/shared/project-gates-helpers.d.ts.map +1 -1
- package/dist/shared/project-gates-helpers.js +35 -0
- package/dist/shared/project-gates-helpers.js.map +1 -1
- package/dist/shared/result-utils.d.ts +27 -0
- package/dist/shared/result-utils.d.ts.map +1 -0
- package/dist/shared/result-utils.js +41 -0
- package/dist/shared/result-utils.js.map +1 -0
- package/dist/shared/types/config.d.ts +7 -1
- package/dist/shared/types/config.d.ts.map +1 -1
- package/dist/shared/types/gates.d.ts +28 -0
- package/dist/shared/types/gates.d.ts.map +1 -1
- package/dist/shared/types/project.d.ts +66 -0
- package/dist/shared/types/project.d.ts.map +1 -1
- package/dist/shared/types/project.js.map +1 -1
- package/dist/shared/types/verify.d.ts +51 -1
- package/dist/shared/types/verify.d.ts.map +1 -1
- package/dist/shared/types/verify.js +37 -1
- package/dist/shared/types/verify.js.map +1 -1
- package/dist/tools/advise-session-advisor.d.ts +16 -0
- package/dist/tools/advise-session-advisor.d.ts.map +1 -0
- package/dist/tools/advise-session-advisor.js +89 -0
- package/dist/tools/advise-session-advisor.js.map +1 -0
- package/dist/tools/advise-session-signals.d.ts +21 -0
- package/dist/tools/advise-session-signals.d.ts.map +1 -0
- package/dist/tools/advise-session-signals.js +113 -0
- package/dist/tools/advise-session-signals.js.map +1 -0
- package/dist/tools/advise-session.d.ts +22 -0
- package/dist/tools/advise-session.d.ts.map +1 -0
- package/dist/tools/advise-session.js +31 -0
- package/dist/tools/advise-session.js.map +1 -0
- package/dist/tools/change-request.d.ts +53 -0
- package/dist/tools/change-request.d.ts.map +1 -0
- package/dist/tools/change-request.js +375 -0
- package/dist/tools/change-request.js.map +1 -0
- package/dist/tools/check-cascade-contracts.d.ts +13 -0
- package/dist/tools/check-cascade-contracts.d.ts.map +1 -1
- package/dist/tools/check-cascade-contracts.js +73 -2
- package/dist/tools/check-cascade-contracts.js.map +1 -1
- package/dist/tools/check-cascade.d.ts +4 -3
- package/dist/tools/check-cascade.d.ts.map +1 -1
- package/dist/tools/check-cascade.js +30 -12
- package/dist/tools/check-cascade.js.map +1 -1
- package/dist/tools/check-spec-consistency.d.ts +25 -0
- package/dist/tools/check-spec-consistency.d.ts.map +1 -0
- package/dist/tools/check-spec-consistency.js +339 -0
- package/dist/tools/check-spec-consistency.js.map +1 -0
- package/dist/tools/check-t4.d.ts +54 -0
- package/dist/tools/check-t4.d.ts.map +1 -0
- package/dist/tools/check-t4.js +305 -0
- package/dist/tools/check-t4.js.map +1 -0
- package/dist/tools/close-cycle-helpers.d.ts +21 -2
- package/dist/tools/close-cycle-helpers.d.ts.map +1 -1
- package/dist/tools/close-cycle-helpers.js +66 -10
- package/dist/tools/close-cycle-helpers.js.map +1 -1
- package/dist/tools/close-cycle.d.ts +2 -2
- package/dist/tools/close-cycle.d.ts.map +1 -1
- package/dist/tools/close-cycle.js +342 -4
- package/dist/tools/close-cycle.js.map +1 -1
- package/dist/tools/consolidate-status.d.ts +112 -0
- package/dist/tools/consolidate-status.d.ts.map +1 -0
- package/dist/tools/consolidate-status.js +356 -0
- package/dist/tools/consolidate-status.js.map +1 -0
- package/dist/tools/executable-gates.d.ts +52 -0
- package/dist/tools/executable-gates.d.ts.map +1 -0
- package/dist/tools/executable-gates.js +332 -0
- package/dist/tools/executable-gates.js.map +1 -0
- package/dist/tools/forgecraft-dispatch-extended.d.ts.map +1 -1
- package/dist/tools/forgecraft-dispatch-extended.js +75 -0
- package/dist/tools/forgecraft-dispatch-extended.js.map +1 -1
- package/dist/tools/forgecraft-dispatch.d.ts.map +1 -1
- package/dist/tools/forgecraft-dispatch.js +21 -0
- package/dist/tools/forgecraft-dispatch.js.map +1 -1
- package/dist/tools/forgecraft-router.d.ts +8 -0
- package/dist/tools/forgecraft-router.d.ts.map +1 -1
- package/dist/tools/forgecraft-router.js +21 -1
- package/dist/tools/forgecraft-router.js.map +1 -1
- package/dist/tools/forgecraft-schema-params.d.ts +61 -4
- package/dist/tools/forgecraft-schema-params.d.ts.map +1 -1
- package/dist/tools/forgecraft-schema-params.js +95 -0
- package/dist/tools/forgecraft-schema-params.js.map +1 -1
- package/dist/tools/forgecraft-schema.d.ts +62 -5
- package/dist/tools/forgecraft-schema.d.ts.map +1 -1
- package/dist/tools/forgecraft-schema.js +24 -0
- package/dist/tools/forgecraft-schema.js.map +1 -1
- package/dist/tools/gate-violations.d.ts +59 -0
- package/dist/tools/gate-violations.d.ts.map +1 -0
- package/dist/tools/gate-violations.js +152 -0
- package/dist/tools/gate-violations.js.map +1 -0
- package/dist/tools/generate-adr.js +6 -6
- package/dist/tools/generate-adr.js.map +1 -1
- package/dist/tools/generate-env-probe.d.ts +49 -0
- package/dist/tools/generate-env-probe.d.ts.map +1 -0
- package/dist/tools/generate-env-probe.js +365 -0
- package/dist/tools/generate-env-probe.js.map +1 -0
- package/dist/tools/generate-harness.d.ts +52 -0
- package/dist/tools/generate-harness.d.ts.map +1 -0
- package/dist/tools/generate-harness.js +333 -0
- package/dist/tools/generate-harness.js.map +1 -0
- package/dist/tools/generate-roadmap.d.ts +1 -1
- package/dist/tools/generate-roadmap.d.ts.map +1 -1
- package/dist/tools/generate-roadmap.js +38 -4
- package/dist/tools/generate-roadmap.js.map +1 -1
- package/dist/tools/generate-session-prompt.d.ts +4 -4
- package/dist/tools/generate-session-prompt.d.ts.map +1 -1
- package/dist/tools/generate-session-prompt.js +66 -16
- package/dist/tools/generate-session-prompt.js.map +1 -1
- package/dist/tools/generate-slo-probe.d.ts +53 -0
- package/dist/tools/generate-slo-probe.d.ts.map +1 -0
- package/dist/tools/generate-slo-probe.js +366 -0
- package/dist/tools/generate-slo-probe.js.map +1 -0
- package/dist/tools/layer-status-gates.d.ts +24 -0
- package/dist/tools/layer-status-gates.d.ts.map +1 -0
- package/dist/tools/layer-status-gates.js +151 -0
- package/dist/tools/layer-status-gates.js.map +1 -0
- package/dist/tools/layer-status.d.ts +133 -0
- package/dist/tools/layer-status.d.ts.map +1 -0
- package/dist/tools/layer-status.js +593 -0
- package/dist/tools/layer-status.js.map +1 -0
- package/dist/tools/postcondition-coverage.d.ts +57 -0
- package/dist/tools/postcondition-coverage.d.ts.map +1 -0
- package/dist/tools/postcondition-coverage.js +256 -0
- package/dist/tools/postcondition-coverage.js.map +1 -0
- package/dist/tools/probe-runners.d.ts +21 -0
- package/dist/tools/probe-runners.d.ts.map +1 -0
- package/dist/tools/probe-runners.js +246 -0
- package/dist/tools/probe-runners.js.map +1 -0
- package/dist/tools/probe-templates.d.ts +27 -0
- package/dist/tools/probe-templates.d.ts.map +1 -0
- package/dist/tools/probe-templates.js +279 -0
- package/dist/tools/probe-templates.js.map +1 -0
- package/dist/tools/propose-session.d.ts +28 -0
- package/dist/tools/propose-session.d.ts.map +1 -0
- package/dist/tools/propose-session.js +333 -0
- package/dist/tools/propose-session.js.map +1 -0
- package/dist/tools/roadmap-builder.d.ts +34 -1
- package/dist/tools/roadmap-builder.d.ts.map +1 -1
- package/dist/tools/roadmap-builder.js +153 -11
- package/dist/tools/roadmap-builder.js.map +1 -1
- package/dist/tools/run-env-probe.d.ts +57 -0
- package/dist/tools/run-env-probe.d.ts.map +1 -0
- package/dist/tools/run-env-probe.js +270 -0
- package/dist/tools/run-env-probe.js.map +1 -0
- package/dist/tools/run-harness.d.ts +52 -0
- package/dist/tools/run-harness.d.ts.map +1 -0
- package/dist/tools/run-harness.js +279 -0
- package/dist/tools/run-harness.js.map +1 -0
- package/dist/tools/run-slo-probe.d.ts +50 -0
- package/dist/tools/run-slo-probe.d.ts.map +1 -0
- package/dist/tools/run-slo-probe.js +281 -0
- package/dist/tools/run-slo-probe.js.map +1 -0
- package/dist/tools/scaffold-writer.d.ts.map +1 -1
- package/dist/tools/scaffold-writer.js +4 -0
- package/dist/tools/scaffold-writer.js.map +1 -1
- package/dist/tools/session-prompt-builders.d.ts +20 -0
- package/dist/tools/session-prompt-builders.d.ts.map +1 -1
- package/dist/tools/session-prompt-builders.js +111 -14
- package/dist/tools/session-prompt-builders.js.map +1 -1
- package/dist/tools/session-prompt-sections.d.ts +4 -2
- package/dist/tools/session-prompt-sections.d.ts.map +1 -1
- package/dist/tools/session-prompt-sections.js +22 -10
- package/dist/tools/session-prompt-sections.js.map +1 -1
- package/dist/tools/setup-monitoring.d.ts +41 -0
- package/dist/tools/setup-monitoring.d.ts.map +1 -0
- package/dist/tools/setup-monitoring.js +364 -0
- package/dist/tools/setup-monitoring.js.map +1 -0
- package/dist/tools/verify-formatter.d.ts.map +1 -1
- package/dist/tools/verify-formatter.js +15 -1
- package/dist/tools/verify-formatter.js.map +1 -1
- package/dist/tools/verify.d.ts.map +1 -1
- package/dist/tools/verify.js +3 -0
- package/dist/tools/verify.js.map +1 -1
- package/package.json +11 -2
- package/templates/api/harness/uc-template.hurl +20 -0
- package/templates/docs-manifest.yaml +224 -0
- package/templates/game/harness/uc-template.sim.ts +29 -0
- package/templates/universal/claude-md-blocks/layer-navigation.md +20 -0
- package/templates/universal/claude-md-blocks/nfr-contracts.md +22 -0
- package/templates/universal/hooks.yaml +212 -20
- package/templates/web-react/harness/uc-template.spec.ts +35 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Postcondition coverage analysis for L2 harness probes.
|
|
3
|
+
*
|
|
4
|
+
* Parses **Acceptance Criteria** and **Postcondition** sections from use-cases.md,
|
|
5
|
+
* counts machine-detectable assertions in corresponding probe files,
|
|
6
|
+
* and computes a per-UC coverage ratio.
|
|
7
|
+
*
|
|
8
|
+
* A "hollow" probe is one that runs and exits 0 but contains zero assertion signals —
|
|
9
|
+
* more dangerous than not_implemented because it produces false confidence.
|
|
10
|
+
*/
|
|
11
|
+
export interface UcPostconditionCoverage {
|
|
12
|
+
readonly ucId: string;
|
|
13
|
+
readonly title: string;
|
|
14
|
+
/** Count of Acceptance Criteria bullets + Postcondition lines in use-cases.md */
|
|
15
|
+
readonly postconditionCount: number;
|
|
16
|
+
/** Total assertion signals detected across all probe files for this UC */
|
|
17
|
+
readonly assertionCount: number;
|
|
18
|
+
/** assertionCount / postconditionCount, capped at 1.0 */
|
|
19
|
+
readonly coverageRatio: number;
|
|
20
|
+
/** Probe files found for this UC */
|
|
21
|
+
readonly probeFiles: ReadonlyArray<string>;
|
|
22
|
+
/** true when probe file exists but 0 assertion signals detected */
|
|
23
|
+
readonly hollow: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Parse postcondition + acceptance criteria count for a single UC block.
|
|
27
|
+
* Returns 0 if no postcondition sections found.
|
|
28
|
+
*/
|
|
29
|
+
export declare function parsePostconditionCount(ucBlock: string): number;
|
|
30
|
+
/**
|
|
31
|
+
* Split use-cases.md content into per-UC blocks keyed by UC-NNN id.
|
|
32
|
+
*/
|
|
33
|
+
export declare function splitUcBlocks(content: string): Map<string, string>;
|
|
34
|
+
/**
|
|
35
|
+
* Count assertion signals in a probe file based on its extension.
|
|
36
|
+
* Returns { count, isStub } — stubs are tracked separately.
|
|
37
|
+
*/
|
|
38
|
+
export declare function countProbeAssertions(filePath: string): {
|
|
39
|
+
count: number;
|
|
40
|
+
isStub: boolean;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Compute postcondition coverage for all use cases.
|
|
44
|
+
*
|
|
45
|
+
* @param projectDir - Absolute project root
|
|
46
|
+
* @param ucs - Array of { id, title } from parseUseCases()
|
|
47
|
+
* @returns Per-UC coverage report
|
|
48
|
+
*/
|
|
49
|
+
export declare function computePostconditionCoverage(projectDir: string, ucs: ReadonlyArray<{
|
|
50
|
+
id: string;
|
|
51
|
+
title: string;
|
|
52
|
+
}>): UcPostconditionCoverage[];
|
|
53
|
+
/**
|
|
54
|
+
* Format a postcondition coverage table for display.
|
|
55
|
+
*/
|
|
56
|
+
export declare function formatCoverageTable(coverage: ReadonlyArray<UcPostconditionCoverage>): string;
|
|
57
|
+
//# sourceMappingURL=postcondition-coverage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postcondition-coverage.d.ts","sourceRoot":"","sources":["../../src/tools/postcondition-coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,0EAA0E;IAC1E,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,yDAAyD;IACzD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,oCAAoC;IACpC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3C,mEAAmE;IACnE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAID;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAkB/D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAQlE;AAmGD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB,CAmBA;AAID;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,aAAa,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAChD,uBAAuB,EAAE,CA4D3B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,aAAa,CAAC,uBAAuB,CAAC,GAC/C,MAAM,CA8BR"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Postcondition coverage analysis for L2 harness probes.
|
|
3
|
+
*
|
|
4
|
+
* Parses **Acceptance Criteria** and **Postcondition** sections from use-cases.md,
|
|
5
|
+
* counts machine-detectable assertions in corresponding probe files,
|
|
6
|
+
* and computes a per-UC coverage ratio.
|
|
7
|
+
*
|
|
8
|
+
* A "hollow" probe is one that runs and exits 0 but contains zero assertion signals —
|
|
9
|
+
* more dangerous than not_implemented because it produces false confidence.
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
// ── Postcondition Parsing ─────────────────────────────────────────────
|
|
14
|
+
/**
|
|
15
|
+
* Parse postcondition + acceptance criteria count for a single UC block.
|
|
16
|
+
* Returns 0 if no postcondition sections found.
|
|
17
|
+
*/
|
|
18
|
+
export function parsePostconditionCount(ucBlock) {
|
|
19
|
+
let count = 0;
|
|
20
|
+
// Count **Postcondition**: lines (usually 1, occasionally a list)
|
|
21
|
+
const postconditionMatches = ucBlock.match(/\*\*Postcondition\*\*:/g);
|
|
22
|
+
if (postconditionMatches)
|
|
23
|
+
count += postconditionMatches.length;
|
|
24
|
+
// Count **Acceptance Criteria** bullets — each [ ] item is a checkable postcondition
|
|
25
|
+
const acSection = /\*\*Acceptance Criteria\*\*[^:]*:([\s\S]*?)(?=\n##|\n\*\*[A-Z]|$)/.exec(ucBlock);
|
|
26
|
+
if (acSection) {
|
|
27
|
+
const bullets = acSection[1].match(/^\s*-\s+\[[ x?]\]/gm);
|
|
28
|
+
if (bullets)
|
|
29
|
+
count += bullets.length;
|
|
30
|
+
}
|
|
31
|
+
return count;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Split use-cases.md content into per-UC blocks keyed by UC-NNN id.
|
|
35
|
+
*/
|
|
36
|
+
export function splitUcBlocks(content) {
|
|
37
|
+
const blocks = new Map();
|
|
38
|
+
const sections = content.split(/^(?=##\s+UC-\d{3}:)/m);
|
|
39
|
+
for (const section of sections) {
|
|
40
|
+
const m = /^##\s+(UC-\d{3}):/m.exec(section);
|
|
41
|
+
if (m)
|
|
42
|
+
blocks.set(m[1].toUpperCase(), section);
|
|
43
|
+
}
|
|
44
|
+
return blocks;
|
|
45
|
+
}
|
|
46
|
+
// ── Assertion Detection ───────────────────────────────────────────────
|
|
47
|
+
/** Count assertion signals in a shell probe file (.sh). */
|
|
48
|
+
function countShAssertions(content) {
|
|
49
|
+
let count = 0;
|
|
50
|
+
const lines = content.split("\n");
|
|
51
|
+
for (const line of lines) {
|
|
52
|
+
const trimmed = line.trim();
|
|
53
|
+
if (trimmed.startsWith("#"))
|
|
54
|
+
continue;
|
|
55
|
+
// Structural assertion patterns in shell
|
|
56
|
+
if (/\bgrep\b/.test(trimmed))
|
|
57
|
+
count++;
|
|
58
|
+
if (/\bcurl\b.*--fail/.test(trimmed))
|
|
59
|
+
count++;
|
|
60
|
+
if (/HTTP_CODE|STATUS|status_code/.test(trimmed))
|
|
61
|
+
count++;
|
|
62
|
+
if (/\[\s*"\$/.test(trimmed) && /==|!=|-eq|-ne/.test(trimmed))
|
|
63
|
+
count++;
|
|
64
|
+
if (/\[\[\s*/.test(trimmed) && /==|!=/.test(trimmed))
|
|
65
|
+
count++;
|
|
66
|
+
if (/\bassert\b/.test(trimmed))
|
|
67
|
+
count++;
|
|
68
|
+
if (/\bfail\b.*"/.test(trimmed) && /expected|should|must/.test(trimmed))
|
|
69
|
+
count++;
|
|
70
|
+
// HTTP status checks common in forgecraft probes
|
|
71
|
+
if (/200|201|204|400|401|403|404|409|422|500/.test(trimmed) &&
|
|
72
|
+
/\$/.test(trimmed))
|
|
73
|
+
count++;
|
|
74
|
+
if (/jq\s+/.test(trimmed) && /\|/.test(trimmed))
|
|
75
|
+
count++;
|
|
76
|
+
}
|
|
77
|
+
return count;
|
|
78
|
+
}
|
|
79
|
+
/** Count assertion signals in a TypeScript/Jest probe file (.spec.ts, .sim.ts). */
|
|
80
|
+
function countTsAssertions(content) {
|
|
81
|
+
const patterns = [
|
|
82
|
+
/\bexpect\s*\(/g,
|
|
83
|
+
/\bassert\s*\./g,
|
|
84
|
+
/\.toBe\s*\(/g,
|
|
85
|
+
/\.toEqual\s*\(/g,
|
|
86
|
+
/\.toContain\s*\(/g,
|
|
87
|
+
/\.toHaveLength\s*\(/g,
|
|
88
|
+
/\.toHaveBeenCalled/g,
|
|
89
|
+
/\.toMatchObject\s*\(/g,
|
|
90
|
+
/\.toThrow\s*\(/g,
|
|
91
|
+
/\.resolves\./g,
|
|
92
|
+
/\.rejects\./g,
|
|
93
|
+
];
|
|
94
|
+
let count = 0;
|
|
95
|
+
for (const pattern of patterns) {
|
|
96
|
+
const matches = content.match(pattern);
|
|
97
|
+
if (matches)
|
|
98
|
+
count += matches.length;
|
|
99
|
+
}
|
|
100
|
+
return count;
|
|
101
|
+
}
|
|
102
|
+
/** Count assertion signals in a Hurl HTTP probe file (.hurl). */
|
|
103
|
+
function countHurlAssertions(content) {
|
|
104
|
+
let count = 0;
|
|
105
|
+
const lines = content.split("\n");
|
|
106
|
+
let inAsserts = false;
|
|
107
|
+
for (const line of lines) {
|
|
108
|
+
if (/^\[Asserts\]/.test(line)) {
|
|
109
|
+
inAsserts = true;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (/^\[/.test(line) && inAsserts)
|
|
113
|
+
inAsserts = false;
|
|
114
|
+
if (inAsserts && line.trim() && !line.trim().startsWith("#"))
|
|
115
|
+
count++;
|
|
116
|
+
if (/^HTTP\s+[2345]\d{2}/.test(line.trim()))
|
|
117
|
+
count++;
|
|
118
|
+
}
|
|
119
|
+
return count;
|
|
120
|
+
}
|
|
121
|
+
/** Count assertion signals in a k6 load test file (.k6.js). */
|
|
122
|
+
function countK6Assertions(content) {
|
|
123
|
+
const patterns = [
|
|
124
|
+
/\bcheck\s*\(/g,
|
|
125
|
+
/\bexpect\s*\(/g,
|
|
126
|
+
/===|!==/.test(content) && /response|res\b/.test(content)
|
|
127
|
+
? /===|!==\s*\d+/g
|
|
128
|
+
: null,
|
|
129
|
+
].filter((p) => p !== null);
|
|
130
|
+
let count = 0;
|
|
131
|
+
for (const p of patterns) {
|
|
132
|
+
const m = content.match(p);
|
|
133
|
+
if (m)
|
|
134
|
+
count += m.length;
|
|
135
|
+
}
|
|
136
|
+
return count;
|
|
137
|
+
}
|
|
138
|
+
/** Detect if a probe file is a stub (contains TODO markers and no real logic). */
|
|
139
|
+
function isStubProbe(content) {
|
|
140
|
+
const todoCount = (content.match(/TODO|FIXME|NOT.IMPLEMENTED|not.implemented/gi) ?? []).length;
|
|
141
|
+
const lineCount = content
|
|
142
|
+
.split("\n")
|
|
143
|
+
.filter((l) => l.trim() && !l.trim().startsWith("#")).length;
|
|
144
|
+
return todoCount > 0 && lineCount < 10;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Count assertion signals in a probe file based on its extension.
|
|
148
|
+
* Returns { count, isStub } — stubs are tracked separately.
|
|
149
|
+
*/
|
|
150
|
+
export function countProbeAssertions(filePath) {
|
|
151
|
+
let content = "";
|
|
152
|
+
try {
|
|
153
|
+
content = readFileSync(filePath, "utf-8");
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return { count: 0, isStub: false };
|
|
157
|
+
}
|
|
158
|
+
if (isStubProbe(content))
|
|
159
|
+
return { count: 0, isStub: true };
|
|
160
|
+
if (filePath.endsWith(".sh"))
|
|
161
|
+
return { count: countShAssertions(content), isStub: false };
|
|
162
|
+
if (filePath.endsWith(".spec.ts") || filePath.endsWith(".sim.ts")) {
|
|
163
|
+
return { count: countTsAssertions(content), isStub: false };
|
|
164
|
+
}
|
|
165
|
+
if (filePath.endsWith(".hurl"))
|
|
166
|
+
return { count: countHurlAssertions(content), isStub: false };
|
|
167
|
+
if (filePath.endsWith(".k6.js"))
|
|
168
|
+
return { count: countK6Assertions(content), isStub: false };
|
|
169
|
+
return { count: 0, isStub: false };
|
|
170
|
+
}
|
|
171
|
+
// ── Main Export ───────────────────────────────────────────────────────
|
|
172
|
+
/**
|
|
173
|
+
* Compute postcondition coverage for all use cases.
|
|
174
|
+
*
|
|
175
|
+
* @param projectDir - Absolute project root
|
|
176
|
+
* @param ucs - Array of { id, title } from parseUseCases()
|
|
177
|
+
* @returns Per-UC coverage report
|
|
178
|
+
*/
|
|
179
|
+
export function computePostconditionCoverage(projectDir, ucs) {
|
|
180
|
+
const useCasesPath = join(projectDir, "docs", "use-cases.md");
|
|
181
|
+
const ucBlocks = existsSync(useCasesPath)
|
|
182
|
+
? splitUcBlocks(readFileSync(useCasesPath, "utf-8"))
|
|
183
|
+
: new Map();
|
|
184
|
+
const harnessDir = join(projectDir, "tests", "harness");
|
|
185
|
+
const allProbeFiles = existsSync(harnessDir)
|
|
186
|
+
? readdirSync(harnessDir).filter((f) => f.endsWith(".sh") ||
|
|
187
|
+
f.endsWith(".spec.ts") ||
|
|
188
|
+
f.endsWith(".hurl") ||
|
|
189
|
+
f.endsWith(".sim.ts") ||
|
|
190
|
+
f.endsWith(".k6.js"))
|
|
191
|
+
: [];
|
|
192
|
+
return ucs.map((uc) => {
|
|
193
|
+
const ucId = uc.id.toUpperCase();
|
|
194
|
+
const lower = ucId.toLowerCase().replace(/_/g, "-");
|
|
195
|
+
// Postcondition count from spec
|
|
196
|
+
const block = ucBlocks.get(ucId) ?? "";
|
|
197
|
+
const postconditionCount = parsePostconditionCount(block);
|
|
198
|
+
// Find probe files for this UC
|
|
199
|
+
const probeFiles = allProbeFiles.filter((f) => f.toLowerCase().startsWith(lower + "-") ||
|
|
200
|
+
f.toLowerCase().startsWith(lower + "."));
|
|
201
|
+
// Count assertions across all probe files
|
|
202
|
+
let totalAssertions = 0;
|
|
203
|
+
let anyStub = false;
|
|
204
|
+
for (const f of probeFiles) {
|
|
205
|
+
const { count, isStub } = countProbeAssertions(join(harnessDir, f));
|
|
206
|
+
totalAssertions += count;
|
|
207
|
+
if (isStub)
|
|
208
|
+
anyStub = true;
|
|
209
|
+
}
|
|
210
|
+
const hollow = probeFiles.length > 0 && totalAssertions === 0 && !anyStub;
|
|
211
|
+
const coverageRatio = postconditionCount > 0
|
|
212
|
+
? Math.min(1, totalAssertions / postconditionCount)
|
|
213
|
+
: probeFiles.length > 0
|
|
214
|
+
? 0
|
|
215
|
+
: 0;
|
|
216
|
+
return {
|
|
217
|
+
ucId,
|
|
218
|
+
title: uc.title,
|
|
219
|
+
postconditionCount,
|
|
220
|
+
assertionCount: totalAssertions,
|
|
221
|
+
coverageRatio,
|
|
222
|
+
probeFiles,
|
|
223
|
+
hollow,
|
|
224
|
+
};
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Format a postcondition coverage table for display.
|
|
229
|
+
*/
|
|
230
|
+
export function formatCoverageTable(coverage) {
|
|
231
|
+
if (coverage.length === 0)
|
|
232
|
+
return "_No use cases found._\n";
|
|
233
|
+
const lines = [
|
|
234
|
+
"| UC | Title | Postconditions | Assertions | Coverage | Status |",
|
|
235
|
+
"|---|---|---|---|---|---|",
|
|
236
|
+
];
|
|
237
|
+
for (const uc of coverage) {
|
|
238
|
+
const pct = uc.postconditionCount > 0
|
|
239
|
+
? `${Math.round(uc.coverageRatio * 100)}%`
|
|
240
|
+
: "—";
|
|
241
|
+
const status = uc.hollow
|
|
242
|
+
? "⚠️ HOLLOW"
|
|
243
|
+
: uc.probeFiles.length === 0
|
|
244
|
+
? "❌ NO PROBE"
|
|
245
|
+
: uc.assertionCount === 0
|
|
246
|
+
? "⏳ STUB"
|
|
247
|
+
: uc.coverageRatio >= 0.8
|
|
248
|
+
? "✅ COVERED"
|
|
249
|
+
: uc.coverageRatio >= 0.4
|
|
250
|
+
? "⚠️ PARTIAL"
|
|
251
|
+
: "❌ LOW";
|
|
252
|
+
lines.push(`| ${uc.ucId} | ${uc.title} | ${uc.postconditionCount} | ${uc.assertionCount} | ${pct} | ${status} |`);
|
|
253
|
+
}
|
|
254
|
+
return lines.join("\n");
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=postcondition-coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postcondition-coverage.js","sourceRoot":"","sources":["../../src/tools/postcondition-coverage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Probe execution runners for run_harness.
|
|
3
|
+
* Each function executes a probe file of a given type.
|
|
4
|
+
*/
|
|
5
|
+
import type { ProbeStatus } from "./run-harness.js";
|
|
6
|
+
export declare function combineOutput(stdout: string | null, stderr: string | null): string;
|
|
7
|
+
export declare function isNotImplementedOutput(output: string): boolean;
|
|
8
|
+
export declare function isToolAvailable(tool: string): boolean;
|
|
9
|
+
type ProbeRunResult = {
|
|
10
|
+
status: ProbeStatus;
|
|
11
|
+
durationMs: number;
|
|
12
|
+
output: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function runProbe(probePath: string, fileName: string, timeoutMs: number): ProbeRunResult;
|
|
15
|
+
export declare function runPlaywrightProbe(probePath: string, timeoutMs: number, start: number): ProbeRunResult;
|
|
16
|
+
export declare function runHurlProbe(probePath: string, timeoutMs: number, start: number): ProbeRunResult;
|
|
17
|
+
export declare function runVitestProbe(probePath: string, timeoutMs: number, start: number): ProbeRunResult;
|
|
18
|
+
export declare function runK6Probe(probePath: string, timeoutMs: number, start: number): ProbeRunResult;
|
|
19
|
+
export declare function runShProbe(probePath: string, timeoutMs: number, start: number): ProbeRunResult;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=probe-runners.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe-runners.d.ts","sourceRoot":"","sources":["../../src/tools/probe-runners.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIpD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,MAAM,CAKR;AASD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAG9D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAUrD;AAED,KAAK,cAAc,GAAG;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAIF,wBAAgB,QAAQ,CACtB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,cAAc,CAoChB;AAID,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,cAAc,CAsChB;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,cAAc,CA4ChB;AAED,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,cAAc,CA8BhB;AAED,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,cAAc,CAmChB;AAED,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,cAAc,CA8BhB"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Probe execution runners for run_harness.
|
|
3
|
+
* Each function executes a probe file of a given type.
|
|
4
|
+
*/
|
|
5
|
+
import { spawnSync } from "node:child_process";
|
|
6
|
+
import { existsSync } from "node:fs";
|
|
7
|
+
import { dirname, join } from "node:path";
|
|
8
|
+
// ── Helpers ───────────────────────────────────────────────────────────
|
|
9
|
+
export function combineOutput(stdout, stderr) {
|
|
10
|
+
const parts = [];
|
|
11
|
+
if (stdout?.trim())
|
|
12
|
+
parts.push(stdout.trim());
|
|
13
|
+
if (stderr?.trim())
|
|
14
|
+
parts.push(stderr.trim());
|
|
15
|
+
return parts.join("\n");
|
|
16
|
+
}
|
|
17
|
+
const NOT_IMPLEMENTED_PATTERNS = [
|
|
18
|
+
"not yet implemented",
|
|
19
|
+
"not implemented",
|
|
20
|
+
"TODO: implement",
|
|
21
|
+
"ProbeNotImplemented",
|
|
22
|
+
];
|
|
23
|
+
export function isNotImplementedOutput(output) {
|
|
24
|
+
const lower = output.toLowerCase();
|
|
25
|
+
return NOT_IMPLEMENTED_PATTERNS.some((p) => lower.includes(p.toLowerCase()));
|
|
26
|
+
}
|
|
27
|
+
export function isToolAvailable(tool) {
|
|
28
|
+
try {
|
|
29
|
+
const result = spawnSync(tool, ["--version"], {
|
|
30
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
31
|
+
timeout: 5000,
|
|
32
|
+
});
|
|
33
|
+
return result.status !== null && result.error === undefined;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// ── Probe dispatch ────────────────────────────────────────────────────
|
|
40
|
+
export function runProbe(probePath, fileName, timeoutMs) {
|
|
41
|
+
const start = Date.now();
|
|
42
|
+
if (fileName.endsWith(".a11y.spec.ts") || fileName.endsWith(".spec.ts")) {
|
|
43
|
+
return runPlaywrightProbe(probePath, timeoutMs, start);
|
|
44
|
+
}
|
|
45
|
+
if (fileName.endsWith(".graphql.hurl") || fileName.endsWith(".hurl")) {
|
|
46
|
+
return runHurlProbe(probePath, timeoutMs, start);
|
|
47
|
+
}
|
|
48
|
+
if (fileName.endsWith(".sim.ts")) {
|
|
49
|
+
return runVitestProbe(probePath, timeoutMs, start);
|
|
50
|
+
}
|
|
51
|
+
if (fileName.endsWith(".consumer.test.ts") ||
|
|
52
|
+
fileName.endsWith(".provider.test.ts")) {
|
|
53
|
+
return runVitestProbe(probePath, timeoutMs, start);
|
|
54
|
+
}
|
|
55
|
+
if (fileName.endsWith(".k6.js")) {
|
|
56
|
+
return runK6Probe(probePath, timeoutMs, start);
|
|
57
|
+
}
|
|
58
|
+
if (fileName.endsWith(".db.sh") ||
|
|
59
|
+
fileName.endsWith(".mq.sh") ||
|
|
60
|
+
fileName.endsWith(".ws.sh") ||
|
|
61
|
+
fileName.endsWith(".log.sh") ||
|
|
62
|
+
fileName.endsWith(".grpc.sh") ||
|
|
63
|
+
fileName.endsWith(".zap.sh") ||
|
|
64
|
+
fileName.endsWith(".sh")) {
|
|
65
|
+
return runShProbe(probePath, timeoutMs, start);
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
status: "error",
|
|
69
|
+
durationMs: Date.now() - start,
|
|
70
|
+
output: `Unknown probe type: ${fileName}`,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// ── Individual runners ────────────────────────────────────────────────
|
|
74
|
+
export function runPlaywrightProbe(probePath, timeoutMs, start) {
|
|
75
|
+
try {
|
|
76
|
+
const result = spawnSync("npx", ["playwright", "test", probePath, "--reporter=line"], {
|
|
77
|
+
timeout: timeoutMs,
|
|
78
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
79
|
+
encoding: "utf-8",
|
|
80
|
+
});
|
|
81
|
+
const durationMs = Date.now() - start;
|
|
82
|
+
const output = combineOutput(result.stdout, result.stderr);
|
|
83
|
+
if (result.error?.message?.includes("ENOENT"))
|
|
84
|
+
return {
|
|
85
|
+
status: "tool_missing",
|
|
86
|
+
durationMs,
|
|
87
|
+
output: "playwright not found",
|
|
88
|
+
};
|
|
89
|
+
if (result.signal === "SIGTERM" ||
|
|
90
|
+
result.error?.message?.includes("ETIMEDOUT"))
|
|
91
|
+
return { status: "timeout", durationMs, output: "timed out" };
|
|
92
|
+
if (isNotImplementedOutput(output))
|
|
93
|
+
return { status: "not_implemented", durationMs, output };
|
|
94
|
+
return {
|
|
95
|
+
status: result.status === 0 ? "pass" : "fail",
|
|
96
|
+
durationMs,
|
|
97
|
+
output,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
return {
|
|
102
|
+
status: "tool_missing",
|
|
103
|
+
durationMs: Date.now() - start,
|
|
104
|
+
output: `playwright not available: ${String(err)}`,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
export function runHurlProbe(probePath, timeoutMs, start) {
|
|
109
|
+
try {
|
|
110
|
+
// Look for hurl.env in the probe's directory for variable injection ({{host}}, etc.)
|
|
111
|
+
const probeDir = dirname(probePath);
|
|
112
|
+
const hurlEnvPath = join(probeDir, "hurl.env");
|
|
113
|
+
// Inject a per-run unique uid so each harness run uses fresh test users.
|
|
114
|
+
// This avoids 422 failures caused by duplicate username/email from prior runs.
|
|
115
|
+
const runUid = `r${Date.now().toString(36)}`;
|
|
116
|
+
const hurlArgs = existsSync(hurlEnvPath)
|
|
117
|
+
? [
|
|
118
|
+
"--variables-file",
|
|
119
|
+
hurlEnvPath,
|
|
120
|
+
"--variable",
|
|
121
|
+
`uid=${runUid}`,
|
|
122
|
+
probePath,
|
|
123
|
+
]
|
|
124
|
+
: ["--variable", `uid=${runUid}`, probePath];
|
|
125
|
+
const result = spawnSync("hurl", hurlArgs, {
|
|
126
|
+
timeout: timeoutMs,
|
|
127
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
128
|
+
encoding: "utf-8",
|
|
129
|
+
});
|
|
130
|
+
const durationMs = Date.now() - start;
|
|
131
|
+
const output = combineOutput(result.stdout, result.stderr);
|
|
132
|
+
if (result.error?.message?.includes("ENOENT"))
|
|
133
|
+
return { status: "tool_missing", durationMs, output: "hurl not found" };
|
|
134
|
+
if (result.signal === "SIGTERM" ||
|
|
135
|
+
result.error?.message?.includes("ETIMEDOUT"))
|
|
136
|
+
return { status: "timeout", durationMs, output: "timed out" };
|
|
137
|
+
return {
|
|
138
|
+
status: result.status === 0 ? "pass" : "fail",
|
|
139
|
+
durationMs,
|
|
140
|
+
output,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
return {
|
|
145
|
+
status: "tool_missing",
|
|
146
|
+
durationMs: Date.now() - start,
|
|
147
|
+
output: `hurl not available: ${String(err)}`,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
export function runVitestProbe(probePath, timeoutMs, start) {
|
|
152
|
+
try {
|
|
153
|
+
const result = spawnSync("npx", ["vitest", "run", probePath], {
|
|
154
|
+
timeout: timeoutMs,
|
|
155
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
156
|
+
encoding: "utf-8",
|
|
157
|
+
});
|
|
158
|
+
const durationMs = Date.now() - start;
|
|
159
|
+
const output = combineOutput(result.stdout, result.stderr);
|
|
160
|
+
if (result.error?.message?.includes("ENOENT"))
|
|
161
|
+
return { status: "tool_missing", durationMs, output: "vitest not found" };
|
|
162
|
+
if (result.signal === "SIGTERM" ||
|
|
163
|
+
result.error?.message?.includes("ETIMEDOUT"))
|
|
164
|
+
return { status: "timeout", durationMs, output: "timed out" };
|
|
165
|
+
if (isNotImplementedOutput(output))
|
|
166
|
+
return { status: "not_implemented", durationMs, output };
|
|
167
|
+
return {
|
|
168
|
+
status: result.status === 0 ? "pass" : "fail",
|
|
169
|
+
durationMs,
|
|
170
|
+
output,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
return {
|
|
175
|
+
status: "tool_missing",
|
|
176
|
+
durationMs: Date.now() - start,
|
|
177
|
+
output: `vitest not available: ${String(err)}`,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
export function runK6Probe(probePath, timeoutMs, start) {
|
|
182
|
+
if (!isToolAvailable("k6")) {
|
|
183
|
+
return {
|
|
184
|
+
status: "tool_missing",
|
|
185
|
+
durationMs: Date.now() - start,
|
|
186
|
+
output: "k6 not found (install: https://k6.io)",
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
try {
|
|
190
|
+
const result = spawnSync("k6", ["run", probePath], {
|
|
191
|
+
timeout: timeoutMs,
|
|
192
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
193
|
+
encoding: "utf-8",
|
|
194
|
+
});
|
|
195
|
+
const durationMs = Date.now() - start;
|
|
196
|
+
const output = combineOutput(result.stdout, result.stderr);
|
|
197
|
+
if (result.error?.message?.includes("ENOENT"))
|
|
198
|
+
return { status: "tool_missing", durationMs, output: "k6 not found" };
|
|
199
|
+
if (result.signal === "SIGTERM" ||
|
|
200
|
+
result.error?.message?.includes("ETIMEDOUT"))
|
|
201
|
+
return { status: "timeout", durationMs, output: "timed out" };
|
|
202
|
+
return {
|
|
203
|
+
status: result.status === 0 ? "pass" : "fail",
|
|
204
|
+
durationMs,
|
|
205
|
+
output,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
return {
|
|
210
|
+
status: "tool_missing",
|
|
211
|
+
durationMs: Date.now() - start,
|
|
212
|
+
output: `k6 not available: ${String(err)}`,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
export function runShProbe(probePath, timeoutMs, start) {
|
|
217
|
+
try {
|
|
218
|
+
const result = spawnSync("bash", [probePath], {
|
|
219
|
+
timeout: timeoutMs,
|
|
220
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
221
|
+
encoding: "utf-8",
|
|
222
|
+
});
|
|
223
|
+
const durationMs = Date.now() - start;
|
|
224
|
+
const output = combineOutput(result.stdout, result.stderr);
|
|
225
|
+
if (result.error?.message?.includes("ENOENT"))
|
|
226
|
+
return { status: "tool_missing", durationMs, output: "bash not found" };
|
|
227
|
+
if (result.signal === "SIGTERM" ||
|
|
228
|
+
result.error?.message?.includes("ETIMEDOUT"))
|
|
229
|
+
return { status: "timeout", durationMs, output: "timed out" };
|
|
230
|
+
if (isNotImplementedOutput(output))
|
|
231
|
+
return { status: "not_implemented", durationMs, output };
|
|
232
|
+
return {
|
|
233
|
+
status: result.status === 0 ? "pass" : "fail",
|
|
234
|
+
durationMs,
|
|
235
|
+
output,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
return {
|
|
240
|
+
status: "tool_missing",
|
|
241
|
+
durationMs: Date.now() - start,
|
|
242
|
+
output: `bash not available: ${String(err)}`,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=probe-runners.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe-runners.js","sourceRoot":"","sources":["../../src/tools/probe-runners.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Probe content template generators for generate_harness.
|
|
3
|
+
* Each function returns the file content for a given probe type.
|
|
4
|
+
*/
|
|
5
|
+
import type { ProbeType } from "./generate-harness.js";
|
|
6
|
+
export interface UcDetails {
|
|
7
|
+
precondition: string;
|
|
8
|
+
postcondition: string;
|
|
9
|
+
steps: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function generatePlaywrightProbe(ucId: string, title: string, precondition: string, postcondition: string, steps: string[], scenario?: string): string;
|
|
12
|
+
export declare function generateHurlProbe(ucId: string, title: string, precondition: string, postcondition: string, steps: string[], scenario?: string): string;
|
|
13
|
+
export declare function generateGraphqlHurlProbe(ucId: string, title: string, postcondition: string, scenario?: string): string;
|
|
14
|
+
export declare function generateShProbe(ucId: string, title: string, postcondition: string, probeType: ProbeType, scenario?: string): string;
|
|
15
|
+
export declare function generateDbShProbe(ucId: string, title: string, postcondition: string, scenario?: string): string;
|
|
16
|
+
export declare function generateMqShProbe(ucId: string, title: string, postcondition: string, scenario?: string): string;
|
|
17
|
+
export declare function generateK6Probe(ucId: string, title: string, postcondition: string, scenario?: string): string;
|
|
18
|
+
export declare function generateWsShProbe(ucId: string, title: string, postcondition: string, scenario?: string): string;
|
|
19
|
+
export declare function generateLogShProbe(ucId: string, title: string, _postcondition: string, scenario?: string): string;
|
|
20
|
+
export declare function generateA11yProbe(ucId: string, title: string): string;
|
|
21
|
+
export declare function generateConsumerContractProbe(ucId: string, title: string): string;
|
|
22
|
+
export declare function generateProviderContractProbe(ucId: string, title: string): string;
|
|
23
|
+
export declare function generateGrpcShProbe(ucId: string, title: string, postcondition: string, scenario?: string): string;
|
|
24
|
+
export declare function generateZapShProbe(ucId: string, title: string): string;
|
|
25
|
+
export declare function generateSimProbe(ucId: string, title: string): string;
|
|
26
|
+
export declare function generateProbeContent(ucId: string, title: string, probeType: ProbeType, details: UcDetails, scenario?: string): string;
|
|
27
|
+
//# sourceMappingURL=probe-templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe-templates.d.ts","sourceRoot":"","sources":["../../src/tools/probe-templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAID,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,SAAU,GACjB,MAAM,CAmBR;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,SAAU,GACjB,MAAM,CAcR;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,QAAQ,SAAU,GACjB,MAAM,CAUR;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,SAAS,EACpB,QAAQ,SAAU,GACjB,MAAM,CAgBR;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,QAAQ,SAAU,GACjB,MAAM,CAaR;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,QAAQ,SAAU,GACjB,MAAM,CAkBR;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,QAAQ,SAAU,GACjB,MAAM,CAmBR;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,QAAQ,SAAU,GACjB,MAAM,CAcR;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,MAAM,EACtB,QAAQ,SAAU,GACjB,MAAM,CAUR;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAkBrE;AAED,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,MAAM,CAkBR;AAED,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,MAAM,CAiBR;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,QAAQ,SAAU,GACjB,MAAM,CAaR;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAgBtE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAOpE;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,SAAS,EAClB,QAAQ,SAAU,GACjB,MAAM,CAoER"}
|