sourcecode 1.35.10__tar.gz → 1.35.12__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-1.35.10 → sourcecode-1.35.12}/PKG-INFO +3 -3
- {sourcecode-1.35.10 → sourcecode-1.35.12}/README.md +2 -2
- {sourcecode-1.35.10 → sourcecode-1.35.12}/pyproject.toml +1 -1
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/__init__.py +1 -1
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/cli.py +2 -55
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/mcp/registry.py +1 -12
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/serializer.py +8 -1
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/spring_security_audit.py +7 -1
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/spring_tx_analyzer.py +3 -1
- {sourcecode-1.35.10 → sourcecode-1.35.12}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/.gitignore +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/.ruff.toml +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/CHANGELOG.md +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/CONTRIBUTING.md +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/LICENSE +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/SECURITY.md +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/raw +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/cache.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/canonical_ir.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/cir_graphs.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/classifier.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/error_schema.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/flow_analyzer.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/license.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/mcp/__init__.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/mcp/onboarding/applier.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/mcp/onboarding/backup.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/mcp/onboarding/detector.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/mcp/onboarding/planner.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/mcp/orchestrator.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/mcp/runner.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/mcp/server.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/mcp_nudge.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/output_budget.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/path_filters.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/pr_comment_renderer.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/prepare_context.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/progress.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/redactor.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/repository_ir.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/ris.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/scanner.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/schema.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/spring_event_topology.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/spring_findings.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/spring_impact.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/spring_model.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/spring_semantic.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-1.35.10 → sourcecode-1.35.12}/src/sourcecode/workspace.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 1.35.
|
|
3
|
+
Version: 1.35.12
|
|
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
|
|
@@ -39,7 +39,7 @@ Description-Content-Type: text/markdown
|
|
|
39
39
|
|
|
40
40
|
**Persistent structural context and ultra-fast repeated analysis for AI coding agents.**
|
|
41
41
|
|
|
42
|
-

|
|
43
43
|

|
|
44
44
|
|
|
45
45
|
---
|
|
@@ -113,7 +113,7 @@ pipx install sourcecode
|
|
|
113
113
|
|
|
114
114
|
```bash
|
|
115
115
|
sourcecode version
|
|
116
|
-
# sourcecode 1.35.
|
|
116
|
+
# sourcecode 1.35.12
|
|
117
117
|
```
|
|
118
118
|
|
|
119
119
|
---
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**Persistent structural context and ultra-fast repeated analysis for AI coding agents.**
|
|
4
4
|
|
|
5
|
-

|
|
6
6
|

|
|
7
7
|
|
|
8
8
|
---
|
|
@@ -76,7 +76,7 @@ pipx install sourcecode
|
|
|
76
76
|
|
|
77
77
|
```bash
|
|
78
78
|
sourcecode version
|
|
79
|
-
# sourcecode 1.35.
|
|
79
|
+
# sourcecode 1.35.12
|
|
80
80
|
```
|
|
81
81
|
|
|
82
82
|
---
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "sourcecode"
|
|
7
|
-
version = "1.35.
|
|
7
|
+
version = "1.35.12"
|
|
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"
|
|
@@ -213,7 +213,7 @@ _HELP = _build_help_text()
|
|
|
213
213
|
# not consumed as a repository path.
|
|
214
214
|
_SUBCOMMANDS: frozenset[str] = frozenset(
|
|
215
215
|
{
|
|
216
|
-
"telemetry", "prepare-context", "version", "config",
|
|
216
|
+
"telemetry", "prepare-context", "version", "config",
|
|
217
217
|
"repo-ir", "mcp", "endpoints", "impact",
|
|
218
218
|
# Enterprise workflow commands
|
|
219
219
|
"onboard", "modernize", "fix-bug", "review-pr",
|
|
@@ -641,12 +641,6 @@ def main(
|
|
|
641
641
|
hidden=True,
|
|
642
642
|
help="Edge types for --graph-modules, comma-separated: imports,calls,contains,extends.",
|
|
643
643
|
),
|
|
644
|
-
no_tree: bool = typer.Option(
|
|
645
|
-
False,
|
|
646
|
-
"--no-tree",
|
|
647
|
-
hidden=True,
|
|
648
|
-
help="(Removed) No-op. File tree is excluded by default. Use --tree to include it.",
|
|
649
|
-
),
|
|
650
644
|
tree: bool = typer.Option(
|
|
651
645
|
False,
|
|
652
646
|
"--tree",
|
|
@@ -766,14 +760,6 @@ def main(
|
|
|
766
760
|
help="Limit total exported semantic nodes across all file contracts.",
|
|
767
761
|
min=1,
|
|
768
762
|
),
|
|
769
|
-
dependency_depth: int = typer.Option(
|
|
770
|
-
0,
|
|
771
|
-
"--dependency-depth",
|
|
772
|
-
hidden=True,
|
|
773
|
-
help="(Removed) Transitive resolution is not implemented. Pass 0 or omit.",
|
|
774
|
-
min=0,
|
|
775
|
-
max=5,
|
|
776
|
-
),
|
|
777
763
|
entrypoints_only: bool = typer.Option(
|
|
778
764
|
False,
|
|
779
765
|
"--entrypoints-only",
|
|
@@ -797,12 +783,6 @@ def main(
|
|
|
797
783
|
hidden=True,
|
|
798
784
|
help="Include a compact dependency graph in contract output.",
|
|
799
785
|
),
|
|
800
|
-
compress_types: bool = typer.Option(
|
|
801
|
-
False,
|
|
802
|
-
"--compress-types",
|
|
803
|
-
hidden=True,
|
|
804
|
-
help="(Removed) No observable effect when type signatures are not extracted. Omit.",
|
|
805
|
-
),
|
|
806
786
|
symbol: Optional[str] = typer.Option(
|
|
807
787
|
None,
|
|
808
788
|
"--symbol",
|
|
@@ -853,6 +833,7 @@ def main(
|
|
|
853
833
|
return
|
|
854
834
|
|
|
855
835
|
_t0 = time.monotonic()
|
|
836
|
+
no_tree: bool = False # set True by --agent; --no-tree flag removed
|
|
856
837
|
|
|
857
838
|
# Validate new flag choices
|
|
858
839
|
_MODE_CHOICES = ("contract", "minimal", "standard", "raw")
|
|
@@ -925,22 +906,6 @@ def main(
|
|
|
925
906
|
)
|
|
926
907
|
raise typer.Exit(code=2) # FIX-P2-7: arg validation → exit 2
|
|
927
908
|
|
|
928
|
-
if dependency_depth > 0:
|
|
929
|
-
typer.echo(
|
|
930
|
-
f"[warning] --dependency-depth {dependency_depth} has no effect: "
|
|
931
|
-
"transitive import resolution is not implemented for npm/yarn/pip projects. "
|
|
932
|
-
"Using depth=0 (direct dependencies only).",
|
|
933
|
-
err=True,
|
|
934
|
-
)
|
|
935
|
-
dependency_depth = 0
|
|
936
|
-
|
|
937
|
-
if compress_types:
|
|
938
|
-
typer.echo(
|
|
939
|
-
"[deprecated] --compress-types is removed: type signatures are rarely extracted "
|
|
940
|
-
"at default depth. Flag ignored.",
|
|
941
|
-
err=True,
|
|
942
|
-
)
|
|
943
|
-
|
|
944
909
|
# Pro gate for --full: removing truncation limits is enterprise-scale functionality.
|
|
945
910
|
if full:
|
|
946
911
|
from sourcecode.license import require_feature as _req_full
|
|
@@ -2174,11 +2139,9 @@ def main(
|
|
|
2174
2139
|
mode=mode,
|
|
2175
2140
|
rank_by=rank_by, # type: ignore[arg-type]
|
|
2176
2141
|
max_symbols=max_symbols,
|
|
2177
|
-
dependency_depth=dependency_depth,
|
|
2178
2142
|
entrypoints_only=entrypoints_only,
|
|
2179
2143
|
changed_only=changed_only,
|
|
2180
2144
|
symbol=symbol,
|
|
2181
|
-
compress_types=compress_types,
|
|
2182
2145
|
max_importers=max_importers,
|
|
2183
2146
|
semantic_calls=sm.semantic_calls or None,
|
|
2184
2147
|
code_notes=sm.code_notes or None,
|
|
@@ -4611,22 +4574,6 @@ def cold_start_cmd(
|
|
|
4611
4574
|
typer.echo(_out)
|
|
4612
4575
|
|
|
4613
4576
|
|
|
4614
|
-
# ── analyze (legacy alias) ────────────────────────────────────────────────────
|
|
4615
|
-
|
|
4616
|
-
@app.command("analyze", hidden=True)
|
|
4617
|
-
def analyze_cmd(
|
|
4618
|
-
path: Path = typer.Argument(Path("."), help="Repository path to analyze"),
|
|
4619
|
-
) -> None:
|
|
4620
|
-
"""[deprecated] Use: sourcecode [PATH]"""
|
|
4621
|
-
typer.echo(
|
|
4622
|
-
"Warning: 'analyze' subcommand is deprecated.\n"
|
|
4623
|
-
"Use: sourcecode .\n"
|
|
4624
|
-
" sourcecode /path/to/repo",
|
|
4625
|
-
err=True,
|
|
4626
|
-
)
|
|
4627
|
-
raise typer.Exit(code=1)
|
|
4628
|
-
|
|
4629
|
-
|
|
4630
4577
|
# ── MCP server ────────────────────────────────────────────────────────────────
|
|
4631
4578
|
|
|
4632
4579
|
@mcp_app.command("serve")
|
|
@@ -1134,17 +1134,6 @@ repo_path: absolute path to the repository (default: current working directory).
|
|
|
1134
1134
|
|
|
1135
1135
|
def _internal_specs() -> list[ToolSpec]:
|
|
1136
1136
|
return [
|
|
1137
|
-
_alias_spec(
|
|
1138
|
-
"analyze",
|
|
1139
|
-
"Hidden legacy CLI alias. Not exposed to MCP.",
|
|
1140
|
-
("analyze",),
|
|
1141
|
-
(
|
|
1142
|
-
ToolParamSpec("path", "argument", str, required=False, default=".", is_path=True),
|
|
1143
|
-
),
|
|
1144
|
-
lambda inputs: ["analyze", str(inputs.get("path", "."))],
|
|
1145
|
-
internal=True,
|
|
1146
|
-
not_exposed_to_cli=True,
|
|
1147
|
-
),
|
|
1148
1137
|
_alias_spec(
|
|
1149
1138
|
"start_session",
|
|
1150
1139
|
"Internal orchestration helper. Not exposed to MCP.",
|
|
@@ -1370,7 +1359,7 @@ def build_tool_specs() -> tuple[ToolSpec, ...]:
|
|
|
1370
1359
|
_canonical_spec_for_runtime_command(runtime)
|
|
1371
1360
|
for runtime in discover_runtime_commands()
|
|
1372
1361
|
if (runtime.callback is not None or runtime.path == ())
|
|
1373
|
-
and
|
|
1362
|
+
and not runtime.hidden
|
|
1374
1363
|
]
|
|
1375
1364
|
# Mark canonical tools that should not be served via MCP (validate_registry still checks them)
|
|
1376
1365
|
canonical = [
|
|
@@ -1090,10 +1090,14 @@ def _architecture_context(sm: SourceMap) -> dict[str, Any]:
|
|
|
1090
1090
|
if arch.limitations:
|
|
1091
1091
|
ctx["limitations"] = arch.limitations
|
|
1092
1092
|
return ctx
|
|
1093
|
+
# Promote low→medium when a real pattern was detected.
|
|
1094
|
+
# "low" in that case reflects missing docs (no OpenAPI/ADR), not structural
|
|
1095
|
+
# uncertainty — mirrors the same promotion in confidence_analyzer._compute_overall().
|
|
1096
|
+
_eff_confidence = "medium" if arch.confidence == "low" and pattern else arch.confidence
|
|
1093
1097
|
ctx = {
|
|
1094
1098
|
"summary": sm.architecture_summary,
|
|
1095
1099
|
"pattern": pattern or "insufficient_evidence",
|
|
1096
|
-
"confidence":
|
|
1100
|
+
"confidence": _eff_confidence,
|
|
1097
1101
|
"method": arch.method,
|
|
1098
1102
|
}
|
|
1099
1103
|
if arch.layers:
|
|
@@ -1197,6 +1201,9 @@ def _section_confidence(sm: SourceMap) -> dict[str, str]:
|
|
|
1197
1201
|
arch_conf = "low"
|
|
1198
1202
|
if sm.architecture is not None and sm.architecture.requested:
|
|
1199
1203
|
arch_conf = sm.architecture.confidence
|
|
1204
|
+
_arch_pattern = sm.architecture.pattern
|
|
1205
|
+
if arch_conf == "low" and _arch_pattern not in (None, "unknown", "flat"):
|
|
1206
|
+
arch_conf = "medium"
|
|
1200
1207
|
file_conf = "medium" if sm.file_paths else "low"
|
|
1201
1208
|
return {
|
|
1202
1209
|
"stack": cs.stack_confidence if cs else "low",
|
|
@@ -469,9 +469,15 @@ def run_security_audit(
|
|
|
469
469
|
|
|
470
470
|
elapsed_ms = round((time.monotonic() - t0) * 1000, 1)
|
|
471
471
|
|
|
472
|
+
_spring_detected = (
|
|
473
|
+
(model is not None and bool(model.bean_graph.beans))
|
|
474
|
+
or tx_index.stats()["total"] > 0
|
|
475
|
+
or cir.metadata.get("security_model", "unknown") != "unknown"
|
|
476
|
+
)
|
|
477
|
+
|
|
472
478
|
result = SpringAuditResult(
|
|
473
479
|
repo_id=getattr(cir, "cir_hash", "")[:16],
|
|
474
|
-
spring_detected=
|
|
480
|
+
spring_detected=_spring_detected,
|
|
475
481
|
scope="security",
|
|
476
482
|
findings=findings,
|
|
477
483
|
limitations=[
|
|
@@ -719,9 +719,11 @@ def run_tx_audit(
|
|
|
719
719
|
|
|
720
720
|
elapsed_ms = round((time.monotonic() - t0) * 1000, 1)
|
|
721
721
|
|
|
722
|
+
_spring_detected = tx_index.stats()["total"] > 0 or bool(model.bean_graph.beans)
|
|
723
|
+
|
|
722
724
|
result = SpringAuditResult(
|
|
723
725
|
repo_id=getattr(cir, "cir_hash", "")[:16],
|
|
724
|
-
spring_detected=
|
|
726
|
+
spring_detected=_spring_detected,
|
|
725
727
|
scope="tx",
|
|
726
728
|
findings=findings,
|
|
727
729
|
limitations=[
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|