codd-dev 3.7.0__tar.gz → 3.7.1__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.0 → codd_dev-3.7.1}/PKG-INFO +1 -1
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/__init__.py +1 -1
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/cli.py +2 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/builder.py +93 -6
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/ci_health.py +47 -2
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/extract_ai.py +231 -27
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/__init__.py +1 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/_shared.py +19 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/python_ast.py +71 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/codd.yaml.tmpl +3 -18
- {codd_dev-3.7.0 → codd_dev-3.7.1}/pyproject.toml +1 -1
- {codd_dev-3.7.0 → codd_dev-3.7.1}/.gitignore +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/LICENSE +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/README.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/bench_fixture/README.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/__main__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/_git_helper.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/action_outcome.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/ai_invoke.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/ai_patch.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/artifact_contract.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/artifact_ids.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/artifacts/catalog.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/ask_user_question_adapter.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/assembler.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/bridge.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/brownfield/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/brownfield/pipeline.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/capability_completeness.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/claude_cli.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/clustering.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/coherence_adapters.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/coherence_engine.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/confidence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/config.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/config_schema.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/contracts.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/contracts_registry/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/contracts_registry/__main__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/contracts_registry/certify.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/contracts_registry/generate_matrix.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/contracts_registry/registry.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/coverage_auditor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/coverage_execution_coherence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/coverage_metrics.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/auto_repair.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/_one_to_many_detection.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/artifact_contract_check.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/cardinality_coverage.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/dependency_freshness.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/depends_on_consistency.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/deployment_completeness.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/edge_validity.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/environment_coverage.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/extraction_diagnostics.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/implementation_coverage.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/negative_space.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/node_completeness.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/opt_out.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/resource_flow_coherence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/semantic_contract_conflict.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/stale_evidence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/task_completion.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/transitive_closure.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/ui_coherence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/checks/user_journey_coherence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/coverage_axes.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/cli.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/cpp_embedded.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/csharp.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/elixir.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/generic.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/iot.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/java.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/kotlin.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/mobile.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/ruby.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/rust.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/scala.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/swift.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/test_frameworks.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/defaults/web.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/extractor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/impact.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/materiality.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/metadata_access.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/result_status.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dag/runner.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/defaults.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/defaults.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/dependency_lock_coherence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deploy_targets/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deploy_targets/app_service.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deploy_targets/base.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deploy_targets/docker_compose.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployer.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/checks/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/defaults/deploy_targets.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/defaults/schema_providers.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/defaults/verification_templates.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/extractor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/ai_command.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/ai_command_factory.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/codex_app_server.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/llm_consideration.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/schema/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/schema/prisma.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/target/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/target/docker_compose.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/cdp_browser.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/cdp_engines.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/cdp_wire.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/curl.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/form_strategies.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/means_catalog.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/playwright.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/pytest_http.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/deployment/providers/verification/vitest.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/design_md.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/diff/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/diff/apply.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/diff/engine.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/diff/persistence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/diff/templates/diff_prompt.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/discovery.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/drift.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/e2e_contract_coherence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/e2e_extractor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/e2e_generator.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/e2e_harness.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/e2e_runner.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/apply.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/engine.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/finding.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/formatters/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/formatters/base.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/formatters/interactive.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/formatters/json_fmt.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/formatters/md.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/gap_to_ask.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/lexicon_loader.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/persistence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/promote.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/routing.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/env_refs.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/extract_paths.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/extractor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/candidate_selector.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/design_updater.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/impact_planner.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/impl_propagation.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/interactive_prompt.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/phenomenon_fixer.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/phenomenon_parser.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/risk_classifier.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/templates/clarification_question.txt +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/templates/design_update.txt +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/templates/impl_update.txt +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/templates/phenomenon_parse.txt +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/templates/risk_assessment.txt +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fix/templates_loader.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fixer.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fixup_drift.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fixup_drift_strategies/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/fixup_drift_strategies/url_drift.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/frontmatter.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/generator.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/git_evidence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/graph.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/greenfield/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/greenfield/pipeline.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/hitl_session.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/hooks/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/hooks/pre-commit +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/hooks/recipes/claude_settings_example.json +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/hooks/recipes/codex_hook.sh +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/hooks/recipes/git_post_commit.sh +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/hooks/recipes/git_pre_commit.sh +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/iac_nfr.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/implement_oracle.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/implement_oracle_scope.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/implement_oracle_types.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/implementer/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/implementer/chunked_runner.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/implementer/typecheck_loop.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/implementer.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/import_coherence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/inheritance.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/init/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/init/lexicon_suggest.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/init/llm_lexicon_suggester.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/init/stack_detector.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/knowledge_fetcher.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/adapters/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/adapters/implement_oracle.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/adapters/oracle_go.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/adapters/oracle_python.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/adapters/oracle_typescript.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/adapters/runner_report.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/builtin_adapters.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/compat.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/contract.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/loader.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/oracle_executor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/path_planner.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/profile.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/profiles/go.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/profiles/python.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/profiles/typescript.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/registry.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/verify_executor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/languages/verify_plan.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/lexicon.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/lexicon_cli/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/lexicon_cli/formatters/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/lexicon_cli/formatters/html.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/lexicon_cli/formatters/md.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/lexicon_cli/inspector.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/lexicon_cli/manager.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/lexicon_cli/reporter.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/lexicon_cli/threshold.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/approval.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/best_practice_augmenter.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/criteria_expander.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/design_doc_extractor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/impl_step_deriver.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/means_catalog_loader.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/parser.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/plan_deriver.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/prompt_builder.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/strategy_validator.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/templates/best_practice_augment_meta.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/templates/criteria_expand_meta.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/templates/design_doc_extract_meta.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/templates/impl_step_derive_meta.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/templates/meta_instruction.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/templates/plan_derive_meta.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/llm/templates/verification_means_catalog.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/mcp_server.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/measure.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/operational_e2e_audit.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/operations_derive.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/api_specs.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/extractor_registry.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/filesystem_routes.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/iac.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/regex_strategies.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/schemas.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/tests_builddeps.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/parsing/treesitter.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/path_safety.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/planner.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/policy.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/preflight/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/preflight/defaults/cli.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/preflight/defaults/generic.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/preflight/defaults/iot.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/preflight/defaults/mobile.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/preflight/defaults/web.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/project_types.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/propagate.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/propagation_common.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/propagator.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/reconciliation_ledger.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/reference_resolution.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/registry.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/approval_repair.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/auto_scope_guard.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/engine.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/git_patcher.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/history.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/llm_repair_engine.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/loop.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/primary_picker.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/proof_breaks.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/repair_result.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/repairability_classifier.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/schema.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/templates/analyze_meta.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/templates/propose_meta.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/templates/repair_strategy_meta.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/templates/repairability_meta.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/test_failure_attribution.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair/verify_runner.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/repair_slice.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/require.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/require_plugins.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/require_propagate.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/required_artifacts/defaults/cli.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/required_artifacts/defaults/generic.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/required_artifacts/defaults/iot.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/required_artifacts/defaults/mobile.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/required_artifacts/defaults/web.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/required_artifacts_deriver.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/requirement_completeness/defaults/cli.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/requirement_completeness/defaults/generic.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/requirement_completeness/defaults/iot.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/requirement_completeness/defaults/web.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/requirement_completeness_auditor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/requirement_reconciliation.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/requirements_meta.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/restoration_report.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/restore.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/routes_extractor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/runtime_smoke/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/runtime_smoke/checks.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/runtime_smoke/config.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/runtime_smoke/report.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/runtime_smoke/runner.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/scanner.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/schema_refs.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/screen_flow_validator.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/screen_transition_extractor.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/screen_transitions/defaults.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/skills_cli/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/skills_cli/discovery.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/skills_cli/manager.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/skills_cli/paths.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/adapters/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/adapters/_base.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/adapters/nextjs.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/adapters/playwright.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/adapters/prisma.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/command_authenticity.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/command_override.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/command_plan.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/compose.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/loader.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/lock.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/obligations.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/profile.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/profiles/addons/playwright.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/profiles/addons/prisma.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/profiles/frameworks/nextjs.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/project.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/registry.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/replacement_proof.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/stack/resolve.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/surface_reconciliation.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/synth.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/conventions.yaml.tmpl +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/data_dependencies.yaml.tmpl +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/doc_links.yaml.tmpl +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/extract_ai_prompt_baseline.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/extracted/api-contract.md.j2 +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/extracted/module-detail.md.j2 +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/extracted/schema-design.md.j2 +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/extracted/system-context.md.j2 +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/gitignore.tmpl +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/lexicon_questions.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/lexicon_schema.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/templates/overrides.yaml.tmpl +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/test_detection.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/test_import_coherence.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/traceability.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/validator.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/vb_marker_authenticity.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/vb_rerun_scope.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/verifiable_behavior_audit.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/watch/__init__.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/watch/events.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/watch/propagation_log.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/watch/propagation_pipeline.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/watch/test_runner.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/watch/watcher.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd/wiring.py +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/codd_plugins/stack_map.yaml +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/docs/cookbook/cdp_browser/README.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/docs/cookbook/presentation_aggregation/README.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/docs/requirements/README.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/examples/README.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/skills/codd-assemble/SKILL.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/skills/codd-evolve/SKILL.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/skills/codd-generate/SKILL.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/skills/codd-greenfield/SKILL.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/skills/codd-impact/SKILL.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/skills/codd-init/SKILL.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/skills/codd-propagate/SKILL.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/skills/codd-restore/SKILL.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/skills/codd-scan/SKILL.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/skills/codd-validate/SKILL.md +0 -0
- {codd_dev-3.7.0 → codd_dev-3.7.1}/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.1
|
|
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
|
|
@@ -5862,6 +5862,8 @@ def extract(
|
|
|
5862
5862
|
click.echo(f"Output: {output_display}/")
|
|
5863
5863
|
for f in result.generated_files:
|
|
5864
5864
|
click.echo(f" {f.name}")
|
|
5865
|
+
for warning in getattr(result, "parse_warnings", []):
|
|
5866
|
+
click.echo(f" WARNING: {warning}")
|
|
5865
5867
|
if generated_config:
|
|
5866
5868
|
click.echo(f"Generated: {config_display} (minimal brownfield config)")
|
|
5867
5869
|
|
|
@@ -44,7 +44,6 @@ LEGACY_IMPLEMENTATION_SUFFIXES = (".ts", ".tsx", ".js", ".jsx", ".py", ".go", ".
|
|
|
44
44
|
LEGACY_TEST_SUFFIXES = (".ts", ".tsx", ".js", ".jsx", ".py", ".go", ".bats")
|
|
45
45
|
PLAN_HEADER_RE = re.compile(r"^#{2,6}\s+([A-Za-z0-9]+(?:[-_.][A-Za-z0-9]+)*)(?:\s+(.+))?$", re.MULTILINE)
|
|
46
46
|
OUTPUTS_RE = re.compile(r"(?im)^outputs?[ \t]*:[ \t]*(.*)$")
|
|
47
|
-
PY_IMPORT_RE = re.compile(r"(?m)^\s*(?:from\s+([A-Za-z_][\w.]*)(?:\s+import\s+)|import\s+([A-Za-z_][\w.]*))")
|
|
48
47
|
LEXICON_OUTPUT_PREFIX = "lexicon:"
|
|
49
48
|
EXPECTED_ARTIFACT_ATTRIBUTE_KEYS = (
|
|
50
49
|
"id",
|
|
@@ -298,7 +297,7 @@ def _add_impl_files(dag: DAG, project_root: Path, settings: dict[str, Any]) -> d
|
|
|
298
297
|
path=node_id,
|
|
299
298
|
attributes={
|
|
300
299
|
"language": _language_for_path(file_path),
|
|
301
|
-
"imports":
|
|
300
|
+
"imports": _extract_impl_imports(file_path),
|
|
302
301
|
"runtime_evidence": _runtime_evidence_for_file(file_path, node_id, capability_patterns),
|
|
303
302
|
},
|
|
304
303
|
),
|
|
@@ -913,13 +912,28 @@ def _resolve_import_target(
|
|
|
913
912
|
aliases: dict[str, list[str]],
|
|
914
913
|
) -> str | None:
|
|
915
914
|
candidates: list[Path] = []
|
|
916
|
-
if import_ref
|
|
915
|
+
if _is_js_relative_specifier(import_ref):
|
|
916
|
+
# JS/TS relative: ``./foo`` / ``../foo`` — resolve against the file dir
|
|
917
|
+
# exactly as before (a path with a separator after the dots).
|
|
917
918
|
candidates.append((file_path.parent / import_ref).resolve())
|
|
919
|
+
elif import_ref.startswith("."):
|
|
920
|
+
# Python relative: ``.b`` / ``..pkg.x`` / ``.`` — leading dots select a
|
|
921
|
+
# package directory (1 dot = current package, 2 = parent, …) and the
|
|
922
|
+
# dotted remainder maps to a sub-path. Distinct from JS ``./`` because
|
|
923
|
+
# Python uses ``.`` as the component separator, so ``pkg/.b`` (the old
|
|
924
|
+
# JS-style join) never matched ``pkg/b.py``.
|
|
925
|
+
candidates.extend(_python_relative_candidates(import_ref, file_path))
|
|
918
926
|
elif import_ref.startswith("/"):
|
|
919
927
|
candidates.append((project_root / import_ref.lstrip("/")).resolve())
|
|
920
928
|
else:
|
|
921
929
|
candidates.extend(_alias_candidates(import_ref, project_root, aliases))
|
|
922
930
|
candidates.append((project_root / import_ref).resolve())
|
|
931
|
+
# Absolute dotted module specifier (``pkg.c`` / ``a.b.c``): also try the
|
|
932
|
+
# dotted→path mapping rooted at the project, so a Python absolute import
|
|
933
|
+
# resolves to ``pkg/c.py`` (``__init__.py`` handled downstream). The
|
|
934
|
+
# plain join above keeps ``pkg/sub`` directory-style specifiers working.
|
|
935
|
+
if "." in import_ref:
|
|
936
|
+
candidates.append((project_root / Path(*import_ref.split("."))).resolve())
|
|
923
937
|
|
|
924
938
|
for candidate in candidates:
|
|
925
939
|
resolved = _resolve_file_candidate(candidate, path_to_node)
|
|
@@ -928,6 +942,45 @@ def _resolve_import_target(
|
|
|
928
942
|
return None
|
|
929
943
|
|
|
930
944
|
|
|
945
|
+
def _is_js_relative_specifier(import_ref: str) -> bool:
|
|
946
|
+
"""True for JS/TS relative specifiers (``./x`` / ``../x`` / ``.`` / ``..``).
|
|
947
|
+
|
|
948
|
+
The discriminator is purely the SHAPE of the specifier (data), not a
|
|
949
|
+
language flag: JS relative imports put a path separator after the leading
|
|
950
|
+
dots (or are the bare ``.`` / ``..`` directory refs), whereas Python
|
|
951
|
+
relative imports use ``.`` as the module-component separator (``.b``,
|
|
952
|
+
``..pkg.mod``). Keeping the JS branch byte-identical preserves the existing
|
|
953
|
+
TS/JS edge behavior.
|
|
954
|
+
"""
|
|
955
|
+
|
|
956
|
+
if import_ref in (".", ".."):
|
|
957
|
+
return True
|
|
958
|
+
return import_ref.startswith("./") or import_ref.startswith("../")
|
|
959
|
+
|
|
960
|
+
|
|
961
|
+
def _python_relative_candidates(import_ref: str, file_path: Path) -> list[Path]:
|
|
962
|
+
"""Resolve a Python relative import specifier to filesystem candidates.
|
|
963
|
+
|
|
964
|
+
Mirrors Python's own relative-import semantics: ``leading_dots`` counts the
|
|
965
|
+
package levels (1 = the importing file's package == its directory, 2 = the
|
|
966
|
+
parent package, …); the remaining dotted name becomes sub-directories.
|
|
967
|
+
``_resolve_file_candidate`` then appends the real suffix / ``__init__.py``.
|
|
968
|
+
"""
|
|
969
|
+
|
|
970
|
+
leading_dots = len(import_ref) - len(import_ref.lstrip("."))
|
|
971
|
+
remainder = import_ref[leading_dots:]
|
|
972
|
+
|
|
973
|
+
# 1 dot → current package dir (the file's own directory); each extra dot
|
|
974
|
+
# walks one package up.
|
|
975
|
+
base = file_path.parent
|
|
976
|
+
for _ in range(leading_dots - 1):
|
|
977
|
+
base = base.parent
|
|
978
|
+
|
|
979
|
+
if not remainder:
|
|
980
|
+
return [base.resolve()]
|
|
981
|
+
return [(base / Path(*remainder.split("."))).resolve()]
|
|
982
|
+
|
|
983
|
+
|
|
931
984
|
def _infer_test_targets(
|
|
932
985
|
test_path: Path,
|
|
933
986
|
project_root: Path,
|
|
@@ -954,14 +1007,48 @@ def _infer_test_targets(
|
|
|
954
1007
|
return targets
|
|
955
1008
|
|
|
956
1009
|
|
|
1010
|
+
def _extract_python_import_specifiers(file_path: Path) -> list[str]:
|
|
1011
|
+
"""Return raw Python import specifiers (relative dots preserved) via AST.
|
|
1012
|
+
|
|
1013
|
+
Dispatches to the registry's Python ``source`` backend
|
|
1014
|
+
(:class:`codd.parsing.PythonAstExtractor`) so the SAME stdlib-``ast``
|
|
1015
|
+
extraction that the scanner uses produces the DAG's specifiers — including
|
|
1016
|
+
relative imports (``.b`` / ``from . import d`` / ``..pkg.x``) that the old
|
|
1017
|
+
line-anchored regex (a ``from ([A-Za-z_]…)`` pattern that could not match a
|
|
1018
|
+
leading-dot module) silently dropped. Selection is registry-DATA-driven
|
|
1019
|
+
(``get_extractor``), not a ``language ==`` branch.
|
|
1020
|
+
"""
|
|
1021
|
+
|
|
1022
|
+
from codd.parsing import get_extractor
|
|
1023
|
+
|
|
1024
|
+
content = file_path.read_text(encoding="utf-8", errors="ignore")
|
|
1025
|
+
return get_extractor("python", "source").extract_import_specifiers(content)
|
|
1026
|
+
|
|
1027
|
+
|
|
1028
|
+
def _extract_impl_imports(file_path: Path) -> list[str]:
|
|
1029
|
+
"""Return raw import specifiers for an implementation file.
|
|
1030
|
+
|
|
1031
|
+
Python impl files go through AST-based specifier extraction (the same path
|
|
1032
|
+
test files use) so impl→impl import edges form for Python — the core of the
|
|
1033
|
+
fix. Every other language keeps the existing quoted-specifier extractor
|
|
1034
|
+
(``extract_imports``: JS/TS ``from '…'`` / ``require('…')``), unchanged.
|
|
1035
|
+
Dispatch is by file suffix (DATA), mirroring ``_extract_test_imports``.
|
|
1036
|
+
"""
|
|
1037
|
+
|
|
1038
|
+
if file_path.suffix == ".py":
|
|
1039
|
+
return _extract_python_import_specifiers(file_path)
|
|
1040
|
+
return extract_imports(file_path)
|
|
1041
|
+
|
|
1042
|
+
|
|
957
1043
|
def _extract_test_imports(file_path: Path) -> list[str]:
|
|
958
1044
|
imports = extract_imports(file_path)
|
|
959
1045
|
if file_path.suffix != ".py":
|
|
960
1046
|
return imports
|
|
961
1047
|
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
1048
|
+
# AST-based Python specifiers (relative imports included). Combined with the
|
|
1049
|
+
# quoted-specifier pass above so a polyglot test file (e.g. a ``.py`` test
|
|
1050
|
+
# that also embeds a JS ``require('…')`` literal in a string) keeps both.
|
|
1051
|
+
return [*imports, *_extract_python_import_specifiers(file_path)]
|
|
965
1052
|
|
|
966
1053
|
|
|
967
1054
|
def _resolve_python_import_target(import_ref: str, project_root: Path, path_to_node: dict[Path, str]) -> str | None:
|
|
@@ -24,10 +24,19 @@ _DEFAULT_PROVIDER = "github" + "_actions"
|
|
|
24
24
|
_OPT_OUT_PROVIDER = "none"
|
|
25
25
|
|
|
26
26
|
|
|
27
|
+
# GitHub Actions officially loads workflow files with EITHER ``.yml`` or
|
|
28
|
+
# ``.yaml``. The default glob therefore matches both extensions (comma-separated
|
|
29
|
+
# union — see ``_locate_workflows``). A user who narrows ``workflow_glob`` to a
|
|
30
|
+
# single pattern keeps exact control (an explicit ``*.yaml`` pulls in only
|
|
31
|
+
# ``.yaml``); only the DEFAULT spans both so the common ``.yaml``-only project
|
|
32
|
+
# (e.g. Flask) is not mis-RED-flagged ``ci_workflow_missing``.
|
|
33
|
+
_DEFAULT_WORKFLOW_GLOB = ".github/workflows/*.yml,.github/workflows/*.yaml"
|
|
34
|
+
|
|
35
|
+
|
|
27
36
|
@dataclass
|
|
28
37
|
class CiConfig:
|
|
29
38
|
provider: str = _DEFAULT_PROVIDER
|
|
30
|
-
workflow_glob: str =
|
|
39
|
+
workflow_glob: str = _DEFAULT_WORKFLOW_GLOB
|
|
31
40
|
required_triggers: list[str] = field(default_factory=lambda: ["push", "pull_request"])
|
|
32
41
|
runtime_check: bool = False
|
|
33
42
|
staleness_days: int = 14
|
|
@@ -241,7 +250,43 @@ class CiHealthCheck(DagCheck):
|
|
|
241
250
|
project_root: Path,
|
|
242
251
|
workflow_glob: str,
|
|
243
252
|
) -> tuple[list[Path], list[str]]:
|
|
244
|
-
"""Resolve in-root workflow files
|
|
253
|
+
"""Resolve in-root workflow files for one OR MORE comma-separated globs.
|
|
254
|
+
|
|
255
|
+
``workflow_glob`` may carry several patterns separated by commas (the
|
|
256
|
+
default spans both ``*.yml`` and ``*.yaml`` because GitHub Actions loads
|
|
257
|
+
either extension). Each sub-glob is resolved independently through the
|
|
258
|
+
shared path_safety jail (see :meth:`_locate_one_glob`); the in-root
|
|
259
|
+
matches are unioned + de-duplicated, and any out-of-root markers are
|
|
260
|
+
accumulated so a single escaping sub-glob still surfaces a structured red
|
|
261
|
+
finding. A single (comma-free) pattern behaves exactly as before, so a
|
|
262
|
+
user who narrows ``workflow_glob`` to one pattern keeps exact control.
|
|
263
|
+
"""
|
|
264
|
+
|
|
265
|
+
sub_globs = [part.strip() for part in workflow_glob.split(",") if part.strip()]
|
|
266
|
+
if not sub_globs:
|
|
267
|
+
return [], []
|
|
268
|
+
|
|
269
|
+
seen: set[Path] = set()
|
|
270
|
+
in_root: list[Path] = []
|
|
271
|
+
out_of_root: list[str] = []
|
|
272
|
+
for sub in sub_globs:
|
|
273
|
+
files, escaped = self._locate_one_glob(project_root, sub)
|
|
274
|
+
for path in files:
|
|
275
|
+
if path not in seen:
|
|
276
|
+
seen.add(path)
|
|
277
|
+
in_root.append(path)
|
|
278
|
+
for marker in escaped:
|
|
279
|
+
if marker not in out_of_root:
|
|
280
|
+
out_of_root.append(marker)
|
|
281
|
+
in_root.sort()
|
|
282
|
+
return in_root, out_of_root
|
|
283
|
+
|
|
284
|
+
def _locate_one_glob(
|
|
285
|
+
self,
|
|
286
|
+
project_root: Path,
|
|
287
|
+
workflow_glob: str,
|
|
288
|
+
) -> tuple[list[Path], list[str]]:
|
|
289
|
+
"""Resolve in-root workflow files for ONE glob via the path_safety jail.
|
|
245
290
|
|
|
246
291
|
The glob root is validated *before* enumeration. An absolute
|
|
247
292
|
``workflow_glob`` whose static (non-magic) base escapes the project root
|
|
@@ -13,7 +13,9 @@ from __future__ import annotations
|
|
|
13
13
|
|
|
14
14
|
from dataclasses import dataclass, field
|
|
15
15
|
from pathlib import Path
|
|
16
|
+
import re
|
|
16
17
|
from typing import Any
|
|
18
|
+
import warnings
|
|
17
19
|
|
|
18
20
|
import yaml
|
|
19
21
|
|
|
@@ -31,6 +33,11 @@ from codd.discovery import (
|
|
|
31
33
|
|
|
32
34
|
PROMPT_TEMPLATE_FILE = Path(__file__).parent / "templates" / "extract_ai_prompt_baseline.md"
|
|
33
35
|
|
|
36
|
+
# The extract prompt targets six MECE layers (L1 data … L6 tests). Recovering
|
|
37
|
+
# fewer documents from the model's output is surfaced as an advisory warning
|
|
38
|
+
# (never a hard failure: not every project populates all six layers).
|
|
39
|
+
_EXPECTED_EXTRACT_LAYER_COUNT = 6
|
|
40
|
+
|
|
34
41
|
# Files to always read if they exist (framework detection)
|
|
35
42
|
FRAMEWORK_FILES = [
|
|
36
43
|
"package.json", "requirements.txt", "Pipfile", "pyproject.toml",
|
|
@@ -107,6 +114,9 @@ class ExtractAIResult:
|
|
|
107
114
|
generated_files: list[Path] = field(default_factory=list)
|
|
108
115
|
ai_raw_output: str = ""
|
|
109
116
|
module_count: int = 0
|
|
117
|
+
# Advisory parse warnings (e.g. fewer documents recovered than the six MECE
|
|
118
|
+
# layers expected) surfaced to the caller instead of silently dropping docs.
|
|
119
|
+
parse_warnings: list[str] = field(default_factory=list)
|
|
110
120
|
|
|
111
121
|
|
|
112
122
|
# ═══════════════════════════════════════════════════════════
|
|
@@ -498,37 +508,218 @@ def _safe_output_path(output_dir: Path, name: str) -> Path:
|
|
|
498
508
|
return candidate
|
|
499
509
|
|
|
500
510
|
|
|
501
|
-
|
|
502
|
-
|
|
511
|
+
_FENCE_RE = re.compile(r"^\s*```+[A-Za-z0-9_-]*\s*$")
|
|
512
|
+
_FILE_MARKER_RE = re.compile(r"^\s*---\s*FILE:\s*(?P<name>.+?)\s*---\s*$")
|
|
513
|
+
_LAYER_HEADER_RE = re.compile(r"^\s*#{1,6}\s*L\d+\b.*$")
|
|
514
|
+
|
|
515
|
+
|
|
516
|
+
def _strip_outer_fence(raw: str) -> str:
|
|
517
|
+
"""Drop a single code-fence wrapper around the WHOLE response.
|
|
503
518
|
|
|
504
|
-
|
|
505
|
-
|
|
519
|
+
Models routinely wrap their entire reply in ```` ```markdown … ``` ````.
|
|
520
|
+
Left in place, the leading fence lands at byte 0 and breaks frontmatter
|
|
521
|
+
normalization (which requires ``---`` at byte 0), and the trailing fence
|
|
522
|
+
leaks into the last document. Only the OUTER wrapper is removed: a fence as
|
|
523
|
+
the first non-blank line paired with a fence as the last non-blank line.
|
|
524
|
+
Inner code blocks inside a document body are untouched.
|
|
506
525
|
"""
|
|
507
|
-
|
|
526
|
+
lines = raw.split("\n")
|
|
527
|
+
first = next((i for i, ln in enumerate(lines) if ln.strip()), None)
|
|
528
|
+
if first is None:
|
|
529
|
+
return raw
|
|
530
|
+
last = next(i for i in range(len(lines) - 1, -1, -1) if lines[i].strip())
|
|
531
|
+
if first < last and _FENCE_RE.match(lines[first]) and _FENCE_RE.match(lines[last]):
|
|
532
|
+
return "\n".join(lines[first + 1 : last])
|
|
533
|
+
return raw
|
|
534
|
+
|
|
535
|
+
|
|
536
|
+
def _strip_doc_fences(body: str) -> str:
|
|
537
|
+
"""Strip a code-fence wrapper around a SINGLE parsed document segment.
|
|
538
|
+
|
|
539
|
+
Per-document fences appear when a model fences each doc individually (the
|
|
540
|
+
Flask shape mixed a single ``--- FILE:`` marker with per-doc fences). Only a
|
|
541
|
+
leading fence as the first non-blank line and/or a trailing fence as the
|
|
542
|
+
last non-blank line are removed, so a real code block in the middle of a
|
|
543
|
+
document body is preserved.
|
|
544
|
+
"""
|
|
545
|
+
lines = body.split("\n")
|
|
546
|
+
start = 0
|
|
547
|
+
end = len(lines)
|
|
548
|
+
while start < end and not lines[start].strip():
|
|
549
|
+
start += 1
|
|
550
|
+
if start < end and _FENCE_RE.match(lines[start]):
|
|
551
|
+
lines = lines[:start] + lines[start + 1 :]
|
|
552
|
+
end = len(lines)
|
|
553
|
+
while end > 0 and not lines[end - 1].strip():
|
|
554
|
+
end -= 1
|
|
555
|
+
if end > 0 and _FENCE_RE.match(lines[end - 1]):
|
|
556
|
+
lines = lines[: end - 1] + lines[end:]
|
|
557
|
+
return "\n".join(lines)
|
|
558
|
+
|
|
559
|
+
|
|
560
|
+
def _split_on_file_markers(raw: str) -> list[tuple[str | None, str]]:
|
|
561
|
+
"""Split on ``--- FILE: <name> ---`` markers (the canonical format).
|
|
562
|
+
|
|
563
|
+
Returns ``(name, body)`` segments. A leading segment before the first
|
|
564
|
+
marker has ``name=None`` (it is preamble, not a file) — callers decide
|
|
565
|
+
whether to keep it.
|
|
566
|
+
"""
|
|
567
|
+
segments: list[tuple[str | None, str]] = []
|
|
508
568
|
current_name: str | None = None
|
|
509
569
|
current_lines: list[str] = []
|
|
570
|
+
for line in raw.split("\n"):
|
|
571
|
+
match = _FILE_MARKER_RE.match(line)
|
|
572
|
+
if match:
|
|
573
|
+
segments.append((current_name, "\n".join(current_lines)))
|
|
574
|
+
current_name = match.group("name").strip()
|
|
575
|
+
current_lines = []
|
|
576
|
+
else:
|
|
577
|
+
current_lines.append(line)
|
|
578
|
+
segments.append((current_name, "\n".join(current_lines)))
|
|
579
|
+
return segments
|
|
580
|
+
|
|
581
|
+
|
|
582
|
+
def _split_on_frontmatter_docs(raw: str) -> list[str] | None:
|
|
583
|
+
"""Fallback: split a multi-document body on ``^---`` frontmatter blocks.
|
|
584
|
+
|
|
585
|
+
Used when the model separated docs by repeated ``---``-delimited frontmatter
|
|
586
|
+
rather than ``--- FILE:`` markers. A document starts at a ``---`` line whose
|
|
587
|
+
matching close ``---`` is followed by more content. Returns ``None`` when
|
|
588
|
+
fewer than two frontmatter docs are present (nothing to recover by this
|
|
589
|
+
strategy).
|
|
590
|
+
"""
|
|
591
|
+
lines = raw.split("\n")
|
|
592
|
+
# Index every standalone ``---`` delimiter (frontmatter fences are bare ---).
|
|
593
|
+
delims = [i for i, ln in enumerate(lines) if ln.strip() == "---"]
|
|
594
|
+
if len(delims) < 4: # need at least two open/close pairs for >=2 docs
|
|
595
|
+
return None
|
|
596
|
+
# A doc opens at delims[0], delims[2], delims[4], ... (every other delimiter
|
|
597
|
+
# is an opener; the one between is its closer).
|
|
598
|
+
openers = delims[0::2]
|
|
599
|
+
if len(openers) < 2:
|
|
600
|
+
return None
|
|
601
|
+
segments: list[str] = []
|
|
602
|
+
for idx, start in enumerate(openers):
|
|
603
|
+
end = openers[idx + 1] if idx + 1 < len(openers) else len(lines)
|
|
604
|
+
segments.append("\n".join(lines[start:end]))
|
|
605
|
+
return [seg for seg in segments if seg.strip()]
|
|
606
|
+
|
|
607
|
+
|
|
608
|
+
def _split_on_layer_headers(raw: str) -> list[str] | None:
|
|
609
|
+
"""Fallback: split on ``# L<n>: …`` layer headers.
|
|
610
|
+
|
|
611
|
+
Used when there is neither a ``--- FILE:`` marker nor per-doc frontmatter,
|
|
612
|
+
but the body carries the canonical six-layer ``# L1:`` … ``# L6:`` headers.
|
|
613
|
+
Returns ``None`` when fewer than two layer headers are present.
|
|
614
|
+
"""
|
|
615
|
+
lines = raw.split("\n")
|
|
616
|
+
starts = [i for i, ln in enumerate(lines) if _LAYER_HEADER_RE.match(ln)]
|
|
617
|
+
if len(starts) < 2:
|
|
618
|
+
return None
|
|
619
|
+
segments: list[str] = []
|
|
620
|
+
for idx, start in enumerate(starts):
|
|
621
|
+
end = starts[idx + 1] if idx + 1 < len(starts) else len(lines)
|
|
622
|
+
segments.append("\n".join(lines[start:end]))
|
|
623
|
+
return [seg for seg in segments if seg.strip()]
|
|
510
624
|
|
|
511
|
-
|
|
625
|
+
|
|
626
|
+
def _segment_node_name(body: str, index: int) -> str:
|
|
627
|
+
"""Derive a stable output filename for a marker-less recovered segment.
|
|
628
|
+
|
|
629
|
+
Prefers an ``id:`` from the segment's frontmatter, then a ``# L<n>:`` header
|
|
630
|
+
token, finally a positional fallback. Always yields a ``.md`` name confined
|
|
631
|
+
later by :func:`_safe_output_path`.
|
|
632
|
+
"""
|
|
633
|
+
fm = re.match(r"\A\s*---\s*\n(.*?)\n---\s*(?:\n|$)", body, re.DOTALL)
|
|
634
|
+
if fm:
|
|
635
|
+
try:
|
|
636
|
+
front = yaml.safe_load(fm.group(1)) or {}
|
|
637
|
+
except yaml.YAMLError:
|
|
638
|
+
front = {}
|
|
639
|
+
if isinstance(front, dict):
|
|
640
|
+
for key in ("node_id", "id", "name"):
|
|
641
|
+
value = front.get(key)
|
|
642
|
+
if isinstance(value, str) and value.strip():
|
|
643
|
+
slug = re.sub(r"[^A-Za-z0-9._-]+", "_", value.strip()).strip("_")
|
|
644
|
+
if slug:
|
|
645
|
+
return slug if slug.endswith(".md") else f"{slug}.md"
|
|
646
|
+
header = _LAYER_HEADER_RE.match(body.lstrip("\n").split("\n", 1)[0] if body.strip() else "")
|
|
647
|
+
if header:
|
|
648
|
+
token = re.search(r"L\d+", header.group(0))
|
|
649
|
+
if token:
|
|
650
|
+
return f"{token.group(0)}_extracted.md"
|
|
651
|
+
return f"extracted_doc_{index + 1}.md"
|
|
652
|
+
|
|
653
|
+
|
|
654
|
+
def _parse_ai_output(
|
|
655
|
+
raw: str,
|
|
656
|
+
output_dir: Path,
|
|
657
|
+
*,
|
|
658
|
+
expected_doc_count: int | None = None,
|
|
659
|
+
warnings_out: list[str] | None = None,
|
|
660
|
+
) -> list[Path]:
|
|
661
|
+
"""Parse AI extract output into per-document files (fence/format tolerant).
|
|
662
|
+
|
|
663
|
+
Resilient to two real failure modes seen in brownfield dogfood runs:
|
|
664
|
+
|
|
665
|
+
1. The model wraps its whole reply (or each document) in a ```` ```markdown ````
|
|
666
|
+
code fence — stripped so ``---`` lands at byte 0 for frontmatter
|
|
667
|
+
normalization.
|
|
668
|
+
2. The model separates documents by repeated ``^---`` frontmatter blocks or
|
|
669
|
+
``# L<n>:`` layer headers instead of ``--- FILE:`` markers — recovered by
|
|
670
|
+
fallback splitting so documents are not silently collapsed/dropped.
|
|
671
|
+
|
|
672
|
+
When *expected_doc_count* is given and fewer files are persisted, a loud
|
|
673
|
+
warning is appended to *warnings_out* (surfaced in the extract result)
|
|
674
|
+
rather than dropping documents silently. All writes are confined to
|
|
675
|
+
*output_dir*; traversal/absolute names are rejected (fail-closed) so
|
|
676
|
+
extraction can never clobber source/user files.
|
|
677
|
+
"""
|
|
678
|
+
warnings = warnings_out if warnings_out is not None else []
|
|
679
|
+
files: list[Path] = []
|
|
680
|
+
|
|
681
|
+
def _flush(name: str, body: str) -> None:
|
|
512
682
|
out_path = _safe_output_path(output_dir, name)
|
|
513
683
|
out_path.parent.mkdir(parents=True, exist_ok=True)
|
|
514
|
-
out_path.write_text(
|
|
684
|
+
out_path.write_text(_strip_doc_fences(body), encoding="utf-8")
|
|
515
685
|
files.append(out_path)
|
|
516
686
|
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
# Flush previous file
|
|
521
|
-
if current_name:
|
|
522
|
-
_flush(current_name, current_lines)
|
|
523
|
-
# Start new file
|
|
524
|
-
current_name = stripped.replace("--- FILE:", "").replace("---", "").strip()
|
|
525
|
-
current_lines = []
|
|
526
|
-
else:
|
|
527
|
-
current_lines.append(line)
|
|
687
|
+
de_fenced = _strip_outer_fence(raw)
|
|
688
|
+
marker_segments = _split_on_file_markers(de_fenced)
|
|
689
|
+
named = [(name, body) for name, body in marker_segments if name]
|
|
528
690
|
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
691
|
+
if len(named) >= 2:
|
|
692
|
+
# Canonical multi-file format — keep historical behavior.
|
|
693
|
+
for name, body in named:
|
|
694
|
+
_flush(name, body)
|
|
695
|
+
else:
|
|
696
|
+
# 0-1 FILE markers: recover documents the model separated another way
|
|
697
|
+
# rather than collapsing everything into a single (or zero) file.
|
|
698
|
+
fallback = _split_on_frontmatter_docs(de_fenced) or _split_on_layer_headers(de_fenced)
|
|
699
|
+
if fallback:
|
|
700
|
+
if named:
|
|
701
|
+
# Preserve the one explicitly-named doc, then recover the rest.
|
|
702
|
+
name, body = named[0]
|
|
703
|
+
_flush(name, body)
|
|
704
|
+
fallback = [seg for seg in fallback if seg.strip() != _strip_doc_fences(body).strip()]
|
|
705
|
+
for index, segment in enumerate(fallback):
|
|
706
|
+
_flush(_segment_node_name(segment, index), segment)
|
|
707
|
+
elif named:
|
|
708
|
+
name, body = named[0]
|
|
709
|
+
_flush(name, body)
|
|
710
|
+
else:
|
|
711
|
+
# Single plain document (no markers, no recoverable separators):
|
|
712
|
+
# write it as one file instead of silently dropping it.
|
|
713
|
+
if de_fenced.strip():
|
|
714
|
+
_flush(_segment_node_name(de_fenced, 0), de_fenced)
|
|
715
|
+
|
|
716
|
+
if expected_doc_count is not None and len(files) < expected_doc_count:
|
|
717
|
+
warnings.append(
|
|
718
|
+
f"AI extract parsed only {len(files)} document(s) but {expected_doc_count} "
|
|
719
|
+
f"were expected — the model's output format may be malformed (check "
|
|
720
|
+
f"_raw_ai_output.txt). No documents were silently dropped; review the raw "
|
|
721
|
+
f"output and re-run extract if incomplete."
|
|
722
|
+
)
|
|
532
723
|
|
|
533
724
|
return files
|
|
534
725
|
|
|
@@ -636,20 +827,33 @@ def run_extract_ai(
|
|
|
636
827
|
# Phase 3: AI invocation
|
|
637
828
|
raw_output = _invoke_ai_command(ai_command, prompt)
|
|
638
829
|
|
|
639
|
-
#
|
|
640
|
-
|
|
830
|
+
# Always persist the raw output FIRST so it survives even if parsing below
|
|
831
|
+
# hits a fail-closed path-safety error — it is the recovery artifact when the
|
|
832
|
+
# model's format is malformed.
|
|
833
|
+
raw_path = out / "_raw_ai_output.txt"
|
|
834
|
+
raw_path.write_text(raw_output, encoding="utf-8")
|
|
835
|
+
|
|
836
|
+
# Phase 4: Parse and write. The extractor targets the six MECE layers
|
|
837
|
+
# (L1-L6); recovering fewer documents is surfaced as an advisory warning
|
|
838
|
+
# (never a silent drop) so an under-parse is visible at the call site.
|
|
839
|
+
parse_warnings: list[str] = []
|
|
840
|
+
generated = _parse_ai_output(
|
|
841
|
+
raw_output,
|
|
842
|
+
out,
|
|
843
|
+
expected_doc_count=_EXPECTED_EXTRACT_LAYER_COUNT,
|
|
844
|
+
warnings_out=parse_warnings,
|
|
845
|
+
)
|
|
846
|
+
for message in parse_warnings:
|
|
847
|
+
warnings.warn(message, stacklevel=2)
|
|
641
848
|
|
|
642
849
|
# Phase 4b: Normalize node identity to canonical codd.node_id so the DAG can
|
|
643
850
|
# link restored docs the same way it links greenfield-generated docs.
|
|
644
851
|
_normalize_extracted_frontmatter(generated)
|
|
645
852
|
|
|
646
|
-
# Also save raw output
|
|
647
|
-
raw_path = out / "_raw_ai_output.txt"
|
|
648
|
-
raw_path.write_text(raw_output, encoding="utf-8")
|
|
649
|
-
|
|
650
853
|
return ExtractAIResult(
|
|
651
854
|
output_dir=out,
|
|
652
855
|
generated_files=generated,
|
|
653
856
|
ai_raw_output=raw_output,
|
|
654
857
|
module_count=len(scan.source_files),
|
|
858
|
+
parse_warnings=parse_warnings,
|
|
655
859
|
)
|
|
@@ -58,6 +58,7 @@ from codd.parsing.python_ast import (
|
|
|
58
58
|
_PY_BUILTIN_CALLS,
|
|
59
59
|
_detect_python_code_patterns_stdlib,
|
|
60
60
|
_extract_python_call_graph_stdlib,
|
|
61
|
+
_extract_python_import_specifiers_stdlib,
|
|
61
62
|
_extract_python_imports_stdlib,
|
|
62
63
|
_extract_python_symbols_stdlib,
|
|
63
64
|
_header_until_colon,
|
|
@@ -113,6 +113,18 @@ class LanguageExtractor(Protocol):
|
|
|
113
113
|
) -> tuple[dict[str, list[str]], set[str]]:
|
|
114
114
|
"""Return internal and external imports for the given source content."""
|
|
115
115
|
|
|
116
|
+
def extract_import_specifiers(self, content: str) -> list[str]:
|
|
117
|
+
"""Return RAW import specifiers (un-resolved) for DAG edge building.
|
|
118
|
+
|
|
119
|
+
Distinct from :meth:`extract_imports` (which classifies into the
|
|
120
|
+
scanner's internal/external module graph): this returns the literal
|
|
121
|
+
specifier strings the DAG builder resolves against the node file-set
|
|
122
|
+
(e.g. Python ``.b`` / ``pkg.c``). Backends that don't carry intra-tree
|
|
123
|
+
specifiers (or where the builder already extracts them another way)
|
|
124
|
+
return ``[]``.
|
|
125
|
+
"""
|
|
126
|
+
return []
|
|
127
|
+
|
|
116
128
|
def detect_code_patterns(self, mod: ModuleInfo, content: str) -> None:
|
|
117
129
|
"""Mutate ModuleInfo with any detected structural patterns."""
|
|
118
130
|
|
|
@@ -151,6 +163,13 @@ class RegexExtractor:
|
|
|
151
163
|
file_path,
|
|
152
164
|
)
|
|
153
165
|
|
|
166
|
+
def extract_import_specifiers(self, content: str) -> list[str]:
|
|
167
|
+
# Best-effort fallback: the regex backend has no language-agnostic raw
|
|
168
|
+
# specifier extraction. Non-Python source files keep flowing through the
|
|
169
|
+
# builder's quoted-specifier path (``extract_imports`` in
|
|
170
|
+
# ``codd.dag.extractor``), so returning ``[]`` here is a no-op for them.
|
|
171
|
+
return []
|
|
172
|
+
|
|
154
173
|
def detect_code_patterns(self, mod: ModuleInfo, content: str) -> None:
|
|
155
174
|
from codd import extractor as extractor_module
|
|
156
175
|
|
|
@@ -56,6 +56,32 @@ class PythonAstExtractor:
|
|
|
56
56
|
return {}, set()
|
|
57
57
|
return _extract_python_imports_stdlib(tree, content, file_path, project_root, src_dir)
|
|
58
58
|
|
|
59
|
+
def extract_import_specifiers(self, content: str) -> list[str]:
|
|
60
|
+
"""Return raw Python import specifiers (dots preserved), in source order.
|
|
61
|
+
|
|
62
|
+
Unlike :meth:`extract_imports` — which classifies imports into the
|
|
63
|
+
scanner's internal/external module graph keyed by normalized module
|
|
64
|
+
names — this returns the RAW dotted module strings exactly as written,
|
|
65
|
+
with leading dots preserved for relative imports (``.b``, ``..pkg.x``,
|
|
66
|
+
``.`` for a bare ``from . import name`` package ref). The DAG builder
|
|
67
|
+
resolves these against the actual node file-set, so it needs the literal
|
|
68
|
+
specifier, not a normalized key.
|
|
69
|
+
|
|
70
|
+
AST-based (stdlib ``ast``) so multi-line / parenthesized / aliased
|
|
71
|
+
imports and — critically — relative imports are all captured. The
|
|
72
|
+
previous regex seam (``PY_IMPORT_RE``) silently dropped every relative
|
|
73
|
+
import. Syntax errors yield ``[]`` (the file's other facts are kept by
|
|
74
|
+
the caller), matching the rest of this backend.
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
if self.category != "source":
|
|
78
|
+
return []
|
|
79
|
+
try:
|
|
80
|
+
tree = ast.parse(content)
|
|
81
|
+
except (SyntaxError, ValueError, TypeError):
|
|
82
|
+
return []
|
|
83
|
+
return _extract_python_import_specifiers_stdlib(tree)
|
|
84
|
+
|
|
59
85
|
def detect_code_patterns(self, mod: ModuleInfo, content: str) -> None:
|
|
60
86
|
if self.category != "source":
|
|
61
87
|
return None
|
|
@@ -317,6 +343,51 @@ def _extract_python_imports_stdlib(
|
|
|
317
343
|
external -= _python_stdlib()
|
|
318
344
|
return internal, external
|
|
319
345
|
|
|
346
|
+
def _extract_python_import_specifiers_stdlib(tree: ast.AST) -> list[str]:
|
|
347
|
+
"""Return raw dotted import specifiers (relative dots preserved) in order.
|
|
348
|
+
|
|
349
|
+
* ``import os, pkg.sub`` → ``["os", "pkg.sub"]``
|
|
350
|
+
* ``from pkg.c import y`` → ``["pkg.c"]``
|
|
351
|
+
* ``from .b import x`` → ``[".b"]`` (one leading dot per ``node.level``)
|
|
352
|
+
* ``from . import d`` → ``[".d"]`` (the imported submodule of the package)
|
|
353
|
+
* ``from ..pkg2 import w`` → ``["..pkg2"]``
|
|
354
|
+
|
|
355
|
+
Deterministic source order (``ast.walk`` is BFS, so sort by line/col) and
|
|
356
|
+
de-duplicated while preserving first-seen order, so the DAG builds a stable
|
|
357
|
+
edge set across runs.
|
|
358
|
+
"""
|
|
359
|
+
|
|
360
|
+
located: list[tuple[int, int, str]] = []
|
|
361
|
+
for node in ast.walk(tree):
|
|
362
|
+
if isinstance(node, ast.Import):
|
|
363
|
+
for alias in node.names:
|
|
364
|
+
if alias.name:
|
|
365
|
+
located.append((node.lineno, node.col_offset, alias.name))
|
|
366
|
+
elif isinstance(node, ast.ImportFrom):
|
|
367
|
+
prefix = "." * node.level
|
|
368
|
+
if node.module:
|
|
369
|
+
located.append((node.lineno, node.col_offset, f"{prefix}{node.module}"))
|
|
370
|
+
elif prefix:
|
|
371
|
+
# ``from . import a, b`` — each name is a SUBMODULE of the
|
|
372
|
+
# relative package (``.a`` / ``.b``), so emit one specifier per
|
|
373
|
+
# imported name. The builder resolves each to its ``.py`` /
|
|
374
|
+
# package so the real intra-package edge forms. (``*`` cannot
|
|
375
|
+
# appear in a no-module relative import, so no filtering needed.)
|
|
376
|
+
for alias in node.names:
|
|
377
|
+
if alias.name:
|
|
378
|
+
located.append(
|
|
379
|
+
(node.lineno, node.col_offset, f"{prefix}{alias.name}")
|
|
380
|
+
)
|
|
381
|
+
|
|
382
|
+
located.sort(key=lambda item: (item[0], item[1]))
|
|
383
|
+
seen: set[str] = set()
|
|
384
|
+
specifiers: list[str] = []
|
|
385
|
+
for _lineno, _col, specifier in located:
|
|
386
|
+
if specifier not in seen:
|
|
387
|
+
seen.add(specifier)
|
|
388
|
+
specifiers.append(specifier)
|
|
389
|
+
return specifiers
|
|
390
|
+
|
|
320
391
|
def _detect_python_code_patterns_stdlib(mod: ModuleInfo, tree: ast.AST, content: str) -> None:
|
|
321
392
|
docstring = ast.get_docstring(tree, clean=True)
|
|
322
393
|
if docstring:
|