drift-analyzer 2.2.0__tar.gz → 2.3.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 (482) hide show
  1. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/prompts/_partials/konventionen.md +25 -0
  2. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/prompts/drift-agent-ux.prompt.md +4 -1
  3. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/prompts/drift-agent-workflow-test.prompt.md +4 -1
  4. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/prompts/drift-ai-integration.prompt.md +7 -0
  5. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/prompts/drift-ci-gate.prompt.md +7 -0
  6. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/prompts/drift-onboarding.prompt.md +7 -0
  7. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/prompts/drift-signal-quality.prompt.md +7 -0
  8. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/prompts/field-tests/drift-context-eval.prompt.md +12 -1
  9. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/prompts/field-tests/drift-field-test.prompt.md +12 -0
  10. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/prompts/field-tests/drift-finding-audit.prompt.md +12 -1
  11. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.gitignore +1 -0
  12. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/CHANGELOG.md +15 -1
  13. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/PKG-INFO +1 -1
  14. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/SECURITY.md +2 -1
  15. drift_analyzer-2.3.0/decisions/ADR-011-csv-output-format.md +52 -0
  16. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/pyproject.toml +1 -1
  17. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/analyzer.py +12 -0
  18. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/api.py +48 -5
  19. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/cli.py +3 -1
  20. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/commands/analyze.py +19 -4
  21. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/commands/baseline.py +1 -1
  22. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/commands/check.py +39 -3
  23. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/commands/self_analyze.py +5 -1
  24. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/errors.py +2 -0
  25. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/ingestion/git_history.py +45 -0
  26. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/output/__init__.py +2 -0
  27. drift_analyzer-2.3.0/src/drift/output/csv_output.py +48 -0
  28. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/doc_impl_drift.py +55 -6
  29. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_baseline.py +29 -0
  30. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_compat.py +8 -0
  31. drift_analyzer-2.3.0/tests/test_csv_output.py +93 -0
  32. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_dia_enhanced.py +17 -0
  33. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_git_history_safety.py +7 -2
  34. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_mcp_copilot.py +6 -3
  35. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_negative_context_export.py +6 -3
  36. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_scan_diversity.py +84 -0
  37. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.detect-secrets.cfg +0 -0
  38. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.devcontainer/devcontainer.json +0 -0
  39. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.githooks/commit-msg +0 -0
  40. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.githooks/pre-commit +0 -0
  41. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.githooks/pre-push +0 -0
  42. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/AGENTS.md +0 -0
  43. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/CODEOWNERS +0 -0
  44. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  45. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/DISCUSSION_TEMPLATE/questions.yml +0 -0
  46. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/FUNDING.yml +0 -0
  47. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  48. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  49. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/ISSUE_TEMPLATE/contribution_proposal.md +0 -0
  50. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/ISSUE_TEMPLATE/false_positive.yml +0 -0
  51. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  52. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/ISSUE_TEMPLATE/good_first_issue.md +0 -0
  53. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/ISSUE_TEMPLATE/study_finding_rating.md +0 -0
  54. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/ISSUE_TEMPLATE/study_repo_benchmark.md +0 -0
  55. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/ISSUE_TEMPLATE/study_self_analysis.md +0 -0
  56. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  57. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/copilot-instructions.md +0 -0
  58. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/dependabot.yml +0 -0
  59. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/instructions/drift-policy.instructions.md +0 -0
  60. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/instructions/drift-push-gates.instructions.md +0 -0
  61. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/instructions/drift-release-automation.instructions.md +0 -0
  62. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/instructions/drift-release-mandatory.instructions.md +0 -0
  63. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/labeler.yml +0 -0
  64. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/labels.yml +0 -0
  65. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/prompts/PR-Orchestrator.prompt.md +0 -0
  66. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/prompts/README.md +0 -0
  67. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/prompts/_partials/bewertungs-taxonomie.md +0 -0
  68. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/prompts/_partials/issue-filing-external.md +0 -0
  69. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/prompts/_partials/issue-filing.md +0 -0
  70. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/prompts/field-tests/README.md +0 -0
  71. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/prompts/release.prompt.md +0 -0
  72. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/repo-guard.blocklist +0 -0
  73. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/repo-root-allowlist +0 -0
  74. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/skills/drift-pr-review/SKILL.md +0 -0
  75. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/skills/drift-release/SKILL.md +0 -0
  76. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/skills/drift-security-triage/SKILL.md +0 -0
  77. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/workflows/README.md +0 -0
  78. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/workflows/ci.yml +0 -0
  79. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/workflows/codeql.yml +0 -0
  80. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/workflows/dependency-review.yml +0 -0
  81. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/workflows/docs.yml +0 -0
  82. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/workflows/install-smoke.yml +0 -0
  83. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/workflows/labeler.yml +0 -0
  84. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/workflows/package-kpis.yml +0 -0
  85. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/workflows/publish.yml +0 -0
  86. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/workflows/release.yml +0 -0
  87. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/workflows/repo-guard.yml +0 -0
  88. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/workflows/security-hygiene.yml +0 -0
  89. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/workflows/stale.yml +0 -0
  90. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/workflows/validate-release.yml +0 -0
  91. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/workflows/welcome.yml +0 -0
  92. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.github/workflows/workflow-sanity.yml +0 -0
  93. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.markdownlint-cli2.jsonc +0 -0
  94. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.pre-commit-config.yaml +0 -0
  95. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.pre-commit-hooks.yaml +0 -0
  96. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.secrets.baseline +0 -0
  97. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.shellcheckrc +0 -0
  98. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.vscode/mcp.json +0 -0
  99. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.vscode/settings.json +0 -0
  100. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/.vscode/tasks.json +0 -0
  101. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/CITATION.cff +0 -0
  102. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/CLAUDE.md +0 -0
  103. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/CODE_OF_CONDUCT.md +0 -0
  104. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/CONTRIBUTING.md +0 -0
  105. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/DEVELOPER.md +0 -0
  106. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/LICENSE +0 -0
  107. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/Makefile +0 -0
  108. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/POLICY.md +0 -0
  109. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/README.md +0 -0
  110. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/ROADMAP.md +0 -0
  111. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/SUPPORT.md +0 -0
  112. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/action.yml +0 -0
  113. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/README.md +0 -0
  114. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/manifest.json +0 -0
  115. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/__init__.py +0 -0
  116. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/connectors/__init__.py +0 -0
  117. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/connectors/db.py +0 -0
  118. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/handler_v1.py +0 -0
  119. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/handler_v2.py +0 -0
  120. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/handlers/__init__.py +0 -0
  121. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/handlers/auth.py +0 -0
  122. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/handlers/orders.py +0 -0
  123. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/handlers/payments.py +0 -0
  124. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/handlers/shipping.py +0 -0
  125. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/models/__init__.py +0 -0
  126. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/models/core.py +0 -0
  127. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/models/enriched.py +0 -0
  128. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/outlier_module.py +0 -0
  129. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/processors/__init__.py +0 -0
  130. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/processors/pricing.py +0 -0
  131. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/processors/transform.py +0 -0
  132. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/processors/validator.py +0 -0
  133. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/service_a.py +0 -0
  134. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/service_b.py +0 -0
  135. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/utils/__init__.py +0 -0
  136. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/utils/formatting.py +0 -0
  137. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/utils/helpers.py +0 -0
  138. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/src/myapp/utils/naming.py +0 -0
  139. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/tests/__init__.py +0 -0
  140. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/benchmarks/corpus/tests/test_api.py +0 -0
  141. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/conda.recipe/meta.yaml +0 -0
  142. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/decisions/ADR-010-finding-context-triage-policy.md +0 -0
  143. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/decisions/templates/README.md +0 -0
  144. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/decisions/templates/adr-template.md +0 -0
  145. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/decisions/templates/signal-design-template.md +0 -0
  146. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/EPISTEMICS.md +0 -0
  147. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/LAUNCH_CHECKLIST.md +0 -0
  148. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/OUTREACH.md +0 -0
  149. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/PRODUCT_STRATEGY.md +0 -0
  150. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/ROOT_POLICY.md +0 -0
  151. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/STUDY.md +0 -0
  152. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/adr/001-deterministic-analysis-pipeline.md +0 -0
  153. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/adr/002-ast-fingerprinting-for-patterns.md +0 -0
  154. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/adr/003-composite-scoring-model.md +0 -0
  155. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/adr/004-subprocess-git-parsing.md +0 -0
  156. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/adr/005-delta-first-score-interpretation.md +0 -0
  157. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/adr/006-context-tagging.md +0 -0
  158. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/adr/007-consistency-proxy-signals.md +0 -0
  159. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/adr/008-intention-contract-proxy-signals.md +0 -0
  160. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/distribution/README.md +0 -0
  161. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/distribution/awesome-submissions.md +0 -0
  162. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/distribution/devto-hashnode-5-repos.md +0 -0
  163. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/distribution/ide-discovery-mvp-spec.md +0 -0
  164. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/distribution/week1-rollout-runbook.md +0 -0
  165. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/drift-architecture-erosion-analysis.md +0 -0
  166. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/go-mvp-scope.md +0 -0
  167. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/language-roadmap.md +0 -0
  168. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/language-support-matrix.md +0 -0
  169. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/migration.md +0 -0
  170. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/python-baseline.md +0 -0
  171. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/python-rule-inventory.md +0 -0
  172. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs/tsjs-mvp-scope.md +0 -0
  173. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/algorithms/deep-dive.md +0 -0
  174. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/algorithms/scoring.md +0 -0
  175. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/algorithms/signals.md +0 -0
  176. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/assets/logo.svg +0 -0
  177. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/benchmarking.md +0 -0
  178. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/case-studies/django.md +0 -0
  179. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/case-studies/fastapi.md +0 -0
  180. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/case-studies/index.md +0 -0
  181. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/case-studies/pydantic.md +0 -0
  182. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/changelog.md +0 -0
  183. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/comparisons/drift-vs-architecture-conformance.md +0 -0
  184. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/comparisons/drift-vs-ruff.md +0 -0
  185. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/comparisons/drift-vs-semgrep-codeql.md +0 -0
  186. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/comparisons/index.md +0 -0
  187. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/contributing.md +0 -0
  188. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/faq.md +0 -0
  189. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/getting-started/configuration.md +0 -0
  190. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/getting-started/finding-triage.md +0 -0
  191. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/getting-started/installation.md +0 -0
  192. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/getting-started/quickstart.md +0 -0
  193. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/getting-started/team-rollout.md +0 -0
  194. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/getting-started/troubleshooting.md +0 -0
  195. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/glossary.md +0 -0
  196. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/index.md +0 -0
  197. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/integrations.md +0 -0
  198. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/product/example-findings.md +0 -0
  199. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/product/press-brand.md +0 -0
  200. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/product-strategy.md +0 -0
  201. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/reference/api-outputs.md +0 -0
  202. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/reference/negative-context.md +0 -0
  203. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/reference/performance.md +0 -0
  204. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/stability.md +0 -0
  205. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/start-here.md +0 -0
  206. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/study.md +0 -0
  207. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/trust-evidence.md +0 -0
  208. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/use-cases/architectural-linter-ai-teams.md +0 -0
  209. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/use-cases/architecture-drift-python.md +0 -0
  210. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/use-cases/ci-architecture-checks-sarif.md +0 -0
  211. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/use-cases/index.md +0 -0
  212. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/docs-site/use-cases/technical-debt-ai-codebases.md +0 -0
  213. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/drift.example.yaml +0 -0
  214. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/demo-project/README.md +0 -0
  215. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/demo-project/api/__init__.py +0 -0
  216. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/demo-project/api/routes.py +0 -0
  217. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/demo-project/db/__init__.py +0 -0
  218. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/demo-project/db/models.py +0 -0
  219. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/demo-project/services/__init__.py +0 -0
  220. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/demo-project/services/email_service.py +0 -0
  221. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/demo-project/services/order_service.py +0 -0
  222. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/demo-project/services/user_service.py +0 -0
  223. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/demo-project/utils/__init__.py +0 -0
  224. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/demo-project/utils/validators.py +0 -0
  225. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/demo_fastapi.md +0 -0
  226. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/drift-check.yml +0 -0
  227. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/package-kpis/README.md +0 -0
  228. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/package-kpis/defects.csv +0 -0
  229. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/package-kpis/kpi-thresholds.json +0 -0
  230. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/package-kpis/usage.csv +0 -0
  231. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/vibe-coding/README.md +0 -0
  232. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/vibe-coding/drift-gate.yml +0 -0
  233. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/vibe-coding/drift.yaml +0 -0
  234. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/vibe-coding/mcp.json +0 -0
  235. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/vibe-coding/pre-push +0 -0
  236. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/vibe-coding/setup-baseline.sh +0 -0
  237. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/examples/vibe-coding/weekly-check.sh +0 -0
  238. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/llms.txt +0 -0
  239. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/mkdocs.yml +0 -0
  240. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/overrides/home.html +0 -0
  241. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/overrides/main.html +0 -0
  242. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/__init__.py +0 -0
  243. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/__main__.py +0 -0
  244. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/analyzers/typescript/__init__.py +0 -0
  245. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/analyzers/typescript/_path_utils.py +0 -0
  246. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/analyzers/typescript/alias_resolver.py +0 -0
  247. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/analyzers/typescript/barrel_resolver.py +0 -0
  248. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/analyzers/typescript/import_graph.py +0 -0
  249. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/analyzers/typescript/shared.py +0 -0
  250. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/analyzers/typescript/workspace_boundaries.py +0 -0
  251. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/api_helpers.py +0 -0
  252. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/baseline.py +0 -0
  253. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/cache.py +0 -0
  254. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/commands/__init__.py +0 -0
  255. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/commands/_io.py +0 -0
  256. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/commands/badge.py +0 -0
  257. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/commands/config_cmd.py +0 -0
  258. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/commands/copilot_context.py +0 -0
  259. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/commands/diff_cmd.py +0 -0
  260. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/commands/explain.py +0 -0
  261. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/commands/export_context.py +0 -0
  262. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/commands/fix_plan.py +0 -0
  263. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/commands/init_cmd.py +0 -0
  264. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/commands/mcp.py +0 -0
  265. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/commands/patterns.py +0 -0
  266. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/commands/scan.py +0 -0
  267. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/commands/timeline.py +0 -0
  268. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/commands/trend.py +0 -0
  269. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/commands/validate_cmd.py +0 -0
  270. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/config.py +0 -0
  271. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/context_tags.py +0 -0
  272. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/copilot_context.py +0 -0
  273. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/embeddings.py +0 -0
  274. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/finding_context.py +0 -0
  275. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/incremental.py +0 -0
  276. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/ingestion/__init__.py +0 -0
  277. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/ingestion/ast_parser.py +0 -0
  278. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/ingestion/file_discovery.py +0 -0
  279. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/ingestion/ts_parser.py +0 -0
  280. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/mcp_server.py +0 -0
  281. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/models.py +0 -0
  282. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/negative_context.py +0 -0
  283. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/negative_context_export.py +0 -0
  284. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/output/agent_tasks.py +0 -0
  285. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/output/github_format.py +0 -0
  286. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/output/json_output.py +0 -0
  287. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/output/rich_output.py +0 -0
  288. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/pipeline.py +0 -0
  289. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/profiles.py +0 -0
  290. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/py.typed +0 -0
  291. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/recommendations.py +0 -0
  292. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/rules/tsjs/circular_module_detection.py +0 -0
  293. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/rules/tsjs/cross_package_import_ban.py +0 -0
  294. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/rules/tsjs/layer_leak_detection.py +0 -0
  295. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/rules/tsjs/ui_to_infra_import_ban.py +0 -0
  296. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/scoring/__init__.py +0 -0
  297. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/scoring/engine.py +0 -0
  298. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/__init__.py +0 -0
  299. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/_utils.py +0 -0
  300. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/architecture_violation.py +0 -0
  301. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/base.py +0 -0
  302. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/broad_exception_monoculture.py +0 -0
  303. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/bypass_accumulation.py +0 -0
  304. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/circular_import.py +0 -0
  305. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/co_change_coupling.py +0 -0
  306. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/cognitive_complexity.py +0 -0
  307. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/cohesion_deficit.py +0 -0
  308. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/dead_code_accumulation.py +0 -0
  309. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/exception_contract_drift.py +0 -0
  310. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/explainability_deficit.py +0 -0
  311. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/fan_out_explosion.py +0 -0
  312. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/guard_clause_deficit.py +0 -0
  313. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/hardcoded_secret.py +0 -0
  314. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/insecure_default.py +0 -0
  315. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/missing_authorization.py +0 -0
  316. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/mutant_duplicates.py +0 -0
  317. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/naming_contract_violation.py +0 -0
  318. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/pattern_fragmentation.py +0 -0
  319. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/system_misalignment.py +0 -0
  320. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/temporal_volatility.py +0 -0
  321. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/test_polarity_deficit.py +0 -0
  322. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/signals/ts_architecture.py +0 -0
  323. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/suppression.py +0 -0
  324. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/telemetry.py +0 -0
  325. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/timeline.py +0 -0
  326. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/src/drift/trend_history.py +0 -0
  327. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/__init__.py +0 -0
  328. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/conftest.py +0 -0
  329. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/__init__.py +0 -0
  330. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/ground_truth.py +0 -0
  331. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/study_samples/debt_correlation.json +0 -0
  332. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/study_samples/rater_matrix.json +0 -0
  333. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/study_samples/self_analysis_reports.json +0 -0
  334. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_alias_resolution/src/app.ts +0 -0
  335. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_alias_resolution/src/core/logger.ts +0 -0
  336. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_alias_resolution/src/shared/config.ts +0 -0
  337. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_alias_resolution/tsconfig.json +0 -0
  338. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_alias_resolution_extends/src/app.ts +0 -0
  339. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_alias_resolution_extends/src/base/logger.ts +0 -0
  340. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_alias_resolution_extends/src/leaf/feature.ts +0 -0
  341. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_alias_resolution_extends/src/mid/util.ts +0 -0
  342. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_alias_resolution_extends/src/override/config.ts +0 -0
  343. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_alias_resolution_extends/src/shared/config.ts +0 -0
  344. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_alias_resolution_extends/tsconfig.base.json +0 -0
  345. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_alias_resolution_extends/tsconfig.json +0 -0
  346. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_alias_resolution_extends/tsconfig.mid.json +0 -0
  347. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_barrel_resolution/src/app.ts +0 -0
  348. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_barrel_resolution/src/app_tsx.ts +0 -0
  349. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_barrel_resolution/src/button.tsx +0 -0
  350. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_barrel_resolution/src/index.ts +0 -0
  351. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_barrel_resolution/src/view/card.tsx +0 -0
  352. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_barrel_resolution/src/view/index.tsx +0 -0
  353. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_graph_relative/app.ts +0 -0
  354. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_graph_relative/components/button.tsx +0 -0
  355. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_graph_relative/components/index.ts +0 -0
  356. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_graph_relative/lib/util.ts +0 -0
  357. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_cross_package/negative/cross_package_import_ban.json +0 -0
  358. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_cross_package/negative/package.json +0 -0
  359. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_cross_package/negative/packages/app/src/main.ts +0 -0
  360. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_cross_package/negative/packages/ui/src/button.ts +0 -0
  361. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_cross_package/positive/cross_package_import_ban.json +0 -0
  362. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_cross_package/positive/package.json +0 -0
  363. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_cross_package/positive/packages/app/src/main.ts +0 -0
  364. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_cross_package/positive/packages/ui/src/button.ts +0 -0
  365. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_cycles/negative/src/a.ts +0 -0
  366. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_cycles/negative/src/b.ts +0 -0
  367. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_cycles/positive/src/a.ts +0 -0
  368. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_cycles/positive/src/b.ts +0 -0
  369. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_layer_leak/negative/layer_leak_detection.json +0 -0
  370. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_layer_leak/negative/src/infra/storage.ts +0 -0
  371. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_layer_leak/negative/src/ui/view.ts +0 -0
  372. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_layer_leak/positive/layer_leak_detection.json +0 -0
  373. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_layer_leak/positive/src/infra/storage.ts +0 -0
  374. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_layer_leak/positive/src/ui/view.ts +0 -0
  375. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_ui_to_infra/negative/src/infra/storage.ts +0 -0
  376. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_ui_to_infra/negative/src/ui/components/button.ts +0 -0
  377. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_ui_to_infra/negative/src/ui/view.ts +0 -0
  378. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_ui_to_infra/negative/ui_to_infra_import_ban.json +0 -0
  379. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_ui_to_infra/positive/src/infra/storage.ts +0 -0
  380. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_ui_to_infra/positive/src/ui/view.ts +0 -0
  381. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_rule_ui_to_infra/positive/ui_to_infra_import_ban.json +0 -0
  382. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_workspace_boundaries/package.json +0 -0
  383. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_workspace_boundaries/packages/app/src/main.ts +0 -0
  384. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_workspace_boundaries/packages/ui/src/button.tsx +0 -0
  385. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/fixtures/tsjs_workspace_boundaries/vite.config.ts +0 -0
  386. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_ablation.py +0 -0
  387. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_agent_native_cli.py +0 -0
  388. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_agent_tasks.py +0 -0
  389. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_ai_tool_indicators.py +0 -0
  390. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_analysis_degradation.py +0 -0
  391. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_architecture_violation.py +0 -0
  392. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_ast_parser.py +0 -0
  393. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_avs_enhanced.py +0 -0
  394. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_avs_missing_patterns_evidence.py +0 -0
  395. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_avs_mutations.py +0 -0
  396. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_badge_command.py +0 -0
  397. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_benchmark_label_keys.py +0 -0
  398. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_benchmark_structure.py +0 -0
  399. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_bypass_accumulation.py +0 -0
  400. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_cache_resilience.py +0 -0
  401. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_ci_reality.py +0 -0
  402. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_circular_import.py +0 -0
  403. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_cli_runtime.py +0 -0
  404. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_co_change_coupling.py +0 -0
  405. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_cognitive_complexity.py +0 -0
  406. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_cohesion_deficit.py +0 -0
  407. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_config.py +0 -0
  408. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_config_validate.py +0 -0
  409. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_consistency_proxies.py +0 -0
  410. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_console_scripts.py +0 -0
  411. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_context_tags.py +0 -0
  412. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_copilot_context_coverage.py +0 -0
  413. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_dead_code_accumulation.py +0 -0
  414. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_delta_first.py +0 -0
  415. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_dx_features.py +0 -0
  416. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_embeddings.py +0 -0
  417. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_enterprise_governance_assets.py +0 -0
  418. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_exception_contract_drift.py +0 -0
  419. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_fan_out_explosion.py +0 -0
  420. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_fetch_github_usage.py +0 -0
  421. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_fetch_pypistats.py +0 -0
  422. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_file_discovery.py +0 -0
  423. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_finding_context.py +0 -0
  424. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_fix_actionability.py +0 -0
  425. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_git_history_edge_cases.py +0 -0
  426. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_guard_clause_deficit.py +0 -0
  427. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_hardcoded_secret.py +0 -0
  428. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_incremental.py +0 -0
  429. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_init_cmd.py +0 -0
  430. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_insecure_default.py +0 -0
  431. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_integration.py +0 -0
  432. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_json_output.py +0 -0
  433. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_mcp_hardening.py +0 -0
  434. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_mirofish_signal_improvements.py +0 -0
  435. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_missing_authorization.py +0 -0
  436. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_model_consistency.py +0 -0
  437. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_module_entrypoint.py +0 -0
  438. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_mutant_duplicates_edge_cases.py +0 -0
  439. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_naming_contract_violation.py +0 -0
  440. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_negative_context.py +0 -0
  441. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_nudge.py +0 -0
  442. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_output_golden.py +0 -0
  443. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_output_minimal_and_signal_labels.py +0 -0
  444. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_package_kpis.py +0 -0
  445. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_path_overrides.py +0 -0
  446. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_pattern_fragmentation.py +0 -0
  447. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_pipeline_components.py +0 -0
  448. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_precision_recall.py +0 -0
  449. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_property_based.py +0 -0
  450. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_recommendations.py +0 -0
  451. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_recommendations_edge_cases.py +0 -0
  452. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_release_automation.py +0 -0
  453. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_release_discipline.py +0 -0
  454. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_repo_hygiene.py +0 -0
  455. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_rule_ids.py +0 -0
  456. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_sarif_contract.py +0 -0
  457. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_scoring.py +0 -0
  458. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_scoring_edge_cases.py +0 -0
  459. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_self_command.py +0 -0
  460. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_signal_contract.py +0 -0
  461. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_signal_utils.py +0 -0
  462. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_smoke_real_repos.py +0 -0
  463. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_study_infrastructure.py +0 -0
  464. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_suppression.py +0 -0
  465. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_telemetry.py +0 -0
  466. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_test_polarity_deficit.py +0 -0
  467. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_timeline.py +0 -0
  468. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_trend_chart.py +0 -0
  469. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_trend_command_history.py +0 -0
  470. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_ts_signals_phase2.py +0 -0
  471. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_ts_signals_phase3.py +0 -0
  472. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_tsjs_alias_resolution.py +0 -0
  473. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_tsjs_barrel_resolution.py +0 -0
  474. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_tsjs_import_graph_relative.py +0 -0
  475. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_tsjs_rule_circular_module_detection.py +0 -0
  476. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_tsjs_rule_cross_package_import_ban.py +0 -0
  477. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_tsjs_rule_layer_leak_detection.py +0 -0
  478. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_tsjs_rule_ui_to_infra_import_ban.py +0 -0
  479. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_tsjs_workspace_boundaries.py +0 -0
  480. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_typescript_parser.py +0 -0
  481. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/tests/test_workspace_value.py +0 -0
  482. {drift_analyzer-2.2.0 → drift_analyzer-2.3.0}/uv.lock +0 -0
@@ -60,6 +60,31 @@ Keine Prompt-spezifischen Bewertungssysteme einführen.
60
60
  Bei GitHub-Issue-Erstellung den Template-Block aus `_partials/issue-filing.md` verwenden.
61
61
  Keine individuellen Issue-Templates pro Prompt.
62
62
 
63
+ ## Versions-Freshness
64
+
65
+ Jeder Prompt MUSS sicherstellen, dass die aktuellste `drift-analyzer`-Version verwendet wird.
66
+ Ein Test gegen eine veraltete Version hat keinen Erkenntniswert.
67
+
68
+ **Field-Test-Prompts** (externe Repos — PyPI-Release):
69
+
70
+ ```bash
71
+ pip install --upgrade drift-analyzer # Immer zuerst upgraden
72
+ drift --version # Installierte Version dokumentieren
73
+ pip index versions drift-analyzer 2>/dev/null | head -1 # Optional: Verfügbare Versionen prüfen
74
+ ```
75
+
76
+ Falls `pip install --upgrade` scheitert (Netzwerk, Index), MUSS dies im Report dokumentiert
77
+ und die aktuell installierte Version explizit angegeben werden.
78
+
79
+ **Interne Prompts** (Drift-Workspace — Dev-Version):
80
+
81
+ ```bash
82
+ pip install -e . # Dev-Version aus dem Workspace installieren
83
+ drift --version # Muss mit pyproject.toml übereinstimmen
84
+ ```
85
+
86
+ Beide Szenarien: Die genutzte drift-Version MUSS im Report-Header oder Repo-Profil erscheinen.
87
+
63
88
  ## Querverweise
64
89
 
65
90
  Jeder Prompt SOLLTE am Ende seines Frontmatter-Bereichs oder in einem dedizierten Abschnitt
@@ -73,9 +73,12 @@ Erstelle Artefakte unter `work_artifacts/agent_ux_<YYYY-MM-DD>/`:
73
73
 
74
74
  Erkunde die CLI als Zero-Knowledge-Agent.
75
75
 
76
+ **Dev-Version sicherstellen** (siehe `_partials/konventionen.md` → Versions-Freshness):
77
+
76
78
  ```bash
79
+ pip install -e . # Dev-Version aus Workspace
77
80
  drift --help
78
- drift --version
81
+ drift --version # Muss mit pyproject.toml übereinstimmen
79
82
  ```
80
83
 
81
84
  Für jedes Top-Level-Kommando:
@@ -82,8 +82,11 @@ New-Item -ItemType Directory -Path $sandbox -Force
82
82
 
83
83
  ### Phase 1: Installation & Discovery
84
84
 
85
+ **Dev-Version sicherstellen** (siehe `_partials/konventionen.md` → Versions-Freshness):
86
+
85
87
  ```bash
86
- drift --version
88
+ pip install -e . # Dev-Version aus Workspace
89
+ drift --version # Muss mit pyproject.toml übereinstimmen
87
90
  drift --help
88
91
  ```
89
92
 
@@ -74,6 +74,13 @@ Erstelle Artefakte unter `work_artifacts/ai_integration_<YYYY-MM-DD>/`:
74
74
 
75
75
  ### Phase 0: AI-facing Oberflächen inventarisieren
76
76
 
77
+ **Dev-Version sicherstellen** (siehe `_partials/konventionen.md` → Versions-Freshness):
78
+
79
+ ```bash
80
+ pip install -e . # Dev-Version aus Workspace
81
+ drift --version # Muss mit pyproject.toml übereinstimmen
82
+ ```
83
+
77
84
  Identifiziere alle derzeit exponierten AI-facing Features:
78
85
  - `copilot-context`
79
86
  - `export-context` (Formate: `instructions`, `prompt`, `raw`)
@@ -70,6 +70,13 @@ Erstelle Artefakte unter `work_artifacts/ci_gate_<YYYY-MM-DD>/`:
70
70
 
71
71
  ### Phase 0: Gate-relevante Kommandos inventarisieren
72
72
 
73
+ **Dev-Version sicherstellen** (siehe `_partials/konventionen.md` → Versions-Freshness):
74
+
75
+ ```bash
76
+ pip install -e . # Dev-Version aus Workspace
77
+ drift --version # Muss mit pyproject.toml übereinstimmen
78
+ ```
79
+
73
80
  Identifiziere die für CI relevanten Kommandos und Optionen, insbesondere:
74
81
  - `check` (mit `--fail-on`, `--json`, `--compact`, `--output-format`)
75
82
  - `validate`
@@ -69,6 +69,13 @@ Erstelle Artefakte unter `work_artifacts/onboarding_<YYYY-MM-DD>/`:
69
69
 
70
70
  ### Phase 0: Neueinsteiger-Perspektive einnehmen
71
71
 
72
+ **Dev-Version sicherstellen** (siehe `_partials/konventionen.md` → Versions-Freshness):
73
+
74
+ ```bash
75
+ pip install -e . # Dev-Version aus Workspace
76
+ drift --version # Muss mit pyproject.toml übereinstimmen
77
+ ```
78
+
72
79
  Nimm an, du hast kein repo-spezifisches Drift-Wissen außer dem, was CLI und generierte Dateien liefern.
73
80
 
74
81
  Dokumentiere:
@@ -78,6 +78,13 @@ Erstelle Artefakte unter `work_artifacts/signal_quality_<YYYY-MM-DD>/`:
78
78
 
79
79
  ### Phase 0: Signal-Inventar erstellen
80
80
 
81
+ **Dev-Version sicherstellen** (siehe `_partials/konventionen.md` → Versions-Freshness):
82
+
83
+ ```bash
84
+ pip install -e . # Dev-Version aus Workspace
85
+ drift --version # Muss mit pyproject.toml übereinstimmen
86
+ ```
87
+
81
88
  Signale aus realer CLI-Ausgabe inventarisieren und Abkürzungen, Namen und verfügbare Beschreibungen erfassen.
82
89
 
83
90
  Mindestens prüfen:
@@ -70,7 +70,17 @@ Erstelle Artefakte unter `work_artifacts/context_eval_<YYYY-MM-DD>/`:
70
70
 
71
71
  ### Phase 0: Repo-Profil erstellen
72
72
 
73
- Identisches Profil wie in `drift-finding-audit` Phase 0:
73
+ **Versions-Freshness sicherstellen:**
74
+
75
+ ```bash
76
+ pip install --upgrade drift-analyzer # Aktuellste Version von PyPI
77
+ drift --version # Version dokumentieren
78
+ ```
79
+
80
+ Falls das Upgrade scheitert (Netzwerk, Index), dies im Report dokumentieren
81
+ und mit der aktuell installierten Version fortfahren.
82
+
83
+ **Identisches Profil wie in `drift-finding-audit` Phase 0:**
74
84
 
75
85
  | Eigenschaft | Wert |
76
86
  |-------------|------|
@@ -79,6 +89,7 @@ Identisches Profil wie in `drift-finding-audit` Phase 0:
79
89
  | Sprache(n) | [Python / TypeScript / Mixed] |
80
90
  | Framework(s) | [Django / Flask / FastAPI / Express / None / ...] |
81
91
  | Ungefähre Größe | [Dateien / LOC] |
92
+ | drift-Version | [VERSION] |
82
93
 
83
94
  ### Phase 1: Alle Export-Formate ausführen
84
95
 
@@ -67,6 +67,18 @@ Erstelle Artefakte unter `work_artifacts/field_test_<YYYY-MM-DD>/`:
67
67
 
68
68
  ### Phase 0: Voraussetzungen prüfen
69
69
 
70
+ **Versions-Freshness sicherstellen:**
71
+
72
+ ```bash
73
+ pip install --upgrade drift-analyzer # Aktuellste Version von PyPI
74
+ drift --version # Version dokumentieren
75
+ ```
76
+
77
+ Falls das Upgrade scheitert (Netzwerk, Index), dies im Report dokumentieren
78
+ und mit der aktuell installierten Version fortfahren.
79
+
80
+ **System-Voraussetzungen:**
81
+
70
82
  ```bash
71
83
  python --version # ≥ 3.11 erforderlich
72
84
  git --version # Git muss vorhanden sein
@@ -75,7 +75,17 @@ Erstelle Artefakte unter `work_artifacts/finding_audit_<YYYY-MM-DD>/`:
75
75
 
76
76
  ### Phase 0: Architektur-Profil erstellen
77
77
 
78
- Analysiere das Repository, um einen informierten Oracle aufzubauen:
78
+ **Versions-Freshness sicherstellen:**
79
+
80
+ ```bash
81
+ pip install --upgrade drift-analyzer # Aktuellste Version von PyPI
82
+ drift --version # Version dokumentieren
83
+ ```
84
+
85
+ Falls das Upgrade scheitert (Netzwerk, Index), dies im Report dokumentieren
86
+ und mit der aktuell installierten Version fortfahren.
87
+
88
+ **Repository analysieren**, um einen informierten Oracle aufzubauen:
79
89
 
80
90
  ```bash
81
91
  # Struktur verstehen
@@ -98,6 +108,7 @@ ls -la # oder: Get-ChildItem
98
108
  | Sprache(n) | [Python / TypeScript / Mixed] |
99
109
  | Framework(s) | [Django / Flask / FastAPI / Express / None / ...] |
100
110
  | Ungefähre Größe | [Dateien / LOC] |
111
+ | drift-Version | [VERSION] |
101
112
  | Bekannte Architekturentscheidungen | [z.B. "Django-apps-Struktur", "Hexagonal", "Layered"] |
102
113
 
103
114
  ### Phase 1: Oracle aufbauen
@@ -27,6 +27,7 @@ htmlcov/
27
27
  Thumbs.db
28
28
  Desktop.ini
29
29
  site/
30
+ audit_results/
30
31
  drift_score.json
31
32
  work_artifacts/
32
33
  master-backlog/
@@ -4,6 +4,9 @@
4
4
 
5
5
  - Introduce configurable finding-context triage policy with precedence-based glob rules to keep non-operational findings out of default remediation queues unless explicitly requested.
6
6
  - Add `--progress json` option to `scan` and `analyze` commands for structured JSON-lines progress feedback on stderr, enabling agents to distinguish running from hung processes (#104).
7
+ - `drift check` now supports `--save-baseline` and `--max-findings` options for CI parity with `drift analyze` (#116).
8
+ - `drift diff` JSON output now includes `score_basis` field (`"historical"` or `"zero_default"`) to clarify when `score_before` reflects actual repo baseline vs. synthetic zero (#119).
9
+ - Add `csv` output format for `drift analyze` and `drift check` to export findings as one-row-per-finding tabular output (`signal,severity,score,title,file,start_line,end_line`) (#14).
7
10
 
8
11
  ### Changed
9
12
 
@@ -11,6 +14,7 @@
11
14
 
12
15
  ### Fixed
13
16
 
17
+ - Reduce DIA false positives by requiring structural context for plain markdown slash-tokens (e.g. `async/`, `scan/`, `connectors/`) before emitting missing-directory findings, while preserving explicit path references in code spans/backticks (#121).
14
18
  - Surface file I/O errors in `analyze`, `check`, and `scan` commands as structured `DRIFT-2003` errors with exit code 2 instead of unhandled `OSError` tracebacks.
15
19
  - Validate `--max-findings` range (1–200) in `drift scan` via `click.IntRange` and reject out-of-range values with exit code 2.
16
20
  - Improve `DRIFT-2003` action message to explicitly suggest checking output path writability and parent directory existence.
@@ -26,11 +30,21 @@
26
30
  - Add `description` fields to all MCP tool parameters via `Annotated[type, Field(description=...)]` and include descriptions in `drift mcp --schema` catalog output so agents can infer valid parameter ranges and formats (#110).
27
31
  - Replace all non-ASCII characters (emoji severity icons, arrows, ellipsis) in Markdown export output with ASCII equivalents to eliminate mojibake on Windows (#111).
28
32
  - Add cross-reference notes between `copilot-context` and `export-context` outputs so agents using either surface are made aware of the complementary context (#112).
33
+ - Suppress Rich progress bar on stderr for machine-readable output formats (`--json`, `--sarif`) to prevent PowerShell `NativeCommandError` from non-JSON prelude (#118).
34
+ - Map git-root-relative paths to repo-relative paths in `analyze_diff` and `parse_git_history` so `--repo` on nested subdirectories no longer leaks parent-repo file scope (#117).
35
+ - `drift self` error guidance now suggests valid next actions (`drift scan`/`drift analyze`) instead of invalid `--repo` flag (#120).
36
+
37
+ ## [2.2.0] - 2026-04-03
38
+
39
+ Short version: Align release metadata with current project version.
40
+
41
+ ### Changed
42
+
43
+ - Sync top changelog release marker to 2.2.0 so release-discipline checks match [project] version in pyproject.toml.
29
44
 
30
45
  ## [2.1.3] - 2026-04-02
31
46
 
32
47
  Short version: Keep release metadata aligned after CI runner hardening updates.
33
-
34
48
  ### Fixed
35
49
 
36
50
  - Align release bookkeeping so `pyproject.toml` and top changelog release stay in sync for pre-push release-discipline checks.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drift-analyzer
3
- Version: 2.2.0
3
+ Version: 2.3.0
4
4
  Summary: Deterministic architectural drift detection for AI-accelerated Python repositories through cross-file coherence analysis
5
5
  Project-URL: Homepage, https://sauremilk.github.io/drift/
6
6
  Project-URL: Repository, https://github.com/mick-gsk/drift
@@ -4,6 +4,7 @@
4
4
 
5
5
  | Version | Supported |
6
6
  | ------- | ------------------ |
7
+ | 2.2.x | :white_check_mark: |
7
8
  | 2.1.x | :white_check_mark: |
8
9
  | 2.0.x | :white_check_mark: |
9
10
  | 1.5.x | :white_check_mark: |
@@ -17,7 +18,7 @@
17
18
  | 0.7.x | :white_check_mark: |
18
19
  | < 0.7 | :x: |
19
20
 
20
- Current release line: **v2.1.0**.
21
+ Current release line: **v2.2.0**.
21
22
 
22
23
  ## Reporting a Vulnerability
23
24
 
@@ -0,0 +1,52 @@
1
+ ---
2
+ id: ADR-011
3
+ status: proposed
4
+ date: 2026-04-03
5
+ supersedes:
6
+ ---
7
+
8
+ # ADR-011: CSV-Ausgabeformat fuer Findings
9
+
10
+ ## Kontext
11
+
12
+ Drift bietet derzeit rich-, json-, sarif-, agent-tasks- und github-Ausgaben.
13
+ Fuer viele Teams fehlt ein leicht importierbares Tabellenformat fuer schnelle
14
+ Weiterverarbeitung in Kalkulation, einfache Filter-Pipelines oder PM-Boards.
15
+
16
+ ## Entscheidung
17
+
18
+ Wir fuehren ein neues Output-Format `csv` fuer `drift analyze` und `drift check`
19
+ ein. Die Ausgabe enthaelt pro Finding genau eine Zeile mit stabilem Header:
20
+
21
+ `signal,severity,score,title,file,start_line,end_line`
22
+
23
+ Rahmenbedingungen:
24
+
25
+ - Implementierung in `src/drift/output/csv_output.py`.
26
+ - Nutzung des Python-Standardmoduls `csv` (keine neue Abhaengigkeit).
27
+ - Deterministische Zeilenreihenfolge analog zu bestehenden
28
+ maschinenlesbaren Ausgaben.
29
+ - Keine Aenderung an Signalberechnung, Scoring oder Severity-Logik.
30
+
31
+ Explizit nicht Teil dieser ADR:
32
+
33
+ - keine neuen Felder im CSV-Schema in dieser Iteration
34
+ - keine Aenderung an `self`/`scan`-Format-Optionen
35
+
36
+ ## Begründung
37
+
38
+ CSV verbessert Einfuehrbarkeit und Handlungsfaehigkeit bei minimaler
39
+ Komplexitaet: einfacher Datenaustausch ohne Schema-Parser, reproduzierbar und
40
+ mit bestehender CLI-Ausgabe konsistent.
41
+
42
+ ## Konsequenzen
43
+
44
+ - Additiver CLI-Output-Kanal ohne Breaking Change.
45
+ - Zusätzlicher Pflegeaufwand fuer einen weiteren Serializer (niedrig).
46
+ - CSV bleibt bewusst kompakt; tiefe Metadaten bleiben in JSON/SARIF.
47
+
48
+ ## Validierung
49
+
50
+ - Unit-Tests fuer Header, Feldreihenfolge und CSV-Escaping.
51
+ - CLI-Choice-Test fuer `--output-format csv`.
52
+ - Policy §10 Lernzyklus-Status: unklar (Nutzerfeedback nach Feldnutzung).
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "drift-analyzer"
7
- version = "2.2.0"
7
+ version = "2.3.0"
8
8
  description = "Deterministic architectural drift detection for AI-accelerated Python repositories through cross-file coherence analysis"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -312,6 +312,18 @@ def analyze_diff(
312
312
  )
313
313
  return analysis
314
314
 
315
+ # Map git-root-relative paths to repo-relative paths when repo_path is
316
+ # a subdirectory of the git root (#117).
317
+ from drift.ingestion.git_history import _git_repo_prefix
318
+
319
+ prefix = _git_repo_prefix(repo_path)
320
+ if prefix:
321
+ mapped: list[str] = []
322
+ for fp in changed_files:
323
+ if fp.startswith(prefix):
324
+ mapped.append(fp[len(prefix):])
325
+ changed_files = mapped
326
+
315
327
  if not changed_files:
316
328
  return RepoAnalysis(
317
329
  repo_path=repo_path,
@@ -9,6 +9,7 @@ contract.
9
9
  from __future__ import annotations
10
10
 
11
11
  import json
12
+ from collections import Counter
12
13
  from collections.abc import Callable
13
14
  from pathlib import Path
14
15
  from types import SimpleNamespace
@@ -248,6 +249,28 @@ def _format_scan_response(
248
249
  )
249
250
  limited = ranked[:max_findings]
250
251
 
252
+ selected_signal_counts: Counter[str] = Counter(
253
+ signal_abbrev(f.signal_type) for f in selected_findings
254
+ )
255
+ included_signal_counts: Counter[str] = Counter(
256
+ signal_abbrev(f.signal_type) for f in limited
257
+ )
258
+ omitted_signals: list[dict[str, Any]] = []
259
+ for signal in sorted(selected_signal_counts.keys()):
260
+ total = selected_signal_counts[signal]
261
+ included = included_signal_counts.get(signal, 0)
262
+ omitted = max(total - included, 0)
263
+ if omitted:
264
+ omitted_signals.append({
265
+ "signal": signal,
266
+ "total": total,
267
+ "included": included,
268
+ "omitted": omitted,
269
+ "reason": "deprioritized_by_strategy",
270
+ })
271
+
272
+ omitted_signals.sort(key=lambda item: (-int(item["omitted"]), item["signal"]))
273
+
251
274
  prioritized_for_fix_first, excluded_for_fix_first, context_counts = split_findings_by_context(
252
275
  selected_findings,
253
276
  config,
@@ -308,6 +331,17 @@ def _format_scan_response(
308
331
  },
309
332
  )
310
333
 
334
+ if omitted_signals:
335
+ result["selection_diagnostics"] = {
336
+ "strategy": strategy,
337
+ "max_findings": max_findings,
338
+ "signals_with_omitted_findings": omitted_signals,
339
+ "note": (
340
+ "Some findings are not returned due to max_findings truncation "
341
+ "and selection strategy."
342
+ ),
343
+ }
344
+
311
345
  # detailed mode adds fix_first, recommended_next_actions, agent_instruction
312
346
  if detail == "detailed":
313
347
  result["fix_first"] = _fix_first_concise(
@@ -523,13 +557,21 @@ def diff(
523
557
 
524
558
  # Score comparison via trend context
525
559
  score_after = diff_analysis.drift_score
526
- score_before = (
527
- diff_analysis.trend.previous_score
528
- if diff_analysis.trend and diff_analysis.trend.previous_score is not None
529
- else 0.0
530
- )
560
+ score_before: float = 0.0
561
+ if (
562
+ diff_analysis.trend is not None
563
+ and diff_analysis.trend.previous_score is not None
564
+ ):
565
+ score_before = diff_analysis.trend.previous_score
566
+ has_trend_baseline = True
567
+ else:
568
+ has_trend_baseline = False
531
569
  delta = round(score_after - score_before, 4)
532
570
 
571
+ # When no historical baseline exists, flag the score fields as
572
+ # synthetic so agents don't misinterpret zero as the repo baseline (#119).
573
+ score_basis = "historical" if has_trend_baseline else "zero_default"
574
+
533
575
  from drift.output.json_output import _priority_class
534
576
 
535
577
  drift_categories = sorted({_priority_class(f) for f in scoped_new}) if scoped_new else []
@@ -666,6 +708,7 @@ def diff(
666
708
  score_before=round(score_before, 4),
667
709
  score_after=round(score_after, 4),
668
710
  delta=delta,
711
+ score_basis=score_basis,
669
712
  score_regressed=delta > 0.0,
670
713
  confidence=confidence,
671
714
  diff_ref=diff_ref,
@@ -86,11 +86,12 @@ def _build_error_payload(
86
86
  *,
87
87
  detail: str | None = None,
88
88
  hint: str | None = None,
89
+ suggested_action_override: str | None = None,
89
90
  ) -> dict[str, object]:
90
91
  """Build a v2.0 machine-readable error payload with recovery info."""
91
92
  info = ERROR_REGISTRY.get(error_code)
92
93
  recoverable = category == "user"
93
- suggested_action = info.action if info else hint
94
+ suggested_action = suggested_action_override or (info.action if info else hint)
94
95
  return {
95
96
  "error": True,
96
97
  "schema_version": "2.0",
@@ -214,6 +215,7 @@ def safe_main() -> None:
214
215
  exc.exit_code,
215
216
  detail=exc.detail,
216
217
  hint=exc.hint,
218
+ suggested_action_override=exc.suggested_action,
217
219
  ),
218
220
  )
219
221
  else:
@@ -33,7 +33,7 @@ from drift.errors import EXIT_FINDINGS_ABOVE_THRESHOLD
33
33
  "--format",
34
34
  "-f",
35
35
  "output_format",
36
- type=click.Choice(["rich", "json", "sarif", "agent-tasks", "github"]),
36
+ type=click.Choice(["rich", "json", "sarif", "csv", "agent-tasks", "github"]),
37
37
  default="rich",
38
38
  help="Output format.",
39
39
  )
@@ -118,7 +118,7 @@ from drift.errors import EXIT_FINDINGS_ABOVE_THRESHOLD
118
118
  "output_file",
119
119
  type=click.Path(path_type=Path),
120
120
  default=None,
121
- help="Write machine output (JSON/SARIF) to a file instead of stdout.",
121
+ help="Write machine output (JSON/SARIF/CSV) to a file instead of stdout.",
122
122
  )
123
123
  @click.option(
124
124
  "--save-baseline",
@@ -231,8 +231,14 @@ def analyze(
231
231
  progress_console = Console(stderr=True) if output_format != "rich" else effective_console
232
232
 
233
233
  use_json_progress = progress_format == "json"
234
- use_rich_progress = progress_format == "auto" and not quiet
235
- use_no_progress = progress_format == "none" or quiet
234
+ # Auto-suppress Rich progress for machine-readable formats to avoid
235
+ # stderr noise that triggers NativeCommandError in PowerShell (#118).
236
+ use_rich_progress = (
237
+ progress_format == "auto" and not quiet and output_format == "rich"
238
+ )
239
+ use_no_progress = progress_format == "none" or quiet or (
240
+ progress_format == "auto" and output_format != "rich"
241
+ )
236
242
 
237
243
  progress = Progress(
238
244
  TextColumn("[bold blue]{task.description}"),
@@ -323,6 +329,15 @@ def analyze(
323
329
  click.echo(f"Output written to {output_file}", err=True)
324
330
  else:
325
331
  click.echo(sarif_text)
332
+ elif output_format == "csv":
333
+ from drift.output.csv_output import analysis_to_csv
334
+
335
+ csv_text = analysis_to_csv(analysis)
336
+ if output_file:
337
+ _write_output_file(csv_text, output_file)
338
+ click.echo(f"Output written to {output_file}", err=True)
339
+ else:
340
+ click.echo(csv_text)
326
341
  elif output_format == "agent-tasks":
327
342
  from drift.output.agent_tasks import analysis_to_agent_tasks_json
328
343
 
@@ -80,7 +80,7 @@ def save(
80
80
  @click.option(
81
81
  "--baseline-file",
82
82
  "-b",
83
- type=click.Path(exists=True, path_type=Path),
83
+ type=click.Path(path_type=Path),
84
84
  default=None,
85
85
  help=f"Baseline file to compare against (default: {DEFAULT_BASELINE_PATH}).",
86
86
  )
@@ -33,7 +33,7 @@ from drift.errors import EXIT_FINDINGS_ABOVE_THRESHOLD
33
33
  "--format",
34
34
  "-f",
35
35
  "output_format",
36
- type=click.Choice(["rich", "json", "sarif", "agent-tasks", "github"]),
36
+ type=click.Choice(["rich", "json", "sarif", "csv", "agent-tasks", "github"]),
37
37
  default="rich",
38
38
  help="Output format.",
39
39
  )
@@ -101,7 +101,7 @@ from drift.errors import EXIT_FINDINGS_ABOVE_THRESHOLD
101
101
  "output_file",
102
102
  type=click.Path(path_type=Path),
103
103
  default=None,
104
- help="Write machine output (JSON/SARIF) to a file instead of stdout.",
104
+ help="Write machine output (JSON/SARIF/CSV) to a file instead of stdout.",
105
105
  )
106
106
  @click.option(
107
107
  "--json",
@@ -124,6 +124,19 @@ from drift.errors import EXIT_FINDINGS_ABOVE_THRESHOLD
124
124
  default=False,
125
125
  help="Disable colored output (also respects NO_COLOR env variable).",
126
126
  )
127
+ @click.option(
128
+ "--save-baseline",
129
+ "save_baseline_path",
130
+ type=click.Path(path_type=Path),
131
+ default=None,
132
+ help="Save the current findings as a baseline file after analysis.",
133
+ )
134
+ @click.option(
135
+ "--max-findings",
136
+ type=int,
137
+ default=20,
138
+ help="Maximum number of findings to display (default: 20).",
139
+ )
127
140
  def check(
128
141
  repo: Path,
129
142
  diff_ref: str,
@@ -144,6 +157,8 @@ def check(
144
157
  json_shortcut: bool,
145
158
  compact_json: bool,
146
159
  no_color: bool,
160
+ save_baseline_path: Path | None,
161
+ max_findings: int,
147
162
  ) -> None:
148
163
  """CI gate — analyze a diff and exit non-zero when findings exceed a threshold.
149
164
 
@@ -249,6 +264,15 @@ def check(
249
264
  click.echo(f"Output written to {output_file}", err=True)
250
265
  else:
251
266
  click.echo(sarif_text)
267
+ elif output_format == "csv":
268
+ from drift.output.csv_output import analysis_to_csv
269
+
270
+ csv_text = analysis_to_csv(analysis)
271
+ if output_file:
272
+ _write_output_file(csv_text, output_file)
273
+ click.echo(f"Output written to {output_file}", err=True)
274
+ else:
275
+ click.echo(csv_text)
252
276
  elif output_format == "agent-tasks":
253
277
  from drift.output.agent_tasks import analysis_to_agent_tasks_json
254
278
 
@@ -270,7 +294,19 @@ def check(
270
294
  else:
271
295
  from drift.output.rich_output import render_full_report
272
296
 
273
- render_full_report(analysis, effective_console, show_code=not no_code)
297
+ render_full_report(
298
+ analysis, effective_console, max_findings=max_findings, show_code=not no_code,
299
+ )
300
+
301
+ # Save baseline if requested (--save-baseline)
302
+ if save_baseline_path is not None:
303
+ from drift.baseline import save_baseline as _save_bl
304
+
305
+ _save_bl(analysis, save_baseline_path)
306
+ effective_console.print(
307
+ f"[bold green]\u2713 Baseline saved:[/bold green] {save_baseline_path} "
308
+ f"({len(analysis.findings)} findings)",
309
+ )
274
310
 
275
311
  if not severity_gate_pass(analysis.findings, threshold):
276
312
  if not quiet:
@@ -41,10 +41,14 @@ def self_analyze(since: int, output_format: str, output_file: Path | None) -> No
41
41
  "DRIFT-2001",
42
42
  message=(
43
43
  "drift self only works inside the drift source code repository "
44
- "(github.com/mick-gsk/drift). "
44
+ "(github.com/sauremilk/drift). "
45
45
  "For your project, use 'drift scan' instead."
46
46
  ),
47
47
  path=str(drift_root),
48
+ suggested_action=(
49
+ "Run inside the drift source repository, or use "
50
+ "'drift scan' / 'drift analyze' for other projects."
51
+ ),
48
52
  )
49
53
 
50
54
  cfg = DriftConfig.load(drift_root)
@@ -190,11 +190,13 @@ class DriftError(Exception):
190
190
  message: str | None = None,
191
191
  *,
192
192
  context: str | None = None,
193
+ suggested_action: str | None = None,
193
194
  **kwargs: Any,
194
195
  ) -> None:
195
196
  self.code = code
196
197
  self._kwargs = kwargs
197
198
  self._context = context
199
+ self.suggested_action = suggested_action
198
200
 
199
201
  info = ERROR_REGISTRY.get(code)
200
202
  if info and not message: