sourcecode 5.5.0__tar.gz → 5.5.2__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-5.5.0 → sourcecode-5.5.2}/CHANGELOG.md +40 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/PKG-INFO +3 -3
- {sourcecode-5.5.0 → sourcecode-5.5.2}/README.md +2 -2
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/USER_GUIDE.md +1 -1
- {sourcecode-5.5.0 → sourcecode-5.5.2}/pyproject.toml +1 -1
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/__init__.py +1 -1
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/cli.py +73 -6
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/dependency_analyzer.py +15 -1
- sourcecode-5.5.2/src/sourcecode/manifest_cache.py +62 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/migrate_check.py +20 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/reference_facts.py +13 -1
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/release_info.py +1 -1
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/repository_ir.py +98 -11
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/risk.py +25 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/servlet_surface.py +10 -3
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/validation_surface.py +7 -11
- {sourcecode-5.5.0 → sourcecode-5.5.2}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/.github/workflows/perf-gate.yml +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/.gitignore +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/.ruff.toml +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/CLAUDE.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/CONTRIBUTING.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/LICENSE +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/SECURITY.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/CACHE.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/COMMERCIAL-OFFER.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/CUSTOMER-VALIDATION.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/DEFECT-LEDGER.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/DEMO-5MIN.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/DEVELOPMENT-ROADMAP.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/EXECUTION-PLAN-12MO.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/EXECUTIVE-ROADMAP.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/MANUAL-USUARIO.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/MODERNIZATION.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/PRODUCT_AUDIT.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/PRODUCT_IDENTITY.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/PRODUCT_TIERS.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/RC1-CHECKLIST.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/RELEASE-CHECKLIST.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/CATALOG-retrieval-intents.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/DESIGN-knowledge-provider-integration.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/DESIGN-p5.3b-statement-surface.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/DESIGN-p5.5-span-index.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/DESIGN-p6-semantic-impact-engine.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/DESIGN-p6-semantic-integration-engine.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/DESIGN-p7-semantic-services.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/DESIGN-robustness-security-inference.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/DESIGN-semantic-retrieval.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/EPV-p6-class-typeref.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/REPORT-p6-flow-analyzer-comparison.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/REPORT-p6-integration-detector-comparison.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/REPORT-p8-flow-analyzer-migration.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/REPORT-p9-integration-detector-migration.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/adr/0001-semantic-ir.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/adr/0002-source-evidence-boundary.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/adr/0003-architectural-characterization.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/adr/0004-semantic-retrieval.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/adr/0005-evidence-reconciliation.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/adr/0006-performance-harness.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/adr/0007-composition-semantics.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/adr/0008-answer-coherence.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/consumer-disposition-inventory.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/overview.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/product-architecture-review.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/product-strategy-layering.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/semantic-ir-consumer-matrix.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/architecture/semantic-ir-roadmap.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/baseline-ci.yml +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/commercial-pipeline-audit.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/contracts-ci.yml +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/contracts.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/eval/2026-06-15-petclinic-rest-issue11-vets-pagination.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/eval/2026-06-15-petclinic-rest-issue147-validation.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/eval/2026-06-15-petclinic-rest-workflow.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/eval/2026-06-15-phase18-openapi-surface.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/eval/2026-06-15-phase20-validation-surface.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/eval/2026-06-16-broadleaf-checkout-impact-fieldtest.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/eval/2026-06-16-petclinic-rest-issue11-weakness2-closed.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/eval/2026-06-16-spring-petclinic-issue2333-dead-vets.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/licensing-schema.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/migrate-check.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/README.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/REGRESSION-GATE.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/SUMMARY.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/alfresco__ask__cold.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/alfresco__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/broadleaf__ask__cold.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/eureka__ask__cold.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/eureka__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/jenkins__ask__cold.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/jenkins__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/jobrunr__ask__cold.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/jobrunr__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/keycloak__ask__cold.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/keycloak__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/neo4j__ask__cold.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/neo4j__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/ofbiz__ask__cold.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/ofbiz__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/openmrs__ask__cold.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/openmrs__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/petclinic__ask__cold.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.15/petclinic__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/SUMMARY.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/alfresco__ask__cold.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/alfresco__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/broadleaf__ask__cold.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/eureka__ask__cold.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/eureka__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/jenkins__ask__cold.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/jenkins__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/jobrunr__ask__cold.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/jobrunr__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/keycloak__ask__cold.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/keycloak__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/neo4j__ask__cold.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/neo4j__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/ofbiz__ask__cold.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/ofbiz__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/openmrs__ask__cold.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/openmrs__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/petclinic__ask__cold.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/2.5.16/petclinic__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/README.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__ask__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__endpoints__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__migrate-check__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__posture__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__spring-audit__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/gate-latest/broadleaf__validation__warm.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/perf/baselines/reference-best/README.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/posture.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/privacy.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/pro-experience-audit.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/schema.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/spec/envelope-v1.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/docs/spring-audit-ci.yml +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/raw +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/scripts/compare_integration_engines.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/scripts/customer_smoke_test.sh +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/scripts/generate_jdk_exports.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/scripts/perf_gate.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/scripts/perf_harness.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/scripts/sync_gate_anchors.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/archetype.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/architectural_baseline.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/architectural_delta.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/audit_report.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/baseline_autocapture.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/bundled_docs.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/cache.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/cache_model.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/call_surface.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/caller_metrics.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/caller_reach.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/canonical_ir.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/chain_rules.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/change_plan.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/cir_graphs.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/classifier.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/client_calls.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/compare.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/constraint_diff.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/consumer_join.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/container_wiring.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/context_cache.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/context_graph.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/contract_diff.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/contract_init.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/data_exposure.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/data_labels.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/declarations.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/defect_identity.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/degradation.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/deployment_prefix.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detach.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/dynamic_argument_surface.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/endpoint_literals.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/endpoint_metrics.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/envelope.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/environment_resolution.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/error_schema.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/evidence_provider.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/execution_plan.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/explain.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/facts/__init__.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/facts/registry.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/file_chunker.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/filter_surface.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/format_contract.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/fqn_utils.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/gate_anchors.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/git_checkout.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/graph_evidence.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/hibernate_strat.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/identity_fallback.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/integration_coordinates.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/jdk_exports.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/license.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/__init__.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/dependency_import.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/onboarding/applier.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/onboarding/backup.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/onboarding/detector.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/onboarding/planner.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/orchestrator.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/registry.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/runner.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp/server.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/mcp_nudge.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/migration_blast.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/non_coverage.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/openapi_surface.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/openrewrite_recipe.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/output_budget.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/output_encoding.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/parallel.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/parse_cache.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/partial_contract.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/path_admission.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/path_filters.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/perf.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/phased_run.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/pipe_contract.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/posture.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/pr_comment_renderer.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/pr_impact.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/prepare_context.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/progress.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/provenance.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/readiness_timeline.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/readonly.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/reconciliation.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/redactor.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/remedies.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/rename_refactor.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/__init__.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/context.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/errors.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/executor.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/planner.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/query.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/request.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/resolution.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/result.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/retriever.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/runtime.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_graph.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_impact.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_intf.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_struct.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/retrieval/steps_txsec.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/ris.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/rule_catalog.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/rule_pass.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/runs.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/sarif.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/scanner.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/schema.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/security_chain.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/security_config.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/security_config_scan.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/security_posture.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/semantic_impact_engine.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/semantic_integration_engine.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/semantic_services.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/serializer.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/source_text.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/spring_event_topology.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/spring_findings.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/spring_impact.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/spring_model.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/spring_profiles.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/spring_properties.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/spring_security_audit.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/spring_semantic.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/spring_tx_analyzer.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/sql_taint.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/target_admission.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/test_gap_ranking.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/test_sources.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/text_input.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/timeline.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/token_estimate.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/type_usage_surface.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/validation_inference.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/verify_edit.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/verify_repo.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/verify_rules.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/version_check.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/waivers.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/src/sourcecode/workspace.py +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/supabase/functions/README.md +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/supabase/functions/get-license/index.ts +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/supabase/functions/telemetry/index.ts +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/supabase/sql/license_event_ordering.sql +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/supabase/sql/licensing_schema.sql +0 -0
- {sourcecode-5.5.0 → sourcecode-5.5.2}/supabase/sql/telemetry_events.sql +0 -0
|
@@ -2,6 +2,46 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [5.5.2] — 2026-08-13
|
|
6
|
+
|
|
7
|
+
**Follow-up audit corrections and performance visibility.**
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
- `endpoints --include-tests` now admits test-suite `src/main` sources while
|
|
11
|
+
preserving the production default and its exclusion evidence.
|
|
12
|
+
- `impact` publishes caller provenance and a hub-excluded reach axis instead of
|
|
13
|
+
presenting service-locator expansion as an undifferentiated repository total.
|
|
14
|
+
- Servlet populations use one unique URL-pattern authority with reconciled
|
|
15
|
+
declaration counts.
|
|
16
|
+
- Manifest dependency analysis is content-addressed and root output publishes
|
|
17
|
+
timing layers, including manifest cost.
|
|
18
|
+
- `risk` stdout and `migrate-check --compact` deduplicate invariant rule prose;
|
|
19
|
+
full reports remain available through `-o`.
|
|
20
|
+
|
|
21
|
+
### Documentation
|
|
22
|
+
- Consolidated the two follow-up audits in the roadmap without duplicating the
|
|
23
|
+
already resolved 5.5.0 defect entries.
|
|
24
|
+
|
|
25
|
+
## [5.5.1] — 2026-08-13
|
|
26
|
+
|
|
27
|
+
**External audit corrections and command execution performance.**
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
- **Impact callers** now expand accessor and interface frontiers consistently,
|
|
31
|
+
with caller symbols remaining a refinement of caller classes.
|
|
32
|
+
- **Endpoint and validation contracts** now expose test-surface policy, reuse
|
|
33
|
+
servlet declarations, and require real `Validator`/`setValidator` evidence.
|
|
34
|
+
- **Modernization references** now recognize nested types used by their
|
|
35
|
+
enclosing class.
|
|
36
|
+
- **Spring audit output** is bounded by default while explicit full output
|
|
37
|
+
remains available through `--output` and `--compact`.
|
|
38
|
+
- **Repeated command execution** reuses the cached analysis context and reports
|
|
39
|
+
independent cache-layer states for context, parse, snapshot, and RIS.
|
|
40
|
+
|
|
41
|
+
### Documentation
|
|
42
|
+
- Closed the 2026-08-13 external audit backlog in the roadmap with fix hashes
|
|
43
|
+
and regression coverage.
|
|
44
|
+
|
|
5
45
|
## [5.5.0] — 2026-08-12
|
|
6
46
|
|
|
7
47
|
**Audit backlog resolved and performance signals made explicit.**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 5.5.
|
|
3
|
+
Version: 5.5.2
|
|
4
4
|
Summary: Persistent structural context and ultra-fast repeated analysis for AI coding agents
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Keywords: agents,ai,codebase,context,developer-tools,llm
|
|
@@ -42,7 +42,7 @@ Description-Content-Type: text/markdown
|
|
|
42
42
|
|
|
43
43
|
**Context · Impact · Migration · Architecture · Review — everything from one structural model.**
|
|
44
44
|
|
|
45
|
-

|
|
46
46
|

|
|
47
47
|
|
|
48
48
|
> **ASK Engine** is the product. The CLI command is **`ask`**. The legacy **`sourcecode`**
|
|
@@ -126,7 +126,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
126
126
|
# pip / pipx
|
|
127
127
|
pipx install sourcecode # or: pip install sourcecode
|
|
128
128
|
|
|
129
|
-
ask version # ask 5.5.
|
|
129
|
+
ask version # ask 5.5.2 — and, on a build that has aged,
|
|
130
130
|
# how many releases have probably shipped since
|
|
131
131
|
```
|
|
132
132
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
**Context · Impact · Migration · Architecture · Review — everything from one structural model.**
|
|
6
6
|
|
|
7
|
-

|
|
8
8
|

|
|
9
9
|
|
|
10
10
|
> **ASK Engine** is the product. The CLI command is **`ask`**. The legacy **`sourcecode`**
|
|
@@ -88,7 +88,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
88
88
|
# pip / pipx
|
|
89
89
|
pipx install sourcecode # or: pip install sourcecode
|
|
90
90
|
|
|
91
|
-
ask version # ask 5.5.
|
|
91
|
+
ask version # ask 5.5.2 — and, on a build that has aged,
|
|
92
92
|
# how many releases have probably shipped since
|
|
93
93
|
```
|
|
94
94
|
|
|
@@ -3125,6 +3125,7 @@ def main(
|
|
|
3125
3125
|
raise typer.Exit()
|
|
3126
3126
|
|
|
3127
3127
|
_t0 = time.monotonic()
|
|
3128
|
+
_root_timing: dict[str, float] = {}
|
|
3128
3129
|
no_tree: bool = False # set True by --agent; --no-tree flag removed
|
|
3129
3130
|
|
|
3130
3131
|
# Validate new flag choices
|
|
@@ -3457,6 +3458,9 @@ def main(
|
|
|
3457
3458
|
_core_hash = ""
|
|
3458
3459
|
_core_flags_str = ""
|
|
3459
3460
|
_view_flags_str = ""
|
|
3461
|
+
# Reuse the freshness decision for cache metadata; otherwise the root
|
|
3462
|
+
# command repeats a full Git status walk after the analysis completes.
|
|
3463
|
+
_tree_is_dirty: Optional[bool] = None
|
|
3460
3464
|
|
|
3461
3465
|
if not no_cache:
|
|
3462
3466
|
try:
|
|
@@ -3506,6 +3510,8 @@ def main(
|
|
|
3506
3510
|
Path(_git_root_str) if _git_root_str else target,
|
|
3507
3511
|
scope=target,
|
|
3508
3512
|
)
|
|
3513
|
+
if _tree_sig and _git_sha:
|
|
3514
|
+
_tree_is_dirty = _tree_sig != _git_sha
|
|
3509
3515
|
if _tree_sig:
|
|
3510
3516
|
_core_key = f"{_tree_sig}-{_core_h}"
|
|
3511
3517
|
else:
|
|
@@ -3821,7 +3827,11 @@ def main(
|
|
|
3821
3827
|
if format == "json":
|
|
3822
3828
|
try:
|
|
3823
3829
|
from sourcecode.ris import _has_uncommitted_changes as _huc
|
|
3824
|
-
_uncommitted =
|
|
3830
|
+
_uncommitted = (
|
|
3831
|
+
_tree_is_dirty
|
|
3832
|
+
if _tree_is_dirty is not None
|
|
3833
|
+
else _huc(target)
|
|
3834
|
+
)
|
|
3825
3835
|
except Exception:
|
|
3826
3836
|
_uncommitted = False
|
|
3827
3837
|
_data_scope = "COMPACT" if compact else ("AGENT" if agent else "FULL")
|
|
@@ -3938,6 +3948,7 @@ def main(
|
|
|
3938
3948
|
if _advisory:
|
|
3939
3949
|
typer.echo(_advisory, err=True)
|
|
3940
3950
|
|
|
3951
|
+
_manifest_t0 = time.perf_counter()
|
|
3941
3952
|
_perf_detection = perf.start()
|
|
3942
3953
|
detector = ProjectDetector(build_default_detectors())
|
|
3943
3954
|
workspace_analysis = WorkspaceAnalyzer().analyze(target, manifests)
|
|
@@ -3998,6 +4009,7 @@ def main(
|
|
|
3998
4009
|
root_dependencies, root_summary = dependency_analyzer.analyze(target)
|
|
3999
4010
|
dependency_records.extend(root_dependencies)
|
|
4000
4011
|
dependency_summaries.append(root_summary)
|
|
4012
|
+
_root_timing["manifests_ms"] = round((time.perf_counter() - _manifest_t0) * 1000, 2)
|
|
4001
4013
|
module_graphs = []
|
|
4002
4014
|
if graph_analyzer is not None:
|
|
4003
4015
|
root_graph_tree = (
|
|
@@ -4643,6 +4655,13 @@ def main(
|
|
|
4643
4655
|
)
|
|
4644
4656
|
|
|
4645
4657
|
perf.stop("analysis", _perf_analysis)
|
|
4658
|
+
# Root timings are deliberately a small diagnostic envelope. They make cold
|
|
4659
|
+
# manifest cost visible even when the optional perf recorder is disabled.
|
|
4660
|
+
_root_timing.setdefault("context_ms", round((time.monotonic() - _t0) * 1000, 2))
|
|
4661
|
+
_root_timing.setdefault("parse_ms", 0.0)
|
|
4662
|
+
_root_timing.setdefault("cir_ms", 0.0)
|
|
4663
|
+
_root_timing.setdefault("ris_ms", 0.0)
|
|
4664
|
+
_root_timing.setdefault("snapshot_ms", 0.0)
|
|
4646
4665
|
# 4. Serialize
|
|
4647
4666
|
_progress.update("serializing output")
|
|
4648
4667
|
_perf_serialize = perf.start()
|
|
@@ -4688,8 +4707,16 @@ def main(
|
|
|
4688
4707
|
raw_dict = standard_view(sm, include_tree=tree and not no_tree)
|
|
4689
4708
|
if not no_redact:
|
|
4690
4709
|
raw_dict = redact_dict(raw_dict)
|
|
4710
|
+
data = raw_dict
|
|
4691
4711
|
content = _serialize_dict(raw_dict, format)
|
|
4692
4712
|
|
|
4713
|
+
if isinstance(data, dict):
|
|
4714
|
+
data.setdefault("_meta", {})["timing_ms"] = {
|
|
4715
|
+
**_root_timing,
|
|
4716
|
+
"total_ms": round((time.monotonic() - _t0) * 1000, 2),
|
|
4717
|
+
}
|
|
4718
|
+
content = _serialize_dict(data, format)
|
|
4719
|
+
|
|
4693
4720
|
perf.stop("serialize", _perf_serialize)
|
|
4694
4721
|
perf.flush_recorder()
|
|
4695
4722
|
|
|
@@ -4717,7 +4744,11 @@ def main(
|
|
|
4717
4744
|
if format == "json":
|
|
4718
4745
|
try:
|
|
4719
4746
|
from sourcecode.ris import _has_uncommitted_changes as _huc_fresh
|
|
4720
|
-
_uncommitted_fresh =
|
|
4747
|
+
_uncommitted_fresh = (
|
|
4748
|
+
_tree_is_dirty
|
|
4749
|
+
if _tree_is_dirty is not None
|
|
4750
|
+
else _huc_fresh(target)
|
|
4751
|
+
)
|
|
4721
4752
|
# _huc_fresh uses --untracked-files=no — it misses repos where all
|
|
4722
4753
|
# files are untracked (no staged/unstaged changes to tracked files).
|
|
4723
4754
|
# Promote to True when _allowed_changed_files contains untracked files.
|
|
@@ -6503,6 +6534,10 @@ def endpoints_cmd(
|
|
|
6503
6534
|
"the endpoint count, and the endpoint total is carried across as one "
|
|
6504
6535
|
"number rather than 3 500 rows.",
|
|
6505
6536
|
),
|
|
6537
|
+
include_tests: bool = typer.Option(
|
|
6538
|
+
False, "--include-tests",
|
|
6539
|
+
help="Include endpoints from test source and test-fixture modules; excluded by default.",
|
|
6540
|
+
),
|
|
6506
6541
|
client_usage: bool = typer.Option(
|
|
6507
6542
|
False, "--client-usage",
|
|
6508
6543
|
help="Join the routes against the HTTP calls written in the TypeScript/"
|
|
@@ -6563,7 +6598,7 @@ def endpoints_cmd(
|
|
|
6563
6598
|
_prog = Progress()
|
|
6564
6599
|
_prog.start("scanning endpoints")
|
|
6565
6600
|
try:
|
|
6566
|
-
data = _extract_java_endpoints(target)
|
|
6601
|
+
data = _extract_java_endpoints(target, include_tests=include_tests)
|
|
6567
6602
|
finally:
|
|
6568
6603
|
_prog.finish()
|
|
6569
6604
|
|
|
@@ -8989,9 +9024,26 @@ def spring_audit_cmd(
|
|
|
8989
9024
|
# 9,53 s on a 1 303-file repository) and it is the same parse the other
|
|
8990
9025
|
# knowledge commands share, so it is fetched rather than rebuilt — which
|
|
8991
9026
|
# is what makes a warm worth anything here (cold == warm before C3-94).
|
|
8992
|
-
|
|
8993
|
-
|
|
9027
|
+
_repo_root = _ctxcache.repo_root_of(target)
|
|
9028
|
+
cir, _cir_lookup = _ctxcache.get_or_build_cir(
|
|
9029
|
+
_repo_root, target, file_list, progress=_work_sink(_prog)
|
|
8994
9030
|
)
|
|
9031
|
+
_cache_state = {
|
|
9032
|
+
"context": "warm" if _cir_lookup.hit else "cold",
|
|
9033
|
+
"parse": "warm" if _cir_lookup.hit else "cold",
|
|
9034
|
+
}
|
|
9035
|
+
try:
|
|
9036
|
+
from sourcecode import cache as _cache_state_mod
|
|
9037
|
+
_cache_status = _cache_state_mod.status(target)
|
|
9038
|
+
_cache_state["snapshot"] = (
|
|
9039
|
+
"warm" if _cache_status.get("cached_cores") else "cold"
|
|
9040
|
+
)
|
|
9041
|
+
_cache_state["ris"] = (
|
|
9042
|
+
"warm" if _cache_status.get("ris_exists") else "cold"
|
|
9043
|
+
)
|
|
9044
|
+
except Exception:
|
|
9045
|
+
_cache_state["snapshot"] = "unknown"
|
|
9046
|
+
_cache_state["ris"] = "unknown"
|
|
8995
9047
|
# C3-85: the stretch between the last `linking` tick and the first rule
|
|
8996
9048
|
# tick reports nothing, and what stays on the line is `n/n` — a counter
|
|
8997
9049
|
# that finished, reading as a stage still running. Measured on keycloak
|
|
@@ -9142,7 +9194,18 @@ def spring_audit_cmd(
|
|
|
9142
9194
|
"phase that never ran is not evidence there is none."
|
|
9143
9195
|
)
|
|
9144
9196
|
|
|
9145
|
-
|
|
9197
|
+
_bounded_default = (
|
|
9198
|
+
not compact and output_path is None and format == "json" and not table
|
|
9199
|
+
)
|
|
9200
|
+
data = (
|
|
9201
|
+
combined.to_compact_dict()
|
|
9202
|
+
if compact or _bounded_default
|
|
9203
|
+
else combined.to_dict()
|
|
9204
|
+
)
|
|
9205
|
+
if _bounded_default:
|
|
9206
|
+
data.pop("mode", None)
|
|
9207
|
+
data["default_output"] = "bounded"
|
|
9208
|
+
data.setdefault("metadata", {})["cache_layers"] = _cache_state
|
|
9146
9209
|
if _stopped_early:
|
|
9147
9210
|
# C3-87: the block is composed by `PhasedRun.status`, which is the
|
|
9148
9211
|
# authority `risk` is now bound to as well — one vocabulary for
|
|
@@ -9176,6 +9239,7 @@ def spring_audit_cmd(
|
|
|
9176
9239
|
elif format == "github-comment":
|
|
9177
9240
|
output = _render_spring_audit_github_comment(combined, min_severity)
|
|
9178
9241
|
else:
|
|
9242
|
+
data = combined.to_compact_dict() if compact else combined.to_dict()
|
|
9179
9243
|
output = _serialize_dict(data, format)
|
|
9180
9244
|
|
|
9181
9245
|
# F-AV: our own readers ask for the count under either spelling — the break
|
|
@@ -9763,6 +9827,9 @@ def risk_cmd(
|
|
|
9763
9827
|
data, rule_filter=rule_filter, band_filter=band_filter, top_n=top_n
|
|
9764
9828
|
)
|
|
9765
9829
|
else:
|
|
9830
|
+
if output_path is None:
|
|
9831
|
+
from sourcecode.risk import compact_risk_output
|
|
9832
|
+
data = compact_risk_output(data)
|
|
9766
9833
|
output = _serialize_dict(data, format)
|
|
9767
9834
|
_emit_command_output(
|
|
9768
9835
|
output,
|
|
@@ -162,6 +162,15 @@ class DependencyAnalyzer:
|
|
|
162
162
|
*,
|
|
163
163
|
workspace: str | None = None,
|
|
164
164
|
) -> tuple[list[DependencyRecord], DependencySummary]:
|
|
165
|
+
from sourcecode import manifest_cache
|
|
166
|
+
|
|
167
|
+
cached = manifest_cache.load(root)
|
|
168
|
+
if cached is not None:
|
|
169
|
+
records, summary = cached
|
|
170
|
+
if workspace is not None:
|
|
171
|
+
records = [replace(record, workspace=workspace) for record in records]
|
|
172
|
+
summary = replace(summary, dependencies=records)
|
|
173
|
+
return records, summary
|
|
165
174
|
records: list[DependencyRecord] = []
|
|
166
175
|
limitations: list[str] = []
|
|
167
176
|
|
|
@@ -185,7 +194,12 @@ class DependencyAnalyzer:
|
|
|
185
194
|
replace(r, role=_infer_role(r.name, r.ecosystem, r.scope))
|
|
186
195
|
for r in deduped
|
|
187
196
|
]
|
|
188
|
-
|
|
197
|
+
summary = self._build_summary(deduped, limitations)
|
|
198
|
+
manifest_cache.save(root, deduped, summary)
|
|
199
|
+
if workspace is not None:
|
|
200
|
+
deduped = [replace(record, workspace=workspace) for record in deduped]
|
|
201
|
+
summary = replace(summary, dependencies=deduped)
|
|
202
|
+
return deduped, summary
|
|
189
203
|
|
|
190
204
|
def merge_summaries(self, summaries: Iterable[DependencySummary]) -> DependencySummary:
|
|
191
205
|
result = DependencySummary(requested=True)
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""Content-addressed cache for manifest dependency analysis."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import hashlib
|
|
5
|
+
import json
|
|
6
|
+
import os
|
|
7
|
+
from dataclasses import asdict
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
from sourcecode.schema import DependencyRecord, DependencySummary
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _base() -> Path:
|
|
14
|
+
configured = os.environ.get("SOURCECODE_CACHE_DIR", "")
|
|
15
|
+
return Path(configured) if configured else Path.home() / ".sourcecode" / "cache"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _key(root: Path) -> str:
|
|
19
|
+
digest = hashlib.sha256()
|
|
20
|
+
analyzer = Path(__file__).with_name("dependency_analyzer.py")
|
|
21
|
+
digest.update(analyzer.read_bytes())
|
|
22
|
+
names = {
|
|
23
|
+
"pom.xml", "build.gradle", "build.gradle.kts", "package.json",
|
|
24
|
+
"package-lock.json", "pyproject.toml", "Cargo.toml", "go.mod",
|
|
25
|
+
"composer.json", "Gemfile",
|
|
26
|
+
}
|
|
27
|
+
paths: set[Path] = set()
|
|
28
|
+
for name in names:
|
|
29
|
+
paths.update(root.rglob(name))
|
|
30
|
+
for path in sorted(paths):
|
|
31
|
+
if not path.is_file():
|
|
32
|
+
continue
|
|
33
|
+
try:
|
|
34
|
+
digest.update(path.relative_to(root).as_posix().encode())
|
|
35
|
+
digest.update(path.read_bytes())
|
|
36
|
+
except OSError:
|
|
37
|
+
continue
|
|
38
|
+
return digest.hexdigest()
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def load(root: Path) -> tuple[list[DependencyRecord], DependencySummary] | None:
|
|
42
|
+
try:
|
|
43
|
+
path = _base() / "manifest-cache-v1" / f"{_key(root)}.json"
|
|
44
|
+
data = json.loads(path.read_text(encoding="utf-8"))
|
|
45
|
+
records = [DependencyRecord(**row) for row in data["records"]]
|
|
46
|
+
summary = DependencySummary(**data["summary"])
|
|
47
|
+
summary.dependencies = records
|
|
48
|
+
return records, summary
|
|
49
|
+
except (OSError, ValueError, KeyError, TypeError):
|
|
50
|
+
return None
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def save(root: Path, records: list[DependencyRecord], summary: DependencySummary) -> None:
|
|
54
|
+
try:
|
|
55
|
+
path = _base() / "manifest-cache-v1" / f"{_key(root)}.json"
|
|
56
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
57
|
+
payload = {"records": [asdict(row) for row in records], "summary": asdict(summary)}
|
|
58
|
+
tmp = path.with_suffix(".tmp")
|
|
59
|
+
tmp.write_text(json.dumps(payload, sort_keys=True), encoding="utf-8")
|
|
60
|
+
tmp.replace(path)
|
|
61
|
+
except OSError:
|
|
62
|
+
return
|
|
@@ -2375,6 +2375,26 @@ class MigrationReport:
|
|
|
2375
2375
|
compact, "findings", top_n,
|
|
2376
2376
|
key=lambda f: SEVERITY_ORDER.get(f.get("severity"), 3),
|
|
2377
2377
|
)
|
|
2378
|
+
# Keep invariant rule prose once; each finding carries only location and
|
|
2379
|
+
# rule identity. Full prose remains available in the non-compact report.
|
|
2380
|
+
_rule_catalog: dict[str, dict] = {}
|
|
2381
|
+
_lean_findings: list[dict] = []
|
|
2382
|
+
for _finding in compact.get("findings", []):
|
|
2383
|
+
_rule_id = _finding.get("rule_id", "unknown")
|
|
2384
|
+
_rule_catalog.setdefault(_rule_id, {
|
|
2385
|
+
"title": _finding.get("title", ""),
|
|
2386
|
+
"explanation": _finding.get("explanation", ""),
|
|
2387
|
+
"fix_hint": _finding.get("fix_hint", ""),
|
|
2388
|
+
})
|
|
2389
|
+
_lean_findings.append({
|
|
2390
|
+
key: _finding[key]
|
|
2391
|
+
for key in (
|
|
2392
|
+
"id", "rule_id", "severity", "source_file", "first_line",
|
|
2393
|
+
"migration_target", "imports_found", "code_context",
|
|
2394
|
+
) if key in _finding
|
|
2395
|
+
})
|
|
2396
|
+
compact["rule_catalog"] = _rule_catalog
|
|
2397
|
+
compact["findings"] = _lean_findings
|
|
2378
2398
|
hib = full.get("hibernate")
|
|
2379
2399
|
if isinstance(hib, dict):
|
|
2380
2400
|
h = dict(hib)
|
|
@@ -223,6 +223,18 @@ def _scan_repository(
|
|
|
223
223
|
for fqn in by_qualified[hit]:
|
|
224
224
|
if fqn not in nested_hits and nested[fqn][1] != rel:
|
|
225
225
|
nested_hits[fqn] = rel
|
|
226
|
+
# Nested types are often used unqualified by their enclosing
|
|
227
|
+
# class (`private Operation operation` or `Map<String, DATATYPE>`).
|
|
228
|
+
# The declaration is not a reference; a second occurrence is.
|
|
229
|
+
for fqn, (qualified, owner_file) in nested.items():
|
|
230
|
+
if owner_file != rel or fqn in nested_hits:
|
|
231
|
+
continue
|
|
232
|
+
nested_name = qualified.rsplit(".", 1)[-1]
|
|
233
|
+
unqualified = re.findall(
|
|
234
|
+
rf"(?<!\.)\b{re.escape(nested_name)}\b", text
|
|
235
|
+
)
|
|
236
|
+
if len(unqualified) > 1:
|
|
237
|
+
nested_hits[fqn] = rel
|
|
226
238
|
scan_java = len(nested_hits) < len(nested)
|
|
227
239
|
if not scan_config and not scan_java:
|
|
228
240
|
return config_hits, nested_hits, literal_hits
|
|
@@ -311,7 +323,7 @@ def analyze_type_references(nodes: "list[dict]", root: Path) -> ReferenceFacts:
|
|
|
311
323
|
entries.append(TypeReference(
|
|
312
324
|
status=REFERENCED,
|
|
313
325
|
basis=(
|
|
314
|
-
f"
|
|
326
|
+
f"referenced by its enclosing source in {nested_hits[fqn]}"
|
|
315
327
|
if fqn in nested_hits
|
|
316
328
|
else f"referenced by a class literal in {literal_refs[fqn]}"
|
|
317
329
|
),
|
|
@@ -27,7 +27,7 @@ from typing import Any, Optional
|
|
|
27
27
|
#: The date `__version__` was released, from that version's CHANGELOG entry.
|
|
28
28
|
#: `tests/test_release_info.py` fails the build if the two disagree, so this is
|
|
29
29
|
#: a copy of a fact rather than a second authority for it.
|
|
30
|
-
RELEASE_DATE = "2026-08-
|
|
30
|
+
RELEASE_DATE = "2026-08-13"
|
|
31
31
|
|
|
32
32
|
#: Releases per day, measured over the 30 releases before this one (the same
|
|
33
33
|
#: computation the test re-runs against the CHANGELOG). Stable across window
|