sourcecode 2.0.1__tar.gz → 2.2.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.0.1 → sourcecode-2.2.0}/CHANGELOG.md +173 -3
  2. {sourcecode-2.0.1 → sourcecode-2.2.0}/CONTRIBUTING.md +3 -3
  3. sourcecode-2.2.0/PKG-INFO +241 -0
  4. sourcecode-2.2.0/README.md +203 -0
  5. {sourcecode-2.0.1 → sourcecode-2.2.0}/pyproject.toml +3 -2
  6. sourcecode-2.2.0/src/sourcecode/__init__.py +7 -0
  7. sourcecode-2.2.0/src/sourcecode/caller_metrics.py +42 -0
  8. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/cli.py +325 -207
  9. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/java.py +29 -1
  10. sourcecode-2.2.0/src/sourcecode/endpoint_metrics.py +42 -0
  11. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/explain.py +2 -0
  12. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/license.py +31 -13
  13. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/mcp/onboarding/applier.py +14 -6
  14. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/mcp/registry.py +22 -22
  15. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/mcp/runner.py +2 -2
  16. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/mcp/server.py +24 -24
  17. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/mcp_nudge.py +1 -1
  18. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/path_filters.py +2 -1
  19. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/repository_ir.py +51 -15
  20. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/ris.py +1 -1
  21. sourcecode-2.2.0/src/sourcecode/security_posture.py +608 -0
  22. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/semantic_integration_engine.py +18 -2
  23. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/serializer.py +24 -4
  24. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/spring_findings.py +4 -0
  25. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/spring_security_audit.py +31 -0
  26. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/spring_semantic.py +18 -5
  27. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/spring_tx_analyzer.py +21 -6
  28. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/telemetry/consent.py +1 -1
  29. sourcecode-2.2.0/src/sourcecode/validation_inference.py +249 -0
  30. {sourcecode-2.0.1 → sourcecode-2.2.0}/supabase/functions/README.md +1 -1
  31. sourcecode-2.0.1/PKG-INFO +0 -922
  32. sourcecode-2.0.1/README.md +0 -884
  33. sourcecode-2.0.1/src/sourcecode/__init__.py +0 -3
  34. {sourcecode-2.0.1 → sourcecode-2.2.0}/.github/workflows/build-windows.yml +0 -0
  35. {sourcecode-2.0.1 → sourcecode-2.2.0}/.gitignore +0 -0
  36. {sourcecode-2.0.1 → sourcecode-2.2.0}/.ruff.toml +0 -0
  37. {sourcecode-2.0.1 → sourcecode-2.2.0}/LICENSE +0 -0
  38. {sourcecode-2.0.1 → sourcecode-2.2.0}/SECURITY.md +0 -0
  39. {sourcecode-2.0.1 → sourcecode-2.2.0}/raw +0 -0
  40. {sourcecode-2.0.1 → sourcecode-2.2.0}/scripts/compare_integration_engines.py +0 -0
  41. {sourcecode-2.0.1 → sourcecode-2.2.0}/scripts/customer_smoke_test.sh +0 -0
  42. {sourcecode-2.0.1 → sourcecode-2.2.0}/scripts/generate_jdk_exports.py +0 -0
  43. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/adaptive_scanner.py +0 -0
  44. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/architecture_analyzer.py +0 -0
  45. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/architecture_summary.py +0 -0
  46. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/ast_extractor.py +0 -0
  47. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/cache.py +0 -0
  48. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/call_surface.py +0 -0
  49. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/canonical_ir.py +0 -0
  50. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/cir_graphs.py +0 -0
  51. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/classifier.py +0 -0
  52. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/code_notes_analyzer.py +0 -0
  53. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/confidence_analyzer.py +0 -0
  54. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/context_graph.py +0 -0
  55. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/context_scorer.py +0 -0
  56. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/context_summarizer.py +0 -0
  57. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/contract_model.py +0 -0
  58. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/contract_pipeline.py +0 -0
  59. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/coverage_parser.py +0 -0
  60. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/dependency_analyzer.py +0 -0
  61. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/__init__.py +0 -0
  62. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/base.py +0 -0
  63. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
  64. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/dart.py +0 -0
  65. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/dotnet.py +0 -0
  66. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/elixir.py +0 -0
  67. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/go.py +0 -0
  68. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/heuristic.py +0 -0
  69. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/hybrid.py +0 -0
  70. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
  71. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/nodejs.py +0 -0
  72. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/parsers.py +0 -0
  73. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/php.py +0 -0
  74. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/project.py +0 -0
  75. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/python.py +0 -0
  76. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/ruby.py +0 -0
  77. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/rust.py +0 -0
  78. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/systems.py +0 -0
  79. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/terraform.py +0 -0
  80. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/detectors/tooling.py +0 -0
  81. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/doc_analyzer.py +0 -0
  82. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/dynamic_argument_surface.py +0 -0
  83. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/endpoint_literals.py +0 -0
  84. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/entrypoint_classifier.py +0 -0
  85. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/env_analyzer.py +0 -0
  86. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/error_schema.py +0 -0
  87. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/evidence_provider.py +0 -0
  88. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/file_chunker.py +0 -0
  89. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/file_classifier.py +0 -0
  90. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/format_contract.py +0 -0
  91. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/fqn_utils.py +0 -0
  92. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/git_analyzer.py +0 -0
  93. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/graph_analyzer.py +0 -0
  94. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/hibernate_strat.py +0 -0
  95. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/jdk_exports.py +0 -0
  96. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/mcp/__init__.py +0 -0
  97. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
  98. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/mcp/onboarding/backup.py +0 -0
  99. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/mcp/onboarding/detector.py +0 -0
  100. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/mcp/onboarding/planner.py +0 -0
  101. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/mcp/orchestrator.py +0 -0
  102. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/metrics_analyzer.py +0 -0
  103. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/migrate_check.py +0 -0
  104. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/openapi_surface.py +0 -0
  105. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/output_budget.py +0 -0
  106. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/pr_comment_renderer.py +0 -0
  107. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/pr_impact.py +0 -0
  108. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/prepare_context.py +0 -0
  109. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/progress.py +0 -0
  110. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/ranking_engine.py +0 -0
  111. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/redactor.py +0 -0
  112. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/relevance_scorer.py +0 -0
  113. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/rename_refactor.py +0 -0
  114. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/repo_classifier.py +0 -0
  115. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/runtime_classifier.py +0 -0
  116. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/scanner.py +0 -0
  117. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/schema.py +0 -0
  118. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/security_config.py +0 -0
  119. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/semantic_analyzer.py +0 -0
  120. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/semantic_impact_engine.py +0 -0
  121. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/semantic_services.py +0 -0
  122. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/spring_event_topology.py +0 -0
  123. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/spring_impact.py +0 -0
  124. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/spring_model.py +0 -0
  125. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/summarizer.py +0 -0
  126. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/telemetry/__init__.py +0 -0
  127. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/telemetry/config.py +0 -0
  128. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/telemetry/events.py +0 -0
  129. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/telemetry/filters.py +0 -0
  130. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/telemetry/transport.py +0 -0
  131. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/tree_utils.py +0 -0
  132. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/type_usage_surface.py +0 -0
  133. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/validation_surface.py +0 -0
  134. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/version_check.py +0 -0
  135. {sourcecode-2.0.1 → sourcecode-2.2.0}/src/sourcecode/workspace.py +0 -0
  136. {sourcecode-2.0.1 → sourcecode-2.2.0}/supabase/functions/get-license/index.ts +0 -0
  137. {sourcecode-2.0.1 → sourcecode-2.2.0}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
  138. {sourcecode-2.0.1 → sourcecode-2.2.0}/supabase/functions/telemetry/index.ts +0 -0
  139. {sourcecode-2.0.1 → sourcecode-2.2.0}/supabase/sql/license_event_ordering.sql +0 -0
  140. {sourcecode-2.0.1 → sourcecode-2.2.0}/supabase/sql/licensing_schema.sql +0 -0
  141. {sourcecode-2.0.1 → sourcecode-2.2.0}/supabase/sql/telemetry_events.sql +0 -0
@@ -1,5 +1,133 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.2.0] — 2026-07-12
4
+
5
+ **Field-validation hardening — narrative/reporting-layer correctness across the
6
+ audit corpus.** A refute-first pass over ten real repositories fixed a batch of
7
+ mislabeling and miscount bugs where the headline framing contradicted the
8
+ structured output the engine had already produced. No Semantic IR change — every
9
+ fix is in the reporting/narrative layer and reuses facts already extracted.
10
+
11
+ ### Fixed
12
+
13
+ - **`endpoints` — modeled JAX-RS no longer double-reported as un-modeled surface
14
+ (A2).** `_build_route_surface` fully models JAX-RS, but `extract_java_endpoints`
15
+ also counted every `@Path` file into `non_spring_rest_surface{modeled:false}` and
16
+ warned "count covers Spring-MVC-annotated endpoints only" — contradicting the
17
+ JAX-RS routes just emitted (18 on eureka, 689 on keycloak). Modeled routes now
18
+ carry framework provenance (`jax_rs`/`spring_mvc`); when JAX-RS routes were
19
+ modeled, `jax_rs` is dropped from the un-modeled surface. Genuinely un-modeled
20
+ surfaces (WebScripts/Servlets, or JAX-RS that produced no route) still surface and
21
+ still warn.
22
+ - **`spring-audit` — overloaded `@Transactional` methods counted separately (A1).**
23
+ `TransactionBoundaryIndex.by_symbol` is keyed by signature-less FQN, so overloaded
24
+ methods (`findAll()` / `findAll(Pageable)`) collapsed to one entry and `stats()`
25
+ undercounted. A new `all_declared` list (one entry per site) drives the count
26
+ (petclinic 1→2, matching source); FQN-keyed lookups are unchanged.
27
+ - **`spring-audit` — per-site TX overloads no longer hidden by `by_symbol` collapse
28
+ (A1-RESIDUAL).** TX-001 (proxy-bypass) and TX-005 (exception-swallow) are per-site
29
+ checks but iterated the collapsed FQN map; a non-risky overload could overwrite a
30
+ risky one sharing an FQN, silently dropping the finding. Both now iterate
31
+ `all_declared` with a dedupe guard. Corpus TX counts unchanged (the residual was
32
+ latent).
33
+ - **`compact` — Spring Boot version surfaced from pom property (A3).** `--compact`
34
+ deployment omitted the Boot version when it lived in a `<spring.boot.version>`
35
+ property rather than the starter-parent, while `migrate-check` resolved it. The
36
+ serializer now falls back to the property-resolving detector (single source of
37
+ truth), gated on Boot presence so non-Boot repos gain no phantom version
38
+ (Broadleaf 3.5.14, consistent).
39
+ - **`endpoints` — `Map.put("/", literal)` no longer treated as a router-DSL route
40
+ (B1).** The router-DSL detector matched an HTTP-verb name + `"/"` first arg; a
41
+ plain map write (`swapChars.put("/", "slash")`) was reported as a `PUT /`
42
+ endpoint. A negative lookahead now rejects a literal second argument — a handler
43
+ is never a bare literal (openmrs 3→2, jobrunr 12/12 kept).
44
+ - **`endpoints` — test-suite module controllers excluded from entry points (B2).**
45
+ A scaffolding `@Controller` in openmrs' `test-suite` module (sources under
46
+ `src/main`) surfaced as a production entry point. Entry-point collection now uses
47
+ the broader `is_test_or_fixture_path`, and `test-suite`/`test-suites` are
48
+ recognized test-module segments (openmrs 19→18; petclinic/eureka/keycloak
49
+ unchanged).
50
+ - **`stack` — JAX-RS API surfaced in the headline stack from source annotations
51
+ (C1).** Eureka reported `project_type=library` with an empty stack despite 18
52
+ JAX-RS routes, because the manifest scan has no Jersey/Guice/jsr311 vocabulary and
53
+ (for gradle) reads only the root build file. When the `.java` scan found JAX-RS
54
+ entry points and no Jakarta EE framework was inferred, the stack now surfaces
55
+ `Jakarta EE` from the `@Path`/`@GET` evidence (eureka → `Java rest api using
56
+ Jakarta EE`). Manifest-only jsr311 still infers nothing (honesty preserved).
57
+
58
+ ### Changed
59
+
60
+ - **`modernize` — cyclic tangles distinguished from one-way deps in
61
+ `cross_module_tangles` (TANGLE-1).** A directional dependency is normal layering,
62
+ not a tangle. Each entry now carries `coupling_type` (`cyclic` when mutual, else
63
+ `directional`); the note and recommendation state only cyclic entries are real
64
+ tangles. The key is retained (mcp/USER_GUIDE/tests reference it); cyclic entries
65
+ still sort first.
66
+ - **CLI — consistent progress spinner across all long-running commands (UX-1).** The
67
+ TTY-gated progress spinner ran on only 5 code paths; the slowest commands
68
+ (`spring-audit`, `validation`, `migrate-check`, `endpoints`, `export`,
69
+ `impact-chain`, `pr-impact`, `explain`) ran silent. All 9 now show the same
70
+ stderr-only, TTY/CI-gated indicator (never pollutes stdout JSON, zero cost in CI).
71
+
72
+ ### Notes
73
+
74
+ - No breaking changes. All fixes are reporting/narrative-layer; the Semantic IR and
75
+ default JSON schemas are unchanged (`cross_module_tangles` gains an additive
76
+ `coupling_type` field). 3193 tests passing.
77
+
78
+ ## [2.1.0] — 2026-07-10
79
+
80
+ **Robustness & Security Inference — vendor-agnostic security & validation posture.**
81
+ Two new Knowledge-Layer projections let the engine reason about a repo's security
82
+ and validation *model* without prior knowledge of the framework or any per-client
83
+ configuration. Detection is structural (coverage, specificity, correlation,
84
+ request-interception topology); a config file may only raise confidence, never
85
+ drive detection. No IR change — both projections reuse facts the engine already
86
+ extracts.
87
+
88
+ ### Added
89
+
90
+ - **`spring-audit` — `security_posture` block (custom authorization inference).**
91
+ The engine now infers custom endpoint security models on a repo it has never
92
+ seen. It auto-detects a candidate custom-authorization annotation purely by
93
+ structure — an annotation outside the published open-standard baseline that
94
+ covers a systematic share of controller handlers, tracks the endpoint surface
95
+ (specificity), and correlates with a request-interception pipeline. The
96
+ concrete annotation name appears only as *evidence*, never in detection logic.
97
+ Every conclusion carries an Evidence-Confidence envelope
98
+ (`Verified | Likely | Unknown | RequiresManualReview`): detection fires at
99
+ `Likely` with no config present, and a `sourcecode.config.json` entry naming
100
+ the annotation upgrades it to `Verified`. Emits per-endpoint 4-way verdicts
101
+ (`protected_standard` / `protected_custom` / `coverage_unknown` /
102
+ `probably_exposed`) plus a request-interception ("authentication pipeline
103
+ inferred") conclusion. This kills the recurring false "N endpoints without
104
+ security" alarm on repos guarded by a bespoke gate — when a custom mechanism is
105
+ inferred, uncovered endpoints degrade to `coverage_unknown`, never a categorical
106
+ "unsecured". The related `SEC-001` finding is suppressed on any endpoint carrying
107
+ an auto-detected gate.
108
+
109
+ - **`validation` — `validation_pattern` block (present-but-unused inference).**
110
+ Instead of reporting silent zeros when a repo has no `@Valid`, the engine now
111
+ classifies the request-body validation *pattern*: `bean_validation_active`
112
+ (Verified), `bean_validation_available_unused` (Likely — a validation framework
113
+ is on the classpath and body endpoints exist but none validate), or
114
+ `no_validation_detected` (Unknown). The middle class is the real finding on
115
+ repos with many `@RequestBody` handlers and zero `@Valid`: "framework present
116
+ but unused", with a prioritized recommendation — not an empty report.
117
+
118
+ ### Notes
119
+
120
+ - Both projections are vendor-agnostic: inference predicates key only on published
121
+ open standards (`org.springframework.security`, `jakarta`/`javax.validation`,
122
+ JAX-RS), loaded as a declarative baseline table used to subtract the known
123
+ vocabulary. No proprietary annotation, framework, or naming convention appears
124
+ in any inference predicate (enforced by test).
125
+ - Manual (throw-on-bad-parameter) validation detection is intentionally deferred:
126
+ guard-clause atoms do not yet cover endpoint-kind handler bodies. See
127
+ `docs/architecture/DESIGN-robustness-security-inference.md` §2.
128
+ - No breaking changes. Default command outputs are unchanged except for the added
129
+ blocks above.
130
+
3
131
  ## [2.0.1] — 2026-07-10
4
132
 
5
133
  ### Added
@@ -18,14 +146,56 @@
18
146
  a logo block (`<img>` / `<p>` HTML) or use inline markdown links (`[label](url)`) had
19
147
  produced summaries like `API: <img src="…"/>`. The summary is now rendered to clean prose
20
148
  — HTML/badge blocks are skipped and inline links are unwrapped to their label.
21
- - **More complete blast radius in `impact` and `review-pr`.** Change-impact analysis now
22
- surfaces every affected entry point for a changed repository/service, reducing missed
23
- callers on interface- and DI-wired code.
24
149
 
25
150
  ### Notes
26
151
 
27
152
  - No breaking changes. Default command outputs are unchanged except where explicitly noted.
28
153
 
154
+ ## [2.0.0] — 2026-07-06
155
+
156
+ **ASK Engine 2.0** — the product identity is now final. The engine is unchanged;
157
+ this major marks the CLI/product rename and is fully backward compatible.
158
+
159
+ ### Changed — canonical command is now `ask`
160
+
161
+ - **`ask` is the canonical CLI command.** `ask impact`, `ask migrate-check`,
162
+ `ask review-pr`, `ask mcp init`, `ask activate …` — one short verb that matches
163
+ the product name (ASK Engine).
164
+ - **`sourcecode` becomes a deprecated compatibility alias.** It keeps working
165
+ (same single implementation, `prog_name` pinned to `ask`), prints a one-line
166
+ deprecation notice **only on an interactive terminal**, and forwards to `ask`.
167
+ Pipes and agents that still call `sourcecode` get byte-identical stdout **and**
168
+ clean (JSON-only) stderr — the machine contract is unchanged. The alias will be
169
+ removed in a future major.
170
+ - **New welcome wordmark**: a large `ASK` block with an `E N G I N E` label
171
+ replaces the old `SOURCE`/`CODE` banner. Help and banners read `CLI: ask`.
172
+ - **Config home moved to `~/.ask`** (canonical writes); the legacy `~/.sourcecode`
173
+ is still read as a fallback, so **no existing user loses their license or config**.
174
+ Cache dir (`.sourcecode-cache/`) and `SOURCECODE_*` env vars are unchanged.
175
+ - **MCP**: `ask mcp init` registers the client entry under `ask`; a pre-existing
176
+ `sourcecode` entry is recognized and migrated (and both are removed on
177
+ `mcp remove`).
178
+ - **Docs**: README, user guide, manual, tiers, demo and onboarding now say
179
+ **ASK Engine** and use `ask …` in every example. Package/install/config and
180
+ compatibility references are preserved and the compatibility strategy is
181
+ documented in `docs/PRODUCT_IDENTITY.md` (normative).
182
+
183
+ ### Compatibility
184
+
185
+ - **PyPI/Homebrew distribution stays `sourcecode` this release**; installing it
186
+ provides both the `ask` and `sourcecode` commands. Renaming the distribution to
187
+ `ask-engine` is a separate, explicitly-breaking future change.
188
+ - Python package/import name (`sourcecode`), MCP protocol identity, cache format,
189
+ and all serialized/JSON outputs are unchanged.
190
+
191
+ ### Also in this line (identity + precision, pre-2.0 increments)
192
+
193
+ - **Impact/`review-pr`**: a changed repository/service now surfaces **every**
194
+ affected entry point (controller) instead of collapsing an N-controller blast
195
+ radius to one — bounded by `max_impacts`, no new semantic fact, hash-neutral.
196
+ - **Product identity consolidation**: audited every `sourcecode` occurrence and
197
+ established `docs/PRODUCT_IDENTITY.md` as the normative product↔CLI mapping.
198
+
29
199
  ## [1.73.0] — 2026-07-01
30
200
 
31
201
  ### Fixed — audit reliability on a large non-Boot Spring monolith (Alfresco Community Repo field test)
@@ -30,8 +30,8 @@ This installs `sourcecode` in editable mode with all development dependencies (`
30
30
  ### Run the CLI locally
31
31
 
32
32
  ```bash
33
- sourcecode . --agent
34
- sourcecode . prepare-context explain
33
+ ask . --agent
34
+ ask . prepare-context explain
35
35
  ```
36
36
 
37
37
  ### Run tests
@@ -150,7 +150,7 @@ Keep commits atomic. One logical change per commit.
150
150
  ## Reporting bugs
151
151
 
152
152
  Open an issue with:
153
- - `sourcecode --version` output
153
+ - `ask --version` output
154
154
  - Command you ran
155
155
  - Expected behavior
156
156
  - Actual behavior / error output
@@ -0,0 +1,241 @@
1
+ Metadata-Version: 2.4
2
+ Name: sourcecode
3
+ Version: 2.2.0
4
+ Summary: Persistent structural context and ultra-fast repeated analysis for AI coding agents
5
+ License-File: LICENSE
6
+ Keywords: agents,ai,codebase,context,developer-tools,llm
7
+ Classifier: Development Status :: 4 - Beta
8
+ Classifier: Environment :: Console
9
+ Classifier: Intended Audience :: Developers
10
+ Classifier: License :: OSI Approved :: Apache Software License
11
+ Classifier: Operating System :: OS Independent
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.9
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
18
+ Classifier: Topic :: Utilities
19
+ Requires-Python: >=3.9
20
+ Requires-Dist: defusedxml>=0.7
21
+ Requires-Dist: mcp>=1.0.0
22
+ Requires-Dist: pathspec>=1.0
23
+ Requires-Dist: ruamel-yaml>=0.18
24
+ Requires-Dist: tomli>=2.0; python_version < '3.11'
25
+ Requires-Dist: typer>=0.24
26
+ Provides-Extra: ast
27
+ Requires-Dist: tree-sitter-javascript>=0.21; extra == 'ast'
28
+ Requires-Dist: tree-sitter-typescript>=0.21; extra == 'ast'
29
+ Requires-Dist: tree-sitter>=0.21; extra == 'ast'
30
+ Provides-Extra: dev
31
+ Requires-Dist: mcp>=1.0.0; extra == 'dev'
32
+ Requires-Dist: mypy>=1.10; extra == 'dev'
33
+ Requires-Dist: pytest>=8; extra == 'dev'
34
+ Requires-Dist: ruff>=0.15; extra == 'dev'
35
+ Provides-Extra: mcp
36
+ Requires-Dist: mcp>=1.0.0; extra == 'mcp'
37
+ Description-Content-Type: text/markdown
38
+
39
+ # ASK Engine
40
+
41
+ > **ASK — Actionable Software Knowledge.** Persistent structural intelligence for AI coding agents.
42
+
43
+ **Context · Impact · Migration · Architecture · Review — everything from one structural model.**
44
+
45
+ ![Version](https://img.shields.io/badge/version-2.2.0-blue)
46
+ ![Python](https://img.shields.io/badge/python-3.9%2B-green)
47
+
48
+ > **ASK Engine** is the product. The CLI command is **`ask`**. The legacy **`sourcecode`**
49
+ > command still works as a deprecated alias (it prints a one-line notice and forwards to
50
+ > `ask`) and remains the Python/PyPI package name for now. The authoritative version is
51
+ > whatever `ask version` reports. See [docs/PRODUCT_IDENTITY.md](docs/PRODUCT_IDENTITY.md).
52
+
53
+ ---
54
+
55
+ ## The problem
56
+
57
+ Every time an AI coding agent starts a new session, it has to re-parse the repository from scratch. For a large Java or TypeScript monolith, that means 5–15 seconds per invocation. Multiply by dozens of agent turns per hour, and repo context acquisition becomes a real bottleneck — not just latency, but tokens, compute, and iteration velocity.
58
+
59
+ ASK Engine solves this with a persistent structural cache keyed on file content hashes. After the first scan, every subsequent invocation returns pre-built context in milliseconds. The repo doesn't change? The cache doesn't expire.
60
+
61
+ **The cache is not a performance optimization. It is what makes ASK Engine usable as infrastructure rather than a one-off tool.**
62
+
63
+ ---
64
+
65
+ ## Proof — measured on real repos
66
+
67
+ | Repo | Size | Cold scan | Cache hit | Speedup |
68
+ |------|------|-----------|-----------|---------|
69
+ | Keycloak | 7,885 Java files | 10.5s | 0.6s | **~17x** |
70
+ | BroadleafCommerce | 2,985 Java files | 2.7s | 0.3s | **~9x** |
71
+
72
+ Cache keyed on content hashes — invalidated only when source changes. On repeated agent sessions against the same codebase, nearly every invocation is a cache hit.
73
+
74
+ At 0.3s per call, ASK Engine becomes **constant infrastructure** inside agent loops — call it before every edit, every PR review, every test run, without batching or caching manually.
75
+
76
+ ---
77
+
78
+ ## Install
79
+
80
+ ```bash
81
+ # Homebrew (macOS / Linux)
82
+ brew tap haroundominique/sourcecode && brew install sourcecode
83
+
84
+ # pip / pipx
85
+ pipx install sourcecode # or: pip install sourcecode
86
+
87
+ ask version # ask 2.2.0
88
+ ```
89
+
90
+ > **Package vs. command.** The install package is named `sourcecode` this release
91
+ > (renaming the distribution is a separate, breaking change). Installing it gives you the
92
+ > canonical **`ask`** command plus the deprecated **`sourcecode`** alias.
93
+
94
+ ---
95
+
96
+ ## Quickstart
97
+
98
+ ```bash
99
+ # High-signal structural summary — warm cache ~0.3s, cold 2–10s
100
+ ask --compact
101
+
102
+ # Blast radius: what breaks if this class changes?
103
+ ask impact OrderService /path/to/repo
104
+
105
+ # Spring Boot 2→3 migration readiness (bounded decision summary)
106
+ ask migrate-check /path/to/repo --compact
107
+
108
+ # Spring semantic audit: TX anomalies + security surface
109
+ ask spring-audit /path/to/repo
110
+
111
+ # Onboard to an unfamiliar codebase
112
+ ask onboard /path/to/repo
113
+
114
+ # PR review: risk, test gaps, changed modules
115
+ ask review-pr /path/to/repo --since main
116
+ ```
117
+
118
+ Full command reference: **[docs/USER_GUIDE.md](docs/USER_GUIDE.md)**.
119
+
120
+ ---
121
+
122
+ ## Capabilities
123
+
124
+ Everything is computed from one cached structural model. Seven groups:
125
+
126
+ ### 1 · Structural Context
127
+ Bounded, noise-free repo context designed to drop straight into an agent's context window.
128
+ `ask --compact` · `ask --agent` · `ask onboard` · `ask cold-start`
129
+ → [reference](docs/USER_GUIDE.md#core-commands)
130
+
131
+ ### 2 · Impact Analysis
132
+ Blast radius from a class or interface — reverse dependencies, through Spring DI, to the HTTP endpoints a change reaches.
133
+ `ask impact` · `ask impact-chain` (TX/SEC-enriched) · `ask pr-impact`
134
+ → [reference](docs/USER_GUIDE.md#core-commands)
135
+
136
+ ### 3 · Architecture Intelligence
137
+ The system map: module graph, dependency views, REST surface, per-class summaries, and a symbol-level IR for downstream tooling.
138
+ `ask export` · `ask repo-ir` · `ask endpoints` · `ask explain`
139
+ → [reference](docs/USER_GUIDE.md#core-commands)
140
+
141
+ ### 4 · Migration & Modernization
142
+ Is this codebase ready to upgrade? Per-dimension readiness (Jakarta / Spring Boot / JDK / Hibernate), located blockers, and an effort estimate.
143
+ `ask migrate-check` · `ask modernize`
144
+ → [migrate-check reference](docs/migrate-check.md) · [MODERNIZATION.md](docs/MODERNIZATION.md)
145
+
146
+ ### 5 · Spring Analysis
147
+ Deterministic Spring semantics: transactional anomalies (e.g. `@Transactional` on a private method = silent CGLIB no-op), security surface, request-body validation.
148
+ `ask spring-audit` · `ask validation`
149
+ → [reference](docs/USER_GUIDE.md#core-commands)
150
+
151
+ ### 6 · Developer Workflows
152
+ The everyday loop: diff-based PR review, symptom-driven bug triage, and delta context for continuous agent runs.
153
+ `ask review-pr` · `ask fix-bug` · `ask prepare-context`
154
+ → [reference](docs/USER_GUIDE.md#typical-workflows)
155
+
156
+ ### 7 · Utilities
157
+ `ask rename-class` (word-boundary Java rename) · `ask chunk-file` (split large files for agents) · `ask cache` (status / warm / clear / freshness)
158
+ → [reference](docs/USER_GUIDE.md)
159
+
160
+ ---
161
+
162
+ ## What it does — and doesn't
163
+
164
+ **ASK Engine reduces exploration cost.** It accelerates context acquisition and computes
165
+ blast radius; it does not replace reading code — it reduces how often an agent needs to.
166
+ All signals are **static and deterministic** (annotations, import graph, file structure) —
167
+ no runtime analysis, no LLM guessing.
168
+
169
+ Honest limits worth knowing before you rely on it:
170
+
171
+ - `impact` on an **implementation** class (`OrderServiceImpl`) returns 0 callers in Spring Boot — callers inject the interface. **Always target the interface.**
172
+ - `no_security_signal` on an endpoint means *no recognized method-level annotation*, **not** "unsecured" — Spring Security filter chains and custom authorization annotations show as `no_security_signal` unless taught via config (below).
173
+ - `spring-audit` / `impact-chain` are **Java/Spring only**; non-Java repos return `spring_detected: false`.
174
+ - Event topology (`--type events`) resolves Spring `ApplicationEvent` / `@EventListener` chains only — **not** Kafka/RabbitMQ/Redis routes.
175
+ - Architecture classification is tuned for Spring MVC layered apps; SPI/plugin models (e.g. Quarkus extensions) may be misclassified. JAX-RS subresource-locator endpoint recall is ~65%.
176
+ - Self-invocation `@Transactional` bypass (same-class call skipping the proxy) is not detected.
177
+
178
+ ---
179
+
180
+ ## Pricing
181
+
182
+ > **🎉 Early-adoption: Pro is currently unlocked for everyone.** Every install runs with
183
+ > full Pro entitlements — no size gate, no key. The tiers below describe the model the
184
+ > paywall will return to later.
185
+
186
+ **Gating is by repo size and automation — never by command.** Every command runs at full
187
+ power on Free for small and mid-size repos; you upgrade when the work gets bigger or automated.
188
+
189
+ | | **Free** — €0 | **Pro** — €19/mo · €190/yr per dev |
190
+ |---|---|---|
191
+ | Repo size | ≤ 500 Java source files | **> 500 Java files** (enterprise monoliths) |
192
+ | Commands | All of them, full output | Same commands, unlocked at scale |
193
+ | `impact` / `fix-bug` / `review-pr` / `modernize` | ✅ full on small repos | ✅ full on large repos (Free gets a capped preview) |
194
+ | `prepare-context delta` | 30 free runs/repo | unlimited — CI/CD automation |
195
+ | MCP local server, offline, no data egress | ✅ | ✅ |
196
+
197
+ **Non-Java repos are free at any size** — the size limit counts Java source files only.
198
+ ASK Engine monetises enterprise Java monoliths. Activate with `ask activate <key>`.
199
+ Full breakdown: [docs/PRODUCT_TIERS.md](docs/PRODUCT_TIERS.md).
200
+
201
+ ---
202
+
203
+ ## Configuration & privacy
204
+
205
+ ```bash
206
+ ask config # version, config file path, telemetry status
207
+ ask telemetry disable # anonymous telemetry is on by default (opt-out)
208
+ ```
209
+
210
+ Telemetry collects version, OS, commands, flags, duration, repo-size range, and errors —
211
+ **no source code, paths, secrets, or output**. Disable any time with
212
+ `export SOURCECODE_TELEMETRY=0` (or `DO_NOT_TRACK=1`).
213
+
214
+ **Custom security annotations.** Teach `endpoints`, `spring-audit`, and `explain` about
215
+ project-specific authorization annotations via an optional `sourcecode.config.json` at the
216
+ repo root (otherwise they report `policy: "none_detected"`):
217
+
218
+ ```json
219
+ {
220
+ "customSecurityAnnotations": [
221
+ { "fullyQualifiedName": "com.example.security.M3FiltroSeguridad", "shortName": "M3FiltroSeguridad" }
222
+ ]
223
+ }
224
+ ```
225
+
226
+ Matching endpoints report `policy: "custom"` and drop out of the `no_security_signal` count.
227
+
228
+ ---
229
+
230
+ ## Documentation
231
+
232
+ | Doc | What it covers |
233
+ |-----|----------------|
234
+ | [USER_GUIDE.md](docs/USER_GUIDE.md) | Full command reference, flags, output schema, workflows |
235
+ | [migrate-check.md](docs/migrate-check.md) | Migration rule catalogue (MIG-001..043) + Hibernate stratification |
236
+ | [MODERNIZATION.md](docs/MODERNIZATION.md) | The modernization product: assess → understand → plan → execute |
237
+ | [PRODUCT_TIERS.md](docs/PRODUCT_TIERS.md) | Free vs Pro, pricing model |
238
+ | [DEMO-5MIN.md](docs/DEMO-5MIN.md) | A reproducible 5-minute demo |
239
+ | [MANUAL-USUARIO.md](docs/MANUAL-USUARIO.md) | Guía de usuario en español |
240
+ | [PRODUCT_IDENTITY.md](docs/PRODUCT_IDENTITY.md) | `ask` (command) vs `sourcecode` (package/alias) |
241
+ | [privacy.md](docs/privacy.md) | Telemetry and data-handling policy |
@@ -0,0 +1,203 @@
1
+ # ASK Engine
2
+
3
+ > **ASK — Actionable Software Knowledge.** Persistent structural intelligence for AI coding agents.
4
+
5
+ **Context · Impact · Migration · Architecture · Review — everything from one structural model.**
6
+
7
+ ![Version](https://img.shields.io/badge/version-2.2.0-blue)
8
+ ![Python](https://img.shields.io/badge/python-3.9%2B-green)
9
+
10
+ > **ASK Engine** is the product. The CLI command is **`ask`**. The legacy **`sourcecode`**
11
+ > command still works as a deprecated alias (it prints a one-line notice and forwards to
12
+ > `ask`) and remains the Python/PyPI package name for now. The authoritative version is
13
+ > whatever `ask version` reports. See [docs/PRODUCT_IDENTITY.md](docs/PRODUCT_IDENTITY.md).
14
+
15
+ ---
16
+
17
+ ## The problem
18
+
19
+ Every time an AI coding agent starts a new session, it has to re-parse the repository from scratch. For a large Java or TypeScript monolith, that means 5–15 seconds per invocation. Multiply by dozens of agent turns per hour, and repo context acquisition becomes a real bottleneck — not just latency, but tokens, compute, and iteration velocity.
20
+
21
+ ASK Engine solves this with a persistent structural cache keyed on file content hashes. After the first scan, every subsequent invocation returns pre-built context in milliseconds. The repo doesn't change? The cache doesn't expire.
22
+
23
+ **The cache is not a performance optimization. It is what makes ASK Engine usable as infrastructure rather than a one-off tool.**
24
+
25
+ ---
26
+
27
+ ## Proof — measured on real repos
28
+
29
+ | Repo | Size | Cold scan | Cache hit | Speedup |
30
+ |------|------|-----------|-----------|---------|
31
+ | Keycloak | 7,885 Java files | 10.5s | 0.6s | **~17x** |
32
+ | BroadleafCommerce | 2,985 Java files | 2.7s | 0.3s | **~9x** |
33
+
34
+ Cache keyed on content hashes — invalidated only when source changes. On repeated agent sessions against the same codebase, nearly every invocation is a cache hit.
35
+
36
+ At 0.3s per call, ASK Engine becomes **constant infrastructure** inside agent loops — call it before every edit, every PR review, every test run, without batching or caching manually.
37
+
38
+ ---
39
+
40
+ ## Install
41
+
42
+ ```bash
43
+ # Homebrew (macOS / Linux)
44
+ brew tap haroundominique/sourcecode && brew install sourcecode
45
+
46
+ # pip / pipx
47
+ pipx install sourcecode # or: pip install sourcecode
48
+
49
+ ask version # ask 2.2.0
50
+ ```
51
+
52
+ > **Package vs. command.** The install package is named `sourcecode` this release
53
+ > (renaming the distribution is a separate, breaking change). Installing it gives you the
54
+ > canonical **`ask`** command plus the deprecated **`sourcecode`** alias.
55
+
56
+ ---
57
+
58
+ ## Quickstart
59
+
60
+ ```bash
61
+ # High-signal structural summary — warm cache ~0.3s, cold 2–10s
62
+ ask --compact
63
+
64
+ # Blast radius: what breaks if this class changes?
65
+ ask impact OrderService /path/to/repo
66
+
67
+ # Spring Boot 2→3 migration readiness (bounded decision summary)
68
+ ask migrate-check /path/to/repo --compact
69
+
70
+ # Spring semantic audit: TX anomalies + security surface
71
+ ask spring-audit /path/to/repo
72
+
73
+ # Onboard to an unfamiliar codebase
74
+ ask onboard /path/to/repo
75
+
76
+ # PR review: risk, test gaps, changed modules
77
+ ask review-pr /path/to/repo --since main
78
+ ```
79
+
80
+ Full command reference: **[docs/USER_GUIDE.md](docs/USER_GUIDE.md)**.
81
+
82
+ ---
83
+
84
+ ## Capabilities
85
+
86
+ Everything is computed from one cached structural model. Seven groups:
87
+
88
+ ### 1 · Structural Context
89
+ Bounded, noise-free repo context designed to drop straight into an agent's context window.
90
+ `ask --compact` · `ask --agent` · `ask onboard` · `ask cold-start`
91
+ → [reference](docs/USER_GUIDE.md#core-commands)
92
+
93
+ ### 2 · Impact Analysis
94
+ Blast radius from a class or interface — reverse dependencies, through Spring DI, to the HTTP endpoints a change reaches.
95
+ `ask impact` · `ask impact-chain` (TX/SEC-enriched) · `ask pr-impact`
96
+ → [reference](docs/USER_GUIDE.md#core-commands)
97
+
98
+ ### 3 · Architecture Intelligence
99
+ The system map: module graph, dependency views, REST surface, per-class summaries, and a symbol-level IR for downstream tooling.
100
+ `ask export` · `ask repo-ir` · `ask endpoints` · `ask explain`
101
+ → [reference](docs/USER_GUIDE.md#core-commands)
102
+
103
+ ### 4 · Migration & Modernization
104
+ Is this codebase ready to upgrade? Per-dimension readiness (Jakarta / Spring Boot / JDK / Hibernate), located blockers, and an effort estimate.
105
+ `ask migrate-check` · `ask modernize`
106
+ → [migrate-check reference](docs/migrate-check.md) · [MODERNIZATION.md](docs/MODERNIZATION.md)
107
+
108
+ ### 5 · Spring Analysis
109
+ Deterministic Spring semantics: transactional anomalies (e.g. `@Transactional` on a private method = silent CGLIB no-op), security surface, request-body validation.
110
+ `ask spring-audit` · `ask validation`
111
+ → [reference](docs/USER_GUIDE.md#core-commands)
112
+
113
+ ### 6 · Developer Workflows
114
+ The everyday loop: diff-based PR review, symptom-driven bug triage, and delta context for continuous agent runs.
115
+ `ask review-pr` · `ask fix-bug` · `ask prepare-context`
116
+ → [reference](docs/USER_GUIDE.md#typical-workflows)
117
+
118
+ ### 7 · Utilities
119
+ `ask rename-class` (word-boundary Java rename) · `ask chunk-file` (split large files for agents) · `ask cache` (status / warm / clear / freshness)
120
+ → [reference](docs/USER_GUIDE.md)
121
+
122
+ ---
123
+
124
+ ## What it does — and doesn't
125
+
126
+ **ASK Engine reduces exploration cost.** It accelerates context acquisition and computes
127
+ blast radius; it does not replace reading code — it reduces how often an agent needs to.
128
+ All signals are **static and deterministic** (annotations, import graph, file structure) —
129
+ no runtime analysis, no LLM guessing.
130
+
131
+ Honest limits worth knowing before you rely on it:
132
+
133
+ - `impact` on an **implementation** class (`OrderServiceImpl`) returns 0 callers in Spring Boot — callers inject the interface. **Always target the interface.**
134
+ - `no_security_signal` on an endpoint means *no recognized method-level annotation*, **not** "unsecured" — Spring Security filter chains and custom authorization annotations show as `no_security_signal` unless taught via config (below).
135
+ - `spring-audit` / `impact-chain` are **Java/Spring only**; non-Java repos return `spring_detected: false`.
136
+ - Event topology (`--type events`) resolves Spring `ApplicationEvent` / `@EventListener` chains only — **not** Kafka/RabbitMQ/Redis routes.
137
+ - Architecture classification is tuned for Spring MVC layered apps; SPI/plugin models (e.g. Quarkus extensions) may be misclassified. JAX-RS subresource-locator endpoint recall is ~65%.
138
+ - Self-invocation `@Transactional` bypass (same-class call skipping the proxy) is not detected.
139
+
140
+ ---
141
+
142
+ ## Pricing
143
+
144
+ > **🎉 Early-adoption: Pro is currently unlocked for everyone.** Every install runs with
145
+ > full Pro entitlements — no size gate, no key. The tiers below describe the model the
146
+ > paywall will return to later.
147
+
148
+ **Gating is by repo size and automation — never by command.** Every command runs at full
149
+ power on Free for small and mid-size repos; you upgrade when the work gets bigger or automated.
150
+
151
+ | | **Free** — €0 | **Pro** — €19/mo · €190/yr per dev |
152
+ |---|---|---|
153
+ | Repo size | ≤ 500 Java source files | **> 500 Java files** (enterprise monoliths) |
154
+ | Commands | All of them, full output | Same commands, unlocked at scale |
155
+ | `impact` / `fix-bug` / `review-pr` / `modernize` | ✅ full on small repos | ✅ full on large repos (Free gets a capped preview) |
156
+ | `prepare-context delta` | 30 free runs/repo | unlimited — CI/CD automation |
157
+ | MCP local server, offline, no data egress | ✅ | ✅ |
158
+
159
+ **Non-Java repos are free at any size** — the size limit counts Java source files only.
160
+ ASK Engine monetises enterprise Java monoliths. Activate with `ask activate <key>`.
161
+ Full breakdown: [docs/PRODUCT_TIERS.md](docs/PRODUCT_TIERS.md).
162
+
163
+ ---
164
+
165
+ ## Configuration & privacy
166
+
167
+ ```bash
168
+ ask config # version, config file path, telemetry status
169
+ ask telemetry disable # anonymous telemetry is on by default (opt-out)
170
+ ```
171
+
172
+ Telemetry collects version, OS, commands, flags, duration, repo-size range, and errors —
173
+ **no source code, paths, secrets, or output**. Disable any time with
174
+ `export SOURCECODE_TELEMETRY=0` (or `DO_NOT_TRACK=1`).
175
+
176
+ **Custom security annotations.** Teach `endpoints`, `spring-audit`, and `explain` about
177
+ project-specific authorization annotations via an optional `sourcecode.config.json` at the
178
+ repo root (otherwise they report `policy: "none_detected"`):
179
+
180
+ ```json
181
+ {
182
+ "customSecurityAnnotations": [
183
+ { "fullyQualifiedName": "com.example.security.M3FiltroSeguridad", "shortName": "M3FiltroSeguridad" }
184
+ ]
185
+ }
186
+ ```
187
+
188
+ Matching endpoints report `policy: "custom"` and drop out of the `no_security_signal` count.
189
+
190
+ ---
191
+
192
+ ## Documentation
193
+
194
+ | Doc | What it covers |
195
+ |-----|----------------|
196
+ | [USER_GUIDE.md](docs/USER_GUIDE.md) | Full command reference, flags, output schema, workflows |
197
+ | [migrate-check.md](docs/migrate-check.md) | Migration rule catalogue (MIG-001..043) + Hibernate stratification |
198
+ | [MODERNIZATION.md](docs/MODERNIZATION.md) | The modernization product: assess → understand → plan → execute |
199
+ | [PRODUCT_TIERS.md](docs/PRODUCT_TIERS.md) | Free vs Pro, pricing model |
200
+ | [DEMO-5MIN.md](docs/DEMO-5MIN.md) | A reproducible 5-minute demo |
201
+ | [MANUAL-USUARIO.md](docs/MANUAL-USUARIO.md) | Guía de usuario en español |
202
+ | [PRODUCT_IDENTITY.md](docs/PRODUCT_IDENTITY.md) | `ask` (command) vs `sourcecode` (package/alias) |
203
+ | [privacy.md](docs/privacy.md) | Telemetry and data-handling policy |
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sourcecode"
7
- version = "2.0.1"
7
+ version = "2.2.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"
@@ -35,7 +35,8 @@ dependencies = [
35
35
  ]
36
36
 
37
37
  [project.scripts]
38
- sourcecode = "sourcecode.cli:main_entry"
38
+ ask = "sourcecode.cli:main_entry"
39
+ sourcecode = "sourcecode.cli:main_entry" # deprecated compat alias — removed in a future major
39
40
 
40
41
  [project.optional-dependencies]
41
42
  dev = [