audit-tools 0.42.0 → 0.43.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/dispatch/merge-results.mjs +229 -140
- package/dispatch/validate-result.mjs +98 -40
- package/dist/audit/cli/conceptualDispatch.d.ts.map +1 -1
- package/dist/audit/cli/conceptualDispatch.js +35 -3
- package/dist/audit/cli/conceptualDispatch.js.map +1 -1
- package/dist/audit/cli/dispatch/hostHandoff.d.ts +9 -1
- package/dist/audit/cli/dispatch/hostHandoff.d.ts.map +1 -1
- package/dist/audit/cli/dispatch/hostHandoff.js +94 -38
- package/dist/audit/cli/dispatch/hostHandoff.js.map +1 -1
- package/dist/audit/cli/nextStepCommand.d.ts +64 -0
- package/dist/audit/cli/nextStepCommand.d.ts.map +1 -1
- package/dist/audit/cli/nextStepCommand.js +877 -783
- package/dist/audit/cli/nextStepCommand.js.map +1 -1
- package/dist/audit/cli/nextStepHelpers.d.ts +12 -0
- package/dist/audit/cli/nextStepHelpers.d.ts.map +1 -1
- package/dist/audit/cli/nextStepHelpers.js +34 -1
- package/dist/audit/cli/nextStepHelpers.js.map +1 -1
- package/dist/audit/cli/steps.d.ts +2 -2
- package/dist/audit/extractors/graph.d.ts +28 -2
- package/dist/audit/extractors/graph.d.ts.map +1 -1
- package/dist/audit/extractors/graph.js +122 -11
- package/dist/audit/extractors/graph.js.map +1 -1
- package/dist/audit/extractors/graphRoutes.d.ts +8 -0
- package/dist/audit/extractors/graphRoutes.d.ts.map +1 -1
- package/dist/audit/extractors/graphRoutes.js +71 -4
- package/dist/audit/extractors/graphRoutes.js.map +1 -1
- package/dist/audit/io/artifacts.d.ts +55 -0
- package/dist/audit/io/artifacts.d.ts.map +1 -1
- package/dist/audit/io/artifacts.js +189 -12
- package/dist/audit/io/artifacts.js.map +1 -1
- package/dist/audit/io/toolingManifest.d.ts +11 -0
- package/dist/audit/io/toolingManifest.d.ts.map +1 -1
- package/dist/audit/io/toolingManifest.js +13 -3
- package/dist/audit/io/toolingManifest.js.map +1 -1
- package/dist/audit/orchestrator/advance.d.ts +64 -0
- package/dist/audit/orchestrator/advance.d.ts.map +1 -1
- package/dist/audit/orchestrator/advance.js +191 -57
- package/dist/audit/orchestrator/advance.js.map +1 -1
- package/dist/audit/orchestrator/charterClarificationExecutor.d.ts.map +1 -1
- package/dist/audit/orchestrator/charterClarificationExecutor.js +55 -21
- package/dist/audit/orchestrator/charterClarificationExecutor.js.map +1 -1
- package/dist/audit/orchestrator/flowCoverage.d.ts.map +1 -1
- package/dist/audit/orchestrator/flowCoverage.js +7 -10
- package/dist/audit/orchestrator/flowCoverage.js.map +1 -1
- package/dist/audit/orchestrator/flowPlanning.d.ts +54 -1
- package/dist/audit/orchestrator/flowPlanning.d.ts.map +1 -1
- package/dist/audit/orchestrator/flowPlanning.js +77 -18
- package/dist/audit/orchestrator/flowPlanning.js.map +1 -1
- package/dist/audit/orchestrator/flowRequeue.d.ts.map +1 -1
- package/dist/audit/orchestrator/flowRequeue.js +6 -10
- package/dist/audit/orchestrator/flowRequeue.js.map +1 -1
- package/dist/audit/orchestrator/partitionTaskGraph.d.ts.map +1 -1
- package/dist/audit/orchestrator/partitionTaskGraph.js +2 -2
- package/dist/audit/orchestrator/partitionTaskGraph.js.map +1 -1
- package/dist/audit/orchestrator/requeueFold.d.ts.map +1 -1
- package/dist/audit/orchestrator/requeueFold.js +18 -5
- package/dist/audit/orchestrator/requeueFold.js.map +1 -1
- package/dist/audit/orchestrator/staleness.d.ts +24 -1
- package/dist/audit/orchestrator/staleness.d.ts.map +1 -1
- package/dist/audit/orchestrator/staleness.js +147 -16
- package/dist/audit/orchestrator/staleness.js.map +1 -1
- package/dist/audit/orchestrator/syntaxResolutionExecutor.d.ts +26 -0
- package/dist/audit/orchestrator/syntaxResolutionExecutor.d.ts.map +1 -1
- package/dist/audit/orchestrator/syntaxResolutionExecutor.js +97 -12
- package/dist/audit/orchestrator/syntaxResolutionExecutor.js.map +1 -1
- package/dist/audit/orchestrator/taskBuilder.d.ts.map +1 -1
- package/dist/audit/orchestrator/taskBuilder.js +111 -21
- package/dist/audit/orchestrator/taskBuilder.js.map +1 -1
- package/dist/audit/orchestrator/trivialAudit.d.ts +17 -1
- package/dist/audit/orchestrator/trivialAudit.d.ts.map +1 -1
- package/dist/audit/orchestrator/trivialAudit.js +31 -4
- package/dist/audit/orchestrator/trivialAudit.js.map +1 -1
- package/dist/audit/reporting/synthesis.d.ts.map +1 -1
- package/dist/audit/reporting/synthesis.js +2 -3
- package/dist/audit/reporting/synthesis.js.map +1 -1
- package/dist/audit/reporting/workBlocks.d.ts.map +1 -1
- package/dist/audit/reporting/workBlocks.js +4 -38
- package/dist/audit/reporting/workBlocks.js.map +1 -1
- package/dist/audit/types/analyzerCapability.d.ts +6 -6
- package/dist/audit/types/charterRegister.d.ts +30 -12
- package/dist/audit/types/charterRegister.d.ts.map +1 -1
- package/dist/audit/types/charterRegister.js +22 -9
- package/dist/audit/types/charterRegister.js.map +1 -1
- package/dist/audit/validation/anchorGrounding.d.ts.map +1 -1
- package/dist/audit/validation/anchorGrounding.js +17 -0
- package/dist/audit/validation/anchorGrounding.js.map +1 -1
- package/dist/audit/validation/auditResults.d.ts +17 -0
- package/dist/audit/validation/auditResults.d.ts.map +1 -1
- package/dist/audit/validation/auditResults.js +50 -17
- package/dist/audit/validation/auditResults.js.map +1 -1
- package/dist/remediate/contractPipeline/cyclicSeamResolution.d.ts +48 -0
- package/dist/remediate/contractPipeline/cyclicSeamResolution.d.ts.map +1 -1
- package/dist/remediate/contractPipeline/cyclicSeamResolution.js +128 -0
- package/dist/remediate/contractPipeline/cyclicSeamResolution.js.map +1 -1
- package/dist/remediate/contractPipeline/derive.d.ts +8 -5
- package/dist/remediate/contractPipeline/derive.d.ts.map +1 -1
- package/dist/remediate/contractPipeline/derive.js +8 -16
- package/dist/remediate/contractPipeline/derive.js.map +1 -1
- package/dist/remediate/index.d.ts.map +1 -1
- package/dist/remediate/index.js +43 -2
- package/dist/remediate/index.js.map +1 -1
- package/dist/remediate/intent/intentOrdering.d.ts +13 -5
- package/dist/remediate/intent/intentOrdering.d.ts.map +1 -1
- package/dist/remediate/intent/intentOrdering.js +56 -25
- package/dist/remediate/intent/intentOrdering.js.map +1 -1
- package/dist/remediate/phases/close.d.ts +57 -2
- package/dist/remediate/phases/close.d.ts.map +1 -1
- package/dist/remediate/phases/close.js +260 -36
- package/dist/remediate/phases/close.js.map +1 -1
- package/dist/remediate/state/disposition.d.ts +26 -4
- package/dist/remediate/state/disposition.d.ts.map +1 -1
- package/dist/remediate/state/itemStatus.d.ts +33 -6
- package/dist/remediate/state/itemStatus.d.ts.map +1 -1
- package/dist/remediate/state/itemStatus.js +154 -39
- package/dist/remediate/state/itemStatus.js.map +1 -1
- package/dist/remediate/state/types.d.ts +41 -2
- package/dist/remediate/state/types.d.ts.map +1 -1
- package/dist/remediate/state/types.js.map +1 -1
- package/dist/remediate/steps/contractPipeline.d.ts +287 -15
- package/dist/remediate/steps/contractPipeline.d.ts.map +1 -1
- package/dist/remediate/steps/contractPipeline.js +1664 -987
- package/dist/remediate/steps/contractPipeline.js.map +1 -1
- package/dist/remediate/steps/contractPipelinePrompts.js +1 -1
- package/dist/remediate/steps/contractPipelinePrompts.js.map +1 -1
- package/dist/remediate/steps/dispatch/hostHandoff.d.ts +137 -2
- package/dist/remediate/steps/dispatch/hostHandoff.d.ts.map +1 -1
- package/dist/remediate/steps/dispatch/hostHandoff.js +713 -59
- package/dist/remediate/steps/dispatch/hostHandoff.js.map +1 -1
- package/dist/remediate/steps/finalGate.d.ts +136 -37
- package/dist/remediate/steps/finalGate.d.ts.map +1 -1
- package/dist/remediate/steps/finalGate.js +120 -86
- package/dist/remediate/steps/finalGate.js.map +1 -1
- package/dist/remediate/steps/gateCommands.d.ts +8 -0
- package/dist/remediate/steps/gateCommands.d.ts.map +1 -1
- package/dist/remediate/steps/gateCommands.js +40 -11
- package/dist/remediate/steps/gateCommands.js.map +1 -1
- package/dist/remediate/steps/nextStep.d.ts +96 -5
- package/dist/remediate/steps/nextStep.d.ts.map +1 -1
- package/dist/remediate/steps/nextStep.js +668 -147
- package/dist/remediate/steps/nextStep.js.map +1 -1
- package/dist/remediate/steps/types.d.ts +4 -1
- package/dist/remediate/steps/types.d.ts.map +1 -1
- package/dist/remediate/steps/types.js +10 -0
- package/dist/remediate/steps/types.js.map +1 -1
- package/dist/remediate/validation/artifacts.d.ts +20 -0
- package/dist/remediate/validation/artifacts.d.ts.map +1 -1
- package/dist/remediate/validation/artifacts.js +239 -13
- package/dist/remediate/validation/artifacts.js.map +1 -1
- package/dist/remediate/validation/contractPipelineGates.d.ts +58 -0
- package/dist/remediate/validation/contractPipelineGates.d.ts.map +1 -1
- package/dist/remediate/validation/contractPipelineGates.js +167 -43
- package/dist/remediate/validation/contractPipelineGates.js.map +1 -1
- package/dist/shared/analyzers/acquisitionEngine.d.ts +72 -25
- package/dist/shared/analyzers/acquisitionEngine.d.ts.map +1 -1
- package/dist/shared/analyzers/acquisitionEngine.js +149 -15
- package/dist/shared/analyzers/acquisitionEngine.js.map +1 -1
- package/dist/shared/analyzers/binaryAcquisition.d.ts +27 -2
- package/dist/shared/analyzers/binaryAcquisition.d.ts.map +1 -1
- package/dist/shared/analyzers/binaryAcquisition.js +149 -43
- package/dist/shared/analyzers/binaryAcquisition.js.map +1 -1
- package/dist/shared/analyzers/candidates.d.ts +9 -8
- package/dist/shared/analyzers/candidates.d.ts.map +1 -1
- package/dist/shared/analyzers/candidates.js +96 -64
- package/dist/shared/analyzers/candidates.js.map +1 -1
- package/dist/shared/analyzers/normalizeExternal.d.ts +40 -12
- package/dist/shared/analyzers/normalizeExternal.d.ts.map +1 -1
- package/dist/shared/analyzers/normalizeExternal.js +74 -18
- package/dist/shared/analyzers/normalizeExternal.js.map +1 -1
- package/dist/shared/analyzers/rubocop.d.ts +14 -13
- package/dist/shared/analyzers/rubocop.d.ts.map +1 -1
- package/dist/shared/analyzers/rubocop.js +29 -6
- package/dist/shared/analyzers/rubocop.js.map +1 -1
- package/dist/shared/analyzers/types.d.ts +196 -13
- package/dist/shared/analyzers/types.d.ts.map +1 -1
- package/dist/shared/analyzers/types.js +122 -9
- package/dist/shared/analyzers/types.js.map +1 -1
- package/dist/shared/decompose/charterClarification.d.ts +12 -1
- package/dist/shared/decompose/charterClarification.d.ts.map +1 -1
- package/dist/shared/decompose/charterClarification.js +11 -4
- package/dist/shared/decompose/charterClarification.js.map +1 -1
- package/dist/shared/decompose/charterExtraction.d.ts +20 -10
- package/dist/shared/decompose/charterExtraction.d.ts.map +1 -1
- package/dist/shared/decompose/charterExtraction.js +52 -23
- package/dist/shared/decompose/charterExtraction.js.map +1 -1
- package/dist/shared/decompose/contentCoherence.d.ts +43 -2
- package/dist/shared/decompose/contentCoherence.d.ts.map +1 -1
- package/dist/shared/decompose/contentCoherence.js +109 -5
- package/dist/shared/decompose/contentCoherence.js.map +1 -1
- package/dist/shared/decompose/modularity.d.ts +17 -0
- package/dist/shared/decompose/modularity.d.ts.map +1 -1
- package/dist/shared/decompose/modularity.js +78 -3
- package/dist/shared/decompose/modularity.js.map +1 -1
- package/dist/shared/decompose/workBlockSeams.d.ts +45 -0
- package/dist/shared/decompose/workBlockSeams.d.ts.map +1 -0
- package/dist/shared/decompose/workBlockSeams.js +82 -0
- package/dist/shared/decompose/workBlockSeams.js.map +1 -0
- package/dist/shared/index.d.ts +4 -3
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +4 -2
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/intent/freeFormIntentInterpreter.d.ts +12 -2
- package/dist/shared/intent/freeFormIntentInterpreter.d.ts.map +1 -1
- package/dist/shared/intent/freeFormIntentInterpreter.js +27 -22
- package/dist/shared/intent/freeFormIntentInterpreter.js.map +1 -1
- package/dist/shared/intent/pathScope.d.ts +12 -1
- package/dist/shared/intent/pathScope.d.ts.map +1 -1
- package/dist/shared/intent/pathScope.js +56 -19
- package/dist/shared/intent/pathScope.js.map +1 -1
- package/dist/shared/intent/sharedIntentData.d.ts +19 -1
- package/dist/shared/intent/sharedIntentData.d.ts.map +1 -1
- package/dist/shared/intent/sharedIntentData.js +33 -8
- package/dist/shared/intent/sharedIntentData.js.map +1 -1
- package/dist/shared/io/fileLock.d.ts +12 -0
- package/dist/shared/io/fileLock.d.ts.map +1 -1
- package/dist/shared/io/fileLock.js +48 -5
- package/dist/shared/io/fileLock.js.map +1 -1
- package/dist/shared/io/json.d.ts +13 -0
- package/dist/shared/io/json.d.ts.map +1 -1
- package/dist/shared/io/json.js +19 -1
- package/dist/shared/io/json.js.map +1 -1
- package/dist/shared/reporting/auditDeliverable.d.ts.map +1 -1
- package/dist/shared/reporting/auditDeliverable.js +8 -3
- package/dist/shared/reporting/auditDeliverable.js.map +1 -1
- package/dist/shared/steps/stepEmissionScaffold.d.ts +69 -0
- package/dist/shared/steps/stepEmissionScaffold.d.ts.map +1 -0
- package/dist/shared/steps/stepEmissionScaffold.js +83 -0
- package/dist/shared/steps/stepEmissionScaffold.js.map +1 -0
- package/dist/shared/submission/handRecovery.d.ts.map +1 -1
- package/dist/shared/submission/handRecovery.js +69 -4
- package/dist/shared/submission/handRecovery.js.map +1 -1
- package/dist/shared/submission/submissionIdentity.d.ts +10 -1
- package/dist/shared/submission/submissionIdentity.d.ts.map +1 -1
- package/dist/shared/submission/submissionIdentity.js +12 -3
- package/dist/shared/submission/submissionIdentity.js.map +1 -1
- package/dist/shared/submission/submissionLedger.d.ts +43 -2
- package/dist/shared/submission/submissionLedger.d.ts.map +1 -1
- package/dist/shared/submission/submissionLedger.js +50 -7
- package/dist/shared/submission/submissionLedger.js.map +1 -1
- package/dist/shared/tooling/allowlistedExec.d.ts +9 -0
- package/dist/shared/tooling/allowlistedExec.d.ts.map +1 -1
- package/dist/shared/tooling/allowlistedExec.js +19 -2
- package/dist/shared/tooling/allowlistedExec.js.map +1 -1
- package/dist/shared/types/charter.d.ts +24 -0
- package/dist/shared/types/charter.d.ts.map +1 -1
- package/dist/shared/types/charter.js +9 -0
- package/dist/shared/types/charter.js.map +1 -1
- package/dist/shared/types/finding.d.ts +105 -53
- package/dist/shared/types/finding.d.ts.map +1 -1
- package/dist/shared/types/finding.js +38 -11
- package/dist/shared/types/finding.js.map +1 -1
- package/dist/shared/types/remediationOutcome.d.ts +282 -9
- package/dist/shared/types/remediationOutcome.d.ts.map +1 -1
- package/dist/shared/types/remediationOutcome.js +174 -1
- package/dist/shared/types/remediationOutcome.js.map +1 -1
- package/dist/shared/validation/findingsReport.d.ts.map +1 -1
- package/dist/shared/validation/findingsReport.js +19 -1
- package/dist/shared/validation/findingsReport.js.map +1 -1
- package/package.json +2 -1
- package/remediate-code.mjs +15 -0
- package/wrapper/remediate-code-wrapper-install-hosts.mjs +45 -4
- package/wrapper/remediate-code-wrapper-install-renderers.mjs +12 -2
|
@@ -1,14 +1,122 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { chmodSync, existsSync, mkdirSync, readdirSync, rmSync, statSync, writeFileSync, } from "node:fs";
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
import {
|
|
2
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync, } from "node:fs";
|
|
3
|
+
import { isAbsolute, join, relative } from "node:path";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { AUDIT_TOOLS_DIRNAME } from "../io/auditToolsPaths.js";
|
|
5
6
|
import { runTracked } from "../tooling/exec.js";
|
|
7
|
+
/**
|
|
8
|
+
* Per-USER cache root, deliberately NOT the system temp dir. Defaults to
|
|
9
|
+
* `~/.audit-tools/bincache`; `AUDIT_TOOLS_BINARY_CACHE` overrides it so a run can be
|
|
10
|
+
* pinned to an isolated cache — the same override shape as
|
|
11
|
+
* {@link analyzerCacheRoot}'s `AUDIT_TOOLS_ANALYZER_CACHE`, and what lets a test
|
|
12
|
+
* exercise the DEFAULT path without ever writing to the real home directory.
|
|
13
|
+
*
|
|
14
|
+
* The digest manifest beside a cached binary proves the bytes match what the manifest
|
|
15
|
+
* says — but an attacker who can write the cache dir writes BOTH, so a self-consistent
|
|
16
|
+
* pair inside a world-writable location proves nothing. The manifest only has meaning
|
|
17
|
+
* when the directory it lives in is not attacker-writable, which is what moving the
|
|
18
|
+
* default root under the user's home buys. `cacheDir` remains overridable per call for
|
|
19
|
+
* a caller that has its own private location.
|
|
20
|
+
*
|
|
21
|
+
* Consequence, deliberate: caches warmed under the old `<tmpdir>/audit-tools-bincache`
|
|
22
|
+
* are simply never consulted again — the first resolution under the new root
|
|
23
|
+
* re-downloads, or degrades to `unavailable` offline.
|
|
24
|
+
*/
|
|
6
25
|
function defaultCacheDir() {
|
|
7
|
-
|
|
26
|
+
const override = process.env.AUDIT_TOOLS_BINARY_CACHE;
|
|
27
|
+
if (override && override.trim().length > 0)
|
|
28
|
+
return override;
|
|
29
|
+
return join(homedir(), AUDIT_TOOLS_DIRNAME, "bincache");
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create the cache root restricted to its owner where the platform honours modes.
|
|
33
|
+
* On win32 the mode is ignored (ACLs govern), and the per-user home root is the
|
|
34
|
+
* protection there.
|
|
35
|
+
*
|
|
36
|
+
* ⚠ The mode applies AT CREATION ONLY. An existing directory keeps whatever mode it
|
|
37
|
+
* already has — `mkdirSync` does not chmod one it did not create — so a root that was
|
|
38
|
+
* created loosely by something else is not repaired here.
|
|
39
|
+
*/
|
|
40
|
+
function ensureCacheRoot(cacheDir) {
|
|
41
|
+
try {
|
|
42
|
+
mkdirSync(cacheDir, { recursive: true, mode: 0o700 });
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
/* a later mkdir of the version dir surfaces any real failure */
|
|
46
|
+
}
|
|
8
47
|
}
|
|
9
48
|
function exeName(binaryName, platform) {
|
|
10
49
|
return platform === "win32" ? `${binaryName}.exe` : binaryName;
|
|
11
50
|
}
|
|
51
|
+
/** `unavailable` with its cause carried in BOTH forms — machine member + human note. */
|
|
52
|
+
function unavailable(reason, note) {
|
|
53
|
+
return { status: "unavailable", command: null, reason, note };
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Cache manifest filename. Written beside the cached executable at download time and
|
|
57
|
+
* the ONLY evidence that these bytes came from a checksum-verified acquisition.
|
|
58
|
+
*/
|
|
59
|
+
const CACHE_MANIFEST_FILENAME = ".audit-tools-binary.json";
|
|
60
|
+
/** Remove a cache version dir wholesale; best-effort, never throws. */
|
|
61
|
+
function purgeVersionDir(versionDir) {
|
|
62
|
+
try {
|
|
63
|
+
rmSync(versionDir, { recursive: true, force: true });
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
/* best-effort — a later resolution re-verifies regardless */
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function writeCacheManifest(versionDir, spec, executablePath) {
|
|
70
|
+
try {
|
|
71
|
+
const manifest = {
|
|
72
|
+
binaryName: spec.binaryName,
|
|
73
|
+
version: spec.version,
|
|
74
|
+
executable_relative_path: relative(versionDir, executablePath).replace(/\\/g, "/"),
|
|
75
|
+
executable_sha256: sha256(readFileSync(executablePath)),
|
|
76
|
+
};
|
|
77
|
+
writeFileSync(join(versionDir, CACHE_MANIFEST_FILENAME), `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
/* An unwritable manifest simply means the next resolution re-downloads. */
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The cached executable's path — but ONLY when its bytes still hash to the digest
|
|
85
|
+
* recorded when it was acquired. A missing, unreadable, or mismatched manifest, an
|
|
86
|
+
* escaping relative path, or drifted bytes all return null and the caller purges:
|
|
87
|
+
* filename existence is never sufficient to execute.
|
|
88
|
+
*/
|
|
89
|
+
function verifiedCachedExecutable(versionDir, spec) {
|
|
90
|
+
let manifest;
|
|
91
|
+
try {
|
|
92
|
+
manifest = JSON.parse(readFileSync(join(versionDir, CACHE_MANIFEST_FILENAME), "utf8"));
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
if (!manifest ||
|
|
98
|
+
manifest.binaryName !== spec.binaryName ||
|
|
99
|
+
manifest.version !== spec.version ||
|
|
100
|
+
typeof manifest.executable_relative_path !== "string" ||
|
|
101
|
+
manifest.executable_relative_path.length === 0 ||
|
|
102
|
+
typeof manifest.executable_sha256 !== "string" ||
|
|
103
|
+
manifest.executable_sha256.length !== 64) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
const executablePath = join(versionDir, manifest.executable_relative_path);
|
|
107
|
+
const containment = relative(versionDir, executablePath);
|
|
108
|
+
if (containment.startsWith("..") || isAbsolute(containment))
|
|
109
|
+
return null;
|
|
110
|
+
try {
|
|
111
|
+
if (sha256(readFileSync(executablePath)) !== manifest.executable_sha256.toLowerCase()) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
return executablePath;
|
|
119
|
+
}
|
|
12
120
|
/** Parse a `<sha256>␠␠<asset>` checksums file for one asset's expected digest. */
|
|
13
121
|
export function expectedSha256For(checksumsText, assetName) {
|
|
14
122
|
for (const line of checksumsText.split(/\r?\n/)) {
|
|
@@ -31,29 +139,34 @@ export async function resolveBinary(spec, options = {}) {
|
|
|
31
139
|
const arch = options.arch ?? process.arch;
|
|
32
140
|
const run = options.run ?? ((argv, cwd) => runTracked(argv, { cwd }));
|
|
33
141
|
const cacheDir = options.cacheDir ?? defaultCacheDir();
|
|
34
|
-
// 1. PATH — already installed.
|
|
142
|
+
// 1. PATH — already installed. Nothing below this point runs, so a tool the machine
|
|
143
|
+
// already has must not cause a cache directory to be created as a side effect.
|
|
35
144
|
const probe = run(spec.versionProbeArgs, process.cwd());
|
|
36
145
|
if (!probe.error && probe.status === 0) {
|
|
37
146
|
return { status: "path", command: spec.binaryName };
|
|
38
147
|
}
|
|
39
|
-
// 2. cache — a previously-downloaded pinned binary
|
|
148
|
+
// 2. cache — a previously-downloaded pinned binary, RE-VERIFIED on every
|
|
149
|
+
// resolution. The cache path is derivable from public pinned constants, so a
|
|
150
|
+
// file at the expected name is a claim, not a proof: it is executed only when its
|
|
151
|
+
// bytes still match the digest recorded at acquisition. Anything else — including
|
|
152
|
+
// a version dir a failed extraction left behind — is purged and re-acquired.
|
|
40
153
|
const versionDir = join(cacheDir, `${spec.binaryName}-${spec.version}`);
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
154
|
+
if (existsSync(versionDir)) {
|
|
155
|
+
const verified = verifiedCachedExecutable(versionDir, spec);
|
|
156
|
+
if (verified)
|
|
157
|
+
return { status: "cached", command: verified };
|
|
158
|
+
// Unverifiable bytes, or a dir a failed extraction left behind: purge so nothing
|
|
159
|
+
// half-written or pre-planted can become a later "cache hit".
|
|
160
|
+
purgeVersionDir(versionDir);
|
|
44
161
|
}
|
|
45
162
|
// 3. download — pinned release asset, SHA256-verified, then extracted.
|
|
46
163
|
const fetch = options.fetch;
|
|
47
164
|
if (!fetch) {
|
|
48
|
-
return
|
|
165
|
+
return unavailable("offline", "no fetcher configured (offline)");
|
|
49
166
|
}
|
|
50
167
|
const assetName = spec.assetFor(platform, arch);
|
|
51
168
|
if (!assetName) {
|
|
52
|
-
return {
|
|
53
|
-
status: "unavailable",
|
|
54
|
-
command: null,
|
|
55
|
-
note: `no release asset for ${platform}/${arch}`,
|
|
56
|
-
};
|
|
169
|
+
return unavailable("no_asset_for_platform", `no release asset for ${platform}/${arch}`);
|
|
57
170
|
}
|
|
58
171
|
let assetBytes;
|
|
59
172
|
let checksumsBytes;
|
|
@@ -65,27 +178,25 @@ export async function resolveBinary(spec, options = {}) {
|
|
|
65
178
|
assetBytes = await fetch(spec.releaseUrlForAsset(assetName));
|
|
66
179
|
}
|
|
67
180
|
catch (error) {
|
|
68
|
-
return {
|
|
69
|
-
status: "unavailable",
|
|
70
|
-
command: null,
|
|
71
|
-
note: `download failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
72
|
-
};
|
|
181
|
+
return unavailable("download_failed", `download failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
73
182
|
}
|
|
74
183
|
if (!checksumsBytes || !assetBytes) {
|
|
75
|
-
return
|
|
184
|
+
return unavailable("download_empty", "download returned no bytes");
|
|
76
185
|
}
|
|
77
186
|
const expected = expectedSha256For(Buffer.from(checksumsBytes).toString("utf8"), assetName);
|
|
78
187
|
if (!expected) {
|
|
79
|
-
return
|
|
188
|
+
return unavailable("no_checksum_for_asset", `no checksum for ${assetName}`);
|
|
80
189
|
}
|
|
81
190
|
const actual = sha256(assetBytes);
|
|
82
191
|
if (actual !== expected) {
|
|
83
|
-
return {
|
|
84
|
-
status: "unavailable",
|
|
85
|
-
command: null,
|
|
86
|
-
note: `checksum mismatch for ${assetName} (expected ${expected}, got ${actual})`,
|
|
87
|
-
};
|
|
192
|
+
return unavailable("checksum_mismatch", `checksum mismatch for ${assetName} (expected ${expected}, got ${actual})`);
|
|
88
193
|
}
|
|
194
|
+
// Only here — past the PATH probe, past a cache miss, past verification — is
|
|
195
|
+
// anything about to be WRITTEN. Creating the root any earlier would grow an empty
|
|
196
|
+
// cache directory on every resolution that never caches anything: a tool already on
|
|
197
|
+
// PATH, an offline degrade, an unsupported platform. Read paths only ever ask
|
|
198
|
+
// whether the directory exists.
|
|
199
|
+
ensureCacheRoot(cacheDir);
|
|
89
200
|
// Non-archived asset (e.g. osv-scanner): the verified bytes ARE the
|
|
90
201
|
// executable — write directly to the cached path, no `tar` involved.
|
|
91
202
|
if (spec.archived === false) {
|
|
@@ -101,14 +212,12 @@ export async function resolveBinary(spec, options = {}) {
|
|
|
101
212
|
/* best-effort */
|
|
102
213
|
}
|
|
103
214
|
}
|
|
215
|
+
writeCacheManifest(versionDir, spec, resolved);
|
|
104
216
|
return { status: "downloaded", command: resolved };
|
|
105
217
|
}
|
|
106
218
|
catch (error) {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
command: null,
|
|
110
|
-
note: `write error: ${error instanceof Error ? error.message : String(error)}`,
|
|
111
|
-
};
|
|
219
|
+
purgeVersionDir(versionDir);
|
|
220
|
+
return unavailable("write_failed", `write error: ${error instanceof Error ? error.message : String(error)}`);
|
|
112
221
|
}
|
|
113
222
|
}
|
|
114
223
|
// Verified — write the archive and extract it with the system `tar` (bsdtar
|
|
@@ -120,24 +229,20 @@ export async function resolveBinary(spec, options = {}) {
|
|
|
120
229
|
const extract = run(["tar", "-xf", archivePath, "-C", versionDir], versionDir);
|
|
121
230
|
rmSync(archivePath, { force: true });
|
|
122
231
|
if (extract.error || extract.status !== 0) {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
note: `extract failed: ${extract.error?.message ?? `tar exit ${extract.status}`}`,
|
|
127
|
-
};
|
|
232
|
+
// Whatever tar managed to write before failing must NOT survive as a cache hit.
|
|
233
|
+
purgeVersionDir(versionDir);
|
|
234
|
+
return unavailable("extract_failed", `extract failed: ${extract.error?.message ?? `tar exit ${extract.status}`}`);
|
|
128
235
|
}
|
|
129
236
|
}
|
|
130
237
|
catch (error) {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
command: null,
|
|
134
|
-
note: `extract error: ${error instanceof Error ? error.message : String(error)}`,
|
|
135
|
-
};
|
|
238
|
+
purgeVersionDir(versionDir);
|
|
239
|
+
return unavailable("extract_failed", `extract error: ${error instanceof Error ? error.message : String(error)}`);
|
|
136
240
|
}
|
|
137
241
|
// Locate the executable (archives may nest it); chmod +x on POSIX.
|
|
138
242
|
const resolved = findExecutable(versionDir, exeName(spec.binaryName, platform));
|
|
139
243
|
if (!resolved) {
|
|
140
|
-
|
|
244
|
+
purgeVersionDir(versionDir);
|
|
245
|
+
return unavailable("not_found_in_archive", "binary not found in archive");
|
|
141
246
|
}
|
|
142
247
|
if (platform !== "win32") {
|
|
143
248
|
try {
|
|
@@ -147,6 +252,7 @@ export async function resolveBinary(spec, options = {}) {
|
|
|
147
252
|
/* best-effort */
|
|
148
253
|
}
|
|
149
254
|
}
|
|
255
|
+
writeCacheManifest(versionDir, spec, resolved);
|
|
150
256
|
return { status: "downloaded", command: resolved };
|
|
151
257
|
}
|
|
152
258
|
/** Shallow-then-recursive search for `name` under `dir`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binaryAcquisition.js","sourceRoot":"","sources":["../../../src/shared/analyzers/binaryAcquisition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,WAAW,EACX,MAAM,EACN,QAAQ,EACR,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"binaryAcquisition.js","sourceRoot":"","sources":["../../../src/shared/analyzers/binaryAcquisition.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ExternalAnalyzerCandidate } from "./acquisitionEngine.js";
|
|
2
|
+
import type { ExternalAnalyzerParseReport } from "./types.js";
|
|
2
3
|
/**
|
|
3
4
|
* The value-curated EXTERNAL analyzer candidate registry. This is the only place
|
|
4
5
|
* concrete tools are named; the engine is tool-agnostic. Membership in the
|
|
@@ -13,11 +14,11 @@ declare const GITLEAKS_VERSION = "8.21.2";
|
|
|
13
14
|
* the engine's generic item shape. The raw secret value is NEVER carried through
|
|
14
15
|
* (Secret/Match are dropped) so the persisted artifact cannot leak a credential.
|
|
15
16
|
*/
|
|
16
|
-
declare function parseGitleaks(report: string):
|
|
17
|
+
declare function parseGitleaks(report: string): ExternalAnalyzerParseReport;
|
|
17
18
|
declare const gitleaksCandidate: ExternalAnalyzerCandidate;
|
|
18
19
|
declare const semgrepCandidate: ExternalAnalyzerCandidate;
|
|
19
20
|
declare const eslintCandidate: ExternalAnalyzerCandidate;
|
|
20
|
-
declare function parseKnip(stdout: string):
|
|
21
|
+
declare function parseKnip(stdout: string): ExternalAnalyzerParseReport;
|
|
21
22
|
declare const knipCandidate: ExternalAnalyzerCandidate;
|
|
22
23
|
/**
|
|
23
24
|
* Parse jscpd's JSON reporter output (`{ duplicates: [{ firstFile, secondFile,
|
|
@@ -27,7 +28,7 @@ declare const knipCandidate: ExternalAnalyzerCandidate;
|
|
|
27
28
|
* normalization path, not to a candidate's own parse function (same as
|
|
28
29
|
* parseKnip/parseEslint/parseSemgrep above).
|
|
29
30
|
*/
|
|
30
|
-
declare function parseJscpd(report: string):
|
|
31
|
+
declare function parseJscpd(report: string): ExternalAnalyzerParseReport;
|
|
31
32
|
declare const jscpdCandidate: ExternalAnalyzerCandidate;
|
|
32
33
|
declare const OSV_SCANNER_VERSION = "2.4.0";
|
|
33
34
|
/**
|
|
@@ -39,7 +40,7 @@ declare const OSV_SCANNER_VERSION = "2.4.0";
|
|
|
39
40
|
* raw vulnerability id, so CVE/GHSA aliases for the same underlying issue
|
|
40
41
|
* don't fan out into duplicate items.
|
|
41
42
|
*/
|
|
42
|
-
declare function parseOsvScanner(stdout: string):
|
|
43
|
+
declare function parseOsvScanner(stdout: string): ExternalAnalyzerParseReport;
|
|
43
44
|
declare const osvScannerCandidate: ExternalAnalyzerCandidate;
|
|
44
45
|
declare const clippyCandidate: ExternalAnalyzerCandidate;
|
|
45
46
|
declare const rubocopCandidate: ExternalAnalyzerCandidate;
|
|
@@ -50,7 +51,7 @@ declare const HADOLINT_VERSION = "2.14.0";
|
|
|
50
51
|
* message }]`. `level` ∈ error|warning|info|style. Degrades to `[]` on
|
|
51
52
|
* empty/malformed/non-array input.
|
|
52
53
|
*/
|
|
53
|
-
declare function parseHadolint(stdout: string):
|
|
54
|
+
declare function parseHadolint(stdout: string): ExternalAnalyzerParseReport;
|
|
54
55
|
declare const hadolintCandidate: ExternalAnalyzerCandidate;
|
|
55
56
|
declare const ACTIONLINT_VERSION = "1.7.12";
|
|
56
57
|
/**
|
|
@@ -58,7 +59,7 @@ declare const ACTIONLINT_VERSION = "1.7.12";
|
|
|
58
59
|
* against actionlint's template output: `[{ message, filepath, line, column,
|
|
59
60
|
* kind }]`. Degrades to `[]` on empty/malformed/non-array input.
|
|
60
61
|
*/
|
|
61
|
-
declare function parseActionlint(stdout: string):
|
|
62
|
+
declare function parseActionlint(stdout: string): ExternalAnalyzerParseReport;
|
|
62
63
|
declare const actionlintCandidate: ExternalAnalyzerCandidate;
|
|
63
64
|
/**
|
|
64
65
|
* Parse type-coverage's `--json --detail` stdout — grounded against
|
|
@@ -66,14 +67,14 @@ declare const actionlintCandidate: ExternalAnalyzerCandidate;
|
|
|
66
67
|
* line, character, text }] }`. Each `anys` entry is one implicit/explicit `any`
|
|
67
68
|
* site; degrades to `[]` on empty/malformed input or a missing `anys` array.
|
|
68
69
|
*/
|
|
69
|
-
declare function parseTypeCoverage(stdout: string):
|
|
70
|
+
declare function parseTypeCoverage(stdout: string): ExternalAnalyzerParseReport;
|
|
70
71
|
declare const typeCoverageCandidate: ExternalAnalyzerCandidate;
|
|
71
72
|
/**
|
|
72
73
|
* Parse lizard's CSV output (default: `lizard -l <languages> --csv <path>`).
|
|
73
74
|
* CSV format: "NLOC,CCN,Token,PARAM,Length,Location,File,Function"
|
|
74
75
|
* Degrades to `[]` on parse failure; reports lead findings for complexity overages.
|
|
75
76
|
*/
|
|
76
|
-
declare function parseLizard(stdout: string):
|
|
77
|
+
declare function parseLizard(stdout: string): ExternalAnalyzerParseReport;
|
|
77
78
|
declare const lizardCandidate: ExternalAnalyzerCandidate;
|
|
78
79
|
/** The curated external analyzer candidate set. `defaultRun` marks the consent-free default members. */
|
|
79
80
|
export declare const EXTERNAL_ANALYZER_CANDIDATES: ExternalAnalyzerCandidate[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"candidates.d.ts","sourceRoot":"","sources":["../../../src/shared/analyzers/candidates.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"candidates.d.ts","sourceRoot":"","sources":["../../../src/shared/analyzers/candidates.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAUxE,OAAO,KAAK,EAEV,2BAA2B,EAC5B,MAAM,YAAY,CAAC;AAIpB;;;;;;;GAOG;AAKH,QAAA,MAAM,gBAAgB,WAAW,CAAC;AAqElC;;;;GAIG;AACH,iBAAS,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,2BAA2B,CAuClE;AAED,QAAA,MAAM,iBAAiB,EAAE,yBA4BxB,CAAC;AAiCF,QAAA,MAAM,gBAAgB,EAAE,yBAevB,CAAC;AAuCF,QAAA,MAAM,eAAe,EAAE,yBAetB,CAAC;AAkBF,iBAAS,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,2BAA2B,CAyE9D;AAED,QAAA,MAAM,aAAa,EAAE,yBA2BpB,CAAC;AA+FF;;;;;;;GAOG;AACH,iBAAS,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,2BAA2B,CAkC/D;AAED,QAAA,MAAM,cAAc,EAAE,yBA4BrB,CAAC;AAOF,QAAA,MAAM,mBAAmB,UAAU,CAAC;AA2BpC;;;;;;;;GAQG;AACH,iBAAS,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,2BAA2B,CA+DpE;AAED,QAAA,MAAM,mBAAmB,EAAE,yBAoB1B,CAAC;AAKF,QAAA,MAAM,eAAe,EAAE,yBAmBtB,CAAC;AAKF,QAAA,MAAM,gBAAgB,EAAE,yBAkBvB,CAAC;AAOF,QAAA,MAAM,gBAAgB,WAAW,CAAC;AA2BlC;;;;;GAKG;AACH,iBAAS,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,2BAA2B,CA+BlE;AAED,QAAA,MAAM,iBAAiB,EAAE,yBAiBxB,CAAC;AAOF,QAAA,MAAM,kBAAkB,WAAW,CAAC;AAkCpC;;;;GAIG;AACH,iBAAS,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,2BAA2B,CA6BpE;AAED,QAAA,MAAM,mBAAmB,EAAE,yBAkB1B,CAAC;AAKF;;;;;GAKG;AACH,iBAAS,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,2BAA2B,CA4BtE;AAED,QAAA,MAAM,qBAAqB,EAAE,yBAkB5B,CAAC;AA0CF;;;;GAIG;AACH,iBAAS,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,2BAA2B,CAgDhE;AAED,QAAA,MAAM,eAAe,EAAE,yBA0BtB,CAAC;AAEF,wGAAwG;AACxG,eAAO,MAAM,4BAA4B,EAAE,yBAAyB,EAanE,CAAC;AAEF,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,WAAW,GACZ,CAAC"}
|