feat: Weevil v1.0.0-beta1 - FTC Project Generator

Cross-platform tool for generating clean, testable FTC robot projects
without editing the SDK installation.

Features:
- Standalone project generation with proper separation from SDK
- Per-project SDK configuration via .weevil.toml
- Local unit testing support (no robot required)
- Cross-platform build/deploy scripts (Linux/macOS/Windows)
- Project upgrade system preserving user code
- Configuration management commands
- Comprehensive test suite (11 passing tests)
- Zero-warning builds

Architecture:
- Pure Rust implementation with embedded Gradle wrapper
- Projects use deployToSDK task to copy code to FTC SDK TeamCode
- Git-ready projects with automatic initialization
- USB and WiFi deployment with auto-detection

Commands:
- weevil new <name> - Create new project
- weevil upgrade <path> - Update project infrastructure
- weevil config <path> - View/modify project configuration
- weevil sdk status/install/update - Manage SDKs

Addresses the core problem: FTC's SDK structure forces students to
edit framework internals instead of separating concerns like industry
standard practices. Weevil enables proper software engineering workflows
for robotics education.
This commit is contained in:
Eric Ratliff
2026-01-24 15:20:18 -06:00
commit 70a1acc2a1
35 changed files with 3558 additions and 0 deletions

78
Cargo.toml Normal file
View File

@@ -0,0 +1,78 @@
[package]
name = "weevil"
version = "1.0.0"
edition = "2021"
authors = ["Eric Ratliff <eric@intrepidfusion.com>"]
description = "FTC robotics project generator - bores into complexity, emerges with clean code"
license = "MIT"
[lib]
name = "weevil"
path = "src/lib.rs"
[[bin]]
name = "weevil"
path = "src/main.rs"
[dependencies]
# CLI framework - beautiful help, subcommands, validation
clap = { version = "4.5", features = ["derive", "cargo"] }
# Filesystem and paths
walkdir = "2.5"
tempfile = "3.13"
dirs = "5.0"
# Templates
tera = "1.20"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
toml = "0.8"
# Embedded resources
include_dir = "0.7"
# Downloads
reqwest = { version = "0.12", features = ["blocking", "stream"] }
tokio = { version = "1.42", features = ["full"] }
# Progress bars
indicatif = "0.17"
# Archive handling
zip = "2.2"
flate2 = "1.0"
tar = "0.4"
# Error handling
anyhow = "1.0"
thiserror = "1.0"
# Git operations
git2 = "0.19"
# Process execution
which = "7.0"
# Colors
colored = "2.1"
[dev-dependencies]
tempfile = "3.13"
assert_cmd = "2.0"
predicates = "3.1"
insta = "1.41"
[build-dependencies]
ureq = { version = "2.10", features = ["json"] }
zip = "2.2"
[profile.release]
opt-level = 3
lto = true
codegen-units = 1
strip = true
[features]
default = []
embedded-gradle = [] # Embed gradle-wrapper.jar in binary (run download-gradle-wrapper.sh first)