Add release workflow, update license, and bump version to 0.1.1
Seto Elkahfi committed
Apr 14, 2026 at 20:01 UTC
68653a2f7c52a3a0b785363e3b3d82462d17209e
4 files changed
+439
-44
.github/workflows/release.yml
+189
new file mode 100644
index 0000000..cebac16
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,189 @@
+name: Release
+
+on:
+ push:
+ tags:
+ - "v*.*.*"
+ workflow_dispatch:
+ inputs:
+ tag:
+ description: "Release tag (e.g. v0.1.0)"
+ required: true
+
+permissions:
+ contents: write
+
+env:
+ CARGO_TERM_COLOR: always
+
+jobs:
+ build:
+ name: Build ${{ matrix.artifact }}
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - target: aarch64-apple-darwin
+ os: macos-latest
+ artifact: sigit-darwin-aarch64
+ binary: sigit
+ archive_ext: tar.gz
+
+ - target: x86_64-apple-darwin
+ os: macos-13
+ artifact: sigit-darwin-x86_64
+ binary: sigit
+ archive_ext: tar.gz
+
+ - target: x86_64-unknown-linux-gnu
+ os: ubuntu-latest
+ artifact: sigit-linux-x86_64
+ binary: sigit
+ archive_ext: tar.gz
+
+ - target: aarch64-unknown-linux-gnu
+ os: ubuntu-24.04-arm
+ artifact: sigit-linux-aarch64
+ binary: sigit
+ archive_ext: tar.gz
+
+ - target: x86_64-pc-windows-msvc
+ os: windows-latest
+ artifact: sigit-windows-x86_64
+ binary: sigit.exe
+ archive_ext: zip
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v6
+ with:
+ ref: ${{ github.event.inputs.tag || github.ref }}
+
+ - name: Set release version
+ shell: bash
+ run: |
+ if [[ "${GITHUB_REF_TYPE}" == "tag" ]]; then
+ release_version="${GITHUB_REF_NAME#v}"
+ else
+ release_version="${{ github.event.inputs.tag }}"
+ release_version="${release_version#v}"
+ fi
+
+ echo "RELEASE_VERSION=${release_version}" >> "$GITHUB_ENV"
+
+ - name: Verify Cargo.toml version matches tag
+ shell: bash
+ run: |
+ CARGO_VERSION=$(cargo metadata --no-deps --format-version 1 \
+ | jq -r '.packages[] | select(.name == "sigit") | .version')
+
+ echo "Cargo.toml version : ${CARGO_VERSION}"
+ echo "Release tag version: ${RELEASE_VERSION}"
+
+ if [[ "${CARGO_VERSION}" != "${RELEASE_VERSION}" ]]; then
+ echo "::error::Version mismatch — bump Cargo.toml version before tagging."
+ exit 1
+ fi
+
+ - name: Install Rust toolchain
+ uses: dtolnay/rust-toolchain@stable
+ with:
+ targets: ${{ matrix.target }}
+
+ - name: Setup Rust cache
+ uses: Swatinem/rust-cache@v2
+ with:
+ key: release-${{ matrix.target }}
+
+ - name: Build
+ shell: bash
+ run: cargo build --release --locked --target ${{ matrix.target }}
+
+ - name: Package (tar.gz)
+ if: matrix.archive_ext == 'tar.gz'
+ shell: bash
+ run: |
+ binary="target/${{ matrix.target }}/release/${{ matrix.binary }}"
+ archive="${{ matrix.artifact }}.tar.gz"
+
+ tar -czf "${archive}" -C "$(dirname "${binary}")" "${{ matrix.binary }}"
+
+ echo "ARCHIVE=${archive}" >> "$GITHUB_ENV"
+
+ - name: Package (zip)
+ if: matrix.archive_ext == 'zip'
+ shell: pwsh
+ run: |
+ $binary = "target\${{ matrix.target }}\release\${{ matrix.binary }}"
+ $archive = "${{ matrix.artifact }}.zip"
+
+ Compress-Archive -Path $binary -DestinationPath $archive
+
+ "ARCHIVE=$archive" | Out-File -FilePath $env:GITHUB_ENV -Append
+
+ - name: Upload archive
+ uses: actions/upload-artifact@v4
+ with:
+ name: ${{ matrix.artifact }}
+ path: ${{ env.ARCHIVE }}
+ if-no-files-found: error
+ retention-days: 1
+
+ release:
+ name: Publish GitHub Release
+ needs: build
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v6
+ with:
+ ref: ${{ github.event.inputs.tag || github.ref }}
+
+ - name: Set release version and tag
+ shell: bash
+ run: |
+ if [[ "${GITHUB_REF_TYPE}" == "tag" ]]; then
+ release_tag="${GITHUB_REF_NAME}"
+ release_version="${GITHUB_REF_NAME#v}"
+ else
+ release_tag="${{ github.event.inputs.tag }}"
+ release_version="${{ github.event.inputs.tag }}"
+ release_version="${release_version#v}"
+ fi
+
+ echo "RELEASE_TAG=${release_tag}" >> "$GITHUB_ENV"
+ echo "RELEASE_VERSION=${release_version}" >> "$GITHUB_ENV"
+
+ - name: Download all archives
+ uses: actions/download-artifact@v4
+ with:
+ path: archives
+ merge-multiple: true
+
+ - name: Check whether release already exists
+ id: release-check
+ shell: bash
+ run: |
+ if gh release view "${RELEASE_TAG}" --repo "${{ github.repository }}" >/dev/null 2>&1; then
+ echo "Release ${RELEASE_TAG} already exists — skipping."
+ echo "exists=true" >> "$GITHUB_OUTPUT"
+ else
+ echo "exists=false" >> "$GITHUB_OUTPUT"
+ fi
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Create release and upload archives
+ if: steps.release-check.outputs.exists != 'true'
+ shell: bash
+ run: |
+ gh release create "${RELEASE_TAG}" \
+ --title "siGit ${RELEASE_TAG}" \
+ --generate-notes \
+ archives/*
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Cargo.lock
+57
-41
index a994f4f..76708c2 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1056,16 +1056,15 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]]
name = "crossterm"
-version = "0.28.1"
+version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6"
+checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67"
dependencies = [
- "bitflags 2.11.0",
+ "bitflags 1.3.2",
"crossterm_winapi",
- "futures-core",
- "mio",
+ "libc",
+ "mio 0.8.11",
"parking_lot",
- "rustix 0.38.44",
"signal-hook",
"signal-hook-mio",
"winapi",
@@ -1073,17 +1072,16 @@ dependencies = [
[[package]]
name = "crossterm"
-version = "0.29.0"
+version = "0.28.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b"
+checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6"
dependencies = [
"bitflags 2.11.0",
"crossterm_winapi",
- "derive_more",
- "document-features",
- "mio",
+ "futures-core",
+ "mio 1.2.0",
"parking_lot",
- "rustix 1.1.4",
+ "rustix 0.38.44",
"signal-hook",
"signal-hook-mio",
"winapi",
@@ -1437,15 +1435,6 @@ version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2db04e74f0a9a93103b50e90b96024c9b2bdca8bce6a632ec71b88736d3d359"
-[[package]]
-name = "document-features"
-version = "0.2.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61"
-dependencies = [
- "litrs",
-]
-
[[package]]
name = "dtoa"
version = "1.0.11"
@@ -3027,12 +3016,6 @@ version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0"
-[[package]]
-name = "litrs"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092"
-
[[package]]
name = "llguidance"
version = "1.7.2"
@@ -3287,6 +3270,18 @@ dependencies = [
"simd-adler32",
]
+[[package]]
+name = "mio"
+version = "0.8.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
+dependencies = [
+ "libc",
+ "log",
+ "wasi",
+ "windows-sys 0.48.0",
+]
+
[[package]]
name = "mio"
version = "1.2.0"
@@ -3302,7 +3297,8 @@ dependencies = [
[[package]]
name = "mistralrs"
version = "0.8.1"
-source = "git+https://github.com/setoelkahfi/mistral.rs?branch=fix%2Fall-platform-fixes#a27af8ea01123e5d5777120619413345989f4006"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9bb0a83340b4492ebba9760ba6845364de369c7e10c1f91af8733d574c7405fa"
dependencies = [
"anyhow",
"candle-core",
@@ -3329,7 +3325,8 @@ dependencies = [
[[package]]
name = "mistralrs-audio"
version = "0.8.1"
-source = "git+https://github.com/setoelkahfi/mistral.rs?branch=fix%2Fall-platform-fixes#a27af8ea01123e5d5777120619413345989f4006"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ac5d36f634c7c20c45845bc995be3b6387ab01048410386a5b180cfeaf89c72"
dependencies = [
"anyhow",
"apodize",
@@ -3340,7 +3337,8 @@ dependencies = [
[[package]]
name = "mistralrs-core"
version = "0.8.1"
-source = "git+https://github.com/setoelkahfi/mistral.rs?branch=fix%2Fall-platform-fixes#a27af8ea01123e5d5777120619413345989f4006"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2b8b9e5c94491d9ceeded3a30291cb6af6ae74810a5776dd55e3bbb8b3429d4"
dependencies = [
"ahash",
"akin",
@@ -3437,7 +3435,8 @@ dependencies = [
[[package]]
name = "mistralrs-macros"
version = "0.8.1"
-source = "git+https://github.com/setoelkahfi/mistral.rs?branch=fix%2Fall-platform-fixes#a27af8ea01123e5d5777120619413345989f4006"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5aa9b4794322d3f89fe61d21f33f67be494c16d5bd869604b111218f32544d32"
dependencies = [
"darling 0.23.0",
"proc-macro2",
@@ -3448,7 +3447,8 @@ dependencies = [
[[package]]
name = "mistralrs-mcp"
version = "0.8.1"
-source = "git+https://github.com/setoelkahfi/mistral.rs?branch=fix%2Fall-platform-fixes#a27af8ea01123e5d5777120619413345989f4006"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fa97d4e3189ed80ebbc730b7da5b2356df0ae004ab489066249340c33c089ab"
dependencies = [
"anyhow",
"async-trait",
@@ -3468,7 +3468,8 @@ dependencies = [
[[package]]
name = "mistralrs-paged-attn"
version = "0.8.1"
-source = "git+https://github.com/setoelkahfi/mistral.rs?branch=fix%2Fall-platform-fixes#a27af8ea01123e5d5777120619413345989f4006"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e53ddf1537426997b46abdadbe6ca8a7ce7668004ed2b7cf00115016558bae8"
dependencies = [
"anyhow",
"candle-core",
@@ -3484,7 +3485,8 @@ dependencies = [
[[package]]
name = "mistralrs-quant"
version = "0.8.1"
-source = "git+https://github.com/setoelkahfi/mistral.rs?branch=fix%2Fall-platform-fixes#a27af8ea01123e5d5777120619413345989f4006"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "980715493d252e9aaf0779c4c101576d67ef4dd9812bfd77a54987f6f17526f4"
dependencies = [
"byteorder",
"candle-core",
@@ -3513,7 +3515,8 @@ dependencies = [
[[package]]
name = "mistralrs-vision"
version = "0.8.1"
-source = "git+https://github.com/setoelkahfi/mistral.rs?branch=fix%2Fall-platform-fixes#a27af8ea01123e5d5777120619413345989f4006"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "10046a3da2de5b702d3e829b5ddef7aa829ad454819dcc4876dea481a6cb5456"
dependencies = [
"candle-core",
"image",
@@ -3827,7 +3830,9 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
[[package]]
name = "onde"
-version = "0.1.3"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "939495589fec914220491600a00bddedcba437e5fd5e3926ca1af2e8da681bb0"
dependencies = [
"anyhow",
"cc",
@@ -5292,7 +5297,7 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
name = "sigit"
-version = "0.1.0"
+version = "0.1.1"
dependencies = [
"agent-client-protocol",
"anyhow",
@@ -5325,7 +5330,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc"
dependencies = [
"libc",
- "mio",
+ "mio 0.8.11",
+ "mio 1.2.0",
"signal-hook",
]
@@ -6106,7 +6112,7 @@ checksum = "f66bf9585cda4b724d3e78ab34b73fb2bbaba9011b9bfdf69dc836382ea13b8c"
dependencies = [
"bytes",
"libc",
- "mio",
+ "mio 1.2.0",
"parking_lot",
"pin-project-lite",
"signal-hook-registry",
@@ -6286,10 +6292,11 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
[[package]]
name = "tqdm"
version = "0.8.0"
-source = "git+https://github.com/setoelkahfi/tqdm?branch=deps%2Fbump-crossterm#41e4182829136e6dadbdd1c36af824d19219147a"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b316d5c2ac649ca856dacd487d0ebb94f3b746bada51355d93dd2c007ab62a2e"
dependencies = [
"anyhow",
- "crossterm 0.29.0",
+ "crossterm 0.25.0",
"once_cell",
]
@@ -7266,6 +7273,15 @@ dependencies = [
"windows-targets 0.42.2",
]
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets 0.48.5",
+]
+
[[package]]
name = "windows-sys"
version = "0.52.0"
Cargo.toml
+3
-3
index a5d8bca..b9fc36c 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,10 +1,10 @@
[package]
name = "sigit"
-version = "0.1.0"
+version = "0.1.1"
edition = "2024"
description = "siGit Code — ACP-compatible AI coding agent for smbCloud platform."
documentation = "https://getsigit.5mb.app/"
-license = "MIT OR Apache-2.0"
+license = "Apache-2.0"
[[bin]]
name = "sigit"
@@ -15,7 +15,7 @@ path = "src/main.rs"
agent-client-protocol = "0.10.4"
# Onde Inference engine (local LLM)
-onde = { path = "../onde" }
+onde = { version = "0.1.4" }
# Async runtime
async-trait = "0.1"
LICENSE
+190
new file mode 100644
index 0000000..e965300
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,190 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship made available under
+ the License, as indicated by a copyright notice that is included in
+ or attached to the work (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean, as defined by the copyright owner or by the
+ Legal Entity authorized to submit on behalf of the copyright owner, any
+ work of authorship, including the original version of the Work and any
+ modifications or additions to that Work or Derivative Works of the Work.
+
+ "Contributor" shall mean Licensor and any Legal Entity on behalf of
+ whom a Contribution has been received by the Licensor and subsequently
+ incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any and all patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, You must include a readable copy of the
+ attribution notices contained within such NOTICE file, in
+ at least one of the following places: within a NOTICE text
+ file distributed as part of the Derivative Works; within
+ the Source form or documentation, if provided along with the
+ Derivative Works; or, within a display generated by the
+ Derivative Works, if and wherever such third-party notices
+ normally appear. The contents of the NOTICE file are for
+ informational purposes only and do not modify the License.
+ You may add Your own attribution notices within Derivative
+ Works that You distribute, alongside or as an addendum to
+ the NOTICE text from the Work, provided that such additional
+ attribution notices cannot be construed as modifying the License.
+
+ You may add Your own license statement for Your modifications and
+ may provide additional grant of rights to use, copy, modify, merge,
+ publish, distribute, sublicense, and/or sell copies of the Work,
+ and to permit persons to whom the Work is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Work.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or exemplary damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or all other
+ commercial damages or losses), even if such Contributor has been
+ advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format in use. Also, it is recommended
+ that a file or directory name be given on the same line as the
+ copyright notice for easier identification within third-party archives.
+
+ Copyright 2026 Seto Elkahfi
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.