sourcecode 2.2.0__tar.gz → 2.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. {sourcecode-2.2.0 → sourcecode-2.4.0}/CHANGELOG.md +106 -0
  2. {sourcecode-2.2.0 → sourcecode-2.4.0}/PKG-INFO +3 -3
  3. {sourcecode-2.2.0 → sourcecode-2.4.0}/README.md +2 -2
  4. {sourcecode-2.2.0 → sourcecode-2.4.0}/pyproject.toml +1 -1
  5. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/__init__.py +1 -1
  6. sourcecode-2.4.0/src/sourcecode/archetype.py +605 -0
  7. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/architecture_summary.py +41 -0
  8. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/classifier.py +94 -1
  9. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/cli.py +135 -1
  10. sourcecode-2.4.0/src/sourcecode/context_cache.py +637 -0
  11. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/explain.py +24 -0
  12. sourcecode-2.4.0/src/sourcecode/graph_evidence.py +352 -0
  13. {sourcecode-2.2.0 → sourcecode-2.4.0}/.github/workflows/build-windows.yml +0 -0
  14. {sourcecode-2.2.0 → sourcecode-2.4.0}/.gitignore +0 -0
  15. {sourcecode-2.2.0 → sourcecode-2.4.0}/.ruff.toml +0 -0
  16. {sourcecode-2.2.0 → sourcecode-2.4.0}/CONTRIBUTING.md +0 -0
  17. {sourcecode-2.2.0 → sourcecode-2.4.0}/LICENSE +0 -0
  18. {sourcecode-2.2.0 → sourcecode-2.4.0}/SECURITY.md +0 -0
  19. {sourcecode-2.2.0 → sourcecode-2.4.0}/raw +0 -0
  20. {sourcecode-2.2.0 → sourcecode-2.4.0}/scripts/compare_integration_engines.py +0 -0
  21. {sourcecode-2.2.0 → sourcecode-2.4.0}/scripts/customer_smoke_test.sh +0 -0
  22. {sourcecode-2.2.0 → sourcecode-2.4.0}/scripts/generate_jdk_exports.py +0 -0
  23. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/adaptive_scanner.py +0 -0
  24. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/architecture_analyzer.py +0 -0
  25. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/ast_extractor.py +0 -0
  26. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/cache.py +0 -0
  27. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/call_surface.py +0 -0
  28. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/caller_metrics.py +0 -0
  29. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/canonical_ir.py +0 -0
  30. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/cir_graphs.py +0 -0
  31. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/code_notes_analyzer.py +0 -0
  32. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/confidence_analyzer.py +0 -0
  33. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/context_graph.py +0 -0
  34. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/context_scorer.py +0 -0
  35. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/context_summarizer.py +0 -0
  36. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/contract_model.py +0 -0
  37. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/contract_pipeline.py +0 -0
  38. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/coverage_parser.py +0 -0
  39. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/dependency_analyzer.py +0 -0
  40. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/__init__.py +0 -0
  41. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/base.py +0 -0
  42. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
  43. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/dart.py +0 -0
  44. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/dotnet.py +0 -0
  45. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/elixir.py +0 -0
  46. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/go.py +0 -0
  47. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/heuristic.py +0 -0
  48. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/hybrid.py +0 -0
  49. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/java.py +0 -0
  50. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
  51. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/nodejs.py +0 -0
  52. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/parsers.py +0 -0
  53. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/php.py +0 -0
  54. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/project.py +0 -0
  55. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/python.py +0 -0
  56. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/ruby.py +0 -0
  57. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/rust.py +0 -0
  58. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/systems.py +0 -0
  59. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/terraform.py +0 -0
  60. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/tooling.py +0 -0
  61. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/doc_analyzer.py +0 -0
  62. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/dynamic_argument_surface.py +0 -0
  63. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/endpoint_literals.py +0 -0
  64. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/endpoint_metrics.py +0 -0
  65. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/entrypoint_classifier.py +0 -0
  66. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/env_analyzer.py +0 -0
  67. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/error_schema.py +0 -0
  68. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/evidence_provider.py +0 -0
  69. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/file_chunker.py +0 -0
  70. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/file_classifier.py +0 -0
  71. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/format_contract.py +0 -0
  72. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/fqn_utils.py +0 -0
  73. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/git_analyzer.py +0 -0
  74. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/graph_analyzer.py +0 -0
  75. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/hibernate_strat.py +0 -0
  76. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/jdk_exports.py +0 -0
  77. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/license.py +0 -0
  78. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp/__init__.py +0 -0
  79. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  80. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp/onboarding/applier.py +0 -0
  81. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  82. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  83. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  84. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp/orchestrator.py +0 -0
  85. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp/registry.py +0 -0
  86. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp/runner.py +0 -0
  87. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp/server.py +0 -0
  88. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp_nudge.py +0 -0
  89. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/metrics_analyzer.py +0 -0
  90. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/migrate_check.py +0 -0
  91. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/openapi_surface.py +0 -0
  92. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/output_budget.py +0 -0
  93. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/path_filters.py +0 -0
  94. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/pr_comment_renderer.py +0 -0
  95. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/pr_impact.py +0 -0
  96. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/prepare_context.py +0 -0
  97. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/progress.py +0 -0
  98. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/ranking_engine.py +0 -0
  99. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/redactor.py +0 -0
  100. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/relevance_scorer.py +0 -0
  101. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/rename_refactor.py +0 -0
  102. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/repo_classifier.py +0 -0
  103. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/repository_ir.py +0 -0
  104. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/ris.py +0 -0
  105. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/runtime_classifier.py +0 -0
  106. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/scanner.py +0 -0
  107. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/schema.py +0 -0
  108. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/security_config.py +0 -0
  109. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/security_posture.py +0 -0
  110. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/semantic_analyzer.py +0 -0
  111. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/semantic_impact_engine.py +0 -0
  112. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/semantic_integration_engine.py +0 -0
  113. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/semantic_services.py +0 -0
  114. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/serializer.py +0 -0
  115. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/spring_event_topology.py +0 -0
  116. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/spring_findings.py +0 -0
  117. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/spring_impact.py +0 -0
  118. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/spring_model.py +0 -0
  119. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/spring_security_audit.py +0 -0
  120. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/spring_semantic.py +0 -0
  121. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/spring_tx_analyzer.py +0 -0
  122. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/summarizer.py +0 -0
  123. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/telemetry/__init__.py +0 -0
  124. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/telemetry/config.py +0 -0
  125. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/telemetry/consent.py +0 -0
  126. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/telemetry/events.py +0 -0
  127. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/telemetry/filters.py +0 -0
  128. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/telemetry/transport.py +0 -0
  129. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/tree_utils.py +0 -0
  130. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/type_usage_surface.py +0 -0
  131. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/validation_inference.py +0 -0
  132. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/validation_surface.py +0 -0
  133. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/version_check.py +0 -0
  134. {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/workspace.py +0 -0
  135. {sourcecode-2.2.0 → sourcecode-2.4.0}/supabase/functions/README.md +0 -0
  136. {sourcecode-2.2.0 → sourcecode-2.4.0}/supabase/functions/get-license/index.ts +0 -0
  137. {sourcecode-2.2.0 → sourcecode-2.4.0}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  138. {sourcecode-2.2.0 → sourcecode-2.4.0}/supabase/functions/telemetry/index.ts +0 -0
  139. {sourcecode-2.2.0 → sourcecode-2.4.0}/supabase/sql/license_event_ordering.sql +0 -0
  140. {sourcecode-2.2.0 → sourcecode-2.4.0}/supabase/sql/licensing_schema.sql +0 -0
  141. {sourcecode-2.2.0 → sourcecode-2.4.0}/supabase/sql/telemetry_events.sql +0 -0
@@ -1,5 +1,111 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.4.0] — 2026-07-12
4
+
5
+ **AI Context Cache — a provider-agnostic cache for ASK's reusable Knowledge
6
+ Context.** This is *not* a prompt cache: it never stores prompts, generated text,
7
+ or LLM responses. It caches the structured knowledge ASK derives from source —
8
+ so expensive commands stop re-parsing the same repository on every run. The cache
9
+ belongs entirely to ASK and is consumed identically by any AI provider (GPT,
10
+ Claude, Gemini, local models) or none at all; the LLM never participates in
11
+ producing or reading it.
12
+
13
+ ### Added
14
+
15
+ - **`context_cache.py` — the AI Context Cache component.** Operates at the
16
+ *knowledge* level: it caches the reusable Canonical IR (the expensive Java
17
+ parse) keyed **only by knowledge state**, never by command or prompt. The key
18
+ is `worktree_signature + KL_SCHEMA_VERSION + PRODUCER_VERSION + scope`, where
19
+ `worktree_signature` is the committed HEAD folded with a hash of the working-tree
20
+ diff when dirty — so a new commit *or* an uncommitted edit deterministically
21
+ invalidates the entry rather than serving stale context. Invalidation is
22
+ state-based, never TTL-based for correctness (TTL and a max-entry cap exist only
23
+ as cleanup). Entries are gzip'd, inspectable envelopes (no opaque blobs);
24
+ persistence survives across executions under `~/.sourcecode/context-cache/`.
25
+ - **`get_or_build_cir()` — the reusable-knowledge entry point.** Builds the
26
+ Canonical IR once and, on a hit, rebuilds the full CIR cheaply from the cached
27
+ raw IR via `ir_dict_to_canonical` — skipping the parse entirely, with the
28
+ `cir_hash` verified equal so the rebuilt CIR is provably faithful. Because the
29
+ key is command-agnostic, every command that needs a CIR shares one entry: once
30
+ wired, `impact` / `review-pr` / `modernize` reuse it for free.
31
+ - **`CachedContext`** — an inspectable structured record (`metadata`, `entities`,
32
+ `evidence`, `observations`, `summaries`, `graph_metrics`, `payload`,
33
+ `timestamps`, `producer_version`). Advisory metrics are tracked from day one:
34
+ hits, misses, invalidations, stores, hit ratio, average lookup/build time, bytes
35
+ stored, contexts reused.
36
+ - **`ask cache context-stats` / `ask cache context-clear`** — observability and
37
+ management for the context cache, kept distinct from the existing snapshot-cache
38
+ `cache status` / `cache clear` so neither clobbers the other.
39
+ - **`ask explain` is the first consumer.** It fetches its CIR through
40
+ `get_or_build_cir` and derives the class explanation cheaply from the shared
41
+ knowledge; each run reports `Context cache: HIT/MISS` with timing. Output is
42
+ byte-identical whether served from cache or a fresh build.
43
+
44
+ ### Notes
45
+
46
+ - **Only `explain` is wired** — a deliberate reference integration to validate the
47
+ design before connecting `impact` / `onboard` / `prepare-context` / `archetype` /
48
+ `review-pr` / `modernize`. The SourceMap-based commands (`onboard`,
49
+ `prepare-context`, `archetype`) will use a separate cache scope.
50
+ - No AI-provider-specific logic, no embeddings, no RAG, no prompt/response caching.
51
+ - Env vars: `SOURCECODE_CONTEXT_CACHE_{DIR,DISABLE,TTL_DAYS,MAX_ENTRIES}`.
52
+ - Tests: `tests/test_context_cache.py` adds 23 tests (hit/miss, commit/dirty/version
53
+ invalidation, persistence, corruption recovery, concurrency, TTL GC, CIR
54
+ round-trip fidelity, cross-command reuse). No report or behaviour cutover.
55
+
56
+ ## [2.3.0] — 2026-07-12
57
+
58
+ **Module graph promoted to a first-class Evidence Provider for architectural
59
+ characterization (ADR-0003 step 2).** The experimental `archetype` model can now
60
+ derive architectural style from the *directed structure* of the module
61
+ dependency graph rather than from directory names — names become secondary
62
+ evidence. This consolidates a new evidence source; the legacy report wording is
63
+ unchanged (no cutover) pending cross-repo validation.
64
+
65
+ ### Added
66
+
67
+ - **`graph_evidence.py` — a pure, archetype-agnostic Graph Evidence Provider.**
68
+ Transforms a `ModuleGraph` into reusable topological evidence
69
+ (`ModuleGraph → metrics → GraphEvidence`). It knows graphs, not archetypes: it
70
+ never classifies, emits no prose, and does not import the scorer. Seven
71
+ name-free metrics, each O(V+E)/O(V log V): `scc_mass` (non-trivial
72
+ strongly-connected-component node fraction, iterative Tarjan), `cyclic_density`
73
+ (intra-SCC back-edges), `hub_concentration`, `module_centralization` (Freeman),
74
+ `downward_edge_ratio` and `dependency_inversion_ratio` (both via Martin
75
+ instability `I = out/(in+out)`), and `fan_in_gini`. Graphs below 4 nodes / 3
76
+ edges report `available=False` and degrade cleanly.
77
+ - **`archetype` consumes topological evidence via a declarative `_GRAPH_MAP`.**
78
+ The map (`metric → [(dimension, label, weight, polarity, lo, hi)]`) is the only
79
+ place that couples graphs to archetypes; the scorer reads `Evidence` objects and
80
+ never traverses the graph. Polarity `-1` *refutes* (a dense cyclic core refutes
81
+ `layered`/`microkernel`/`hexagonal`). Architectural style now emerges from
82
+ structure: `layered` from downward flow + acyclicity, `engine` from a woven
83
+ cyclic core, `microkernel` from a stable hub, `hexagonal` from dependency
84
+ inversion into a distributed core.
85
+ - **`ask archetype` builds a bounded `ModuleGraph`** (`GraphAnalyzer`) and feeds it
86
+ to the classifier, best-effort with graceful degradation to the previous
87
+ name-mass-only behaviour on failure or oversized trees. Output gains top-level
88
+ `graph_metrics` and `graph_*` entries in candidate evidence traces.
89
+
90
+ ### Changed
91
+
92
+ - **Confidence is now tied to topological support for the winning label.**
93
+ `graph_backed` is true only when the winning candidate carries positive
94
+ `graph_*` evidence — so "high" confidence requires real structure behind *that*
95
+ conclusion, not merely that a graph exists. (The prior gate keyed on
96
+ `module_graph_summary` was effectively dead, since the command never populated
97
+ it.) A new absolute-score floor (`_MIN_CONFIDENT_SCORE`) keeps a near-floor lone
98
+ winner at "low".
99
+
100
+ ### Notes
101
+
102
+ - **No report cutover.** Legacy `project_type` / `architecture.pattern` and the
103
+ report's first two lines are unchanged; `archetype` remains parallel and
104
+ experimental while the new evidence is validated across repositories.
105
+ - Tests: `tests/test_graph_evidence.py` adds 12 synthetic-graph tests (no real
106
+ repository) covering metric ranges for layered/engine/microkernel/hexagonal
107
+ topologies and the archetype integration. Full battery: 3220 passed.
108
+
3
109
  ## [2.2.0] — 2026-07-12
4
110
 
5
111
  **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.4.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.4.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.4.0"