Skip to content
Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
f89496b
Implement environment variable expansion for configuration files and …
EffortlessSteven Feb 5, 2026
c9a8a2a
Add conformance tests and schema validation for sensor report
EffortlessSteven Feb 5, 2026
c188b79
feat: Add timing metrics to CheckReceipt and update related tests
EffortlessSteven Feb 5, 2026
c41517f
feat: Enhance configuration management and validation
EffortlessSteven Feb 5, 2026
8c936db
feat: Update fingerprint computation to use full SHA-256 hash and enh…
EffortlessSteven Feb 6, 2026
5c219f0
Add snapshot tests for JSON receipt and GitHub annotation formats
EffortlessSteven Feb 6, 2026
0c9d09f
Refactor verdict reasons handling in markdown rendering
EffortlessSteven Feb 7, 2026
d3e4d3a
feat: Refactor error handling and improve JSON schema drift diagnostics
EffortlessSteven Feb 7, 2026
8aaa6f0
Refactor code structure for improved readability and maintainability
EffortlessSteven Feb 9, 2026
bdac0d3
Refactor code structure for improved readability and maintainability
EffortlessSteven Feb 10, 2026
583d4ec
chore: remove accidental build artifacts and binaries
EffortlessSteven Feb 10, 2026
ccf0f41
chore: reorder imports for consistency and readability across multipl…
EffortlessSteven Feb 10, 2026
8325454
chore: fmt, clippy fixes and unsafe blocks
EffortlessSteven Feb 10, 2026
fdd81d1
chore: update authors and repository URLs in Cargo.toml
EffortlessSteven Feb 12, 2026
a53d5fa
feat: add directory rule overrides and related tests
EffortlessSteven Feb 17, 2026
31170b8
feat: Enhance rule configuration and CLI options for multi-base diff …
EffortlessSteven Feb 17, 2026
804b4ce
Implement LSP server for diffguard with document state management and…
EffortlessSteven Feb 17, 2026
4b39685
refactor(lsp): split into lib+bin targets, fix initialize handshake
EffortlessSteven Apr 5, 2026
d8a69f3
fix(xtask): cargo_bin_path fallback to target/debug when CARGO_BIN_EX…
EffortlessSteven Apr 5, 2026
b8e2532
fix: remove duplicate init_logging call (#10)
EffortlessSteven Apr 5, 2026
7ebce05
chore: add conveyor governance templates and CI gates
EffortlessSteven Apr 5, 2026
4cb1876
docs: add DESIGN.md — governance primitive layer positioning
EffortlessSteven Apr 5, 2026
fb13941
fix: LSP git diff timeout and cmd_validate ENV_LOCK race (#16)
EffortlessSteven Apr 5, 2026
3dd5155
Merge main into feat/v0.2-enhancements-v2
EffortlessSteven Apr 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1,2 +1,7 @@
# Protect repository settings
/.github/settings.yml @EffortlessSteven

# Conveyor templates and CI — maintain governance discipline
/.github/ISSUE_TEMPLATE/ @EffortlessSteven
/.github/PULL_REQUEST_TEMPLATE* @EffortlessSteven
/.github/workflows/ @EffortlessSteven
5 changes: 5 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Documentation
url: https://github.com/EffortlessMetrics/diffguard/blob/main/README.md
about: Check the README before opening an issue
59 changes: 59 additions & 0 deletions .github/ISSUE_TEMPLATE/gate-bug.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
name: Bug Report
description: Report a bug in diffguard (enters conveyor at Gate: Framed)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

# Find and examine the issue template file
find . -path "./.github/ISSUE_TEMPLATE/gate-bug.yml" -type f

Repository: EffortlessMetrics/diffguard

Length of output: 108


🏁 Script executed:

# Read the file to verify the current state
cat -n .github/ISSUE_TEMPLATE/gate-bug.yml

Repository: EffortlessMetrics/diffguard

Length of output: 1925


🏁 Script executed:

# Test YAML validity with a Python script
python3 << 'EOF'
import yaml
import sys

# Test current (unquoted) YAML
unquoted_yaml = """description: Report a bug in diffguard (enters conveyor at Gate: Framed)
name: Bug Report
"""

# Test proposed (quoted) YAML
quoted_yaml = """description: "Report a bug in diffguard (enters conveyor at Gate: Framed)"
name: Bug Report
"""

print("Testing unquoted version:")
try:
    result = yaml.safe_load(unquoted_yaml)
    print(f"✓ Valid. Parsed as: {result}")
except yaml.YAMLError as e:
    print(f"✗ Invalid: {e}")

print("\nTesting quoted version:")
try:
    result = yaml.safe_load(quoted_yaml)
    print(f"✓ Valid. Parsed as: {result}")
except yaml.YAMLError as e:
    print(f"✗ Invalid: {e}")
EOF

Repository: EffortlessMetrics/diffguard

Length of output: 427


Quote the description value to prevent YAML parse failure.

Line 2 contains Gate: Framed in a plain scalar, which triggers a YAML mapping value parsing error. The issue form will not function without this fix.

Proposed fix
-description: Report a bug in diffguard (enters conveyor at Gate: Framed)
+description: "Report a bug in diffguard (enters conveyor at Gate: Framed)"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
description: Report a bug in diffguard (enters conveyor at Gate: Framed)
description: "Report a bug in diffguard (enters conveyor at Gate: Framed)"
🧰 Tools
🪛 YAMLlint (1.38.0)

[error] 2-2: syntax error: mapping values are not allowed here

(syntax)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/ISSUE_TEMPLATE/gate-bug.yml at line 2, The YAML description field
contains an unquoted scalar with "Gate: Framed" which breaks parsing; update the
description value in the .github/ISSUE_TEMPLATE/gate-bug.yml by quoting the
description string (the description key containing Gate: Framed) so the colon is
treated as part of the string rather than a mapping delimiter—use either double
or single quotes around the entire description text.

labels: ["gate:framed", "bug"]
body:
- type: markdown
attributes:
value: |
## Gate: Framed — Bug Report
Bug reports enter the conveyor at Framed. Fill in the reproduction steps
and expected vs actual behavior to frame the issue.

- type: textarea
id: behavior
attributes:
label: Actual behavior
description: What happened?
validations:
required: true

- type: textarea
id: expected
attributes:
label: Expected behavior
description: What should have happened?
validations:
required: true

- type: textarea
id: reproduce
attributes:
label: Steps to reproduce
description: Minimal steps to trigger the bug.
placeholder: |
1. Run `diffguard check --base main --head HEAD`
2. ...
validations:
required: true

- type: input
id: version
attributes:
label: diffguard version
placeholder: "Run: cargo run -p diffguard -- --version"
validations:
required: true

- type: textarea
id: scope
attributes:
label: Scope
description: What's the blast radius? Which crate(s) are affected?
placeholder: |
In scope:
- Fix the root cause in ...

Out of scope:
- Refactoring unrelated code
validations:
required: true
76 changes: 76 additions & 0 deletions .github/ISSUE_TEMPLATE/gate-framed.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
name: Feature or Improvement
description: Propose a change to diffguard (enters conveyor at Gate: Framed)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

# Check if the file exists and examine its content
cat -n .github/ISSUE_TEMPLATE/gate-framed.yml

Repository: EffortlessMetrics/diffguard

Length of output: 2673


🏁 Script executed:

# Validate the current YAML syntax to see if there's an actual parsing issue
python3 << 'EOF'
import yaml

# Test the original unquoted version
original_yaml = """description: Propose a change to diffguard (enters conveyor at Gate: Framed)"""

# Test the proposed quoted version
proposed_yaml = """description: "Propose a change to diffguard (enters conveyor at Gate: Framed)"""

print("=== Original YAML ===")
try:
    result = yaml.safe_load(original_yaml)
    print(f"Parsed successfully: {result}")
    print(f"Type: {type(result)}, Value: {repr(result)}")
except yaml.YAMLError as e:
    print(f"YAML Parse Error: {e}")

print("\n=== Proposed YAML ===")
try:
    result = yaml.safe_load(proposed_yaml)
    print(f"Parsed successfully: {result}")
    print(f"Type: {type(result)}, Value: {repr(result)}")
except yaml.YAMLError as e:
    print(f"YAML Parse Error: {e}")
EOF

Repository: EffortlessMetrics/diffguard

Length of output: 634


🏁 Script executed:

python3 << 'EOF'
import yaml

# Test the complete YAML file as it currently exists (unquoted)
current_yaml = """name: Feature or Improvement
description: Propose a change to diffguard (enters conveyor at Gate: Framed)
labels: ["gate:framed"]"""

# Test with the proposed fix (quoted)
proposed_yaml = """name: Feature or Improvement
description: "Propose a change to diffguard (enters conveyor at Gate: Framed)"
labels: ["gate:framed"]"""

print("=== Current YAML (Unquoted) ===")
try:
    result = yaml.safe_load(current_yaml)
    print(f"Parsed successfully!")
    print(f"Description value: {repr(result.get('description'))}")
except yaml.YAMLError as e:
    print(f"YAML Parse Error: {e}")

print("\n=== Proposed YAML (Quoted) ===")
try:
    result = yaml.safe_load(proposed_yaml)
    print(f"Parsed successfully!")
    print(f"Description value: {repr(result.get('description'))}")
except yaml.YAMLError as e:
    print(f"YAML Parse Error: {e}")
EOF

Repository: EffortlessMetrics/diffguard

Length of output: 432


Quote the description value to keep the template valid YAML.

Line 2 contains an unquoted scalar with Gate: Framed, where the colon is interpreted as a YAML mapping separator, causing a parse error. The file cannot be parsed as valid YAML in its current state.

Proposed fix
-description: Propose a change to diffguard (enters conveyor at Gate: Framed)
+description: "Propose a change to diffguard (enters conveyor at Gate: Framed)"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
description: Propose a change to diffguard (enters conveyor at Gate: Framed)
description: "Propose a change to diffguard (enters conveyor at Gate: Framed)"
🧰 Tools
🪛 YAMLlint (1.38.0)

[error] 2-2: syntax error: mapping values are not allowed here

(syntax)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/ISSUE_TEMPLATE/gate-framed.yml at line 2, The YAML template's
description scalar is unquoted and contains a colon ("Gate: Framed"), which
breaks parsing; update the description value for the key description to be a
quoted string (e.g., wrap Gate: Framed in double or single quotes) so the YAML
parser treats it as a single scalar; locate the description entry in the
template and replace the unquoted value with a quoted one.

labels: ["gate:framed"]
body:
- type: markdown
attributes:
value: |
## Gate: Framed
Every change starts here. Fill in the scope section to frame the problem.
A branch should not be created until this issue is triaged and labeled `gate:verified`.

- type: textarea
id: problem
attributes:
label: Problem
description: What's wrong or missing? Be specific about the current behavior and why it's insufficient.
placeholder: "Describe the problem with enough detail that someone unfamiliar can understand it."
validations:
required: true

- type: textarea
id: scope
attributes:
label: Scope
description: |
Bound the change. What is in scope and what is explicitly out of scope?
This prevents scope creep during implementation.
placeholder: |
In scope:
- ...

Out of scope:
- ...
validations:
required: true

- type: textarea
id: acceptance
attributes:
label: Acceptance Criteria
description: How do we know this is done? Be concrete — tests, behavior, output format.
placeholder: |
- [ ] ...
- [ ] ...
validations:
required: true

- type: dropdown
id: crate
attributes:
label: Affected crate(s)
options:
- diffguard (CLI)
- diffguard-core
- diffguard-domain
- diffguard-diff
- diffguard-types
- diffguard-analytics
- diffguard-lsp
- diffguard-testkit
- xtask
- Multiple / workspace
validations:
required: true

- type: dropdown
id: gate
attributes:
label: Starting gate
description: Where does this issue enter the conveyor? Most start at Framed.
options:
- "Framed (default)"
- "Verified (research already done)"
- "Designed (spec/tests already exist)"
validations:
required: true
23 changes: 23 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
## Linked Issue

<!-- Link the issue this PR addresses. Use "Closes #N" for auto-close. -->

## Description

<!-- What does this PR do and why? -->

## Checklist

- [ ] Tests added or updated
- [ ] `cargo test --workspace` passes
- [ ] `cargo clippy --workspace --all-targets -- -D warnings` passes
- [ ] `cargo fmt --check` passes
- [ ] Scope matches the linked issue (no unrelated changes)

## Test plan

<!-- How was this tested? -->

## Breaking changes

<!-- Describe any breaking changes and migration path. Delete if none. -->
42 changes: 42 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE/conveyor-pr.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
## Linked Issue

Closes #<!-- issue number -->

## Gate: Designed

<!-- Check each box as you complete it. A reviewer should verify these. -->

### Scope verification
- [ ] Scope matches the linked issue
- [ ] No out-of-scope changes included
- [ ] Affected crates listed in issue are accurate

### Design
- [ ] Approach documented (inline comments, ADR, or PR description above)
- [ ] Architecture constraints respected (domain crates stay I/O-free)
- [ ] Public API changes are intentional and minimal

### Gate: Proven
- [ ] Tests added or updated for the change
- [ ] `cargo test --workspace` passes
- [ ] `cargo clippy --workspace --all-targets -- -D warnings` passes
- [ ] `cargo fmt --check` passes
- [ ] Snapshot tests updated (if applicable)

### Gate: Hardened
- [ ] No TODO/FIXME left in changed code
- [ ] Error messages are actionable
- [ ] No breaking changes to exit codes, receipt schema, or CLI flags (unless intentional and documented)
- [ ] Mutation testing considered for critical paths

## Description

<!-- What does this PR do and why? Link to any design decisions. -->

## Test plan

<!-- How was this tested? Include commands, expected output, or screenshots. -->

## Breaking changes

<!-- If any, describe them and the migration path. Delete section if none. -->
10 changes: 7 additions & 3 deletions .github/settings.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# .github/settings.yml
repository:
description: "Diff-scoped governance linter for PR automation"
homepage: "https://github.com/effortless-mgmt/diffguard"
homepage: "https://github.com/effortlessmetrics/diffguard"
topics: rust, linter, diff, git, ci, governance, devex

# Merge strategy settings
Expand All @@ -20,6 +20,10 @@ branches:
require_code_owner_reviews: true
required_status_checks:
strict: true
contexts: [] # Add specific CI check names here if known (e.g., "ci (ubuntu-latest)")
contexts:
- "Format"
- "Clippy"
- "Test"
- "Gate: Issue linked"
enforce_admins: false
restrictions: null
restrictions: null
78 changes: 74 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,85 @@ on:
push:
branches: [ main ]

env:
CARGO_TERM_COLOR: always

jobs:
test:
fmt:
name: Format
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- run: cargo fmt --check

clippy:
name: Clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
components: clippy
- uses: Swatinem/rust-cache@v2
- run: cargo clippy --workspace --all-targets -- -D warnings

test:
name: Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- run: cargo test --workspace --exclude xtask

- name: ci
run: cargo run -p xtask -- ci
xtask:
name: xtask ci
runs-on: ubuntu-latest
if: false # disabled until #6 is fixed
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- run: cargo run -p xtask -- ci
Comment on lines +40 to +50
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail
rg -n -C2 'cargo test --workspace --exclude xtask|cargo run -p xtask -- ci' .github/workflows
rg -n -C4 'fn ci\(\)|conform::run_conformance' xtask/src/main.rs
sed -n '21,27p' .github/settings.yml

Repository: EffortlessMetrics/diffguard

Length of output: 1398


The protected Test gate lost the conformance suite.

The Test job at line 40 runs only cargo test --workspace --exclude xtask, and the xtask job (line 45) is disabled with if: false. Since .github/settings.yml does not require xtask ci as a protected check, the conformance suite in xtask/src/main.rs:78 (conform::run_conformance(true)) is never executed in CI. This allows schema/determinism/survivability regressions to merge while all required checks pass.

🧰 Tools
🪛 actionlint (1.7.12)

[error] 45-45: constant expression "false" in condition. remove the if: section

(if-cond)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/ci.yml around lines 40 - 50, The CI workflow currently
skips the xtask CI so conform::run_conformance(true) in xtask/src/main.rs never
runs; fix by re-enabling or invoking the xtask CI in the pipeline: either remove
the `if: false` from the `xtask` job so the job runs (keeping the steps that run
`cargo run -p xtask -- ci`), or modify the `Test` job to run the xtask check
before/alongside `cargo test` (e.g., add a step `run: cargo run -p xtask -- ci`)
so that the conformance suite (conform::run_conformance(true)) is executed in CI
and can be marked as a required/protected check.


# Gate validation: issue linkage
gate-linked:
name: "Gate: Issue linked"
runs-on: ubuntu-latest
if: github.event_name == 'pull_request'
steps:
- uses: actions/checkout@v4
- name: Check PR body references an issue
run: |
BODY="${{ github.event.pull_request.body }}"
if echo "$BODY" | grep -qiE '(closes|fixes|resolves)\s+#[0-9]+'; then
echo "✅ PR references an issue"
else
echo "❌ PR does not reference an issue"
echo ""
echo "Add 'Closes #N' to the PR body to link your issue."
exit 1
Comment on lines +59 to +68
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail
rg -n -C2 'github\.event\.pull_request\.body|github\.head_ref' .github/workflows/ci.yml

Repository: EffortlessMetrics/diffguard

Length of output: 602


🏁 Script executed:

cat -n .github/workflows/ci.yml

Repository: EffortlessMetrics/diffguard

Length of output: 3196


🏁 Script executed:

rg -n '\$\{\{\s*(github\.)' .github/workflows/ci.yml | head -20

Repository: EffortlessMetrics/diffguard

Length of output: 173


Use environment variables to pass GitHub context data to shell scripts.

Lines 61 and 80 directly interpolate github.event.pull_request.body and github.head_ref into the shell script. A PR body containing shell metacharacters (quotes, $(), backticks, etc.) can break the script or execute arbitrary commands. Pass these values through env: and reference them as environment variables instead.

Proposed fix
   gate-linked:
     name: "Gate: Issue linked"
     runs-on: ubuntu-latest
     if: github.event_name == 'pull_request'
     steps:
       - uses: actions/checkout@v4
       - name: Check PR body references an issue
+        env:
+          PR_BODY: ${{ github.event.pull_request.body || '' }}
         run: |
-          BODY="${{ github.event.pull_request.body }}"
-          if echo "$BODY" | grep -qiE '(closes|fixes|resolves)\s+#[0-9]+'; then
+          if printf '%s' "$PR_BODY" | grep -qiE '(closes|fixes|resolves)[[:space:]]+#[0-9]+'; then
             echo "✅ PR references an issue"
           else
             echo "❌ PR does not reference an issue"
             echo ""
             echo "Add 'Closes `#N`' to the PR body to link your issue."
             exit 1
           fi

   gate-branch:
     name: "Gate: Branch convention"
     runs-on: ubuntu-latest
     if: github.event_name == 'pull_request'
     steps:
       - uses: actions/checkout@v4
       - name: Check branch name follows convention
+        env:
+          HEAD_REF: ${{ github.head_ref }}
         run: |
-          BRANCH="${{ github.head_ref }}"
-          if echo "$BRANCH" | grep -qE '^(feat|fix|chore|docs|refactor|test)/[0-9]+-'; then
-            echo "✅ Branch '$BRANCH' follows convention"
+          if printf '%s' "$HEAD_REF" | grep -qE '^(feat|fix|chore|docs|refactor|test)/[0-9]+-'; then
+            echo "✅ Branch '$HEAD_REF' follows convention"
           else
-            echo "⚠️  Branch '$BRANCH' doesn't follow naming convention"
+            echo "⚠️  Branch '$HEAD_REF' doesn't follow naming convention"
             echo "Expected: <type>/<issue-number>-<slug>"
             echo "Examples: feat/11-fix-include-recursion, fix/12-defaults-merge"
             echo ""
             echo "This is a warning, not a failure."
           fi
🧰 Tools
🪛 actionlint (1.7.12)

[error] 60-60: "github.event.pull_request.body" is potentially untrusted. avoid using it directly in inline scripts. instead, pass it through an environment variable. see https://docs.github.com/en/actions/reference/security/secure-use#good-practices-for-mitigating-script-injection-attacks for more details

(expression)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/ci.yml around lines 59 - 68, The workflow step "Check PR
body references an issue" currently interpolates github.event.pull_request.body
and github.head_ref directly into the shell, which can be unsafe; instead add
these values to the step's env: (e.g., PR_BODY and PR_HEAD_REF) and reference
them inside the run script (use "$PR_BODY" and "$PR_HEAD_REF") so the shell
receives them as environment variables rather than being subject to
word-splitting or command substitution; update the step that defines BODY and
HEAD_REF to read from the env vars and keep the grep logic unchanged (look for
the step named "Check PR body references an issue" and any uses of
BODY/HEAD_REF).

fi

# Gate validation: branch naming
gate-branch:
name: "Gate: Branch convention"
runs-on: ubuntu-latest
if: github.event_name == 'pull_request'
steps:
- uses: actions/checkout@v4
- name: Check branch name follows convention
run: |
BRANCH="${{ github.head_ref }}"
if echo "$BRANCH" | grep -qE '^(feat|fix|chore|docs|refactor|test)/[0-9]+-'; then
echo "✅ Branch '$BRANCH' follows convention"
else
echo "⚠️ Branch '$BRANCH' doesn't follow naming convention"
echo "Expected: <type>/<issue-number>-<slug>"
echo "Examples: feat/11-fix-include-recursion, fix/12-defaults-merge"
echo ""
echo "This is a warning, not a failure."
fi
7 changes: 5 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ Cargo.lock
.DS_Store
artifacts/
.fuzz/
/fuzz/
/fuzz/*
!/fuzz/Cargo.toml
!/fuzz/fuzz_targets/
!/fuzz/fuzz_targets/*.rs
*.pdb
*.profraw
.tmp_*
.tmp_*
Loading
Loading