297 lines
11 KiB
Plaintext
297 lines
11 KiB
Plaintext
# ╔══════════════════════════════════════════════════════════════════════╗
|
|
# ║ DEVELOPMENT UTILITIES ║
|
|
# ║ Watch, format, lint, docs ║
|
|
# ╚══════════════════════════════════════════════════════════════════════╝
|
|
|
|
# === WORKSPACE ===
|
|
WORKSPACE_ROOT := justfile_directory()
|
|
|
|
# Help for dev module
|
|
help:
|
|
@echo "DEVELOPMENT MODULE"
|
|
@echo ""
|
|
@echo "Code quality:"
|
|
@echo " just dev::fmt Format code"
|
|
@echo " just dev::fmt-check Check format (no changes)"
|
|
@echo " just dev::lint Run clippy linter"
|
|
@echo " just dev::audit Audit dependencies"
|
|
@echo ""
|
|
@echo "Testing & Coverage:"
|
|
@echo " just dev::coverage Generate HTML coverage report"
|
|
@echo " just dev::coverage-ci Generate lcov coverage"
|
|
@echo " just dev::coverage-open Open coverage report"
|
|
@echo ""
|
|
@echo "Benchmarks:"
|
|
@echo " just dev::bench Run benchmarks"
|
|
@echo " just dev::bench-open Run and open benchmark report"
|
|
@echo ""
|
|
@echo "Documentation:"
|
|
@echo " just dev::docs Generate and open docs"
|
|
@echo " just dev::docs-gen Generate docs only"
|
|
@echo ""
|
|
@echo "Common tasks:"
|
|
@echo " just dev::build Build default features"
|
|
@echo " just dev::watch Watch and rebuild on changes"
|
|
@echo " just dev::check Check + fmt + lint"
|
|
@echo ""
|
|
@echo "Inspect:"
|
|
@echo " just dev::info Show workspace info"
|
|
@echo " just dev::tree Show dependency tree"
|
|
|
|
# === CODE FORMATTING ===
|
|
|
|
# Format all code
|
|
[doc("Format code with cargo fmt")]
|
|
fmt:
|
|
@echo "=== Formatting code ==="
|
|
cargo fmt -p typedialog-core -p typedialog -p typedialog-tui -p typedialog-web -p typedialog-ai -p typedialog-prov-gen -p typedialog-ag-core -p typedialog-ag
|
|
@echo "✓ Formatting complete"
|
|
|
|
# Check format without modifying
|
|
[doc("Check format without changes")]
|
|
fmt-check:
|
|
@echo "=== Checking format ==="
|
|
cargo fmt -p typedialog-core -p typedialog -p typedialog-tui -p typedialog-web -p typedialog-ai -p typedialog-prov-gen -p typedialog-ag-core -p typedialog-ag -- --check
|
|
@echo "✓ Format check passed"
|
|
|
|
# === LINTING ===
|
|
|
|
# Run clippy on all targets (alias for lint-rust)
|
|
[doc("Lint code with clippy (Rust only)")]
|
|
lint:
|
|
just dev::lint-rust
|
|
|
|
# Auto-fix clippy warnings
|
|
[doc("Auto-fix clippy warnings")]
|
|
lint-fix:
|
|
#!/bin/bash
|
|
set -e
|
|
cd "{{ WORKSPACE_ROOT }}"
|
|
echo "=== Auto-fixing clippy warnings ==="
|
|
if [ -d "target/debug" ]; then
|
|
echo " → Using: target/debug (exists)"
|
|
cargo clippy --all-targets --all-features --fix --allow-dirty
|
|
else
|
|
echo " → Using: /tmp/typedialog-ci (target/debug does not exist)"
|
|
cargo clippy --target-dir=/tmp/typedialog-ci --all-targets --all-features --fix --allow-dirty
|
|
fi
|
|
echo "✓ Auto-fix complete"
|
|
|
|
# === MULTI-LANGUAGE LINTING ===
|
|
|
|
# Lint Rust code (clippy) - respects existing target/debug
|
|
[doc("Lint Rust with clippy")]
|
|
lint-rust:
|
|
#!/bin/bash
|
|
set -e
|
|
cd "{{ WORKSPACE_ROOT }}"
|
|
echo "=== Linting Rust ==="
|
|
if [ -d "target/debug" ]; then
|
|
echo " → Using: target/debug (exists)"
|
|
cargo clippy --all-targets --all-features -- -D warnings
|
|
else
|
|
echo " → Using: /tmp/typedialog-ci (target/debug does not exist)"
|
|
cargo clippy --target-dir=/tmp/typedialog-ci --all-targets --all-features -- -D warnings
|
|
fi
|
|
echo "✓ Rust linting complete"
|
|
|
|
# Lint bash scripts (shellcheck)
|
|
[doc("Lint bash scripts with shellcheck")]
|
|
lint-bash:
|
|
@echo "=== Linting bash scripts ==="
|
|
@command -v shellcheck >/dev/null || (echo "shellcheck not installed: brew install shellcheck"; exit 1)
|
|
@find . -name "*.sh" -not -path "*/node_modules/*" -not -path "*/target/*" | xargs shellcheck
|
|
@echo "✓ Bash linting complete"
|
|
|
|
# Lint Nickel files (typecheck)
|
|
[doc("Lint Nickel files")]
|
|
lint-nickel:
|
|
@echo "=== Linting Nickel files ==="
|
|
@command -v nickel >/dev/null || (echo "nickel not installed: brew install nickel"; exit 1)
|
|
@find . -name "*.ncl" -not -path "*/node_modules/*" -not -path "*/target/*" | while read f; do \
|
|
echo "Checking $$f"; \
|
|
nickel typecheck "$$f" || exit 1; \
|
|
done
|
|
@echo "✓ Nickel linting complete"
|
|
|
|
# Lint Nushell scripts
|
|
[doc("Lint Nushell scripts")]
|
|
lint-nushell:
|
|
@echo "=== Linting Nushell scripts ==="
|
|
@command -v nu >/dev/null || (echo "nushell not installed: brew install nushell"; exit 1)
|
|
@find . -name "*.nu" -not -path "*/node_modules/*" -not -path "*/target/*" | while read f; do \
|
|
echo "Checking $$f"; \
|
|
nu --check "$$f" || exit 1; \
|
|
done
|
|
@echo "✓ Nushell linting complete"
|
|
|
|
# Lint Markdown syntax (markdownlint-cli2)
|
|
# Covers: docs/**/*.md + root *.md (excludes .claude, .coder, CLAUDE.md)
|
|
[doc("Lint Markdown syntax with markdownlint-cli2")]
|
|
lint-markdown:
|
|
@echo "=== Linting Markdown syntax (docs/ + root) ==="
|
|
@command -v markdownlint-cli2 >/dev/null || (echo "markdownlint-cli2 not installed: npm install -g markdownlint-cli2"; exit 1)
|
|
@markdownlint-cli2 "docs/**/*.md" "*.md"
|
|
@echo "✓ Markdown syntax linting complete"
|
|
|
|
# Auto-fix Markdown lint errors
|
|
# Covers: docs/**/*.md + root *.md (excludes .claude, .coder, CLAUDE.md)
|
|
[doc("Auto-fix Markdown lint errors")]
|
|
lint-markdown-fix:
|
|
@echo "=== Auto-fixing Markdown syntax (docs/ + root) ==="
|
|
@command -v markdownlint-cli2 >/dev/null || (echo "markdownlint-cli2 not installed: npm install -g markdownlint-cli2"; exit 1)
|
|
@markdownlint-cli2 --fix "docs/**/*.md" "*.md"
|
|
@echo "✓ Markdown auto-fix complete"
|
|
|
|
# Lint Markdown prose with Vale (quality, style, grammar)
|
|
# Covers: docs/**/*.md only
|
|
[doc("Lint Markdown prose quality with Vale")]
|
|
lint-markdown-prose:
|
|
@echo "=== Linting Markdown prose quality (docs/ only) ==="
|
|
@command -v vale >/dev/null || (echo "Vale not installed: brew install vale (macOS) or see https://vale.sh"; exit 1)
|
|
@vale docs/
|
|
@echo "✓ Prose linting complete"
|
|
|
|
# Lint Markdown: syntax + prose
|
|
# Complete linting with markdownlint-cli2 (syntax) + Vale (prose quality)
|
|
[doc("Lint Markdown: syntax (markdownlint-cli2) + prose (Vale)")]
|
|
lint-markdown-full:
|
|
@echo "╔═══════════════════════════════════════════════════════════╗"
|
|
@echo "║ MARKDOWN LINTING (SYNTAX + PROSE) ║"
|
|
@echo "╚═══════════════════════════════════════════════════════════╝"
|
|
@echo ""
|
|
just dev::lint-markdown
|
|
@echo ""
|
|
just dev::lint-markdown-prose
|
|
|
|
# Lint all languages
|
|
[doc("Lint all: Rust + bash + Nickel + Nushell + Markdown")]
|
|
lint-all:
|
|
@echo "╔═══════════════════════════════════════════════════════════╗"
|
|
@echo "║ MULTI-LANGUAGE LINTING ║"
|
|
@echo "╚═══════════════════════════════════════════════════════════╝"
|
|
@echo ""
|
|
just dev::lint-rust
|
|
@echo ""
|
|
just dev::lint-bash
|
|
@echo ""
|
|
just dev::lint-nickel
|
|
@echo ""
|
|
just dev::lint-nushell
|
|
@echo ""
|
|
just dev::lint-markdown
|
|
@echo ""
|
|
@echo "✓ All linting complete"
|
|
|
|
# === DEPENDENCY AUDITING ===
|
|
|
|
# Audit dependencies for security
|
|
[doc("Audit dependencies")]
|
|
audit:
|
|
@echo "=== Auditing dependencies ==="
|
|
@command -v cargo-audit >/dev/null || (echo "cargo-audit not installed"; exit 1)
|
|
cargo audit
|
|
@echo "✓ Audit complete"
|
|
|
|
# === DOCUMENTATION ===
|
|
|
|
# Generate documentation
|
|
[doc("Generate rustdoc")]
|
|
docs-gen:
|
|
@echo "=== Generating documentation ==="
|
|
cargo doc --no-deps --all-features
|
|
@echo "✓ Documentation generated"
|
|
|
|
# Generate and open documentation
|
|
[doc("Generate docs and open browser")]
|
|
docs:
|
|
@echo "=== Opening documentation ==="
|
|
cargo doc --no-deps --all-features --open
|
|
@echo "✓ Documentation open"
|
|
|
|
# === BUILD & WATCH ===
|
|
|
|
# Quick build with default features
|
|
[doc("Build default features")]
|
|
build:
|
|
@echo "=== Quick build ==="
|
|
cargo build
|
|
@echo "✓ Build complete"
|
|
|
|
# Watch for changes and rebuild
|
|
[doc("Watch and rebuild on changes")]
|
|
watch:
|
|
@echo "=== Watching for changes... ==="
|
|
@command -v cargo-watch >/dev/null || (echo "cargo-watch not installed"; exit 1)
|
|
cargo watch -x build -x test --clear
|
|
|
|
# === COMPREHENSIVE CHECKS ===
|
|
|
|
# Run check + format + lint (all languages)
|
|
[doc("Check: format + lint (all languages) + compile")]
|
|
check:
|
|
@echo "=== Running comprehensive check ==="
|
|
just dev::fmt-check
|
|
just dev::lint-all
|
|
cargo check --all-features
|
|
@echo "✓ Check complete"
|
|
|
|
# === CODE COVERAGE ===
|
|
|
|
[doc("Generate coverage report (HTML)")]
|
|
coverage:
|
|
@echo "=== Generating code coverage ==="
|
|
cargo llvm-cov --all-features --workspace --html
|
|
@echo "✓ Coverage report: target/llvm-cov/html/index.html"
|
|
|
|
[doc("Generate coverage (lcov for CI)")]
|
|
coverage-ci:
|
|
@echo "=== Generating coverage (CI) ==="
|
|
cargo llvm-cov --all-features --workspace --lcov --output-path lcov.info
|
|
@echo "✓ Coverage file: lcov.info"
|
|
|
|
[doc("Open coverage report")]
|
|
coverage-open:
|
|
@echo "=== Opening coverage report ==="
|
|
cargo llvm-cov --all-features --workspace --open
|
|
|
|
# === BENCHMARKS ===
|
|
|
|
[doc("Run benchmarks")]
|
|
bench:
|
|
@echo "=== Running benchmarks ==="
|
|
cargo bench --workspace
|
|
@echo "✓ Benchmarks complete"
|
|
@echo " Reports: target/criterion/report/index.html"
|
|
|
|
[doc("Run benchmarks and open report")]
|
|
bench-open:
|
|
cargo bench --workspace
|
|
@echo "Opening benchmark report..."
|
|
open target/criterion/report/index.html || xdg-open target/criterion/report/index.html
|
|
|
|
# === WORKSPACE INFO ===
|
|
|
|
# Show workspace information
|
|
[doc("Display workspace info")]
|
|
info:
|
|
@echo "WORKSPACE INFORMATION"
|
|
@echo ""
|
|
@echo "Root: {{ WORKSPACE_ROOT }}"
|
|
@echo ""
|
|
@echo "Crates:"
|
|
@cargo tree --depth 0 | grep -v "^typedialog" || cargo build --message-format=short 2>&1 | grep "Compiling" || true
|
|
@echo ""
|
|
@echo "Features:"
|
|
@echo " Default: CLI + i18n + templates"
|
|
@echo " Available: cli, tui, web, i18n, templates"
|
|
@echo ""
|
|
@echo "Binaries:"
|
|
@ls -1 target/*/typedialog* 2>/dev/null | head -6 || echo " (run 'just build' first)"
|
|
|
|
# Show dependency tree
|
|
[doc("Display dependency tree")]
|
|
tree:
|
|
@echo "=== Dependency tree ==="
|
|
cargo tree --workspace
|