kirarpit/plexwrap
A personalized year-in-review for Plex
- Repository: https://github.com/kirarpit/plexwrap
- Commit:
2a751066a8aef2bd936e4a32597ee835f01aec29 - Generated: 2026-11-13T23:55:11+00:00
- Scorer 0.1.0, scoring prov-4+qual-2+sec-2, report schema v2
Scores
| Pillar | Score | Signal | Confidence | Coverage |
|---|---|---|---|---|
| AI provenance (estimated AI-generated share) | 2 | explicit | 76% | 100% |
| Code quality | 53 | weak | 90% | 100% |
| Security | 58 | weak | 85% | 100% |
AI provenance
Explicit AI attribution on 2% of first-party code added; an estimated 2% including velocity signals.
- Explicitly attributed share (lower bound): 1.6%
- Unattributed share in AI-consistent velocity bursts: 0.0%
- Estimated AI-generated share: 1.6%
| AI tool | Attributed commits | Lines added |
|---|---|---|
| Claude Code | 2 | 135 |
- AI tooling configured in repo: claude-code
Current source lines last changed by AI-attributed commits: 108 of 7,704.
Too few lines in one group to compare finding densities.
- Stylometry index: 4.80 per 1,000 lines (narrated steps 1, placeholders 0, assistant phrasing 0, emoji 72). Reported as a signal, not scored.
| Month | Lines added | Attributed to AI |
|---|---|---|
| 2025-12 | 8,170 | 0% |
| 2026-01 | 162 | 83% |
Evidence
- Claude Code: on merged branch (89cbb29f58) (55060dc21332)
- Claude Code: author claude[bot] (ddfe48713472)
- .github/workflows/claude.yml runs anthropics/claude-code-action (.github/work)
- step-by-step narration comment: // First, get the image modification time for cache-busting (frontend/src)
AI provenance describes how code was produced; it is not a quality judgment. Unless attribution is explicit, these are signals consistent with AI generation, not proof. Squash/rebase workflows, imported code, and rewritten history reduce accuracy.
Code quality
Code quality is weak: test-to-source ratio 0.00, CI runs tests; 33% of function code in complex or long functions; 5% duplicated lines. Weakest area: type safety.
| Area | Score |
|---|---|
| Complexity (lizard) | 37 |
| Duplication | 76 |
| Code smells (Opengrep) | 62 |
| Tests and CI | 58 |
| Documentation | 40 |
| Type safety | 31 |
| Process (Scorecard review/maintenance) | n/a |
- Functions: 268; mean complexity 5.7, 90th percentile 12; 14 complex and 7 long functions
- Duplicated lines: 4.6% of 5,696 compared
- Tests: 9 test lines for 7,704 source lines (ratio 0.00); CI test commands: npm run test; 7% of recent source commits also change tests
- Docs missing or thin: license, contributing, changelog
Most complex functions:
- analyze_history in analyzer.py: complexity 141, 363 lines
- get_user_comparative_stats in cross_user_analyzer.py: complexity 72, 255 lines
- (anonymous) in frontend/src/components/cards/CardFactory.tsx: complexity 29, 126 lines
- SummaryCard in frontend/src/components/cards/SummaryCard.tsx: complexity 28, 152 lines
- _extract_images_from_response in clients/image_client.py: complexity 24, 54 lines
Security
Security posture is weak: 189 known vulnerabilities in 57 dependencies; 3 high-severity workflow issues. Weakest area: posture.
| Area | Score |
|---|---|
| Secrets (gitleaks, tree + history) | 100 |
| Static analysis (Opengrep) | 93 |
| Vulnerable dependencies (OSV) | 0 |
| CI workflows (zizmor) | 58 |
| Posture (policy, updates, signing, lockfiles) | 0 |
| OpenSSF Scorecard | n/a |
-
Known vulnerabilities: 189 in 57 packages (critical 4, high 92, medium 78, low 15)
-
Posture checks passed: none; missing: security policy, dependency updates, signed commits, lockfiles
Top findings
| Severity | Finding | Location |
|---|---|---|
| critical | osv/GHSA-87r5-mp6g-5w5j: jsonpath@1.1.1 (npm) is affected by GHSA-87r5-mp6g-5w5j |
frontend/package-lock.json |
| critical | osv/GHSA-jqcg-44mw-7w3h: proxy-addr@2.0.7 (npm) is affected by GHSA-jqcg-44mw-7w3h |
frontend/package-lock.json |
| critical | osv/GHSA-w7jw-789q-3m8p: shell-quote@1.8.3 (npm) is affected by GHSA-w7jw-789q-3m8p |
frontend/package-lock.json |
| critical | osv/GHSA-xv26-6w52-cph6: websocket-driver@0.7.4 (npm) is affected by GHSA-xv26-6w52-cph6 |
frontend/package-lock.json |
| high | osv/GHSA-fv7c-fp4j-7gwp: @babel/plugin-transform-modules-systemjs@7.28.5 (npm) is affected by GHSA-fv7c-fp4j-7gwp |
frontend/package-lock.json |
| high | osv/GHSA-35jp-ww65-95wh: axios@1.13.2 (npm) is affected by GHSA-35jp-ww65-95wh |
frontend/package-lock.json |
| high | osv/GHSA-3g43-6gmg-66jw: axios@1.13.2 (npm) is affected by GHSA-3g43-6gmg-66jw |
frontend/package-lock.json |
| high | osv/GHSA-3pq3-5fj3-cg6v: axios@1.13.2 (npm) is affected by GHSA-3pq3-5fj3-cg6v |
frontend/package-lock.json |
| high | osv/GHSA-43fc-jf86-j433: axios@1.13.2 (npm) is affected by GHSA-43fc-jf86-j433 |
frontend/package-lock.json |
| high | osv/GHSA-542g-h47m-68v8: axios@1.13.2 (npm) is affected by GHSA-542g-h47m-68v8 |
frontend/package-lock.json |
| high | osv/GHSA-62hf-57xw-28j9: axios@1.13.2 (npm) is affected by GHSA-62hf-57xw-28j9 |
frontend/package-lock.json |
| high | osv/GHSA-6chq-wfr3-2hj9: axios@1.13.2 (npm) is affected by GHSA-6chq-wfr3-2hj9 |
frontend/package-lock.json |
| high | osv/GHSA-777c-7fjr-54vf: axios@1.13.2 (npm) is affected by GHSA-777c-7fjr-54vf |
frontend/package-lock.json |
| high | osv/GHSA-hfxv-24rg-xrqf: axios@1.13.2 (npm) is affected by GHSA-hfxv-24rg-xrqf |
frontend/package-lock.json |
| high | osv/GHSA-j5f8-grm9-p9fc: axios@1.13.2 (npm) is affected by GHSA-j5f8-grm9-p9fc |
frontend/package-lock.json |
| high | osv/GHSA-p92q-9vqr-4j8v: axios@1.13.2 (npm) is affected by GHSA-p92q-9vqr-4j8v |
frontend/package-lock.json |
| high | osv/GHSA-pf86-5x62-jrwf: axios@1.13.2 (npm) is affected by GHSA-pf86-5x62-jrwf |
frontend/package-lock.json |
| high | osv/GHSA-pmwg-cvhr-8vh7: axios@1.13.2 (npm) is affected by GHSA-pmwg-cvhr-8vh7 |
frontend/package-lock.json |
| high | osv/GHSA-q8qp-cvcw-x6jj: axios@1.13.2 (npm) is affected by GHSA-q8qp-cvcw-x6jj |
frontend/package-lock.json |
| high | osv/GHSA-27r3-jxmh-p828: body-parser@1.20.4 (npm) is affected by GHSA-27r3-jxmh-p828 |
frontend/package-lock.json |
| high | osv/GHSA-3jxr-9vmj-r5cp: brace-expansion@1.1.12 (npm) is affected by GHSA-3jxr-9vmj-r5cp |
frontend/package-lock.json |
| high | osv/GHSA-6j4f-fj2g-mc7p: brace-expansion@1.1.12 (npm) is affected by GHSA-6j4f-fj2g-mc7p |
frontend/package-lock.json |
| high | osv/GHSA-mh99-v99m-4gvg: brace-expansion@1.1.12 (npm) is affected by GHSA-mh99-v99m-4gvg |
frontend/package-lock.json |
| high | osv/GHSA-qhr7-859c-m2p7: brace-expansion@1.1.12 (npm) is affected by GHSA-qhr7-859c-m2p7 |
frontend/package-lock.json |
| high | osv/GHSA-rgw5-rvv9-x895: brace-expansion@1.1.12 (npm) is affected by GHSA-rgw5-rvv9-x895 |
frontend/package-lock.json |
Static signals only: the scorer never runs the project's code. Secret findings are pattern matches that were not verified, and secret values are never stored.
Repository profile
- Source lines: 7,704; test lines: 9
| Language | Lines |
|---|---|
| TypeScript | 3,920 |
| Python | 3,700 |
| Shell | 93 |