codd-dev 3.1.0__tar.gz → 3.2.0__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.1.0 → codd_dev-3.2.0}/PKG-INFO +1 -1
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/__init__.py +1 -1
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/cli.py +14 -0
- codd_dev-3.2.0/codd/dag/impact.py +563 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/candidate_selector.py +21 -4
- codd_dev-3.2.0/codd/fix/impact_planner.py +2234 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/impl_propagation.py +201 -18
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/phenomenon_fixer.py +150 -15
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/phenomenon_parser.py +52 -1
- codd_dev-3.2.0/codd/fix/templates/phenomenon_parse.txt +63 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/pyproject.toml +1 -1
- codd_dev-3.1.0/codd/dag/impact.py +0 -201
- codd_dev-3.1.0/codd/fix/templates/phenomenon_parse.txt +0 -34
- {codd_dev-3.1.0 → codd_dev-3.2.0}/.gitignore +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/LICENSE +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/README.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/bench_fixture/README.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/__main__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/_git_helper.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/action_outcome.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/ai_invoke.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/ai_patch.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/artifact_contract.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/artifact_ids.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/artifacts/catalog.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/ask_user_question_adapter.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/assembler.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/bridge.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/brownfield/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/brownfield/pipeline.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/capability_completeness.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/claude_cli.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/clustering.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/coherence_adapters.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/coherence_engine.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/confidence.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/config.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/config_schema.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/contracts.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/contracts_registry/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/contracts_registry/__main__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/contracts_registry/certify.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/contracts_registry/generate_matrix.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/contracts_registry/registry.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/coverage_auditor.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/coverage_execution_coherence.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/coverage_metrics.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/auto_repair.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/builder.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/_one_to_many_detection.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/artifact_contract_check.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/ci_health.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/dependency_freshness.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/depends_on_consistency.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/deployment_completeness.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/edge_validity.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/environment_coverage.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/implementation_coverage.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/node_completeness.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/opt_out.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/task_completion.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/transitive_closure.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/ui_coherence.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/checks/user_journey_coherence.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/coverage_axes.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/cli.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/csharp.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/elixir.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/generic.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/iot.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/java.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/kotlin.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/mobile.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/ruby.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/rust.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/scala.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/swift.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/defaults/web.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/extractor.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dag/runner.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/defaults.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/defaults.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/dependency_lock_coherence.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deploy_targets/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deploy_targets/app_service.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deploy_targets/base.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deploy_targets/docker_compose.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployer.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/checks/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/extractor.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/ai_command.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/ai_command_factory.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/codex_app_server.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/llm_consideration.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/schema/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/schema/prisma.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/target/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/target/docker_compose.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/curl.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/playwright.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/pytest_http.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/deployment/providers/verification/vitest.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/design_md.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/diff/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/diff/apply.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/diff/engine.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/diff/persistence.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/diff/templates/diff_prompt.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/discovery.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/drift.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/e2e_contract_coherence.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/e2e_extractor.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/e2e_generator.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/e2e_harness.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/e2e_runner.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/apply.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/engine.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/finding.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/formatters/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/formatters/base.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/formatters/interactive.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/formatters/json_fmt.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/formatters/md.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/lexicon_loader.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/persistence.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/env_refs.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/extract_ai.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/extract_paths.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/extractor.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/design_updater.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/interactive_prompt.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/risk_classifier.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/templates/clarification_question.txt +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/templates/design_update.txt +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/templates/impl_update.txt +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/templates/risk_assessment.txt +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fix/templates_loader.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fixer.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fixup_drift.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fixup_drift_strategies/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/frontmatter.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/generator.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/git_evidence.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/graph.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/greenfield/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/greenfield/pipeline.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/hitl_session.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/hooks/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/hooks/pre-commit +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/hooks/recipes/codex_hook.sh +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/iac_nfr.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/implement_oracle.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/implement_oracle_scope.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/implement_oracle_types.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/implementer/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/implementer/chunked_runner.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/implementer/typecheck_loop.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/implementer.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/import_coherence.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/inheritance.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/init/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/init/lexicon_suggest.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/init/llm_lexicon_suggester.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/init/stack_detector.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/knowledge_fetcher.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/adapters/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/adapters/implement_oracle.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/adapters/oracle_go.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/adapters/oracle_python.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/adapters/oracle_typescript.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/adapters/runner_report.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/builtin_adapters.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/compat.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/contract.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/loader.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/oracle_executor.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/path_planner.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/profile.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/profiles/go.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/profiles/python.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/profiles/typescript.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/registry.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/verify_executor.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/languages/verify_plan.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/lexicon.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/lexicon_cli/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/lexicon_cli/formatters/html.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/lexicon_cli/formatters/md.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/lexicon_cli/inspector.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/lexicon_cli/manager.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/lexicon_cli/reporter.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/lexicon_cli/threshold.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/approval.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/best_practice_augmenter.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/criteria_expander.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/design_doc_extractor.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/impl_step_deriver.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/means_catalog_loader.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/parser.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/plan_deriver.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/prompt_builder.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/strategy_validator.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/templates/meta_instruction.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/templates/plan_derive_meta.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/mcp_server.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/measure.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/operational_e2e_audit.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/operations_derive.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/_shared.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/api_specs.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/extractor_registry.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/filesystem_routes.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/iac.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/python_ast.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/regex_strategies.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/schemas.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/tests_builddeps.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/parsing/treesitter.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/planner.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/policy.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/preflight/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/preflight/defaults/cli.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/preflight/defaults/generic.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/preflight/defaults/iot.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/preflight/defaults/mobile.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/preflight/defaults/web.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/project_types.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/propagate.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/propagation_common.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/propagator.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/reconciliation_ledger.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/reference_resolution.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/registry.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/approval_repair.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/auto_scope_guard.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/engine.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/git_patcher.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/history.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/llm_repair_engine.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/loop.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/primary_picker.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/proof_breaks.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/repair_result.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/repairability_classifier.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/schema.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/templates/analyze_meta.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/templates/propose_meta.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/templates/repairability_meta.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/test_failure_attribution.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair/verify_runner.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/repair_slice.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/require.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/require_plugins.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/require_propagate.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/required_artifacts/defaults/generic.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/required_artifacts/defaults/web.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/required_artifacts_deriver.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/requirement_completeness/defaults/generic.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/requirement_completeness_auditor.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/requirement_reconciliation.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/requirements_meta.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/restoration_report.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/restore.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/routes_extractor.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/runtime_smoke/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/runtime_smoke/checks.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/runtime_smoke/config.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/runtime_smoke/report.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/runtime_smoke/runner.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/scanner.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/schema_refs.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/screen_flow_validator.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/screen_transition_extractor.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/screen_transitions/defaults.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/skills_cli/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/skills_cli/discovery.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/skills_cli/manager.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/skills_cli/paths.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/adapters/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/adapters/_base.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/adapters/nextjs.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/adapters/playwright.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/adapters/prisma.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/command_authenticity.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/command_override.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/command_plan.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/compose.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/loader.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/lock.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/obligations.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/profile.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/profiles/addons/playwright.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/profiles/addons/prisma.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/profiles/frameworks/nextjs.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/project.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/registry.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/replacement_proof.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/stack/resolve.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/surface_reconciliation.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/synth.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/codd.yaml.tmpl +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/conventions.yaml.tmpl +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/doc_links.yaml.tmpl +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/extracted/system-context.md.j2 +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/gitignore.tmpl +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/lexicon_questions.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/lexicon_schema.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/templates/overrides.yaml.tmpl +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/test_detection.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/test_import_coherence.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/traceability.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/validator.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/vb_marker_authenticity.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/vb_rerun_scope.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/verifiable_behavior_audit.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/watch/__init__.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/watch/events.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/watch/propagation_log.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/watch/propagation_pipeline.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/watch/test_runner.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/watch/watcher.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd/wiring.py +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/codd_plugins/stack_map.yaml +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/docs/cookbook/cdp_browser/README.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/docs/cookbook/presentation_aggregation/README.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/docs/requirements/README.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/examples/README.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/skills/codd-assemble/SKILL.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/skills/codd-evolve/SKILL.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/skills/codd-generate/SKILL.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/skills/codd-greenfield/SKILL.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/skills/codd-impact/SKILL.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/skills/codd-init/SKILL.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/skills/codd-propagate/SKILL.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/skills/codd-restore/SKILL.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/skills/codd-scan/SKILL.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/skills/codd-validate/SKILL.md +0 -0
- {codd_dev-3.1.0 → codd_dev-3.2.0}/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.
|
|
3
|
+
Version: 3.2.0
|
|
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
|
|
@@ -6393,6 +6393,11 @@ def _run_phenomenon_fix_cli(
|
|
|
6393
6393
|
f" intent={a.intent}, ambiguity={a.ambiguity_score:.2f}, "
|
|
6394
6394
|
f"subject_terms={a.subject_terms[:4]}"
|
|
6395
6395
|
)
|
|
6396
|
+
click.echo(
|
|
6397
|
+
f" decomposition: entities={a.entities} fields={a.fields} "
|
|
6398
|
+
f"operations={a.operations} surfaces={a.surfaces} "
|
|
6399
|
+
f"obligations={[o.get('id') for o in (a.obligations or []) if isinstance(o, dict)]}"
|
|
6400
|
+
)
|
|
6396
6401
|
|
|
6397
6402
|
if result.aborted:
|
|
6398
6403
|
click.echo(f"❌ Aborted: {result.abort_reason}")
|
|
@@ -6425,6 +6430,15 @@ def _run_phenomenon_fix_cli(
|
|
|
6425
6430
|
applied_any = True
|
|
6426
6431
|
|
|
6427
6432
|
if dry_run:
|
|
6433
|
+
if result.impact_plan is not None:
|
|
6434
|
+
plan = result.impact_plan
|
|
6435
|
+
click.echo(f"\n🧭 Impact plan: status={plan.status}")
|
|
6436
|
+
for d in plan.diagnostics:
|
|
6437
|
+
click.echo(f" · {d}")
|
|
6438
|
+
if plan.covered_obligations:
|
|
6439
|
+
click.echo(" coverage:")
|
|
6440
|
+
for oid, paths in sorted(plan.covered_obligations.items()):
|
|
6441
|
+
click.echo(f" {oid} <- {', '.join(paths)}")
|
|
6428
6442
|
if result.propagate_impl_enabled and (
|
|
6429
6443
|
result.affected_impl_paths or result.affected_test_paths
|
|
6430
6444
|
):
|
|
@@ -0,0 +1,563 @@
|
|
|
1
|
+
"""Impact resolution: map a design document to affected implementation/test files.
|
|
2
|
+
|
|
3
|
+
Used by PHENOMENON-mode ``codd fix`` to decide deterministically which
|
|
4
|
+
implementation files (and their tests) must follow an applied design-doc
|
|
5
|
+
update. Resolution is DAG-first:
|
|
6
|
+
|
|
7
|
+
1. Forward ``expects`` edges from the design node identify expected
|
|
8
|
+
implementation files (including one hop through lexicon ``expected``
|
|
9
|
+
nodes via their ``represents`` edges).
|
|
10
|
+
2. Each implementation node's ``tested_by`` edges identify its test files.
|
|
11
|
+
3. When a design doc declares no ``expects`` edges, the frontmatter
|
|
12
|
+
``modules`` list falls back to filesystem candidate matching
|
|
13
|
+
(:func:`find_impl_candidates` — the generalized form of the glob
|
|
14
|
+
inference that ``codd.fixer`` has always used).
|
|
15
|
+
|
|
16
|
+
Everything here is generic: no project names, no framework assumptions
|
|
17
|
+
beyond conventional file layouts already encoded in the legacy fixer.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import re
|
|
23
|
+
from dataclasses import dataclass, field
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
from typing import Any, Iterable
|
|
26
|
+
|
|
27
|
+
_DOC_SUFFIX = ".md"
|
|
28
|
+
|
|
29
|
+
# Source-file suffixes the impact search walks. Generic across ecosystems —
|
|
30
|
+
# no framework assumption, just "files that hold implementation code". The
|
|
31
|
+
# legacy ``find_impl_candidates`` globs decide the back-compat path; this set
|
|
32
|
+
# only governs the v2 path-segment / content search helpers.
|
|
33
|
+
_SOURCE_SUFFIXES = (
|
|
34
|
+
".ts",
|
|
35
|
+
".tsx",
|
|
36
|
+
".js",
|
|
37
|
+
".jsx",
|
|
38
|
+
".mjs",
|
|
39
|
+
".cjs",
|
|
40
|
+
".py",
|
|
41
|
+
".go",
|
|
42
|
+
".rb",
|
|
43
|
+
".java",
|
|
44
|
+
".kt",
|
|
45
|
+
".rs",
|
|
46
|
+
".php",
|
|
47
|
+
".cs",
|
|
48
|
+
".swift",
|
|
49
|
+
".scala",
|
|
50
|
+
".vue",
|
|
51
|
+
".svelte",
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
# Directories never worth walking for impact candidates.
|
|
55
|
+
_SKIP_DIR_NAMES = frozenset(
|
|
56
|
+
{
|
|
57
|
+
".git",
|
|
58
|
+
".hg",
|
|
59
|
+
".svn",
|
|
60
|
+
".codd",
|
|
61
|
+
"node_modules",
|
|
62
|
+
".venv",
|
|
63
|
+
"venv",
|
|
64
|
+
"__pycache__",
|
|
65
|
+
".mypy_cache",
|
|
66
|
+
".pytest_cache",
|
|
67
|
+
".next",
|
|
68
|
+
"dist",
|
|
69
|
+
"build",
|
|
70
|
+
"out",
|
|
71
|
+
"coverage",
|
|
72
|
+
".tox",
|
|
73
|
+
".idea",
|
|
74
|
+
".vscode",
|
|
75
|
+
"target",
|
|
76
|
+
"vendor",
|
|
77
|
+
"reports",
|
|
78
|
+
"tmp",
|
|
79
|
+
"logs",
|
|
80
|
+
"__snapshots__",
|
|
81
|
+
# Installed third-party packages (any Python virtualenv, regardless of
|
|
82
|
+
# the venv dir's name — ``.venv``/``venv`` are caught above, but a repo
|
|
83
|
+
# may hold a venv under an arbitrary name). ``site-packages`` is the
|
|
84
|
+
# universal install location; skipping it removes the bulk of a venv's
|
|
85
|
+
# files so a stray in-repo virtualenv cannot pollute candidates or
|
|
86
|
+
# exhaust the document-frequency scan budget. Generic Python convention,
|
|
87
|
+
# not a project/framework name.
|
|
88
|
+
"site-packages",
|
|
89
|
+
}
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
# Cross-ecosystem dependency LOCK files: machine-generated, hash-dense, never a
|
|
93
|
+
# hand-edited target (like generated code). The ``.lock`` suffix catches
|
|
94
|
+
# yarn.lock/poetry.lock/Cargo.lock/Gemfile.lock/Pipfile.lock/flake.lock; these
|
|
95
|
+
# remaining names use other suffixes. Naming these is file-KIND knowledge (a
|
|
96
|
+
# tooling convention, like a test-file name), not a project/framework feature —
|
|
97
|
+
# consistent with :func:`is_test_path`. A short hex anchor can substring-match a
|
|
98
|
+
# hash inside such a file and fake a content certificate, so they must be
|
|
99
|
+
# excluded from the search/frequency universe.
|
|
100
|
+
_DEPENDENCY_LOCK_NAMES = frozenset(
|
|
101
|
+
{
|
|
102
|
+
"package-lock.json",
|
|
103
|
+
"npm-shrinkwrap.json",
|
|
104
|
+
"pnpm-lock.yaml",
|
|
105
|
+
"bun.lockb",
|
|
106
|
+
"go.sum",
|
|
107
|
+
"composer.lock",
|
|
108
|
+
}
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def is_dependency_lock(basename: str) -> bool:
|
|
113
|
+
"""True for a machine-generated dependency lock file (never a patch target)."""
|
|
114
|
+
return basename.lower() in _DEPENDENCY_LOCK_NAMES
|
|
115
|
+
|
|
116
|
+
# Cap content reads so a pathological file cannot blow up the search.
|
|
117
|
+
_MAX_CONTENT_CHARS = 200_000
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@dataclass
|
|
121
|
+
class ImplTargets:
|
|
122
|
+
"""Implementation/test files affected by one design document."""
|
|
123
|
+
|
|
124
|
+
design_node_id: str
|
|
125
|
+
impl_paths: list[str] = field(default_factory=list)
|
|
126
|
+
test_paths: list[str] = field(default_factory=list)
|
|
127
|
+
# "expects" (DAG edges), "frontmatter_modules" (glob fallback), "none"
|
|
128
|
+
source: str = "none"
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def affected_impl_targets(
|
|
132
|
+
dag: Any,
|
|
133
|
+
design_node_id: str,
|
|
134
|
+
*,
|
|
135
|
+
project_root: Path | None = None,
|
|
136
|
+
) -> ImplTargets:
|
|
137
|
+
"""Resolve implementation and test files affected by ``design_node_id``.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
dag: a built :class:`codd.dag.DAG` (or duck-typed equivalent with
|
|
141
|
+
``nodes`` mapping and ``edges`` list).
|
|
142
|
+
design_node_id: node id of the design document (relative posix path).
|
|
143
|
+
project_root: required for the frontmatter ``modules`` filesystem
|
|
144
|
+
fallback; when ``None`` the fallback is skipped.
|
|
145
|
+
"""
|
|
146
|
+
targets = ImplTargets(design_node_id=design_node_id)
|
|
147
|
+
nodes = getattr(dag, "nodes", {}) or {}
|
|
148
|
+
design_node = nodes.get(design_node_id)
|
|
149
|
+
if design_node is None:
|
|
150
|
+
return targets
|
|
151
|
+
|
|
152
|
+
forward: dict[str, dict[str, list[str]]] = {}
|
|
153
|
+
for edge in getattr(dag, "edges", []) or []:
|
|
154
|
+
forward.setdefault(edge.from_id, {}).setdefault(edge.kind, []).append(edge.to_id)
|
|
155
|
+
|
|
156
|
+
impl_ids: list[str] = []
|
|
157
|
+
seen_impl: set[str] = set()
|
|
158
|
+
for target_id in forward.get(design_node_id, {}).get("expects", []):
|
|
159
|
+
node = nodes.get(target_id)
|
|
160
|
+
if node is None:
|
|
161
|
+
continue
|
|
162
|
+
if node.kind == "expected":
|
|
163
|
+
# Lexicon expected-artifact node: hop through `represents`.
|
|
164
|
+
for represented_id in forward.get(target_id, {}).get("represents", []):
|
|
165
|
+
_append_code_node(nodes.get(represented_id), impl_ids, seen_impl)
|
|
166
|
+
continue
|
|
167
|
+
_append_code_node(node, impl_ids, seen_impl)
|
|
168
|
+
|
|
169
|
+
source = "expects" if impl_ids else "none"
|
|
170
|
+
|
|
171
|
+
if not impl_ids and project_root is not None:
|
|
172
|
+
for module in _frontmatter_modules(design_node):
|
|
173
|
+
for candidate in find_impl_candidates(Path(project_root), str(module)):
|
|
174
|
+
normalized = Path(candidate).as_posix()
|
|
175
|
+
if normalized not in seen_impl:
|
|
176
|
+
seen_impl.add(normalized)
|
|
177
|
+
impl_ids.append(normalized)
|
|
178
|
+
if impl_ids:
|
|
179
|
+
source = "frontmatter_modules"
|
|
180
|
+
|
|
181
|
+
test_ids: list[str] = []
|
|
182
|
+
seen_tests: set[str] = set()
|
|
183
|
+
for impl_id in impl_ids:
|
|
184
|
+
for test_id in forward.get(impl_id, {}).get("tested_by", []):
|
|
185
|
+
node = nodes.get(test_id)
|
|
186
|
+
if node is None:
|
|
187
|
+
continue
|
|
188
|
+
node_path = str(node.path or node.id)
|
|
189
|
+
if node_path.endswith(_DOC_SUFFIX):
|
|
190
|
+
continue
|
|
191
|
+
if test_id not in seen_tests:
|
|
192
|
+
seen_tests.add(test_id)
|
|
193
|
+
test_ids.append(test_id)
|
|
194
|
+
|
|
195
|
+
targets.impl_paths = sorted(impl_ids)
|
|
196
|
+
targets.test_paths = sorted(test_ids)
|
|
197
|
+
targets.source = source
|
|
198
|
+
return targets
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def _append_code_node(node: Any, impl_ids: list[str], seen: set[str]) -> None:
|
|
202
|
+
"""Collect a node when it represents implementation *code*.
|
|
203
|
+
|
|
204
|
+
``kind="common"`` is shared by frontmatter-declared common documents and
|
|
205
|
+
``common_node_patterns``-matched code files; ``.md`` is the codebase-wide
|
|
206
|
+
doc discriminator (same principle as ``dependency_freshness``).
|
|
207
|
+
"""
|
|
208
|
+
if node is None:
|
|
209
|
+
return
|
|
210
|
+
node_path = str(node.path or node.id)
|
|
211
|
+
if node.kind == "impl_file" or (node.kind == "common" and not node_path.endswith(_DOC_SUFFIX)):
|
|
212
|
+
path = Path(node_path).as_posix()
|
|
213
|
+
if path not in seen:
|
|
214
|
+
seen.add(path)
|
|
215
|
+
impl_ids.append(path)
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def _frontmatter_modules(node: Any) -> list[Any]:
|
|
219
|
+
attributes = getattr(node, "attributes", None) or {}
|
|
220
|
+
frontmatter = attributes.get("frontmatter") or {}
|
|
221
|
+
if not isinstance(frontmatter, dict):
|
|
222
|
+
return []
|
|
223
|
+
modules = frontmatter.get("modules") or []
|
|
224
|
+
if isinstance(modules, (list, tuple)):
|
|
225
|
+
return list(modules)
|
|
226
|
+
return [modules]
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
# ---------------------------------------------------------------------------
|
|
230
|
+
# Filesystem candidate matching (shared with codd.fixer — behavior-identical)
|
|
231
|
+
# ---------------------------------------------------------------------------
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def is_test_path(path: str) -> bool:
|
|
235
|
+
"""Check if a path looks like a test file."""
|
|
236
|
+
parts = path.replace("\\", "/").split("/")
|
|
237
|
+
# Directory-based: tests/, __tests__/, test/, spec/
|
|
238
|
+
if any(p in ("tests", "__tests__", "test", "spec") for p in parts):
|
|
239
|
+
return True
|
|
240
|
+
# File-based: *.spec.*, *.test.*, *.e2e.*, test_*
|
|
241
|
+
basename = parts[-1] if parts else ""
|
|
242
|
+
if (
|
|
243
|
+
".spec." in basename
|
|
244
|
+
or ".test." in basename
|
|
245
|
+
or ".e2e." in basename
|
|
246
|
+
or basename.startswith("test_")
|
|
247
|
+
):
|
|
248
|
+
return True
|
|
249
|
+
return False
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def find_impl_candidates(project_root: Path, domain: str) -> list[str]:
|
|
253
|
+
"""Find implementation files matching a domain name."""
|
|
254
|
+
candidates: list[str] = []
|
|
255
|
+
domain_lower = domain.lower().replace("-", "_")
|
|
256
|
+
|
|
257
|
+
# Strategy 1: API route files — **/api/{domain}/route.{ts,js}
|
|
258
|
+
# Handles both standard (src/app/api/) and generated (src/generated/*/app/api/)
|
|
259
|
+
domain_kebab = domain_lower.replace("_", "-")
|
|
260
|
+
for domain_variant in {domain_lower, domain_kebab}:
|
|
261
|
+
for ext in ("ts", "tsx", "js"):
|
|
262
|
+
for match in project_root.glob(f"**/api/{domain_variant}/route.{ext}"):
|
|
263
|
+
if match.is_file():
|
|
264
|
+
rel = str(match.relative_to(project_root))
|
|
265
|
+
if rel not in candidates:
|
|
266
|
+
candidates.append(rel)
|
|
267
|
+
|
|
268
|
+
# Strategy 3: Generated/service files — src/**/domain*.ts
|
|
269
|
+
for pattern in (
|
|
270
|
+
f"src/**/*{domain_lower}*",
|
|
271
|
+
f"src/**/*{domain_kebab}*",
|
|
272
|
+
f"lib/**/*{domain_lower}*",
|
|
273
|
+
):
|
|
274
|
+
for match in project_root.glob(pattern):
|
|
275
|
+
if match.is_file() and not is_test_path(str(match.relative_to(project_root))):
|
|
276
|
+
rel = str(match.relative_to(project_root))
|
|
277
|
+
if rel not in candidates:
|
|
278
|
+
candidates.append(rel)
|
|
279
|
+
|
|
280
|
+
# Strategy 4: Python — {domain}.py, app.py in same directory
|
|
281
|
+
for pattern in (
|
|
282
|
+
f"**/{domain_lower}.py",
|
|
283
|
+
f"**/app.py",
|
|
284
|
+
f"src/**/{domain_lower}.py",
|
|
285
|
+
):
|
|
286
|
+
for match in project_root.glob(pattern):
|
|
287
|
+
if match.is_file() and not is_test_path(str(match.relative_to(project_root))):
|
|
288
|
+
rel = str(match.relative_to(project_root))
|
|
289
|
+
if rel not in candidates:
|
|
290
|
+
candidates.append(rel)
|
|
291
|
+
|
|
292
|
+
return candidates
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
# ---------------------------------------------------------------------------
|
|
296
|
+
# v2 search: term normalization + path-segment + content matching
|
|
297
|
+
#
|
|
298
|
+
# The legacy ``find_impl_candidates`` maps a single *module* name to files via
|
|
299
|
+
# globs. That breaks in brownfield codebases whose design docs link only at a
|
|
300
|
+
# coarse module granularity (a module that actually owns files scattered under
|
|
301
|
+
# unrelated paths). The helpers below let the planner search by the
|
|
302
|
+
# phenomenon's own vocabulary — entities, fields, operations, surfaces —
|
|
303
|
+
# across BOTH path segments and file content, with cheap term normalization so
|
|
304
|
+
# a snake_case token matches its camelCase and kebab-case spellings.
|
|
305
|
+
# Everything is generic: only path/content tokens, never a framework or
|
|
306
|
+
# project name.
|
|
307
|
+
# ---------------------------------------------------------------------------
|
|
308
|
+
|
|
309
|
+
_CAMEL_BOUNDARY_RE = re.compile(r"(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])")
|
|
310
|
+
_NON_ALNUM_RE = re.compile(r"[^A-Za-z0-9]+")
|
|
311
|
+
_ASCII_WORD_RE = re.compile(r"[A-Za-z][A-Za-z0-9]*")
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
def _split_words(term: str) -> list[str]:
|
|
315
|
+
"""Split a term into its component words (snake/kebab/camel aware)."""
|
|
316
|
+
if not term:
|
|
317
|
+
return []
|
|
318
|
+
# Normalize separators, then break camelCase boundaries.
|
|
319
|
+
spaced = _NON_ALNUM_RE.sub(" ", term)
|
|
320
|
+
spaced = _CAMEL_BOUNDARY_RE.sub(" ", spaced)
|
|
321
|
+
return [w for w in spaced.split() if w]
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
def _to_snake(term: str) -> str:
|
|
325
|
+
return "_".join(w.lower() for w in _split_words(term))
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
def _to_kebab(term: str) -> str:
|
|
329
|
+
return "-".join(w.lower() for w in _split_words(term))
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def _to_camel(term: str) -> str:
|
|
333
|
+
words = _split_words(term)
|
|
334
|
+
if not words:
|
|
335
|
+
return ""
|
|
336
|
+
head, *rest = words
|
|
337
|
+
return head.lower() + "".join(w.capitalize() for w in rest)
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
def _singularize_cheap(word: str) -> str:
|
|
341
|
+
"""A deliberately small, language-agnostic singularizer.
|
|
342
|
+
|
|
343
|
+
Handles the common English plural endings only; never claims linguistic
|
|
344
|
+
correctness. Generality > completeness — it must not encode domain words.
|
|
345
|
+
"""
|
|
346
|
+
low = word
|
|
347
|
+
if len(low) > 3 and low.endswith("ies"):
|
|
348
|
+
return low[:-3] + "y"
|
|
349
|
+
if len(low) > 4 and low.endswith("ses"):
|
|
350
|
+
return low[:-2]
|
|
351
|
+
if len(low) > 2 and low.endswith("s") and not low.endswith("ss"):
|
|
352
|
+
return low[:-1]
|
|
353
|
+
return low
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
def _pluralize_cheap(word: str) -> str:
|
|
357
|
+
low = word
|
|
358
|
+
if not low:
|
|
359
|
+
return low
|
|
360
|
+
if low.endswith("y") and len(low) > 1 and low[-2] not in "aeiou":
|
|
361
|
+
return low[:-1] + "ies"
|
|
362
|
+
if low.endswith(("s", "x", "z", "ch", "sh")):
|
|
363
|
+
return low + "es"
|
|
364
|
+
return low + "s"
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
def normalize_terms(terms: Iterable[str]) -> set[str]:
|
|
368
|
+
"""Expand each term into snake/camel/kebab + cheap singular/plural forms.
|
|
369
|
+
|
|
370
|
+
Returns a lowercase set of tokens length >= 2. Both the whole term and its
|
|
371
|
+
singular/plural variants are expanded, so a two-word camelCase term yields
|
|
372
|
+
its snake_case, kebab-case, and concatenated spellings (and their singular
|
|
373
|
+
forms) — letting a phenomenon term match any casing convention in the code.
|
|
374
|
+
"""
|
|
375
|
+
out: set[str] = set()
|
|
376
|
+
for raw in terms:
|
|
377
|
+
if not isinstance(raw, str):
|
|
378
|
+
continue
|
|
379
|
+
term = raw.strip()
|
|
380
|
+
if not term:
|
|
381
|
+
continue
|
|
382
|
+
|
|
383
|
+
seeds = {term}
|
|
384
|
+
words = _split_words(term)
|
|
385
|
+
# Singular/plural variants of the last word (e.g. cat <-> cats),
|
|
386
|
+
# rejoined in the original casing forms below.
|
|
387
|
+
if words:
|
|
388
|
+
last = words[-1]
|
|
389
|
+
for variant in (_singularize_cheap(last), _pluralize_cheap(last)):
|
|
390
|
+
if variant and variant != last:
|
|
391
|
+
seeds.add(" ".join(words[:-1] + [variant]))
|
|
392
|
+
# Whole-term singular/plural (covers single-word terms too).
|
|
393
|
+
seeds.add(_singularize_cheap(term))
|
|
394
|
+
seeds.add(_pluralize_cheap(term))
|
|
395
|
+
|
|
396
|
+
for seed in list(seeds):
|
|
397
|
+
for form in (
|
|
398
|
+
seed,
|
|
399
|
+
_to_snake(seed),
|
|
400
|
+
_to_kebab(seed),
|
|
401
|
+
_to_camel(seed),
|
|
402
|
+
seed.replace(" ", "").replace("_", "").replace("-", ""),
|
|
403
|
+
):
|
|
404
|
+
if form:
|
|
405
|
+
out.add(form.lower())
|
|
406
|
+
|
|
407
|
+
return {tok for tok in out if len(tok) >= 2}
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
def iter_source_files(
|
|
411
|
+
project_root: Path,
|
|
412
|
+
suffixes: Iterable[str] | None = None,
|
|
413
|
+
) -> Iterable[Path]:
|
|
414
|
+
"""Yield implementation source files under ``project_root``.
|
|
415
|
+
|
|
416
|
+
Skips VCS/build/cache directories and test files. ``suffixes`` defaults to
|
|
417
|
+
:data:`_SOURCE_SUFFIXES`.
|
|
418
|
+
"""
|
|
419
|
+
root = Path(project_root)
|
|
420
|
+
allowed = tuple(s.lower() for s in (suffixes or _SOURCE_SUFFIXES))
|
|
421
|
+
for path in sorted(root.rglob("*")):
|
|
422
|
+
if not path.is_file():
|
|
423
|
+
continue
|
|
424
|
+
if path.suffix.lower() not in allowed:
|
|
425
|
+
continue
|
|
426
|
+
rel_parts = path.relative_to(root).parts
|
|
427
|
+
# Skip named build/cache/VCS dirs AND any dotdir (e.g. .next, .next-e2e,
|
|
428
|
+
# .nuxt, .svelte-kit, .turbo, .cache): generated build output and tool
|
|
429
|
+
# caches live under dotdirs and are never hand-edited source. A bare
|
|
430
|
+
# ``part in _SKIP_DIR_NAMES`` misses sibling build dirs like ``.next-e2e``.
|
|
431
|
+
if any(
|
|
432
|
+
part in _SKIP_DIR_NAMES or (part.startswith(".") and part not in (".", ".."))
|
|
433
|
+
for part in rel_parts[:-1]
|
|
434
|
+
):
|
|
435
|
+
continue
|
|
436
|
+
if is_dependency_lock(rel_parts[-1]):
|
|
437
|
+
continue
|
|
438
|
+
rel = "/".join(rel_parts)
|
|
439
|
+
if is_test_path(rel):
|
|
440
|
+
continue
|
|
441
|
+
yield path
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
def _safe_read(path: Path) -> str:
|
|
445
|
+
try:
|
|
446
|
+
text = path.read_text(encoding="utf-8")
|
|
447
|
+
except (OSError, UnicodeDecodeError):
|
|
448
|
+
return ""
|
|
449
|
+
if len(text) > _MAX_CONTENT_CHARS:
|
|
450
|
+
return text[:_MAX_CONTENT_CHARS]
|
|
451
|
+
return text
|
|
452
|
+
|
|
453
|
+
|
|
454
|
+
def _rel(path: Path, project_root: Path) -> str:
|
|
455
|
+
return path.relative_to(project_root).as_posix()
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
@dataclass
|
|
459
|
+
class PathSegmentHit:
|
|
460
|
+
"""A normalized term matched against a file's path."""
|
|
461
|
+
|
|
462
|
+
term: str
|
|
463
|
+
where: str # "path_segment" | "path_basename" | "path_substring"
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
@dataclass
|
|
467
|
+
class ContentHit:
|
|
468
|
+
"""A normalized term matched against a file's content."""
|
|
469
|
+
|
|
470
|
+
term: str
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
def path_segment_hits(rel_path: str, terms: set[str]) -> list[PathSegmentHit]:
|
|
474
|
+
"""Match normalized ``terms`` against the segments of ``rel_path``.
|
|
475
|
+
|
|
476
|
+
Strongest signal first: a whole path segment equals a term, then the
|
|
477
|
+
basename contains it, then any segment contains it as a substring.
|
|
478
|
+
"""
|
|
479
|
+
parts = [p.lower() for p in rel_path.replace("\\", "/").split("/") if p]
|
|
480
|
+
if not parts:
|
|
481
|
+
return []
|
|
482
|
+
basename = parts[-1]
|
|
483
|
+
# Also expose extension-stripped basename tokens for equality checks.
|
|
484
|
+
stem = basename.rsplit(".", 1)[0] if "." in basename else basename
|
|
485
|
+
segment_set = set(parts) | {stem}
|
|
486
|
+
|
|
487
|
+
hits: list[PathSegmentHit] = []
|
|
488
|
+
for term in terms:
|
|
489
|
+
if term in segment_set:
|
|
490
|
+
hits.append(PathSegmentHit(term=term, where="path_segment"))
|
|
491
|
+
elif term in basename:
|
|
492
|
+
hits.append(PathSegmentHit(term=term, where="path_basename"))
|
|
493
|
+
elif any(term in part for part in parts):
|
|
494
|
+
hits.append(PathSegmentHit(term=term, where="path_substring"))
|
|
495
|
+
return hits
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
def content_hits(text: str, terms: set[str]) -> list[ContentHit]:
|
|
499
|
+
"""Match normalized ``terms`` against lowercased file ``text``."""
|
|
500
|
+
if not text:
|
|
501
|
+
return []
|
|
502
|
+
low = text.lower()
|
|
503
|
+
return [ContentHit(term=term) for term in terms if term in low]
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
def find_impl_candidates_v2(
|
|
507
|
+
project_root: Path,
|
|
508
|
+
terms: set[str],
|
|
509
|
+
*,
|
|
510
|
+
suffixes: Iterable[str] | None = None,
|
|
511
|
+
candidate_paths: Iterable[str] | None = None,
|
|
512
|
+
) -> dict[str, dict[str, Any]]:
|
|
513
|
+
"""Search every source file for ``terms`` in both path and content.
|
|
514
|
+
|
|
515
|
+
Returns ``{rel_path: {"path_hits": [...], "content_hits": [...]}}`` for
|
|
516
|
+
files with at least one hit. The planner — not this function — decides
|
|
517
|
+
which of these become write targets, based on evidence scoring. Keeping
|
|
518
|
+
discovery (broad) separate from acceptance (strict) is what lets recall be
|
|
519
|
+
high without sacrificing precision.
|
|
520
|
+
|
|
521
|
+
The candidate universe is general:
|
|
522
|
+
|
|
523
|
+
* ``candidate_paths`` (explicit rel-path list) takes precedence when given —
|
|
524
|
+
the caller has already chosen the source universe (e.g. DAG nodes);
|
|
525
|
+
* otherwise :func:`iter_source_files` walks the tree filtered by
|
|
526
|
+
``suffixes`` (defaulting to :data:`_SOURCE_SUFFIXES`), skipping
|
|
527
|
+
VCS/build/cache dirs and test files.
|
|
528
|
+
|
|
529
|
+
Passing a non-default ``suffixes`` (e.g. the set of text-like extensions a
|
|
530
|
+
repo actually contains) makes stylesheet/text-config/copy files discoverable
|
|
531
|
+
WITHOUT this function hardcoding any framework suffix — generality is kept by
|
|
532
|
+
deriving the universe from the repo, not from a baked-in list.
|
|
533
|
+
"""
|
|
534
|
+
root = Path(project_root)
|
|
535
|
+
norm = {t for t in terms if t}
|
|
536
|
+
out: dict[str, dict[str, Any]] = {}
|
|
537
|
+
if not norm:
|
|
538
|
+
return out
|
|
539
|
+
|
|
540
|
+
if candidate_paths is not None:
|
|
541
|
+
paths_iter: Iterable[Path] = []
|
|
542
|
+
seen: set[str] = set()
|
|
543
|
+
resolved: list[Path] = []
|
|
544
|
+
for rel in candidate_paths:
|
|
545
|
+
rel_posix = Path(rel).as_posix()
|
|
546
|
+
if rel_posix in seen:
|
|
547
|
+
continue
|
|
548
|
+
seen.add(rel_posix)
|
|
549
|
+
full = root / rel
|
|
550
|
+
if full.is_file():
|
|
551
|
+
resolved.append(full)
|
|
552
|
+
paths_iter = resolved
|
|
553
|
+
else:
|
|
554
|
+
paths_iter = iter_source_files(root, suffixes)
|
|
555
|
+
|
|
556
|
+
for path in paths_iter:
|
|
557
|
+
rel = _rel(path, root)
|
|
558
|
+
p_hits = path_segment_hits(rel, norm)
|
|
559
|
+
text = _safe_read(path)
|
|
560
|
+
c_hits = content_hits(text, norm)
|
|
561
|
+
if p_hits or c_hits:
|
|
562
|
+
out[rel] = {"path_hits": p_hits, "content_hits": c_hits}
|
|
563
|
+
return out
|
|
@@ -128,11 +128,28 @@ def select_candidates(
|
|
|
128
128
|
)
|
|
129
129
|
|
|
130
130
|
|
|
131
|
+
def _is_markdown_doc_node(node: Node) -> bool:
|
|
132
|
+
"""True only for markdown design documents.
|
|
133
|
+
|
|
134
|
+
``kind="common"`` is overloaded: the DAG builder marks BOTH common design
|
|
135
|
+
*documents* and common *code* files (those matching ``common_node_patterns``)
|
|
136
|
+
as ``common``. Only markdown docs are valid Stage-3 design-update targets —
|
|
137
|
+
admitting common *code* here lets a phenomenon fix rewrite an implementation
|
|
138
|
+
file as if it were a design document, collapsing the design→impl→test north
|
|
139
|
+
star into a single ad-hoc code edit.
|
|
140
|
+
"""
|
|
141
|
+
path = str(node.path or node.id or "")
|
|
142
|
+
return path.endswith(".md")
|
|
143
|
+
|
|
144
|
+
|
|
131
145
|
def _collect_design_nodes(dag: DAG, *, include_common: bool) -> list[Node]:
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
146
|
+
out: list[Node] = []
|
|
147
|
+
for node in dag.nodes.values():
|
|
148
|
+
if node.kind == "design_doc":
|
|
149
|
+
out.append(node)
|
|
150
|
+
elif include_common and node.kind == "common" and _is_markdown_doc_node(node):
|
|
151
|
+
out.append(node)
|
|
152
|
+
return out
|
|
136
153
|
|
|
137
154
|
|
|
138
155
|
_WORD_RE = re.compile(r"[A-Za-z_][A-Za-z0-9_]+|[-ヿ一-鿿]+")
|