sourcecode 1.12.0__tar.gz → 1.13.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sourcecode-1.12.0 → sourcecode-1.13.0}/PKG-INFO +1 -1
- {sourcecode-1.12.0 → sourcecode-1.13.0}/pyproject.toml +1 -1
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/__init__.py +1 -1
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/architecture_summary.py +3 -3
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/classifier.py +12 -3
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/cli.py +9 -28
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/java.py +7 -6
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/prepare_context.py +17 -3
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/serializer.py +12 -3
- {sourcecode-1.12.0 → sourcecode-1.13.0}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/.continue-here.md +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/.gitignore +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/.ruff.toml +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/CONTRIBUTING.md +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/LICENSE +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/README.md +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/SECURITY.md +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/docs/privacy.md +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/docs/schema.md +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/raw +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/run_cli.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/progress.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/redactor.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/scanner.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/schema.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/src/sourcecode/workspace.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/__init__.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/conftest.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/coverage.xml +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/fastapi_app/src/main.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/go_service/cmd/api/main.go +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/go_service/go.mod +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/jacoco.xml +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/lcov.info +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/nextjs_app/package.json +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/pom.xml +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/application/service/FindAusenteService.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/domain/entities/Ausente.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/infrastructure/rest/AusenteRestController.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/application/service/FindAutocoberturasService.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/domain/entities/Autocoberturas.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/infrastructure/rest/AutocoberturasRestController.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/application/service/FindCalendarioTrabajadorService.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/domain/entities/CalendarioTrabajador.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/infrastructure/rest/CalendarioTrabajadorRestController.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/application/service/FindDepartamentoService.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/domain/entities/Departamento.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/infrastructure/rest/DepartamentoRestController.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/application/service/FindEmpleadoService.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/domain/entities/Empleado.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/infrastructure/rest/EmpleadoRestController.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/DemoApplication.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/config/FilterConfig.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/domain/Health.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/mapper/HealthMapper.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/repository/HealthRepository.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/service/HealthService.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/HealthRestController.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/NominaRestController.java +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/resources/application-dev.yml +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/resources/application.yml +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/spring_boot_minimal/src/main/resources/mapper/HealthMapper.xml +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_architecture_analyzer.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_architecture_summary.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_ast_extractor.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_block1_reliability.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_block2_coverage.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_block5_quality.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_bug_fixes_v16.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_classifier.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_cli.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_code_notes_analyzer.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_context_scorer.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_contract_pipeline.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_coverage_parser.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_cross_consistency.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_dependency_analyzer_node_python.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_dependency_analyzer_polyglot.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_dependency_schema.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_detector_dotnet.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_detector_go_rust_java.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_detector_nodejs.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_detector_php_ruby_dart.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_detector_python.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_detector_universal_managed.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_detector_universal_systems.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_detectors_base.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_doc_analyzer_jsdom.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_doc_analyzer_python.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_graph_analyzer_polyglot.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_graph_analyzer_python_node.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_graph_schema.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_hybrid_inference.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_integration.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_integration_dependencies.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_integration_detection.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_integration_docs.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_integration_graph_modules.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_integration_lqn.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_integration_metrics.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_integration_multistack.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_integration_semantics.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_integration_universal.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_java_spring_integration.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_metrics_analyzer.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_packaging.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_phase1_improvements.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_pipeline_integrity.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_real_projects.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_redactor.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_scanner.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_schema.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_schema_normalization.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_semantic_analyzer_node.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_semantic_analyzer_python.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_semantic_import_resolution.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_semantic_schema.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_signal_hierarchy.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_summarizer.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_surface_honesty.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_telemetry.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_v1_10_regressions.py +0 -0
- {sourcecode-1.12.0 → sourcecode-1.13.0}/tests/test_workspace_analyzer.py +0 -0
|
@@ -173,7 +173,7 @@ class ArchitectureSummarizer:
|
|
|
173
173
|
fw_names = list(dict.fromkeys(fw_names))[:3] # dedup, preserve order
|
|
174
174
|
else:
|
|
175
175
|
# Filter out frameworks from auxiliary or tooling stacks (docs/, benchmarks/, etc.)
|
|
176
|
-
fw_names =
|
|
176
|
+
fw_names = list(dict.fromkeys(
|
|
177
177
|
f.name
|
|
178
178
|
for s in sm.stacks
|
|
179
179
|
if not self._is_tooling_path(s.root or "")
|
|
@@ -181,7 +181,7 @@ class ArchitectureSummarizer:
|
|
|
181
181
|
and not self._is_auxiliary_path(s.root or "")
|
|
182
182
|
and not self._is_auxiliary_path(s.workspace or "")
|
|
183
183
|
for f in s.frameworks[:2]
|
|
184
|
-
|
|
184
|
+
))[:3]
|
|
185
185
|
|
|
186
186
|
fw_str = f" using {', '.join(fw_names)}" if fw_names else ""
|
|
187
187
|
if runtime:
|
|
@@ -288,7 +288,7 @@ class ArchitectureSummarizer:
|
|
|
288
288
|
|
|
289
289
|
def _summarize_java_entry(self, path: str, content: str, stacks: list[StackDetection]) -> list[str]:
|
|
290
290
|
lines: list[str] = []
|
|
291
|
-
frameworks =
|
|
291
|
+
frameworks = list(dict.fromkeys(f.name for stack in stacks for f in stack.frameworks))
|
|
292
292
|
if frameworks:
|
|
293
293
|
lines.append(f"Frameworks detectados: {', '.join(frameworks)}.")
|
|
294
294
|
annotations = re.findall(r"@(SpringBootApplication|QuarkusMain|MicronautApplication|Application)\b", content)
|
|
@@ -150,9 +150,18 @@ class TypeClassifier:
|
|
|
150
150
|
score = {"low": 0, "medium": 1, "high": 2}.get(stack.confidence, 0)
|
|
151
151
|
manifest_weight = 1 if stack.manifests else 0
|
|
152
152
|
priority = 0
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
153
|
+
# Backend server-side stacks with manifest evidence outrank frontend stacks
|
|
154
|
+
# in fullstack projects (e.g. Java+Spring wins over nodejs+Angular).
|
|
155
|
+
if (project_type in {"fullstack", "api"}
|
|
156
|
+
and stack.stack in _API_STACKS
|
|
157
|
+
and stack.manifests):
|
|
158
|
+
priority = 4
|
|
159
|
+
elif (project_type in {"webapp", "fullstack"} and stack.stack in {"nodejs", "elixir"}
|
|
160
|
+
or project_type == "api" and stack.stack in _API_STACKS
|
|
161
|
+
or project_type == "cli" and any(
|
|
162
|
+
framework.name in _CLI_FRAMEWORKS for framework in stack.frameworks
|
|
163
|
+
)
|
|
164
|
+
or project_type == "cli" and stack.stack in {"cpp", "dotnet"}):
|
|
156
165
|
priority = 3
|
|
157
166
|
return (priority, score, manifest_weight)
|
|
158
167
|
|
|
@@ -705,6 +705,11 @@ def main(
|
|
|
705
705
|
elif mode not in _CONTRACT_MODES and mode != "raw":
|
|
706
706
|
mode = "contract" # unknown → safe default
|
|
707
707
|
|
|
708
|
+
# --changed-only forces compact output to bound size; full contract/raw scan
|
|
709
|
+
# of a large repo produces 100KB+ even with only 2 changed files.
|
|
710
|
+
if changed_only and not compact and not agent:
|
|
711
|
+
compact = True
|
|
712
|
+
|
|
708
713
|
# Legacy flags imply raw mode unless --mode was explicitly overridden.
|
|
709
714
|
# --format yaml and --graph-modules are now compatible with contract_view:
|
|
710
715
|
# yaml is a serialization format (not an output-section flag)
|
|
@@ -1498,33 +1503,6 @@ def main(
|
|
|
1498
1503
|
content = json.dumps(data, indent=2, ensure_ascii=False)
|
|
1499
1504
|
elif agent:
|
|
1500
1505
|
data = agent_view(sm)
|
|
1501
|
-
# When contract pipeline ran (mode=contract, no legacy flags), include
|
|
1502
|
-
# per-file contracts in agent output so agents get structural context.
|
|
1503
|
-
# Remove file_relevance — contracts cover this signal with more detail.
|
|
1504
|
-
if _is_contract_mode and sm.file_contracts:
|
|
1505
|
-
from sourcecode.serializer import _serialize_contract_minimal
|
|
1506
|
-
data.pop("file_relevance", None)
|
|
1507
|
-
_jvm_stacks_agent = {"java", "kotlin", "scala", "groovy"}
|
|
1508
|
-
_is_jvm_agent = any(s.stack in _jvm_stacks_agent for s in sm.stacks)
|
|
1509
|
-
_MAX_AGENT_CONTRACTS = 50 if _is_jvm_agent else 10
|
|
1510
|
-
_all_contracts = sm.file_contracts
|
|
1511
|
-
_sorted = sorted(_all_contracts, key=lambda c: getattr(c, "relevance_score", 0.0), reverse=True)
|
|
1512
|
-
_sampled = _sorted[:_MAX_AGENT_CONTRACTS]
|
|
1513
|
-
_total_contracts = len(_all_contracts)
|
|
1514
|
-
data["contracts"] = [_serialize_contract_minimal(c) for c in _sampled]
|
|
1515
|
-
data["contracts_meta"] = {
|
|
1516
|
-
"total": _total_contracts,
|
|
1517
|
-
"shown": len(_sampled),
|
|
1518
|
-
"truncated": _total_contracts > _MAX_AGENT_CONTRACTS,
|
|
1519
|
-
}
|
|
1520
|
-
if sm.contract_summary is not None:
|
|
1521
|
-
cs = sm.contract_summary
|
|
1522
|
-
data["contract_summary"] = {
|
|
1523
|
-
"files": cs.extracted_files,
|
|
1524
|
-
"total": cs.total_files,
|
|
1525
|
-
}
|
|
1526
|
-
if cs.method_breakdown:
|
|
1527
|
-
data["contract_summary"]["methods"] = cs.method_breakdown
|
|
1528
1506
|
if not no_redact:
|
|
1529
1507
|
data = redact_dict(data)
|
|
1530
1508
|
content = json.dumps(data, indent=2, ensure_ascii=False)
|
|
@@ -1701,7 +1679,10 @@ def prepare_context_cmd(
|
|
|
1701
1679
|
"project_summary": output.project_summary,
|
|
1702
1680
|
"architecture_summary": output.architecture_summary,
|
|
1703
1681
|
"confidence": output.confidence,
|
|
1704
|
-
"relevant_files": [
|
|
1682
|
+
"relevant_files": [
|
|
1683
|
+
{k: v for k, v in asdict(f).items() if v != ""}
|
|
1684
|
+
for f in output.relevant_files
|
|
1685
|
+
],
|
|
1705
1686
|
"why_these_files": output.why_these_files,
|
|
1706
1687
|
"key_dependencies": output.key_dependencies,
|
|
1707
1688
|
}
|
|
@@ -37,8 +37,9 @@ _REQUEST_METHOD_VERB_RE = re.compile(
|
|
|
37
37
|
# @M3FiltroSeguridad custom security annotation
|
|
38
38
|
_M3_FILTRO_RE = re.compile(r'@M3FiltroSeguridad\b')
|
|
39
39
|
_M3_FILTRO_PARAMS_RE = re.compile(
|
|
40
|
-
r'@M3FiltroSeguridad\s*\(\s*
|
|
41
|
-
r'(?:
|
|
40
|
+
r'@M3FiltroSeguridad\s*\(\s*'
|
|
41
|
+
r'(?:nombreRecurso\s*=\s*(?:"([^"]*)"|([\w.]+)))?' # group 1: string literal, group 2: constant ref
|
|
42
|
+
r'(?:[^)]*nivelRequerido\s*=\s*(\d+))?' # group 3: nivel
|
|
42
43
|
)
|
|
43
44
|
|
|
44
45
|
# Security config detection
|
|
@@ -391,8 +392,8 @@ class JavaDetector(AbstractDetector):
|
|
|
391
392
|
security_evidence = None
|
|
392
393
|
m3_match = _M3_FILTRO_PARAMS_RE.search(content)
|
|
393
394
|
if m3_match:
|
|
394
|
-
nombre = m3_match.group(1) or ""
|
|
395
|
-
nivel = m3_match.group(
|
|
395
|
+
nombre = m3_match.group(1) or m3_match.group(2) or ""
|
|
396
|
+
nivel = m3_match.group(3) or ""
|
|
396
397
|
security_evidence = f"@M3FiltroSeguridad(nombreRecurso={nombre!r}, nivelRequerido={nivel})"
|
|
397
398
|
return [EntryPoint(
|
|
398
399
|
path=rel_path, stack="java", kind="rest_controller",
|
|
@@ -416,8 +417,8 @@ class JavaDetector(AbstractDetector):
|
|
|
416
417
|
security_evidence = None
|
|
417
418
|
m3_match = _M3_FILTRO_PARAMS_RE.search(content)
|
|
418
419
|
if m3_match:
|
|
419
|
-
nombre = m3_match.group(1) or ""
|
|
420
|
-
nivel = m3_match.group(
|
|
420
|
+
nombre = m3_match.group(1) or m3_match.group(2) or ""
|
|
421
|
+
nivel = m3_match.group(3) or ""
|
|
421
422
|
security_evidence = f"@M3FiltroSeguridad(nombreRecurso={nombre!r}, nivelRequerido={nivel})"
|
|
422
423
|
return [EntryPoint(
|
|
423
424
|
path=rel_path, stack="java", kind="mvc_controller",
|
|
@@ -563,6 +563,15 @@ class TaskContextBuilder:
|
|
|
563
563
|
except Exception:
|
|
564
564
|
pass
|
|
565
565
|
|
|
566
|
+
# ── 5c. Delta: resolve git-changed files BEFORE ranking ───────────────
|
|
567
|
+
# For delta task, relevant_files must rank only files changed in the
|
|
568
|
+
# specified git range, not the full repo by generic entrypoint scoring.
|
|
569
|
+
_delta_files: Optional[set[str]] = None
|
|
570
|
+
if task_name == "delta":
|
|
571
|
+
_delta_raw = self._get_git_changed_files(since=since)
|
|
572
|
+
if _delta_raw:
|
|
573
|
+
_delta_files = set(_delta_raw)
|
|
574
|
+
|
|
566
575
|
# ── 5c. review-pr suspected_areas (needs git uncommitted_files) ──────
|
|
567
576
|
if task_name == "review-pr" and spec.enable_code_notes:
|
|
568
577
|
pr_areas: dict[str, int] = {}
|
|
@@ -593,6 +602,7 @@ class TaskContextBuilder:
|
|
|
593
602
|
git_hotspots=git_hotspots,
|
|
594
603
|
uncommitted_files=uncommitted_files,
|
|
595
604
|
code_notes=cn_notes_for_ranking if cn_notes_for_ranking else None,
|
|
605
|
+
delta_files=_delta_files,
|
|
596
606
|
)
|
|
597
607
|
|
|
598
608
|
# ── 7. Test gaps (generate-tests only) ────────────────────────────
|
|
@@ -640,11 +650,11 @@ class TaskContextBuilder:
|
|
|
640
650
|
rf.path: rf.reason for rf in relevant_files
|
|
641
651
|
}
|
|
642
652
|
|
|
643
|
-
# ── 10. Delta: git changed files
|
|
653
|
+
# ── 10. Delta: git changed files (reuse pre-computed set from step 5c) ──
|
|
644
654
|
changed_files: list[str] = []
|
|
645
655
|
affected_entry_points: list[str] = []
|
|
646
656
|
if task_name == "delta":
|
|
647
|
-
changed_files = self._get_git_changed_files(since=since)
|
|
657
|
+
changed_files = sorted(_delta_files) if _delta_files else self._get_git_changed_files(since=since)
|
|
648
658
|
ep_set = {ep.path for ep in entry_points}
|
|
649
659
|
affected_entry_points = [f for f in changed_files if f in ep_set]
|
|
650
660
|
|
|
@@ -746,6 +756,7 @@ class TaskContextBuilder:
|
|
|
746
756
|
git_hotspots: Optional[dict[str, int]] = None,
|
|
747
757
|
uncommitted_files: Optional[set[str]] = None,
|
|
748
758
|
code_notes: Optional[list] = None,
|
|
759
|
+
delta_files: Optional[set[str]] = None,
|
|
749
760
|
) -> list[RelevantFile]:
|
|
750
761
|
from sourcecode.ranking_engine import RankingEngine
|
|
751
762
|
from sourcecode.file_classifier import FileClassifier
|
|
@@ -791,7 +802,10 @@ class TaskContextBuilder:
|
|
|
791
802
|
|
|
792
803
|
scored: list[tuple[float, str, RelevantFile]] = []
|
|
793
804
|
|
|
794
|
-
|
|
805
|
+
# For delta task, score only files changed in the specified git range.
|
|
806
|
+
paths_to_score = [p for p in all_paths if p in delta_files] if delta_files else all_paths
|
|
807
|
+
|
|
808
|
+
for path in paths_to_score:
|
|
795
809
|
if Path(path).suffix.lower() not in _ALL_EXTENSIONS:
|
|
796
810
|
continue
|
|
797
811
|
if any(pen in path for pen in spec.ranking_penalties):
|
|
@@ -700,17 +700,26 @@ def compact_view(sm: SourceMap, *, no_tree: bool = False) -> dict[str, Any]:
|
|
|
700
700
|
for ep in ep_groups["production"][:_EP_PRODUCTION_CAP]
|
|
701
701
|
]
|
|
702
702
|
|
|
703
|
-
# Stacks —
|
|
703
|
+
# Stacks — deduplicated: for same stack name, prefer manifest over heuristic
|
|
704
|
+
_stack_best: dict[str, Any] = {}
|
|
705
|
+
for _s in sm.stacks:
|
|
706
|
+
_existing = _stack_best.get(_s.stack)
|
|
707
|
+
if _existing is None:
|
|
708
|
+
_stack_best[_s.stack] = _s
|
|
709
|
+
elif _s.detection_method != "heuristic" and _existing.detection_method == "heuristic":
|
|
710
|
+
_stack_best[_s.stack] = _s
|
|
711
|
+
elif _s.primary and not _existing.primary and _s.detection_method == _existing.detection_method:
|
|
712
|
+
_stack_best[_s.stack] = _s
|
|
704
713
|
stacks_compact = [
|
|
705
714
|
{
|
|
706
715
|
"stack": s.stack,
|
|
707
716
|
"detection_method": s.detection_method,
|
|
708
717
|
"confidence": s.confidence,
|
|
709
718
|
**({"primary": True} if s.primary else {}),
|
|
710
|
-
**({"frameworks":
|
|
719
|
+
**({"frameworks": list(dict.fromkeys(f.name for f in s.frameworks))} if s.frameworks else {}),
|
|
711
720
|
**({"package_manager": s.package_manager} if s.package_manager else {}),
|
|
712
721
|
}
|
|
713
|
-
for s in
|
|
722
|
+
for s in _stack_best.values()
|
|
714
723
|
]
|
|
715
724
|
|
|
716
725
|
# Confidence — overall only + anomalies
|
{sourcecode-1.12.0 → sourcecode-1.13.0}/.agents/skills/source-command-gsd-join-discord/SKILL.md
RENAMED
|
File without changes
|
{sourcecode-1.12.0 → sourcecode-1.13.0}/.agents/skills/source-command-gsd-review-backlog/SKILL.md
RENAMED
|
File without changes
|
{sourcecode-1.12.0 → sourcecode-1.13.0}/.agents/skills/source-command-gsd-workstreams/SKILL.md
RENAMED
|
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
|
{sourcecode-1.12.0 → sourcecode-1.13.0}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml
RENAMED
|
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
|