sourcecode 4.10.1__tar.gz → 4.10.3__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-4.10.1 → sourcecode-4.10.3}/CHANGELOG.md +44 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/PKG-INFO +11 -4
- {sourcecode-4.10.1 → sourcecode-4.10.3}/README.md +10 -3
- {sourcecode-4.10.1 → sourcecode-4.10.3}/pyproject.toml +1 -1
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/__init__.py +1 -1
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/runs.py +12 -1
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/security_config_scan.py +38 -10
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/spring_security_audit.py +2 -1
- {sourcecode-4.10.1 → sourcecode-4.10.3}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/.gitignore +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/.ruff.toml +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/CLAUDE.md +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/CONTRIBUTING.md +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/LICENSE +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/SECURITY.md +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/raw +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/scripts/compare_integration_engines.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/scripts/customer_smoke_test.sh +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/scripts/generate_jdk_exports.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/scripts/perf_harness.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/archetype.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/architectural_baseline.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/architectural_delta.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/audit_report.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/baseline_autocapture.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/cache.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/cache_model.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/call_surface.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/caller_metrics.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/caller_reach.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/canonical_ir.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/chain_rules.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/change_plan.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/cir_graphs.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/classifier.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/cli.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/client_calls.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/compare.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/constraint_diff.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/context_cache.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/context_graph.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/contract_diff.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/contract_init.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/data_exposure.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/data_labels.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/defect_identity.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/degradation.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/deployment_prefix.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/dynamic_argument_surface.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/endpoint_literals.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/endpoint_metrics.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/envelope.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/environment_resolution.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/error_schema.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/evidence_provider.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/explain.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/facts/__init__.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/facts/registry.json +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/file_chunker.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/filter_surface.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/format_contract.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/fqn_utils.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/git_checkout.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/graph_evidence.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/hibernate_strat.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/identity_fallback.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/integration_coordinates.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/jdk_exports.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/license.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/mcp/__init__.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/mcp/onboarding/applier.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/mcp/onboarding/backup.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/mcp/onboarding/detector.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/mcp/onboarding/planner.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/mcp/orchestrator.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/mcp/registry.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/mcp/runner.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/mcp/server.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/mcp_nudge.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/migrate_check.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/migration_blast.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/non_coverage.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/openapi_surface.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/openrewrite_recipe.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/output_budget.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/parse_cache.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/path_admission.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/path_filters.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/perf.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/pipe_contract.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/posture.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/pr_comment_renderer.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/pr_impact.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/prepare_context.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/progress.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/provenance.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/readiness_timeline.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/reconciliation.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/redactor.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/reference_facts.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/release_info.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/remedies.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/rename_refactor.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/repository_ir.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/retrieval/__init__.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/retrieval/context.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/retrieval/errors.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/retrieval/executor.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/retrieval/planner.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/retrieval/query.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/retrieval/request.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/retrieval/resolution.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/retrieval/result.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/retrieval/retriever.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/retrieval/runtime.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/retrieval/steps.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/retrieval/steps_graph.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/retrieval/steps_impact.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/retrieval/steps_intf.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/retrieval/steps_struct.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/retrieval/steps_txsec.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/ris.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/risk.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/rule_catalog.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/sarif.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/scanner.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/schema.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/security_config.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/security_posture.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/semantic_impact_engine.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/semantic_integration_engine.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/semantic_services.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/serializer.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/servlet_surface.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/source_text.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/spring_event_topology.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/spring_findings.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/spring_impact.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/spring_model.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/spring_profiles.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/spring_properties.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/spring_semantic.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/spring_tx_analyzer.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/target_admission.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/test_gap_ranking.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/test_sources.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/token_estimate.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/type_usage_surface.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/validation_inference.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/validation_surface.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/verify_edit.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/verify_repo.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/verify_rules.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/version_check.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/src/sourcecode/workspace.py +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/supabase/functions/README.md +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/supabase/functions/get-license/index.ts +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/supabase/functions/telemetry/index.ts +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/supabase/sql/license_event_ordering.sql +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/supabase/sql/licensing_schema.sql +0 -0
- {sourcecode-4.10.1 → sourcecode-4.10.3}/supabase/sql/telemetry_events.sql +0 -0
|
@@ -2,6 +2,50 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [4.10.3] — 2026-08-05
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- **`GATE-001` no longer reads Java control keywords as method calls.** The regex
|
|
10
|
+
body scan behind the gated-endpoint audit treated `if(...)`, `for(...)`,
|
|
11
|
+
`while(...)`, `switch(...)`, `catch(...)` and `synchronized(...)` as same-class
|
|
12
|
+
invocations, so a handler could be reported as `Controller#if`. Those symbols
|
|
13
|
+
reached the `risk` critical band and `audit-report` top risks. Control keywords
|
|
14
|
+
are now excluded from method-name matches; the real private-method gate finding
|
|
15
|
+
stays covered.
|
|
16
|
+
- **`SEC-007` reports JavaMelody descriptor credentials in their field shape.**
|
|
17
|
+
`authorized-users` is now read directly from the named descriptor parameter even
|
|
18
|
+
when the value carries a digest (`{SHA-256}…`), spans multiple lines, or is
|
|
19
|
+
wrapped in `CDATA`, and the generic descriptor-value fallback is deduplicated so
|
|
20
|
+
one credential yields exactly one finding. The evidence line stays redacted.
|
|
21
|
+
|
|
22
|
+
### Tests
|
|
23
|
+
|
|
24
|
+
- Regression coverage binds both fixes through the full `spring-audit` CLI path,
|
|
25
|
+
including a `options/DPA/WEB-INF/web.xml` descriptor and a controller whose
|
|
26
|
+
handler body contains the control constructs that produced the false positive.
|
|
27
|
+
|
|
28
|
+
## [4.10.2] — 2026-08-05
|
|
29
|
+
|
|
30
|
+
### Fixed
|
|
31
|
+
|
|
32
|
+
- **Durable run records are read-only by default.** Long repo-wide/deep commands
|
|
33
|
+
now write run records under `~/.sourcecode/runs/<repo-hash>/` instead of
|
|
34
|
+
`<repo>/.ask/runs`, with `ASK_RUNS_IN_REPO=1` as the explicit repo-local opt-in.
|
|
35
|
+
- **`DEAD-001` comment scanning avoids ordinary files.** The commented-security
|
|
36
|
+
control pass now prefilters by security-control vocabulary before extracting
|
|
37
|
+
comment spans, preserving `DEAD-001` positives while reducing the cost added to
|
|
38
|
+
large `spring-audit` runs.
|
|
39
|
+
- **Field regression guards for `spring-audit`.** End-to-end tests now lock that
|
|
40
|
+
reserved-keyword handler symbols such as `#if` cannot reach security findings,
|
|
41
|
+
and that JavaMelody `authorized-users` credentials in `web.xml` emit `SEC-007`.
|
|
42
|
+
|
|
43
|
+
### Documentation
|
|
44
|
+
|
|
45
|
+
- README, user guide, roadmap and defect ledger now record the 4.10.0 field
|
|
46
|
+
confirmation queue, the supervised heartbeat contract and the external run-record
|
|
47
|
+
location.
|
|
48
|
+
|
|
5
49
|
## [4.10.1] — 2026-08-05
|
|
6
50
|
|
|
7
51
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 4.10.
|
|
3
|
+
Version: 4.10.3
|
|
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`**
|
|
@@ -73,7 +73,14 @@ These numbers are cache-layer benchmarks, not a promise for every command. Per-s
|
|
|
73
73
|
|
|
74
74
|
With the right command class, ASK Engine becomes **constant infrastructure** inside agent loops — call the fast/context surfaces before edits and reserve deep compositions for the points where their evidence is worth the runtime.
|
|
75
75
|
|
|
76
|
-
**Large-repo controls.** Set `ASK_PROGRESS=1` to get line heartbeats in non-TTY
|
|
76
|
+
**Large-repo controls.** Set `ASK_PROGRESS=1` to get line heartbeats in non-TTY
|
|
77
|
+
supervised runs. Long repo-wide/deep runs also write durable records under
|
|
78
|
+
`~/.sourcecode/runs/<repo-hash>/` by default, not inside the audited repository;
|
|
79
|
+
set `ASK_RUNS_IN_REPO=1` only when repo-local `.ask/runs` records are intentional.
|
|
80
|
+
Set `ASK_MAX_ANALYSIS_SECONDS=<seconds>` to fail before starting a repo-wide/deep
|
|
81
|
+
command whose configured budget is below its safe floor. Use
|
|
82
|
+
`ask audit-report --from-risk risk.json` to package an existing risk run instead
|
|
83
|
+
of recomputing it.
|
|
77
84
|
|
|
78
85
|
**What a warm actually covers.** `ask cache warm` runs the compact analysis: it rebuilds the
|
|
79
86
|
shared structural layers (L1/L2 + the Repository Intelligence Snapshot + the shared Canonical
|
|
@@ -99,7 +106,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
99
106
|
# pip / pipx
|
|
100
107
|
pipx install sourcecode # or: pip install sourcecode
|
|
101
108
|
|
|
102
|
-
ask version # ask 4.10.
|
|
109
|
+
ask version # ask 4.10.3 — and, on a build that has aged,
|
|
103
110
|
# how many releases have probably shipped since
|
|
104
111
|
```
|
|
105
112
|
|
|
@@ -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`**
|
|
@@ -35,7 +35,14 @@ These numbers are cache-layer benchmarks, not a promise for every command. Per-s
|
|
|
35
35
|
|
|
36
36
|
With the right command class, ASK Engine becomes **constant infrastructure** inside agent loops — call the fast/context surfaces before edits and reserve deep compositions for the points where their evidence is worth the runtime.
|
|
37
37
|
|
|
38
|
-
**Large-repo controls.** Set `ASK_PROGRESS=1` to get line heartbeats in non-TTY
|
|
38
|
+
**Large-repo controls.** Set `ASK_PROGRESS=1` to get line heartbeats in non-TTY
|
|
39
|
+
supervised runs. Long repo-wide/deep runs also write durable records under
|
|
40
|
+
`~/.sourcecode/runs/<repo-hash>/` by default, not inside the audited repository;
|
|
41
|
+
set `ASK_RUNS_IN_REPO=1` only when repo-local `.ask/runs` records are intentional.
|
|
42
|
+
Set `ASK_MAX_ANALYSIS_SECONDS=<seconds>` to fail before starting a repo-wide/deep
|
|
43
|
+
command whose configured budget is below its safe floor. Use
|
|
44
|
+
`ask audit-report --from-risk risk.json` to package an existing risk run instead
|
|
45
|
+
of recomputing it.
|
|
39
46
|
|
|
40
47
|
**What a warm actually covers.** `ask cache warm` runs the compact analysis: it rebuilds the
|
|
41
48
|
shared structural layers (L1/L2 + the Repository Intelligence Snapshot + the shared Canonical
|
|
@@ -61,7 +68,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
61
68
|
# pip / pipx
|
|
62
69
|
pipx install sourcecode # or: pip install sourcecode
|
|
63
70
|
|
|
64
|
-
ask version # ask 4.10.
|
|
71
|
+
ask version # ask 4.10.3 — and, on a build that has aged,
|
|
65
72
|
# how many releases have probably shipped since
|
|
66
73
|
```
|
|
67
74
|
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
from __future__ import annotations
|
|
3
3
|
|
|
4
4
|
import json
|
|
5
|
+
import hashlib
|
|
5
6
|
import os
|
|
6
7
|
import time
|
|
7
8
|
import uuid
|
|
@@ -18,7 +19,17 @@ def _now() -> float:
|
|
|
18
19
|
|
|
19
20
|
|
|
20
21
|
def _runs_dir(root: Path) -> Path:
|
|
21
|
-
|
|
22
|
+
override = os.environ.get("ASK_RUNS_DIR", "").strip()
|
|
23
|
+
if override:
|
|
24
|
+
return Path(override).expanduser().resolve()
|
|
25
|
+
if os.environ.get("ASK_RUNS_IN_REPO", "").lower() in ("1", "true", "yes", "on"):
|
|
26
|
+
return Path(root).resolve() / ".ask" / "runs"
|
|
27
|
+
try:
|
|
28
|
+
key_source = str(Path(root).resolve())
|
|
29
|
+
except Exception:
|
|
30
|
+
key_source = str(Path(root).absolute())
|
|
31
|
+
repo_key = hashlib.sha256(key_source.encode("utf-8", errors="replace")).hexdigest()[:16]
|
|
32
|
+
return Path.home() / ".sourcecode" / "runs" / repo_key
|
|
22
33
|
|
|
23
34
|
|
|
24
35
|
@dataclass
|
|
@@ -111,8 +111,8 @@ _IS_REFERENCE = re.compile(r"[$@]\{[^}]+\}|^\s*$|^\s*ENC\(|^\s*\*+\s*$")
|
|
|
111
111
|
#: XML elements whose text is a configured VALUE. Servlet/JEE spec vocabulary.
|
|
112
112
|
_DESCRIPTOR_VALUE = re.compile(
|
|
113
113
|
r"<(?P<tag>param-value|env-entry-value|value|property|password)\b[^>]*>"
|
|
114
|
-
r"(?P<value
|
|
115
|
-
re.IGNORECASE,
|
|
114
|
+
r"(?P<value>.*?)</(?P=tag)>",
|
|
115
|
+
re.IGNORECASE | re.DOTALL,
|
|
116
116
|
)
|
|
117
117
|
|
|
118
118
|
_DESCRIPTOR_INIT_PARAM = re.compile(
|
|
@@ -124,8 +124,8 @@ _DESCRIPTOR_PARAM_NAME = re.compile(
|
|
|
124
124
|
re.IGNORECASE,
|
|
125
125
|
)
|
|
126
126
|
_DESCRIPTOR_PARAM_VALUE = re.compile(
|
|
127
|
-
r"<param-value\b[^>]*>(?P<value
|
|
128
|
-
re.IGNORECASE,
|
|
127
|
+
r"<param-value\b[^>]*>(?P<value>.*?)</param-value>",
|
|
128
|
+
re.IGNORECASE | re.DOTALL,
|
|
129
129
|
)
|
|
130
130
|
_JAVAMELODY_CREDENTIAL_PARAMS: frozenset[str] = frozenset({
|
|
131
131
|
"authorized-users",
|
|
@@ -212,6 +212,15 @@ _COMMENTED_CONFIG_CONTROLS: tuple[tuple[re.Pattern, str, str], ...] = (
|
|
|
212
212
|
),
|
|
213
213
|
)
|
|
214
214
|
|
|
215
|
+
_COMMENTED_JAVA_HINTS = (
|
|
216
|
+
"@PreAuthorize", "@PostAuthorize", "@Secured", "@RolesAllowed", "@DenyAll",
|
|
217
|
+
"@PermitAll", "FiltroSeguridad", "Security", "Authz", "Authorize",
|
|
218
|
+
"Authorized", "setSecure", "csrfTokenRepository", "csrf(",
|
|
219
|
+
)
|
|
220
|
+
_COMMENTED_XML_HINTS = (
|
|
221
|
+
"<transport-guarantee", "CONFIDENTIAL", "<security-constraint", "<intercept-url",
|
|
222
|
+
)
|
|
223
|
+
|
|
215
224
|
|
|
216
225
|
@dataclass(frozen=True)
|
|
217
226
|
class SecurityConfigObservation:
|
|
@@ -355,7 +364,14 @@ def _scan_descriptor(text: str, rel: str) -> "list[SecurityConfigObservation]":
|
|
|
355
364
|
holds a reference and is not reported; one that carries a digest literal
|
|
356
365
|
holds the credential itself, in a file under version control.
|
|
357
366
|
"""
|
|
367
|
+
def _xml_value(raw: str) -> str:
|
|
368
|
+
value = raw.strip()
|
|
369
|
+
if value.startswith("<![CDATA[") and value.endswith("]]>"):
|
|
370
|
+
value = value[len("<![CDATA["):-len("]]>")]
|
|
371
|
+
return value.strip()
|
|
372
|
+
|
|
358
373
|
out: "list[SecurityConfigObservation]" = []
|
|
374
|
+
javamelody_value_offsets: set[int] = set()
|
|
359
375
|
for param in _DESCRIPTOR_INIT_PARAM.finditer(text):
|
|
360
376
|
body = param.group("body")
|
|
361
377
|
name_m = _DESCRIPTOR_PARAM_NAME.search(body)
|
|
@@ -363,22 +379,29 @@ def _scan_descriptor(text: str, rel: str) -> "list[SecurityConfigObservation]":
|
|
|
363
379
|
if name_m is None or value_m is None:
|
|
364
380
|
continue
|
|
365
381
|
name = name_m.group("value").strip().lower()
|
|
366
|
-
value = value_m.group("value")
|
|
382
|
+
value = _xml_value(value_m.group("value"))
|
|
367
383
|
if name not in _JAVAMELODY_CREDENTIAL_PARAMS:
|
|
368
384
|
continue
|
|
369
385
|
if not value or _IS_REFERENCE.search(value):
|
|
370
386
|
continue
|
|
371
387
|
if ":" not in value:
|
|
372
388
|
continue
|
|
373
|
-
if _DIGEST_LITERAL.search(value):
|
|
374
|
-
continue
|
|
375
389
|
user = value.split(":", 1)[0].strip() or "user"
|
|
390
|
+
value_offset = param.start("body") + value_m.start("value")
|
|
391
|
+
javamelody_value_offsets.add(value_offset)
|
|
392
|
+
digest = _DIGEST_LITERAL.search(value)
|
|
393
|
+
evidence = (
|
|
394
|
+
f"<param-value>{user}:…{{{digest.group('algo')}}}"
|
|
395
|
+
f"{digest.group('digest')[:8]}…</param-value>"
|
|
396
|
+
if digest is not None
|
|
397
|
+
else f"<param-value>{user}:…</param-value>"
|
|
398
|
+
)
|
|
376
399
|
out.append(SecurityConfigObservation(
|
|
377
400
|
rule="SEC-007",
|
|
378
401
|
file=rel,
|
|
379
|
-
line=_line_of(text,
|
|
402
|
+
line=_line_of(text, value_offset),
|
|
380
403
|
symbol=rel,
|
|
381
|
-
evidence=
|
|
404
|
+
evidence=evidence,
|
|
382
405
|
detail=(
|
|
383
406
|
"JavaMelody authorized-users stores a monitoring-console credential "
|
|
384
407
|
"directly in the deployment descriptor. The value is redacted here; "
|
|
@@ -386,7 +409,9 @@ def _scan_descriptor(text: str, rel: str) -> "list[SecurityConfigObservation]":
|
|
|
386
409
|
),
|
|
387
410
|
))
|
|
388
411
|
for match in _DESCRIPTOR_VALUE.finditer(text):
|
|
389
|
-
|
|
412
|
+
if match.start("value") in javamelody_value_offsets:
|
|
413
|
+
continue
|
|
414
|
+
value = _xml_value(match.group("value"))
|
|
390
415
|
if not value or _IS_REFERENCE.search(value):
|
|
391
416
|
continue
|
|
392
417
|
digest = _DIGEST_LITERAL.search(value)
|
|
@@ -456,6 +481,9 @@ def _scan_commented_controls(
|
|
|
456
481
|
from sourcecode.source_text import commented_spans
|
|
457
482
|
|
|
458
483
|
rules = _COMMENTED_XML_CONTROLS if xml else _COMMENTED_JAVA_CONTROLS
|
|
484
|
+
hints = _COMMENTED_XML_HINTS if xml else _COMMENTED_JAVA_HINTS
|
|
485
|
+
if not any(hint in source for hint in hints):
|
|
486
|
+
return []
|
|
459
487
|
out: "list[SecurityConfigObservation]" = []
|
|
460
488
|
seen: set[tuple[str, int]] = set()
|
|
461
489
|
for start, end in commented_spans(source, xml=xml):
|
|
@@ -508,7 +508,8 @@ def _line_of(source: str, offset: int) -> int:
|
|
|
508
508
|
_JAVA_METHOD_RE = re.compile(
|
|
509
509
|
r"(?P<mods>(?:(?:public|protected|private|static|final|synchronized|abstract|native)\s+)*)"
|
|
510
510
|
r"(?P<ret>[\w.$<>\[\], ?]+)\s+"
|
|
511
|
-
r"(?P<name>
|
|
511
|
+
r"(?P<name>(?!(?:if|for|while|switch|catch|synchronized|return|new|throw|try|else|do)\b)"
|
|
512
|
+
r"[a-zA-Z_][\w$]*)\s*\([^;{}]*\)\s*(?:throws\s+[^{]+)?\{",
|
|
512
513
|
re.MULTILINE,
|
|
513
514
|
)
|
|
514
515
|
|
|
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
|
|
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
|
|
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
|