# yaml-language-server: $schema=https://cubic.dev/schema/cubic-repository-config.schema.json

# cubic.yaml
# This file configures AI review behavior, ignore patterns, PR descriptions, and custom rules.
# Place this file in your repository root to version-control your AI review settings.
# Settings defined here take precedence over UI-configured settings.
# See https://docs.cubic.dev/configure/cubic-yaml for documentation.

version: 1
reviews:
  enabled: true
  sensitivity: medium
  incremental_commits: true
  show_ai_feedback_buttons: false
  custom_instructions: |-
    ## Step 1: Fetch Current Guidelines

    1. Fetch the current [CONTRIBUTING.md](https://github.com/n8n-io/n8n/blob/master/CONTRIBUTING.md) from the repository's main branch
    2. Navigate to the "Community PR Guidelines" section
    3. Use ONLY this live version - ignore any cached/embedded rules

    ## Step 2: Review Process

    Evaluate the PR against the rules in the fetched Community PR Guidelines.

    ## Step 3: Test Requirement Interpretation

    BE REASONABLE when evaluating test coverage:

    **PASS if:**

    - Core functionality has tests
    - Critical paths are tested
    - Coverage is reasonable (not necessarily 100%)

    **DO NOT require tests for:**

    - Exports, types, configs
    - Metadata files
    - Version files

    Approve if reasonably tested. Let humans handle edge cases.
  custom_rules:
    - name: Prefer Typeguards over Type casting
      description: |-
        - Rule Statement:
        Never use `as` keyword for type narrowing; instead, prefer type guards, type annotations, or the `satisfies` keyword.

        Only use `as` for the following legitimate cases:
          - DOM element assertions (e.g., `document.getElementById('foo') as HTMLButtonElement`)
          - Event type assertions (e.g., `e as MouseEvent`)
          - Const assertions (`as const`)
          - Type widening (e.g., `(['a', 'b'] as string[]).includes('c')`)
          - Generic constraints where no alternative exists

        For type narrowing, use type guard functions. For type checking without losing inference, prefer `satisfies`. For simple type specification, prefer type annotations (`const x: A = y`) over casting (`const x = y as A`).

        - Detection Criteria:
          - Identify all usages of the `as` keyword in TypeScript code that perform type assertions (e.g., `expr as SomeType`).
          - Exclude any usages in tests such as unit test files (*.test.ts or *.spec.ts) or e2e tests under cypress/ folder.
          - Exclude usages where the assertion matches `as const`.
          - Exclude assertions where:
            - The assertion widens a literal/union type to a broader type (e.g., string literal array to string[])
            - The left-hand side is a call to a DOM API (e.g., `document.getElementById`, `document.querySelector`, `document.createElement`)
            - The assertion is applied to a variable named `e` or `event` and the type being asserted ends with `Event`
          - Flag other usages and suggest alternatives: type guards for narrowing, type annotations for simple typing, or `satisfies` for type verification.
          - Setting type of empty value  (for example `[] as string[]`)

        - Example Violation:
          ```typescript
          function handleShape(shape: Shape) {
            // Direct type casting without a type guard
            const rect = shape as Rectangle;
            return rect.width * rect.height;
          }
          ```

        - Example Allowed:
          ```typescript
          // DOM element assertion
          const button = document.getElementById('submit') as HTMLButtonElement;

          // Event assertion
          function handle(e: Event) {
            const mouse = e as MouseEvent;
            console.log(mouse.clientX);
          }

          // as const usage
          const config = { mode: "readonly" } as const;

          // setting types of empty array
          const arr = [] as string[]
          ```
    - name: Tests
      description: |-
        BE REASONABLE when evaluating test coverage:

        **PASS if:**

        - Core functionality has tests
        - Critical paths are tested
        - Coverage is reasonable (not necessarily 100%)

        **DO NOT require tests for:**

        - Exports, types, configs
        - Metadata files
        - Version files
pr_descriptions:
  generate: false
  instructions: Each PR is supposed to have a limited scope. In your review, focus on changes made in the PR and avoid pointing out problems you found in the code that already existed.
issues:
  fix_with_cubic_buttons: true

