Skip to content

chore: standardize license metadata across package.json files - #2592

Merged
bpamiri merged 2 commits into
developfrom
peter/issue-2574-standardize-license-metadata
May 12, 2026
Merged

bpamiri merged 2 commits into
developfrom
peter/issue-2574-standardize-license-metadata

Conversation

@bpamiri

@bpamiri bpamiri commented May 12, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Add "license": "Apache-2.0" (SPDX identifier) to every package.json so SCA tooling (GitHub dependency graph, FOSSA, Snyk) classifies the project deterministically — 9 of the 11 manifests had no license field at all.
  • Reconcile tools/vscode-ext/package.json from MIT → Apache-2.0. The rest of the repo is Apache-2.0 and Microsoft Marketplace accepts any OSI license — MIT looked accidental.
  • Reconcile tools/docker/testui/package.json from ISC → Apache-2.0 (ISC is the npm init default — no intentional signal).

In package.json, the license field with an SPDX expression is the SPDX declaration — JSON has no comment syntax, so there is no separate SPDX-License-Identifier slot. CFC-source SPDX headers under vendor/wheels/ and cli/lucli/ are out of scope here (1000+ files, explicitly deferred in the issue).

Closes #2574

Test plan

  • All 11 package.json files parse as valid JSON after edit (verified via python3 -c 'import json; json.load(open(...))')
  • pnpm prettier --check on the 7 web/ manifests passes (no formatting regressions)
  • Indent style preserved per-file (tabs in web/* and vscode-ext, 2-space in root / docs-validation / testui)
  • Diff is exactly 11 files changed, 11 insertions(+), 2 deletions(-)
  • CI: commitlint passes (chore: is a valid type, no scope used)
  • CI: full matrix green before merge

🤖 Generated with Claude Code

Adds "license": "Apache-2.0" (SPDX identifier) to every package.json so
SCA tooling (GitHub dependency graph, FOSSA, Snyk) classifies the project
deterministically. The license field IS the SPDX declaration for JSON
manifests — there is no separate SPDX-License-Identifier slot in
package.json.

- 9 manifests previously had no license field — now Apache-2.0.
- tools/vscode-ext was MIT (looked accidental — the rest of the repo is
  Apache-2.0 and Microsoft Marketplace accepts any OSI license) → Apache-2.0.
- tools/docker/testui was ISC (npm init default) → Apache-2.0.

CFC source-file SPDX headers under vendor/wheels/ and cli/lucli/ are out
of scope here (1000+ files); see the issue for the deferred follow-up.

Closes #2574

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code labels May 12, 2026

@wheels-bot wheels-bot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Wheels Bot — Reviewer A

This PR standardizes the license field across all 11 package.json files in the repository to the SPDX identifier Apache-2.0, closing a gap that prevented SCA tooling from classifying the project deterministically. The change is narrow and well-motivated. However, one critical correctness issue exists: the VSCode extension's actual LICENSE file still declares MIT, directly contradicting the new package.json value of Apache-2.0. That mismatch must be resolved before merge.


Correctness

Critical: vscode-ext package.json and LICENSE file are now contradictory

tools/vscode-ext/package.json (line 19 in the diff):

-  "license": "MIT",
+  "license": "Apache-2.0",

But tools/vscode-ext/LICENSE still reads:

MIT License

Copyright (c) 2025 Wheels

Permission is hereby granted, free of charge, to any person obtaining a copy
...

The LICENSE file is the authoritative legal artifact. The package.json license field is the machine-readable declaration of that artifact. Pointing package.json at Apache-2.0 while the LICENSE file remains MIT creates a direct contradiction: SCA tools (the stated goal of this PR) will now receive one signal from npm metadata and the opposite signal from the on-disk license text. Distributors and downstream users relying on either source will see inconsistent information.

The PR body argues "MIT looked accidental", but accidental or not, the LICENSE file was published as MIT on the VS Code Marketplace alongside extension versions up to 1.0.8. Any relicensing decision needs to be deliberate and consistent — both the LICENSE file and the package.json must agree. The correct fix is one of:

  • Option A (keep Apache-2.0): Replace tools/vscode-ext/LICENSE with the Apache-2.0 license text, verify this is intentional relicensing, and note the change in the extension's own CHANGELOG.
  • Option B (revert to MIT): Keep tools/vscode-ext/package.json at "license": "MIT" to match the existing LICENSE file.

The tools/docker/testui/package.json change (ISC → Apache-2.0) is clean: testui has no standalone LICENSE file of its own, so ISC was purely the npm init default with no legal artifact behind it.

All 9 manifests that previously had no license field are fine — adding Apache-2.0 there is consistent with the root LICENSE file and correct.


Commits

The single commit chore: standardize license metadata across package.json files conforms to commitlint: chore is a valid type, the subject is within 100 characters, and is not ALL-CAPS. No scope is required.

The commit message is missing the required DCO Signed-off-by trailer:

Signed-off-by: bpamiri <email@example.com>

The DCO GitHub App is a required status check on every PR. Without the trailer, the DCO check will block merge. The Co-Authored-By line present in the commit does not substitute for Signed-off-by. This needs to be added (either via git commit --amend -s or a fixup commit with the trailer) before merge.


Docs

No .ai/wheels/ doc updates are required for this change — it touches only JS/JSON tooling metadata, not framework behavior or conventions.

No CHANGELOG entry is needed; this is an internal metadata fix, not a user-facing feature or bug fix.


Security

No security concerns. The diff is entirely in package.json metadata fields with no code execution paths.

@wheels-bot

wheels-bot Bot commented May 12, 2026

Copy link
Copy Markdown
Contributor

Wheels Bot — Reviewer B (round 1)

A's review is accurate and the request-changes verdict is well-founded. Both findings are verified against the diff and the working tree. Aligned on changes needed.

Sycophancy

None detected. A issued CHANGES_REQUESTED and cited specific evidence for each finding.

False positives

None detected.

  • vscode-ext LICENSE mismatch: Verified. tools/vscode-ext/LICENSE on the current HEAD is an MIT license ("MIT License / Copyright (c) 2025 Wheels..."). The diff changes package.json to "license": "Apache-2.0". The contradiction A describes is real.
  • DCO sign-off missing: Verified. git log shows the commit body ends with only Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> — no Signed-off-by: trailer. The DCO app is a required status check; this will block merge.

Missed issues

None detected. The diff is purely JSON metadata across 11 files; there are no code execution paths, no CFML changes, no test regressions to check. The only substantive concerns (the license contradiction and the DCO trailer) were both caught by A.

Verdict alignment

A's CHANGES_REQUESTED is consistent with two concrete, blocking findings. Correct verdict.

Convergence

Fully aligned. Both issues A raised are real and need to be resolved before merge: (1) either update tools/vscode-ext/LICENSE to Apache-2.0 text or revert package.json back to "license": "MIT", and (2) add a Signed-off-by: trailer to the commit. No disagreements with A's analysis.

…ge.json (round 1)

Addresses Reviewer A/B consensus from the convergence loop: the prior
commit set tools/vscode-ext/package.json to "license": "Apache-2.0" but
left tools/vscode-ext/LICENSE as MIT text, creating a contradiction
between npm metadata and the on-disk license artifact (the very issue
this PR set out to fix for SCA tooling).

Picks Option A from A's review (replace LICENSE with Apache-2.0 text)
because the PR's stated intent in the body is deliberate relicensing of
this directory to align with the repo-wide Apache-2.0 — "MIT looked
accidental." LICENSE now matches the root LICENSE byte-for-byte.

The DCO-trailer finding on the earlier commit (8d58fb6) cannot be
addressed by the bot without rewriting history (git commit --amend on
a shared branch), which the bot's rails forbid. The original commit
author needs to amend + force-push, or add a separate fixup. This new
commit carries its own Signed-off-by via -s.

Signed-off-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
@wheels-bot

wheels-bot Bot commented May 12, 2026

Copy link
Copy Markdown
Contributor

Wheels Bot — Address Review (round 1)

Applied consensus findings from Reviewer A and Reviewer B's convergence (round 1):

  • Resolved the vscode-ext license contradiction. Replaced tools/vscode-ext/LICENSE (was MIT text from line 1) with the canonical Apache-2.0 license text, now byte-identical to the repo's root LICENSE. This brings the on-disk license artifact in line with the "license": "Apache-2.0" declaration in tools/vscode-ext/package.json so SCA tooling (the stated motivation for this PR) sees one consistent signal. Picked Option A from A's review — the relicense path — because the PR body explicitly frames the MIT entry as accidental ("the rest of the repo is Apache-2.0 ... MIT looked accidental").

Skipped (not addressable by the bot at this layer):

  • DCO Signed-off-by: trailer on the prior commit 8d58fb6da — skipped: adding a trailer to an existing commit requires git commit --amend (history rewrite) + force-push, both forbidden by the bot's rails. The new commit on this PR (3acb9f8) carries its own Signed-off-by: via -s, but the DCO check on the PR will continue to fail until the original commit author either amends the earlier commit and force-pushes, or the maintainer enables an allowlist via the DCO app. This needs a human in the loop.

The new commit will trigger a fresh Reviewer A run on the updated SHA. Convergence loop continues until reviewers align on approve or the outer-loop cap (5 rounds) is reached.

@wheels-bot wheels-bot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Wheels Bot — Reviewer A

This PR adds "license": "Apache-2.0" to all 11 package.json files and replaces the former MIT-licensed tools/vscode-ext/LICENSE with the canonical Apache-2.0 text to align the entire repo for SCA tooling. The critical correctness issue raised in round 1 (LICENSE/package.json mismatch for the VS Code extension) has been fully resolved: tools/vscode-ext/LICENSE now matches the root LICENSE byte-for-byte. One process concern remains before merge: the original commit still lacks a DCO Signed-off-by trailer. Verdict: comment — no code issues, process nit only.


Correctness

Round 1 finding resolved. tools/vscode-ext/LICENSE and tools/vscode-ext/package.json are now consistent:

  • package.json line 19: "license": "Apache-2.0"
  • tools/vscode-ext/LICENSE: Apache License Version 2.0 text, byte-identical to root LICENSE

Running diff LICENSE tools/vscode-ext/LICENSE produces no output — the files are identical. The SCA-tooling goal of the PR is achieved consistently across all artifacts.


Commits

Commit 8d58fb6 (Peter Amiri) — missing DCO trailer

No Signed-off-by line is present in the original commit. Per CONTRIBUTING.md and CLAUDE.md, the DCO GitHub App is a required status check on every PR and will block merge when the trailer is absent. The Co-Authored-By line does not substitute for Signed-off-by. Peter needs to amend this commit with git commit --amend -s and force-push (or add a separate fixup commit appending the trailer) before merge.

The bot follow-up commit (3acb9f8b8) correctly carries its own Signed-off-by: claude[bot], but that covers only that commit — not the original.

Commit 3acb9f8 subject line: (round 1) suffix

Subject: chore: replace vscode-ext LICENSE with Apache-2.0 text to match package.json (round 1)

This is not a commitlint violation (valid type, 79-char subject, not ALL-CAPS). However the (round 1) qualifier is informal and will look odd in the permanent git log. Worth squashing this commit into the original before merge, or at minimum dropping the (round 1) from the subject.


Docs

No .ai/wheels/ updates are required — this change touches only JS/JSON tooling metadata, not framework behavior or conventions. No CHANGELOG entry is needed; this is internal metadata cleanup, not a user-facing feature or fix.

@wheels-bot

wheels-bot Bot commented May 12, 2026

Copy link
Copy Markdown
Contributor

Wheels Bot — Reviewer B (round 1)

A's review is accurate. The code is clean on the current SHA, A's verdict is appropriate, and both remaining items A identified are correctly described. Aligned on approve — no further bot action is warranted.

Sycophancy

None detected. A issued COMMENTED (not APPROVED), cited evidence for every finding, and did not hand-wave past the DCO gap.

False positives

None detected.

  • LICENSE mismatch resolved: Confirmed in the diff. tools/vscode-ext/LICENSE is now 201-line Apache-2.0 text replacing the former MIT license. The PR diff is consistent with A's claim that diff LICENSE tools/vscode-ext/LICENSE produces no output.
  • DCO missing on 8d58fb6da: Confirmed via git log. The commit body ends with Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> and no Signed-off-by: trailer. A's characterization is accurate.
  • (round 1) suffix in commit subject: Confirmed — subject is chore: replace vscode-ext LICENSE with Apache-2.0 text to match package.json (round 1). Not a commitlint violation, but informal. A is right to flag it as cosmetic.

Missed issues

None detected. The diff is 11 JSON files plus the LICENSE replacement — no CFML, no tests, no behavioral changes. One minor observation A could have added: the PR body's test plan still reads "Diff is exactly 11 files changed, 11 insertions(+), 2 deletions(-)" which is now stale (the bot's follow-up commit adds the LICENSE rewrite). This is a description-only discrepancy, not a code issue, and does not affect the verdict.

Verdict alignment

A's COMMENTED is consistent with the findings. Code correctness is fully resolved; only a process gate (DCO) and a cosmetic commit-message item remain. APPROVE would have been wrong while the DCO gap exists. CHANGES_REQUESTED would have been wrong because the bot already documented in the address-review comment that it cannot amend the original commit without rewriting shared branch history (rails-forbidden). COMMENTED is the correct signal: the code is ready, a human must act.

Convergence

Fully aligned. The code is review-clean on SHA 3acb9f8b. The two remaining items both require the original commit author (Peter) rather than another bot address-review cycle:

  1. DCO: Peter needs to git commit --amend -s on 8d58fb6da and force-push, or the maintainer can enable the DCO app's allowlist for this PR. Address-review already attempted this and documented it cannot do so.
  2. Commit squash / (round 1) removal: Cosmetic; Peter or a maintainer can squash before merge.

Re-triggering address-review would produce another no-op cycle. Converging on approve.

@bpamiri
bpamiri merged commit 4721ec3 into develop May 12, 2026
14 checks passed
@bpamiri
bpamiri deleted the peter/issue-2574-standardize-license-metadata branch May 12, 2026 01:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

chore: standardize license metadata across package.json files and add SPDX headers

1 participant