### Install OeditusCredo standalone via Hex archive or escript Source: https://hexdocs.pm/oeditus_credo Provides two standalone installation methods: installing as a Hex archive for development, or downloading the escript executable for CI/CD. ```shell # Install as a Hex archive (recommended for development) mix archive.install hex oeditus_credo # Or download and use the escript executable (best for CI/CD) curl -L https://github.com/Oeditus/oeditus_credo/releases/latest/download/oeditus_credo -o oeditus_credo chmod +x oeditus_credo ``` -------------------------------- ### Add OeditusCredo checks to .credo.exs Source: https://hexdocs.pm/oeditus_credo Add the OeditusCredo checks to the enabled and disabled lists in your .credo.exs configuration. The disabled list includes opt-in checks that require additional setup: ChangeRiskAntiPatterns needs persisted coverage data, and UnsafeMapAccess needs the optional typle dependency and Elixir 1.20+. ```elixir %{ configs: [ %{ name: "default", plugins: [], requires: [], checks: %{ enabled: [ # ... existing checks ... # Error Handling {OeditusCredo.Check.Warning.MissingErrorHandling, []}, {OeditusCredo.Check.Warning.SilentErrorCase, []}, {OeditusCredo.Check.Warning.SwallowingException, []}, # Database & Performance {OeditusCredo.Check.Warning.InefficientFilter, []}, {OeditusCredo.Check.Warning.NPlusOneQuery, []}, {OeditusCredo.Check.Warning.MissingPreload, []}, # LiveView & Concurrency {OeditusCredo.Check.Warning.UnmanagedTask, []}, {OeditusCredo.Check.Warning.SyncOverAsync, []}, {OeditusCredo.Check.Warning.MissingHandleAsync, []}, {OeditusCredo.Check.Warning.MissingThrottle, []}, {OeditusCredo.Check.Warning.InlineJavascript, []}, # Readability {OeditusCredo.Check.Readability.UnnecessaryInterpolatingSigil, []}, # Code Quality {OeditusCredo.Check.Warning.DirectStructUpdate, []}, {OeditusCredo.Check.Warning.CallbackHell, [max_nesting: 2]}, {OeditusCredo.Check.Warning.BlockingInPlug, []}, # Code Organization & Idiomatic Refactoring {OeditusCredo.Check.Refactoring.PreferCasePatternMatching, []}, {OeditusCredo.Check.Refactoring.PreferMultiHeadFunction, []}, {OeditusCredo.Check.Refactoring.PreferMultiHeadForNil, []}, {OeditusCredo.Check.Refactoring.PreferPipelineOperator, []}, {OeditusCredo.Check.Refactoring.PreferInplaceMapMatching, []}, {OeditusCredo.Check.Refactoring.PreferInplaceListMatching, []}, {OeditusCredo.Check.Refactoring.PreferInplaceBinaryMatching, []}, {OeditusCredo.Check.Refactoring.PreferDestructuring, []}, {OeditusCredo.Check.Refactoring.PreferDotAccessForStructs, []}, {OeditusCredo.Check.Refactoring.PreferWithClause, []}, {OeditusCredo.Check.Refactoring.PreferTaggedTuplesForErrors, []}, {OeditusCredo.Check.Refactoring.PreferForComprehensionOverFilterMap, []}, {OeditusCredo.Check.Refactoring.PreferListPrepend, []}, {OeditusCredo.Check.Refactoring.PreferPatternMatchingForEmptiness, []}, {OeditusCredo.Check.Refactoring.PreferStringBoundariesOverRegex, []}, {OeditusCredo.Check.Refactoring.PreferFunctionCapture, []}, {OeditusCredo.Check.Refactoring.PreferShortFieldAccessCapture, []}, {OeditusCredo.Check.Refactoring.PreferMapMerge, []}, {OeditusCredo.Check.Refactoring.AvoidSinglePipe, []}, {OeditusCredo.Check.Refactoring.AvoidUnawaitedTaskAsync, []}, # Refactoring Suggestions {OeditusCredo.Check.Refactoring.SuggestFSM, []}, # Telemetry & Observability {OeditusCredo.Check.Warning.TelemetryInRecursiveFunction, []}, {OeditusCredo.Check.Warning.MissingTelemetryInAuthPlug, []}, {OeditusCredo.Check.Warning.MissingTelemetryForExternalHttp, []}, # Security - Injection {OeditusCredo.Check.Security.SQLInjection, []}, {OeditusCredo.Check.Security.OSCommandInjection, []}, {OeditusCredo.Check.Security.CodeInjection, []}, {OeditusCredo.Check.Security.XSSVulnerability, []}, # Security - Auth {OeditusCredo.Check.Security.MissingAuthentication, []}, {OeditusCredo.Check.Security.MissingAuthorization, []}, {OeditusCredo.Check.Security.IncorrectAuthorization, []}, {OeditusCredo.Check.Security.InsecureDirectObjectReference, []}, # Security - Data Protection {OeditusCredo.Check.Security.SensitiveDataExposure, []}, {OeditusCredo.Check.Security.HardcodedCredentials, []}, {OeditusCredo.Check.Security.UnsafeDeserialization, []}, # Security - Input & File Handling {OeditusCredo.Check.Security.ImproperInputValidation, []}, {OeditusCredo.Check.Security.PathTraversal, []}, {OeditusCredo.Check.Security.UnrestrictedFileUpload, []}, # Security - Web {OeditusCredo.Check.Security.MissingCSRFProtection, []}, {OeditusCredo.Check.Security.SSRFVulnerability, []}, # Security - Race Conditions {OeditusCredo.Check.Security.TOCTOU, []} ], disabled: [ # Opt-in: needs persisted coverage data, see the CRAP section below {OeditusCredo.Check.Refactoring.ChangeRiskAntiPatterns, []}, # Opt-in: needs the optional `typle` dependency and Elixir 1.20+ {OeditusCredo.Check.Warning.UnsafeMapAccess, []} ] } } ] } ``` -------------------------------- ### Run OeditusCredo with mix oeditus_credo Source: https://hexdocs.pm/oeditus_credo Shows usage commands for running OeditusCredo with all checks enabled, failing on any issues with --strict, or analyzing a specific directory. ```shell mix oeditus_credo # Run with all checks enabled mix oeditus_credo --strict # Fail on any issues mix oeditus_credo lib/my_app # Analyze specific directory ``` -------------------------------- ### Run mix credo Source: https://hexdocs.pm/oeditus_credo Run the Credo analysis with the configured checks. ```shell mix credo ``` -------------------------------- ### Run tests Source: https://hexdocs.pm/oeditus_credo Run the test suite with mix test to see the current test count and coverage. ```shell mix test ``` -------------------------------- ### mix oeditus_assistant_gha - Generate GitHub Action workflow Source: https://hexdocs.pm/oeditus_credo Generates a GitHub Action workflow (.github/workflows/oeditus.yml) and composite action runner (.github/actions/oeditus/) that automatically review Elixir PR diffs using Claude or OpenAI models and post inline GitHub PR comments with code suggestions. Use --stdout to print generated workflow files to stdout or -o DIR to write files to a custom base directory. ```shell mix oeditus_assistant_gha # Writes action and workflow files mix oeditus_assistant_gha --stdout # Prints generated workflow files to stdout mix oeditus_assistant_gha -o DIR # Writes files to a custom base directory ``` -------------------------------- ### mix oeditus_assistant_skill - Generate AI assistant skill Source: https://hexdocs.pm/oeditus_credo Generates an AI assistant skill file (SKILL.md) for running OeditusCredo checks in a lightweight local mode. Supported target assistants are claude, openai, and gemini. Use --stdout to print the skill to stdout or -o PATH to write to a custom file path. ```shell # Generate skill for specific assistant target mix oeditus_assistant_skill claude # Writes to .claude/skills/oeditus/SKILL.md mix oeditus_assistant_skill openai # Writes to .openai/skills/oeditus/SKILL.md mix oeditus_assistant_skill gemini # Writes to .gemini/skills/oeditus/SKILL.md # Options mix oeditus_assistant_skill claude --stdout # Prints skill to stdout mix oeditus_assistant_skill claude -o PATH # Writes to custom file path ``` -------------------------------- ### Generate coverage and run Credo Source: https://hexdocs.pm/oeditus_credo Commands to generate persisted coverage data and then run Credo. The check reads cover/default.coverdata, which is produced by --export-coverage. Plain mix test --cover does not leave an importable coverage file. ```bash mix test --cover --export-coverage default mix credo ``` -------------------------------- ### mix oeditus_assistant_rules - Generate AI coding rules Source: https://hexdocs.pm/oeditus_credo Generates coding rules in Markdown format (.aiassistant/rules/oeditus.md) derived from all OeditusCredo checks. Use --stdout to print rules to stdout or -o PATH to write to a custom file path. ```shell mix oeditus_assistant_rules # Writes to .aiassistant/rules/oeditus.md mix oeditus_assistant_rules --stdout # Prints rules to stdout mix oeditus_assistant_rules -o PATH # Writes to a custom file path ``` -------------------------------- ### Enable ChangeRiskAntiPatterns check Source: https://hexdocs.pm/oeditus_credo Enables the ChangeRiskAntiPatterns check in .credo.exs. It is opt-in and disabled by default. Parameters include max_score (default 30), coverdata (default "cover/default.coverdata"), exclude_test_files (default true), and require_coverage (default false). ```elixir {OeditusCredo.Check.Refactoring.ChangeRiskAntiPatterns, []} ``` -------------------------------- ### Configure idiomatic refactoring check with exclude_test_files and exit_status Source: https://hexdocs.pm/oeditus_credo Shows how to soften an opinionated refactoring check by excluding test files and setting exit_status to 0. ```elixir {OeditusCredo.Check.Refactoring.AvoidSinglePipe, [exclude_test_files: true, exit_status: 0]} ``` -------------------------------- ### Add oeditus_credo dependency in mix.exs Source: https://hexdocs.pm/oeditus_credo Adds the oeditus_credo Hex package as a dependency, limited to dev and test environments with runtime disabled. ```elixir def deps do [ {:oeditus_credo, "~> 0.10", only: [:dev, :test], runtime: false} ] end ``` -------------------------------- ### Restrict files for a check Source: https://hexdocs.pm/oeditus_credo Restricts the OeditusCredo.Check.Security.SQLInjection check to run only on files matching the included pattern. ```elixir {OeditusCredo.Check.Security.SQLInjection, files: %{included: ["lib/my_app/repo.ex"]}} ``` -------------------------------- ### Override exit status for a check Source: https://hexdocs.pm/oeditus_credo Shows how to set exit_status to 0 to run the check without failing CI, and a custom exit status of 2 for another check. ```elixir # Run the check but don't fail CI on its issues {OeditusCredo.Check.Warning.NPlusOneQuery, exit_status: 0} # Custom exit status {OeditusCredo.Check.Security.SQLInjection, exit_status: 2} ``` -------------------------------- ### Run check as advisory only Source: https://hexdocs.pm/oeditus_credo Set exit_status to 0 to run a check as advisory only, so it won't affect the exit code. ```elixir {OeditusCredo.Check.Warning.DirectStructUpdate, exit_status: 0}, ``` -------------------------------- ### Customise check-specific params Source: https://hexdocs.pm/oeditus_credo Configure OeditusCredo checks with custom parameters such as max_nesting, extra_blocking_modules, extra_dangerous_functions, exclude_test_files, extra_credential_terms, and extra_http_modules. ```elixir {OeditusCredo.Check.Warning.CallbackHell, [max_nesting: 3]}, {OeditusCredo.Check.Warning.SyncOverAsync, [extra_blocking_modules: [:ExternalAPI]]}, {OeditusCredo.Check.Security.CodeInjection, [extra_dangerous_functions: [:compile_string]]}, {OeditusCredo.Check.Security.HardcodedCredentials, [exclude_test_files: true, extra_credential_terms: ["conn_string"]]}, {OeditusCredo.Check.Warning.MissingTelemetryForExternalHttp, [ extra_http_modules: [{[:MyApp, :HTTP], [:get, :post]}] ]}, ``` -------------------------------- ### Disable a check Source: https://hexdocs.pm/oeditus_credo Disables the OeditusCredo.Check.Warning.NPlusOneQuery check by setting it to false. ```elixir {OeditusCredo.Check.Warning.NPlusOneQuery, false} ``` -------------------------------- ### Disable a check entirely Source: https://hexdocs.pm/oeditus_credo Set a check to false to disable it entirely. ```elixir {OeditusCredo.Check.Warning.InlineJavascript, false} ``` -------------------------------- ### CRAP score formula Source: https://hexdocs.pm/oeditus_credo Formula for the Change Risk Anti-Patterns (CRAP) score, combining cyclomatic complexity with test coverage. A fully covered function scores its complexity; a complex, untested function scores much higher. ```text CRAP = complexity^2 * (1 - coverage/100)^3 + complexity ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.