Skip to content

ci(loc-gate): enforce 1000-LOC max per .rs file, refactor 15 oversize files - #252

Merged
zackees merged 16 commits into
mainfrom
loc-gate-refactor
May 18, 2026
Merged

ci(loc-gate): enforce 1000-LOC max per .rs file, refactor 15 oversize files#252
zackees merged 16 commits into
mainfrom
loc-gate-refactor

Conversation

@zackees

Copy link
Copy Markdown
Member

Summary

  • Adds a fast, shell-only GitHub Action (loc-gate.yml) that fails CI if any .rs file outside target/ exceeds 1000 LOC.
  • Exposes the gate status as a CI badge in the README.
  • Refactors 15 files that previously exceeded the threshold by splitting each into a module directory. Public API is preserved everywhere; only code is moved.

LOC gate

The workflow scans every *.rs file in the repo, prints ::error file=...:: annotations for any over 1000 LOC, and exits non-zero. No toolchain bootstrap — pure find + wc, runs in seconds.

Refactored files

CrateOriginal fileLOCSplit into
fbuild-climain.rs3687cli/ (16 files)
fbuild-daemonhandlers/emulator.rs3245handlers/emulator/ (13 files)
fbuild-daemonhandlers/operations.rs2366handlers/operations/ (8 files)
fbuild-pythonlib.rs20949 sibling modules
fbuild-deployesp32.rs2045esp32/ (6 files)
fbuild-buildesp32/orchestrator.rs1934esp32/orchestrator/ (12 files)
fbuild-buildcompile_database.rs1693compile_database/ + tests subdir
fbuild-configini_parser.rs1603ini_parser/ (5 files)
fbuild-configboard.rs1478board/ (6 files)
fbuild-buildpipeline.rs1424pipeline/ (8 files)
fbuild-climcp.rs1086mcp/ (9 files)
fbuild-packageslibrary/esp32_framework.rs1077library/esp32_framework/ (7 files)
fbuild-packagesdisk_cache/index.rs1053disk_cache/index/ (5 files)
fbuild-deployesp32_native.rs1042esp32_native/ (7 files)
fbuild-buildstm32/orchestrator.rs1004stm32/orchestrator/ (5 files)

Approach

Each oversize file was refactored independently by a parallel worktree agent. Every refactor:

  • Preserves the file's public API exactly (no item renamed, no path moved as seen from outside the crate).
  • Adds re-exports via pub use from the new mod.rs (or via existing parent-module declarations).
  • Leaves behavior identical; only code is moved.
  • Was verified by the agent with cargo check -p <crate> and cargo test -p <crate> (where applicable).

A full workspace cargo check --workspace --all-targets was run on the merged branch — passes with no new warnings.

Test plan

  • CI: LOC Gate workflow passes (no .rs file > 1000 LOC).
  • CI: Existing check-* workflows pass (Ubuntu/macOS/Windows).
  • CI: Format, clippy/MSRV, docs workflows pass.
  • CI: Per-platform board build matrix passes.
  • Manual: fbuild build for a small target still works end-to-end.

🤖 Generated with Claude Code

zackeesand others added 16 commits May 18, 2026 13:10
Adds a fast shell-only workflow that scans every .rs file outside target/
and fails the job if any exceeds the 1000-line threshold. Surface gate
status via a CI badge in the README.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…gate
Splits the 2094-line crates/fbuild-python/src/lib.rs into eight topic-focused
modules so every .rs file in this crate is under 900 LOC, satisfying the new
1000-LOC gate. No public API change: the #[pymodule] entry point, all
#[pyclass] types, and all #[pyfunction] registrations are preserved exactly.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 161 files, which is 11 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 730fc472-92ba-4993-abef-eacd70036a7e

📥 Commits

Reviewing files that changed from the base of the PR and between cdb986a and af0f456.

📒 Files selected for processing (161)
  • .github/workflows/loc-gate.yml
  • README.md
  • crates/fbuild-build/src/compile_database.rs
  • crates/fbuild-build/src/compile_database/README.md
  • crates/fbuild-build/src/compile_database/cache_wrapper.rs
  • crates/fbuild-build/src/compile_database/clang.rs
  • crates/fbuild-build/src/compile_database/database.rs
  • crates/fbuild-build/src/compile_database/generate.rs
  • crates/fbuild-build/src/compile_database/mod.rs
  • crates/fbuild-build/src/compile_database/tests/README.md
  • crates/fbuild-build/src/compile_database/tests/cache_wrapper.rs
  • crates/fbuild-build/src/compile_database/tests/clang.rs
  • crates/fbuild-build/src/compile_database/tests/generate.rs
  • crates/fbuild-build/src/compile_database/tests/mod.rs
  • crates/fbuild-build/src/compile_database/tests/serialization_and_write.rs
  • crates/fbuild-build/src/compile_database/types.rs
  • crates/fbuild-build/src/esp32/orchestrator.rs
  • crates/fbuild-build/src/esp32/orchestrator/README.md
  • crates/fbuild-build/src/esp32/orchestrator/boot_artifacts.rs
  • crates/fbuild-build/src/esp32/orchestrator/build.rs
  • crates/fbuild-build/src/esp32/orchestrator/cdc.rs
  • crates/fbuild-build/src/esp32/orchestrator/embed.rs
  • crates/fbuild-build/src/esp32/orchestrator/embed_stage.rs
  • crates/fbuild-build/src/esp32/orchestrator/fingerprint.rs
  • crates/fbuild-build/src/esp32/orchestrator/framework_libs.rs
  • crates/fbuild-build/src/esp32/orchestrator/helpers.rs
  • crates/fbuild-build/src/esp32/orchestrator/local_libs.rs
  • crates/fbuild-build/src/esp32/orchestrator/mod.rs
  • crates/fbuild-build/src/esp32/orchestrator/packages.rs
  • crates/fbuild-build/src/esp32/orchestrator/tests.rs
  • crates/fbuild-build/src/pipeline.rs
  • crates/fbuild-build/src/pipeline/README.md
  • crates/fbuild-build/src/pipeline/build_unflags.rs
  • crates/fbuild-build/src/pipeline/compile.rs
  • crates/fbuild-build/src/pipeline/context.rs
  • crates/fbuild-build/src/pipeline/library.rs
  • crates/fbuild-build/src/pipeline/link.rs
  • crates/fbuild-build/src/pipeline/mod.rs
  • crates/fbuild-build/src/pipeline/project_discovery.rs
  • crates/fbuild-build/src/pipeline/sequential.rs
  • crates/fbuild-build/src/stm32/orchestrator.rs
  • crates/fbuild-build/src/stm32/orchestrator/README.md
  • crates/fbuild-build/src/stm32/orchestrator/arduino_mbed.rs
  • crates/fbuild-build/src/stm32/orchestrator/framework_props.rs
  • crates/fbuild-build/src/stm32/orchestrator/includes.rs
  • crates/fbuild-build/src/stm32/orchestrator/mod.rs
  • crates/fbuild-build/src/stm32/orchestrator/variant_files.rs
  • crates/fbuild-cli/src/README.md
  • crates/fbuild-cli/src/cli/README.md
  • crates/fbuild-cli/src/cli/args.rs
  • crates/fbuild-cli/src/cli/build.rs
  • crates/fbuild-cli/src/cli/clang_tools.rs
  • crates/fbuild-cli/src/cli/compile_many.rs
  • crates/fbuild-cli/src/cli/daemon_cmd.rs
  • crates/fbuild-cli/src/cli/deploy.rs
  • crates/fbuild-cli/src/cli/device.rs
  • crates/fbuild-cli/src/cli/dispatch.rs
  • crates/fbuild-cli/src/cli/lnk.rs
  • crates/fbuild-cli/src/cli/mod.rs
  • crates/fbuild-cli/src/cli/monitor_parse.rs
  • crates/fbuild-cli/src/cli/pio.rs
  • crates/fbuild-cli/src/cli/purge.rs
  • crates/fbuild-cli/src/cli/reset.rs
  • crates/fbuild-cli/src/cli/show.rs
  • crates/fbuild-cli/src/cli/tests.rs
  • crates/fbuild-cli/src/main.rs
  • crates/fbuild-cli/src/mcp.rs
  • crates/fbuild-cli/src/mcp/README.md
  • crates/fbuild-cli/src/mcp/definitions.rs
  • crates/fbuild-cli/src/mcp/jsonrpc.rs
  • crates/fbuild-cli/src/mcp/mod.rs
  • crates/fbuild-cli/src/mcp/prompts.rs
  • crates/fbuild-cli/src/mcp/resources.rs
  • crates/fbuild-cli/src/mcp/server.rs
  • crates/fbuild-cli/src/mcp/tools.rs
  • crates/fbuild-cli/src/mcp/types.rs
  • crates/fbuild-cli/src/mcp/util.rs
  • crates/fbuild-config/src/README.md
  • crates/fbuild-config/src/board.rs
  • crates/fbuild-config/src/board/README.md
  • crates/fbuild-config/src/board/db.rs
  • crates/fbuild-config/src/board/loaders.rs
  • crates/fbuild-config/src/board/methods.rs
  • crates/fbuild-config/src/board/mod.rs
  • crates/fbuild-config/src/board/tests.rs
  • crates/fbuild-config/src/board/types.rs
  • crates/fbuild-config/src/ini_parser.rs
  • crates/fbuild-config/src/ini_parser/README.md
  • crates/fbuild-config/src/ini_parser/mod.rs
  • crates/fbuild-config/src/ini_parser/parser.rs
  • crates/fbuild-config/src/ini_parser/tests.rs
  • crates/fbuild-config/src/ini_parser/values.rs
  • crates/fbuild-config/src/ini_parser/variables.rs
  • crates/fbuild-daemon/src/handlers/README.md
  • crates/fbuild-daemon/src/handlers/emulator.rs
  • crates/fbuild-daemon/src/handlers/emulator/README.md
  • crates/fbuild-daemon/src/handlers/emulator/avr8js_deploy.rs
  • crates/fbuild-daemon/src/handlers/emulator/avr8js_headless.rs
  • crates/fbuild-daemon/src/handlers/emulator/avr8js_npm.rs
  • crates/fbuild-daemon/src/handlers/emulator/avr8js_web.rs
  • crates/fbuild-daemon/src/handlers/emulator/mod.rs
  • crates/fbuild-daemon/src/handlers/emulator/qemu_deploy.rs
  • crates/fbuild-daemon/src/handlers/emulator/runners.rs
  • crates/fbuild-daemon/src/handlers/emulator/select.rs
  • crates/fbuild-daemon/src/handlers/emulator/shared.rs
  • crates/fbuild-daemon/src/handlers/emulator/tests_npm_cache.rs
  • crates/fbuild-daemon/src/handlers/emulator/tests_outcome.rs
  • crates/fbuild-daemon/src/handlers/emulator/tests_process.rs
  • crates/fbuild-daemon/src/handlers/emulator/tests_select_runner.rs
  • crates/fbuild-daemon/src/handlers/operations.rs
  • crates/fbuild-daemon/src/handlers/operations/README.md
  • crates/fbuild-daemon/src/handlers/operations/build.rs
  • crates/fbuild-daemon/src/handlers/operations/common.rs
  • crates/fbuild-daemon/src/handlers/operations/deploy.rs
  • crates/fbuild-daemon/src/handlers/operations/install_deps.rs
  • crates/fbuild-daemon/src/handlers/operations/mod.rs
  • crates/fbuild-daemon/src/handlers/operations/monitor.rs
  • crates/fbuild-daemon/src/handlers/operations/reset.rs
  • crates/fbuild-daemon/src/handlers/operations/tests.rs
  • crates/fbuild-deploy/src/esp32.rs
  • crates/fbuild-deploy/src/esp32/deployer.rs
  • crates/fbuild-deploy/src/esp32/image.rs
  • crates/fbuild-deploy/src/esp32/mod.rs
  • crates/fbuild-deploy/src/esp32/parse.rs
  • crates/fbuild-deploy/src/esp32/qemu.rs
  • crates/fbuild-deploy/src/esp32/tests.rs
  • crates/fbuild-deploy/src/esp32/verify.rs
  • crates/fbuild-deploy/src/esp32_native.rs
  • crates/fbuild-deploy/src/esp32_native/README.md
  • crates/fbuild-deploy/src/esp32_native/mod.rs
  • crates/fbuild-deploy/src/esp32_native/progress.rs
  • crates/fbuild-deploy/src/esp32_native/tests.rs
  • crates/fbuild-deploy/src/esp32_native/transport.rs
  • crates/fbuild-deploy/src/esp32_native/types.rs
  • crates/fbuild-deploy/src/esp32_native/verify.rs
  • crates/fbuild-deploy/src/esp32_native/write.rs
  • crates/fbuild-packages/src/disk_cache/index.rs
  • crates/fbuild-packages/src/disk_cache/index/README.md
  • crates/fbuild-packages/src/disk_cache/index/migrations.rs
  • crates/fbuild-packages/src/disk_cache/index/mod.rs
  • crates/fbuild-packages/src/disk_cache/index/pid.rs
  • crates/fbuild-packages/src/disk_cache/index/queries.rs
  • crates/fbuild-packages/src/disk_cache/index/tests.rs
  • crates/fbuild-packages/src/library/esp32_framework.rs
  • crates/fbuild-packages/src/library/esp32_framework/README.md
  • crates/fbuild-packages/src/library/esp32_framework/fs_utils.rs
  • crates/fbuild-packages/src/library/esp32_framework/libs.rs
  • crates/fbuild-packages/src/library/esp32_framework/mod.rs
  • crates/fbuild-packages/src/library/esp32_framework/parsing.rs
  • crates/fbuild-packages/src/library/esp32_framework/paths.rs
  • crates/fbuild-packages/src/library/esp32_framework/sdk_paths.rs
  • crates/fbuild-packages/src/library/esp32_framework/tests.rs
  • crates/fbuild-python/src/async_daemon_connection.rs
  • crates/fbuild-python/src/async_serial_monitor.rs
  • crates/fbuild-python/src/daemon.rs
  • crates/fbuild-python/src/daemon_connection.rs
  • crates/fbuild-python/src/json_rpc.rs
  • crates/fbuild-python/src/lib.rs
  • crates/fbuild-python/src/messages.rs
  • crates/fbuild-python/src/outcome.rs
  • crates/fbuild-python/src/serial_monitor.rs

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch loc-gate-refactor

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@zackees
zackees merged commit 2f7a132 into mainMay 18, 2026
81 of 86 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@zackees