codd-dev 3.7.5__tar.gz → 3.7.6__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.
- {codd_dev-3.7.5 → codd_dev-3.7.6}/PKG-INFO +1 -1
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/__init__.py +1 -1
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/cli.py +5 -3
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/builder.py +340 -49
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/extractor.py +30 -7
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/extractor.py +103 -27
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/_shared.py +77 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/regex_strategies.py +38 -31
- {codd_dev-3.7.5 → codd_dev-3.7.6}/pyproject.toml +1 -1
- {codd_dev-3.7.5 → codd_dev-3.7.6}/.gitignore +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/LICENSE +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/README.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/bench_fixture/README.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/__main__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/_git_helper.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/action_outcome.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/ai_invoke.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/ai_patch.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/artifact_contract.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/artifact_ids.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/artifacts/catalog.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/ask_user_question_adapter.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/assembler.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/bridge.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/brownfield/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/brownfield/pipeline.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/capability_completeness.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/claude_cli.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/clustering.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/coherence_adapters.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/coherence_engine.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/confidence.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/config.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/config_schema.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/contracts.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/contracts_registry/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/contracts_registry/__main__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/contracts_registry/certify.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/contracts_registry/generate_matrix.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/contracts_registry/registry.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/coverage_auditor.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/coverage_execution_coherence.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/coverage_metrics.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/auto_repair.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/_one_to_many_detection.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/artifact_contract_check.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/cardinality_coverage.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/ci_health.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/dependency_freshness.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/depends_on_consistency.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/deployment_completeness.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/edge_validity.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/environment_coverage.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/extraction_diagnostics.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/implementation_coverage.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/negative_space.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/node_completeness.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/opt_out.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/resource_flow_coherence.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/semantic_contract_conflict.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/stale_evidence.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/task_completion.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/transitive_closure.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/ui_coherence.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/checks/user_journey_coherence.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/coverage_axes.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/cli.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/cpp_embedded.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/csharp.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/elixir.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/generic.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/iot.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/java.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/kotlin.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/mobile.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/ruby.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/rust.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/scala.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/swift.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/test_frameworks.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/defaults/web.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/extractor.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/impact.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/materiality.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/metadata_access.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/result_status.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dag/runner.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/defaults.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/defaults.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/dependency_lock_coherence.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deploy_targets/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deploy_targets/app_service.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deploy_targets/base.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deploy_targets/docker_compose.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployer.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/checks/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/defaults/deploy_targets.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/defaults/schema_providers.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/defaults/verification_templates.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/ai_command.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/ai_command_factory.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/codex_app_server.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/llm_consideration.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/schema/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/schema/prisma.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/target/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/target/docker_compose.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/cdp_browser.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/cdp_engines.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/cdp_wire.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/curl.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/form_strategies.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/means_catalog.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/playwright.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/pytest_http.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/deployment/providers/verification/vitest.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/design_md.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/diff/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/diff/apply.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/diff/engine.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/diff/persistence.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/diff/templates/diff_prompt.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/discovery.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/drift.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/e2e_contract_coherence.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/e2e_extractor.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/e2e_generator.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/e2e_harness.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/e2e_runner.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/apply.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/engine.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/finding.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/formatters/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/formatters/base.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/formatters/interactive.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/formatters/json_fmt.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/formatters/md.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/gap_to_ask.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/lexicon_loader.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/persistence.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/promote.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/routing.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/env_refs.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/extract_ai.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/extract_paths.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/candidate_selector.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/design_updater.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/impact_planner.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/impl_propagation.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/interactive_prompt.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/phenomenon_fixer.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/phenomenon_parser.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/risk_classifier.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/templates/clarification_question.txt +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/templates/design_update.txt +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/templates/impl_update.txt +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/templates/phenomenon_parse.txt +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/templates/risk_assessment.txt +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fix/templates_loader.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fixer.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fixup_drift.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fixup_drift_strategies/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/fixup_drift_strategies/url_drift.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/frontmatter.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/generator.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/git_evidence.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/graph.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/greenfield/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/greenfield/pipeline.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/hitl_session.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/hooks/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/hooks/pre-commit +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/hooks/recipes/claude_settings_example.json +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/hooks/recipes/codex_hook.sh +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/hooks/recipes/git_post_commit.sh +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/hooks/recipes/git_pre_commit.sh +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/iac_nfr.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/implement_oracle.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/implement_oracle_scope.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/implement_oracle_types.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/implementer/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/implementer/chunked_runner.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/implementer/typecheck_loop.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/implementer.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/import_coherence.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/inheritance.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/init/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/init/lexicon_suggest.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/init/llm_lexicon_suggester.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/init/stack_detector.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/knowledge_fetcher.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/adapters/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/adapters/implement_oracle.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/adapters/oracle_go.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/adapters/oracle_python.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/adapters/oracle_typescript.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/adapters/runner_report.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/builtin_adapters.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/compat.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/contract.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/loader.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/oracle_executor.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/path_planner.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/profile.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/profiles/go.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/profiles/python.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/profiles/typescript.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/registry.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/verify_executor.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/languages/verify_plan.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/lexicon.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/lexicon_cli/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/lexicon_cli/formatters/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/lexicon_cli/formatters/html.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/lexicon_cli/formatters/md.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/lexicon_cli/inspector.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/lexicon_cli/manager.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/lexicon_cli/reporter.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/lexicon_cli/threshold.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/approval.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/best_practice_augmenter.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/criteria_expander.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/design_doc_extractor.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/impl_step_deriver.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/means_catalog_loader.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/parser.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/plan_deriver.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/prompt_builder.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/strategy_validator.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/templates/best_practice_augment_meta.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/templates/criteria_expand_meta.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/templates/design_doc_extract_meta.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/templates/impl_step_derive_meta.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/templates/meta_instruction.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/templates/plan_derive_meta.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/llm/templates/verification_means_catalog.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/mcp_server.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/measure.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/operational_e2e_audit.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/operations_derive.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/api_specs.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/extractor_registry.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/filesystem_routes.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/iac.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/python_ast.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/schemas.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/tests_builddeps.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/parsing/treesitter.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/path_safety.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/planner.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/policy.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/preflight/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/preflight/defaults/cli.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/preflight/defaults/generic.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/preflight/defaults/iot.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/preflight/defaults/mobile.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/preflight/defaults/web.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/project_types.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/propagate.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/propagation_common.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/propagator.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/reconciliation_ledger.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/reference_resolution.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/registry.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/approval_repair.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/auto_scope_guard.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/engine.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/git_patcher.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/history.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/llm_repair_engine.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/loop.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/primary_picker.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/proof_breaks.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/repair_result.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/repairability_classifier.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/schema.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/templates/analyze_meta.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/templates/propose_meta.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/templates/repair_strategy_meta.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/templates/repairability_meta.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/test_failure_attribution.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair/verify_runner.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/repair_slice.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/require.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/require_plugins.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/require_propagate.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/required_artifacts/defaults/cli.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/required_artifacts/defaults/generic.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/required_artifacts/defaults/iot.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/required_artifacts/defaults/mobile.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/required_artifacts/defaults/web.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/required_artifacts_deriver.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/requirement_completeness/defaults/cli.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/requirement_completeness/defaults/generic.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/requirement_completeness/defaults/iot.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/requirement_completeness/defaults/web.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/requirement_completeness_auditor.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/requirement_reconciliation.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/requirements_meta.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/restoration_report.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/restore.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/routes_extractor.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/runtime_smoke/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/runtime_smoke/checks.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/runtime_smoke/config.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/runtime_smoke/report.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/runtime_smoke/runner.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/scanner.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/schema_refs.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/screen_flow_validator.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/screen_transition_extractor.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/screen_transitions/defaults.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/skills_cli/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/skills_cli/discovery.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/skills_cli/manager.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/skills_cli/paths.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/adapters/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/adapters/_base.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/adapters/nextjs.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/adapters/playwright.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/adapters/prisma.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/command_authenticity.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/command_override.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/command_plan.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/compose.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/loader.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/lock.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/obligations.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/profile.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/profiles/addons/playwright.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/profiles/addons/prisma.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/profiles/frameworks/nextjs.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/project.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/registry.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/replacement_proof.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/stack/resolve.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/surface_reconciliation.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/synth.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/codd.yaml.tmpl +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/conventions.yaml.tmpl +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/data_dependencies.yaml.tmpl +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/doc_links.yaml.tmpl +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/extract_ai_prompt_baseline.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/extracted/api-contract.md.j2 +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/extracted/module-detail.md.j2 +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/extracted/schema-design.md.j2 +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/extracted/system-context.md.j2 +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/gitignore.tmpl +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/lexicon_questions.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/lexicon_schema.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/templates/overrides.yaml.tmpl +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/test_detection.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/test_import_coherence.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/traceability.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/validator.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/vb_marker_authenticity.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/vb_rerun_scope.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/verifiable_behavior_audit.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/watch/__init__.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/watch/events.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/watch/propagation_log.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/watch/propagation_pipeline.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/watch/test_runner.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/watch/watcher.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd/wiring.py +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/codd_plugins/stack_map.yaml +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/docs/cookbook/cdp_browser/README.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/docs/cookbook/presentation_aggregation/README.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/docs/requirements/README.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/examples/README.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/skills/codd-assemble/SKILL.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/skills/codd-evolve/SKILL.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/skills/codd-generate/SKILL.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/skills/codd-greenfield/SKILL.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/skills/codd-impact/SKILL.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/skills/codd-init/SKILL.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/skills/codd-propagate/SKILL.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/skills/codd-restore/SKILL.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/skills/codd-scan/SKILL.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/skills/codd-validate/SKILL.md +0 -0
- {codd_dev-3.7.5 → codd_dev-3.7.6}/tests/integration/standalone_repair_skeleton/README.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codd-dev
|
|
3
|
-
Version: 3.7.
|
|
3
|
+
Version: 3.7.6
|
|
4
4
|
Summary: CoDD: Coherence-Driven Development — cross-artifact change impact analysis
|
|
5
5
|
Project-URL: Homepage, https://github.com/yohey-w/codd-dev
|
|
6
6
|
Project-URL: Repository, https://github.com/yohey-w/codd-dev
|
|
@@ -816,12 +816,14 @@ def check_cmd(project_path: str, run_full: bool, apply_fixes: bool, output_forma
|
|
|
816
816
|
else:
|
|
817
817
|
_line(" PASS — no warnings")
|
|
818
818
|
|
|
819
|
-
# ---
|
|
819
|
+
# --- verifiable-behavior declarations (gate) --------------------------
|
|
820
820
|
# Incoherent verifiable-behavior declarations (same id, different meaning in
|
|
821
821
|
# two docs) make 100% coverage structurally impossible — fail loudly. The
|
|
822
822
|
# WARNING-severity case (a non-canonical doc with first-column VB rows) is
|
|
823
|
-
# already surfaced as a doctor advisory above with migration guidance.
|
|
824
|
-
|
|
823
|
+
# already surfaced as a doctor advisory above with migration guidance. The
|
|
824
|
+
# label spells out "verifiable-behavior" (the ``vb`` abbreviation read like
|
|
825
|
+
# Visual Basic — it is the V-Model verification boundary, not a language).
|
|
826
|
+
_section("verifiable-behavior declarations")
|
|
825
827
|
try:
|
|
826
828
|
vb_errors = _vb_declaration_issue_messages(project_root, load_project_config(project_root), severity="error")
|
|
827
829
|
except (FileNotFoundError, ValueError) as exc:
|
|
@@ -5,6 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
import json
|
|
6
6
|
import logging
|
|
7
7
|
import fnmatch
|
|
8
|
+
import os
|
|
8
9
|
import re
|
|
9
10
|
import warnings
|
|
10
11
|
from copy import deepcopy
|
|
@@ -16,6 +17,7 @@ import yaml
|
|
|
16
17
|
|
|
17
18
|
from codd.config import load_project_config
|
|
18
19
|
from codd.discovery import scan_exclude_patterns as shared_scan_exclude_patterns
|
|
20
|
+
from codd.parsing._shared import cpp_include_candidate_paths, strip_bom
|
|
19
21
|
from codd.path_safety import iter_project_glob, resolve_project_path
|
|
20
22
|
from codd.dag import DAG, Edge, Node
|
|
21
23
|
from codd.dag.coverage_axes import CoverageAxis, extract_coverage_axes_from_design_doc, extract_coverage_axes_from_lexicon
|
|
@@ -92,6 +94,8 @@ def build_dag(project_root: Path, settings: dict[str, Any] | None = None) -> DAG
|
|
|
92
94
|
_add_deployment_graph(dag, root, design_docs, impl_nodes)
|
|
93
95
|
_attach_coverage_axes(dag, root, dag_settings)
|
|
94
96
|
|
|
97
|
+
_warn_source_completeness(root, dag_settings, impl_nodes, test_nodes)
|
|
98
|
+
|
|
95
99
|
write_dag_json(dag, root, default_dag_json_path(root))
|
|
96
100
|
return dag
|
|
97
101
|
|
|
@@ -369,14 +373,148 @@ def _add_import_edges(
|
|
|
369
373
|
aliases = _load_import_aliases(project_root, settings)
|
|
370
374
|
path_to_node = {path: node_id for node_id, path in impl_nodes.items()}
|
|
371
375
|
|
|
376
|
+
residue: list[str] = []
|
|
372
377
|
for node_id, file_path in impl_nodes.items():
|
|
373
378
|
imports = dag.nodes[node_id].attributes.get("imports", [])
|
|
379
|
+
seen_targets: set[str] = set()
|
|
374
380
|
for import_ref in imports:
|
|
381
|
+
resolved_any = False
|
|
375
382
|
for target_id in _resolve_import_targets(
|
|
376
383
|
import_ref, file_path, project_root, path_to_node, aliases
|
|
377
384
|
):
|
|
378
|
-
if target_id
|
|
379
|
-
|
|
385
|
+
if not target_id or target_id == node_id:
|
|
386
|
+
continue
|
|
387
|
+
resolved_any = True
|
|
388
|
+
if target_id in seen_targets:
|
|
389
|
+
continue
|
|
390
|
+
seen_targets.add(target_id)
|
|
391
|
+
dag.add_edge(Edge(from_id=node_id, to_id=target_id, kind="imports"))
|
|
392
|
+
# GENERIC FIX 1: an INTERNAL-looking specifier (a relative import, or a
|
|
393
|
+
# first-party alias-prefixed one) that resolved to NOTHING is explicit
|
|
394
|
+
# "unresolved residue" — a discovery gap made VISIBLE (surfacing only).
|
|
395
|
+
if not resolved_any and _is_internal_looking_specifier(import_ref, aliases):
|
|
396
|
+
residue.append(f"{node_id}: {import_ref}")
|
|
397
|
+
|
|
398
|
+
_warn_unresolved_residue(residue)
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
#: JS/TS relative specifier shapes — unambiguously first-party (you cannot write a
|
|
402
|
+
#: relative import to an external package), so an unresolved one is a real gap.
|
|
403
|
+
def _is_internal_looking_specifier(import_ref: str, aliases: dict[str, list[str]]) -> bool:
|
|
404
|
+
"""True for a specifier that can ONLY refer to in-tree code (GENERIC FIX 1).
|
|
405
|
+
|
|
406
|
+
Conservative on purpose: only RELATIVE imports (Python ``.b`` / ``..pkg``; JS
|
|
407
|
+
``./x`` / ``../x``), C++ quote-form local includes, and configured first-party
|
|
408
|
+
ALIAS prefixes count. Absolute dotted/FQN specifiers (``os`` / ``org.junit.*``
|
|
409
|
+
/ ``java.util.List``) are NOT flagged — they are usually stdlib/third-party, so
|
|
410
|
+
flagging them would drown the signal in false residue.
|
|
411
|
+
"""
|
|
412
|
+
spec = import_ref.strip()
|
|
413
|
+
if not spec:
|
|
414
|
+
return False
|
|
415
|
+
if spec.startswith(_CPP_QUOTE_SPECIFIER):
|
|
416
|
+
return True
|
|
417
|
+
if spec.startswith(_CPP_ANGLE_SPECIFIER):
|
|
418
|
+
return False # system/STL — external by construction
|
|
419
|
+
if spec in (".", ".."):
|
|
420
|
+
return True
|
|
421
|
+
if spec.startswith("./") or spec.startswith("../"):
|
|
422
|
+
return True
|
|
423
|
+
if spec.startswith("."): # Python relative (``.b`` / ``..pkg.x``)
|
|
424
|
+
return True
|
|
425
|
+
# Configured first-party alias prefix (e.g. ``@app/…`` → src). The alias map is
|
|
426
|
+
# the project's own DATA declaration that these are first-party.
|
|
427
|
+
for alias_prefix in aliases:
|
|
428
|
+
if alias_prefix and (spec == alias_prefix or spec.startswith(alias_prefix + "/")):
|
|
429
|
+
return True
|
|
430
|
+
return False
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
def _warn_unresolved_residue(residue: list[str]) -> None:
|
|
434
|
+
"""WARN (advisory) when internal-looking specifiers did not resolve."""
|
|
435
|
+
if not residue:
|
|
436
|
+
return
|
|
437
|
+
examples = ", ".join(sorted(residue)[:5])
|
|
438
|
+
warnings.warn(
|
|
439
|
+
f"discovery: {len(residue)} internal-looking import specifier(s) did not "
|
|
440
|
+
f"resolve to any in-tree node (unresolved residue) — e.g. {examples}. "
|
|
441
|
+
f"These are likely missing source files or an under-scoped source set.",
|
|
442
|
+
UserWarning,
|
|
443
|
+
stacklevel=2,
|
|
444
|
+
)
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+
def _warn_source_completeness(
|
|
448
|
+
project_root: Path,
|
|
449
|
+
settings: dict[str, Any],
|
|
450
|
+
impl_nodes: dict[str, Path],
|
|
451
|
+
test_nodes: dict[str, Path],
|
|
452
|
+
) -> None:
|
|
453
|
+
"""WARN (advisory) when on-disk source files outnumber source nodes.
|
|
454
|
+
|
|
455
|
+
GENERIC FIX 1 — the convergence safety-net. The DAG's source-bearing nodes are
|
|
456
|
+
materialized from the configured ``source_dirs``/glob patterns; if MORE files
|
|
457
|
+
of the SAME implementation/test suffixes exist on disk (outside that scope)
|
|
458
|
+
they are silently inert — a discovery gap and a false-green risk. We surface
|
|
459
|
+
the gap (count + a few example missing files) so it becomes visible and the
|
|
460
|
+
operator can widen the scope. Surfacing only: never a fail-gate (that would be
|
|
461
|
+
new gating = owner-gated).
|
|
462
|
+
"""
|
|
463
|
+
impl_suffixes = set(_suffix_tuple(settings.get("implementation_suffixes")) or LEGACY_IMPLEMENTATION_SUFFIXES)
|
|
464
|
+
test_suffixes = set(_suffix_tuple(settings.get("test_suffixes")) or LEGACY_TEST_SUFFIXES)
|
|
465
|
+
source_suffixes = impl_suffixes | test_suffixes
|
|
466
|
+
if not source_suffixes:
|
|
467
|
+
return
|
|
468
|
+
|
|
469
|
+
node_paths = {path.resolve() for path in (*impl_nodes.values(), *test_nodes.values())}
|
|
470
|
+
exclude_patterns = settings.get("scan_exclude_patterns")
|
|
471
|
+
project_root_resolved = project_root.resolve()
|
|
472
|
+
|
|
473
|
+
missing: list[str] = []
|
|
474
|
+
on_disk = 0
|
|
475
|
+
for file_path in _iter_on_disk_source_files(project_root_resolved, source_suffixes, exclude_patterns):
|
|
476
|
+
on_disk += 1
|
|
477
|
+
if file_path.resolve() not in node_paths:
|
|
478
|
+
if len(missing) < 10:
|
|
479
|
+
missing.append(_relative_id(file_path, project_root_resolved))
|
|
480
|
+
|
|
481
|
+
if on_disk > len(node_paths) and missing:
|
|
482
|
+
examples = ", ".join(missing[:5])
|
|
483
|
+
warnings.warn(
|
|
484
|
+
f"discovery: {on_disk} source file(s) on disk but only {len(node_paths)} "
|
|
485
|
+
f"source node(s) in the DAG — {len(missing)} file(s) are outside the "
|
|
486
|
+
f"configured source scope and will be inert (e.g. {examples}). Consider "
|
|
487
|
+
f"widening source_dirs / impl_file_patterns.",
|
|
488
|
+
UserWarning,
|
|
489
|
+
stacklevel=2,
|
|
490
|
+
)
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
def _iter_on_disk_source_files(
|
|
494
|
+
project_root: Path,
|
|
495
|
+
source_suffixes: set[str],
|
|
496
|
+
exclude_patterns: Any,
|
|
497
|
+
):
|
|
498
|
+
"""Yield on-disk files whose suffix is a source suffix (ignored dirs pruned)."""
|
|
499
|
+
from codd.discovery import DEFAULT_IGNORED_DIRS
|
|
500
|
+
|
|
501
|
+
excludes = [
|
|
502
|
+
str(pattern)
|
|
503
|
+
for pattern in _as_list(exclude_patterns)
|
|
504
|
+
if isinstance(pattern, str) and pattern.strip()
|
|
505
|
+
]
|
|
506
|
+
for root, dirs, files in os.walk(project_root):
|
|
507
|
+
dirs[:] = [
|
|
508
|
+
d for d in dirs
|
|
509
|
+
if d not in DEFAULT_IGNORED_DIRS and d != "codd" and not d.startswith(".")
|
|
510
|
+
]
|
|
511
|
+
for fname in files:
|
|
512
|
+
if Path(fname).suffix not in source_suffixes:
|
|
513
|
+
continue
|
|
514
|
+
file_path = Path(root) / fname
|
|
515
|
+
if excludes and _path_matches_any_pattern(file_path, project_root, excludes):
|
|
516
|
+
continue
|
|
517
|
+
yield file_path
|
|
380
518
|
|
|
381
519
|
|
|
382
520
|
def _add_tested_by_edges(
|
|
@@ -956,7 +1094,7 @@ def _resolve_import_target(
|
|
|
956
1094
|
# relative-to-file first, then via include roots; an angle-form include is
|
|
957
1095
|
# system/STL and produces no edge.
|
|
958
1096
|
if file_path.suffix in _CPP_SOURCE_SUFFIXES:
|
|
959
|
-
for candidate in _cpp_include_candidates(import_ref, file_path, path_to_node):
|
|
1097
|
+
for candidate in _cpp_include_candidates(import_ref, file_path, project_root, path_to_node):
|
|
960
1098
|
resolved = _resolve_file_candidate(candidate, path_to_node)
|
|
961
1099
|
if resolved:
|
|
962
1100
|
return resolved
|
|
@@ -1064,6 +1202,68 @@ def _java_source_roots(project_root: Path, path_to_node: dict[Path, str]) -> lis
|
|
|
1064
1202
|
return ordered
|
|
1065
1203
|
|
|
1066
1204
|
|
|
1205
|
+
#: Java ``package`` declaration (mirrors ``regex_strategies._JAVA_PACKAGE_RE``),
|
|
1206
|
+
#: used to derive (source-root, fqn-prefix) pairs from the node file-set so a tree
|
|
1207
|
+
#: SCOPED INSIDE a package (``com/google/common`` as the project root) resolves
|
|
1208
|
+
#: without a double package prefix.
|
|
1209
|
+
_JAVA_PACKAGE_DECL_RE = re.compile(r"^\s*package\s+([\w.]+)\s*;", re.MULTILINE)
|
|
1210
|
+
|
|
1211
|
+
|
|
1212
|
+
def _java_root_prefix_pairs(
|
|
1213
|
+
project_root: Path, path_to_node: dict[Path, str]
|
|
1214
|
+
) -> list[tuple[Path, tuple[str, ...]]]:
|
|
1215
|
+
"""Derive ``(source_root, fqn_prefix)`` pairs for Java FQN→path resolution.
|
|
1216
|
+
|
|
1217
|
+
GENERIC FIX 2c. The source root is the directory under which a type's FQN
|
|
1218
|
+
resolves to ``<root>/<fqn-as-path>.java``. We infer it from DATA by matching
|
|
1219
|
+
each ``.java`` node's DECLARED package against its on-disk directory:
|
|
1220
|
+
|
|
1221
|
+
* Conventional ``src/main/java/com/a/A.java`` (package ``com.a``) → the dir's
|
|
1222
|
+
trailing ``com/a`` matches the package fully, so root = ``…/src/main/java``
|
|
1223
|
+
and prefix = ``()`` (the FQN resolves whole). [no behaviour change]
|
|
1224
|
+
* Scoped-INSIDE ``<root>/base/Preconditions.java`` (package
|
|
1225
|
+
``com.google.common.base``) → only the trailing ``base`` matches the dir, so
|
|
1226
|
+
root = ``<root>`` and prefix = ``("com","google","common")``. An import of
|
|
1227
|
+
``com.google.common.base.X`` then has its prefix stripped → ``base/X.java``
|
|
1228
|
+
under ``<root>`` (no double ``com/google/common`` prefix → edges form).
|
|
1229
|
+
|
|
1230
|
+
A non-empty prefix is the novel case; ``prefix == ()`` reproduces the existing
|
|
1231
|
+
root behaviour. Pairs are de-duplicated and ordered deepest-root-first so a
|
|
1232
|
+
conventional root still wins when several could match.
|
|
1233
|
+
"""
|
|
1234
|
+
pairs: dict[tuple[str, tuple[str, ...]], tuple[Path, tuple[str, ...]]] = {}
|
|
1235
|
+
for file_path in path_to_node:
|
|
1236
|
+
if file_path.suffix != ".java":
|
|
1237
|
+
continue
|
|
1238
|
+
try:
|
|
1239
|
+
content = _read_source_text(file_path)
|
|
1240
|
+
except OSError:
|
|
1241
|
+
continue
|
|
1242
|
+
match = _JAVA_PACKAGE_DECL_RE.search(content)
|
|
1243
|
+
if not match:
|
|
1244
|
+
continue
|
|
1245
|
+
package_parts = tuple(part for part in match.group(1).split(".") if part)
|
|
1246
|
+
if not package_parts:
|
|
1247
|
+
continue
|
|
1248
|
+
dir_parts = file_path.parent.parts
|
|
1249
|
+
# Longest common SUFFIX between the file's on-disk dir and the package.
|
|
1250
|
+
k = 0
|
|
1251
|
+
while (
|
|
1252
|
+
k < len(package_parts)
|
|
1253
|
+
and k < len(dir_parts)
|
|
1254
|
+
and dir_parts[len(dir_parts) - 1 - k] == package_parts[len(package_parts) - 1 - k]
|
|
1255
|
+
):
|
|
1256
|
+
k += 1
|
|
1257
|
+
root = Path(*dir_parts[: len(dir_parts) - k]) if k else file_path.parent
|
|
1258
|
+
prefix = package_parts[: len(package_parts) - k]
|
|
1259
|
+
pairs[(str(root), prefix)] = (root.resolve(), prefix)
|
|
1260
|
+
return sorted(
|
|
1261
|
+
pairs.values(),
|
|
1262
|
+
key=lambda item: (len(item[0].parts), len(item[1])),
|
|
1263
|
+
reverse=True,
|
|
1264
|
+
)
|
|
1265
|
+
|
|
1266
|
+
|
|
1067
1267
|
def _find_segment_chain(parts: tuple[str, ...], chain: tuple[str, ...]) -> int | None:
|
|
1068
1268
|
"""Return the start index where ``chain`` appears contiguously in ``parts``."""
|
|
1069
1269
|
if not chain:
|
|
@@ -1074,6 +1274,47 @@ def _find_segment_chain(parts: tuple[str, ...], chain: tuple[str, ...]) -> int |
|
|
|
1074
1274
|
return None
|
|
1075
1275
|
|
|
1076
1276
|
|
|
1277
|
+
#: Process-lifetime cache of the COMBINED Java ``(source_root, fqn_prefix)`` pairs,
|
|
1278
|
+
#: keyed by the IDENTITY + size of ``path_to_node`` (guarded by ``len`` against
|
|
1279
|
+
#: id-reuse after GC) + the project root. ``_add_import_edges`` /
|
|
1280
|
+
#: ``_add_tested_by_edges`` build a fresh ``path_to_node`` and reuse it across every
|
|
1281
|
+
#: import in their loop, so deriving the pairs ONCE per DAG-build phase — instead of
|
|
1282
|
+
#: re-reading every ``.java`` file's package for EVERY import — turns an
|
|
1283
|
+
#: O(files × imports) blow-up (which made Guava-scale builds crawl) back into O(files).
|
|
1284
|
+
_JAVA_RESOLUTION_PAIRS_CACHE: dict[
|
|
1285
|
+
tuple[int, int, str], list[tuple[Path, tuple[str, ...]]]
|
|
1286
|
+
] = {}
|
|
1287
|
+
|
|
1288
|
+
|
|
1289
|
+
def _java_resolution_pairs(
|
|
1290
|
+
project_root: Path, path_to_node: dict[Path, str]
|
|
1291
|
+
) -> list[tuple[Path, tuple[str, ...]]]:
|
|
1292
|
+
"""Combined, de-duplicated Java resolution pairs (built once per build, cached).
|
|
1293
|
+
|
|
1294
|
+
Prefix-bearing pairs (the scoped-inside fix) first, then the bare
|
|
1295
|
+
``_java_source_roots`` (prefix == (), conventional layouts / default-package
|
|
1296
|
+
files), de-duplicated. Cached so the per-file package scan is paid once.
|
|
1297
|
+
"""
|
|
1298
|
+
key = (id(path_to_node), len(path_to_node), str(project_root))
|
|
1299
|
+
cached = _JAVA_RESOLUTION_PAIRS_CACHE.get(key)
|
|
1300
|
+
if cached is not None:
|
|
1301
|
+
return cached
|
|
1302
|
+
|
|
1303
|
+
root_prefixes = _java_root_prefix_pairs(project_root, path_to_node)
|
|
1304
|
+
bare_roots = [(root, ()) for root in _java_source_roots(project_root, path_to_node)]
|
|
1305
|
+
seen_pairs: set[tuple[str, tuple[str, ...]]] = set()
|
|
1306
|
+
pairs: list[tuple[Path, tuple[str, ...]]] = []
|
|
1307
|
+
for root, prefix in [*root_prefixes, *bare_roots]:
|
|
1308
|
+
pair_key = (str(root), prefix)
|
|
1309
|
+
if pair_key in seen_pairs:
|
|
1310
|
+
continue
|
|
1311
|
+
seen_pairs.add(pair_key)
|
|
1312
|
+
pairs.append((root, prefix))
|
|
1313
|
+
|
|
1314
|
+
_JAVA_RESOLUTION_PAIRS_CACHE[key] = pairs
|
|
1315
|
+
return pairs
|
|
1316
|
+
|
|
1317
|
+
|
|
1077
1318
|
def _java_import_candidates(
|
|
1078
1319
|
import_ref: str,
|
|
1079
1320
|
file_path: Path,
|
|
@@ -1095,16 +1336,30 @@ def _java_import_candidates(
|
|
|
1095
1336
|
|
|
1096
1337
|
``_resolve_file_candidate`` appends the real ``.java`` suffix once a directory
|
|
1097
1338
|
candidate is produced, so package/wildcard dirs resolve to a sibling file.
|
|
1339
|
+
|
|
1340
|
+
GENERIC FIX 2c: resolution is rooted at ``(source_root, fqn_prefix)`` pairs
|
|
1341
|
+
derived from the file-set's package declarations, so a tree SCOPED INSIDE a
|
|
1342
|
+
package (``com/google/common`` as the root) resolves with its package prefix
|
|
1343
|
+
stripped (no double-prefix). The bare ``_java_source_roots`` (prefix == ()) is
|
|
1344
|
+
folded in as the fallback, preserving conventional-layout behaviour.
|
|
1098
1345
|
"""
|
|
1099
|
-
|
|
1346
|
+
pairs = _java_resolution_pairs(project_root, path_to_node)
|
|
1100
1347
|
|
|
1101
1348
|
if import_ref.startswith("package "):
|
|
1102
|
-
|
|
1103
|
-
|
|
1349
|
+
# PRECISION: a ``package`` line is a DECLARATION, not a written import.
|
|
1350
|
+
# Synthesizing an edge to every same-package sibling is imprecise (Java
|
|
1351
|
+
# needs no import for siblings, but not every sibling is referenced) AND
|
|
1352
|
+
# explosive — O(package_size²) edges per package, which on Guava-scale
|
|
1353
|
+
# repos produced >400k spurious edges. We emit only REAL import edges, so
|
|
1354
|
+
# a ``package`` line contributes none. (Same-package files reached only by
|
|
1355
|
+
# an implicit reference rely on the reachability layer's roots, not a
|
|
1356
|
+
# fabricated import edge.) The package declaration is still READ — by
|
|
1357
|
+
# ``_java_root_prefix_pairs`` — to derive source roots.
|
|
1358
|
+
return []
|
|
1104
1359
|
|
|
1105
1360
|
if import_ref.endswith(".*"):
|
|
1106
1361
|
package = import_ref[:-2].strip()
|
|
1107
|
-
return _java_package_dir_candidates(package,
|
|
1362
|
+
return _java_package_dir_candidates(package, pairs)
|
|
1108
1363
|
|
|
1109
1364
|
fqn = import_ref
|
|
1110
1365
|
if fqn.startswith("static "):
|
|
@@ -1114,19 +1369,49 @@ def _java_import_candidates(
|
|
|
1114
1369
|
if len(parts) >= 2:
|
|
1115
1370
|
fqn = ".".join(parts[:-1])
|
|
1116
1371
|
|
|
1117
|
-
parts =
|
|
1372
|
+
parts = tuple(part for part in fqn.split(".") if part)
|
|
1118
1373
|
if not parts:
|
|
1119
1374
|
return []
|
|
1120
|
-
|
|
1375
|
+
candidates: list[Path] = []
|
|
1376
|
+
for root, prefix in pairs:
|
|
1377
|
+
remainder = _strip_fqn_prefix(parts, prefix)
|
|
1378
|
+
if remainder is None:
|
|
1379
|
+
continue
|
|
1380
|
+
candidates.append((root / Path(*remainder)).resolve())
|
|
1381
|
+
return candidates
|
|
1121
1382
|
|
|
1122
1383
|
|
|
1123
|
-
def
|
|
1124
|
-
parts
|
|
1384
|
+
def _strip_fqn_prefix(
|
|
1385
|
+
parts: tuple[str, ...], prefix: tuple[str, ...]
|
|
1386
|
+
) -> tuple[str, ...] | None:
|
|
1387
|
+
"""Strip ``prefix`` from the front of ``parts`` (the FQN), or ``None``.
|
|
1388
|
+
|
|
1389
|
+
``prefix == ()`` returns ``parts`` unchanged (conventional root). A non-empty
|
|
1390
|
+
prefix returns the remainder only when ``parts`` actually starts with it (so a
|
|
1391
|
+
scoped-inside root contributes a candidate only for FQNs in its package);
|
|
1392
|
+
otherwise ``None`` (this pair does not apply → no spurious candidate).
|
|
1393
|
+
"""
|
|
1394
|
+
if not prefix:
|
|
1395
|
+
return parts
|
|
1396
|
+
if parts[: len(prefix)] == prefix and len(parts) > len(prefix):
|
|
1397
|
+
return parts[len(prefix):]
|
|
1398
|
+
return None
|
|
1399
|
+
|
|
1400
|
+
|
|
1401
|
+
def _java_package_dir_candidates(
|
|
1402
|
+
package: str, pairs: list[tuple[Path, tuple[str, ...]]]
|
|
1403
|
+
) -> list[Path]:
|
|
1404
|
+
parts = tuple(part for part in package.split(".") if part)
|
|
1125
1405
|
if not parts:
|
|
1126
1406
|
return []
|
|
1127
1407
|
candidates: list[Path] = []
|
|
1128
|
-
for root in
|
|
1129
|
-
|
|
1408
|
+
for root, prefix in pairs:
|
|
1409
|
+
# Strip the root's package prefix (scoped-inside) before mapping the
|
|
1410
|
+
# package to a directory; ``prefix == ()`` is the conventional case.
|
|
1411
|
+
remainder = _strip_package_prefix(parts, prefix)
|
|
1412
|
+
if remainder is None:
|
|
1413
|
+
continue
|
|
1414
|
+
package_dir = (root / Path(*remainder)).resolve() if remainder else root.resolve()
|
|
1130
1415
|
# List the package dir's in-tree files as candidates (same-package /
|
|
1131
1416
|
# wildcard linkage). ``_resolve_file_candidate`` matches exact node paths,
|
|
1132
1417
|
# so we hand it each existing ``.java`` file directly.
|
|
@@ -1135,6 +1420,22 @@ def _java_package_dir_candidates(package: str, roots: list[Path]) -> list[Path]:
|
|
|
1135
1420
|
return candidates
|
|
1136
1421
|
|
|
1137
1422
|
|
|
1423
|
+
def _strip_package_prefix(
|
|
1424
|
+
parts: tuple[str, ...], prefix: tuple[str, ...]
|
|
1425
|
+
) -> tuple[str, ...] | None:
|
|
1426
|
+
"""Strip ``prefix`` from a PACKAGE path (like :func:`_strip_fqn_prefix`).
|
|
1427
|
+
|
|
1428
|
+
Differs only in allowing an EXACT match (package == prefix → ``()``), because
|
|
1429
|
+
a ``package com.google.common`` line under a root scoped at exactly that
|
|
1430
|
+
package legitimately refers to the root directory itself.
|
|
1431
|
+
"""
|
|
1432
|
+
if not prefix:
|
|
1433
|
+
return parts
|
|
1434
|
+
if parts[: len(prefix)] == prefix:
|
|
1435
|
+
return parts[len(prefix):]
|
|
1436
|
+
return None
|
|
1437
|
+
|
|
1438
|
+
|
|
1138
1439
|
def _sorted_java_dir_files(package_dir: Path) -> list[Path]:
|
|
1139
1440
|
if not package_dir.is_dir():
|
|
1140
1441
|
return []
|
|
@@ -1151,17 +1452,11 @@ def _sorted_java_dir_files(package_dir: Path) -> list[Path]:
|
|
|
1151
1452
|
#: ``_SUFFIX_SPECIFIER_EXTRACTORS``.
|
|
1152
1453
|
_CPP_SOURCE_SUFFIXES = frozenset({".h", ".hpp", ".hh", ".cc", ".cpp", ".cxx"})
|
|
1153
1454
|
|
|
1154
|
-
#: Conventional C/C++ include-root directory names. A quote-form include such as
|
|
1155
|
-
#: ``"fmt/core.h"`` that is not relative to the including file is probed under
|
|
1156
|
-
#: these roots (``include`` covers fmt's ``include/fmt/*.h`` layout). Harvested
|
|
1157
|
-
#: header-node parent dirs are added at resolution time so unconventional roots
|
|
1158
|
-
#: still resolve from DATA.
|
|
1159
|
-
_CPP_INCLUDE_ROOTS = ("include", "src", "inc")
|
|
1160
|
-
|
|
1161
1455
|
|
|
1162
1456
|
def _cpp_include_candidates(
|
|
1163
1457
|
import_ref: str,
|
|
1164
1458
|
file_path: Path,
|
|
1459
|
+
project_root: Path,
|
|
1165
1460
|
path_to_node: dict[Path, str],
|
|
1166
1461
|
) -> list[Path]:
|
|
1167
1462
|
"""Map a C++ ``#include`` specifier to filesystem candidates (PATH-based).
|
|
@@ -1194,30 +1489,14 @@ def _cpp_include_candidates(
|
|
|
1194
1489
|
if not spec:
|
|
1195
1490
|
return []
|
|
1196
1491
|
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
#
|
|
1200
|
-
#
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
seen: set[Path] = set()
|
|
1206
|
-
for ancestor in [file_path.parent, *file_path.parents]:
|
|
1207
|
-
for root_name in _CPP_INCLUDE_ROOTS:
|
|
1208
|
-
root = ancestor / root_name
|
|
1209
|
-
key = root.resolve()
|
|
1210
|
-
if key in seen:
|
|
1211
|
-
continue
|
|
1212
|
-
seen.add(key)
|
|
1213
|
-
candidates.append((root / rel).resolve())
|
|
1214
|
-
|
|
1215
|
-
# 3. Harvest header-node parent directories from the file-set (DATA), so an
|
|
1216
|
-
# unconventional include root still resolves the trailing path segment(s).
|
|
1217
|
-
for header_dir in _cpp_header_root_dirs(path_to_node):
|
|
1218
|
-
candidates.append((header_dir / rel).resolve())
|
|
1219
|
-
|
|
1220
|
-
return candidates
|
|
1492
|
+
# GENERIC FIX 3: ONE shared candidate generator (relative-to-file →
|
|
1493
|
+
# conventional roots → PROJECT ROOT → harvested header-node dirs). The
|
|
1494
|
+
# builder's data-source-specific augmentation (header-node parent dirs from
|
|
1495
|
+
# the node file-set, so an exotic include root still resolves) is passed as
|
|
1496
|
+
# ``extra_roots``. The scanner-CEG resolver calls the SAME generator, so the
|
|
1497
|
+
# two cannot drift (the LevelDB 59%-edge-loss class).
|
|
1498
|
+
extra_roots = tuple(_cpp_header_root_dirs(path_to_node))
|
|
1499
|
+
return cpp_include_candidate_paths(spec, file_path, project_root, extra_roots)
|
|
1221
1500
|
|
|
1222
1501
|
|
|
1223
1502
|
def _cpp_header_root_dirs(path_to_node: dict[Path, str]) -> list[Path]:
|
|
@@ -1304,7 +1583,7 @@ def _csharp_namespace_index(path_to_node: dict[Path, str]) -> dict[str, list[str
|
|
|
1304
1583
|
if file_path.suffix != ".cs":
|
|
1305
1584
|
continue
|
|
1306
1585
|
try:
|
|
1307
|
-
content = file_path
|
|
1586
|
+
content = _read_source_text(file_path)
|
|
1308
1587
|
except OSError:
|
|
1309
1588
|
continue
|
|
1310
1589
|
for namespace in _CSHARP_NAMESPACE_DECL_RE.findall(content):
|
|
@@ -1397,6 +1676,18 @@ def _infer_test_targets(
|
|
|
1397
1676
|
return targets
|
|
1398
1677
|
|
|
1399
1678
|
|
|
1679
|
+
def _read_source_text(file_path: Path) -> str:
|
|
1680
|
+
"""Read a source file as text with a leading BOM stripped (GENERIC FIX 4).
|
|
1681
|
+
|
|
1682
|
+
Every builder-side parse of source TEXT (import-specifier extraction, the C#
|
|
1683
|
+
namespace reverse-index) goes through here so a UTF-8/UTF-16 BOM on line 1
|
|
1684
|
+
can never orphan a first-line declaration (``namespace``/``package``/a line-1
|
|
1685
|
+
``import``). Generic — not a per-language branch.
|
|
1686
|
+
"""
|
|
1687
|
+
|
|
1688
|
+
return strip_bom(file_path.read_text(encoding="utf-8", errors="ignore"))
|
|
1689
|
+
|
|
1690
|
+
|
|
1400
1691
|
def _extract_python_import_specifiers(file_path: Path) -> list[str]:
|
|
1401
1692
|
"""Return raw Python import specifiers (relative dots preserved) via AST.
|
|
1402
1693
|
|
|
@@ -1411,7 +1702,7 @@ def _extract_python_import_specifiers(file_path: Path) -> list[str]:
|
|
|
1411
1702
|
|
|
1412
1703
|
from codd.parsing import get_extractor
|
|
1413
1704
|
|
|
1414
|
-
content = file_path
|
|
1705
|
+
content = _read_source_text(file_path)
|
|
1415
1706
|
return get_extractor("python", "source").extract_import_specifiers(content)
|
|
1416
1707
|
|
|
1417
1708
|
|
|
@@ -1441,7 +1732,7 @@ def _extract_java_import_specifiers(file_path: Path) -> list[str]:
|
|
|
1441
1732
|
|
|
1442
1733
|
from codd.parsing import get_extractor
|
|
1443
1734
|
|
|
1444
|
-
content = file_path
|
|
1735
|
+
content = _read_source_text(file_path)
|
|
1445
1736
|
specifiers = get_extractor("java", "source").extract_import_specifiers(content)
|
|
1446
1737
|
if specifiers:
|
|
1447
1738
|
return specifiers
|
|
@@ -1489,7 +1780,7 @@ def _extract_cpp_include_specifiers(file_path: Path) -> list[str]:
|
|
|
1489
1780
|
no edge (analogous to Java ``java.*`` producing no edge).
|
|
1490
1781
|
"""
|
|
1491
1782
|
|
|
1492
|
-
content = file_path
|
|
1783
|
+
content = _read_source_text(file_path)
|
|
1493
1784
|
specifiers: list[str] = []
|
|
1494
1785
|
for quote_target, angle_target in _CPP_INCLUDE_RE.findall(content):
|
|
1495
1786
|
if quote_target:
|
|
@@ -1531,7 +1822,7 @@ def _extract_csharp_import_specifiers(file_path: Path) -> list[str]:
|
|
|
1531
1822
|
global / alias usings are surfaced as the bare imported namespace.
|
|
1532
1823
|
"""
|
|
1533
1824
|
|
|
1534
|
-
content = file_path
|
|
1825
|
+
content = _read_source_text(file_path)
|
|
1535
1826
|
specifiers: list[str] = []
|
|
1536
1827
|
for static_kw, namespace in _CSHARP_USING_RE.findall(content):
|
|
1537
1828
|
if static_kw:
|
|
@@ -251,14 +251,31 @@ def extract_runtime_states(
|
|
|
251
251
|
return [states[key] for key in sorted(states)]
|
|
252
252
|
|
|
253
253
|
|
|
254
|
+
#: Project types for which the criteria-driven ``runtime:db_seed:users`` WEB/DB
|
|
255
|
+
#: heuristic stays enabled WITHOUT an explicit declaration. ``web`` legitimately
|
|
256
|
+
#: has the users/login modality; ``generic`` carries no build markers (a script
|
|
257
|
+
#: app that might be web), so it keeps the legacy injection. Every OTHER detected
|
|
258
|
+
#: type is a typed non-web project by default (``cpp_embedded``/``java``/
|
|
259
|
+
#: ``csharp``/``rust``/… — Guava, Newtonsoft, LevelDB) and is gated OUT, so the web
|
|
260
|
+
#: heuristic is never synthesized into a non-web library. Generic — keyed on the
|
|
261
|
+
#: detected type (registry DATA), not a per-OSS special-case.
|
|
262
|
+
_DB_SEED_HEURISTIC_DEFAULT_TYPES = frozenset({"web", "generic"})
|
|
263
|
+
|
|
264
|
+
|
|
254
265
|
def _db_seed_injection_allowed(project_root: Path, config: dict[str, Any]) -> bool:
|
|
255
266
|
"""Whether the criteria-driven ``runtime:db_seed:users`` node may be injected.
|
|
256
267
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
268
|
+
The injection is a WEB/DB heuristic (assumes a users table + login). It is
|
|
269
|
+
ALLOWED when:
|
|
270
|
+
|
|
271
|
+
* a ``project_type`` is EXPLICITLY declared and is web-ish (has a UI or a
|
|
272
|
+
non-``none`` network surface); OR
|
|
273
|
+
* no type is declared but the DETECTED type is web-or-ambiguous (``web`` /
|
|
274
|
+
``generic`` — see ``_DB_SEED_HEURISTIC_DEFAULT_TYPES``).
|
|
275
|
+
|
|
276
|
+
It is SUPPRESSED for any explicitly-declared non-web modality (pure CLI /
|
|
277
|
+
library) AND for any DETECTED typed non-web project (C++/Java/C#/Rust/… libs),
|
|
278
|
+
so the heuristic never pollutes a non-web codebase. An explicit
|
|
262
279
|
``deployment.infer_db_seed_from_criteria: true|false`` overrides either way.
|
|
263
280
|
"""
|
|
264
281
|
deployment = config.get("deployment")
|
|
@@ -275,9 +292,15 @@ def _db_seed_injection_allowed(project_root: Path, config: dict[str, Any]) -> bo
|
|
|
275
292
|
project = config.get("project")
|
|
276
293
|
if isinstance(project, dict):
|
|
277
294
|
configured = str(project.get("type") or "").strip().lower()
|
|
295
|
+
|
|
278
296
|
if not configured:
|
|
279
|
-
# No declared type →
|
|
280
|
-
|
|
297
|
+
# No declared type → DETECT it from build markers and gate the WEB
|
|
298
|
+
# heuristic to web-or-ambiguous types (so a typed non-web lib is excluded
|
|
299
|
+
# even without an explicit declaration). This is the PRECISION fix.
|
|
300
|
+
from codd.dag.builder import _detect_project_type
|
|
301
|
+
|
|
302
|
+
detected = _detect_project_type(Path(project_root)).strip().lower()
|
|
303
|
+
return detected in _DB_SEED_HEURISTIC_DEFAULT_TYPES
|
|
281
304
|
|
|
282
305
|
capabilities = _resolve_capabilities(project_root, config)
|
|
283
306
|
web_ish = bool(
|