Skip to content

feat(scorecard): add code-coverage module - #3476

Open
fullsend-ai-coder[bot] wants to merge 7 commits into
mainfrom
agent/3474-code-coverage-module
Open

feat(scorecard): add code-coverage module#3476
fullsend-ai-coder[bot] wants to merge 7 commits into
mainfrom
agent/3474-code-coverage-module

Conversation

@fullsend-ai-coder

Copy link
Copy Markdown
Contributor

Create a new scorecard-backend-module-code-coverage that integrates with the Backstage Community code-coverage plugin to provide 8 metrics: line/branch percentage, available, covered, and missed counts.

The module fetches data from the code-coverage-backend API using the Backstage discovery service and maps the aggregate line and branch fields to individual MetricProviders.

Entities are filtered by the backstage.io/code-coverage annotation. Percentage metrics include default thresholds (>80 success, 50-80 warning, <50 error).

Includes:

  • CodeCoverageClient for API communication
  • Type definitions for the code-coverage API response
  • 8 MetricProvider implementations via factory pattern
  • Unit tests for client, providers, and factory (28 tests)
  • Example entity with code-coverage annotation
  • Backend app integration

Closes #3474

Post-script verification

  • Branch is not main/master (agent/3474-code-coverage-module)
  • Secret scan passed (gitleaks — 7ccaff17753df64c7ab288cdcba34cee5a657254..HEAD)
  • Pre-commit hooks passed (authoritative run on runner)
  • Tests ran inside sandbox

@rhdh-gh-app

rhdh-gh-app Bot commented Jun 19, 2026

Copy link
Copy Markdown

Missing Changesets

The following package(s) are changed by this PR but do not have a changeset:

  • @red-hat-developer-hub/backstage-plugin-scorecard-backend-module-code-coverage

See CONTRIBUTING.md for more information about how to add changesets.

Changed Packages

Package Name Package Path Changeset Bump Current Version
backend workspaces/scorecard/packages/backend none v0.0.0
@red-hat-developer-hub/backstage-plugin-scorecard-backend-module-code-coverage workspaces/scorecard/plugins/scorecard-backend-module-code-coverage none v0.0.0

@codecov

codecov Bot commented Jun 19, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 87.32394% with 9 lines in your changes missing coverage. Please review.
✅ Project coverage is 57.95%. Comparing base (0695f02) to head (0e792d2).
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #3476      +/-   ##
==========================================
+ Coverage   57.93%   57.95%   +0.02%     
==========================================
  Files        2396     2401       +5     
  Lines       96104    96175      +71     
  Branches    26803    26801       -2     
==========================================
+ Hits        55675    55737      +62     
- Misses      40233    40242       +9     
  Partials      196      196              
Flag Coverage Δ *Carryforward flag
adoption-insights 84.54% <ø> (ø) Carriedforward from 0695f02
ai-integrations 69.06% <ø> (ø) Carriedforward from 0695f02
app-defaults 69.79% <ø> (ø) Carriedforward from 0695f02
augment 46.67% <ø> (ø) Carriedforward from 0695f02
boost 76.77% <ø> (ø) Carriedforward from 0695f02
bulk-import 72.55% <ø> (ø) Carriedforward from 0695f02
cost-management 13.55% <ø> (ø) Carriedforward from 0695f02
dcm 60.72% <ø> (ø) Carriedforward from 0695f02
extensions 56.48% <ø> (ø) Carriedforward from 0695f02
global-floating-action-button 71.18% <ø> (ø) Carriedforward from 0695f02
global-header 62.17% <ø> (ø) Carriedforward from 0695f02
homepage 47.54% <ø> (ø) Carriedforward from 0695f02
install-dynamic-plugins 56.77% <ø> (ø) Carriedforward from 0695f02
intelligent-assistant 74.53% <ø> (ø) Carriedforward from 0695f02
konflux 91.98% <ø> (ø) Carriedforward from 0695f02
lightspeed 69.02% <ø> (ø) Carriedforward from 0695f02
mcp-integrations 83.40% <ø> (ø) Carriedforward from 0695f02
orchestrator 66.79% <ø> (ø) Carriedforward from 0695f02
quickstart 65.04% <ø> (ø) Carriedforward from 0695f02
sandbox 79.56% <ø> (ø) Carriedforward from 0695f02
scorecard 85.38% <87.32%> (+0.03%) ⬆️
theme 87.90% <ø> (ø) Carriedforward from 0695f02
translations 5.12% <ø> (ø) Carriedforward from 0695f02
x2a 79.31% <ø> (ø) Carriedforward from 0695f02

*This pull request uses carry forward flags. Click here to find out more.


Continue to review full report in Codecov by Harness.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 0695f02...0e792d2. Read the comment docs.

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@fullsend-ai-review

fullsend-ai-review Bot commented Jun 19, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 1:30 PM UTC · Completed 1:42 PM UTC
Commit: 7ccaff1 · View workflow run →

@fullsend-ai-review

fullsend-ai-review Bot commented Jun 19, 2026

Copy link
Copy Markdown

Review

Findings

High

  • [Missing backend-to-backend authentication] workspaces/scorecard/plugins/scorecard-backend-module-code-coverage/src/clients/CodeCoverageClient.ts:38 — The fetch call to the code-coverage backend plugin does not include a Backstage service-to-service authentication token. In the Backstage new backend system, backend plugins enforce authentication by default. The Jira scorecard module correctly uses coreServices.auth to obtain a getPluginRequestToken and sends it as a Bearer token when calling another internal backend plugin. This module calls an internal Backstage backend plugin via discovery.getBaseUrl('code-coverage') but omits authentication entirely. The fetch to code-coverage will fail at runtime in any deployment with default auth settings.
    Remediation: Add coreServices.auth to the module's deps in module.ts. Pass the AuthService into CodeCoverageClient. In getReport(), call auth.getOwnServiceCredentials() then auth.getPluginRequestToken({ onBehalfOf: ownCredentials, targetPluginId: 'code-coverage' }) and include the resulting token as Authorization: Bearer *** in the fetch headers. Follow the pattern in scorecard-backend-module-jira/src/strategies/ConnectionStrategy.ts`.

Medium

  • [resource-duplication] workspaces/scorecard/plugins/scorecard-backend-module-code-coverage/src/metricProviders/CodeCoverageMetricProviderFactory.ts:39 — The createCodeCoverageMetricProvider function creates a new CodeCoverageClient instance for every metric. Since createCodeCoverageMetricProviders calls this 8 times, 8 separate client objects are instantiated. All 8 code-coverage metrics extract data from the same API call for a given entity, so sharing a single client would be more efficient and would enable future caching.
    Remediation: Create a single CodeCoverageClient instance in createCodeCoverageMetricProviders and pass it to all 8 CodeCoverageMetricProvider instances.

  • [missing-null-handling] workspaces/scorecard/plugins/scorecard-backend-module-code-coverage/src/metricProviders/CodeCoverageMetricProvider.ts:82 — In calculateMetric, the code accesses report.aggregate[mapping.section][mapping.field] without null/undefined checks. The runtime data comes from an external API whose response shape is not validated. If the code-coverage plugin does not have branch coverage data for a given entity, the aggregate.branch field could be undefined, leading to a TypeError.
    Remediation: Add a defensive check before accessing the nested property, e.g.: const section = report.aggregate[mapping.section]; if (!section) { throw new Error('No coverage data available for section'); }

Low

  • [test-integrity] workspaces/scorecard/plugins/scorecard-backend-module-code-coverage/src/clients/CodeCoverageClient.test.ts:247 — The error assertion uses toThrow('Code coverage API error: 404 Not Found') which passes via Jest's substring matching, but doesn't verify the URL suffix that the production code includes in the error message.

  • [test-coverage-gap] workspaces/scorecard/plugins/scorecard-backend-module-code-coverage/src/metricProviders/CodeCoverageMetricProvider.test.ts — The calculateMetric tests do not cover edge cases such as aggregate values being zero or missing aggregate sections.

  • [test-isolation] workspaces/scorecard/plugins/scorecard-backend-module-code-coverage/src/metricProviders/CodeCoverageMetricProviderFactory.test.ts — The factory test mocks CodeCoverageClient but never verifies that the factory correctly passes the discovery and logger services to the constructor.

Info

  • [unvalidated-response] workspaces/scorecard/plugins/scorecard-backend-module-code-coverage/src/clients/CodeCoverageClient.ts:42 — The JSON response is cast to CodeCoverageReport without runtime validation. Consistent with other modules in the workspace (e.g., SonarQubeClient).
Previous run

Review

Findings

Medium

  • [Missing service-to-service authentication] workspaces/scorecard/plugins/scorecard-backend-module-code-coverage/src/clients/CodeCoverageClient.ts:42 — The client uses bare fetch() without Backstage service-to-service authentication tokens. The code-coverage API is an internal Backstage plugin discovered via DiscoveryService. The Jira module's ProxyConnectionStrategy uses AuthService.getPluginRequestToken() for similar internal plugin calls. Whether this causes 401/403 depends on the target plugin's auth enforcement configuration, but the code-coverage-backend plugin may enforce service auth by default in newer Backstage versions.
    Remediation: Inject AuthService (from coreServices.auth) into the client. Before each fetch, call auth.getPluginRequestToken({ onBehalfOf: await auth.getOwnServiceCredentials(), targetPluginId: 'code-coverage' }) and pass the token as a Bearer header.

Low

  • [edge-case] workspaces/scorecard/plugins/scorecard-backend-module-code-coverage/src/metricProviders/CodeCoverageMetricProvider.ts:69 — The calculateMetric method accesses report.aggregate[mapping.section][mapping.field] without null checks. If the code-coverage API returns a report where the aggregate section is missing or null, this will throw an unhandled TypeError. The TypeScript type defines these as required fields, so this is a defensive programming concern rather than a likely production bug.

  • [missing-test] workspaces/scorecard/plugins/scorecard-backend-module-code-coverage/src/metricProviders/CodeCoverageMetricProvider.test.ts:170 — The test suite has no test case for calculateMetric when the API returns a report with missing or null aggregate section data.

  • [test-inadequate] workspaces/scorecard/plugins/scorecard-backend-module-code-coverage/src/clients/CodeCoverageClient.test.ts:47 — The error-case test asserts toThrow('Code coverage API error: 404 Not Found'), but the production code produces 'Code coverage API error: 404 Not Found for ${url}'. While toThrow(string) uses substring match so the test passes, the test does not verify the URL is included in the error message.

Info

  • [logic-error] workspaces/scorecard/plugins/scorecard-backend-module-code-coverage/src/metricProviders/CodeCoverageMetricProviderFactory.ts:33 — The createCodeCoverageMetricProvider function creates a new CodeCoverageClient instance for each of the 8 metric providers. Each entity will have its code-coverage report fetched 8 separate times. The MetricProvider interface supports a calculateMetrics() batch method that could compute all 8 metrics from a single API call.

  • [data-exposure] workspaces/scorecard/plugins/scorecard-backend-module-code-coverage/src/clients/CodeCoverageClient.ts:42 — The error message on non-OK responses includes the full internal URL, which contains the resolved DiscoveryService base URL. This is consistent with existing patterns in the workspace (e.g., SonarQubeClient).

  • [No response body validation] workspaces/scorecard/plugins/scorecard-backend-module-code-coverage/src/clients/CodeCoverageClient.ts:45 — The JSON response from the code-coverage API is cast directly to CodeCoverageReport without runtime validation. This is consistent with other modules in the workspace.

@fullsend-ai-review fullsend-ai-review Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See the review comment for full details.

if (!response.ok) {
throw new Error(
`Code coverage API error: ${response.status} ${response.statusText} for ${url}`,
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[medium] Missing service-to-service authentication

The client uses bare fetch() without Backstage service-to-service authentication tokens. The code-coverage API is an internal Backstage plugin discovered via DiscoveryService.

Suggested fix: Inject AuthService (from coreServices.auth) into the client. Before each fetch, call auth.getPluginRequestToken() and pass the token as a Bearer header.

type: this.getMetricType(),
history: true,
};
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] edge-case

The calculateMetric method accesses report.aggregate[mapping.section][mapping.field] without null checks.

});
});

describe('getCatalogFilter', () => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] missing-test

No test case for calculateMetric when the API returns a report with missing or null aggregate section data.

it('should call the correct URL and return the report', async () => {
jest.spyOn(global, 'fetch').mockResolvedValueOnce({
ok: true,
json: async () => sampleReport,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] test-inadequate

The error-case test does not verify the URL is included in the error message due to substring matching.

* Creates a single code-coverage metric provider for the given metric ID.
*/
export function createCodeCoverageMetricProvider(
discovery: DiscoveryService,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[info] logic-error

Creates a new CodeCoverageClient instance for each of the 8 metric providers, causing 8x API calls per entity.

if (!response.ok) {
throw new Error(
`Code coverage API error: ${response.status} ${response.statusText} for ${url}`,
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[info] data-exposure

Error message includes the full internal URL. Consistent with existing patterns.

);
}
return response.json() as Promise<CodeCoverageReport>;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[info] No response body validation

JSON response cast directly to CodeCoverageReport without runtime validation. Consistent with other modules.

@fullsend-ai-review fullsend-ai-review Bot added the requires-manual-review Review requires human judgment label Jun 19, 2026
@christoph-jerolimov

Copy link
Copy Markdown
Member

/fs-fix regenerate the api reports and commit the changes (or new files)

@fullsend-ai-coder

fullsend-ai-coder Bot commented Jun 20, 2026

Copy link
Copy Markdown
Contributor Author

🤖 Finished Fix · ❌ Failure · Started 6:42 AM UTC · Completed 6:42 AM UTC
Commit: c0783eb · View workflow run →

@christoph-jerolimov

Copy link
Copy Markdown
Member

/fs-fix

  1. Add a readme, with installation instructions, notes on the necessary annotation and table with all metrics
  2. change the package.json version to 0.0.0
  3. add a changeset
  4. generate api report

@fullsend-ai-coder

fullsend-ai-coder Bot commented Jun 20, 2026

Copy link
Copy Markdown
Contributor Author

🤖 Finished Fix · ❌ Failure · Started 8:17 AM UTC · Completed 8:17 AM UTC
Commit: c3c2966 · View workflow run →

@christoph-jerolimov

Copy link
Copy Markdown
Member

/fs-fix

@fullsend-ai-coder

fullsend-ai-coder Bot commented Jun 22, 2026

Copy link
Copy Markdown
Contributor Author

🤖 Fix · ❌ Terminated · Started 4:19 PM UTC · Ended 4:20 PM UTC
Commit: 8e6b595 · View workflow run →

@fullsend-ai-review

fullsend-ai-review Bot commented Jun 22, 2026

Copy link
Copy Markdown

🤖 Review · ❌ Terminated · Started 4:53 PM UTC · Ended 5:08 PM UTC
Commit: ed84b21 · View workflow run →

@rhdh-qodo-merge

Copy link
Copy Markdown

CI Feedback 🧐

A test triggered by this PR failed. Here is an AI-generated analysis of the failure:

Action: Workspace scorecard, CI step for node 24

Failed stage: check api reports and generate API reference [❌]

Failed test name: ""

Failure summary:

The action failed during the API report generation step (yarn build:api-reports / API Extractor),
not during tests.
- API Extractor reported a warning that an expected API report file was missing
for backstage-plugin-scorecard-backend-module-code-coverage: it expected report.api.md but it was
not present/committed (warning references the generated file at
/home/runner/work/rhdh-plugins/rhdh-plugins/workspaces/scorecard/node_modules/.cache/api-extractor/.../report.api.md).

- Because the workflow treats API Extractor warnings as failures, it exited with: Error: API
Extractor completed with 0 errors and 1 warnings, followed by You have uncommitted changes to the
public API or reports of a package... run </code>yarn build:api-reports<code> and commit all md file changes.
and ended with exit code 1.
Note: there are also earlier Yarn build failures for native modules
(cpu-features, and optional ssh2 crypto binding) and peer dependency warnings, but the explicit job
failure shown is the missing/unclean API report warning causing the API Extractor step to fail.

Relevant error logs:
1:  ##[group]Runner Image Provisioner
2:  Hosted Compute Agent
...

295:  �[93m➤�[39m YN0002: │ �[38;5;173mapp�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:packages/app�[39m doesn't provide �[38;5;166m@material-ui/�[39m�[38;5;173micons�[39m (�[38;5;111mp2e81ee�[39m), requested by �[38;5;166m@red-hat-developer-hub/�[39m�[38;5;173mbackstage-plugin-theme�[39m.
296:  �[93m➤�[39m YN0002: │ �[38;5;173mapp�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:packages/app�[39m doesn't provide �[38;5;173mjest�[39m (�[38;5;111mp99cdc2�[39m), requested by �[38;5;166m@backstage/�[39m�[38;5;173mcli�[39m.
297:  �[93m➤�[39m YN0002: │ �[38;5;173mapp�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:packages/app�[39m doesn't provide �[38;5;173mreact-router-dom�[39m (�[38;5;111mpba7087�[39m), requested by �[38;5;166m@backstage-community/�[39m�[38;5;173mplugin-rbac�[39m and other dependencies.
298:  �[93m➤�[39m YN0002: │ �[38;5;173mbackend�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:packages/backend�[39m doesn't provide �[38;5;173mjest�[39m (�[38;5;111mp35ee37�[39m), requested by �[38;5;166m@backstage/�[39m�[38;5;173mcli�[39m.
299:  �[93m➤�[39m YN0086: │ Some peer dependencies are incorrectly met by your project; run �[38;5;111myarn explain peer-requirements <hash>�[39m for details, where �[38;5;111m<hash>�[39m is the six-letter p-prefixed code.
300:  �[93m➤�[39m YN0086: │ Some peer dependencies are incorrectly met by dependencies; run �[38;5;111myarn explain peer-requirements�[39m for details.
301:  ##[endgroup]
302:  �[94m➤�[39m �[90mYN0000�[39m: └ Completed
303:  �[94m➤�[39m �[90mYN0000�[39m: ┌ Fetch step
304:  ##[group]Fetch step
305:  �[94m➤�[39m YN0013: │ �[38;5;220m3249�[39m packages were added to the project (�[38;5;160m+ 1.26 GiB�[39m).
306:  ##[endgroup]
307:  �[94m➤�[39m �[90mYN0000�[39m: └ Completed in 20s 767ms
308:  �[94m➤�[39m �[90mYN0000�[39m: ┌ Link step
309:  ##[group]Link step
310:  �[94m➤�[39m YN0007: │ �[38;5;166m@swc/�[39m�[38;5;173mcore�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.15.26 [3994b]�[39m must be built because it never has been before or the last one failed
311:  �[94m➤�[39m YN0007: │ �[38;5;173mbetter-sqlite3�[39m�[38;5;111m@�[39m�[38;5;111mnpm:12.2.0�[39m must be built because it never has been before or the last one failed
312:  �[94m➤�[39m YN0007: │ �[38;5;173mcore-js�[39m�[38;5;111m@�[39m�[38;5;111mnpm:3.40.0�[39m must be built because it never has been before or the last one failed
313:  �[94m➤�[39m YN0007: │ �[38;5;173mmsw�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.3.5 [518a2]�[39m must be built because it never has been before or the last one failed
314:  �[94m➤�[39m YN0007: │ �[38;5;173mkeytar�[39m�[38;5;111m@�[39m�[38;5;111mnpm:7.9.0�[39m must be built because it never has been before or the last one failed
315:  �[94m➤�[39m YN0007: │ �[38;5;166m@nestjs/�[39m�[38;5;173mcore�[39m�[38;5;111m@�[39m�[38;5;111mnpm:10.4.15 [2d948]�[39m must be built because it never has been before or the last one failed
316:  �[94m➤�[39m YN0007: │ �[38;5;173misolated-vm�[39m�[38;5;111m@�[39m�[38;5;111mnpm:6.1.2�[39m must be built because it never has been before or the last one failed
317:  �[94m➤�[39m YN0007: │ �[38;5;173mcore-js-pure�[39m�[38;5;111m@�[39m�[38;5;111mnpm:3.49.0�[39m must be built because it never has been before or the last one failed
318:  �[94m➤�[39m YN0007: │ �[38;5;173mesbuild�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.27.5�[39m must be built because it never has been before or the last one failed
319:  �[94m➤�[39m YN0007: │ �[38;5;173munrs-resolver�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.11.1�[39m must be built because it never has been before or the last one failed
320:  �[94m➤�[39m YN0007: │ �[38;5;166m@scarf/�[39m�[38;5;173mscarf�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.4.0�[39m must be built because it never has been before or the last one failed
321:  �[94m➤�[39m YN0007: │ �[38;5;173mprotobufjs�[39m�[38;5;111m@�[39m�[38;5;111mnpm:7.6.4�[39m must be built because it never has been before or the last one failed
322:  �[94m➤�[39m YN0007: │ �[38;5;173mtree-sitter�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.22.4�[39m must be built because it never has been before or the last one failed
323:  �[94m➤�[39m YN0007: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m must be built because it never has been before or the last one failed
324:  �[94m➤�[39m YN0007: │ �[38;5;173mtree-sitter�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.21.1�[39m must be built because it never has been before or the last one failed
325:  �[94m➤�[39m YN0007: │ �[38;5;173mcore-js�[39m�[38;5;111m@�[39m�[38;5;111mnpm:2.6.12�[39m must be built because it never has been before or the last one failed
326:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mkeytar�[39m�[38;5;111m@�[39m�[38;5;111mnpm:7.9.0�[39m �[31mSTDERR�[39m (node:2676) [DEP0176] DeprecationWarning: fs.R_OK is deprecated, use fs.constants.R_OK instead
...

419:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m       |         ~~~~~~~         
420:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m  2425 |       , reinterpret_cast<const char *>(buf)
421:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m       |       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
422:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m  2426 |       , len
423:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m       |       ~~~~~             
424:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m  2427 |       , node_enc);
425:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m       |       ~~~~~~~~~~~       
426:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/node.h:1260:38: note: declared here
427:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m  1260 |     NODE_EXTERN v8::Local<v8::Value> Encode(v8::Isolate* isolate,
428:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m       |                                      ^~~~~~
429:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/node.h:116:42: note: in definition of macro ‘NODE_DEPRECATED’
430:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m   116 |     __attribute__((deprecated(message))) declarator
431:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m       |                                          ^~~~~~~~~~
432:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m In file included from ../../nan/nan.h:3045:
433:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m ../../nan/nan_scriptorigin.h: In constructor ‘Nan::ScriptOrigin::ScriptOrigin(v8::Local<v8::Value>)’:
434:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m ../../nan/nan_scriptorigin.h:36:55: error: no matching function for call to ‘v8::ScriptOrigin::ScriptOrigin(v8::Isolate*, v8::Local<v8::Value>&)’
435:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m    36 |       v8::ScriptOrigin(v8::Isolate::GetCurrent(), name) {}
...

441:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m                  from /home/runner/.cache/node-gyp/24.16.0/include/node/v8-context.h:15,
442:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m                  from /home/runner/.cache/node-gyp/24.16.0/include/node/v8.h:26:
443:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:65:13: note: candidate: ‘v8::ScriptOrigin::ScriptOrigin(v8::Local<v8::Value>, int, int, bool, int, v8::Local<v8::Value>, bool, bool, bool, v8::Local<v8::Data>)’
444:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m    65 |   V8_INLINE ScriptOrigin(Local<Value> resource_name,
445:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m       |             ^~~~~~~~~~~~
446:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:65:39: note:   no known conversion for argument 1 from ‘v8::Isolate*’ to ‘v8::Local<v8::Value>’
447:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m    65 |   V8_INLINE ScriptOrigin(Local<Value> resource_name,
448:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m       |                          ~~~~~~~~~~~~~^~~~~~~~~~~~~
449:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note: candidate: ‘constexpr v8::ScriptOrigin::ScriptOrigin(const v8::ScriptOrigin&)’
450:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m    63 | class V8_EXPORT ScriptOrigin {
451:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m       |                 ^~~~~~~~~~~~
452:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note:   candidate expects 1 argument, 2 provided
453:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note: candidate: ‘constexpr v8::ScriptOrigin::ScriptOrigin(v8::ScriptOrigin&&)’
454:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note:   candidate expects 1 argument, 2 provided
455:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m ../../nan/nan_scriptorigin.h: In constructor ‘Nan::ScriptOrigin::ScriptOrigin(v8::Local<v8::Value>, v8::Local<v8::Integer>)’:
456:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m ../../nan/nan_scriptorigin.h:42:52: error: no matching function for call to ‘v8::ScriptOrigin::ScriptOrigin(v8::Isolate*, v8::Local<v8::Value>&, int)’
457:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m    42 |                    , To<int32_t>(line).FromMaybe(0)) {}
458:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m       |                                                    ^
459:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:65:13: note: candidate: ‘v8::ScriptOrigin::ScriptOrigin(v8::Local<v8::Value>, int, int, bool, int, v8::Local<v8::Value>, bool, bool, bool, v8::Local<v8::Data>)’
460:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m    65 |   V8_INLINE ScriptOrigin(Local<Value> resource_name,
461:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m       |             ^~~~~~~~~~~~
462:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:65:39: note:   no known conversion for argument 1 from ‘v8::Isolate*’ to ‘v8::Local<v8::Value>’
463:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m    65 |   V8_INLINE ScriptOrigin(Local<Value> resource_name,
464:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m       |                          ~~~~~~~~~~~~~^~~~~~~~~~~~~
465:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note: candidate: ‘constexpr v8::ScriptOrigin::ScriptOrigin(const v8::ScriptOrigin&)’
466:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m    63 | class V8_EXPORT ScriptOrigin {
467:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m       |                 ^~~~~~~~~~~~
468:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note:   candidate expects 1 argument, 3 provided
469:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note: candidate: ‘constexpr v8::ScriptOrigin::ScriptOrigin(v8::ScriptOrigin&&)’
470:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note:   candidate expects 1 argument, 3 provided
471:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m ../../nan/nan_scriptorigin.h: In constructor ‘Nan::ScriptOrigin::ScriptOrigin(v8::Local<v8::Value>, v8::Local<v8::Integer>, v8::Local<v8::Integer>)’:
472:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m ../../nan/nan_scriptorigin.h:50:54: error: no matching function for call to ‘v8::ScriptOrigin::ScriptOrigin(v8::Isolate*, v8::Local<v8::Value>&, int, int)’
473:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m    50 |                    , To<int32_t>(column).FromMaybe(0)) {}
...

482:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m    63 | class V8_EXPORT ScriptOrigin {
483:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m       |                 ^~~~~~~~~~~~
484:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note:   candidate expects 1 argument, 4 provided
485:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note: candidate: ‘constexpr v8::ScriptOrigin::ScriptOrigin(v8::ScriptOrigin&&)’
486:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note:   candidate expects 1 argument, 4 provided
487:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m ../src/binding.cc: At global scope:
488:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/node.h:1358:7: warning: cast between incompatible function types from ‘void (*)(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE)’ {aka ‘void (*)(v8::Local<v8::Object>)’} to ‘node::addon_register_func’ {aka ‘void (*)(v8::Local<v8::Object>, v8::Local<v8::Value>, void*)’} [-Wcast-function-type]
489:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m  1358 |       (node::addon_register_func) (regfunc),                          \
490:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m       |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
491:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/node.h:1392:3: note: in expansion of macro ‘NODE_MODULE_X’
492:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m  1392 |   NODE_MODULE_X(modname, regfunc, NULL, 0)  // NOLINT (readability/null_usage)
493:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m       |   ^~~~~~~~~~~~~
494:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m ../src/binding.cc:151:1: note: in expansion of macro ‘NODE_MODULE’
495:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m   151 | NODE_MODULE(cpufeatures, init)
496:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m       | ^~~~~~~~~~~
497:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m make: *** [cpufeatures.target.mk:121: Release/obj.target/cpufeatures/src/binding.o] Error 1
498:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[32mSTDOUT�[39m make: Leaving directory '/home/runner/work/rhdh-plugins/rhdh-plugins/workspaces/scorecard/node_modules/cpu-features/build'
499:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m gyp ERR! build error 
500:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m gyp ERR! stack Error: `make` failed with exit code: 2
501:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m gyp ERR! stack at ChildProcess.<anonymous> (/home/runner/work/rhdh-plugins/rhdh-plugins/workspaces/scorecard/node_modules/tree-sitter/node_modules/node-gyp/lib/build.js:216:23)
502:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m gyp ERR! System Linux 6.17.0-1018-azure
503:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m gyp ERR! command "/opt/hostedtoolcache/node/24.16.0/x64/bin/node" "/home/runner/work/rhdh-plugins/rhdh-plugins/workspaces/scorecard/node_modules/tree-sitter/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
504:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m gyp ERR! cwd /home/runner/work/rhdh-plugins/rhdh-plugins/workspaces/scorecard/node_modules/cpu-features
505:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m gyp ERR! node -v v24.16.0
506:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m gyp ERR! node-gyp -v v11.1.0
507:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m �[31mSTDERR�[39m gyp ERR! not ok 
508:  �[94m➤�[39m YN0009: │ �[38;5;173mcpu-features�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.0.10�[39m couldn't be built successfully (exit code �[38;5;220m1�[39m, logs can be found here: �[38;5;170m/tmp/xfs-3fa14923/build.log�[39m)
509:  �[94m➤�[39m YN0007: │ �[38;5;166m@openapitools/�[39m�[38;5;173mopenapi-generator-cli�[39m�[38;5;111m@�[39m�[38;5;111mnpm:2.16.3�[39m must be built because it never has been before or the last one failed
510:  �[94m➤�[39m YN0007: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m must be built because it never has been before or the last one failed
511:  �[94m➤�[39m YN0007: │ �[38;5;166m@tree-sitter-grammars/�[39m�[38;5;173mtree-sitter-yaml�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.7.1 [1938f]�[39m must be built because it never has been before or the last one failed
512:  �[94m➤�[39m YN0007: │ �[38;5;173mtree-sitter-json�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.24.8 [1a14f]�[39m must be built because it never has been before or the last one failed
513:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m gyp info it worked if it ends with ok
...

583:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m       |         ~~~~~~~         
584:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m  2425 |       , reinterpret_cast<const char *>(buf)
585:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m       |       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
586:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m  2426 |       , len
587:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m       |       ~~~~~             
588:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m  2427 |       , node_enc);
589:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m       |       ~~~~~~~~~~~       
590:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/node.h:1260:38: note: declared here
591:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m  1260 |     NODE_EXTERN v8::Local<v8::Value> Encode(v8::Isolate* isolate,
592:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m       |                                      ^~~~~~
593:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/node.h:116:42: note: in definition of macro ‘NODE_DEPRECATED’
594:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m   116 |     __attribute__((deprecated(message))) declarator
595:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m       |                                          ^~~~~~~~~~
596:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m In file included from ../../../../../nan/nan.h:3045:
597:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m ../../../../../nan/nan_scriptorigin.h: In constructor ‘Nan::ScriptOrigin::ScriptOrigin(v8::Local<v8::Value>)’:
598:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m ../../../../../nan/nan_scriptorigin.h:36:55: error: no matching function for call to ‘v8::ScriptOrigin::ScriptOrigin(v8::Isolate*, v8::Local<v8::Value>&)’
599:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m    36 |       v8::ScriptOrigin(v8::Isolate::GetCurrent(), name) {}
...

605:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m                  from /home/runner/.cache/node-gyp/24.16.0/include/node/v8-context.h:15,
606:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m                  from /home/runner/.cache/node-gyp/24.16.0/include/node/v8.h:26:
607:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:65:13: note: candidate: ‘v8::ScriptOrigin::ScriptOrigin(v8::Local<v8::Value>, int, int, bool, int, v8::Local<v8::Value>, bool, bool, bool, v8::Local<v8::Data>)’
608:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m    65 |   V8_INLINE ScriptOrigin(Local<Value> resource_name,
609:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m       |             ^~~~~~~~~~~~
610:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:65:39: note:   no known conversion for argument 1 from ‘v8::Isolate*’ to ‘v8::Local<v8::Value>’
611:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m    65 |   V8_INLINE ScriptOrigin(Local<Value> resource_name,
612:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m       |                          ~~~~~~~~~~~~~^~~~~~~~~~~~~
613:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note: candidate: ‘constexpr v8::ScriptOrigin::ScriptOrigin(const v8::ScriptOrigin&)’
614:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m    63 | class V8_EXPORT ScriptOrigin {
615:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m       |                 ^~~~~~~~~~~~
616:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note:   candidate expects 1 argument, 2 provided
617:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note: candidate: ‘constexpr v8::ScriptOrigin::ScriptOrigin(v8::ScriptOrigin&&)’
618:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note:   candidate expects 1 argument, 2 provided
619:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m ../../../../../nan/nan_scriptorigin.h: In constructor ‘Nan::ScriptOrigin::ScriptOrigin(v8::Local<v8::Value>, v8::Local<v8::Integer>)’:
620:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m ../../../../../nan/nan_scriptorigin.h:42:52: error: no matching function for call to ‘v8::ScriptOrigin::ScriptOrigin(v8::Isolate*, v8::Local<v8::Value>&, int)’
621:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m    42 |                    , To<int32_t>(line).FromMaybe(0)) {}
622:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m       |                                                    ^
623:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:65:13: note: candidate: ‘v8::ScriptOrigin::ScriptOrigin(v8::Local<v8::Value>, int, int, bool, int, v8::Local<v8::Value>, bool, bool, bool, v8::Local<v8::Data>)’
624:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m    65 |   V8_INLINE ScriptOrigin(Local<Value> resource_name,
625:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m       |             ^~~~~~~~~~~~
626:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:65:39: note:   no known conversion for argument 1 from ‘v8::Isolate*’ to ‘v8::Local<v8::Value>’
627:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m    65 |   V8_INLINE ScriptOrigin(Local<Value> resource_name,
628:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m       |                          ~~~~~~~~~~~~~^~~~~~~~~~~~~
629:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note: candidate: ‘constexpr v8::ScriptOrigin::ScriptOrigin(const v8::ScriptOrigin&)’
630:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m    63 | class V8_EXPORT ScriptOrigin {
631:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m       |                 ^~~~~~~~~~~~
632:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note:   candidate expects 1 argument, 3 provided
633:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note: candidate: ‘constexpr v8::ScriptOrigin::ScriptOrigin(v8::ScriptOrigin&&)’
634:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note:   candidate expects 1 argument, 3 provided
635:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m ../../../../../nan/nan_scriptorigin.h: In constructor ‘Nan::ScriptOrigin::ScriptOrigin(v8::Local<v8::Value>, v8::Local<v8::Integer>, v8::Local<v8::Integer>)’:
636:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m ../../../../../nan/nan_scriptorigin.h:50:54: error: no matching function for call to ‘v8::ScriptOrigin::ScriptOrigin(v8::Isolate*, v8::Local<v8::Value>&, int, int)’
637:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m    50 |                    , To<int32_t>(column).FromMaybe(0)) {}
...

640:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m    65 |   V8_INLINE ScriptOrigin(Local<Value> resource_name,
641:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m       |             ^~~~~~~~~~~~
642:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:65:39: note:   no known conversion for argument 1 from ‘v8::Isolate*’ to ‘v8::Local<v8::Value>’
643:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m    65 |   V8_INLINE ScriptOrigin(Local<Value> resource_name,
644:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m       |                          ~~~~~~~~~~~~~^~~~~~~~~~~~~
645:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note: candidate: ‘constexpr v8::ScriptOrigin::ScriptOrigin(const v8::ScriptOrigin&)’
646:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m    63 | class V8_EXPORT ScriptOrigin {
647:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m       |                 ^~~~~~~~~~~~
648:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note:   candidate expects 1 argument, 4 provided
649:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note: candidate: ‘constexpr v8::ScriptOrigin::ScriptOrigin(v8::ScriptOrigin&&)’
650:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note:   candidate expects 1 argument, 4 provided
651:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m In file included from ../../../../../nan/nan_callbacks.h:123,
652:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m                  from ../../../../../nan/nan.h:182:
653:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m ../../../../../nan/nan_callbacks_12_inl.h: In instantiation of ‘v8::Local<v8::Object> Nan::FunctionCallbackInfo<T>::Holder() const [with T = v8::Value]’:
654:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m ../src/binding.cc:358:77:   required from here
655:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m ../../../../../nan/nan_callbacks_12_inl.h:112:62: error: ‘const class v8::FunctionCallbackInfo<v8::Value>’ has no member named ‘Holder’
656:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m   112 |   inline v8::Local<v8::Object> Holder() const { return info_.Holder(); }
657:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m       |                                                        ~~~~~~^~~~~~
658:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m make: *** [sshcrypto.target.mk:116: Release/obj.target/sshcrypto/src/binding.o] Error 1
659:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[32mSTDOUT�[39m make: Leaving directory '/home/runner/work/rhdh-plugins/rhdh-plugins/workspaces/scorecard/node_modules/ssh2/lib/protocol/crypto/build'
660:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m gyp ERR! build error 
661:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m gyp ERR! stack Error: `make` failed with exit code: 2
662:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m gyp ERR! stack     at ChildProcess.onExit (/home/runner/work/rhdh-plugins/rhdh-plugins/workspaces/scorecard/node_modules/node-gyp/lib/build.js:203:23)
663:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m gyp ERR! stack     at ChildProcess.emit (node:events:509:28)
664:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m gyp ERR! stack     at ChildProcess._handle.onexit (node:internal/child_process:295:12)
665:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m gyp ERR! System Linux 6.17.0-1018-azure
666:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m gyp ERR! command "/opt/hostedtoolcache/node/24.16.0/x64/bin/node" "/home/runner/work/rhdh-plugins/rhdh-plugins/workspaces/scorecard/node_modules/node-gyp/bin/node-gyp.js" "--target=v24.16.0" "--real_openssl_major=3" "rebuild"
667:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m gyp ERR! cwd /home/runner/work/rhdh-plugins/rhdh-plugins/workspaces/scorecard/node_modules/ssh2/lib/protocol/crypto
668:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m gyp ERR! node -v v24.16.0
669:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m gyp ERR! node-gyp -v v9.4.1
670:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[31mSTDERR�[39m gyp ERR! not ok 
671:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;173mssh2�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.16.0�[39m �[32mSTDOUT�[39m Failed to build optional crypto binding
672:  �[94m➤�[39m YN0007: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m must be built because it never has been before or the last one failed
673:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m �[93m➤�[39m YN0000: Yarn detected that the current workflow is executed from a public pull request. For safety the hardened mode has been enabled.
...

681:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m �[94m➤�[39m �[90mYN0000�[39m: ┌ Post-resolution validation
682:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m ::group::Post-resolution validation
683:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m �[93m➤�[39m YN0060: │ �[38;5;173mprettier�[39m is listed by your project with version �[38;5;111m3.7.4�[39m (�[38;5;111mpc2ecd8�[39m), which doesn't satisfy what �[38;5;166m@spotify/�[39m�[38;5;173mprettier-config�[39m and other dependencies request (�[38;5;37m^2.0.0�[39m).
684:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m �[93m➤�[39m YN0002: │ �[38;5;166m@redhat-developer/�[39m�[38;5;173mrhdh-plugins�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m doesn't provide �[38;5;166m@typescript-eslint/�[39m�[38;5;173mparser�[39m (�[38;5;111mp8d7c5c�[39m), requested by �[38;5;166m@spotify/�[39m�[38;5;173meslint-plugin�[39m.
685:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m �[93m➤�[39m YN0086: │ Some peer dependencies are incorrectly met by your project; run �[38;5;111myarn explain peer-requirements <hash>�[39m for details, where �[38;5;111m<hash>�[39m is the six-letter p-prefixed code.
686:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m �[93m➤�[39m YN0086: │ Some peer dependencies are incorrectly met by dependencies; run �[38;5;111myarn explain peer-requirements�[39m for details.
687:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m ::endgroup::
688:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m �[94m➤�[39m �[90mYN0000�[39m: └ Completed
689:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m �[94m➤�[39m �[90mYN0000�[39m: ┌ Fetch step
690:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m ::group::Fetch step
691:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m �[94m➤�[39m YN0013: │ �[38;5;220m663�[39m packages were added to the project (�[38;5;160m+ 227.62 MiB�[39m).
692:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m ::endgroup::
693:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m �[94m➤�[39m �[90mYN0000�[39m: └ Completed in 3s 604ms
694:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m �[94m➤�[39m �[90mYN0000�[39m: ┌ Link step
695:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m ::group::Link step
696:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m �[94m➤�[39m YN0007: │ �[38;5;173mesbuild�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.21.5�[39m must be built because it never has been before or the last one failed
697:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m �[94m➤�[39m YN0007: │ �[38;5;166m@swc/�[39m�[38;5;173mcore�[39m�[38;5;111m@�[39m�[38;5;111mnpm:1.4.13 [366d3]�[39m must be built because it never has been before or the last one failed
698:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m �[94m➤�[39m YN0007: │ �[38;5;173mesbuild�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.23.1�[39m must be built because it never has been before or the last one failed
699:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m �[94m➤�[39m YN0007: │ �[38;5;173mesbuild�[39m�[38;5;111m@�[39m�[38;5;111mnpm:0.20.2�[39m must be built because it never has been before or the last one failed
700:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m �[94m➤�[39m YN0007: │ �[38;5;173mcore-js-pure�[39m�[38;5;111m@�[39m�[38;5;111mnpm:3.36.1�[39m must be built because it never has been before or the last one failed
701:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m �[94m➤�[39m YN0007: │ �[38;5;166m@redhat-developer/�[39m�[38;5;173mrhdh-plugins�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m must be built because it never has been before or the last one failed
702:  �[94m➤�[39m �[90mYN0000�[39m: │ �[38;5;166m@internal/�[39m�[38;5;173mscorecard�[39m�[38;5;111m@�[39m�[38;5;111mworkspace:.�[39m �[32mSTDOUT�[39m ::endgroup::
...

795:  |         ~~~~~~~         
796:  2425 |       , reinterpret_cast<const char *>(buf)
797:  |       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
798:  2426 |       , len
799:  |       ~~~~~             
800:  2427 |       , node_enc);
801:  |       ~~~~~~~~~~~       
802:  /home/runner/.cache/node-gyp/24.16.0/include/node/node.h:1260:38: note: declared here
803:  1260 |     NODE_EXTERN v8::Local<v8::Value> Encode(v8::Isolate* isolate,
804:  |                                      ^~~~~~
805:  /home/runner/.cache/node-gyp/24.16.0/include/node/node.h:116:42: note: in definition of macro ‘NODE_DEPRECATED’
806:  116 |     __attribute__((deprecated(message))) declarator
807:  |                                          ^~~~~~~~~~
808:  In file included from ../../nan/nan.h:3045:
809:  ../../nan/nan_scriptorigin.h: In constructor ‘Nan::ScriptOrigin::ScriptOrigin(v8::Local<v8::Value>)’:
810:  ../../nan/nan_scriptorigin.h:36:55: error: no matching function for call to ‘v8::ScriptOrigin::ScriptOrigin(v8::Isolate*, v8::Local<v8::Value>&)’
811:  36 |       v8::ScriptOrigin(v8::Isolate::GetCurrent(), name) {}
...

817:  from /home/runner/.cache/node-gyp/24.16.0/include/node/v8-context.h:15,
818:  from /home/runner/.cache/node-gyp/24.16.0/include/node/v8.h:26:
819:  /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:65:13: note: candidate: ‘v8::ScriptOrigin::ScriptOrigin(v8::Local<v8::Value>, int, int, bool, int, v8::Local<v8::Value>, bool, bool, bool, v8::Local<v8::Data>)’
820:  65 |   V8_INLINE ScriptOrigin(Local<Value> resource_name,
821:  |             ^~~~~~~~~~~~
822:  /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:65:39: note:   no known conversion for argument 1 from ‘v8::Isolate*’ to ‘v8::Local<v8::Value>’
823:  65 |   V8_INLINE ScriptOrigin(Local<Value> resource_name,
824:  |                          ~~~~~~~~~~~~~^~~~~~~~~~~~~
825:  /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note: candidate: ‘constexpr v8::ScriptOrigin::ScriptOrigin(const v8::ScriptOrigin&)’
826:  63 | class V8_EXPORT ScriptOrigin {
827:  |                 ^~~~~~~~~~~~
828:  /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note:   candidate expects 1 argument, 2 provided
829:  /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note: candidate: ‘constexpr v8::ScriptOrigin::ScriptOrigin(v8::ScriptOrigin&&)’
830:  /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note:   candidate expects 1 argument, 2 provided
831:  ../../nan/nan_scriptorigin.h: In constructor ‘Nan::ScriptOrigin::ScriptOrigin(v8::Local<v8::Value>, v8::Local<v8::Integer>)’:
832:  ../../nan/nan_scriptorigin.h:42:52: error: no matching function for call to ‘v8::ScriptOrigin::ScriptOrigin(v8::Isolate*, v8::Local<v8::Value>&, int)’
833:  42 |                    , To<int32_t>(line).FromMaybe(0)) {}
834:  |                                                    ^
835:  /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:65:13: note: candidate: ‘v8::ScriptOrigin::ScriptOrigin(v8::Local<v8::Value>, int, int, bool, int, v8::Local<v8::Value>, bool, bool, bool, v8::Local<v8::Data>)’
836:  65 |   V8_INLINE ScriptOrigin(Local<Value> resource_name,
837:  |             ^~~~~~~~~~~~
838:  /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:65:39: note:   no known conversion for argument 1 from ‘v8::Isolate*’ to ‘v8::Local<v8::Value>’
839:  65 |   V8_INLINE ScriptOrigin(Local<Value> resource_name,
840:  |                          ~~~~~~~~~~~~~^~~~~~~~~~~~~
841:  /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note: candidate: ‘constexpr v8::ScriptOrigin::ScriptOrigin(const v8::ScriptOrigin&)’
842:  63 | class V8_EXPORT ScriptOrigin {
843:  |                 ^~~~~~~~~~~~
844:  /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note:   candidate expects 1 argument, 3 provided
845:  /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note: candidate: ‘constexpr v8::ScriptOrigin::ScriptOrigin(v8::ScriptOrigin&&)’
846:  /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note:   candidate expects 1 argument, 3 provided
847:  ../../nan/nan_scriptorigin.h: In constructor ‘Nan::ScriptOrigin::ScriptOrigin(v8::Local<v8::Value>, v8::Local<v8::Integer>, v8::Local<v8::Integer>)’:
848:  ../../nan/nan_scriptorigin.h:50:54: error: no matching function for call to ‘v8::ScriptOrigin::ScriptOrigin(v8::Isolate*, v8::Local<v8::Value>&, int, int)’
849:  50 |                    , To<int32_t>(column).FromMaybe(0)) {}
...

858:  63 | class V8_EXPORT ScriptOrigin {
859:  |                 ^~~~~~~~~~~~
860:  /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note:   candidate expects 1 argument, 4 provided
861:  /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note: candidate: ‘constexpr v8::ScriptOrigin::ScriptOrigin(v8::ScriptOrigin&&)’
862:  /home/runner/.cache/node-gyp/24.16.0/include/node/v8-message.h:63:17: note:   candidate expects 1 argument, 4 provided
863:  ../src/binding.cc: At global scope:
864:  /home/runner/.cache/node-gyp/24.16.0/include/node/node.h:1358:7: warning: cast between incompatible function types from ‘void (*)(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE)’ {aka ‘void (*)(v8::Local<v8::Object>)’} to ‘node::addon_register_func’ {aka ‘void (*)(v8::Local<v8::Object>, v8::Local<v8::Value>, void*)’} [-Wcast-function-type]
865:  1358 |       (node::addon_register_func) (regfunc),                          \
866:  |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
867:  /home/runner/.cache/node-gyp/24.16.0/include/node/node.h:1392:3: note: in expansion of macro ‘NODE_MODULE_X’
868:  1392 |   NODE_MODULE_X(modname, regfunc, NULL, 0)  // NOLINT (readability/null_usage)
869:  |   ^~~~~~~~~~~~~
870:  ../src/binding.cc:151:1: note: in expansion of macro ‘NODE_MODULE’
871:  151 | NODE_MODULE(cpufeatures, init)
872:  | ^~~~~~~~~~~
873:  make: *** [cpufeatures.target.mk:121: Release/obj.target/cpufeatures/src/binding.o] Error 1
874:  make: Leaving directory '/home/runner/work/rhdh-plugins/rhdh-plugins/workspaces/scorecard/node_modules/cpu-features/build'
875:  gyp ERR! build error 
876:  gyp ERR! stack Error: `make` failed with exit code: 2
877:  gyp ERR! stack at ChildProcess.<anonymous> (/home/runner/work/rhdh-plugins/rhdh-plugins/workspaces/scorecard/node_modules/tree-sitter/node_modules/node-gyp/lib/build.js:216:23)
...

951:  NODE_OPTIONS: --max-old-space-size=8192
952:  NPM_CONFIG_USERCONFIG: /home/runner/work/_temp/.npmrc
953:  NODE_AUTH_TOKEN: XXXXX-XXXXX-XXXXX-XXXXX
954:  ##[endgroup]
955:  # Generating package API reports
956:  ## Processing plugins/scorecard-node
957:  ## Processing plugins/scorecard-backend-module-sonarqube
958:  ## Processing plugins/scorecard-common
959:  ## Processing plugins/scorecard-backend-module-openssf
960:  ## Processing plugins/scorecard-backend-module-github
961:  ## Processing plugins/scorecard-backend-module-filecheck
962:  ## Processing plugins/scorecard-backend-module-dependabot
963:  ## Processing plugins/scorecard-backend-module-jira
964:  ## Processing plugins/scorecard-backend-module-code-coverage
965:  �[33mWarning: The API report file is missing. Please copy the file "/home/runner/work/rhdh-plugins/rhdh-plugins/workspaces/scorecard/node_modules/.cache/api-extractor/backstage-plugin-scorecard-backend-module-code-coverage/report.api.md" to "report.api.md", or perform a local build (which does this automatically). See the Git repo documentation for more info.�[39m
966:  Error: API Extractor completed with 0 errors and 1 warnings
967:  *************************************************************************************
968:  * You have uncommitted changes to the public API or reports of a package.           *
969:  * To solve this, run `yarn build:api-reports` and commit all md file changes.       *
970:  *************************************************************************************
971:  ##[error]Process completed with exit code 1.
972:  Node 20 is being deprecated. This workflow is running with Node 24 by default. If you need to temporarily use Node 20, you can set the ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true environment variable. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/

@fullsend-ai-review fullsend-ai-review Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See the review comment for full details.


this.logger.debug(`Fetching code coverage report for entity ${entityRef}`);

const response = await fetch(url);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[high] Missing backend-to-backend authentication

The fetch call to the code-coverage backend plugin does not include a Backstage service-to-service authentication token. In the Backstage new backend system, backend plugins enforce authentication by default. The Jira scorecard module correctly uses coreServices.auth to obtain a getPluginRequestToken and sends it as a Bearer token. This module omits authentication entirely and will fail at runtime in any deployment with default auth settings.

Suggested fix: Add coreServices.auth to the module's deps in module.ts. Pass the AuthService into CodeCoverageClient. In getReport(), call auth.getOwnServiceCredentials() then auth.getPluginRequestToken({ onBehalfOf: ownCredentials, targetPluginId: 'code-coverage' }) and include the resulting token as Authorization: Bearer *** in the fetch headers.

): MetricProvider<'number'> {
const client = new CodeCoverageClient(discovery, logger);
return new CodeCoverageMetricProvider(client, metricId);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[medium] resource-duplication

The createCodeCoverageMetricProvider function creates a new CodeCoverageClient instance for every metric. 8 separate client objects are instantiated when 1 would suffice. All 8 metrics extract data from the same API call for a given entity.

Suggested fix: Create a single CodeCoverageClient instance in createCodeCoverageMetricProviders and pass it to all 8 CodeCoverageMetricProvider instances.

};
}

async calculateMetric(entity: Entity): Promise<number> {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[medium] missing-null-handling

In calculateMetric, the code accesses report.aggregate[mapping.section][mapping.field] without null/undefined checks. The runtime data comes from an external API whose response shape is not validated. If the API does not have branch coverage data, aggregate.branch could be undefined, causing a TypeError.

Suggested fix: Add a defensive check before accessing the nested property.

if (!response.ok) {
throw new Error(
`Code coverage API error: ${response.status} ${response.statusText} for ${url}`,
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[info] unvalidated-response

The JSON response is cast to CodeCoverageReport without runtime validation. Consistent with other modules in the workspace.

@fullsend-ai-review fullsend-ai-review Bot removed the requires-manual-review Review requires human judgment label Jun 22, 2026
@fullsend-ai-review

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 4:53 PM UTC · Completed 5:08 PM UTC
Commit: ed84b21 · View workflow run →

@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

This PR has been automatically marked as stale because it has not had recent activity from the author. It will be closed if no further activity occurs. If the PR was closed and you want it re-opened, let us know and we'll re-open the PR so that you can continue the contribution!

@github-actions github-actions Bot added the stale label Jul 6, 2026
fullsend-ai-coder Bot added a commit that referenced this pull request Jul 27, 2026
- Add Backstage service-to-service authentication to CodeCoverageClient
  using AuthService (getOwnServiceCredentials + getPluginRequestToken)
  with Bearer token in fetch headers
- Move CODE_COVERAGE_METRICS, CODE_COVERAGE_METRIC_CONFIG,
  PERCENTAGE_THRESHOLDS and related constants from CodeCoverageConfig
  into CodeCoverageMetricProvider
- Update metric IDs from snake_case to lowerCamelCase per repo convention
  (e.g. codeCoverage.linePercentage instead of code-coverage.line_percentage)
- Use 'codeCoverage' for getProviderDatasourceId
- Share single CodeCoverageClient instance across all 8 metric providers
  instead of creating 8 separate instances
- Add null/undefined checks for report.aggregate section data
- Add test for missing aggregate section data
- Add test verifying auth token request targets code-coverage plugin

Addresses review feedback on #3476
fullsend-ai-coder Bot added a commit that referenced this pull request Jul 27, 2026
- Set package version to 0.0.0 for new code-coverage module
- Align README metric IDs with implementation (lowerCamelCase)
- Add generated API report file (report.api.md)

Addresses review feedback on #3476
fullsend-ai-coder Bot added a commit that referenced this pull request Jul 27, 2026
Ran yarn dedupe to deduplicate the scorecard workspace lockfile as
requested. Version in package.json was already 0.0.0.

Addresses review feedback on #3476
@fullsend-ai-coder
fullsend-ai-coder Bot force-pushed the agent/3474-code-coverage-module branch from 1f99af1 to e97ef41 Compare July 27, 2026 21:48
@christoph-jerolimov

Copy link
Copy Markdown
Member

/fs-fix rebase

@fullsend-ai-coder

fullsend-ai-coder Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor Author

🤖 Finished Fix · ✅ Success · Started 10:07 AM UTC · Completed 10:27 AM UTC
Commit: e97ef41 · View workflow run →

fullsend-ai-coder Bot added a commit that referenced this pull request Jul 28, 2026
Rebase onto main and update the code-coverage module to match the current
MetricProvider interface:
- Replace getMetric() with getMetrics() returning Metric[] with thresholds
- Replace calculateMetric() with calculateMetrics() returning Map
- Remove getMetricType() and getMetricThresholds() (no longer in interface)
- Update all tests to use the new API methods

Addresses review feedback on #3476
@fullsend-ai-coder

Copy link
Copy Markdown
Contributor Author

🔧 Fix agent — iteration 5 (human-triggered)

Rebased branch onto latest main, resolved yarn.lock conflict, verified all 28 tests pass.

Fixed (1):

  1. rebase onto main: Rebased branch agent/3474-code-coverage-module onto origin/main (14 commits ahead). Resolved yarn.lock merge conflict by accepting main's version and regenerating with yarn install. All 28 code-coverage module tests pass after rebase.

Tests: passed

Updated by fullsend fix agent

fullsend-ai-coder Bot added a commit that referenced this pull request Jul 28, 2026
- Add Backstage service-to-service authentication to CodeCoverageClient
  using AuthService (getOwnServiceCredentials + getPluginRequestToken)
  with Bearer token in fetch headers
- Move CODE_COVERAGE_METRICS, CODE_COVERAGE_METRIC_CONFIG,
  PERCENTAGE_THRESHOLDS and related constants from CodeCoverageConfig
  into CodeCoverageMetricProvider
- Update metric IDs from snake_case to lowerCamelCase per repo convention
  (e.g. codeCoverage.linePercentage instead of code-coverage.line_percentage)
- Use 'codeCoverage' for getProviderDatasourceId
- Share single CodeCoverageClient instance across all 8 metric providers
  instead of creating 8 separate instances
- Add null/undefined checks for report.aggregate section data
- Add test for missing aggregate section data
- Add test verifying auth token request targets code-coverage plugin

Addresses review feedback on #3476
fullsend-ai-coder Bot added a commit that referenced this pull request Jul 28, 2026
- Set package version to 0.0.0 for new code-coverage module
- Align README metric IDs with implementation (lowerCamelCase)
- Add generated API report file (report.api.md)

Addresses review feedback on #3476
fullsend-ai-coder Bot added a commit that referenced this pull request Jul 28, 2026
Ran yarn dedupe to deduplicate the scorecard workspace lockfile as
requested. Version in package.json was already 0.0.0.

Addresses review feedback on #3476
fullsend-ai-coder Bot added a commit that referenced this pull request Jul 28, 2026
Regenerate yarn.lock to resolve conflicts from rebasing onto
origin/main. All 28 code-coverage module tests pass.

Addresses review feedback on #3476
@fullsend-ai-coder
fullsend-ai-coder Bot force-pushed the agent/3474-code-coverage-module branch from e97ef41 to 7f62cfa Compare July 28, 2026 10:26
@christoph-jerolimov

Copy link
Copy Markdown
Member

/fs-fix run yarn dedupe and commit the yarn.lock

1 similar comment
@christoph-jerolimov

Copy link
Copy Markdown
Member

/fs-fix run yarn dedupe and commit the yarn.lock

@fullsend-ai-coder

fullsend-ai-coder Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor Author

🤖 Finished Fix · ✅ Success · Started 6:38 PM UTC · Completed 6:51 PM UTC
Commit: 7f62cfa · View workflow run →

@fullsend-ai-coder

Copy link
Copy Markdown
Contributor Author

🔧 Fix agent — iteration 6 (human-triggered)

Ran yarn dedupe in the scorecard workspace as requested. The yarn.lock was significantly reduced (714 lines removed) by deduplicating transitive dependencies.

Fixed (1):

  1. run yarn dedupe and commit the yarn.lock (workspaces/scorecard/yarn.lock): Ran yarn dedupe in the scorecard workspace, deduplicating transitive dependencies. The lockfile was reduced by 714 lines (746 changed: 32 insertions, 714 deletions).

Tests: passed

Updated by fullsend fix agent

fullsend-ai-coder Bot added a commit that referenced this pull request Jul 29, 2026
Run yarn dedupe in the scorecard workspace to deduplicate
transitive dependencies in yarn.lock.

Addresses review feedback on #3476
@christoph-jerolimov

Copy link
Copy Markdown
Member

/fs-fix rebase

@fullsend-ai-coder

fullsend-ai-coder Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor Author

🤖 Finished Fix · ✅ Success · Started 9:24 PM UTC · Completed 9:38 PM UTC
Commit: bbda591 · View workflow run →

Create a new scorecard-backend-module-code-coverage that
integrates with the Backstage Community code-coverage plugin
to provide 8 metrics: line/branch percentage, available,
covered, and missed counts.

The module fetches data from the code-coverage-backend API
using the Backstage discovery service and maps the aggregate
line and branch fields to individual MetricProviders.

Entities are filtered by the backstage.io/code-coverage
annotation. Percentage metrics include default thresholds
(>80 success, 50-80 warning, <50 error).

Includes:
- CodeCoverageClient for API communication
- Type definitions for the code-coverage API response
- 8 MetricProvider implementations via factory pattern
- Unit tests for client, providers, and factory (28 tests)
- Example entity with code-coverage annotation
- Backend app integration

Closes #3474
Rebase onto main and update the code-coverage module to match the current
MetricProvider interface:
- Replace getMetric() with getMetrics() returning Metric[] with thresholds
- Replace calculateMetric() with calculateMetrics() returning Map
- Remove getMetricType() and getMetricThresholds() (no longer in interface)
- Update all tests to use the new API methods

Addresses review feedback on #3476
- Add Backstage service-to-service authentication to CodeCoverageClient
  using AuthService (getOwnServiceCredentials + getPluginRequestToken)
  with Bearer token in fetch headers
- Move CODE_COVERAGE_METRICS, CODE_COVERAGE_METRIC_CONFIG,
  PERCENTAGE_THRESHOLDS and related constants from CodeCoverageConfig
  into CodeCoverageMetricProvider
- Update metric IDs from snake_case to lowerCamelCase per repo convention
  (e.g. codeCoverage.linePercentage instead of code-coverage.line_percentage)
- Use 'codeCoverage' for getProviderDatasourceId
- Share single CodeCoverageClient instance across all 8 metric providers
  instead of creating 8 separate instances
- Add null/undefined checks for report.aggregate section data
- Add test for missing aggregate section data
- Add test verifying auth token request targets code-coverage plugin

Addresses review feedback on #3476
- Set package version to 0.0.0 for new code-coverage module
- Align README metric IDs with implementation (lowerCamelCase)
- Add generated API report file (report.api.md)

Addresses review feedback on #3476
Ran yarn dedupe to deduplicate the scorecard workspace lockfile as
requested. Version in package.json was already 0.0.0.

Addresses review feedback on #3476
Regenerate yarn.lock to resolve conflicts from rebasing onto
origin/main. All 28 code-coverage module tests pass.

Addresses review feedback on #3476
Run yarn dedupe in the scorecard workspace to deduplicate
transitive dependencies in yarn.lock.

Addresses review feedback on #3476
@fullsend-ai-coder

Copy link
Copy Markdown
Contributor Author

🔧 Fix agent — iteration 7 (human-triggered)

Rebased PR branch onto latest origin/main. All 7 commits applied cleanly. Verified: build passes, 28 tests pass, secret scan clean, lockfile dedupe not needed. No new commit created — the rebase rewrote existing commits onto the new base.

Fixed (1):

  1. rebase branch onto latest main: Successfully rebased agent/3474-code-coverage-module (7 commits) onto latest origin/main. All 7 commits applied cleanly with no conflicts. Build succeeds, all 28 tests pass, secret scan clean, no dedupe needed.

Tests: passed

Updated by fullsend fix agent

@fullsend-ai-coder
fullsend-ai-coder Bot force-pushed the agent/3474-code-coverage-module branch from bbda591 to 0e792d2 Compare July 29, 2026 21:38
@sonarqubecloud

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation enhancement New feature or request Tests workspace/scorecard

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Create a new code-coverage module for scorecard

4 participants