libiot 0.1.0

Unified CLI dispatcher for the libiot ecosystem
# libiot — Project Tracker

## Status: v0.1.0 — Initial implementation

## Completed

- [x] Crate scaffolding (Cargo.toml, bin config)
- [x] Error module: 20 variants, unique exit codes 10-29, kind() categories
- [x] Output module: OutputFormat, OutputContext, view structs, render functions
- [x] Settings module: load/save with atomic writes, 0600 perms, LIBIOT_CONFIG_DIR override
- [x] Discovery module: PATH scanning for libiot-* binaries, executable bit check
- [x] Clap argument parsing: all subcommand types, is_builtin()
- [x] Pre-parse dispatch: two-mode main(), delegation hint on misplaced flags
- [x] Commands: get/set/unset alias, get/set/unset env-var
- [x] Commands: list, list aliases, list env-vars
- [x] Commands: install (cargo subprocess, dry-run, --alias), uninstall (cleanup flags)
- [x] Commands: completions (dynamic subcommand augmentation)
- [x] Commands: config-path
- [x] Delegation: alias resolution, env var injection, Unix exec handoff
- [x] E2E tests (17), unit tests (87)
- [x] README.md

## Remaining / Future

- [ ] Windows support: spawn-and-wait fallback for non-Unix
- [ ] Dynamic shell completions: regenerate on install/uninstall hint
- [ ] Delegated sub-CLI completion forwarding
- [ ] `libiot update` command (cargo install --force all installed CLIs)
- [ ] `libiot doctor` command (verify all aliases point to valid binaries)

## Unresolved Questions

- Should `list env-vars` (no filter) show resolved/merged vars or raw settings?
  Currently shows raw settings groups. Resolved vars are shown only with a filter.
- Should `NoCLIsFound` be a warning rather than an error for `list`?
  Currently exit code 22 when no CLIs found on PATH.