@codyswann/lisa 2.300.9 → 2.300.11
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/cli/doctor-readiness-guardrails.d.ts.map +1 -1
- package/dist/cli/doctor-readiness-guardrails.js +54 -2
- package/dist/cli/doctor-readiness-guardrails.js.map +1 -1
- package/dist/cli/doctor-readiness-supply-chain-evidence.d.ts +48 -0
- package/dist/cli/doctor-readiness-supply-chain-evidence.d.ts.map +1 -0
- package/dist/cli/doctor-readiness-supply-chain-evidence.js +163 -0
- package/dist/cli/doctor-readiness-supply-chain-evidence.js.map +1 -0
- package/dist/cli/doctor-readiness-supply-chain.d.ts.map +1 -1
- package/dist/cli/doctor-readiness-supply-chain.js +24 -69
- package/dist/cli/doctor-readiness-supply-chain.js.map +1 -1
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +3 -0
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-readiness-guardrails.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness-guardrails.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EACL,KAAK,cAAc,EAIpB,MAAM,iCAAiC,CAAC;AAEzC,gFAAgF;AAChF,eAAO,MAAM,gCAAgC,wBAAwB,CAAC;AA+
|
|
1
|
+
{"version":3,"file":"doctor-readiness-guardrails.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness-guardrails.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EACL,KAAK,cAAc,EAIpB,MAAM,iCAAiC,CAAC;AAEzC,gFAAgF;AAChF,eAAO,MAAM,gCAAgC,wBAAwB,CAAC;AA+RtE;;;;;;;;GAQG;AACH,wBAAsB,iCAAiC,CACrD,IAAI,EAAE,MAAM,EACZ,eAAe,CAAC,EAAE,SAAS,cAAc,EAAE,GAC1C,OAAO,CAAC,wBAAwB,CAAC,CA8BnC"}
|
|
@@ -49,13 +49,20 @@ const PROTECTION_RULES_SKIP_REASON = "Whether a declared `environment:` actually
|
|
|
49
49
|
* blocker that fires on normal delivery is a blocker nobody will believe.
|
|
50
50
|
*/
|
|
51
51
|
const CONSEQUENTIAL_OPS = [
|
|
52
|
-
/\bterraform\s+(\S+\s+)*apply\b[^\n]*-auto-approve\b/,
|
|
53
52
|
/\bterraform\s+(\S+\s+)*destroy\b/,
|
|
54
53
|
/\bcdk\s+destroy\b/,
|
|
55
54
|
/\bpulumi\s+destroy\b/,
|
|
56
55
|
/\bpulumi\s+up\b[^\n]*--yes\b/,
|
|
57
56
|
/\bserverless\s+remove\b/,
|
|
58
57
|
];
|
|
58
|
+
/** A Terraform apply command, consequential only when auto-approval is present. */
|
|
59
|
+
const TERRAFORM_APPLY = /\bterraform(?:\s+\S+)*\s+apply\b/;
|
|
60
|
+
/** Terraform's non-interactive approval flag. */
|
|
61
|
+
const TERRAFORM_AUTO_APPROVE = /(^|\s)-auto-approve\b/;
|
|
62
|
+
/** Terraform env vars that inject CLI args into every command. */
|
|
63
|
+
const TERRAFORM_ARGS_AUTO_APPROVE = /\b(tf_cli_args(?:_apply)?|tf_args)\s*[:=][^\n]*-auto-approve\b/;
|
|
64
|
+
/** Separators that end one shell invocation for this conservative scan. */
|
|
65
|
+
const SHELL_INVOCATION_SEPARATOR = /\n|;|&&|\|\|/;
|
|
59
66
|
/**
|
|
60
67
|
* Commands that apply schema migrations, in the ecosystems Lisa templates. The
|
|
61
68
|
* `(?!:)` lookahead keeps the read-only subcommands out: `db:migrate:status`
|
|
@@ -78,6 +85,45 @@ const PRODUCTION_MARKERS = [
|
|
|
78
85
|
/--env(ironment)?[= ]prod/,
|
|
79
86
|
/\bprod(uction)?\.tfvars\b/,
|
|
80
87
|
];
|
|
88
|
+
/**
|
|
89
|
+
* Collapse only shell continuation newlines. Ordinary newlines remain command
|
|
90
|
+
* boundaries so unrelated invocations cannot combine into one Terraform apply.
|
|
91
|
+
* @param command - Shell command text
|
|
92
|
+
* @returns Command text with escaped newlines joined
|
|
93
|
+
*/
|
|
94
|
+
function normalizeShellContinuations(command) {
|
|
95
|
+
return command.replace(/\\\r?\n\s*/g, " ");
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Extract shell invocations that contain `terraform apply`.
|
|
99
|
+
* @param command - Shell command text
|
|
100
|
+
* @returns Invocation fragments that include Terraform apply
|
|
101
|
+
*/
|
|
102
|
+
function terraformApplyInvocations(command) {
|
|
103
|
+
return normalizeShellContinuations(command)
|
|
104
|
+
.split(SHELL_INVOCATION_SEPARATOR)
|
|
105
|
+
.map(part => part.trim())
|
|
106
|
+
.filter(part => TERRAFORM_APPLY.test(part));
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check whether a Terraform apply invocation targets a saved plan file.
|
|
110
|
+
* @param invocation - Single shell invocation
|
|
111
|
+
* @returns True when `apply` has a positional plan-file argument
|
|
112
|
+
*/
|
|
113
|
+
function appliesSavedTerraformPlan(invocation) {
|
|
114
|
+
const tokens = invocation.split(/\s+/).filter(Boolean);
|
|
115
|
+
const terraformIndex = tokens.findIndex(token => token === "terraform");
|
|
116
|
+
if (terraformIndex === -1) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
const applyIndex = tokens.indexOf("apply", terraformIndex + 1);
|
|
120
|
+
if (applyIndex === -1) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
return tokens
|
|
124
|
+
.slice(applyIndex + 1)
|
|
125
|
+
.some(token => token !== "\\" && !token.startsWith("-"));
|
|
126
|
+
}
|
|
81
127
|
/**
|
|
82
128
|
* Whether a command is an irreversible or expensive operation.
|
|
83
129
|
*
|
|
@@ -96,7 +142,13 @@ function isConsequential(command, job, step) {
|
|
|
96
142
|
if (looksEphemeral(targetEvidence)) {
|
|
97
143
|
return false;
|
|
98
144
|
}
|
|
99
|
-
|
|
145
|
+
const terraformApplyInvocationsToAssess = terraformApplyInvocations(command);
|
|
146
|
+
const terraformAutoApprovedApply = terraformApplyInvocationsToAssess.some(invocation => TERRAFORM_AUTO_APPROVE.test(invocation) ||
|
|
147
|
+
appliesSavedTerraformPlan(invocation)) ||
|
|
148
|
+
(terraformApplyInvocationsToAssess.length > 0 &&
|
|
149
|
+
TERRAFORM_ARGS_AUTO_APPROVE.test(targetEvidence));
|
|
150
|
+
return (terraformAutoApprovedApply ||
|
|
151
|
+
CONSEQUENTIAL_OPS.some(pattern => pattern.test(command)) ||
|
|
100
152
|
(MIGRATION_COMMANDS.some(pattern => pattern.test(command)) &&
|
|
101
153
|
PRODUCTION_MARKERS.some(pattern => pattern.test(targetEvidence))));
|
|
102
154
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-readiness-guardrails.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-guardrails.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EAEd,YAAY,GACb,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,OAAO,EAIL,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AAEzC,gFAAgF;AAChF,MAAM,CAAC,MAAM,gCAAgC,GAAG,qBAAqB,CAAC;AAEtE,mFAAmF;AACnF,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAEnC,8EAA8E;AAC9E,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAEjC;;;;GAIG;AACH,MAAM,4BAA4B,GAChC,uEAAuE;IACvE,wEAAwE;IACxE,uEAAuE;IACvE,8EAA8E;IAC9E,qEAAqE;IACrE,2DAA2D,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,iBAAiB,GAAsB;IAC3C,
|
|
1
|
+
{"version":3,"file":"doctor-readiness-guardrails.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-guardrails.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence builders for the dependencies/supply-chain readiness producer.
|
|
3
|
+
* @module cli/doctor-readiness-supply-chain-evidence
|
|
4
|
+
*/
|
|
5
|
+
import { type DependencySpec } from "./doctor-readiness-supply-chain-scan.js";
|
|
6
|
+
import type { WorkspaceMembers } from "./doctor-readiness-workspaces.js";
|
|
7
|
+
/** One package manifest B5 inspects. */
|
|
8
|
+
export interface ManifestUnderAssessment {
|
|
9
|
+
readonly manifestPath: string;
|
|
10
|
+
readonly manifest: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
/** Values already read from the repository for dependency-confidence evidence. */
|
|
13
|
+
interface DependencyConfidenceInputs {
|
|
14
|
+
readonly auditGate: string | null;
|
|
15
|
+
readonly lockfile: string | null;
|
|
16
|
+
readonly lockfileInstallGate: string | null;
|
|
17
|
+
readonly specs: readonly DependencySpec[];
|
|
18
|
+
readonly workspaces: WorkspaceMembers;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Collect B5 evidence for install-time execution surfaces.
|
|
22
|
+
* @param manifests - Manifests under assessment
|
|
23
|
+
* @returns Evidence lines for install-time execution surfaces
|
|
24
|
+
*/
|
|
25
|
+
export declare function installTimeExecutionViolations(manifests: readonly ManifestUnderAssessment[]): readonly string[];
|
|
26
|
+
/**
|
|
27
|
+
* Collect B5 violations from dependency specs, lockfiles, and audit gates.
|
|
28
|
+
* @param inputs - Values already read from the repository
|
|
29
|
+
* @param inputs.auditGate - Path to the dependency-audit gate, if found
|
|
30
|
+
* @param inputs.lockfile - Path to the committed lockfile, if found
|
|
31
|
+
* @param inputs.lockfileInstallGate - Path to the lockfile-enforcing install
|
|
32
|
+
* @param inputs.specs - Declared dependency specs
|
|
33
|
+
* @param inputs.workspaces - What resolving the workspace members established
|
|
34
|
+
* @returns Evidence lines for dependency-confidence violations
|
|
35
|
+
*/
|
|
36
|
+
export declare function dependencyConfidenceViolations({ auditGate, lockfile, lockfileInstallGate, specs, workspaces, }: DependencyConfidenceInputs): readonly string[];
|
|
37
|
+
/**
|
|
38
|
+
* Collect non-blocking observations from dependency-confidence evidence.
|
|
39
|
+
* @param inputs - Values already read from the repository
|
|
40
|
+
* @param inputs.auditGate - Path to the dependency-audit gate, if found
|
|
41
|
+
* @param inputs.lockfile - Path to the committed lockfile, if found
|
|
42
|
+
* @param inputs.lockfileInstallGate - Path to the lockfile-enforcing install
|
|
43
|
+
* @param inputs.specs - Declared dependency specs
|
|
44
|
+
* @returns Evidence lines for clean dependency-confidence signals
|
|
45
|
+
*/
|
|
46
|
+
export declare function dependencyConfidenceObservations({ auditGate, lockfile, lockfileInstallGate, specs, }: DependencyConfidenceInputs): readonly string[];
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=doctor-readiness-supply-chain-evidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-readiness-supply-chain-evidence.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness-supply-chain-evidence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACL,KAAK,cAAc,EAGpB,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAUzE,wCAAwC;AACxC,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,kFAAkF;AAClF,UAAU,0BAA0B;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;CACvC;AA0GD;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,SAAS,uBAAuB,EAAE,GAC5C,SAAS,MAAM,EAAE,CAOnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAAC,EAC7C,SAAS,EACT,QAAQ,EACR,mBAAmB,EACnB,KAAK,EACL,UAAU,GACX,EAAE,0BAA0B,GAAG,SAAS,MAAM,EAAE,CAkChD;AAED;;;;;;;;GAQG;AACH,wBAAgB,gCAAgC,CAAC,EAC/C,SAAS,EACT,QAAQ,EACR,mBAAmB,EACnB,KAAK,GACN,EAAE,0BAA0B,GAAG,SAAS,MAAM,EAAE,CAahD"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence builders for the dependencies/supply-chain readiness producer.
|
|
3
|
+
* @module cli/doctor-readiness-supply-chain-evidence
|
|
4
|
+
*/
|
|
5
|
+
import { isFloatingSpec, LOCKFILES, } from "./doctor-readiness-supply-chain-scan.js";
|
|
6
|
+
/** Package lifecycle scripts that execute during dependency installation. */
|
|
7
|
+
const INSTALL_TIME_SCRIPT_NAMES = new Set([
|
|
8
|
+
"preinstall",
|
|
9
|
+
"install",
|
|
10
|
+
"postinstall",
|
|
11
|
+
"prepare",
|
|
12
|
+
]);
|
|
13
|
+
/**
|
|
14
|
+
* Render a bounded list for operator-facing evidence.
|
|
15
|
+
* @param values - Values to render
|
|
16
|
+
* @returns A comma-separated list
|
|
17
|
+
*/
|
|
18
|
+
function renderList(values) {
|
|
19
|
+
const shown = values.slice(0, 5);
|
|
20
|
+
const overflow = values.length - shown.length;
|
|
21
|
+
return (shown.map(value => `\`${value}\``).join(", ") +
|
|
22
|
+
(overflow > 0 ? `, and ${overflow} more` : ""));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Build the evidence line for a manifest with no committed lockfile.
|
|
26
|
+
* @param specCount - How many specs the manifest declares
|
|
27
|
+
* @returns One evidence line
|
|
28
|
+
*/
|
|
29
|
+
function lockfileEvidence(specCount) {
|
|
30
|
+
return (`package manifest(s), starting with \`package.json\`, declare ${specCount} ` +
|
|
31
|
+
`dependency spec(s) but no lockfile is committed (looked for ` +
|
|
32
|
+
`${LOCKFILES.join(", ")}) — two installs can resolve to different trees, ` +
|
|
33
|
+
"so what was validated is not provably what gets installed");
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Whether a floating-looking spec is really a local workspace link.
|
|
37
|
+
* @param spec - The declared spec
|
|
38
|
+
* @param workspaces - What resolving the workspace members established
|
|
39
|
+
* @returns True when the spec links to a workspace member
|
|
40
|
+
*/
|
|
41
|
+
function linksWorkspaceMember(spec, workspaces) {
|
|
42
|
+
if (!workspaces.declared) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return (workspaces.names.has(spec.name) ||
|
|
46
|
+
(workspaces.names.size === 0 && spec.spec.trim() === "*"));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Build evidence when a manifest declares install-time lifecycle scripts.
|
|
50
|
+
* @param manifestPath - Repo-relative manifest path
|
|
51
|
+
* @param manifest - Parsed package manifest
|
|
52
|
+
* @returns Evidence line when install-time scripts exist
|
|
53
|
+
*/
|
|
54
|
+
function installTimeScriptEvidence(manifestPath, manifest) {
|
|
55
|
+
const scripts = manifest.scripts;
|
|
56
|
+
if (scripts === null ||
|
|
57
|
+
typeof scripts !== "object" ||
|
|
58
|
+
Array.isArray(scripts)) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
const scriptNames = Object.keys(scripts).filter(name => INSTALL_TIME_SCRIPT_NAMES.has(name));
|
|
62
|
+
if (scriptNames.length === 0) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
return (`\`${manifestPath}\` declares install-time lifecycle script(s) ` +
|
|
66
|
+
`${renderList(scriptNames)}, so dependency installation executes project ` +
|
|
67
|
+
"code before the normal test/audit surface; B5 needs an explicit confidence " +
|
|
68
|
+
"decision for that install-time execution path");
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Build evidence when Bun trusted dependencies are declared.
|
|
72
|
+
* @param manifestPath - Repo-relative manifest path
|
|
73
|
+
* @param manifest - Parsed package manifest
|
|
74
|
+
* @returns Evidence line when trusted dependencies are declared
|
|
75
|
+
*/
|
|
76
|
+
function trustedDependencyEvidence(manifestPath, manifest) {
|
|
77
|
+
const trusted = manifest.trustedDependencies;
|
|
78
|
+
const names = Array.isArray(trusted)
|
|
79
|
+
? trusted.filter((entry) => typeof entry === "string")
|
|
80
|
+
: [];
|
|
81
|
+
if (names.length === 0) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
return (`\`${manifestPath}\` marks ${renderList(names)} as ` +
|
|
85
|
+
"`trustedDependencies`, allowing third-party install-time scripts to run; " +
|
|
86
|
+
"B5 needs a written confidence decision for each trusted package because " +
|
|
87
|
+
"a clean audit gate alone does not explain that execution authority");
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Collect B5 evidence for install-time execution surfaces.
|
|
91
|
+
* @param manifests - Manifests under assessment
|
|
92
|
+
* @returns Evidence lines for install-time execution surfaces
|
|
93
|
+
*/
|
|
94
|
+
export function installTimeExecutionViolations(manifests) {
|
|
95
|
+
return manifests.flatMap(({ manifestPath, manifest }) => [
|
|
96
|
+
installTimeScriptEvidence(manifestPath, manifest),
|
|
97
|
+
trustedDependencyEvidence(manifestPath, manifest),
|
|
98
|
+
].flatMap(evidence => (evidence === null ? [] : [evidence])));
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Collect B5 violations from dependency specs, lockfiles, and audit gates.
|
|
102
|
+
* @param inputs - Values already read from the repository
|
|
103
|
+
* @param inputs.auditGate - Path to the dependency-audit gate, if found
|
|
104
|
+
* @param inputs.lockfile - Path to the committed lockfile, if found
|
|
105
|
+
* @param inputs.lockfileInstallGate - Path to the lockfile-enforcing install
|
|
106
|
+
* @param inputs.specs - Declared dependency specs
|
|
107
|
+
* @param inputs.workspaces - What resolving the workspace members established
|
|
108
|
+
* @returns Evidence lines for dependency-confidence violations
|
|
109
|
+
*/
|
|
110
|
+
export function dependencyConfidenceViolations({ auditGate, lockfile, lockfileInstallGate, specs, workspaces, }) {
|
|
111
|
+
if (specs.length === 0) {
|
|
112
|
+
return [];
|
|
113
|
+
}
|
|
114
|
+
const floating = specs.filter(spec => isFloatingSpec(spec.spec) && !linksWorkspaceMember(spec, workspaces));
|
|
115
|
+
return [
|
|
116
|
+
...(lockfile === null ? [lockfileEvidence(specs.length)] : []),
|
|
117
|
+
...(lockfile !== null && lockfileInstallGate === null
|
|
118
|
+
? [
|
|
119
|
+
`lockfile \`${lockfile}\` is committed, but no CI or hook install ` +
|
|
120
|
+
"step was found that enforces it with `npm ci`, " +
|
|
121
|
+
"`bun install --frozen-lockfile`, `pnpm install --frozen-lockfile`, " +
|
|
122
|
+
"or `yarn install --immutable`; a workflow can silently rewrite " +
|
|
123
|
+
"or bypass the tree that was validated",
|
|
124
|
+
]
|
|
125
|
+
: []),
|
|
126
|
+
...floating.map(spec => `\`${spec.manifestPath}\` \`${spec.block}.${spec.name}\` is ` +
|
|
127
|
+
`\`${spec.spec}\`, which resolves to whatever is newest at install ` +
|
|
128
|
+
"time rather than to a version anything was ever validated against"),
|
|
129
|
+
...(auditGate === null
|
|
130
|
+
? [
|
|
131
|
+
"no dependency-audit gate covering the JavaScript tree was found " +
|
|
132
|
+
"anywhere — no `npm`/`bun` audit step in `.github/workflows/*.yml`, " +
|
|
133
|
+
"none in a git hook, and no `dependabot.yml` npm entry or " +
|
|
134
|
+
"`renovate.json` — so a newly disclosed advisory in this tree " +
|
|
135
|
+
"would never be noticed by anything",
|
|
136
|
+
]
|
|
137
|
+
: []),
|
|
138
|
+
];
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Collect non-blocking observations from dependency-confidence evidence.
|
|
142
|
+
* @param inputs - Values already read from the repository
|
|
143
|
+
* @param inputs.auditGate - Path to the dependency-audit gate, if found
|
|
144
|
+
* @param inputs.lockfile - Path to the committed lockfile, if found
|
|
145
|
+
* @param inputs.lockfileInstallGate - Path to the lockfile-enforcing install
|
|
146
|
+
* @param inputs.specs - Declared dependency specs
|
|
147
|
+
* @returns Evidence lines for clean dependency-confidence signals
|
|
148
|
+
*/
|
|
149
|
+
export function dependencyConfidenceObservations({ auditGate, lockfile, lockfileInstallGate, specs, }) {
|
|
150
|
+
if (specs.length === 0) {
|
|
151
|
+
return [];
|
|
152
|
+
}
|
|
153
|
+
return [
|
|
154
|
+
...(lockfile === null ? [] : [`Lockfile in use: \`${lockfile}\`.`]),
|
|
155
|
+
...(lockfileInstallGate === null
|
|
156
|
+
? []
|
|
157
|
+
: [`Lockfile-enforcing install declared in \`${lockfileInstallGate}\`.`]),
|
|
158
|
+
...(auditGate === null
|
|
159
|
+
? []
|
|
160
|
+
: [`Dependency-audit gate declared in \`${auditGate}\`.`]),
|
|
161
|
+
];
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=doctor-readiness-supply-chain-evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-readiness-supply-chain-evidence.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-supply-chain-evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-readiness-supply-chain.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness-supply-chain.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor-readiness-supply-chain.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness-supply-chain.ts"],"names":[],"mappings":"AAiDA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAE5E,+EAA+E;AAC/E,eAAO,MAAM,sCAAsC,8BACtB,CAAC;AA8J9B;;;;;;;;GAQG;AACH,wBAAsB,sCAAsC,CAC1D,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,wBAAwB,CAAC,CA4DnC"}
|
|
@@ -29,7 +29,8 @@
|
|
|
29
29
|
*/
|
|
30
30
|
import { informationalFindings } from "./doctor-readiness-shared.js";
|
|
31
31
|
import { auditExceptionViolations } from "./doctor-readiness-audit-allowlist.js";
|
|
32
|
-
import { collectSpecs, findAuditGate, findLockfile, findLockfileInstallGate,
|
|
32
|
+
import { collectSpecs, findAuditGate, findLockfile, findLockfileInstallGate, readManifest, } from "./doctor-readiness-supply-chain-scan.js";
|
|
33
|
+
import { dependencyConfidenceObservations, dependencyConfidenceViolations, installTimeExecutionViolations, } from "./doctor-readiness-supply-chain-evidence.js";
|
|
33
34
|
import { resolveWorkspaceMembers, } from "./doctor-readiness-workspaces.js";
|
|
34
35
|
/** The dependencies/supply-chain readiness dimension id (readiness-rubric). */
|
|
35
36
|
export const DEPENDENCIES_SUPPLY_CHAIN_DIMENSION_ID = "dependencies-supply-chain";
|
|
@@ -37,87 +38,33 @@ export const DEPENDENCIES_SUPPLY_CHAIN_DIMENSION_ID = "dependencies-supply-chain
|
|
|
37
38
|
const SUPPLY_CHAIN_BLOCKER_ID = "B5";
|
|
38
39
|
/** Most evidence lines carried into a single finding, to keep it readable. */
|
|
39
40
|
const MAX_EVIDENCE_LINES = 12;
|
|
40
|
-
/**
|
|
41
|
-
* Build the evidence line for a manifest with no committed lockfile.
|
|
42
|
-
* @param specCount - How many specs the manifest declares
|
|
43
|
-
* @returns One evidence line
|
|
44
|
-
*/
|
|
45
|
-
function lockfileEvidence(specCount) {
|
|
46
|
-
return (`package manifest(s), starting with \`package.json\`, declare ${specCount} ` +
|
|
47
|
-
`dependency spec(s) but no lockfile is committed (looked for ` +
|
|
48
|
-
`${LOCKFILES.join(", ")}) — two installs can resolve to different trees, ` +
|
|
49
|
-
"so what was validated is not provably what gets installed");
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Whether a floating-looking spec is really a link to a package in this
|
|
53
|
-
* repository. `"@acme/utils": "*"` against a workspace member resolves to the
|
|
54
|
-
* local package, which is the workspace idiom rather than a floating install —
|
|
55
|
-
* so faulting it would fail every correctly configured monorepo.
|
|
56
|
-
*
|
|
57
|
-
* When workspaces are declared but no member name could be resolved (an
|
|
58
|
-
* unreadable child manifest, an unsupported glob), a bare `*` is exempted
|
|
59
|
-
* anyway: the repository has told us it links locally, and absence of proof is
|
|
60
|
-
* not proof of a violation.
|
|
61
|
-
* @param spec - The declared spec
|
|
62
|
-
* @param workspaces - What resolving the workspace members established
|
|
63
|
-
* @returns True when the spec links to a workspace member
|
|
64
|
-
*/
|
|
65
|
-
function linksWorkspaceMember(spec, workspaces) {
|
|
66
|
-
if (!workspaces.declared) {
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
return (workspaces.names.has(spec.name) ||
|
|
70
|
-
(workspaces.names.size === 0 && spec.spec.trim() === "*"));
|
|
71
|
-
}
|
|
72
41
|
/**
|
|
73
42
|
* Assess a repository's dependency confidence model.
|
|
74
43
|
* @param root - Repository root
|
|
75
44
|
* @param specs - Declared dependency specs
|
|
45
|
+
* @param manifests - Parsed package manifests under assessment
|
|
76
46
|
* @param workspaces - What resolving the workspace members established
|
|
77
47
|
* @returns Evidence lines for violations, and non-blocking observations
|
|
78
48
|
*/
|
|
79
|
-
async function collectFindings(root, specs, workspaces) {
|
|
49
|
+
async function collectFindings(root, specs, manifests, workspaces) {
|
|
80
50
|
const lockfile = await findLockfile(root);
|
|
81
51
|
const lockfileInstallGate = lockfile === null ? null : await findLockfileInstallGate(root);
|
|
82
52
|
const auditGate = await findAuditGate(root);
|
|
83
|
-
const
|
|
53
|
+
const inputs = {
|
|
54
|
+
auditGate,
|
|
55
|
+
lockfile,
|
|
56
|
+
lockfileInstallGate,
|
|
57
|
+
specs,
|
|
58
|
+
workspaces,
|
|
59
|
+
};
|
|
84
60
|
return {
|
|
85
61
|
violations: [
|
|
86
|
-
...(
|
|
87
|
-
...(
|
|
88
|
-
? [
|
|
89
|
-
`lockfile \`${lockfile}\` is committed, but no CI or hook install ` +
|
|
90
|
-
"step was found that enforces it with `npm ci`, " +
|
|
91
|
-
"`bun install --frozen-lockfile`, `pnpm install --frozen-lockfile`, " +
|
|
92
|
-
"or `yarn install --immutable`; a workflow can silently rewrite " +
|
|
93
|
-
"or bypass the tree that was validated",
|
|
94
|
-
]
|
|
95
|
-
: []),
|
|
96
|
-
...floating.map(spec => `\`${spec.manifestPath}\` \`${spec.block}.${spec.name}\` is ` +
|
|
97
|
-
`\`${spec.spec}\`, ` +
|
|
98
|
-
"which resolves to whatever is newest at install time rather than to " +
|
|
99
|
-
"a version anything was ever validated against"),
|
|
100
|
-
...(auditGate === null
|
|
101
|
-
? [
|
|
102
|
-
"no dependency-audit gate covering the JavaScript tree was found " +
|
|
103
|
-
"anywhere — no `npm`/`bun` audit step in `.github/workflows/*.yml`, " +
|
|
104
|
-
"none in a git hook, and no `dependabot.yml` npm entry or " +
|
|
105
|
-
"`renovate.json` — so a newly disclosed advisory in this tree " +
|
|
106
|
-
"would never be noticed by anything",
|
|
107
|
-
]
|
|
108
|
-
: []),
|
|
62
|
+
...dependencyConfidenceViolations(inputs),
|
|
63
|
+
...installTimeExecutionViolations(manifests),
|
|
109
64
|
...(await auditExceptionViolations(root)),
|
|
110
65
|
],
|
|
111
66
|
observations: [
|
|
112
|
-
...(
|
|
113
|
-
...(lockfileInstallGate === null
|
|
114
|
-
? []
|
|
115
|
-
: [
|
|
116
|
-
`Lockfile-enforcing install declared in \`${lockfileInstallGate}\`.`,
|
|
117
|
-
]),
|
|
118
|
-
...(auditGate === null
|
|
119
|
-
? []
|
|
120
|
-
: [`Dependency-audit gate declared in \`${auditGate}\`.`]),
|
|
67
|
+
...dependencyConfidenceObservations(inputs),
|
|
121
68
|
...(workspaces.declared ? [workspaceObservation(workspaces)] : []),
|
|
122
69
|
],
|
|
123
70
|
};
|
|
@@ -232,16 +179,24 @@ export async function assessDependenciesSupplyChainDimension(root) {
|
|
|
232
179
|
return skipRecord(outcome.reason);
|
|
233
180
|
}
|
|
234
181
|
const workspaces = await resolveWorkspaceMembers(root, outcome.manifest);
|
|
182
|
+
const manifests = [
|
|
183
|
+
{ manifestPath: "package.json", manifest: outcome.manifest },
|
|
184
|
+
...workspaces.members.map(member => ({
|
|
185
|
+
manifestPath: member.manifestPath,
|
|
186
|
+
manifest: member.manifest,
|
|
187
|
+
})),
|
|
188
|
+
];
|
|
235
189
|
const specs = [
|
|
236
190
|
...collectSpecs(outcome.manifest),
|
|
237
191
|
...workspaces.members.flatMap(member => collectSpecs(member.manifest, member.manifestPath)),
|
|
238
192
|
];
|
|
239
|
-
|
|
193
|
+
const installTimeViolations = installTimeExecutionViolations(manifests);
|
|
194
|
+
if (specs.length === 0 && installTimeViolations.length === 0) {
|
|
240
195
|
return skipRecord("No resolved package manifest declares dependencies, so this repository " +
|
|
241
196
|
"owns no third-party surface a confidence model could cover; " +
|
|
242
197
|
"supply-chain confidence is not established either way");
|
|
243
198
|
}
|
|
244
|
-
const { violations, observations } = await collectFindings(root, specs, workspaces);
|
|
199
|
+
const { violations, observations } = await collectFindings(root, specs, manifests, workspaces);
|
|
245
200
|
if (violations.length > 0) {
|
|
246
201
|
return {
|
|
247
202
|
id: DEPENDENCIES_SUPPLY_CHAIN_DIMENSION_ID,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-readiness-supply-chain.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-supply-chain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EACL,YAAY,EAEZ,aAAa,EACb,YAAY,EACZ,uBAAuB,EACvB,
|
|
1
|
+
{"version":3,"file":"doctor-readiness-supply-chain.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-supply-chain.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkiEpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkiEpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAgzMjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
|
|
@@ -6343,6 +6343,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
6343
6343
|
"src/cli/doctor-readiness-operations.ts": true,
|
|
6344
6344
|
"src/cli/doctor-readiness-release-path.ts": true,
|
|
6345
6345
|
"src/cli/doctor-readiness-shared.ts": true,
|
|
6346
|
+
"src/cli/doctor-readiness-supply-chain-evidence.ts": true,
|
|
6346
6347
|
"src/cli/doctor-readiness-supply-chain-scan.ts": true,
|
|
6347
6348
|
"src/cli/doctor-readiness-supply-chain.ts": true,
|
|
6348
6349
|
"src/cli/doctor-readiness-types.ts": true,
|
|
@@ -6724,10 +6725,12 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
6724
6725
|
"tests/unit/cli/doctor-readiness-domain-negatives.test.ts": true,
|
|
6725
6726
|
"tests/unit/cli/doctor-readiness-domain.test.ts": true,
|
|
6726
6727
|
"tests/unit/cli/doctor-readiness-guardrails-ephemeral.test.ts": true,
|
|
6728
|
+
"tests/unit/cli/doctor-readiness-guardrails-terraform.test.ts": true,
|
|
6727
6729
|
"tests/unit/cli/doctor-readiness-guardrails.test.ts": true,
|
|
6728
6730
|
"tests/unit/cli/doctor-readiness-journey.test.ts": true,
|
|
6729
6731
|
"tests/unit/cli/doctor-readiness-supply-chain-exceptions.test.ts": true,
|
|
6730
6732
|
"tests/unit/cli/doctor-readiness-supply-chain-install-gate.test.ts": true,
|
|
6733
|
+
"tests/unit/cli/doctor-readiness-supply-chain-install-scripts.test.ts": true,
|
|
6731
6734
|
"tests/unit/cli/doctor-readiness-supply-chain-precision.test.ts": true,
|
|
6732
6735
|
"tests/unit/cli/doctor-readiness-supply-chain-workspaces.test.ts": true,
|
|
6733
6736
|
"tests/unit/cli/doctor-readiness-supply-chain.test.ts": true,
|