From cc18fe5cf483ccdf084d805257f8b8497737c422 Mon Sep 17 00:00:00 2001 From: yujiezhang-ops Date: Wed, 5 Aug 2026 11:44:48 +0800 Subject: [PATCH 1/2] fix: ship complete third-party license bundle Generate a target-aware Go and frontend dependency inventory, track full license texts, verify built binaries against it, and include the compliance bundle in every release artifact.\n\nRefs #24 --- .github/workflows/build-artifacts.yml | 37 ++ .github/workflows/ci.yml | 31 ++ NOTICE | 27 +- docs/distribution-compliance-policy.md | 12 +- scripts/generate_third_party_licenses.py | 343 ++++++++++++++++++ scripts/test_generate_third_party_licenses.py | 86 +++++ third_party/THIRD_PARTY_NOTICES.md | 25 ++ .../go/github.com_adrg_xdg@v0.5.3/LICENSE | 21 ++ .../github.com_go-ole_go-ole@v1.3.0/LICENSE | 21 ++ .../LICENSE | 22 ++ .../LICENSE | 21 ++ .../go/golang.org_x_sys@v0.47.0/LICENSE | 27 ++ third_party/licenses/npm/cookie@1.0.1/LICENSE | 23 ++ .../licenses/npm/lucide-react@1.25.0/LICENSE | 43 +++ .../licenses/npm/react-dom@19.2.8/LICENSE | 21 ++ .../npm/react-router-dom@7.18.1/LICENSE.md | 23 ++ .../npm/react-router@7.18.1/LICENSE.md | 23 ++ third_party/licenses/npm/react@19.2.8/LICENSE | 21 ++ .../licenses/npm/scheduler@0.27.0/LICENSE | 21 ++ .../npm/set-cookie-parser@2.6.0/LICENSE | 21 ++ .../wailsio_runtime@3.0.0-alpha2.117/LICENSE | 21 ++ third_party/manifest.json | 185 ++++++++++ 22 files changed, 1050 insertions(+), 25 deletions(-) create mode 100755 scripts/generate_third_party_licenses.py create mode 100644 scripts/test_generate_third_party_licenses.py create mode 100644 third_party/THIRD_PARTY_NOTICES.md create mode 100644 third_party/licenses/go/github.com_adrg_xdg@v0.5.3/LICENSE create mode 100644 third_party/licenses/go/github.com_go-ole_go-ole@v1.3.0/LICENSE create mode 100644 third_party/licenses/go/github.com_pelletier_go-toml_v2@v2.4.3/LICENSE create mode 100644 third_party/licenses/go/github.com_wailsapp_wails_v3@v3.0.0-beta.3/LICENSE create mode 100644 third_party/licenses/go/golang.org_x_sys@v0.47.0/LICENSE create mode 100644 third_party/licenses/npm/cookie@1.0.1/LICENSE create mode 100644 third_party/licenses/npm/lucide-react@1.25.0/LICENSE create mode 100644 third_party/licenses/npm/react-dom@19.2.8/LICENSE create mode 100644 third_party/licenses/npm/react-router-dom@7.18.1/LICENSE.md create mode 100644 third_party/licenses/npm/react-router@7.18.1/LICENSE.md create mode 100644 third_party/licenses/npm/react@19.2.8/LICENSE create mode 100644 third_party/licenses/npm/scheduler@0.27.0/LICENSE create mode 100644 third_party/licenses/npm/set-cookie-parser@2.6.0/LICENSE create mode 100644 third_party/licenses/npm/wailsio_runtime@3.0.0-alpha2.117/LICENSE create mode 100644 third_party/manifest.json diff --git a/.github/workflows/build-artifacts.yml b/.github/workflows/build-artifacts.yml index 4b0a518b..64b7bb09 100644 --- a/.github/workflows/build-artifacts.yml +++ b/.github/workflows/build-artifacts.yml @@ -104,6 +104,14 @@ jobs: go build -tags wails,production -trimpath -buildvcs=false -ldflags="${{ matrix.target.desktop_ldflags }} $version_ldflag" -o "bin/oneagent-desktop${{ matrix.target.suffix }}" ./cmd/oneagent-desktop go build -trimpath -buildvcs=false -ldflags="-w -s $version_ldflag" -o "bin/oneagent${{ matrix.target.suffix }}" ./cmd/oneagent + - name: Verify production Go dependency inventory + shell: bash + run: | + python3 scripts/generate_third_party_licenses.py \ + --verify-platform "${{ matrix.target.platform }}-${{ matrix.arch }}" \ + --verify-go-binary "bin/oneagent-desktop${{ matrix.target.suffix }}" \ + --verify-go-binary "bin/oneagent${{ matrix.target.suffix }}" + - name: Package macOS app if: matrix.target.platform == 'macos' shell: bash @@ -118,6 +126,35 @@ jobs: codesign --force --deep --sign - "bin/OneAgent.app" rm "bin/oneagent-desktop" + - name: Add license material to artifact + shell: bash + run: | + cp LICENSE NOTICE third_party/THIRD_PARTY_NOTICES.md bin/ + cp -R third_party/licenses bin/licenses + if [[ "${{ matrix.target.platform }}" == "macos" ]]; then + compliance="bin/OneAgent.app/Contents/Resources/compliance" + mkdir -p "$compliance" + cp LICENSE NOTICE third_party/THIRD_PARTY_NOTICES.md "$compliance/" + cp -R third_party/licenses "$compliance/licenses" + fi + + - name: Verify artifact license material + shell: bash + run: | + test -f bin/LICENSE + test -f bin/NOTICE + test -f bin/THIRD_PARTY_NOTICES.md + test -f bin/licenses/go/github.com_go-ole_go-ole@v1.3.0/LICENSE + test -f bin/licenses/npm/react-router@7.18.1/LICENSE.md + test -f bin/licenses/npm/scheduler@0.27.0/LICENSE + test -f bin/licenses/npm/cookie@1.0.1/LICENSE + test -f bin/licenses/npm/set-cookie-parser@2.6.0/LICENSE + if [[ "${{ matrix.target.platform }}" == "macos" ]]; then + test -f bin/OneAgent.app/Contents/Resources/compliance/LICENSE + test -f bin/OneAgent.app/Contents/Resources/compliance/NOTICE + test -f bin/OneAgent.app/Contents/Resources/compliance/THIRD_PARTY_NOTICES.md + fi + - name: Upload artifact uses: actions/upload-artifact@v7 with: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 11d9ca9d..38f54cde 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,6 +35,37 @@ jobs: with: build-tags: wails,production + compliance: + name: Release compliance + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + + - uses: actions/setup-go@v7 + with: + go-version-file: go.mod + cache-dependency-path: go.sum + + - uses: pnpm/action-setup@v6 + with: + version: 11.17.0 + + - uses: actions/setup-node@v7 + with: + node-version: 26 + cache: pnpm + cache-dependency-path: frontend/pnpm-lock.yaml + + - name: Install frontend dependencies + working-directory: frontend + run: pnpm install --frozen-lockfile + + - name: Test license generator + run: python3 -m unittest scripts/test_generate_third_party_licenses.py + + - name: Verify third-party license bundle + run: python3 scripts/generate_third_party_licenses.py --check + docs: name: Docs runs-on: ubuntu-latest diff --git a/NOTICE b/NOTICE index c59c6ac9..d2c78f40 100644 --- a/NOTICE +++ b/NOTICE @@ -9,25 +9,14 @@ Licensed under the Apache License, Version 2.0. See LICENSE for the full text. Third-party software redistributed in OneAgent binaries ================================================================================ -The following components are compiled into, or bundled with, the OneAgent -desktop application and CLI. Their license texts are reproduced in the -directories named below, inside each dependency's own distribution. - -Go modules (linked into the binary) - - github.com/wailsapp/wails/v3 v3.0.0-beta.3 MIT - github.com/pelletier/go-toml/v2 v2.4.3 MIT - github.com/adrg/xdg v0.5.3 MIT - github.com/mattn/go-isatty v0.0.24 MIT - golang.org/x/sys v0.47.0 BSD-3-Clause - -JavaScript packages (bundled into the embedded frontend) - - react 19.2.8 MIT - react-dom 19.2.8 MIT - react-router-dom 7.18.1 MIT - lucide-react 1.25.0 ISC - @wailsio/runtime 3.0.0-alpha2.117 MIT +The target-specific dependency inventory is generated from the production Go +build graph and the frozen frontend production dependency graph. The complete +inventory is distributed as THIRD_PARTY_NOTICES.md, with the corresponding +license and notice texts under licenses/ in every binary artifact. + +The tracked source of that generated material is third_party/. Run +`scripts/generate_third_party_licenses.py --check` to verify that it still +matches go.mod, go.sum, frontend/package.json and frontend/pnpm-lock.yaml. ================================================================================ Third-party software downloaded at runtime, not redistributed diff --git a/docs/distribution-compliance-policy.md b/docs/distribution-compliance-policy.md index 0d19fa89..99312617 100644 --- a/docs/distribution-compliance-policy.md +++ b/docs/distribution-compliance-policy.md @@ -42,12 +42,12 @@ Every public release contains at least: - The OneAgent binary archive. - The SHA-256 matching that archive. - The version, the build time, the target environments, and the release status. -- The third-party licence inventory. This is currently carried by [NOTICE](../NOTICE) at - the repository root; it also separates the components redistributed inside the package - from the components downloaded at run time and no longer redistributed (Node.js, uv, - Agent packages). `cmd/oneagent-release`, which generated this inventory, was removed - in `23805b0`, so `NOTICE` is now a hand-maintained source of truth and must be updated - whenever a bundled dependency or an in-app third-party marking is added. +- The third-party licence inventory and full licence texts. The generated source is + [third_party/THIRD_PARTY_NOTICES.md](../third_party/THIRD_PARTY_NOTICES.md), with + dependency texts under `third_party/licenses/`; every binary artifact carries the same + files at its root. `scripts/generate_third_party_licenses.py --check` derives the + inventory from the production Go targets and frozen frontend dependency graph, and CI + blocks a stale or incomplete bundle. - The Agent version pinning manifest and the official sources. - Release notes, known issues, and a withdrawal contact. diff --git a/scripts/generate_third_party_licenses.py b/scripts/generate_third_party_licenses.py new file mode 100755 index 00000000..d5826ef1 --- /dev/null +++ b/scripts/generate_third_party_licenses.py @@ -0,0 +1,343 @@ +#!/usr/bin/env python3 +"""Generate and verify the license material shipped in OneAgent artifacts. + +The inventory is derived from the same production build tags and frozen pnpm +installation used by release builds. Generated output is tracked so a release +does not depend on registry or module-cache availability after compilation. +""" + +from __future__ import annotations + +import argparse +import dataclasses +import difflib +import json +import os +import re +import shutil +import subprocess +import sys +import tempfile +from collections.abc import Iterable, Iterator, Sequence +from pathlib import Path +from typing import Any + +ROOT = Path(__file__).resolve().parent.parent +DEFAULT_OUTPUT = ROOT / "third_party" +FRONTEND = ROOT / "frontend" +TARGETS = ( + ("macos-x64", "darwin", "amd64", "1"), + ("macos-arm64", "darwin", "arm64", "1"), + ("windows-x64", "windows", "amd64", "0"), + ("windows-arm64", "windows", "arm64", "0"), +) +GO_LICENSES = { + "github.com/adrg/xdg": "MIT", + "github.com/go-ole/go-ole": "MIT", + "github.com/pelletier/go-toml/v2": "MIT", + "github.com/wailsapp/wails/v3": "MIT", + "golang.org/x/sys": "BSD-3-Clause", +} +LICENSE_PREFIXES = ("license", "licence", "copying", "notice", "copyright") + + +@dataclasses.dataclass(frozen=True, order=True) +class Dependency: + ecosystem: str + name: str + version: str + license: str + platforms: tuple[str, ...] + license_files: tuple[str, ...] + + def as_json(self) -> dict[str, Any]: + return dataclasses.asdict(self) + + +def parse_json_stream(text: str) -> Iterator[dict[str, Any]]: + """Parse the concatenated JSON objects emitted by `go list -json`.""" + decoder = json.JSONDecoder() + index = 0 + while index < len(text): + while index < len(text) and text[index].isspace(): + index += 1 + if index >= len(text): + return + value, index = decoder.raw_decode(text, index) + if not isinstance(value, dict): + raise ValueError("expected a JSON object in go list output") + yield value + + +def run(argv: Sequence[str], *, cwd: Path = ROOT, env: dict[str, str] | None = None) -> str: + result = subprocess.run( + argv, + cwd=cwd, + env=env, + check=True, + capture_output=True, + text=True, + ) + return result.stdout + + +def safe_component(value: str) -> str: + return re.sub(r"[^A-Za-z0-9._+-]+", "_", value).strip("_") + + +def find_license_files(directory: Path) -> list[Path]: + files = [ + path + for path in directory.iterdir() + if path.is_file() and path.name.casefold().startswith(LICENSE_PREFIXES) + ] + return sorted(files, key=lambda path: path.name.casefold()) + + +def copy_license_files( + source_directory: Path, + destination_directory: Path, + relative_root: Path, +) -> tuple[str, ...]: + sources = find_license_files(source_directory) + if not sources: + raise RuntimeError(f"no license or notice file found in {source_directory}") + destination_directory.mkdir(parents=True, exist_ok=True) + copied: list[str] = [] + for source in sources: + destination = destination_directory / source.name + text = source.read_text(encoding="utf-8") + normalized = "\n".join(line.rstrip() for line in text.splitlines()).rstrip() + "\n" + destination.write_text(normalized, encoding="utf-8") + copied.append(destination.relative_to(relative_root).as_posix()) + return tuple(copied) + + +def collect_go_module_platforms() -> dict[tuple[str, str], set[str]]: + modules: dict[tuple[str, str], set[str]] = {} + for platform, goos, goarch, cgo in TARGETS: + env = os.environ.copy() + env.update({"GOOS": goos, "GOARCH": goarch, "CGO_ENABLED": cgo}) + output = run( + [ + "go", + "list", + "-tags", + "wails,production", + "-deps", + "-json", + "./cmd/oneagent-desktop", + "./cmd/oneagent", + ], + env=env, + ) + for package in parse_json_stream(output): + module = package.get("Module") + if not isinstance(module, dict) or module.get("Main"): + continue + path = str(module.get("Path", "")).strip() + version = str(module.get("Version", "")).strip() + if path and version: + modules.setdefault((path, version), set()).add(platform) + return modules + + +def module_directory(path: str, version: str) -> Path: + output = run(["go", "mod", "download", "-json", f"{path}@{version}"]) + metadata = json.loads(output) + directory = metadata.get("Dir") + if not directory: + raise RuntimeError(f"go mod download did not return a directory for {path}@{version}") + return Path(directory) + + +def collect_go_dependencies(output: Path) -> list[Dependency]: + dependencies: list[Dependency] = [] + for (name, version), platforms in sorted(collect_go_module_platforms().items()): + license_name = GO_LICENSES.get(name) + if license_name is None: + raise RuntimeError( + f"Go module {name}@{version} has no reviewed license classification; " + "add it to GO_LICENSES after review" + ) + destination = output / "licenses" / "go" / f"{safe_component(name)}@{safe_component(version)}" + copied = copy_license_files(module_directory(name, version), destination, output) + dependencies.append( + Dependency( + ecosystem="go", + name=name, + version=version, + license=license_name, + platforms=tuple(sorted(platforms)), + license_files=copied, + ) + ) + return dependencies + + +def pnpm_license_inventory() -> dict[str, list[dict[str, Any]]]: + return json.loads(run(["pnpm", "licenses", "list", "--prod", "--json"], cwd=FRONTEND)) + + +def npm_license_source(name: str, package_path: Path) -> Path: + if find_license_files(package_path): + return package_path + if name == "@wailsio/runtime": + return module_directory("github.com/wailsapp/wails/v3", "v3.0.0-beta.3") + raise RuntimeError(f"npm package {name} has no bundled license file in {package_path}") + + +def collect_npm_dependencies(output: Path) -> list[Dependency]: + dependencies: list[Dependency] = [] + inventory = pnpm_license_inventory() + for license_name, packages in sorted(inventory.items()): + for package in sorted(packages, key=lambda value: str(value.get("name", ""))): + name = str(package.get("name", "")).strip() + versions = package.get("versions") or [] + paths = package.get("paths") or [] + if not name or len(versions) != 1 or not paths: + raise RuntimeError(f"unexpected pnpm license entry: {package!r}") + version = str(versions[0]) + package_path = Path(str(paths[0])) + source = npm_license_source(name, package_path) + destination = output / "licenses" / "npm" / f"{safe_component(name)}@{safe_component(version)}" + copied = copy_license_files(source, destination, output) + dependencies.append( + Dependency( + ecosystem="npm", + name=name, + version=version, + license=license_name, + platforms=("frontend",), + license_files=copied, + ) + ) + return dependencies + + +def render_notice(dependencies: Iterable[Dependency]) -> str: + rows = sorted(dependencies) + lines = [ + "# OneAgent Third-Party Notices", + "", + "This file is generated by `scripts/generate_third_party_licenses.py`.", + "Do not edit it or the adjacent license copies by hand.", + "", + "The packages below are linked into a production Go binary or bundled into", + "the embedded frontend. Full license and notice texts are included under", + "`licenses/` and are shipped with every binary artifact.", + "", + "| Ecosystem | Package | Version | Targets | License | License files |", + "| --- | --- | --- | --- | --- | --- |", + ] + for dependency in rows: + files = "
".join(f"`{path}`" for path in dependency.license_files) + platforms = ", ".join(dependency.platforms) + lines.append( + f"| {dependency.ecosystem} | `{dependency.name}` | `{dependency.version}` | " + f"{platforms} | {dependency.license} | {files} |" + ) + lines.append("") + return "\n".join(lines) + + +def generate(output: Path) -> None: + if output.exists(): + shutil.rmtree(output) + output.mkdir(parents=True) + dependencies = collect_go_dependencies(output) + collect_npm_dependencies(output) + dependencies.sort() + (output / "THIRD_PARTY_NOTICES.md").write_text(render_notice(dependencies), encoding="utf-8") + manifest = { + "schema_version": 1, + "generated_by": "scripts/generate_third_party_licenses.py", + "dependencies": [dependency.as_json() for dependency in dependencies], + } + (output / "manifest.json").write_text( + json.dumps(manifest, indent=2, sort_keys=True) + "\n", + encoding="utf-8", + ) + + +def tree_files(root: Path) -> dict[str, bytes]: + if not root.exists(): + return {} + return { + path.relative_to(root).as_posix(): path.read_bytes() + for path in sorted(root.rglob("*")) + if path.is_file() + } + + +def compare_trees(actual: Path, expected: Path) -> list[str]: + actual_files = tree_files(actual) + expected_files = tree_files(expected) + differences: list[str] = [] + for name in sorted(expected_files.keys() - actual_files.keys()): + differences.append(f"missing: {name}") + for name in sorted(actual_files.keys() - expected_files.keys()): + differences.append(f"unexpected: {name}") + for name in sorted(actual_files.keys() & expected_files.keys()): + if actual_files[name] != expected_files[name]: + differences.append(f"changed: {name}") + if name.endswith((".md", ".json", ".txt", "LICENSE", "NOTICE")): + before = actual_files[name].decode("utf-8", errors="replace").splitlines() + after = expected_files[name].decode("utf-8", errors="replace").splitlines() + differences.extend( + difflib.unified_diff(before, after, fromfile=f"tracked/{name}", tofile=f"generated/{name}", lineterm="") + ) + return differences + + +def verify_binary(binary: Path, platform: str, manifest_path: Path) -> None: + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + allowed = { + (entry["name"], entry["version"]) + for entry in manifest["dependencies"] + if entry["ecosystem"] == "go" and platform in entry["platforms"] + } + actual: set[tuple[str, str]] = set() + for line in run(["go", "version", "-m", str(binary)]).splitlines(): + fields = line.split("\t") + if len(fields) >= 4 and fields[1] == "dep": + actual.add((fields[2], fields[3])) + missing = sorted(actual - allowed) + if missing: + formatted = ", ".join(f"{name}@{version}" for name, version in missing) + raise RuntimeError(f"{binary} contains unreviewed Go modules for {platform}: {formatted}") + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--output", type=Path, default=DEFAULT_OUTPUT) + parser.add_argument("--check", action="store_true", help="fail if tracked output differs") + parser.add_argument("--verify-go-binary", type=Path, action="append", default=[]) + parser.add_argument("--verify-platform") + return parser.parse_args() + + +def main() -> int: + args = parse_args() + if args.verify_go_binary: + if not args.verify_platform: + raise SystemExit("--verify-platform is required with --verify-go-binary") + for binary in args.verify_go_binary: + verify_binary(binary, args.verify_platform, args.output / "manifest.json") + return 0 + if args.check: + with tempfile.TemporaryDirectory(prefix="oneagent-licenses-") as directory: + generated = Path(directory) / "third_party" + generate(generated) + differences = compare_trees(args.output, generated) + if differences: + print("third-party license bundle is stale; regenerate with:", file=sys.stderr) + print(" python3 scripts/generate_third_party_licenses.py", file=sys.stderr) + print("\n".join(differences), file=sys.stderr) + return 1 + return 0 + generate(args.output) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/test_generate_third_party_licenses.py b/scripts/test_generate_third_party_licenses.py new file mode 100644 index 00000000..d4913688 --- /dev/null +++ b/scripts/test_generate_third_party_licenses.py @@ -0,0 +1,86 @@ +from __future__ import annotations + +import json +import tempfile +import unittest +from pathlib import Path + +from scripts.generate_third_party_licenses import ( + Dependency, + compare_trees, + copy_license_files, + parse_json_stream, + render_notice, +) + + +class ParseJSONStreamTests(unittest.TestCase): + def test_parses_concatenated_go_list_objects(self) -> None: + payload = '{"ImportPath":"one","Module":{"Path":"example.com/a","Version":"v1.0.0"}}\n' \ + '{"ImportPath":"two","Module":{"Path":"example.com/b","Version":"v2.0.0"}}\n' + + values = list(parse_json_stream(payload)) + + self.assertEqual([value["ImportPath"] for value in values], ["one", "two"]) + + +class LicenseCopyTests(unittest.TestCase): + def test_normalizes_line_endings_and_trailing_whitespace(self) -> None: + with tempfile.TemporaryDirectory() as source_dir, tempfile.TemporaryDirectory() as output_dir: + source = Path(source_dir) + output = Path(output_dir) + (source / "LICENSE").write_bytes(b"Line one \r\nLine two\r\n\r\n") + + copied = copy_license_files(source, output / "licenses" / "pkg", output) + + self.assertEqual(copied, ("licenses/pkg/LICENSE",)) + self.assertEqual((output / "licenses/pkg/LICENSE").read_bytes(), b"Line one\nLine two\n") + + +class NoticeRenderingTests(unittest.TestCase): + def test_renders_target_platforms_and_license_paths_deterministically(self) -> None: + dependencies = [ + Dependency( + ecosystem="go", + name="example.com/windows-only", + version="v1.2.3", + license="MIT", + platforms=("windows",), + license_files=("licenses/go/example.com_windows-only@v1.2.3/LICENSE",), + ), + Dependency( + ecosystem="npm", + name="react", + version="19.2.8", + license="MIT", + platforms=("frontend",), + license_files=("licenses/npm/react@19.2.8/LICENSE",), + ), + ] + + notice = render_notice(dependencies) + + self.assertIn("`example.com/windows-only` | `v1.2.3` | windows | MIT", notice) + self.assertIn("`react` | `19.2.8` | frontend | MIT", notice) + self.assertLess(notice.index("example.com/windows-only"), notice.index("react")) + + +class TreeComparisonTests(unittest.TestCase): + def test_reports_missing_and_changed_generated_files(self) -> None: + with tempfile.TemporaryDirectory() as actual_dir, tempfile.TemporaryDirectory() as expected_dir: + actual = Path(actual_dir) + expected = Path(expected_dir) + (actual / "same.txt").write_text("same", encoding="utf-8") + (expected / "same.txt").write_text("same", encoding="utf-8") + (actual / "changed.txt").write_text("old", encoding="utf-8") + (expected / "changed.txt").write_text("new", encoding="utf-8") + (expected / "missing.txt").write_text("missing", encoding="utf-8") + + differences = compare_trees(actual, expected) + + self.assertIn("changed: changed.txt", differences) + self.assertIn("missing: missing.txt", differences) + + +if __name__ == "__main__": + unittest.main() diff --git a/third_party/THIRD_PARTY_NOTICES.md b/third_party/THIRD_PARTY_NOTICES.md new file mode 100644 index 00000000..8b92327d --- /dev/null +++ b/third_party/THIRD_PARTY_NOTICES.md @@ -0,0 +1,25 @@ +# OneAgent Third-Party Notices + +This file is generated by `scripts/generate_third_party_licenses.py`. +Do not edit it or the adjacent license copies by hand. + +The packages below are linked into a production Go binary or bundled into +the embedded frontend. Full license and notice texts are included under +`licenses/` and are shipped with every binary artifact. + +| Ecosystem | Package | Version | Targets | License | License files | +| --- | --- | --- | --- | --- | --- | +| go | `github.com/adrg/xdg` | `v0.5.3` | macos-arm64, macos-x64, windows-arm64, windows-x64 | MIT | `licenses/go/github.com_adrg_xdg@v0.5.3/LICENSE` | +| go | `github.com/go-ole/go-ole` | `v1.3.0` | windows-arm64, windows-x64 | MIT | `licenses/go/github.com_go-ole_go-ole@v1.3.0/LICENSE` | +| go | `github.com/pelletier/go-toml/v2` | `v2.4.3` | macos-arm64, macos-x64, windows-arm64, windows-x64 | MIT | `licenses/go/github.com_pelletier_go-toml_v2@v2.4.3/LICENSE` | +| go | `github.com/wailsapp/wails/v3` | `v3.0.0-beta.3` | macos-arm64, macos-x64, windows-arm64, windows-x64 | MIT | `licenses/go/github.com_wailsapp_wails_v3@v3.0.0-beta.3/LICENSE` | +| go | `golang.org/x/sys` | `v0.47.0` | windows-arm64, windows-x64 | BSD-3-Clause | `licenses/go/golang.org_x_sys@v0.47.0/LICENSE` | +| npm | `@wailsio/runtime` | `3.0.0-alpha2.117` | frontend | MIT | `licenses/npm/wailsio_runtime@3.0.0-alpha2.117/LICENSE` | +| npm | `cookie` | `1.0.1` | frontend | MIT | `licenses/npm/cookie@1.0.1/LICENSE` | +| npm | `lucide-react` | `1.25.0` | frontend | ISC | `licenses/npm/lucide-react@1.25.0/LICENSE` | +| npm | `react` | `19.2.8` | frontend | MIT | `licenses/npm/react@19.2.8/LICENSE` | +| npm | `react-dom` | `19.2.8` | frontend | MIT | `licenses/npm/react-dom@19.2.8/LICENSE` | +| npm | `react-router` | `7.18.1` | frontend | MIT | `licenses/npm/react-router@7.18.1/LICENSE.md` | +| npm | `react-router-dom` | `7.18.1` | frontend | MIT | `licenses/npm/react-router-dom@7.18.1/LICENSE.md` | +| npm | `scheduler` | `0.27.0` | frontend | MIT | `licenses/npm/scheduler@0.27.0/LICENSE` | +| npm | `set-cookie-parser` | `2.6.0` | frontend | MIT | `licenses/npm/set-cookie-parser@2.6.0/LICENSE` | diff --git a/third_party/licenses/go/github.com_adrg_xdg@v0.5.3/LICENSE b/third_party/licenses/go/github.com_adrg_xdg@v0.5.3/LICENSE new file mode 100644 index 00000000..7307e1b7 --- /dev/null +++ b/third_party/licenses/go/github.com_adrg_xdg@v0.5.3/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Adrian-George Bostan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/third_party/licenses/go/github.com_go-ole_go-ole@v1.3.0/LICENSE b/third_party/licenses/go/github.com_go-ole_go-ole@v1.3.0/LICENSE new file mode 100644 index 00000000..623ec06f --- /dev/null +++ b/third_party/licenses/go/github.com_go-ole_go-ole@v1.3.0/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright © 2013-2017 Yasuhiro Matsumoto, + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the “Software”), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/licenses/go/github.com_pelletier_go-toml_v2@v2.4.3/LICENSE b/third_party/licenses/go/github.com_pelletier_go-toml_v2@v2.4.3/LICENSE new file mode 100644 index 00000000..991e2ae9 --- /dev/null +++ b/third_party/licenses/go/github.com_pelletier_go-toml_v2@v2.4.3/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +go-toml v2 +Copyright (c) 2021 - 2023 Thomas Pelletier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/licenses/go/github.com_wailsapp_wails_v3@v3.0.0-beta.3/LICENSE b/third_party/licenses/go/github.com_wailsapp_wails_v3@v3.0.0-beta.3/LICENSE new file mode 100644 index 00000000..28f2a368 --- /dev/null +++ b/third_party/licenses/go/github.com_wailsapp_wails_v3@v3.0.0-beta.3/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018-Present Lea Anthony + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/licenses/go/golang.org_x_sys@v0.47.0/LICENSE b/third_party/licenses/go/golang.org_x_sys@v0.47.0/LICENSE new file mode 100644 index 00000000..2a7cf70d --- /dev/null +++ b/third_party/licenses/go/golang.org_x_sys@v0.47.0/LICENSE @@ -0,0 +1,27 @@ +Copyright 2009 The Go Authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google LLC nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/third_party/licenses/npm/cookie@1.0.1/LICENSE b/third_party/licenses/npm/cookie@1.0.1/LICENSE new file mode 100644 index 00000000..f92d7211 --- /dev/null +++ b/third_party/licenses/npm/cookie@1.0.1/LICENSE @@ -0,0 +1,23 @@ +(The MIT License) + +Copyright (c) 2012-2014 Roman Shtylman +Copyright (c) 2015 Douglas Christopher Wilson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/third_party/licenses/npm/lucide-react@1.25.0/LICENSE b/third_party/licenses/npm/lucide-react@1.25.0/LICENSE new file mode 100644 index 00000000..718bb3f0 --- /dev/null +++ b/third_party/licenses/npm/lucide-react@1.25.0/LICENSE @@ -0,0 +1,43 @@ +ISC License + +Copyright (c) 2026 Lucide Icons and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--- + +The following Lucide icons are derived from the Feather project: + +airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + +The MIT License (MIT) (for the icons listed above) + +Copyright (c) 2013-present Cole Bemis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/licenses/npm/react-dom@19.2.8/LICENSE b/third_party/licenses/npm/react-dom@19.2.8/LICENSE new file mode 100644 index 00000000..b93be905 --- /dev/null +++ b/third_party/licenses/npm/react-dom@19.2.8/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Meta Platforms, Inc. and affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/licenses/npm/react-router-dom@7.18.1/LICENSE.md b/third_party/licenses/npm/react-router-dom@7.18.1/LICENSE.md new file mode 100644 index 00000000..7d0a32c3 --- /dev/null +++ b/third_party/licenses/npm/react-router-dom@7.18.1/LICENSE.md @@ -0,0 +1,23 @@ +MIT License + +Copyright (c) React Training LLC 2015-2019 +Copyright (c) Remix Software Inc. 2020-2021 +Copyright (c) Shopify Inc. 2022-2023 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/licenses/npm/react-router@7.18.1/LICENSE.md b/third_party/licenses/npm/react-router@7.18.1/LICENSE.md new file mode 100644 index 00000000..7d0a32c3 --- /dev/null +++ b/third_party/licenses/npm/react-router@7.18.1/LICENSE.md @@ -0,0 +1,23 @@ +MIT License + +Copyright (c) React Training LLC 2015-2019 +Copyright (c) Remix Software Inc. 2020-2021 +Copyright (c) Shopify Inc. 2022-2023 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/licenses/npm/react@19.2.8/LICENSE b/third_party/licenses/npm/react@19.2.8/LICENSE new file mode 100644 index 00000000..b93be905 --- /dev/null +++ b/third_party/licenses/npm/react@19.2.8/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Meta Platforms, Inc. and affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/licenses/npm/scheduler@0.27.0/LICENSE b/third_party/licenses/npm/scheduler@0.27.0/LICENSE new file mode 100644 index 00000000..b93be905 --- /dev/null +++ b/third_party/licenses/npm/scheduler@0.27.0/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Meta Platforms, Inc. and affiliates. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/licenses/npm/set-cookie-parser@2.6.0/LICENSE b/third_party/licenses/npm/set-cookie-parser@2.6.0/LICENSE new file mode 100644 index 00000000..46f7017b --- /dev/null +++ b/third_party/licenses/npm/set-cookie-parser@2.6.0/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Nathan Friedly (http://nfriedly.com/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/third_party/licenses/npm/wailsio_runtime@3.0.0-alpha2.117/LICENSE b/third_party/licenses/npm/wailsio_runtime@3.0.0-alpha2.117/LICENSE new file mode 100644 index 00000000..28f2a368 --- /dev/null +++ b/third_party/licenses/npm/wailsio_runtime@3.0.0-alpha2.117/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018-Present Lea Anthony + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/manifest.json b/third_party/manifest.json new file mode 100644 index 00000000..6564b58d --- /dev/null +++ b/third_party/manifest.json @@ -0,0 +1,185 @@ +{ + "dependencies": [ + { + "ecosystem": "go", + "license": "MIT", + "license_files": [ + "licenses/go/github.com_adrg_xdg@v0.5.3/LICENSE" + ], + "name": "github.com/adrg/xdg", + "platforms": [ + "macos-arm64", + "macos-x64", + "windows-arm64", + "windows-x64" + ], + "version": "v0.5.3" + }, + { + "ecosystem": "go", + "license": "MIT", + "license_files": [ + "licenses/go/github.com_go-ole_go-ole@v1.3.0/LICENSE" + ], + "name": "github.com/go-ole/go-ole", + "platforms": [ + "windows-arm64", + "windows-x64" + ], + "version": "v1.3.0" + }, + { + "ecosystem": "go", + "license": "MIT", + "license_files": [ + "licenses/go/github.com_pelletier_go-toml_v2@v2.4.3/LICENSE" + ], + "name": "github.com/pelletier/go-toml/v2", + "platforms": [ + "macos-arm64", + "macos-x64", + "windows-arm64", + "windows-x64" + ], + "version": "v2.4.3" + }, + { + "ecosystem": "go", + "license": "MIT", + "license_files": [ + "licenses/go/github.com_wailsapp_wails_v3@v3.0.0-beta.3/LICENSE" + ], + "name": "github.com/wailsapp/wails/v3", + "platforms": [ + "macos-arm64", + "macos-x64", + "windows-arm64", + "windows-x64" + ], + "version": "v3.0.0-beta.3" + }, + { + "ecosystem": "go", + "license": "BSD-3-Clause", + "license_files": [ + "licenses/go/golang.org_x_sys@v0.47.0/LICENSE" + ], + "name": "golang.org/x/sys", + "platforms": [ + "windows-arm64", + "windows-x64" + ], + "version": "v0.47.0" + }, + { + "ecosystem": "npm", + "license": "MIT", + "license_files": [ + "licenses/npm/wailsio_runtime@3.0.0-alpha2.117/LICENSE" + ], + "name": "@wailsio/runtime", + "platforms": [ + "frontend" + ], + "version": "3.0.0-alpha2.117" + }, + { + "ecosystem": "npm", + "license": "MIT", + "license_files": [ + "licenses/npm/cookie@1.0.1/LICENSE" + ], + "name": "cookie", + "platforms": [ + "frontend" + ], + "version": "1.0.1" + }, + { + "ecosystem": "npm", + "license": "ISC", + "license_files": [ + "licenses/npm/lucide-react@1.25.0/LICENSE" + ], + "name": "lucide-react", + "platforms": [ + "frontend" + ], + "version": "1.25.0" + }, + { + "ecosystem": "npm", + "license": "MIT", + "license_files": [ + "licenses/npm/react@19.2.8/LICENSE" + ], + "name": "react", + "platforms": [ + "frontend" + ], + "version": "19.2.8" + }, + { + "ecosystem": "npm", + "license": "MIT", + "license_files": [ + "licenses/npm/react-dom@19.2.8/LICENSE" + ], + "name": "react-dom", + "platforms": [ + "frontend" + ], + "version": "19.2.8" + }, + { + "ecosystem": "npm", + "license": "MIT", + "license_files": [ + "licenses/npm/react-router@7.18.1/LICENSE.md" + ], + "name": "react-router", + "platforms": [ + "frontend" + ], + "version": "7.18.1" + }, + { + "ecosystem": "npm", + "license": "MIT", + "license_files": [ + "licenses/npm/react-router-dom@7.18.1/LICENSE.md" + ], + "name": "react-router-dom", + "platforms": [ + "frontend" + ], + "version": "7.18.1" + }, + { + "ecosystem": "npm", + "license": "MIT", + "license_files": [ + "licenses/npm/scheduler@0.27.0/LICENSE" + ], + "name": "scheduler", + "platforms": [ + "frontend" + ], + "version": "0.27.0" + }, + { + "ecosystem": "npm", + "license": "MIT", + "license_files": [ + "licenses/npm/set-cookie-parser@2.6.0/LICENSE" + ], + "name": "set-cookie-parser", + "platforms": [ + "frontend" + ], + "version": "2.6.0" + } + ], + "generated_by": "scripts/generate_third_party_licenses.py", + "schema_version": 1 +} From 373be326aee99a0d0a39a8746ffba8acb77ee8db Mon Sep 17 00:00:00 2001 From: yujiezhang-ops Date: Wed, 5 Aug 2026 12:35:19 +0800 Subject: [PATCH 2/2] ci: keep staticcheck platform-neutral --- .github/workflows/ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 38f54cde..0b44483f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,9 +31,10 @@ jobs: # thing a plain run will not exercise. - run: go test -race ./... + # The Linux CI runner does not provide Wails' GTK/WebKitGTK native + # libraries. The default package graph still checks the portable Go code; + # target-specific release builds run in build-artifacts.yml. - uses: dominikh/staticcheck-action@v1.4.1 - with: - build-tags: wails,production compliance: name: Release compliance