sourcecode 1.59.0__tar.gz → 1.62.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 (122) hide show
  1. {sourcecode-1.59.0 → sourcecode-1.62.0}/CHANGELOG.md +81 -0
  2. {sourcecode-1.59.0 → sourcecode-1.62.0}/PKG-INFO +3 -3
  3. {sourcecode-1.59.0 → sourcecode-1.62.0}/README.md +2 -2
  4. {sourcecode-1.59.0 → sourcecode-1.62.0}/pyproject.toml +1 -1
  5. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/__init__.py +1 -1
  6. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/cli.py +25 -17
  7. sourcecode-1.62.0/src/sourcecode/hibernate_strat.py +599 -0
  8. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/license.py +1 -1
  9. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/mcp/registry.py +6 -3
  10. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/mcp/server.py +4 -1
  11. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/migrate_check.py +223 -32
  12. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/serializer.py +44 -1
  13. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/telemetry/__init__.py +3 -3
  14. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/telemetry/config.py +30 -4
  15. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/telemetry/consent.py +18 -21
  16. {sourcecode-1.59.0 → sourcecode-1.62.0}/.github/workflows/build-windows.yml +0 -0
  17. {sourcecode-1.59.0 → sourcecode-1.62.0}/.gitignore +0 -0
  18. {sourcecode-1.59.0 → sourcecode-1.62.0}/.ruff.toml +0 -0
  19. {sourcecode-1.59.0 → sourcecode-1.62.0}/CONTRIBUTING.md +0 -0
  20. {sourcecode-1.59.0 → sourcecode-1.62.0}/LICENSE +0 -0
  21. {sourcecode-1.59.0 → sourcecode-1.62.0}/SECURITY.md +0 -0
  22. {sourcecode-1.59.0 → sourcecode-1.62.0}/raw +0 -0
  23. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/adaptive_scanner.py +0 -0
  24. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/architecture_analyzer.py +0 -0
  25. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/architecture_summary.py +0 -0
  26. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/ast_extractor.py +0 -0
  27. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/cache.py +0 -0
  28. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/canonical_ir.py +0 -0
  29. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/cir_graphs.py +0 -0
  30. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/classifier.py +0 -0
  31. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/code_notes_analyzer.py +0 -0
  32. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/confidence_analyzer.py +0 -0
  33. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/context_scorer.py +0 -0
  34. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/context_summarizer.py +0 -0
  35. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/contract_model.py +0 -0
  36. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/contract_pipeline.py +0 -0
  37. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/coverage_parser.py +0 -0
  38. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/dependency_analyzer.py +0 -0
  39. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/__init__.py +0 -0
  40. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/base.py +0 -0
  41. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
  42. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/dart.py +0 -0
  43. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/dotnet.py +0 -0
  44. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/elixir.py +0 -0
  45. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/go.py +0 -0
  46. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/heuristic.py +0 -0
  47. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/hybrid.py +0 -0
  48. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/java.py +0 -0
  49. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
  50. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/nodejs.py +0 -0
  51. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/parsers.py +0 -0
  52. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/php.py +0 -0
  53. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/project.py +0 -0
  54. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/python.py +0 -0
  55. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/ruby.py +0 -0
  56. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/rust.py +0 -0
  57. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/systems.py +0 -0
  58. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/terraform.py +0 -0
  59. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/detectors/tooling.py +0 -0
  60. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/doc_analyzer.py +0 -0
  61. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/entrypoint_classifier.py +0 -0
  62. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/env_analyzer.py +0 -0
  63. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/error_schema.py +0 -0
  64. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/explain.py +0 -0
  65. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/file_chunker.py +0 -0
  66. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/file_classifier.py +0 -0
  67. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/flow_analyzer.py +0 -0
  68. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/format_contract.py +0 -0
  69. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/fqn_utils.py +0 -0
  70. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/git_analyzer.py +0 -0
  71. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/graph_analyzer.py +0 -0
  72. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/integration_detector.py +0 -0
  73. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/mcp/__init__.py +0 -0
  74. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  75. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  76. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  77. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  78. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  79. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/mcp/orchestrator.py +0 -0
  80. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/mcp/runner.py +0 -0
  81. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/mcp_nudge.py +0 -0
  82. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/metrics_analyzer.py +0 -0
  83. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/openapi_surface.py +0 -0
  84. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/output_budget.py +0 -0
  85. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/path_filters.py +0 -0
  86. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/pr_comment_renderer.py +0 -0
  87. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/pr_impact.py +0 -0
  88. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/prepare_context.py +0 -0
  89. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/progress.py +0 -0
  90. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/ranking_engine.py +0 -0
  91. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/redactor.py +0 -0
  92. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/relevance_scorer.py +0 -0
  93. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/rename_refactor.py +0 -0
  94. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/repo_classifier.py +0 -0
  95. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/repository_ir.py +0 -0
  96. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/ris.py +0 -0
  97. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/runtime_classifier.py +0 -0
  98. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/scanner.py +0 -0
  99. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/schema.py +0 -0
  100. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/security_config.py +0 -0
  101. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/semantic_analyzer.py +0 -0
  102. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/spring_event_topology.py +0 -0
  103. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/spring_findings.py +0 -0
  104. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/spring_impact.py +0 -0
  105. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/spring_model.py +0 -0
  106. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/spring_security_audit.py +0 -0
  107. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/spring_semantic.py +0 -0
  108. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/spring_tx_analyzer.py +0 -0
  109. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/summarizer.py +0 -0
  110. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/telemetry/events.py +0 -0
  111. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/telemetry/filters.py +0 -0
  112. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/telemetry/transport.py +0 -0
  113. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/tree_utils.py +0 -0
  114. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/validation_surface.py +0 -0
  115. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/version_check.py +0 -0
  116. {sourcecode-1.59.0 → sourcecode-1.62.0}/src/sourcecode/workspace.py +0 -0
  117. {sourcecode-1.59.0 → sourcecode-1.62.0}/supabase/functions/README.md +0 -0
  118. {sourcecode-1.59.0 → sourcecode-1.62.0}/supabase/functions/get-license/index.ts +0 -0
  119. {sourcecode-1.59.0 → sourcecode-1.62.0}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  120. {sourcecode-1.59.0 → sourcecode-1.62.0}/supabase/functions/telemetry/index.ts +0 -0
  121. {sourcecode-1.59.0 → sourcecode-1.62.0}/supabase/sql/license_event_ordering.sql +0 -0
  122. {sourcecode-1.59.0 → sourcecode-1.62.0}/supabase/sql/telemetry_events.sql +0 -0
@@ -1,5 +1,86 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.62.0] — 2026-06-29
4
+
5
+ ### Added — Hibernate 5.x → 6.x migration stratification (`migrate-check`)
6
+
7
+ `migrate-check` no longer treats Hibernate as a single dependency-version bump.
8
+ For enterprise monoliths that use dynamic persistence (verified against the
9
+ Broadleaf Commerce CE Open Admin Platform pattern), a Hibernate major upgrade is
10
+ a **persistence-layer rewrite problem in the dynamic-ORM areas, not an upgrade**.
11
+ Output now carries a `hibernate` section (and a Hibernate block in `--format text`)
12
+ built by the new `hibernate_strat` module.
13
+
14
+ - **Four independent migration domains** — each classified on its own risk axis,
15
+ never aggregated into one score:
16
+ 1. **JPA Annotation Layer** — LOW, escalates to HIGH on deprecated/reworked
17
+ annotations (`@Type(type=)`, `@TypeDef`, `@GenericGenerator`).
18
+ 2. **Criteria API Layer** — HIGH, escalates to **CRITICAL** when Criteria is
19
+ built via reflection or abstraction DAOs (`DynamicEntityDao`, `GenericDao`,
20
+ `BasicPersistenceModule`). Legacy `org.hibernate.Criteria` /
21
+ `Restrictions` / `Projections` flagged (removed in Hibernate 6).
22
+ 3. **HQL / String Queries** — MEDIUM, escalates to HIGH on string concatenation
23
+ (SQL shape not statically inferable under H6 parser changes).
24
+ 4. **Hibernate SPI / Internal API** — CRITICAL blocker (`UserType`,
25
+ `CompositeUserType`, `Interceptor`, `EventListener`, `org.hibernate.engine.spi`).
26
+ - **Hibernate Migration Impact Matrix** — per-layer risk, reason, and estimated effort.
27
+ - **Module-level Hibernate exposure map** — per Maven/Gradle module: max risk,
28
+ layers present, and `dynamic-criteria` / `custom-SPI` / `reflection` tags.
29
+ - **Critical call-chain detection** — flags dynamic query-generation paths
30
+ (`DynamicEntityDaoImpl`, `BasicPersistenceModule`, reflection-based DAOs).
31
+ - **Stop-condition logic** — any of {dynamic Criteria, custom SPI, reflection-built
32
+ queries, concatenated query strings} forces the verdict
33
+ **"HIBERNATE 6 MIGRATION IS HIGH RISK REWRITE ZONE (NOT UPGRADE ZONE)"**;
34
+ otherwise UPGRADE-WITH-CARE or UPGRADE ZONE.
35
+ - **Risk separation** — observable code risk vs inferred runtime risk reported distinctly.
36
+
37
+ ## [1.61.0] — 2026-06-29
38
+
39
+ ### Fixed — `migrate-check` false positives on already-migrated Spring Boot 3 repos
40
+
41
+ Three defects made `migrate-check` report a Boot 3 / Jakarta repo as an
42
+ un-migrated Boot 2 project (verified on Broadleaf Commerce CE 7.0.x —
43
+ Boot 3.5.14, Java 17, `jakarta.*` fully adopted). The verdict contradicted the
44
+ code; this corrects all three at the root and adds regression guardrails.
45
+ Report `schema_version` bumped **1.2 → 1.3**.
46
+
47
+ - **`spring_boot_2_detected` no longer defaults to `true`.** The detector now
48
+ resolves Maven `${...}` properties before reading versions and recognises
49
+ Boot in every form: `spring-boot-starter-parent`, a managed
50
+ `spring-boot-dependencies` BOM, a `spring-boot*` dependency versioned by
51
+ property, and the Gradle plugin. The old heuristic used a `DOTALL` regex that
52
+ matched any stray `2.x` library version anywhere in the pom. The field is now
53
+ **tri-state** — `true` (Boot 2 confirmed) / `false` (Boot 3+ confirmed) /
54
+ `null` (undetermined). **Absence of evidence is never reported as `true`.**
55
+ A new `spring_boot_version_detected` exposes the resolved version. Massive
56
+ `jakarta.*` import adoption vetoes any Boot-2 verdict.
57
+ - **`readiness_score` no longer collapses to 0 on JDK-modernization volume.**
58
+ Blockers (critical/high) still floor a genuinely blocked repo, but orthogonal
59
+ JDK debt (`java.util.Date`, reflection) is capped so it can no longer sink a
60
+ jakarta-ready repo. The report now separates dimensions:
61
+ `jakarta_readiness`, `boot3_readiness`, and `jdk_modernization` (each 0–100).
62
+ - **`javax.*` JDK/JSR namespaces are no longer flagged with
63
+ `javax-to-jakarta-migration-risk`.** `javax.cache` (JSR-107), `javax.sql`,
64
+ `javax.xml` (JAXP), `javax.naming`, `javax.management`, `javax.crypto`, etc.
65
+ keep the `javax` prefix forever and are now allowlisted. Only the Jakarta EE 9
66
+ renamed namespaces (`javax.servlet`, `javax.persistence`, `javax.validation`,
67
+ `javax.xml.bind`, …) still carry the flag.
68
+
69
+ ## [1.60.0] — 2026-06-29
70
+
71
+ ### Changed
72
+ - **Anonymous telemetry is now on by default (opt-out).** Previously telemetry
73
+ was strictly opt-in and disabled until the user accepted a y/N consent prompt.
74
+ It now defaults to **on** so usage metrics flow without an extra step, while
75
+ staying fully anonymous — no source code, paths, file names, secrets, or
76
+ repository content are ever collected. The first interactive run shows a
77
+ one-time **notice** (not a prompt) explaining what is collected and how to
78
+ disable. Disable any time with `sourcecode telemetry disable`,
79
+ `SOURCECODE_TELEMETRY=0`, or the `DO_NOT_TRACK=1` convention. With no explicit
80
+ choice, telemetry still defaults to **off in CI** (no human to see the notice);
81
+ an explicit opt-in is honored everywhere. README, `--help`, and
82
+ `docs/privacy.md` updated accordingly.
83
+
3
84
  ## [1.59.0] — 2026-06-19
4
85
 
5
86
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 1.59.0
3
+ Version: 1.62.0
4
4
  Summary: Persistent structural context and ultra-fast repeated analysis for AI coding agents
5
5
  License-File: LICENSE
6
6
  Keywords: agents,ai,codebase,context,developer-tools,llm
@@ -742,7 +742,7 @@ All outputs include:
742
742
 
743
743
  ## Telemetry
744
744
 
745
- Anonymous, opt-in. Collects: version, OS, commands, flags, duration, repo size range, errors. No source code, paths, secrets, or output content.
745
+ Anonymous, **on by default (opt-out)**. Collects: version, OS, commands, flags, duration, repo size range, errors. No source code, paths, secrets, or output content. A one-time notice is shown on first interactive run.
746
746
 
747
747
  ```bash
748
748
  sourcecode telemetry status
@@ -750,7 +750,7 @@ sourcecode telemetry enable
750
750
  sourcecode telemetry disable
751
751
  ```
752
752
 
753
- Or: `export SOURCECODE_TELEMETRY=0`
753
+ Disable any time: `export SOURCECODE_TELEMETRY=0` (or `DO_NOT_TRACK=1`)
754
754
 
755
755
  ---
756
756
 
@@ -704,7 +704,7 @@ All outputs include:
704
704
 
705
705
  ## Telemetry
706
706
 
707
- Anonymous, opt-in. Collects: version, OS, commands, flags, duration, repo size range, errors. No source code, paths, secrets, or output content.
707
+ Anonymous, **on by default (opt-out)**. Collects: version, OS, commands, flags, duration, repo size range, errors. No source code, paths, secrets, or output content. A one-time notice is shown on first interactive run.
708
708
 
709
709
  ```bash
710
710
  sourcecode telemetry status
@@ -712,7 +712,7 @@ sourcecode telemetry enable
712
712
  sourcecode telemetry disable
713
713
  ```
714
714
 
715
- Or: `export SOURCECODE_TELEMETRY=0`
715
+ Disable any time: `export SOURCECODE_TELEMETRY=0` (or `DO_NOT_TRACK=1`)
716
716
 
717
717
  ---
718
718
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "1.59.0"
7
+ version = "1.62.0"
8
8
  description = "Persistent structural context and ultra-fast repeated analysis for AI coding agents"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -1,3 +1,3 @@
1
1
  """sourcecode — Deterministic codebase context maps for AI coding agents."""
2
2
 
3
- __version__ = "1.59.0"
3
+ __version__ = "1.62.0"
@@ -584,7 +584,7 @@ try:
584
584
  except Exception:
585
585
  pass
586
586
 
587
- telemetry_app = typer.Typer(help="Manage anonymous telemetry (opt-in).", rich_markup_mode="rich")
587
+ telemetry_app = typer.Typer(help="Manage anonymous telemetry (on by default; opt-out).", rich_markup_mode="rich")
588
588
  app.add_typer(telemetry_app, name="telemetry")
589
589
 
590
590
  mcp_app = typer.Typer(help="MCP integration: setup, status, serve, remove.", rich_markup_mode="rich")
@@ -597,18 +597,18 @@ auth_app = typer.Typer(help="Authentication: status, logout.", rich_markup_mode=
597
597
  app.add_typer(auth_app, name="auth")
598
598
 
599
599
 
600
- def _maybe_ask_consent() -> None:
601
- """Show first-run consent prompt once, on interactive TTYs only."""
600
+ def _maybe_show_telemetry_notice() -> None:
601
+ """Show first-run telemetry notice once, on interactive TTYs only.
602
+
603
+ Telemetry is on by default (opt-out). We inform rather than ask, then
604
+ mark the notice as shown so it appears only once.
605
+ """
602
606
  try:
603
- from sourcecode.telemetry.config import has_been_asked, set_enabled
604
- from sourcecode.telemetry.consent import ask_for_consent
607
+ from sourcecode.telemetry.config import has_been_asked, mark_asked
608
+ from sourcecode.telemetry.consent import show_first_run_notice
605
609
  if not has_been_asked():
606
- enabled = ask_for_consent()
607
- set_enabled(enabled)
608
- if enabled:
609
- typer.echo("Telemetry enabled. Thank you. Disable: sourcecode telemetry disable", err=True)
610
- else:
611
- typer.echo("Telemetry disabled. Enable anytime: sourcecode telemetry enable", err=True)
610
+ show_first_run_notice()
611
+ mark_asked()
612
612
  except Exception:
613
613
  pass
614
614
 
@@ -1020,9 +1020,9 @@ def main(
1020
1020
  sourcecode /path/to/repo --compact analyze specific path
1021
1021
  sourcecode --agent agent-optimized output (full detail)
1022
1022
  """
1023
- # First-run consent (skip for telemetry/version/config subcommands)
1023
+ # First-run telemetry notice (skip for telemetry/version/config subcommands)
1024
1024
  if ctx.invoked_subcommand not in ("telemetry", "version", "config"):
1025
- _maybe_ask_consent()
1025
+ _maybe_show_telemetry_notice()
1026
1026
  _maybe_show_mcp_hint()
1027
1027
 
1028
1028
  # When a subcommand is invoked, skip the main analysis.
@@ -3342,12 +3342,12 @@ def telemetry_status() -> None:
3342
3342
  enabled = is_enabled()
3343
3343
  asked = has_been_asked()
3344
3344
  status = "enabled" if enabled else "disabled"
3345
- typer.echo(f"Telemetry: {status}")
3345
+ typer.echo(f"Telemetry: {status} (on by default; opt-out)")
3346
3346
  if not asked:
3347
- typer.echo(" (consent not yet shown — will prompt on next run)")
3347
+ typer.echo(" (first-run notice not yet shown — will show on next run)")
3348
3348
  typer.echo(f" Config: {config_file_path()}")
3349
- typer.echo(" Disable permanently: sourcecode telemetry disable")
3350
- typer.echo(" Or set env var: SOURCECODE_TELEMETRY=0")
3349
+ typer.echo(" Disable: sourcecode telemetry disable")
3350
+ typer.echo(" Or set env var: SOURCECODE_TELEMETRY=0 (or DO_NOT_TRACK=1)")
3351
3351
 
3352
3352
 
3353
3353
  @telemetry_app.command("enable")
@@ -3369,6 +3369,7 @@ def telemetry_disable() -> None:
3369
3369
  from sourcecode.telemetry.config import set_enabled
3370
3370
  set_enabled(False)
3371
3371
  typer.echo("Telemetry disabled. No data will be collected or sent.")
3372
+ typer.echo("Telemetry is on by default; this opt-out is remembered.")
3372
3373
  typer.echo("Re-enable at any time: sourcecode telemetry enable")
3373
3374
 
3374
3375
 
@@ -4837,6 +4838,13 @@ def migrate_check_cmd(
4837
4838
  MIG-007 javax.inject import (MEDIUM)
4838
4839
  MIG-008 javax.ws.rs import (MEDIUM — JAX-RS changed)
4839
4840
 
4841
+ \b
4842
+ Hibernate 5→6 stratification (in the 'hibernate' output section):
4843
+ 4 independent layers (JPA annotations / Criteria / HQL / SPI), a per-layer
4844
+ risk matrix, a module exposure map, critical call-chain detection, and an
4845
+ UPGRADE vs REWRITE verdict (dynamic Criteria, custom SPI, reflection-built
4846
+ queries, or concatenated query strings force the REWRITE classification).
4847
+
4840
4848
  \b
4841
4849
  Examples:
4842
4850
  sourcecode migrate-check .