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.
- {sourcecode-2.2.0 → sourcecode-2.4.0}/CHANGELOG.md +106 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/PKG-INFO +3 -3
- {sourcecode-2.2.0 → sourcecode-2.4.0}/README.md +2 -2
- {sourcecode-2.2.0 → sourcecode-2.4.0}/pyproject.toml +1 -1
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/__init__.py +1 -1
- sourcecode-2.4.0/src/sourcecode/archetype.py +605 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/architecture_summary.py +41 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/classifier.py +94 -1
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/cli.py +135 -1
- sourcecode-2.4.0/src/sourcecode/context_cache.py +637 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/explain.py +24 -0
- sourcecode-2.4.0/src/sourcecode/graph_evidence.py +352 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/.gitignore +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/.ruff.toml +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/CONTRIBUTING.md +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/LICENSE +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/SECURITY.md +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/raw +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/scripts/compare_integration_engines.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/scripts/customer_smoke_test.sh +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/scripts/generate_jdk_exports.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/cache.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/call_surface.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/caller_metrics.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/canonical_ir.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/cir_graphs.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/context_graph.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/dynamic_argument_surface.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/endpoint_literals.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/endpoint_metrics.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/error_schema.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/evidence_provider.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/file_chunker.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/format_contract.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/fqn_utils.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/hibernate_strat.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/jdk_exports.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/license.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp/__init__.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp/onboarding/applier.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp/onboarding/backup.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp/onboarding/detector.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp/onboarding/planner.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp/orchestrator.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp/registry.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp/runner.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp/server.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/mcp_nudge.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/migrate_check.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/openapi_surface.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/output_budget.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/path_filters.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/pr_comment_renderer.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/pr_impact.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/prepare_context.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/progress.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/redactor.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/rename_refactor.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/repository_ir.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/ris.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/scanner.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/schema.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/security_config.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/security_posture.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/semantic_impact_engine.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/semantic_integration_engine.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/semantic_services.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/serializer.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/spring_event_topology.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/spring_findings.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/spring_impact.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/spring_model.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/spring_security_audit.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/spring_semantic.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/spring_tx_analyzer.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/type_usage_surface.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/validation_inference.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/validation_surface.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/version_check.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/src/sourcecode/workspace.py +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/supabase/functions/README.md +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/supabase/functions/get-license/index.ts +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/supabase/functions/telemetry/index.ts +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/supabase/sql/license_event_ordering.sql +0 -0
- {sourcecode-2.2.0 → sourcecode-2.4.0}/supabase/sql/licensing_schema.sql +0 -0
- {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.
|
|
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
|
-

|
|
46
46
|

|
|
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.
|
|
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
|
-

|
|
8
8
|

|
|
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.
|
|
49
|
+
ask version # ask 2.3.0
|
|
50
50
|
```
|
|
51
51
|
|
|
52
52
|
> **Package vs. command.** The install package is named `sourcecode` this release
|