sourcecode 1.18.0__tar.gz → 1.20.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.20.0/.continue-here.md +178 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/PKG-INFO +3 -3
- {sourcecode-1.18.0 → sourcecode-1.20.0}/README.md +2 -2
- {sourcecode-1.18.0 → sourcecode-1.20.0}/pyproject.toml +1 -1
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/__init__.py +1 -1
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/cli.py +2 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/prepare_context.py +95 -3
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/serializer.py +54 -1
- sourcecode-1.18.0/.continue-here.md +0 -125
- {sourcecode-1.18.0 → sourcecode-1.20.0}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/.gitignore +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/.ruff.toml +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/CONTRIBUTING.md +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/LICENSE +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/SECURITY.md +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/docs/privacy.md +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/docs/schema.md +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/raw +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/run_cli.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/classifier.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/progress.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/redactor.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/scanner.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/schema.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/src/sourcecode/workspace.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/__init__.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/conftest.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/coverage.xml +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/fastapi_app/src/main.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/go_service/cmd/api/main.go +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/go_service/go.mod +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/jacoco.xml +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/latin1_sample.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/latin1_sample_iso.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/lcov.info +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/nextjs_app/package.json +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/pom.xml +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/application/service/FindAusenteService.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/domain/entities/Ausente.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/infrastructure/rest/AusenteRestController.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/application/service/FindAutocoberturasService.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/domain/entities/Autocoberturas.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/infrastructure/rest/AutocoberturasRestController.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/application/service/FindCalendarioTrabajadorService.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/domain/entities/CalendarioTrabajador.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/infrastructure/rest/CalendarioTrabajadorRestController.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/application/service/FindDepartamentoService.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/domain/entities/Departamento.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/infrastructure/rest/DepartamentoRestController.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/application/service/FindEmpleadoService.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/domain/entities/Empleado.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/infrastructure/rest/EmpleadoRestController.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/DemoApplication.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/config/FilterConfig.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/domain/Health.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/mapper/HealthMapper.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/repository/HealthRepository.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/service/HealthService.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/HealthRestController.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/NominaRestController.java +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/resources/application-dev.yml +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/resources/application.yml +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/fixtures/spring_boot_minimal/src/main/resources/mapper/HealthMapper.xml +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_architecture_analyzer.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_architecture_summary.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_ast_extractor.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_block1_reliability.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_block2_coverage.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_block5_quality.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_bug_fixes_v16.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_classifier.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_cli.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_code_notes_analyzer.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_context_scorer.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_contract_pipeline.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_coverage_parser.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_cross_consistency.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_dependency_analyzer_node_python.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_dependency_analyzer_polyglot.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_dependency_schema.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_detector_dotnet.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_detector_go_rust_java.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_detector_nodejs.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_detector_php_ruby_dart.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_detector_python.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_detector_universal_managed.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_detector_universal_systems.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_detectors_base.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_doc_analyzer_jsdom.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_doc_analyzer_python.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_encoding_regression.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_graph_analyzer_polyglot.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_graph_analyzer_python_node.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_graph_schema.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_hybrid_inference.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_integration.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_integration_dependencies.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_integration_detection.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_integration_docs.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_integration_graph_modules.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_integration_lqn.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_integration_metrics.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_integration_multistack.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_integration_semantics.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_integration_universal.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_java_spring_integration.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_metrics_analyzer.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_packaging.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_phase1_improvements.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_pipeline_integrity.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_real_projects.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_redactor.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_scanner.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_schema.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_schema_normalization.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_semantic_analyzer_node.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_semantic_analyzer_python.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_semantic_import_resolution.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_semantic_schema.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_signal_hierarchy.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_summarizer.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_surface_honesty.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_task_differentiation.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_telemetry.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.0}/tests/test_v1_10_regressions.py +0 -0
- {sourcecode-1.18.0 → sourcecode-1.20.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.20.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.20.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.20.0
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
---
|
|
@@ -1777,6 +1777,8 @@ def prepare_context_cmd(
|
|
|
1777
1777
|
out["symptom"] = output.symptom
|
|
1778
1778
|
if output.related_notes:
|
|
1779
1779
|
out["related_notes"] = output.related_notes
|
|
1780
|
+
if output.symptom_note:
|
|
1781
|
+
out["symptom_note"] = output.symptom_note
|
|
1780
1782
|
if llm_prompt:
|
|
1781
1783
|
out["llm_prompt"] = builder.render_prompt(output)
|
|
1782
1784
|
|
|
@@ -323,6 +323,7 @@ class TaskOutput:
|
|
|
323
323
|
affected_entry_points: list[str] = field(default_factory=list) # delta task only
|
|
324
324
|
symptom: Optional[str] = None # fix-bug only
|
|
325
325
|
related_notes: list[dict] = field(default_factory=list) # fix-bug + symptom only
|
|
326
|
+
symptom_note: Optional[str] = None # fix-bug: cross-layer synonym note
|
|
326
327
|
|
|
327
328
|
|
|
328
329
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -382,6 +383,22 @@ _ALL_EXTENSIONS: frozenset[str] = _SOURCE_EXTENSIONS | frozenset({
|
|
|
382
383
|
".md", ".toml", ".yaml", ".yml", ".json", ".xml",
|
|
383
384
|
})
|
|
384
385
|
|
|
386
|
+
# Maps frontend symptom keywords → backend terms likely to contain the root cause.
|
|
387
|
+
# Used to boost service/interceptor files when the symptom is UI-only.
|
|
388
|
+
_FRONTEND_SYMPTOM_MAP: dict[str, list[str]] = {
|
|
389
|
+
"spinner": ["loading", "setloading", "finalize", "httpinterceptor", "interceptor", "service"],
|
|
390
|
+
"loading": ["loading", "setloading", "finalize", "httpinterceptor", "interceptor", "service"],
|
|
391
|
+
"login": ["authcontroller", "securityconfig", "filterconfig", "jwtfilter", "auth", "authentication"],
|
|
392
|
+
"logout": ["authcontroller", "securityconfig", "jwtfilter", "auth", "session"],
|
|
393
|
+
"dropdown": ["getmapping", "findall", "obtenertodos", "listall", "findby"],
|
|
394
|
+
"modal": ["controller", "getmapping", "findby", "search"],
|
|
395
|
+
"popup": ["controller", "getmapping", "findby", "search"],
|
|
396
|
+
"table": ["paginated", "findby", "search", "getmapping", "listall"],
|
|
397
|
+
"grid": ["paginated", "findby", "search", "getmapping"],
|
|
398
|
+
"button": ["postmapping", "putmapping", "deletemapping", "controller", "service"],
|
|
399
|
+
"form": ["postmapping", "putmapping", "controller", "service", "dto"],
|
|
400
|
+
}
|
|
401
|
+
|
|
385
402
|
|
|
386
403
|
class TaskContextBuilder:
|
|
387
404
|
def __init__(self, root: Path) -> None:
|
|
@@ -635,10 +652,13 @@ class TaskContextBuilder:
|
|
|
635
652
|
# ── 6b. Symptom keyword boost + related notes (fix-bug + --symptom) ──
|
|
636
653
|
symptom_keywords: list[str] = []
|
|
637
654
|
related_notes: list[dict] = []
|
|
655
|
+
symptom_note: Optional[str] = None
|
|
638
656
|
if task_name == "fix-bug" and symptom:
|
|
639
657
|
import re as _re
|
|
658
|
+
_camel_expanded = _re.sub(r'([a-z])([A-Z])', r'\1 \2', symptom)
|
|
659
|
+
_camel_expanded = _re.sub(r'([A-Z]+)([A-Z][a-z])', r'\1 \2', _camel_expanded)
|
|
640
660
|
symptom_keywords = [
|
|
641
|
-
w.lower() for w in _re.split(r"[\s\W]+",
|
|
661
|
+
w.lower() for w in _re.split(r"[\s\W]+", _camel_expanded)
|
|
642
662
|
if len(w) > 2
|
|
643
663
|
]
|
|
644
664
|
if symptom_keywords:
|
|
@@ -682,6 +702,65 @@ class TaskContextBuilder:
|
|
|
682
702
|
return rf.score + 0.2 * sum(1.0 for kw in symptom_keywords if kw in path_lower)
|
|
683
703
|
relevant_files = sorted(relevant_files, key=lambda rf: -_symptom_score(rf))
|
|
684
704
|
|
|
705
|
+
# Content scan boost: read file body for symptom keywords
|
|
706
|
+
_src_exts = frozenset({".java", ".py", ".ts", ".js", ".kt", ".go"})
|
|
707
|
+
_content_boosted: list[RelevantFile] = []
|
|
708
|
+
for _rf in relevant_files:
|
|
709
|
+
_extra = 0.0
|
|
710
|
+
if Path(_rf.path).suffix.lower() in _src_exts:
|
|
711
|
+
try:
|
|
712
|
+
_lines = (self.root / _rf.path).read_text(
|
|
713
|
+
encoding="utf-8", errors="replace"
|
|
714
|
+
).splitlines()[:300]
|
|
715
|
+
_body = "\n".join(_lines).lower()
|
|
716
|
+
_hits = sum(_body.count(kw) for kw in symptom_keywords)
|
|
717
|
+
_extra = min(0.30, _hits * 0.02)
|
|
718
|
+
except OSError:
|
|
719
|
+
pass
|
|
720
|
+
_content_boosted.append(RelevantFile(
|
|
721
|
+
path=_rf.path,
|
|
722
|
+
role=_rf.role,
|
|
723
|
+
score=round(min(_rf.score + _extra, 1.0), 2),
|
|
724
|
+
reason=_rf.reason + (f", content-match symptom (+{_extra:.2f})" if _extra > 0 else ""),
|
|
725
|
+
why=_rf.why,
|
|
726
|
+
))
|
|
727
|
+
relevant_files = sorted(_content_boosted, key=lambda rf: -rf.score)
|
|
728
|
+
|
|
729
|
+
# Cross-layer synonym boost: frontend keywords → backend equivalents
|
|
730
|
+
_synonym_note: Optional[str] = None
|
|
731
|
+
_frontend_kws = [kw for kw in symptom_keywords if kw in _FRONTEND_SYMPTOM_MAP]
|
|
732
|
+
if _frontend_kws:
|
|
733
|
+
_backend_terms: list[str] = []
|
|
734
|
+
for _fkw in _frontend_kws:
|
|
735
|
+
_backend_terms.extend(_FRONTEND_SYMPTOM_MAP[_fkw])
|
|
736
|
+
_backend_terms_set = list(dict.fromkeys(_backend_terms)) # dedup, preserve order
|
|
737
|
+
_synonym_boosted: list[RelevantFile] = []
|
|
738
|
+
for _rf in relevant_files:
|
|
739
|
+
_extra_syn = 0.0
|
|
740
|
+
if Path(_rf.path).suffix.lower() in _src_exts:
|
|
741
|
+
try:
|
|
742
|
+
_lines_syn = (self.root / _rf.path).read_text(
|
|
743
|
+
encoding="utf-8", errors="replace"
|
|
744
|
+
).splitlines()[:300]
|
|
745
|
+
_body_syn = "\n".join(_lines_syn).lower()
|
|
746
|
+
_hits_syn = sum(_body_syn.count(t) for t in _backend_terms_set)
|
|
747
|
+
_extra_syn = min(0.20, _hits_syn * 0.02)
|
|
748
|
+
except OSError:
|
|
749
|
+
pass
|
|
750
|
+
_synonym_boosted.append(RelevantFile(
|
|
751
|
+
path=_rf.path,
|
|
752
|
+
role=_rf.role,
|
|
753
|
+
score=round(min(_rf.score + _extra_syn, 1.0), 2),
|
|
754
|
+
reason=_rf.reason + (f", synonym-match backend (+{_extra_syn:.2f})" if _extra_syn > 0 else ""),
|
|
755
|
+
why=_rf.why,
|
|
756
|
+
))
|
|
757
|
+
relevant_files = sorted(_synonym_boosted, key=lambda rf: -rf.score)
|
|
758
|
+
_synonym_note = (
|
|
759
|
+
f"Frontend concept detected ({', '.join(_frontend_kws)}). "
|
|
760
|
+
"Boosted backend service-layer and interceptor files as likely root cause."
|
|
761
|
+
)
|
|
762
|
+
symptom_note = _synonym_note
|
|
763
|
+
|
|
685
764
|
# ── 7. Test gaps (generate-tests only) ────────────────────────────
|
|
686
765
|
test_gaps: list[str] = []
|
|
687
766
|
if task_name == "generate-tests":
|
|
@@ -762,6 +841,7 @@ class TaskContextBuilder:
|
|
|
762
841
|
affected_entry_points=affected_entry_points,
|
|
763
842
|
symptom=symptom if task_name == "fix-bug" and symptom else None,
|
|
764
843
|
related_notes=related_notes,
|
|
844
|
+
symptom_note=symptom_note,
|
|
765
845
|
)
|
|
766
846
|
|
|
767
847
|
def render_prompt(self, output: TaskOutput) -> str:
|
|
@@ -863,7 +943,7 @@ class TaskContextBuilder:
|
|
|
863
943
|
_dominant_stack = ""
|
|
864
944
|
_recently_changed_stacks: set[str] = set()
|
|
865
945
|
if task_name == "fix-bug":
|
|
866
|
-
_bug_kinds = {"FIXME", "BUG"}
|
|
946
|
+
_bug_kinds = {"FIXME", "BUG", "HACK", "XXX"}
|
|
867
947
|
for _n in (code_notes or []):
|
|
868
948
|
if getattr(_n, "kind", "").upper() in _bug_kinds:
|
|
869
949
|
_annotated_files.add(getattr(_n, "path", ""))
|
|
@@ -1020,7 +1100,16 @@ class TaskContextBuilder:
|
|
|
1020
1100
|
)
|
|
1021
1101
|
for total, path, rf in scored
|
|
1022
1102
|
}
|
|
1023
|
-
|
|
1103
|
+
_repo_size = len(all_paths)
|
|
1104
|
+
_task_budget = {
|
|
1105
|
+
"fix-bug": max(20, min(40, _repo_size // 80)),
|
|
1106
|
+
"onboard": max(15, min(25, _repo_size // 150)),
|
|
1107
|
+
"explain": max(10, min(20, _repo_size // 200)),
|
|
1108
|
+
"generate-tests": max(20, min(35, _repo_size // 100)),
|
|
1109
|
+
"refactor": max(15, min(30, _repo_size // 120)),
|
|
1110
|
+
}
|
|
1111
|
+
_budget = _task_budget.get(task_name, 15)
|
|
1112
|
+
_selected = _ctx.select_subgraph(_ns, contracts=[], budget=_budget, min_score=0.15)
|
|
1024
1113
|
_rf_map = {path: rf for _, path, rf in scored}
|
|
1025
1114
|
return [_rf_map[p] for p in _selected if p in _rf_map]
|
|
1026
1115
|
except Exception:
|
|
@@ -1036,6 +1125,9 @@ class TaskContextBuilder:
|
|
|
1036
1125
|
or "/tests/" in path
|
|
1037
1126
|
or "/test/" in path
|
|
1038
1127
|
or "/spec/" in path
|
|
1128
|
+
or (name.endswith("test.java") and name != "test.java")
|
|
1129
|
+
or name.endswith("tests.java")
|
|
1130
|
+
or (name.startswith("test") and name.endswith(".java") and len(name) > 9)
|
|
1039
1131
|
)
|
|
1040
1132
|
|
|
1041
1133
|
def _is_source(self, path: str) -> bool:
|
|
@@ -356,6 +356,7 @@ def _mybatis_pairing(sm: "SourceMap", *, full: bool = False) -> "Optional[dict[s
|
|
|
356
356
|
result["dto_mappers_total"] = _total_dto
|
|
357
357
|
if _total_dto > 10 and not full:
|
|
358
358
|
result["dto_mappers_truncated"] = True
|
|
359
|
+
result["dto_mappers_warning"] = f"Showing 10/{_total_dto} mappers. Use --full to see all."
|
|
359
360
|
return result
|
|
360
361
|
|
|
361
362
|
|
|
@@ -894,6 +895,41 @@ def _serialize_file_metric(m: Any) -> dict[str, Any]:
|
|
|
894
895
|
return d
|
|
895
896
|
|
|
896
897
|
|
|
898
|
+
def _confidence_reasons(sm: SourceMap) -> dict[str, list[str]]:
|
|
899
|
+
"""Actionable reasons explaining low-confidence sections.
|
|
900
|
+
|
|
901
|
+
If a section is 'low' with no derivable reasons, the caller should
|
|
902
|
+
upgrade it to 'high' (the low rating was overly conservative).
|
|
903
|
+
"""
|
|
904
|
+
reasons: dict[str, list[str]] = {}
|
|
905
|
+
|
|
906
|
+
arch = sm.architecture
|
|
907
|
+
if arch and arch.requested and arch.confidence == "low":
|
|
908
|
+
arch_reasons: list[str] = []
|
|
909
|
+
for lim in (arch.limitations or []):
|
|
910
|
+
if lim:
|
|
911
|
+
arch_reasons.append(lim)
|
|
912
|
+
if sm.analysis_gaps:
|
|
913
|
+
for gap in sm.analysis_gaps:
|
|
914
|
+
if gap.area in ("api_contract", "architecture", "documentation"):
|
|
915
|
+
arch_reasons.append(gap.reason)
|
|
916
|
+
else:
|
|
917
|
+
_has_openapi = any(
|
|
918
|
+
p.endswith(("openapi.yaml", "openapi.yml", "openapi.json", "swagger.yaml", "swagger.json"))
|
|
919
|
+
or "swagger" in p.lower() or "springdoc" in p.lower()
|
|
920
|
+
for p in sm.file_paths
|
|
921
|
+
)
|
|
922
|
+
if not _has_openapi:
|
|
923
|
+
arch_reasons.append("No OpenAPI/Swagger spec found — API surface unverifiable")
|
|
924
|
+
if arch.bounded_contexts:
|
|
925
|
+
bc_count = len(arch.bounded_contexts)
|
|
926
|
+
arch_reasons.append(f"bounded_contexts detected: {bc_count}")
|
|
927
|
+
if arch_reasons:
|
|
928
|
+
reasons["architecture"] = arch_reasons
|
|
929
|
+
|
|
930
|
+
return reasons
|
|
931
|
+
|
|
932
|
+
|
|
897
933
|
def _section_confidence(sm: SourceMap) -> dict[str, str]:
|
|
898
934
|
cs = sm.confidence_summary
|
|
899
935
|
dep_conf = "low"
|
|
@@ -1481,9 +1517,16 @@ def agent_view(sm: SourceMap, *, full: bool = False) -> dict[str, Any]:
|
|
|
1481
1517
|
result["architecture"] = _architecture_context(sm)
|
|
1482
1518
|
|
|
1483
1519
|
# ── 3a. File relevance: evidence-backed, high-signal only ────────────────
|
|
1484
|
-
|
|
1520
|
+
_FR_AGENT_CAP = 20
|
|
1521
|
+
_total_paths = len(sm.file_paths)
|
|
1522
|
+
relevant_files = _file_relevance(sm, limit=_FR_AGENT_CAP if not full else _total_paths)
|
|
1485
1523
|
if relevant_files:
|
|
1486
1524
|
result["file_relevance"] = relevant_files
|
|
1525
|
+
if not full and _total_paths > _FR_AGENT_CAP:
|
|
1526
|
+
result["file_relevance_hint"] = (
|
|
1527
|
+
f"Showing top {_FR_AGENT_CAP}/{_total_paths} files by score. "
|
|
1528
|
+
"Use --full to see all."
|
|
1529
|
+
)
|
|
1487
1530
|
|
|
1488
1531
|
# ── 3b. Monorepo package roles (when available), capped ──────────────────
|
|
1489
1532
|
if sm.monorepo_packages:
|
|
@@ -1638,6 +1681,16 @@ def agent_view(sm: SourceMap, *, full: bool = False) -> dict[str, Any]:
|
|
|
1638
1681
|
conf["anomalies"] = cs.anomalies
|
|
1639
1682
|
result["confidence_summary"] = conf
|
|
1640
1683
|
|
|
1684
|
+
# ── 6a. Confidence reasons: explain any low-confidence section ────────────
|
|
1685
|
+
_conf_reasons = _confidence_reasons(sm)
|
|
1686
|
+
if _conf_reasons:
|
|
1687
|
+
result["confidence_reasons"] = _conf_reasons
|
|
1688
|
+
elif (sm.architecture and sm.architecture.requested
|
|
1689
|
+
and sm.architecture.confidence == "low"
|
|
1690
|
+
and "confidence_summary" in result):
|
|
1691
|
+
# No reasons found → low was overly conservative; upgrade to high
|
|
1692
|
+
result["confidence_summary"].setdefault("sections", {})["architecture"] = "high"
|
|
1693
|
+
|
|
1641
1694
|
# ── 7. Analysis gaps ──────────────────────────────────────────────────────
|
|
1642
1695
|
analysis_gaps: list[dict[str, Any]] = []
|
|
1643
1696
|
|
|
@@ -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.18.0 → sourcecode-1.20.0}/.agents/skills/source-command-gsd-join-discord/SKILL.md
RENAMED
|
File without changes
|
{sourcecode-1.18.0 → sourcecode-1.20.0}/.agents/skills/source-command-gsd-review-backlog/SKILL.md
RENAMED
|
File without changes
|
{sourcecode-1.18.0 → sourcecode-1.20.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
|