codedna 0.3.3__tar.gz → 0.4.0__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.3.3 → codedna-0.4.0}/CHANGELOG.md +28 -0
- {codedna-0.3.3 → codedna-0.4.0}/PKG-INFO +1 -1
- {codedna-0.3.3 → codedna-0.4.0}/codedna/__init__.py +1 -1
- {codedna-0.3.3 → codedna-0.4.0}/codedna/cli.py +327 -152
- {codedna-0.3.3 → codedna-0.4.0}/pyproject.toml +1 -1
- {codedna-0.3.3 → codedna-0.4.0}/.env.example +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/.github/CODEOWNERS +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/.github/dependabot.yml +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/.github/workflows/codedna.yml +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/.github/workflows/codeql.yml +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/.github/workflows/test.yml +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/.gitignore +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/.python-version +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/CONTRIBUTING.md +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/LICENSE +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/README.md +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/SECURITY.md +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/ai.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/ai_box.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/ai_fingerprint.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/analyzer.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/api.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/auth.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/bus_factor.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/db.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/git_hook.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/integrations/__init__.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/integrations/github_bot.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/integrations/jira.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/integrations/lemonsqueezy.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/interview.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/onboarding.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/plan.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/protection.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/rate_limit.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/scorer.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/sprint_health.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/survey.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/codedna/tech_debt.py +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/.env.local.example +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/.gitignore +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/README.md +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/ai-compare/page.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/api/auth/login/route.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/api/auth/logout/route.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/api/auth/me/route.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/api/auth/register/route.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/api/billing/checkout/route.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/billing/page.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/bus-factor/page.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/commits/page.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/debt/page.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/favicon.ico +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/files/page.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/fonts/GeistMonoVF.woff +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/fonts/GeistVF.woff +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/globals.css +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/interview/page.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/layout.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/login/page.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/onboarding/page.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/page.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/pricing/page.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/protected/page.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/register/page.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/settings/integrations/page.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/sprints/page.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/AuthProvider.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/ClientProviders.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/CommitTable.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/CostInfoTooltip.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/ErrorBanner.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/FeatureGate.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/FileHeatmap.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/LanguageSwitcher.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/NavClient.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/OverviewTitles.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/QuickInsights.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/RiskBadge.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/SummaryCards.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/UnderstandingChart.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/UpgradeBanner.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/lib/api.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/lib/auth.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/lib/i18n/en.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/lib/i18n/index.tsx +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/lib/i18n/tr.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/lib/plan.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/next-env.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/next.config.mjs +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/package-lock.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/package.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/postcss.config.mjs +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/tailwind.config.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/dashboard/tsconfig.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/hooks/post-commit +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/uv.lock +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/.bin/tsc +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/.bin/tsserver +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/.package-lock.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/LICENSE +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/README.md +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/assert/strict.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/assert.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/async_hooks.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/buffer.buffer.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/buffer.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/child_process.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/cluster.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/compatibility/disposable.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/compatibility/index.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/compatibility/indexable.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/compatibility/iterators.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/console.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/constants.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/crypto.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/dgram.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/diagnostics_channel.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/dns/promises.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/dns.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/domain.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/events.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/fs/promises.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/fs.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/globals.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/globals.typedarray.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/http.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/http2.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/https.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/index.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/inspector.generated.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/module.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/net.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/os.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/package.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/path.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/perf_hooks.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/process.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/punycode.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/querystring.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/readline/promises.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/readline.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/repl.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/sea.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/stream/consumers.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/stream/promises.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/stream/web.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/stream.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/string_decoder.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/test.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/timers/promises.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/timers.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/tls.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/trace_events.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/ts5.6/index.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/tty.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/url.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/util.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/v8.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/vm.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/wasi.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/web-globals/abortcontroller.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/web-globals/domexception.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/web-globals/events.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/web-globals/fetch.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/worker_threads.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/zlib.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/vscode/LICENSE +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/vscode/README.md +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/vscode/index.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/vscode/package.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/LICENSE.txt +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/README.md +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/SECURITY.md +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/ThirdPartyNoticeText.txt +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/bin/tsc +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/bin/tsserver +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/_tsc.js +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/_tsserver.js +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/_typingsInstaller.js +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/cs/diagnosticMessages.generated.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/de/diagnosticMessages.generated.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/es/diagnosticMessages.generated.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/fr/diagnosticMessages.generated.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/it/diagnosticMessages.generated.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/ja/diagnosticMessages.generated.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/ko/diagnosticMessages.generated.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.decorators.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.decorators.legacy.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.dom.asynciterable.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.dom.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.dom.iterable.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.collection.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.core.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.generator.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.iterable.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.promise.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.proxy.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.reflect.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.symbol.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2016.array.include.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2016.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2016.full.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2016.intl.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.date.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.full.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.intl.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.object.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.string.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.full.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.intl.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.promise.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.regexp.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.array.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.full.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.intl.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.object.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.string.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.symbol.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.bigint.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.date.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.full.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.intl.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.number.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.promise.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.string.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2021.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2021.full.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2021.intl.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2021.promise.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2021.string.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2021.weakref.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.array.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.error.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.full.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.intl.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.object.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.regexp.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.string.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2023.array.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2023.collection.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2023.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2023.full.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2023.intl.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.collection.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.full.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.object.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.promise.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.regexp.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.string.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es5.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es6.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.array.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.collection.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.decorators.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.disposable.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.error.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.float16.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.full.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.intl.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.iterator.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.promise.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.scripthost.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.webworker.asynciterable.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.webworker.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.webworker.importscripts.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.webworker.iterable.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/pl/diagnosticMessages.generated.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/pt-br/diagnosticMessages.generated.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/ru/diagnosticMessages.generated.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/tr/diagnosticMessages.generated.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/tsc.js +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/tsserver.js +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/tsserverlibrary.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/tsserverlibrary.js +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/typesMap.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/typescript.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/typescript.js +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/typingsInstaller.js +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/watchGuard.js +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/zh-cn/diagnosticMessages.generated.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/zh-tw/diagnosticMessages.generated.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/package.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/LICENSE +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/README.md +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/agent.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/api.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/balanced-pool.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/cache.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/client.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/connector.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/content-type.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/cookies.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/diagnostics-channel.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/dispatcher.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/env-http-proxy-agent.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/errors.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/eventsource.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/fetch.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/file.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/filereader.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/formdata.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/global-dispatcher.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/global-origin.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/handlers.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/header.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/index.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/interceptors.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/mock-agent.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/mock-client.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/mock-errors.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/mock-interceptor.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/mock-pool.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/package.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/patch.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/pool-stats.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/pool.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/proxy-agent.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/readable.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/retry-agent.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/retry-handler.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/util.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/webidl.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/websocket.d.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/out/apiClient.js.map +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/out/decorations.js.map +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/out/extension.js.map +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/out/statusBar.js.map +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/package-lock.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/package.json +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/src/apiClient.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/src/decorations.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/src/extension.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/src/statusBar.ts +0 -0
- {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/tsconfig.json +0 -0
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.4.0] - 2026-06-24 — "Setup Wizard"
|
|
4
|
+
|
|
5
|
+
### ✨ Added
|
|
6
|
+
- **`codedna setup` command** — interactive AI analysis configuration wizard
|
|
7
|
+
- Provider selection (Anthropic / OpenAI / MiniMax)
|
|
8
|
+
- API key entry (with secure file storage at `~/.codedna/ai_config.json`, chmod 600)
|
|
9
|
+
- Model selection with sensible defaults
|
|
10
|
+
- Enable/disable AI analysis toggle
|
|
11
|
+
- Live connectivity test after save ("test ping" prompt)
|
|
12
|
+
- Reconfigure existing setup (`codedna setup --reset`)
|
|
13
|
+
- Reuses existing `codedna.ai` module — no new dependencies
|
|
14
|
+
- **`--reset` flag** — clear existing AI config and start fresh
|
|
15
|
+
- **`--show` flag** — display current AI configuration (no edits)
|
|
16
|
+
|
|
17
|
+
### 🔄 Changed
|
|
18
|
+
- Minor version bump (0.3.4 → 0.4.0) because `setup` is a new user-facing command
|
|
19
|
+
|
|
20
|
+
## [0.3.4] - 2026-06-24 — "Doctor Redesign"
|
|
21
|
+
|
|
22
|
+
### 🎨 Redesigned
|
|
23
|
+
- **`codedna doctor` — rich Table + Panel layout** matching the legacy CodeDNA CLI style
|
|
24
|
+
- Header Panel with version + plan info (`border_style="cyan"`)
|
|
25
|
+
- Animated spinner during checks (`console.status`, dots spinner)
|
|
26
|
+
- Rich Table with `show_lines=True`, header_style cyan
|
|
27
|
+
- Color-coded status column: ✓ green, ⚠ yellow, ✗ red, – dim
|
|
28
|
+
- Summary Panel with color-coded border (green / yellow / red)
|
|
29
|
+
- 9 categories, 19 individual checks
|
|
30
|
+
|
|
3
31
|
## [0.3.3] - 2026-06-24 — "One-Command Update"
|
|
4
32
|
|
|
5
33
|
### ✨ Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codedna
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
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
|
|
@@ -1710,178 +1710,208 @@ def doctor(
|
|
|
1710
1710
|
) -> None:
|
|
1711
1711
|
"""Run a system health check (Python, Git, tree-sitter, DB, hook, API, network)."""
|
|
1712
1712
|
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
console.print(Panel.fit("🧬 CodeDNA — System Health Check", style="bold cyan"))
|
|
1713
|
+
console.print()
|
|
1714
|
+
console.print(
|
|
1715
|
+
Panel.fit(
|
|
1716
|
+
"[bold cyan]🧬 CodeDNA — System Health Check[/bold cyan]\n"
|
|
1717
|
+
f"[dim]Version: {__version__} · Plan: detecting...[/dim]",
|
|
1718
|
+
border_style="cyan",
|
|
1719
|
+
padding=(1, 4),
|
|
1720
|
+
)
|
|
1721
|
+
)
|
|
1723
1722
|
console.print()
|
|
1724
1723
|
|
|
1725
1724
|
issues: list[str] = []
|
|
1726
1725
|
warnings: list[str] = []
|
|
1726
|
+
checks: list[tuple[str, str, str]] = [] # (category, status, message)
|
|
1727
1727
|
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
issues.append("python_version")
|
|
1728
|
+
def _record(category: str, status: str, message: str) -> None:
|
|
1729
|
+
"""status: 'ok' | 'warn' | 'fail'"""
|
|
1730
|
+
checks.append((category, status, message))
|
|
1731
|
+
if status == "fail":
|
|
1732
|
+
issues.append(f"{category}: {message}")
|
|
1733
|
+
elif status == "warn":
|
|
1734
|
+
warnings.append(f"{category}: {message}")
|
|
1736
1735
|
|
|
1737
|
-
|
|
1738
|
-
try:
|
|
1739
|
-
import codedna
|
|
1740
|
-
_ok(f"CodeDNA {codedna.__version__} installed at {Path(codedna.__file__).parent}")
|
|
1741
|
-
except Exception as e:
|
|
1742
|
-
_fail(f"CodeDNA import failed: {e}")
|
|
1743
|
-
issues.append("codedna_import")
|
|
1744
|
-
|
|
1745
|
-
# 3. Git
|
|
1746
|
-
console.print()
|
|
1747
|
-
console.print("[bold]2. Git Integration[/bold]")
|
|
1748
|
-
try:
|
|
1736
|
+
with console.status("[bold cyan]🔍 Running health checks...[/bold cyan]", spinner="dots"):
|
|
1749
1737
|
import subprocess
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1738
|
+
|
|
1739
|
+
# 1. Python Environment
|
|
1740
|
+
py_ver = sys.version_info
|
|
1741
|
+
if py_ver >= (3, 10):
|
|
1742
|
+
_record("Python", "ok", f"{py_ver.major}.{py_ver.minor}.{py_ver.micro} (≥ 3.10 required)")
|
|
1753
1743
|
else:
|
|
1754
|
-
|
|
1755
|
-
issues.append("git")
|
|
1756
|
-
except FileNotFoundError:
|
|
1757
|
-
_fail("Git not found on PATH")
|
|
1758
|
-
issues.append("git")
|
|
1759
|
-
except Exception as e:
|
|
1760
|
-
_warn(f"Git check failed: {e}")
|
|
1761
|
-
warnings.append("git_check")
|
|
1744
|
+
_record("Python", "fail", f"{py_ver.major}.{py_ver.minor}.{py_ver.micro} — 3.10+ required")
|
|
1762
1745
|
|
|
1763
|
-
|
|
1764
|
-
console.print()
|
|
1765
|
-
console.print("[bold]3. Tree-sitter Parsers[/bold]")
|
|
1766
|
-
parsers = [
|
|
1767
|
-
("tree_sitter", "tree-sitter"),
|
|
1768
|
-
("tree_sitter_python", "tree-sitter-python"),
|
|
1769
|
-
("tree_sitter_javascript", "tree-sitter-javascript"),
|
|
1770
|
-
("tree_sitter_typescript", "tree-sitter-typescript"),
|
|
1771
|
-
]
|
|
1772
|
-
for mod_name, pkg_name in parsers:
|
|
1746
|
+
# 2. CodeDNA installation
|
|
1773
1747
|
try:
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
except
|
|
1777
|
-
|
|
1778
|
-
issues.append(f"missing:{pkg_name}")
|
|
1748
|
+
import codedna
|
|
1749
|
+
_record("CodeDNA", "ok", f"v{codedna.__version__} at {Path(codedna.__file__).parent}")
|
|
1750
|
+
except Exception as e:
|
|
1751
|
+
_record("CodeDNA", "fail", f"import failed: {e}")
|
|
1779
1752
|
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
|
|
1753
|
+
# 3. Git
|
|
1754
|
+
try:
|
|
1755
|
+
result = subprocess.run(["git", "--version"], capture_output=True, text=True, timeout=5)
|
|
1756
|
+
if result.returncode == 0:
|
|
1757
|
+
_record("Git", "ok", result.stdout.strip())
|
|
1758
|
+
else:
|
|
1759
|
+
_record("Git", "fail", "git command returned non-zero")
|
|
1760
|
+
except FileNotFoundError:
|
|
1761
|
+
_record("Git", "fail", "git not found on PATH")
|
|
1762
|
+
except Exception as e:
|
|
1763
|
+
_record("Git", "warn", f"check failed: {e}")
|
|
1764
|
+
|
|
1765
|
+
# 4. Tree-sitter parsers
|
|
1766
|
+
parsers = [
|
|
1767
|
+
("tree_sitter", "tree-sitter"),
|
|
1768
|
+
("tree_sitter_python", "tree-sitter-python"),
|
|
1769
|
+
("tree_sitter_javascript", "tree-sitter-javascript"),
|
|
1770
|
+
("tree_sitter_typescript", "tree-sitter-typescript"),
|
|
1771
|
+
]
|
|
1772
|
+
for mod_name, pkg_name in parsers:
|
|
1773
|
+
try:
|
|
1774
|
+
__import__(mod_name)
|
|
1775
|
+
_record("Tree-sitter", "ok", pkg_name)
|
|
1776
|
+
except ImportError:
|
|
1777
|
+
_record("Tree-sitter", "fail", f"{pkg_name} not installed")
|
|
1778
|
+
|
|
1779
|
+
# 5. Database
|
|
1780
|
+
db_status = "skip"
|
|
1781
|
+
db_msg = "Not in a git repo"
|
|
1782
|
+
db_path: Optional[Path] = None
|
|
1783
|
+
try:
|
|
1784
|
+
root = repo or find_git_root()
|
|
1785
|
+
db_path = get_db_path(root)
|
|
1786
|
+
if db_path.exists():
|
|
1787
|
+
size_kb = db_path.stat().st_size / 1024
|
|
1788
|
+
_record("Database", "ok", f"{db_path} ({size_kb:.1f} KB)")
|
|
1789
|
+
db_status = "ok"
|
|
1790
|
+
db_msg = f"{db_path} ({size_kb:.1f} KB)"
|
|
1791
|
+
else:
|
|
1792
|
+
_record("Database", "warn", f"no database at {db_path}")
|
|
1793
|
+
db_status = "warn"
|
|
1794
|
+
db_msg = "not initialized"
|
|
1795
|
+
if fix:
|
|
1796
|
+
try:
|
|
1797
|
+
init_db(db_path)
|
|
1798
|
+
_record("Database", "ok", "initialized (auto-fixed)")
|
|
1799
|
+
db_status = "ok"
|
|
1800
|
+
db_msg = "auto-fixed"
|
|
1801
|
+
except Exception as e:
|
|
1802
|
+
_record("Database", "fail", f"auto-init failed: {e}")
|
|
1803
|
+
except Exception:
|
|
1804
|
+
_record("Database", "warn", "skipped (not in a git repo)")
|
|
1801
1805
|
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1806
|
+
# 6. Git hook
|
|
1807
|
+
try:
|
|
1808
|
+
root = repo or find_git_root()
|
|
1809
|
+
if is_hook_installed(root):
|
|
1810
|
+
_record("Hook", "ok", "post-commit hook installed")
|
|
1811
|
+
else:
|
|
1812
|
+
_record("Hook", "warn", "post-commit hook not installed")
|
|
1813
|
+
if fix:
|
|
1814
|
+
try:
|
|
1815
|
+
install_hook(root)
|
|
1816
|
+
_record("Hook", "ok", "installed (auto-fixed)")
|
|
1817
|
+
except Exception as e:
|
|
1818
|
+
_record("Hook", "fail", f"auto-install failed: {e}")
|
|
1819
|
+
except Exception:
|
|
1820
|
+
_record("Hook", "warn", "skipped (not in a git repo)")
|
|
1821
|
+
|
|
1822
|
+
# 7. Core dependencies
|
|
1823
|
+
deps = [
|
|
1824
|
+
("typer", "CLI framework"),
|
|
1825
|
+
("rich", "Terminal UI"),
|
|
1826
|
+
("gitpython", "Git integration"),
|
|
1827
|
+
("fastapi", "REST API"),
|
|
1828
|
+
("uvicorn", "ASGI server"),
|
|
1829
|
+
("pydantic", "Data validation"),
|
|
1830
|
+
("pyjwt", "JWT auth"),
|
|
1831
|
+
("bcrypt", "Password hashing"),
|
|
1832
|
+
]
|
|
1833
|
+
for mod_name, desc in deps:
|
|
1834
|
+
try:
|
|
1835
|
+
m = __import__(mod_name)
|
|
1836
|
+
ver = getattr(m, "__version__", "?")
|
|
1837
|
+
_record("Dependencies", "ok", f"{mod_name} {ver} — {desc}")
|
|
1838
|
+
except ImportError:
|
|
1839
|
+
_record("Dependencies", "fail", f"{mod_name} not installed — {desc}")
|
|
1840
|
+
|
|
1841
|
+
# 8. License & Plan
|
|
1842
|
+
license_path = Path.home() / ".codedna" / "license.json"
|
|
1843
|
+
if license_path.exists():
|
|
1844
|
+
try:
|
|
1845
|
+
import json
|
|
1846
|
+
with open(license_path) as f:
|
|
1847
|
+
lic = json.load(f)
|
|
1848
|
+
plan = lic.get("plan", "free")
|
|
1849
|
+
_record("License", "ok", f"plan = {plan.upper()}")
|
|
1850
|
+
except Exception as e:
|
|
1851
|
+
_record("License", "warn", f"file unreadable: {e}")
|
|
1809
1852
|
else:
|
|
1810
|
-
|
|
1811
|
-
warnings.append("no_hook")
|
|
1812
|
-
if fix:
|
|
1813
|
-
try:
|
|
1814
|
-
install_hook(root)
|
|
1815
|
-
_ok("Hook installed")
|
|
1816
|
-
except Exception as e:
|
|
1817
|
-
_fail(f"Could not install hook: {e}")
|
|
1818
|
-
issues.append("hook_install_failed")
|
|
1819
|
-
except Exception:
|
|
1820
|
-
_warn("Not in a git repo — hook check skipped")
|
|
1853
|
+
_record("License", "warn", f"no license at {license_path} (FREE plan)")
|
|
1821
1854
|
|
|
1822
|
-
|
|
1823
|
-
console.print()
|
|
1824
|
-
console.print("[bold]6. Core Dependencies[/bold]")
|
|
1825
|
-
deps = [
|
|
1826
|
-
("typer", "CLI framework"),
|
|
1827
|
-
("rich", "Terminal UI"),
|
|
1828
|
-
("gitpython", "Git integration"),
|
|
1829
|
-
("fastapi", "REST API"),
|
|
1830
|
-
("uvicorn", "ASGI server"),
|
|
1831
|
-
("pydantic", "Data validation"),
|
|
1832
|
-
("pyjwt", "JWT auth"),
|
|
1833
|
-
("bcrypt", "Password hashing"),
|
|
1834
|
-
]
|
|
1835
|
-
for mod_name, desc in deps:
|
|
1836
|
-
try:
|
|
1837
|
-
m = __import__(mod_name)
|
|
1838
|
-
ver = getattr(m, "__version__", "?")
|
|
1839
|
-
_ok(f"{mod_name} {ver} ({desc})")
|
|
1840
|
-
except ImportError:
|
|
1841
|
-
_fail(f"{mod_name} — not installed ({desc})")
|
|
1842
|
-
issues.append(f"missing:{mod_name}")
|
|
1843
|
-
|
|
1844
|
-
# 8. License / plan
|
|
1845
|
-
console.print()
|
|
1846
|
-
console.print("[bold]7. License & Plan[/bold]")
|
|
1847
|
-
license_path = Path.home() / ".codedna" / "license.json"
|
|
1848
|
-
if license_path.exists():
|
|
1855
|
+
# 9. Network
|
|
1849
1856
|
try:
|
|
1850
|
-
import
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
plan = lic.get("plan", "free")
|
|
1854
|
-
_ok(f"Active plan: {plan.upper()}")
|
|
1857
|
+
import urllib.request
|
|
1858
|
+
urllib.request.urlopen("https://pypi.org/pypi/codedna/json", timeout=5)
|
|
1859
|
+
_record("Network", "ok", "PyPI reachable")
|
|
1855
1860
|
except Exception as e:
|
|
1856
|
-
|
|
1857
|
-
warnings.append("license_unreadable")
|
|
1858
|
-
else:
|
|
1859
|
-
_warn(f"No license at {license_path} (running on FREE plan)")
|
|
1861
|
+
_record("Network", "warn", f"PyPI unreachable: {type(e).__name__}")
|
|
1860
1862
|
|
|
1861
|
-
#
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
1870
|
-
|
|
1863
|
+
# ─── Render results as a beautiful table ────────────────────────────
|
|
1864
|
+
status_emoji = {"ok": "[green]✓[/green]", "warn": "[yellow]⚠[/yellow]", "fail": "[red]✗[/red]", "skip": "[dim]–[/dim]"}
|
|
1865
|
+
|
|
1866
|
+
table = Table(
|
|
1867
|
+
border_style="dim",
|
|
1868
|
+
show_lines=True,
|
|
1869
|
+
header_style="bold cyan",
|
|
1870
|
+
title="[bold]Health Check Results[/bold]",
|
|
1871
|
+
title_style="bold white",
|
|
1872
|
+
)
|
|
1873
|
+
table.add_column("Category", style="bold white", min_width=14)
|
|
1874
|
+
table.add_column("Status", justify="center", min_width=7)
|
|
1875
|
+
table.add_column("Details", style="white")
|
|
1871
1876
|
|
|
1872
|
-
|
|
1877
|
+
current_cat = None
|
|
1878
|
+
for cat, status, msg in checks:
|
|
1879
|
+
emoji = status_emoji.get(status, "[dim]?[/dim]")
|
|
1880
|
+
table.add_row(cat, emoji, msg)
|
|
1881
|
+
current_cat = cat
|
|
1882
|
+
|
|
1883
|
+
console.print(table)
|
|
1873
1884
|
console.print()
|
|
1874
|
-
|
|
1875
|
-
|
|
1876
|
-
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1885
|
+
|
|
1886
|
+
# ─── Summary panel ──────────────────────────────────────────────────
|
|
1887
|
+
n_ok = sum(1 for _, s, _ in checks if s == "ok")
|
|
1888
|
+
n_warn = sum(1 for _, s, _ in checks if s == "warn")
|
|
1889
|
+
n_fail = sum(1 for _, s, _ in checks if s == "fail")
|
|
1890
|
+
total = len(checks)
|
|
1891
|
+
|
|
1892
|
+
if n_fail == 0 and n_warn == 0:
|
|
1893
|
+
border = "green"
|
|
1894
|
+
title = "[bold green]✓ All checks passed — system healthy[/bold green]"
|
|
1895
|
+
body = f"[green]{n_ok}/{total} checks passed. CodeDNA is ready to use.[/green]\n\n[dim]Run [bold]codedna scan[/bold] in a git repo to get started.[/dim]"
|
|
1896
|
+
elif n_fail == 0:
|
|
1897
|
+
border = "yellow"
|
|
1898
|
+
title = f"[bold yellow]⚠ {n_warn} warning(s) — system functional with caveats[/bold yellow]"
|
|
1899
|
+
body = f"[yellow]{n_ok}/{total} checks passed, {n_warn} warning(s).[/yellow]\n\n[dim]Run [bold]codedna doctor --fix[/bold] to attempt auto-fixes.[/dim]"
|
|
1881
1900
|
else:
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1901
|
+
border = "red"
|
|
1902
|
+
title = f"[bold red]✗ {n_fail} critical issue(s) — fix required[/bold red]"
|
|
1903
|
+
body = f"[red]{n_fail} critical, {n_warn} warning, {n_ok} passed (out of {total}).[/red]\n\n[dim]Re-run [bold]codedna doctor --fix[/bold] or install missing dependencies.[/dim]"
|
|
1904
|
+
|
|
1905
|
+
console.print(
|
|
1906
|
+
Panel(
|
|
1907
|
+
body,
|
|
1908
|
+
title=title,
|
|
1909
|
+
border_style=border,
|
|
1910
|
+
padding=(1, 2),
|
|
1911
|
+
)
|
|
1912
|
+
)
|
|
1913
|
+
|
|
1914
|
+
if n_fail > 0:
|
|
1885
1915
|
raise typer.Exit(1)
|
|
1886
1916
|
|
|
1887
1917
|
|
|
@@ -1987,6 +2017,151 @@ def update(
|
|
|
1987
2017
|
console.print(f" [dim]Restart your shell to pick up the new binary.[/dim]")
|
|
1988
2018
|
|
|
1989
2019
|
|
|
2020
|
+
# ---------------------------------------------------------------------------
|
|
2021
|
+
# codedna setup (interactive AI analysis configuration wizard)
|
|
2022
|
+
# ---------------------------------------------------------------------------
|
|
2023
|
+
@app.command()
|
|
2024
|
+
def setup(
|
|
2025
|
+
reset: bool = typer.Option(False, "--reset", help="Clear existing AI config and reconfigure"),
|
|
2026
|
+
show: bool = typer.Option(False, "--show", help="Show current AI configuration"),
|
|
2027
|
+
) -> None:
|
|
2028
|
+
"""Configure AI analysis provider, API key, and model."""
|
|
2029
|
+
from codedna.ai import AIConfig, AI_CONFIG_PATH, PROVIDERS, DEFAULT_MODELS, ai_analyze
|
|
2030
|
+
|
|
2031
|
+
# ── --show: just display current config ────────────────────────────
|
|
2032
|
+
if show:
|
|
2033
|
+
cfg = AIConfig.load()
|
|
2034
|
+
if not cfg:
|
|
2035
|
+
console.print(Panel("[yellow]No AI configuration found.[/yellow]\n\nRun [bold]codedna setup[/bold] to create one.", border_style="yellow"))
|
|
2036
|
+
return
|
|
2037
|
+
table = Table(title="[bold]Current AI Configuration[/bold]", border_style="dim", show_lines=True, header_style="bold cyan")
|
|
2038
|
+
table.add_column("Field", style="bold white")
|
|
2039
|
+
table.add_column("Value")
|
|
2040
|
+
table.add_row("Provider", cfg.provider)
|
|
2041
|
+
table.add_row("Model", cfg.model)
|
|
2042
|
+
table.add_row("API key", f"{cfg.api_key[:8]}...{cfg.api_key[-4:]}" if len(cfg.api_key) > 12 else "(set)")
|
|
2043
|
+
table.add_row("Enabled", "yes" if cfg.enabled else "no")
|
|
2044
|
+
table.add_row("Config file", str(AI_CONFIG_PATH))
|
|
2045
|
+
console.print(table)
|
|
2046
|
+
return
|
|
2047
|
+
|
|
2048
|
+
# ── Welcome panel ──────────────────────────────────────────────────
|
|
2049
|
+
console.print()
|
|
2050
|
+
console.print(
|
|
2051
|
+
Panel.fit(
|
|
2052
|
+
"[bold cyan]🧬 CodeDNA — Setup Wizard[/bold cyan]\n"
|
|
2053
|
+
"[dim]Configure AI analysis for commit interpretation.[/dim]",
|
|
2054
|
+
border_style="cyan",
|
|
2055
|
+
padding=(1, 4),
|
|
2056
|
+
)
|
|
2057
|
+
)
|
|
2058
|
+
console.print()
|
|
2059
|
+
|
|
2060
|
+
# ── --reset: clear existing ───────────────────────────────────────
|
|
2061
|
+
existing = AIConfig.load()
|
|
2062
|
+
if existing and not reset:
|
|
2063
|
+
console.print(
|
|
2064
|
+
Panel(
|
|
2065
|
+
f"[yellow]Existing configuration found:[/yellow]\n"
|
|
2066
|
+
f" Provider : {existing.provider}\n"
|
|
2067
|
+
f" Model : {existing.model}\n"
|
|
2068
|
+
f" API key : {existing.api_key[:8]}...{existing.api_key[-4:]}\n\n"
|
|
2069
|
+
f"[dim]Run [bold]codedna setup --reset[/bold] to reconfigure.[/dim]\n"
|
|
2070
|
+
f"[dim]Run [bold]codedna setup --show[/bold] for details.[/dim]",
|
|
2071
|
+
border_style="yellow",
|
|
2072
|
+
)
|
|
2073
|
+
)
|
|
2074
|
+
return
|
|
2075
|
+
|
|
2076
|
+
if existing and reset:
|
|
2077
|
+
console.print(f" [yellow]![/yellow] Resetting existing configuration...")
|
|
2078
|
+
AIConfig.clear()
|
|
2079
|
+
console.print(f" [green]✓[/green] Old config cleared")
|
|
2080
|
+
console.print()
|
|
2081
|
+
|
|
2082
|
+
# ── Step 1: Provider ──────────────────────────────────────────────
|
|
2083
|
+
console.print("[bold]Step 1/4 — Choose AI provider[/bold]")
|
|
2084
|
+
for i, p in enumerate(PROVIDERS, 1):
|
|
2085
|
+
default_model = DEFAULT_MODELS.get(p, "?")
|
|
2086
|
+
console.print(f" [cyan]{i}[/cyan]) {p} [dim](default model: {default_model})[/dim]")
|
|
2087
|
+
console.print()
|
|
2088
|
+
|
|
2089
|
+
while True:
|
|
2090
|
+
choice = typer.prompt(" Select provider (1-3)", default="1")
|
|
2091
|
+
try:
|
|
2092
|
+
idx = int(choice) - 1
|
|
2093
|
+
if 0 <= idx < len(PROVIDERS):
|
|
2094
|
+
provider = PROVIDERS[idx]
|
|
2095
|
+
break
|
|
2096
|
+
except ValueError:
|
|
2097
|
+
pass
|
|
2098
|
+
console.print(f" [red]✗[/red] Invalid choice '{choice}'. Try 1, 2, or 3.")
|
|
2099
|
+
|
|
2100
|
+
console.print(f" [green]✓[/green] Provider: [bold]{provider}[/bold]")
|
|
2101
|
+
console.print()
|
|
2102
|
+
|
|
2103
|
+
# ── Step 2: API key ───────────────────────────────────────────────
|
|
2104
|
+
console.print("[bold]Step 2/4 — Enter API key[/bold]")
|
|
2105
|
+
env_var = {"anthropic": "ANTHROPIC_API_KEY", "openai": "OPENAI_API_KEY", "minimax": "MINIMAX_API_KEY"}.get(provider, "API_KEY")
|
|
2106
|
+
console.print(f" [dim]Tip: leave blank to use ${env_var} environment variable[/dim]")
|
|
2107
|
+
while True:
|
|
2108
|
+
api_key = typer.prompt(f" {provider} API key", hide_input=True, default="")
|
|
2109
|
+
if api_key:
|
|
2110
|
+
break
|
|
2111
|
+
import os
|
|
2112
|
+
env_val = os.environ.get(env_var, "").strip()
|
|
2113
|
+
if env_val:
|
|
2114
|
+
api_key = env_val
|
|
2115
|
+
console.print(f" [green]✓[/green] Using ${env_var} from environment")
|
|
2116
|
+
break
|
|
2117
|
+
console.print(f" [red]✗[/red] API key is required. Press Ctrl+C to abort.")
|
|
2118
|
+
console.print()
|
|
2119
|
+
|
|
2120
|
+
# ── Step 3: Model ──────────────────────────────────────────────────
|
|
2121
|
+
console.print("[bold]Step 3/4 — Choose model[/bold]")
|
|
2122
|
+
default_model = DEFAULT_MODELS.get(provider, "")
|
|
2123
|
+
model = typer.prompt(f" Model", default=default_model)
|
|
2124
|
+
console.print(f" [green]✓[/green] Model: [bold]{model}[/bold]")
|
|
2125
|
+
console.print()
|
|
2126
|
+
|
|
2127
|
+
# ── Step 4: Enable + save ─────────────────────────────────────────
|
|
2128
|
+
console.print("[bold]Step 4/4 — Enable & save[/bold]")
|
|
2129
|
+
enabled = typer.confirm(" Enable AI analysis?", default=True)
|
|
2130
|
+
|
|
2131
|
+
cfg = AIConfig(provider=provider, api_key=api_key, model=model, enabled=enabled)
|
|
2132
|
+
cfg.save()
|
|
2133
|
+
|
|
2134
|
+
console.print()
|
|
2135
|
+
console.print(
|
|
2136
|
+
Panel(
|
|
2137
|
+
f"[bold green]✓ Configuration saved![/bold green]\n\n"
|
|
2138
|
+
f" Provider : {provider}\n"
|
|
2139
|
+
f" Model : {model}\n"
|
|
2140
|
+
f" Enabled : {'yes' if enabled else 'no'}\n"
|
|
2141
|
+
f" Location : {AI_CONFIG_PATH} [dim](chmod 600)[/dim]",
|
|
2142
|
+
border_style="green",
|
|
2143
|
+
padding=(1, 2),
|
|
2144
|
+
)
|
|
2145
|
+
)
|
|
2146
|
+
|
|
2147
|
+
# ── Optional: test the connection ─────────────────────────────────
|
|
2148
|
+
if enabled and typer.confirm("\n Run a quick connectivity test?", default=True):
|
|
2149
|
+
console.print(f" [dim]Pinging {provider}...[/dim]")
|
|
2150
|
+
try:
|
|
2151
|
+
result = ai_analyze(command="ping", output="Reply with just the word 'pong' and nothing else.")
|
|
2152
|
+
console.print(f" [green]✓[/green] Connection OK — response: [dim]{(result or '').strip()[:80]}[/dim]")
|
|
2153
|
+
except Exception as e:
|
|
2154
|
+
console.print(f" [yellow]![/yellow] Connection test failed: {type(e).__name__}: {e}")
|
|
2155
|
+
console.print(f" [dim]Your config is saved, but the API key may be invalid.[/dim]")
|
|
2156
|
+
|
|
2157
|
+
console.print()
|
|
2158
|
+
console.print("[dim]Next steps:[/dim]")
|
|
2159
|
+
console.print(" • [cyan]codedna setup --show[/cyan] view current config")
|
|
2160
|
+
console.print(" • [cyan]codedna setup --reset[/cyan] reconfigure")
|
|
2161
|
+
console.print(" • [cyan]codedna scan[/cyan] start analyzing your repo")
|
|
2162
|
+
console.print()
|
|
2163
|
+
|
|
2164
|
+
|
|
1990
2165
|
# ---------------------------------------------------------------------------
|
|
1991
2166
|
# Helper functions
|
|
1992
2167
|
# ---------------------------------------------------------------------------
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|