codedna 0.2.21__tar.gz → 0.2.23__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {codedna-0.2.21 → codedna-0.2.23}/PKG-INFO +1 -1
- codedna-0.2.23/codedna/__init__.py +4 -0
- {codedna-0.2.21 → codedna-0.2.23}/codedna/ai.py +29 -34
- {codedna-0.2.21 → codedna-0.2.23}/codedna/ai_box.py +22 -22
- codedna-0.2.23/codedna/ai_fingerprint.py +220 -0
- codedna-0.2.23/codedna/analyzer.py +245 -0
- codedna-0.2.23/codedna/api.py +1407 -0
- {codedna-0.2.21 → codedna-0.2.23}/codedna/auth.py +108 -108
- codedna-0.2.23/codedna/bus_factor.py +258 -0
- {codedna-0.2.21 → codedna-0.2.23}/codedna/cli.py +9 -9
- {codedna-0.2.21 → codedna-0.2.23}/codedna/db.py +21 -21
- codedna-0.2.23/codedna/git_hook.py +210 -0
- codedna-0.2.23/codedna/integrations/__init__.py +1 -0
- codedna-0.2.23/codedna/integrations/github_bot.py +259 -0
- codedna-0.2.23/codedna/integrations/jira.py +165 -0
- codedna-0.2.23/codedna/integrations/lemonsqueezy.py +229 -0
- codedna-0.2.23/codedna/interview.py +296 -0
- codedna-0.2.23/codedna/onboarding.py +195 -0
- {codedna-0.2.21 → codedna-0.2.23}/codedna/plan.py +51 -52
- codedna-0.2.23/codedna/protection.py +211 -0
- codedna-0.2.23/codedna/rate_limit.py +83 -0
- codedna-0.2.23/codedna/scorer.py +221 -0
- codedna-0.2.23/codedna/sprint_health.py +185 -0
- codedna-0.2.23/codedna/survey.py +104 -0
- codedna-0.2.23/codedna/tech_debt.py +230 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/ai-compare/page.tsx +47 -64
- codedna-0.2.23/dashboard/app/billing/page.tsx +260 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/bus-factor/page.tsx +62 -66
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/commits/page.tsx +30 -30
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/debt/page.tsx +103 -131
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/files/page.tsx +25 -25
- codedna-0.2.23/dashboard/app/interview/page.tsx +230 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/login/page.tsx +20 -20
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/onboarding/page.tsx +108 -127
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/page.tsx +15 -15
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/protected/page.tsx +74 -73
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/register/page.tsx +23 -23
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/settings/integrations/page.tsx +64 -48
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/sprints/page.tsx +107 -167
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/components/AnlamaGrafigi.tsx +24 -21
- codedna-0.2.23/dashboard/components/AuthProvider.tsx +53 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/components/CommitTable.tsx +50 -50
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/components/FeatureGate.tsx +13 -14
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/components/FileHeatmap.tsx +27 -27
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/components/HataBanner.tsx +6 -3
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/components/NavClient.tsx +8 -8
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/components/QuickInsights.tsx +36 -35
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/components/RiskBadge.tsx +10 -14
- codedna-0.2.23/dashboard/components/SummaryCards.tsx +100 -0
- codedna-0.2.23/dashboard/lib/api.ts +116 -0
- codedna-0.2.23/dashboard/lib/auth.ts +131 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/lib/plan.ts +16 -16
- {codedna-0.2.21 → codedna-0.2.23}/pyproject.toml +1 -1
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/src/apiClient.ts +26 -26
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/src/decorations.ts +12 -12
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/src/extension.ts +19 -19
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/src/statusBar.ts +15 -15
- codedna-0.2.21/codedna/__init__.py +0 -4
- codedna-0.2.21/codedna/ai_fingerprint.py +0 -223
- codedna-0.2.21/codedna/analyzer.py +0 -245
- codedna-0.2.21/codedna/api.py +0 -1505
- codedna-0.2.21/codedna/bus_factor.py +0 -259
- codedna-0.2.21/codedna/git_hook.py +0 -212
- codedna-0.2.21/codedna/integrations/__init__.py +0 -1
- codedna-0.2.21/codedna/integrations/github_bot.py +0 -259
- codedna-0.2.21/codedna/integrations/jira.py +0 -166
- codedna-0.2.21/codedna/integrations/lemonsqueezy.py +0 -236
- codedna-0.2.21/codedna/interview.py +0 -298
- codedna-0.2.21/codedna/onboarding.py +0 -195
- codedna-0.2.21/codedna/protection.py +0 -211
- codedna-0.2.21/codedna/rate_limit.py +0 -83
- codedna-0.2.21/codedna/scorer.py +0 -221
- codedna-0.2.21/codedna/sprint_health.py +0 -185
- codedna-0.2.21/codedna/survey.py +0 -104
- codedna-0.2.21/codedna/tech_debt.py +0 -232
- codedna-0.2.21/dashboard/app/billing/page.tsx +0 -341
- codedna-0.2.21/dashboard/app/interview/page.tsx +0 -225
- codedna-0.2.21/dashboard/components/AuthProvider.tsx +0 -53
- codedna-0.2.21/dashboard/components/SummaryCards.tsx +0 -100
- codedna-0.2.21/dashboard/lib/api.ts +0 -116
- codedna-0.2.21/dashboard/lib/auth.ts +0 -131
- codedna-0.2.21/vscode-extension/out/apiClient.js +0 -103
- codedna-0.2.21/vscode-extension/out/decorations.js +0 -106
- codedna-0.2.21/vscode-extension/out/extension.js +0 -154
- codedna-0.2.21/vscode-extension/out/statusBar.js +0 -156
- {codedna-0.2.21 → codedna-0.2.23}/.env.example +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/.env.ls +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/.github/CODEOWNERS +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/.github/dependabot.yml +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/.github/workflows/codedna.yml +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/.github/workflows/codeql.yml +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/.github/workflows/test.yml +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/.gitignore +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/.python-version +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/CHANGELOG.md +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/CONTRIBUTING.md +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/LICENSE +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/README.md +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/SECURITY.md +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/.env.local.example +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/.gitignore +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/README.md +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/api/auth/login/route.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/api/auth/logout/route.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/api/auth/me/route.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/api/auth/register/route.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/api/billing/checkout/route.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/favicon.ico +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/fonts/GeistMonoVF.woff +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/fonts/GeistVF.woff +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/globals.css +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/layout.tsx +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/app/pricing/page.tsx +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/components/ClientProviders.tsx +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/components/CostInfoTooltip.tsx +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/components/LanguageSwitcher.tsx +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/components/OverviewTitles.tsx +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/components/UpgradeBanner.tsx +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/lib/i18n/en.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/lib/i18n/index.tsx +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/lib/i18n/tr.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/next-env.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/next.config.mjs +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/package-lock.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/package.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/postcss.config.mjs +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/tailwind.config.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/dashboard/tsconfig.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/hooks/post-commit +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/uv.lock +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/.bin/tsc +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/.bin/tsserver +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/.package-lock.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/LICENSE +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/README.md +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/assert/strict.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/assert.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/async_hooks.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/buffer.buffer.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/buffer.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/child_process.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/cluster.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/compatibility/disposable.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/compatibility/index.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/compatibility/indexable.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/compatibility/iterators.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/console.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/constants.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/crypto.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/dgram.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/diagnostics_channel.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/dns/promises.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/dns.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/domain.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/events.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/fs/promises.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/fs.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/globals.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/globals.typedarray.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/http.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/http2.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/https.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/index.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/inspector.generated.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/module.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/net.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/os.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/package.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/path.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/perf_hooks.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/process.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/punycode.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/querystring.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/readline/promises.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/readline.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/repl.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/sea.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/stream/consumers.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/stream/promises.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/stream/web.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/stream.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/string_decoder.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/test.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/timers/promises.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/timers.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/tls.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/trace_events.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/ts5.6/index.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/tty.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/url.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/util.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/v8.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/vm.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/wasi.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/web-globals/abortcontroller.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/web-globals/domexception.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/web-globals/events.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/web-globals/fetch.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/worker_threads.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/node/zlib.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/vscode/LICENSE +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/vscode/README.md +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/vscode/index.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/@types/vscode/package.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/LICENSE.txt +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/README.md +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/SECURITY.md +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/ThirdPartyNoticeText.txt +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/bin/tsc +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/bin/tsserver +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/_tsc.js +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/_tsserver.js +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/_typingsInstaller.js +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/cs/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/de/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/es/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/fr/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/it/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/ja/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/ko/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.decorators.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.decorators.legacy.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.dom.asynciterable.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.dom.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.dom.iterable.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2015.collection.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2015.core.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2015.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2015.generator.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2015.iterable.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2015.promise.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2015.proxy.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2015.reflect.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2015.symbol.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2016.array.include.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2016.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2016.full.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2016.intl.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2017.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2017.date.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2017.full.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2017.intl.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2017.object.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2017.string.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2018.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2018.full.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2018.intl.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2018.promise.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2018.regexp.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2019.array.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2019.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2019.full.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2019.intl.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2019.object.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2019.string.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2019.symbol.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2020.bigint.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2020.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2020.date.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2020.full.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2020.intl.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2020.number.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2020.promise.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2020.string.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2021.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2021.full.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2021.intl.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2021.promise.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2021.string.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2021.weakref.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2022.array.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2022.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2022.error.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2022.full.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2022.intl.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2022.object.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2022.regexp.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2022.string.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2023.array.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2023.collection.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2023.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2023.full.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2023.intl.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2024.collection.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2024.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2024.full.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2024.object.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2024.promise.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2024.regexp.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es2024.string.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es5.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.es6.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.esnext.array.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.esnext.collection.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.esnext.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.esnext.decorators.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.esnext.disposable.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.esnext.error.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.esnext.float16.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.esnext.full.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.esnext.intl.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.esnext.iterator.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.esnext.promise.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.scripthost.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.webworker.asynciterable.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.webworker.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.webworker.importscripts.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/lib.webworker.iterable.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/pl/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/pt-br/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/ru/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/tr/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/tsc.js +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/tsserver.js +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/tsserverlibrary.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/tsserverlibrary.js +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/typesMap.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/typescript.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/typescript.js +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/typingsInstaller.js +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/watchGuard.js +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/zh-cn/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/lib/zh-tw/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/typescript/package.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/LICENSE +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/README.md +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/agent.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/api.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/balanced-pool.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/cache.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/client.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/connector.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/content-type.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/cookies.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/diagnostics-channel.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/dispatcher.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/env-http-proxy-agent.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/errors.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/eventsource.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/fetch.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/file.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/filereader.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/formdata.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/global-dispatcher.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/global-origin.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/handlers.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/header.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/index.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/interceptors.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/mock-agent.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/mock-client.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/mock-errors.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/mock-interceptor.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/mock-pool.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/package.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/patch.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/pool-stats.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/pool.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/proxy-agent.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/readable.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/retry-agent.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/retry-handler.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/util.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/webidl.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/node_modules/undici-types/websocket.d.ts +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/out/apiClient.js.map +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/out/decorations.js.map +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/out/extension.js.map +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/out/statusBar.js.map +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/package-lock.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/package.json +0 -0
- {codedna-0.2.21 → codedna-0.2.23}/vscode-extension/tsconfig.json +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codedna
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.23
|
|
4
4
|
Summary: AI Code Transparency Tool - detect AI-written code and measure developer understanding
|
|
5
5
|
Project-URL: Homepage, https://codedna.dev
|
|
6
6
|
Project-URL: Repository, https://github.com/natureco-official/codedna
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"""
|
|
2
|
-
AI
|
|
2
|
+
AI Analysis Layer - Interprets user command outputs using AI.
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
Supported providers:
|
|
5
5
|
- Anthropic (Claude)
|
|
6
6
|
- MiniMax
|
|
7
7
|
- OpenAI
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
The key is used only for analysis, no chat/completion.
|
|
10
10
|
"""
|
|
11
11
|
import base64
|
|
12
12
|
import json
|
|
@@ -19,17 +19,17 @@ from typing import Optional
|
|
|
19
19
|
|
|
20
20
|
AI_CONFIG_PATH = Path.home() / ".codedna" / "ai_config.json"
|
|
21
21
|
|
|
22
|
-
# Provider
|
|
22
|
+
# Provider list
|
|
23
23
|
PROVIDERS = ["anthropic", "minimax", "openai"]
|
|
24
24
|
|
|
25
|
-
# Default
|
|
25
|
+
# Default models
|
|
26
26
|
DEFAULT_MODELS = {
|
|
27
27
|
"anthropic": "claude-sonnet-4-20250514",
|
|
28
28
|
"minimax": "MiniMax-M2.5",
|
|
29
29
|
"openai": "gpt-4o-mini",
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
# Provider API
|
|
32
|
+
# Provider API endpoints
|
|
33
33
|
API_ENDPOINTS = {
|
|
34
34
|
"anthropic": "https://api.anthropic.com/v1/messages",
|
|
35
35
|
"minimax": "https://api.minimax.io/v1/text/chatcompletion_v2",
|
|
@@ -39,7 +39,7 @@ API_ENDPOINTS = {
|
|
|
39
39
|
|
|
40
40
|
@dataclass
|
|
41
41
|
class AIConfig:
|
|
42
|
-
"""AI
|
|
42
|
+
"""AI analysis configuration."""
|
|
43
43
|
provider: str
|
|
44
44
|
api_key: str
|
|
45
45
|
model: str
|
|
@@ -47,7 +47,7 @@ class AIConfig:
|
|
|
47
47
|
|
|
48
48
|
@classmethod
|
|
49
49
|
def load(cls) -> Optional["AIConfig"]:
|
|
50
|
-
"""
|
|
50
|
+
"""Load from config file."""
|
|
51
51
|
if not AI_CONFIG_PATH.exists():
|
|
52
52
|
return None
|
|
53
53
|
try:
|
|
@@ -62,7 +62,7 @@ class AIConfig:
|
|
|
62
62
|
return None
|
|
63
63
|
|
|
64
64
|
def save(self) -> None:
|
|
65
|
-
"""
|
|
65
|
+
"""Write config to file."""
|
|
66
66
|
AI_CONFIG_PATH.parent.mkdir(parents=True, exist_ok=True)
|
|
67
67
|
data = {
|
|
68
68
|
"provider": self.provider,
|
|
@@ -78,19 +78,17 @@ class AIConfig:
|
|
|
78
78
|
|
|
79
79
|
@classmethod
|
|
80
80
|
def clear(cls) -> None:
|
|
81
|
-
"""
|
|
81
|
+
"""Delete the config file."""
|
|
82
82
|
if AI_CONFIG_PATH.exists():
|
|
83
83
|
AI_CONFIG_PATH.unlink()
|
|
84
84
|
|
|
85
85
|
|
|
86
86
|
def _call_anthropic(api_key: str, model: str, prompt: str) -> str:
|
|
87
|
-
"""Anthropic Claude API
|
|
87
|
+
"""Call the Anthropic Claude API."""
|
|
88
88
|
payload = {
|
|
89
89
|
"model": model,
|
|
90
90
|
"max_tokens": 500,
|
|
91
|
-
"messages": [
|
|
92
|
-
{"role": "user", "content": prompt}
|
|
93
|
-
],
|
|
91
|
+
"messages": [{"role": "user", "content": prompt}],
|
|
94
92
|
}
|
|
95
93
|
req = urllib.request.Request(
|
|
96
94
|
API_ENDPOINTS["anthropic"],
|
|
@@ -104,16 +102,15 @@ def _call_anthropic(api_key: str, model: str, prompt: str) -> str:
|
|
|
104
102
|
)
|
|
105
103
|
with urllib.request.urlopen(req, timeout=30) as resp:
|
|
106
104
|
result = json.loads(resp.read())
|
|
107
|
-
# Response: {content: [{text: "..."}], ...}
|
|
108
105
|
return result.get("content", [{}])[0].get("text", "")
|
|
109
106
|
|
|
110
107
|
|
|
111
108
|
def _call_minimax(api_key: str, model: str, prompt: str) -> str:
|
|
112
|
-
"""MiniMax API
|
|
109
|
+
"""Call the MiniMax API."""
|
|
113
110
|
payload = {
|
|
114
111
|
"model": model,
|
|
115
112
|
"messages": [
|
|
116
|
-
{"role": "system", "content": "
|
|
113
|
+
{"role": "system", "content": "You are CodeDNA's AI analysis assistant. You interpret user command outputs. Do not chat — only provide analysis and insights."},
|
|
117
114
|
{"role": "user", "content": prompt}
|
|
118
115
|
],
|
|
119
116
|
}
|
|
@@ -132,12 +129,12 @@ def _call_minimax(api_key: str, model: str, prompt: str) -> str:
|
|
|
132
129
|
|
|
133
130
|
|
|
134
131
|
def _call_openai(api_key: str, model: str, prompt: str) -> str:
|
|
135
|
-
"""OpenAI API
|
|
132
|
+
"""Call the OpenAI API."""
|
|
136
133
|
payload = {
|
|
137
134
|
"model": model,
|
|
138
135
|
"max_tokens": 500,
|
|
139
136
|
"messages": [
|
|
140
|
-
{"role": "system", "content": "
|
|
137
|
+
{"role": "system", "content": "You are CodeDNA's AI analysis assistant. You interpret user command outputs. Do not chat — only provide analysis and insights."},
|
|
141
138
|
{"role": "user", "content": prompt}
|
|
142
139
|
],
|
|
143
140
|
}
|
|
@@ -157,38 +154,36 @@ def _call_openai(api_key: str, model: str, prompt: str) -> str:
|
|
|
157
154
|
|
|
158
155
|
def ai_analyze(command: str, output: str, config: Optional[AIConfig] = None, extra_context: str = "") -> Optional[str]:
|
|
159
156
|
"""
|
|
160
|
-
|
|
157
|
+
Analyze command output using AI.
|
|
161
158
|
|
|
162
159
|
Args:
|
|
163
|
-
command:
|
|
164
|
-
output:
|
|
165
|
-
config: AI
|
|
166
|
-
extra_context:
|
|
160
|
+
command: Command that was run
|
|
161
|
+
output: Command output
|
|
162
|
+
config: AI configuration
|
|
163
|
+
extra_context: Additional context (file contents, etc.)
|
|
167
164
|
|
|
168
165
|
Returns:
|
|
169
|
-
|
|
166
|
+
Analysis text or None
|
|
170
167
|
"""
|
|
171
168
|
if config is None:
|
|
172
169
|
config = AIConfig.load()
|
|
173
170
|
if config is None or not config.enabled or not config.api_key:
|
|
174
171
|
return None
|
|
175
172
|
|
|
176
|
-
# Plan
|
|
173
|
+
# Plan check — only Pro+ users can use AI analysis
|
|
177
174
|
try:
|
|
178
175
|
from codedna.plan import get_current_plan, Plan as PlanEnum
|
|
179
176
|
plan = get_current_plan()
|
|
180
177
|
if plan == PlanEnum.FREE:
|
|
181
|
-
return None #
|
|
178
|
+
return None # No AI analysis on free plan
|
|
182
179
|
except Exception:
|
|
183
|
-
return None #
|
|
180
|
+
return None # Cannot load plan, skip
|
|
184
181
|
|
|
185
|
-
|
|
186
|
-
# Prompt her zaman Ingilizce - AI daha iyi analiz eder
|
|
187
|
-
baglam = f"\n\nFILE CONTENTS:\n{extra_context}" if extra_context else ""
|
|
182
|
+
context_block = f"\n\nFILE CONTENTS:\n{extra_context}" if extra_context else ""
|
|
188
183
|
prompt = f"""You are CodeDNA's code verification assistant. NEVER give general recommendations, only analyze.
|
|
189
184
|
|
|
190
185
|
OUTPUT:
|
|
191
|
-
{output[:3000]}{
|
|
186
|
+
{output[:3000]}{context_block[:4000]}
|
|
192
187
|
|
|
193
188
|
Respond in this exact format:
|
|
194
189
|
|
|
@@ -227,11 +222,11 @@ Rules:
|
|
|
227
222
|
else:
|
|
228
223
|
return None
|
|
229
224
|
except Exception as e:
|
|
230
|
-
return f"AI
|
|
225
|
+
return f"AI analysis error: {type(e).__name__}"
|
|
231
226
|
|
|
232
227
|
|
|
233
228
|
def is_enabled() -> bool:
|
|
234
|
-
"""AI
|
|
229
|
+
"""Is AI analysis active? (Pro+ users only)"""
|
|
235
230
|
config = AIConfig.load()
|
|
236
231
|
if config is None or not config.enabled or not config.api_key:
|
|
237
232
|
return False
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""
|
|
2
|
-
AI
|
|
3
|
-
|
|
2
|
+
Append AI analysis box to CLI command outputs.
|
|
3
|
+
Show AI analysis box after each command output.
|
|
4
4
|
"""
|
|
5
5
|
from rich.panel import Panel
|
|
6
6
|
from rich.console import Console
|
|
@@ -13,12 +13,12 @@ console = Console()
|
|
|
13
13
|
|
|
14
14
|
def print_ai_box(command_name: str, output: str, width: int = 80) -> None:
|
|
15
15
|
"""
|
|
16
|
-
|
|
16
|
+
Print AI analysis box after command output.
|
|
17
17
|
|
|
18
18
|
Args:
|
|
19
|
-
command_name:
|
|
20
|
-
output:
|
|
21
|
-
width: Panel
|
|
19
|
+
command_name: Command that was run (e.g. "codedna scan")
|
|
20
|
+
output: Command output (raw text)
|
|
21
|
+
width: Panel width
|
|
22
22
|
"""
|
|
23
23
|
try:
|
|
24
24
|
from codedna.ai import ai_analyze, is_enabled
|
|
@@ -26,26 +26,26 @@ def print_ai_box(command_name: str, output: str, width: int = 80) -> None:
|
|
|
26
26
|
return
|
|
27
27
|
|
|
28
28
|
if not is_enabled():
|
|
29
|
-
return # AI
|
|
29
|
+
return # AI is disabled, skip
|
|
30
30
|
|
|
31
|
-
# AI
|
|
31
|
+
# Get AI analysis
|
|
32
32
|
ai_response = ai_analyze(command_name, output)
|
|
33
33
|
|
|
34
34
|
if not ai_response:
|
|
35
35
|
return
|
|
36
36
|
|
|
37
|
-
#
|
|
38
|
-
if ai_response.startswith("AI
|
|
37
|
+
# Silently skip on error (AI analysis is optional)
|
|
38
|
+
if ai_response.startswith("AI analysis error"):
|
|
39
39
|
return
|
|
40
40
|
|
|
41
|
-
#
|
|
41
|
+
# Color and icon
|
|
42
42
|
border_style = "magenta"
|
|
43
|
-
title = "[bold magenta]🤖 AI
|
|
43
|
+
title = "[bold magenta]🤖 AI Analysis (Pro+)[/bold magenta]"
|
|
44
44
|
|
|
45
|
-
#
|
|
45
|
+
# Show maximum 60 lines
|
|
46
46
|
lines = ai_response.strip().split("\n")
|
|
47
47
|
if len(lines) > 60:
|
|
48
|
-
lines = lines[:58] + ["... (
|
|
48
|
+
lines = lines[:58] + ["... (truncated)"]
|
|
49
49
|
content = "\n".join(lines)
|
|
50
50
|
|
|
51
51
|
panel = Panel(
|
|
@@ -64,14 +64,14 @@ def print_ai_box(command_name: str, output: str, width: int = 80) -> None:
|
|
|
64
64
|
|
|
65
65
|
def capture_and_analyze(command_name: str, run_func, *args, **kwargs) -> None:
|
|
66
66
|
"""
|
|
67
|
-
|
|
67
|
+
Run a command, capture its output, then show AI analysis.
|
|
68
68
|
|
|
69
69
|
Args:
|
|
70
|
-
command_name:
|
|
71
|
-
run_func:
|
|
72
|
-
*args, **kwargs:
|
|
70
|
+
command_name: Command name (for analysis)
|
|
71
|
+
run_func: Function to run
|
|
72
|
+
*args, **kwargs: Arguments to pass to the function
|
|
73
73
|
"""
|
|
74
|
-
#
|
|
74
|
+
# Capture output
|
|
75
75
|
old_stdout = sys.stdout
|
|
76
76
|
sys.stdout = buffer = StringIO()
|
|
77
77
|
|
|
@@ -81,14 +81,14 @@ def capture_and_analyze(command_name: str, run_func, *args, **kwargs) -> None:
|
|
|
81
81
|
pass
|
|
82
82
|
except Exception as e:
|
|
83
83
|
sys.stdout = old_stdout
|
|
84
|
-
console.print(f"[red]
|
|
84
|
+
console.print(f"[red]Error: {e}[/red]")
|
|
85
85
|
return
|
|
86
86
|
finally:
|
|
87
87
|
output = buffer.getvalue()
|
|
88
88
|
sys.stdout = old_stdout
|
|
89
89
|
|
|
90
|
-
#
|
|
90
|
+
# Show original output
|
|
91
91
|
console.print(output, end="")
|
|
92
92
|
|
|
93
|
-
# AI
|
|
93
|
+
# AI analysis
|
|
94
94
|
print_ai_box(command_name, output)
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Distinguishes patterns left by different AI code assistants.
|
|
3
|
+
|
|
4
|
+
IMPORTANT WARNING:
|
|
5
|
+
This is NOT a definitive detection — it is a pattern-based heuristic ESTIMATION model.
|
|
6
|
+
Results may contain false positives/negatives. No certainty is claimed.
|
|
7
|
+
Must be presented to users with this context.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import re
|
|
13
|
+
from dataclasses import dataclass
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Optional
|
|
16
|
+
|
|
17
|
+
from codedna.db import get_connection
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# ---------------------------------------------------------------------------
|
|
21
|
+
# Tool pattern definitions — heuristic, defensible but not definitive
|
|
22
|
+
# ---------------------------------------------------------------------------
|
|
23
|
+
|
|
24
|
+
# Weighted pattern list per tool: (regex_pattern, weight)
|
|
25
|
+
_TOOL_PATTERNS: dict[str, list[tuple[str, float]]] = {
|
|
26
|
+
"copilot": [
|
|
27
|
+
# GitHub Copilot: short inline comments, no type declarations
|
|
28
|
+
(r"#\s+[A-Z][a-z].{5,40}$", 0.15), # single-line title comment
|
|
29
|
+
(r"def \w+\([^)]{0,30}\):\s*$", 0.10), # no-param / minimal function
|
|
30
|
+
(r"#\s+TODO:", 0.10), # TODO comments
|
|
31
|
+
(r"^\s{4}pass\s*$", 0.08), # functions ending with pass
|
|
32
|
+
(r"return \w+\.get\(", 0.07), # .get() pattern
|
|
33
|
+
],
|
|
34
|
+
"cursor": [
|
|
35
|
+
# Cursor: detailed docstrings, rich type hints
|
|
36
|
+
(r'"""[\s\S]{20,200}"""', 0.20), # long docstring
|
|
37
|
+
(r":\s*(str|int|float|bool|list|dict|Optional)", 0.15), # type hints
|
|
38
|
+
(r"->.*:\s*$", 0.12), # return type declaration
|
|
39
|
+
(r"from typing import", 0.10), # typing module
|
|
40
|
+
(r"@dataclass", 0.10), # dataclass usage
|
|
41
|
+
],
|
|
42
|
+
"claude": [
|
|
43
|
+
# Claude: structured multi-line comments, Args/Returns docstrings
|
|
44
|
+
(r"#\s+\d+\.\s+\w", 0.18), # numbered step comments
|
|
45
|
+
(r"\"\"\"[\s\S]*Args:[\s\S]*Returns:", 0.20), # Args/Returns docstring
|
|
46
|
+
(r"#\s+─{3,}", 0.15), # separator line comments
|
|
47
|
+
(r"raise \w+Error\(f[\"']", 0.10), # f-string error messages
|
|
48
|
+
(r"from __future__ import annotations", 0.12), # modern annotation
|
|
49
|
+
],
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
# Minimum confidence threshold — returns "unknown" if below this
|
|
53
|
+
_MIN_CONFIDENCE = 0.15
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@dataclass
|
|
57
|
+
class AIToolGuess:
|
|
58
|
+
"""AI tool guess for a single file."""
|
|
59
|
+
|
|
60
|
+
arac: str # "copilot" | "cursor" | "claude" | "unknown" (kept for compat)
|
|
61
|
+
guven: float # 0.0–1.0 (kept for compat)
|
|
62
|
+
puan_detayi: dict[str, float] # tool → raw score (kept for compat)
|
|
63
|
+
uyari: str = (
|
|
64
|
+
"This detection is pattern-based estimation — not definitive."
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def guess_ai_tool(file_path: str, code: str) -> AIToolGuess:
|
|
69
|
+
"""
|
|
70
|
+
Return a probable AI tool guess and confidence score for a file.
|
|
71
|
+
|
|
72
|
+
Strategy:
|
|
73
|
+
Defined regex patterns for each tool are applied to the code.
|
|
74
|
+
A total score is computed based on weighted match counts.
|
|
75
|
+
The highest-scoring tool is selected if it exceeds the minimum confidence threshold.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
file_path: File path (used for extension filtering)
|
|
79
|
+
code: Source code of the file
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
AIToolGuess object
|
|
83
|
+
"""
|
|
84
|
+
lines = code.splitlines()
|
|
85
|
+
scores: dict[str, float] = {tool: 0.0 for tool in _TOOL_PATTERNS}
|
|
86
|
+
|
|
87
|
+
for tool, patterns in _TOOL_PATTERNS.items():
|
|
88
|
+
for pattern, weight in patterns:
|
|
89
|
+
match_count = sum(1 for line in lines if re.search(pattern, line))
|
|
90
|
+
# Normalize by line count (prevents unfair advantage in large files)
|
|
91
|
+
norm = match_count / max(len(lines), 1)
|
|
92
|
+
scores[tool] += norm * weight * 10 # scale to 0–10
|
|
93
|
+
|
|
94
|
+
# Normalize — calculate confidence relative to total score
|
|
95
|
+
total = sum(scores.values())
|
|
96
|
+
if total < 0.01:
|
|
97
|
+
return AIToolGuess(
|
|
98
|
+
arac="unknown",
|
|
99
|
+
guven=0.0,
|
|
100
|
+
puan_detayi={k: round(v, 3) for k, v in scores.items()},
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
best_tool = max(scores, key=lambda k: scores[k])
|
|
104
|
+
confidence = scores[best_tool] / total
|
|
105
|
+
|
|
106
|
+
# Below minimum threshold → unknown
|
|
107
|
+
if confidence < _MIN_CONFIDENCE:
|
|
108
|
+
best_tool = "unknown"
|
|
109
|
+
|
|
110
|
+
return AIToolGuess(
|
|
111
|
+
arac=best_tool,
|
|
112
|
+
guven=round(confidence, 3),
|
|
113
|
+
puan_detayi={k: round(v, 3) for k, v in scores.items()},
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def analyze_repo_tools(
|
|
118
|
+
repo_path: Path,
|
|
119
|
+
db_path: Path,
|
|
120
|
+
) -> dict[str, dict[str, float]]:
|
|
121
|
+
"""
|
|
122
|
+
Run a tool-based file analysis across the repo and save results to DB.
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
{tool: {"dosya_sayisi": N, "avg_ai_probability": X}} dict
|
|
126
|
+
"""
|
|
127
|
+
from codedna.scorer import scan_repository
|
|
128
|
+
|
|
129
|
+
supported = {".py", ".js", ".jsx", ".ts", ".tsx"}
|
|
130
|
+
results = scan_repository(repo_path, max_files=200)
|
|
131
|
+
|
|
132
|
+
# Tool counters
|
|
133
|
+
tool_stats: dict[str, dict[str, list]] = {
|
|
134
|
+
"copilot": {"ai_prob": [], "understanding": []},
|
|
135
|
+
"cursor": {"ai_prob": [], "understanding": []},
|
|
136
|
+
"claude": {"ai_prob": [], "understanding": []},
|
|
137
|
+
"unknown": {"ai_prob": [], "understanding": []},
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
for result in results:
|
|
141
|
+
if Path(result.file_path).suffix.lower() not in supported:
|
|
142
|
+
continue
|
|
143
|
+
try:
|
|
144
|
+
code = Path(result.file_path).read_text(encoding="utf-8", errors="replace")
|
|
145
|
+
except Exception:
|
|
146
|
+
continue
|
|
147
|
+
|
|
148
|
+
guess = guess_ai_tool(result.file_path, code)
|
|
149
|
+
|
|
150
|
+
# Save to DB — update the most recent file_score record
|
|
151
|
+
try:
|
|
152
|
+
with get_connection(db_path) as conn:
|
|
153
|
+
conn.execute(
|
|
154
|
+
"""
|
|
155
|
+
UPDATE file_scores
|
|
156
|
+
SET ai_tool_guess = ?
|
|
157
|
+
WHERE file_path = ?
|
|
158
|
+
AND id = (
|
|
159
|
+
SELECT id FROM file_scores
|
|
160
|
+
WHERE file_path = ?
|
|
161
|
+
ORDER BY id DESC LIMIT 1
|
|
162
|
+
)
|
|
163
|
+
""",
|
|
164
|
+
(guess.arac, result.file_path, result.file_path),
|
|
165
|
+
)
|
|
166
|
+
except Exception:
|
|
167
|
+
pass
|
|
168
|
+
|
|
169
|
+
if guess.arac in tool_stats:
|
|
170
|
+
tool_stats[guess.arac]["ai_prob"].append(result.ai_probability)
|
|
171
|
+
else:
|
|
172
|
+
tool_stats["unknown"]["ai_prob"].append(result.ai_probability)
|
|
173
|
+
|
|
174
|
+
# Collect understanding scores per tool from DB
|
|
175
|
+
try:
|
|
176
|
+
with get_connection(db_path) as conn:
|
|
177
|
+
rows = conn.execute(
|
|
178
|
+
"""
|
|
179
|
+
SELECT fs.ai_tool_guess, fs.understanding_score
|
|
180
|
+
FROM file_scores fs
|
|
181
|
+
WHERE fs.ai_tool_guess IS NOT NULL
|
|
182
|
+
AND fs.understanding_score IS NOT NULL
|
|
183
|
+
"""
|
|
184
|
+
).fetchall()
|
|
185
|
+
for r in rows:
|
|
186
|
+
tool = r["ai_tool_guess"] or "unknown"
|
|
187
|
+
if tool in tool_stats:
|
|
188
|
+
tool_stats[tool]["understanding"].append(
|
|
189
|
+
float(r["understanding_score"])
|
|
190
|
+
)
|
|
191
|
+
except Exception:
|
|
192
|
+
pass
|
|
193
|
+
|
|
194
|
+
# Compute output
|
|
195
|
+
output: dict[str, dict[str, float]] = {}
|
|
196
|
+
for tool, data in tool_stats.items():
|
|
197
|
+
if not data["ai_prob"]:
|
|
198
|
+
continue
|
|
199
|
+
avg_ai = sum(data["ai_prob"]) / len(data["ai_prob"])
|
|
200
|
+
avg_und = (
|
|
201
|
+
sum(data["understanding"]) / len(data["understanding"])
|
|
202
|
+
if data["understanding"] else None
|
|
203
|
+
)
|
|
204
|
+
output[tool] = {
|
|
205
|
+
"dosya_sayisi": len(data["ai_prob"]), # kept for API compat
|
|
206
|
+
"avg_ai_probability": round(avg_ai, 3),
|
|
207
|
+
"avg_understanding": round(avg_und, 2) if avg_und is not None else None,
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return output
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def compare_tools_in_repo(repo_path: Path, db_path: Path) -> dict:
|
|
214
|
+
"""
|
|
215
|
+
Compare average understanding scores and AI probabilities per tool across the repo.
|
|
216
|
+
|
|
217
|
+
Returns:
|
|
218
|
+
{"copilot": {...}, "cursor": {...}, ...} dict
|
|
219
|
+
"""
|
|
220
|
+
return analyze_repo_tools(repo_path, db_path)
|