sourcecode 4.5.0__tar.gz → 4.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-4.5.0 → sourcecode-4.5.2}/CHANGELOG.md +79 -0
- sourcecode-4.5.2/CLAUDE.md +74 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/CONTRIBUTING.md +56 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/PKG-INFO +4 -4
- {sourcecode-4.5.0 → sourcecode-4.5.2}/README.md +3 -3
- {sourcecode-4.5.0 → sourcecode-4.5.2}/pyproject.toml +1 -1
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/__init__.py +1 -1
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/cli.py +544 -359
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/release_info.py +1 -1
- {sourcecode-4.5.0 → sourcecode-4.5.2}/.github/workflows/build-windows.yml +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/.gitignore +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/.ruff.toml +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/LICENSE +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/SECURITY.md +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/raw +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/scripts/compare_integration_engines.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/scripts/customer_smoke_test.sh +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/scripts/generate_jdk_exports.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/scripts/perf_harness.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/adaptive_scanner.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/archetype.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/architectural_baseline.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/architectural_delta.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/architecture_analyzer.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/architecture_summary.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/ast_extractor.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/baseline_autocapture.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/cache.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/cache_model.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/call_surface.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/caller_metrics.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/caller_reach.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/canonical_ir.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/chain_rules.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/change_plan.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/cir_graphs.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/classifier.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/client_calls.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/code_notes_analyzer.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/compare.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/confidence_analyzer.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/constraint_diff.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/context_cache.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/context_graph.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/context_scorer.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/context_summarizer.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/contract_diff.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/contract_init.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/contract_model.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/contract_pipeline.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/coverage_parser.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/data_exposure.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/data_labels.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/defect_identity.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/degradation.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/dependency_analyzer.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/deployment_prefix.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/__init__.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/base.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/csproj_parser.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/dart.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/dotnet.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/elixir.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/go.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/heuristic.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/hybrid.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/java.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/jvm_ext.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/nodejs.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/parsers.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/php.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/project.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/python.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/ruby.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/rust.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/systems.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/terraform.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/detectors/tooling.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/doc_analyzer.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/dynamic_argument_surface.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/endpoint_literals.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/endpoint_metrics.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/entrypoint_classifier.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/env_analyzer.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/envelope.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/environment_resolution.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/error_schema.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/evidence_provider.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/explain.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/facts/__init__.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/facts/registry.json +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/file_chunker.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/file_classifier.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/filter_surface.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/format_contract.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/fqn_utils.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/git_analyzer.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/git_checkout.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/graph_analyzer.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/graph_evidence.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/hibernate_strat.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/identity_fallback.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/integration_coordinates.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/jdk_exports.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/license.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/mcp/__init__.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/mcp/onboarding/__init__.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/mcp/onboarding/applier.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/mcp/onboarding/backup.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/mcp/onboarding/detector.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/mcp/onboarding/planner.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/mcp/orchestrator.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/mcp/registry.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/mcp/runner.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/mcp/server.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/mcp_nudge.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/metrics_analyzer.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/migrate_check.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/migration_blast.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/non_coverage.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/openapi_surface.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/openrewrite_recipe.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/output_budget.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/parse_cache.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/path_admission.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/path_filters.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/perf.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/pipe_contract.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/posture.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/pr_comment_renderer.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/pr_impact.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/prepare_context.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/progress.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/ranking_engine.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/readiness_timeline.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/reconciliation.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/redactor.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/reference_facts.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/relevance_scorer.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/remedies.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/rename_refactor.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/repo_classifier.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/repository_ir.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/retrieval/__init__.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/retrieval/context.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/retrieval/errors.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/retrieval/executor.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/retrieval/planner.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/retrieval/query.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/retrieval/request.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/retrieval/resolution.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/retrieval/result.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/retrieval/retriever.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/retrieval/runtime.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/retrieval/steps.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/retrieval/steps_endpoint.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/retrieval/steps_graph.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/retrieval/steps_impact.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/retrieval/steps_intf.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/retrieval/steps_struct.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/retrieval/steps_txsec.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/ris.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/risk.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/rule_catalog.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/runtime_classifier.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/sarif.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/scanner.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/schema.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/schemas/envelope-v1.schema.json +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/security_config.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/security_config_scan.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/security_posture.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/semantic_analyzer.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/semantic_impact_engine.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/semantic_integration_engine.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/semantic_services.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/serializer.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/servlet_surface.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/spring_event_topology.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/spring_findings.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/spring_impact.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/spring_model.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/spring_profiles.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/spring_properties.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/spring_security_audit.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/spring_semantic.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/spring_tx_analyzer.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/summarizer.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/target_admission.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/telemetry/__init__.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/telemetry/config.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/telemetry/consent.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/telemetry/events.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/telemetry/filters.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/telemetry/transport.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/test_gap_ranking.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/test_sources.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/token_estimate.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/tree_utils.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/type_usage_surface.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/validation_inference.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/validation_surface.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/verify_edit.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/verify_repo.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/verify_rules.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/version_check.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/src/sourcecode/workspace.py +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/supabase/functions/README.md +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/supabase/functions/get-license/index.ts +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/supabase/functions/lemonsqueezy-webhook/index.ts +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/supabase/functions/telemetry/index.ts +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/supabase/sql/license_event_ordering.sql +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/supabase/sql/licensing_schema.sql +0 -0
- {sourcecode-4.5.0 → sourcecode-4.5.2}/supabase/sql/telemetry_events.sql +0 -0
|
@@ -2,6 +2,85 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [4.5.2] — 2026-08-04
|
|
6
|
+
|
|
7
|
+
Patch: two affordances that shipped command by command, and therefore drifted, become
|
|
8
|
+
properties of the CLI. No analysis changes, no published field is added or removed, no
|
|
9
|
+
exit code moves, and every payload is byte-identical to 4.5.1.
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- **60 of 84 commands did not accept `--copy` / `-c`.** Among them `verify`, `risk`,
|
|
14
|
+
`posture`, `verify-edit`, `schema`, `archetype`, `cold-start`, `enrich`,
|
|
15
|
+
`data-exposure`, `migrate-recipe`, `baseline capture`, every `cache`/`mcp` status
|
|
16
|
+
command, `version`, `auth status`, `telemetry status`, and all 29 `retrieve` intents.
|
|
17
|
+
The flag had been added one command at a time since it was introduced, so what a
|
|
18
|
+
reader could copy depended on which command they happened to be using. It is now a
|
|
19
|
+
property of the CLI: every command that answers a question publishes it, declared
|
|
20
|
+
through one factory (`cli._copy_option()`) so all of them bind `-c` and describe it
|
|
21
|
+
with the same sentence. The text answers gained it too — `ask version -c`,
|
|
22
|
+
`ask cache status -c`, `ask mcp status -c` — via `_emit_text_output`/`_TextAnswer`,
|
|
23
|
+
which collect the lines as they are printed so the clipboard holds exactly what the
|
|
24
|
+
reader saw.
|
|
25
|
+
- **Four commands published `--copy` and then dropped it on their empty-population
|
|
26
|
+
path.** `spring-audit`, `impact-chain`, `pr-impact` and the root `--changed-only`
|
|
27
|
+
scan passed a hard-coded `False` into the output seam when there were no Java files
|
|
28
|
+
or no changed files: the flag parsed, exited 0, and copied nothing. A shorter answer
|
|
29
|
+
is still the answer. Found by the new battery, not by hand.
|
|
30
|
+
- **65 of 84 commands ran silently, including the slowest ones.** Measured on
|
|
31
|
+
BroadleafCommerce: `ask risk` is 15.2 s, `verify-edit` 11.8 s, `posture` 5.9 s,
|
|
32
|
+
`migrate-recipe` 5.0 s, `archetype` 5.1 s, `retrieve <intent>` 4.6 s — none of them
|
|
33
|
+
wrote a byte while they worked, which is indistinguishable from a hang. They now draw
|
|
34
|
+
the existing `Progress` spinner on stderr, naming the phase. `retrieve`'s 29 intents
|
|
35
|
+
take it once in the adapter they share rather than in 29 copies. Every spinner stops
|
|
36
|
+
in a `finally`, so a failing run never prints its error underneath a live frame.
|
|
37
|
+
Nothing changes for a non-interactive consumer: `Progress` already disables itself
|
|
38
|
+
off-TTY, in CI, under `NO_COLOR` and on `TERM=dumb`, and only ever writes to stderr.
|
|
39
|
+
|
|
40
|
+
### Added
|
|
41
|
+
|
|
42
|
+
- **`tests/test_output_affordances.py` — the mechanism, not a promise in a document.**
|
|
43
|
+
426 checks whose population comes from the CLI registry itself: a command must
|
|
44
|
+
publish `--copy` or appear in `cli.COMMANDS_WITHOUT_COPY`, must start a spinner or
|
|
45
|
+
appear in `cli.COMMANDS_WITHOUT_PROGRESS`, must bind `-c` to `--copy`, and must
|
|
46
|
+
describe the flag with the shared help string. It also rejects a declared `--copy`
|
|
47
|
+
wired to a constant `False`, and rejects an exemption naming a command that no longer
|
|
48
|
+
exists — a stale entry would silently excuse the next command to take that name. The
|
|
49
|
+
same C4 remedy this project applies everywhere: the catalogue is generated, never
|
|
50
|
+
maintained by hand.
|
|
51
|
+
- Both affordances are now written down where the next change is made:
|
|
52
|
+
`CLAUDE.md` (new), `CONTRIBUTING.md` § *Adding a new command*, and a *Two things
|
|
53
|
+
every command does* section in `docs/USER_GUIDE.md` and `docs/MANUAL-USUARIO.md`.
|
|
54
|
+
|
|
55
|
+
### Known limitation
|
|
56
|
+
|
|
57
|
+
- `ask chunk-file -c` still means `--chunk`, not `--copy`: it claimed the letter before
|
|
58
|
+
`--copy` existed, and removing it would break `ask chunk-file Big.java -c 3`, which
|
|
59
|
+
its `supported` tier does not permit inside a major. `--copy` works in full there. The
|
|
60
|
+
exception is recorded in `cli.COMMANDS_WITHOUT_COPY_SHORTHAND` rather than tolerated
|
|
61
|
+
silently, and the shorthand moves to `--copy` at the next major.
|
|
62
|
+
|
|
63
|
+
## [4.5.1] — 2026-08-03
|
|
64
|
+
|
|
65
|
+
Patch: documentation only. No engine change, no published field, no exit code.
|
|
66
|
+
|
|
67
|
+
### Fixed
|
|
68
|
+
|
|
69
|
+
- **The front page claimed a version two majors old.** The README badge said `2.5.1`
|
|
70
|
+
and the install snippet said `4.1.0` against a 4.5.0 build; the user guide said
|
|
71
|
+
`2.5.1` and counted thirty commands where the CLI registers thirty-five. Every one of
|
|
72
|
+
those is a claim a new reader meets before installing anything, and the release
|
|
73
|
+
checklist has carried *"update the README version badge"* as a manual step since
|
|
74
|
+
1.73.0 — a promise in a document instead of a mechanism, which is the shape this
|
|
75
|
+
project closes everywhere else. `tests/test_published_version_claims.py` now derives
|
|
76
|
+
every published version claim and the command population **from the build**, so a
|
|
77
|
+
release that moves the version and not the document fails instead of shipping.
|
|
78
|
+
- **The `endpoints` row on the front page listed none of its three newest answers.**
|
|
79
|
+
`--compact` (the exposure census without the rows), `--servlets` (the servlet-mounted
|
|
80
|
+
surface as its own population) and `--client-usage` (which routes the client in this
|
|
81
|
+
repository actually calls) all shipped and none of them was named where a reader
|
|
82
|
+
chooses a command. Eighth appearance of the C4 shape.
|
|
83
|
+
|
|
5
84
|
## [4.5.0] — 2026-08-03
|
|
6
85
|
|
|
7
86
|
Minor: the servlet-mounted HTTP surface is admitted as a population of its own
|
|
@@ -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.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`**
|
|
@@ -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.
|
|
100
|
+
ask version # ask 4.5.2 — and, on a build that has aged,
|
|
101
101
|
# how many releases have probably shipped since
|
|
102
102
|
```
|
|
103
103
|
|
|
@@ -310,7 +310,7 @@ from it.
|
|
|
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
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) |
|
|
313
|
-
| `endpoints` | core | every REST endpoint, effective path, security policy, confidence | Spring MVC + JAX-RS (~65 % recall on JAX-RS sub-resource locators) |
|
|
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 |
|
|
316
316
|
| `impact` / `impact-chain` | core | blast radius of a change, to the endpoints it reaches | target the **interface**, not the `Impl` |
|
|
@@ -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.
|
|
62
|
+
ask version # ask 4.5.2 — and, on a build that has aged,
|
|
63
63
|
# how many releases have probably shipped since
|
|
64
64
|
```
|
|
65
65
|
|
|
@@ -272,7 +272,7 @@ from it.
|
|
|
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
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) |
|
|
275
|
-
| `endpoints` | core | every REST endpoint, effective path, security policy, confidence | Spring MVC + JAX-RS (~65 % recall on JAX-RS sub-resource locators) |
|
|
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 |
|
|
278
278
|
| `impact` / `impact-chain` | core | blast radius of a change, to the endpoints it reaches | target the **interface**, not the `Impl` |
|