{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-5+qual-2+sec-2","generated_at":"2026-11-14T14:52:06.008951Z","repo":{"ref":{"host":"github.com","owner":"lanceylai","name":"TSWeChat"},"default_branch":"master","clone_url":"https://github.com/lanceylai/TSWeChat.git","html_url":"https://github.com/lanceylai/TSWeChat","description":"A WeChat alternative. Written in Swift 5.","stars":3743,"forks":769,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":29643,"primary_language":"Swift","license_spdx":"MIT","created_at":"2016-02-27T10:01:20Z","pushed_at":"2019-07-28T08:57:46Z","security_policy_url":null,"distribution":{"owner_created_at":"2012-08-30T03:45:44Z","owner_type":"User","release_assets":[]}},"commit_sha":"a1d371a7b25e8e8eea8747e37289cd3386516602","profile":{"lines_by_language":{"Swift":8468,"Shell":129,"PHP":66,"C":12},"files_by_category":{"vendored":722,"binary":469,"config":213,"source":90,"other":34,"oversized":6,"docs":4},"source_lines":8675,"test_lines":0},"pillars":{"ai_provenance":{"score":0.0,"confidence":0.52,"coverage":1.0,"label":"none-detected","breakdown":{"attributed_share":0.0,"suspected_share":0.0,"estimated_share":0.0,"ai_artifacts":0.0,"flagged_work_units":0.0,"flagged_releases":null,"style_index":0.461},"summary":"No AI attribution or AI-consistent velocity signals detected."},"quality":{"score":60.9,"confidence":0.9,"coverage":1.0,"label":"weak","breakdown":{"complexity":95.8,"duplication":80.9,"lint":93.0,"testing":0.0,"docs":65.0,"type_safety":null,"process":null},"summary":"Code quality is weak: test-to-source ratio 0.00, no CI test run detected; 1% of function code in complex or long functions; 4% duplicated lines. Weakest area: testing."},"security":{"score":58.6,"confidence":0.85,"coverage":1.0,"label":"weak","breakdown":{"secrets":48.8,"sast":100.0,"dependencies":null,"ci_actions":null,"posture":0.0,"scorecard":null},"summary":"Security posture is weak: 1 possible secret(s) in the tree, 1 only in history. 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":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":"no registry dependencies declared"},{"analyzer":"ai-attribution","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"commits":49.0,"attributed_commits":0.0,"attributed_commit_share":0.0,"effective_loc":13940.0,"attributed_loc":0.0,"attributed_loc_share":0.0,"tools_detected":0.0},"findings":[],"evidence":[],"data":{"attributed_loc_by_commit":{},"tools":{},"monthly":{"2016-02":{"loc":4937,"attributed_loc":0},"2016-03":{"loc":6990,"attributed_loc":0},"2016-04":{"loc":0,"attributed_loc":0},"2016-08":{"loc":53,"attributed_loc":0},"2016-09":{"loc":3,"attributed_loc":0},"2016-11":{"loc":1625,"attributed_loc":0},"2017-03":{"loc":2,"attributed_loc":0},"2018-03":{"loc":172,"attributed_loc":0},"2018-04":{"loc":18,"attributed_loc":0},"2019-02":{"loc":1,"attributed_loc":0},"2019-07":{"loc":139,"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":27.0,"flagged_units":0.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":3132.0,"pre_ai_era_burst_loc":0.0,"measured_loc":3132.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":341.25,"median_loc_per_hour":52.425392267459756,"pr_timed_units":3.0,"excluded_import_loc":10808.0},"findings":[],"evidence":[],"data":{"flagged_loc_by_commit":{},"excluded_import_commits":["4a3ff2a39fda1c7b3e9e4d953bc118dee38ded83","6a41db8ca1e8a7e18dd7dd739148b36da6955797"]},"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":8675.0,"index":0.461,"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":8.0,"per_kloc:emoji_in_code":0.922,"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":1.0,"secrets_history":1.0,"secrets_nonprod":0.0,"secrets_low_confidence":4.0},"findings":[{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"Pods/Manifest.lock","line":96,"fingerprint":"Pods/Manifest.lock:generic-api-key:96"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"Podfile.lock","line":96,"fingerprint":"Podfile.lock:generic-api-key:96"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"Scripts/apns.php","line":5,"fingerprint":"Scripts/apns.php:generic-api-key:5"},{"rule_id":"gitleaks/generic-api-key","severity":"low","message":"Possible generic-api-key secret in the current tree","path":"TSWeChat/Resources/JSON/chat.json","line":52,"fingerprint":"TSWeChat/Resources/JSON/chat.json:generic-api-key:52"},{"rule_id":"gitleaks/square-access-token","severity":"high","message":"Possible square-access-token secret in the current tree","path":"Pods/Pods.xcodeproj/project.pbxproj","line":779,"fingerprint":"Pods/Pods.xcodeproj/project.pbxproj:square-access-token:779"},{"rule_id":"gitleaks/square-access-token","severity":"medium","message":"Possible square-access-token secret in history (commit f73704814f); removed from the current tree but still retrievable","path":"Pods/Pods.xcodeproj/xcshareddata/xcschemes/Alamofire.xcscheme","line":17,"fingerprint":"f73704814f75ba1df7e74359ea0feb21e6d6f85f:Pods/Pods.xcodeproj/xcshareddata/xcschemes/Alamofire.xcscheme:square-access-token:17"}],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":0.0,"findings_high":0.0,"findings_medium":0.0,"findings_low":0.0,"weighted_findings":0.0,"scanned_lines":8675.0,"parse_errors":67.0},"findings":[],"evidence":[],"data":{"rulesets":["swift","bash","php","c"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"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":1.0,"signed_commit_share":0.0204,"unpinned_manifests":0.0},"findings":[],"evidence":[],"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":510.0,"function_nloc":4240.0,"mean_ccn":1.88,"p90_ccn":4.0,"complex_functions":1.0,"long_functions":0.0,"many_param_functions":0.0,"risky_nloc_share":0.0142},"findings":[],"evidence":[{"kind":"complex-function","description":"timeAgoSinceDate in TSWeChat/Helpers/NSDate+Extension.swift: complexity 19, 60 lines","ref":"TSWeChat/Helpers/NSDate+Extension.swift","url":"https://github.com/lanceylai/TSWeChat/blob/a1d371a7b25e8e8eea8747e37289cd3386516602/TSWeChat/Helpers/NSDate+Extension.swift#L43","weight":0.31666666666666665}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":5453.0,"duplicated_lines":193.0,"duplicated_share":0.0354,"files":90.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: TSWeChat/Classes/Chat/Cells/TSChatTimeCell.swift:78 and TSWeChat/Helpers/NSDate+Extension.swift:48","ref":"TSWeChat/Classes/Chat/Cells/TSChatTimeCell.swift","url":"https://github.com/lanceylai/TSWeChat/blob/a1d371a7b25e8e8eea8747e37289cd3386516602/TSWeChat/Classes/Chat/Cells/TSChatTimeCell.swift#L78","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: TSWeChat/Classes/Chat/ChatHelper/AudioFilesManager.swift:45 and TSWeChat/Classes/Chat/ChatHelper/ImageFilesManager.swift:32","ref":"TSWeChat/Classes/Chat/ChatHelper/AudioFilesManager.swift","url":"https://github.com/lanceylai/TSWeChat/blob/a1d371a7b25e8e8eea8747e37289cd3386516602/TSWeChat/Classes/Chat/ChatHelper/AudioFilesManager.swift#L45","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: TSWeChat/Classes/Chat/TSChatViewController+Keyboard.swift:172 and TSWeChat/Classes/Chat/TSChatViewController+Keyboard.swift:212","ref":"TSWeChat/Classes/Chat/TSChatViewController+Keyboard.swift","url":"https://github.com/lanceylai/TSWeChat/blob/a1d371a7b25e8e8eea8747e37289cd3386516602/TSWeChat/Classes/Chat/TSChatViewController+Keyboard.swift#L172","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: TSWeChat/Classes/Chat/TSChatViewController.swift:93 and TSWeChat/Classes/Message/TSMessageViewController.swift:67","ref":"TSWeChat/Classes/Chat/TSChatViewController.swift","url":"https://github.com/lanceylai/TSWeChat/blob/a1d371a7b25e8e8eea8747e37289cd3386516602/TSWeChat/Classes/Chat/TSChatViewController.swift#L93","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: TSWeChat/Classes/Chat/Views/TSChatActionBarView.swift:80 and TSWeChat/Classes/Message/View/TSMessageActionFloatView.swift:23","ref":"TSWeChat/Classes/Chat/Views/TSChatActionBarView.swift","url":"https://github.com/lanceylai/TSWeChat/blob/a1d371a7b25e8e8eea8747e37289cd3386516602/TSWeChat/Classes/Chat/Views/TSChatActionBarView.swift#L80","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: TSWeChat/Classes/Chat/Views/TSChatActionBarView.swift:81 and TSWeChat/Classes/Chat/Views/TSChatVoiceIndicatorView.swift:27","ref":"TSWeChat/Classes/Chat/Views/TSChatActionBarView.swift","url":"https://github.com/lanceylai/TSWeChat/blob/a1d371a7b25e8e8eea8747e37289cd3386516602/TSWeChat/Classes/Chat/Views/TSChatActionBarView.swift#L81","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: TSWeChat/Classes/Chat/Views/TSChatActionBarView.swift:139 and TSWeChat/Classes/Chat/Views/TSChatActionBarView.swift:152","ref":"TSWeChat/Classes/Chat/Views/TSChatActionBarView.swift","url":"https://github.com/lanceylai/TSWeChat/blob/a1d371a7b25e8e8eea8747e37289cd3386516602/TSWeChat/Classes/Chat/Views/TSChatActionBarView.swift#L139","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: TSWeChat/Classes/Contacts/TSContactsViewController.swift:96 and TSWeChat/Classes/Message/TSMessageViewController.swift:61","ref":"TSWeChat/Classes/Contacts/TSContactsViewController.swift","url":"https://github.com/lanceylai/TSWeChat/blob/a1d371a7b25e8e8eea8747e37289cd3386516602/TSWeChat/Classes/Contacts/TSContactsViewController.swift#L96","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: TSWeChat/Classes/Contacts/TSContactsViewController.swift:103 and TSWeChat/Classes/Discover/TSDiscoverViewController.swift:41","ref":"TSWeChat/Classes/Contacts/TSContactsViewController.swift","url":"https://github.com/lanceylai/TSWeChat/blob/a1d371a7b25e8e8eea8747e37289cd3386516602/TSWeChat/Classes/Contacts/TSContactsViewController.swift#L103","weight":0.3},{"kind":"duplicate-code","description":"6+ duplicated lines: TSWeChat/Classes/Discover/TSDiscoverViewController.swift:52 and TSWeChat/Classes/Me/TSMeViewController.swift:52","ref":"TSWeChat/Classes/Discover/TSDiscoverViewController.swift","url":"https://github.com/lanceylai/TSWeChat/blob/a1d371a7b25e8e8eea8747e37289cd3386516602/TSWeChat/Classes/Discover/TSDiscoverViewController.swift#L52","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":10.0,"weighted_findings":2.5,"scanned_lines":8675.0,"category:correctness":10.0},"findings":[{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"Scripts/xcodebuild.sh","line":59,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:Scripts/xcodebuild.sh:59"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"Scripts/xcodebuild.sh","line":62,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:Scripts/xcodebuild.sh:62"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"Scripts/xcodebuild.sh","line":66,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:Scripts/xcodebuild.sh:66"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"Scripts/xcodebuild.sh","line":103,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:Scripts/xcodebuild.sh:103"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"Scripts/xcodebuild.sh","line":104,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:Scripts/xcodebuild.sh:104"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"Scripts/xcodebuild.sh","line":106,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:Scripts/xcodebuild.sh:106"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"Scripts/xcodebuild.sh","line":107,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:Scripts/xcodebuild.sh:107"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-command-substitution-in-command","severity":"low","message":"The result of command substitution $(...) or `...`, if unquoted, is split on whitespace or other separators specified by the IFS variable. You should surround it with double quotes to avoid splitting the result.","path":"Scripts/xcodebuild.sh","line":115,"fingerprint":"bash.lang.correctness.unquoted-command-substitution-in-command:Scripts/xcodebuild.sh:115"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"Scripts/xcodebuild.sh","line":115,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:Scripts/xcodebuild.sh:115"},{"rule_id":"opengrep/bash.lang.correctness.unquoted-variable-expansion-in-command","severity":"low","message":"Variable expansions must be double-quoted so as to prevent being split into multiple pieces according to whitespace or whichever separator is specified by the IFS variable. If you really wish to split the variable's contents, you may use a variable that starts with an underscore e.g. $_X instead of ","path":"Scripts/xcodebuild.sh","line":120,"fingerprint":"bash.lang.correctness.unquoted-variable-expansion-in-command:Scripts/xcodebuild.sh:120"}],"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":8675.0,"test_ratio":0.0,"ci_files":0.0,"cochange_share":0.0,"cochange_commits":32.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":57.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":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null}],"flags":[]}