fensu-cli 0.5.2__tar.gz → 0.7.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.
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/Cargo.lock +1 -1
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/PKG-INFO +1 -1
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/Cargo.toml +1 -1
- fensu_cli-0.7.0/crates/fensu-cli/assets/catalogue.json +1 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/helpers/memory_execution.rs +1 -1
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/main/check.rs +1 -1
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/main/init.rs +1 -1
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/main/rule.rs +1 -1
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/main/run_cli.rs +3 -2
- fensu_cli-0.5.2/crates/fensu-cli/src/skills/helpers/context/exceptions.rs → fensu_cli-0.7.0/crates/fensu-cli/src/configuration/helpers/exception_targets.rs +7 -18
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/configuration/helpers/mod.rs +3 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/configuration/helpers/parsing.rs +1 -0
- fensu_cli-0.7.0/crates/fensu-cli/src/configuration/helpers/roots.rs +30 -0
- fensu_cli-0.7.0/crates/fensu-cli/src/configuration/helpers/scopes.rs +34 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/configuration/helpers/validation.rs +4 -14
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/configuration/main/mod.rs +2 -0
- fensu_cli-0.7.0/crates/fensu-cli/src/configuration/main/validate_document.rs +10 -0
- fensu_cli-0.7.0/crates/fensu-cli/src/configuration/main/validate_exception_targets.rs +11 -0
- fensu_cli-0.7.0/crates/fensu-cli/src/helpers/catalogue/mod.rs +1 -0
- fensu_cli-0.5.2/crates/fensu-cli/src/helpers/check_evaluation.rs → fensu_cli-0.7.0/crates/fensu-cli/src/helpers/check/evaluation.rs +17 -9
- fensu_cli-0.7.0/crates/fensu-cli/src/helpers/check/exceptions.rs +114 -0
- fensu_cli-0.5.2/crates/fensu-cli/src/helpers/check_execution.rs → fensu_cli-0.7.0/crates/fensu-cli/src/helpers/check/execution.rs +27 -9
- fensu_cli-0.7.0/crates/fensu-cli/src/helpers/check/mod.rs +7 -0
- fensu_cli-0.5.2/crates/fensu-cli/src/helpers/check_policy.rs → fensu_cli-0.7.0/crates/fensu-cli/src/helpers/check/policy.rs +0 -32
- fensu_cli-0.5.2/crates/fensu-cli/src/helpers/check_project.rs → fensu_cli-0.7.0/crates/fensu-cli/src/helpers/check/project.rs +1 -1
- fensu_cli-0.7.0/crates/fensu-cli/src/helpers/hosting/mod.rs +1 -0
- fensu_cli-0.7.0/crates/fensu-cli/src/helpers/init/mod.rs +2 -0
- fensu_cli-0.7.0/crates/fensu-cli/src/helpers/init/packages.rs +90 -0
- fensu_cli-0.5.2/crates/fensu-cli/src/helpers/init.rs → fensu_cli-0.7.0/crates/fensu-cli/src/helpers/init/run.rs +74 -9
- fensu_cli-0.7.0/crates/fensu-cli/src/helpers/mod.rs +5 -0
- fensu_cli-0.7.0/crates/fensu-cli/src/helpers/reporting/mod.rs +1 -0
- {fensu_cli-0.5.2/crates/fensu-cli/src/helpers → fensu_cli-0.7.0/crates/fensu-cli/src/helpers/reporting}/render.rs +4 -4
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/lib.rs +3 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/mapping/helpers/index.rs +1 -1
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/models.rs +4 -3
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/content/rendering.rs +1 -1
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/context/build.rs +3 -1
- fensu_cli-0.7.0/crates/fensu-cli/src/skills/helpers/context/exceptions.rs +16 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/context/selection.rs +3 -2
- fensu_cli-0.7.0/crates/fensu-cli/src/tests/render.rs +53 -0
- fensu_cli-0.7.0/crates/fensu-cli/src/tests/test_types.rs +7 -0
- fensu_cli-0.7.0/crates/fensu-cli/src/tests.rs +4 -0
- fensu_cli-0.7.0/crates/fensu-cli/tests/command/check_exceptions.rs +214 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/tests/command/check_policy.rs +14 -19
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/tests/command/helpers.rs +11 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/tests/command/test_types.rs +16 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/tests/command.rs +2 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/models.rs +9 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/naming/mod.rs +1 -0
- fensu_cli-0.7.0/crates/fensu-facts/src/facts/helpers/naming/owner_symbols.rs +87 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/extension/helpers/core_rule_bindings.rs +2 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/helpers/tests/layout.rs +23 -15
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/models.rs +1 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/tests/rules/helpers.rs +1 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/tests/rules/test_types.rs +9 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/pyproject.toml +1 -1
- fensu_cli-0.5.2/crates/fensu-cli/assets/catalogue.json +0 -1
- fensu_cli-0.5.2/crates/fensu-cli/src/helpers/mod.rs +0 -10
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/Cargo.toml +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/README.md +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/assets/python.gitignore +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/assets/skills_invariant.json +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/build.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/constants.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/helpers/map_parsing.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/helpers/memory_graph_rendering.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/helpers/memory_help.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/helpers/memory_human_rendering.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/helpers/memory_parsing.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/helpers/memory_structured_rendering.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/helpers/memory_values.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/helpers/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/main/help.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/main/map.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/main/memory.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/main/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/main/skills.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/models.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/configuration/helpers/discovery.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/configuration/helpers/exceptions.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/configuration/helpers/loading.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/configuration/main/custom_rules.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/configuration/main/load.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/configuration/main/load_optional.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/configuration/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/constants.rs +0 -0
- /fensu_cli-0.5.2/crates/fensu-cli/src/helpers/rule.rs → /fensu_cli-0.7.0/crates/fensu-cli/src/helpers/catalogue/metadata.rs +0 -0
- {fensu_cli-0.5.2/crates/fensu-cli/src/helpers → fensu_cli-0.7.0/crates/fensu-cli/src/helpers/check}/cache.rs +0 -0
- /fensu_cli-0.5.2/crates/fensu-cli/src/helpers/check_cleanup.rs → /fensu_cli-0.7.0/crates/fensu-cli/src/helpers/check/cleanup.rs +0 -0
- {fensu_cli-0.5.2/crates/fensu-cli/src/helpers → fensu_cli-0.7.0/crates/fensu-cli/src/helpers/hosting}/process.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/main.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/mapping/constants.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/mapping/helpers/cache.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/mapping/helpers/decoding.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/mapping/helpers/execution.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/mapping/helpers/identity.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/mapping/helpers/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/mapping/helpers/project.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/mapping/helpers/render.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/mapping/helpers/tree.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/mapping/helpers/tree_policy.inc +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/mapping/main/map.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/mapping/main/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/mapping/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/mapping/models.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/command/execution.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/command/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/content/discovery.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/content/fingerprint.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/content/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/content/option_rendering.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/content/sections.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/context/identity.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/context/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/context/option_validation.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/context/options.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/installation/filesystem.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/installation/freshness.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/installation/install.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/installation/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/installation/plan.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/installation/publication.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/installation/transaction.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/helpers/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/main/catalogue.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/main/core_freshness.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/main/execute.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/main/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/main/skills.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/skills/models.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/tests/command/check_cleanup.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/tests/command/commands.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/tests/mapping/commands.inc +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/tests/mapping/commands.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/tests/mapping/helpers.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/tests/mapping.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/tests/skills/commands.inc +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/tests/skills/commands.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/tests/skills/helpers.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/tests/skills/test_types.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/tests/skills.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/Cargo.toml +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/constants.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/helpers/conversion/annotations.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/helpers/conversion/contracts.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/helpers/conversion/declarations.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/helpers/conversion/functions.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/helpers/conversion/harness.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/helpers/conversion/hygiene.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/helpers/conversion/mapping.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/helpers/conversion/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/helpers/conversion/references.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/helpers/conversion/rule_authoring.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/helpers/conversion/state.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/helpers/gateway/bindings.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/helpers/gateway/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/helpers/gateway/model_types.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/helpers/gateway/repository_bindings.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/helpers/gateway/rule_authoring_bindings.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/helpers/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/main/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/main/register_module.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/extension/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/annotations/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/annotations/visitor.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/contracts/category.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/contracts/display.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/contracts/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/contracts/returns.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/contracts/rows.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/control/conditionals.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/control/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/declarations/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/declarations/rows.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/harness/calls.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/harness/dimensions.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/harness/functions.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/harness/imports.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/harness/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/hygiene/checks.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/hygiene/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/metrics/functions.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/metrics/lookups.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/metrics/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/metrics/mutations.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/naming/names.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/project/calls.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/project/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/references/events.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/references/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/references/test_shape.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/rule_authoring/literals.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/rule_authoring/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/rule_authoring/mutations.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/rule_authoring/ownership.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/rule_authoring/references.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/shape/breadth.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/shape/children.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/shape/expression_children.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/shape/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/shape/nodes.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/shape/spans.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/shape/statement_children.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/state/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/state/resolution.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/state/scopes.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/wording/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/helpers/wording/text.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/enumerate_nodes.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/extract_annotations.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/extract_class_declarations.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/extract_comments.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/extract_control_flow.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/extract_dataclasses.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/extract_evaluate_rule_calls.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/extract_function_contracts.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/extract_functions.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/extract_hygiene.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/extract_module_declarations.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/extract_outer_state_mutations.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/extract_parameter_mutation_occurrences.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/extract_parameter_mutations.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/extract_project_facts.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/extract_references.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/extract_rule_calls.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/extract_rule_references.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/extract_test_functions.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/extract_test_module.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/main/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/mapping/constants.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/mapping/helpers/classes.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/mapping/helpers/expressions.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/mapping/helpers/extraction.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/mapping/helpers/functions.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/mapping/helpers/imports.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/mapping/helpers/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/mapping/main/extract_mapping_declarations.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/mapping/main/extract_mapping_facts.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/mapping/main/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/mapping/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/mapping/models.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/models.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/facts/types.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/lib.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/parsing/helpers/failures.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/parsing/helpers/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/parsing/main/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/parsing/main/parse_expression_strict.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/parsing/main/parse_strict.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/parsing/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/parsing/models.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/positions/helpers/line_index.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/positions/helpers/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/positions/main/index_lines.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/positions/main/locate_offset.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/positions/main/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/positions/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/positions/models.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/snapshot/constants.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/snapshot/helpers/matching.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/snapshot/helpers/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/snapshot/helpers/observation_index.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/snapshot/helpers/repository_observation_index.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/snapshot/helpers/repository_paths.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/snapshot/main/build_repository_observation_index.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/snapshot/main/hash_files.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/snapshot/main/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/snapshot/main/walk_python_files.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/snapshot/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/src/snapshot/models.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/tests/facts/enumerate.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/tests/facts/mapping.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/tests/facts/rule_authoring.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/tests/facts/test_types.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/tests/facts.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/tests/parsing/strict.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/tests/parsing/test_types.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/tests/parsing.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/tests/positions/locate.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/tests/positions/test_types.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/tests/positions.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/tests/snapshot/hashing.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/tests/snapshot/helpers.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/tests/snapshot/observations.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/tests/snapshot/test_types.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/tests/snapshot/walk.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-facts/tests/snapshot.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/Cargo.toml +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/corpus/helpers/loading.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/corpus/helpers/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/corpus/main/load_discovered_memory_corpus.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/corpus/main/load_memory_corpus.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/corpus/main/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/corpus/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/corpus/models.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/corpus/types.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/constants.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/errors.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/archival/archive.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/archival/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/publication/database.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/publication/documents.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/publication/lists.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/publication/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/publication/references.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/publication/sections.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/publication/skills.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/publication/streaming.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/publication/values.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/querying/graph_loading.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/querying/graphs.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/querying/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/querying/overviews.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/querying/queries.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/querying/query_values.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/reporting/diagnostics.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/reporting/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/reporting/schema_core.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/reporting/schema_markdown.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/reporting/schema_metadata.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/reporting/schema_skill_view.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/reporting/schema_views.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/reporting/summaries.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/helpers/reporting/synchronization.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/main/archive_memory.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/main/check_memory.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/main/memory_overview.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/main/memory_relation_schema.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/main/memory_schema.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/main/memory_schema_sql.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/main/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/main/probe_dependencies.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/main/query_memory_graph.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/main/query_memory_index.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/main/rebuild_memory_index.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/main/summarize_memory.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/main/sync_memory_index.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/engine/models.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/graph/helpers/cycles.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/graph/helpers/dependencies.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/graph/helpers/document_targets.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/graph/helpers/heading_targets.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/graph/helpers/link_resolution.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/graph/helpers/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/graph/main/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/graph/main/resolve_memory_graph.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/graph/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/graph/models.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/graph/types.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/lib.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/markdown/constants.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/markdown/helpers/assembly.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/markdown/helpers/blocks.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/markdown/helpers/headings.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/markdown/helpers/line_index.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/markdown/helpers/links.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/markdown/helpers/lists.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/markdown/helpers/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/markdown/helpers/obsidian.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/markdown/helpers/text.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/markdown/main/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/markdown/main/parse_markdown.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/markdown/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/markdown/models.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/markdown/types.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/source/constants.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/source/helpers/bootstrap.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/source/helpers/collisions.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/source/helpers/discovery.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/source/helpers/documents.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/source/helpers/filesystem.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/source/helpers/git_tracking.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/source/helpers/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/source/helpers/skills.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/source/helpers/tree.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/source/helpers/validation.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/source/main/bootstrap_memory.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/source/main/discover_memory.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/source/main/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/source/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/source/models.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/src/source/types.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/corpus/helpers.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/corpus/loading.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/corpus/test_types.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/corpus.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/engine/archive.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/engine/bootstrap.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/engine/check.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/engine/dependencies.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/engine/graph_query.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/engine/helpers.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/engine/list_batch/list_batches.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/engine/list_batch/test_types.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/engine/overview.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/engine/performance.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/engine/query.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/engine/schema.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/engine/streaming/helpers.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/engine/streaming.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/engine/summary.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/engine/sync.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/engine/test_types.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/engine.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/graph/dependencies.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/graph/helpers.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/graph/resolution.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/graph/test_types.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/graph.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/markdown/code_blocks.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/markdown/links.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/markdown/lists.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/markdown/structure.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/markdown/test_types.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/markdown.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/source/collisions.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/source/discovery.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/source/git_worktrees.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/source/helpers.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/source/symlinks.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/source/test_types.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-memory/tests/source.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/Cargo.toml +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/constants.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/helpers/bindings.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/helpers/database.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/helpers/generation.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/helpers/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/helpers/publication.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/helpers/publication_merge.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/helpers/records.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/helpers/replay.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/helpers/schema.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/helpers/schema_values.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/helpers/storage.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/main/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/main/register_cache.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/main/replay_generation.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/models.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/tests/helpers.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/tests/records.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/tests/storage.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/tests/test_types.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/tests.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/cache/types.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/extension/constants.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/extension/helpers/execution_planning.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/extension/helpers/memory_bindings.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/extension/helpers/memory_conversion.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/extension/helpers/memory_registration.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/extension/helpers/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/extension/main/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/extension/main/register_module.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/extension/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/lib.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/constants.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/helpers/annotations/annotations.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/helpers/hygiene/hygiene.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/helpers/layers/layers.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/helpers/layers/local.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/helpers/layers/project.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/helpers/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/helpers/naming/naming.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/helpers/naming_globs/naming_globs.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/helpers/project_queries/project_queries.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/helpers/roles/declarations.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/helpers/roles/paths.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/helpers/roles/project_layout.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/helpers/roles/project_layout_paths.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/helpers/roles/project_layout_queries.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/helpers/roles/roles.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/helpers/roles/surfaces.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/helpers/shape/shape.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/helpers/tests/names.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/helpers/tests/tests.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/main/evaluate_core_rules.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/main/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/main/plan_core_rule_queries.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/src/rules/mod.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/tests/extension/memory_conversion.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/tests/extension/test_types.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/tests/rules/contracts.rs +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/tests/rules/fixtures/core_rules.jsonl +0 -0
- {fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-native/tests/rules.rs +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{"code":"FFA001","family":"annotations","slug":"parameter-annotation","message":"function parameters must define type annotations","remediation":"Annotate every parameter with the value type accepted by the function.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFA002","family":"annotations","slug":"return-annotation","message":"functions must define return type annotations","remediation":"Declare the returned value type, using None when the function returns no value.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFA101","family":"annotations","slug":"module-variable-annotation","message":"module-level variables must define type annotations","remediation":"Add an explicit annotation to the first module-level assignment.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFA102","family":"annotations","slug":"class-attribute-annotation","message":"class attributes must define type annotations","remediation":"Annotate the class attribute where it is first assigned.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFA103","family":"annotations","slug":"local-variable-annotation","message":"local variables must define type annotations on first binding unless assigned a scalar literal","remediation":"Annotate first bindings whose type is not evident from a number, string, bool, bytes, or f-string literal.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFL001","family":"layers","slug":"absolute-imports-only","message":"use absolute imports; relative imports hide package boundaries","remediation":"Replace relative imports with an absolute import path.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFL002","family":"layers","slug":"no-star-imports","message":"star imports hide names from dependency-boundary analysis","remediation":"Import each required name explicitly.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFL101","family":"layers","slug":"no-sibling-package-internals","message":"subpackage code must not import sibling internals","remediation":"Publish the dependency through the owning sibling's main/ entry or role files.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFL102","family":"layers","slug":"no-cross-package-internals","message":"cross-package imports must use public surfaces, not helpers or internals","remediation":"Import from classes, models, types, constants, exceptions, or a thin main/ entry.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFL103","family":"layers","slug":"no-internal-public-surface-imports","message":"internal code must import from the owning module, not the bare package","remediation":"Import from the concrete owning module below the package surface.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFL104","family":"layers","slug":"no-cross-domain-private-main-imports","message":"domain-private main entries may only be imported within their owning domain","remediation":"Remove the leading underscore to publish the main entry, or route the caller through a public main entry owned by the target domain.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFL105","family":"layers","slug":"public-main-entry-external-use","message":"public main entries must have an importer outside their owning domain","remediation":"Prefix the entry module filename with '_' until another domain or tooling imports it.","severity":"error","enabled_by_default":true,"execution_owner":"project"},{"code":"FFL110","family":"layers","slug":"no-cross-file-use-of-helper-private-class","message":"helper-private classes are file-local details; move shared classes to classes/","remediation":"If another module needs this class, move it to the owning classes/ package.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFL301","family":"layers","slug":"no-runtime-imports-from-tooling","message":"runtime code must not import from tooling modules","remediation":"Move reusable logic into the runtime package or keep the dependency inside tooling.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFH001","family":"hygiene","slug":"single-line-docstrings","message":"docstrings must be a single line; move extended explanation into docs or tests","remediation":"Keep one concise summary line and move extended rationale into documentation or tests.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFH002","family":"hygiene","slug":"no-standalone-comments","message":"standalone comments are not allowed; prefer clear names or docs/tests","remediation":"Replace the comment with clearer names or move lasting explanation into documentation or tests.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFH003","family":"hygiene","slug":"no-raw-builtin-raise","message":"runtime code must raise structured errors instead of raw built-in exceptions","remediation":"Raise a domain-specific exception from exceptions.py with a stable actionable message.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFH004","family":"hygiene","slug":"no-assert-in-runtime","message":"runtime code must not use assert for invariants; raise a structured error","remediation":"Replace assert with an explicit guard that raises a domain-specific exception.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFH005","family":"hygiene","slug":"no-swallowed-exception-probe","message":"runtime code must not swallow broad exceptions as existence probe answers","remediation":"Use an explicit metadata or existence check, or catch only the expected exception and preserve failures.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFH006","family":"hygiene","slug":"no-complex-comprehensions-in-tooling","message":"nested or multi-generator comprehensions hide control flow and data shapes","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFH007","family":"hygiene","slug":"no-unnamed-string-decisions","message":"string literals must not directly control comparison behavior","remediation":"Name the decision value in constants.py or compare against an enum member so the branch expresses the concept it represents.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFH008","family":"hygiene","slug":"no-magic-numeric-comparisons","message":"non-canonical numeric literals must not directly control comparisons","remediation":"Name the threshold or sentinel in constants.py and compare against that name; only -1, 0, and 1 are self-explanatory comparison values.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFH009","family":"hygiene","slug":"no-import-time-side-effects","message":"runtime and tooling modules must not execute standalone calls during import","remediation":"Move the operation into an explicit function or assign a pure constructor result.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFS001","family":"shape","slug":"too-many-statements","message":"main functions must stay phase-shaped and below the statement limit","remediation":"Extract cohesive phases into helpers that return explicit result models.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFS002","family":"shape","slug":"too-many-distinct-calls","message":"main functions must not coordinate too many distinct callees","remediation":"Group related work into named phase helpers and keep main/ as a short ordered flow.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFS003","family":"shape","slug":"too-many-locals","message":"main functions must not juggle too many local variables","remediation":"Let each extracted phase own its intermediates and return one structured result.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFS010","family":"shape","slug":"max-arguments","message":"functions must stay below the configured argument limit","remediation":"Reduce the function's responsibility or group cohesive inputs into a typed model.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFS011","family":"shape","slug":"max-statements-global","message":"functions must stay below the global statement limit","remediation":"Split the function at a meaningful phase boundary with explicit inputs and outputs.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFS101","family":"shape","slug":"meaningful-project-result-discarded","message":"main orchestrators must consume meaningful project-local call results","remediation":"Assign, return, or explicitly discard the phase result with _ = call(...).","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFS102","family":"shape","slug":"parameter-mutation-in-phase-helpers","message":"helpers must return values instead of mutating parameters","remediation":"Return a new or updated value so dataflow remains visible to the caller.","severity":"error","enabled_by_default":false,"execution_owner":"file"},{"code":"FFS110","family":"shape","slug":"default-mutation-return","message":"functions that mutate parameters must return every mutated parameter","remediation":"Return each mutated parameter explicitly, or avoid parameter mutation and return a new value.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFS120","family":"shape","slug":"keyword-only-arguments","message":"functions beyond the parameter threshold must be entirely keyword-only","remediation":"Insert * before the first non-receiver parameter so every call argument names its meaning.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFS130","family":"shape","slug":"no-outer-state-mutation","message":"functions must not mutate module-global or closure-captured state","remediation":"Pass state explicitly and return the updated value instead of mutating outer scope.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFS131","family":"shape","slug":"no-complex-comprehensions","message":"nested or multi-generator comprehensions hide control flow and data shapes","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFS201","family":"shape","slug":"mutable-result-model","message":"dataclass result models must be frozen","remediation":"Declare the shared result model with @dataclass(frozen=True).","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT001","family":"tests","slug":"test-layout","message":"tests must live under a configured test root and supported scope","remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT002","family":"tests","slug":"test-scope","message":"test scope must be one of the configured test scopes","remediation":"Move the test beneath a configured test root and one of the configured test_scopes.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT003","family":"tests","slug":"test-mirrored-root","message":"test directories must mirror a configured runtime or tooling root","remediation":"Mirror the complete configured source or tooling path beneath the test scope.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT004","family":"tests","slug":"src-mirror-depth","message":"runtime tests must include an area beneath the configured source root","remediation":"Move the test beneath the package and source area it exercises.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT005","family":"tests","slug":"src-package-exists","message":"runtime tests must mirror a configured source package","remediation":"Correct the mirrored package name or move the test to the package it exercises.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT006","family":"tests","slug":"src-area-exists","message":"runtime tests must mirror an existing source package area","remediation":"Correct the mirrored area path so it matches the runtime module location.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT007","family":"tests","slug":"scripts-mirror-depth","message":"tooling tests must include an area beneath the configured tooling root","remediation":"Move the test beneath the configured tooling area it exercises.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT008","family":"tests","slug":"scripts-area-exists","message":"tooling tests must mirror an existing configured tooling area","remediation":"Correct the mirrored area path so it matches the tooling location.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT101","family":"tests","slug":"init-module-empty","message":"test package __init__.py files must be empty or docstring-only","remediation":"Remove runtime declarations from __init__.py and import them from their owning module.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT102","family":"tests","slug":"absolute-imports","message":"tests must use absolute imports","remediation":"Replace the relative import with the full tests or application package path.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT103","family":"tests","slug":"no-top-level-helpers","message":"test modules may contain only tests, imports, and declarations","remediation":"Move reusable functions into the local helpers.py module.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT104","family":"tests","slug":"no-if-in-tests","message":"tests and local test helpers must not contain conditional control flow","remediation":"Use parametrized cases when setup and assertions remain branch-free; otherwise split the behavior into separate test functions. Keep local test helpers deterministic with per-variant functions or dataclass-driven case data.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT105","family":"tests","slug":"private-constant-order","message":"private test constants must appear before test functions","remediation":"Move the private constant above the first test so module setup is visible before behavior.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT106","family":"tests","slug":"no-complex-comprehensions","message":"nested or multi-generator comprehensions hide control flow and data shapes","remediation":"Extract a named helper when the transformation has a coherent purpose. For one-off local logic, use simple statements with named intermediate values instead of nested comprehension control flow.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT201","family":"tests","slug":"test-types-description","message":"test-case dataclasses must define a description field","remediation":"Add description: str so parametrized cases explain the behavior they represent.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT202","family":"tests","slug":"test-types-expected-field","message":"test-case dataclasses must define at least one expected_ field","remediation":"Name expected outcomes with an expected_ prefix and assert against them in the test.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT203","family":"tests","slug":"local-test-types-import","message":"tests must import test-case types from their local _test_types.py","remediation":"Move the dataclass beside the test and import it through the mirrored absolute path.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT204","family":"tests","slug":"local-test-types-file","message":"test directories must provide a local _test_types.py","remediation":"Create _test_types.py beside the test. Custom-rule tests should define a local wrapper dataclass there rather than parametrizing directly with RuleCase.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT301","family":"tests","slug":"test-file-name","message":"test modules must use a test_ filename","remediation":"Rename the module to test_<behavior>.py.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT302","family":"tests","slug":"test-function-name","message":"test functions must use test_given_<state>_when_<action>_then_<outcome>","remediation":"Rename the test so its precondition, action, and expected behavior are explicit.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT401","family":"tests","slug":"dataclass-parametrize","message":"tests must use dataclass-backed pytest parameterization","remediation":"Add @pytest.mark.parametrize with local test_case dataclass instances.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT402","family":"tests","slug":"accepts-test-case","message":"parametrized tests must accept a test_case argument","remediation":"Name the parameter test_case and read inputs and expectations from that object.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT403","family":"tests","slug":"test-case-annotation","message":"test_case parameters must use a local test-case dataclass annotation","remediation":"Annotate test_case with a dataclass imported from the local _test_types.py.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT404","family":"tests","slug":"expected-field-assertion","message":"tests must assert against an expected_ field from test_case","remediation":"Store the expected outcome on test_case and reference it in a behavior assertion.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT405","family":"tests","slug":"parametrize-arguments","message":"pytest parametrize decorators must define parameter names and values","remediation":"Pass both the parameter-name string and the case sequence to parametrize.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT406","family":"tests","slug":"parametrize-test-case","message":"pytest parametrize must expose cases through the test_case parameter","remediation":"Use \"test_case\" as the parametrize parameter name.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT407","family":"tests","slug":"parametrize-ids","message":"pytest parametrize decorators must define readable case ids","remediation":"Set ids to the case descriptions, normally with ids=lambda case: case.description.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT408","family":"tests","slug":"inline-parametrize-values","message":"pytest parametrize values must be a visible list, tuple, or local comprehension","remediation":"Inline the case sequence in @pytest.mark.parametrize so its cases are visible beside the test.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT411","family":"tests","slug":"nonempty-parametrize-values","message":"pytest parametrize case sequences must not be empty","remediation":"Add at least one behavior case or remove the test until a real case exists.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT412","family":"tests","slug":"no-dict-test-cases","message":"pytest cases must use typed dataclasses instead of dictionaries","remediation":"Define a local frozen test-case dataclass and construct one instance per case.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT413","family":"tests","slug":"local-test-case-constructors","message":"pytest cases must construct dataclasses from the local _test_types.py","remediation":"Parametrize using a dataclass imported from local _test_types.py. For framework harness inputs such as RuleCase, store their fields in the local dataclass and construct the framework object inside the test.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFT414","family":"tests","slug":"description-lambda-ids","message":"pytest case ids must come from each test case description","remediation":"Use ids=lambda case: case.description so failures identify the behavior clearly.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR001","family":"roles","slug":"models-only-models","message":"models role files may contain only structured runtime models","remediation":"Move functions and non-model declarations to their owning role module.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR002","family":"roles","slug":"types-only-types","message":"types role files may contain only type-layer declarations","remediation":"Move runtime values and functions out of types.py into their owning runtime role.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR003","family":"roles","slug":"constants-only-constants","message":"constants role files may contain only assignments and imports","remediation":"Move functions and classes out of constants.py into their owning role module.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR004","family":"roles","slug":"exceptions-only-exceptions","message":"exceptions role files may contain only custom exceptions","remediation":"Move non-exception declarations out of exceptions.py into their owning role.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR101","family":"roles","slug":"model-declaration-outside-models","message":"structured runtime models must be defined in the models role","remediation":"Move the dataclass or structured model into models.py or a models/ package.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR102","family":"roles","slug":"type-declaration-outside-types","message":"type-layer declarations must be defined in the types role","remediation":"Move the protocol, enum, TypedDict, or public type alias into types.py.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR103","family":"roles","slug":"constant-outside-constants","message":"public uppercase constants must be defined in the constants role","remediation":"Move the public constant into constants.py and import it from there.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR104","family":"roles","slug":"exception-declaration-outside-exceptions","message":"custom exceptions must be defined in the exceptions role","remediation":"Move the exception class into exceptions.py or an exceptions/ package.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR201","family":"roles","slug":"banned-generic-filename","message":"generic filenames hide module ownership","remediation":"Rename the module after the domain concept or operation it owns.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR202","family":"roles","slug":"helpers-module-name","message":"use an _helpers package instead of helpers.py","remediation":"Replace helpers.py with an _helpers/ package of specifically named modules.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR203","family":"roles","slug":"classes-module-name","message":"use a classes package instead of classes.py","remediation":"Replace classes.py with a classes/ package containing one class per module.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR204","family":"roles","slug":"banned-generic-package-name","message":"runtime package directories must identify an owner","remediation":"Rename the package after the business domain or technical capability it owns.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR205","family":"roles","slug":"helpers-classes-file-private","message":"plain classes in _helpers modules must be file-private","remediation":"Prefix a file-local helper class with _, or move a shared class into classes/.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR301","family":"roles","slug":"helpers-package-layout","message":"_helpers/ packages must use bounded flat-or-grouped containers","remediation":"Keep _helpers/ flat or group every module into bounded shallow buckets; do not mix modules and Python-containing buckets in one container.","severity":"error","enabled_by_default":true,"execution_owner":"package"},{"code":"FFR302","family":"roles","slug":"main-package-layout","message":"main/ packages must use bounded flat-or-grouped orchestration containers","remediation":"Keep main/ flat or group every entry into bounded shallow buckets; do not mix modules and Python-containing buckets in one container.","severity":"error","enabled_by_default":true,"execution_owner":"package"},{"code":"FFR303","family":"roles","slug":"helpers-reserved-role-filenames","message":"_helpers/ packages must not contain reserved role filenames","remediation":"Rename the helper module after its specific operation, or move role-owned declarations to the corresponding sibling models, types, constants, or exceptions role.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR304","family":"roles","slug":"nested-direct-modules","message":"nested runtime packages may contain only role-oriented direct modules","remediation":"Move additional implementation modules under the package's _helpers/ boundary.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR305","family":"roles","slug":"nested-direct-subpackages","message":"nested runtime packages must use explicit role boundaries","remediation":"Move feature subpackages under _helpers/ or use a supported role such as main/ or classes/.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR306","family":"roles","slug":"top-level-domain-shape","message":"top-level domains must be either role leaves or subdomain branches","remediation":"Keep direct role content in a leaf domain, or move it into a named subdomain when the domain contains subdomains.","severity":"error","enabled_by_default":true,"execution_owner":"domain"},{"code":"FFR307","family":"roles","slug":"top-level-direct-modules","message":"top-level domains must not contain ad hoc direct modules","remediation":"Move the module under a direct role boundary or into an owning named subdomain.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR308","family":"roles","slug":"shared-domain-prefix","message":"sibling domains must not encode one parent domain through a shared name prefix","remediation":"Create one parent domain from the shared prefix and move each remaining suffix beneath it as a named subdomain.","severity":"error","enabled_by_default":true,"execution_owner":"scope"},{"code":"FFR309","family":"roles","slug":"leaf-main-boundary","message":"leaf runtime domains and subdomains must expose meaningful behavior through main/","remediation":"Add a focused main/ entry module only when the leaf owns behavior; otherwise move passive declarations into the closest domain or subdomain whose main/ behavior owns and uses them.","severity":"error","enabled_by_default":true,"execution_owner":"leaf"},{"code":"FFR401","family":"roles","slug":"entry-module-shape","message":"main/ entry modules must expose one focused public function","remediation":"Keep only imports, one public entry function, and at most two small private glue functions; move phase logic to _helpers/.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR402","family":"roles","slug":"init-module-empty","message":"nested __init__.py files must be empty or docstring-only","remediation":"Remove runtime declarations and import from the concrete owning module instead.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR403","family":"roles","slug":"no-reexport-shim","message":"internal modules must not exist only to re-export imports","remediation":"Import the implementation module directly or expose a deliberate API through an approved public surface.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR404","family":"roles","slug":"no-internal-helper-exports","message":"_helpers/ modules must not publish an __all__ surface","remediation":"Keep _helpers/ internal and expose public behavior through main/, classes/, models, types, constants, or exceptions.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR405","family":"roles","slug":"main-entry-name-collision","message":"main/ cannot define a module and package with the same entry name","remediation":"Choose either the flat entry module or the same-named package and remove the competing surface.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR406","family":"roles","slug":"public-surface-shape","message":"root package surfaces may contain only imports and one __all__ declaration","remediation":"Move runtime behavior into an owning module and keep the root __init__.py as a deliberate import surface.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR501","family":"roles","slug":"classes-one-class-per-module","message":"classes/ modules must define exactly one top-level class","remediation":"Split additional classes into separately named modules under classes/.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR502","family":"roles","slug":"helpers-package-shape","message":"_helpers/ packages must contain no main.py orchestration entrypoints","remediation":"Move main.py orchestration into the sibling main/ role; helper depth is enforced by FFR301.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR503","family":"roles","slug":"private-definition-ordering","message":"private constants and dataclasses must appear before top-level functions","remediation":"Move private module declarations above the first function so readers see module state before behavior.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR601","family":"roles","slug":"source-file-line-count","message":"source files must stay below the configured line limit","remediation":"Split the file by a cohesive role or concern instead of extracting arbitrary numbered fragments.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR701","family":"roles","slug":"tooling-entrypoint-shape","message":"direct scripts must remain focused command adapters","remediation":"Keep one public main(), optional private _parse_args() and _build_parser(), and move implementation into a scripts/<tool>/main/ entry.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR702","family":"roles","slug":"tooling-entrypoint-delegation","message":"direct scripts must delegate to an imported main/ entrypoint","remediation":"Import a typed entry function from a runtime or scripts/<tool>/main/ module and return its result from main().","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR703","family":"roles","slug":"tooling-entrypoint-line-count","message":"direct scripts must stay below the configured line limit","remediation":"Move command implementation into a named tooling or runtime package.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR704","family":"roles","slug":"rules-role-content","message":"tooling rules/ modules may contain only decorated rule declarations","remediation":"Keep imports and @rule functions here; move supporting implementation into _helpers/, classes/, models.py, types.py, constants.py, or exceptions.py.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR705","family":"roles","slug":"tooling-package-layout","message":"tool packages must organize implementation through explicit roles","remediation":"Use main/, _helpers/, classes/, rules/, models.py, types.py, constants.py, or exceptions.py directly beneath scripts/<tool>/.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR706","family":"roles","slug":"descriptive-rule-module-names","message":"rule module filenames must describe their policy rather than repeat one rule code","remediation":"Rename the module after the policy or rule family it implements, using a name such as conditional_test_flow.py instead of fft104.py.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFR707","family":"roles","slug":"custom-rule-test-coverage","message":"configured custom rules must have statically declared public-harness cases","remediation":"Add statically visible RuleCase construction passed to evaluate_rule for each custom rule. When FFT413 is active, parametrize with a local _test_types.py dataclass and convert it to RuleCase inside the test.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFN001","family":"naming","slug":"validator-must-not-return","message":"functions under no-return naming contracts must not return values","remediation":"Remove the meaningful return and raise on invalid input, or rename a value-producing function as a query such as is_valid or get_validation_result.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFN002","family":"naming","slug":"predicate-must-return-bool","message":"predicate names must declare an ordinary boolean result","remediation":"Return bool (or TypeGuard/TypeIs), or rename the function to describe the value it returns, such as read_status or current_status.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFN003","family":"naming","slug":"value-name-must-return-value","message":"value-producing names must not declare a no-value result","remediation":"Return the queried or converted value, or rename the function to describe its side effect, such as initialize_cache or export_json.","severity":"error","enabled_by_default":true,"execution_owner":"file"},{"code":"FFN004","family":"naming","slug":"iterator-name-must-produce-iterator","message":"iterator names must produce an iterator or generator","remediation":"Return an iterator or generator, or rename an eager collection function with a name such as collect_items.","severity":"error","enabled_by_default":true,"execution_owner":"file"}]
|
{fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/command/helpers/memory_execution.rs
RENAMED
|
@@ -23,7 +23,7 @@ use crate::command::helpers::{
|
|
|
23
23
|
};
|
|
24
24
|
use crate::command::models::{ColorMode, MemoryCommand, MemoryProject};
|
|
25
25
|
use crate::configuration::main::load;
|
|
26
|
-
use crate::helpers::render;
|
|
26
|
+
use crate::helpers::reporting::render;
|
|
27
27
|
use crate::models::{CliOutput, Fault};
|
|
28
28
|
|
|
29
29
|
pub(crate) fn execute_memory(arguments: &[String]) -> Result<CliOutput, String> {
|
|
@@ -3,7 +3,8 @@ use std::path::Path;
|
|
|
3
3
|
|
|
4
4
|
use crate::command::main::{check, help, init, map, memory, rule, skills};
|
|
5
5
|
use crate::configuration::main::custom_rules;
|
|
6
|
-
use crate::helpers::
|
|
6
|
+
use crate::helpers::check::cleanup;
|
|
7
|
+
use crate::helpers::hosting::process;
|
|
7
8
|
use crate::models::CliOutput;
|
|
8
9
|
|
|
9
10
|
pub fn run_cli() -> CliOutput {
|
|
@@ -40,7 +41,7 @@ fn dispatch(arguments: &[String]) -> Result<CliOutput, String> {
|
|
|
40
41
|
}
|
|
41
42
|
|
|
42
43
|
fn dispatch_check(arguments: &[String]) -> Result<CliOutput, String> {
|
|
43
|
-
let cleanup =
|
|
44
|
+
let cleanup = cleanup::prepare(Path::new("."));
|
|
44
45
|
let result = if custom_rules::custom_rules_are_configured(Path::new("."))? {
|
|
45
46
|
let exit_code = process::run_custom_check_host(arguments)?;
|
|
46
47
|
Ok(CliOutput {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
use std::collections::
|
|
1
|
+
use std::collections::HashMap;
|
|
2
2
|
use std::fs;
|
|
3
3
|
use std::path::Path;
|
|
4
4
|
|
|
@@ -6,22 +6,11 @@ use fensu_facts::parsing::main::parse_strict::parse_strict;
|
|
|
6
6
|
use ruff_python_ast::visitor::{walk_stmt, Visitor};
|
|
7
7
|
use ruff_python_ast::Stmt;
|
|
8
8
|
|
|
9
|
-
use crate::helpers::
|
|
10
|
-
use crate::models::
|
|
9
|
+
use crate::helpers::check::policy::python_version;
|
|
10
|
+
use crate::models::Config;
|
|
11
11
|
|
|
12
|
-
pub(crate) fn
|
|
13
|
-
config: &Config,
|
|
14
|
-
catalogue: &[RuleMetadata],
|
|
15
|
-
project_root: &Path,
|
|
16
|
-
) -> Result<(), String> {
|
|
17
|
-
let codes = catalogue
|
|
18
|
-
.iter()
|
|
19
|
-
.map(|item| item.code.as_str())
|
|
20
|
-
.collect::<HashSet<_>>();
|
|
12
|
+
pub(crate) fn validate_targets(config: &Config, project_root: &Path) -> Result<(), String> {
|
|
21
13
|
for exception in &config.exceptions {
|
|
22
|
-
if !codes.contains(exception.rule.as_str()) {
|
|
23
|
-
return Err(format!("Unknown rule exception code: {}.", exception.rule));
|
|
24
|
-
}
|
|
25
14
|
let path = project_root.join(&exception.path);
|
|
26
15
|
if !path.is_file() {
|
|
27
16
|
return Err(format!(
|
|
@@ -74,7 +63,7 @@ fn defined_symbols(path: &Path) -> Result<HashMap<String, usize>, String> {
|
|
|
74
63
|
Ok(collector.symbols)
|
|
75
64
|
}
|
|
76
65
|
|
|
77
|
-
#[derive(Default)]
|
|
66
|
+
#[derive(Debug, Default)]
|
|
78
67
|
struct SymbolCollector {
|
|
79
68
|
owners: Vec<String>,
|
|
80
69
|
symbols: HashMap<String, usize>,
|
|
@@ -89,8 +78,8 @@ impl SymbolCollector {
|
|
|
89
78
|
}
|
|
90
79
|
}
|
|
91
80
|
|
|
92
|
-
impl<'
|
|
93
|
-
fn visit_stmt(&mut self, statement: &'
|
|
81
|
+
impl<'ast> Visitor<'ast> for SymbolCollector {
|
|
82
|
+
fn visit_stmt(&mut self, statement: &'ast Stmt) {
|
|
94
83
|
match statement {
|
|
95
84
|
Stmt::FunctionDef(function) => {
|
|
96
85
|
let symbol = self.qualified(function.name.as_str());
|
|
@@ -24,6 +24,7 @@ pub(crate) fn build(
|
|
|
24
24
|
Ok(Config {
|
|
25
25
|
roots,
|
|
26
26
|
tests: strings_or(table.get("tests"), &["tests"]),
|
|
27
|
+
test_scopes: strings_or(table.get("test_scopes"), &["unit", "integration", "e2e"]),
|
|
27
28
|
tooling: strings(table.get("tooling")),
|
|
28
29
|
select: strings_or(table.get("select"), &["FF"]),
|
|
29
30
|
warn: strings(table.get("warn")),
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
pub(crate) fn validate_nested_roots(roots: Vec<String>) -> Result<(), String> {
|
|
2
|
+
for (index, first) in roots.iter().enumerate() {
|
|
3
|
+
let first_parts = first.split('/').collect::<Vec<_>>();
|
|
4
|
+
for second in roots.iter().skip(index + 1) {
|
|
5
|
+
let second_parts = second.split('/').collect::<Vec<_>>();
|
|
6
|
+
let length = first_parts.len().min(second_parts.len());
|
|
7
|
+
if first_parts[..length] != second_parts[..length] {
|
|
8
|
+
continue;
|
|
9
|
+
}
|
|
10
|
+
return Err(nested_roots_error(
|
|
11
|
+
first,
|
|
12
|
+
second,
|
|
13
|
+
first_parts.len() <= second_parts.len(),
|
|
14
|
+
));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
Ok(())
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
fn nested_roots_error(first: &str, second: &str, first_is_outer: bool) -> String {
|
|
21
|
+
let (outer, inner) = if first_is_outer {
|
|
22
|
+
(first, second)
|
|
23
|
+
} else {
|
|
24
|
+
(second, first)
|
|
25
|
+
};
|
|
26
|
+
if outer == inner {
|
|
27
|
+
return format!("Config key roots must not contain duplicate paths: {outer:?}.");
|
|
28
|
+
}
|
|
29
|
+
format!("Config key roots must not contain nested paths: {outer:?} contains {inner:?}.")
|
|
30
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
use std::collections::HashSet;
|
|
2
|
+
|
|
3
|
+
use crate::configuration::helpers::validation::required_strings;
|
|
4
|
+
|
|
5
|
+
pub(crate) fn validate_test_scopes(value: Option<&toml::Value>) -> Result<(), String> {
|
|
6
|
+
let Some(value) = value else {
|
|
7
|
+
return Ok(());
|
|
8
|
+
};
|
|
9
|
+
let scopes = required_strings(Some(value), "test_scopes")?;
|
|
10
|
+
if scopes.is_empty() {
|
|
11
|
+
return Err("Config key test_scopes must not be empty.".to_owned());
|
|
12
|
+
}
|
|
13
|
+
if scopes.iter().collect::<HashSet<_>>().len() != scopes.len() {
|
|
14
|
+
return Err("Config key test_scopes must not contain duplicates.".to_owned());
|
|
15
|
+
}
|
|
16
|
+
for scope in &scopes {
|
|
17
|
+
if !valid_test_scope(scope) {
|
|
18
|
+
return Err(format!(
|
|
19
|
+
"Config key test_scopes must contain single lowercase path segments: {scope:?}."
|
|
20
|
+
));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
Ok(())
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
fn valid_test_scope(scope: &str) -> bool {
|
|
27
|
+
let bytes = scope.as_bytes();
|
|
28
|
+
!scope.is_empty()
|
|
29
|
+
&& bytes[0].is_ascii_lowercase()
|
|
30
|
+
&& !scope.ends_with(['_', '-'])
|
|
31
|
+
&& bytes.iter().all(|byte| {
|
|
32
|
+
byte.is_ascii_lowercase() || byte.is_ascii_digit() || *byte == b'_' || *byte == b'-'
|
|
33
|
+
})
|
|
34
|
+
}
|
{fensu_cli-0.5.2 → fensu_cli-0.7.0}/crates/fensu-cli/src/configuration/helpers/validation.rs
RENAMED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
use std::collections::HashSet;
|
|
2
2
|
|
|
3
3
|
use crate::configuration::helpers::exceptions;
|
|
4
|
+
use crate::configuration::helpers::roots::validate_nested_roots;
|
|
5
|
+
use crate::configuration::helpers::scopes::validate_test_scopes;
|
|
4
6
|
use crate::constants::{
|
|
5
7
|
CONFIG_ROLE_NAMES, CONTRACT_BEHAVIORS, DEFAULT_THRESHOLDS, MAX_CORE_SELECTOR_SUFFIX,
|
|
6
8
|
};
|
|
@@ -13,6 +15,7 @@ pub(crate) fn validate(table: &toml::map::Map<String, toml::Value>) -> Result<()
|
|
|
13
15
|
&[
|
|
14
16
|
"roots",
|
|
15
17
|
"tests",
|
|
18
|
+
"test_scopes",
|
|
16
19
|
"tooling",
|
|
17
20
|
"select",
|
|
18
21
|
"warn",
|
|
@@ -39,6 +42,7 @@ pub(crate) fn validate(table: &toml::map::Map<String, toml::Value>) -> Result<()
|
|
|
39
42
|
validate_optional_table(table, "evaluation", &["include", "exclude"])?;
|
|
40
43
|
validate_optional_table(table, "skills", &["name"])?;
|
|
41
44
|
validate_rule_options(table.get("rule_options"))?;
|
|
45
|
+
validate_test_scopes(table.get("test_scopes"))?;
|
|
42
46
|
for name in [
|
|
43
47
|
"tests",
|
|
44
48
|
"tooling",
|
|
@@ -78,20 +82,6 @@ fn validate_rule_options(value: Option<&toml::Value>) -> Result<(), String> {
|
|
|
78
82
|
Ok(())
|
|
79
83
|
}
|
|
80
84
|
|
|
81
|
-
fn validate_nested_roots(roots: Vec<String>) -> Result<(), String> {
|
|
82
|
-
for (index, first) in roots.iter().enumerate() {
|
|
83
|
-
let first = first.split('/').collect::<Vec<_>>();
|
|
84
|
-
for second in roots.iter().skip(index + 1) {
|
|
85
|
-
let second = second.split('/').collect::<Vec<_>>();
|
|
86
|
-
let length = first.len().min(second.len());
|
|
87
|
-
if first[..length] == second[..length] {
|
|
88
|
-
return Err("Config key roots must not contain nested paths.".to_owned());
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
Ok(())
|
|
93
|
-
}
|
|
94
|
-
|
|
95
85
|
fn validate_boolean_table(
|
|
96
86
|
table: &toml::map::Map<String, toml::Value>,
|
|
97
87
|
name: &str,
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
use crate::configuration::helpers::validation;
|
|
2
|
+
|
|
3
|
+
pub(crate) fn validate_document(text: &str) -> Result<(), String> {
|
|
4
|
+
let document = toml::from_slice::<toml::Value>(text.as_bytes())
|
|
5
|
+
.map_err(|error| format!("Configuration is not valid TOML: {error}"))?;
|
|
6
|
+
let table = document
|
|
7
|
+
.as_table()
|
|
8
|
+
.ok_or_else(|| "Configuration did not contain a TOML table.".to_owned())?;
|
|
9
|
+
validation::validate(table)
|
|
10
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
use std::path::Path;
|
|
2
|
+
|
|
3
|
+
use crate::configuration::helpers::exception_targets;
|
|
4
|
+
use crate::models::Config;
|
|
5
|
+
|
|
6
|
+
pub(crate) fn validate_exception_targets(
|
|
7
|
+
config: &Config,
|
|
8
|
+
project_root: &Path,
|
|
9
|
+
) -> Result<(), String> {
|
|
10
|
+
exception_targets::validate_targets(config, project_root)
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
pub(crate) mod metadata;
|
|
@@ -9,12 +9,14 @@ use rayon::iter::{IndexedParallelIterator, IntoParallelRefIterator, ParallelIter
|
|
|
9
9
|
use crate::constants::{
|
|
10
10
|
OWNER_FILE, OWNER_PACKAGE, ROLE_HELPERS, ROLE_MAIN, SCOPE_TEST, SUFFIX_INIT,
|
|
11
11
|
};
|
|
12
|
-
use crate::helpers::
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
use crate::helpers::catalogue::metadata;
|
|
13
|
+
use crate::helpers::check::exceptions::apply_exceptions;
|
|
14
|
+
use crate::helpers::check::policy::{
|
|
15
|
+
apply_rule_ignores, is_entry_module, is_main_module, program, resolved_thresholds, role,
|
|
16
|
+
scope_roots, source_module_name,
|
|
15
17
|
};
|
|
16
|
-
use crate::helpers::
|
|
17
|
-
use crate::helpers::
|
|
18
|
+
use crate::helpers::check::project::{observe, project_plane};
|
|
19
|
+
use crate::helpers::reporting::render;
|
|
18
20
|
use crate::models::{Config, Fault, RuleMetadata, ScopedSource};
|
|
19
21
|
|
|
20
22
|
pub(crate) fn evaluate_and_render(
|
|
@@ -33,6 +35,10 @@ pub(crate) fn evaluate_and_render(
|
|
|
33
35
|
};
|
|
34
36
|
let mut all_rules = blocking.clone();
|
|
35
37
|
all_rules.extend(warning_rules.iter().copied());
|
|
38
|
+
let evaluated_codes = all_rules
|
|
39
|
+
.iter()
|
|
40
|
+
.map(|rule| rule.code.as_str())
|
|
41
|
+
.collect::<HashSet<_>>();
|
|
36
42
|
let codes_by_source = owner_plan(sources, &all_rules);
|
|
37
43
|
let project = project_plane(root, config, sources)?;
|
|
38
44
|
let program_by_path = sources
|
|
@@ -75,6 +81,7 @@ pub(crate) fn evaluate_and_render(
|
|
|
75
81
|
.map(|name| name.to_string_lossy().into_owned())
|
|
76
82
|
.collect(),
|
|
77
83
|
scope_roots: scope_roots(config),
|
|
84
|
+
test_scopes: config.test_scopes.clone(),
|
|
78
85
|
observations: HashMap::new(),
|
|
79
86
|
custom_registrations: Vec::new(),
|
|
80
87
|
repo_root: root.to_string_lossy().into_owned(),
|
|
@@ -86,7 +93,7 @@ pub(crate) fn evaluate_and_render(
|
|
|
86
93
|
let faults = rows
|
|
87
94
|
.into_iter()
|
|
88
95
|
.map(|row| {
|
|
89
|
-
let metadata =
|
|
96
|
+
let metadata = metadata::rule(&row.code)
|
|
90
97
|
.ok_or_else(|| format!("Unknown native rule code: {}", row.code))?;
|
|
91
98
|
let path = row.path.unwrap_or_else(|| source.repository_path.clone());
|
|
92
99
|
Ok(Fault {
|
|
@@ -124,7 +131,7 @@ pub(crate) fn evaluate_and_render(
|
|
|
124
131
|
});
|
|
125
132
|
uses.sort();
|
|
126
133
|
uses.dedup();
|
|
127
|
-
let (faults, applied) = apply_exceptions(faults, config)?;
|
|
134
|
+
let (faults, applied) = apply_exceptions(faults, sources, root, &evaluated_codes, config)?;
|
|
128
135
|
let faults = apply_rule_ignores(faults, root, config);
|
|
129
136
|
let blocking_faults = faults
|
|
130
137
|
.iter()
|
|
@@ -162,7 +169,8 @@ fn native_rule_options(
|
|
|
162
169
|
) -> Result<HashMap<String, HashMap<String, String>>, String> {
|
|
163
170
|
let mut by_code = HashMap::new();
|
|
164
171
|
for code in codes {
|
|
165
|
-
let rule =
|
|
172
|
+
let rule =
|
|
173
|
+
metadata::rule(code).ok_or_else(|| format!("Unknown native rule code: {code}"))?;
|
|
166
174
|
let mut values = HashMap::new();
|
|
167
175
|
for option in &rule.options {
|
|
168
176
|
values.insert(
|
|
@@ -178,7 +186,7 @@ fn native_rule_options(
|
|
|
178
186
|
}
|
|
179
187
|
|
|
180
188
|
pub(crate) fn selected_rules(select: &[String], ignore: &[String]) -> Vec<&'static RuleMetadata> {
|
|
181
|
-
|
|
189
|
+
metadata::catalogue()
|
|
182
190
|
.iter()
|
|
183
191
|
.filter(|rule| {
|
|
184
192
|
let selected = select
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
use std::collections::{HashMap, HashSet};
|
|
2
|
+
use std::path::Path;
|
|
3
|
+
|
|
4
|
+
use crate::models::{Config, Fault, RuleException, ScopedSource};
|
|
5
|
+
|
|
6
|
+
type ExceptionKey = (String, String, Option<String>);
|
|
7
|
+
|
|
8
|
+
pub(crate) fn apply_exceptions(
|
|
9
|
+
faults: Vec<Fault>,
|
|
10
|
+
sources: &[ScopedSource],
|
|
11
|
+
root: &Path,
|
|
12
|
+
evaluated_codes: &HashSet<&str>,
|
|
13
|
+
config: &Config,
|
|
14
|
+
) -> Result<(Vec<Fault>, usize), String> {
|
|
15
|
+
if config.exceptions.is_empty() {
|
|
16
|
+
return Ok((faults, 0));
|
|
17
|
+
}
|
|
18
|
+
let source_by_path = sources
|
|
19
|
+
.iter()
|
|
20
|
+
.map(|source| (source.repository_path.as_str(), source))
|
|
21
|
+
.collect::<HashMap<_, _>>();
|
|
22
|
+
let mut applied: HashSet<ExceptionKey> = HashSet::new();
|
|
23
|
+
let retained = faults
|
|
24
|
+
.into_iter()
|
|
25
|
+
.filter(|fault| {
|
|
26
|
+
let reported = repository_path(&fault.path, root);
|
|
27
|
+
let mut owner: Option<Option<String>> = None;
|
|
28
|
+
let matching = config.exceptions.iter().find(|entry| {
|
|
29
|
+
if entry.rule != fault.code || entry.path != reported {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
if entry.symbols.is_empty() {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
let resolved = owner.get_or_insert_with(|| {
|
|
36
|
+
source_by_path
|
|
37
|
+
.get(reported.as_str())
|
|
38
|
+
.and_then(|source| fault_owner(fault, source))
|
|
39
|
+
});
|
|
40
|
+
resolved
|
|
41
|
+
.as_deref()
|
|
42
|
+
.is_some_and(|symbol| entry.symbols.iter().any(|item| item == symbol))
|
|
43
|
+
});
|
|
44
|
+
match matching {
|
|
45
|
+
Some(entry) => {
|
|
46
|
+
let symbol = match entry.symbols.is_empty() {
|
|
47
|
+
true => None,
|
|
48
|
+
false => owner.clone().flatten(),
|
|
49
|
+
};
|
|
50
|
+
applied.insert((entry.rule.clone(), entry.path.clone(), symbol));
|
|
51
|
+
false
|
|
52
|
+
}
|
|
53
|
+
None => true,
|
|
54
|
+
}
|
|
55
|
+
})
|
|
56
|
+
.collect::<Vec<_>>();
|
|
57
|
+
if let Some(message) = stale_exception(config, evaluated_codes, &applied) {
|
|
58
|
+
return Err(message);
|
|
59
|
+
}
|
|
60
|
+
Ok((retained, applied.len()))
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
fn repository_path(reported: &str, root: &Path) -> String {
|
|
64
|
+
let candidate = Path::new(reported);
|
|
65
|
+
candidate
|
|
66
|
+
.strip_prefix(root)
|
|
67
|
+
.unwrap_or(candidate)
|
|
68
|
+
.to_string_lossy()
|
|
69
|
+
.replace('\\', "/")
|
|
70
|
+
.trim_start_matches('/')
|
|
71
|
+
.to_owned()
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
fn stale_exception(
|
|
75
|
+
config: &Config,
|
|
76
|
+
evaluated_codes: &HashSet<&str>,
|
|
77
|
+
applied: &HashSet<ExceptionKey>,
|
|
78
|
+
) -> Option<String> {
|
|
79
|
+
for entry in &config.exceptions {
|
|
80
|
+
if !evaluated_codes.contains(entry.rule.as_str()) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
for symbol in configured_symbols(entry) {
|
|
84
|
+
let key = (entry.rule.clone(), entry.path.clone(), symbol.clone());
|
|
85
|
+
if applied.contains(&key) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
let suffix = symbol.map_or_else(String::new, |value| format!("::{value}"));
|
|
89
|
+
return Some(format!(
|
|
90
|
+
"Rule exception no longer matches a fault: {} {}{suffix}. Remove it or update its scope. Reason: {}",
|
|
91
|
+
entry.rule, entry.path, entry.reason
|
|
92
|
+
));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
None
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
fn configured_symbols(entry: &RuleException) -> Vec<Option<String>> {
|
|
99
|
+
if entry.symbols.is_empty() {
|
|
100
|
+
return vec![None];
|
|
101
|
+
}
|
|
102
|
+
entry
|
|
103
|
+
.symbols
|
|
104
|
+
.iter()
|
|
105
|
+
.map(|symbol| Some(symbol.clone()))
|
|
106
|
+
.collect()
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
fn fault_owner(fault: &Fault, source: &ScopedSource) -> Option<String> {
|
|
110
|
+
source
|
|
111
|
+
.program
|
|
112
|
+
.as_ref()?
|
|
113
|
+
.owner_symbol_at(fault.line?, fault.column.unwrap_or(0))
|
|
114
|
+
}
|