sourcecode 1.31.29__tar.gz → 1.31.30__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.31.30/.continue-here.md +89 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/PKG-INFO +3 -3
- {sourcecode-1.31.29 → sourcecode-1.31.30}/README.md +2 -2
- {sourcecode-1.31.29 → sourcecode-1.31.30}/pyproject.toml +1 -1
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/__init__.py +1 -1
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/cli.py +67 -10
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/prepare_context.py +24 -0
- sourcecode-1.31.29/.continue-here.md +0 -98
- {sourcecode-1.31.29 → sourcecode-1.31.30}/.agents/skills/source-command-gsd-join-discord/SKILL.md +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/.agents/skills/source-command-gsd-review-backlog/SKILL.md +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/.agents/skills/source-command-gsd-workstreams/SKILL.md +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/.gitignore +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/.ruff.toml +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/.sourcecode-cache/snapshot-3b5997a-fa5c742c.json +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/AUDIT_REAL_REPOS.md +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/AUDIT_v1.31.23.md +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/CHANGELOG.md +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/CONTRIBUTING.md +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/LICENSE +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/SECURITY.md +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/docs/PRODUCT_TIERS.md +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/docs/privacy.md +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/docs/schema.md +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/raw +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/run_cli.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/cache.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/canonical_ir.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/classifier.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/flow_analyzer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/mcp/__init__.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/mcp/onboarding/applier.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/mcp/onboarding/backup.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/mcp/onboarding/detector.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/mcp/onboarding/planner.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/mcp/runner.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/mcp/server.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/mcp_nudge.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/output_budget.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/path_filters.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/pr_comment_renderer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/progress.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/redactor.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/repository_ir.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/scanner.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/schema.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/serializer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/src/sourcecode/workspace.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/__init__.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/conftest.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/coverage.xml +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/fastapi_app/pyproject.toml +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/fastapi_app/src/main.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/go_service/cmd/api/main.go +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/go_service/go.mod +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/jacoco.xml +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/latin1_sample.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/latin1_sample_iso.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/lcov.info +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/nextjs_app/app/page.tsx +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/nextjs_app/package.json +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/nextjs_app/pnpm-lock.yaml +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/pnpm_monorepo/apps/web/app/page.tsx +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/pnpm_monorepo/apps/web/package.json +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/pnpm_monorepo/packages/api/main.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/pnpm_monorepo/packages/api/pyproject.toml +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/pnpm_monorepo/pnpm-workspace.yaml +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/pom.xml +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/application/service/FindAusenteService.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/domain/entities/Ausente.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/ausente/infrastructure/rest/AusenteRestController.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/application/service/FindAutocoberturasService.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/domain/entities/Autocoberturas.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/autocoberturas/infrastructure/rest/AutocoberturasRestController.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/application/service/FindCalendarioTrabajadorService.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/domain/entities/CalendarioTrabajador.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/calendarioTrabajador/infrastructure/rest/CalendarioTrabajadorRestController.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/application/service/FindDepartamentoService.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/domain/entities/Departamento.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/departamento/infrastructure/rest/DepartamentoRestController.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/application/service/FindEmpleadoService.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/domain/entities/Empleado.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/ddd/empleado/infrastructure/rest/EmpleadoRestController.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/DemoApplication.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/config/FilterConfig.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/domain/Health.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/mapper/HealthMapper.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/repository/HealthRepository.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/service/HealthService.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/HealthRestController.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/java/com/example/demo/web/NominaRestController.java +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/resources/application-dev.yml +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/resources/application.yml +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/fixtures/spring_boot_minimal/src/main/resources/mapper/HealthMapper.xml +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_architecture_analyzer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_architecture_summary.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_ast_extractor.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_audit_fixes.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_audit_sas_v2.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_block1_reliability.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_block2_coverage.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_block5_quality.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_broadleaf_fixes.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_bug_fixes_v1302.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_bug_fixes_v13115.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_bug_fixes_v1312.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_bug_fixes_v13122.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_bug_fixes_v1313.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_bug_fixes_v1321.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_bug_fixes_v16.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_bug_fixes_v2.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_cache.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_canonical_ir.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_classifier.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_cli.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_code_notes_analyzer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_context_scorer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_contract_pipeline.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_coverage_parser.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_cross_consistency.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_dependency_analyzer_node_python.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_dependency_analyzer_polyglot.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_dependency_schema.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_detector_dotnet.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_detector_go_rust_java.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_detector_nodejs.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_detector_php_ruby_dart.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_detector_python.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_detector_universal_managed.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_detector_universal_systems.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_detectors_base.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_doc_analyzer_jsdom.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_doc_analyzer_python.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_encoding_regression.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_enterprise_benchmarks.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_graph_analyzer_polyglot.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_graph_analyzer_python_node.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_graph_schema.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_hybrid_inference.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_integration.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_integration_dependencies.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_integration_detection.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_integration_docs.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_integration_graph_modules.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_integration_lqn.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_integration_metrics.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_integration_multistack.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_integration_semantics.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_integration_universal.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_java_spring_integration.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_mcp_nudge.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_mcp_runner.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_mcp_serve.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_mcp_tools.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_metrics_analyzer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_output_ux.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_packaging.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_phase1_improvements.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_pipeline_integrity.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_real_projects.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_redactor.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_repository_ir.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_scanner.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_schema.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_schema_normalization.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_scoring_calibration.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_semantic_analyzer_node.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_semantic_analyzer_python.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_semantic_import_resolution.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_semantic_schema.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_signal_hierarchy.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_summarizer.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_surface_honesty.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_task_differentiation.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_telemetry.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_v131_improvements.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_v1_10_regressions.py +0 -0
- {sourcecode-1.31.29 → sourcecode-1.31.30}/tests/test_workspace_analyzer.py +0 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Handoff — Sesión 34 (2026-05-26)
|
|
2
|
+
|
|
3
|
+
## Position
|
|
4
|
+
|
|
5
|
+
**Project:** sourcecode (atlas-cli)
|
|
6
|
+
**Activity:** Post-audit bug fixing + new feature (MCP nudge)
|
|
7
|
+
**Branch:** master
|
|
8
|
+
**Last commit:** 11d23b0 — feat(mcp): add one-time MCP setup nudge after successful commands
|
|
9
|
+
**Tests:** 1601 passed, 3 skipped ✅
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Work Done This Session
|
|
14
|
+
|
|
15
|
+
### Session 34 (this session)
|
|
16
|
+
**New feature: one-time MCP setup nudge**
|
|
17
|
+
|
|
18
|
+
**FEAT — `sourcecode mcp_nudge.py` (new module)**
|
|
19
|
+
- `nudge_mcp_if_needed()`: fires after first successful analysis command when Claude Desktop/Cursor installed but sourcecode not yet in MCP config. Writes to stderr only. Creates `~/.sourcecode/nudge_shown` flag to fire at most once per session.
|
|
20
|
+
- `clear_nudge_flag()`: called by `mcp init` on success — next run finds `is_installed=True` → no nudge.
|
|
21
|
+
- Module-level imports for testability; `_IMPORTS_OK=False` stubs if onboarding package missing.
|
|
22
|
+
|
|
23
|
+
**CLI hooks (4 call sites in `cli.py`):**
|
|
24
|
+
| Command | Location |
|
|
25
|
+
|---|---|
|
|
26
|
+
| `sourcecode . --compact` | `main()` — after clipboard copy |
|
|
27
|
+
| `sourcecode prepare-context` / `onboard` | `prepare_context_cmd()` — end |
|
|
28
|
+
| `sourcecode endpoints` | `endpoints_cmd()` — end |
|
|
29
|
+
| `sourcecode impact` | `impact_cmd()` — success path only (after not_found check) |
|
|
30
|
+
|
|
31
|
+
**`mcp init` success** → `clear_nudge_flag()` called.
|
|
32
|
+
|
|
33
|
+
**Tests:** `tests/test_mcp_nudge.py` — 11 tests, all pass.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Remaining from Bug Audit Backlog
|
|
38
|
+
|
|
39
|
+
### P1 backlog
|
|
40
|
+
| # | Issue | File | Effort |
|
|
41
|
+
|---|---|---|---|
|
|
42
|
+
| P1-5 | `project_summary` quality — picks license/badges/marketing blurbs | `summarizer.py` | Medium |
|
|
43
|
+
| P1-6 | `relevant_files.score` ranking quality audit (score exposed, ranking weak) | `ranking_engine.py` | Medium |
|
|
44
|
+
|
|
45
|
+
### P2 unfixed
|
|
46
|
+
| # | Issue | File | Effort |
|
|
47
|
+
|---|---|---|---|
|
|
48
|
+
| P2-13 | `--no-cache` flag inconsistent across subcommands | `cli.py` | Medium |
|
|
49
|
+
| P2-14 | URLs in code_notes truncated (needs repro) | `code_notes_analyzer.py` | Low |
|
|
50
|
+
| P2-16 | `entry_points.controllers.methods` mismatches `endpoints` count | `cli.py` | Medium |
|
|
51
|
+
| P2-17 | `--compact --help` token claim stale (now runs arch analyzer too) | `cli.py` | Trivial |
|
|
52
|
+
| P2-18 | `impact <file_path>` fails FQN resolution | `repository_ir.py` | Low |
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Key Files Modified (this session)
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
src/sourcecode/mcp_nudge.py — NEW: nudge_mcp_if_needed, clear_nudge_flag
|
|
60
|
+
src/sourcecode/cli.py — 4 nudge call sites + clear_nudge_flag in mcp_init
|
|
61
|
+
tests/test_mcp_nudge.py — NEW: 11 tests
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Decisions This Session
|
|
67
|
+
|
|
68
|
+
| Decision | Rationale |
|
|
69
|
+
|---|---|
|
|
70
|
+
| Module-level imports in mcp_nudge.py (not lazy) | Enables `patch("sourcecode.mcp_nudge.detect_clients", ...)` in tests |
|
|
71
|
+
| Flag at `~/.sourcecode/nudge_shown` | Reuses existing state root; simple touch file |
|
|
72
|
+
| Nudge on impact only when resolution != not_found | not_found = exit 1 = failure; no nudge on failed commands |
|
|
73
|
+
| `clear_nudge_flag()` in mcp_init success, not in detection | Separation: flag reset is explicit intent (user ran init), not a side effect of checking |
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Next Session
|
|
78
|
+
|
|
79
|
+
**Recommended:** P2-17 (trivial) → P2-18 (low) → P2-14 (low, needs repro) → P1-5 (medium) → P1-6 (medium) → P2-13 (medium) → P2-16 (medium)
|
|
80
|
+
|
|
81
|
+
**P2-17:** `--compact --help` says token count — verify claim still accurate after P2-10 fix (compact now runs ArchitectureAnalyzer). Update if stale.
|
|
82
|
+
|
|
83
|
+
**P2-18:** `sourcecode impact <file_path>` — resolve file path to FQN before IR lookup. Currently passes raw path to `_resolve_target()`, fails to match.
|
|
84
|
+
|
|
85
|
+
**P1-5:** Audit `summarizer.py`. Prefer: first real descriptive paragraph, architecture description, domain/stack. Exclude: 'Important:', license, badges, install snippets, TOC, link collections, sponsorship, release notes.
|
|
86
|
+
|
|
87
|
+
**Resume command:** `/gsd:resume-work`
|
|
88
|
+
|
|
89
|
+
**Test baseline:** `python3 -m pytest tests/ → 1601 passed, 3 skipped`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 1.31.
|
|
3
|
+
Version: 1.31.30
|
|
4
4
|
Summary: Deterministic codebase context for AI coding agents
|
|
5
5
|
License: Apache License
|
|
6
6
|
Version 2.0, January 2004
|
|
@@ -225,7 +225,7 @@ Description-Content-Type: text/markdown
|
|
|
225
225
|
|
|
226
226
|
**AI-ready change intelligence for Java/Spring enterprise monoliths.**
|
|
227
227
|
|
|
228
|
-

|
|
229
229
|

|
|
230
230
|
|
|
231
231
|
---
|
|
@@ -263,7 +263,7 @@ pipx install sourcecode
|
|
|
263
263
|
|
|
264
264
|
```bash
|
|
265
265
|
sourcecode version
|
|
266
|
-
# sourcecode 1.31.
|
|
266
|
+
# sourcecode 1.31.30
|
|
267
267
|
```
|
|
268
268
|
|
|
269
269
|
---
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**AI-ready change intelligence for Java/Spring enterprise monoliths.**
|
|
4
4
|
|
|
5
|
-

|
|
6
6
|

|
|
7
7
|
|
|
8
8
|
---
|
|
@@ -40,7 +40,7 @@ pipx install sourcecode
|
|
|
40
40
|
|
|
41
41
|
```bash
|
|
42
42
|
sourcecode version
|
|
43
|
-
# sourcecode 1.31.
|
|
43
|
+
# sourcecode 1.31.30
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
---
|
|
@@ -760,8 +760,11 @@ def main(
|
|
|
760
760
|
err=True,
|
|
761
761
|
)
|
|
762
762
|
|
|
763
|
-
#
|
|
764
|
-
|
|
763
|
+
# P1-2 FIX: --changed-only silently implies --compact; inform only on TTY.
|
|
764
|
+
# PowerShell 5.1 interprets any stderr write (even with exit 0) as NativeCommandError.
|
|
765
|
+
# Gate on isatty() so pipeline consumers never see informational noise on stderr.
|
|
766
|
+
import sys as _sys_tty
|
|
767
|
+
if changed_only and not compact and not agent and _sys_tty.stderr.isatty():
|
|
765
768
|
typer.echo(
|
|
766
769
|
"[info] --changed-only implies --compact (bounding output to changed files).",
|
|
767
770
|
err=True,
|
|
@@ -2184,7 +2187,11 @@ def prepare_context_cmd(
|
|
|
2184
2187
|
|
|
2185
2188
|
target = path.resolve()
|
|
2186
2189
|
if not target.exists() or not target.is_dir():
|
|
2187
|
-
|
|
2190
|
+
_emit_error_json(
|
|
2191
|
+
"invalid_path",
|
|
2192
|
+
f"'{target}' is not a valid directory.",
|
|
2193
|
+
path=str(target),
|
|
2194
|
+
)
|
|
2188
2195
|
raise typer.Exit(code=1)
|
|
2189
2196
|
|
|
2190
2197
|
if dry_run:
|
|
@@ -2316,6 +2323,13 @@ def prepare_context_cmd(
|
|
|
2316
2323
|
out["improvement_opportunities"] = output.improvement_opportunities
|
|
2317
2324
|
if _task_include("test_gaps") and output.test_gaps:
|
|
2318
2325
|
out["test_gaps"] = output.test_gaps
|
|
2326
|
+
# P0-2: fast-mode truncation transparency — always emit when truncated, even if test_gaps is []
|
|
2327
|
+
# Use `is True` (strict) so MagicMock objects in tests don't trigger this branch.
|
|
2328
|
+
if getattr(output, "truncated", False) is True:
|
|
2329
|
+
out["truncated"] = True
|
|
2330
|
+
_tr = getattr(output, "truncated_reason", None)
|
|
2331
|
+
if isinstance(_tr, str) and _tr:
|
|
2332
|
+
out["truncated_reason"] = _tr
|
|
2319
2333
|
if _task_include("code_notes_summary") and output.code_notes_summary:
|
|
2320
2334
|
out["code_notes_summary"] = output.code_notes_summary
|
|
2321
2335
|
if _task_include("changed_files") and output.changed_files:
|
|
@@ -2704,7 +2718,11 @@ def repo_ir_cmd(
|
|
|
2704
2718
|
|
|
2705
2719
|
root = path.resolve()
|
|
2706
2720
|
if not root.is_dir():
|
|
2707
|
-
|
|
2721
|
+
_emit_error_json(
|
|
2722
|
+
"invalid_path",
|
|
2723
|
+
f"'{root}' is not a valid directory.",
|
|
2724
|
+
path=str(root),
|
|
2725
|
+
)
|
|
2708
2726
|
raise typer.Exit(1)
|
|
2709
2727
|
|
|
2710
2728
|
if files:
|
|
@@ -2856,7 +2874,11 @@ def impact_cmd(
|
|
|
2856
2874
|
|
|
2857
2875
|
root = path.resolve()
|
|
2858
2876
|
if not root.is_dir():
|
|
2859
|
-
|
|
2877
|
+
_emit_error_json(
|
|
2878
|
+
"invalid_path",
|
|
2879
|
+
f"'{root}' is not a valid directory.",
|
|
2880
|
+
path=str(root),
|
|
2881
|
+
)
|
|
2860
2882
|
raise typer.Exit(1)
|
|
2861
2883
|
|
|
2862
2884
|
file_list = find_java_files(root)
|
|
@@ -2959,7 +2981,11 @@ def endpoints_cmd(
|
|
|
2959
2981
|
|
|
2960
2982
|
target = path.resolve()
|
|
2961
2983
|
if not target.exists() or not target.is_dir():
|
|
2962
|
-
|
|
2984
|
+
_emit_error_json(
|
|
2985
|
+
"invalid_path",
|
|
2986
|
+
f"'{target}' is not a valid directory.",
|
|
2987
|
+
path=str(target),
|
|
2988
|
+
)
|
|
2963
2989
|
raise typer.Exit(code=1)
|
|
2964
2990
|
|
|
2965
2991
|
data = _extract_java_endpoints(target)
|
|
@@ -3075,7 +3101,10 @@ def review_pr_cmd(
|
|
|
3075
3101
|
help="Copy output to clipboard after a successful run.",
|
|
3076
3102
|
),
|
|
3077
3103
|
) -> None:
|
|
3078
|
-
"""[Pro] PR review: blast radius, risk ranking, execution paths, security/txn impact.
|
|
3104
|
+
"""[Pro*] PR review: blast radius, risk ranking, execution paths, security/txn impact.
|
|
3105
|
+
|
|
3106
|
+
Note: [Pro*] label is reserved for a future licensing gate. This command currently
|
|
3107
|
+
runs without authentication. Behavior may change in a future version.
|
|
3079
3108
|
|
|
3080
3109
|
\b
|
|
3081
3110
|
Answers: "What does this PR break and how risky is it?"
|
|
@@ -3135,7 +3164,10 @@ def fix_bug_cmd(
|
|
|
3135
3164
|
help="Copy output to clipboard after a successful run.",
|
|
3136
3165
|
),
|
|
3137
3166
|
) -> None:
|
|
3138
|
-
"""[Pro] Bug triage: risk-ranked files, suspected areas, related annotations.
|
|
3167
|
+
"""[Pro*] Bug triage: risk-ranked files, suspected areas, related annotations.
|
|
3168
|
+
|
|
3169
|
+
Note: [Pro*] label is reserved for a future licensing gate. This command currently
|
|
3170
|
+
runs without authentication. Behavior may change in a future version.
|
|
3139
3171
|
|
|
3140
3172
|
\b
|
|
3141
3173
|
Answers: "Where in this codebase should I look to fix this symptom?"
|
|
@@ -3187,7 +3219,10 @@ def modernize_cmd(
|
|
|
3187
3219
|
help="Copy output to clipboard after a successful run.",
|
|
3188
3220
|
),
|
|
3189
3221
|
) -> None:
|
|
3190
|
-
"""[Pro] Modernization planning: coupling, dead zones, risky modules, refactor candidates.
|
|
3222
|
+
"""[Pro*] Modernization planning: coupling, dead zones, risky modules, refactor candidates.
|
|
3223
|
+
|
|
3224
|
+
Note: [Pro*] label is reserved for a future licensing gate. This command currently
|
|
3225
|
+
runs without authentication. Behavior may change in a future version.
|
|
3191
3226
|
|
|
3192
3227
|
\b
|
|
3193
3228
|
Answers: "Where should I refactor first, and what's safest to touch?"
|
|
@@ -3218,7 +3253,11 @@ def modernize_cmd(
|
|
|
3218
3253
|
|
|
3219
3254
|
root = path.resolve()
|
|
3220
3255
|
if not root.is_dir():
|
|
3221
|
-
|
|
3256
|
+
_emit_error_json(
|
|
3257
|
+
"invalid_path",
|
|
3258
|
+
f"'{root}' is not a valid directory.",
|
|
3259
|
+
path=str(root),
|
|
3260
|
+
)
|
|
3222
3261
|
raise typer.Exit(1)
|
|
3223
3262
|
|
|
3224
3263
|
file_list = find_java_files(root)
|
|
@@ -3443,6 +3482,24 @@ def mcp_serve() -> None:
|
|
|
3443
3482
|
from sourcecode.mcp.server import mcp as _mcp
|
|
3444
3483
|
|
|
3445
3484
|
log = logging.getLogger(__name__)
|
|
3485
|
+
|
|
3486
|
+
# P0-1: Strip UTF-8 BOM from stdin.buffer before the MCP server reads it.
|
|
3487
|
+
# PowerShell 5.1 on Windows writes \xEF\xBB\xBF at the start of stdin,
|
|
3488
|
+
# which breaks JSON parsing at line 1 column 1.
|
|
3489
|
+
# peek(3) loads bytes into BufferedReader's internal buffer without consuming;
|
|
3490
|
+
# read(3) discards only if the prefix is the UTF-8 BOM sequence.
|
|
3491
|
+
# No-op on Linux/macOS/Git Bash where stdin never starts with a BOM.
|
|
3492
|
+
# Guard: CliRunner / test stubs replace sys.stdin with StringIO (no .buffer).
|
|
3493
|
+
try:
|
|
3494
|
+
_stdin_buf = getattr(_sys.stdin, "buffer", None)
|
|
3495
|
+
if _stdin_buf is not None and hasattr(_stdin_buf, "peek"):
|
|
3496
|
+
_bom_prefix = _stdin_buf.peek(3)[:3]
|
|
3497
|
+
if _bom_prefix == b"\xef\xbb\xbf":
|
|
3498
|
+
_stdin_buf.read(3)
|
|
3499
|
+
log.info("sourcecode-mcp stripped UTF-8 BOM from stdin (PowerShell 5.1 workaround)")
|
|
3500
|
+
except Exception:
|
|
3501
|
+
pass # Never abort server startup over BOM detection
|
|
3502
|
+
|
|
3446
3503
|
log.info("sourcecode-mcp starting (stdio transport)")
|
|
3447
3504
|
try:
|
|
3448
3505
|
_mcp.run()
|
|
@@ -388,6 +388,9 @@ class TaskOutput:
|
|
|
388
388
|
deployment_risks: list[str] = field(default_factory=list)
|
|
389
389
|
deployment: Optional[dict] = None
|
|
390
390
|
entry_points_structured: Optional[dict] = None
|
|
391
|
+
# P0-2: fast-mode truncation transparency
|
|
392
|
+
truncated: bool = False
|
|
393
|
+
truncated_reason: Optional[str] = None
|
|
391
394
|
|
|
392
395
|
|
|
393
396
|
@dataclass
|
|
@@ -1991,6 +1994,21 @@ class TaskContextBuilder:
|
|
|
1991
1994
|
untested.sort(key=lambda p: (len(p.split("/")), p))
|
|
1992
1995
|
test_gaps = untested[:15]
|
|
1993
1996
|
|
|
1997
|
+
# P0-2: fast mode truncation transparency for generate-tests.
|
|
1998
|
+
# When --fast is active the test-gap discovery block is skipped entirely,
|
|
1999
|
+
# so test_gaps stays []. Without a signal the receiver interprets [] as
|
|
2000
|
+
# "no gaps", which is incorrect. Emit explicit truncation metadata and
|
|
2001
|
+
# downgrade confidence so the agent knows the analysis is incomplete.
|
|
2002
|
+
_fast_truncated = fast and task_name == "generate-tests"
|
|
2003
|
+
_fast_truncated_reason = "fast mode skips test gap discovery" if _fast_truncated else None
|
|
2004
|
+
if _fast_truncated:
|
|
2005
|
+
import sys as _sys_warn
|
|
2006
|
+
_sys_warn.stderr.write(
|
|
2007
|
+
"[warn] prepare-context generate-tests --fast: test gap discovery skipped. "
|
|
2008
|
+
"Output will contain truncated=true and confidence=low.\n"
|
|
2009
|
+
)
|
|
2010
|
+
_sys_warn.stderr.flush()
|
|
2011
|
+
|
|
1994
2012
|
# ── 8. Confidence + gaps ──────────────────────────────────────────────
|
|
1995
2013
|
from sourcecode.confidence_analyzer import ConfidenceAnalyzer
|
|
1996
2014
|
from dataclasses import asdict as _asdict
|
|
@@ -2012,6 +2030,9 @@ class TaskContextBuilder:
|
|
|
2012
2030
|
|
|
2013
2031
|
conf_summary, analysis_gaps = ConfidenceAnalyzer().analyze(sm_for_conf)
|
|
2014
2032
|
confidence = conf_summary.overall
|
|
2033
|
+
# P0-2: fast-mode truncation overrides confidence to signal incomplete analysis
|
|
2034
|
+
if _fast_truncated:
|
|
2035
|
+
confidence = "low"
|
|
2015
2036
|
_has_mybatis = any(
|
|
2016
2037
|
f.name == "MyBatis"
|
|
2017
2038
|
for s in stacks
|
|
@@ -2130,6 +2151,9 @@ class TaskContextBuilder:
|
|
|
2130
2151
|
deployment_risks=_cb_deploy_risks,
|
|
2131
2152
|
deployment=_cb_deployment,
|
|
2132
2153
|
entry_points_structured=_cb_bootstrap,
|
|
2154
|
+
# P0-2: fast-mode truncation transparency
|
|
2155
|
+
truncated=_fast_truncated,
|
|
2156
|
+
truncated_reason=_fast_truncated_reason,
|
|
2133
2157
|
)
|
|
2134
2158
|
|
|
2135
2159
|
def render_prompt(self, output: TaskOutput) -> str:
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
# Handoff — Sesión 33 (2026-05-26)
|
|
2
|
-
|
|
3
|
-
## Position
|
|
4
|
-
|
|
5
|
-
**Project:** sourcecode (atlas-cli)
|
|
6
|
-
**Activity:** Post-audit bug fixing — four correctness fixes (P0/P1/P2)
|
|
7
|
-
**Branch:** master
|
|
8
|
-
**Last commit:** f3d44c3 — fix(prepare-context,cli,mcp): four correctness fixes — fast fallback, flag errors, review-pr CI, modernize MCP
|
|
9
|
-
**Tests:** 1590 passed, 3 skipped ✅
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## Work Done This Session
|
|
14
|
-
|
|
15
|
-
### Session 33 (this session)
|
|
16
|
-
**Four bugs fixed from new audit batch + backlog:**
|
|
17
|
-
|
|
18
|
-
**FIX 1 — P0: `--fast` returns `relevant_files: []`** (`prepare_context.py`)
|
|
19
|
-
- When `fast=True` on large repo, `_rank_files` received only noise/IDE files → returned `[]`
|
|
20
|
-
- Added fast-mode fallback block after `_rank_files`: injects entry points + git log -10 files +
|
|
21
|
-
symptom path matches (up to 20) when `relevant_files` is empty and `fast=True`
|
|
22
|
-
- Validated: `sourcecode prepare-context fix-bug . --fast --symptom "spinner"` → 3 results
|
|
23
|
-
|
|
24
|
-
**FIX 2 — P1: Incompatible flags → stderr plain text** (`cli.py`)
|
|
25
|
-
- `--compact --full` wrote plain text to stderr; agents couldn't parse it
|
|
26
|
-
- Replaced `typer.echo(err=True)` with `sys.stdout.write(json.dumps({...}))` for `incompatible_flags`
|
|
27
|
-
- Validated: `sourcecode . --compact --full 2>/dev/null | jq .error` → `"incompatible_flags"`
|
|
28
|
-
|
|
29
|
-
**FIX 3 — P1: `review-pr` without `--since` exits 0 silently in CI** (`prepare_context.py`)
|
|
30
|
-
- Clean tree (CI) → previously fell back to HEAD~1 diff silently, masking missing --since
|
|
31
|
-
- Removed HEAD~1 fallback: clean tree + no `--since` → `_get_pr_scope_files` returns
|
|
32
|
-
`([], "no_staged_changes", [], [])` sentinel
|
|
33
|
-
- Step 5d detects sentinel → `no_diff_source` error (exit 1)
|
|
34
|
-
- Staged/unstaged changes still proceed normally (local dev use case)
|
|
35
|
-
- Validated: clean repo → `error: no_diff_source`, `exit_code=1`
|
|
36
|
-
- Test `test_review_pr_requires_git_diff` updated: added `no_diff_source` to expected error set
|
|
37
|
-
|
|
38
|
-
**FIX 4 — P2: `modernize` missing from MCP server** (`mcp/server.py`)
|
|
39
|
-
- Added `modernize_context` as MCP tool #17 (was #16 before)
|
|
40
|
-
- Mirrors CLI `sourcecode modernize <repo_path>` exactly
|
|
41
|
-
- Returns: hotspot_candidates, dead_zones, high_coupling_nodes, subsystem_summary, recommendation
|
|
42
|
-
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
## Remaining from AUDIT_v1.31.23.md
|
|
46
|
-
|
|
47
|
-
### P1 backlog (from HANDOFF.json session 28)
|
|
48
|
-
| # | Issue | File | Effort |
|
|
49
|
-
|---|---|---|---|
|
|
50
|
-
| P1-5 | `project_summary` quality — picks license/badges/marketing blurbs | `summarizer.py` | Medium |
|
|
51
|
-
| P1-6 | `relevant_files.score` ranking quality audit (score exposed, ranking weak) | `ranking_engine.py` | Medium |
|
|
52
|
-
|
|
53
|
-
### P2 unfixed
|
|
54
|
-
| # | Issue | File | Effort |
|
|
55
|
-
|---|---|---|---|
|
|
56
|
-
| P2-13 | `--no-cache` flag inconsistent across subcommands | `cli.py` | Medium |
|
|
57
|
-
| P2-14 | URLs in code_notes truncated (needs repro) | `code_notes_analyzer.py` | Low |
|
|
58
|
-
| P2-16 | `entry_points.controllers.methods` mismatches `endpoints` count | `cli.py` | Medium |
|
|
59
|
-
| P2-17 | `--compact --help` token claim stale (now runs arch analyzer too) | `cli.py` | Trivial |
|
|
60
|
-
| P2-18 | `impact <file_path>` fails FQN resolution | `repository_ir.py` | Low |
|
|
61
|
-
|
|
62
|
-
---
|
|
63
|
-
|
|
64
|
-
## Key Files Modified (this session)
|
|
65
|
-
|
|
66
|
-
```
|
|
67
|
-
src/sourcecode/prepare_context.py — FIX 1: fast-mode fallback; FIX 3: no_diff_source sentinel
|
|
68
|
-
src/sourcecode/cli.py — FIX 2: incompatible_flags to stdout JSON
|
|
69
|
-
src/sourcecode/mcp/server.py — FIX 4: modernize_context tool
|
|
70
|
-
tests/test_v1_10_regressions.py — test: no_diff_source added to expected error set
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
## Decisions This Session
|
|
76
|
-
|
|
77
|
-
| Decision | Rationale |
|
|
78
|
-
|---|---|
|
|
79
|
-
| Fast-mode fallback injects after `_rank_files`, not before | Keeps ranking path clean; fallback only fires when needed |
|
|
80
|
-
| `no_diff_source` check via sentinel in `_get_pr_scope_files` | Allows test mocks to bypass (mock overrides entire method); inline check before mock fires broke tests |
|
|
81
|
-
| HEAD~1 fallback removed entirely for `since=None` clean tree | CI pipelines always commit first; HEAD~1 fallback was silently hiding missing `--since` |
|
|
82
|
-
| `modernize_context` MCP `format` param is cosmetic (only json) | CLI `modernize` has no `--format` flag; param included per spec schema, yaml rejected with INVALID_ARGUMENT |
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
## Next Session
|
|
87
|
-
|
|
88
|
-
**Recommended:** P2-17 (trivial) → P2-18 (low) → P2-14 (low, needs repro) → P1-5 (medium) → P1-6 (medium) → P2-13 (medium) → P2-16 (medium)
|
|
89
|
-
|
|
90
|
-
**P2-17:** `--compact --help` says token count — now that `--compact` also runs ArchitectureAnalyzer (P2-10 fix from session 32), verify claim still accurate. Update if stale.
|
|
91
|
-
|
|
92
|
-
**P2-18:** `sourcecode impact <file_path>` — resolve file path to FQN before IR lookup. Currently passes raw path to `_resolve_target()`, fails to match.
|
|
93
|
-
|
|
94
|
-
**P1-5:** Audit `summarizer.py`. Prefer: first real descriptive paragraph, architecture, domain/stack description. Exclude: 'Important:', license, badges, install snippets, TOC, link collections, sponsorship, release notes.
|
|
95
|
-
|
|
96
|
-
**Resume command:** `/gsd:resume-work`
|
|
97
|
-
|
|
98
|
-
**Test baseline:** `python3 -m pytest tests/ → 1590 passed, 3 skipped`
|
{sourcecode-1.31.29 → sourcecode-1.31.30}/.agents/skills/source-command-gsd-join-discord/SKILL.md
RENAMED
|
File without changes
|
{sourcecode-1.31.29 → sourcecode-1.31.30}/.agents/skills/source-command-gsd-review-backlog/SKILL.md
RENAMED
|
File without changes
|
{sourcecode-1.31.29 → sourcecode-1.31.30}/.agents/skills/source-command-gsd-workstreams/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|