@codyswann/lisa 2.309.0 → 2.309.1

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.
Files changed (61) hide show
  1. package/dist/cli/doctor-readiness-supply-chain-ruby.d.ts +36 -0
  2. package/dist/cli/doctor-readiness-supply-chain-ruby.d.ts.map +1 -0
  3. package/dist/cli/doctor-readiness-supply-chain-ruby.js +201 -0
  4. package/dist/cli/doctor-readiness-supply-chain-ruby.js.map +1 -0
  5. package/dist/cli/doctor-readiness-supply-chain.d.ts.map +1 -1
  6. package/dist/cli/doctor-readiness-supply-chain.js +92 -0
  7. package/dist/cli/doctor-readiness-supply-chain.js.map +1 -1
  8. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  9. package/dist/core/upstream-evidence-manifest.js +2 -0
  10. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  11. package/package.json +1 -1
  12. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  13. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  14. package/plugins/lisa-agy/plugin.json +1 -1
  15. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  16. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  17. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  18. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  19. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  20. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  24. package/plugins/lisa-expo-agy/plugin.json +1 -1
  25. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  29. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  30. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  34. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  35. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  39. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  40. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  44. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  45. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  49. package/plugins/lisa-rails-agy/plugin.json +1 -1
  50. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  54. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  55. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  59. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  60. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  61. 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":"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"}
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,CAg1MjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,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,