@komatikai/trailhead 4.1.0 → 4.2.2
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 +55 -22
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/run-doctor.d.ts +1 -0
- package/dist/run-doctor.js +83 -0
- package/dist/run-doctor.js.map +1 -0
- package/dist/shared/ci-core.d.ts +18 -0
- package/dist/shared/ci-core.js +210 -0
- package/dist/shared/ci-core.js.map +1 -0
- package/dist/shared/ci-manifest.d.ts +82 -0
- package/dist/shared/ci-manifest.js +51 -0
- package/dist/shared/ci-manifest.js.map +1 -0
- package/dist/shared/config-core.d.ts +5 -0
- package/dist/shared/config-core.js +127 -0
- package/dist/shared/config-core.js.map +1 -0
- package/dist/shared/doctor.d.ts +48 -0
- package/dist/shared/doctor.js +308 -0
- package/dist/shared/doctor.js.map +1 -0
- package/dist/shared/release-ready.d.ts +27 -0
- package/dist/shared/release-ready.js +97 -0
- package/dist/shared/release-ready.js.map +1 -0
- package/dist/shared/types.d.ts +1813 -0
- package/dist/shared/types.js +338 -0
- package/dist/shared/types.js.map +1 -0
- package/package.json +6 -3
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { CiSummary, GateDecision, GateEvaluation, GateMode } from "./types.js";
|
|
2
|
+
export interface ReleaseReadyInput {
|
|
3
|
+
gateMode: GateMode;
|
|
4
|
+
gateDecision: GateDecision;
|
|
5
|
+
riskScore: number;
|
|
6
|
+
riskThreshold: number;
|
|
7
|
+
healthScore: number;
|
|
8
|
+
healthChecksConfigured: boolean;
|
|
9
|
+
ciSummary?: CiSummary | null;
|
|
10
|
+
freezeActive: boolean;
|
|
11
|
+
freezeMessage?: string;
|
|
12
|
+
policyFindings?: string[];
|
|
13
|
+
requireSecurityClear?: boolean;
|
|
14
|
+
securityBlocked?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface ReleaseReadyResult {
|
|
17
|
+
releaseReady: boolean;
|
|
18
|
+
reasons: string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Composite release readiness decision (ADR-006).
|
|
22
|
+
*/
|
|
23
|
+
export declare function computeReleaseReady(input: ReleaseReadyInput): ReleaseReadyResult;
|
|
24
|
+
export declare function applyReleaseReadyToEvaluation(evaluation: GateEvaluation, result: ReleaseReadyResult, gateMode: GateMode): GateEvaluation;
|
|
25
|
+
export declare function checkConclusionForEvaluation(evaluation: GateEvaluation): "success" | "neutral" | "failure";
|
|
26
|
+
export declare function shouldBlockMerge(evaluation: GateEvaluation): boolean;
|
|
27
|
+
export declare function resolveCheckName(gateMode: GateMode, configuredName?: string): string;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composite release readiness decision (ADR-006).
|
|
3
|
+
*/
|
|
4
|
+
export function computeReleaseReady(input) {
|
|
5
|
+
const reasons = [];
|
|
6
|
+
if (input.gateMode === "risk-only") {
|
|
7
|
+
if (input.gateDecision === "block") {
|
|
8
|
+
reasons.push("Risk/policy gate decision is BLOCK");
|
|
9
|
+
}
|
|
10
|
+
else if (input.gateDecision === "warn") {
|
|
11
|
+
reasons.push("Risk/policy gate decision is WARN (non-blocking in risk-only mode)");
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
releaseReady: input.gateDecision !== "block",
|
|
15
|
+
reasons,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
if (input.ciSummary) {
|
|
19
|
+
if (!input.ciSummary.allRequiredPassed) {
|
|
20
|
+
const failed = input.ciSummary.checks.filter((c) => c.required &&
|
|
21
|
+
(c.status === "fail" || c.status === "missing" || c.status === "stale"));
|
|
22
|
+
for (const check of failed) {
|
|
23
|
+
reasons.push(`Required CI check "${check.name}" is ${check.status.toUpperCase()}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (input.ciSummary.pendingCount > 0) {
|
|
27
|
+
reasons.push(`${input.ciSummary.pendingCount} required CI check(s) still pending`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (input.gateDecision === "block") {
|
|
31
|
+
reasons.push("Risk/policy gate decision is BLOCK");
|
|
32
|
+
}
|
|
33
|
+
if (input.riskScore > input.riskThreshold) {
|
|
34
|
+
reasons.push(`Risk score ${input.riskScore} exceeds threshold ${input.riskThreshold}`);
|
|
35
|
+
}
|
|
36
|
+
if (input.freezeActive) {
|
|
37
|
+
reasons.push(`Release freeze active${input.freezeMessage ? `: ${input.freezeMessage}` : ""}`);
|
|
38
|
+
}
|
|
39
|
+
if (input.healthChecksConfigured && input.healthScore < 50) {
|
|
40
|
+
reasons.push(`Health score ${input.healthScore} below minimum (50)`);
|
|
41
|
+
}
|
|
42
|
+
if (input.requireSecurityClear && input.securityBlocked) {
|
|
43
|
+
reasons.push("Security gate requires clearance — blocking alerts present");
|
|
44
|
+
}
|
|
45
|
+
const blockingFindings = (input.policyFindings ?? []).filter((f) => /blocking|requires|exceeds|configured to block/i.test(f));
|
|
46
|
+
if (blockingFindings.length > 0 && input.gateDecision === "block") {
|
|
47
|
+
for (const finding of blockingFindings.slice(0, 3)) {
|
|
48
|
+
if (!reasons.includes(finding))
|
|
49
|
+
reasons.push(finding);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const releaseReady = reasons.length === 0;
|
|
53
|
+
return { releaseReady, reasons };
|
|
54
|
+
}
|
|
55
|
+
export function applyReleaseReadyToEvaluation(evaluation, result, gateMode) {
|
|
56
|
+
return {
|
|
57
|
+
...evaluation,
|
|
58
|
+
releaseReady: result.releaseReady,
|
|
59
|
+
releaseReadyReasons: result.reasons.length > 0 ? result.reasons : undefined,
|
|
60
|
+
gateMode,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export function checkConclusionForEvaluation(evaluation) {
|
|
64
|
+
const mode = evaluation.gateMode ?? "risk-only";
|
|
65
|
+
if (mode === "advisory") {
|
|
66
|
+
return "neutral";
|
|
67
|
+
}
|
|
68
|
+
if (mode === "release-ready") {
|
|
69
|
+
return evaluation.releaseReady ? "success" : "failure";
|
|
70
|
+
}
|
|
71
|
+
switch (evaluation.gateDecision) {
|
|
72
|
+
case "allow":
|
|
73
|
+
return "success";
|
|
74
|
+
case "warn":
|
|
75
|
+
return "neutral";
|
|
76
|
+
case "block":
|
|
77
|
+
return "failure";
|
|
78
|
+
default: {
|
|
79
|
+
const _exhaustive = evaluation.gateDecision;
|
|
80
|
+
return "failure";
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export function shouldBlockMerge(evaluation) {
|
|
85
|
+
const mode = evaluation.gateMode ?? "risk-only";
|
|
86
|
+
if (mode === "advisory")
|
|
87
|
+
return false;
|
|
88
|
+
if (mode === "release-ready")
|
|
89
|
+
return evaluation.releaseReady === false;
|
|
90
|
+
return evaluation.gateDecision === "block";
|
|
91
|
+
}
|
|
92
|
+
export function resolveCheckName(gateMode, configuredName) {
|
|
93
|
+
if (gateMode === "risk-only")
|
|
94
|
+
return "Trailhead";
|
|
95
|
+
return configuredName ?? "Trailhead — Release Ready";
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=release-ready.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-ready.js","sourceRoot":"","sources":["../../src/shared/release-ready.ts"],"names":[],"mappings":"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"}
|