sourcecode 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 (140) hide show
  1. {sourcecode-2.2.0 → sourcecode-2.3.0}/CHANGELOG.md +53 -0
  2. {sourcecode-2.2.0 → sourcecode-2.3.0}/PKG-INFO +3 -3
  3. {sourcecode-2.2.0 → sourcecode-2.3.0}/README.md +2 -2
  4. {sourcecode-2.2.0 → sourcecode-2.3.0}/pyproject.toml +1 -1
  5. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/__init__.py +1 -1
  6. sourcecode-2.3.0/src/sourcecode/archetype.py +605 -0
  7. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/architecture_summary.py +41 -0
  8. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/classifier.py +94 -1
  9. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/cli.py +73 -0
  10. sourcecode-2.3.0/src/sourcecode/graph_evidence.py +352 -0
  11. {sourcecode-2.2.0 → sourcecode-2.3.0}/.github/workflows/build-windows.yml +0 -0
  12. {sourcecode-2.2.0 → sourcecode-2.3.0}/.gitignore +0 -0
  13. {sourcecode-2.2.0 → sourcecode-2.3.0}/.ruff.toml +0 -0
  14. {sourcecode-2.2.0 → sourcecode-2.3.0}/CONTRIBUTING.md +0 -0
  15. {sourcecode-2.2.0 → sourcecode-2.3.0}/LICENSE +0 -0
  16. {sourcecode-2.2.0 → sourcecode-2.3.0}/SECURITY.md +0 -0
  17. {sourcecode-2.2.0 → sourcecode-2.3.0}/raw +0 -0
  18. {sourcecode-2.2.0 → sourcecode-2.3.0}/scripts/compare_integration_engines.py +0 -0
  19. {sourcecode-2.2.0 → sourcecode-2.3.0}/scripts/customer_smoke_test.sh +0 -0
  20. {sourcecode-2.2.0 → sourcecode-2.3.0}/scripts/generate_jdk_exports.py +0 -0
  21. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/adaptive_scanner.py +0 -0
  22. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/architecture_analyzer.py +0 -0
  23. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/ast_extractor.py +0 -0
  24. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/cache.py +0 -0
  25. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/call_surface.py +0 -0
  26. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/caller_metrics.py +0 -0
  27. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/canonical_ir.py +0 -0
  28. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/cir_graphs.py +0 -0
  29. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/code_notes_analyzer.py +0 -0
  30. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/confidence_analyzer.py +0 -0
  31. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/context_graph.py +0 -0
  32. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/context_scorer.py +0 -0
  33. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/context_summarizer.py +0 -0
  34. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/contract_model.py +0 -0
  35. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/contract_pipeline.py +0 -0
  36. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/coverage_parser.py +0 -0
  37. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/dependency_analyzer.py +0 -0
  38. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/__init__.py +0 -0
  39. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/base.py +0 -0
  40. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
  41. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/dart.py +0 -0
  42. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/dotnet.py +0 -0
  43. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/elixir.py +0 -0
  44. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/go.py +0 -0
  45. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/heuristic.py +0 -0
  46. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/hybrid.py +0 -0
  47. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/java.py +0 -0
  48. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
  49. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/nodejs.py +0 -0
  50. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/parsers.py +0 -0
  51. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/php.py +0 -0
  52. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/project.py +0 -0
  53. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/python.py +0 -0
  54. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/ruby.py +0 -0
  55. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/rust.py +0 -0
  56. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/systems.py +0 -0
  57. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/terraform.py +0 -0
  58. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/detectors/tooling.py +0 -0
  59. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/doc_analyzer.py +0 -0
  60. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/dynamic_argument_surface.py +0 -0
  61. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/endpoint_literals.py +0 -0
  62. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/endpoint_metrics.py +0 -0
  63. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/entrypoint_classifier.py +0 -0
  64. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/env_analyzer.py +0 -0
  65. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/error_schema.py +0 -0
  66. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/evidence_provider.py +0 -0
  67. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/explain.py +0 -0
  68. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/file_chunker.py +0 -0
  69. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/file_classifier.py +0 -0
  70. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/format_contract.py +0 -0
  71. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/fqn_utils.py +0 -0
  72. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/git_analyzer.py +0 -0
  73. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/graph_analyzer.py +0 -0
  74. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/hibernate_strat.py +0 -0
  75. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/jdk_exports.py +0 -0
  76. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/license.py +0 -0
  77. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/mcp/__init__.py +0 -0
  78. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  79. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  80. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  81. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  82. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  83. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/mcp/orchestrator.py +0 -0
  84. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/mcp/registry.py +0 -0
  85. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/mcp/runner.py +0 -0
  86. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/mcp/server.py +0 -0
  87. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/mcp_nudge.py +0 -0
  88. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/metrics_analyzer.py +0 -0
  89. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/migrate_check.py +0 -0
  90. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/openapi_surface.py +0 -0
  91. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/output_budget.py +0 -0
  92. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/path_filters.py +0 -0
  93. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/pr_comment_renderer.py +0 -0
  94. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/pr_impact.py +0 -0
  95. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/prepare_context.py +0 -0
  96. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/progress.py +0 -0
  97. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/ranking_engine.py +0 -0
  98. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/redactor.py +0 -0
  99. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/relevance_scorer.py +0 -0
  100. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/rename_refactor.py +0 -0
  101. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/repo_classifier.py +0 -0
  102. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/repository_ir.py +0 -0
  103. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/ris.py +0 -0
  104. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/runtime_classifier.py +0 -0
  105. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/scanner.py +0 -0
  106. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/schema.py +0 -0
  107. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/security_config.py +0 -0
  108. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/security_posture.py +0 -0
  109. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/semantic_analyzer.py +0 -0
  110. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/semantic_impact_engine.py +0 -0
  111. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/semantic_integration_engine.py +0 -0
  112. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/semantic_services.py +0 -0
  113. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/serializer.py +0 -0
  114. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/spring_event_topology.py +0 -0
  115. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/spring_findings.py +0 -0
  116. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/spring_impact.py +0 -0
  117. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/spring_model.py +0 -0
  118. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/spring_security_audit.py +0 -0
  119. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/spring_semantic.py +0 -0
  120. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/spring_tx_analyzer.py +0 -0
  121. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/summarizer.py +0 -0
  122. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/telemetry/__init__.py +0 -0
  123. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/telemetry/config.py +0 -0
  124. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/telemetry/consent.py +0 -0
  125. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/telemetry/events.py +0 -0
  126. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/telemetry/filters.py +0 -0
  127. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/telemetry/transport.py +0 -0
  128. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/tree_utils.py +0 -0
  129. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/type_usage_surface.py +0 -0
  130. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/validation_inference.py +0 -0
  131. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/validation_surface.py +0 -0
  132. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/version_check.py +0 -0
  133. {sourcecode-2.2.0 → sourcecode-2.3.0}/src/sourcecode/workspace.py +0 -0
  134. {sourcecode-2.2.0 → sourcecode-2.3.0}/supabase/functions/README.md +0 -0
  135. {sourcecode-2.2.0 → sourcecode-2.3.0}/supabase/functions/get-license/index.ts +0 -0
  136. {sourcecode-2.2.0 → sourcecode-2.3.0}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  137. {sourcecode-2.2.0 → sourcecode-2.3.0}/supabase/functions/telemetry/index.ts +0 -0
  138. {sourcecode-2.2.0 → sourcecode-2.3.0}/supabase/sql/license_event_ordering.sql +0 -0
  139. {sourcecode-2.2.0 → sourcecode-2.3.0}/supabase/sql/licensing_schema.sql +0 -0
  140. {sourcecode-2.2.0 → sourcecode-2.3.0}/supabase/sql/telemetry_events.sql +0 -0
@@ -1,5 +1,58 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.3.0] — 2026-07-12
4
+
5
+ **Module graph promoted to a first-class Evidence Provider for architectural
6
+ characterization (ADR-0003 step 2).** The experimental `archetype` model can now
7
+ derive architectural style from the *directed structure* of the module
8
+ dependency graph rather than from directory names — names become secondary
9
+ evidence. This consolidates a new evidence source; the legacy report wording is
10
+ unchanged (no cutover) pending cross-repo validation.
11
+
12
+ ### Added
13
+
14
+ - **`graph_evidence.py` — a pure, archetype-agnostic Graph Evidence Provider.**
15
+ Transforms a `ModuleGraph` into reusable topological evidence
16
+ (`ModuleGraph → metrics → GraphEvidence`). It knows graphs, not archetypes: it
17
+ never classifies, emits no prose, and does not import the scorer. Seven
18
+ name-free metrics, each O(V+E)/O(V log V): `scc_mass` (non-trivial
19
+ strongly-connected-component node fraction, iterative Tarjan), `cyclic_density`
20
+ (intra-SCC back-edges), `hub_concentration`, `module_centralization` (Freeman),
21
+ `downward_edge_ratio` and `dependency_inversion_ratio` (both via Martin
22
+ instability `I = out/(in+out)`), and `fan_in_gini`. Graphs below 4 nodes / 3
23
+ edges report `available=False` and degrade cleanly.
24
+ - **`archetype` consumes topological evidence via a declarative `_GRAPH_MAP`.**
25
+ The map (`metric → [(dimension, label, weight, polarity, lo, hi)]`) is the only
26
+ place that couples graphs to archetypes; the scorer reads `Evidence` objects and
27
+ never traverses the graph. Polarity `-1` *refutes* (a dense cyclic core refutes
28
+ `layered`/`microkernel`/`hexagonal`). Architectural style now emerges from
29
+ structure: `layered` from downward flow + acyclicity, `engine` from a woven
30
+ cyclic core, `microkernel` from a stable hub, `hexagonal` from dependency
31
+ inversion into a distributed core.
32
+ - **`ask archetype` builds a bounded `ModuleGraph`** (`GraphAnalyzer`) and feeds it
33
+ to the classifier, best-effort with graceful degradation to the previous
34
+ name-mass-only behaviour on failure or oversized trees. Output gains top-level
35
+ `graph_metrics` and `graph_*` entries in candidate evidence traces.
36
+
37
+ ### Changed
38
+
39
+ - **Confidence is now tied to topological support for the winning label.**
40
+ `graph_backed` is true only when the winning candidate carries positive
41
+ `graph_*` evidence — so "high" confidence requires real structure behind *that*
42
+ conclusion, not merely that a graph exists. (The prior gate keyed on
43
+ `module_graph_summary` was effectively dead, since the command never populated
44
+ it.) A new absolute-score floor (`_MIN_CONFIDENT_SCORE`) keeps a near-floor lone
45
+ winner at "low".
46
+
47
+ ### Notes
48
+
49
+ - **No report cutover.** Legacy `project_type` / `architecture.pattern` and the
50
+ report's first two lines are unchanged; `archetype` remains parallel and
51
+ experimental while the new evidence is validated across repositories.
52
+ - Tests: `tests/test_graph_evidence.py` adds 12 synthetic-graph tests (no real
53
+ repository) covering metric ranges for layered/engine/microkernel/hexagonal
54
+ topologies and the archetype integration. Full battery: 3220 passed.
55
+
3
56
  ## [2.2.0] — 2026-07-12
4
57
 
5
58
  **Field-validation hardening — narrative/reporting-layer correctness across the
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sourcecode
3
- Version: 2.2.0
3
+ Version: 2.3.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
@@ -42,7 +42,7 @@ Description-Content-Type: text/markdown
42
42
 
43
43
  **Context · Impact · Migration · Architecture · Review — everything from one structural model.**
44
44
 
45
- ![Version](https://img.shields.io/badge/version-2.2.0-blue)
45
+ ![Version](https://img.shields.io/badge/version-2.3.0-blue)
46
46
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
47
47
 
48
48
  > **ASK Engine** is the product. The CLI command is **`ask`**. The legacy **`sourcecode`**
@@ -84,7 +84,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
84
84
  # pip / pipx
85
85
  pipx install sourcecode # or: pip install sourcecode
86
86
 
87
- ask version # ask 2.2.0
87
+ ask version # ask 2.3.0
88
88
  ```
89
89
 
90
90
  > **Package vs. command.** The install package is named `sourcecode` this release
@@ -4,7 +4,7 @@
4
4
 
5
5
  **Context · Impact · Migration · Architecture · Review — everything from one structural model.**
6
6
 
7
- ![Version](https://img.shields.io/badge/version-2.2.0-blue)
7
+ ![Version](https://img.shields.io/badge/version-2.3.0-blue)
8
8
  ![Python](https://img.shields.io/badge/python-3.9%2B-green)
9
9
 
10
10
  > **ASK Engine** is the product. The CLI command is **`ask`**. The legacy **`sourcecode`**
@@ -46,7 +46,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
46
46
  # pip / pipx
47
47
  pipx install sourcecode # or: pip install sourcecode
48
48
 
49
- ask version # ask 2.2.0
49
+ ask version # ask 2.3.0
50
50
  ```
51
51
 
52
52
  > **Package vs. command.** The install package is named `sourcecode` this release
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "2.2.0"
7
+ version = "2.3.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"
@@ -4,4 +4,4 @@ ASK Engine is the product. ``ask`` is the canonical CLI command; ``sourcecode``
4
4
  the legacy compatibility alias and the Python/PyPI package name. See
5
5
  docs/PRODUCT_IDENTITY.md (normative)."""
6
6
 
7
- __version__ = "2.2.0"
7
+ __version__ = "2.3.0"