sourcecode 2.4.0__tar.gz → 2.5.1__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.4.0 → sourcecode-2.5.1}/CHANGELOG.md +88 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/PKG-INFO +4 -4
- {sourcecode-2.4.0 → sourcecode-2.5.1}/README.md +3 -3
- {sourcecode-2.4.0 → sourcecode-2.5.1}/pyproject.toml +1 -1
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/__init__.py +1 -1
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/archetype.py +46 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/cli.py +429 -3
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/context_graph.py +32 -24
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/repository_ir.py +116 -2
- sourcecode-2.5.1/src/sourcecode/retrieval/__init__.py +192 -0
- sourcecode-2.5.1/src/sourcecode/retrieval/context.py +241 -0
- sourcecode-2.5.1/src/sourcecode/retrieval/errors.py +41 -0
- sourcecode-2.5.1/src/sourcecode/retrieval/executor.py +51 -0
- sourcecode-2.5.1/src/sourcecode/retrieval/planner.py +297 -0
- sourcecode-2.5.1/src/sourcecode/retrieval/query.py +484 -0
- sourcecode-2.5.1/src/sourcecode/retrieval/request.py +94 -0
- sourcecode-2.5.1/src/sourcecode/retrieval/resolution.py +135 -0
- sourcecode-2.5.1/src/sourcecode/retrieval/result.py +144 -0
- sourcecode-2.5.1/src/sourcecode/retrieval/retriever.py +62 -0
- sourcecode-2.5.1/src/sourcecode/retrieval/runtime.py +259 -0
- sourcecode-2.5.1/src/sourcecode/retrieval/steps.py +242 -0
- sourcecode-2.5.1/src/sourcecode/retrieval/steps_endpoint.py +311 -0
- sourcecode-2.5.1/src/sourcecode/retrieval/steps_graph.py +248 -0
- sourcecode-2.5.1/src/sourcecode/retrieval/steps_impact.py +293 -0
- sourcecode-2.5.1/src/sourcecode/retrieval/steps_intf.py +247 -0
- sourcecode-2.5.1/src/sourcecode/retrieval/steps_struct.py +338 -0
- sourcecode-2.5.1/src/sourcecode/retrieval/steps_txsec.py +351 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/security_config.py +4 -4
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/spring_impact.py +52 -10
- {sourcecode-2.4.0 → sourcecode-2.5.1}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/.gitignore +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/.ruff.toml +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/CONTRIBUTING.md +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/LICENSE +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/SECURITY.md +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/raw +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/scripts/compare_integration_engines.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/scripts/customer_smoke_test.sh +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/scripts/generate_jdk_exports.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/cache.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/call_surface.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/caller_metrics.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/canonical_ir.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/cir_graphs.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/classifier.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/context_cache.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/dynamic_argument_surface.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/endpoint_literals.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/endpoint_metrics.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/error_schema.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/evidence_provider.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/explain.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/file_chunker.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/format_contract.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/fqn_utils.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/graph_evidence.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/hibernate_strat.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/jdk_exports.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/license.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/mcp/__init__.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/mcp/onboarding/applier.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/mcp/onboarding/backup.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/mcp/onboarding/detector.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/mcp/onboarding/planner.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/mcp/orchestrator.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/mcp/registry.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/mcp/runner.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/mcp/server.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/mcp_nudge.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/migrate_check.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/openapi_surface.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/output_budget.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/path_filters.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/pr_comment_renderer.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/pr_impact.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/prepare_context.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/progress.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/redactor.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/rename_refactor.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/ris.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/scanner.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/schema.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/security_posture.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/semantic_impact_engine.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/semantic_integration_engine.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/semantic_services.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/serializer.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/spring_event_topology.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/spring_findings.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/spring_model.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/spring_security_audit.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/spring_semantic.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/spring_tx_analyzer.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/type_usage_surface.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/validation_inference.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/validation_surface.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/version_check.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/src/sourcecode/workspace.py +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/supabase/functions/README.md +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/supabase/functions/get-license/index.ts +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/supabase/functions/telemetry/index.ts +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/supabase/sql/license_event_ordering.sql +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/supabase/sql/licensing_schema.sql +0 -0
- {sourcecode-2.4.0 → sourcecode-2.5.1}/supabase/sql/telemetry_events.sql +0 -0
|
@@ -1,5 +1,93 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.5.1] — 2026-07-14
|
|
4
|
+
|
|
5
|
+
**impact-chain correctness fix — field-injected callers are no longer lost.** A service
|
|
6
|
+
method reached only through an injected sibling (`someService.doWork(...)`, a lowercase
|
|
7
|
+
field receiver) was reported as an isolated, zero-caller *low-risk* change — a dangerous
|
|
8
|
+
false negative. The static call-graph resolved intra-class and static (`Type.method()`)
|
|
9
|
+
invocations but never an instance call through a typed field, so no `calls` edge reached
|
|
10
|
+
the target and the blast radius came back empty at `confidence=high`.
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **Receiver-typed call edges (IC-RTC)** (`repository_ir.py`): a repo-wide post-pass
|
|
15
|
+
emits method-level `calls` edges for instance invocations through a typed field
|
|
16
|
+
receiver (`field.method(...)`), joining facts already extracted — the invocation atom
|
|
17
|
+
(`receiver`/`callee`), the field's declared type, and the target type's method index.
|
|
18
|
+
No new parse. Unresolved, ambiguous, local, or library receivers yield nothing (an
|
|
19
|
+
unresolved fact stays unresolved rather than being guessed). Recovers the injected
|
|
20
|
+
cross-service caller the reverse graph previously missed.
|
|
21
|
+
- **Method-scoped impact expansion** (`spring_impact.py`): a method-level query
|
|
22
|
+
(`Impl#foo`) now expands impl↔interface (CH-001a/b) to the **same-named** member only,
|
|
23
|
+
not the entire interface — so a change to `foo` no longer inherits the callers of a
|
|
24
|
+
sibling method `bar`. Class-level (whole-service) queries stay broad. Now that precise
|
|
25
|
+
`field.method(...)` edges exist, this removes latent caller over-reporting (measured:
|
|
26
|
+
a petclinic-rest method query dropped from 9 whole-controller false callers to the 6
|
|
27
|
+
real handler methods that call it).
|
|
28
|
+
- **Inline-annotation field types** (`repository_ir.py`): `_extract_field_types` skipped
|
|
29
|
+
any line beginning with `@`, dropping single-line declarations such as
|
|
30
|
+
`@Autowired private Foo foo;`. Leading inline annotations are now stripped before the
|
|
31
|
+
field is read (brace counting runs on the stripped residual, so annotation string args
|
|
32
|
+
like `@GetMapping("/a/{id}")` cannot skew class-body depth).
|
|
33
|
+
|
|
34
|
+
No public JSON contract changes; output stays deterministic. Regression coverage added in
|
|
35
|
+
`tests/test_impact_receiver_typed_calls.py` (cross-service recovery, self-call exclusion,
|
|
36
|
+
method-scope precision, `this.field` receivers, no phantom edges).
|
|
37
|
+
|
|
38
|
+
## [2.5.0] — 2026-07-13
|
|
39
|
+
|
|
40
|
+
**Semantic Retrieval Engine v1 — a declarative, agent-ready query layer over ASK's
|
|
41
|
+
already-built knowledge.** Retrieval turns *"ask a typed question of the repository"*
|
|
42
|
+
into a first-class, reusable operation (Layer 3.5, above the Knowledge Layer, below any
|
|
43
|
+
presentation). It **queries** existing structured knowledge — it never extracts, parses,
|
|
44
|
+
or computes new evidence: every answer is a composition of existing engines acquired
|
|
45
|
+
through one shared, cached `KnowledgeContext`. Frozen as v1 in ADR-0004.
|
|
46
|
+
|
|
47
|
+
### Added
|
|
48
|
+
|
|
49
|
+
- **Semantic Retrieval Engine** (`src/sourcecode/retrieval/`): a typed `RetrievalRequest`
|
|
50
|
+
→ `IntentResolver` → `QueryPlanner` → declarative `KnowledgeQuery` (a closed, serializable
|
|
51
|
+
Step algebra) → generic `QueryPlanRuntime` → structured `KnowledgeResult` (entities,
|
|
52
|
+
evidence, observations, confidence, structured explanation, provenance, executed plan).
|
|
53
|
+
Adding an intent is enum + plan + registered steps — the generic Runtime is unchanged;
|
|
54
|
+
this held across 11 phases and **29 intents / 9 domains**.
|
|
55
|
+
- **29 experimental `ask retrieve …` intents** across Architecture, Impact, Transactions,
|
|
56
|
+
Security, Interfaces/Validation, Integrations, Subsystems, Dependencies, and Graph — each
|
|
57
|
+
a pure composition of an existing engine (ArchetypeClassifier, `compute_blast_radius`,
|
|
58
|
+
`SpringSemanticModel`, `run_tx_audit`, `run_security_audit`, `build_validation_surface`,
|
|
59
|
+
`SemanticIntegrationEngine`, `run_impact_chain`, the module graph). Cross-pack step reuse
|
|
60
|
+
(`ResolveTarget`, `ResolveEndpointRef`, `ResolveScope`, generic `BuildResult`).
|
|
61
|
+
- **Consolidation (B1–B4):** lazy SourceMap acquisition; per-acquisition timing surfaced in
|
|
62
|
+
the runtime report; impact-pack evidence parity; the `limit` option activated (default
|
|
63
|
+
unbounded). `ADR-0004` + `DESIGN-knowledge-provider-integration.md` document the frozen
|
|
64
|
+
contract and the pattern for adding future knowledge providers.
|
|
65
|
+
- **User guide — architecture chapters (EN + ES):** *How ASK works*, *The semantic engine*,
|
|
66
|
+
*Architectural intelligence*, *AI workflows* — the Semantic IR / Context Graph / Knowledge
|
|
67
|
+
Layer / evidence model that the guides previously did not cover.
|
|
68
|
+
|
|
69
|
+
### Fixed
|
|
70
|
+
|
|
71
|
+
- **Cold-path performance / apparent hang:** `ContextGraph.relations()`/`symbols()` were
|
|
72
|
+
re-converting every edge and re-sorting every node on each call, and per-file consumers
|
|
73
|
+
call them once per file — an O(files × edges) blow-up that made cold `ask --agent` take
|
|
74
|
+
minutes on large repositories. Memoizing the projections cut jobrunr cold ~21 s → ~4 s and
|
|
75
|
+
BroadleafCommerce cold `--agent` from a multi-minute hang to ~54 s. Benefits every command
|
|
76
|
+
that reads the graph.
|
|
77
|
+
- **`archetype` library de-bias (P0):** consumable libraries were confidently labeled
|
|
78
|
+
`engine` (their internals are engine-like). Non-runnable artifacts (no app/server/servlet
|
|
79
|
+
entry) are now correctly distinguished from runnable engines — jobrunr `engine(high)` →
|
|
80
|
+
`library(low)`; real engines (Neo4j) unchanged. Implemented as transparent, auditable
|
|
81
|
+
evidence.
|
|
82
|
+
- **`fix-bug` argument consistency (P0):** now accepts the sibling-consistent
|
|
83
|
+
`fix-bug <symptom> <path>` form (mirroring `impact <target> <path>`) instead of failing
|
|
84
|
+
with a raw usage error; `--symptom` and path-only forms remain unchanged.
|
|
85
|
+
|
|
86
|
+
### Removed
|
|
87
|
+
|
|
88
|
+
- All references to a proprietary third-party security annotation were scrubbed from code,
|
|
89
|
+
tests, and docs (ASK references nothing vendor-proprietary).
|
|
90
|
+
|
|
3
91
|
## [2.4.0] — 2026-07-12
|
|
4
92
|
|
|
5
93
|
**AI Context Cache — a provider-agnostic cache for ASK's reusable Knowledge
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.5.1
|
|
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.5.1
|
|
88
88
|
```
|
|
89
89
|
|
|
90
90
|
> **Package vs. command.** The install package is named `sourcecode` this release
|
|
@@ -218,7 +218,7 @@ repo root (otherwise they report `policy: "none_detected"`):
|
|
|
218
218
|
```json
|
|
219
219
|
{
|
|
220
220
|
"customSecurityAnnotations": [
|
|
221
|
-
{ "fullyQualifiedName": "com.example.security.
|
|
221
|
+
{ "fullyQualifiedName": "com.example.security.CustomSecurityAnnotation", "shortName": "CustomSecurityAnnotation" }
|
|
222
222
|
]
|
|
223
223
|
}
|
|
224
224
|
```
|
|
@@ -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.5.1
|
|
50
50
|
```
|
|
51
51
|
|
|
52
52
|
> **Package vs. command.** The install package is named `sourcecode` this release
|
|
@@ -180,7 +180,7 @@ repo root (otherwise they report `policy: "none_detected"`):
|
|
|
180
180
|
```json
|
|
181
181
|
{
|
|
182
182
|
"customSecurityAnnotations": [
|
|
183
|
-
{ "fullyQualifiedName": "com.example.security.
|
|
183
|
+
{ "fullyQualifiedName": "com.example.security.CustomSecurityAnnotation", "shortName": "CustomSecurityAnnotation" }
|
|
184
184
|
]
|
|
185
185
|
}
|
|
186
186
|
```
|
|
@@ -80,6 +80,17 @@ _MIN_PRIMARY_SCORE = 0.05
|
|
|
80
80
|
# A winner must clear this absolute score (not just the top-2 margin) to earn
|
|
81
81
|
# medium/high confidence — a near-floor lone candidate stays "low".
|
|
82
82
|
_MIN_CONFIDENT_SCORE = 0.5
|
|
83
|
+
# Fraction of engine's positive contribution discounted for a non-runnable artifact
|
|
84
|
+
# (P0 library de-bias): an engine-like internal core is expected of a library, so it is not
|
|
85
|
+
# discriminating. Tuned so a clear library (no app/server/servlet entry) is not confidently
|
|
86
|
+
# labeled an engine, while runnable systems (which never trigger the gate) are untouched.
|
|
87
|
+
_LIBRARY_ENGINE_DISCOUNT = 0.55
|
|
88
|
+
# Entry kinds that make a repo a runnable system (an app/server/servlet/daemon) rather
|
|
89
|
+
# than a consumable library. Used to gate the library de-bias (P0).
|
|
90
|
+
_RUNNABLE_ENTRY_KINDS = frozenset({
|
|
91
|
+
"application", "bootstrap", "main", "server", "daemon", "worker",
|
|
92
|
+
"mvc_controller", "jax_rs_controller", "servlet", "security_filter", "filter",
|
|
93
|
+
})
|
|
83
94
|
|
|
84
95
|
|
|
85
96
|
@dataclass
|
|
@@ -389,6 +400,41 @@ class ArchetypeClassifier:
|
|
|
389
400
|
f"{f.module_count} modules; distributed mass ≈ {cm['distributed']:.0%}",
|
|
390
401
|
1.5, multi, max(cm["distributed"], 0.1))
|
|
391
402
|
self._apply_graph_evidence("software_archetype", cands, f)
|
|
403
|
+
# ── Library de-bias (P0) ────────────────────────────────────────────────
|
|
404
|
+
# A consumable JVM artifact — `jar` packaging with no server/bootstrap/application
|
|
405
|
+
# entry — is a library, not a runnable system. But a library naturally exhibits
|
|
406
|
+
# engine-like topology: a few core API types with high fan-in, tightly-coupled
|
|
407
|
+
# internals (SCCs), hub concentration. Those graph metrics (`graph_*`) otherwise
|
|
408
|
+
# label every library an "engine" (observed: jobrunr → engine(high), library 0.3).
|
|
409
|
+
# Correct it transparently: (1) add a packaging-grounded library signal that does
|
|
410
|
+
# not depend on an `api/` package existing; (2) append a NAMED negative evidence row
|
|
411
|
+
# that discounts most of engine's graph-derived score, since topological hubness in
|
|
412
|
+
# a library is expected and therefore not discriminating for "engine".
|
|
413
|
+
# A runnable/web entry of ANY kind (an app bootstrap, an HTTP controller, a
|
|
414
|
+
# servlet, a daemon) means the repo is a system you run, not a library you depend
|
|
415
|
+
# on. Packaging is unreliable here (gradle libs report no packaging; maven
|
|
416
|
+
# aggregators report `pom`), so the entry-kind surface is the robust signal.
|
|
417
|
+
is_runnable = any(k in f.entry_kinds for k in _RUNNABLE_ENTRY_KINDS)
|
|
418
|
+
is_library_shaped = not is_runnable
|
|
419
|
+
if is_library_shaped:
|
|
420
|
+
add("library", "no_runnable_entry",
|
|
421
|
+
f"entry kinds {sorted(f.entry_kinds) or 'none'} — no app/server/servlet "
|
|
422
|
+
"bootstrap; a consumable artifact, not a runnable system",
|
|
423
|
+
3.0, 1.0, 0.7)
|
|
424
|
+
# A library legitimately owns an engine-like core (storage/kernel mass, hub
|
|
425
|
+
# topology, SCCs) — that is what a library *is*. Discount most of engine's
|
|
426
|
+
# positive evidence for a non-runnable artifact so its internal machinery does
|
|
427
|
+
# not, alone, promote it to "engine". Transparent: a named negative row.
|
|
428
|
+
engine_positive = sum(max(0.0, e.contribution) for e in cands["engine"])
|
|
429
|
+
if engine_positive > 0:
|
|
430
|
+
discount = engine_positive * _LIBRARY_ENGINE_DISCOUNT
|
|
431
|
+
cands["engine"].append(Evidence(
|
|
432
|
+
"library_core_discount",
|
|
433
|
+
"non-runnable artifact: an engine-like internal core (storage/kernel "
|
|
434
|
+
"mass, hubs, SCCs) is expected of a library and is not, alone, evidence "
|
|
435
|
+
"of an engine product",
|
|
436
|
+
1.0, 1.0, 1.0, -discount,
|
|
437
|
+
))
|
|
392
438
|
return self._resolve("software_archetype", cands, f)
|
|
393
439
|
|
|
394
440
|
def _architectural_style(self, f: _Features) -> DimensionResult:
|