{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-4+qual-2+sec-2","generated_at":"2026-11-14T00:02:13.264865Z","repo":{"ref":{"host":"github.com","owner":"bestruirui","name":"octopus"},"default_branch":"master","clone_url":"https://github.com/bestruirui/octopus.git","html_url":"https://github.com/bestruirui/octopus","description":"One Hub All LLMs For You | 为个人打造的 LLM API 聚合网关","stars":2749,"forks":447,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":13388,"primary_language":"TypeScript","license_spdx":"AGPL-3.0","created_at":"2025-11-18T01:41:03Z","pushed_at":"2026-10-23T00:51:48Z","security_policy_url":null,"distribution":{"owner_created_at":"2021-08-30T15:53:36Z","owner_type":"User","release_assets":[{"name":"octopus-android-386.zip","size":23498571,"download_count":15,"release_tag":"v0.13.13","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.13/octopus-android-386.zip"},{"name":"octopus-android-amd64.zip","size":22883049,"download_count":16,"release_tag":"v0.13.13","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.13/octopus-android-amd64.zip"},{"name":"octopus-android-arm.zip","size":22350077,"download_count":15,"release_tag":"v0.13.13","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.13/octopus-android-arm.zip"},{"name":"octopus-android-arm64.zip","size":21622501,"download_count":20,"release_tag":"v0.13.13","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.13/octopus-android-arm64.zip"},{"name":"octopus-darwin-amd64.zip","size":22588931,"download_count":65,"release_tag":"v0.13.13","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.13/octopus-darwin-amd64.zip"},{"name":"octopus-darwin-arm64.zip","size":21456333,"download_count":60,"release_tag":"v0.13.13","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.13/octopus-darwin-arm64.zip"},{"name":"octopus-linux-386.zip","size":21476252,"download_count":13,"release_tag":"v0.13.13","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.13/octopus-linux-386.zip"},{"name":"octopus-linux-amd64.zip","size":22403895,"download_count":248,"release_tag":"v0.13.13","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.13/octopus-linux-amd64.zip"},{"name":"octopus-linux-arm.zip","size":21416443,"download_count":12,"release_tag":"v0.13.13","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.13/octopus-linux-arm.zip"},{"name":"octopus-linux-arm64.zip","size":20879872,"download_count":85,"release_tag":"v0.13.13","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.13/octopus-linux-arm64.zip"},{"name":"octopus-windows-amd64.zip","size":22521534,"download_count":289,"release_tag":"v0.13.13","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.13/octopus-windows-amd64.zip"},{"name":"SHA256SUMS","size":1016,"download_count":49,"release_tag":"v0.13.13","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.13/SHA256SUMS"},{"name":"octopus-android-386.zip","size":23457844,"download_count":7,"release_tag":"v0.13.12","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.12/octopus-android-386.zip"},{"name":"octopus-android-amd64.zip","size":22850059,"download_count":7,"release_tag":"v0.13.12","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.12/octopus-android-amd64.zip"},{"name":"octopus-android-arm.zip","size":22310846,"download_count":7,"release_tag":"v0.13.12","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.12/octopus-android-arm.zip"},{"name":"octopus-android-arm64.zip","size":21587446,"download_count":22,"release_tag":"v0.13.12","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.12/octopus-android-arm64.zip"},{"name":"octopus-darwin-amd64.zip","size":22557297,"download_count":25,"release_tag":"v0.13.12","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.12/octopus-darwin-amd64.zip"},{"name":"octopus-darwin-arm64.zip","size":21419276,"download_count":34,"release_tag":"v0.13.12","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.12/octopus-darwin-arm64.zip"},{"name":"octopus-linux-386.zip","size":21441509,"download_count":6,"release_tag":"v0.13.12","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.12/octopus-linux-386.zip"},{"name":"octopus-linux-amd64.zip","size":22371617,"download_count":164,"release_tag":"v0.13.12","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.12/octopus-linux-amd64.zip"},{"name":"octopus-linux-arm.zip","size":21381736,"download_count":6,"release_tag":"v0.13.12","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.12/octopus-linux-arm.zip"},{"name":"octopus-linux-arm64.zip","size":20842279,"download_count":39,"release_tag":"v0.13.12","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.12/octopus-linux-arm64.zip"},{"name":"octopus-windows-amd64.zip","size":22482722,"download_count":205,"release_tag":"v0.13.12","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.12/octopus-windows-amd64.zip"},{"name":"SHA256SUMS","size":1016,"download_count":44,"release_tag":"v0.13.12","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.12/SHA256SUMS"},{"name":"octopus-android-386.zip","size":23448389,"download_count":3,"release_tag":"v0.13.11","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.11/octopus-android-386.zip"},{"name":"octopus-android-amd64.zip","size":22835387,"download_count":3,"release_tag":"v0.13.11","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.11/octopus-android-amd64.zip"},{"name":"octopus-android-arm.zip","size":22299975,"download_count":1,"release_tag":"v0.13.11","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.11/octopus-android-arm.zip"},{"name":"octopus-android-arm64.zip","size":21572898,"download_count":2,"release_tag":"v0.13.11","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.11/octopus-android-arm64.zip"},{"name":"octopus-darwin-amd64.zip","size":22544201,"download_count":5,"release_tag":"v0.13.11","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.11/octopus-darwin-amd64.zip"},{"name":"octopus-darwin-arm64.zip","size":21403376,"download_count":5,"release_tag":"v0.13.11","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.11/octopus-darwin-arm64.zip"},{"name":"octopus-linux-386.zip","size":21428741,"download_count":2,"release_tag":"v0.13.11","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.11/octopus-linux-386.zip"},{"name":"octopus-linux-amd64.zip","size":22358763,"download_count":41,"release_tag":"v0.13.11","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.11/octopus-linux-amd64.zip"},{"name":"octopus-linux-arm.zip","size":21369651,"download_count":2,"release_tag":"v0.13.11","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.11/octopus-linux-arm.zip"},{"name":"octopus-linux-arm64.zip","size":20828525,"download_count":7,"release_tag":"v0.13.11","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.11/octopus-linux-arm64.zip"},{"name":"octopus-windows-amd64.zip","size":22471818,"download_count":82,"release_tag":"v0.13.11","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.11/octopus-windows-amd64.zip"},{"name":"SHA256SUMS","size":1016,"download_count":2,"release_tag":"v0.13.11","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.11/SHA256SUMS"},{"name":"octopus-android-386.zip","size":23440682,"download_count":7,"release_tag":"v0.13.10","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.10/octopus-android-386.zip"},{"name":"octopus-android-amd64.zip","size":22830233,"download_count":6,"release_tag":"v0.13.10","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.10/octopus-android-amd64.zip"},{"name":"octopus-android-arm.zip","size":22295007,"download_count":5,"release_tag":"v0.13.10","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.10/octopus-android-arm.zip"},{"name":"octopus-android-arm64.zip","size":21568989,"download_count":6,"release_tag":"v0.13.10","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.10/octopus-android-arm64.zip"},{"name":"octopus-darwin-amd64.zip","size":22535986,"download_count":37,"release_tag":"v0.13.10","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.10/octopus-darwin-amd64.zip"},{"name":"octopus-darwin-arm64.zip","size":21399615,"download_count":31,"release_tag":"v0.13.10","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.10/octopus-darwin-arm64.zip"},{"name":"octopus-linux-386.zip","size":21423031,"download_count":5,"release_tag":"v0.13.10","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.10/octopus-linux-386.zip"},{"name":"octopus-linux-amd64.zip","size":22353567,"download_count":126,"release_tag":"v0.13.10","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.10/octopus-linux-amd64.zip"},{"name":"octopus-linux-arm.zip","size":21364638,"download_count":6,"release_tag":"v0.13.10","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.10/octopus-linux-arm.zip"},{"name":"octopus-linux-arm64.zip","size":20825635,"download_count":40,"release_tag":"v0.13.10","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.10/octopus-linux-arm64.zip"},{"name":"octopus-windows-amd64.zip","size":22462997,"download_count":185,"release_tag":"v0.13.10","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.10/octopus-windows-amd64.zip"},{"name":"SHA256SUMS","size":1016,"download_count":23,"release_tag":"v0.13.10","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.10/SHA256SUMS"},{"name":"octopus-android-386.zip","size":23425342,"download_count":10,"release_tag":"v0.13.9","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.9/octopus-android-386.zip"},{"name":"octopus-android-amd64.zip","size":22815812,"download_count":9,"release_tag":"v0.13.9","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.9/octopus-android-amd64.zip"},{"name":"octopus-android-arm.zip","size":22283084,"download_count":6,"release_tag":"v0.13.9","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.9/octopus-android-arm.zip"},{"name":"octopus-android-arm64.zip","size":21555328,"download_count":11,"release_tag":"v0.13.9","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.9/octopus-android-arm64.zip"},{"name":"octopus-darwin-amd64.zip","size":22524173,"download_count":53,"release_tag":"v0.13.9","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.9/octopus-darwin-amd64.zip"},{"name":"octopus-darwin-arm64.zip","size":21388612,"download_count":55,"release_tag":"v0.13.9","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.9/octopus-darwin-arm64.zip"},{"name":"octopus-linux-386.zip","size":21412141,"download_count":6,"release_tag":"v0.13.9","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.9/octopus-linux-386.zip"},{"name":"octopus-linux-amd64.zip","size":22342056,"download_count":116,"release_tag":"v0.13.9","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.9/octopus-linux-amd64.zip"},{"name":"octopus-linux-arm.zip","size":21351282,"download_count":6,"release_tag":"v0.13.9","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.9/octopus-linux-arm.zip"},{"name":"octopus-linux-arm64.zip","size":20816967,"download_count":59,"release_tag":"v0.13.9","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.9/octopus-linux-arm64.zip"},{"name":"octopus-windows-amd64.zip","size":22450066,"download_count":220,"release_tag":"v0.13.9","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.9/octopus-windows-amd64.zip"},{"name":"SHA256SUMS","size":1016,"download_count":46,"release_tag":"v0.13.9","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.9/SHA256SUMS"},{"name":"octopus-android-386.zip","size":23442221,"download_count":5,"release_tag":"v0.13.8","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.8/octopus-android-386.zip"},{"name":"octopus-android-amd64.zip","size":22844823,"download_count":6,"release_tag":"v0.13.8","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.8/octopus-android-amd64.zip"},{"name":"octopus-android-arm.zip","size":22315420,"download_count":4,"release_tag":"v0.13.8","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.8/octopus-android-arm.zip"},{"name":"octopus-android-arm64.zip","size":21578854,"download_count":6,"release_tag":"v0.13.8","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.8/octopus-android-arm64.zip"},{"name":"octopus-darwin-amd64.zip","size":22646209,"download_count":55,"release_tag":"v0.13.8","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.8/octopus-darwin-amd64.zip"},{"name":"octopus-darwin-arm64.zip","size":21498132,"download_count":56,"release_tag":"v0.13.8","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.8/octopus-darwin-arm64.zip"},{"name":"octopus-linux-386.zip","size":21439964,"download_count":5,"release_tag":"v0.13.8","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.8/octopus-linux-386.zip"},{"name":"octopus-linux-amd64.zip","size":22366936,"download_count":176,"release_tag":"v0.13.8","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.8/octopus-linux-amd64.zip"},{"name":"octopus-linux-arm.zip","size":21393864,"download_count":5,"release_tag":"v0.13.8","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.8/octopus-linux-arm.zip"},{"name":"octopus-linux-arm64.zip","size":20836883,"download_count":61,"release_tag":"v0.13.8","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.8/octopus-linux-arm64.zip"},{"name":"octopus-windows-amd64.zip","size":22575202,"download_count":274,"release_tag":"v0.13.8","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.8/octopus-windows-amd64.zip"},{"name":"SHA256SUMS","size":1016,"download_count":39,"release_tag":"v0.13.8","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.8/SHA256SUMS"},{"name":"octopus-android-386.zip","size":23418753,"download_count":1,"release_tag":"v0.13.7","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.7/octopus-android-386.zip"},{"name":"octopus-android-amd64.zip","size":22818357,"download_count":1,"release_tag":"v0.13.7","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.7/octopus-android-amd64.zip"},{"name":"octopus-android-arm.zip","size":22295491,"download_count":1,"release_tag":"v0.13.7","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.7/octopus-android-arm.zip"},{"name":"octopus-android-arm64.zip","size":21560440,"download_count":1,"release_tag":"v0.13.7","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.7/octopus-android-arm64.zip"},{"name":"octopus-darwin-amd64.zip","size":22623178,"download_count":5,"release_tag":"v0.13.7","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.7/octopus-darwin-amd64.zip"},{"name":"octopus-darwin-arm64.zip","size":21478683,"download_count":3,"release_tag":"v0.13.7","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.7/octopus-darwin-arm64.zip"},{"name":"octopus-linux-386.zip","size":21421352,"download_count":1,"release_tag":"v0.13.7","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.7/octopus-linux-386.zip"},{"name":"octopus-linux-amd64.zip","size":22343354,"download_count":22,"release_tag":"v0.13.7","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.7/octopus-linux-amd64.zip"},{"name":"octopus-linux-arm.zip","size":21375313,"download_count":1,"release_tag":"v0.13.7","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.7/octopus-linux-arm.zip"},{"name":"octopus-linux-arm64.zip","size":20818543,"download_count":5,"release_tag":"v0.13.7","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.7/octopus-linux-arm64.zip"},{"name":"octopus-windows-amd64.zip","size":22552380,"download_count":12,"release_tag":"v0.13.7","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.7/octopus-windows-amd64.zip"},{"name":"SHA256SUMS","size":1016,"download_count":5,"release_tag":"v0.13.7","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.7/SHA256SUMS"},{"name":"octopus-android-386.zip","size":23416116,"download_count":4,"release_tag":"v0.13.6","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.6/octopus-android-386.zip"},{"name":"octopus-android-amd64.zip","size":22820265,"download_count":4,"release_tag":"v0.13.6","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.6/octopus-android-amd64.zip"},{"name":"octopus-android-arm.zip","size":22296080,"download_count":2,"release_tag":"v0.13.6","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.6/octopus-android-arm.zip"},{"name":"octopus-android-arm64.zip","size":21560565,"download_count":6,"release_tag":"v0.13.6","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.6/octopus-android-arm64.zip"},{"name":"octopus-darwin-amd64.zip","size":22622407,"download_count":33,"release_tag":"v0.13.6","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.6/octopus-darwin-amd64.zip"},{"name":"octopus-darwin-arm64.zip","size":21480446,"download_count":33,"release_tag":"v0.13.6","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.6/octopus-darwin-arm64.zip"},{"name":"octopus-linux-386.zip","size":21420179,"download_count":2,"release_tag":"v0.13.6","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.6/octopus-linux-386.zip"},{"name":"octopus-linux-amd64.zip","size":22343938,"download_count":106,"release_tag":"v0.13.6","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.6/octopus-linux-amd64.zip"},{"name":"octopus-linux-arm.zip","size":21377003,"download_count":2,"release_tag":"v0.13.6","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.6/octopus-linux-arm.zip"},{"name":"octopus-linux-arm64.zip","size":20818143,"download_count":37,"release_tag":"v0.13.6","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.6/octopus-linux-arm64.zip"},{"name":"octopus-windows-amd64.zip","size":22552799,"download_count":190,"release_tag":"v0.13.6","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.6/octopus-windows-amd64.zip"},{"name":"SHA256SUMS","size":1016,"download_count":16,"release_tag":"v0.13.6","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.6/SHA256SUMS"},{"name":"octopus-android-386.zip","size":23418577,"download_count":3,"release_tag":"v0.13.5","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.5/octopus-android-386.zip"},{"name":"octopus-android-amd64.zip","size":22822279,"download_count":3,"release_tag":"v0.13.5","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.5/octopus-android-amd64.zip"},{"name":"octopus-android-arm.zip","size":22295337,"download_count":3,"release_tag":"v0.13.5","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.5/octopus-android-arm.zip"},{"name":"octopus-android-arm64.zip","size":21560723,"download_count":3,"release_tag":"v0.13.5","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.5/octopus-android-arm64.zip"},{"name":"octopus-darwin-amd64.zip","size":22622562,"download_count":10,"release_tag":"v0.13.5","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.5/octopus-darwin-amd64.zip"},{"name":"octopus-darwin-arm64.zip","size":21478659,"download_count":10,"release_tag":"v0.13.5","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.5/octopus-darwin-arm64.zip"},{"name":"octopus-linux-386.zip","size":21420026,"download_count":3,"release_tag":"v0.13.5","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.5/octopus-linux-386.zip"},{"name":"octopus-linux-amd64.zip","size":22343844,"download_count":38,"release_tag":"v0.13.5","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.5/octopus-linux-amd64.zip"},{"name":"octopus-linux-arm.zip","size":21376649,"download_count":3,"release_tag":"v0.13.5","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.5/octopus-linux-arm.zip"},{"name":"octopus-linux-arm64.zip","size":20817731,"download_count":11,"release_tag":"v0.13.5","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.5/octopus-linux-arm64.zip"},{"name":"octopus-windows-amd64.zip","size":22552807,"download_count":137,"release_tag":"v0.13.5","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.5/octopus-windows-amd64.zip"},{"name":"SHA256SUMS","size":1016,"download_count":7,"release_tag":"v0.13.5","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.5/SHA256SUMS"},{"name":"octopus-android-386.zip","size":23411445,"download_count":5,"release_tag":"v0.13.4","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.4/octopus-android-386.zip"},{"name":"octopus-android-amd64.zip","size":22817531,"download_count":5,"release_tag":"v0.13.4","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.4/octopus-android-amd64.zip"},{"name":"octopus-android-arm.zip","size":22284937,"download_count":4,"release_tag":"v0.13.4","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.4/octopus-android-arm.zip"},{"name":"octopus-android-arm64.zip","size":21552829,"download_count":23,"release_tag":"v0.13.4","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.4/octopus-android-arm64.zip"},{"name":"octopus-darwin-amd64.zip","size":22619016,"download_count":39,"release_tag":"v0.13.4","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.4/octopus-darwin-amd64.zip"},{"name":"octopus-darwin-arm64.zip","size":21473855,"download_count":84,"release_tag":"v0.13.4","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.4/octopus-darwin-arm64.zip"},{"name":"octopus-linux-386.zip","size":21416352,"download_count":3,"release_tag":"v0.13.4","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.4/octopus-linux-386.zip"},{"name":"octopus-linux-amd64.zip","size":22337778,"download_count":185,"release_tag":"v0.13.4","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.4/octopus-linux-amd64.zip"},{"name":"octopus-linux-arm.zip","size":21368909,"download_count":3,"release_tag":"v0.13.4","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.4/octopus-linux-arm.zip"},{"name":"octopus-linux-arm64.zip","size":20814574,"download_count":95,"release_tag":"v0.13.4","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.4/octopus-linux-arm64.zip"},{"name":"octopus-windows-amd64.zip","size":22548272,"download_count":275,"release_tag":"v0.13.4","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.4/octopus-windows-amd64.zip"},{"name":"SHA256SUMS","size":1016,"download_count":49,"release_tag":"v0.13.4","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.4/SHA256SUMS"}]}},"commit_sha":"8aa58b0340ba2de58ce74fbfacd32597c44842a2","profile":{"lines_by_language":{"TypeScript":12691,"Go":9628,"JavaScript":190,"Shell":104},"files_by_category":{"source":170,"config":17,"binary":16,"docs":7,"other":6,"generated":4},"source_lines":22613,"test_lines":0},"pillars":{"ai_provenance":{"score":1.0,"confidence":0.95,"coverage":1.0,"label":"explicit","breakdown":{"attributed_share":0.0104,"suspected_share":0.2527,"estimated_share":0.0104,"ai_artifacts":0.0,"flagged_work_units":7.0,"flagged_releases":0.0},"summary":"Explicit AI attribution on 1% of first-party code added; an estimated 1% including velocity signals."},"quality":{"score":53.9,"confidence":0.9,"coverage":1.0,"label":"weak","breakdown":{"complexity":53.3,"duplication":88.6,"lint":51.5,"testing":15.4,"docs":80.0,"type_safety":100.0,"process":null},"summary":"Code quality is weak: test-to-source ratio 0.00, no CI test run detected; 21% of function code in complex or long functions; 2% duplicated lines. Weakest area: testing."},"security":{"score":57.2,"confidence":0.85,"coverage":1.0,"label":"weak","breakdown":{"secrets":93.6,"sast":93.9,"dependencies":45.7,"ci_actions":1.2,"posture":0.0,"scorecard":null},"summary":"Security posture is weak: 22 known vulnerabilities in 9 dependencies; 3 high-severity SAST findings; 24 high-severity workflow issues. Weakest area: posture."}},"analyzer_results":[{"analyzer":"sec-scorecard","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":"no published OpenSSF Scorecard result for this repo"},{"analyzer":"sec-registry","pillar":"security","status":"ok","tool_version":null,"metrics":{"declared":50.0,"checked":50.0,"missing":0.0,"recent":0.0,"lookup_errors":0.0},"findings":[],"evidence":[],"data":{"phantom":false},"error":null},{"analyzer":"ai-attribution","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"commits":382.0,"attributed_commits":3.0,"attributed_commit_share":0.007853403141361256,"effective_loc":65782.0,"attributed_loc":687.0,"attributed_loc_share":0.010443586391414064,"tools_detected":2.0},"findings":[],"evidence":[{"kind":"attribution-summary","description":"Claude Code: 2 attributed commits, 682 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attribution-summary","description":"GitHub Copilot coding agent: 1 attributed commits, 5 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-authored-by: Claude'","ref":"94e643e9c7745412fe968c6997ea1886d2b49747","url":"https://github.com/bestruirui/octopus/commit/94e643e9c7745412fe968c6997ea1886d2b49747","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"32b0a1796ce670ccfba720323f5ca2657239ebc7","url":"https://github.com/bestruirui/octopus/commit/32b0a1796ce670ccfba720323f5ca2657239ebc7","weight":0.9},{"kind":"attributed-commit","description":"GitHub Copilot coding agent: trailer 'Co-authored-by: Copilot'","ref":"f66e8f85f814d72c83fdbf07ddc95cdd498da9ea","url":"https://github.com/bestruirui/octopus/commit/f66e8f85f814d72c83fdbf07ddc95cdd498da9ea","weight":0.9}],"data":{"attributed_loc_by_commit":{"f66e8f85f814d72c83fdbf07ddc95cdd498da9ea":5,"32b0a1796ce670ccfba720323f5ca2657239ebc7":8,"94e643e9c7745412fe968c6997ea1886d2b49747":674},"tools":{"github-copilot":{"name":"GitHub Copilot coding agent","commits":1,"loc":5,"first_seen":1766393341,"last_seen":1766393341},"claude-code":{"name":"Claude Code","commits":2,"loc":682,"first_seen":1766688649,"last_seen":1768789944}},"monthly":{"2025-11":{"loc":9307,"attributed_loc":0},"2025-12":{"loc":28662,"attributed_loc":13},"2026-01":{"loc":5285,"attributed_loc":674},"2026-02":{"loc":1261,"attributed_loc":0},"2026-03":{"loc":1710,"attributed_loc":0},"2026-04":{"loc":1361,"attributed_loc":0},"2026-05":{"loc":742,"attributed_loc":0},"2026-07":{"loc":219,"attributed_loc":0},"2026-08":{"loc":12078,"attributed_loc":0},"2026-09":{"loc":4946,"attributed_loc":0},"2026-10":{"loc":211,"attributed_loc":0}}},"error":null},{"analyzer":"ai-artifacts","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"artifacts":0.0,"workflow_agents":0.0,"tools_configured":0.0},"findings":[],"evidence":[],"data":{"artifacts":[],"workflows":[],"tools":[]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"work_units":218.0,"flagged_units":7.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":0.0,"pre_ai_era_burst_loc":0.0,"measured_loc":60904.0,"flagged_loc":16624.0,"flagged_loc_share":0.2729541573624064,"max_loc_per_hour":1393.21503131524,"median_loc_per_hour":137.6770538243626,"pr_timed_units":35.0,"excluded_import_loc":4235.0},"findings":[],"evidence":[{"kind":"velocity-burst","description":"1,483 lines of first-party code in ~1.1h (1,393 lines/hour, 1 commit session)","ref":"55873f7fe106e4cdca6c458aedab4edaa4bad7da","url":"https://github.com/bestruirui/octopus/commit/55873f7fe106e4cdca6c458aedab4edaa4bad7da","weight":0.4179645093945719},{"kind":"velocity-burst","description":"3,912 lines of first-party code in ~4.2h (941 lines/hour, 2 commit session)","ref":"f07b8dc026a01c0fa08bbbdbc4662d9bb6a92703","url":"https://github.com/bestruirui/octopus/commit/f07b8dc026a01c0fa08bbbdbc4662d9bb6a92703","weight":0.2823793610479882},{"kind":"velocity-burst","description":"1,343 lines of first-party code in ~1.6h (819 lines/hour, 3 commit session)","ref":"ce445d179e9a71c57cfd942b36b686664a6caf0a","url":"https://github.com/bestruirui/octopus/commit/ce445d179e9a71c57cfd942b36b686664a6caf0a","weight":0.2458372881355932},{"kind":"velocity-burst","description":"3,144 lines of first-party code in ~4.0h (786 lines/hour, 1 commit session)","ref":"520ba52411494802fb30e2ea8c9dee6f735eddd4","url":"https://github.com/bestruirui/octopus/commit/520ba52411494802fb30e2ea8c9dee6f735eddd4","weight":0.2358},{"kind":"velocity-burst","description":"2,522 lines of first-party code in ~4.1h (616 lines/hour, 2 commit session)","ref":"d0eb759548c862f8f5d723856b5a2585b8ba333c","url":"https://github.com/bestruirui/octopus/commit/d0eb759548c862f8f5d723856b5a2585b8ba333c","weight":0.18467421520103056},{"kind":"velocity-burst","description":"2,149 lines of first-party code in ~4.0h (537 lines/hour, 1 commit session)","ref":"fd8fee2a708f3a6e8ac32485eee4ab8c9bb8a097","url":"https://github.com/bestruirui/octopus/commit/fd8fee2a708f3a6e8ac32485eee4ab8c9bb8a097","weight":0.16117499999999998},{"kind":"velocity-burst","description":"2,071 lines of first-party code in ~4.0h (518 lines/hour, 1 commit session)","ref":"19aa05988675a9e1f11316233fa7ae2033260f31","url":"https://github.com/bestruirui/octopus/commit/19aa05988675a9e1f11316233fa7ae2033260f31","weight":0.15532500000000002}],"data":{"flagged_loc_by_commit":{"55873f7fe106e4cdca6c458aedab4edaa4bad7da":1483,"19aa05988675a9e1f11316233fa7ae2033260f31":2071,"520ba52411494802fb30e2ea8c9dee6f735eddd4":3144,"fd8fee2a708f3a6e8ac32485eee4ab8c9bb8a097":2149,"d8c4033569e20db654ea7bc620b1501bdf7253ce":461,"0043bdecde809f92639cf4bda154de9cd84de3aa":862,"ce445d179e9a71c57cfd942b36b686664a6caf0a":20,"3abdcda7d76d9ee02212f07d17a7a3675183cfe0":2521,"d0eb759548c862f8f5d723856b5a2585b8ba333c":1,"6e736b4fad5ebf10b0fd750c60e534b238400982":3911,"f07b8dc026a01c0fa08bbbdbc4662d9bb6a92703":1},"excluded_import_commits":["ae295af02b4e64ea379a99f9645646ec22923b51"]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"releases":93.0,"flagged_releases":0.0,"max_loc_per_day":6961.0},"findings":[],"evidence":[],"data":{"releases":[{"from":"v0.0.1","to":"v0.0.2","loc":3,"days":0.14,"loc_per_day":22.1,"flagged":false},{"from":"v0.0.2","to":"v0.0.3","loc":181,"days":0.04,"loc_per_day":4344.0,"flagged":false},{"from":"v0.0.3","to":"v0.0.4","loc":1,"days":0.04,"loc_per_day":24.0,"flagged":false},{"from":"v0.0.4","to":"v0.0.5","loc":141,"days":0.46,"loc_per_day":304.8,"flagged":false},{"from":"v0.0.5","to":"v0.0.6","loc":31,"days":0.17,"loc_per_day":186.8,"flagged":false},{"from":"v0.0.6","to":"v0.0.7","loc":146,"days":0.1,"loc_per_day":1481.8,"flagged":false},{"from":"v0.0.7","to":"v0.1.0","loc":2865,"days":0.94,"loc_per_day":3044.0,"flagged":false},{"from":"v0.1.0","to":"v0.1.1","loc":34,"days":0.14,"loc_per_day":242.4,"flagged":false},{"from":"v0.1.1","to":"v0.2.0","loc":873,"days":0.72,"loc_per_day":1216.4,"flagged":false},{"from":"v0.2.0","to":"v0.2.1","loc":3,"days":0.04,"loc_per_day":72.0,"flagged":false},{"from":"v0.2.1","to":"v0.2.2","loc":83,"days":0.1,"loc_per_day":796.2,"flagged":false},{"from":"v0.2.2","to":"v0.2.3","loc":398,"days":0.06,"loc_per_day":6961.0,"flagged":false},{"from":"v0.2.3","to":"v0.2.4","loc":64,"days":0.13,"loc_per_day":483.2,"flagged":false},{"from":"v0.2.4","to":"v0.2.5","loc":1329,"days":0.91,"loc_per_day":1461.8,"flagged":false},{"from":"v0.2.5","to":"v0.2.6","loc":4,"days":0.04,"loc_per_day":96.0,"flagged":false},{"from":"v0.2.6","to":"v0.3.0","loc":1636,"days":2.71,"loc_per_day":603.4,"flagged":false},{"from":"v0.3.0","to":"v0.3.1","loc":25,"days":0.04,"loc_per_day":600.0,"flagged":false},{"from":"v0.3.1","to":"v0.3.2","loc":609,"days":0.17,"loc_per_day":3562.7,"flagged":false},{"from":"v0.3.2","to":"v0.3.3","loc":86,"days":0.76,"loc_per_day":113.5,"flagged":false},{"from":"v0.3.3","to":"v0.3.4","loc":208,"days":1.01,"loc_per_day":205.8,"flagged":false},{"from":"v0.3.4","to":"v0.4.0","loc":62,"days":0.05,"loc_per_day":1179.9,"flagged":false},{"from":"v0.4.0","to":"v0.4.1","loc":17,"days":0.04,"loc_per_day":408.0,"flagged":false},{"from":"v0.4.1","to":"v0.5.0","loc":1251,"days":0.22,"loc_per_day":5629.2,"flagged":false},{"from":"v0.5.0","to":"v0.6.0","loc":779,"days":0.78,"loc_per_day":995.1,"flagged":false},{"from":"v0.6.0","to":"v0.6.1","loc":391,"days":0.15,"loc_per_day":2610.3,"flagged":false},{"from":"v0.6.1","to":"v0.6.2","loc":2,"days":0.04,"loc_per_day":48.0,"flagged":false},{"from":"v0.6.2","to":"v0.7.0","loc":615,"days":0.12,"loc_per_day":5262.0,"flagged":false},{"from":"v0.7.0","to":"v0.7.1","loc":7,"days":0.04,"loc_per_day":168.0,"flagged":false},{"from":"v0.7.1","to":"v0.8.0","loc":1580,"days":0.96,"loc_per_day":1641.6,"flagged":false},{"from":"v0.8.0","to":"v0.8.1","loc":89,"days":0.04,"loc_per_day":2136.0,"flagged":false},{"from":"v0.8.1","to":"v0.8.2","loc":28,"days":0.95,"loc_per_day":29.6,"flagged":false},{"from":"v0.8.2","to":"v0.8.3","loc":79,"days":0.92,"loc_per_day":86.3,"flagged":false},{"from":"v0.8.3","to":"v0.8.4","loc":91,"days":0.07,"loc_per_day":1371.4,"flagged":false},{"from":"v0.8.4","to":"v0.8.5","loc":329,"days":0.91,"loc_per_day":361.0,"flagged":false},{"from":"v0.8.5","to":"v0.8.6","loc":36,"days":0.14,"loc_per_day":256.7,"flagged":false},{"from":"v0.8.6","to":"v0.8.7","loc":114,"days":1.67,"loc_per_day":68.3,"flagged":false},{"from":"v0.8.7","to":"v0.8.8","loc":139,"days":0.25,"loc_per_day":551.3,"flagged":false},{"from":"v0.8.8","to":"v0.8.9","loc":48,"days":0.08,"loc_per_day":623.5,"flagged":false},{"from":"v0.8.9","to":"v0.8.10","loc":188,"days":3.72,"loc_per_day":50.5,"flagged":false},{"from":"v0.8.10","to":"v0.8.11","loc":37,"days":0.25,"loc_per_day":147.6,"flagged":false},{"from":"v0.8.11","to":"v0.8.12","loc":169,"days":0.05,"loc_per_day":3726.8,"flagged":false},{"from":"v0.8.12","to":"v0.8.13","loc":768,"days":0.9,"loc_per_day":857.9,"flagged":false},{"from":"v0.8.13","to":"v0.8.14","loc":1,"days":0.09,"loc_per_day":11.8,"flagged":false},{"from":"v0.8.14","to":"v0.9.0","loc":2451,"days":2.77,"loc_per_day":884.8,"flagged":false},{"from":"v0.9.0","to":"v0.9.1","loc":77,"days":0.21,"loc_per_day":369.5,"flagged":false},{"from":"v0.9.1","to":"v0.9.2","loc":12,"days":0.68,"loc_per_day":17.5,"flagged":false},{"from":"v0.9.2","to":"v0.9.3","loc":77,"days":6.02,"loc_per_day":12.8,"flagged":false},{"from":"v0.9.3","to":"v0.9.4","loc":812,"days":4.06,"loc_per_day":199.9,"flagged":false},{"from":"v0.9.4","to":"v0.9.5","loc":89,"days":1.95,"loc_per_day":45.7,"flagged":false},{"from":"v0.9.5","to":"v0.9.6","loc":19,"days":2.02,"loc_per_day":9.4,"flagged":false},{"from":"v0.9.6","to":"v0.9.7","loc":534,"days":3.26,"loc_per_day":163.6,"flagged":false},{"from":"v0.9.7","to":"v0.9.8","loc":5,"days":0.04,"loc_per_day":120.0,"flagged":false},{"from":"v0.9.8","to":"v0.9.9","loc":49,"days":0.73,"loc_per_day":67.2,"flagged":false},{"from":"v0.9.9","to":"v0.9.10","loc":2,"days":0.18,"loc_per_day":11.3,"flagged":false},{"from":"v0.9.10","to":"v0.9.11","loc":8,"days":1.99,"loc_per_day":4.0,"flagged":false},{"from":"v0.9.11","to":"v0.9.12","loc":70,"days":4.07,"loc_per_day":17.2,"flagged":false},{"from":"v0.9.12","to":"v0.9.13","loc":2,"days":0.04,"loc_per_day":48.0,"flagged":false},{"from":"v0.9.13","to":"v0.9.14","loc":9,"days":0.68,"loc_per_day":13.2,"flagged":false},{"from":"v0.9.14","to":"v0.9.15","loc":15,"days":1.4,"loc_per_day":10.7,"flagged":false},{"from":"v0.9.15","to":"v0.9.16","loc":16,"days":1.66,"loc_per_day":9.6,"flagged":false},{"from":"v0.9.16","to":"v0.9.17","loc":1022,"days":3.24,"loc_per_day":315.8,"flagged":false},{"from":"v0.9.17","to":"v0.9.18","loc":21,"days":0.04,"loc_per_day":504.0,"flagged":false},{"from":"v0.9.18","to":"v0.9.19","loc":104,"days":15.72,"loc_per_day":6.6,"flagged":false},{"from":"v0.9.19","to":"v0.9.20","loc":2,"days":1.04,"loc_per_day":1.9,"flagged":false},{"from":"v0.9.20","to":"v0.9.21","loc":82,"days":5.02,"loc_per_day":16.4,"flagged":false},{"from":"v0.9.21","to":"v0.9.22","loc":838,"days":5.91,"loc_per_day":141.7,"flagged":false},{"from":"v0.9.22","to":"v0.9.23","loc":454,"days":0.21,"loc_per_day":2205.2,"flagged":false},{"from":"v0.9.23","to":"v0.9.24","loc":271,"days":0.79,"loc_per_day":341.0,"flagged":false},{"from":"v0.9.24","to":"v0.9.25","loc":60,"days":6.26,"loc_per_day":9.6,"flagged":false},{"from":"v0.9.25","to":"v0.9.26","loc":5,"days":1.81,"loc_per_day":2.8,"flagged":false},{"from":"v0.9.26","to":"v0.9.27","loc":1361,"days":40.97,"loc_per_day":33.2,"flagged":false},{"from":"v0.9.27","to":"v0.9.28","loc":96,"days":12.96,"loc_per_day":7.4,"flagged":false},{"from":"v0.9.28","to":"v0.10.0","loc":1823,"days":98.31,"loc_per_day":18.5,"flagged":false},{"from":"v0.10.0","to":"v0.10.1","loc":100,"days":0.17,"loc_per_day":575.2,"flagged":false},{"from":"v0.10.1","to":"v0.10.2","loc":120,"days":0.04,"loc_per_day":2880.0,"flagged":false},{"from":"v0.10.2","to":"v0.10.3","loc":164,"days":0.58,"loc_per_day":283.7,"flagged":false},{"from":"v0.10.3","to":"v0.11.0","loc":3290,"days":4.35,"loc_per_day":756.6,"flagged":false},{"from":"v0.11.0","to":"v0.12.0","loc":1259,"days":1.83,"loc_per_day":687.5,"flagged":false},{"from":"v0.12.0","to":"v0.12.1","loc":1436,"days":1.29,"loc_per_day":1110.6,"flagged":false},{"from":"v0.12.1","to":"v0.13.0","loc":4253,"days":6.81,"loc_per_day":624.5,"flagged":false},{"from":"v0.13.0","to":"v0.13.1","loc":93,"days":0.76,"loc_per_day":122.0,"flagged":false},{"from":"v0.13.1","to":"v0.13.2","loc":101,"days":0.26,"loc_per_day":381.7,"flagged":false},{"from":"v0.13.2","to":"v0.13.3","loc":68,"days":7.62,"loc_per_day":8.9,"flagged":false},{"from":"v0.13.3","to":"v0.13.4","loc":14,"days":0.05,"loc_per_day":272.4,"flagged":false},{"from":"v0.13.4","to":"v0.13.5","loc":424,"days":9.27,"loc_per_day":45.8,"flagged":false},{"from":"v0.13.5","to":"v0.13.6","loc":8,"days":0.67,"loc_per_day":12.0,"flagged":false},{"from":"v0.13.6","to":"v0.13.7","loc":10,"days":3.29,"loc_per_day":3.0,"flagged":false},{"from":"v0.13.7","to":"v0.13.8","loc":123,"days":0.2,"loc_per_day":626.2,"flagged":false},{"from":"v0.13.8","to":"v0.13.9","loc":98,"days":6.59,"loc_per_day":14.9,"flagged":false},{"from":"v0.13.9","to":"v0.13.10","loc":148,"days":7.23,"loc_per_day":20.5,"flagged":false},{"from":"v0.13.10","to":"v0.13.11","loc":132,"days":5.94,"loc_per_day":22.2,"flagged":false},{"from":"v0.13.11","to":"v0.13.12","loc":18,"days":0.84,"loc_per_day":21.5,"flagged":false},{"from":"v0.13.12","to":"v0.13.13","loc":1,"days":8.9,"loc_per_day":0.1,"flagged":false}]},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":22613.0,"index":0.022,"count:narrated_steps":0.0,"per_kloc:narrated_steps":0.0,"files:narrated_steps":0.0,"count:placeholder":0.0,"per_kloc:placeholder":0.0,"files:placeholder":0.0,"count:emoji_in_code":1.0,"per_kloc:emoji_in_code":0.044,"files:emoji_in_code":1.0,"count:assistant_voice":0.0,"per_kloc:assistant_voice":0.0,"files:assistant_voice":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-secrets","pillar":"security","status":"ok","tool_version":"gitleaks 8.30.1","metrics":{"secrets_current":0.0,"secrets_history":0.0,"secrets_nonprod":2.0,"secrets_low_confidence":0.0},"findings":[{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree (test/docs/example file)","path":"README_zh.md","line":307,"fingerprint":"README_zh.md:generic-api-key:307"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree (test/docs/example file)","path":"README.md","line":305,"fingerprint":"README.md:generic-api-key:305"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":6.0,"findings_high":3.0,"findings_medium":3.0,"findings_low":0.0,"weighted_findings":4.05,"scanned_lines":22613.0,"parse_errors":0.0},"findings":[{"rule_id":"opengrep/go.lang.security.audit.dangerous-exec-command","severity":"high","message":"Detected non-static command inside Command. Audit the input to 'exec.Command'. If unverified user data can reach this call site, this is a code injection vulnerability. A malicious actor can inject a malicious script to execute arbitrary code. [confidence low]","path":"internal/update/core.go","line":153,"fingerprint":"go.lang.security.audit.dangerous-exec-command:internal/update/core.go:153"},{"rule_id":"opengrep/go.lang.security.audit.dangerous-syscall-exec","severity":"high","message":"Detected non-static command inside Exec. Audit the input to 'syscall.Exec'. If unverified user data can reach this call site, this is a code injection vulnerability. A malicious actor can inject a malicious script to execute arbitrary code. [confidence low]","path":"internal/update/core.go","line":163,"fingerprint":"go.lang.security.audit.dangerous-syscall-exec:internal/update/core.go:163"},{"rule_id":"opengrep/dockerfile.security.missing-user","severity":"high","message":"By not specifying a USER, a program in the container may run as 'root'. This is a security hazard. If an attacker can control a process running as root, they may have control over the container. Ensure that the last USER in a Dockerfile is a USER other than 'root'. [confidence medium]","path":"scripts/dockerfile/Dockerfile","line":20,"fingerprint":"dockerfile.security.missing-user:scripts/dockerfile/Dockerfile:20"},{"rule_id":"opengrep/go.lang.security.audit.database.string-formatted-query","severity":"medium","message":"String-formatted SQL query detected. This could lead to SQL injection if the string is not sanitized properly. Audit this call to ensure the SQL is not manipulable by external data. [confidence low]","path":"internal/db/migrate/004.go","line":35,"fingerprint":"go.lang.security.audit.database.string-formatted-query:internal/db/migrate/004.go:35"},{"rule_id":"opengrep/go.lang.security.audit.database.string-formatted-query","severity":"medium","message":"String-formatted SQL query detected. This could lead to SQL injection if the string is not sanitized properly. Audit this call to ensure the SQL is not manipulable by external data. [confidence low]","path":"internal/db/migrate/migrate.go","line":158,"fingerprint":"go.lang.security.audit.database.string-formatted-query:internal/db/migrate/migrate.go:158"},{"rule_id":"opengrep/javascript.lang.security.audit.unsafe-dynamic-method","severity":"medium","message":"Using non-static data to retrieve and run functions from the object is dangerous. If the data is user-controlled, it may allow executing arbitrary code. [confidence low]","path":"web/src/lib/page-preload.ts","line":15,"fingerprint":"javascript.lang.security.audit.unsafe-dynamic-method:web/src/lib/page-preload.ts:15"}],"evidence":[],"data":{"rulesets":["typescript","javascript","go","bash","dockerfile"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"ok","tool_version":"osv-scanner version: 2.7.1","metrics":{"vulnerable_packages":9.0,"vulnerabilities":22.0,"vulns_critical":0.0,"vulns_high":5.0,"vulns_medium":7.0,"vulns_low":1.0,"vulns_unknown":9.0,"penalty":47.0},"findings":[{"rule_id":"osv/GHSA-6j4f-fj2g-mc7p","severity":"high","message":"brace-expansion@5.0.9 (npm) is affected by GHSA-6j4f-fj2g-mc7p","path":"web/pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@5.0.9 (npm):GHSA-6j4f-fj2g-mc7p"},{"rule_id":"osv/GHSA-qhr7-859c-m2p7","severity":"high","message":"brace-expansion@5.0.9 (npm) is affected by GHSA-qhr7-859c-m2p7","path":"web/pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@5.0.9 (npm):GHSA-qhr7-859c-m2p7"},{"rule_id":"osv/GHSA-68fv-2mgg-jv7q","severity":"high","message":"source-map-js@1.2.1 (npm) is affected by GHSA-68fv-2mgg-jv7q","path":"web/pnpm-lock.yaml","line":null,"fingerprint":"source-map-js@1.2.1 (npm):GHSA-68fv-2mgg-jv7q"},{"rule_id":"osv/GHSA-587h-7wmj-h5pm","severity":"high","message":"vite@8.2.2 (npm) is affected by GHSA-587h-7wmj-h5pm","path":"web/pnpm-lock.yaml","line":null,"fingerprint":"vite@8.2.2 (npm):GHSA-587h-7wmj-h5pm"},{"rule_id":"osv/GHSA-mrhx-c7xc-m3w5","severity":"high","message":"zod@4.5.4 (npm) is affected by GHSA-mrhx-c7xc-m3w5","path":"web/pnpm-lock.yaml","line":null,"fingerprint":"zod@4.5.4 (npm):GHSA-mrhx-c7xc-m3w5"},{"rule_id":"osv/GO-2026-6865","severity":"medium","message":"github.com/klauspost/compress@1.20.1 (Go) is affected by GO-2026-6865","path":"go.mod","line":null,"fingerprint":"github.com/klauspost/compress@1.20.1 (Go):GO-2026-6865"},{"rule_id":"osv/GHSA-q7gw-24fr-5p69","severity":"medium","message":"go.opentelemetry.io/otel/trace@1.46.0 (Go) is affected by GHSA-q7gw-24fr-5p69","path":"go.mod","line":null,"fingerprint":"go.opentelemetry.io/otel/trace@1.46.0 (Go):GHSA-q7gw-24fr-5p69"},{"rule_id":"osv/GO-2026-5932","severity":"medium","message":"golang.org/x/crypto@0.57.0 (Go) is affected by GO-2026-5932","path":"go.mod","line":null,"fingerprint":"golang.org/x/crypto@0.57.0 (Go):GO-2026-5932"},{"rule_id":"osv/GO-2026-6603","severity":"medium","message":"golang.org/x/net@0.59.0 (Go) is affected by GO-2026-6603","path":"go.mod","line":null,"fingerprint":"golang.org/x/net@0.59.0 (Go):GO-2026-6603"},{"rule_id":"osv/GO-2026-6610","severity":"medium","message":"golang.org/x/net@0.59.0 (Go) is affected by GO-2026-6610","path":"go.mod","line":null,"fingerprint":"golang.org/x/net@0.59.0 (Go):GO-2026-6610"},{"rule_id":"osv/GO-2026-6611","severity":"medium","message":"golang.org/x/net@0.59.0 (Go) is affected by GO-2026-6611","path":"go.mod","line":null,"fingerprint":"golang.org/x/net@0.59.0 (Go):GO-2026-6611"},{"rule_id":"osv/GO-2026-6612","severity":"medium","message":"golang.org/x/net@0.59.0 (Go) is affected by GO-2026-6612","path":"go.mod","line":null,"fingerprint":"golang.org/x/net@0.59.0 (Go):GO-2026-6612"},{"rule_id":"osv/GO-2026-6617","severity":"medium","message":"golang.org/x/net@0.59.0 (Go) is affected by GO-2026-6617","path":"go.mod","line":null,"fingerprint":"golang.org/x/net@0.59.0 (Go):GO-2026-6617"},{"rule_id":"osv/GO-2026-6860","severity":"medium","message":"golang.org/x/net@0.59.0 (Go) is affected by GO-2026-6860","path":"go.mod","line":null,"fingerprint":"golang.org/x/net@0.59.0 (Go):GO-2026-6860"},{"rule_id":"osv/GO-2026-6866","severity":"medium","message":"golang.org/x/net@0.59.0 (Go) is affected by GO-2026-6866","path":"go.mod","line":null,"fingerprint":"golang.org/x/net@0.59.0 (Go):GO-2026-6866"},{"rule_id":"osv/GHSA-q2hr-2g5m-vwhr","severity":"medium","message":"brace-expansion@5.0.9 (npm) is affected by GHSA-q2hr-2g5m-vwhr","path":"web/pnpm-lock.yaml","line":null,"fingerprint":"brace-expansion@5.0.9 (npm):GHSA-q2hr-2g5m-vwhr"},{"rule_id":"osv/GHSA-g3hv-75wg-m249","severity":"medium","message":"minimatch@10.2.6 (npm) is affected by GHSA-g3hv-75wg-m249","path":"web/pnpm-lock.yaml","line":null,"fingerprint":"minimatch@10.2.6 (npm):GHSA-g3hv-75wg-m249"},{"rule_id":"osv/GHSA-698v-4r3x-3vcv","severity":"medium","message":"vite@8.2.2 (npm) is affected by GHSA-698v-4r3x-3vcv","path":"web/pnpm-lock.yaml","line":null,"fingerprint":"vite@8.2.2 (npm):GHSA-698v-4r3x-3vcv"},{"rule_id":"osv/GHSA-r825-w8mm-5pxw","severity":"medium","message":"vite@8.2.2 (npm) is affected by GHSA-r825-w8mm-5pxw","path":"web/pnpm-lock.yaml","line":null,"fingerprint":"vite@8.2.2 (npm):GHSA-r825-w8mm-5pxw"},{"rule_id":"osv/GHSA-rq7h-c2jc-7f22","severity":"medium","message":"vite@8.2.2 (npm) is affected by GHSA-rq7h-c2jc-7f22","path":"web/pnpm-lock.yaml","line":null,"fingerprint":"vite@8.2.2 (npm):GHSA-rq7h-c2jc-7f22"},{"rule_id":"osv/GHSA-vfpm-58rq-9qcg","severity":"medium","message":"vite@8.2.2 (npm) is affected by GHSA-vfpm-58rq-9qcg","path":"web/pnpm-lock.yaml","line":null,"fingerprint":"vite@8.2.2 (npm):GHSA-vfpm-58rq-9qcg"},{"rule_id":"osv/GHSA-9jrq-w75r-8gcw","severity":"low","message":"vite@8.2.2 (npm) is affected by GHSA-9jrq-w75r-8gcw","path":"web/pnpm-lock.yaml","line":null,"fingerprint":"vite@8.2.2 (npm):GHSA-9jrq-w75r-8gcw"}],"evidence":[],"data":{"ecosystems":["Go","npm"]},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"ok","tool_version":"zizmor 1.32.0","metrics":{"workflows":3.0,"findings":27.0,"findings_high":24.0,"findings_medium":0.0,"findings_low":3.0,"penalty":267.0},"findings":[{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/build.yaml","line":15,"fingerprint":"unpinned-uses:.github/workflows/build.yaml:15"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/build.yaml","line":18,"fingerprint":"unpinned-uses:.github/workflows/build.yaml:18"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/build.yaml","line":23,"fingerprint":"unpinned-uses:.github/workflows/build.yaml:23"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/build.yaml","line":36,"fingerprint":"unpinned-uses:.github/workflows/build.yaml:36"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/build.yaml","line":42,"fingerprint":"unpinned-uses:.github/workflows/build.yaml:42"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yaml","line":20,"fingerprint":"unpinned-uses:.github/workflows/release.yaml:20"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yaml","line":34,"fingerprint":"unpinned-uses:.github/workflows/release.yaml:34"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yaml","line":47,"fingerprint":"unpinned-uses:.github/workflows/release.yaml:47"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yaml","line":52,"fingerprint":"unpinned-uses:.github/workflows/release.yaml:52"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yaml","line":67,"fingerprint":"unpinned-uses:.github/workflows/release.yaml:67"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yaml","line":73,"fingerprint":"unpinned-uses:.github/workflows/release.yaml:73"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yaml","line":82,"fingerprint":"unpinned-uses:.github/workflows/release.yaml:82"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yaml","line":97,"fingerprint":"unpinned-uses:.github/workflows/release.yaml:97"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yaml","line":105,"fingerprint":"unpinned-uses:.github/workflows/release.yaml:105"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yaml","line":115,"fingerprint":"unpinned-uses:.github/workflows/release.yaml:115"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yaml","line":118,"fingerprint":"unpinned-uses:.github/workflows/release.yaml:118"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yaml","line":121,"fingerprint":"unpinned-uses:.github/workflows/release.yaml:121"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yaml","line":128,"fingerprint":"unpinned-uses:.github/workflows/release.yaml:128"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/release.yaml","line":134,"fingerprint":"unpinned-uses:.github/workflows/release.yaml:134"},{"rule_id":"zizmor/cache-poisoning","severity":"high","message":"runtime artifacts potentially vulnerable to a cache poisoning attack [confidence low]","path":".github/workflows/release.yaml","line":47,"fingerprint":"cache-poisoning:.github/workflows/release.yaml:47"},{"rule_id":"zizmor/cache-poisoning","severity":"high","message":"runtime artifacts potentially vulnerable to a cache poisoning attack [confidence low]","path":".github/workflows/release.yaml","line":67,"fingerprint":"cache-poisoning:.github/workflows/release.yaml:67"},{"rule_id":"zizmor/dangerous-triggers","severity":"high","message":"use of fundamentally insecure workflow trigger [confidence medium]","path":".github/workflows/template-check.yaml","line":6,"fingerprint":"dangerous-triggers:.github/workflows/template-check.yaml:6"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/template-check.yaml","line":20,"fingerprint":"unpinned-uses:.github/workflows/template-check.yaml:20"},{"rule_id":"zizmor/unpinned-uses","severity":"high","message":"unpinned action reference [confidence high]","path":".github/workflows/template-check.yaml","line":113,"fingerprint":"unpinned-uses:.github/workflows/template-check.yaml:113"},{"rule_id":"zizmor/artipacked","severity":"low","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/build.yaml","line":14,"fingerprint":"artipacked:.github/workflows/build.yaml:14"},{"rule_id":"zizmor/artipacked","severity":"low","message":"credential persistence through GitHub Actions artifacts [confidence low]","path":".github/workflows/release.yaml","line":33,"fingerprint":"artipacked:.github/workflows/release.yaml:33"},{"rule_id":"zizmor/superfluous-actions","severity":"info","message":"action functionality is already included by the runner [confidence high]","path":".github/workflows/release.yaml","line":97,"fingerprint":"superfluous-actions:.github/workflows/release.yaml:97"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-posture","pillar":"security","status":"ok","tool_version":null,"metrics":{"check:security_policy":0.0,"check:dependency_updates":0.0,"check:signed_commits":0.0,"check:lockfiles":1.0,"signed_commit_share":0.17,"unpinned_manifests":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-distribution","pillar":"security","status":"ok","tool_version":null,"metrics":{"signals":1.0,"binary_assets":110.0,"suspicious":0.0},"findings":[],"evidence":[{"kind":"binary-release-asset","description":"release v0.13.13 ships octopus-android-386.zip (15 downloads)","ref":"octopus-android-386.zip","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.13/octopus-android-386.zip","weight":0.0},{"kind":"binary-release-asset","description":"release v0.13.13 ships octopus-android-amd64.zip (16 downloads)","ref":"octopus-android-amd64.zip","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.13/octopus-android-amd64.zip","weight":0.0},{"kind":"binary-release-asset","description":"release v0.13.13 ships octopus-android-arm.zip (15 downloads)","ref":"octopus-android-arm.zip","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.13/octopus-android-arm.zip","weight":0.0},{"kind":"binary-release-asset","description":"release v0.13.13 ships octopus-android-arm64.zip (20 downloads)","ref":"octopus-android-arm64.zip","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.13/octopus-android-arm64.zip","weight":0.0},{"kind":"binary-release-asset","description":"release v0.13.13 ships octopus-darwin-amd64.zip (65 downloads)","ref":"octopus-darwin-amd64.zip","url":"https://github.com/bestruirui/octopus/releases/download/v0.13.13/octopus-darwin-amd64.zip","weight":0.0}],"data":{"signals":["binary-release-assets"],"suspicious":false,"unusual_traction":false,"metadata":true},"error":null},{"analyzer":"qual-complexity","pillar":"quality","status":"ok","tool_version":"lizard 1.25.1","metrics":{"functions":1398.0,"function_nloc":15655.0,"mean_ccn":2.75,"p90_ccn":6.0,"complex_functions":26.0,"long_functions":15.0,"many_param_functions":1.0,"risky_nloc_share":0.2099},"findings":[],"evidence":[{"kind":"complex-function","description":"sendPassthroughStream in internal/relay/upstream.go: complexity 77, 129 lines","ref":"internal/relay/upstream.go","url":"https://github.com/bestruirui/octopus/blob/8aa58b0340ba2de58ce74fbfacd32597c44842a2/internal/relay/upstream.go#L105","weight":1.0},{"kind":"complex-function","description":"anonymous__0 in internal/relay/handler.go: complexity 59, 255 lines","ref":"internal/relay/handler.go","url":"https://github.com/bestruirui/octopus/blob/8aa58b0340ba2de58ce74fbfacd32597c44842a2/internal/relay/handler.go#L42","weight":0.9833333333333333},{"kind":"complex-function","description":"LogDetail in web/src/components/modules/log/Item.tsx: complexity 58, 177 lines","ref":"web/src/components/modules/log/Item.tsx","url":"https://github.com/bestruirui/octopus/blob/8aa58b0340ba2de58ce74fbfacd32597c44842a2/web/src/components/modules/log/Item.tsx#L168","weight":0.9666666666666667},{"kind":"complex-function","description":"anonymous__0 in internal/db/migrate/008.go: complexity 42, 144 lines","ref":"internal/db/migrate/008.go","url":"https://github.com/bestruirui/octopus/blob/8aa58b0340ba2de58ce74fbfacd32597c44842a2/internal/db/migrate/008.go#L34","weight":0.7},{"kind":"complex-function","description":"inspectStreamEvent in internal/relay/protocol.go: complexity 38, 84 lines","ref":"internal/relay/protocol.go","url":"https://github.com/bestruirui/octopus/blob/8aa58b0340ba2de58ce74fbfacd32597c44842a2/internal/relay/protocol.go#L63","weight":0.6333333333333333},{"kind":"complex-function","description":"anonymous__0 in internal/db/migrate/010.go: complexity 37, 135 lines","ref":"internal/db/migrate/010.go","url":"https://github.com/bestruirui/octopus/blob/8aa58b0340ba2de58ce74fbfacd32597c44842a2/internal/db/migrate/010.go#L35","weight":0.6166666666666667},{"kind":"complex-function","description":"MemberItem in web/src/components/modules/group/ItemList.tsx: complexity 29, 123 lines","ref":"web/src/components/modules/group/ItemList.tsx","url":"https://github.com/bestruirui/octopus/blob/8aa58b0340ba2de58ce74fbfacd32597c44842a2/web/src/components/modules/group/ItemList.tsx#L46","weight":0.48333333333333334},{"kind":"complex-function","description":"migrateChannelToSingleURLAndKey in internal/db/migrate/005.go: complexity 28, 80 lines","ref":"internal/db/migrate/005.go","url":"https://github.com/bestruirui/octopus/blob/8aa58b0340ba2de58ce74fbfacd32597c44842a2/internal/db/migrate/005.go#L20","weight":0.4666666666666667},{"kind":"complex-function","description":"UpdateLLMPrice in internal/price/price.go: complexity 22, 91 lines","ref":"internal/price/price.go","url":"https://github.com/bestruirui/octopus/blob/8aa58b0340ba2de58ce74fbfacd32597c44842a2/internal/price/price.go#L38","weight":0.36666666666666664},{"kind":"complex-function","description":"fetchModel in internal/server/handlers/channel.go: complexity 22, 94 lines","ref":"internal/server/handlers/channel.go","url":"https://github.com/bestruirui/octopus/blob/8aa58b0340ba2de58ce74fbfacd32597c44842a2/internal/server/handlers/channel.go#L192","weight":0.36666666666666664}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":16238.0,"duplicated_lines":327.0,"duplicated_share":0.0201,"files":170.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: internal/db/migrate/008.go:4 and internal/db/migrate/010.go:4","ref":"internal/db/migrate/008.go","url":"https://github.com/bestruirui/octopus/blob/8aa58b0340ba2de58ce74fbfacd32597c44842a2/internal/db/migrate/008.go#L4","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: internal/op/setting.go:40 and internal/op/setting.go:79","ref":"internal/op/setting.go","url":"https://github.com/bestruirui/octopus/blob/8aa58b0340ba2de58ce74fbfacd32597c44842a2/internal/op/setting.go#L40","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: internal/op/stats.go:66 and internal/op/stats.go:206","ref":"internal/op/stats.go","url":"https://github.com/bestruirui/octopus/blob/8aa58b0340ba2de58ce74fbfacd32597c44842a2/internal/op/stats.go#L66","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: internal/relay/channel.go:12 and internal/relay/handler.go:18","ref":"internal/relay/channel.go","url":"https://github.com/bestruirui/octopus/blob/8aa58b0340ba2de58ce74fbfacd32597c44842a2/internal/relay/channel.go#L12","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: internal/relay/handler.go:17 and internal/relay/protocol.go:12","ref":"internal/relay/handler.go","url":"https://github.com/bestruirui/octopus/blob/8aa58b0340ba2de58ce74fbfacd32597c44842a2/internal/relay/handler.go#L17","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: internal/relay/upstream.go:130 and internal/relay/upstream.go:354","ref":"internal/relay/upstream.go","url":"https://github.com/bestruirui/octopus/blob/8aa58b0340ba2de58ce74fbfacd32597c44842a2/internal/relay/upstream.go#L130","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: internal/server/handlers/apikey.go:8 and internal/server/handlers/user.go:6","ref":"internal/server/handlers/apikey.go","url":"https://github.com/bestruirui/octopus/blob/8aa58b0340ba2de58ce74fbfacd32597c44842a2/internal/server/handlers/apikey.go#L8","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: internal/server/handlers/apikey.go:11 and internal/server/handlers/model.go:10","ref":"internal/server/handlers/apikey.go","url":"https://github.com/bestruirui/octopus/blob/8aa58b0340ba2de58ce74fbfacd32597c44842a2/internal/server/handlers/apikey.go#L11","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: internal/server/handlers/channel.go:97 and internal/server/handlers/channel.go:119","ref":"internal/server/handlers/channel.go","url":"https://github.com/bestruirui/octopus/blob/8aa58b0340ba2de58ce74fbfacd32597c44842a2/internal/server/handlers/channel.go#L97","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: internal/server/handlers/group.go:11 and internal/server/handlers/log.go:9","ref":"internal/server/handlers/group.go","url":"https://github.com/bestruirui/octopus/blob/8aa58b0340ba2de58ce74fbfacd32597c44842a2/internal/server/handlers/group.go#L11","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":63.0,"weighted_findings":60.0,"scanned_lines":22613.0,"category:best-practice":57.0,"category:correctness":6.0},"findings":[{"rule_id":"opengrep/go.lang.correctness.permissions.incorrect-default-permission","severity":"medium","message":"Detected file permissions that are set to more than `0600` (user/owner can read and write). Setting file permissions to higher than `0600` is most likely unnecessary and violates the principle of least privilege. Instead, set permissions to be `0600` or less for os.Chmod, os.Mkdir, os.OpenFile, os.M","path":"internal/conf/config.go","line":54,"fingerprint":"go.lang.correctness.permissions.incorrect-default-permission:internal/conf/config.go:54"},{"rule_id":"opengrep/go.lang.correctness.permissions.incorrect-default-permission","severity":"medium","message":"Detected file permissions that are set to more than `0600` (user/owner can read and write). Setting file permissions to higher than `0600` is most likely unnecessary and violates the principle of least privilege. Instead, set permissions to be `0600` or less for os.Chmod, os.Mkdir, os.OpenFile, os.M","path":"internal/update/core.go","line":93,"fingerprint":"go.lang.correctness.permissions.incorrect-default-permission:internal/update/core.go:93"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/common/IconButton.tsx","line":22,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/common/IconButton.tsx:22"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/modules/group/ItemList.tsx","line":87,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/modules/group/ItemList.tsx:87"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/modules/group/ItemList.tsx","line":120,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/modules/group/ItemList.tsx:120"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/modules/group/ItemList.tsx","line":384,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/modules/group/ItemList.tsx:384"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/accordion.tsx","line":10,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/accordion.tsx:10"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/accordion.tsx","line":21,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/accordion.tsx:21"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/accordion.tsx","line":39,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/accordion.tsx:39"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/accordion.tsx","line":57,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/accordion.tsx:57"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/badge.tsx","line":41,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/badge.tsx:41"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/button.tsx","line":59,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/button.tsx:59"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/calendar.tsx","line":141,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/calendar.tsx:141"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/calendar.tsx","line":148,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/calendar.tsx:148"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/calendar.tsx","line":156,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/calendar.tsx:156"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/calendar.tsx","line":162,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/calendar.tsx:162"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/calendar.tsx","line":168,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/calendar.tsx:168"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/calendar.tsx","line":177,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/calendar.tsx:177"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/calendar.tsx","line":215,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/calendar.tsx:215"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/chart.tsx","line":69,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/chart.tsx:69"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/checkbox.tsx","line":18,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/checkbox.tsx:18"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/field.tsx","line":17,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/field.tsx:17"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/field.tsx","line":37,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/field.tsx:37"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/field.tsx","line":50,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/field.tsx:50"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/field.tsx","line":90,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/field.tsx:90"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/field.tsx","line":103,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/field.tsx:103"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/field.tsx","line":121,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/field.tsx:121"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/field.tsx","line":134,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/field.tsx:134"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/field.tsx","line":149,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/field.tsx:149"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/field.tsx","line":169,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/field.tsx:169"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/field.tsx","line":228,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/field.tsx:228"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/input.tsx","line":16,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/input.tsx:16"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/label.tsx","line":17,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/label.tsx:17"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/popover.tsx","line":9,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/popover.tsx:9"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/popover.tsx","line":15,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/popover.tsx:15"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/popover.tsx","line":34,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/popover.tsx:34"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/popover.tsx","line":43,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/popover.tsx:43"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/progress.tsx","line":18,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/progress.tsx:18"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/select.tsx","line":10,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/select.tsx:10"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/select.tsx","line":16,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/select.tsx:16"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/select.tsx","line":22,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/select.tsx:22"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/select.tsx","line":41,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/select.tsx:41"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/select.tsx","line":70,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/select.tsx:70"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/select.tsx","line":96,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/select.tsx:96"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/select.tsx","line":113,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/select.tsx:113"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/select.tsx","line":133,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/select.tsx:133"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/select.tsx","line":149,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/select.tsx:149"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/select.tsx","line":167,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/select.tsx:167"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/separator.tsx","line":21,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/separator.tsx:21"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/sonner.tsx","line":33,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/sonner.tsx:33"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/switch.tsx","line":17,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/switch.tsx:17"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/tabs.tsx","line":22,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/tabs.tsx:22"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/tabs.tsx","line":55,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/tabs.tsx:55"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/tabs.tsx","line":75,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/tabs.tsx:75"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/tabs.tsx","line":89,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/tabs.tsx:89"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/tooltip.tsx","line":15,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/tooltip.tsx:15"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/tooltip.tsx","line":24,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/tooltip.tsx:24"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/tooltip.tsx","line":31,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/tooltip.tsx:31"},{"rule_id":"opengrep/typescript.react.best-practice.react-props-spreading","severity":"medium","message":"It's best practice to explicitly pass props to an HTML component rather than use the spread operator. The spread operator risks passing invalid HTML props to an HTML element, which can cause console warnings or worse, give malicious actors a way to inject unexpected attributes.","path":"web/src/components/ui/tooltip.tsx","line":50,"fingerprint":"typescript.react.best-practice.react-props-spreading:web/src/components/ui/tooltip.tsx:50"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"web/src/components/modules/log/Item.tsx","line":50,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:web/src/components/modules/log/Item.tsx:50"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"web/src/components/modules/log/Item.tsx","line":50,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:web/src/components/modules/log/Item.tsx:50"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"web/src/components/modules/log/Item.tsx","line":561,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:web/src/components/modules/log/Item.tsx:561"},{"rule_id":"opengrep/javascript.lang.correctness.missing-template-string-indicator","severity":"low","message":"This looks like a JavaScript template string. Are you missing a '$' in front of '{...}'?","path":"web/src/components/modules/log/Item.tsx","line":561,"fingerprint":"javascript.lang.correctness.missing-template-string-indicator:web/src/components/modules/log/Item.tsx:561"}],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":0.0,"check:test_ratio":0.0,"check:ci_present":1.0,"check:ci_runs_tests":0.0,"check:ci_runs_lint":0.0,"check:tests_cochange":0.0432,"test_lines":0.0,"source_lines":22613.0,"test_ratio":0.0,"ci_files":3.0,"cochange_share":0.0108,"cochange_commits":278.0},"findings":[],"evidence":[{"kind":"ci","description":"CI config: .github/workflows/build.yaml","ref":".github/workflows/build.yaml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/release.yaml","ref":".github/workflows/release.yaml","url":null,"weight":0.0},{"kind":"ci","description":"CI config: .github/workflows/template-check.yaml","ref":".github/workflows/template-check.yaml","url":null,"weight":0.0}],"data":{"test_commands":[],"lint_commands":[]},"error":null},{"analyzer":"qual-docs","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:readme":1.0,"check:license":1.0,"check:contributing":1.0,"check:changelog":0.0,"readme_lines":273.0},"findings":[],"evidence":[{"kind":"docs","description":"README.md","ref":"README.md","url":null,"weight":0.0},{"kind":"docs","description":"LICENSE","ref":"LICENSE","url":null,"weight":0.0},{"kind":"docs","description":"CONTRIBUTING.md","ref":"CONTRIBUTING.md","url":null,"weight":0.0}],"data":{},"error":null},{"analyzer":"qual-type-safety","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:strict_config":1.0,"check:low_escape_density":1.0,"escapes":0.0,"escapes_per_kloc":0.0},"findings":[],"evidence":[{"kind":"typing","description":"TypeScript strict type checking: web/tsconfig.json","ref":"web/tsconfig.json","url":null,"weight":0.0}],"data":{},"error":null},{"analyzer":"x-blame","pillar":"ai_provenance","status":"ok","tool_version":"git-blame","metrics":{"ai_lines":0.0,"other_lines":22613.0,"files_blamed":170.0,"blame_failures":0.0,"quality:ai_findings":0.0,"quality:other_findings":63.0,"quality:other_per_kloc":2.786,"security:ai_findings":0.0,"security:other_findings":5.0,"security:other_per_kloc":0.221},"findings":[],"evidence":[],"data":{"sampled":false,"comparable":false},"error":null}],"flags":[]}