sourcecode 1.17.0__tar.gz → 1.19.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.19.0/.continue-here.md +178 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/PKG-INFO +3 -3
- {sourcecode-1.17.0 → sourcecode-1.19.0}/README.md +2 -2
- {sourcecode-1.17.0 → sourcecode-1.19.0}/pyproject.toml +1 -1
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/__init__.py +1 -1
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/prepare_context.py +66 -4
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/serializer.py +93 -13
- sourcecode-1.17.0/.continue-here.md +0 -125
- {sourcecode-1.17.0 → sourcecode-1.19.0}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/.gitignore +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/.ruff.toml +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/CONTRIBUTING.md +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/LICENSE +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/SECURITY.md +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/docs/privacy.md +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/docs/schema.md +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/raw +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/run_cli.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/classifier.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/cli.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/progress.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/redactor.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/scanner.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/schema.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/src/sourcecode/workspace.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/__init__.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/conftest.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/coverage.xml +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/fastapi_app/src/main.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/go_service/cmd/api/main.go +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/go_service/go.mod +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/jacoco.xml +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/latin1_sample.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/latin1_sample_iso.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/lcov.info +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/nextjs_app/package.json +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/pom.xml +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/application/service/FindAusenteService.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/domain/entities/Ausente.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/infrastructure/rest/AusenteRestController.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/application/service/FindAutocoberturasService.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/domain/entities/Autocoberturas.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/infrastructure/rest/AutocoberturasRestController.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/application/service/FindCalendarioTrabajadorService.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/domain/entities/CalendarioTrabajador.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/infrastructure/rest/CalendarioTrabajadorRestController.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/application/service/FindDepartamentoService.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/domain/entities/Departamento.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/infrastructure/rest/DepartamentoRestController.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/application/service/FindEmpleadoService.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/domain/entities/Empleado.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/infrastructure/rest/EmpleadoRestController.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/DemoApplication.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/config/FilterConfig.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/domain/Health.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/mapper/HealthMapper.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/repository/HealthRepository.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/service/HealthService.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/HealthRestController.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/NominaRestController.java +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/resources/application-dev.yml +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/resources/application.yml +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/fixtures/spring_boot_minimal/src/main/resources/mapper/HealthMapper.xml +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_architecture_analyzer.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_architecture_summary.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_ast_extractor.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_block1_reliability.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_block2_coverage.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_block5_quality.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_bug_fixes_v16.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_classifier.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_cli.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_code_notes_analyzer.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_context_scorer.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_contract_pipeline.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_coverage_parser.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_cross_consistency.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_dependency_analyzer_node_python.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_dependency_analyzer_polyglot.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_dependency_schema.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_detector_dotnet.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_detector_go_rust_java.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_detector_nodejs.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_detector_php_ruby_dart.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_detector_python.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_detector_universal_managed.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_detector_universal_systems.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_detectors_base.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_doc_analyzer_jsdom.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_doc_analyzer_python.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_encoding_regression.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_graph_analyzer_polyglot.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_graph_analyzer_python_node.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_graph_schema.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_hybrid_inference.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_integration.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_integration_dependencies.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_integration_detection.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_integration_docs.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_integration_graph_modules.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_integration_lqn.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_integration_metrics.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_integration_multistack.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_integration_semantics.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_integration_universal.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_java_spring_integration.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_metrics_analyzer.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_packaging.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_phase1_improvements.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_pipeline_integrity.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_real_projects.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_redactor.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_scanner.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_schema.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_schema_normalization.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_semantic_analyzer_node.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_semantic_analyzer_python.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_semantic_import_resolution.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_semantic_schema.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_signal_hierarchy.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_summarizer.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_surface_honesty.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_task_differentiation.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_telemetry.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_v1_10_regressions.py +0 -0
- {sourcecode-1.17.0 → sourcecode-1.19.0}/tests/test_workspace_analyzer.py +0 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# Continue Here — atlas-cli v1.17.0 defect patch (saint-server round 2)
|
|
2
|
+
|
|
3
|
+
**Paused:** 2026-05-13 (session 2)
|
|
4
|
+
**Repo:** `/Users/user/Downloads/atlas-cli`
|
|
5
|
+
**Branch:** master
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Estado actual
|
|
10
|
+
|
|
11
|
+
Sesión 2: 6 defectos adicionales contra saint-server. **Sin commit** (instrucción explícita). Pipx venv reinstalado en modo editable para pruebas en vivo. 743 tests pasan.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Defectos corregidos sesión 2 (ESTA SESIÓN)
|
|
16
|
+
|
|
17
|
+
| ID | Sev | Fix | Fichero |
|
|
18
|
+
|----|-----|-----|---------|
|
|
19
|
+
| FIX-1 | CRITICAL-3 | `--symptom` secondary pass: inyecta ficheros del árbol cuyo path contiene keywords del síntoma (antes solo re-ordenaba candidatos ya en pool). role="symptom_match", score=0.5+boost | `prepare_context.py:655-676` |
|
|
20
|
+
| FIX-2 | HIGH-2 | `_security_surface_from_eps` resuelve constantes Java `ClassName.FIELD_NAME` → busca `ClassName.java` en file_paths y extrae valor literal. `resource_names_unresolved[]` para las irresolubles. Call sites actualizados con root+file_paths | `serializer.py:428-522` |
|
|
21
|
+
| FIX-3 | HIGH-3 | Nota truncación: `"use --full for complete list"` → `"use --full to see all {total}"` | `serializer.py:434` |
|
|
22
|
+
| FIX-4 | REGRESSION | `_file_relevance` items ahora tienen campo `"score"` (= relevance_val). `GenericRestController`/`GenericCRUDRestController` override: category="runtime_core", score=0.95, relevance=0.95, reason/evidence/ranking_reasons específicos | `serializer.py:714-737` |
|
|
23
|
+
| FIX-5 | MEDIUM-3 | `compact_view` confidence_summary ahora incluye `"sections"` breakdown (igual que agent_view) | `serializer.py:1046-1052` |
|
|
24
|
+
| FIX-6 | LOW-1 | `_spring_profiles_context` portal profiles (con `-` en nombre): busca en path completo (no solo stem). Si no hay ficheros, añade perfil con `[]` para que esté presente en `per_profile_variants` | `serializer.py:386-406` |
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Defectos corregidos sesión 1 (pendientes de commit)
|
|
29
|
+
|
|
30
|
+
### CRITICAL
|
|
31
|
+
| ID | Fix | Fichero |
|
|
32
|
+
|----|-----|---------|
|
|
33
|
+
| C1 | `_extract_first_useful_paragraph()` rechaza snippets startup via `_STARTUP_RE` | `summarizer.py` |
|
|
34
|
+
| C2 | `_bootstrap_structured()` emite `sample` (5 primeros) en vez de `modules` (todos) | `serializer.py` |
|
|
35
|
+
| C3 | `safe_read_text()` fallback UTF-8→ISO-8859-1→UTF-8/replace | `tree_utils.py` + consumidores |
|
|
36
|
+
| C4 | `_scan_java_patterns()` custom_annotations[] + base_classes[] | `architecture_analyzer.py` + `schema.py` |
|
|
37
|
+
|
|
38
|
+
### HIGH
|
|
39
|
+
| ID | Fix | Fichero |
|
|
40
|
+
|----|-----|---------|
|
|
41
|
+
| H1 | `_spring_profiles_context()` estructura detallada | `serializer.py` |
|
|
42
|
+
| H2 | `_is_dto_mapper()` separa @Mapper real de DtoMapper | `serializer.py` |
|
|
43
|
+
| H3 | `_transactional_summary()` truncate a 10 + nota | `serializer.py` |
|
|
44
|
+
| H4 | `_TASK_CONTENT_MAP` per-task filter en prepare-context | `cli.py` + `prepare_context.py` |
|
|
45
|
+
| H5 | Fallback `git log -n 100` + campo `hotspot_method` | `git_analyzer.py` + `schema.py` |
|
|
46
|
+
|
|
47
|
+
### MEDIUM / LOW
|
|
48
|
+
M1–M5, L1 — ver sesión 1.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Ficheros modificados (ambas sesiones)
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
src/sourcecode/architecture_analyzer.py sesión 1
|
|
56
|
+
src/sourcecode/cli.py sesión 1
|
|
57
|
+
src/sourcecode/code_notes_analyzer.py sesión 1
|
|
58
|
+
src/sourcecode/confidence_analyzer.py sesión 1
|
|
59
|
+
src/sourcecode/doc_analyzer.py sesión 1
|
|
60
|
+
src/sourcecode/git_analyzer.py sesión 1
|
|
61
|
+
src/sourcecode/schema.py sesión 1
|
|
62
|
+
src/sourcecode/serializer.py sesión 1 + sesión 2 (FIX-2,3,4,5,6)
|
|
63
|
+
src/sourcecode/summarizer.py sesión 1
|
|
64
|
+
src/sourcecode/tree_utils.py sesión 1
|
|
65
|
+
src/sourcecode/prepare_context.py sesión 1 + sesión 2 (FIX-1)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Tests
|
|
71
|
+
|
|
72
|
+
- **743 passed, 3 skipped** (sin regresiones)
|
|
73
|
+
- Fallos pre-existentes excluidos:
|
|
74
|
+
- `test_block2_coverage.py::test_java_marked_unsupported`
|
|
75
|
+
- `test_dependency_analyzer_node_python.py::test_python_requirements_without_lockfile`
|
|
76
|
+
- `test_pipeline_integrity.py::TestBenchmarkContamination`
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Smoke tests para saint-server (pendientes — no tenemos acceso a saint-server aquí)
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# FIX-1: síntoma inyecta ficheros
|
|
84
|
+
sourcecode prepare-context fix-bug saint-server --symptom "ausencias contador" \
|
|
85
|
+
--output /tmp/fix_symptom.json
|
|
86
|
+
python3 -c "
|
|
87
|
+
import json; d=json.load(open('/tmp/fix_symptom.json'))
|
|
88
|
+
paths=[f['path'] for f in d['relevant_files']]
|
|
89
|
+
assert any('ausencias' in p for p in paths), 'ausencias not found'
|
|
90
|
+
assert any('contador' in p for p in paths), 'contador not found'
|
|
91
|
+
print('FIX-1 PASS')
|
|
92
|
+
"
|
|
93
|
+
|
|
94
|
+
# FIX-2: resource_names resueltos
|
|
95
|
+
sourcecode saint-server --compact --output /tmp/sec_test.json
|
|
96
|
+
python3 -c "
|
|
97
|
+
import json; d=json.load(open('/tmp/sec_test.json'))
|
|
98
|
+
unresolved=[r for r in d['security_surface']['resource_names']
|
|
99
|
+
if 'SeguridadRecursosConst.' in str(r)]
|
|
100
|
+
print(f'Unresolved: {len(unresolved)}')
|
|
101
|
+
assert len(unresolved) < 73, 'No improvement'
|
|
102
|
+
"
|
|
103
|
+
|
|
104
|
+
# FIX-3: note text correcto
|
|
105
|
+
sourcecode saint-server --compact --output /tmp/txn.json
|
|
106
|
+
python3 -c "
|
|
107
|
+
import json; d=json.load(open('/tmp/txn.json'))
|
|
108
|
+
note=d.get('transactional_boundaries',{}).get('note','')
|
|
109
|
+
assert '--full' in note and 'for complete list' not in note, f'bad note: {note}'
|
|
110
|
+
print('FIX-3 PASS:', note)
|
|
111
|
+
"
|
|
112
|
+
|
|
113
|
+
# FIX-4: score presente y no nulo
|
|
114
|
+
sourcecode saint-server --agent --output /tmp/agent_test.json
|
|
115
|
+
python3 -c "
|
|
116
|
+
import json; d=json.load(open('/tmp/agent_test.json'))
|
|
117
|
+
gcr=next((f for f in d['file_relevance'] if 'GenericRestController' in f['path']),None)
|
|
118
|
+
assert gcr is not None,'not found'
|
|
119
|
+
assert gcr['score'] is not None,'null score'
|
|
120
|
+
assert isinstance(gcr['score'],(int,float)),'not numeric'
|
|
121
|
+
print('FIX-4 PASS: score=', gcr['score'])
|
|
122
|
+
"
|
|
123
|
+
|
|
124
|
+
# FIX-5: sections en compact
|
|
125
|
+
sourcecode saint-server --compact --output /tmp/conf_test.json
|
|
126
|
+
python3 -c "
|
|
127
|
+
import json; d=json.load(open('/tmp/conf_test.json'))
|
|
128
|
+
cs=d['confidence_summary']
|
|
129
|
+
assert 'sections' in cs,'sections missing'
|
|
130
|
+
assert 'file_relevance' in cs['sections'],'file_relevance key missing'
|
|
131
|
+
print('FIX-5 PASS:', cs['sections'])
|
|
132
|
+
"
|
|
133
|
+
|
|
134
|
+
# FIX-6: portal profiles presentes
|
|
135
|
+
sourcecode saint-server --compact --output /tmp/prof_test.json
|
|
136
|
+
python3 -c "
|
|
137
|
+
import json; d=json.load(open('/tmp/prof_test.json'))
|
|
138
|
+
variants=d['spring_profiles']['per_profile_variants']
|
|
139
|
+
portal=[p for p in d['spring_profiles']['detected'] if 'portal' in p]
|
|
140
|
+
missing=[p for p in portal if p not in variants]
|
|
141
|
+
assert len(missing)==0, f'Still missing: {missing}'
|
|
142
|
+
print('FIX-6 PASS')
|
|
143
|
+
"
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Commit cuando listo
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
git add src/sourcecode/serializer.py src/sourcecode/prepare_context.py \
|
|
152
|
+
src/sourcecode/architecture_analyzer.py src/sourcecode/cli.py \
|
|
153
|
+
src/sourcecode/code_notes_analyzer.py src/sourcecode/confidence_analyzer.py \
|
|
154
|
+
src/sourcecode/doc_analyzer.py src/sourcecode/git_analyzer.py \
|
|
155
|
+
src/sourcecode/schema.py src/sourcecode/summarizer.py \
|
|
156
|
+
src/sourcecode/tree_utils.py \
|
|
157
|
+
tests/test_encoding_regression.py tests/test_task_differentiation.py \
|
|
158
|
+
tests/fixtures/
|
|
159
|
+
git commit -m "fix: 21 saint-server defects across 2 sessions (C1-C4, H1-H5, M1-M5, L1, FIX-1 to FIX-6)"
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Para retomar
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
cd /Users/user/Downloads/atlas-cli
|
|
168
|
+
git diff --stat # verificar ficheros modificados
|
|
169
|
+
python3 -m pytest tests/ \
|
|
170
|
+
--ignore=tests/test_block2_coverage.py \
|
|
171
|
+
--ignore=tests/test_dependency_analyzer_node_python.py \
|
|
172
|
+
--ignore=tests/test_pipeline_integrity.py -q
|
|
173
|
+
# Expected: 743 passed, 3 skipped
|
|
174
|
+
# Then run smoke tests above against saint-server
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
*Pausado 2026-05-13 sesión 2 — gsd:pause-work*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.19.0
|
|
4
4
|
Summary: Deterministic codebase context for AI coding agents
|
|
5
5
|
License: Apache License
|
|
6
6
|
Version 2.0, January 2004
|
|
@@ -221,7 +221,7 @@ Description-Content-Type: text/markdown
|
|
|
221
221
|
|
|
222
222
|
**Compressed AI-ready context for Java/Spring enterprise codebases.**
|
|
223
223
|
|
|
224
|
-

|
|
225
225
|

|
|
226
226
|
|
|
227
227
|
---
|
|
@@ -255,7 +255,7 @@ pipx install sourcecode
|
|
|
255
255
|
|
|
256
256
|
```bash
|
|
257
257
|
sourcecode version
|
|
258
|
-
# sourcecode 1.
|
|
258
|
+
# sourcecode 1.19.0
|
|
259
259
|
```
|
|
260
260
|
|
|
261
261
|
---
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**Compressed AI-ready context for Java/Spring enterprise codebases.**
|
|
4
4
|
|
|
5
|
-

|
|
6
6
|

|
|
7
7
|
|
|
8
8
|
---
|
|
@@ -36,7 +36,7 @@ pipx install sourcecode
|
|
|
36
36
|
|
|
37
37
|
```bash
|
|
38
38
|
sourcecode version
|
|
39
|
-
# sourcecode 1.
|
|
39
|
+
# sourcecode 1.19.0
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
---
|
|
@@ -637,8 +637,10 @@ class TaskContextBuilder:
|
|
|
637
637
|
related_notes: list[dict] = []
|
|
638
638
|
if task_name == "fix-bug" and symptom:
|
|
639
639
|
import re as _re
|
|
640
|
+
_camel_expanded = _re.sub(r'([a-z])([A-Z])', r'\1 \2', symptom)
|
|
641
|
+
_camel_expanded = _re.sub(r'([A-Z]+)([A-Z][a-z])', r'\1 \2', _camel_expanded)
|
|
640
642
|
symptom_keywords = [
|
|
641
|
-
w.lower() for w in _re.split(r"[\s\W]+",
|
|
643
|
+
w.lower() for w in _re.split(r"[\s\W]+", _camel_expanded)
|
|
642
644
|
if len(w) > 2
|
|
643
645
|
]
|
|
644
646
|
if symptom_keywords:
|
|
@@ -652,12 +654,60 @@ class TaskContextBuilder:
|
|
|
652
654
|
"line": getattr(_n, "line", None),
|
|
653
655
|
"text": getattr(_n, "text", ""),
|
|
654
656
|
})
|
|
655
|
-
#
|
|
657
|
+
# Secondary pass: inject files whose path matches symptom keywords
|
|
658
|
+
# but weren't in the candidate pool (no structural/git signals).
|
|
659
|
+
_existing_paths = {rf.path for rf in relevant_files}
|
|
660
|
+
for _p in all_paths:
|
|
661
|
+
if _p in _existing_paths:
|
|
662
|
+
continue
|
|
663
|
+
if Path(_p).suffix.lower() not in _ALL_EXTENSIONS:
|
|
664
|
+
continue
|
|
665
|
+
_p_lower = _p.lower()
|
|
666
|
+
_matching_kws = [kw for kw in symptom_keywords if kw in _p_lower]
|
|
667
|
+
if not _matching_kws:
|
|
668
|
+
continue
|
|
669
|
+
_boost = 0.2 * len(_matching_kws)
|
|
670
|
+
_injected_score = round(min(0.5 + _boost, 1.0), 2)
|
|
671
|
+
_first_kw = _matching_kws[0]
|
|
672
|
+
relevant_files.append(RelevantFile(
|
|
673
|
+
path=_p,
|
|
674
|
+
role="symptom_match",
|
|
675
|
+
score=_injected_score,
|
|
676
|
+
reason=f"path matches symptom keyword: {_first_kw}",
|
|
677
|
+
why=f"symptom injection: {', '.join(_matching_kws)}",
|
|
678
|
+
))
|
|
679
|
+
_existing_paths.add(_p)
|
|
680
|
+
|
|
681
|
+
# Re-rank all relevant_files: boost files whose path matches keywords
|
|
656
682
|
def _symptom_score(rf: "RelevantFile") -> float:
|
|
657
683
|
path_lower = rf.path.lower()
|
|
658
684
|
return rf.score + 0.2 * sum(1.0 for kw in symptom_keywords if kw in path_lower)
|
|
659
685
|
relevant_files = sorted(relevant_files, key=lambda rf: -_symptom_score(rf))
|
|
660
686
|
|
|
687
|
+
# Content scan boost: read file body for symptom keywords
|
|
688
|
+
_src_exts = frozenset({".java", ".py", ".ts", ".js", ".kt", ".go"})
|
|
689
|
+
_content_boosted: list[RelevantFile] = []
|
|
690
|
+
for _rf in relevant_files:
|
|
691
|
+
_extra = 0.0
|
|
692
|
+
if Path(_rf.path).suffix.lower() in _src_exts:
|
|
693
|
+
try:
|
|
694
|
+
_lines = (self.root / _rf.path).read_text(
|
|
695
|
+
encoding="utf-8", errors="replace"
|
|
696
|
+
).splitlines()[:300]
|
|
697
|
+
_body = "\n".join(_lines).lower()
|
|
698
|
+
_hits = sum(_body.count(kw) for kw in symptom_keywords)
|
|
699
|
+
_extra = min(0.30, _hits * 0.02)
|
|
700
|
+
except OSError:
|
|
701
|
+
pass
|
|
702
|
+
_content_boosted.append(RelevantFile(
|
|
703
|
+
path=_rf.path,
|
|
704
|
+
role=_rf.role,
|
|
705
|
+
score=round(min(_rf.score + _extra, 1.0), 2),
|
|
706
|
+
reason=_rf.reason + (f", content-match symptom (+{_extra:.2f})" if _extra > 0 else ""),
|
|
707
|
+
why=_rf.why,
|
|
708
|
+
))
|
|
709
|
+
relevant_files = sorted(_content_boosted, key=lambda rf: -rf.score)
|
|
710
|
+
|
|
661
711
|
# ── 7. Test gaps (generate-tests only) ────────────────────────────
|
|
662
712
|
test_gaps: list[str] = []
|
|
663
713
|
if task_name == "generate-tests":
|
|
@@ -839,7 +889,7 @@ class TaskContextBuilder:
|
|
|
839
889
|
_dominant_stack = ""
|
|
840
890
|
_recently_changed_stacks: set[str] = set()
|
|
841
891
|
if task_name == "fix-bug":
|
|
842
|
-
_bug_kinds = {"FIXME", "BUG"}
|
|
892
|
+
_bug_kinds = {"FIXME", "BUG", "HACK", "XXX"}
|
|
843
893
|
for _n in (code_notes or []):
|
|
844
894
|
if getattr(_n, "kind", "").upper() in _bug_kinds:
|
|
845
895
|
_annotated_files.add(getattr(_n, "path", ""))
|
|
@@ -996,7 +1046,16 @@ class TaskContextBuilder:
|
|
|
996
1046
|
)
|
|
997
1047
|
for total, path, rf in scored
|
|
998
1048
|
}
|
|
999
|
-
|
|
1049
|
+
_repo_size = len(all_paths)
|
|
1050
|
+
_task_budget = {
|
|
1051
|
+
"fix-bug": max(20, min(40, _repo_size // 80)),
|
|
1052
|
+
"onboard": max(15, min(25, _repo_size // 150)),
|
|
1053
|
+
"explain": max(10, min(20, _repo_size // 200)),
|
|
1054
|
+
"generate-tests": max(20, min(35, _repo_size // 100)),
|
|
1055
|
+
"refactor": max(15, min(30, _repo_size // 120)),
|
|
1056
|
+
}
|
|
1057
|
+
_budget = _task_budget.get(task_name, 15)
|
|
1058
|
+
_selected = _ctx.select_subgraph(_ns, contracts=[], budget=_budget, min_score=0.15)
|
|
1000
1059
|
_rf_map = {path: rf for _, path, rf in scored}
|
|
1001
1060
|
return [_rf_map[p] for p in _selected if p in _rf_map]
|
|
1002
1061
|
except Exception:
|
|
@@ -1012,6 +1071,9 @@ class TaskContextBuilder:
|
|
|
1012
1071
|
or "/tests/" in path
|
|
1013
1072
|
or "/test/" in path
|
|
1014
1073
|
or "/spec/" in path
|
|
1074
|
+
or (name.endswith("test.java") and name != "test.java")
|
|
1075
|
+
or name.endswith("tests.java")
|
|
1076
|
+
or (name.startswith("test") and name.endswith(".java") and len(name) > 9)
|
|
1015
1077
|
)
|
|
1016
1078
|
|
|
1017
1079
|
def _is_source(self, path: str) -> bool:
|
|
@@ -383,16 +383,27 @@ def _spring_profiles_context(sm: "SourceMap") -> "Optional[dict[str, Any]]":
|
|
|
383
383
|
if not profiles:
|
|
384
384
|
return None
|
|
385
385
|
|
|
386
|
-
# Per-profile variants: Java files whose
|
|
386
|
+
# Per-profile variants: Java/XML files whose stem or path contains the profile name.
|
|
387
|
+
# Portal profiles (e.g. "ingesa-portal") use dash in directory/resource names but
|
|
388
|
+
# never in Java class names — match on full path instead of stem only.
|
|
387
389
|
per_profile: dict[str, list[str]] = {}
|
|
388
390
|
for profile in profiles:
|
|
389
391
|
pfx = profile.lower()
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
392
|
+
is_portal = "-" in profile
|
|
393
|
+
if is_portal:
|
|
394
|
+
matches = [
|
|
395
|
+
p for p in sm.file_paths
|
|
396
|
+
if pfx in p.lower() and (p.endswith(".java") or p.endswith(".xml"))
|
|
397
|
+
]
|
|
398
|
+
else:
|
|
399
|
+
matches = [
|
|
400
|
+
p for p in sm.file_paths
|
|
401
|
+
if pfx in Path(p).stem.lower() and p.endswith(".java")
|
|
402
|
+
]
|
|
394
403
|
if matches:
|
|
395
404
|
per_profile[profile] = [Path(p).name for p in matches[:5]]
|
|
405
|
+
elif is_portal:
|
|
406
|
+
per_profile[profile] = []
|
|
396
407
|
|
|
397
408
|
result: dict[str, Any] = {"detected": profiles}
|
|
398
409
|
if per_profile:
|
|
@@ -420,16 +431,53 @@ def _transactional_summary(sm: "SourceMap", *, full: bool = False) -> "Optional[
|
|
|
420
431
|
if total > 10 and not full:
|
|
421
432
|
result["classes"] = classes[:10]
|
|
422
433
|
result["truncated"] = True
|
|
423
|
-
result["note"] = f"showing 10 of {total}; use --full
|
|
434
|
+
result["note"] = f"showing 10 of {total}; use --full to see all {total}"
|
|
424
435
|
return result
|
|
425
436
|
return None
|
|
426
437
|
|
|
427
438
|
|
|
428
|
-
def
|
|
439
|
+
def _resolve_java_constant(symbol: str, root: "Optional[Path]", file_paths: "Optional[list[str]]") -> str:
|
|
440
|
+
"""Resolve a Java constant reference like ClassName.FIELD_NAME to its string value."""
|
|
441
|
+
import re as _re
|
|
442
|
+
if not root or not file_paths or "." not in symbol:
|
|
443
|
+
return symbol
|
|
444
|
+
parts = symbol.rsplit(".", 1)
|
|
445
|
+
if len(parts) != 2:
|
|
446
|
+
return symbol
|
|
447
|
+
class_name, field_name = parts
|
|
448
|
+
if not class_name or not field_name or not field_name.isupper():
|
|
449
|
+
return symbol
|
|
450
|
+
target_file = f"{class_name}.java"
|
|
451
|
+
candidates = [p for p in file_paths if Path(p).name == target_file]
|
|
452
|
+
if not candidates:
|
|
453
|
+
return symbol
|
|
454
|
+
_CONST_RE = _re.compile(
|
|
455
|
+
r'\b' + _re.escape(field_name) + r'\s*=\s*"([^"]+)"'
|
|
456
|
+
)
|
|
457
|
+
for rel_path in candidates:
|
|
458
|
+
try:
|
|
459
|
+
abs_path = root / rel_path
|
|
460
|
+
content = abs_path.read_text(encoding="utf-8", errors="replace")
|
|
461
|
+
m = _CONST_RE.search(content)
|
|
462
|
+
if m:
|
|
463
|
+
return m.group(1)
|
|
464
|
+
except OSError:
|
|
465
|
+
continue
|
|
466
|
+
return symbol
|
|
467
|
+
|
|
468
|
+
|
|
469
|
+
def _security_surface_from_eps(
|
|
470
|
+
eps: list,
|
|
471
|
+
*,
|
|
472
|
+
root: "Optional[Path]" = None,
|
|
473
|
+
file_paths: "Optional[list[str]]" = None,
|
|
474
|
+
) -> "Optional[dict[str, Any]]":
|
|
429
475
|
"""Extract @M3FiltroSeguridad resource names from entry point evidence strings."""
|
|
430
476
|
import re as _re
|
|
431
477
|
_NOMBRE_RE = _re.compile(r"nombreRecurso=[\"']([^\"']+)[\"']")
|
|
478
|
+
_CONST_SYMBOL_RE = _re.compile(r'^[\w]+\.[\w]+$')
|
|
432
479
|
resource_names: list[str] = []
|
|
480
|
+
unresolved: list[str] = []
|
|
433
481
|
seen: set[str] = set()
|
|
434
482
|
for ep in eps:
|
|
435
483
|
evidence = getattr(ep, "evidence", None)
|
|
@@ -437,18 +485,30 @@ def _security_surface_from_eps(eps: list) -> "Optional[dict[str, Any]]":
|
|
|
437
485
|
continue
|
|
438
486
|
for m in _NOMBRE_RE.finditer(evidence):
|
|
439
487
|
nm = m.group(1)
|
|
440
|
-
if nm
|
|
441
|
-
|
|
488
|
+
if not nm or nm in seen:
|
|
489
|
+
continue
|
|
490
|
+
seen.add(nm)
|
|
491
|
+
if _CONST_SYMBOL_RE.match(nm):
|
|
492
|
+
resolved = _resolve_java_constant(nm, root, file_paths)
|
|
493
|
+
if resolved != nm:
|
|
494
|
+
resource_names.append(resolved)
|
|
495
|
+
else:
|
|
496
|
+
resource_names.append(nm)
|
|
497
|
+
unresolved.append(nm)
|
|
498
|
+
else:
|
|
442
499
|
resource_names.append(nm)
|
|
443
500
|
if not resource_names:
|
|
444
501
|
return None
|
|
445
|
-
|
|
502
|
+
result: dict[str, Any] = {
|
|
446
503
|
"schema": (
|
|
447
504
|
"Values used in @M3FiltroSeguridad(nombreRecurso=VALUE) on REST controller "
|
|
448
505
|
"methods. Each value names a permission resource checked at runtime."
|
|
449
506
|
),
|
|
450
507
|
"resource_names": resource_names,
|
|
451
508
|
}
|
|
509
|
+
if unresolved:
|
|
510
|
+
result["resource_names_unresolved"] = unresolved
|
|
511
|
+
return result
|
|
452
512
|
|
|
453
513
|
|
|
454
514
|
def _bootstrap_structured(eps: list) -> "Optional[dict[str, Any]]":
|
|
@@ -712,6 +772,7 @@ def _file_relevance(sm: SourceMap, *, limit: int = _FILE_RELEVANCE_LIMIT) -> lis
|
|
|
712
772
|
"category": file_class.category if file_class else "source",
|
|
713
773
|
"confidence": file_class.confidence if file_class else "low",
|
|
714
774
|
"relevance": relevance_val,
|
|
775
|
+
"score": relevance_val,
|
|
715
776
|
"reason": file_class.reason if file_class else (fs.reasons[0] if fs.reasons else "source file"),
|
|
716
777
|
"evidence": file_class.evidence if file_class else [],
|
|
717
778
|
}
|
|
@@ -722,6 +783,18 @@ def _file_relevance(sm: SourceMap, *, limit: int = _FILE_RELEVANCE_LIMIT) -> lis
|
|
|
722
783
|
if ranking_reasons:
|
|
723
784
|
item["ranking_reasons"] = ranking_reasons
|
|
724
785
|
|
|
786
|
+
# Override metadata for known M3 base controller classes
|
|
787
|
+
if any(k in stem for k in ("GenericRestController", "GenericCRUDRestController")):
|
|
788
|
+
item["category"] = "runtime_core"
|
|
789
|
+
item["relevance"] = 0.95
|
|
790
|
+
item["score"] = 0.95
|
|
791
|
+
item["reason"] = (
|
|
792
|
+
"base class for all REST controllers — extends this to get "
|
|
793
|
+
"centralized exception handling via handlerException()"
|
|
794
|
+
)
|
|
795
|
+
item["evidence"] = ["base_rest_controller"]
|
|
796
|
+
item["ranking_reasons"] = ["universal base class", "exception handling contract"]
|
|
797
|
+
|
|
725
798
|
scored.append((combined, item))
|
|
726
799
|
|
|
727
800
|
# Deterministic sort: score desc, then path asc
|
|
@@ -970,7 +1043,12 @@ def compact_view(sm: SourceMap, *, no_tree: bool = False, full: bool = False) ->
|
|
|
970
1043
|
conf_dict: Any = None
|
|
971
1044
|
if sm.confidence_summary is not None:
|
|
972
1045
|
cs = sm.confidence_summary
|
|
973
|
-
conf_dict = {
|
|
1046
|
+
conf_dict = {
|
|
1047
|
+
"overall": cs.overall,
|
|
1048
|
+
"stack": cs.stack_confidence,
|
|
1049
|
+
"entry_points": cs.entry_point_confidence,
|
|
1050
|
+
"sections": _section_confidence(sm),
|
|
1051
|
+
}
|
|
974
1052
|
if cs.anomalies:
|
|
975
1053
|
conf_dict["anomalies"] = cs.anomalies
|
|
976
1054
|
|
|
@@ -997,7 +1075,8 @@ def compact_view(sm: SourceMap, *, no_tree: bool = False, full: bool = False) ->
|
|
|
997
1075
|
if _app_server:
|
|
998
1076
|
_deployment["app_server_hint"] = _app_server
|
|
999
1077
|
_deploy_risks = _project_deployment_risks(sm)
|
|
1000
|
-
|
|
1078
|
+
_sec_root = Path(sm.metadata.analyzed_path) if sm.metadata.analyzed_path else None
|
|
1079
|
+
_security_surface = _security_surface_from_eps(sm.entry_points, root=_sec_root, file_paths=sm.file_paths)
|
|
1001
1080
|
_mybatis = _mybatis_pairing(sm, full=full)
|
|
1002
1081
|
_transactional = _transactional_summary(sm, full=full)
|
|
1003
1082
|
_git_ctx = _compact_git_context(sm)
|
|
@@ -1515,7 +1594,8 @@ def agent_view(sm: SourceMap, *, full: bool = False) -> dict[str, Any]:
|
|
|
1515
1594
|
signals["semantic_graph"] = sem_info
|
|
1516
1595
|
|
|
1517
1596
|
# Java/Spring: security surface, ORM structure, transactional boundaries
|
|
1518
|
-
|
|
1597
|
+
_av_root = Path(sm.metadata.analyzed_path) if sm.metadata.analyzed_path else None
|
|
1598
|
+
_sec_surf = _security_surface_from_eps(sm.entry_points, root=_av_root, file_paths=sm.file_paths)
|
|
1519
1599
|
if _sec_surf:
|
|
1520
1600
|
signals["security_surface"] = _sec_surf
|
|
1521
1601
|
_mb = _mybatis_pairing(sm, full=full)
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
# Continue Here — atlas-cli v1.14.0 defect patch (saint-server)
|
|
2
|
-
|
|
3
|
-
**Paused:** 2026-05-13
|
|
4
|
-
**Repo:** `/Users/user/Downloads/atlas-cli`
|
|
5
|
-
**Branch:** master
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Estado actual
|
|
10
|
-
|
|
11
|
-
Sesión: patch de 15 defectos contra saint-server (Spring Boot 2.7 / Java 8 / 100 módulos DDD / 467 controllers). **Sin commit** (instrucción explícita: "no hagas commit"). 10 ficheros fuente modificados + 4 ficheros nuevos de test/fixtures.
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## Defectos corregidos esta sesión
|
|
16
|
-
|
|
17
|
-
### CRITICAL
|
|
18
|
-
| ID | Fix | Fichero |
|
|
19
|
-
|----|-----|---------|
|
|
20
|
-
| C1 | `_extract_first_useful_paragraph()` rechaza snippets de startup via `_STARTUP_RE` (≥2 hits) | `summarizer.py` |
|
|
21
|
-
| C2 | `_bootstrap_structured()` emite `modules` (todos los DDD modules) en vez de `sample` (5 primeros) | `serializer.py` |
|
|
22
|
-
| C3 | `safe_read_text()` con fallback UTF-8→ISO-8859-1→UTF-8/replace — elimina double-encoding de chars españoles | `tree_utils.py` + 3 consumidores |
|
|
23
|
-
| C4 | `_scan_java_patterns()` escanea Java para `@interface` + `extends`, emite `custom_annotations[]` + `base_classes[]` | `architecture_analyzer.py` + `schema.py` |
|
|
24
|
-
|
|
25
|
-
### HIGH
|
|
26
|
-
| ID | Fix | Fichero |
|
|
27
|
-
|----|-----|---------|
|
|
28
|
-
| H1 | `_spring_profiles_context()` → `{detected, per_profile_variants, note}` | `serializer.py` |
|
|
29
|
-
| H2 | `_is_dto_mapper()` separa `@Mapper` reales de DtoMapper. Añade `dto_mappers[]`, elimina falsos positivos en `missing_xml` | `serializer.py` |
|
|
30
|
-
| H3 | `_transactional_summary()` emite todas las clases; trunca a 10 con `truncated: true` + `note` | `serializer.py` |
|
|
31
|
-
| H4 | `_TASK_CONTENT_MAP` per-task filter en prepare-context. Fix `review-pr` suspected_areas filtrado a root | `cli.py` + `prepare_context.py` |
|
|
32
|
-
| H5 | Fallback `git log -n 100` cuando scan por fecha retorna 0. Nuevo campo `hotspot_method` | `git_analyzer.py` + `schema.py` |
|
|
33
|
-
|
|
34
|
-
### MEDIUM
|
|
35
|
-
| ID | Fix | Fichero |
|
|
36
|
-
|----|-----|---------|
|
|
37
|
-
| M1 | `_security_surface_from_eps()` añade campo `schema` descriptor. Mantiene `resource_names` (compat) | `serializer.py` |
|
|
38
|
-
| M2 | `_jndi_datasources()` escanea `application.yml` / `persistence.xml` para JNDI names | `serializer.py` |
|
|
39
|
-
| M3 | `_file_relevance()` scoring: +10 entry points, +8 base classes, +6 security config, +2 utils | `serializer.py` |
|
|
40
|
-
| M4 | `--agent` auto-habilita `architecture = True` | `cli.py` |
|
|
41
|
-
| M5 | Help `--compact` actualizado: "1000–3000 tokens" (era "600–800") | `cli.py` |
|
|
42
|
-
|
|
43
|
-
### LOW
|
|
44
|
-
| ID | Fix | Fichero |
|
|
45
|
-
|----|-----|---------|
|
|
46
|
-
| L1 | `analysis_gaps` expandido: ADRs missing, OpenAPI missing, profile YAMLs sin comentarios | `confidence_analyzer.py` |
|
|
47
|
-
|
|
48
|
-
---
|
|
49
|
-
|
|
50
|
-
## Ficheros modificados
|
|
51
|
-
|
|
52
|
-
```
|
|
53
|
-
src/sourcecode/architecture_analyzer.py +147 líneas — C4
|
|
54
|
-
src/sourcecode/cli.py +90 líneas — H4, M4, M5
|
|
55
|
-
src/sourcecode/code_notes_analyzer.py +5 líneas — C3
|
|
56
|
-
src/sourcecode/confidence_analyzer.py +54 líneas — L1
|
|
57
|
-
src/sourcecode/doc_analyzer.py +4 líneas — C3
|
|
58
|
-
src/sourcecode/git_analyzer.py +29 líneas — H5
|
|
59
|
-
src/sourcecode/schema.py +5 líneas — C4, H5
|
|
60
|
-
src/sourcecode/serializer.py +245 líneas — C2, H1-H3, M1-M3
|
|
61
|
-
src/sourcecode/summarizer.py +26 líneas — C1, C3
|
|
62
|
-
src/sourcecode/tree_utils.py +19 líneas — C3 utility
|
|
63
|
-
src/sourcecode/prepare_context.py +5 líneas — H4
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### Ficheros nuevos
|
|
67
|
-
```
|
|
68
|
-
tests/test_encoding_regression.py — 4 tests C3
|
|
69
|
-
tests/test_task_differentiation.py — 6 tests H4
|
|
70
|
-
tests/fixtures/latin1_sample.java — fixture UTF-8
|
|
71
|
-
tests/fixtures/latin1_sample_iso.java — fixture Latin-1
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
---
|
|
75
|
-
|
|
76
|
-
## Tests
|
|
77
|
-
|
|
78
|
-
- **743 passed, 3 skipped** — 0 regresiones
|
|
79
|
-
- Fallos pre-existentes excluidos:
|
|
80
|
-
- `test_block2_coverage.py::test_java_marked_unsupported` — bug pre-existente en test (`name` vs `symbol`)
|
|
81
|
-
- `test_dependency_analyzer_node_python.py::test_python_requirements_without_lockfile_keeps_declared_versions` — versión fixture incorrecta
|
|
82
|
-
- `test_pipeline_integrity.py::TestBenchmarkContamination::test_agent_splits_development_and_auxiliary_eps` — pre-existente
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
## Pendientes para próxima sesión
|
|
87
|
-
|
|
88
|
-
1. **Smoke test en saint-server real:**
|
|
89
|
-
```bash
|
|
90
|
-
python3 run_cli.py /path/to/saint-server --compact --agent --git-context 2>/dev/null | python3 -c "
|
|
91
|
-
import json,sys; d=json.load(sys.stdin)
|
|
92
|
-
print('profiles:', d.get('spring_profiles'))
|
|
93
|
-
print('arch method:', d.get('architecture',{}).get('method'))
|
|
94
|
-
print('custom_annotations:', len(d.get('architecture',{}).get('custom_annotations',[])))
|
|
95
|
-
print('hotspot_method:', d.get('git_context',{}).get('hotspot_method'))
|
|
96
|
-
"
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
2. **Commit** cuando listo:
|
|
100
|
-
```bash
|
|
101
|
-
git add src/sourcecode/ tests/test_encoding_regression.py tests/test_task_differentiation.py tests/fixtures/latin1_sample*.java
|
|
102
|
-
git commit -m "fix: 15 saint-server defects — C1-C4 critical, H1-H5 high, M1-M5 medium, L1 low"
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
3. **Pre-existing bugs** (no tocados):
|
|
106
|
-
- `_OPTIONAL_LABEL_MAP` en `architecture_summary.py` tiene valores en español
|
|
107
|
-
- `lombok` / `sqlite-jdbc` clasificados `role: runtime` incorrectamente
|
|
108
|
-
- `test_pipeline_integrity::test_agent_splits_development_and_auxiliary_eps` — `agent_view()` no emite `auxiliary_entry_points`
|
|
109
|
-
|
|
110
|
-
---
|
|
111
|
-
|
|
112
|
-
## Para retomar
|
|
113
|
-
|
|
114
|
-
```bash
|
|
115
|
-
cd /Users/user/Downloads/atlas-cli
|
|
116
|
-
git diff --stat # verificar 10 ficheros modificados
|
|
117
|
-
python3 -m pytest tests/ \
|
|
118
|
-
--ignore=tests/test_block2_coverage.py \
|
|
119
|
-
--ignore=tests/test_dependency_analyzer_node_python.py \
|
|
120
|
-
--ignore=tests/test_pipeline_integrity.py -q
|
|
121
|
-
# Expected: 743 passed, 3 skipped
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
---
|
|
125
|
-
*Pausado 2026-05-13 — gsd:pause-work*
|
{sourcecode-1.17.0 → sourcecode-1.19.0}/.agents/skills/source-command-gsd-join-discord/SKILL.md
RENAMED
|
File without changes
|
{sourcecode-1.17.0 → sourcecode-1.19.0}/.agents/skills/source-command-gsd-review-backlog/SKILL.md
RENAMED
|
File without changes
|
{sourcecode-1.17.0 → sourcecode-1.19.0}/.agents/skills/source-command-gsd-workstreams/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|