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

@zackees zackees commented May 18, 2026

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

Crate Original file LOC Split into
fbuild-cli main.rs 3687 cli/ (16 files)
fbuild-daemon handlers/emulator.rs 3245 handlers/emulator/ (13 files)
fbuild-daemon handlers/operations.rs 2366 handlers/operations/ (8 files)
fbuild-python lib.rs 2094 9 sibling modules
fbuild-deploy esp32.rs 2045 esp32/ (6 files)
fbuild-build esp32/orchestrator.rs 1934 esp32/orchestrator/ (12 files)
fbuild-build compile_database.rs 1693 compile_database/ + tests subdir
fbuild-config ini_parser.rs 1603 ini_parser/ (5 files)
fbuild-config board.rs 1478 board/ (6 files)
fbuild-build pipeline.rs 1424 pipeline/ (8 files)
fbuild-cli mcp.rs 1086 mcp/ (9 files)
fbuild-packages library/esp32_framework.rs 1077 library/esp32_framework/ (7 files)
fbuild-packages disk_cache/index.rs 1053 disk_cache/index/ (5 files)
fbuild-deploy esp32_native.rs 1042 esp32_native/ (7 files)
fbuild-build stm32/orchestrator.rs 1004 stm32/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

zackees and 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

coderabbitai Bot commented May 18, 2026

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 main May 18, 2026
81 of 86 checks passed
Sign up for free to 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