@jevitate/cli 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/anchor-baselines.d.ts +26 -0
- package/dist/anchor-baselines.js +25 -0
- package/dist/anchor-baselines.js.map +1 -0
- package/dist/approval-provenance.d.ts +48 -2
- package/dist/approval-provenance.js +110 -6
- package/dist/approval-provenance.js.map +1 -1
- package/dist/bin.js +25111 -17835
- package/dist/browser-cli.d.ts +10 -0
- package/dist/browser-cli.js +50 -0
- package/dist/browser-cli.js.map +1 -0
- package/dist/build-info.generated.js +2 -2
- package/dist/catalog-analysis.js +14 -0
- package/dist/catalog-analysis.js.map +1 -1
- package/dist/catalog-api.js +12 -4
- package/dist/catalog-api.js.map +1 -1
- package/dist/catalog-bundle-api.d.ts +73 -0
- package/dist/catalog-bundle-api.js +206 -0
- package/dist/catalog-bundle-api.js.map +1 -0
- package/dist/catalog-bundle-findings.d.ts +54 -0
- package/dist/catalog-bundle-findings.js +252 -0
- package/dist/catalog-bundle-findings.js.map +1 -0
- package/dist/catalog-bundle.d.ts +192 -0
- package/dist/catalog-bundle.js +578 -0
- package/dist/catalog-bundle.js.map +1 -0
- package/dist/catalog-cli.d.ts +6 -0
- package/dist/catalog-cli.js +180 -5
- package/dist/catalog-cli.js.map +1 -1
- package/dist/catalog-refs.d.ts +42 -0
- package/dist/catalog-refs.js +188 -0
- package/dist/catalog-refs.js.map +1 -0
- package/dist/catalog-review.d.ts +3 -1
- package/dist/catalog-review.js +61 -0
- package/dist/catalog-review.js.map +1 -1
- package/dist/catalog.d.ts +27 -3
- package/dist/catalog.js +46 -2
- package/dist/catalog.js.map +1 -1
- package/dist/change-context.d.ts +44 -0
- package/dist/change-context.js +203 -0
- package/dist/change-context.js.map +1 -0
- package/dist/check-api.d.ts +1 -1
- package/dist/check-api.js +206 -16
- package/dist/check-api.js.map +1 -1
- package/dist/check-cli.d.ts +2 -1
- package/dist/check-cli.js +117 -8
- package/dist/check-cli.js.map +1 -1
- package/dist/check-execute.d.ts +28 -1
- package/dist/check-execute.js +110 -27
- package/dist/check-execute.js.map +1 -1
- package/dist/check-plan.d.ts +14 -0
- package/dist/check-plan.js +24 -1
- package/dist/check-plan.js.map +1 -1
- package/dist/check-types.d.ts +137 -5
- package/dist/check-types.js +8 -0
- package/dist/check-types.js.map +1 -1
- package/dist/cli-output.d.ts +6 -0
- package/dist/cli-output.js +26 -1
- package/dist/cli-output.js.map +1 -1
- package/dist/cli-shared.d.ts +10 -0
- package/dist/cli-shared.js +0 -4
- package/dist/cli-shared.js.map +1 -1
- package/dist/exit-codes.d.ts +6 -3
- package/dist/exit-codes.js +24 -3
- package/dist/exit-codes.js.map +1 -1
- package/dist/explore-adversarial.js +2 -2
- package/dist/explore-adversarial.js.map +1 -1
- package/dist/explore-cli.js +3 -2
- package/dist/explore-cli.js.map +1 -1
- package/dist/explore-coverage.js +3 -3
- package/dist/explore-coverage.js.map +1 -1
- package/dist/explore-feature.js +3 -3
- package/dist/explore-feature.js.map +1 -1
- package/dist/explore-goal.js +11 -5
- package/dist/explore-goal.js.map +1 -1
- package/dist/findings-filing.d.ts +6 -0
- package/dist/findings-filing.js +15 -1
- package/dist/findings-filing.js.map +1 -1
- package/dist/forge-verify.d.ts +224 -0
- package/dist/forge-verify.js +649 -0
- package/dist/forge-verify.js.map +1 -0
- package/dist/heal-probe-guard.d.ts +9 -0
- package/dist/heal-probe-guard.js +113 -0
- package/dist/heal-probe-guard.js.map +1 -0
- package/dist/host-health-run.d.ts +32 -1
- package/dist/host-health-run.js +38 -1
- package/dist/host-health-run.js.map +1 -1
- package/dist/init-codeowners.d.ts +19 -0
- package/dist/init-codeowners.js +66 -0
- package/dist/init-codeowners.js.map +1 -1
- package/dist/job-draft-api.d.ts +52 -0
- package/dist/job-draft-api.js +110 -0
- package/dist/job-draft-api.js.map +1 -0
- package/dist/journeeze-api.d.ts +71 -0
- package/dist/journeeze-api.js +285 -0
- package/dist/journeeze-api.js.map +1 -0
- package/dist/journeeze-connect.d.ts +156 -0
- package/dist/journeeze-connect.js +357 -0
- package/dist/journeeze-connect.js.map +1 -0
- package/dist/journey-anchor-gate.d.ts +52 -0
- package/dist/journey-anchor-gate.js +101 -0
- package/dist/journey-anchor-gate.js.map +1 -0
- package/dist/journey-api.d.ts +43 -3
- package/dist/journey-api.js +226 -21
- package/dist/journey-api.js.map +1 -1
- package/dist/journey-cli.js +162 -20
- package/dist/journey-cli.js.map +1 -1
- package/dist/journey-heal.d.ts +74 -0
- package/dist/journey-heal.js +180 -0
- package/dist/journey-heal.js.map +1 -0
- package/dist/journey-lint-sarif.d.ts +3 -2
- package/dist/journey-lint-sarif.js +9 -2
- package/dist/journey-lint-sarif.js.map +1 -1
- package/dist/journey-migrate-api.d.ts +54 -0
- package/dist/journey-migrate-api.js +64 -0
- package/dist/journey-migrate-api.js.map +1 -0
- package/dist/journey-network-checks.d.ts +5 -1
- package/dist/journey-network-checks.js +15 -4
- package/dist/journey-network-checks.js.map +1 -1
- package/dist/journey-prefix.js +2 -2
- package/dist/journey-prefix.js.map +1 -1
- package/dist/journey-proposal-store.d.ts +109 -0
- package/dist/journey-proposal-store.js +365 -0
- package/dist/journey-proposal-store.js.map +1 -0
- package/dist/journey-result-record.d.ts +42 -0
- package/dist/journey-result-record.js +33 -0
- package/dist/journey-result-record.js.map +1 -0
- package/dist/journey-review-api.js +16 -1
- package/dist/journey-review-api.js.map +1 -1
- package/dist/journey-review.d.ts +18 -1
- package/dist/journey-review.js +116 -5
- package/dist/journey-review.js.map +1 -1
- package/dist/journey-stale-api.d.ts +40 -0
- package/dist/journey-stale-api.js +57 -0
- package/dist/journey-stale-api.js.map +1 -0
- package/dist/launch-armed.js +5 -1
- package/dist/launch-armed.js.map +1 -1
- package/dist/locator-health-api.d.ts +101 -0
- package/dist/locator-health-api.js +203 -0
- package/dist/locator-health-api.js.map +1 -0
- package/dist/locator-health.d.ts +195 -0
- package/dist/locator-health.js +419 -0
- package/dist/locator-health.js.map +1 -0
- package/dist/login-cli.d.ts +2 -0
- package/dist/login-cli.js +56 -11
- package/dist/login-cli.js.map +1 -1
- package/dist/mcp-api.d.ts +5 -1
- package/dist/mcp-api.js +53 -8
- package/dist/mcp-api.js.map +1 -1
- package/dist/mcp-cli-tools.d.ts +3 -1
- package/dist/mcp-cli-tools.js +80 -10
- package/dist/mcp-cli-tools.js.map +1 -1
- package/dist/multi-run.d.ts +7 -6
- package/dist/multi-run.js +5 -4
- package/dist/multi-run.js.map +1 -1
- package/dist/persona-login.d.ts +60 -3
- package/dist/persona-login.js +341 -31
- package/dist/persona-login.js.map +1 -1
- package/dist/program.js +2 -0
- package/dist/program.js.map +1 -1
- package/dist/project-config.d.ts +29 -0
- package/dist/project-config.js +76 -0
- package/dist/project-config.js.map +1 -0
- package/dist/report-api.d.ts +1 -0
- package/dist/report-api.js +1 -0
- package/dist/report-api.js.map +1 -1
- package/dist/resource-preflight.js +5 -3
- package/dist/resource-preflight.js.map +1 -1
- package/dist/run-metadata.d.ts +5 -2
- package/dist/run-metadata.js +10 -3
- package/dist/run-metadata.js.map +1 -1
- package/dist/run-tags-cli.d.ts +2 -0
- package/dist/run-tags-cli.js +8 -2
- package/dist/run-tags-cli.js.map +1 -1
- package/dist/self-heal-adapter.d.ts +43 -27
- package/dist/self-heal-adapter.js +196 -62
- package/dist/self-heal-adapter.js.map +1 -1
- package/dist/source-cli.js +5 -3
- package/dist/source-cli.js.map +1 -1
- package/dist/suite-explore-options.js +1 -0
- package/dist/suite-explore-options.js.map +1 -1
- package/dist/sweep-api.d.ts +23 -0
- package/dist/sweep-api.js +39 -8
- package/dist/sweep-api.js.map +1 -1
- package/dist/sweep-cli.js +3 -1
- package/dist/sweep-cli.js.map +1 -1
- package/dist/ux-usability.js +3 -2
- package/dist/ux-usability.js.map +1 -1
- package/package.json +17 -15
- package/skills/jevitate-ci-check/SKILL.md +25 -1
- package/skills/jevitate-getting-started/SKILL.md +9 -3
- package/skills/jevitate-mission-scope/SKILL.md +2 -2
- package/skills/jevitate-run-journey/SKILL.md +36 -5
- package/skills/jevitate-test-campaign/SKILL.md +13 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-bundle-api.js","sourceRoot":"","sources":["../src/catalog-bundle-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { type RunRecord } from "@jevitate/findings";
|
|
2
|
+
import { type CatalogBundleFinding } from "./catalog-bundle.js";
|
|
3
|
+
import type { RunIndexDeps } from "./run-index.js";
|
|
4
|
+
/**
|
|
5
|
+
* #464 (d464c) — the machine findings a Journeeze catalog bundle carries (journeeze-saas
|
|
6
|
+
* `docs/contract/catalog-bundle-v1.md` §4.4 @ 61f8c92): UX claims, defects and hangs, one per
|
|
7
|
+
* fingerprint (the latest sighting wins). It only READS what the runners persisted (every result
|
|
8
|
+
* was redacted before it was written), from the same places `jevitate report` reads — this
|
|
9
|
+
* project's logs and its indexed runs — plus offline `ux-<stamp>.json` reviews and the committed
|
|
10
|
+
* finding ledger.
|
|
11
|
+
*
|
|
12
|
+
* - Defects and hangs: `jevitate report`'s deduped list (`consolidate`), with jevitate's own
|
|
13
|
+
* fingerprint. A declared invariant is a defect. Advisory flags, Journey assertions, goal checks
|
|
14
|
+
* and approvals have no fingerprint and are not bundle finding kinds: they stay out. The tflowId
|
|
15
|
+
* is the acting step's (`identity.tflowId`, #468).
|
|
16
|
+
* - UX: each shown finding of a usability or `ux` report (never the heuristic appendix), with the
|
|
17
|
+
* contract's derived fingerprint (`uxFindingFingerprint`) over the EXPORTED claim, route and
|
|
18
|
+
* element — the reader recomputes it. A claim type the contract does not know (a rubric or signal
|
|
19
|
+
* finding) goes as `other` + `producerClaim`. On-screen `quotes` are never exported.
|
|
20
|
+
* - Routes are templates (`contractRouteTemplate`: no host, query, fragment or record id).
|
|
21
|
+
* - Privacy: each finding passes the builder's own guard (`findingIssues`: no personal data, URL
|
|
22
|
+
* or record id in any text). A finding that cannot is LEFT OUT with a warning naming only its
|
|
23
|
+
* fingerprint and why — never rewritten into something it did not say, and never allowed to
|
|
24
|
+
* refuse the whole export. A defect whose own title cannot travel is described by its signal and
|
|
25
|
+
* route instead (producer-written text).
|
|
26
|
+
* - No media in 0.10 (no `screenshot`/`box`).
|
|
27
|
+
*/
|
|
28
|
+
export interface UxReportSource {
|
|
29
|
+
/** The `UxReport` (a usability report file, a usability result's `result.report`, or an offline `ux` review). */
|
|
30
|
+
readonly report: unknown;
|
|
31
|
+
/** The run it came from: when, which build, which Journey step it branched from. */
|
|
32
|
+
readonly run: RunRecord;
|
|
33
|
+
}
|
|
34
|
+
export interface FindingSources {
|
|
35
|
+
readonly runs: readonly RunRecord[];
|
|
36
|
+
readonly uxReports: readonly UxReportSource[];
|
|
37
|
+
}
|
|
38
|
+
export interface BundleFindings {
|
|
39
|
+
readonly findings: readonly CatalogBundleFinding[];
|
|
40
|
+
/** Findings left out or degraded, each with why. */
|
|
41
|
+
readonly warnings: readonly string[];
|
|
42
|
+
}
|
|
43
|
+
/** The bundle's findings from what the runs persisted (pure): one per fingerprint, latest sighting first-class. */
|
|
44
|
+
export declare function bundleFindings(src: FindingSources): BundleFindings;
|
|
45
|
+
export interface CollectBundleFindingsOptions {
|
|
46
|
+
/** The project root (where its `.jevitate/` is). */
|
|
47
|
+
readonly root: string;
|
|
48
|
+
/** The project data dir (`--dir`, else `<root>/.jevitate`); null outside a project. */
|
|
49
|
+
readonly dataDir: string | null;
|
|
50
|
+
/** Test seam: the run index. */
|
|
51
|
+
readonly index?: RunIndexDeps;
|
|
52
|
+
}
|
|
53
|
+
/** Reads the project's runs, UX reports and ledger, and returns the bundle's findings. */
|
|
54
|
+
export declare function collectBundleFindings(opts: CollectBundleFindingsOptions): Promise<BundleFindings>;
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { consolidate, runFromMissionResult, runFromUxReport } from "@jevitate/findings";
|
|
4
|
+
import { contractRouteTemplate, uxFindingFingerprint } from "@jevitate/ux";
|
|
5
|
+
import { findingIssues, isRouteTemplate } from "./catalog-bundle.js";
|
|
6
|
+
import { defaultReportSources, loadRunFile, scanRuns } from "./report-api.js";
|
|
7
|
+
const KNOWN_CLAIMS = new Set(["next-step-unclear", "no-feedback", "blocked-action", "error-unrecoverable", "destructive-unguarded", "fact-conflict"]);
|
|
8
|
+
const PRODUCER_CLAIM_RE = /^[a-z][a-z0-9-]{0,63}$/u;
|
|
9
|
+
const FINGERPRINT_RE = /^[0-9a-f]{16}$/u;
|
|
10
|
+
const TFLOW_ID_RE = /^[a-z0-9._:-]{1,96}$/u;
|
|
11
|
+
const COMMIT_RE = /^[0-9a-f]{7,40}$/u;
|
|
12
|
+
const TARGET_ID_RE = /^[A-Za-z0-9_.-]{1,64}$/u;
|
|
13
|
+
const JOURNEY_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u;
|
|
14
|
+
const DATE_TIME_RE = /^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]{1,9})?(Z|[+-][0-9]{2}:[0-9]{2})$/u;
|
|
15
|
+
const CITATION_SOURCE_RE = /^[a-z0-9][a-z0-9._-]{0,63}$/u;
|
|
16
|
+
const CITATION_REF_RE = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$/u;
|
|
17
|
+
const SEVERITIES = new Set(["info", "minor", "major"]);
|
|
18
|
+
const RESERVED_ANCHORS = new Set(["job_start", "job_end"]);
|
|
19
|
+
const MAX_CONTROLS = 10;
|
|
20
|
+
const MAX_FINDINGS = 5000;
|
|
21
|
+
function isRecord(v) {
|
|
22
|
+
return v !== null && typeof v === "object" && !Array.isArray(v);
|
|
23
|
+
}
|
|
24
|
+
const str = (v) => (typeof v === "string" && v !== "" ? v : undefined);
|
|
25
|
+
const strings = (v) => (Array.isArray(v) ? v.filter((x) => typeof x === "string" && x !== "") : []);
|
|
26
|
+
/** Would this text pass the builder's guard as a finding's `observation` (≤600) / a control (≤120)? */
|
|
27
|
+
function safeText(text, as) {
|
|
28
|
+
if (text === undefined)
|
|
29
|
+
return false;
|
|
30
|
+
const probe = as === "observation"
|
|
31
|
+
? { fingerprint: "0000000000000000", kind: "defect", severity: "major", at: "2000-01-01T00:00:00Z", observation: text }
|
|
32
|
+
: { fingerprint: "0000000000000000", kind: "defect", severity: "major", at: "2000-01-01T00:00:00Z", observation: "probe", controls: [text] };
|
|
33
|
+
return findingIssues(probe).length === 0;
|
|
34
|
+
}
|
|
35
|
+
/** A route as the contract's template, or undefined when it cannot be one. */
|
|
36
|
+
function bundleRoute(raw) {
|
|
37
|
+
if (raw === undefined)
|
|
38
|
+
return undefined;
|
|
39
|
+
const route = contractRouteTemplate(raw);
|
|
40
|
+
return isRouteTemplate(route) ? route : undefined;
|
|
41
|
+
}
|
|
42
|
+
/** Where it was seen: the Journey step a journey-anchored run branched from. */
|
|
43
|
+
function seenAt(branch) {
|
|
44
|
+
if (branch === undefined || !JOURNEY_ID_RE.test(branch.journeyId))
|
|
45
|
+
return {};
|
|
46
|
+
const step = Number.isInteger(branch.step) && branch.step >= 1 && branch.step <= 200 ? branch.step : undefined;
|
|
47
|
+
const anchor = branch.anchor !== undefined && JOURNEY_ID_RE.test(branch.anchor) && !RESERVED_ANCHORS.has(branch.anchor) ? branch.anchor : undefined;
|
|
48
|
+
return { journey: branch.journeyId, ...(step === undefined ? {} : { step }), ...(anchor === undefined ? {} : { anchor }) };
|
|
49
|
+
}
|
|
50
|
+
function runStamp(run) {
|
|
51
|
+
return {
|
|
52
|
+
...(run.targetBuild !== undefined && COMMIT_RE.test(run.targetBuild) ? { commit: run.targetBuild } : {}),
|
|
53
|
+
...(run.targetName !== undefined && TARGET_ID_RE.test(run.targetName) ? { target: run.targetName } : {}),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** One defect/hang of the consolidated report as a bundle finding. */
|
|
57
|
+
function defectFinding(d, runs) {
|
|
58
|
+
if (d.category !== "defect" && d.category !== "invariant" && d.category !== "hang")
|
|
59
|
+
return null;
|
|
60
|
+
const fingerprint = d.identity.fingerprint;
|
|
61
|
+
if (fingerprint === undefined || !FINGERPRINT_RE.test(fingerprint))
|
|
62
|
+
return { drop: `${d.category} ${d.key}: its fingerprint is not 16 hex characters` };
|
|
63
|
+
if (d.lastSeen === undefined || !DATE_TIME_RE.test(d.lastSeen))
|
|
64
|
+
return { drop: `finding ${fingerprint}: no run names when it was seen` };
|
|
65
|
+
const latest = d.modes
|
|
66
|
+
.flatMap((m) => m.runs)
|
|
67
|
+
.sort((a, b) => (a.startedAt ?? "").localeCompare(b.startedAt ?? ""))
|
|
68
|
+
.at(-1);
|
|
69
|
+
const run = latest === undefined ? undefined : runs.get(latest.path);
|
|
70
|
+
const route = bundleRoute(d.identity.route);
|
|
71
|
+
const control = d.identity.control;
|
|
72
|
+
const tflowId = d.identity.tflowId;
|
|
73
|
+
const described = `${d.category === "hang" ? "Hang" : "Defect"} (${d.identity.signal}) on ${route ?? "an unknown route"}`;
|
|
74
|
+
return {
|
|
75
|
+
finding: {
|
|
76
|
+
fingerprint,
|
|
77
|
+
kind: d.category === "hang" ? "hang" : "defect",
|
|
78
|
+
severity: "major",
|
|
79
|
+
...(run === undefined ? {} : runStamp(run)),
|
|
80
|
+
at: d.lastSeen,
|
|
81
|
+
...seenAt(d.branches?.[0]),
|
|
82
|
+
...(route === undefined ? {} : { route }),
|
|
83
|
+
...(tflowId !== undefined && TFLOW_ID_RE.test(tflowId) ? { tflowId } : {}),
|
|
84
|
+
...(safeText(control, "control") ? { controls: [control] } : {}),
|
|
85
|
+
observation: safeText(d.title, "observation") ? d.title : described,
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/** One shown finding of a UX report as a bundle finding (the contract's derived fingerprint). */
|
|
90
|
+
function uxFinding(f, run) {
|
|
91
|
+
const rubric = str(f.rubricItemId) ?? "unknown";
|
|
92
|
+
const route = bundleRoute(str(f.route));
|
|
93
|
+
if (route === undefined)
|
|
94
|
+
return { drop: `UX finding (${rubric}): its route is not a route template` };
|
|
95
|
+
const type = isRecord(f.claim) ? str(f.claim.type) : undefined;
|
|
96
|
+
const known = type !== undefined && KNOWN_CLAIMS.has(type);
|
|
97
|
+
const producerClaim = known ? undefined : (type ?? rubric);
|
|
98
|
+
if (producerClaim !== undefined && !PRODUCER_CLAIM_RE.test(producerClaim))
|
|
99
|
+
return { drop: `UX finding on ${route}: its claim type is not a producer claim name` };
|
|
100
|
+
const claim = (known ? type : "other");
|
|
101
|
+
const severity = str(f.severity);
|
|
102
|
+
const confidence = f.confidence;
|
|
103
|
+
if (severity === undefined || !SEVERITIES.has(severity))
|
|
104
|
+
return { drop: `UX finding (${claim}) on ${route}: no contract severity` };
|
|
105
|
+
if (typeof confidence !== "number" || !(confidence >= 0 && confidence <= 1))
|
|
106
|
+
return { drop: `UX finding (${claim}) on ${route}: no confidence in [0, 1]` };
|
|
107
|
+
if (run.startedAt === undefined || !DATE_TIME_RE.test(run.startedAt))
|
|
108
|
+
return { drop: `UX finding (${claim}) on ${route}: its run names no start time` };
|
|
109
|
+
const observation = str(f.observation);
|
|
110
|
+
if (observation === undefined)
|
|
111
|
+
return { drop: `UX finding (${claim}) on ${route}: no observation` };
|
|
112
|
+
const tflowRaw = str(f.tflowId);
|
|
113
|
+
const tflowId = tflowRaw !== undefined && TFLOW_ID_RE.test(tflowRaw) ? tflowRaw : undefined;
|
|
114
|
+
const controls = strings(f.controls).slice(0, MAX_CONTROLS);
|
|
115
|
+
const fingerprint = uxFindingFingerprint({ claim, ...(producerClaim === undefined ? {} : { producerClaim }), route, ...(tflowId === undefined ? {} : { tflowId }), controls });
|
|
116
|
+
const citation = isRecord(f.citation) ? { source: str(f.citation.source), ref: str(f.citation.ref) } : undefined;
|
|
117
|
+
const userImpact = str(f.userImpact);
|
|
118
|
+
const recommendation = str(f.recommendation);
|
|
119
|
+
return {
|
|
120
|
+
finding: {
|
|
121
|
+
fingerprint,
|
|
122
|
+
kind: "ux",
|
|
123
|
+
claim,
|
|
124
|
+
...(producerClaim === undefined ? {} : { producerClaim }),
|
|
125
|
+
severity: severity,
|
|
126
|
+
confidence,
|
|
127
|
+
...runStamp(run),
|
|
128
|
+
at: run.startedAt,
|
|
129
|
+
...seenAt(run.branch),
|
|
130
|
+
route,
|
|
131
|
+
...(tflowId === undefined ? {} : { tflowId }),
|
|
132
|
+
...(controls.length === 0 ? {} : { controls }),
|
|
133
|
+
observation,
|
|
134
|
+
...(userImpact === undefined ? {} : { userImpact }),
|
|
135
|
+
...(recommendation === undefined ? {} : { recommendation }),
|
|
136
|
+
...(citation?.source !== undefined && citation.ref !== undefined && CITATION_SOURCE_RE.test(citation.source) && CITATION_REF_RE.test(citation.ref)
|
|
137
|
+
? { citation: { source: citation.source, ref: citation.ref } }
|
|
138
|
+
: {}),
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/** The bundle's findings from what the runs persisted (pure): one per fingerprint, latest sighting first-class. */
|
|
143
|
+
export function bundleFindings(src) {
|
|
144
|
+
const warnings = [];
|
|
145
|
+
const latest = new Map();
|
|
146
|
+
const keep = (m) => {
|
|
147
|
+
if (m === null)
|
|
148
|
+
return;
|
|
149
|
+
if ("drop" in m) {
|
|
150
|
+
warnings.push(`${m.drop} — left out of the bundle`);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const issues = findingIssues(m.finding);
|
|
154
|
+
if (issues.length > 0) {
|
|
155
|
+
// Name the fingerprint and the rule only: the offending text never reaches a warning.
|
|
156
|
+
warnings.push(`finding ${m.finding.fingerprint} (${m.finding.kind}): ${issues.map((i) => i.replace(/^finding [0-9a-f]+: /u, "").replace(/ "[^"]*"/gu, "")).join("; ")} — left out of the bundle`);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const prev = latest.get(m.finding.fingerprint);
|
|
160
|
+
if (prev === undefined || prev.at <= m.finding.at)
|
|
161
|
+
latest.set(m.finding.fingerprint, m.finding);
|
|
162
|
+
};
|
|
163
|
+
const byPath = new Map(src.runs.map((r) => [r.path, r]));
|
|
164
|
+
for (const d of consolidate(src.runs))
|
|
165
|
+
keep(defectFinding(d, byPath));
|
|
166
|
+
for (const { report, run } of src.uxReports) {
|
|
167
|
+
if (!isRecord(report) || !Array.isArray(report.findings))
|
|
168
|
+
continue;
|
|
169
|
+
for (const f of report.findings)
|
|
170
|
+
if (isRecord(f))
|
|
171
|
+
keep(uxFinding(f, run));
|
|
172
|
+
}
|
|
173
|
+
let findings = [...latest.values()].sort((a, b) => a.at.localeCompare(b.at) || a.fingerprint.localeCompare(b.fingerprint));
|
|
174
|
+
if (findings.length > MAX_FINDINGS) {
|
|
175
|
+
warnings.push(`${findings.length} findings: only the latest ${MAX_FINDINGS} are exported`);
|
|
176
|
+
findings = findings.slice(-MAX_FINDINGS);
|
|
177
|
+
}
|
|
178
|
+
return { findings, warnings };
|
|
179
|
+
}
|
|
180
|
+
// ── I/O: where the project's findings live ──────────────────────────────────────────────────
|
|
181
|
+
const OFFLINE_UX_REPORT = /^ux-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-\d{3}Z\.json$/u;
|
|
182
|
+
function readJsonOrNull(path) {
|
|
183
|
+
try {
|
|
184
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return null; // unreadable/partial: not a source (never a fabricated one)
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/** The ledger's entries as runs: each is a redacted mission result holding one defect or hang. */
|
|
191
|
+
function ledgerRuns(dataDir) {
|
|
192
|
+
if (dataDir === null)
|
|
193
|
+
return [];
|
|
194
|
+
const dir = join(dataDir, "regressions", "ledger");
|
|
195
|
+
if (!existsSync(dir))
|
|
196
|
+
return [];
|
|
197
|
+
const out = [];
|
|
198
|
+
for (const f of readdirSync(dir).sort()) {
|
|
199
|
+
if (!/^[0-9a-f]{16}\.json$/u.test(f))
|
|
200
|
+
continue;
|
|
201
|
+
const entry = readJsonOrNull(join(dir, f));
|
|
202
|
+
if (!isRecord(entry) || !isRecord(entry.ledger) || !isRecord(entry.result))
|
|
203
|
+
continue;
|
|
204
|
+
const meta = entry.ledger;
|
|
205
|
+
const source = isRecord(meta.source) ? meta.source : {};
|
|
206
|
+
const run = runFromMissionResult(join(dir, f), {
|
|
207
|
+
missionOutcome: str(source.missionOutcome) ?? "defects-found",
|
|
208
|
+
result: { ...(str(meta.addedAt) === undefined ? {} : { startedAt: str(meta.addedAt) }), ...entry.result },
|
|
209
|
+
});
|
|
210
|
+
if (run !== null)
|
|
211
|
+
out.push(run);
|
|
212
|
+
}
|
|
213
|
+
return out;
|
|
214
|
+
}
|
|
215
|
+
/** Reads the project's runs, UX reports and ledger, and returns the bundle's findings. */
|
|
216
|
+
export async function collectBundleFindings(opts) {
|
|
217
|
+
const sources = defaultReportSources(false, { cwd: () => opts.root, ...opts.index });
|
|
218
|
+
const runs = scanRuns(sources.dirs);
|
|
219
|
+
const seen = new Set(runs.map((r) => resolve(r.path)));
|
|
220
|
+
for (const f of sources.files) {
|
|
221
|
+
if (seen.has(resolve(f)))
|
|
222
|
+
continue;
|
|
223
|
+
seen.add(resolve(f));
|
|
224
|
+
const run = loadRunFile(f);
|
|
225
|
+
if (run !== null)
|
|
226
|
+
runs.push(run);
|
|
227
|
+
}
|
|
228
|
+
const uxReports = [];
|
|
229
|
+
for (const run of runs) {
|
|
230
|
+
if (run.mode !== "usability")
|
|
231
|
+
continue;
|
|
232
|
+
const raw = readJsonOrNull(run.path);
|
|
233
|
+
const report = isRecord(raw) && Array.isArray(raw.findings) ? raw : isRecord(raw) && isRecord(raw.result) ? raw.result.report : undefined;
|
|
234
|
+
if (report !== undefined)
|
|
235
|
+
uxReports.push({ report, run });
|
|
236
|
+
}
|
|
237
|
+
for (const dir of sources.dirs) {
|
|
238
|
+
if (!existsSync(dir) || !statSync(dir).isDirectory())
|
|
239
|
+
continue;
|
|
240
|
+
for (const f of readdirSync(dir).sort()) {
|
|
241
|
+
if (!OFFLINE_UX_REPORT.test(f))
|
|
242
|
+
continue;
|
|
243
|
+
const path = join(dir, f);
|
|
244
|
+
const raw = readJsonOrNull(path);
|
|
245
|
+
const run = runFromUxReport(path, raw);
|
|
246
|
+
if (run !== null)
|
|
247
|
+
uxReports.push({ report: raw, run });
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return bundleFindings({ runs: [...runs, ...ledgerRuns(opts.dataDir)], uxReports });
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=catalog-bundle-findings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-bundle-findings.js","sourceRoot":"","sources":["../src/catalog-bundle-findings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { JOURNEY_RUN_OUTCOMES, type MissionOutcome } from "@jevitate/domain";
|
|
2
|
+
import { CatalogInputError, type Catalog } from "./catalog.js";
|
|
3
|
+
/**
|
|
4
|
+
* #464 (d464a) — the PURE builder of a Journeeze catalog bundle, version 1.0 (journeeze-saas
|
|
5
|
+
* `docs/contract/catalog-bundle-v1.md` at 61f8c92, schema `catalog-bundle.v1.json`). No I/O, no
|
|
6
|
+
* clock: catalog-bundle-api.ts loads the catalog, the raw persona entries, the `check.json` records
|
|
7
|
+
* and the producer identity, and writes what this returns.
|
|
8
|
+
*
|
|
9
|
+
* What goes out, and how (each rule is the contract's):
|
|
10
|
+
* - personas: `{id, description, role, otherFields, approval}` — every descriptive key, so §8's
|
|
11
|
+
* persona hash (`{id, …description, role and otherFields}`) recomputes to jevitate's
|
|
12
|
+
* `personaContentHash`. Session keys (`storageState`, `login`) never leave.
|
|
13
|
+
* - jobs: the `jobs.json` entry as loaded (every jtbd and campaign field — the hash input), with its
|
|
14
|
+
* approval reduced to the contract's `{contentHash, at, channel}` (approval is outside the hash).
|
|
15
|
+
* - journeys: PROMOTED Journeys only, the file as jevitate reads it (the review-hash input), with
|
|
16
|
+
* approval provenance reduced to `{channel, agentSignals}` (no OS user, no reason, no PR reviewer —
|
|
17
|
+
* bookkeeping outside the hash), and `link {job, persona, anchors, serves}` from its metadata.
|
|
18
|
+
* - checks: one per check item that ran, keyed (target.id, commit, runId); a baseline only from a
|
|
19
|
+
* clean run whose `journeyHash` is the exported Journey's approved hash.
|
|
20
|
+
* - findings: whatever the d464c source hands in (`CatalogBundleFinding`), guarded; none by default.
|
|
21
|
+
* - demos and media: NONE in 0.10 — a demo must carry the jz-mask-v1 + synthetic-data attestation,
|
|
22
|
+
* which jevitate cannot make yet, and the contract says a producer that cannot meet it exports no
|
|
23
|
+
* media. So no `demos`, no `files`.
|
|
24
|
+
* - `generatedAt` is left out on purpose: the same catalog gives the same bytes, so the upload's
|
|
25
|
+
* `Idempotency-Key` (sha256 of bundle.json) dedupes a re-publish.
|
|
26
|
+
*
|
|
27
|
+
* Failure policy: personal data or a credential typed in clear anywhere, or a job the bundle cannot
|
|
28
|
+
* carry (a structural reference problem, text that is not one line), REFUSES the export
|
|
29
|
+
* (`CatalogBundleInputError`, exit 64) — nothing is guessed or silently rewritten. A Journey or a
|
|
30
|
+
* check the bundle cannot carry is LEFT OUT with a warning (nothing else references it in a way the
|
|
31
|
+
* reader would refuse). A persona key the bundle cannot carry drops that key and the persona's
|
|
32
|
+
* approval (its hash could not recompute) with a warning.
|
|
33
|
+
*/
|
|
34
|
+
export declare const BUNDLE_KIND: "journeeze.catalog-bundle";
|
|
35
|
+
export declare const BUNDLE_VERSION: 1;
|
|
36
|
+
/** The schema minor this producer is built against (contract 61f8c92). */
|
|
37
|
+
export declare const BUNDLE_MINOR: 0;
|
|
38
|
+
export interface BundleApproval {
|
|
39
|
+
readonly contentHash: string;
|
|
40
|
+
readonly at: string;
|
|
41
|
+
readonly channel?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface BundlePersona {
|
|
44
|
+
readonly id: string;
|
|
45
|
+
readonly description?: string;
|
|
46
|
+
readonly role?: string;
|
|
47
|
+
readonly otherFields?: Readonly<Record<string, string | number | boolean>>;
|
|
48
|
+
readonly approval?: BundleApproval;
|
|
49
|
+
}
|
|
50
|
+
/** A `jobs.json` entry as loaded, with its approval in the contract's shape. */
|
|
51
|
+
export type BundleJob = Readonly<Record<string, unknown>> & {
|
|
52
|
+
readonly id: string;
|
|
53
|
+
readonly approval?: BundleApproval;
|
|
54
|
+
};
|
|
55
|
+
export interface BundleAnchor {
|
|
56
|
+
readonly name: string;
|
|
57
|
+
/** 1-based step of the Journey's flat step list. */
|
|
58
|
+
readonly step: number;
|
|
59
|
+
readonly jobStep?: string;
|
|
60
|
+
readonly boundary?: "start" | "end";
|
|
61
|
+
}
|
|
62
|
+
export interface BundleLink {
|
|
63
|
+
readonly job: string;
|
|
64
|
+
readonly persona?: string;
|
|
65
|
+
readonly anchors?: readonly BundleAnchor[];
|
|
66
|
+
readonly serves?: readonly string[];
|
|
67
|
+
}
|
|
68
|
+
export interface BundleJourneyEntry {
|
|
69
|
+
/** The Journey file (opaque to the reader beyond a few metadata fields). */
|
|
70
|
+
readonly journey: Readonly<Record<string, unknown>>;
|
|
71
|
+
readonly link?: BundleLink;
|
|
72
|
+
}
|
|
73
|
+
export declare const CHECK_TARGET_KINDS: readonly ["journey", "goal", "mission", "invariant", "verify_fix", "regression"];
|
|
74
|
+
export type BundleCheckTargetKind = (typeof CHECK_TARGET_KINDS)[number];
|
|
75
|
+
export interface BundleBaselinePoint {
|
|
76
|
+
/** An anchor name, or the reserved `job_start` / `job_end`. */
|
|
77
|
+
readonly anchor: string;
|
|
78
|
+
readonly step: number;
|
|
79
|
+
/** Milliseconds from the first step's start to this step's completion. */
|
|
80
|
+
readonly atMs: number;
|
|
81
|
+
}
|
|
82
|
+
export interface BundleBaseline {
|
|
83
|
+
readonly steps: number;
|
|
84
|
+
readonly totalMs: number;
|
|
85
|
+
readonly anchors: readonly BundleBaselinePoint[];
|
|
86
|
+
}
|
|
87
|
+
export interface BundleCheck {
|
|
88
|
+
readonly target: {
|
|
89
|
+
readonly id: string;
|
|
90
|
+
readonly kind?: BundleCheckTargetKind;
|
|
91
|
+
};
|
|
92
|
+
readonly commit: string;
|
|
93
|
+
readonly at: string;
|
|
94
|
+
readonly runId?: string;
|
|
95
|
+
readonly journey?: string;
|
|
96
|
+
readonly journeyHash?: string;
|
|
97
|
+
readonly outcome: MissionOutcome;
|
|
98
|
+
readonly exitCode: number;
|
|
99
|
+
readonly journeyOutcome?: (typeof JOURNEY_RUN_OUTCOMES)[number];
|
|
100
|
+
readonly failureKind?: string;
|
|
101
|
+
readonly durationMs?: number;
|
|
102
|
+
readonly baseline?: BundleBaseline;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* d464c HOOK: one machine finding as the contract's `findings[]` carries it (§4.4) — UX claims with
|
|
106
|
+
* the derived fingerprint, defects and hangs with jevitate's. 0.10 exports no media, so no
|
|
107
|
+
* `screenshot`/`box`. The d464c deliverable produces these (fingerprint + PII scan) and passes them in
|
|
108
|
+
* through `CatalogBundleInput.findings`; until then the bundle carries `findings: []`.
|
|
109
|
+
*/
|
|
110
|
+
export interface CatalogBundleFinding {
|
|
111
|
+
readonly fingerprint: string;
|
|
112
|
+
readonly kind: "ux" | "defect" | "hang";
|
|
113
|
+
readonly claim?: "next-step-unclear" | "no-feedback" | "blocked-action" | "error-unrecoverable" | "destructive-unguarded" | "fact-conflict" | "other";
|
|
114
|
+
readonly producerClaim?: string;
|
|
115
|
+
readonly severity: "info" | "minor" | "major";
|
|
116
|
+
readonly confidence?: number;
|
|
117
|
+
readonly commit?: string;
|
|
118
|
+
readonly at: string;
|
|
119
|
+
readonly target?: string;
|
|
120
|
+
readonly journey?: string;
|
|
121
|
+
readonly step?: number;
|
|
122
|
+
readonly anchor?: string;
|
|
123
|
+
/** A route TEMPLATE: no query, fragment, host or record id. */
|
|
124
|
+
readonly route?: string;
|
|
125
|
+
readonly tflowId?: string;
|
|
126
|
+
readonly controls?: readonly string[];
|
|
127
|
+
readonly observation: string;
|
|
128
|
+
readonly userImpact?: string;
|
|
129
|
+
readonly recommendation?: string;
|
|
130
|
+
readonly citation?: {
|
|
131
|
+
readonly source: string;
|
|
132
|
+
readonly ref: string;
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
export interface CatalogBundleV1 {
|
|
136
|
+
readonly kind: typeof BUNDLE_KIND;
|
|
137
|
+
readonly version: typeof BUNDLE_VERSION;
|
|
138
|
+
readonly minor: typeof BUNDLE_MINOR;
|
|
139
|
+
readonly producer: {
|
|
140
|
+
readonly tool: "jevitate";
|
|
141
|
+
readonly version: string;
|
|
142
|
+
readonly commit?: string;
|
|
143
|
+
};
|
|
144
|
+
readonly product: {
|
|
145
|
+
readonly name: string;
|
|
146
|
+
};
|
|
147
|
+
readonly catalog: {
|
|
148
|
+
readonly personas: readonly BundlePersona[];
|
|
149
|
+
readonly jobs: readonly BundleJob[];
|
|
150
|
+
readonly journeys: readonly BundleJourneyEntry[];
|
|
151
|
+
};
|
|
152
|
+
readonly checks: readonly BundleCheck[];
|
|
153
|
+
readonly findings: readonly CatalogBundleFinding[];
|
|
154
|
+
}
|
|
155
|
+
/** One `jevitate check` record (`check.json`'s `data`, or the bare result) and where it came from. */
|
|
156
|
+
export interface CheckRecordInput {
|
|
157
|
+
readonly source: string;
|
|
158
|
+
readonly record: unknown;
|
|
159
|
+
}
|
|
160
|
+
export interface CatalogBundleInput {
|
|
161
|
+
/** `producer.version` (semver) and `producer.commit` (the product repo's HEAD, when known). */
|
|
162
|
+
readonly producer: {
|
|
163
|
+
readonly version: string;
|
|
164
|
+
readonly commit?: string;
|
|
165
|
+
};
|
|
166
|
+
readonly productName: string;
|
|
167
|
+
readonly catalog: Catalog;
|
|
168
|
+
/** Each persona's raw `personas.json` keys (all but its `name`/`id`) — the persona hash input. */
|
|
169
|
+
readonly personaFields: ReadonlyMap<string, Readonly<Record<string, unknown>>>;
|
|
170
|
+
readonly checks: readonly CheckRecordInput[];
|
|
171
|
+
/** d464c: the machine findings to export (default none). */
|
|
172
|
+
readonly findings?: readonly CatalogBundleFinding[];
|
|
173
|
+
}
|
|
174
|
+
export interface CatalogBundleBuild {
|
|
175
|
+
readonly bundle: CatalogBundleV1;
|
|
176
|
+
/** Items left out or degraded, each with why. */
|
|
177
|
+
readonly warnings: readonly string[];
|
|
178
|
+
}
|
|
179
|
+
/** The catalog cannot be exported as it is (personal data, a credential typed in clear, a job the bundle cannot carry) — exit 64. */
|
|
180
|
+
export declare class CatalogBundleInputError extends CatalogInputError {
|
|
181
|
+
readonly issues: readonly string[];
|
|
182
|
+
readonly code: string;
|
|
183
|
+
constructor(issues: readonly string[]);
|
|
184
|
+
}
|
|
185
|
+
/** Looks like personal data (an email, or 9+ digits) — the contract's `noPersonalData`. */
|
|
186
|
+
export declare function looksPersonal(s: string): boolean;
|
|
187
|
+
/** The contract's `routeTemplate`: a path template — no query string, fragment, host or record id. */
|
|
188
|
+
export declare function isRouteTemplate(route: string): boolean;
|
|
189
|
+
/** Why a finding handed in by the d464c source breaks the contract's privacy rules (§7), or []. */
|
|
190
|
+
export declare function findingIssues(f: CatalogBundleFinding): string[];
|
|
191
|
+
/** Builds the bundle (pure). Throws `CatalogBundleInputError` when the catalog cannot be exported. */
|
|
192
|
+
export declare function buildCatalogBundle(input: CatalogBundleInput): CatalogBundleBuild;
|