codd-dev 2.6.1__tar.gz → 2.8.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-2.6.1 → codd_dev-2.8.0}/PKG-INFO +1 -1
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/cli.py +102 -2
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/engine.py +9 -4
- codd_dev-2.8.0/codd/init/llm_lexicon_suggester.py +234 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/lexicon.py +5 -1
- {codd_dev-2.6.1 → codd_dev-2.8.0}/pyproject.toml +1 -1
- {codd_dev-2.6.1 → codd_dev-2.8.0}/.gitignore +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/LICENSE +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/README.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/__main__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/_git_helper.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/ask_user_question_adapter.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/assembler.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/bridge.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/brownfield/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/brownfield/pipeline.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/clustering.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/coherence_adapters.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/coherence_engine.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/config.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/contracts.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/coverage_auditor.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/coverage_metrics.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/builder.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/checks/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/checks/depends_on_consistency.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/checks/deployment_completeness.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/checks/edge_validity.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/checks/environment_coverage.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/checks/implementation_coverage.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/checks/node_completeness.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/checks/task_completion.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/checks/transitive_closure.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/checks/user_journey_coherence.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/coverage_axes.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/cli.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/csharp.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/elixir.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/generic.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/iot.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/java.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/kotlin.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/mobile.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/ruby.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/rust.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/scala.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/swift.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/defaults/web.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/extractor.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/dag/runner.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/defaults.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deploy_targets/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deploy_targets/app_service.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deploy_targets/base.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deploy_targets/docker_compose.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployer.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/checks/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/extractor.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/ai_command.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/llm_consideration.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/schema/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/schema/prisma.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/target/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/target/docker_compose.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/curl.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/playwright.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/design_md.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/diff/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/diff/apply.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/diff/engine.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/diff/persistence.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/diff/templates/diff_prompt.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/drift.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/e2e_extractor.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/e2e_generator.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/e2e_runner.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/apply.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/finding.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/formatters/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/formatters/base.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/formatters/interactive.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/formatters/json_fmt.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/formatters/md.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/lexicon_loader.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/persistence.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/env_refs.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/extract_ai.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/extractor.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/fixer.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/fixup_drift.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/fixup_drift_strategies/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/generator.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/graph.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/hitl_session.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/hooks/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/hooks/pre-commit +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/hooks/recipes/codex_hook.sh +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/implementer/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/implementer/chunked_runner.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/implementer/typecheck_loop.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/implementer.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/inheritance.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/init/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/init/lexicon_suggest.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/init/stack_detector.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/knowledge_fetcher.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/lexicon_cli/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/lexicon_cli/formatters/html.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/lexicon_cli/formatters/md.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/lexicon_cli/inspector.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/lexicon_cli/manager.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/lexicon_cli/reporter.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/lexicon_cli/threshold.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/approval.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/best_practice_augmenter.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/criteria_expander.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/design_doc_extractor.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/impl_step_deriver.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/means_catalog_loader.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/parser.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/plan_deriver.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/prompt_builder.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/strategy_validator.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/templates/meta_instruction.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/templates/plan_derive_meta.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/mcp_server.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/measure.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/parsing.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/planner.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/policy.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/preflight/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/preflight/defaults/cli.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/preflight/defaults/iot.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/preflight/defaults/mobile.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/preflight/defaults/web.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/propagate.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/propagator.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/registry.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/approval_repair.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/engine.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/git_patcher.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/history.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/llm_repair_engine.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/loop.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/primary_picker.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/proof_breaks.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/repair_result.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/repairability_classifier.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/schema.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/templates/analyze_meta.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/templates/propose_meta.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/templates/repairability_meta.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair/verify_runner.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/repair_slice.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/require.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/require_plugins.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/require_propagate.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/required_artifacts/defaults/web.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/required_artifacts_deriver.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/requirement_completeness_auditor.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/restore.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/routes_extractor.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/scanner.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/schema_refs.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/screen_flow_validator.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/screen_transition_extractor.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/screen_transitions/defaults.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/synth.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/codd.yaml.tmpl +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/conventions.yaml.tmpl +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/doc_links.yaml.tmpl +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/extracted/system-context.md.j2 +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/gitignore.tmpl +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/lexicon_questions.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/lexicon_schema.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/templates/overrides.yaml.tmpl +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/traceability.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/validator.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/watch/__init__.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/watch/events.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/watch/propagation_log.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/watch/propagation_pipeline.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/watch/test_runner.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/watch/watcher.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd/wiring.py +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/codd_plugins/stack_map.yaml +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/docs/cookbook/cdp_browser/README.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.0}/docs/requirements/README.md +0 -0
- {codd_dev-2.6.1 → codd_dev-2.8.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: 2.
|
|
3
|
+
Version: 2.8.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
|
|
@@ -463,6 +463,18 @@ def _format_preflight_ntfy(result: Any) -> str:
|
|
|
463
463
|
default=True,
|
|
464
464
|
help="Detect project manifests and offer lexicon plug-in suggestions.",
|
|
465
465
|
)
|
|
466
|
+
@click.option(
|
|
467
|
+
"--llm-enhanced",
|
|
468
|
+
is_flag=True,
|
|
469
|
+
default=False,
|
|
470
|
+
help="Use AI to recommend lexicons from requirements and design context.",
|
|
471
|
+
)
|
|
472
|
+
@click.option(
|
|
473
|
+
"--auto-approve",
|
|
474
|
+
is_flag=True,
|
|
475
|
+
default=False,
|
|
476
|
+
help="Apply high and medium confidence AI lexicon recommendations without prompting.",
|
|
477
|
+
)
|
|
466
478
|
def init(
|
|
467
479
|
project_name: str,
|
|
468
480
|
language: str,
|
|
@@ -470,6 +482,8 @@ def init(
|
|
|
470
482
|
requirements: str | None,
|
|
471
483
|
config_dir: str,
|
|
472
484
|
suggest_lexicons: bool,
|
|
485
|
+
llm_enhanced: bool,
|
|
486
|
+
auto_approve: bool,
|
|
473
487
|
):
|
|
474
488
|
"""Initialize CoDD in a project directory."""
|
|
475
489
|
dest_path = Path(dest).resolve()
|
|
@@ -521,10 +535,15 @@ def init(
|
|
|
521
535
|
click.echo(f" or: codd generate --wave 2 (auto-generates everything)")
|
|
522
536
|
|
|
523
537
|
if suggest_lexicons:
|
|
524
|
-
_offer_lexicon_suggestions(dest_path)
|
|
538
|
+
_offer_lexicon_suggestions(dest_path, llm_enhanced=llm_enhanced, auto_approve=auto_approve)
|
|
525
539
|
|
|
526
540
|
|
|
527
|
-
def _offer_lexicon_suggestions(
|
|
541
|
+
def _offer_lexicon_suggestions(
|
|
542
|
+
project_root: Path,
|
|
543
|
+
*,
|
|
544
|
+
llm_enhanced: bool = False,
|
|
545
|
+
auto_approve: bool = False,
|
|
546
|
+
) -> None:
|
|
528
547
|
from codd.init.lexicon_suggest import (
|
|
529
548
|
append_suggested_lexicons,
|
|
530
549
|
describe_lexicons,
|
|
@@ -533,6 +552,42 @@ def _offer_lexicon_suggestions(project_root: Path) -> None:
|
|
|
533
552
|
)
|
|
534
553
|
from codd.init.stack_detector import StackDetector
|
|
535
554
|
|
|
555
|
+
if llm_enhanced:
|
|
556
|
+
from codd.init.llm_lexicon_suggester import llm_recommend_lexicons
|
|
557
|
+
|
|
558
|
+
llm_result = llm_recommend_lexicons(project_root)
|
|
559
|
+
if llm_result.recommendations:
|
|
560
|
+
descriptions = describe_lexicons(rec.lexicon_id for rec in llm_result.recommendations)
|
|
561
|
+
click.echo("")
|
|
562
|
+
click.echo("[LLM-enhanced] Analyzing project ...")
|
|
563
|
+
click.echo("[LLM-enhanced] Detected:")
|
|
564
|
+
click.echo(f" - Domain: {llm_result.detected_domain or 'unknown'}")
|
|
565
|
+
click.echo(f" - Compliance: {_format_detected_items(llm_result.detected_compliance)}")
|
|
566
|
+
click.echo(f" - Tech stack: {_format_detected_items(llm_result.detected_tech_stack)}")
|
|
567
|
+
click.echo(f" - Integrations: {_format_detected_items(llm_result.detected_integrations)}")
|
|
568
|
+
click.echo("")
|
|
569
|
+
click.echo("[LLM-enhanced] Recommended lexicons:")
|
|
570
|
+
for index, recommendation in enumerate(llm_result.recommendations, start=1):
|
|
571
|
+
description = descriptions.get(recommendation.lexicon_id, "")
|
|
572
|
+
suffix = f" ({description})" if description else ""
|
|
573
|
+
click.echo(
|
|
574
|
+
f" {index}. {_confidence_icon(recommendation.confidence)} "
|
|
575
|
+
f"{recommendation.lexicon_id}{suffix} [{recommendation.confidence}]"
|
|
576
|
+
)
|
|
577
|
+
if recommendation.reason:
|
|
578
|
+
click.echo(f" {recommendation.reason}")
|
|
579
|
+
|
|
580
|
+
selected = _select_llm_recommendations(llm_result, auto_approve=auto_approve)
|
|
581
|
+
if not selected:
|
|
582
|
+
click.echo("LLM-enhanced lexicons not added.")
|
|
583
|
+
return
|
|
584
|
+
path = append_suggested_lexicons(project_root, selected)
|
|
585
|
+
rel_path = path.relative_to(project_root).as_posix()
|
|
586
|
+
click.echo(f"{rel_path} updated ({len(selected)} suggested lexicons)")
|
|
587
|
+
return
|
|
588
|
+
click.echo("")
|
|
589
|
+
click.echo("[LLM-enhanced] No usable recommendation; falling back to stack-based suggestions.")
|
|
590
|
+
|
|
536
591
|
detection = StackDetector().detect(project_root)
|
|
537
592
|
if not detection.stack_hints:
|
|
538
593
|
return
|
|
@@ -559,6 +614,51 @@ def _offer_lexicon_suggestions(project_root: Path) -> None:
|
|
|
559
614
|
click.echo(f"{rel_path} updated ({len(suggestions)} suggested lexicons)")
|
|
560
615
|
|
|
561
616
|
|
|
617
|
+
def _format_detected_items(items: list[str]) -> str:
|
|
618
|
+
return ", ".join(items) if items else "none"
|
|
619
|
+
|
|
620
|
+
|
|
621
|
+
def _confidence_icon(confidence: str) -> str:
|
|
622
|
+
return {"high": "✅", "medium": "⚠️", "low": "△"}.get(confidence, "△")
|
|
623
|
+
|
|
624
|
+
|
|
625
|
+
def _select_llm_recommendations(llm_result: Any, *, auto_approve: bool) -> list[str]:
|
|
626
|
+
if auto_approve:
|
|
627
|
+
return [
|
|
628
|
+
recommendation.lexicon_id
|
|
629
|
+
for recommendation in llm_result.recommendations
|
|
630
|
+
if recommendation.confidence in {"high", "medium"}
|
|
631
|
+
]
|
|
632
|
+
|
|
633
|
+
choice = click.prompt("Apply all recommended? [Y/n/select]", default="Y", show_default=False).strip().lower()
|
|
634
|
+
if choice in {"y", "yes", ""}:
|
|
635
|
+
return [
|
|
636
|
+
recommendation.lexicon_id
|
|
637
|
+
for recommendation in llm_result.recommendations
|
|
638
|
+
if recommendation.confidence in {"high", "medium"}
|
|
639
|
+
]
|
|
640
|
+
if choice in {"n", "no"}:
|
|
641
|
+
return []
|
|
642
|
+
if choice != "select":
|
|
643
|
+
click.echo("Invalid selection; suggested lexicons not added.")
|
|
644
|
+
return []
|
|
645
|
+
|
|
646
|
+
raw_numbers = click.prompt("Select recommendation numbers", default="", show_default=False).strip()
|
|
647
|
+
selected: list[str] = []
|
|
648
|
+
for token in re.split(r"[\s,]+", raw_numbers):
|
|
649
|
+
if not token:
|
|
650
|
+
continue
|
|
651
|
+
try:
|
|
652
|
+
index = int(token)
|
|
653
|
+
except ValueError:
|
|
654
|
+
continue
|
|
655
|
+
if 1 <= index <= len(llm_result.recommendations):
|
|
656
|
+
lexicon_id = llm_result.recommendations[index - 1].lexicon_id
|
|
657
|
+
if lexicon_id not in selected:
|
|
658
|
+
selected.append(lexicon_id)
|
|
659
|
+
return selected
|
|
660
|
+
|
|
661
|
+
|
|
562
662
|
@main.group("lexicon")
|
|
563
663
|
def lexicon_cmd() -> None:
|
|
564
664
|
"""Manage bundled lexicon plug-ins."""
|
|
@@ -292,18 +292,23 @@ def _existing_axes_text(project_root: Path) -> str:
|
|
|
292
292
|
|
|
293
293
|
|
|
294
294
|
def _project_scope_phase(project_root: Path) -> tuple[str, str]:
|
|
295
|
+
# cmd_455: default scope = system_implementation matches CoDD's design
|
|
296
|
+
# focus. Projects that want every dimension (including business goals,
|
|
297
|
+
# UAT detail, risk register) opt in via `scope: full` in project_lexicon.yaml.
|
|
298
|
+
from codd.lexicon import DEFAULT_PHASE, DEFAULT_SCOPE
|
|
299
|
+
|
|
295
300
|
for name in ("project_lexicon.yaml", "project_lexicon.yml"):
|
|
296
301
|
path = project_root / name
|
|
297
302
|
if not path.is_file():
|
|
298
303
|
continue
|
|
299
304
|
payload = yaml.safe_load(path.read_text(encoding="utf-8")) or {}
|
|
300
305
|
if not isinstance(payload, Mapping):
|
|
301
|
-
return
|
|
306
|
+
return DEFAULT_SCOPE, DEFAULT_PHASE
|
|
302
307
|
return (
|
|
303
|
-
str(payload.get("scope") or
|
|
304
|
-
str(payload.get("phase") or
|
|
308
|
+
str(payload.get("scope") or DEFAULT_SCOPE),
|
|
309
|
+
str(payload.get("phase") or DEFAULT_PHASE),
|
|
305
310
|
)
|
|
306
|
-
return
|
|
311
|
+
return DEFAULT_SCOPE, DEFAULT_PHASE
|
|
307
312
|
|
|
308
313
|
|
|
309
314
|
def _apply_scope_phase(
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
"""LLM-backed lexicon recommendation from project context."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
import json
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any, Literal, Protocol
|
|
9
|
+
|
|
10
|
+
import yaml
|
|
11
|
+
|
|
12
|
+
from codd.deployment.providers.ai_command import AiCommandError, SubprocessAiCommand
|
|
13
|
+
from codd.init.lexicon_suggest import default_lexicon_root
|
|
14
|
+
from codd.init.stack_detector import StackDetector
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
Confidence = Literal["high", "medium", "low"]
|
|
18
|
+
_CONFIDENCES: set[str] = {"high", "medium", "low"}
|
|
19
|
+
_MAX_DOC_CHARS = 24_000
|
|
20
|
+
_MAX_FILE_CHARS = 4_000
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class AiCommand(Protocol):
|
|
24
|
+
def invoke(self, prompt: str, model: str | None = None) -> str:
|
|
25
|
+
"""Return an AI response for the supplied prompt."""
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@dataclass(frozen=True)
|
|
29
|
+
class LlmLexiconRecommendation:
|
|
30
|
+
lexicon_id: str
|
|
31
|
+
confidence: Confidence
|
|
32
|
+
reason: str
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@dataclass(frozen=True)
|
|
36
|
+
class LlmLexiconResult:
|
|
37
|
+
detected_domain: str
|
|
38
|
+
detected_compliance: list[str]
|
|
39
|
+
detected_tech_stack: list[str]
|
|
40
|
+
detected_integrations: list[str]
|
|
41
|
+
recommendations: list[LlmLexiconRecommendation]
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def llm_recommend_lexicons(
|
|
45
|
+
project_root: Path,
|
|
46
|
+
*,
|
|
47
|
+
ai_command: AiCommand | None = None,
|
|
48
|
+
) -> LlmLexiconResult:
|
|
49
|
+
"""Recommend lexicons via AI, returning an empty result on unusable input."""
|
|
50
|
+
|
|
51
|
+
root = Path(project_root)
|
|
52
|
+
context = _collect_project_context(root)
|
|
53
|
+
if not context["requirements"]:
|
|
54
|
+
return _empty_result()
|
|
55
|
+
|
|
56
|
+
available = _available_lexicons()
|
|
57
|
+
if not available:
|
|
58
|
+
return _empty_result()
|
|
59
|
+
|
|
60
|
+
command = ai_command or SubprocessAiCommand(project_root=root)
|
|
61
|
+
prompt = _build_prompt(context, available)
|
|
62
|
+
try:
|
|
63
|
+
raw_output = command.invoke(prompt)
|
|
64
|
+
payload = json.loads(_extract_json_object(raw_output))
|
|
65
|
+
except (AiCommandError, OSError, TypeError, ValueError, json.JSONDecodeError):
|
|
66
|
+
return _empty_result()
|
|
67
|
+
return _result_from_payload(payload, set(available))
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _collect_project_context(project_root: Path) -> dict[str, Any]:
|
|
71
|
+
requirements = _read_matching_files(
|
|
72
|
+
project_root,
|
|
73
|
+
[
|
|
74
|
+
"requirements.md",
|
|
75
|
+
".codd/requirements.md",
|
|
76
|
+
"codd/requirements.md",
|
|
77
|
+
"docs/requirements.md",
|
|
78
|
+
"docs/requirements*.md",
|
|
79
|
+
"docs/requirements/**/*.md",
|
|
80
|
+
],
|
|
81
|
+
)
|
|
82
|
+
designs = _read_matching_files(
|
|
83
|
+
project_root,
|
|
84
|
+
[
|
|
85
|
+
"design/*.md",
|
|
86
|
+
".codd/design/*.md",
|
|
87
|
+
"codd/design/*.md",
|
|
88
|
+
"docs/design/*.md",
|
|
89
|
+
],
|
|
90
|
+
)
|
|
91
|
+
detection = StackDetector().detect(project_root)
|
|
92
|
+
return {
|
|
93
|
+
"requirements": requirements,
|
|
94
|
+
"designs": designs,
|
|
95
|
+
"tech_stack_hints": detection.stack_hints,
|
|
96
|
+
"detected_signals": detection.detected_signals,
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _read_matching_files(project_root: Path, patterns: list[str]) -> list[dict[str, str]]:
|
|
101
|
+
seen: set[Path] = set()
|
|
102
|
+
files: list[dict[str, str]] = []
|
|
103
|
+
budget = _MAX_DOC_CHARS
|
|
104
|
+
for pattern in patterns:
|
|
105
|
+
for path in sorted(project_root.glob(pattern)):
|
|
106
|
+
if path in seen or not path.is_file():
|
|
107
|
+
continue
|
|
108
|
+
seen.add(path)
|
|
109
|
+
if budget <= 0:
|
|
110
|
+
return files
|
|
111
|
+
text = path.read_text(encoding="utf-8", errors="replace")[: min(_MAX_FILE_CHARS, budget)]
|
|
112
|
+
budget -= len(text)
|
|
113
|
+
files.append({"path": path.relative_to(project_root).as_posix(), "content": text})
|
|
114
|
+
return files
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def _available_lexicons() -> dict[str, str]:
|
|
118
|
+
root = default_lexicon_root()
|
|
119
|
+
available: dict[str, str] = {}
|
|
120
|
+
if not root.is_dir():
|
|
121
|
+
return available
|
|
122
|
+
for manifest in sorted(root.glob("*/manifest.yaml")):
|
|
123
|
+
try:
|
|
124
|
+
payload = yaml.safe_load(manifest.read_text(encoding="utf-8")) or {}
|
|
125
|
+
except (OSError, yaml.YAMLError):
|
|
126
|
+
continue
|
|
127
|
+
if not isinstance(payload, dict):
|
|
128
|
+
continue
|
|
129
|
+
lexicon_id = manifest.parent.name
|
|
130
|
+
if not lexicon_id:
|
|
131
|
+
continue
|
|
132
|
+
available[lexicon_id] = str(payload.get("description") or "").strip()
|
|
133
|
+
return available
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def _build_prompt(context: dict[str, Any], available_lexicons: dict[str, str]) -> str:
|
|
137
|
+
payload = {
|
|
138
|
+
"available_lexicons": available_lexicons,
|
|
139
|
+
"project_context": context,
|
|
140
|
+
"required_output_schema": {
|
|
141
|
+
"detected_domain": "string",
|
|
142
|
+
"detected_compliance": ["string"],
|
|
143
|
+
"detected_tech_stack": ["string"],
|
|
144
|
+
"detected_integrations": ["string"],
|
|
145
|
+
"recommendations": [
|
|
146
|
+
{
|
|
147
|
+
"lexicon_id": "string from available_lexicons keys",
|
|
148
|
+
"confidence": "high | medium | low",
|
|
149
|
+
"reason": "short explanation",
|
|
150
|
+
}
|
|
151
|
+
],
|
|
152
|
+
},
|
|
153
|
+
}
|
|
154
|
+
return (
|
|
155
|
+
"You are a requirements engineer. Analyze the project's documentation and "
|
|
156
|
+
"technology signals. Identify the business domain, compliance obligations, "
|
|
157
|
+
"technology stack, and external integrations using only the supplied project "
|
|
158
|
+
"context. From the available lexicons, recommend the most relevant entries. "
|
|
159
|
+
"Return JSON only. Do not include Markdown fences or prose.\n\n"
|
|
160
|
+
f"{json.dumps(payload, ensure_ascii=False, indent=2)}"
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def _extract_json_object(raw_output: str) -> str:
|
|
165
|
+
text = raw_output.strip()
|
|
166
|
+
if text.startswith("```"):
|
|
167
|
+
lines = text.splitlines()
|
|
168
|
+
if lines and lines[0].startswith("```"):
|
|
169
|
+
lines = lines[1:]
|
|
170
|
+
if lines and lines[-1].strip() == "```":
|
|
171
|
+
lines = lines[:-1]
|
|
172
|
+
text = "\n".join(lines).strip()
|
|
173
|
+
start = text.find("{")
|
|
174
|
+
end = text.rfind("}")
|
|
175
|
+
if start == -1 or end == -1 or end < start:
|
|
176
|
+
raise ValueError("LLM output did not contain a JSON object")
|
|
177
|
+
return text[start : end + 1]
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def _result_from_payload(payload: Any, available_ids: set[str]) -> LlmLexiconResult:
|
|
181
|
+
if not isinstance(payload, dict):
|
|
182
|
+
return _empty_result()
|
|
183
|
+
|
|
184
|
+
recommendations: list[LlmLexiconRecommendation] = []
|
|
185
|
+
seen: set[str] = set()
|
|
186
|
+
rows = payload.get("recommendations", [])
|
|
187
|
+
if isinstance(rows, list):
|
|
188
|
+
for row in rows:
|
|
189
|
+
if not isinstance(row, dict):
|
|
190
|
+
continue
|
|
191
|
+
lexicon_id = str(row.get("lexicon_id") or "").strip()
|
|
192
|
+
confidence = str(row.get("confidence") or "").strip().lower()
|
|
193
|
+
if lexicon_id not in available_ids or confidence not in _CONFIDENCES or lexicon_id in seen:
|
|
194
|
+
continue
|
|
195
|
+
seen.add(lexicon_id)
|
|
196
|
+
recommendations.append(
|
|
197
|
+
LlmLexiconRecommendation(
|
|
198
|
+
lexicon_id=lexicon_id,
|
|
199
|
+
confidence=confidence, # type: ignore[arg-type]
|
|
200
|
+
reason=str(row.get("reason") or "").strip(),
|
|
201
|
+
)
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
return LlmLexiconResult(
|
|
205
|
+
detected_domain=str(payload.get("detected_domain") or "").strip(),
|
|
206
|
+
detected_compliance=_string_list(payload.get("detected_compliance")),
|
|
207
|
+
detected_tech_stack=_string_list(payload.get("detected_tech_stack")),
|
|
208
|
+
detected_integrations=_string_list(payload.get("detected_integrations")),
|
|
209
|
+
recommendations=recommendations,
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def _string_list(value: Any) -> list[str]:
|
|
214
|
+
if not isinstance(value, list):
|
|
215
|
+
return []
|
|
216
|
+
return [str(item).strip() for item in value if str(item).strip()]
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def _empty_result() -> LlmLexiconResult:
|
|
220
|
+
return LlmLexiconResult(
|
|
221
|
+
detected_domain="",
|
|
222
|
+
detected_compliance=[],
|
|
223
|
+
detected_tech_stack=[],
|
|
224
|
+
detected_integrations=[],
|
|
225
|
+
recommendations=[],
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
__all__ = [
|
|
230
|
+
"AiCommand",
|
|
231
|
+
"LlmLexiconRecommendation",
|
|
232
|
+
"LlmLexiconResult",
|
|
233
|
+
"llm_recommend_lexicons",
|
|
234
|
+
]
|
|
@@ -14,7 +14,11 @@ import yaml
|
|
|
14
14
|
SCHEMA_PATH = Path(__file__).parent / "templates" / "lexicon_schema.yaml"
|
|
15
15
|
LEXICON_FILENAME = "project_lexicon.yaml"
|
|
16
16
|
REQUIRED_ARTIFACT_SOURCES = {"ai_derived", "user_override", "default_template"}
|
|
17
|
-
|
|
17
|
+
# cmd_455: CoDD's responsibility is system-implementation coherence. Business
|
|
18
|
+
# concerns (goal/KPI, acceptance/UAT detail, risk register) belong upstream of
|
|
19
|
+
# the DAG and should not surface as findings unless the project opts in
|
|
20
|
+
# explicitly with `scope: full` or `scope: business_only`.
|
|
21
|
+
DEFAULT_SCOPE = "system_implementation"
|
|
18
22
|
DEFAULT_PHASE = "production"
|
|
19
23
|
LEGACY_SUGGESTED_LEXICONS_WARNING = (
|
|
20
24
|
"suggested_lexicons is deprecated, renamed to extends; auto-merged"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/defaults/runtime_capability_inference.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codd_dev-2.6.1 → codd_dev-2.8.0}/codd/deployment/providers/verification/assertion_handlers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|