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.
Files changed (360) hide show
  1. {codedna-0.3.3 → codedna-0.4.0}/CHANGELOG.md +28 -0
  2. {codedna-0.3.3 → codedna-0.4.0}/PKG-INFO +1 -1
  3. {codedna-0.3.3 → codedna-0.4.0}/codedna/__init__.py +1 -1
  4. {codedna-0.3.3 → codedna-0.4.0}/codedna/cli.py +327 -152
  5. {codedna-0.3.3 → codedna-0.4.0}/pyproject.toml +1 -1
  6. {codedna-0.3.3 → codedna-0.4.0}/.env.example +0 -0
  7. {codedna-0.3.3 → codedna-0.4.0}/.github/CODEOWNERS +0 -0
  8. {codedna-0.3.3 → codedna-0.4.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  9. {codedna-0.3.3 → codedna-0.4.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  10. {codedna-0.3.3 → codedna-0.4.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  11. {codedna-0.3.3 → codedna-0.4.0}/.github/dependabot.yml +0 -0
  12. {codedna-0.3.3 → codedna-0.4.0}/.github/workflows/codedna.yml +0 -0
  13. {codedna-0.3.3 → codedna-0.4.0}/.github/workflows/codeql.yml +0 -0
  14. {codedna-0.3.3 → codedna-0.4.0}/.github/workflows/test.yml +0 -0
  15. {codedna-0.3.3 → codedna-0.4.0}/.gitignore +0 -0
  16. {codedna-0.3.3 → codedna-0.4.0}/.python-version +0 -0
  17. {codedna-0.3.3 → codedna-0.4.0}/CONTRIBUTING.md +0 -0
  18. {codedna-0.3.3 → codedna-0.4.0}/LICENSE +0 -0
  19. {codedna-0.3.3 → codedna-0.4.0}/README.md +0 -0
  20. {codedna-0.3.3 → codedna-0.4.0}/SECURITY.md +0 -0
  21. {codedna-0.3.3 → codedna-0.4.0}/codedna/ai.py +0 -0
  22. {codedna-0.3.3 → codedna-0.4.0}/codedna/ai_box.py +0 -0
  23. {codedna-0.3.3 → codedna-0.4.0}/codedna/ai_fingerprint.py +0 -0
  24. {codedna-0.3.3 → codedna-0.4.0}/codedna/analyzer.py +0 -0
  25. {codedna-0.3.3 → codedna-0.4.0}/codedna/api.py +0 -0
  26. {codedna-0.3.3 → codedna-0.4.0}/codedna/auth.py +0 -0
  27. {codedna-0.3.3 → codedna-0.4.0}/codedna/bus_factor.py +0 -0
  28. {codedna-0.3.3 → codedna-0.4.0}/codedna/db.py +0 -0
  29. {codedna-0.3.3 → codedna-0.4.0}/codedna/git_hook.py +0 -0
  30. {codedna-0.3.3 → codedna-0.4.0}/codedna/integrations/__init__.py +0 -0
  31. {codedna-0.3.3 → codedna-0.4.0}/codedna/integrations/github_bot.py +0 -0
  32. {codedna-0.3.3 → codedna-0.4.0}/codedna/integrations/jira.py +0 -0
  33. {codedna-0.3.3 → codedna-0.4.0}/codedna/integrations/lemonsqueezy.py +0 -0
  34. {codedna-0.3.3 → codedna-0.4.0}/codedna/interview.py +0 -0
  35. {codedna-0.3.3 → codedna-0.4.0}/codedna/onboarding.py +0 -0
  36. {codedna-0.3.3 → codedna-0.4.0}/codedna/plan.py +0 -0
  37. {codedna-0.3.3 → codedna-0.4.0}/codedna/protection.py +0 -0
  38. {codedna-0.3.3 → codedna-0.4.0}/codedna/rate_limit.py +0 -0
  39. {codedna-0.3.3 → codedna-0.4.0}/codedna/scorer.py +0 -0
  40. {codedna-0.3.3 → codedna-0.4.0}/codedna/sprint_health.py +0 -0
  41. {codedna-0.3.3 → codedna-0.4.0}/codedna/survey.py +0 -0
  42. {codedna-0.3.3 → codedna-0.4.0}/codedna/tech_debt.py +0 -0
  43. {codedna-0.3.3 → codedna-0.4.0}/dashboard/.env.local.example +0 -0
  44. {codedna-0.3.3 → codedna-0.4.0}/dashboard/.gitignore +0 -0
  45. {codedna-0.3.3 → codedna-0.4.0}/dashboard/README.md +0 -0
  46. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/ai-compare/page.tsx +0 -0
  47. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/api/auth/login/route.ts +0 -0
  48. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/api/auth/logout/route.ts +0 -0
  49. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/api/auth/me/route.ts +0 -0
  50. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/api/auth/register/route.ts +0 -0
  51. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/api/billing/checkout/route.ts +0 -0
  52. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/billing/page.tsx +0 -0
  53. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/bus-factor/page.tsx +0 -0
  54. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/commits/page.tsx +0 -0
  55. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/debt/page.tsx +0 -0
  56. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/favicon.ico +0 -0
  57. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/files/page.tsx +0 -0
  58. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/fonts/GeistMonoVF.woff +0 -0
  59. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/fonts/GeistVF.woff +0 -0
  60. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/globals.css +0 -0
  61. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/interview/page.tsx +0 -0
  62. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/layout.tsx +0 -0
  63. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/login/page.tsx +0 -0
  64. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/onboarding/page.tsx +0 -0
  65. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/page.tsx +0 -0
  66. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/pricing/page.tsx +0 -0
  67. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/protected/page.tsx +0 -0
  68. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/register/page.tsx +0 -0
  69. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/settings/integrations/page.tsx +0 -0
  70. {codedna-0.3.3 → codedna-0.4.0}/dashboard/app/sprints/page.tsx +0 -0
  71. {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/AuthProvider.tsx +0 -0
  72. {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/ClientProviders.tsx +0 -0
  73. {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/CommitTable.tsx +0 -0
  74. {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/CostInfoTooltip.tsx +0 -0
  75. {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/ErrorBanner.tsx +0 -0
  76. {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/FeatureGate.tsx +0 -0
  77. {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/FileHeatmap.tsx +0 -0
  78. {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/LanguageSwitcher.tsx +0 -0
  79. {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/NavClient.tsx +0 -0
  80. {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/OverviewTitles.tsx +0 -0
  81. {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/QuickInsights.tsx +0 -0
  82. {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/RiskBadge.tsx +0 -0
  83. {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/SummaryCards.tsx +0 -0
  84. {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/UnderstandingChart.tsx +0 -0
  85. {codedna-0.3.3 → codedna-0.4.0}/dashboard/components/UpgradeBanner.tsx +0 -0
  86. {codedna-0.3.3 → codedna-0.4.0}/dashboard/lib/api.ts +0 -0
  87. {codedna-0.3.3 → codedna-0.4.0}/dashboard/lib/auth.ts +0 -0
  88. {codedna-0.3.3 → codedna-0.4.0}/dashboard/lib/i18n/en.ts +0 -0
  89. {codedna-0.3.3 → codedna-0.4.0}/dashboard/lib/i18n/index.tsx +0 -0
  90. {codedna-0.3.3 → codedna-0.4.0}/dashboard/lib/i18n/tr.ts +0 -0
  91. {codedna-0.3.3 → codedna-0.4.0}/dashboard/lib/plan.ts +0 -0
  92. {codedna-0.3.3 → codedna-0.4.0}/dashboard/next-env.d.ts +0 -0
  93. {codedna-0.3.3 → codedna-0.4.0}/dashboard/next.config.mjs +0 -0
  94. {codedna-0.3.3 → codedna-0.4.0}/dashboard/package-lock.json +0 -0
  95. {codedna-0.3.3 → codedna-0.4.0}/dashboard/package.json +0 -0
  96. {codedna-0.3.3 → codedna-0.4.0}/dashboard/postcss.config.mjs +0 -0
  97. {codedna-0.3.3 → codedna-0.4.0}/dashboard/tailwind.config.ts +0 -0
  98. {codedna-0.3.3 → codedna-0.4.0}/dashboard/tsconfig.json +0 -0
  99. {codedna-0.3.3 → codedna-0.4.0}/hooks/post-commit +0 -0
  100. {codedna-0.3.3 → codedna-0.4.0}/uv.lock +0 -0
  101. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/.bin/tsc +0 -0
  102. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/.bin/tsserver +0 -0
  103. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/.package-lock.json +0 -0
  104. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/LICENSE +0 -0
  105. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/README.md +0 -0
  106. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/assert/strict.d.ts +0 -0
  107. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/assert.d.ts +0 -0
  108. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/async_hooks.d.ts +0 -0
  109. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/buffer.buffer.d.ts +0 -0
  110. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/buffer.d.ts +0 -0
  111. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/child_process.d.ts +0 -0
  112. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/cluster.d.ts +0 -0
  113. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/compatibility/disposable.d.ts +0 -0
  114. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/compatibility/index.d.ts +0 -0
  115. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/compatibility/indexable.d.ts +0 -0
  116. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/compatibility/iterators.d.ts +0 -0
  117. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/console.d.ts +0 -0
  118. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/constants.d.ts +0 -0
  119. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/crypto.d.ts +0 -0
  120. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/dgram.d.ts +0 -0
  121. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/diagnostics_channel.d.ts +0 -0
  122. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/dns/promises.d.ts +0 -0
  123. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/dns.d.ts +0 -0
  124. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/domain.d.ts +0 -0
  125. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/events.d.ts +0 -0
  126. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/fs/promises.d.ts +0 -0
  127. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/fs.d.ts +0 -0
  128. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/globals.d.ts +0 -0
  129. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/globals.typedarray.d.ts +0 -0
  130. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/http.d.ts +0 -0
  131. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/http2.d.ts +0 -0
  132. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/https.d.ts +0 -0
  133. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/index.d.ts +0 -0
  134. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/inspector.generated.d.ts +0 -0
  135. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/module.d.ts +0 -0
  136. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/net.d.ts +0 -0
  137. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/os.d.ts +0 -0
  138. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/package.json +0 -0
  139. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/path.d.ts +0 -0
  140. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/perf_hooks.d.ts +0 -0
  141. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/process.d.ts +0 -0
  142. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/punycode.d.ts +0 -0
  143. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/querystring.d.ts +0 -0
  144. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/readline/promises.d.ts +0 -0
  145. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/readline.d.ts +0 -0
  146. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/repl.d.ts +0 -0
  147. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/sea.d.ts +0 -0
  148. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/stream/consumers.d.ts +0 -0
  149. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/stream/promises.d.ts +0 -0
  150. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/stream/web.d.ts +0 -0
  151. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/stream.d.ts +0 -0
  152. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/string_decoder.d.ts +0 -0
  153. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/test.d.ts +0 -0
  154. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/timers/promises.d.ts +0 -0
  155. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/timers.d.ts +0 -0
  156. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/tls.d.ts +0 -0
  157. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/trace_events.d.ts +0 -0
  158. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +0 -0
  159. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +0 -0
  160. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/ts5.6/index.d.ts +0 -0
  161. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/tty.d.ts +0 -0
  162. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/url.d.ts +0 -0
  163. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/util.d.ts +0 -0
  164. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/v8.d.ts +0 -0
  165. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/vm.d.ts +0 -0
  166. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/wasi.d.ts +0 -0
  167. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/web-globals/abortcontroller.d.ts +0 -0
  168. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/web-globals/domexception.d.ts +0 -0
  169. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/web-globals/events.d.ts +0 -0
  170. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/web-globals/fetch.d.ts +0 -0
  171. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/worker_threads.d.ts +0 -0
  172. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/node/zlib.d.ts +0 -0
  173. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/vscode/LICENSE +0 -0
  174. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/vscode/README.md +0 -0
  175. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/vscode/index.d.ts +0 -0
  176. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/@types/vscode/package.json +0 -0
  177. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/LICENSE.txt +0 -0
  178. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/README.md +0 -0
  179. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/SECURITY.md +0 -0
  180. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/ThirdPartyNoticeText.txt +0 -0
  181. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/bin/tsc +0 -0
  182. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/bin/tsserver +0 -0
  183. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/_tsc.js +0 -0
  184. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/_tsserver.js +0 -0
  185. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/_typingsInstaller.js +0 -0
  186. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/cs/diagnosticMessages.generated.json +0 -0
  187. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/de/diagnosticMessages.generated.json +0 -0
  188. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/es/diagnosticMessages.generated.json +0 -0
  189. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/fr/diagnosticMessages.generated.json +0 -0
  190. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/it/diagnosticMessages.generated.json +0 -0
  191. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/ja/diagnosticMessages.generated.json +0 -0
  192. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/ko/diagnosticMessages.generated.json +0 -0
  193. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.d.ts +0 -0
  194. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.decorators.d.ts +0 -0
  195. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.decorators.legacy.d.ts +0 -0
  196. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.dom.asynciterable.d.ts +0 -0
  197. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.dom.d.ts +0 -0
  198. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.dom.iterable.d.ts +0 -0
  199. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.collection.d.ts +0 -0
  200. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.core.d.ts +0 -0
  201. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.d.ts +0 -0
  202. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.generator.d.ts +0 -0
  203. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.iterable.d.ts +0 -0
  204. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.promise.d.ts +0 -0
  205. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.proxy.d.ts +0 -0
  206. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.reflect.d.ts +0 -0
  207. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.symbol.d.ts +0 -0
  208. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts +0 -0
  209. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2016.array.include.d.ts +0 -0
  210. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2016.d.ts +0 -0
  211. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2016.full.d.ts +0 -0
  212. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2016.intl.d.ts +0 -0
  213. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts +0 -0
  214. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.d.ts +0 -0
  215. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.date.d.ts +0 -0
  216. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.full.d.ts +0 -0
  217. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.intl.d.ts +0 -0
  218. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.object.d.ts +0 -0
  219. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts +0 -0
  220. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.string.d.ts +0 -0
  221. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts +0 -0
  222. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts +0 -0
  223. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts +0 -0
  224. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.d.ts +0 -0
  225. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.full.d.ts +0 -0
  226. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.intl.d.ts +0 -0
  227. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.promise.d.ts +0 -0
  228. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2018.regexp.d.ts +0 -0
  229. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.array.d.ts +0 -0
  230. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.d.ts +0 -0
  231. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.full.d.ts +0 -0
  232. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.intl.d.ts +0 -0
  233. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.object.d.ts +0 -0
  234. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.string.d.ts +0 -0
  235. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2019.symbol.d.ts +0 -0
  236. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.bigint.d.ts +0 -0
  237. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.d.ts +0 -0
  238. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.date.d.ts +0 -0
  239. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.full.d.ts +0 -0
  240. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.intl.d.ts +0 -0
  241. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.number.d.ts +0 -0
  242. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.promise.d.ts +0 -0
  243. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts +0 -0
  244. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.string.d.ts +0 -0
  245. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts +0 -0
  246. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2021.d.ts +0 -0
  247. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2021.full.d.ts +0 -0
  248. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2021.intl.d.ts +0 -0
  249. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2021.promise.d.ts +0 -0
  250. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2021.string.d.ts +0 -0
  251. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2021.weakref.d.ts +0 -0
  252. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.array.d.ts +0 -0
  253. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.d.ts +0 -0
  254. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.error.d.ts +0 -0
  255. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.full.d.ts +0 -0
  256. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.intl.d.ts +0 -0
  257. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.object.d.ts +0 -0
  258. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.regexp.d.ts +0 -0
  259. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2022.string.d.ts +0 -0
  260. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2023.array.d.ts +0 -0
  261. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2023.collection.d.ts +0 -0
  262. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2023.d.ts +0 -0
  263. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2023.full.d.ts +0 -0
  264. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2023.intl.d.ts +0 -0
  265. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts +0 -0
  266. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.collection.d.ts +0 -0
  267. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.d.ts +0 -0
  268. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.full.d.ts +0 -0
  269. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.object.d.ts +0 -0
  270. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.promise.d.ts +0 -0
  271. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.regexp.d.ts +0 -0
  272. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts +0 -0
  273. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es2024.string.d.ts +0 -0
  274. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es5.d.ts +0 -0
  275. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.es6.d.ts +0 -0
  276. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.array.d.ts +0 -0
  277. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.collection.d.ts +0 -0
  278. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.d.ts +0 -0
  279. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.decorators.d.ts +0 -0
  280. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.disposable.d.ts +0 -0
  281. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.error.d.ts +0 -0
  282. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.float16.d.ts +0 -0
  283. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.full.d.ts +0 -0
  284. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.intl.d.ts +0 -0
  285. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.iterator.d.ts +0 -0
  286. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.promise.d.ts +0 -0
  287. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts +0 -0
  288. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.scripthost.d.ts +0 -0
  289. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.webworker.asynciterable.d.ts +0 -0
  290. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.webworker.d.ts +0 -0
  291. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.webworker.importscripts.d.ts +0 -0
  292. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/lib.webworker.iterable.d.ts +0 -0
  293. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/pl/diagnosticMessages.generated.json +0 -0
  294. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/pt-br/diagnosticMessages.generated.json +0 -0
  295. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/ru/diagnosticMessages.generated.json +0 -0
  296. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/tr/diagnosticMessages.generated.json +0 -0
  297. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/tsc.js +0 -0
  298. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/tsserver.js +0 -0
  299. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/tsserverlibrary.d.ts +0 -0
  300. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/tsserverlibrary.js +0 -0
  301. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/typesMap.json +0 -0
  302. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/typescript.d.ts +0 -0
  303. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/typescript.js +0 -0
  304. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/typingsInstaller.js +0 -0
  305. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/watchGuard.js +0 -0
  306. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/zh-cn/diagnosticMessages.generated.json +0 -0
  307. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/lib/zh-tw/diagnosticMessages.generated.json +0 -0
  308. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/typescript/package.json +0 -0
  309. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/LICENSE +0 -0
  310. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/README.md +0 -0
  311. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/agent.d.ts +0 -0
  312. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/api.d.ts +0 -0
  313. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/balanced-pool.d.ts +0 -0
  314. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/cache.d.ts +0 -0
  315. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/client.d.ts +0 -0
  316. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/connector.d.ts +0 -0
  317. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/content-type.d.ts +0 -0
  318. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/cookies.d.ts +0 -0
  319. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/diagnostics-channel.d.ts +0 -0
  320. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/dispatcher.d.ts +0 -0
  321. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/env-http-proxy-agent.d.ts +0 -0
  322. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/errors.d.ts +0 -0
  323. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/eventsource.d.ts +0 -0
  324. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/fetch.d.ts +0 -0
  325. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/file.d.ts +0 -0
  326. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/filereader.d.ts +0 -0
  327. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/formdata.d.ts +0 -0
  328. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/global-dispatcher.d.ts +0 -0
  329. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/global-origin.d.ts +0 -0
  330. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/handlers.d.ts +0 -0
  331. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/header.d.ts +0 -0
  332. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/index.d.ts +0 -0
  333. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/interceptors.d.ts +0 -0
  334. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/mock-agent.d.ts +0 -0
  335. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/mock-client.d.ts +0 -0
  336. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/mock-errors.d.ts +0 -0
  337. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/mock-interceptor.d.ts +0 -0
  338. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/mock-pool.d.ts +0 -0
  339. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/package.json +0 -0
  340. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/patch.d.ts +0 -0
  341. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/pool-stats.d.ts +0 -0
  342. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/pool.d.ts +0 -0
  343. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/proxy-agent.d.ts +0 -0
  344. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/readable.d.ts +0 -0
  345. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/retry-agent.d.ts +0 -0
  346. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/retry-handler.d.ts +0 -0
  347. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/util.d.ts +0 -0
  348. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/webidl.d.ts +0 -0
  349. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/node_modules/undici-types/websocket.d.ts +0 -0
  350. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/out/apiClient.js.map +0 -0
  351. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/out/decorations.js.map +0 -0
  352. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/out/extension.js.map +0 -0
  353. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/out/statusBar.js.map +0 -0
  354. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/package-lock.json +0 -0
  355. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/package.json +0 -0
  356. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/src/apiClient.ts +0 -0
  357. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/src/decorations.ts +0 -0
  358. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/src/extension.ts +0 -0
  359. {codedna-0.3.3 → codedna-0.4.0}/vscode-extension/src/statusBar.ts +0 -0
  360. {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.3
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
@@ -1,4 +1,4 @@
1
1
  """CodeDNA — AI Code Transparency Tool."""
2
2
 
3
- __version__ = "0.3.3"
3
+ __version__ = "0.4.0"
4
4
  __app_name__ = "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
- def _ok(msg: str) -> None:
1714
- console.print(f" [green]✓[/green] {msg}")
1715
-
1716
- def _warn(msg: str) -> None:
1717
- console.print(f" [yellow]![/yellow] {msg}")
1718
-
1719
- def _fail(msg: str) -> None:
1720
- console.print(f" [red]✗[/red] {msg}")
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
- # 1. Python version
1729
- console.print("[bold]1. Python Environment[/bold]")
1730
- py_ver = sys.version_info
1731
- if py_ver >= (3, 10):
1732
- _ok(f"Python {py_ver.major}.{py_ver.minor}.{py_ver.micro} (>= 3.10 required)")
1733
- else:
1734
- _fail(f"Python {py_ver.major}.{py_ver.minor}.{py_ver.micro} — 3.10+ required")
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
- # 2. CodeDNA installation
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
- result = subprocess.run(["git", "--version"], capture_output=True, text=True, timeout=5)
1751
- if result.returncode == 0:
1752
- _ok(f"Git: {result.stdout.strip()}")
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
- _fail("Git not available")
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
- # 4. Tree-sitter parsers
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
- __import__(mod_name)
1775
- _ok(f"{pkg_name}")
1776
- except ImportError:
1777
- _fail(f"{pkg_name} — not installed")
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
- # 5. Database (only if in a git repo)
1781
- console.print()
1782
- console.print("[bold]4. Local Database[/bold]")
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
- _ok(f"Database at {db_path} ({size_kb:.1f} KB)")
1789
- else:
1790
- _warn(f"No database at {db_path} (run `codedna init` to create)")
1791
- warnings.append("no_db")
1792
- if fix:
1793
- try:
1794
- init_db(db_path)
1795
- _ok("Database initialized")
1796
- except Exception as e:
1797
- _fail(f"Could not create database: {e}")
1798
- issues.append("db_init_failed")
1799
- except Exception:
1800
- _warn("Not in a git repo — database check skipped")
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
- # 6. Git hook
1803
- console.print()
1804
- console.print("[bold]5. Git Hook[/bold]")
1805
- try:
1806
- root = repo or find_git_root()
1807
- if is_hook_installed(root):
1808
- _ok("Post-commit hook installed")
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
- _warn("Post-commit hook not installed (run `codedna init`)")
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
- # 7. Dependencies
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 json
1851
- with open(license_path) as f:
1852
- lic = json.load(f)
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
- _warn(f"License file unreadable: {e}")
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
- # 9. Network
1862
- console.print()
1863
- console.print("[bold]8. Network[/bold]")
1864
- try:
1865
- import urllib.request
1866
- urllib.request.urlopen("https://pypi.org/pypi/codedna/json", timeout=5)
1867
- _ok("PyPI reachable")
1868
- except Exception as e:
1869
- _warn(f"PyPI unreachable: {type(e).__name__}")
1870
- warnings.append("no_network")
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
- # Summary
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
- console.print("[bold]Summary[/bold]")
1875
- if not issues:
1876
- if not warnings:
1877
- console.print(" [bold green]✓ All checks passed system healthy.[/bold green]")
1878
- else:
1879
- console.print(f" [bold yellow]![/bold yellow] {len(warnings)} warning(s), 0 critical issue(s)")
1880
- console.print(" [dim]Run [bold]codedna doctor --fix[/bold] to attempt auto-fixes.[/dim]")
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
- console.print(f" [bold red]✗[/bold red] {len(issues)} critical issue(s), {len(warnings)} warning(s)")
1883
- for issue in issues:
1884
- console.print(f" [red][/red] {issue}")
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
  # ---------------------------------------------------------------------------
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "codedna"
3
- version = "0.3.3"
3
+ version = "0.4.0"
4
4
  description = "AI Code Transparency Tool - detect AI-written code and measure developer understanding"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
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