sourcecode 1.30.0__tar.gz → 1.30.1__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.30.1/.continue-here.md +129 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/PKG-INFO +3 -3
- {sourcecode-1.30.0 → sourcecode-1.30.1}/README.md +2 -2
- {sourcecode-1.30.0 → sourcecode-1.30.1}/pyproject.toml +1 -1
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/__init__.py +1 -1
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/prepare_context.py +142 -10
- sourcecode-1.30.0/.continue-here.md +0 -118
- {sourcecode-1.30.0 → sourcecode-1.30.1}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/.gitignore +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/.ruff.toml +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/CONTRIBUTING.md +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/LICENSE +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/SECURITY.md +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/docs/privacy.md +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/docs/schema.md +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/raw +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/run_cli.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/classifier.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/cli.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/progress.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/redactor.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/scanner.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/schema.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/serializer.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/src/sourcecode/workspace.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/__init__.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/conftest.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/coverage.xml +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/fastapi_app/src/main.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/go_service/cmd/api/main.go +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/go_service/go.mod +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/jacoco.xml +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/latin1_sample.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/latin1_sample_iso.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/lcov.info +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/nextjs_app/package.json +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/pom.xml +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/application/service/FindAusenteService.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/domain/entities/Ausente.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/infrastructure/rest/AusenteRestController.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/application/service/FindAutocoberturasService.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/domain/entities/Autocoberturas.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/infrastructure/rest/AutocoberturasRestController.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/application/service/FindCalendarioTrabajadorService.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/domain/entities/CalendarioTrabajador.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/infrastructure/rest/CalendarioTrabajadorRestController.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/application/service/FindDepartamentoService.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/domain/entities/Departamento.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/infrastructure/rest/DepartamentoRestController.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/application/service/FindEmpleadoService.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/domain/entities/Empleado.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/infrastructure/rest/EmpleadoRestController.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/DemoApplication.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/config/FilterConfig.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/domain/Health.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/mapper/HealthMapper.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/repository/HealthRepository.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/service/HealthService.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/HealthRestController.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/NominaRestController.java +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/resources/application-dev.yml +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/resources/application.yml +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/fixtures/spring_boot_minimal/src/main/resources/mapper/HealthMapper.xml +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_architecture_analyzer.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_architecture_summary.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_ast_extractor.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_block1_reliability.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_block2_coverage.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_block5_quality.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_bug_fixes_v16.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_classifier.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_cli.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_code_notes_analyzer.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_context_scorer.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_contract_pipeline.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_coverage_parser.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_cross_consistency.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_dependency_analyzer_node_python.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_dependency_analyzer_polyglot.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_dependency_schema.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_detector_dotnet.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_detector_go_rust_java.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_detector_nodejs.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_detector_php_ruby_dart.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_detector_python.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_detector_universal_managed.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_detector_universal_systems.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_detectors_base.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_doc_analyzer_jsdom.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_doc_analyzer_python.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_encoding_regression.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_graph_analyzer_polyglot.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_graph_analyzer_python_node.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_graph_schema.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_hybrid_inference.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_integration.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_integration_dependencies.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_integration_detection.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_integration_docs.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_integration_graph_modules.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_integration_lqn.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_integration_metrics.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_integration_multistack.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_integration_semantics.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_integration_universal.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_java_spring_integration.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_metrics_analyzer.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_packaging.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_phase1_improvements.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_pipeline_integrity.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_real_projects.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_redactor.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_scanner.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_schema.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_schema_normalization.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_semantic_analyzer_node.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_semantic_analyzer_python.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_semantic_import_resolution.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_semantic_schema.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_signal_hierarchy.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_summarizer.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_surface_honesty.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_task_differentiation.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_telemetry.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_v1_10_regressions.py +0 -0
- {sourcecode-1.30.0 → sourcecode-1.30.1}/tests/test_workspace_analyzer.py +0 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# Continue Here — atlas-cli session 6
|
|
2
|
+
|
|
3
|
+
**Paused:** 2026-05-16 (sesión 6)
|
|
4
|
+
**Repo:** `/Users/user/Downloads/atlas-cli`
|
|
5
|
+
**Branch:** master
|
|
6
|
+
**Último commit:** `772a01e` (fix false positives review-pr)
|
|
7
|
+
**Working tree:** DIRTY — `src/sourcecode/prepare_context.py` modificado (28 ins / 8 del), sin commit
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Lo que se hizo esta sesión
|
|
12
|
+
|
|
13
|
+
### Fix 1 — `review-pr` false positive cuando `since=None`
|
|
14
|
+
|
|
15
|
+
Commit `772a01e` (ya en repo). Root cause: `_get_git_changed_files(since=None)` usaba `HEAD~1` como default → devolvía archivos del último commit committeado → `review-pr` los trataba como "PR diff". Fix: nuevo método `_get_uncommitted_changed_files()` llamado desde gate review-pr cuando `since=None`. Tests actualizados en `test_v1_10_regressions.py` para mockear el nuevo método.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
### Fix 2 — BFS over-expansion en `_build_delta_impact` (SIN COMMIT — PENDIENTE)
|
|
20
|
+
|
|
21
|
+
**Problema confirmado en `~/Documents/workspace/spring-boot-realworld-example-app`:**
|
|
22
|
+
Con 2 archivos cambiados (`User.java`, `ArticleFavorite.java`), `review-pr` devolvía 24 `relevant_files` incluyendo todos los controllers REST, todos los GraphQL resolvers, y 2 test files.
|
|
23
|
+
|
|
24
|
+
**3 bugs identificados y corregidos:**
|
|
25
|
+
|
|
26
|
+
| Bug | Línea orig | Descripción | Fix |
|
|
27
|
+
|-----|-----------|-------------|-----|
|
|
28
|
+
| Tests en `_bfs_collected` | ~2081 | `_bfs_collected.append()` fuera de `if not _is_test:` → TestHelper.java, ArticleApiTest.java incluidos | Movido dentro del bloque |
|
|
29
|
+
| Sin per-hop cap | ~2091 | `_max_results` (8) limitaba solo el frontier, no `_bfs_collected`. Hop-1 llenaba los 20 slots, expulsando hop-2/3 | Nuevo `_hop_bfs_staged`: acumula por hop, ordena por score desc, extiende con `[:_max_results]` |
|
|
30
|
+
| Sin truncation guard | — | Sin señal cuando expansión excesiva | Flag `_expansion_truncated` + mensaje `truncated_dependency_graph` en `analysis_gaps` cuando `len(relevant) > 40` |
|
|
31
|
+
|
|
32
|
+
**Resultado smoke test:**
|
|
33
|
+
|
|
34
|
+
| Métrica | Antes | Después |
|
|
35
|
+
|---------|-------|---------|
|
|
36
|
+
| `relevant_files` total | 24 | 14 |
|
|
37
|
+
| Tests incluidos | 2 | **0** |
|
|
38
|
+
| GraphQL resolvers | 8 | **0** |
|
|
39
|
+
| REST controllers | 7 | 5 (top-5 score) |
|
|
40
|
+
| Security hop-1 legítimos | 3 | 3 |
|
|
41
|
+
| JwtTokenFilter (hop-2) | 1 | 1 |
|
|
42
|
+
| WebSecurityConfig (hop-3) | 0 | 1 |
|
|
43
|
+
|
|
44
|
+
**Tests:** 771 passed, 3 skipped
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Estado de tests al pausar
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
771 passed, 3 skipped
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Pre-existing failures (excluidos del run):
|
|
55
|
+
- `test_block2_coverage.py::test_java_marked_unsupported` — DocRecord bug en doc_analyzer.py
|
|
56
|
+
- `test_dependency_analyzer_node_python.py::test_python_requirements_without_lockfile_keeps_declared_versions` — typer version mismatch
|
|
57
|
+
- `test_packaging.py::test_console_script_reports_version` — installed v1.29 vs source v1.30 (se resolverá al reinstalar post-commit)
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Decisiones técnicas de esta sesión
|
|
62
|
+
|
|
63
|
+
- **`_get_uncommitted_changed_files()`**: Método extraído para que sea mockeado en tests. Delta sigue usando HEAD~1 — correcto, no afectado.
|
|
64
|
+
- **`_hop_bfs_staged` per-hop cap**: Elegido sobre threshold de score porque 0.30 seguía incluyendo GraphQL (score 0.32). Cap determinístico.
|
|
65
|
+
- **`_bfs_cap = sum(budget[0])`**: 8+6+4=18, derivado de `_BFS_HOP_BUDGET`, no hardcodeado.
|
|
66
|
+
- **WebSecurityConfig sigue apareciendo (hop-3)**: Legítimo. Cadena real: JwtService→JwtTokenFilter→WebSecurityConfig. Para eliminar: reducir `_BFS_HOP_BUDGET` a 2 hops.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Pendiente / próximos pasos
|
|
71
|
+
|
|
72
|
+
1. **COMMIT fix BFS** — diff listo, tests verdes:
|
|
73
|
+
```bash
|
|
74
|
+
cd /Users/user/Downloads/atlas-cli
|
|
75
|
+
git add src/sourcecode/prepare_context.py
|
|
76
|
+
git commit -m "fix: BFS over-expansion en review-pr — per-hop cap, tests excluidos, truncation guard"
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
2. **Opcional — reducir a 2 hops** si se quiere eliminar WebSecurityConfig (hop-3):
|
|
80
|
+
Cambiar `_BFS_HOP_BUDGET` en `prepare_context.py` de 3 a 2 elementos.
|
|
81
|
+
|
|
82
|
+
3. **Opcional — cross-module guard en BFS**: No incluir archivos cuyo módulo (`_extract_ddd_domain`) difiere del módulo de los changed files. Eliminaría AuthorizationService/JwtService (módulo "service" ≠ "user"/"favorite") de hop-1.
|
|
83
|
+
|
|
84
|
+
4. **Smoke test `delta`** con BFS fix (verificar no afectado):
|
|
85
|
+
```bash
|
|
86
|
+
cd ~/Documents/workspace/spring-boot-realworld-example-app
|
|
87
|
+
sourcecode prepare-context delta . --since HEAD~1 2>&1 | python3 -c "import json,sys; d=json.load(sys.stdin); print('relevant_files:', len(d.get('relevant_files', [])))"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
5. **Smoke tests sesiones anteriores** (saint-server) — ver handoff sesión 4/5.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Para retomar
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
cd /Users/user/Downloads/atlas-cli
|
|
98
|
+
git log --oneline -3
|
|
99
|
+
# debe mostrar:
|
|
100
|
+
# 772a01e (fix) corrigiendo bug que identificaba falsos positivos en review-pr
|
|
101
|
+
# 5c06ef3 (feature) implementando mejoras significativas en prepare-context review-pr
|
|
102
|
+
# e5a1a05 corrigiendo bug en delta --since en windows
|
|
103
|
+
|
|
104
|
+
git diff --stat HEAD
|
|
105
|
+
# debe mostrar: prepare_context.py | 36 +++--- (BFS fix pendiente de commit)
|
|
106
|
+
|
|
107
|
+
# Tests
|
|
108
|
+
python3 -m pytest tests/ \
|
|
109
|
+
--ignore=tests/test_block2_coverage.py \
|
|
110
|
+
--ignore=tests/test_packaging.py \
|
|
111
|
+
--deselect=tests/test_dependency_analyzer_node_python.py::test_python_requirements_without_lockfile_keeps_declared_versions \
|
|
112
|
+
-q
|
|
113
|
+
# Expected: 771 passed, 3 skipped
|
|
114
|
+
|
|
115
|
+
# Smoke test review-pr
|
|
116
|
+
cd ~/Documents/workspace/spring-boot-realworld-example-app
|
|
117
|
+
sourcecode prepare-context review-pr . 2>&1 | python3 -c "
|
|
118
|
+
import json, sys
|
|
119
|
+
d = json.load(sys.stdin)
|
|
120
|
+
print('relevant_files:', len(d.get('relevant_files', [])))
|
|
121
|
+
for f in d.get('relevant_files', []):
|
|
122
|
+
print(' ', f.get('score'), f.get('path').split('/')[-1])
|
|
123
|
+
"
|
|
124
|
+
# Expected: 14 files, no tests, no GraphQL
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
*Pausado 2026-05-16 sesión 6 — gsd:pause-work*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 1.30.
|
|
3
|
+
Version: 1.30.1
|
|
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.30.
|
|
258
|
+
# sourcecode 1.30.1
|
|
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.30.
|
|
39
|
+
# sourcecode 1.30.1
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
---
|
|
@@ -1605,6 +1605,78 @@ class TaskContextBuilder:
|
|
|
1605
1605
|
# Binaries, images, lock files — treat as noise (closed taxonomy: no unknown_*)
|
|
1606
1606
|
return {"artifact_type": "ide_noise", "risk_areas": [], "impact_level": "noise", "is_noise": True, "module": module, "confidence": "low"}
|
|
1607
1607
|
|
|
1608
|
+
def _classify_diff_severity(self, path: str, since: Optional[str]) -> str:
|
|
1609
|
+
"""Classify the semantic severity of a file's diff to gate BFS expansion.
|
|
1610
|
+
|
|
1611
|
+
Returns: 'trivial' | 'field_change' | 'api_change' | 'security_change' | 'unknown'
|
|
1612
|
+
|
|
1613
|
+
- trivial: only comments/whitespace changed — no BFS expansion seeded
|
|
1614
|
+
- field_change: field/attribute declarations changed — hop-1 only, no hop-2+ frontier
|
|
1615
|
+
- api_change: method signatures or class structure changed — full BFS
|
|
1616
|
+
- security_change: auth/security keywords in changed lines — full BFS + security chain
|
|
1617
|
+
- unknown: diff unreadable — treated as api_change (safe default)
|
|
1618
|
+
"""
|
|
1619
|
+
import subprocess as _subprocess
|
|
1620
|
+
import re as _re
|
|
1621
|
+
|
|
1622
|
+
try:
|
|
1623
|
+
if since:
|
|
1624
|
+
cmd = ["git", "diff", since, "HEAD", "--", path]
|
|
1625
|
+
else:
|
|
1626
|
+
cmd = ["git", "diff", "HEAD", "--", path]
|
|
1627
|
+
result = _subprocess.run(
|
|
1628
|
+
cmd, capture_output=True, text=True, timeout=5,
|
|
1629
|
+
cwd=str(self.root), encoding="utf-8", errors="ignore",
|
|
1630
|
+
)
|
|
1631
|
+
diff_text = result.stdout
|
|
1632
|
+
except Exception:
|
|
1633
|
+
return "unknown"
|
|
1634
|
+
|
|
1635
|
+
if not diff_text.strip():
|
|
1636
|
+
return "unknown"
|
|
1637
|
+
|
|
1638
|
+
changed_lines = [
|
|
1639
|
+
line[1:] for line in diff_text.splitlines()
|
|
1640
|
+
if line.startswith(("+", "-")) and not line.startswith(("+++", "---"))
|
|
1641
|
+
]
|
|
1642
|
+
if not changed_lines:
|
|
1643
|
+
return "trivial"
|
|
1644
|
+
|
|
1645
|
+
suffix = Path(path).suffix.lower()
|
|
1646
|
+
if suffix in (".java", ".kt"):
|
|
1647
|
+
_TRIVIAL = _re.compile(r'^\s*(?://|/\*|\*)')
|
|
1648
|
+
_FIELD = _re.compile(r'^\s*(?:private|protected|public|final|static)\s+\w[\w<>, ]*\s+\w+\s*[;=]')
|
|
1649
|
+
_API = _re.compile(r'^\s*(?:public|protected)\s+\S.*\(')
|
|
1650
|
+
# Exclude 'password', 'role', 'permission' — these are common field names
|
|
1651
|
+
# in domain models and don't indicate auth logic changes. Keep mechanism
|
|
1652
|
+
# keywords: jwt, auth (as class prefix), token, credential, encrypt, decrypt, oauth.
|
|
1653
|
+
_SECURITY = _re.compile(r'\b(?:jwt|auth|token|credential|encrypt|decrypt|oauth|saml|ldap|principal|Security)\b')
|
|
1654
|
+
_STRUCT = _re.compile(r'^\s*(?:class|interface|enum|record|import|package)\s')
|
|
1655
|
+
elif suffix == ".py":
|
|
1656
|
+
_TRIVIAL = _re.compile(r'^\s*#')
|
|
1657
|
+
_FIELD = _re.compile(r'^\s*(?:self\.\w+\s*=|\w+:\s*\w)')
|
|
1658
|
+
_API = _re.compile(r'^\s*def\s+\w')
|
|
1659
|
+
_SECURITY = _re.compile(r'\b(?:jwt|auth|token|credential|encrypt|decrypt|oauth|saml|ldap|principal|security)\b', _re.IGNORECASE)
|
|
1660
|
+
_STRUCT = _re.compile(r'^\s*(?:class|import|from)\s')
|
|
1661
|
+
elif suffix in (".ts", ".tsx", ".js", ".jsx", ".mjs"):
|
|
1662
|
+
_TRIVIAL = _re.compile(r'^\s*(?://|/\*|\*)')
|
|
1663
|
+
_FIELD = _re.compile(r'^\s*(?:private|readonly|public)?\s*\w+[?!]?\s*[=:]')
|
|
1664
|
+
_API = _re.compile(r'^\s*(?:(?:public|private|protected|async|export)\s+)*(?:function\s+\w|\w+\s*\()')
|
|
1665
|
+
_SECURITY = _re.compile(r'\b(?:jwt|auth|token|credential|encrypt|decrypt|oauth|saml|ldap|principal|security)\b', _re.IGNORECASE)
|
|
1666
|
+
_STRUCT = _re.compile(r'^\s*(?:class|interface|import|export\s+(?:class|interface|type))\s')
|
|
1667
|
+
else:
|
|
1668
|
+
return "unknown"
|
|
1669
|
+
|
|
1670
|
+
if any(_SECURITY.search(line) for line in changed_lines):
|
|
1671
|
+
return "security_change"
|
|
1672
|
+
if any(_API.match(line) or _STRUCT.match(line) for line in changed_lines):
|
|
1673
|
+
return "api_change"
|
|
1674
|
+
if any(_FIELD.match(line) for line in changed_lines):
|
|
1675
|
+
return "field_change"
|
|
1676
|
+
if all(_TRIVIAL.match(line) or not line.strip() for line in changed_lines):
|
|
1677
|
+
return "trivial"
|
|
1678
|
+
return "field_change" # safe default: treat unknown non-trivial as field-level
|
|
1679
|
+
|
|
1608
1680
|
def _scan_import_dependents(
|
|
1609
1681
|
self,
|
|
1610
1682
|
changed_paths: list[str],
|
|
@@ -1888,6 +1960,16 @@ class TaskContextBuilder:
|
|
|
1888
1960
|
f: self._classify_changed_file(f) for f in changed_files
|
|
1889
1961
|
}
|
|
1890
1962
|
|
|
1963
|
+
# ── Step 1b: classify diff severity to gate BFS expansion ─────────────
|
|
1964
|
+
# trivial → no BFS seeding (comments/whitespace only)
|
|
1965
|
+
# field_change → hop-1 BFS only, deps excluded from hop-2+ frontier
|
|
1966
|
+
# api_change → full BFS (method signature or class structure changed)
|
|
1967
|
+
# security_change → full BFS + security chain allowed cross-module
|
|
1968
|
+
# unknown → treated as api_change (safe default)
|
|
1969
|
+
diff_severities: dict[str, str] = {
|
|
1970
|
+
f: self._classify_diff_severity(f, since) for f in changed_files
|
|
1971
|
+
}
|
|
1972
|
+
|
|
1891
1973
|
# ── Step 2: build relevant_files from the changed set ─────────────────
|
|
1892
1974
|
relevant: list[RelevantFile] = []
|
|
1893
1975
|
why: dict[str, str] = {}
|
|
@@ -2004,9 +2086,12 @@ class TaskContextBuilder:
|
|
|
2004
2086
|
]
|
|
2005
2087
|
|
|
2006
2088
|
_bfs_seen: set[str] = {rf.path for rf in relevant}
|
|
2089
|
+
# trivial changes (comments/whitespace only) don't seed BFS — nothing structural
|
|
2090
|
+
# to propagate, so excluding them prevents false expansion on cosmetic commits
|
|
2007
2091
|
_bfs_frontier: list[str] = [
|
|
2008
2092
|
f for f in changed_files
|
|
2009
2093
|
if Path(f).suffix.lower() in _BFS_SCANNABLE
|
|
2094
|
+
and diff_severities.get(f, "unknown") != "trivial"
|
|
2010
2095
|
]
|
|
2011
2096
|
|
|
2012
2097
|
# (max results added from this hop, max_candidates scanned per seed)
|
|
@@ -2035,6 +2120,8 @@ class TaskContextBuilder:
|
|
|
2035
2120
|
|
|
2036
2121
|
# collect (score, path) pairs for this hop to build the next frontier
|
|
2037
2122
|
_hop_scored: list[tuple[float, str]] = []
|
|
2123
|
+
# per-hop staging list — capped at _max_results before merging into _bfs_collected
|
|
2124
|
+
_hop_bfs_staged: list[tuple[int, float, str, RelevantFile]] = []
|
|
2038
2125
|
|
|
2039
2126
|
for _seed_path, _dep_paths in _hop_dep_map.items():
|
|
2040
2127
|
_seed_atype = (
|
|
@@ -2042,6 +2129,9 @@ class TaskContextBuilder:
|
|
|
2042
2129
|
if _seed_path in classifications
|
|
2043
2130
|
else self._classify_changed_file(_seed_path)["artifact_type"]
|
|
2044
2131
|
)
|
|
2132
|
+
# diff severity for original changed files only (hop-1 seeds);
|
|
2133
|
+
# hop-2+ seeds are dep files not in diff_severities → "unknown"
|
|
2134
|
+
_seed_severity = diff_severities.get(_seed_path, "unknown")
|
|
2045
2135
|
for _dep_path in _dep_paths:
|
|
2046
2136
|
if _dep_path in _bfs_seen:
|
|
2047
2137
|
continue
|
|
@@ -2052,9 +2142,29 @@ class TaskContextBuilder:
|
|
|
2052
2142
|
continue
|
|
2053
2143
|
|
|
2054
2144
|
_dep_atype = _dep_cls["artifact_type"]
|
|
2145
|
+
_dep_module = _dep_cls["module"]
|
|
2146
|
+
|
|
2147
|
+
# Cross-module gating: if dep lives in a different domain module,
|
|
2148
|
+
# only allow it if:
|
|
2149
|
+
# hop-1 AND dep_atype is explicitly in seed's _EXPANSION_TARGETS
|
|
2150
|
+
# For hop-2+, cross-module deps are always excluded — transitives
|
|
2151
|
+
# must stay within the changed modules to avoid system-wide explosion.
|
|
2152
|
+
_is_cross_module = bool(_dep_module) and _dep_module not in affected_modules_set
|
|
2153
|
+
if _is_cross_module:
|
|
2154
|
+
_seed_expansion = _EXPANSION_TARGETS.get(_seed_atype, frozenset())
|
|
2155
|
+
# security_change seeds are allowed to cross into the security chain
|
|
2156
|
+
# even when their base expansion targets don't include those types
|
|
2157
|
+
if _seed_severity == "security_change":
|
|
2158
|
+
_seed_expansion = _seed_expansion | frozenset({"security", "spring_config", "config"})
|
|
2159
|
+
if _hop_num >= 2 or _dep_atype not in _seed_expansion:
|
|
2160
|
+
continue
|
|
2161
|
+
|
|
2055
2162
|
_dep_score_base = _ARTIFACT_SCORE.get(_dep_atype, 0.45)
|
|
2056
2163
|
# score decays 30% per hop so transitives rank below direct dependents
|
|
2057
|
-
|
|
2164
|
+
# cross-module deps get additional 40% penalty so same-module files
|
|
2165
|
+
# always rank higher in the per-hop cap
|
|
2166
|
+
_cross_module_factor = 0.60 if _is_cross_module else 1.0
|
|
2167
|
+
_dep_score = round(_dep_score_base * (0.70 ** _hop_num) * _cross_module_factor, 2)
|
|
2058
2168
|
_dep_role = _role_in_system(_dep_path, _dep_atype, _dep_path in ep_paths)
|
|
2059
2169
|
|
|
2060
2170
|
_why_str = (
|
|
@@ -2069,27 +2179,44 @@ class TaskContextBuilder:
|
|
|
2069
2179
|
f" ({_seed_atype}) | score: {_dep_score:.2f}"
|
|
2070
2180
|
)
|
|
2071
2181
|
why[_dep_path] = _why_str
|
|
2072
|
-
# Tests are
|
|
2073
|
-
#
|
|
2182
|
+
# Tests import production code but are not structural dependencies —
|
|
2183
|
+
# exclude from graph, frontier, and bfs_collected entirely.
|
|
2074
2184
|
_is_test = _dep_atype == "test"
|
|
2075
2185
|
if not _is_test:
|
|
2076
2186
|
graph_edges.append({
|
|
2077
2187
|
"from": _seed_path, "to": _dep_path,
|
|
2078
2188
|
"edge_type": "import_dependency", "hop": _hop_num,
|
|
2079
2189
|
})
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
|
|
2190
|
+
# field_change seeds don't propagate to hop-2+ frontier:
|
|
2191
|
+
# a field-level change (getter, attribute) is collected at hop-1
|
|
2192
|
+
# but its callers are not recursively expanded further
|
|
2193
|
+
if _seed_severity != "field_change":
|
|
2194
|
+
_hop_scored.append((_dep_score, _dep_path))
|
|
2195
|
+
_hop_bfs_staged.append((_hop_num, _dep_score, _dep_path, RelevantFile(
|
|
2196
|
+
path=_dep_path, role=_dep_role, score=_dep_score,
|
|
2197
|
+
reason=_reason, why=_why_str,
|
|
2198
|
+
)))
|
|
2199
|
+
|
|
2200
|
+
# Per-hop cap: keep only the top-_max_results by score before merging.
|
|
2201
|
+
# Prevents a single high-fanout seed (e.g. User.java imported by every
|
|
2202
|
+
# controller) from flooding _bfs_collected and pushing out hop-2/3 results.
|
|
2203
|
+
_hop_bfs_staged.sort(key=lambda x: (-x[1], x[2]))
|
|
2204
|
+
_bfs_collected.extend(_hop_bfs_staged[:_max_results])
|
|
2085
2205
|
|
|
2086
2206
|
# next frontier = top-N files by score from this hop
|
|
2087
2207
|
_hop_scored.sort(key=lambda x: -x[0])
|
|
2088
2208
|
_bfs_frontier = [p for _, p in _hop_scored[:_max_results]]
|
|
2089
2209
|
|
|
2090
|
-
# merge into relevant: closer hops first, then higher score; cap total at
|
|
2210
|
+
# merge into relevant: closer hops first, then higher score; cap total at 18
|
|
2091
2211
|
_bfs_collected.sort(key=lambda x: (x[0], -x[1], x[2]))
|
|
2092
|
-
|
|
2212
|
+
_bfs_cap = sum(budget[0] for budget in _BFS_HOP_BUDGET) # 8+6+4 = 18
|
|
2213
|
+
relevant.extend(rf for _, _, _, rf in _bfs_collected[:_bfs_cap])
|
|
2214
|
+
|
|
2215
|
+
# Truncation guard: flag excess expansion — gap message added in Step 6.
|
|
2216
|
+
_EXPANSION_HARD_LIMIT = 40
|
|
2217
|
+
_expansion_truncated = len(relevant) > _EXPANSION_HARD_LIMIT
|
|
2218
|
+
if _expansion_truncated:
|
|
2219
|
+
relevant = relevant[:_EXPANSION_HARD_LIMIT]
|
|
2093
2220
|
|
|
2094
2221
|
# ── Step 3d: per-file impact scores, change_type, system_impact ─────────
|
|
2095
2222
|
# Downstream fanout: count graph edges originating from each changed file
|
|
@@ -2263,6 +2390,11 @@ class TaskContextBuilder:
|
|
|
2263
2390
|
analysis_gaps: list[str] = [
|
|
2264
2391
|
f"Related file expansion: type-aware chain expansion + {_bfs_note} + module/directory heuristics",
|
|
2265
2392
|
]
|
|
2393
|
+
if _expansion_truncated:
|
|
2394
|
+
analysis_gaps.insert(0,
|
|
2395
|
+
f"truncated_dependency_graph: expansion exceeded {_EXPANSION_HARD_LIMIT} nodes"
|
|
2396
|
+
" — lower-priority files omitted. Narrow scope with --since <ref> for precision."
|
|
2397
|
+
)
|
|
2266
2398
|
if noise_count > 0 and meaningful > 0:
|
|
2267
2399
|
analysis_gaps.append(
|
|
2268
2400
|
f"{noise_count} IDE/tooling file(s) in diff excluded from impact analysis"
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
# Continue Here — atlas-cli session 5
|
|
2
|
-
|
|
3
|
-
**Paused:** 2026-05-16 (sesión 5)
|
|
4
|
-
**Repo:** `/Users/user/Downloads/atlas-cli`
|
|
5
|
-
**Branch:** master
|
|
6
|
-
**Commits esta sesión:** `e5a1a05` + `5c06ef3` (ambos committed, working tree limpio)
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## Lo que se hizo esta sesión
|
|
11
|
-
|
|
12
|
-
### Fix 1 — Windows encoding crash en `--since` (`e5a1a05`)
|
|
13
|
-
|
|
14
|
-
**Root cause:** `_get_available_refs()` en `prepare_context.py` llamaba `subprocess.run(text=True)` sin `encoding=` — usaba cp1252 en Windows. Byte 0x8d → `UnicodeDecodeError` no capturado. Además `r.stdout.splitlines()` sin guard → `AttributeError` si stdout fuera None.
|
|
15
|
-
|
|
16
|
-
**Fix:** dos líneas en `prepare_context.py:2309-2315`:
|
|
17
|
-
```python
|
|
18
|
-
encoding="utf-8", errors="replace", # añadido
|
|
19
|
-
(r.stdout or "").splitlines() # guard añadido
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
**Tests añadidos:** `tests/test_encoding_regression.py` — clase `TestGetAvailableRefsWindowsEncoding` (4 casos: stdout=None, bytes inválidos, ref inexistente, returncode!=0).
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
### Fix 2 — `review-pr` reescrito como pipeline delta-first (`5c06ef3`)
|
|
27
|
-
|
|
28
|
-
**Problema:** `review-pr` devolvía output genérico de repo completo sin diff real. Inútil para CI/PR review.
|
|
29
|
-
|
|
30
|
-
**Cambios:**
|
|
31
|
-
|
|
32
|
-
| Archivo | Qué cambió |
|
|
33
|
-
|---------|-----------|
|
|
34
|
-
| `prepare_context.py` | Gate 5d: 3 errores tempranos (no_git_repo, no_diff, git_ref_not_found). Reutiliza `_build_delta_impact`. Deriva security_impact/transactional_impact/test_coverage_risk del análisis delta. 7 nuevos campos en TaskOutput. |
|
|
35
|
-
| `cli.py` | Content map review-pr. Bloque output PR-específico. Error JSON + exit(1). Help text. |
|
|
36
|
-
| `test_v1_10_regressions.py` | 3 tests viejos (comportamiento genérico) reemplazados por 4 nuevos (gate git + mocks). |
|
|
37
|
-
|
|
38
|
-
**Nuevos campos en output:**
|
|
39
|
-
```json
|
|
40
|
-
{
|
|
41
|
-
"review_type": "pull_request",
|
|
42
|
-
"ci_decision": "analysis_success",
|
|
43
|
-
"base_ref": "origin/main",
|
|
44
|
-
"changed_files": [...],
|
|
45
|
-
"affected_modules": [...],
|
|
46
|
-
"security_impact": {"affected_resources": [...], "risk_level": "high"},
|
|
47
|
-
"transactional_impact": {"affected_transactions": [...], "risk": "..."},
|
|
48
|
-
"test_coverage_risk": {"changed_files_without_tests": [...], "risk_level": "medium"},
|
|
49
|
-
"review_hotspots": [...],
|
|
50
|
-
"suggested_review_order": [...]
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
**GitHub Actions ready:**
|
|
55
|
-
```yaml
|
|
56
|
-
- run: sourcecode prepare-context review-pr . --since origin/main --output review.json
|
|
57
|
-
# exit 1 si no hay diff o ref no existe
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
## Estado de tests al pausar
|
|
63
|
-
|
|
64
|
-
```
|
|
65
|
-
770 passed, 3 skipped
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
Fallos pre-existentes (no relacionados, ya presentes antes de esta sesión):
|
|
69
|
-
- `test_block2_coverage.py::test_java_marked_unsupported` — `DocRecord.__init__` bug en `doc_analyzer.py`
|
|
70
|
-
- `test_dependency_analyzer_node_python.py::test_python_requirements_without_lockfile` — typer version mismatch
|
|
71
|
-
|
|
72
|
-
---
|
|
73
|
-
|
|
74
|
-
## Pendiente / próximos pasos opcionales
|
|
75
|
-
|
|
76
|
-
1. **Smoke test review-pr en saint-server real con diff:**
|
|
77
|
-
```bash
|
|
78
|
-
cd saint-server
|
|
79
|
-
git checkout -b test-review-pr
|
|
80
|
-
# modificar un controller
|
|
81
|
-
sourcecode prepare-context review-pr . --since main --output /tmp/review.json
|
|
82
|
-
cat /tmp/review.json | python3 -c "import json,sys; d=json.load(sys.stdin); print('sections:', list(d.keys()))"
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
2. **Verificar `security_impact` detecta correctamente:** cambiar un `SecurityConfig.java` y comprobar que aparece en `security_impact.affected_resources`.
|
|
86
|
-
|
|
87
|
-
3. **`suggested_review_order` calidad:** verificar que el orden security→controller→service es correcto en PR reales con múltiples tipos de archivos.
|
|
88
|
-
|
|
89
|
-
4. **`test_coverage_risk` stem matching sin normalización:** el gap entre `generate-tests` (normaliza `TestFoo→Foo`) y `review-pr` (stem directo). Si da falsos "untested", añadir normalización.
|
|
90
|
-
|
|
91
|
-
5. **Agent token reduction** (trabajo sesiones anteriores): smoke test pendiente en saint-server — ver handoff sesión 4 para comandos.
|
|
92
|
-
|
|
93
|
-
---
|
|
94
|
-
|
|
95
|
-
## Para retomar
|
|
96
|
-
|
|
97
|
-
```bash
|
|
98
|
-
cd /Users/user/Downloads/atlas-cli
|
|
99
|
-
git log --oneline -3
|
|
100
|
-
# debe mostrar:
|
|
101
|
-
# 5c06ef3 (feature) implementando mejoras significativas en prepare-context review-pr...
|
|
102
|
-
# e5a1a05 corrigiendo bug en delta --since en windows
|
|
103
|
-
# f1cb001 corrigiendo bug --agent que duplicaba tokens sin justificación
|
|
104
|
-
|
|
105
|
-
python3 -m pytest tests/ \
|
|
106
|
-
--ignore=tests/test_block2_coverage.py \
|
|
107
|
-
--deselect=tests/test_dependency_analyzer_node_python.py::test_python_requirements_without_lockfile_keeps_declared_versions \
|
|
108
|
-
-q
|
|
109
|
-
# Expected: 770 passed, 3 skipped
|
|
110
|
-
|
|
111
|
-
# Smoke test review-pr
|
|
112
|
-
sourcecode prepare-context review-pr . --since HEAD~1 --output /tmp/review.json
|
|
113
|
-
python3 -c "import json; d=json.load(open('/tmp/review.json')); print(list(d.keys()))"
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
*Pausado 2026-05-16 sesión 5 — gsd:pause-work*
|
{sourcecode-1.30.0 → sourcecode-1.30.1}/.agents/skills/source-command-gsd-join-discord/SKILL.md
RENAMED
|
File without changes
|
{sourcecode-1.30.0 → sourcecode-1.30.1}/.agents/skills/source-command-gsd-review-backlog/SKILL.md
RENAMED
|
File without changes
|
{sourcecode-1.30.0 → sourcecode-1.30.1}/.agents/skills/source-command-gsd-workstreams/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|