hello-env · v1.0.1 · 2026-06-20 · sha256 c4ff441a31e58529
hello-env v1.0.1A
Immutable. This exact content never changes and is served at /api/v1/blob/c4ff441a31e58529.
--- name: hello-env description: "Universal dev-environment health check for Linux/macOS hosts, containers, and K8s pods. Pure bash, zero dependencies. Reports OS, current user, Node.js (path + version), Python3, basic tools (git/curl/jq/docker), network (hostname/IP/inferred private subnet), container/K8s detection (configurable env-var probe; defaults to KUBERNETES_SERVICE_HOST + K8S_NAMESPACE), workdir & git status, optional config-file check, and PVC remount detection (device-number + watch-dir count snapshot diff to detect K8s PersistentVolume reattach silently rotating to a fresh disk). Three layers of config: CLI flags > env vars > sensible defaults. Trigger when user says any of: 'check my env', 'environment check', 'hello-env', 'system info', 'is my environment ok', 'what's my IP', 'what env am I in', 'has my PVC been remounted', 'detect K8s pod', 'basic tools check', 'node version', 'who am I' — or 「检查我的环境」「环境自检」「hello-env」「查看系统信息」「环境有没有问题」「IP 是多少」「在什么环境」「PVC 换卷了吗」「基础工具检查」「node 版本」「当前用户是谁」 — or any phrasing expressing the intent to verify a dev environment is healthy / detect container/K8s context / catch silent PVC rotation." license: MIT metadata: author: Evan Song version: "1.0.1" --- # hello-env > A zero-dependency Bash health check for any dev environment — host, container, or K8s pod. > > 一个零依赖的开源环境自检脚本,适用于本地、容器、K8s Pod 环境。 Pure `bash`. No Python, no npm, no third-party packages. Works on macOS, Linux, and inside containers. - **Author**: Evan Song · [github.com/Songhonglei](https://github.com/Songhonglei) - **Repository**: https://github.com/Songhonglei/better-agent-skills - **License**: MIT ## Compatibility | Platform | Status | |---|---| | Linux (any distro) | ✅ Full | | macOS (bash 3.2.57+ default) | ✅ Full — uses `eval`-based indirect var expansion for bash 3.x | | Windows (WSL / WSL2) | ✅ Full (effectively Linux) | | Windows (Git Bash / MSYS / Cygwin) | ⚠️ Partial — OS/user/tools/network checks work; cgroup container detection and PVC monitoring are skipped (Linux-only kernel features) | | Windows (PowerShell / cmd) | ❌ Not supported by design (bash script) | | Agent Platform | Status | |---|---| | Claude Code | ✅ Standard SKILL.md, drops in | | Codex | ✅ Same | | OpenClaw | ✅ Native format | | Cursor / Cline / others | ✅ Generic Markdown + bash, no platform hooks | --- ## Quick start ```bash # Run with defaults (current directory as workdir, default K8s probe vars) bash scripts/check-env.sh # Custom workdir bash scripts/check-env.sh --workdir /opt/myapp # Probe extra environment variables (comma-separated) bash scripts/check-env.sh --probe-env "MY_REGION,MY_TIER,DEPLOY_ENV" # Force PVC monitoring (when K8s probe vars are absent but you still want it) bash scripts/check-env.sh --force-pvc # Combine bash scripts/check-env.sh \ --workdir /opt/myapp \ --watch-dir /opt/myapp/plugins \ --config /etc/myapp/config.json \ --probe-env "MY_REGION,MY_TIER" \ --force-pvc ``` --- ## What it checks | # | Module | Output | |---|---|---| | 1 | OS | macOS / Linux distro + version | | 2 | Current User | `whoami` + UID/GID | | 3 | Node.js | Path (`which node`) + version | | 4 | Python3 | Path + version | | 5 | Basic Tools | git, curl, jq, docker, make — present / missing | | 6 | Network | Hostname + IP + inferred private subnet (10.x / 172.16-31.x / 192.168.x) | | 7 | Container / K8s | Probes configurable env vars; defaults to `KUBERNETES_SERVICE_HOST` + `K8S_NAMESPACE`; falls back to `/.dockerenv` / cgroup heuristics | | 8 | Workdir | Path exists + git initialized check | | 9 | Config file | Only checked if `--config <path>` provided | | 10 | PVC persistence | Mount device-number + watch-dir count snapshot diff (auto when K8s probe hits, or `--force-pvc`) | Output legend: ✅ ok · ℹ️ info · ⚠️ warning · ❌ failure --- ## CLI flags | Flag | Default | Description | |---|---|---| | `--workdir <path>` | `pwd` | Working directory to check (existence + git init) | | `--watch-dir <path>` | `<workdir>` | Directory whose subfolder count is snapshotted for PVC monitoring | | `--config <path>` | _(unset)_ | Optional config file to check existence | | `--probe-env "A,B,C"` | `KUBERNETES_SERVICE_HOST,K8S_NAMESPACE` | Comma-separated env vars to probe for container/K8s context | | `--force-pvc` | off | Force PVC monitoring even when no K8s indicator is found | | `--snapshot-dir <path>` | `<workdir>/.hello-env` | Where to store device/count snapshots | | `-h, --help` | — | Show inline help | --- ## Environment variables (lower priority than CLI flags) | Variable | Equivalent flag | |---|---| | `HELLO_ENV_WORKDIR` | `--workdir` | | `HELLO_ENV_WATCH_DIR` | `--watch-dir` | | `HELLO_ENV_CONFIG` | `--config` | | `HELLO_ENV_PROBE_ENV` | `--probe-env` | | `HELLO_ENV_FORCE_PVC=1` | `--force-pvc` | | `HELLO_ENV_SNAPSHOT_DIR` | `--snapshot-dir` | --- ## PVC remount detection (why this matters) K8s PersistentVolumes can silently get **reattached to a fresh disk** during pod restarts or node failover. Symptoms users typically see: > "All the files I created yesterday are gone after the pod restarted." This script catches it early by snapshotting on each run: - `<snapshot-dir>/last-device` — the mount device for `<workdir>` - `<snapshot-dir>/last-watch-count` — `find <watch-dir> -maxdepth 1 -mindepth 1 -type d | wc -l` Next run decides: | Device | Watch-dir count | Verdict | |---|---|---| | changed | any | ⚠️ Likely PVC remount | | unchanged | decreased | ℹ️ Probably manual removal | | unchanged | not decreased | ✅ Healthy | **When PVC monitoring activates:** - Any of the env vars listed in `--probe-env` is set, OR - `--force-pvc` / `HELLO_ENV_FORCE_PVC=1` is on If neither, you get a hint: > ℹ️ Not detected as containerized environment. Use `--force-pvc` to enable PVC monitoring anyway. --- ## Examples ### CI runner sanity check ```bash bash scripts/check-env.sh --workdir "$CI_PROJECT_DIR" --probe-env "CI,GITLAB_CI,GITHUB_ACTIONS" ``` ### K8s pod with custom labels ```bash bash scripts/check-env.sh \ --probe-env "KUBERNETES_SERVICE_HOST,K8S_NAMESPACE,MY_REGION,MY_TIER" \ --watch-dir /workspace/plugins ``` ### Local Docker container without K8s ```bash bash scripts/check-env.sh --force-pvc --workdir /app ``` --- ## Exit codes - `0` — All checks ran (warnings allowed) - Non-zero only on argument parsing errors This is a **diagnostic** tool, not a gate. It reports — it doesn't block.