sourcecode 4.5.1__tar.gz → 4.5.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.5.1 → sourcecode-4.5.3}/CHANGELOG.md +145 -0
- sourcecode-4.5.3/CLAUDE.md +74 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/CONTRIBUTING.md +56 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/PKG-INFO +4 -4
- {sourcecode-4.5.1 → sourcecode-4.5.3}/README.md +3 -3
- {sourcecode-4.5.1 → sourcecode-4.5.3}/pyproject.toml +1 -1
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/__init__.py +1 -1
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/ast_extractor.py +1 -1
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/cli.py +555 -362
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/client_calls.py +5 -2
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/contract_init.py +56 -15
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/data_exposure.py +31 -2
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/release_info.py +1 -1
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/remedies.py +17 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/ris.py +27 -17
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/security_config_scan.py +19 -4
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/servlet_surface.py +8 -2
- sourcecode-4.5.3/src/sourcecode/source_text.py +103 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/token_estimate.py +1 -1
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/verify_edit.py +2 -2
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/verify_repo.py +2 -1
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/verify_rules.py +32 -12
- {sourcecode-4.5.1 → sourcecode-4.5.3}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/.gitignore +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/.ruff.toml +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/LICENSE +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/SECURITY.md +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/raw +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/scripts/compare_integration_engines.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/scripts/customer_smoke_test.sh +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/scripts/generate_jdk_exports.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/scripts/perf_harness.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/archetype.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/architectural_baseline.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/architectural_delta.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/baseline_autocapture.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/cache.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/cache_model.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/call_surface.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/caller_metrics.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/caller_reach.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/canonical_ir.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/chain_rules.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/change_plan.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/cir_graphs.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/classifier.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/compare.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/constraint_diff.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/context_cache.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/context_graph.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/contract_diff.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/data_labels.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/defect_identity.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/degradation.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/deployment_prefix.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/dynamic_argument_surface.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/endpoint_literals.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/endpoint_metrics.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/envelope.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/environment_resolution.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/error_schema.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/evidence_provider.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/explain.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/facts/__init__.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/facts/registry.json +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/file_chunker.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/filter_surface.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/format_contract.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/fqn_utils.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/git_checkout.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/graph_evidence.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/hibernate_strat.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/identity_fallback.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/integration_coordinates.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/jdk_exports.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/license.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp/__init__.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp/onboarding/applier.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp/onboarding/backup.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp/onboarding/detector.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp/onboarding/planner.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp/orchestrator.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp/registry.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp/runner.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp/server.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/mcp_nudge.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/migrate_check.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/migration_blast.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/non_coverage.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/openapi_surface.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/openrewrite_recipe.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/output_budget.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/parse_cache.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/path_admission.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/path_filters.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/perf.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/pipe_contract.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/posture.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/pr_comment_renderer.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/pr_impact.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/prepare_context.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/progress.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/readiness_timeline.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/reconciliation.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/redactor.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/reference_facts.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/rename_refactor.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/repository_ir.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/__init__.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/context.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/errors.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/executor.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/planner.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/query.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/request.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/resolution.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/result.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/retriever.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/runtime.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/steps.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/steps_graph.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/steps_impact.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/steps_intf.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/steps_struct.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/retrieval/steps_txsec.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/risk.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/rule_catalog.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/sarif.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/scanner.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/schema.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/security_config.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/security_posture.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/semantic_impact_engine.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/semantic_integration_engine.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/semantic_services.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/serializer.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/spring_event_topology.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/spring_findings.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/spring_impact.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/spring_model.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/spring_profiles.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/spring_properties.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/spring_security_audit.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/spring_semantic.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/spring_tx_analyzer.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/target_admission.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/test_gap_ranking.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/test_sources.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/type_usage_surface.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/validation_inference.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/validation_surface.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/version_check.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/src/sourcecode/workspace.py +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/supabase/functions/README.md +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/supabase/functions/get-license/index.ts +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/supabase/functions/telemetry/index.ts +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/supabase/sql/license_event_ordering.sql +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/supabase/sql/licensing_schema.sql +0 -0
- {sourcecode-4.5.1 → sourcecode-4.5.3}/supabase/sql/telemetry_events.sql +0 -0
|
@@ -2,6 +2,151 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [4.5.3] — 2026-08-04
|
|
6
|
+
|
|
7
|
+
Patch: the fixable half of field evaluation #10 (7,5/10, CI reliability **4/10**), in one
|
|
8
|
+
battery. Five defects, one commit each, every one reproduced on a fixture before it was
|
|
9
|
+
touched. No new capability, no published field removed, no exit code moved.
|
|
10
|
+
|
|
11
|
+
Three of the evaluation's thirteen complaints are **not** fixed here because they did not
|
|
12
|
+
survive verification against HEAD — `spring-audit --compact` has shipped since 3.7.0 (the
|
|
13
|
+
second time that closed row has been re-derived as missing), the mojibake diagnosis is
|
|
14
|
+
wrong (`_force_utf8_streams` already reconfigures both streams; this is the **fourth**
|
|
15
|
+
field report of console mojibake and none has reproduced under measurement — the one
|
|
16
|
+
variable they share is the platform with no runner, C3-39), and the "dead surface"
|
|
17
|
+
capability ships as `endpoints --client-usage`. Full record and the F-A…F-E capability
|
|
18
|
+
queue in `.planning/FIELD-EVAL-10-2026-08-04.md`.
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
|
|
22
|
+
- **`verify --init` derived a contract asserting an invariant the same build reported as
|
|
23
|
+
violated** (C1-24, **critical**). It proposed `no-sec-004` — *"SEC-004 fires nowhere in
|
|
24
|
+
this repository"* — on a tree where `spring-audit` reported SEC-004 `high`. Committed
|
|
25
|
+
without `--dry-run`, that gate is red on the commit it was derived from, on the
|
|
26
|
+
`core`-tier command whose promise is *"safe to gate CI on"*. Cause: the derivation
|
|
27
|
+
computed "fires nowhere" from the CIR pattern audit alone, and SEC-004…SEC-007 are
|
|
28
|
+
produced by `security_config_scan`, the second authority `spring-audit` also runs, which
|
|
29
|
+
returns nothing without a `root`. The root is now threaded through, so the derivation,
|
|
30
|
+
`verify`, `verify-edit` and the self-check all evaluate the same audit. **The safety net
|
|
31
|
+
had the same hole** — `execute_candidates` runs every candidate through the real engine
|
|
32
|
+
before publishing it, and it too evaluated without a root, so it approved the rule it
|
|
33
|
+
exists to stop. Same row, second half: SEC-005/006/007 appeared in **neither** the
|
|
34
|
+
proposed nor the rejected list, because the catalogue was built from the pattern
|
|
35
|
+
registries, which stop at SEC-004; it now comes from `rule_catalog.RULES`, the authority
|
|
36
|
+
`--help` and the README already render from.
|
|
37
|
+
- **The security configuration scan could not tell code from a comment** (E-2). `SEC-004`
|
|
38
|
+
and `SEC-007` fired identically on a live statement and on a commented-out block —
|
|
39
|
+
**31 % of the `high` findings** in the field, and the count understates it, because the
|
|
40
|
+
correlation engine wrote a persuasive paragraph about shared credentials over a block
|
|
41
|
+
that was switched off. Confident prose about dead code is worse than a terse warning: it
|
|
42
|
+
invites trust. This is E-1's class in a module written after E-1 closed, so the stripper
|
|
43
|
+
is now one authority (`source_text`) wired at the **three points a file is read** rather
|
|
44
|
+
than inside each rule — a rule added later is covered by construction. Comments are
|
|
45
|
+
**blanked, not deleted**, so offsets survive and every observation still points at the
|
|
46
|
+
line a reader can open. String literals are deliberately kept: these rules carry their
|
|
47
|
+
evidence *inside* the literal. A/B with the cache cold over BroadleafCommerce,
|
|
48
|
+
openmrs-core, keycloak and spring-petclinic: **byte-identical security findings** — the
|
|
49
|
+
fix removes false positives and loses no true one.
|
|
50
|
+
- **Two path conventions inside one document** (C2-24). `servlet_surface.mappings[].source_file`
|
|
51
|
+
emitted the platform separator while every other payload emits POSIX. The reported
|
|
52
|
+
emitter was one of **four**: checking for the recurrence found `client_calls` (the
|
|
53
|
+
`--client-usage` join, whose entire product is a join on path) and the file-too-large
|
|
54
|
+
branch of `ast_extractor`, which spelled the path differently from the two lines directly
|
|
55
|
+
above it; a static guard over every module then found a fourth in `token_estimate`. All
|
|
56
|
+
four fixed, and the guard now fails any `str(x.relative_to(y))` without normalisation.
|
|
57
|
+
- **An untracked source file was not counted as a change** (C3-40). `cache freshness`
|
|
58
|
+
reported `has_uncommitted_changes: False` with untracked files present, contradicting the
|
|
59
|
+
root scan's `--changed-only` help in the same CLI. The measurement underneath was worse
|
|
60
|
+
than the contradiction: an untracked `.java` file **is** in the IR, so the tree reported
|
|
61
|
+
`fresh: true` for a snapshot that never contained that file — a false *fresh*. Bound to
|
|
62
|
+
`baseline_autocapture.worktree_dirty`, which already had to answer this exactly right for
|
|
63
|
+
the architectural history; gitignored build output and cache directories are still not
|
|
64
|
+
modifications.
|
|
65
|
+
- **`data-exposure` measured nothing and offered no way to measure** (C4-14). It answered
|
|
66
|
+
`answered: false` and stopped, on the payload aimed at a regulated buyer — ninth
|
|
67
|
+
appearance of the C4 class. It now carries the registry remedy plus a `declare` block
|
|
68
|
+
(file, key, copy-pasteable example), all read from the module that parses them. The
|
|
69
|
+
example is **executed** in the battery — written to disk, parsed by the real loader, and
|
|
70
|
+
re-run to confirm the answer changes — because an example that has drifted from the schema
|
|
71
|
+
teaches a buyer the wrong shape.
|
|
72
|
+
|
|
73
|
+
### Changed
|
|
74
|
+
|
|
75
|
+
- Cache-hit provenance moved from inside the `git_context` payload block to `_meta`
|
|
76
|
+
(`stale_fields_refreshed`). Surfaced by C3-40: written into the payload it changed that
|
|
77
|
+
block's *shape* depending on whether the answer came from cache, so one request answered
|
|
78
|
+
two ways compared unequal on a key describing the run rather than the repository. The
|
|
79
|
+
previous key was undocumented, unschema'd, underscore-prefixed and reachable only on one
|
|
80
|
+
cache path — treated as internal provenance rather than a published field, which is why
|
|
81
|
+
this is a patch and not a major.
|
|
82
|
+
|
|
83
|
+
### Still open from this evaluation, on purpose
|
|
84
|
+
|
|
85
|
+
- **C1-25** — reachability is measured at type scope and attributed at member scope
|
|
86
|
+
(~1 700× over-attribution measured in one direction; global `@Configuration` defects
|
|
87
|
+
degraded to `internal` in the other). Feature-sized, and it **gates** the `exposure` join
|
|
88
|
+
(F-C): that table built on this model would put the over-attribution behind a
|
|
89
|
+
CISO-facing headline.
|
|
90
|
+
- **P-8** — a pricing decision, and the third independent arrival at the per-repository band.
|
|
91
|
+
|
|
92
|
+
## [4.5.2] — 2026-08-04
|
|
93
|
+
|
|
94
|
+
Patch: two affordances that shipped command by command, and therefore drifted, become
|
|
95
|
+
properties of the CLI. No analysis changes, no published field is added or removed, no
|
|
96
|
+
exit code moves, and every payload is byte-identical to 4.5.1.
|
|
97
|
+
|
|
98
|
+
### Fixed
|
|
99
|
+
|
|
100
|
+
- **60 of 84 commands did not accept `--copy` / `-c`.** Among them `verify`, `risk`,
|
|
101
|
+
`posture`, `verify-edit`, `schema`, `archetype`, `cold-start`, `enrich`,
|
|
102
|
+
`data-exposure`, `migrate-recipe`, `baseline capture`, every `cache`/`mcp` status
|
|
103
|
+
command, `version`, `auth status`, `telemetry status`, and all 29 `retrieve` intents.
|
|
104
|
+
The flag had been added one command at a time since it was introduced, so what a
|
|
105
|
+
reader could copy depended on which command they happened to be using. It is now a
|
|
106
|
+
property of the CLI: every command that answers a question publishes it, declared
|
|
107
|
+
through one factory (`cli._copy_option()`) so all of them bind `-c` and describe it
|
|
108
|
+
with the same sentence. The text answers gained it too — `ask version -c`,
|
|
109
|
+
`ask cache status -c`, `ask mcp status -c` — via `_emit_text_output`/`_TextAnswer`,
|
|
110
|
+
which collect the lines as they are printed so the clipboard holds exactly what the
|
|
111
|
+
reader saw.
|
|
112
|
+
- **Four commands published `--copy` and then dropped it on their empty-population
|
|
113
|
+
path.** `spring-audit`, `impact-chain`, `pr-impact` and the root `--changed-only`
|
|
114
|
+
scan passed a hard-coded `False` into the output seam when there were no Java files
|
|
115
|
+
or no changed files: the flag parsed, exited 0, and copied nothing. A shorter answer
|
|
116
|
+
is still the answer. Found by the new battery, not by hand.
|
|
117
|
+
- **65 of 84 commands ran silently, including the slowest ones.** Measured on
|
|
118
|
+
BroadleafCommerce: `ask risk` is 15.2 s, `verify-edit` 11.8 s, `posture` 5.9 s,
|
|
119
|
+
`migrate-recipe` 5.0 s, `archetype` 5.1 s, `retrieve <intent>` 4.6 s — none of them
|
|
120
|
+
wrote a byte while they worked, which is indistinguishable from a hang. They now draw
|
|
121
|
+
the existing `Progress` spinner on stderr, naming the phase. `retrieve`'s 29 intents
|
|
122
|
+
take it once in the adapter they share rather than in 29 copies. Every spinner stops
|
|
123
|
+
in a `finally`, so a failing run never prints its error underneath a live frame.
|
|
124
|
+
Nothing changes for a non-interactive consumer: `Progress` already disables itself
|
|
125
|
+
off-TTY, in CI, under `NO_COLOR` and on `TERM=dumb`, and only ever writes to stderr.
|
|
126
|
+
|
|
127
|
+
### Added
|
|
128
|
+
|
|
129
|
+
- **`tests/test_output_affordances.py` — the mechanism, not a promise in a document.**
|
|
130
|
+
426 checks whose population comes from the CLI registry itself: a command must
|
|
131
|
+
publish `--copy` or appear in `cli.COMMANDS_WITHOUT_COPY`, must start a spinner or
|
|
132
|
+
appear in `cli.COMMANDS_WITHOUT_PROGRESS`, must bind `-c` to `--copy`, and must
|
|
133
|
+
describe the flag with the shared help string. It also rejects a declared `--copy`
|
|
134
|
+
wired to a constant `False`, and rejects an exemption naming a command that no longer
|
|
135
|
+
exists — a stale entry would silently excuse the next command to take that name. The
|
|
136
|
+
same C4 remedy this project applies everywhere: the catalogue is generated, never
|
|
137
|
+
maintained by hand.
|
|
138
|
+
- Both affordances are now written down where the next change is made:
|
|
139
|
+
`CLAUDE.md` (new), `CONTRIBUTING.md` § *Adding a new command*, and a *Two things
|
|
140
|
+
every command does* section in `docs/USER_GUIDE.md` and `docs/MANUAL-USUARIO.md`.
|
|
141
|
+
|
|
142
|
+
### Known limitation
|
|
143
|
+
|
|
144
|
+
- `ask chunk-file -c` still means `--chunk`, not `--copy`: it claimed the letter before
|
|
145
|
+
`--copy` existed, and removing it would break `ask chunk-file Big.java -c 3`, which
|
|
146
|
+
its `supported` tier does not permit inside a major. `--copy` works in full there. The
|
|
147
|
+
exception is recorded in `cli.COMMANDS_WITHOUT_COPY_SHORTHAND` rather than tolerated
|
|
148
|
+
silently, and the shorthand moves to `--copy` at the next major.
|
|
149
|
+
|
|
5
150
|
## [4.5.1] — 2026-08-03
|
|
6
151
|
|
|
7
152
|
Patch: documentation only. No engine change, no published field, no exit code.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Working on this repository
|
|
2
|
+
|
|
3
|
+
## Non-negotiable: every new command ships both output affordances
|
|
4
|
+
|
|
5
|
+
When you add a CLI command — or a new answer, subcommand or output path on an
|
|
6
|
+
existing one — it **must** publish both of these. They are not polish, they are
|
|
7
|
+
part of what a command is here. Both are enforced by
|
|
8
|
+
`tests/test_output_affordances.py`, which derives its population from the CLI
|
|
9
|
+
registry, so a new command fails the suite until each has been decided.
|
|
10
|
+
|
|
11
|
+
### 1. `--copy` / `-c` — the answer is copyable
|
|
12
|
+
|
|
13
|
+
Declare it with the shared factory, never a fresh `typer.Option`:
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
copy: bool = _copy_option(),
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Then **wire it through**. Declaring the flag and passing a hard-coded `False`
|
|
20
|
+
into `_emit_command_output` is the exact defect the battery was written for:
|
|
21
|
+
|
|
22
|
+
```python
|
|
23
|
+
_emit_command_output(payload, output_path, copy, success_msg=...) # payload commands
|
|
24
|
+
_emit_text_output(text, copy) # single-block text
|
|
25
|
+
_TextAnswer() # → .say(line) per line, .done(copy) at the end # line-by-line answers
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Wire **every** return path, including the early ones (no Java files, no changed
|
|
29
|
+
files, nothing to report). A shorter answer is still the answer.
|
|
30
|
+
|
|
31
|
+
### 2. `Progress()` — the wait is visible
|
|
32
|
+
|
|
33
|
+
If the command analyses a repository, start a spinner and stop it in `finally`,
|
|
34
|
+
so a raised `typer.Exit` never prints its error under a live spinner frame:
|
|
35
|
+
|
|
36
|
+
```python
|
|
37
|
+
_prog = Progress()
|
|
38
|
+
_prog.start("building IR")
|
|
39
|
+
try:
|
|
40
|
+
result = analyse(target)
|
|
41
|
+
finally:
|
|
42
|
+
_prog.stop() # .finish() only when a "✓ done (3.2s)" line is wanted
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`Progress` writes to stderr only and disables itself off-TTY, in CI, under
|
|
46
|
+
`NO_COLOR` and on `TERM=dumb` — piped output, CI logs and MCP sessions stay
|
|
47
|
+
byte-identical. When commands delegate (`retrieve`'s 29 intents →
|
|
48
|
+
`_run_retrieval_intent`; `onboard`/`review-pr`/`fix-bug` → `prepare-context`),
|
|
49
|
+
put the spinner in the shared helper, not in 29 copies.
|
|
50
|
+
|
|
51
|
+
### Opting out is a decision, not an omission
|
|
52
|
+
|
|
53
|
+
Add the command to `cli.COMMANDS_WITHOUT_COPY` or
|
|
54
|
+
`cli.COMMANDS_WITHOUT_PROGRESS` **with an inline comment stating why**:
|
|
55
|
+
|
|
56
|
+
- no `--copy` when stdout is a confirmation that an effect happened rather than
|
|
57
|
+
an answer worth keeping (`cache clear`, `mcp init`, `telemetry enable`)
|
|
58
|
+
- no spinner when the command reads local metadata, one named file, or a stored
|
|
59
|
+
history and returns in milliseconds (`version`, `cache status`, `trend`)
|
|
60
|
+
|
|
61
|
+
Anything that touches a repository gets both, however fast it is on a small one:
|
|
62
|
+
the same command runs on a 3 300-file monolith.
|
|
63
|
+
|
|
64
|
+
## Related conventions this repo already enforces
|
|
65
|
+
|
|
66
|
+
- **One authority per fact.** A hand-written catalogue beside a generated one
|
|
67
|
+
drifts. Populations come from the CLI registry (`COMMAND_TIERS`,
|
|
68
|
+
`cli.HELP_PANELS`, the doc batteries), never from a list maintained by hand.
|
|
69
|
+
- **Never a confident falsehood.** An axis that could not be measured is
|
|
70
|
+
`unknown`, never `0` and never "not reachable".
|
|
71
|
+
- **Vendor-agnostic inference.** Logic never branches on a proprietary name;
|
|
72
|
+
names are evidence, never the rule.
|
|
73
|
+
- Run the suite with `-o addopts=""` to see the summary line; the entry point for
|
|
74
|
+
local runs is `run_cli.py`, not `python -m sourcecode.cli`.
|
|
@@ -84,6 +84,62 @@ tests/
|
|
|
84
84
|
3. Register it in `detectors/__init__.py` → `build_default_detectors()`
|
|
85
85
|
4. Add tests in `tests/test_detector_<language>.py`
|
|
86
86
|
|
|
87
|
+
### Adding a new command (or a new answer to an existing one)
|
|
88
|
+
|
|
89
|
+
**Every command that answers a question ships two affordances. Both are
|
|
90
|
+
mandatory, both are enforced by `tests/test_output_affordances.py`, and the
|
|
91
|
+
battery derives its population from the CLI registry — so a new command fails
|
|
92
|
+
these tests until a decision has been taken about each.**
|
|
93
|
+
|
|
94
|
+
**1. The answer is copyable.** Declare the flag with the shared factory, never a
|
|
95
|
+
fresh `typer.Option`, so all ~75 commands describe it identically and all bind
|
|
96
|
+
the same shorthand:
|
|
97
|
+
|
|
98
|
+
```python
|
|
99
|
+
@app.command("my-command")
|
|
100
|
+
def my_command_cmd(
|
|
101
|
+
path: Path = typer.Argument(Path(".")),
|
|
102
|
+
output_path: Optional[Path] = typer.Option(None, "--output", "-o"),
|
|
103
|
+
copy: bool = _copy_option(), # ← --copy / -c
|
|
104
|
+
) -> None:
|
|
105
|
+
...
|
|
106
|
+
_emit_command_output(payload, output_path, copy, success_msg=...)
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Then *wire it*. A declared `--copy` that reaches `_emit_command_output` as a
|
|
110
|
+
hard-coded `False` parses fine and does nothing; the battery fails on that
|
|
111
|
+
specific shape, because it is how four commands shipped a flag that silently
|
|
112
|
+
dropped the answer on their empty-repository path. Commands that answer in lines
|
|
113
|
+
rather than in a payload use `_emit_text_output(...)` or `_TextAnswer` instead.
|
|
114
|
+
|
|
115
|
+
**2. The wait is visible.** If the command analyses a repository, start a spinner
|
|
116
|
+
and stop it in a `finally`, so an error is never printed underneath a live
|
|
117
|
+
spinner frame:
|
|
118
|
+
|
|
119
|
+
```python
|
|
120
|
+
_prog = Progress()
|
|
121
|
+
_prog.start("building IR")
|
|
122
|
+
try:
|
|
123
|
+
result = analyse(target)
|
|
124
|
+
finally:
|
|
125
|
+
_prog.stop() # .finish() when a "✓ done (3.2s)" line is wanted
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
`Progress` costs nothing when nobody is watching: it disables itself off-TTY, in
|
|
129
|
+
CI, under `NO_COLOR`, and on `TERM=dumb`, and it only ever writes to stderr —
|
|
130
|
+
piped output and MCP sessions stay byte-identical. Put the spinner in the shared
|
|
131
|
+
helper when several commands delegate to one (`retrieve`'s 29 intents share
|
|
132
|
+
`_run_retrieval_intent`; `onboard`/`review-pr`/`fix-bug` delegate to
|
|
133
|
+
`prepare-context`), and the battery will see it through one level of call.
|
|
134
|
+
|
|
135
|
+
**Opting out** is allowed and must be explicit: add the command to
|
|
136
|
+
`cli.COMMANDS_WITHOUT_COPY` or `cli.COMMANDS_WITHOUT_PROGRESS` **with an inline
|
|
137
|
+
comment giving the reason**. A command whose stdout is a confirmation of an
|
|
138
|
+
effect (`cache clear`) does not need `--copy`; one that reads local metadata and
|
|
139
|
+
returns in milliseconds (`version`) does not need a spinner. Every other command
|
|
140
|
+
does. The exemption sets are checked against the registry too, so a renamed or
|
|
141
|
+
deleted command cannot leave a stale entry that silently excuses its successor.
|
|
142
|
+
|
|
87
143
|
### Modifying the output schema
|
|
88
144
|
|
|
89
145
|
The schema is defined in `schema.py` as Python dataclasses. All fields must have defaults so that existing consumers are not broken. Add new fields at the end of the relevant dataclass with `Optional[T] = None` or `list[T] = field(default_factory=list)`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sourcecode
|
|
3
|
-
Version: 4.5.
|
|
3
|
+
Version: 4.5.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`**
|
|
@@ -97,7 +97,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
97
97
|
# pip / pipx
|
|
98
98
|
pipx install sourcecode # or: pip install sourcecode
|
|
99
99
|
|
|
100
|
-
ask version # ask 4.5.
|
|
100
|
+
ask version # ask 4.5.3 — and, on a build that has aged,
|
|
101
101
|
# how many releases have probably shipped since
|
|
102
102
|
```
|
|
103
103
|
|
|
@@ -309,7 +309,7 @@ from it.
|
|
|
309
309
|
| `risk` | experimental | what each defect actually costs, once reach, access, write effect and the shape of the input path are in it | `defect_severity × reachability × auth_verdict × write_effect × query_construction × input_constraints`; every factor names its authority |
|
|
310
310
|
| `enrich` | experimental | another scanner's SARIF findings, ranked by what this repository does with them | `--sarif <log>`; the same composition as `risk`, with the scanner as the severity authority |
|
|
311
311
|
| `migrate-recipe` | experimental | the migration report as the OpenRewrite recipe that applies it | only recipes a finding named; the manual remainder published beside them; writes nothing without `--write`, and never a runnable command for an empty recipe list |
|
|
312
|
-
| `data-exposure` | experimental | which routes can carry the data you labelled, and who reaches them | labels declared in `sourcecode.config.json` — never inferred from a name; `signature` and `call_reach` evidence published apart, field-level flow out of scope (NC-008) |
|
|
312
|
+
| `data-exposure` | experimental | which routes can carry the data you labelled, and who reaches them | labels declared in `sourcecode.config.json` — never inferred from a name; `signature` and `call_reach` evidence published apart, field-level flow out of scope (NC-008). With nothing declared, `ask data-exposure /path/to/repo` answers `answered: false` and hands back the file, the key and an example to declare — it never reports zero exposed routes |
|
|
313
313
|
| `endpoints` | core | every REST endpoint, effective path, security policy, confidence | Spring MVC + JAX-RS (~65 % recall on JAX-RS sub-resource locators). `--compact` answers the exposure census without the rows; `--servlets` lists the servlet-mounted surface as its own population; `--client-usage` says which routes the TS/JS client in this repository actually calls |
|
|
314
314
|
| `spring-audit` | core | transactional anomalies + security surface + validation gaps | `--ci`, `-f github-comment` |
|
|
315
315
|
| `migrate-check` | core | Boot 2→3 readiness: located blockers, per-dimension score, effort | `--blast-radius` orders the re-test plan |
|
|
@@ -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`**
|
|
@@ -59,7 +59,7 @@ brew tap haroundominique/sourcecode && brew install sourcecode
|
|
|
59
59
|
# pip / pipx
|
|
60
60
|
pipx install sourcecode # or: pip install sourcecode
|
|
61
61
|
|
|
62
|
-
ask version # ask 4.5.
|
|
62
|
+
ask version # ask 4.5.3 — and, on a build that has aged,
|
|
63
63
|
# how many releases have probably shipped since
|
|
64
64
|
```
|
|
65
65
|
|
|
@@ -271,7 +271,7 @@ from it.
|
|
|
271
271
|
| `risk` | experimental | what each defect actually costs, once reach, access, write effect and the shape of the input path are in it | `defect_severity × reachability × auth_verdict × write_effect × query_construction × input_constraints`; every factor names its authority |
|
|
272
272
|
| `enrich` | experimental | another scanner's SARIF findings, ranked by what this repository does with them | `--sarif <log>`; the same composition as `risk`, with the scanner as the severity authority |
|
|
273
273
|
| `migrate-recipe` | experimental | the migration report as the OpenRewrite recipe that applies it | only recipes a finding named; the manual remainder published beside them; writes nothing without `--write`, and never a runnable command for an empty recipe list |
|
|
274
|
-
| `data-exposure` | experimental | which routes can carry the data you labelled, and who reaches them | labels declared in `sourcecode.config.json` — never inferred from a name; `signature` and `call_reach` evidence published apart, field-level flow out of scope (NC-008) |
|
|
274
|
+
| `data-exposure` | experimental | which routes can carry the data you labelled, and who reaches them | labels declared in `sourcecode.config.json` — never inferred from a name; `signature` and `call_reach` evidence published apart, field-level flow out of scope (NC-008). With nothing declared, `ask data-exposure /path/to/repo` answers `answered: false` and hands back the file, the key and an example to declare — it never reports zero exposed routes |
|
|
275
275
|
| `endpoints` | core | every REST endpoint, effective path, security policy, confidence | Spring MVC + JAX-RS (~65 % recall on JAX-RS sub-resource locators). `--compact` answers the exposure census without the rows; `--servlets` lists the servlet-mounted surface as its own population; `--client-usage` says which routes the TS/JS client in this repository actually calls |
|
|
276
276
|
| `spring-audit` | core | transactional anomalies + security surface + validation gaps | `--ci`, `-f github-comment` |
|
|
277
277
|
| `migrate-check` | core | Boot 2→3 readiness: located blockers, per-dimension score, effort | `--blast-radius` orders the re-test plan |
|
|
@@ -1252,7 +1252,7 @@ class AstExtractor:
|
|
|
1252
1252
|
stat = path.stat()
|
|
1253
1253
|
if stat.st_size > self.max_file_size:
|
|
1254
1254
|
return FileContract(
|
|
1255
|
-
path=
|
|
1255
|
+
path=rel_path,
|
|
1256
1256
|
language=language,
|
|
1257
1257
|
extraction_method="heuristic",
|
|
1258
1258
|
limitations=[f"file_too_large: {stat.st_size} bytes > {self.max_file_size}"],
|