{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-5+qual-2+sec-2","generated_at":"2026-11-14T14:52:02.637663Z","repo":{"ref":{"host":"github.com","owner":"andrisasuke","name":"gemini-sql"},"default_branch":"main","clone_url":"https://github.com/andrisasuke/gemini-sql.git","html_url":"https://github.com/andrisasuke/gemini-sql","description":"A modern, cross-platform SQL editor with AI-powered query generation. Built with Tauri, React, and Rust.","stars":17,"forks":1,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":2980,"primary_language":"TypeScript","license_spdx":"MIT","created_at":"2026-01-11T11:53:59Z","pushed_at":"2026-01-28T03:44:37Z","security_policy_url":null,"distribution":{"owner_created_at":"2012-10-01T14:46:04Z","owner_type":"User","release_assets":[]}},"commit_sha":"46a5c605728a5b287b8f848976fc15d159831106","profile":{"lines_by_language":{"TypeScript":5091,"Rust":1688,"JavaScript":66},"files_by_category":{"source":67,"config":10,"binary":9,"other":4,"docs":3,"generated":1},"source_lines":6845,"test_lines":0},"pillars":{"ai_provenance":{"score":100.0,"confidence":0.72,"coverage":1.0,"label":"explicit","breakdown":{"attributed_share":1.0,"suspected_share":0.0,"estimated_share":1.0,"ai_artifacts":1.0,"flagged_work_units":0.0,"flagged_releases":null,"style_index":0.0},"summary":"Explicit AI attribution on 100% of first-party code added; an estimated 100% including velocity signals."},"quality":{"score":46.1,"confidence":0.9,"coverage":1.0,"label":"poor","breakdown":{"complexity":50.0,"duplication":43.5,"lint":89.6,"testing":0.0,"docs":65.0,"type_safety":100.0,"process":null},"summary":"Code quality is poor: test-to-source ratio 0.00, no CI test run detected; 23% of function code in complex or long functions; 14% duplicated lines. Weakest area: testing."},"security":{"score":67.8,"confidence":0.85,"coverage":1.0,"label":"weak","breakdown":{"secrets":100.0,"sast":98.7,"dependencies":30.6,"ci_actions":null,"posture":0.0,"scorecard":null},"summary":"Security posture is weak: 28 known vulnerabilities in 11 dependencies. 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":44.0,"checked":44.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":9.0,"attributed_commits":9.0,"attributed_commit_share":1.0,"effective_loc":7213.0,"attributed_loc":7213.0,"attributed_loc_share":1.0,"tools_detected":1.0},"findings":[],"evidence":[{"kind":"attribution-summary","description":"Claude Code: 9 attributed commits, 7,213 lines added","ref":null,"url":null,"weight":1.0},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"46a5c605728a5b287b8f848976fc15d159831106","url":"https://github.com/andrisasuke/gemini-sql/commit/46a5c605728a5b287b8f848976fc15d159831106","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"ab3795d82655b35c71101b3e73117e5d0cd7dabc","url":"https://github.com/andrisasuke/gemini-sql/commit/ab3795d82655b35c71101b3e73117e5d0cd7dabc","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"08b06b9855024bcf820511bb7d38582e68d28992","url":"https://github.com/andrisasuke/gemini-sql/commit/08b06b9855024bcf820511bb7d38582e68d28992","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"6e94e23604f06f9a05c2d36bca79897af6624479","url":"https://github.com/andrisasuke/gemini-sql/commit/6e94e23604f06f9a05c2d36bca79897af6624479","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"5121354fe110f7fca9b7427f2144df82148717d0","url":"https://github.com/andrisasuke/gemini-sql/commit/5121354fe110f7fca9b7427f2144df82148717d0","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"e6eae5d37c11b6681036e6e6b4ecdb7cdd2e44ed","url":"https://github.com/andrisasuke/gemini-sql/commit/e6eae5d37c11b6681036e6e6b4ecdb7cdd2e44ed","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"555c0f134ecd03a0cbaac4a8b23628d7eca01eea","url":"https://github.com/andrisasuke/gemini-sql/commit/555c0f134ecd03a0cbaac4a8b23628d7eca01eea","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"cc5b08ca293a015fec718b76b641a4b1ec49259e","url":"https://github.com/andrisasuke/gemini-sql/commit/cc5b08ca293a015fec718b76b641a4b1ec49259e","weight":0.9},{"kind":"attributed-commit","description":"Claude Code: trailer 'Co-Authored-By: Claude'","ref":"9857c05df88d1bec010baf645abab2376408b7a5","url":"https://github.com/andrisasuke/gemini-sql/commit/9857c05df88d1bec010baf645abab2376408b7a5","weight":0.9}],"data":{"attributed_loc_by_commit":{"9857c05df88d1bec010baf645abab2376408b7a5":4485,"cc5b08ca293a015fec718b76b641a4b1ec49259e":73,"555c0f134ecd03a0cbaac4a8b23628d7eca01eea":32,"e6eae5d37c11b6681036e6e6b4ecdb7cdd2e44ed":298,"5121354fe110f7fca9b7427f2144df82148717d0":1663,"6e94e23604f06f9a05c2d36bca79897af6624479":385,"08b06b9855024bcf820511bb7d38582e68d28992":118,"ab3795d82655b35c71101b3e73117e5d0cd7dabc":0,"46a5c605728a5b287b8f848976fc15d159831106":159},"tools":{"claude-code":{"name":"Claude Code","commits":9,"loc":7213,"first_seen":1767057460,"last_seen":1769571871}},"monthly":{"2025-12":{"loc":4888,"attributed_loc":4888},"2026-01":{"loc":2325,"attributed_loc":2325}}},"error":null},{"analyzer":"ai-artifacts","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"artifacts":1.0,"workflow_agents":0.0,"tools_configured":1.0,"earliest_adoption":1768132552.0},"findings":[],"evidence":[{"kind":"ai-artifact","description":"CLAUDE.md (claude-code configuration)","ref":"CLAUDE.md","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/CLAUDE.md","weight":0.5}],"data":{"artifacts":[{"tool":"claude-code","path":"CLAUDE.md","added_at":1768132552}],"workflows":[],"tools":["claude-code"]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"work_units":6.0,"flagged_units":0.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":0.0,"pre_ai_era_burst_loc":0.0,"measured_loc":2728.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":415.75,"median_loc_per_hour":57.125,"pr_timed_units":0.0,"excluded_import_loc":4485.0},"findings":[],"evidence":[],"data":{"flagged_loc_by_commit":{},"excluded_import_commits":["9857c05df88d1bec010baf645abab2376408b7a5"]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":6845.0,"index":0.0,"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":0.0,"per_kloc:emoji_in_code":0.0,"files:emoji_in_code":0.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":0.0,"secrets_low_confidence":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":1.0,"findings_high":0.0,"findings_medium":1.0,"findings_low":0.0,"weighted_findings":0.25,"scanned_lines":6845.0,"parse_errors":0.0},"findings":[{"rule_id":"opengrep/javascript.lang.security.audit.detect-non-literal-regexp","severity":"medium","message":"RegExp() called with a `context` function argument, this might allow an attacker to cause a Regular Expression Denial-of-Service (ReDoS) within your application as RegExP blocks the main thread. For this reason, it is recommended to use hardcoded regexes instead. If your regex is run on user-control [confidence low]","path":"src/components/editor/QueryEditor.tsx","line":293,"fingerprint":"javascript.lang.security.audit.detect-non-literal-regexp:src/components/editor/QueryEditor.tsx:293"}],"evidence":[],"data":{"rulesets":["typescript","javascript","rust"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"ok","tool_version":"osv-scanner version: 2.7.1","metrics":{"vulnerable_packages":11.0,"vulnerabilities":28.0,"vulns_critical":0.0,"vulns_high":13.0,"vulns_medium":13.0,"vulns_low":2.0,"vulns_unknown":0.0,"penalty":71.0},"findings":[{"rule_id":"osv/GHSA-73wf-gq98-2v4g","severity":"high","message":"browserslist@4.28.1 (npm) is affected by GHSA-73wf-gq98-2v4g","path":"package-lock.json","line":null,"fingerprint":"browserslist@4.28.1 (npm):GHSA-73wf-gq98-2v4g"},{"rule_id":"osv/GHSA-c83g-rgw3-j3cx","severity":"high","message":"browserslist@4.28.1 (npm) is affected by GHSA-c83g-rgw3-j3cx","path":"package-lock.json","line":null,"fingerprint":"browserslist@4.28.1 (npm):GHSA-c83g-rgw3-j3cx"},{"rule_id":"osv/GHSA-28wg-ghj8-5hjv","severity":"high","message":"nanoid@3.3.11 (npm) is affected by GHSA-28wg-ghj8-5hjv","path":"package-lock.json","line":null,"fingerprint":"nanoid@3.3.11 (npm):GHSA-28wg-ghj8-5hjv"},{"rule_id":"osv/GHSA-2v37-7h3g-55p8","severity":"high","message":"nanoid@3.3.11 (npm) is affected by GHSA-2v37-7h3g-55p8","path":"package-lock.json","line":null,"fingerprint":"nanoid@3.3.11 (npm):GHSA-2v37-7h3g-55p8"},{"rule_id":"osv/GHSA-xwg4-73v4-xw9w","severity":"high","message":"nanoid@3.3.11 (npm) is affected by GHSA-xwg4-73v4-xw9w","path":"package-lock.json","line":null,"fingerprint":"nanoid@3.3.11 (npm):GHSA-xwg4-73v4-xw9w"},{"rule_id":"osv/GHSA-c2c7-rcm5-vvqj","severity":"high","message":"picomatch@2.3.1 (npm) is affected by GHSA-c2c7-rcm5-vvqj","path":"package-lock.json","line":null,"fingerprint":"picomatch@2.3.1 (npm):GHSA-c2c7-rcm5-vvqj"},{"rule_id":"osv/GHSA-c2c7-rcm5-vvqj","severity":"high","message":"picomatch@4.0.3 (npm) is affected by GHSA-c2c7-rcm5-vvqj","path":"package-lock.json","line":null,"fingerprint":"picomatch@4.0.3 (npm):GHSA-c2c7-rcm5-vvqj"},{"rule_id":"osv/GHSA-6g55-p6wh-862q","severity":"high","message":"postcss@8.5.6 (npm) is affected by GHSA-6g55-p6wh-862q","path":"package-lock.json","line":null,"fingerprint":"postcss@8.5.6 (npm):GHSA-6g55-p6wh-862q"},{"rule_id":"osv/GHSA-r28c-9q8g-f849","severity":"high","message":"postcss@8.5.6 (npm) is affected by GHSA-r28c-9q8g-f849","path":"package-lock.json","line":null,"fingerprint":"postcss@8.5.6 (npm):GHSA-r28c-9q8g-f849"},{"rule_id":"osv/GHSA-mw96-cpmx-2vgc","severity":"high","message":"rollup@4.54.0 (npm) is affected by GHSA-mw96-cpmx-2vgc","path":"package-lock.json","line":null,"fingerprint":"rollup@4.54.0 (npm):GHSA-mw96-cpmx-2vgc"},{"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":"package-lock.json","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@6.4.1 (npm) is affected by GHSA-587h-7wmj-h5pm","path":"package-lock.json","line":null,"fingerprint":"vite@6.4.1 (npm):GHSA-587h-7wmj-h5pm"},{"rule_id":"osv/GHSA-p9ff-h696-f583","severity":"high","message":"vite@6.4.1 (npm) is affected by GHSA-p9ff-h696-f583","path":"package-lock.json","line":null,"fingerprint":"vite@6.4.1 (npm):GHSA-p9ff-h696-f583"},{"rule_id":"osv/GHSA-w5vr-8v7q-w6rv","severity":"medium","message":"baseline-browser-mapping@2.9.11 (npm) is affected by GHSA-w5vr-8v7q-w6rv","path":"package-lock.json","line":null,"fingerprint":"baseline-browser-mapping@2.9.11 (npm):GHSA-w5vr-8v7q-w6rv"},{"rule_id":"osv/GHSA-3v7f-55p6-f55p","severity":"medium","message":"picomatch@2.3.1 (npm) is affected by GHSA-3v7f-55p6-f55p","path":"package-lock.json","line":null,"fingerprint":"picomatch@2.3.1 (npm):GHSA-3v7f-55p6-f55p"},{"rule_id":"osv/GHSA-3v7f-55p6-f55p","severity":"medium","message":"picomatch@4.0.3 (npm) is affected by GHSA-3v7f-55p6-f55p","path":"package-lock.json","line":null,"fingerprint":"picomatch@4.0.3 (npm):GHSA-3v7f-55p6-f55p"},{"rule_id":"osv/GHSA-fxqj-rqcc-2cmp","severity":"medium","message":"postcss@8.5.6 (npm) is affected by GHSA-fxqj-rqcc-2cmp","path":"package-lock.json","line":null,"fingerprint":"postcss@8.5.6 (npm):GHSA-fxqj-rqcc-2cmp"},{"rule_id":"osv/GHSA-qx2v-qp2m-jg93","severity":"medium","message":"postcss@8.5.6 (npm) is affected by GHSA-qx2v-qp2m-jg93","path":"package-lock.json","line":null,"fingerprint":"postcss@8.5.6 (npm):GHSA-qx2v-qp2m-jg93"},{"rule_id":"osv/GHSA-rj75-hqrm-r3gf","severity":"medium","message":"postcss-selector-parser@6.1.2 (npm) is affected by GHSA-rj75-hqrm-r3gf","path":"package-lock.json","line":null,"fingerprint":"postcss-selector-parser@6.1.2 (npm):GHSA-rj75-hqrm-r3gf"},{"rule_id":"osv/GHSA-w9m9-85wc-3x92","severity":"medium","message":"postcss-selector-parser@6.1.2 (npm) is affected by GHSA-w9m9-85wc-3x92","path":"package-lock.json","line":null,"fingerprint":"postcss-selector-parser@6.1.2 (npm):GHSA-w9m9-85wc-3x92"},{"rule_id":"osv/GHSA-4w7w-66w2-5vf9","severity":"medium","message":"vite@6.4.1 (npm) is affected by GHSA-4w7w-66w2-5vf9","path":"package-lock.json","line":null,"fingerprint":"vite@6.4.1 (npm):GHSA-4w7w-66w2-5vf9"},{"rule_id":"osv/GHSA-698v-4r3x-3vcv","severity":"medium","message":"vite@6.4.1 (npm) is affected by GHSA-698v-4r3x-3vcv","path":"package-lock.json","line":null,"fingerprint":"vite@6.4.1 (npm):GHSA-698v-4r3x-3vcv"},{"rule_id":"osv/GHSA-fx2h-pf6j-xcff","severity":"medium","message":"vite@6.4.1 (npm) is affected by GHSA-fx2h-pf6j-xcff","path":"package-lock.json","line":null,"fingerprint":"vite@6.4.1 (npm):GHSA-fx2h-pf6j-xcff"},{"rule_id":"osv/GHSA-r825-w8mm-5pxw","severity":"medium","message":"vite@6.4.1 (npm) is affected by GHSA-r825-w8mm-5pxw","path":"package-lock.json","line":null,"fingerprint":"vite@6.4.1 (npm):GHSA-r825-w8mm-5pxw"},{"rule_id":"osv/GHSA-rq7h-c2jc-7f22","severity":"medium","message":"vite@6.4.1 (npm) is affected by GHSA-rq7h-c2jc-7f22","path":"package-lock.json","line":null,"fingerprint":"vite@6.4.1 (npm):GHSA-rq7h-c2jc-7f22"},{"rule_id":"osv/GHSA-v6wh-96g9-6wx3","severity":"medium","message":"vite@6.4.1 (npm) is affected by GHSA-v6wh-96g9-6wx3","path":"package-lock.json","line":null,"fingerprint":"vite@6.4.1 (npm):GHSA-v6wh-96g9-6wx3"},{"rule_id":"osv/GHSA-4x5r-pxfx-6jf8","severity":"low","message":"@babel/core@7.28.5 (npm) is affected by GHSA-4x5r-pxfx-6jf8","path":"package-lock.json","line":null,"fingerprint":"@babel/core@7.28.5 (npm):GHSA-4x5r-pxfx-6jf8"},{"rule_id":"osv/GHSA-9jrq-w75r-8gcw","severity":"low","message":"vite@6.4.1 (npm) is affected by GHSA-9jrq-w75r-8gcw","path":"package-lock.json","line":null,"fingerprint":"vite@6.4.1 (npm):GHSA-9jrq-w75r-8gcw"}],"evidence":[],"data":{"ecosystems":["npm"]},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"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":0.0,"signed_commit_share":0.0,"unpinned_manifests":1.0},"findings":[],"evidence":[{"kind":"posture","description":"src-tauri/Cargo.toml has no lockfile alongside it (unpinned dependencies)","ref":"src-tauri/Cargo.toml","url":null,"weight":0.3}],"data":{},"error":null},{"analyzer":"sec-distribution","pillar":"security","status":"ok","tool_version":null,"metrics":{"signals":0.0,"binary_assets":0.0,"suspicious":0.0},"findings":[],"evidence":[],"data":{"signals":[],"suspicious":false,"unusual_traction":false,"metadata":true},"error":null},{"analyzer":"qual-complexity","pillar":"quality","status":"ok","tool_version":"lizard 1.25.1","metrics":{"functions":420.0,"function_nloc":4645.0,"mean_ccn":2.63,"p90_ccn":5.0,"complex_functions":10.0,"long_functions":7.0,"many_param_functions":0.0,"risky_nloc_share":0.2308},"findings":[],"evidence":[{"kind":"complex-function","description":"getDataTypeColor in src/utils/dataTypeColors.ts: complexity 33, 34 lines","ref":"src/utils/dataTypeColors.ts","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/src/utils/dataTypeColors.ts#L2","weight":0.55},{"kind":"complex-function","description":"execute_query in src-tauri/src/storage/database.rs: complexity 23, 151 lines","ref":"src-tauri/src/storage/database.rs","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/src-tauri/src/storage/database.rs#L368","weight":0.38333333333333336},{"kind":"complex-function","description":"TablesPanel in src/components/sidebar/TablesPanel.tsx: complexity 18, 113 lines","ref":"src/components/sidebar/TablesPanel.tsx","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/src/components/sidebar/TablesPanel.tsx#L6","weight":0.3},{"kind":"complex-function","description":"(anonymous) in src/hooks/useKeyboardShortcuts.ts: complexity 18, 37 lines","ref":"src/hooks/useKeyboardShortcuts.ts","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/src/hooks/useKeyboardShortcuts.ts#L16","weight":0.3},{"kind":"complex-function","description":"(anonymous) in src/components/editor/QueryEditor.tsx: complexity 17, 65 lines","ref":"src/components/editor/QueryEditor.tsx","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/src/components/editor/QueryEditor.tsx#L271","weight":0.2833333333333333},{"kind":"complex-function","description":"ResultsPanel in src/components/results/ResultsPanel.tsx: complexity 17, 118 lines","ref":"src/components/results/ResultsPanel.tsx","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/src/components/results/ResultsPanel.tsx#L7","weight":0.2833333333333333},{"kind":"complex-function","description":"get_connections in src-tauri/src/storage/local.rs: complexity 16, 27 lines","ref":"src-tauri/src/storage/local.rs","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/src-tauri/src/storage/local.rs#L69","weight":0.26666666666666666},{"kind":"complex-function","description":"get_connection in src-tauri/src/storage/local.rs: complexity 16, 32 lines","ref":"src-tauri/src/storage/local.rs","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/src-tauri/src/storage/local.rs#L252","weight":0.26666666666666666},{"kind":"complex-function","description":"formatValue in src/components/results/ResultsTable.tsx: complexity 16, 16 lines","ref":"src/components/results/ResultsTable.tsx","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/src/components/results/ResultsTable.tsx#L12","weight":0.26666666666666666},{"kind":"complex-function","description":"formatValue in src/components/results/RowDetailDrawer.tsx: complexity 16, 16 lines","ref":"src/components/results/RowDetailDrawer.tsx","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/src/components/results/RowDetailDrawer.tsx#L14","weight":0.26666666666666666}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":5022.0,"duplicated_lines":697.0,"duplicated_share":0.1388,"files":67.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: src-tauri/src/commands/connection.rs:26 and src-tauri/src/commands/connection.rs:72","ref":"src-tauri/src/commands/connection.rs","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/src-tauri/src/commands/connection.rs#L26","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src-tauri/src/storage/database.rs:19 and src-tauri/src/storage/database.rs:99","ref":"src-tauri/src/storage/database.rs","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/src-tauri/src/storage/database.rs#L19","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src-tauri/src/storage/local.rs:79 and src-tauri/src/storage/local.rs:261","ref":"src-tauri/src/storage/local.rs","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/src-tauri/src/storage/local.rs#L79","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/components/ai/AIAssistantModal.tsx:7 and src/components/editor/EditorToolbar.tsx:8","ref":"src/components/ai/AIAssistantModal.tsx","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/src/components/ai/AIAssistantModal.tsx#L7","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/components/common/Button.tsx:46 and src/components/layout/StatusBar.tsx:40","ref":"src/components/common/Button.tsx","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/src/components/common/Button.tsx#L46","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/components/common/Modal.tsx:52 and src/components/results/RowDetailDrawer.tsx:78","ref":"src/components/common/Modal.tsx","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/src/components/common/Modal.tsx#L52","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/components/connection/ConnectionDialog.tsx:123 and src/components/connection/ConnectionDialog.tsx:145","ref":"src/components/connection/ConnectionDialog.tsx","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/src/components/connection/ConnectionDialog.tsx#L123","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/components/connection/ConnectionSelector.tsx:183 and src/components/sidebar/SavedQueriesPanel.tsx:126","ref":"src/components/connection/ConnectionSelector.tsx","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/src/components/connection/ConnectionSelector.tsx#L183","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/components/editor/QueryEditor.tsx:52 and src/components/editor/QueryEditor.tsx:121","ref":"src/components/editor/QueryEditor.tsx","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/src/components/editor/QueryEditor.tsx#L52","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: src/components/editor/QueryTabs.tsx:158 and src/components/editor/QueryTabs.tsx:201","ref":"src/components/editor/QueryTabs.tsx","url":"https://github.com/andrisasuke/gemini-sql/blob/46a5c605728a5b287b8f848976fc15d159831106/src/components/editor/QueryTabs.tsx#L158","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":3.0,"weighted_findings":3.0,"scanned_lines":6845.0,"category:best-practice":3.0},"findings":[{"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":"src/components/common/Button.tsx","line":37,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/components/common/Button.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":"src/components/common/Input.tsx","line":28,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/components/common/Input.tsx:28"},{"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":"src/components/common/Select.tsx","line":26,"fingerprint":"typescript.react.best-practice.react-props-spreading:src/components/common/Select.tsx:26"}],"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":0.0,"check:ci_runs_tests":0.0,"check:ci_runs_lint":0.0,"check:tests_cochange":0.0,"test_lines":0.0,"source_lines":6845.0,"test_ratio":0.0,"ci_files":0.0,"cochange_share":0.0,"cochange_commits":8.0},"findings":[],"evidence":[],"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":0.0,"check:changelog":0.0,"readme_lines":133.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}],"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: tsconfig.json","ref":"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":6845.0,"other_lines":0.0,"files_blamed":67.0,"blame_failures":0.0,"quality:ai_findings":3.0,"quality:ai_per_kloc":0.438,"quality:other_findings":0.0,"security:ai_findings":1.0,"security:ai_per_kloc":0.146,"security:other_findings":0.0},"findings":[],"evidence":[],"data":{"sampled":false,"comparable":false},"error":null}],"flags":["unreviewed-ai-risk"]}