From 230abe28071cc332e028d96d5a1d5b9af746f7f9 Mon Sep 17 00:00:00 2001 From: Mariuxdeangelo Date: Tue, 2 Jul 2024 22:25:10 +0200 Subject: [PATCH 1/2] Adding the SBOM everywhere wiki project to the SBOM-everywhere OpenSSF Repository Signed-off-by: Mariuxdeangelo --- .github/workflows/build-and-publish-page.yml | 23 +- .github/workflows/build-pull-request.yml | 27 +- SBOM-Catalog/package-lock.json | 30 +- SBOM-Catalog/vite.config.ts | 3 +- SBOM-wiki/.gitignore | 24 + SBOM-wiki/.vitepress/config.mts | 52 + SBOM-wiki/.vitepress/theme/index.js | 9 + SBOM-wiki/about-us.md | 120 ++ SBOM-wiki/basics.md | 5 + SBOM-wiki/catalog/index.md | 3 + SBOM-wiki/example-integrations.md | 5 + SBOM-wiki/faq.md | 5 + SBOM-wiki/getting-started.md | 26 + SBOM-wiki/glossery.md | 15 + SBOM-wiki/index.md | 61 + SBOM-wiki/package-lock.json | 1675 ++++++++++++++++++ SBOM-wiki/package.json | 12 + SBOM-wiki/public/thumbnail.webp | Bin 0 -> 69352 bytes SBOM-wiki/sbom-compliance.md | 28 + SBOM-wiki/sbom-naming.md | 48 + SBOM-wiki/sbom-types.md | 43 + SBOM-wiki/sbom-working-groups.md | 99 ++ 22 files changed, 2292 insertions(+), 21 deletions(-) create mode 100644 SBOM-wiki/.gitignore create mode 100644 SBOM-wiki/.vitepress/config.mts create mode 100644 SBOM-wiki/.vitepress/theme/index.js create mode 100644 SBOM-wiki/about-us.md create mode 100644 SBOM-wiki/basics.md create mode 100644 SBOM-wiki/catalog/index.md create mode 100644 SBOM-wiki/example-integrations.md create mode 100644 SBOM-wiki/faq.md create mode 100644 SBOM-wiki/getting-started.md create mode 100644 SBOM-wiki/glossery.md create mode 100644 SBOM-wiki/index.md create mode 100644 SBOM-wiki/package-lock.json create mode 100644 SBOM-wiki/package.json create mode 100644 SBOM-wiki/public/thumbnail.webp create mode 100644 SBOM-wiki/sbom-compliance.md create mode 100644 SBOM-wiki/sbom-naming.md create mode 100644 SBOM-wiki/sbom-types.md create mode 100644 SBOM-wiki/sbom-working-groups.md diff --git a/.github/workflows/build-and-publish-page.yml b/.github/workflows/build-and-publish-page.yml index b0b4dc3..358c203 100644 --- a/.github/workflows/build-and-publish-page.yml +++ b/.github/workflows/build-and-publish-page.yml @@ -18,20 +18,35 @@ jobs: with: node-version: 'lts/*' + # Build main page for the wiki + - name: Install dependencies + run: cd SBOM-wiki && npm install + + - name: Run build + run: cd SBOM-wiki && npm run build + + # Build the SBOM Catalog and copy the artifact to the wiki - name: Install dependencies run: cd SBOM-Catalog && npm install + - name: Run lint + run: cd SBOM-Catalog && npm run lint + - name: Run build run: cd SBOM-Catalog && npm run build + - name: copy Catalog to build artifact + run: rm -rf SBOM-wiki/.vitepress/dist/catalog/* && mv SBOM-Catalog/dist/* SBOM-wiki/.vitepress/dist/catalog + + # Publish all aritifacts - name: Upload pages artifact to action workflow uses: actions/upload-artifact@v4 with: name: pages-build-artifact - path: SBOM-Catalog/dist + path: SBOM-wiki/.vitepress/dist/ - name: Create zip for release file - run: zip -r sbom-catalog-${{github.ref_name}}.zip SBOM-Catalog/dist + run: zip -r sbom-catalog-${{github.ref_name}}.zip SBOM-wiki/.vitepress/dist - name: Upload pages release asset uses: softprops/action-gh-release@v2 @@ -41,9 +56,10 @@ jobs: - name: Deploy uses: JamesIves/github-pages-deploy-action@v4 with: - folder: SBOM-Catalog/dist + folder: SBOM-wiki/.vitepress/dist branch: gh-pages + # Create a SBOM with Syft for SPDX create_spdx_sbom: runs-on: ubuntu-latest @@ -61,6 +77,7 @@ jobs: artifact-name: sbom-catalog-${{github.ref_name}}.spdx.json format: spdx-json + # Create a SBOM with Syft for CycloneDX create_cdx_sbom: runs-on: ubuntu-latest diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index f9cce5d..e1edcae 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -3,8 +3,10 @@ name: CI on: pull_request: + workflow_dispatch: + jobs: - build: + build-catalog: runs-on: ubuntu-latest steps: @@ -18,5 +20,26 @@ jobs: - name: Install dependencies run: cd SBOM-Catalog && npm install + - name: Run lint + run: cd SBOM-Catalog && npm run lint + + - name: Run build + run: cd SBOM-Catalog && npm run build + + + build-wiki: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: 'lts/*' + + - name: Install dependencies + run: cd SBOM-wiki && npm install + - name: Run build - run: cd SBOM-Catalog && npm run build \ No newline at end of file + run: cd SBOM-wiki && npm run build diff --git a/SBOM-Catalog/package-lock.json b/SBOM-Catalog/package-lock.json index f8fba7a..5284e9e 100644 --- a/SBOM-Catalog/package-lock.json +++ b/SBOM-Catalog/package-lock.json @@ -1033,27 +1033,27 @@ } }, "node_modules/@volar/language-core": { - "version": "2.4.0-alpha.7", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.0-alpha.7.tgz", - "integrity": "sha512-3ncRpnoVHCTzJeTiUyKwFTLb3jGfe1r5+S3MwRDPEjsV4LID6Rq6EmdRoF+aKw+Iwg63x4nV+/KYZjeYrp5mNA==", + "version": "2.4.0-alpha.12", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.0-alpha.12.tgz", + "integrity": "sha512-Dj9qTifcGGgzFLfMbU5dCo13kHyNuEyvPJhtWDnoVBBmgwW3GMwFmgWnNxBhjf63m5x0gux1okaxX2CLN7qSww==", "dev": true, "dependencies": { - "@volar/source-map": "2.4.0-alpha.7" + "@volar/source-map": "2.4.0-alpha.12" } }, "node_modules/@volar/source-map": { - "version": "2.4.0-alpha.7", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.0-alpha.7.tgz", - "integrity": "sha512-yn66qcUXxUCyyW8PXMHE4z9RdfTO1OhP6BMa/JI0Ed6I6bggzkxvXsJOaMqw3EalCskGPuIWAbWgxwa3Hlp7SA==", + "version": "2.4.0-alpha.12", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.0-alpha.12.tgz", + "integrity": "sha512-LXATFSj4D7T9sEm7FFj6iBgHjKjrdhAgRPcechVKiNCMQdr3r3GVkkeu8aM+1peaMH3LsCqoDxVZEmh2r7CHiw==", "dev": true }, "node_modules/@volar/typescript": { - "version": "2.4.0-alpha.7", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.0-alpha.7.tgz", - "integrity": "sha512-MjvkhcIYPDZS5vbE4bSvbWi8z/VI47AY8MkPVgfa6xqTDLLxV6+QulJ8hIC3wYxh3dfVmA5MOoL5c3cZAsWbDQ==", + "version": "2.4.0-alpha.12", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.0-alpha.12.tgz", + "integrity": "sha512-mLg+OQauMTv/+08a7WBWJo1sev/wc8t2is0zhBZIlFU+j5mG89FM4+4089c2p/zoUFZ400Q/VNg2BPfhpZ8wSA==", "dev": true, "dependencies": { - "@volar/language-core": "2.4.0-alpha.7", + "@volar/language-core": "2.4.0-alpha.12", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } @@ -2092,9 +2092,9 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "9.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.26.0.tgz", - "integrity": "sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==", + "version": "9.27.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.27.0.tgz", + "integrity": "sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", @@ -2103,7 +2103,7 @@ "nth-check": "^2.1.1", "postcss-selector-parser": "^6.0.15", "semver": "^7.6.0", - "vue-eslint-parser": "^9.4.2", + "vue-eslint-parser": "^9.4.3", "xml-name-validator": "^4.0.0" }, "engines": { diff --git a/SBOM-Catalog/vite.config.ts b/SBOM-Catalog/vite.config.ts index cbadd76..cad5e3c 100644 --- a/SBOM-Catalog/vite.config.ts +++ b/SBOM-Catalog/vite.config.ts @@ -4,6 +4,7 @@ import vue from '@vitejs/plugin-vue' // https://vitejs.dev/config/ export default defineConfig({ assetsInclude: ['**/*.yaml'], - base: '/', + base: '/catalog/', + // base: '/sbom-everywhere/catalog/', plugins: [vue()], }) diff --git a/SBOM-wiki/.gitignore b/SBOM-wiki/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/SBOM-wiki/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/SBOM-wiki/.vitepress/config.mts b/SBOM-wiki/.vitepress/config.mts new file mode 100644 index 0000000..e3eea9a --- /dev/null +++ b/SBOM-wiki/.vitepress/config.mts @@ -0,0 +1,52 @@ +import { defineConfig } from 'vitepress' + +// https://vitepress.dev/reference/site-config +export default defineConfig({ + // base: "/sbom-everywhere/", + title: "SBOM-Everywhere Wiki", + description: "Information and advice about using SBOM in open source projects.", + themeConfig: { + search: { + provider: "local" + }, + + // https://vitepress.dev/reference/default-theme-config + nav: [ + { text: 'Home', link: '/' }, + { text: 'Basics', link: '/basics' }, + { text: 'About us', link: '/about-us'} + ], + + sidebar: [ + { + text: 'Essentials', + items: [ + { text: 'Basics', link: '/basics' }, + { text: 'Getting Started', link: '/getting-started' }, + { text: 'Glossary', link: '/glossery' }, + { text: 'FAQ', link: '/faq' } + ] + }, + { + text: 'Cataloges', + items: [ + { text: 'SBOM Tools', link: 'https://sbom-catalog.openssf.org/catalog/' }, + { text: 'SBOM Compliance', link: '/sbom-compliance' }, + { text: 'SBOM working groups', link: '/sbom-working-groups'}, + { text: 'SBOM Example Integrations', link: '/example-integrations' } + ] + }, + { + text: 'Guidance', + items: [ + { text: 'SBOM Types', link: '/sbom-types' }, + { text: 'SBOM Naming', link: '/sbom-naming' }, + { text: 'About us', link: '/about-us'} + ] + } + ], + socialLinks: [ + { icon: 'github', link: 'https://github.com/ossf/sbom-everywhere' } + ] + } +}) diff --git a/SBOM-wiki/.vitepress/theme/index.js b/SBOM-wiki/.vitepress/theme/index.js new file mode 100644 index 0000000..0cb3424 --- /dev/null +++ b/SBOM-wiki/.vitepress/theme/index.js @@ -0,0 +1,9 @@ +import DefaultTheme from 'vitepress/theme' + +/** @type {import('vitepress').Theme} */ +export default { + extends: DefaultTheme, + enhanceApp({ app }) { + // register your custom global components + } +} \ No newline at end of file diff --git a/SBOM-wiki/about-us.md b/SBOM-wiki/about-us.md new file mode 100644 index 0000000..a811dd2 --- /dev/null +++ b/SBOM-wiki/about-us.md @@ -0,0 +1,120 @@ +# SBOM Everywhere SIG (About us) + +# OSSF SBOM Everywhere SIG + +Home of the OpenSSF SBOM Everywhere SIG. We're glad you're here! + +## Get Involved + +* Official communications occur on the [openssf-sig-sbom](https://lists.openssf.org/g/openssf-sig-sbom) mailing list + * [Manage your subscriptions to Open SSF mailing lists](https://lists.openssf.org/g/main/subgroups) +* We have a [Slack Channel](https://openssf.slack.com/archives/C03GKSYFRC0) for discussion various SBOM related activities + +### Meeting times + +* Every other Tuesday @ 11:05am EST. The invite is available on the [OpenSSF Community Calendar](https://calendar.google.com/calendar/u/0/r?cid=czYzdm9lZmhwNWk5cGZsdGI1cTY3bmdwZXNAZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ). +* [Meeting Minutes](https://docs.google.com/document/d/193ODRga1F49WKPYYR79SNi9b27mChBqpOf5iiWJcMso/edit#heading=h.xqitfd6hs1gc) can be found in this Google Document. Feel free to add agenda items, please put your name next to items you add. + +## Motivation + +- The initial motivation for the formation of the OSSF SBOM Everywhere SIG is born from OpenSSF's [The Open Source Software Security Mobilization Plan](reference/mobilization_plan.pdf). SBOM standardization and consensus from within the open source community is integral to adoption of universal constructs that reveal themselves via the exploration of use cases beyond a compliance check box. + +## Objective + +### The 3 overarching goals from the White House meeting +- Securing OSS Production: focus on preventing security defects and + vulnerabilities in code and open source packages in the first place +- Improving Vulnerability Discovery & Remediation: improving the process + for finding defects and fixing them +- Shorten Ecosystem Patching Response Time: Shorten the response time for + distributing and implementing fixes. + +### The goals for this group as defined in the mobilization plan +- The requirements needed to build use cases using SBOMs are clearly + understood, documented and implemented in current SBOM specifications +- There are “friction free” open source tools that generate SBOMs that meet + these requirements +- There is readily accessible education, awareness and implementation + guidance and 3rd party support + + + + +## Scope + +The mobilization plan defines scope as +_By focusing on tools and advocacy, we can remove the barriers to +generation, consumption, and overall adoption of SBOMs everywhere, we can +improve the security posture of the entire open source ecosystem: +producers, consumers, and maintainers._ + + + +### Formatting Specifications + +For the purposes of establishing ubiquity to ensure sustainability for SBOM related tooling, and future solutions for consumption, “supported” formats must be defined. At this time there are two supported formats that will be in scope for the purposes of this group: [CycloneDX](https://cyclonedx.org) and [SPDX](https://spdx.dev). + +Utilization of these specifications would likely be discretionary and interchangeable depending on the use case and SBOM type and the requirements of individual organizations and internal tooling. + +This group's interpretation is +- [Use cases](https://docs.google.com/document/d/15X0TspuxUg19YScqNK1tl5kYpJV2xOrcuSx6CwanYZ0/edit#) +- Defining types of SBOMs + - Source + - Binary analysis + - Build + - Deploy Runtime +- Generation + - Formats - clearly define expectations +- Consumption + - How do we track and encourage the consumption of the artifacts + - something about tools +- Adoption (how do we encourage others to create and use SBOMs) + - Something about producers, consumers, and maintainers + - Where does the burden lie on accountability and enforcement? + - something about tools + - Tools are everywhere, what do we do with this? + - something about advocacy +- Attestation? + - Not part of tooling, this needs to be a policy decision in these + conversations, don't worry about the technical details (yet) + - Where does this fit in? Producers, consumers, ??? + - https://github.com/in-toto/attestation +- Compliance (regulated industry) + +The Federal Government exists at every point of the Software Delivery Lifecycle, hence their minimum requirements are good guides to establish a baseline scope. +- Cybersecurity Supply Chain Risk Management Practices for Systems and Organizations [NIST SP 800-161 Rev. 1](https://csrc.nist.gov/publications/detail/sp/800-161/rev-1/final) +- [Executive Order 14028](https://www.nist.gov/itl/executive-order-14028-improving-nations-cybersecurity/software-security-supply-chains) +- ![](https://www.nist.gov/sites/default/files/styles/2800_x_2800_limit/public/images/2021/07/09/software-verification-timeline.png) +- [Minimum Standards for Federal Government End Users](https://www.nist.gov/itl/executive-order-improving-nations-cybersecurity/recommended-minimum-standard-vendor-or-developer) + + +## SBOM Catalog +To provide a better overview of the available tooling and their capabilities, this group maintains an SBOM Catalog which can be found under the following link: + +[https://ossf.github.io/sbom-everywhere/](https://ossf.github.io/sbom-everywhere/) + +If you want to get involved, please see the document [here](https://github.com/ossf/sbom-everywhere/SBOM-Catalog/contribute.md) + + +## Prior Work +### NTIA +- [NTIA SBOM Resources](https://ntia.gov/SBOM) +- [Software Bill of Materials Elements and Considerations](https://www.regulations.gov/docket/NTIA-2021-0001/document) +- [Plan to Congress on Declassification and Clearances related to The Communications Supply Chain Risk Information Partnership](https://ntia.gov/files/ntia/publications/ntia_plan_on_declassification_and_clearances_re_c-scrip.pdf) + +NTIA's legwork has been a guiding source having done the most comprehensive research to date. + +### CISA +- [CISA SBOM Resources](https://www.cisa.gov/sbom) + +### OWASP SCVS +- [OWASP SCVS Resources](https://owasp.org/scvs) + +#### Tickets related to BOM Maturity model: +- [OWASP/Software-Component-Verification-Standard#34](https://github.com/OWASP/Software-Component-Verification-Standard/issues/34) +- [OWASP/Software-Component-Verification-Standard#35](https://github.com/OWASP/Software-Component-Verification-Standard/issues/35) +- [OWASP/Software-Component-Verification-Standard#36](https://github.com/OWASP/Software-Component-Verification-Standard/issues/36) + +## Governance + +The [CHARTER.md](https://github.com/ossf/sbom-everywhere/CHARTER.md) outlines the scope and governance of our group activities. \ No newline at end of file diff --git a/SBOM-wiki/basics.md b/SBOM-wiki/basics.md new file mode 100644 index 0000000..b9c34fc --- /dev/null +++ b/SBOM-wiki/basics.md @@ -0,0 +1,5 @@ +# Basics + +::: warning Work in Progress +This site is Work in progress and just a concept. +::: \ No newline at end of file diff --git a/SBOM-wiki/catalog/index.md b/SBOM-wiki/catalog/index.md new file mode 100644 index 0000000..c6ed45b --- /dev/null +++ b/SBOM-wiki/catalog/index.md @@ -0,0 +1,3 @@ +::: warning +THIS IS A PLACEHOLDER FOR THE SBOM CATALOG THAT GETS DEPLOYED HERE. DONT USE THIS PATH FOR OTHER RESOURCES! +::: \ No newline at end of file diff --git a/SBOM-wiki/example-integrations.md b/SBOM-wiki/example-integrations.md new file mode 100644 index 0000000..b26ca30 --- /dev/null +++ b/SBOM-wiki/example-integrations.md @@ -0,0 +1,5 @@ +# Example integrations + +::: warning Work in Progress +This site is Work in progress and just a concept. +::: \ No newline at end of file diff --git a/SBOM-wiki/faq.md b/SBOM-wiki/faq.md new file mode 100644 index 0000000..480428c --- /dev/null +++ b/SBOM-wiki/faq.md @@ -0,0 +1,5 @@ +# Frequently asked questions + +::: warning Work in Progress +This site is Work in progress and just a concept. +::: \ No newline at end of file diff --git a/SBOM-wiki/getting-started.md b/SBOM-wiki/getting-started.md new file mode 100644 index 0000000..22f2f02 --- /dev/null +++ b/SBOM-wiki/getting-started.md @@ -0,0 +1,26 @@ +# Getting Started + +## Select an SBOM-Generation Phase +Depending on the technology stack used, the phase of the software development lifecycle in which an SBOM is generated can significantly affect its quality. The different phases are explained in more detail in the [SBOM types](/sbom-types). For open-source projects, it is most beneficial to provide a source or a build SBOM, giving the consumer insights into the composition of a project build before it is compiled into an artifact. This provides access to details of the project composition that might otherwise remain hidden. While providing an SBOM based on the analysis of a build artifact can also be useful, such an SBOM can be produced by the user with their preferred tooling. + +## Choose a Generation Methodology +Assuming the goal is to produce a source or build SBOM for a project, it should be decided whether the SBOM generation should be part of the build process (like a plugin added to the build tooling) or if a separate tool should be applied to the repository during the build. + +### SBOM Generation in the Build Process +Adding SBOM generation directly to the build process might produce the best results. The SBOM is based on the build information directly and can therefore represent most of the complexity, such as traversing dependencies or dynamic dependency resolving with variables or version ranges. However, integrating SBOM generation into the build process can complicate changes. Additionally, if the project is composed of several technologies, each requiring its own build tooling and corresponding SBOM plugins, merging the SBOM generation results might be very challenging. Most build plugins only support one of the two SBOM standards, necessitating the choice of one standard or the integration of two SBOM plugins to cover SPDX and CycloneDX separately. This can also lead to additional complexity because these plugins can report different findings for the same project. + +> In summary, integrating SBOM generation into the build process via plugins might produce the best results but can add a lot of additional complexities. However, only a few or none of these constraints may apply to a project. + +### SBOM Generation with a Separate Tool +There are also tools that can be applied to the sources of a project without relying on a build integration. Tools like Syft, Trivy, or CdxGen can be used in this manner. While they are easier to integrate and operate within a project, they might not produce the best quality SBOM. Depending on the technology stack and build setup, it can be harder to resolve traversing dependencies, versions from version ranges or variables might be incorrect or missing, and license information might be wrong or missing (you can find some test reports [here](https://mariuxdeangelo.gitlab.io/website/#/post/20230924-SBOM-dependency-semantics-SPDX-and-CycloneDx)). On the plus side, they are easy to integrate, often support both SBOM standards (SPDX and CycloneDX), and can cover projects using several technologies in the same repository (no merging of SBOM data required). + +> In summary, generating the SBOM with a separate tool is a good start and can be easier, but the results might be more accurate if derived from the build process. Nevertheless, the results might still be able to meet the requirements of the *NTIA minimum elements for an SBOM* (US regulations) or the requirements set by the *EU CRA* (EU regulations). + +## Select an SBOM Tool +To select a tool, check out our tooling [catalog](/catalog/index.html). + +## Integrate into Your Build +When integrating an SBOM generator into a project, it is important to ensure that each artifact gets its own SBOM. This is not an issue if the project produces only one artifact. However, if the project is, for example, a monorepository holding several products built for different platforms using diverging dependencies, it is important to provide separate SBOMs for each of them. + +## Publish with Your Artifacts +An SBOM should be published along with its artifacts. It can also be considered to publish an SBOM inside an artifact to make it inseparable from the provided artifact. Further guidance is provided by the [SBOM naming](sbom-naming.md) document. \ No newline at end of file diff --git a/SBOM-wiki/glossery.md b/SBOM-wiki/glossery.md new file mode 100644 index 0000000..780b81b --- /dev/null +++ b/SBOM-wiki/glossery.md @@ -0,0 +1,15 @@ +# Glossery + +::: warning Work in Progress +This site is Work in progress and just a concept. +::: + +### SBOM + +A Software Bill of Materials (SBOM) is a structured record that identifies the components and their relationships within a software product. It functions like an ingredients list, detailing the various software components and their versions that make up a final software product. This record helps with transparency in the software supply chain, enabling better understanding, management, and ultimately, improved security of the software. + +### SPDX + +### CycloneDX + +### SWID diff --git a/SBOM-wiki/index.md b/SBOM-wiki/index.md new file mode 100644 index 0000000..f4982f8 --- /dev/null +++ b/SBOM-wiki/index.md @@ -0,0 +1,61 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: "SBOM-Everywhere" + text: "SBOMs in open source projects" + tagline: Adding SBOMs to Open Source Projects. + actions: + - theme: brand + text: Getting started + link: /getting-started + - theme: brand + text: Tooling Catalog + link: https://sbom-catalog.openssf.org/catalog/ + image: + src: thumbnail.webp + alt: SBOM catalog + +features: + - title: SBOM Catalog + details: Looking for the right SBOM tooling? Explore our interactive catalog. + link: https://sbom-catalog.openssf.org/catalog/ + - title: SBOM Types + details: What types of SBOMs are there and what do I need? + link: /sbom-types + - title: SBOM Naming + details: Wondering were to put and how to name your SBOMs? Look here for best practices. + link: /sbom-naming + - title: Examples + details: Looking for examples and references, how other Open Source Projects integrated SBOM. + link: /example-implementation + - title: SBOM in compliance + details: Wondering who requires SBOM and want to see a list referencing the sources? Here's a list of laws, guidelines and requirements mandating SBOMs. + link: /sbom-compliance + - title: Working Groups + details: Do you want to join, contribute or ask questions. Her is a list of working groups. + link: sbom-everywhere-sig +--- + + \ No newline at end of file diff --git a/SBOM-wiki/package-lock.json b/SBOM-wiki/package-lock.json new file mode 100644 index 0000000..8276135 --- /dev/null +++ b/SBOM-wiki/package-lock.json @@ -0,0 +1,1675 @@ +{ + "name": "SBOM-wiki", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "vitepress": "^1.2.2" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "dev": true, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz", + "integrity": "sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.24.0" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.24.0.tgz", + "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==", + "dev": true + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz", + "integrity": "sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.24.0" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.24.0.tgz", + "integrity": "sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.24.0.tgz", + "integrity": "sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.24.0.tgz", + "integrity": "sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", + "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/logger-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz", + "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==", + "dev": true + }, + "node_modules/@algolia/logger-console": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.24.0.tgz", + "integrity": "sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==", + "dev": true, + "dependencies": { + "@algolia/logger-common": "4.24.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.24.0.tgz", + "integrity": "sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.24.0", + "@algolia/cache-common": "4.24.0", + "@algolia/cache-in-memory": "4.24.0", + "@algolia/client-common": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/logger-common": "4.24.0", + "@algolia/logger-console": "4.24.0", + "@algolia/requester-browser-xhr": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/requester-node-http": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", + "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", + "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==", + "dev": true + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", + "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.24.0.tgz", + "integrity": "sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.24.0", + "@algolia/logger-common": "4.24.0", + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", + "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==", + "dev": true + }, + "node_modules/@docsearch/js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.6.0.tgz", + "integrity": "sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==", + "dev": true, + "dependencies": { + "@docsearch/react": "3.6.0", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", + "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.6.0", + "algoliasearch": "^4.19.1" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.10.1.tgz", + "integrity": "sha512-qdiJS5a/QGCff7VUFIqd0hDdWly9rDp8lhVmXVrS11aazX8LOTRLHAXkkEeONNsS43EcCd7gax9LLoOz4vlFQA==", + "dev": true + }, + "node_modules/@shikijs/transformers": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.10.1.tgz", + "integrity": "sha512-0gLtcFyi6R6zcUkFajUEp1Qiv7lHBSFgOz4tQvS8nFsYCQSLI1/9pM+Me8jEIPXv7XLKAoUjw6InL+Sv+BHw/A==", + "dev": true, + "dependencies": { + "shiki": "1.10.1" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true + }, + "node_modules/@types/markdown-it": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==", + "dev": true, + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.5.tgz", + "integrity": "sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.31.tgz", + "integrity": "sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.24.7", + "@vue/shared": "3.4.31", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.31.tgz", + "integrity": "sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "3.4.31", + "@vue/shared": "3.4.31" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.31.tgz", + "integrity": "sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.24.7", + "@vue/compiler-core": "3.4.31", + "@vue/compiler-dom": "3.4.31", + "@vue/compiler-ssr": "3.4.31", + "@vue/shared": "3.4.31", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.10", + "postcss": "^8.4.38", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.31.tgz", + "integrity": "sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.4.31", + "@vue/shared": "3.4.31" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.3.5.tgz", + "integrity": "sha512-BSdBBu5hOIv+gBJC9jzYMh5bC27FQwjWLSb8fVAniqlL9gvsqvK27xTgczMf+hgctlszMYQnRm3bpY/j8vhPqw==", + "dev": true, + "dependencies": { + "@vue/devtools-kit": "^7.3.5" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.3.5.tgz", + "integrity": "sha512-wwfi10gJ1HMtjzcd8aIOnzBHlIRqsYDgcDyrKvkeyc0Gbcoe7UrkXRVHZUOtcxxoplHA0PwpT6wFg0uUCmi8Ww==", + "dev": true, + "dependencies": { + "@vue/devtools-shared": "^7.3.5", + "birpc": "^0.2.17", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.1" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.3.5.tgz", + "integrity": "sha512-Rqii3VazmWTi67a86rYopi61n5Ved05EybJCwyrfoO9Ok3MaS/4yRFl706ouoISMlyrASJFEzM0/AiDA6w4f9A==", + "dev": true, + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.31.tgz", + "integrity": "sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==", + "dev": true, + "dependencies": { + "@vue/shared": "3.4.31" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.31.tgz", + "integrity": "sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.4.31", + "@vue/shared": "3.4.31" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.31.tgz", + "integrity": "sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.4.31", + "@vue/runtime-core": "3.4.31", + "@vue/shared": "3.4.31", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.31.tgz", + "integrity": "sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==", + "dev": true, + "dependencies": { + "@vue/compiler-ssr": "3.4.31", + "@vue/shared": "3.4.31" + }, + "peerDependencies": { + "vue": "3.4.31" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.31.tgz", + "integrity": "sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==", + "dev": true + }, + "node_modules/@vueuse/core": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.0.tgz", + "integrity": "sha512-x3sD4Mkm7PJ+pcq3HX8PLPBadXCAlSDR/waK87dz0gQE+qJnaaFhc/dZVfJz+IUYzTMVGum2QlR7ImiJQN4s6g==", + "dev": true, + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.11.0", + "@vueuse/shared": "10.11.0", + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.8", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", + "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.11.0.tgz", + "integrity": "sha512-Pp6MtWEIr+NDOccWd8j59Kpjy5YDXogXI61Kb1JxvSfVBO8NzFQkmrKmSZz47i+ZqHnIzxaT38L358yDHTncZg==", + "dev": true, + "dependencies": { + "@vueuse/core": "10.11.0", + "@vueuse/shared": "10.11.0", + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^4", + "drauu": "^0.3", + "focus-trap": "^7", + "fuse.js": "^6", + "idb-keyval": "^6", + "jwt-decode": "^3", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^6" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations/node_modules/vue-demi": { + "version": "0.14.8", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", + "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.0.tgz", + "integrity": "sha512-kQX7l6l8dVWNqlqyN3ePW3KmjCQO3ZMgXuBMddIu83CmucrsBfXlH+JoviYyRBws/yLTQO8g3Pbw+bdIoVm4oQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.0.tgz", + "integrity": "sha512-fyNoIXEq3PfX1L3NkNhtVQUSRtqYwJtJg+Bp9rIzculIZWHTkKSysujrOk2J+NrRulLTQH9+3gGSfYLWSEWU1A==", + "dev": true, + "dependencies": { + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.8", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz", + "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/algoliasearch": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.24.0.tgz", + "integrity": "sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.24.0", + "@algolia/cache-common": "4.24.0", + "@algolia/cache-in-memory": "4.24.0", + "@algolia/client-account": "4.24.0", + "@algolia/client-analytics": "4.24.0", + "@algolia/client-common": "4.24.0", + "@algolia/client-personalization": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/logger-common": "4.24.0", + "@algolia/logger-console": "4.24.0", + "@algolia/recommend": "4.24.0", + "@algolia/requester-browser-xhr": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/requester-node-http": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/birpc": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.17.tgz", + "integrity": "sha512-+hkTxhot+dWsLpp3gia5AkVHIsKlZybNT5gIYiDlNzJrmYPcTM9k5/w2uaj3IPpd7LlEYpmCj4Jj1nC41VhDFg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dev": true, + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/focus-trap": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", + "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", + "dev": true, + "dependencies": { + "tabbable": "^6.2.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "dev": true, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, + "node_modules/minisearch": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.3.0.tgz", + "integrity": "sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==", + "dev": true + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.22.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.22.1.tgz", + "integrity": "sha512-jRYbDDgMpIb5LHq3hkI0bbl+l/TQ9UnkdQ0ww+lp+4MMOdqaUYdFc5qeyP+IV8FAd/2Em7drVPeKdQxsiWCf/A==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "node_modules/rollup": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/search-insights": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.14.0.tgz", + "integrity": "sha512-OLN6MsPMCghDOqlCtsIsYgtsC0pnwVTyT9Mu6A3ewOj1DxvzZF6COrn2g86E/c05xbktB0XN04m/t1Z+n+fTGw==", + "dev": true, + "peer": true + }, + "node_modules/shiki": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.10.1.tgz", + "integrity": "sha512-uafV7WCgN4YYrccH6yxpnps6k38sSTlFRrwc4jycWmhWxJIm9dPrk+XkY1hZ2t0I7jmacMNb15Lf2fspa/Y3lg==", + "dev": true, + "dependencies": { + "@shikijs/core": "1.10.1" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/superjson": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", + "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", + "dev": true, + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true + }, + "node_modules/vite": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.2.tgz", + "integrity": "sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.2.3.tgz", + "integrity": "sha512-GvEsrEeNLiDE1+fuwDAYJCYLNZDAna+EtnXlPajhv/MYeTjbNK6Bvyg6NoTdO1sbwuQJ0vuJR99bOlH53bo6lg==", + "dev": true, + "dependencies": { + "@docsearch/css": "^3.6.0", + "@docsearch/js": "^3.6.0", + "@shikijs/core": "^1.6.2", + "@shikijs/transformers": "^1.6.2", + "@types/markdown-it": "^14.1.1", + "@vitejs/plugin-vue": "^5.0.5", + "@vue/devtools-api": "^7.2.1", + "@vue/shared": "^3.4.27", + "@vueuse/core": "^10.10.0", + "@vueuse/integrations": "^10.10.0", + "focus-trap": "^7.5.4", + "mark.js": "8.11.1", + "minisearch": "^6.3.0", + "shiki": "^1.6.2", + "vite": "^5.2.12", + "vue": "^3.4.27" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.31.tgz", + "integrity": "sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.4.31", + "@vue/compiler-sfc": "3.4.31", + "@vue/runtime-dom": "3.4.31", + "@vue/server-renderer": "3.4.31", + "@vue/shared": "3.4.31" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + } + } +} diff --git a/SBOM-wiki/package.json b/SBOM-wiki/package.json new file mode 100644 index 0000000..de156b1 --- /dev/null +++ b/SBOM-wiki/package.json @@ -0,0 +1,12 @@ +{ + "scripts": { + "dev": "vitepress dev", + "build": "vitepress build", + "preview": "vitepress preview" + }, + "devDependencies": { + "vitepress": "^1.2.2" + }, + "dependencies": { + } +} diff --git a/SBOM-wiki/public/thumbnail.webp b/SBOM-wiki/public/thumbnail.webp new file mode 100644 index 0000000000000000000000000000000000000000..eea7f6ce16b36268cefa5284bf3f76d26f193c4a GIT binary patch literal 69352 zcmaI8b8u!s*Dw0Sww~BFC$??dwkEc1J5My3*qGSH#7<^nYr>oNJ-6<6{y67$Rqy`o zh2FhZch%ap_NuKaBPqFy3008`7JsSdW2?mf66H_h%|GEW$7ulOR zxIqd701l4suBuX^B-%QkDI=S(})D;U8a^!S!o_UwHLD zbkqNZ&;Nt1{)_)>6sD`Xs@Rupm|t`ftN#s~{%_dK+STDphT}_y!rZ~}YkqL;|Ao!} zgZ=)49qc{6*7o1_9}5vJ95vLwMvAXa0FVO602Bbq01|*Hzyn|dum`vU7{5lxFNzyL z^@}h1f6>SLufFn^mg$$44Z!S6Lmc1)Z~&P6S0C`7J@}IOYX9R~H%oT5|B}EEMF9Y) z?a$9UN&o;R6##fo`uuz?{``C|0RSL20f0Wo|Iv3U0sy!lzUWE+L!&4J08qjJfYzb^ zp_yg^0Bw-~0C3IO#MR`#&w=>5f?HYw0JjwY0Fn*>fH4OE!0Y`lzkTuk!v~bE008P= zzLKB*I$Jpa0F~9(-1`3)yJ5c+{y)F{|H}No{u7Z`mbMrC+HFi22XYxz)i<4|Z@y9_ zWK==^14i&{e=5+_?+UIZm;CN^0UO86ER!P?`qJtq4d&-d!J5Sw>8+(chaIj8=vanj z4d9iR)g0B(lDr;mGhmbbXGv z_6c){b{3Wf(XcCvM6!ake%RtRcw5DI{RF4?DK}i7=7(kD1DDqYSBZt^a05VfXBa9s z>p)hO_SD;WB z_MEP(paq56A@v?i(t|90zOD>|jyVvMArQ4UOW= z?HA>_Lp+{L!Q%=^saus{tzkne8>(UE0l4f%_#zCN8y0|XD*#~t~_hWrOrOaBhLk^9c{rE zg+3zM@9w#^{f%Qn5Vg6+Av6qs*;BHU*H!XB8_O}4CUT5SC&yr()7kg|G@qJpz~lscp668l1%zsv zdaU&9Nw!v3t8Twr&NBy8hx+4dcldL5iABLD#4w5ZUa1hDK7j9ACH9I&A>KbK!yla( zY7-)cx_X>NKvR77N=)$uXuJ}WUvVtFdqUFpbNSHuwvs^XSr`q{TsilWGi#>5iZUj~ z14^P2?i6B3oCFSU{PKpzIp<^tVjdJ(16sz`a0JWn30y;&<3pr+lF=u)-2gF_B4a25 z#>a}h1Oszh*2VPB51+~y5mE&1k>_kzLTF>WF|>7XOpI8>_6`9C2kj6Rh3!+jV&;hV zp}N0`S*noiNUN~vd-;1SZeC&RIW{G~4Qb+2&wlJqWec+#h!_nZbeI(E(LwqsLgiHf zjv6}TdO4_7b9V(!pu9oR+TO){cv)vwF=6;b*+SUe6wRaKHk^ExjPBVwWGqOXuYXED3`5#ZIzMnj#kw$y%?V}c)6kiTtO ztLNds;f5yN(*X-BAaL?h5Zp{CV_izEUfG66NuOAJRZLj?rmR$uq(X-=%lCc6)91c% z#{B{-?$xDO&=p84!a&f!%4iOA)uiG8A0dvP%eNrAz)1)Vl$iFJ{-J0c$R|#n!q3NN zim;&cpf`e3wSb?L`zP4b^In%52%KG6!3pv~*qL7z+TE?!AQ5P;Cps;J{ox>!`0ZLX zYd=-59c85yRnc1RG5-S{GCpj5gLT`?cLuWV?5^#J8KR_>NQG7!9j`Pm&ao%&IaNS_ z8NLN7yq;e$O3}y2XV$oHl50ZDf7}YZ07;8(Hxb11au4c|WE@7a0*A%i>m?XCf?cZm z>xM{cSE_E!9TeZKFteVNB4~!0QVr7kvAjcI>7*o8b$Ss89Fvc=oL zxWY>F|pUgl)B*R0Oc+ zzUyYs^Ks7`(e-;B)s3B18nGSOFyy1|xXL$yl~uf#KM7dh1?kA@8;E3G8TM`8=DwFL zeinlkxHoA8l7tPJTGMBJ^xu zXZULwJM46ia^S`?;GWdxp4>9&o|JbtbE#F;m@?0piJAi$GAZ26)A9lVb5g3>8fXhODCX;RR+~0FMpz@ zD3`3t445=o=|?nM>OH>Eljn}e-5(k4pb7?|Lhw^e;JDw$A|z9>1A5^S1Jd-pEcivh}`gUIsllJ>*q+7}x~v}JM<0S=j%Hl$@(G3LC6 z0272iEAT}S2M$Q(BGa~+>|P-ZNE!MsHWhP%r{-M|9_w^L$Wu;E^HXpFjAUDuTlv3- zI?Y6kdA~i0?B<+zfG-CJl_PWZvhCwZV<`*vaI0fnQ~guObJxdH14MH)TDi0*LK}!qN76<4Gu1fq{Eu_ zQI=GKE{9?*Yh^leDB!3xi=hDj09Kl6OS-a-SLF0%MRBqF660a`2kx%{M-f*P~Q%>5S{X#df( zy|wk|nQe2H%A*EmV2K3C$t0B^f(D7XjMnX(kU5}pDW{QV@&U;Kp;38d0bM{K**S$T zPx)dXIo3j;--H0+m^p}oEy6)T9?8#rM`5f8U{h^Vn?KOdx>mv!0!FByDCqr_`R>CT zVo`D}4`Y`f-v5?@;qAtt75(sXjK*cGqsV0BM5=(*>l=9$#47Hw+U7bH8B%pz8MIKV z?CbSyJt{wh3c3+q&gh%d&n=ruq;~Fq$yU{Jgeu^9kfRI4TGL}Q=mhlXZ1PG&YDvs1 zvL(wnJ*Z=aL1HjD&o0y@NGoa#n5rdwfvbLerLh|)4V#?!7Y9@##A zIQokdsT6%5Q_P~Um(F(o(T?Mw9*XDes#Cuaj!7zRr$d-*%6{7zYJ;FW${gB%l;MnI zJLLrBX6+Ue>2>j5K>+<(w<6$r=kh#KU40jZ(O@e=%lcICG1I2Th{`26|6rQ+YH*d9 zeKjYQ@3I}m$~%YbxZOfgFeEpmT$JMohhBITGU{Y^>NOpQYs_9;eg1=w~?n; zP@tmtfi6>1akbNh`GO<||AEdf^j8d_E)}V_Y56c?vA~jxh<&p2){I6{Va-~rt67LD zZ`?pbeMDuk>dn_Ii! zdRA~Jg4o30CNrP%E}2rWSzxtMsv)#vOMa41L>Kf=>rsYwy0CzML$kR9cW2t5!X?(8 z^B;aDtZ?o919MPw^681d<~K2heK9J)Yq?|$O5xL{q0-E;!+zxHu}HpVNsPL2@)t`W zySw@<;YTb&Q5%h&TMO-#)Jiff_ zD)&;sRjbgoUHp&Dw1}W36QxGc(|<{Q&S?#%MolyD8a-GneOR2JU*>C_vL3t$*X>7_ zPxsD=b_i*CzibkM=XKP*e&1YeQD3iC!rGnbkv#Tucc94ES zyS{jIa4VWQ_RIQ|U4tJ%Qr5j^52Sj4o%iOdD2p!E7}UWCetF8U^)jGm1BR~!hD~o`dY*G5!a_v% z5&JBn2H>_($>)vRV`8Mr$%Y=b!EIvn7+bDa_Les86vnSG7j&B_nLRSIWnAqC5BZ0Y zBL$_+lAk$j-VwuojvzF zCC2t~4C?-Hzkr(c>%7+1$bp_9P7cq*bbujaE@}9UNH@nkl@16N6$Tzys|34d8Are; zW#5}M<7z_%iBrXqatoRCzG=H_boJg)A+aqU{ldo{$uF zL7A3kuWqwz;9?I9WC7z`d4pRnUpSVomHc?I|JahQQ$dw=dmkL^)3SsL{8)jL$CA|x z37+#)5`o@k0Bo`BA!3mWT~QNfkeE+~X<8!o|AV?anx9iF)oma~{}52pc`)-^V+h>1 zcSkb+^MJklTKw&!vS;Q1MmiBKtH8C$synC4xNtBS|MH2MyVUV&Tc)7fNn6{XM0oER zAeLTx*ylig9p9*$Z%p^6&ymagSU506X>^kRr~ZXt!($Lics8-p09vFe zFh@oaq+?c$5uF)_1SR`zn%kTO%kXwjJ=32kT}o@@Z(=K} z>>jYTYi=h;&d`gPv^wK)dBQ4L*vs+EYHzW(bBd7`J5^8E4KN+o`$cyt@}ohl%ZQ83 zq7UcUzkl^r(=1Y_=%;bw=3-TLOp~H(j(G_t>Qs`wU}gy>6HIW-6}}|WGJFf7HHHB! zc47wf*!iqWiSnMjuJvMGV=~guU-!|fTf(dL-{P*~*Mz{$=O)y}9dteS!R09i+aw5O zRe6}{I!5zV4d1mZS~R6dUEe5?@wkG$(1g+I^1H%oj62Aco5^`

q^xEx=ZEM=Dfg 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

TvF|) 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:eu: +The [European Cyber Resilience Act (CRA)](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=celex:52022PC0454) includes requirements for the identification and management of supply chain risks, and the proposed European Cybersecurity Certification Scheme would likely require the use of Software Bill of Materials (SBOM) and secure software development practices. The Cybersecurity Resilience Act lays out specific actions and strategies regarding the responsibility and the means to protect software vulnerabilities, including specifying vulnerability reporting format and requirements, anchored in the form of a SBOM. +_
2024-03-12
_ + +## Guide of Introduction of SBOM for Software Management
:jp:
+Japan's Ministry of Economy, Trade and Industry (METI) published a [guide](https://www.meti.go.jp/english/press/2023/0728_001.html) to promote SBOM use. Highlighting growing software security concerns, METI targets software suppliers with this guide, which details the benefits and steps for implementing SBOMs. This initiative aims to improve software vulnerability management, enhance development productivity, and bolster overall cybersecurity in Japanese industries. +_
2023-07-28
_ + +## Technical Guideline TR-03183
:de:
+The [Technical Guideline TR-03183: Cyber Resilience Requirements for Manufacturers and Products Part 2 Software Bill of Materials (SBOM)](https://www.bsi.bund.de/dok/TR-03183-en) provides essential guidance for creating an SBOM. The Technical Guideline TR-03183 aims to provide manufacturers with advance access to the requirements that will be imposed by the future EU Cyber Resilience Act (CRA). While it is recommended (but not obligatory), it serves as a basis for discussion both within the EU and internationally. +_
2023-07-12
_ + +## SBOM startersgids
🇳🇱
+The Dutch National Cyber Security Center (NCSC) has published a [SBOM Starter Guide](https://www.ncsc.nl/documenten/publicaties/2023/juli/5/sbom-startersgids) to assist managers involved in their organization's cybersecurity strategy with implementing SBOMs. This guide explores how organizations can establish processes for using SBOMs, create, manage, and share them effectively, and develop strong agreements with vendors. It also dives into how SBOMs can be utilized for vulnerability management and offers additional insights through supporting frameworks. +_
2023-07-05
_ + +## The Minimum Elements for a SBOM
:us:
+The [NTIA Minimum Elements for an SBOM](https://www.ntia.gov/report/2021/minimum-elements-software-bill-materials-sbom) requires that SBOMs show, for each software component: supplier, component name, version, any unique identifiers like CPE SWID or PURL, dependency relationship, and the author of this information along with a time/date stamp when it was generated. The minimum elements of an SBOM build on three broad, interrelated areas: Data fields, Operational considerations, and Support for automation. SBOMs must comply with at least one of the following SBOM standards: Software Package Data eXchange (SPDX), CycloneDX, or Software Identification (SWID) tags. The minimum elements of an SBOM will enable basic use cases, such as management of vulnerabilities, software inventory, and licenses. +_
2021-07-12
_ + +## White House Executive Order 14028
:us:
+The [White House Executive Order on cybersecurity](https://www.whitehouse.gov/briefing-room/presidential-actions/2021/05/12/executive-order-on-improving-the-nations-cybersecurity/) includes new security requirements for software vendors selling software to the U.S. government. It emphasizes the importance of enhancing software supply chain security through the Software Bill of Materials (SBOM). The Executive Order defines an SBOM as “a formal record containing the details and supply chain relationships of various components used in building software”. +_
2021-05-12
_ + + + diff --git a/SBOM-wiki/sbom-naming.md b/SBOM-wiki/sbom-naming.md new file mode 100644 index 0000000..f80a48a --- /dev/null +++ b/SBOM-wiki/sbom-naming.md @@ -0,0 +1,48 @@ +# Best Practices for Naming and Directory Conventions for SBOMs (Software Bill of Materials) in Open Source Projects + +The [Software Bill of Materials (SBOM)](https://www.cisa.gov/sbom) plays a vital role in providing visibility & transparency into the software supply chain. Using SBOM standards such as [CycloneDX](https://cyclonedx.org/) and [SPDX](https://spdx.dev/) ensures interoperability, accurate dependency tracking, and efficient vulnerability management. Here are some best practices for naming and directory conventions when creating and managing SBOMs. + +## Scope + +This document only covers [SBOMs of Type Source and Build](https://www.cisa.gov/sites/default/files/2023-04/sbom-types-document-508c.pdf) as SBOMs of other types are typically not curated by the maintainers of Open Source software but instead by consumers of Open Source software. The audience for this document is open source projects distributing artifacts directly rather than distributing artifacts via an ecosystem such as Maven or NPM. + +For Source and Build SBOMs, the contents of the SBOM describing the artifact will only include what is being distributed and will not contain information about prospective uses of the software during or after installation or running of the software. That information is captured in separate SBOM types (ie Deployment, Runtime). + +In the context of this document, the “source” is defined as a snapshot of the source code made available to download, such as in a tgz archive. + +The “build” is the artifacts that are built by the project and released. These could be tgz archives, but also other artifacts such as rpm, deb, or zip. + +This document does not prescribe best practices to specific software ecosystems (Maven, PyPI, etc) which are likely to have specific requirements about how to distribute accompanying metadata alongside software distributions, however this should not preclude the use of all or part of this guidance for this use-case. + +There may be instances where a release is also uploaded to an ecosystem. It is not expected that the SBOM generated for the releases would be uploaded to those ecosystems. + +## Consistent Naming Conventions + +For SBOMs which are distributed with source tarballs or pre-built binaries as a part of a defined release of the software, the requirements for “release” files is typically a flat list of files without directories (think GitHub or GitLab Release artifacts). To meet these requirements, no directory structures should be used. + +Following [guidance](https://slsa.dev/spec/v1.0/distributing-provenance#relationship-between-artifacts-and-attestations) from SLSA provenance attestations of appending a corresponding extension to the filename of the artifact that is being described. For the [CycloneDX](https://cyclonedx.org/specification/overview/) and [SPDX](https://spdx.github.io/spdx-spec/v2.3/conformance/#44-standard-data-format-requirements) SBOM standards and their file extension formats the guidance is as follows: + +| Standard + Format | Artifact Filename | SBOM Filename | +|-------------------|-------------------|---------------| +| CycloneDX JSON | artifact-1.0.0.tar.gz | artifact-1.0.0.tar.gz.cdx.json| +| CycloneDX XML | artifact-1.0.0.tar.gz | artifact-1.0.0.tar.gz.cdx.xml | +| SPDX TAG:VALUE | artifact-1.0.0.tar.gz | artifact-1.0.0.tar.gz.spdx | +| SPDX JSON | artifact-1.0.0.tar.gz | artifact-1.0.0.tar.gz.spdx.json | +| SPDX XML | artifact-1.0.0.tar.gz | artifact-1.0.0.tar.gz.spdx.xml | +| SPDX YAML | artifact-1.0.0.tar.gz | artifact-1.0.0.tar.gz.spdx.yml (or .yaml) | +| SPDX RDF XML | artifact-1.0.0.tar.gz | Artifact-1.0.0.tar.gz.spdx.rdf (or .rdf.xml) + +The .spdx.* and .cdx.* extensions are sourced from the [CycloneDX](https://cyclonedx.org/guides/sbom/extensibility/) and [SPDX](https://spdx.github.io/spdx-ntia-sbom-howto/) guidance on filename extensions for SBOM documents of the corresponding standard and format. + +The JSON format files should be considered a mandatory requirement and are always available. The tool support for JSON documents is considered to be better than the other file format options. If other formats are desired, the JSON SBOM should also be available. + +## Acknowledgements + +The following community members helped contribute to this guidance + +- Josh Bressers, Anchore +- Marius Biebel. hm.edu +- Ian Dunbar-Hall, Lockheed Martin +- Maximilian Huber, TNG Technology Consulting +- Dan Appelquist, Samsung (formerly, Snyk) +- Seth Larson, Python Software Foundation diff --git a/SBOM-wiki/sbom-types.md b/SBOM-wiki/sbom-types.md new file mode 100644 index 0000000..86139ff --- /dev/null +++ b/SBOM-wiki/sbom-types.md @@ -0,0 +1,43 @@ +# Types of Software Bill of Material (SBOM) Documents + +::: tip Go to original document. +This document was reviewed and published by CISA. You can find the original document [here](https://www.cisa.gov/resources-tools/resources/types-software-bill-materials-sbom). +::: + +## Introduction +Today there is a widely-used definition of the minimum content of a Software Bill of Material (SBOM). However, an SBOM may contain different forms of the minimum information sourced from different product artifacts. Given the disparate ways SBOM data can be collected, the results may vary, yet still provide value in different use cases. This document summarizes some common types of SBOMs that tools may create in the industry today, along with the data typically presented for each type of SBOM. An SBOM document may combine information for multiple SBOM types. + +## Definitions and Discussions +The following two tables summarize the different types of SBOMs and the benefits and limitations of each type. This list of SBOM types is not intended to be tightly tied to the software lifecycle. Some SBOM types may be available and useful across multiple lifecycle phases, while others may be available only in one lifecycle phase. Also, the data presented within an SBOM type may vary, depending on the software’s lifecycle phase and industry. + +## SBOM Type Definition and Composition +| Type | Definition | Description | +|--------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------| +| **Design** | SBOM of intended design of included components (some of which may not exist) for a new software artifact. | Typically derived from a design specification, RFP, or initial concept. | +| **Source** | SBOM created directly from the development environment, source files, and included dependencies used to build an product artifact. | Typically generated from software composition analysis (SCA) tooling, with manual clarifications. | +| **Build** | SBOM generated as part of the process of building the software to create a releasable artifact (e.g., executable or package) from data such as source files, dependencies, built components, build process ephemeral data, and other SBOMs. | Typically generated as part of a build process. May consist of integrated intermediate Build and Source SBOMs for a final release artifact SBOM. | +| **Analyzed** | SBOM generated through analysis of artifacts (e.g., executables, packages, containers, and virtual machine images) after its build. Such analysis generally requires a variety of heuristics. In some contexts, this may also be referred to as a “3rd party” SBOM. | Typically generated through analysis of artifacts by 3rd party tooling. | +| **Deployed** | SBOM provides an inventory of software that is present on a system. This may be an assembly of other SBOMs that combines analysis of configuration options, and examination of execution behavior in a (potentially simulated) deployment environment. | Typically generated by recording the SBOMs and configuration information of artifacts that have been installed on systems. | +| **Runtime** | SBOM generated through instrumenting the system running the software, to capture only components present in the system, as well as external call-outs or dynamically loaded components. In some contexts, this may also be referred to as an “Instrumented” or “Dynamic” SBOM. | Typically generated from tooling interacting with a system to record the artifacts present in a running environment and/or that have been executed. | + +## Understanding the Benefits and Limitations of SBOM Types + +| Type | Benefits | Limitations | +|--------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **Design** | - Highlight incompatible components ahead of licensing purchase or acquisition.
- Defines approved or recommended included component list for developer use. | - This may be very difficult to generate.
- Unlikely to identify as much detail as found in other SBOM types. | +| **Source** | - Provides visibility without access to build process.
- Can facilitate remediation of vulnerabilities at the source.
- Can provide a view into the dependency tree / hierarchy of the included components. | - Can highlight components (which might have vulnerabilities) that never run or are compiled out in deployed code.
- Depending on language/ecosystem, may not include runtime, plugin, or dynamic components, like appserver or platform libraries.
- May require references to other SBOMs for completeness. | +| **Build** | - Increases confidence that the SBOM representation of the product artifact is correct due to information available during the build and/or Continuous Integration/Continuous Deployment (CI/CD) processes.
- Provides visibility into more components than just source code.
- Increased trust by enabling signing of the SBOM and product artifact by the same build workflow. | - Potentially have to change the build process to generate this SBOM.
- Highly dependent on the build environment in which the build is executed.
- May be difficult to capture indirect and/or runtime dependencies.
- May not contain the correct versions of dynamically linked dependencies (as they may be replaced at runtime depending on language/ecosystem). | +| **Analyzed** | - Provides visibility without an active development environment, such as legacy firmware artifacts.
- Does not need access to the build process.
- Can help verify SBOM data from other sources.
- May find hidden dependencies missed by other SBOM type creation tools. | - May be prone to omissions, errors, or approximations if the tool is unable to decompose or recognize the software components precisely.
- May depend on heuristics or context-specific risk factors. | +| **Deployed** | - Highlights software components installed on a system, including other configurations and system components used to run an application. | - May require changing install and deploy processes to generate.
- May not accurately reflect the software’s runtime environment, as components may reside in inaccessible code. | +| **Runtime** | - Provides visibility to understand what is in use when the system is running, including dynamically loaded components and external connections.
- Can include detailed information about whether components are active and what parts are used. | - Requires the system to be analyzed while running, which may require additional overhead.
- Some detailed information may be available only after the system has run for a period of time until the complete functionality has been exercised. | + +## Conclusion +These definitions are meant as a starting point for clarifying SBOM types that varying tooling types and +methods may create. Different tooling approaches may be required to create the same SBOM type for +different kinds of software. This document may evolve as the innovation around SBOMs and their uses +may require the addition of more SBOM types. Progress in adopting and refining Vulnerability +Exploitability eXchange2 (i.e., VEX), service dependencies, and “SBOM of SBOMs,” among others, +may require additional types of SBOMs. + +If you would like to learn more about tooling associated with SBOMs, reach out to +SBOM@cisa.dhs.gov. \ No newline at end of file diff --git a/SBOM-wiki/sbom-working-groups.md b/SBOM-wiki/sbom-working-groups.md new file mode 100644 index 0000000..fb030fa --- /dev/null +++ b/SBOM-wiki/sbom-working-groups.md @@ -0,0 +1,99 @@ +# SBOM working groups + +## CycloneDX +To get in touch with the CycloneDX community you best join the [CycloneDX Slak](https://cyclonedx.org/slack). Further information is provided on the CycloneDX [participate page](https://cyclonedx.org/about/participate/). + +## SPDX +SPDX published their open workstreams in the following [Github repository](https://github.com/spdx/meetings) + +### General meeting
First Thursday of the month @11am ET
+* Description: General call with general updates, updates from each Team, and sometimes guest speakers (e.g., talks on how people are using SPDX, GSoC student presentations, etc.) +* [Jitsi meeting](https://meet.jit.si/SPDXGeneralMeeting) +* [Meeting minutes and agendas](https://spdx.swinslow.net/p/spdx-general-minutes) + +### Tech Team meetings
Thursday @12am ET
+* Descriptions: Regular meeting to work on drafting new versions of the SPDX specification and to discuss technical documentation and official SPDX libraries. +* [Jitsi meeting](https://zoom.us/j/663426859) +* [Meeting minutes and agendas](https://spdx.swinslow.net/p/spdx-tech-minutes) + +### Legal Team meetings
Every other Thursday @12am ET
+* Descriptions: Regular meeting to discuss submissions to SPDX License List, other license list related work, license-related aspects of the SPDX specification, and other related projects. +* .ics files for invites: [second Thursdays](./invites/spdx-legal-2024-second-thursdays.ics), [fourth Thursdays](./invites/spdx-legal-2024-fourth-thursdays.ics) +* [Meeting minutes and agendas](https://spdx.swinslow.net/p/spdx-legal-minutes) + +### Outreach Team meetings
Monday @10am ET
+* Descriptions: Regular meeting to coordinate public relations efforts and discuss current projects. +* [Jitsi meeting](https://meet.jit.si/SPDXOutreachMeeting) +* [Meeting minutes and agendas](https://hackmd.io/@spdx/outreach-team/edit) + +### Sub-groups for specific topics +#### Security Profile group meetings
Wednesdays @2pm ET
+* Description: Regular meeting to discuss representation of software vulnerability metadata in the SPDX specification including vulnerability identifiers, status, mitigations and remediations. +* [Jitsi meeting](https://meet.jit.si/SPDXDefectsMeeting) +* [Meeting minutes and agendas](https://spdx.swinslow.net/p/spdx-defects-minutes) + +#### Implementers group meetings
Wednesdays @11am ET
+* Description: Regular meeting for tool creators implementing the SPDX specification to meet and compare notes +* [Jitsi meeting](https://meet.jit.si/SPDXImplementersMeeting) +* [Meeting minutes and agendas](https://spdx.swinslow.net/p/spdx-implementers-minutes) + +#### AI and Data Profiles group meetings
Wednesdays @3pm ET
+* Description: Regular meeting to discuss how the SPDX specification can better support and track artificial intelligence and machine learning use-cases. +* [Jitsi meeting](https://zoom.us/j/92452702075) +* [Meeting minutes and agendas](https://spdx.swinslow.net/p/spdx-ai-minutes) + +#### Functional Safety Profile group meetings
Friday @12am ET
+* Description: Regular meeting to discuss how the SPDX specification can better support and track functional safety plans. +* [Jitsi meeting](https://zoom.us/j/94445183726) +* [Meeting minutes and agendas](https://spdx.swinslow.net/p/spdx-fusa-minutes) + +#### Serialisation Focus Group meetings
Thursday @11am ET
+* Description: Regular meeting to discuss the serialisation formats for SPDX, enumerating the use cases for serialisation and determining stakeholder preferences. +* [Jitsi meeting](https://meet.jit.si/SPDXSerialisationMeeting) + +#### Software as a Service Profile group meetings
Every other Monday @1pm ET
+* Description: Regular meeting to discuss how the SPDX specification can better support and track SAAS use cases. +* [Jitsi meeting](https://zoom.us/j/87627432628) + +#### Hardware Profile group meetings
Friday @9am ET
+* Description: Regular meeting to discuss how the SPDX specification can extend to support firmware, FPGAs, Open Hardware Boards, SOCs, IP blocks, Cores in physical and virtual environments. +* [Jitsi meeting](https://zoom.us/j/99157617857) +* [Meeting minutes and agendas](https://spdx.swinslow.net/p/spdx-hardware-minutes) + +#### Operations group meetings
Friday @9:30am ET
+* Descriptions: Regular meeting focused on the additional information that an organization may wish to associate with a package, for effective management of these artifacts within business operations. +* [Jitsi meeting](https://zoom-lfx.platform.linuxfoundation.org/meeting/94606881295?password=3522f337-3890-4940-9d74-9aee22864967) +* [Meeting minutes and agendas](https://spdx.swinslow.net/p/spdx-operations-minutes) + + +## CISA +CISA hosts several working groups that meet on a weekly basis. The original meeting notes can be found [here](https://docs.google.com/document/d/1itBra03riwVIgvrn1xp35DuvCFOJ6T8DJgs_3pSxsCM/edit). Reach out to SBOM@cisa.dhs.gov to get an invite or further information. + +- [CISA SBOM Events Calendar](https://calendar.google.com/calendar/u/0/embed?src=hqnbr3lk8ngjgv04g6ir5d5duc@group.calendar.google.com&ctz=America/New_York) A calendar for all SBOM related workstreams and upcoming events. + +### SBOM Community Central Meeting
Monday @11am ET
+- [Link to Google Meeting Notes](https://docs.google.com/document/d/1wwFWk2ymzb4FpmuMt2vnIqKqNnzxKq-QHx_2zrQ4MNg/edit#heading=h.f0icpudrrs5j) + +### VEX sub-group
Monday @10am ET
+- [Link to Google Meeting Notes](https://docs.google.com/document/d/1uF29lTr0OJ_QwUfuej1EfhFgDIziEj5U1x_bZ3V_8bQ/edit?usp=sharing) +- [Google Group CISA SBOM vex](https://groups.google.com/g/cisa-sbom-vex) + +### SBOM adoption work stream
Tuesday @12pm ET
+- [Link to Google Meeting Notes](https://docs.google.com/document/d/1ssvft4gGjMc_mGabsc-aMETYrfbIzgQ8fnRCY_cKTrA/edit?usp=sharing) +- [Google Group CISA SBOM adoption](https://groups.google.com/g/cisa-sbom-adoption) + +### SBOM tooling work stream
Thursday @3pm ET
+- [Link to Google Meeting Notes](https://docs.google.com/document/d/1itBra03riwVIgvrn1xp35DuvCFOJ6T8DJgs_3pSxsCM/edit?usp=sharing) +- [Microsoft Teams Invitation](https://teams.microsoft.com/l/meetup-join/19%3ameeting_ZjhhZWYwYTItMzM3OC00ZjA0LWE5ZTEtZGI4N2I3NzcxOTJm%40thread.v2/0?context=%7b%22Tid%22%3a%223ccde76c-946d-4a12-bb7a-fc9d0842354a%22%2c%22Oid%22%3a%2290b42674-467a-4f0e-bd44-241c1c69d558%22%7d) +- [Google Group CISA SBOM tooling](https://groups.google.com/g/cisa-sbom-tooling) + +## OpenSSF (SBOM everywhere)
Every other Tuesday @11am ET
+The SBOM Everywhere Special Interest Group came from OpenSSF’s Open Source Software Security Mobilization Plan. The SBOM Everywhere SIG focuses on improving SBOM tooling and training to drive adoption. It's also running this site. Further information in the [about us](/about-us) section. +- [OpenSSF community Calendar](https://calendar.google.com/calendar/u/0/r?cid=czYzdm9lZmhwNWk5cGZsdGI1cTY3bmdwZXNAZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ) +- [Meeting Notes](https://docs.google.com/document/d/193ODRga1F49WKPYYR79SNi9b27mChBqpOf5iiWJcMso/edit) + + +## Anchore OSS Community Meeting
Every other Thursday @11am ET
+Anchore is hosting a community meeting for their open source projects Syft and Grype. +- [OpenSSF community Calendar](https://calendar.google.com/calendar/u/0/r?cid=Y182OTM4dGt0MjRtajI0NnNzOThiaGtnM29qNEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t) +- [Meeting Notes](https://docs.google.com/document/d/1ZtSAa6fj2a6KRWviTn3WoJm09edvrNUp4Iz_dOjjyY8/edit?usp=sharing) \ No newline at end of file From 933e8a078dac147866fe8dfa725e4a047ea77771 Mon Sep 17 00:00:00 2001 From: Mariuxdeangelo Date: Tue, 2 Jul 2024 22:56:12 +0200 Subject: [PATCH 2/2] changing github pages release trigger Signed-off-by: Mariuxdeangelo --- .github/workflows/build-and-publish-page.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-publish-page.yml b/.github/workflows/build-and-publish-page.yml index 358c203..a5c1be0 100644 --- a/.github/workflows/build-and-publish-page.yml +++ b/.github/workflows/build-and-publish-page.yml @@ -1,8 +1,9 @@ name: Node.js CI on: - release: - types: [published] + push: + branches: + - main workflow_dispatch: