Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: "3.12"
python-version-file: ".python-version"

- name: Install uv
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/codacy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ jobs:
- name: Run Codacy Analysis CLI
if: ${{ env.CODACY_PROJECT_TOKEN != '' }}
id: codacy_analysis
uses: codacy/codacy-analysis-cli-action@562ee3e92b8e92df8b67e0a5ff8aa8e261919c08 # pinned
uses: codacy/codacy-analysis-cli-action@562ee3e92b8e92df8b67e0a5ff8aa8e261919c08 # v4.4.7
with:
# Check https://github.com/codacy/codacy-analysis-cli#project-token
# to get your project token from your Codacy repository.
Expand Down
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ When user requests commit message generation:
### Code Quality

- **ALLOWED**: Run formatters/linters: `cargo fmt`, `cargo clippy`, `cargo doc`, `taplo fmt`, `taplo lint`,
`uv run ruff check --fix`, `uv run ruff format`, `shfmt -w`, `shellcheck -x`, `npx markdownlint --fix`,
`uv run ruff check --fix`, `uv run ruff format`, `shfmt -w`, `shellcheck -x`, `rumdl`, `dprint`,
`typos`, `actionlint`
- **NEVER**: Use `sed`, `awk`, `perl` for code edits
- **ALWAYS**: Use `edit_files` tool for edits (and `create_file` for new files)
Expand Down Expand Up @@ -205,8 +205,8 @@ macro-ification.
## Common Commands

```bash
just fix # Apply formatters/auto-fixes (mutating)
just check # Lint/validators (non-mutating)
just fix # Apply formatters/auto-fixes (mutating)
just ci # Full CI simulation (checks + tests + examples + bench compile)
just test # Lib + doc tests (fast)
just test-all # All tests (Rust + Python)
Expand Down
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,14 @@ just fix # apply auto-fixes (mutating)
just ci # lint + tests + examples + bench compile
```

The repository uses Rust-native tooling for documentation and config checks:
`rumdl` for Markdown, `dprint` with `pretty_yaml` for YAML, `taplo` for TOML,
and `typos` for spelling. GitHub Actions references are SHA-pinned, restricted
to an explicit allowlist, and kept with readable version comments for review.

CI runs `just ci` on Ubuntu, macOS, and Windows to keep platform coverage
aligned with the local comprehensive validation path.

For coverage commands and report locations, see [`docs/COVERAGE.md`](docs/COVERAGE.md).
For the full set of developer commands, see `just --list` and `AGENTS.md`.

Expand Down
2 changes: 1 addition & 1 deletion cliff.toml
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ commit_parsers = [
# Dependency bumps: keep all bump commits so archived release history
# preserves CI/action/tooling dependency updates as well as Rust crates.
{ message = "^chore\\(deps\\): bump ", group = "Dependencies" },
{ message = "(?i)^bump ", group = "Dependencies" },
{ message = "(?i)^bump\\s+(deps?\\b|dependencies\\b|[A-Za-z0-9_.-]+/[A-Za-z0-9_./-]+|[A-Za-z0-9_.-]+\\s+from\\s+)", group = "Dependencies" },

# Conventional commit types
{ message = "^feat", group = "Added" },
Expand Down
64 changes: 41 additions & 23 deletions justfile
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ _ensure-cargo-llvm-cov:
set -euo pipefail
installed_version=""
if command -v cargo-llvm-cov >/dev/null; then
installed_version="$(cargo llvm-cov --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)"
installed_version="$(cargo llvm-cov --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true)"
fi
if [[ "$installed_version" != "{{cargo_llvm_cov_version}}" ]]; then
echo "❌ 'cargo-llvm-cov' {{cargo_llvm_cov_version}} not found. Install with:"
Expand All @@ -40,7 +40,7 @@ _ensure-cargo-nextest:
set -euo pipefail
installed_version=""
if cargo nextest --version >/dev/null 2>&1; then
installed_version="$(cargo nextest --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)"
installed_version="$(cargo nextest --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true)"
fi
if [[ "$installed_version" != "{{cargo_nextest_version}}" ]]; then
echo "❌ 'cargo-nextest' {{cargo_nextest_version}} not found. Install with:"
Expand All @@ -53,7 +53,7 @@ _ensure-dprint:
set -euo pipefail
installed_version=""
if command -v dprint >/dev/null; then
installed_version="$(dprint --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)"
installed_version="$(dprint --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true)"
fi
if [[ "$installed_version" != "{{dprint_version}}" ]]; then
echo "❌ 'dprint' {{dprint_version}} not found. Install with:"
Expand All @@ -66,7 +66,7 @@ _ensure-git-cliff:
set -euo pipefail
installed_version=""
if command -v git-cliff >/dev/null; then
installed_version="$(git-cliff --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)"
installed_version="$(git-cliff --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true)"
fi
if [[ "$installed_version" != "{{git_cliff_version}}" ]]; then
echo "❌ 'git-cliff' {{git_cliff_version}} not found. Install with:"
Expand All @@ -84,7 +84,7 @@ _ensure-rumdl:
set -euo pipefail
installed_version=""
if command -v rumdl >/dev/null; then
installed_version="$(rumdl --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)"
installed_version="$(rumdl --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true)"
fi
if [[ "$installed_version" != "{{rumdl_version}}" ]]; then
echo "❌ 'rumdl' {{rumdl_version}} not found. Install with:"
Expand All @@ -107,7 +107,7 @@ _ensure-taplo:
set -euo pipefail
installed_version=""
if command -v taplo >/dev/null; then
installed_version="$(taplo --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)"
installed_version="$(taplo --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true)"
fi
if [[ "$installed_version" != "{{taplo_version}}" ]]; then
echo "❌ 'taplo' {{taplo_version}} not found. Install with:"
Expand All @@ -121,7 +121,7 @@ _ensure-typos:
set -euo pipefail
installed_version=""
if command -v typos >/dev/null; then
installed_version="$(typos --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)"
installed_version="$(typos --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true)"
fi
if [[ "$installed_version" != "{{typos_version}}" ]]; then
echo "❌ 'typos' {{typos_version}} not found. Install with:"
Expand All @@ -139,7 +139,7 @@ _ensure-zizmor:
set -euo pipefail
installed_version=""
if command -v zizmor >/dev/null; then
installed_version="$(zizmor --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)"
installed_version="$(zizmor --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true)"
fi
if [[ "$installed_version" != "{{zizmor_version}}" ]]; then
echo "❌ 'zizmor' {{zizmor_version}} not found. Install with:"
Expand Down Expand Up @@ -318,13 +318,20 @@ doc-check:

# Examples
examples:
cargo run --quiet --example det_5x5
cargo run --quiet --example solve_5x5
cargo run --quiet --example ldlt_solve_3x3
cargo run --quiet --example const_det_4x4
cargo run --quiet --features exact --example exact_det_3x3
cargo run --quiet --features exact --example exact_sign_3x3
cargo run --quiet --features exact --example exact_solve_3x3
#!/usr/bin/env bash
set -euo pipefail
cargo build --examples
cargo build --features exact --examples

exe_suffix=""
if [[ "${OS:-}" == "Windows_NT" ]]; then
exe_suffix=".exe"
fi

for example in det_5x5 solve_5x5 ldlt_solve_3x3 const_det_4x4 exact_det_3x3 exact_sign_3x3 exact_solve_3x3; do
"target/debug/examples/${example}${exe_suffix}"
done
Comment on lines +321 to +333

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Verify if all examples compile without and with the exact feature.

echo "Testing: cargo build --examples (no features)"
if cargo build --examples 2>&1 | tee /tmp/build-no-features.log; then
  echo "✓ All examples built without features"
else
  echo "✗ Some examples failed without features"
  echo "Failed examples (if any):"
  grep -i "could not compile\|error" /tmp/build-no-features.log | head -10
fi

echo ""
echo "Testing: cargo build --features exact --examples"
if cargo build --features exact --examples 2>&1 | tee /tmp/build-with-exact.log; then
  echo "✓ All examples built with exact feature"
else
  echo "✗ Some examples failed with exact feature"
fi

echo ""
echo "Checking which examples exist:"
fd -t f . target/debug/examples/ -x basename | sort

Repository: acgetchell/la-stack

Length of output: 572


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Cargo.toml: required-features for examples =="
rg -n --hidden -S --no-messages "required-features" Cargo.toml || true
rg -n --hidden -S --no-messages "\\[\\[example\\]\\]" Cargo.toml || true

echo
echo "== Cargo.toml: feature named 'exact' definition ==" 
rg -n --hidden -S --no-messages "^[[:space:]]*exact[[:space:]]*=" Cargo.toml || true
rg -n --hidden -S --no-messages "\\bfeatures\\b" Cargo.toml | head -50

echo
echo "== Search for cfg(feature = \"exact\") usage (examples + src) =="
rg -n --hidden -S --no-messages "cfg\\(.*feature\\s*=\\s*\"exact\".*\\)" Cargo.toml src examples . || true

echo
echo "== Search example sources for exact APIs (det_exact/solve_exact/etc.) =="
rg -n --hidden -S --no-messages "\\bdet_exact\\b|\\bdet_exact_f64\\b|\\bdet_sign_exact\\b|\\bsolve_exact\\b|\\bsolve_exact_f64\\b" examples src || true

echo
echo "== List example files that likely correspond to the justfile names =="
fd -t f -a -S "exact_(det|sign|solve)_3x3|exact_det_3x3|exact_sign_3x3|exact_solve_3x3|det_5x5|solve_5x5|ldlt_solve_3x3|const_det_4x4" -E target . || true

echo
echo "== Show those example files (header area + exact feature usage if present) =="
# Attempt to locate and print small sections only
fd -t f -a -S "examples/(exact_(det|sign|solve)_3x3|det_5x5|solve_5x5|ldlt_solve_3x3|const_det_4x4)\\.rs$" . -e rs || true

Repository: acgetchell/la-stack

Length of output: 13006


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Cargo.toml example blocks (lines 25-80) =="
nl -ba Cargo.toml | sed -n '1,120p' | sed -n '25,120p'

Repository: acgetchell/la-stack

Length of output: 170


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== Cargo.toml section around required-features = [ \"exact\" ] (lines ~20-70) =="
cat -n Cargo.toml | sed -n '20,80p'

Repository: acgetchell/la-stack

Length of output: 1491


🏁 Script executed:

#!/bin/bash
set -euo pipefail

for ex in det_5x5 solve_5x5 ldlt_solve_3x3 const_det_4x4; do
  echo "== $ex =="
  rg -n "\\[\\[example\\]\\]|name = \"${ex}\"|required-features" Cargo.toml -n || true
done

echo
echo "== All example blocks with required-features =="
rg -n "\\[\\[example\\]\\]|required-features" Cargo.toml

Repository: acgetchell/la-stack

Length of output: 1328


🏁 Script executed:

#!/bin/bash
set -euo pipefail

for ex in det_5x5 solve_5x5 ldlt_solve_3x3 const_det_4x4 exact_det_3x3 exact_sign_3x3 exact_solve_3x3; do
  echo "== Context for name = \"$ex\" =="
  rg -n --fixed-strings "name = \"$ex\"" Cargo.toml -C 6 || true
  echo
done

Repository: acgetchell/la-stack

Length of output: 1156


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== List example source files under examples/ =="
find examples -maxdepth 1 -type f -name "*.rs" -printf "%f\n" | sort || true

echo
echo "== Search for these example names in Cargo.toml =="
for ex in det_5x5 solve_5x5 ldlt_solve_3x3 const_det_4x4; do
  echo "-- $ex --"
  rg -n --fixed-strings "name = \"$ex\"" Cargo.toml || true
done

echo
echo "== Search for these example names in the repo =="
for ex in det_5x5 solve_5x5 ldlt_solve_3x3 const_det_4x4; do
  echo "-- $ex --"
  rg -n --fixed-strings "$ex" . || true
done

echo
echo "== Build logging (no tee): cargo build --examples =="
rm -f /tmp/build-no-features.log
if cargo build --examples > /tmp/build-no-features.log 2>&1; then
  echo "✓ cargo build --examples succeeded"
else
  echo "✗ cargo build --examples failed (showing tail of log)"
  tail -n 80 /tmp/build-no-features.log
fi

echo
echo "== Build logging: cargo build --features exact --examples =="
rm -f /tmp/build-with-exact.log
if cargo build --features exact --examples > /tmp/build-with-exact.log 2>&1; then
  echo "✓ cargo build --features exact --examples succeeded"
else
  echo "✗ cargo build --features exact --examples failed (showing tail of log)"
  tail -n 80 /tmp/build-with-exact.log
fi

Repository: acgetchell/la-stack

Length of output: 2729


Drop the redundant first build in justfile (build once with --features exact)

  • cargo build --examples is unnecessary: cargo build --features exact --examples already succeeds and will compile all the examples you later run (including the non-exact_* ones and the exact_* ones).
  • The example list is still hardcoded (maintainability); consider deriving it from examples/*.rs or cargo metadata.
  • ${OS:-} == "Windows_NT" handling is fine for typical Windows runners, but it won’t work in WSL (minor/optional).
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@justfile` around lines 321 - 333, Remove the redundant plain build invocation
and use a single feature-enabled build: delete the line with "cargo build
--examples" and keep only "cargo build --features exact --examples"; then
replace the hardcoded example list in the "for example in det_5x5 ..." loop with
a dynamic discovery (e.g., globbing examples/*.rs and stripping .rs to produce
each example name) while preserving the exe_suffix logic and the invocation
pattern "target/debug/examples/${example}${exe_suffix}" so CI runs the
exact-built example binaries without manual list maintenance.



# Fix (mutating): apply formatters/auto-fixes
fix: toml-fmt fmt python-fix shell-fmt markdown-fix yaml-fix
Expand Down Expand Up @@ -492,35 +499,35 @@ setup-tools:

echo "Ensuring cargo tools..."
cargo_llvm_cov_version="{{cargo_llvm_cov_version}}"
if ! have cargo-llvm-cov || [[ "$(cargo llvm-cov --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)" != "$cargo_llvm_cov_version" ]]; then
if ! have cargo-llvm-cov || [[ "$(cargo llvm-cov --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true)" != "$cargo_llvm_cov_version" ]]; then
cargo install --locked cargo-llvm-cov --version "$cargo_llvm_cov_version"
fi
cargo_nextest_version="{{cargo_nextest_version}}"
if ! cargo nextest --version >/dev/null 2>&1 || [[ "$(cargo nextest --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)" != "$cargo_nextest_version" ]]; then
if ! cargo nextest --version >/dev/null 2>&1 || [[ "$(cargo nextest --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true)" != "$cargo_nextest_version" ]]; then
cargo install --locked cargo-nextest --version "$cargo_nextest_version"
fi
dprint_version="{{dprint_version}}"
if ! have dprint || [[ "$(dprint --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)" != "$dprint_version" ]]; then
if ! have dprint || [[ "$(dprint --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true)" != "$dprint_version" ]]; then
cargo install --locked dprint --version "$dprint_version"
fi
git_cliff_version="{{git_cliff_version}}"
if ! have git-cliff || [[ "$(git-cliff --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)" != "$git_cliff_version" ]]; then
if ! have git-cliff || [[ "$(git-cliff --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true)" != "$git_cliff_version" ]]; then
cargo install --locked git-cliff --version "$git_cliff_version"
fi
rumdl_version="{{rumdl_version}}"
if ! have rumdl || [[ "$(rumdl --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)" != "$rumdl_version" ]]; then
if ! have rumdl || [[ "$(rumdl --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true)" != "$rumdl_version" ]]; then
cargo install --locked rumdl --version "$rumdl_version"
fi
taplo_version="{{taplo_version}}"
if ! have taplo || [[ "$(taplo --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)" != "$taplo_version" ]]; then
if ! have taplo || [[ "$(taplo --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true)" != "$taplo_version" ]]; then
cargo install --locked taplo-cli --version "$taplo_version"
fi
typos_version="{{typos_version}}"
if ! have typos || [[ "$(typos --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)" != "$typos_version" ]]; then
if ! have typos || [[ "$(typos --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true)" != "$typos_version" ]]; then
cargo install --locked typos-cli --version "$typos_version"
fi
zizmor_version="{{zizmor_version}}"
if ! have zizmor || [[ "$(zizmor --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)" != "$zizmor_version" ]]; then
if ! have zizmor || [[ "$(zizmor --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true)" != "$zizmor_version" ]]; then
cargo install --locked zizmor --version "$zizmor_version"
fi
echo ""
Expand All @@ -535,6 +542,11 @@ setup-tools:
exit 1
fi

if ! have jq; then
echo "❌ 'jq' not found. See 'just setup' or install: brew install jq"
echo ""
fi

echo ""
echo "Verifying required commands are available..."
missing=0
Expand Down Expand Up @@ -599,6 +611,8 @@ shell-fmt: _ensure-shfmt

shell-lint: shell-check

shell-fix: shell-fmt

# Spell check (typos)
spell-check: _ensure-typos
#!/usr/bin/env bash
Expand Down Expand Up @@ -707,6 +721,10 @@ toml-lint: _ensure-taplo
echo "No TOML files found to lint."
fi

toml-check: toml-fmt-check toml-lint

toml-fix: toml-fmt

# File validation
validate-json: _ensure-jq
#!/usr/bin/env bash
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ package = true
dev = [
"actionlint-py==1.7.12.24",
"mypy>=1.19.0",
"pytest>=9.0.3",
"pytest==9.0.3",
"ruff>=0.15.14",
"semgrep==1.164.0",
"ty>=0.0.40",
Expand Down
2 changes: 1 addition & 1 deletion scripts/tag_release.py
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/usr/bin/env python3
#!/usr/bin/env -S uv run
"""Create annotated git tags from CHANGELOG.md sections.

Handles GitHub's 125KB tag-annotation size limit by falling back to a short
Expand Down
24 changes: 21 additions & 3 deletions scripts/tests/test_subprocess_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,11 +131,29 @@ def test_run_safe_command_uses_safe_executable(self, mock_run: MagicMock, _mock_
args, _kwargs = mock_run.call_args
assert args[0] == ["/usr/bin/gnuplot", "--version"]

def test_git_convenience_helpers(self) -> None:
assert get_git_commit_hash()
assert get_git_remote_url()
@patch("subprocess_utils.run_git_command")
def test_git_convenience_helpers(self, mock_run_git: MagicMock) -> None:
def fake_run_git(args: list[str], **_kwargs: object) -> subprocess_utils.subprocess.CompletedProcess[str]:
stdout_by_args = {
("rev-parse", "HEAD"): "abc123def456\n",
("remote", "get-url", "origin"): "https://github.com/example/repo.git\n",
("rev-parse", "--git-dir"): ".git\n",
("log", "--oneline", "-n", "1"): "abc123d message\n",
}
return subprocess_utils.subprocess.CompletedProcess(args=["git", *args], returncode=0, stdout=stdout_by_args[tuple(args)])

mock_run_git.side_effect = fake_run_git

assert get_git_commit_hash() == "abc123def456"
assert get_git_remote_url() == "https://github.com/example/repo.git"
assert check_git_repo() is True
assert check_git_history() is True
assert [call_args.args[0] for call_args in mock_run_git.call_args_list] == [
["rev-parse", "HEAD"],
["remote", "get-url", "origin"],
["rev-parse", "--git-dir"],
["log", "--oneline", "-n", "1"],
]

def test_find_project_root(self) -> None:
assert (find_project_root() / "Cargo.toml").is_file()
19 changes: 19 additions & 0 deletions semgrep.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -115,3 +115,22 @@ rules:
- "/.github/workflows/**/*.yaml"
patterns:
- pattern-regex: '(?m)^\s*uses:\s*(?!\./)(?!docker://)[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+(?:/[A-Za-z0-9_.-]+)?@[a-fA-F0-9]{40}\s*$'

- id: la-stack.docs.check-before-fix-command-order
languages:
- regex
severity: WARNING
message: "Document non-mutating just check commands before mutating just fix commands."
metadata:
category: maintainability
rationale: "User-facing workflow docs should encourage validation before mutation."
paths:
include:
- "/AGENTS.md"
- "/README.md"
- "/docs/**/*.md"
- "/justfile"
exclude:
- "/docs/archive/**"
patterns:
- pattern-regex: '(?ms)\bjust\s+fix\b.{0,400}\bjust\s+check\b|\bjust\s+python-fix\b.{0,400}\bjust\s+python-check\b'
2 changes: 1 addition & 1 deletion uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading