evergreen-deprecation 0.2.0 → 0.3.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/README.md +5 -1
- package/dist/src/action.js +19 -8
- package/dist/src/action.js.map +1 -1
- package/dist/src/agent-tools.d.ts +1 -1
- package/dist/src/agent-tools.js +7 -3
- package/dist/src/agent-tools.js.map +1 -1
- package/dist/src/baseline.d.ts +65 -3
- package/dist/src/baseline.js +123 -11
- package/dist/src/baseline.js.map +1 -1
- package/dist/src/capabilities.d.ts +6 -1
- package/dist/src/capabilities.js +22 -12
- package/dist/src/capabilities.js.map +1 -1
- package/dist/src/cli.js +20 -4
- package/dist/src/cli.js.map +1 -1
- package/dist/src/data-bundle.d.ts +1 -1
- package/dist/src/data-bundle.js +1 -1
- package/dist/src/data-bundle.js.map +1 -1
- package/dist/src/detectors/ci-images/parse-gitlab-ci.d.ts +22 -0
- package/dist/src/detectors/ci-images/parse-gitlab-ci.js +90 -0
- package/dist/src/detectors/ci-images/parse-gitlab-ci.js.map +1 -0
- package/dist/src/detectors/dotnet/index.d.ts +24 -0
- package/dist/src/detectors/dotnet/index.js +215 -0
- package/dist/src/detectors/dotnet/index.js.map +1 -0
- package/dist/src/detectors/dotnet/json-lines.d.ts +31 -0
- package/dist/src/detectors/dotnet/json-lines.js +167 -0
- package/dist/src/detectors/dotnet/json-lines.js.map +1 -0
- package/dist/src/detectors/dotnet/msbuild-xml.d.ts +24 -0
- package/dist/src/detectors/dotnet/msbuild-xml.js +146 -0
- package/dist/src/detectors/dotnet/msbuild-xml.js.map +1 -0
- package/dist/src/detectors/dotnet/parse-global-json.d.ts +15 -0
- package/dist/src/detectors/dotnet/parse-global-json.js +6 -0
- package/dist/src/detectors/dotnet/parse-global-json.js.map +1 -0
- package/dist/src/detectors/dotnet/parse-msbuild.d.ts +34 -0
- package/dist/src/detectors/dotnet/parse-msbuild.js +48 -0
- package/dist/src/detectors/dotnet/parse-msbuild.js.map +1 -0
- package/dist/src/detectors/dotnet/parse-packages-lock.d.ts +18 -0
- package/dist/src/detectors/dotnet/parse-packages-lock.js +20 -0
- package/dist/src/detectors/dotnet/parse-packages-lock.js.map +1 -0
- package/dist/src/detectors/index.js +8 -0
- package/dist/src/detectors/index.js.map +1 -1
- package/dist/src/detectors/java/index.d.ts +8 -0
- package/dist/src/detectors/java/index.js +173 -0
- package/dist/src/detectors/java/index.js.map +1 -0
- package/dist/src/detectors/java/jdk-version.d.ts +58 -0
- package/dist/src/detectors/java/jdk-version.js +45 -0
- package/dist/src/detectors/java/jdk-version.js.map +1 -0
- package/dist/src/detectors/java/parse-gradle.d.ts +22 -0
- package/dist/src/detectors/java/parse-gradle.js +174 -0
- package/dist/src/detectors/java/parse-gradle.js.map +1 -0
- package/dist/src/detectors/java/parse-pins.d.ts +18 -0
- package/dist/src/detectors/java/parse-pins.js +49 -0
- package/dist/src/detectors/java/parse-pins.js.map +1 -0
- package/dist/src/detectors/java/parse-pom.d.ts +15 -0
- package/dist/src/detectors/java/parse-pom.js +87 -0
- package/dist/src/detectors/java/parse-pom.js.map +1 -0
- package/dist/src/detectors/java/parse-wrapper.d.ts +13 -0
- package/dist/src/detectors/java/parse-wrapper.js +42 -0
- package/dist/src/detectors/java/parse-wrapper.js.map +1 -0
- package/dist/src/detectors/java/xml.d.ts +23 -0
- package/dist/src/detectors/java/xml.js +140 -0
- package/dist/src/detectors/java/xml.js.map +1 -0
- package/dist/src/detectors/kubernetes/api-version.d.ts +21 -0
- package/dist/src/detectors/kubernetes/api-version.js +39 -0
- package/dist/src/detectors/kubernetes/api-version.js.map +1 -0
- package/dist/src/detectors/kubernetes/index.d.ts +8 -0
- package/dist/src/detectors/kubernetes/index.js +156 -0
- package/dist/src/detectors/kubernetes/index.js.map +1 -0
- package/dist/src/detectors/kubernetes/parse-helm.d.ts +32 -0
- package/dist/src/detectors/kubernetes/parse-helm.js +229 -0
- package/dist/src/detectors/kubernetes/parse-helm.js.map +1 -0
- package/dist/src/detectors/kubernetes/parse-kustomize.d.ts +30 -0
- package/dist/src/detectors/kubernetes/parse-kustomize.js +144 -0
- package/dist/src/detectors/kubernetes/parse-kustomize.js.map +1 -0
- package/dist/src/detectors/kubernetes/parse-manifest.d.ts +33 -0
- package/dist/src/detectors/kubernetes/parse-manifest.js +80 -0
- package/dist/src/detectors/kubernetes/parse-manifest.js.map +1 -0
- package/dist/src/detectors/python.js +13 -3
- package/dist/src/detectors/python.js.map +1 -1
- package/dist/src/detectors/rust/index.d.ts +12 -0
- package/dist/src/detectors/rust/index.js +171 -0
- package/dist/src/detectors/rust/index.js.map +1 -0
- package/dist/src/detectors/rust/parse-cargo-lock.d.ts +19 -0
- package/dist/src/detectors/rust/parse-cargo-lock.js +48 -0
- package/dist/src/detectors/rust/parse-cargo-lock.js.map +1 -0
- package/dist/src/detectors/rust/parse-cargo-toml.d.ts +31 -0
- package/dist/src/detectors/rust/parse-cargo-toml.js +102 -0
- package/dist/src/detectors/rust/parse-cargo-toml.js.map +1 -0
- package/dist/src/detectors/rust/parse-rust-toolchain.d.ts +18 -0
- package/dist/src/detectors/rust/parse-rust-toolchain.js +36 -0
- package/dist/src/detectors/rust/parse-rust-toolchain.js.map +1 -0
- package/dist/src/detectors/rust/toml-lines.d.ts +31 -0
- package/dist/src/detectors/rust/toml-lines.js +118 -0
- package/dist/src/detectors/rust/toml-lines.js.map +1 -0
- package/dist/src/domain.d.ts +30 -3
- package/dist/src/domain.js +4 -0
- package/dist/src/domain.js.map +1 -1
- package/dist/src/github-action.d.ts +27 -1
- package/dist/src/github-action.js +87 -4
- package/dist/src/github-action.js.map +1 -1
- package/dist/src/mcp.js +6 -3
- package/dist/src/mcp.js.map +1 -1
- package/dist/src/registry.d.ts +1 -1
- package/dist/src/registry.js +8 -1
- package/dist/src/registry.js.map +1 -1
- package/dist/src/reporters.js +4 -0
- package/dist/src/reporters.js.map +1 -1
- package/dist/src/sdk.js +2 -2
- package/dist/src/sdk.js.map +1 -1
- package/dist/src/source-usage.js +224 -6
- package/dist/src/source-usage.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/examples/agents/copilot/.vscode/mcp.json +1 -1
- package/examples/agents/copilot/README.md +4 -1
- package/examples/agents/copilot/coding-agent-mcp.json +1 -1
- package/examples/agents/cursor/.cursor/mcp.json +1 -1
- package/examples/agents/cursor/README.md +4 -1
- package/examples/agents/gemini/README.md +4 -1
- package/examples/agents/gemini/gemini-extension.json +2 -2
- package/examples/agents/gemini/settings.json +1 -1
- package/examples/agents/kilo/README.md +4 -1
- package/examples/agents/kilo/kilo.jsonc +1 -1
- package/examples/capabilities.json +21 -17
- package/package.json +7 -2
- package/registry/dotnet.json +484 -0
- package/registry/go.json +57 -0
- package/registry/java.json +430 -0
- package/registry/kubernetes.json +324 -0
- package/registry/npm.json +2069 -390
- package/registry/python.json +1316 -249
- package/registry/rust.json +290 -0
- package/schemas/baseline.v1.schema.json +5 -1
- package/schemas/capabilities.v1.schema.json +2 -0
- package/schemas/check.v1.schema.json +1 -1
- package/schemas/public-validation.v1.schema.json +1 -1
- package/schemas/registry.v2.schema.json +3 -3
- package/schemas/rule.v1.schema.json +1 -1
- package/schemas/scan.v1.schema.json +392 -63
package/README.md
CHANGED
|
@@ -26,11 +26,15 @@ Read the [public documentation](https://arminazimi.github.io/evergreen/), run th
|
|
|
26
26
|
| Ecosystem | What Evergreen reads | What it reports |
|
|
27
27
|
| --- | --- | --- |
|
|
28
28
|
| **Container base images** *(experimental)* | `Dockerfile`, `*.Dockerfile`, `Containerfile`, `compose.yaml`, `docker-compose.yml`: base images of official `node`, `python`, `postgres`, `mysql`, and `ruby` | Image release lines that are end of life. Variables, `latest`, and floating tags are listed as unclassified, never guessed. See [Container base images](docs/detectors/container.md) |
|
|
29
|
+
| **.NET** *(experimental)* | `global.json`, `*.csproj`/`*.fsproj`/`*.vbproj`, `Directory.Build.props`, `Directory.Packages.props`, `packages.lock.json`: the pinned SDK, target frameworks, and direct NuGet packages | .NET release lines past end of support, and direct packages their publisher deprecated, with the C# files that use them. .NET Framework, `netstandard`, MSBuild properties, floating versions, and ranges are not judged. See [.NET](docs/detectors/dotnet.md) |
|
|
29
30
|
| **Go** *(experimental)* | `go.mod` and `go.work`: `go` and `toolchain` directives, and direct `require` entries | Go release lines that no longer receive fixes, and direct modules with a lifecycle rule. Versions Evergreen cannot read are listed as unclassified. See [Go](docs/detectors/go.md) |
|
|
30
31
|
| **GitHub Actions** | `.github/workflows/*.yml`: `uses:` references to actions, including full-SHA pins resolved through a trailing version comment or a bundled release map | Actions on retired runtimes (such as Node.js 20) and retired or deprecated majors, at the exact line |
|
|
32
|
+
| **Java and Kotlin (JVM)** *(experimental)* | `pom.xml`, `build.gradle`, `build.gradle.kts`, `.java-version`, `.sdkmanrc`, `.tool-versions`: the JDK a project pins or targets, and direct Maven dependencies. See [Java and Kotlin](docs/detectors/java.md) | JDK feature releases that are out of support, and dependencies whose POM says they moved. Property references and expressions are listed as unclassified |
|
|
33
|
+
| **Kubernetes APIs** *(experimental)* | `*.yaml`, `*.yml` manifests, Helm chart `templates/`, and `kustomization.yaml`: the literal `apiVersion` and `kind`, and kustomize patches. See [Kubernetes APIs](docs/detectors/kubernetes.md) | API versions the Kubernetes project says are no longer served. Helm values, cluster-guarded templates, and anything it cannot read literally are skipped |
|
|
31
34
|
| **Node.js** | `engines.node`, `volta`, `.nvmrc`, `.node-version` | Runtime versions that are end of life or out of support |
|
|
32
35
|
| **npm** | `package.json` dependencies, `package-lock.json`, `npm-shrinkwrap.json`, `yarn.lock`, `pnpm-lock.yaml`, and the imports and calls that use each package | Deprecated or unmaintained packages, with the replacement and where the package is used |
|
|
33
36
|
| **Python** | `pyproject.toml`, `requirements*.txt`, `.python-version`, `runtime.txt`, `.tool-versions`, `poetry.lock`, `uv.lock`, `Pipfile.lock` | Python versions that are end of life, and deprecated or obsolete packages |
|
|
37
|
+
| **Rust** *(experimental)* | `Cargo.toml`, `Cargo.lock`, `rust-toolchain(.toml)`: the pinned toolchain and direct crate dependencies | Toolchains older than the newest stable release, and direct dependencies on unmaintained crates with the files that use them. `edition`, `rust-version`, `stable`, and anything it cannot read literally are not judged. See [Rust](docs/detectors/rust.md) |
|
|
34
38
|
|
|
35
39
|
Each finding carries its rule's sources, review date, and migration steps; see [Lifecycle rules](docs/RULES.md). Other ecosystems are not guessed at: Evergreen reports a package it has no rule for as `no-data`, never as safe, and new ecosystems start from a [generated detector skeleton](docs/DETECTORS.md#start-a-new-detector-in-this-repository). The [compatibility matrix](docs/COMPATIBILITY.md) lists supported environments and hosts.
|
|
36
40
|
|
|
@@ -188,7 +192,7 @@ permissions:
|
|
|
188
192
|
|
|
189
193
|
steps:
|
|
190
194
|
- uses: actions/checkout@v7
|
|
191
|
-
- uses: arminazimi/evergreen@v0.
|
|
195
|
+
- uses: arminazimi/evergreen@v0.3.0
|
|
192
196
|
with:
|
|
193
197
|
baseline: .evergreen-baseline.json
|
|
194
198
|
fail-on-severity: high
|
package/dist/src/action.js
CHANGED
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
import { appendFile } from "node:fs/promises";
|
|
3
3
|
import process from "node:process";
|
|
4
4
|
import { resolve } from "node:path";
|
|
5
|
-
import { runGitHubAction } from "./github-action.js";
|
|
6
|
-
import { describeData } from "./reporters.js";
|
|
5
|
+
import { renderFailure, renderSummary, runGitHubAction } from "./github-action.js";
|
|
7
6
|
function commandValue(value) {
|
|
8
7
|
return value.replaceAll("%", "%25").replaceAll("\r", "%0D").replaceAll("\n", "%0A");
|
|
9
8
|
}
|
|
@@ -24,12 +23,14 @@ async function setOutput(name, value) {
|
|
|
24
23
|
if (output)
|
|
25
24
|
await appendFile(output, `${name}=${value}\n`, "utf8");
|
|
26
25
|
}
|
|
27
|
-
async function writeSummary(findings, failed, gate, data) {
|
|
26
|
+
async function writeSummary(findings, failed, gate, data, expiredFailure = false, suppressions) {
|
|
28
27
|
const summary = process.env.GITHUB_STEP_SUMMARY;
|
|
29
28
|
if (!summary)
|
|
30
29
|
return;
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
// On by default; `attribution: "false"` turns the line off.
|
|
31
|
+
const attribution = process.env.INPUT_ATTRIBUTION !== "false";
|
|
32
|
+
const note = expiredFailure ? "\n> **Failed:** a baseline suppression has expired and `on-expired` is set to `fail`.\n" : "";
|
|
33
|
+
await appendFile(summary, `${renderSummary(findings, failed, gate, data, attribution, suppressions)}${note}`, "utf8");
|
|
33
34
|
}
|
|
34
35
|
async function main() {
|
|
35
36
|
try {
|
|
@@ -44,20 +45,30 @@ async function main() {
|
|
|
44
45
|
reportPath,
|
|
45
46
|
...(sarifPath ? { sarifPath } : {}),
|
|
46
47
|
...(process.env.INPUT_BASELINE ? { baselinePath: process.env.INPUT_BASELINE } : {}),
|
|
48
|
+
...(process.env["INPUT_BASELINE-WARN-DAYS"] ? { baselineWarnDays: Number(process.env["INPUT_BASELINE-WARN-DAYS"]) } : {}),
|
|
49
|
+
...(process.env["INPUT_ON-EXPIRED"] ? { onExpired: process.env["INPUT_ON-EXPIRED"] } : {}),
|
|
47
50
|
failOnSeverity: (process.env["INPUT_FAIL-ON-SEVERITY"] || "high"),
|
|
48
51
|
});
|
|
49
52
|
for (const annotation of outcome.annotations)
|
|
50
53
|
console.log(annotationCommand(annotation));
|
|
54
|
+
// A suppression about to expire is a warning on the run, not a finding.
|
|
55
|
+
for (const diagnostic of outcome.result.diagnostics) {
|
|
56
|
+
if (diagnostic.startsWith("Baseline suppression expired"))
|
|
57
|
+
console.log(`::warning title=Evergreen baseline suppression expired::${commandValue(diagnostic)}`);
|
|
58
|
+
if (diagnostic.startsWith("Baseline suppression expires"))
|
|
59
|
+
console.log(`::warning title=Evergreen baseline suppression expires soon::${commandValue(diagnostic)}`);
|
|
60
|
+
}
|
|
51
61
|
await setOutput("report-path", outcome.reportPath);
|
|
52
62
|
if (outcome.sarifPath)
|
|
53
63
|
await setOutput("sarif-path", outcome.sarifPath);
|
|
54
64
|
await setOutput("finding-count", String(outcome.result.findings.length));
|
|
55
|
-
await writeSummary(outcome.result.findings
|
|
65
|
+
await writeSummary(outcome.result.findings, outcome.gateFailed, outcome.gate, outcome.result.data, outcome.expiredFailure, outcome.result.suppressions);
|
|
56
66
|
if (outcome.result.data?.stale)
|
|
57
67
|
console.log(`::warning title=Evergreen lifecycle data is stale::The data is ${outcome.result.data.ageDays} days old, so findings may miss recent changes.`);
|
|
58
68
|
console.log(`Evergreen found ${outcome.result.findings.length} new lifecycle finding${outcome.result.findings.length === 1 ? "" : "s"}.`);
|
|
59
|
-
|
|
60
|
-
|
|
69
|
+
const failure = renderFailure(outcome);
|
|
70
|
+
if (failure) {
|
|
71
|
+
console.log(`::error title=Evergreen policy gate failed::${commandValue(failure)}`);
|
|
61
72
|
process.exitCode = 1;
|
|
62
73
|
}
|
|
63
74
|
}
|
package/dist/src/action.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/action.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/action.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,7 +45,7 @@ export declare class FindingNotObservedError extends Error {
|
|
|
45
45
|
*/
|
|
46
46
|
export declare class EvergreenAgentTools {
|
|
47
47
|
private readonly observed;
|
|
48
|
-
scan(repositoryPath?: string): Promise<ScanResult>;
|
|
48
|
+
scan(repositoryPath?: string, baselinePath?: string): Promise<ScanResult>;
|
|
49
49
|
list(repositoryPath?: string): Promise<DeprecationList>;
|
|
50
50
|
explain(findingId: string, repositoryPath?: string): Promise<Finding>;
|
|
51
51
|
context(findingId: string, repositoryPath?: string): Promise<MigrationPacket>;
|
package/dist/src/agent-tools.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
|
-
import { findingFingerprint } from "./baseline.js";
|
|
3
|
+
import { applyBaseline, findingFingerprint, readBaseline } from "./baseline.js";
|
|
4
4
|
import { builtInDetectors } from "./detectors/index.js";
|
|
5
5
|
import { scanRepository } from "./engine.js";
|
|
6
6
|
import { createMigrationPacket } from "./migration-packet.js";
|
|
@@ -17,8 +17,12 @@ export class FindingNotObservedError extends Error {
|
|
|
17
17
|
*/
|
|
18
18
|
export class EvergreenAgentTools {
|
|
19
19
|
observed = new Map();
|
|
20
|
-
async scan(repositoryPath = ".") {
|
|
21
|
-
|
|
20
|
+
async scan(repositoryPath = ".", baselinePath) {
|
|
21
|
+
let result = await scanRepository(repositoryPath, builtInDetectors);
|
|
22
|
+
if (baselinePath) {
|
|
23
|
+
// A baseline path is relative to the repository, as in the Action. The reference day is today in UTC.
|
|
24
|
+
result = applyBaseline(result, await readBaseline(resolve(repositoryPath, baselinePath)), { today: new Date().toISOString().slice(0, 10) });
|
|
25
|
+
}
|
|
22
26
|
this.remember(result);
|
|
23
27
|
return result;
|
|
24
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-tools.js","sourceRoot":"","sources":["../../src/agent-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-tools.js","sourceRoot":"","sources":["../../src/agent-tools.ts"],"names":[],"mappings":"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"}
|
package/dist/src/baseline.d.ts
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
import type { Finding, ScanResult } from "./domain.js";
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Why a finding is accepted, and until when. All four fields are optional, so a baseline written before they
|
|
4
|
+
* existed is still valid, and they only describe the suppression: they never change a fingerprint.
|
|
5
|
+
*/
|
|
6
|
+
export interface Suppression {
|
|
7
|
+
/** Who is accountable for the accepted finding (a person, team, or handle). */
|
|
8
|
+
owner?: string;
|
|
9
|
+
/** Why it is accepted. */
|
|
10
|
+
reason?: string;
|
|
11
|
+
/** The day the suppression was recorded (YYYY-MM-DD). */
|
|
12
|
+
created?: string;
|
|
13
|
+
/** The day the suppression ends (YYYY-MM-DD), not before `created`. */
|
|
14
|
+
expires?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface BaselineEntry extends Suppression {
|
|
3
17
|
fingerprint: string;
|
|
4
18
|
ruleId: string;
|
|
5
19
|
path: string;
|
|
@@ -10,7 +24,55 @@ export interface Baseline {
|
|
|
10
24
|
findings: BaselineEntry[];
|
|
11
25
|
}
|
|
12
26
|
export declare function findingFingerprint(finding: Finding): string;
|
|
13
|
-
|
|
27
|
+
/** Checks the optional suppression fields of one baseline entry; returns what is wrong, if anything. */
|
|
28
|
+
export declare function suppressionIssues(entry: Suppression): string[];
|
|
29
|
+
/**
|
|
30
|
+
* Builds a baseline from a scan. `suppression`, when given, is recorded on every entry; without it the file has
|
|
31
|
+
* exactly the fields it always had.
|
|
32
|
+
*/
|
|
33
|
+
export declare function createBaseline(result: ScanResult, suppression?: Suppression): Baseline;
|
|
14
34
|
export declare function writeBaseline(path: string, baseline: Baseline): Promise<void>;
|
|
15
35
|
export declare function readBaseline(path: string): Promise<Baseline>;
|
|
16
|
-
export declare
|
|
36
|
+
export declare const DEFAULT_WARN_DAYS = 14;
|
|
37
|
+
export interface ApplyBaselineOptions {
|
|
38
|
+
/**
|
|
39
|
+
* The reference day (YYYY-MM-DD) that suppression dates are compared with. Nothing here reads the clock: the
|
|
40
|
+
* caller says what "today" is, so the same inputs always give the same result. Without it, no date is compared.
|
|
41
|
+
*/
|
|
42
|
+
today?: string;
|
|
43
|
+
/** How many days before `expires` a suppression is reported as expiring soon. */
|
|
44
|
+
warnWithinDays?: number;
|
|
45
|
+
/**
|
|
46
|
+
* What an expired suppression does (needs `today`). `resurface` (the default): it stops hiding its finding.
|
|
47
|
+
* `fail`: the same, and the scan reports a failure in `expired`, whatever the finding's severity.
|
|
48
|
+
*/
|
|
49
|
+
onExpired?: ExpiredPolicy;
|
|
50
|
+
}
|
|
51
|
+
export declare const expiredPolicies: readonly ["resurface", "fail"];
|
|
52
|
+
export type ExpiredPolicy = (typeof expiredPolicies)[number];
|
|
53
|
+
/** An expired suppression that matched a finding in this scan. */
|
|
54
|
+
export interface ExpiredSuppression {
|
|
55
|
+
ruleId: string;
|
|
56
|
+
path: string;
|
|
57
|
+
expires: string;
|
|
58
|
+
daysAgo: number;
|
|
59
|
+
owner?: string;
|
|
60
|
+
reason?: string;
|
|
61
|
+
}
|
|
62
|
+
/** Whole days from `from` to `to`, both YYYY-MM-DD; negative when `to` is earlier. */
|
|
63
|
+
export declare function daysBetween(from: string, to: string): number;
|
|
64
|
+
/** The suppressions that matched a finding in this scan and expire within the window, soonest first. */
|
|
65
|
+
export declare function expiringSuppressions(matched: readonly BaselineEntry[], today: string, warnWithinDays: number): Array<BaselineEntry & {
|
|
66
|
+
daysLeft: number;
|
|
67
|
+
}>;
|
|
68
|
+
/**
|
|
69
|
+
* Applies a baseline and also returns the suppressions that had expired, so a caller that enforces the `fail`
|
|
70
|
+
* policy knows. `applyBaseline` is the same without that list. The expired list is not part of the scan result.
|
|
71
|
+
*/
|
|
72
|
+
export declare function evaluateBaseline(result: ScanResult, baseline: Baseline, options?: ApplyBaselineOptions): {
|
|
73
|
+
result: ScanResult;
|
|
74
|
+
expired: ExpiredSuppression[];
|
|
75
|
+
};
|
|
76
|
+
export declare function applyBaseline(result: ScanResult, baseline: Baseline, options?: ApplyBaselineOptions): ScanResult;
|
|
77
|
+
/** True when the policy is `fail` and at least one suppression had expired. */
|
|
78
|
+
export declare function expiredSuppressionsFail(policy: ExpiredPolicy | undefined, expired: readonly ExpiredSuppression[]): boolean;
|
package/dist/src/baseline.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { isIsoDate } from "./registry.js";
|
|
3
4
|
export function findingFingerprint(finding) {
|
|
4
5
|
const usages = finding.usages
|
|
5
6
|
?.map((usage) => [usage.kind, usage.location.path, usage.symbol])
|
|
@@ -13,7 +14,34 @@ export function findingFingerprint(finding) {
|
|
|
13
14
|
]))
|
|
14
15
|
.digest("hex");
|
|
15
16
|
}
|
|
16
|
-
|
|
17
|
+
/** Checks the optional suppression fields of one baseline entry; returns what is wrong, if anything. */
|
|
18
|
+
export function suppressionIssues(entry) {
|
|
19
|
+
const issues = [];
|
|
20
|
+
for (const field of ["owner", "reason"]) {
|
|
21
|
+
const value = entry[field];
|
|
22
|
+
if (value !== undefined && (typeof value !== "string" || value.trim().length === 0 || value.length > 500)) {
|
|
23
|
+
issues.push(`${field} must be a non-empty string of at most 500 characters`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
for (const field of ["created", "expires"]) {
|
|
27
|
+
const value = entry[field];
|
|
28
|
+
if (value !== undefined && !isIsoDate(value))
|
|
29
|
+
issues.push(`${field} must be a valid date (YYYY-MM-DD)`);
|
|
30
|
+
}
|
|
31
|
+
if (isIsoDate(entry.created) && isIsoDate(entry.expires) && entry.expires < entry.created) {
|
|
32
|
+
issues.push("expires must not be before created");
|
|
33
|
+
}
|
|
34
|
+
return issues;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Builds a baseline from a scan. `suppression`, when given, is recorded on every entry; without it the file has
|
|
38
|
+
* exactly the fields it always had.
|
|
39
|
+
*/
|
|
40
|
+
export function createBaseline(result, suppression = {}) {
|
|
41
|
+
const issues = suppressionIssues(suppression);
|
|
42
|
+
if (issues.length > 0)
|
|
43
|
+
throw new Error(`Invalid suppression: ${issues.join("; ")}.`);
|
|
44
|
+
const extra = Object.fromEntries(Object.entries(suppression).filter(([, value]) => value !== undefined));
|
|
17
45
|
return {
|
|
18
46
|
schemaVersion: "evergreen.baseline.v1",
|
|
19
47
|
createdAt: new Date().toISOString(),
|
|
@@ -21,6 +49,7 @@ export function createBaseline(result) {
|
|
|
21
49
|
fingerprint: findingFingerprint(finding),
|
|
22
50
|
ruleId: finding.ruleId,
|
|
23
51
|
path: finding.location.path,
|
|
52
|
+
...extra,
|
|
24
53
|
})),
|
|
25
54
|
};
|
|
26
55
|
}
|
|
@@ -32,19 +61,102 @@ export async function readBaseline(path) {
|
|
|
32
61
|
if (baseline.schemaVersion !== "evergreen.baseline.v1" || !Array.isArray(baseline.findings)) {
|
|
33
62
|
throw new Error(`Unsupported Evergreen baseline: ${path}`);
|
|
34
63
|
}
|
|
64
|
+
// Entries without the optional suppression fields (every baseline written before them) load as before.
|
|
65
|
+
for (const [index, entry] of baseline.findings.entries()) {
|
|
66
|
+
const issues = suppressionIssues(entry);
|
|
67
|
+
if (issues.length > 0)
|
|
68
|
+
throw new Error(`Invalid Evergreen baseline ${path}: findings[${index}]: ${issues.join("; ")}.`);
|
|
69
|
+
}
|
|
35
70
|
return baseline;
|
|
36
71
|
}
|
|
37
|
-
export
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
72
|
+
export const DEFAULT_WARN_DAYS = 14;
|
|
73
|
+
export const expiredPolicies = ["resurface", "fail"];
|
|
74
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
75
|
+
/** Whole days from `from` to `to`, both YYYY-MM-DD; negative when `to` is earlier. */
|
|
76
|
+
export function daysBetween(from, to) {
|
|
77
|
+
return Math.round((Date.parse(`${to}T00:00:00Z`) - Date.parse(`${from}T00:00:00Z`)) / DAY_MS);
|
|
78
|
+
}
|
|
79
|
+
/** The suppressions that matched a finding in this scan and expire within the window, soonest first. */
|
|
80
|
+
export function expiringSuppressions(matched, today, warnWithinDays) {
|
|
81
|
+
return matched
|
|
82
|
+
.filter((entry) => isIsoDate(entry.expires))
|
|
83
|
+
.map((entry) => ({ ...entry, daysLeft: daysBetween(today, entry.expires) }))
|
|
84
|
+
.filter((entry) => entry.daysLeft >= 0 && entry.daysLeft <= warnWithinDays)
|
|
85
|
+
.sort((left, right) => left.daysLeft - right.daysLeft || left.ruleId.localeCompare(right.ruleId) || left.path.localeCompare(right.path));
|
|
86
|
+
}
|
|
87
|
+
function expiryLine(entry) {
|
|
88
|
+
const when = entry.daysLeft === 0 ? "today" : `in ${entry.daysLeft} day${entry.daysLeft === 1 ? "" : "s"}`;
|
|
89
|
+
const who = [entry.owner ? `owner: ${entry.owner}` : undefined, entry.reason ? `reason: ${entry.reason}` : undefined].filter((part) => part !== undefined);
|
|
90
|
+
return `Baseline suppression expires ${when} (${entry.expires}): ${entry.ruleId} at ${entry.path}${who.length > 0 ? ` (${who.join("; ")})` : ""}.`;
|
|
91
|
+
}
|
|
92
|
+
function expiredLine(entry) {
|
|
93
|
+
const who = [entry.owner ? `owner: ${entry.owner}` : undefined, entry.reason ? `reason: ${entry.reason}` : undefined].filter((part) => part !== undefined);
|
|
94
|
+
return `Baseline suppression expired ${entry.daysAgo === 0 ? "today" : `${entry.daysAgo} day${entry.daysAgo === 1 ? "" : "s"} ago`} (${entry.expires}) and no longer hides its finding: ${entry.ruleId} at ${entry.path}${who.length > 0 ? ` (${who.join("; ")})` : ""}.`;
|
|
95
|
+
}
|
|
96
|
+
/** A suppression is expired on any day after its `expires` day; the day itself still counts. */
|
|
97
|
+
function isExpired(entry, today) {
|
|
98
|
+
return today !== undefined && isIsoDate(entry.expires) && entry.expires < today;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Applies a baseline and also returns the suppressions that had expired, so a caller that enforces the `fail`
|
|
102
|
+
* policy knows. `applyBaseline` is the same without that list. The expired list is not part of the scan result.
|
|
103
|
+
*/
|
|
104
|
+
export function evaluateBaseline(result, baseline, options = {}) {
|
|
105
|
+
const byFingerprint = new Map();
|
|
106
|
+
for (const entry of baseline.findings)
|
|
107
|
+
byFingerprint.set(entry.fingerprint, [...(byFingerprint.get(entry.fingerprint) ?? []), entry]);
|
|
108
|
+
const matched = [];
|
|
109
|
+
const expired = [];
|
|
110
|
+
const findings = result.findings.filter((finding) => {
|
|
111
|
+
const entries = byFingerprint.get(findingFingerprint(finding));
|
|
112
|
+
if (!entries)
|
|
113
|
+
return true;
|
|
114
|
+
// A finding stays hidden while at least one entry for it has not expired.
|
|
115
|
+
const live = entries.filter((entry) => !isExpired(entry, options.today));
|
|
116
|
+
if (live.length === 0) {
|
|
117
|
+
for (const entry of entries) {
|
|
118
|
+
if (isExpired(entry, options.today)) {
|
|
119
|
+
expired.push({ ruleId: entry.ruleId, path: entry.path, expires: entry.expires, daysAgo: daysBetween(entry.expires, options.today), ...(entry.owner ? { owner: entry.owner } : {}), ...(entry.reason ? { reason: entry.reason } : {}) });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
matched.push(...live);
|
|
125
|
+
return false;
|
|
126
|
+
});
|
|
127
|
+
const hidden = result.findings.length - findings.length;
|
|
128
|
+
const expiredSorted = [...new Map(expired.map((entry) => [`${entry.ruleId}:${entry.path}:${entry.expires}`, entry])).values()]
|
|
129
|
+
.sort((left, right) => right.daysAgo - left.daysAgo || left.ruleId.localeCompare(right.ruleId) || left.path.localeCompare(right.path));
|
|
130
|
+
const expiringEntries = options.today === undefined
|
|
131
|
+
? []
|
|
132
|
+
: expiringSuppressions([...new Map(matched.map((entry) => [`${entry.fingerprint}:${entry.expires}`, entry])).values()], options.today, options.warnWithinDays ?? DEFAULT_WARN_DAYS);
|
|
133
|
+
const ref = (entry, extra) => ({ ruleId: entry.ruleId, path: entry.path, expires: entry.expires, ...(entry.owner ? { owner: entry.owner } : {}), ...(entry.reason ? { reason: entry.reason } : {}), ...extra });
|
|
134
|
+
const suppressions = {
|
|
135
|
+
suppressed: hidden,
|
|
136
|
+
...(options.today === undefined ? {} : { today: options.today, warnWithinDays: options.warnWithinDays ?? DEFAULT_WARN_DAYS }),
|
|
137
|
+
expiring: expiringEntries.map((entry) => ref(entry, { daysLeft: entry.daysLeft })),
|
|
138
|
+
expired: expiredSorted.map((entry) => ({ ruleId: entry.ruleId, path: entry.path, expires: entry.expires, ...(entry.owner ? { owner: entry.owner } : {}), ...(entry.reason ? { reason: entry.reason } : {}), daysAgo: entry.daysAgo })),
|
|
139
|
+
};
|
|
41
140
|
return {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
141
|
+
result: {
|
|
142
|
+
...result,
|
|
143
|
+
findings,
|
|
144
|
+
diagnostics: [
|
|
145
|
+
...result.diagnostics,
|
|
146
|
+
`Suppressed ${hidden} finding${hidden === 1 ? "" : "s"} from the baseline.`,
|
|
147
|
+
...expiredSorted.map(expiredLine),
|
|
148
|
+
...expiringEntries.map(expiryLine),
|
|
149
|
+
],
|
|
150
|
+
suppressions,
|
|
151
|
+
},
|
|
152
|
+
expired: expiredSorted,
|
|
48
153
|
};
|
|
49
154
|
}
|
|
155
|
+
export function applyBaseline(result, baseline, options = {}) {
|
|
156
|
+
return evaluateBaseline(result, baseline, options).result;
|
|
157
|
+
}
|
|
158
|
+
/** True when the policy is `fail` and at least one suppression had expired. */
|
|
159
|
+
export function expiredSuppressionsFail(policy, expired) {
|
|
160
|
+
return policy === "fail" && expired.length > 0;
|
|
161
|
+
}
|
|
50
162
|
//# sourceMappingURL=baseline.js.map
|
package/dist/src/baseline.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/baseline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/baseline.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,11 @@ export declare const capabilityManifestSchema: z.ZodObject<{
|
|
|
24
24
|
experimental: "experimental";
|
|
25
25
|
unsupported: "unsupported";
|
|
26
26
|
}>;
|
|
27
|
+
maturity: z.ZodOptional<z.ZodEnum<{
|
|
28
|
+
beta: "beta";
|
|
29
|
+
stable: "stable";
|
|
30
|
+
experimental: "experimental";
|
|
31
|
+
}>>;
|
|
27
32
|
detectorIds: z.ZodArray<z.ZodString>;
|
|
28
33
|
}, z.core.$strip>>;
|
|
29
34
|
capabilities: z.ZodArray<z.ZodObject<{
|
|
@@ -40,10 +45,10 @@ export declare const capabilityManifestSchema: z.ZodObject<{
|
|
|
40
45
|
surfaces: z.ZodArray<z.ZodObject<{
|
|
41
46
|
id: z.ZodString;
|
|
42
47
|
kind: z.ZodEnum<{
|
|
48
|
+
plugin: "plugin";
|
|
43
49
|
cli: "cli";
|
|
44
50
|
mcp: "mcp";
|
|
45
51
|
skill: "skill";
|
|
46
|
-
plugin: "plugin";
|
|
47
52
|
ci: "ci";
|
|
48
53
|
}>;
|
|
49
54
|
status: z.ZodEnum<{
|
package/dist/src/capabilities.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as z from "zod/v4";
|
|
2
2
|
import { VERSION } from "./version.js";
|
|
3
3
|
const supportStatusSchema = z.enum(["supported", "experimental", "unsupported"]);
|
|
4
|
+
const maturityLevelSchema = z.enum(["experimental", "beta", "stable"]);
|
|
4
5
|
const surfaceKindSchema = z.enum(["cli", "mcp", "skill", "plugin", "ci"]);
|
|
5
6
|
const capabilitySchema = z.object({
|
|
6
7
|
id: z.string().regex(/^[a-z][a-z0-9]*(?:[.-][a-z0-9]+)*$/),
|
|
@@ -38,6 +39,10 @@ export const capabilityManifestSchema = z.object({
|
|
|
38
39
|
ecosystems: z.array(z.object({
|
|
39
40
|
id: z.string().min(1),
|
|
40
41
|
status: supportStatusSchema,
|
|
42
|
+
// The lowest `level` among the detectors in `detectorIds` (decision 0013); an ecosystem served by
|
|
43
|
+
// several detectors is only as mature as its least mature detector. Optional so the exported schema
|
|
44
|
+
// still parses a 1.0.0 manifest, which predates the field; Evergreen's own manifest always sets it.
|
|
45
|
+
maturity: maturityLevelSchema.optional(),
|
|
41
46
|
detectorIds: z.array(z.string().min(1)),
|
|
42
47
|
})),
|
|
43
48
|
capabilities: z.array(capabilitySchema),
|
|
@@ -52,7 +57,7 @@ const workflowCapabilityIds = [
|
|
|
52
57
|
];
|
|
53
58
|
const manifest = {
|
|
54
59
|
schemaVersion: "evergreen.capabilities.v1",
|
|
55
|
-
manifestVersion: "1.
|
|
60
|
+
manifestVersion: "1.1.0",
|
|
56
61
|
product: {
|
|
57
62
|
name: "Evergreen",
|
|
58
63
|
package: "evergreen-deprecation",
|
|
@@ -69,12 +74,17 @@ const manifest = {
|
|
|
69
74
|
unknownSchemaMajor: "reject",
|
|
70
75
|
},
|
|
71
76
|
ecosystems: [
|
|
72
|
-
{ id: "container", status: "experimental", detectorIds: ["container"] },
|
|
73
|
-
{ id: "
|
|
74
|
-
{ id: "
|
|
75
|
-
{ id: "
|
|
76
|
-
{ id: "
|
|
77
|
-
{ id: "
|
|
77
|
+
{ id: "container", status: "experimental", maturity: "experimental", detectorIds: ["container"] },
|
|
78
|
+
{ id: "dotnet", status: "experimental", maturity: "experimental", detectorIds: ["dotnet"] },
|
|
79
|
+
{ id: "github-actions", status: "supported", maturity: "stable", detectorIds: ["github-actions"] },
|
|
80
|
+
{ id: "go", status: "experimental", maturity: "experimental", detectorIds: ["go"] },
|
|
81
|
+
{ id: "java", status: "experimental", maturity: "experimental", detectorIds: ["java"] },
|
|
82
|
+
{ id: "kubernetes", status: "experimental", maturity: "experimental", detectorIds: ["kubernetes"] },
|
|
83
|
+
// nodejs and npm share the npm detector, so both take its level.
|
|
84
|
+
{ id: "nodejs", status: "supported", maturity: "stable", detectorIds: ["npm"] },
|
|
85
|
+
{ id: "npm", status: "supported", maturity: "stable", detectorIds: ["npm"] },
|
|
86
|
+
{ id: "python", status: "supported", maturity: "stable", detectorIds: ["python"] },
|
|
87
|
+
{ id: "rust", status: "experimental", maturity: "experimental", detectorIds: ["rust"] },
|
|
78
88
|
],
|
|
79
89
|
capabilities: [
|
|
80
90
|
{
|
|
@@ -82,35 +92,35 @@ const manifest = {
|
|
|
82
92
|
status: "supported",
|
|
83
93
|
version: "1",
|
|
84
94
|
description: "Scan a local repository with all built-in lifecycle detectors.",
|
|
85
|
-
ecosystems: ["container", "github-actions", "go", "nodejs", "npm", "python"],
|
|
95
|
+
ecosystems: ["container", "dotnet", "github-actions", "go", "java", "kubernetes", "nodejs", "npm", "python", "rust"],
|
|
86
96
|
},
|
|
87
97
|
{
|
|
88
98
|
id: "deprecation.list",
|
|
89
99
|
status: "supported",
|
|
90
100
|
version: "1",
|
|
91
101
|
description: "List compact lifecycle findings from a fresh local scan.",
|
|
92
|
-
ecosystems: ["container", "github-actions", "go", "nodejs", "npm", "python"],
|
|
102
|
+
ecosystems: ["container", "dotnet", "github-actions", "go", "java", "kubernetes", "nodejs", "npm", "python", "rust"],
|
|
93
103
|
},
|
|
94
104
|
{
|
|
95
105
|
id: "deprecation.explain",
|
|
96
106
|
status: "supported",
|
|
97
107
|
version: "1",
|
|
98
108
|
description: "Explain one evidence-backed finding by its exact identifier.",
|
|
99
|
-
ecosystems: ["container", "github-actions", "go", "nodejs", "npm", "python"],
|
|
109
|
+
ecosystems: ["container", "dotnet", "github-actions", "go", "java", "kubernetes", "nodejs", "npm", "python", "rust"],
|
|
100
110
|
},
|
|
101
111
|
{
|
|
102
112
|
id: "migration.context.create",
|
|
103
113
|
status: "supported",
|
|
104
114
|
version: "1",
|
|
105
115
|
description: "Create a validated migration packet for one finding.",
|
|
106
|
-
ecosystems: ["container", "github-actions", "go", "nodejs", "npm", "python"],
|
|
116
|
+
ecosystems: ["container", "dotnet", "github-actions", "go", "java", "kubernetes", "nodejs", "npm", "python", "rust"],
|
|
107
117
|
},
|
|
108
118
|
{
|
|
109
119
|
id: "migration.verify",
|
|
110
120
|
status: "supported",
|
|
111
121
|
version: "1",
|
|
112
122
|
description: "Re-scan and verify that an observed finding is absent.",
|
|
113
|
-
ecosystems: ["container", "github-actions", "go", "nodejs", "npm", "python"],
|
|
123
|
+
ecosystems: ["container", "dotnet", "github-actions", "go", "java", "kubernetes", "nodejs", "npm", "python", "rust"],
|
|
114
124
|
},
|
|
115
125
|
{
|
|
116
126
|
id: "environment.doctor",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/capabilities.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/capabilities.ts"],"names":[],"mappings":"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"}
|