[config] skip_core_tasks = true skip_git_env_info = true skip_rust_env_info = true skip_crate_env_info = true # --- Backend --- [tasks.rust-format] description = "Run rustfmt on Rust code" install_crate = "rustfmt" command = "cargo" args = ["fmt", "--", "--emit=files"] [tasks.rust-clippy] description = "Run cargo clippy to lint the code" command = "cargo" args = ["clippy", "--all-targets", "--all-features", "--", "-D", "warnings"] # --- Frontend --- [tasks.typecheck] description = "Run type checks" command = "pnpm" args = ["typecheck"] [tasks.typecheck.windows] command = "cmd.exe" args = ["/d", "/c", "pnpm", "typecheck"] [tasks.knip-report] description = "Report unused frontend code and dependencies" command = "pnpm" args = ["knip:report"] [tasks.knip-report.windows] command = "cmd.exe" args = ["/d", "/c", "pnpm", "knip:report"] [tasks.knip-check] description = "Fail on unused frontend code and dependencies" command = "pnpm" args = ["knip:check"] [tasks.knip-check.windows] command = "cmd.exe" args = ["/d", "/c", "pnpm", "knip:check"] [tasks.lint-staged] description = "Run lint-staged for staged files" command = "pnpm" args = ["exec", "lint-staged"] [tasks.lint-staged.windows] command = "cmd.exe" args = ["/d", "/c", "pnpm", "exec", "lint-staged"] [tasks.i18n-format] description = "Format i18n keys" command = "pnpm" args = ["i18n:format"] [tasks.i18n-format.windows] command = "cmd.exe" args = ["/d", "/c", "pnpm", "i18n:format"] [tasks.i18n-types] description = "Generate i18n key types" command = "pnpm" args = ["i18n:types"] [tasks.i18n-types.windows] command = "cmd.exe" args = ["/d", "/c", "pnpm", "i18n:types"] [tasks.git-add] description = "Add generated files back to git index" command = "git" args = [ "add", "src/locales", "crates/clash-verge-i18n/locales", "src/types/generated", ] # --- Jobs --- [tasks.frontend-format] description = "Frontend format checks" script_runner = "@duckscript" script = ''' # i18n related changes has_i18n = exec git diff --cached --quiet -- src/locales crates/clash-verge-i18n/locales if eq ${has_i18n.code} 1 cm_run_task i18n-format cm_run_task i18n-types cm_run_task git-add end # frontend related changes has_frontend = exec git diff --cached --quiet -- "*.js" "*.jsx" "*.ts" "*.tsx" "*.json" "*.css" "*.scss" "*.html" if eq ${has_frontend.code} 1 cm_run_task lint-staged end ''' # --- Git Hooks --- [tasks.pre-commit] description = "Pre-commit checks: format only" script_runner = "@duckscript" script = ''' # rust related changes has_rust = exec git diff --cached --quiet -- "*.rs" Cargo.toml Cargo.lock if eq ${has_rust.code} 1 cm_run_task rust-format end # frontend checks cm_run_task frontend-format # changelog platform grouping has_changelog = exec git diff --cached --quiet -- Changelog.md if eq ${has_changelog.code} 1 grouped = exec bash scripts-workflow/group_platforms.sh if not eq ${grouped.code} 0 echo "Changelog platform grouping failed" exit 1 end exec git add Changelog.md end ''' [tasks.pre-push] description = "Pre-push checks: lint, typecheck, and unused files" script_runner = "@duckscript" script = ''' has_upstream = exec git rev-parse --abbrev-ref --symbolic-full-name @{u} if not eq ${has_upstream.code} 0 echo "No upstream found, skipping diff-based checks" exit 0 end # rust related changes has_rust = exec git diff @{u}..HEAD --quiet -- "*.rs" Cargo.toml Cargo.lock if eq ${has_rust.code} 1 cm_run_task rust-clippy end # frontend related changes has_frontend = exec git diff @{u}..HEAD --quiet -- "*.js" "*.jsx" "*.ts" "*.tsx" "*.json" "*.css" "*.scss" "*.html" if eq ${has_frontend.code} 1 cm_run_task typecheck cm_run_task knip-check end '''