@codyswann/lisa 2.309.0 → 2.309.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/doctor-readiness-supply-chain-ruby.d.ts +36 -0
- package/dist/cli/doctor-readiness-supply-chain-ruby.d.ts.map +1 -0
- package/dist/cli/doctor-readiness-supply-chain-ruby.js +201 -0
- package/dist/cli/doctor-readiness-supply-chain-ruby.js.map +1 -0
- package/dist/cli/doctor-readiness-supply-chain.d.ts.map +1 -1
- package/dist/cli/doctor-readiness-supply-chain.js +92 -0
- 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 +2 -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
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** One Ruby gem declaration flattened from a Gemfile. */
|
|
2
|
+
export interface RubyDependencySpec {
|
|
3
|
+
readonly manifestPath: "Gemfile";
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly spec: string | null;
|
|
6
|
+
}
|
|
7
|
+
/** What reading a Ruby/Bundler manifest established. */
|
|
8
|
+
export type RubyManifestOutcome = {
|
|
9
|
+
readonly kind: "absent";
|
|
10
|
+
} | {
|
|
11
|
+
readonly kind: "unassessable";
|
|
12
|
+
readonly reason: string;
|
|
13
|
+
} | {
|
|
14
|
+
readonly kind: "ok";
|
|
15
|
+
readonly manifestPath: "Gemfile";
|
|
16
|
+
readonly specs: readonly RubyDependencySpec[];
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Read the Ruby/Bundler dependency manifest when no JavaScript manifest exists.
|
|
20
|
+
* @param root - Repository root
|
|
21
|
+
* @returns Parsed Gemfile specs, or absent when this is not a Bundler project
|
|
22
|
+
*/
|
|
23
|
+
export declare function readRubyManifest(root: string): Promise<RubyManifestOutcome>;
|
|
24
|
+
/**
|
|
25
|
+
* Find the committed Ruby/Bundler lockfile.
|
|
26
|
+
* @param root - Repository root
|
|
27
|
+
* @returns The lockfile path, or null when none is committed
|
|
28
|
+
*/
|
|
29
|
+
export declare function findRubyLockfile(root: string): Promise<string | null>;
|
|
30
|
+
/**
|
|
31
|
+
* Find where the repository audits its Ruby/Bundler dependency tree.
|
|
32
|
+
* @param root - Repository root
|
|
33
|
+
* @returns The repo-relative path of the first Ruby audit gate found, or null
|
|
34
|
+
*/
|
|
35
|
+
export declare function findRubyAuditGate(root: string): Promise<string | null>;
|
|
36
|
+
//# sourceMappingURL=doctor-readiness-supply-chain-ruby.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-readiness-supply-chain-ruby.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness-supply-chain-ruby.ts"],"names":[],"mappings":"AA6CA,yDAAyD;AACzD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,wDAAwD;AACxD,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC1D;IACE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAC/C,CAAC;AA8FN;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,mBAAmB,CAAC,CAoC9B;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE3E;AAcD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoB5E"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ruby/Bundler scanning for the dependencies/supply-chain readiness producer
|
|
3
|
+
* (B5, PRD #1739, #1896).
|
|
4
|
+
* @module cli/doctor-readiness-supply-chain-ruby
|
|
5
|
+
*/
|
|
6
|
+
import { readdir } from "node:fs/promises";
|
|
7
|
+
import * as path from "node:path";
|
|
8
|
+
import { readFileOrNull } from "./doctor-readiness-shared.js";
|
|
9
|
+
/** Dependabot ecosystem spelling for Ruby/Bundler dependency updates. */
|
|
10
|
+
const RUBY_ECOSYSTEM_PATTERN = /package-ecosystem:\s*["']?bundler\b/i;
|
|
11
|
+
/** Commands and scanners that audit Ruby/Bundler dependencies. */
|
|
12
|
+
const RUBY_AUDIT_GATE_PATTERN = /\b(bundle\s+audit|bundler-audit|ruby-advisory-db)\b/i;
|
|
13
|
+
/** Renovate manager spelling for Ruby/Bundler dependencies. */
|
|
14
|
+
const RENOVATE_BUNDLER_PATTERN = /\bbundler\b/i;
|
|
15
|
+
/** Gemfile directive that delegates dependency declarations into a gemspec. */
|
|
16
|
+
const GEMSPEC_DIRECTIVE_PATTERN = /^\s*gemspec\b/u;
|
|
17
|
+
/** Files that may declare an audit gate in their text. */
|
|
18
|
+
const GATE_DIRECTORIES = [
|
|
19
|
+
path.join(".github", "workflows"),
|
|
20
|
+
".husky",
|
|
21
|
+
];
|
|
22
|
+
/** Single-file gate declarations checked by text match. */
|
|
23
|
+
const GATE_FILES = [
|
|
24
|
+
"lefthook.yml",
|
|
25
|
+
"lefthook.yaml",
|
|
26
|
+
".lefthook.yml",
|
|
27
|
+
];
|
|
28
|
+
/** Update bots whose mere presence is a standing confidence model. */
|
|
29
|
+
const UPDATE_BOT_FILES = [
|
|
30
|
+
path.join(".github", "dependabot.yml"),
|
|
31
|
+
path.join(".github", "dependabot.yaml"),
|
|
32
|
+
path.join(".github", "renovate.json"),
|
|
33
|
+
"renovate.json",
|
|
34
|
+
".renovaterc",
|
|
35
|
+
".renovaterc.json",
|
|
36
|
+
];
|
|
37
|
+
/**
|
|
38
|
+
* Whether a repository-relative path exists.
|
|
39
|
+
* @param root - Repository root
|
|
40
|
+
* @param relativePath - Repo-relative path
|
|
41
|
+
* @returns True when the file could be read
|
|
42
|
+
*/
|
|
43
|
+
async function fileExists(root, relativePath) {
|
|
44
|
+
return (await readFileOrNull(root, relativePath)) !== null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* List files directly inside a repository-relative directory.
|
|
48
|
+
* @param root - Repository root
|
|
49
|
+
* @param relativeDir - Repo-relative directory
|
|
50
|
+
* @returns Repo-relative file paths
|
|
51
|
+
*/
|
|
52
|
+
async function listDirectory(root, relativeDir) {
|
|
53
|
+
try {
|
|
54
|
+
const entries = await readdir(path.join(root, relativeDir), {
|
|
55
|
+
withFileTypes: true,
|
|
56
|
+
});
|
|
57
|
+
return entries
|
|
58
|
+
.filter(entry => entry.isFile())
|
|
59
|
+
.map(entry => path.join(relativeDir, entry.name))
|
|
60
|
+
.sort((a, b) => a.localeCompare(b));
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Remove one layer of YAML quoting from a command scalar.
|
|
68
|
+
* @param value - Potentially quoted YAML scalar text
|
|
69
|
+
* @returns The command text without balanced outer quotes
|
|
70
|
+
*/
|
|
71
|
+
function unquoteCommand(value) {
|
|
72
|
+
const trimmed = value.trim();
|
|
73
|
+
if (trimmed.length < 2) {
|
|
74
|
+
return trimmed;
|
|
75
|
+
}
|
|
76
|
+
const first = trimmed.at(0);
|
|
77
|
+
const last = trimmed.at(-1);
|
|
78
|
+
return (first === '"' && last === '"') || (first === "'" && last === "'")
|
|
79
|
+
? trimmed.slice(1, -1)
|
|
80
|
+
: trimmed;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Strip a leading YAML list marker from a possibly indented step line.
|
|
84
|
+
* @param trimmed - A source line after outer whitespace was removed
|
|
85
|
+
* @returns The line without a leading `- ` marker
|
|
86
|
+
*/
|
|
87
|
+
function stripYamlListMarker(trimmed) {
|
|
88
|
+
return trimmed.startsWith("- ") ? trimmed.slice(2).trimStart() : trimmed;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Extract a command-shaped line from CI/hook text.
|
|
92
|
+
* @param line - One source line
|
|
93
|
+
* @returns The executable command candidate, or null
|
|
94
|
+
*/
|
|
95
|
+
function executableCommandCandidate(line) {
|
|
96
|
+
const trimmed = line.trim();
|
|
97
|
+
if (trimmed === "" || trimmed.startsWith("#")) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
const commandish = stripYamlListMarker(trimmed);
|
|
101
|
+
if (commandish.toLowerCase().startsWith("run:")) {
|
|
102
|
+
const command = unquoteCommand(commandish.slice("run:".length));
|
|
103
|
+
return command === "|" || command === ">" ? null : command;
|
|
104
|
+
}
|
|
105
|
+
return commandish;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Whether CI/hook text contains a real Ruby dependency audit command.
|
|
109
|
+
* @param source - File text
|
|
110
|
+
* @returns True when an executable command audits Bundler dependencies
|
|
111
|
+
*/
|
|
112
|
+
function hasRubyAuditCommand(source) {
|
|
113
|
+
return source.split(/\r?\n/).some(line => {
|
|
114
|
+
const command = executableCommandCandidate(line);
|
|
115
|
+
return command !== null && RUBY_AUDIT_GATE_PATTERN.test(command);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Read the Ruby/Bundler dependency manifest when no JavaScript manifest exists.
|
|
120
|
+
* @param root - Repository root
|
|
121
|
+
* @returns Parsed Gemfile specs, or absent when this is not a Bundler project
|
|
122
|
+
*/
|
|
123
|
+
export async function readRubyManifest(root) {
|
|
124
|
+
const source = await readFileOrNull(root, "Gemfile");
|
|
125
|
+
if (source === null) {
|
|
126
|
+
return { kind: "absent" };
|
|
127
|
+
}
|
|
128
|
+
const hasGemspecDirective = source
|
|
129
|
+
.split(/\r?\n/)
|
|
130
|
+
.some(line => GEMSPEC_DIRECTIVE_PATTERN.test(line.trim()));
|
|
131
|
+
const specs = source.split(/\r?\n/).flatMap(line => {
|
|
132
|
+
const trimmed = line.trim();
|
|
133
|
+
if (trimmed === "" || trimmed.startsWith("#")) {
|
|
134
|
+
return [];
|
|
135
|
+
}
|
|
136
|
+
const match = /^\s*gem\s+["']([^"']+)["'](?:\s*,\s*["']([^"']+)["'])?/u.exec(line);
|
|
137
|
+
if (match === null || match[1] === undefined) {
|
|
138
|
+
return [];
|
|
139
|
+
}
|
|
140
|
+
return [
|
|
141
|
+
{
|
|
142
|
+
manifestPath: "Gemfile",
|
|
143
|
+
name: match[1],
|
|
144
|
+
spec: match[2] ?? null,
|
|
145
|
+
},
|
|
146
|
+
];
|
|
147
|
+
});
|
|
148
|
+
if (hasGemspecDirective) {
|
|
149
|
+
return {
|
|
150
|
+
kind: "unassessable",
|
|
151
|
+
reason: "`Gemfile` delegates dependency declarations through `gemspec`; " +
|
|
152
|
+
"Ruby supply-chain confidence is not established because this " +
|
|
153
|
+
"offline pass does not parse gemspec dependency declarations yet",
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
return { kind: "ok", manifestPath: "Gemfile", specs };
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Find the committed Ruby/Bundler lockfile.
|
|
160
|
+
* @param root - Repository root
|
|
161
|
+
* @returns The lockfile path, or null when none is committed
|
|
162
|
+
*/
|
|
163
|
+
export async function findRubyLockfile(root) {
|
|
164
|
+
return (await fileExists(root, "Gemfile.lock")) ? "Gemfile.lock" : null;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Whether an update-bot config watches Ruby/Bundler dependencies.
|
|
168
|
+
* @param botFile - Repo-relative bot config path
|
|
169
|
+
* @param source - The config's text
|
|
170
|
+
* @returns True when the bot covers Bundler dependencies
|
|
171
|
+
*/
|
|
172
|
+
function coversRubyTree(botFile, source) {
|
|
173
|
+
return botFile.includes("dependabot")
|
|
174
|
+
? RUBY_ECOSYSTEM_PATTERN.test(source)
|
|
175
|
+
: RENOVATE_BUNDLER_PATTERN.test(source);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Find where the repository audits its Ruby/Bundler dependency tree.
|
|
179
|
+
* @param root - Repository root
|
|
180
|
+
* @returns The repo-relative path of the first Ruby audit gate found, or null
|
|
181
|
+
*/
|
|
182
|
+
export async function findRubyAuditGate(root) {
|
|
183
|
+
for (const botFile of UPDATE_BOT_FILES) {
|
|
184
|
+
const source = await readFileOrNull(root, botFile);
|
|
185
|
+
if (source !== null && coversRubyTree(botFile, source)) {
|
|
186
|
+
return botFile.split(path.sep).join("/");
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
const scanned = [
|
|
190
|
+
...(await Promise.all(GATE_DIRECTORIES.map(dir => listDirectory(root, dir)))).flat(),
|
|
191
|
+
...GATE_FILES,
|
|
192
|
+
];
|
|
193
|
+
for (const file of scanned) {
|
|
194
|
+
const source = await readFileOrNull(root, file);
|
|
195
|
+
if (source !== null && hasRubyAuditCommand(source)) {
|
|
196
|
+
return file.split(path.sep).join("/");
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=doctor-readiness-supply-chain-ruby.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-readiness-supply-chain-ruby.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-supply-chain-ruby.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":"AAuDA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAE5E,+EAA+E;AAC/E,eAAO,MAAM,sCAAsC,8BACtB,CAAC;AAmQ9B;;;;;;;;GAQG;AACH,wBAAsB,sCAAsC,CAC1D,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,wBAAwB,CAAC,CAgEnC"}
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
import { informationalFindings } from "./doctor-readiness-shared.js";
|
|
31
31
|
import { auditExceptionViolations } from "./doctor-readiness-audit-allowlist.js";
|
|
32
32
|
import { collectSpecs, findAuditGate, findLockfile, findLockfileInstallGate, readManifest, } from "./doctor-readiness-supply-chain-scan.js";
|
|
33
|
+
import { findRubyAuditGate, findRubyLockfile, readRubyManifest, } from "./doctor-readiness-supply-chain-ruby.js";
|
|
33
34
|
import { dependencyConfidenceObservations, dependencyConfidenceViolations, installTimeExecutionViolations, } from "./doctor-readiness-supply-chain-evidence.js";
|
|
34
35
|
import { resolveWorkspaceMembers, } from "./doctor-readiness-workspaces.js";
|
|
35
36
|
/** The dependencies/supply-chain readiness dimension id (readiness-rubric). */
|
|
@@ -118,6 +119,93 @@ function supplyChainFinding(violations) {
|
|
|
118
119
|
],
|
|
119
120
|
};
|
|
120
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* Build B5 evidence lines for a Ruby/Bundler project.
|
|
124
|
+
* @param specs - Gem declarations under assessment
|
|
125
|
+
* @param lockfile - Bundler lockfile path, if committed
|
|
126
|
+
* @param auditGate - Ruby dependency audit gate path, if declared
|
|
127
|
+
* @returns Evidence lines for Ruby dependency-confidence violations
|
|
128
|
+
*/
|
|
129
|
+
function rubySupplyChainViolations(specs, lockfile, auditGate) {
|
|
130
|
+
if (specs.length === 0) {
|
|
131
|
+
return [];
|
|
132
|
+
}
|
|
133
|
+
return [
|
|
134
|
+
...(lockfile === null
|
|
135
|
+
? [
|
|
136
|
+
`\`Gemfile\` declares ${specs.length} gem dependency spec(s) but ` +
|
|
137
|
+
"no `Gemfile.lock` is committed — two Bundler installs can " +
|
|
138
|
+
"resolve to different gem versions, so what was validated is not " +
|
|
139
|
+
"provably what gets installed",
|
|
140
|
+
]
|
|
141
|
+
: []),
|
|
142
|
+
...specs
|
|
143
|
+
.filter(spec => spec.spec === null)
|
|
144
|
+
.map(spec => `\`Gemfile\` gem \`${spec.name}\` names no version constraint, so ` +
|
|
145
|
+
"Bundler may resolve whatever satisfies the repository today rather " +
|
|
146
|
+
"than a version any run intentionally chose"),
|
|
147
|
+
...(auditGate === null
|
|
148
|
+
? [
|
|
149
|
+
"no Ruby dependency-audit gate was found anywhere — no `bundle " +
|
|
150
|
+
"audit`/`bundler-audit` step in `.github/workflows/*.yml`, none " +
|
|
151
|
+
"in a git hook, and no `dependabot.yml` bundler entry or " +
|
|
152
|
+
"`renovate.json` — so a newly disclosed advisory in this gem tree " +
|
|
153
|
+
"would never be noticed by anything",
|
|
154
|
+
]
|
|
155
|
+
: []),
|
|
156
|
+
];
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Assess Ruby/Bundler dependencies when no JavaScript manifest exists.
|
|
160
|
+
* @param root - Repository root to assess
|
|
161
|
+
* @returns The B5 record, or null when no Ruby manifest exists
|
|
162
|
+
*/
|
|
163
|
+
async function assessRubyDependenciesSupplyChainDimension(root) {
|
|
164
|
+
const ruby = await readRubyManifest(root);
|
|
165
|
+
if (ruby.kind === "absent") {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
if (ruby.kind === "unassessable") {
|
|
169
|
+
return skipRecord(ruby.reason);
|
|
170
|
+
}
|
|
171
|
+
if (ruby.specs.length === 0) {
|
|
172
|
+
return skipRecord("`Gemfile` was found but declares no gem dependencies, so this " +
|
|
173
|
+
"repository owns no Ruby third-party surface a confidence model could " +
|
|
174
|
+
"cover; supply-chain confidence is not established either way");
|
|
175
|
+
}
|
|
176
|
+
const lockfile = await findRubyLockfile(root);
|
|
177
|
+
const auditGate = await findRubyAuditGate(root);
|
|
178
|
+
const violations = rubySupplyChainViolations(ruby.specs, lockfile, auditGate);
|
|
179
|
+
const observations = [
|
|
180
|
+
...(lockfile === null ? [] : [`Ruby lockfile in use: \`${lockfile}\`.`]),
|
|
181
|
+
...(auditGate === null
|
|
182
|
+
? []
|
|
183
|
+
: [`Ruby dependency-audit gate declared in \`${auditGate}\`.`]),
|
|
184
|
+
];
|
|
185
|
+
if (violations.length > 0) {
|
|
186
|
+
return {
|
|
187
|
+
id: DEPENDENCIES_SUPPLY_CHAIN_DIMENSION_ID,
|
|
188
|
+
status: "FAIL",
|
|
189
|
+
findings: [
|
|
190
|
+
supplyChainFinding(violations),
|
|
191
|
+
...informationalFindings(observations),
|
|
192
|
+
],
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
id: DEPENDENCIES_SUPPLY_CHAIN_DIMENSION_ID,
|
|
197
|
+
status: "PASS",
|
|
198
|
+
findings: [
|
|
199
|
+
{
|
|
200
|
+
evidence: `Inspected ${ruby.specs.length} gem dependency spec(s) in ` +
|
|
201
|
+
"`Gemfile`: each gem names a constraint, `Gemfile.lock` is " +
|
|
202
|
+
"committed, and a Ruby dependency-audit gate is declared.",
|
|
203
|
+
checked: [SUPPLY_CHAIN_BLOCKER_ID],
|
|
204
|
+
},
|
|
205
|
+
...informationalFindings(observations),
|
|
206
|
+
],
|
|
207
|
+
};
|
|
208
|
+
}
|
|
121
209
|
/**
|
|
122
210
|
* Count workspace manifests that contributed dependency specs.
|
|
123
211
|
* @param specs - The dependency specs under assessment
|
|
@@ -176,6 +264,10 @@ function skipRecord(reason) {
|
|
|
176
264
|
export async function assessDependenciesSupplyChainDimension(root) {
|
|
177
265
|
const outcome = await readManifest(root);
|
|
178
266
|
if (outcome.kind === "unassessable") {
|
|
267
|
+
const rubyRecord = await assessRubyDependenciesSupplyChainDimension(root);
|
|
268
|
+
if (rubyRecord !== null) {
|
|
269
|
+
return rubyRecord;
|
|
270
|
+
}
|
|
179
271
|
return skipRecord(outcome.reason);
|
|
180
272
|
}
|
|
181
273
|
const workspaces = await resolveWorkspaceMembers(root, outcome.manifest);
|
|
@@ -1 +1 @@
|
|
|
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
|
+
{"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,CA0iEpE,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,CA0iEpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk1MjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
|
|
@@ -6368,6 +6368,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
6368
6368
|
"src/cli/doctor-readiness-reusable-callers.ts": true,
|
|
6369
6369
|
"src/cli/doctor-readiness-shared.ts": true,
|
|
6370
6370
|
"src/cli/doctor-readiness-supply-chain-evidence.ts": true,
|
|
6371
|
+
"src/cli/doctor-readiness-supply-chain-ruby.ts": true,
|
|
6371
6372
|
"src/cli/doctor-readiness-supply-chain-scan.ts": true,
|
|
6372
6373
|
"src/cli/doctor-readiness-supply-chain.ts": true,
|
|
6373
6374
|
"src/cli/doctor-readiness-types.ts": true,
|
|
@@ -6761,6 +6762,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
6761
6762
|
"tests/unit/cli/doctor-readiness-supply-chain-install-gate.test.ts": true,
|
|
6762
6763
|
"tests/unit/cli/doctor-readiness-supply-chain-install-scripts.test.ts": true,
|
|
6763
6764
|
"tests/unit/cli/doctor-readiness-supply-chain-precision.test.ts": true,
|
|
6765
|
+
"tests/unit/cli/doctor-readiness-supply-chain-ruby.test.ts": true,
|
|
6764
6766
|
"tests/unit/cli/doctor-readiness-supply-chain-workspaces.test.ts": true,
|
|
6765
6767
|
"tests/unit/cli/doctor-readiness-supply-chain.test.ts": true,
|
|
6766
6768
|
"tests/unit/cli/doctor-readiness-workflows.test.ts": true,
|