sourcecode 1.30.6__tar.gz → 1.30.7__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.7/.continue-here.md +173 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/PKG-INFO +3 -3
- {sourcecode-1.30.6 → sourcecode-1.30.7}/README.md +2 -2
- {sourcecode-1.30.6 → sourcecode-1.30.7}/pyproject.toml +1 -1
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/__init__.py +1 -1
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/cli.py +6 -1
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/prepare_context.py +90 -23
- sourcecode-1.30.6/.continue-here.md +0 -163
- {sourcecode-1.30.6 → sourcecode-1.30.7}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/.gitignore +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/.ruff.toml +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/CONTRIBUTING.md +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/LICENSE +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/SECURITY.md +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/docs/privacy.md +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/docs/schema.md +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/raw +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/run_cli.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/classifier.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/flow_analyzer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/progress.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/redactor.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/scanner.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/schema.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/serializer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/src/sourcecode/workspace.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/__init__.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/conftest.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/coverage.xml +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/fastapi_app/src/main.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/go_service/cmd/api/main.go +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/go_service/go.mod +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/jacoco.xml +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/latin1_sample.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/latin1_sample_iso.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/lcov.info +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/nextjs_app/package.json +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/pom.xml +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/application/service/FindAusenteService.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/domain/entities/Ausente.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/infrastructure/rest/AusenteRestController.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/application/service/FindAutocoberturasService.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/domain/entities/Autocoberturas.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/infrastructure/rest/AutocoberturasRestController.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/application/service/FindCalendarioTrabajadorService.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/domain/entities/CalendarioTrabajador.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/infrastructure/rest/CalendarioTrabajadorRestController.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/application/service/FindDepartamentoService.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/domain/entities/Departamento.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/infrastructure/rest/DepartamentoRestController.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/application/service/FindEmpleadoService.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/domain/entities/Empleado.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/infrastructure/rest/EmpleadoRestController.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/DemoApplication.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/config/FilterConfig.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/domain/Health.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/mapper/HealthMapper.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/repository/HealthRepository.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/service/HealthService.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/HealthRestController.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/NominaRestController.java +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/resources/application-dev.yml +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/resources/application.yml +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/fixtures/spring_boot_minimal/src/main/resources/mapper/HealthMapper.xml +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_architecture_analyzer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_architecture_summary.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_ast_extractor.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_block1_reliability.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_block2_coverage.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_block5_quality.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_bug_fixes_v16.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_classifier.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_cli.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_code_notes_analyzer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_context_scorer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_contract_pipeline.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_coverage_parser.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_cross_consistency.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_dependency_analyzer_node_python.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_dependency_analyzer_polyglot.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_dependency_schema.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_detector_dotnet.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_detector_go_rust_java.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_detector_nodejs.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_detector_php_ruby_dart.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_detector_python.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_detector_universal_managed.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_detector_universal_systems.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_detectors_base.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_doc_analyzer_jsdom.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_doc_analyzer_python.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_encoding_regression.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_graph_analyzer_polyglot.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_graph_analyzer_python_node.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_graph_schema.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_hybrid_inference.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_integration.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_integration_dependencies.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_integration_detection.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_integration_docs.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_integration_graph_modules.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_integration_lqn.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_integration_metrics.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_integration_multistack.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_integration_semantics.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_integration_universal.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_java_spring_integration.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_metrics_analyzer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_packaging.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_phase1_improvements.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_pipeline_integrity.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_real_projects.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_redactor.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_scanner.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_schema.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_schema_normalization.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_semantic_analyzer_node.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_semantic_analyzer_python.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_semantic_import_resolution.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_semantic_schema.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_signal_hierarchy.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_summarizer.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_surface_honesty.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_task_differentiation.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_telemetry.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_v1_10_regressions.py +0 -0
- {sourcecode-1.30.6 → sourcecode-1.30.7}/tests/test_workspace_analyzer.py +0 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# Continue Here — atlas-cli sesión 10
|
|
2
|
+
|
|
3
|
+
**Paused:** 2026-05-16 (sesión 10)
|
|
4
|
+
**Repo:** `/Users/user/Downloads/atlas-cli`
|
|
5
|
+
**Branch:** master
|
|
6
|
+
**Último commit:** `f269c64` — (fix)solucionando bug de review-pr en repos masivos
|
|
7
|
+
**Working tree:** CLEAN
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Lo que se hizo esta sesión
|
|
12
|
+
|
|
13
|
+
### Fix 1: Contrato de verdad en `behavioral_impact` (Fase 1 del rediseño)
|
|
14
|
+
|
|
15
|
+
Motivación: output parecía "falsa autoridad" — emitía paths sin indicar nivel de evidencia.
|
|
16
|
+
|
|
17
|
+
**Cambios en `flow_analyzer.py`:**
|
|
18
|
+
|
|
19
|
+
Nuevas helpers:
|
|
20
|
+
- `_classify_evidence_type(clean, class_name)` → `"direct_injection" | "direct_call" | "heuristic_only" | "none"`
|
|
21
|
+
- `_worst_evidence(levels)` → evidencia más débil de la cadena
|
|
22
|
+
- `_compute_confidence(evidence_level, trace_len)` → `"high" | "medium" | "low"`
|
|
23
|
+
- `_build_trace_step(source, target, evidence_type)` → e.g. `"ArticleController injects ArticleFavoriteService"`
|
|
24
|
+
- `_impact_item(statement, support, certainty)` → dict con 3 campos
|
|
25
|
+
|
|
26
|
+
**Nuevo schema de cada entry en `behavioral_impact`:**
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
{
|
|
30
|
+
"entry_point": "ArticleController.favoriteArticle",
|
|
31
|
+
"affected_path": ["ArticleFavoriteService.favorite", "ArticleFavoriteRepository.save"],
|
|
32
|
+
"impact": [
|
|
33
|
+
{
|
|
34
|
+
"statement": "article favorite persistence affected",
|
|
35
|
+
"support": "ArticleFavoriteRepository is a repository in path",
|
|
36
|
+
"certainty": "medium"
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
"end_state": "DB write",
|
|
40
|
+
"confidence": "high",
|
|
41
|
+
"evidence_level": "direct_injection",
|
|
42
|
+
"trace": [
|
|
43
|
+
"ArticleController injects ArticleFavoriteService",
|
|
44
|
+
"ArticleFavoriteService injects ArticleFavoriteRepository"
|
|
45
|
+
]
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Regla: no trace → no entry. `heuristic_only` → confidence máximo `low`.
|
|
50
|
+
Scope de `impact`: solo persistence + security annotations + `@Transactional`.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
### Fix 2: Git-first scope resolution para `review-pr`
|
|
55
|
+
|
|
56
|
+
Motivación: `review-pr` colgaba en repos grandes (Broadleaf Commerce) por traversal completo del filesystem antes de conocer el scope.
|
|
57
|
+
|
|
58
|
+
**Nuevo flujo:**
|
|
59
|
+
```
|
|
60
|
+
ANTES: filesystem scan → heuristics → analysis
|
|
61
|
+
AHORA: git diff → scope resolution → targeted loading → analysis
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**Cambios en `prepare_context.py`:**
|
|
65
|
+
|
|
66
|
+
Nuevos métodos en `TaskContextBuilder`:
|
|
67
|
+
- `_resolve_git_root()` → `git rev-parse --show-toplevel`
|
|
68
|
+
- `_get_pr_scope_files(since)` → union de `git diff HEAD~1` + `git diff HEAD` + staged + untracked; filtra paths `../`
|
|
69
|
+
- `_expand_scope_for_analysis(scope_files)` → scope files + siblings en mismos directorios (depth=1)
|
|
70
|
+
|
|
71
|
+
Nuevo Step 0 en `build()` (antes del scanner):
|
|
72
|
+
- Resuelve git root + scope completo
|
|
73
|
+
- Early returns para no-git y ref inválida (sin hacer ningún scan)
|
|
74
|
+
|
|
75
|
+
Step 1 (scanner) — rama git-first:
|
|
76
|
+
- Skip `AdaptiveScanner` completamente → `file_tree = {}`
|
|
77
|
+
- `all_paths = _expand_scope_for_analysis(scope_files)` (bounded context para behavioral_impact)
|
|
78
|
+
|
|
79
|
+
Step 2 (detection) — rama git-first:
|
|
80
|
+
- Skip workspace sub-scans (cada workspace corría su propio `AdaptiveScanner`)
|
|
81
|
+
|
|
82
|
+
Step 5d — simplificado:
|
|
83
|
+
- Ya no re-corre git (scope pre-resuelto en step 0)
|
|
84
|
+
- Solo: `_delta_files = set(_pr_scope_files)`
|
|
85
|
+
|
|
86
|
+
Nuevos campos en `TaskOutput`: `scope_source`, `scope_files`, `repo_root`.
|
|
87
|
+
|
|
88
|
+
Output JSON nuevo bloque:
|
|
89
|
+
```json
|
|
90
|
+
"scope": {
|
|
91
|
+
"source": "git_diff,untracked",
|
|
92
|
+
"files": [...],
|
|
93
|
+
"repo_root": "/path/to/repo"
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**Tiempo real:** 1.2s (antes: ∞ en Broadleaf).
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Estado de tests
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
777 passed, 3 skipped, 1 deselected
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Commits de esta sesión
|
|
110
|
+
|
|
111
|
+
| Hash | Descripción |
|
|
112
|
+
|------|-------------|
|
|
113
|
+
| `fc861e1` | (fix)incrementando representatividad del análisis de flujo |
|
|
114
|
+
| `f269c64` | (fix)solucionando bug de review-pr en repos masivos |
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Pendiente
|
|
119
|
+
|
|
120
|
+
1. **Smoke test `behavioral_impact`** en repo real spring-boot:
|
|
121
|
+
```bash
|
|
122
|
+
cd ~/Documents/workspace/spring-boot-realworld-example-app
|
|
123
|
+
sourcecode prepare-context review-pr . 2>/dev/null | python3 -c "
|
|
124
|
+
import json, sys
|
|
125
|
+
d = json.load(sys.stdin)
|
|
126
|
+
for bi in d.get('behavioral_impact', []):
|
|
127
|
+
print('entry:', bi['entry_point'])
|
|
128
|
+
print('confidence:', bi['confidence'])
|
|
129
|
+
print('trace:', bi['trace'])
|
|
130
|
+
print()
|
|
131
|
+
"
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
2. **Smoke test en Broadleaf Commerce** — verificar que no cuelga:
|
|
135
|
+
```bash
|
|
136
|
+
cd ~/Documents/workspace/broadleaf-commerce
|
|
137
|
+
time sourcecode prepare-context review-pr . 2>/dev/null | python3 -c "
|
|
138
|
+
import json, sys
|
|
139
|
+
d = json.load(sys.stdin)
|
|
140
|
+
print('scope_source:', d.get('scope', {}).get('source'))
|
|
141
|
+
print('scope_files:', len(d.get('scope', {}).get('files', [])))
|
|
142
|
+
"
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
3. **Evaluar si `execution_paths` sigue siendo útil** o si `behavioral_impact` lo reemplaza.
|
|
146
|
+
|
|
147
|
+
4. **Fase 2 del rediseño behavioral_impact** — smoke en Broadleaf, medir false positives.
|
|
148
|
+
|
|
149
|
+
5. **Tests unitarios para `_classify_diff_severity`** — sin tests.
|
|
150
|
+
|
|
151
|
+
6. **`User.java` clasificado como `"source"` no `"domain_model"`** — fix opcional.
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Para retomar
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
cd /Users/user/Downloads/atlas-cli
|
|
159
|
+
git log --oneline -3
|
|
160
|
+
|
|
161
|
+
python3 -m pytest tests/ \
|
|
162
|
+
--ignore=tests/test_block2_coverage.py \
|
|
163
|
+
--ignore=tests/test_packaging.py \
|
|
164
|
+
--deselect=tests/test_dependency_analyzer_node_python.py::test_python_requirements_without_lockfile_keeps_declared_versions \
|
|
165
|
+
-q
|
|
166
|
+
# Expected: 777 passed
|
|
167
|
+
|
|
168
|
+
python3 -m pytest tests/test_v1_10_regressions.py::TestBehavioralImpact tests/test_v1_10_regressions.py::TestReviewPrSuspectedAreas -v
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
*Pausado 2026-05-16 sesión 10 — 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.7
|
|
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
|
**Deterministic, behavior-aware codebase context for AI agents and PR review.**
|
|
223
223
|
|
|
224
|
-

|
|
225
225
|

|
|
226
226
|
|
|
227
227
|
---
|
|
@@ -257,7 +257,7 @@ pipx install sourcecode
|
|
|
257
257
|
|
|
258
258
|
```bash
|
|
259
259
|
sourcecode version
|
|
260
|
-
# sourcecode 1.30.
|
|
260
|
+
# sourcecode 1.30.7
|
|
261
261
|
```
|
|
262
262
|
|
|
263
263
|
---
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**Deterministic, behavior-aware codebase context for AI agents and PR review.**
|
|
4
4
|
|
|
5
|
-

|
|
6
6
|

|
|
7
7
|
|
|
8
8
|
---
|
|
@@ -38,7 +38,7 @@ pipx install sourcecode
|
|
|
38
38
|
|
|
39
39
|
```bash
|
|
40
40
|
sourcecode version
|
|
41
|
-
# sourcecode 1.30.
|
|
41
|
+
# sourcecode 1.30.7
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
---
|
|
@@ -1760,7 +1760,7 @@ def prepare_context_cmd(
|
|
|
1760
1760
|
out["architecture_summary"] = output.architecture_summary
|
|
1761
1761
|
if _task_include("confidence"):
|
|
1762
1762
|
out["confidence"] = output.confidence
|
|
1763
|
-
if _task_include("relevant_files"):
|
|
1763
|
+
if task != "review-pr" and _task_include("relevant_files"):
|
|
1764
1764
|
out["relevant_files"] = [
|
|
1765
1765
|
{k: v for k, v in asdict(f).items() if v != ""}
|
|
1766
1766
|
for f in output.relevant_files
|
|
@@ -1862,6 +1862,11 @@ def prepare_context_cmd(
|
|
|
1862
1862
|
out["configuration_impact"] = output.configuration_impact
|
|
1863
1863
|
if output.test_coverage_risk:
|
|
1864
1864
|
out["test_coverage_risk"] = output.test_coverage_risk
|
|
1865
|
+
# honest split: runtime files vs build artifacts — no mixed ranking
|
|
1866
|
+
if output.runtime_changes:
|
|
1867
|
+
out["runtime_changes"] = output.runtime_changes
|
|
1868
|
+
if output.build_changes:
|
|
1869
|
+
out["build_changes"] = output.build_changes
|
|
1865
1870
|
if output.review_hotspots:
|
|
1866
1871
|
out["review_hotspots"] = output.review_hotspots
|
|
1867
1872
|
if output.suggested_review_order:
|
|
@@ -357,6 +357,9 @@ class TaskOutput:
|
|
|
357
357
|
scope_source: Optional[str] = None # "git_diff" | "staged" | "untracked" | "full_scan_fallback"
|
|
358
358
|
scope_files: list[str] = field(default_factory=list)
|
|
359
359
|
repo_root: Optional[str] = None
|
|
360
|
+
# honest output schema (review-pr only): runtime vs build split
|
|
361
|
+
runtime_changes: list[dict] = field(default_factory=list)
|
|
362
|
+
build_changes: dict = field(default_factory=dict)
|
|
360
363
|
|
|
361
364
|
|
|
362
365
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -416,6 +419,26 @@ _ALL_EXTENSIONS: frozenset[str] = _SOURCE_EXTENSIONS | frozenset({
|
|
|
416
419
|
".md", ".toml", ".yaml", ".yml", ".json", ".xml",
|
|
417
420
|
})
|
|
418
421
|
|
|
422
|
+
_ARTIFACT_CHANGE_EFFECT: dict[str, str] = {
|
|
423
|
+
"entrypoint": "modifies application startup, CLI entry, or framework bootstrap — all request flows may be affected",
|
|
424
|
+
"controller": "alters HTTP routing, API contract, or response shape — API consumers are affected",
|
|
425
|
+
"service": "changes business rules, transaction scope, or orchestration logic — callers and dependents affected",
|
|
426
|
+
"repository": "modifies persistence queries or data access patterns — data consistency and service layer affected",
|
|
427
|
+
"mapper": "alters SQL-to-object binding or query templates — data shape and repositories affected",
|
|
428
|
+
"security": "changes authentication flow, access control rules, or session handling — all secured endpoints affected",
|
|
429
|
+
"spring_config": "modifies bean wiring, datasource, or framework-wide settings — all wired beans potentially affected",
|
|
430
|
+
"spring_profile": "changes environment-specific overrides — behavior differs per active profile",
|
|
431
|
+
"config": "adjusts configuration values — all modules reading this config are affected",
|
|
432
|
+
"build_manifest": "changes dependencies, plugins, or project structure — compile-time and runtime classpath affected",
|
|
433
|
+
"db_migration": "modifies database schema — existing queries, mappings, and constraints may break",
|
|
434
|
+
"domain_model": "alters entity structure — cascades to repositories, DTOs, serializers, and mappers",
|
|
435
|
+
"dto": "changes data transfer contract — serialization and API consumers may break",
|
|
436
|
+
"test": "modifies test coverage or test behavior — no production code affected",
|
|
437
|
+
"documentation": "updates documentation only — no runtime impact",
|
|
438
|
+
"ide_noise": "IDE/tooling artifact — no application impact",
|
|
439
|
+
"source": "modifies application source — artifact role derived from file path structure",
|
|
440
|
+
}
|
|
441
|
+
|
|
419
442
|
# Maps frontend symptom keywords → backend terms likely to contain the root cause.
|
|
420
443
|
# Used to boost service/interceptor files when the symptom is UI-only.
|
|
421
444
|
_FRONTEND_SYMPTOM_MAP: dict[str, list[str]] = {
|
|
@@ -830,6 +853,8 @@ class TaskContextBuilder:
|
|
|
830
853
|
_pr_review_hotspots: list[str] = []
|
|
831
854
|
_pr_suggested_review_order: list[str] = []
|
|
832
855
|
_pr_base_ref: Optional[str] = None
|
|
856
|
+
_pr_runtime_changes: list[dict] = []
|
|
857
|
+
_pr_build_changes: dict = {}
|
|
833
858
|
|
|
834
859
|
if task_name == "review-pr":
|
|
835
860
|
_pr_base_ref = since or "HEAD"
|
|
@@ -879,14 +904,21 @@ class TaskContextBuilder:
|
|
|
879
904
|
"risk_level": _test_risk_level,
|
|
880
905
|
}
|
|
881
906
|
|
|
882
|
-
#
|
|
907
|
+
# Pre-classify changed files once — reused for hotspots, order, and runtime/build split
|
|
908
|
+
_pr_changed_cls: dict[str, dict] = {
|
|
909
|
+
f: self._classify_changed_file(f) for f in (_delta_files or set())
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
# Review hotspots: top changed RUNTIME files ranked by impact score — no build artifacts
|
|
883
913
|
_pr_review_hotspots = sorted(
|
|
884
|
-
|
|
914
|
+
[f for f, cls in _pr_changed_cls.items()
|
|
915
|
+
if not cls["is_noise"] and cls["artifact_type"] != "build_manifest"],
|
|
885
916
|
key=lambda f: _delta_impact_score_per_file.get(f, 0.0),
|
|
886
917
|
reverse=True,
|
|
887
918
|
)[:8]
|
|
888
919
|
|
|
889
920
|
# Suggested review order: security first, then api → service → persistence → config
|
|
921
|
+
# build_manifest is intentionally absent from _ORDER_TYPES
|
|
890
922
|
_ORDER_TYPES = ["security", "controller", "service", "repository", "mapper",
|
|
891
923
|
"spring_config", "config", "domain_model", "dto"]
|
|
892
924
|
_seen_order: set[str] = set()
|
|
@@ -894,7 +926,7 @@ class TaskContextBuilder:
|
|
|
894
926
|
for _ra in _delta_risk_areas:
|
|
895
927
|
for _f in _ra.get("affected_files", []):
|
|
896
928
|
if _f not in _seen_order:
|
|
897
|
-
_cls = self._classify_changed_file(_f)
|
|
929
|
+
_cls = _pr_changed_cls.get(_f) or self._classify_changed_file(_f)
|
|
898
930
|
if _cls["artifact_type"] == _otype:
|
|
899
931
|
_pr_suggested_review_order.append(_f)
|
|
900
932
|
_seen_order.add(_f)
|
|
@@ -903,6 +935,56 @@ class TaskContextBuilder:
|
|
|
903
935
|
_pr_suggested_review_order.append(_f)
|
|
904
936
|
_seen_order.add(_f)
|
|
905
937
|
|
|
938
|
+
# Build runtime_changes and build_changes — honest split, no score numbers
|
|
939
|
+
_pr_runtime_changes: list[dict] = []
|
|
940
|
+
_pr_build_changes: dict = {}
|
|
941
|
+
_build_artifact_files: list[str] = []
|
|
942
|
+
|
|
943
|
+
_SCORE_TO_CONFIDENCE = {
|
|
944
|
+
"high": lambda s: s >= 0.60,
|
|
945
|
+
"medium": lambda s: 0.40 <= s < 0.60,
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
for _f in sorted(_delta_files or set()):
|
|
949
|
+
_f_cls = _pr_changed_cls.get(_f) or self._classify_changed_file(_f)
|
|
950
|
+
_f_atype = _f_cls["artifact_type"]
|
|
951
|
+
if _f_cls["is_noise"]:
|
|
952
|
+
continue
|
|
953
|
+
if _f_atype == "build_manifest":
|
|
954
|
+
_build_artifact_files.append(_f)
|
|
955
|
+
continue
|
|
956
|
+
# role: always "inferred" — no runtime evidence for role classification
|
|
957
|
+
_cls_conf = _f_cls["confidence"] # "high"|"medium"|"low" from _classify_changed_file
|
|
958
|
+
_role_basis = "naming" if _cls_conf == "high" else ("path" if _cls_conf == "medium" else "extension")
|
|
959
|
+
_role_obj = {
|
|
960
|
+
"type": "inferred",
|
|
961
|
+
"confidence": "medium" if _cls_conf == "high" else "low",
|
|
962
|
+
"basis": _role_basis,
|
|
963
|
+
}
|
|
964
|
+
# evidence: list what we actually know
|
|
965
|
+
_evidence: list[str] = ["changed in git diff"]
|
|
966
|
+
_f_module = _f_cls.get("module", "")
|
|
967
|
+
if _f_module:
|
|
968
|
+
_evidence.append(f"matched module path: {_f_module}")
|
|
969
|
+
_evidence.append("NO call graph evidence")
|
|
970
|
+
# file confidence: replaces numeric score
|
|
971
|
+
_impact_s = _delta_impact_score_per_file.get(_f, 0.45)
|
|
972
|
+
_f_conf = "high" if _impact_s >= 0.60 else ("medium" if _impact_s >= 0.40 else "low")
|
|
973
|
+
_pr_runtime_changes.append({
|
|
974
|
+
"path": _f,
|
|
975
|
+
"role": _role_obj,
|
|
976
|
+
"confidence": _f_conf,
|
|
977
|
+
"artifact_type": _f_atype,
|
|
978
|
+
"evidence": _evidence,
|
|
979
|
+
"change_effect": _ARTIFACT_CHANGE_EFFECT.get(_f_atype, "modifies application logic"),
|
|
980
|
+
})
|
|
981
|
+
|
|
982
|
+
if _build_artifact_files:
|
|
983
|
+
_pr_build_changes = {
|
|
984
|
+
"files": _build_artifact_files,
|
|
985
|
+
"impact": "dependency/configuration only",
|
|
986
|
+
}
|
|
987
|
+
|
|
906
988
|
# ── 6d. review-pr: execution paths + behavioral impact ──────────────
|
|
907
989
|
_execution_paths: list[dict] = []
|
|
908
990
|
_behavioral_impact: list[dict] = []
|
|
@@ -1158,6 +1240,9 @@ class TaskContextBuilder:
|
|
|
1158
1240
|
scope_source=_pr_scope_source if task_name == "review-pr" else None,
|
|
1159
1241
|
scope_files=list(_pr_scope_files) if task_name == "review-pr" and _pr_scope_files else [],
|
|
1160
1242
|
repo_root=str(_pr_git_root) if task_name == "review-pr" and _pr_git_root else None,
|
|
1243
|
+
# honest output schema: runtime vs build split (review-pr only)
|
|
1244
|
+
runtime_changes=_pr_runtime_changes,
|
|
1245
|
+
build_changes=_pr_build_changes,
|
|
1161
1246
|
)
|
|
1162
1247
|
|
|
1163
1248
|
def render_prompt(self, output: TaskOutput) -> str:
|
|
@@ -1990,26 +2075,8 @@ class TaskContextBuilder:
|
|
|
1990
2075
|
"build_manifest": frozenset(),
|
|
1991
2076
|
}
|
|
1992
2077
|
|
|
1993
|
-
#
|
|
1994
|
-
_CHANGE_EFFECT
|
|
1995
|
-
"entrypoint": "modifies application startup, CLI entry, or framework bootstrap — all request flows may be affected",
|
|
1996
|
-
"controller": "alters HTTP routing, API contract, or response shape — API consumers are affected",
|
|
1997
|
-
"service": "changes business rules, transaction scope, or orchestration logic — callers and dependents affected",
|
|
1998
|
-
"repository": "modifies persistence queries or data access patterns — data consistency and service layer affected",
|
|
1999
|
-
"mapper": "alters SQL-to-object binding or query templates — data shape and repositories affected",
|
|
2000
|
-
"security": "changes authentication flow, access control rules, or session handling — all secured endpoints affected",
|
|
2001
|
-
"spring_config": "modifies bean wiring, datasource, or framework-wide settings — all wired beans potentially affected",
|
|
2002
|
-
"spring_profile": "changes environment-specific overrides — behavior differs per active profile",
|
|
2003
|
-
"config": "adjusts configuration values — all modules reading this config are affected",
|
|
2004
|
-
"build_manifest": "changes dependencies, plugins, or project structure — compile-time and runtime classpath affected",
|
|
2005
|
-
"db_migration": "modifies database schema — existing queries, mappings, and constraints may break",
|
|
2006
|
-
"domain_model": "alters entity structure — cascades to repositories, DTOs, serializers, and mappers",
|
|
2007
|
-
"dto": "changes data transfer contract — serialization and API consumers may break",
|
|
2008
|
-
"test": "modifies test coverage or test behavior — no production code affected",
|
|
2009
|
-
"documentation": "updates documentation only — no runtime impact",
|
|
2010
|
-
"ide_noise": "IDE/tooling artifact — no application impact",
|
|
2011
|
-
"source": "modifies application source — artifact role derived from file path structure",
|
|
2012
|
-
}
|
|
2078
|
+
# use module-level constant (single source of truth)
|
|
2079
|
+
_CHANGE_EFFECT = _ARTIFACT_CHANGE_EFFECT
|
|
2013
2080
|
|
|
2014
2081
|
# change_type taxonomy — closed set, derived from artifact type
|
|
2015
2082
|
_ARTIFACT_CHANGE_TYPES: dict[str, list[str]] = {
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
# Continue Here — atlas-cli sesión 9
|
|
2
|
-
|
|
3
|
-
**Paused:** 2026-05-16 (sesión 9)
|
|
4
|
-
**Repo:** `/Users/user/Downloads/atlas-cli`
|
|
5
|
-
**Branch:** master
|
|
6
|
-
**Último commit:** `88e1ebd` — Actualizando README
|
|
7
|
-
**Working tree:** DIRTY (sin commit — usuario pidió "no hagas commit" esta sesión)
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Lo que se hizo esta sesión
|
|
12
|
-
|
|
13
|
-
### Fix: test regresivo stale en `test_signal_hierarchy.py`
|
|
14
|
-
|
|
15
|
-
`test_prepare_context_review_pr_task` esperaba exit_code 0 pero la nueva conducta (desde `7085e97`) devuelve exit_code 1 cuando no hay diff. El test corría contra atlas-cli (no tmp_project — el arg se consume por `_preprocess_args`), entonces era frágil: con cambios pendientes en atlas-cli → exit 0, sin cambios → exit 1.
|
|
16
|
-
|
|
17
|
-
**Fix:** test acepta ambos exit codes y verifica estructura JSON en cada caso.
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
### Feature: `behavioral_impact` para `review-pr`
|
|
22
|
-
|
|
23
|
-
Nueva capability: en vez de "archivos relacionados por heurística", modelar impacto causal del cambio.
|
|
24
|
-
|
|
25
|
-
**Nueva sección top-level en output de review-pr:**
|
|
26
|
-
```json
|
|
27
|
-
{
|
|
28
|
-
"behavioral_impact": [{
|
|
29
|
-
"entry_point": "ArticleController.favoriteArticle",
|
|
30
|
-
"affected_path": ["ArticleFavoriteService.favorite", "ArticleFavoriteRepository.save"],
|
|
31
|
-
"impact": ["article favorite persistence affected"],
|
|
32
|
-
"end_state": "DB write"
|
|
33
|
-
}]
|
|
34
|
-
}
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
**Dos traversals:**
|
|
38
|
-
|
|
39
|
-
| Archivo cambiado | Estrategia | entry_point |
|
|
40
|
-
|---|---|---|
|
|
41
|
-
| Controller | Forward: ctrl → svc → repo | El propio controller |
|
|
42
|
-
| Service/Repo/Domain | Reverse: buscar qué controller inyecta/llama la cadena | Controller que lo usa |
|
|
43
|
-
|
|
44
|
-
**Reverse lookup:** primero directo (ctrl usa clase directamente), luego indirecto (ctrl → svc mediador → clase cambiada).
|
|
45
|
-
|
|
46
|
-
**Impact generation:** basado en artifact_type + end_state + nombre de clase sin sufijo:
|
|
47
|
-
- Repository → `"X persistence affected"`
|
|
48
|
-
- Service + DB write → `"X data persistence behavior may change"`
|
|
49
|
-
- Service + event → `"X event emission affected"`
|
|
50
|
-
- + si hay `@PreAuthorize`/`@Secured` en controller → `"authorization check present on entry point"`
|
|
51
|
-
|
|
52
|
-
**Sin evidencia → no emitir path.** `_has_code_evidence` gate en cada paso.
|
|
53
|
-
|
|
54
|
-
---
|
|
55
|
-
|
|
56
|
-
## Archivos modificados (sin commit)
|
|
57
|
-
|
|
58
|
-
| Archivo | Cambio |
|
|
59
|
-
|---------|--------|
|
|
60
|
-
| `src/sourcecode/flow_analyzer.py` | `analyze_behavioral_impact()` + helpers `_domain_from_class`, `_impact_descriptions`, `_impact_descriptions_for_controller` (~205 líneas nuevas) |
|
|
61
|
-
| `src/sourcecode/prepare_context.py` | Campo `behavioral_impact` en `TaskOutput`, bloque 6d llama `analyze_behavioral_impact` |
|
|
62
|
-
| `src/sourcecode/cli.py` | Serializa `behavioral_impact` en output de review-pr |
|
|
63
|
-
| `tests/test_signal_hierarchy.py` | Fix stale test `test_prepare_context_review_pr_task` |
|
|
64
|
-
| `tests/test_v1_10_regressions.py` | Clase `TestBehavioralImpact` con 5 tests unitarios |
|
|
65
|
-
|
|
66
|
-
---
|
|
67
|
-
|
|
68
|
-
## Tests al pausar
|
|
69
|
-
|
|
70
|
-
```
|
|
71
|
-
777 passed, 3 skipped, 1 deselected
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
Los 5 tests nuevos en `TestBehavioralImpact` pasan:
|
|
75
|
-
- `test_service_change_finds_controller_entry_point` ✓
|
|
76
|
-
- `test_repository_change_finds_controller_via_service` ✓
|
|
77
|
-
- `test_controller_change_forward_traversal` ✓
|
|
78
|
-
- `test_no_evidence_returns_empty` ✓
|
|
79
|
-
- `test_impact_strings_describe_behavior_not_files` ✓
|
|
80
|
-
|
|
81
|
-
---
|
|
82
|
-
|
|
83
|
-
## Pendiente de sesión anterior (sigue vigente)
|
|
84
|
-
|
|
85
|
-
1. **Smoke test `delta`** — verificar Fix 1-3 (BFS module constraint) no afecta `delta`:
|
|
86
|
-
```bash
|
|
87
|
-
cd ~/Documents/workspace/spring-boot-realworld-example-app
|
|
88
|
-
sourcecode prepare-context delta . --since HEAD~1 2>/dev/null | python3 -c "
|
|
89
|
-
import json,sys; d=json.load(sys.stdin)
|
|
90
|
-
print('relevant_files:', len(d.get('relevant_files', [])))
|
|
91
|
-
"
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
2. **Smoke test `security_change` path** — cambio real en auth logic debe expandir security chain.
|
|
95
|
-
|
|
96
|
-
3. **Tests unitarios para `_classify_diff_severity`** — sin tests actualmente.
|
|
97
|
-
|
|
98
|
-
4. **`User.java` clasificado como `"source"` no `"domain_model"`** — fix opcional en `_classify_changed_file`.
|
|
99
|
-
|
|
100
|
-
5. **Smoke tests saint-server** — pendiente sesión 4/5.
|
|
101
|
-
|
|
102
|
-
---
|
|
103
|
-
|
|
104
|
-
## Pendiente de esta sesión (nuevo)
|
|
105
|
-
|
|
106
|
-
1. **COMMIT** — toda la sesión sin commit. Hacer commit:
|
|
107
|
-
```bash
|
|
108
|
-
git add src/sourcecode/flow_analyzer.py \
|
|
109
|
-
src/sourcecode/prepare_context.py \
|
|
110
|
-
src/sourcecode/cli.py \
|
|
111
|
-
tests/test_signal_hierarchy.py \
|
|
112
|
-
tests/test_v1_10_regressions.py
|
|
113
|
-
git commit -m "feat(review-pr): behavioral_impact — impacto causal de cambio, no expansión heurística"
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
2. **Smoke test `behavioral_impact`** en repo real:
|
|
117
|
-
```bash
|
|
118
|
-
/Users/user/.local/pipx/venvs/sourcecode/bin/python -m pip install -e . -q
|
|
119
|
-
cd ~/Documents/workspace/spring-boot-realworld-example-app
|
|
120
|
-
# Modificar un service (ej. ArticleFavoriteService.java) sin commit y correr:
|
|
121
|
-
sourcecode prepare-context review-pr . 2>/dev/null | python3 -c "
|
|
122
|
-
import json, sys
|
|
123
|
-
d = json.load(sys.stdin)
|
|
124
|
-
for bi in d.get('behavioral_impact', []):
|
|
125
|
-
print('entry:', bi['entry_point'])
|
|
126
|
-
print('path:', bi['affected_path'])
|
|
127
|
-
print('impact:', bi['impact'])
|
|
128
|
-
print('end_state:', bi['end_state'])
|
|
129
|
-
print()
|
|
130
|
-
"
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
3. **Evaluar si `execution_paths` sigue siendo útil** o si `behavioral_impact` lo reemplaza completamente. Ambos coexisten ahora.
|
|
134
|
-
|
|
135
|
-
4. **Impact generation refinement** — para service changes, `"X data persistence behavior may change"` es verbose. Podría simplificarse a `"X persistence affected"`.
|
|
136
|
-
|
|
137
|
-
---
|
|
138
|
-
|
|
139
|
-
## Para retomar
|
|
140
|
-
|
|
141
|
-
```bash
|
|
142
|
-
cd /Users/user/Downloads/atlas-cli
|
|
143
|
-
git log --oneline -3
|
|
144
|
-
git diff --stat HEAD # verá los 5 archivos sin commit
|
|
145
|
-
|
|
146
|
-
# Verificar import
|
|
147
|
-
python3 -c "from sourcecode.flow_analyzer import analyze_behavioral_impact; print('OK')"
|
|
148
|
-
|
|
149
|
-
# Tests completos
|
|
150
|
-
python3 -m pytest tests/ \
|
|
151
|
-
--ignore=tests/test_block2_coverage.py \
|
|
152
|
-
--ignore=tests/test_packaging.py \
|
|
153
|
-
--deselect=tests/test_dependency_analyzer_node_python.py::test_python_requirements_without_lockfile_keeps_declared_versions \
|
|
154
|
-
-q
|
|
155
|
-
# Expected: 777 passed
|
|
156
|
-
|
|
157
|
-
# Tests nuevos específicamente
|
|
158
|
-
python3 -m pytest tests/test_v1_10_regressions.py::TestBehavioralImpact -v
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
---
|
|
162
|
-
|
|
163
|
-
*Pausado 2026-05-16 sesión 9 — gsd:pause-work*
|
{sourcecode-1.30.6 → sourcecode-1.30.7}/.agents/skills/source-command-gsd-join-discord/SKILL.md
RENAMED
|
File without changes
|
{sourcecode-1.30.6 → sourcecode-1.30.7}/.agents/skills/source-command-gsd-review-backlog/SKILL.md
RENAMED
|
File without changes
|
{sourcecode-1.30.6 → sourcecode-1.30.7}/.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
|