@rune-kit/rune 2.10.0 → 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +65 -6
- package/commands/rune.md +168 -168
- package/compiler/__tests__/detect-invariants.test.js +136 -0
- package/compiler/__tests__/doctor-mesh.test.js +229 -0
- package/compiler/__tests__/hook-dispatch.test.js +91 -0
- package/compiler/__tests__/hooks-antigravity.test.js +118 -0
- package/compiler/__tests__/hooks-cursor.test.js +139 -0
- package/compiler/__tests__/hooks-install.test.js +305 -0
- package/compiler/__tests__/hooks-merge.test.js +204 -0
- package/compiler/__tests__/hooks-tiers.test.js +519 -0
- package/compiler/__tests__/hooks-windsurf.test.js +115 -0
- package/compiler/__tests__/inject-claude-md.test.js +152 -0
- package/compiler/__tests__/load-invariants.test.js +408 -0
- package/compiler/__tests__/onboard-invariants.test.js +240 -0
- package/compiler/adapters/hooks/antigravity.js +140 -0
- package/compiler/adapters/hooks/claude.js +166 -0
- package/compiler/adapters/hooks/cursor.js +191 -0
- package/compiler/adapters/hooks/index.js +82 -0
- package/compiler/adapters/hooks/tier-emitter.js +182 -0
- package/compiler/adapters/hooks/windsurf.js +202 -0
- package/compiler/bin/rune.js +196 -6
- package/compiler/commands/hook-dispatch.js +87 -0
- package/compiler/commands/hooks/install.js +120 -0
- package/compiler/commands/hooks/merge.js +211 -0
- package/compiler/commands/hooks/presets.js +116 -0
- package/compiler/commands/hooks/status.js +112 -0
- package/compiler/commands/hooks/tiers.js +221 -0
- package/compiler/commands/hooks/uninstall.js +94 -0
- package/compiler/doctor.js +236 -0
- package/contexts/dev.md +34 -34
- package/contexts/research.md +43 -43
- package/contexts/review.md +55 -55
- package/extensions/ai-ml/PACK.md +88 -88
- package/extensions/ai-ml/skills/ai-agents.md +172 -172
- package/extensions/ai-ml/skills/code-sandbox.md +187 -187
- package/extensions/ai-ml/skills/deep-research.md +146 -146
- package/extensions/ai-ml/skills/embedding-search.md +66 -66
- package/extensions/ai-ml/skills/fine-tuning-guide.md +74 -74
- package/extensions/ai-ml/skills/llm-architect.md +125 -125
- package/extensions/ai-ml/skills/llm-integration.md +64 -64
- package/extensions/ai-ml/skills/prompt-patterns.md +72 -72
- package/extensions/ai-ml/skills/rag-patterns.md +66 -66
- package/extensions/ai-ml/skills/web-extraction.md +114 -114
- package/extensions/analytics/PACK.md +92 -92
- package/extensions/analytics/skills/ab-testing.md +72 -72
- package/extensions/analytics/skills/dashboard-patterns.md +83 -83
- package/extensions/analytics/skills/data-validation.md +68 -68
- package/extensions/analytics/skills/funnel-analysis.md +81 -81
- package/extensions/analytics/skills/sql-patterns.md +57 -57
- package/extensions/analytics/skills/statistical-analysis.md +79 -79
- package/extensions/analytics/skills/tracking-setup.md +71 -71
- package/extensions/backend/PACK.md +104 -104
- package/extensions/backend/skills/api-patterns.md +84 -84
- package/extensions/backend/skills/async-pipeline.md +193 -193
- package/extensions/backend/skills/auth-patterns.md +97 -97
- package/extensions/backend/skills/background-jobs.md +133 -133
- package/extensions/backend/skills/caching-patterns.md +108 -108
- package/extensions/backend/skills/cli-generation.md +133 -133
- package/extensions/backend/skills/database-patterns.md +87 -87
- package/extensions/backend/skills/middleware-patterns.md +104 -104
- package/extensions/chrome-ext/PACK.md +93 -93
- package/extensions/chrome-ext/skills/cws-preflight.md +143 -143
- package/extensions/chrome-ext/skills/cws-publish.md +104 -104
- package/extensions/chrome-ext/skills/ext-ai-integration.md +251 -251
- package/extensions/chrome-ext/skills/ext-messaging.md +139 -139
- package/extensions/chrome-ext/skills/ext-storage.md +133 -133
- package/extensions/chrome-ext/skills/mv3-scaffold.md +164 -164
- package/extensions/content/PACK.md +96 -96
- package/extensions/content/skills/blog-patterns.md +88 -88
- package/extensions/content/skills/cms-integration.md +131 -131
- package/extensions/content/skills/content-scoring.md +107 -107
- package/extensions/content/skills/i18n.md +83 -83
- package/extensions/content/skills/mdx-authoring.md +137 -137
- package/extensions/content/skills/reference.md +1014 -1014
- package/extensions/content/skills/seo-patterns.md +67 -67
- package/extensions/content/skills/video-repurpose.md +153 -153
- package/extensions/devops/PACK.md +101 -101
- package/extensions/devops/skills/chaos-testing.md +67 -67
- package/extensions/devops/skills/ci-cd.md +75 -75
- package/extensions/devops/skills/docker.md +58 -58
- package/extensions/devops/skills/edge-serverless.md +163 -163
- package/extensions/devops/skills/infra-as-code.md +158 -158
- package/extensions/devops/skills/kubernetes.md +110 -110
- package/extensions/devops/skills/monitoring.md +57 -57
- package/extensions/devops/skills/server-setup.md +64 -64
- package/extensions/devops/skills/ssl-domain.md +42 -42
- package/extensions/ecommerce/PACK.md +116 -116
- package/extensions/ecommerce/skills/cart-system.md +79 -79
- package/extensions/ecommerce/skills/inventory-mgmt.md +102 -102
- package/extensions/ecommerce/skills/order-management.md +126 -126
- package/extensions/ecommerce/skills/payment-integration.md +472 -472
- package/extensions/ecommerce/skills/shopify-dev.md +69 -69
- package/extensions/ecommerce/skills/subscription-billing.md +93 -93
- package/extensions/ecommerce/skills/tax-compliance.md +117 -117
- package/extensions/gamedev/PACK.md +142 -142
- package/extensions/gamedev/skills/asset-pipeline.md +74 -74
- package/extensions/gamedev/skills/audio-system.md +129 -129
- package/extensions/gamedev/skills/camera-system.md +87 -87
- package/extensions/gamedev/skills/ecs.md +98 -98
- package/extensions/gamedev/skills/game-loops.md +72 -72
- package/extensions/gamedev/skills/input-system.md +199 -199
- package/extensions/gamedev/skills/multiplayer.md +180 -180
- package/extensions/gamedev/skills/particles.md +105 -105
- package/extensions/gamedev/skills/physics-engine.md +89 -89
- package/extensions/gamedev/skills/scene-management.md +146 -146
- package/extensions/gamedev/skills/threejs-patterns.md +90 -90
- package/extensions/gamedev/skills/webgl.md +71 -71
- package/extensions/mobile/PACK.md +106 -106
- package/extensions/mobile/skills/app-store-connect.md +152 -152
- package/extensions/mobile/skills/app-store-prep.md +66 -66
- package/extensions/mobile/skills/deep-linking.md +109 -109
- package/extensions/mobile/skills/flutter.md +60 -60
- package/extensions/mobile/skills/ios-build-pipeline.md +142 -142
- package/extensions/mobile/skills/native-bridge.md +66 -66
- package/extensions/mobile/skills/ota-updates.md +97 -97
- package/extensions/mobile/skills/push-notifications.md +111 -111
- package/extensions/mobile/skills/react-native.md +82 -82
- package/extensions/saas/PACK.md +116 -116
- package/extensions/saas/skills/billing-integration.md +200 -200
- package/extensions/saas/skills/feature-flags.md +130 -130
- package/extensions/saas/skills/multi-tenant.md +103 -103
- package/extensions/saas/skills/onboarding-flow.md +139 -139
- package/extensions/saas/skills/subscription-flow.md +95 -95
- package/extensions/saas/skills/team-management.md +144 -144
- package/extensions/security/PACK.md +99 -99
- package/extensions/security/skills/api-security.md +140 -140
- package/extensions/security/skills/compliance.md +68 -68
- package/extensions/security/skills/owasp-audit.md +64 -64
- package/extensions/security/skills/pentest-patterns.md +77 -77
- package/extensions/security/skills/secret-mgmt.md +65 -65
- package/extensions/security/skills/supply-chain.md +65 -65
- package/extensions/trading/PACK.md +80 -80
- package/extensions/trading/skills/chart-components.md +55 -55
- package/extensions/trading/skills/experiment-loop.md +125 -125
- package/extensions/trading/skills/fintech-patterns.md +47 -47
- package/extensions/trading/skills/indicator-library.md +58 -58
- package/extensions/trading/skills/quant-analysis.md +111 -111
- package/extensions/trading/skills/realtime-data.md +58 -58
- package/extensions/trading/skills/trade-logic.md +104 -104
- package/extensions/ui/PACK.md +130 -130
- package/extensions/ui/skills/a11y-audit.md +91 -91
- package/extensions/ui/skills/animation-patterns.md +127 -127
- package/extensions/ui/skills/component-patterns.md +100 -100
- package/extensions/ui/skills/design-decision.md +108 -108
- package/extensions/ui/skills/design-system.md +68 -68
- package/extensions/ui/skills/landing-patterns.md +155 -155
- package/extensions/ui/skills/palette-picker.md +173 -173
- package/extensions/ui/skills/react-health.md +90 -90
- package/extensions/ui/skills/type-system.md +125 -125
- package/extensions/ui/skills/web-vitals.md +153 -153
- package/extensions/zalo/PACK.md +145 -145
- package/extensions/zalo/skills/zalo-oa-mcp.md +317 -317
- package/extensions/zalo/skills/zalo-oa-messaging.md +429 -429
- package/extensions/zalo/skills/zalo-oa-setup.md +236 -236
- package/extensions/zalo/skills/zalo-oa-webhook.md +189 -189
- package/extensions/zalo/skills/zalo-personal-messaging.md +194 -194
- package/extensions/zalo/skills/zalo-personal-setup.md +153 -153
- package/extensions/zalo/skills/zalo-rate-guard.md +219 -219
- package/hooks/auto-format/index.cjs +48 -48
- package/hooks/hooks.json +111 -111
- package/hooks/post-session-reflect/index.cjs +189 -189
- package/hooks/pre-compact/index.cjs +95 -95
- package/hooks/run-hook.cmd +1 -1
- package/hooks/secrets-scan/index.cjs +100 -100
- package/hooks/session-start/index.cjs +71 -71
- package/hooks/typecheck/index.cjs +65 -65
- package/package.json +63 -63
- package/references/ui-pro-max-data/LICENSE-UI-PRO-MAX +21 -21
- package/references/ui-pro-max-data/charts.csv +26 -26
- package/references/ui-pro-max-data/colors.csv +161 -161
- package/references/ui-pro-max-data/styles.csv +68 -68
- package/references/ui-pro-max-data/typography.csv +74 -74
- package/references/ui-pro-max-data/ui-reasoning.csv +162 -162
- package/references/ui-pro-max-data/ux-guidelines.csv +99 -99
- package/skills/adversary/SKILL.md +283 -283
- package/skills/asset-creator/SKILL.md +157 -157
- package/skills/audit/SKILL.md +147 -2
- package/skills/autopsy/SKILL.md +335 -335
- package/skills/ba/SKILL.md +85 -1
- package/skills/brainstorm/SKILL.md +380 -342
- package/skills/browser-pilot/SKILL.md +169 -168
- package/skills/constraint-check/SKILL.md +165 -165
- package/skills/context-engine/SKILL.md +408 -404
- package/skills/cook/SKILL.md +917 -863
- package/skills/db/SKILL.md +273 -273
- package/skills/debug/SKILL.md +465 -465
- package/skills/dependency-doctor/SKILL.md +265 -235
- package/skills/deploy/SKILL.md +274 -231
- package/skills/design/DESIGN-REFERENCE.md +365 -365
- package/skills/design/SKILL.md +590 -589
- package/skills/doc-processor/SKILL.md +254 -254
- package/skills/docs/SKILL.md +374 -374
- package/skills/docs-seeker/SKILL.md +178 -177
- package/skills/fix/SKILL.md +332 -330
- package/skills/git/SKILL.md +339 -339
- package/skills/hallucination-guard/SKILL.md +220 -219
- package/skills/incident/SKILL.md +254 -253
- package/skills/integrity-check/SKILL.md +169 -169
- package/skills/journal/SKILL.md +241 -240
- package/skills/launch/SKILL.md +344 -344
- package/skills/logic-guardian/SKILL.md +269 -251
- package/skills/marketing/SKILL.md +351 -289
- package/skills/mcp-builder/SKILL.md +425 -425
- package/skills/neural-memory/SKILL.md +359 -362
- package/skills/onboard/SKILL.md +432 -403
- package/skills/onboard/references/invariants-template.md +76 -0
- package/skills/onboard/scripts/detect-invariants.js +439 -0
- package/skills/onboard/scripts/inject-claude-md.js +150 -0
- package/skills/onboard/scripts/onboard-invariants.js +194 -0
- package/skills/perf/SKILL.md +347 -346
- package/skills/plan/SKILL.md +435 -428
- package/skills/preflight/SKILL.md +415 -415
- package/skills/problem-solver/SKILL.md +380 -284
- package/skills/rescue/SKILL.md +474 -474
- package/skills/research/SKILL.md +4 -0
- package/skills/retro/SKILL.md +3 -1
- package/skills/review/SKILL.md +614 -588
- package/skills/review-intake/SKILL.md +249 -249
- package/skills/safeguard/SKILL.md +200 -200
- package/skills/sast/SKILL.md +190 -190
- package/skills/scaffold/SKILL.md +328 -287
- package/skills/scope-guard/SKILL.md +183 -180
- package/skills/scout/SKILL.md +269 -263
- package/skills/sentinel/SKILL.md +384 -381
- package/skills/sentinel-env/SKILL.md +254 -254
- package/skills/sequential-thinking/SKILL.md +234 -234
- package/skills/session-bridge/SKILL.md +595 -543
- package/skills/session-bridge/scripts/load-invariants.js +397 -0
- package/skills/skill-forge/SKILL.md +581 -581
- package/skills/skill-router/SKILL.md +3 -0
- package/skills/slides/SKILL.md +19 -0
- package/skills/surgeon/SKILL.md +215 -215
- package/skills/team/SKILL.md +557 -537
- package/skills/test/SKILL.md +620 -614
- package/skills/trend-scout/SKILL.md +145 -145
- package/skills/verification/SKILL.md +334 -326
- package/skills/video-creator/SKILL.md +201 -201
- package/skills/watchdog/SKILL.md +168 -168
- package/skills/worktree/SKILL.md +140 -140
|
@@ -1,254 +1,254 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sentinel-env
|
|
3
|
-
description: Environment-aware pre-flight check. Validates OS, runtime versions, installed tools, port availability, env vars, and disk space BEFORE coding starts. Prevents "works on my machine" failures. Like sentinel but for the environment, not the code.
|
|
4
|
-
metadata:
|
|
5
|
-
author: runedev
|
|
6
|
-
version: "0.2.0"
|
|
7
|
-
layer: L3
|
|
8
|
-
model: haiku
|
|
9
|
-
group: validation
|
|
10
|
-
tools: "Bash, Read, Glob, Grep"
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
# sentinel-env
|
|
14
|
-
|
|
15
|
-
## Purpose
|
|
16
|
-
|
|
17
|
-
Catch environment mismatches before they waste debugging time. Validates that the developer's machine has the right runtime versions, tools, ports, and configuration to run the project. Prevents the entire class of "works on my machine" failures that masquerade as code bugs.
|
|
18
|
-
|
|
19
|
-
This is the environment counterpart to `sentinel` (which checks code security) and `preflight` (which checks code quality). sentinel-env checks the MACHINE, not the code.
|
|
20
|
-
|
|
21
|
-
## Triggers
|
|
22
|
-
|
|
23
|
-
- Called by `cook` Phase 0.5 — before planning, after resume check (first run in a new project only)
|
|
24
|
-
- Called by `scaffold` — after project bootstrap, verify environment matches generated config
|
|
25
|
-
- Called by `onboard` — during project onboarding, verify developer can run the project
|
|
26
|
-
- `/rune env-check` — manual environment validation
|
|
27
|
-
- Auto-trigger: when `npm install`, `pip install`, or similar fails during cook
|
|
28
|
-
|
|
29
|
-
## Calls (outbound)
|
|
30
|
-
|
|
31
|
-
None — sentinel-env is a pure read-only utility. It checks and reports, never modifies.
|
|
32
|
-
|
|
33
|
-
## Called By (inbound)
|
|
34
|
-
|
|
35
|
-
- `cook` (L1): Phase 0.5 — first run detection (no `.rune/` directory exists)
|
|
36
|
-
- `scaffold` (L1): post-bootstrap environment validation
|
|
37
|
-
- `onboard` (L2): developer onboarding verification
|
|
38
|
-
- User: `/rune env-check` direct invocation
|
|
39
|
-
|
|
40
|
-
## Execution
|
|
41
|
-
|
|
42
|
-
### Step 1: Detect Project Type
|
|
43
|
-
|
|
44
|
-
Read project configuration files to determine what environment is needed:
|
|
45
|
-
|
|
46
|
-
1. Use `Glob` to check for project config files:
|
|
47
|
-
- `package.json` → Node.js project
|
|
48
|
-
- `pyproject.toml` / `setup.py` / `requirements.txt` → Python project
|
|
49
|
-
- `Cargo.toml` → Rust project
|
|
50
|
-
- `go.mod` → Go project
|
|
51
|
-
- `Gemfile` → Ruby project
|
|
52
|
-
- `docker-compose.yml` / `Dockerfile` → Docker project
|
|
53
|
-
- `.nvmrc` / `.node-version` → specific Node version required
|
|
54
|
-
- `.python-version` → specific Python version required
|
|
55
|
-
|
|
56
|
-
2. Read each detected config file to extract version constraints:
|
|
57
|
-
- `package.json` → `engines.node`, `engines.npm`, dependency versions
|
|
58
|
-
- `pyproject.toml` → `requires-python`, dependency versions
|
|
59
|
-
- `Cargo.toml` → `rust-version`
|
|
60
|
-
- `go.mod` → `go` directive version
|
|
61
|
-
|
|
62
|
-
3. Build an environment requirements checklist from the detected configs.
|
|
63
|
-
|
|
64
|
-
### Step 2: Runtime Version Check
|
|
65
|
-
|
|
66
|
-
For each detected runtime, verify the installed version matches constraints:
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
# Node.js
|
|
70
|
-
node --version # Compare against package.json engines.node or .nvmrc
|
|
71
|
-
npm --version # Compare against package.json engines.npm
|
|
72
|
-
# or pnpm/yarn/bun depending on lockfile present
|
|
73
|
-
|
|
74
|
-
# Python
|
|
75
|
-
python --version # Compare against pyproject.toml requires-python
|
|
76
|
-
pip --version
|
|
77
|
-
|
|
78
|
-
# Rust
|
|
79
|
-
rustc --version # Compare against Cargo.toml rust-version
|
|
80
|
-
cargo --version
|
|
81
|
-
|
|
82
|
-
# Go
|
|
83
|
-
go version # Compare against go.mod go directive
|
|
84
|
-
|
|
85
|
-
# Docker
|
|
86
|
-
docker --version
|
|
87
|
-
docker compose version
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
**Version comparison logic:**
|
|
91
|
-
- If the constraint is `>=18.0.0` and installed is `20.11.1` → PASS
|
|
92
|
-
- If the constraint is `>=18.0.0` and installed is `16.20.2` → BLOCK (wrong major version)
|
|
93
|
-
- If the runtime is not installed at all → BLOCK
|
|
94
|
-
- If no version constraint exists in config → WARN (version unconstrained)
|
|
95
|
-
|
|
96
|
-
### Step 3: Required Tools Check
|
|
97
|
-
|
|
98
|
-
Detect and verify tools the project depends on:
|
|
99
|
-
|
|
100
|
-
1. **Package manager**: Check which lockfile exists and verify the matching tool is installed
|
|
101
|
-
- `package-lock.json` → npm
|
|
102
|
-
- `pnpm-lock.yaml` → pnpm
|
|
103
|
-
- `yarn.lock` → yarn
|
|
104
|
-
- `bun.lockb` → bun
|
|
105
|
-
- `poetry.lock` → poetry
|
|
106
|
-
- `uv.lock` → uv
|
|
107
|
-
- Mismatched lockfile + installed tool → WARN (e.g., yarn.lock exists but only npm installed)
|
|
108
|
-
|
|
109
|
-
2. **Git**: `git --version` — required for all projects
|
|
110
|
-
3. **Docker**: Check only if `Dockerfile` or `docker-compose.yml` exists
|
|
111
|
-
4. **Database tools**: Check if `prisma`, `drizzle`, `alembic`, `django` migrations exist → verify DB client installed
|
|
112
|
-
5. **Build tools**: Check for `turbo.json` (turborepo), `nx.json` (Nx), `Makefile`, etc.
|
|
113
|
-
|
|
114
|
-
6. **Hard dependencies** — tools the project WRAPS (not just uses as dev dependency):
|
|
115
|
-
Scan for evidence that the project wraps an external tool:
|
|
116
|
-
- `Grep` for `shutil.which(`, `which `, `command -v ` → project looks up an executable at runtime
|
|
117
|
-
- `Grep` for `subprocess.run(`, `child_process.exec(`, `Deno.Command(` → project invokes external CLI
|
|
118
|
-
- `Read` README/docs for "requires X installed" or "depends on X"
|
|
119
|
-
|
|
120
|
-
For each detected hard dependency:
|
|
121
|
-
```bash
|
|
122
|
-
# Verify the tool exists on PATH
|
|
123
|
-
which <tool-name> 2>/dev/null || echo "MISSING: <tool-name>"
|
|
124
|
-
# If found, check version
|
|
125
|
-
<tool-name> --version 2>/dev/null
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
**Verdict:**
|
|
129
|
-
- Tool found on PATH → PASS (log version)
|
|
130
|
-
- Tool NOT found → **BLOCK** with clear install instructions per OS:
|
|
131
|
-
```
|
|
132
|
-
[ENV-XXX] Required tool '<tool>' not found on PATH
|
|
133
|
-
→ Debian/Ubuntu: sudo apt install <tool>
|
|
134
|
-
→ macOS: brew install <tool>
|
|
135
|
-
→ Windows: winget install <tool> (or choco install <tool>)
|
|
136
|
-
→ Manual: <download URL if known>
|
|
137
|
-
```
|
|
138
|
-
- This prevents the entire class of "it worked in CI but not locally" failures where `subprocess.run()` silently fails
|
|
139
|
-
|
|
140
|
-
### Step 4: Port Availability Check
|
|
141
|
-
|
|
142
|
-
Detect which ports the project needs and check if they're available:
|
|
143
|
-
|
|
144
|
-
1. Parse port information from:
|
|
145
|
-
- `package.json` scripts (look for `--port`, `-p`, `PORT=` patterns)
|
|
146
|
-
- `.env` / `.env.example` (look for `PORT=`, `DATABASE_URL` with port)
|
|
147
|
-
- `docker-compose.yml` (ports section)
|
|
148
|
-
- Common defaults: 3000 (Next.js/React), 5173 (Vite), 8000 (Django/FastAPI), 5432 (PostgreSQL), 6379 (Redis)
|
|
149
|
-
|
|
150
|
-
2. Check each port:
|
|
151
|
-
```bash
|
|
152
|
-
# Cross-platform port check
|
|
153
|
-
# Windows: netstat -ano | findstr :PORT
|
|
154
|
-
# Unix: lsof -i :PORT or ss -tlnp | grep :PORT
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
3. If port is in use → WARN with the process name using it
|
|
158
|
-
|
|
159
|
-
### Step 5: Environment Variables Check
|
|
160
|
-
|
|
161
|
-
Compare required env vars against actual configuration:
|
|
162
|
-
|
|
163
|
-
1. Read `.env.example` or `.env.template` if it exists
|
|
164
|
-
2. Read `.env` if it exists (DO NOT log values — only check key presence)
|
|
165
|
-
3. For each key in `.env.example`:
|
|
166
|
-
- Present in `.env` → PASS
|
|
167
|
-
- Missing from `.env` → WARN (with the key name, never the expected value)
|
|
168
|
-
4. Check for dangerous patterns:
|
|
169
|
-
- `.env` committed to git (check `.gitignore`) → BLOCK (security risk)
|
|
170
|
-
- Placeholder values still present (`your-api-key-here`, `changeme`, `xxx`) → WARN
|
|
171
|
-
|
|
172
|
-
### Step 6: Disk Space and System Resources
|
|
173
|
-
|
|
174
|
-
Quick system health check:
|
|
175
|
-
|
|
176
|
-
1. **Disk space**: Check available space on the project drive
|
|
177
|
-
- < 1 GB → WARN
|
|
178
|
-
- < 500 MB → BLOCK (npm install / docker build will fail)
|
|
179
|
-
|
|
180
|
-
2. **Platform-specific checks**:
|
|
181
|
-
- **Windows**: Check for long path support (`git config core.longpaths` for node_modules)
|
|
182
|
-
- **macOS**: Check Xcode CLI tools if native modules detected (`node-gyp` in dependencies)
|
|
183
|
-
- **Linux**: Check file watcher limit if large project (`fs.inotify.max_user_watches`)
|
|
184
|
-
|
|
185
|
-
### Step 7: Report
|
|
186
|
-
|
|
187
|
-
Produce a structured environment report:
|
|
188
|
-
|
|
189
|
-
**Verdict logic:**
|
|
190
|
-
- Any BLOCK finding → **BLOCKED** (environment cannot run this project)
|
|
191
|
-
- Any WARN finding → **READY WITH WARNINGS** (can run but may hit issues)
|
|
192
|
-
- All checks pass → **READY** (environment is correctly configured)
|
|
193
|
-
|
|
194
|
-
For each finding, include a specific remediation command the developer can copy-paste.
|
|
195
|
-
|
|
196
|
-
## Output Format
|
|
197
|
-
|
|
198
|
-
```
|
|
199
|
-
## Environment Check: [project name]
|
|
200
|
-
- **Project type**: [Node.js / Python / Rust / Go / Multi]
|
|
201
|
-
- **Checks run**: [count]
|
|
202
|
-
- **Verdict**: READY | READY WITH WARNINGS | BLOCKED
|
|
203
|
-
|
|
204
|
-
### BLOCKED
|
|
205
|
-
- [ENV-001] Node.js 16.20.2 installed but >=18.0.0 required
|
|
206
|
-
→ Fix: `nvm install 18 && nvm use 18`
|
|
207
|
-
|
|
208
|
-
### WARNINGS
|
|
209
|
-
- [ENV-002] Port 3000 in use by process "node" (PID 12345)
|
|
210
|
-
→ Fix: `kill 12345` or change PORT in .env
|
|
211
|
-
- [ENV-003] Missing env var: DATABASE_URL (required by .env.example)
|
|
212
|
-
→ Fix: Copy from .env.example and fill in your database connection string
|
|
213
|
-
|
|
214
|
-
### PASSED
|
|
215
|
-
- [ENV-004] pnpm 9.1.0 ✓ (matches pnpm-lock.yaml)
|
|
216
|
-
- [ENV-005] Git 2.44.0 ✓
|
|
217
|
-
- [ENV-006] Docker 25.0.3 ✓
|
|
218
|
-
- [ENV-007] Disk space: 42 GB available ✓
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
## Constraints
|
|
222
|
-
|
|
223
|
-
1. MUST be read-only — never install, update, or modify anything on the developer's machine
|
|
224
|
-
2. MUST NOT log environment variable VALUES — only check key presence (security)
|
|
225
|
-
3. MUST provide copy-paste remediation commands for every BLOCK and WARN finding
|
|
226
|
-
4. MUST handle cross-platform differences (Windows/macOS/Linux) gracefully
|
|
227
|
-
5. MUST complete in under 10 seconds — use parallel Bash calls where possible
|
|
228
|
-
6. MUST NOT block on WARN findings — only BLOCK findings prevent proceeding
|
|
229
|
-
|
|
230
|
-
## Sharp Edges
|
|
231
|
-
|
|
232
|
-
| Failure Mode | Severity | Mitigation |
|
|
233
|
-
|---|---|---|
|
|
234
|
-
| False BLOCK on version — semver parsing error | HIGH | Use simple major.minor comparison, not full semver regex |
|
|
235
|
-
| Slowness on Windows — netstat/port checks are slower | MEDIUM | Timeout port checks at 3s, skip if slow |
|
|
236
|
-
| .env file contains secrets — accidentally logged | CRITICAL | NEVER read .env values, only check key existence via grep for key names |
|
|
237
|
-
| Platform detection wrong — WSL vs native Windows | MEDIUM | Check for WSL explicitly (`uname -r` contains "microsoft") |
|
|
238
|
-
| Over-checking — flagging optional tools as required | MEDIUM | Only check tools evidenced by config files, not speculative |
|
|
239
|
-
| Missing hard dependency — project wraps external CLI but tool not checked | HIGH | Step 3.6: scan for `shutil.which`, `subprocess.run`, `child_process.exec` → verify tool exists on PATH |
|
|
240
|
-
| Hard dep found but wrong version — tool exists but API changed | MEDIUM | Log version for manual review. Version compatibility is project-specific — don't guess |
|
|
241
|
-
|
|
242
|
-
## Done When
|
|
243
|
-
|
|
244
|
-
- All detected project runtimes version-checked against constraints
|
|
245
|
-
- Package manager matches lockfile type
|
|
246
|
-
- Required ports checked for availability
|
|
247
|
-
- Environment variables compared against .env.example (keys only)
|
|
248
|
-
- Disk space verified adequate
|
|
249
|
-
- Structured report with READY / READY WITH WARNINGS / BLOCKED verdict
|
|
250
|
-
- Every BLOCK/WARN finding has a copy-paste remediation command
|
|
251
|
-
|
|
252
|
-
## Cost Profile
|
|
253
|
-
|
|
254
|
-
~500-1000 tokens input, ~500-1000 tokens output. Haiku model — this is fast, cheap, read-only scanning. Runs once per new project (or on manual invoke). Sub-10-second execution target.
|
|
1
|
+
---
|
|
2
|
+
name: sentinel-env
|
|
3
|
+
description: Environment-aware pre-flight check. Validates OS, runtime versions, installed tools, port availability, env vars, and disk space BEFORE coding starts. Prevents "works on my machine" failures. Like sentinel but for the environment, not the code.
|
|
4
|
+
metadata:
|
|
5
|
+
author: runedev
|
|
6
|
+
version: "0.2.0"
|
|
7
|
+
layer: L3
|
|
8
|
+
model: haiku
|
|
9
|
+
group: validation
|
|
10
|
+
tools: "Bash, Read, Glob, Grep"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# sentinel-env
|
|
14
|
+
|
|
15
|
+
## Purpose
|
|
16
|
+
|
|
17
|
+
Catch environment mismatches before they waste debugging time. Validates that the developer's machine has the right runtime versions, tools, ports, and configuration to run the project. Prevents the entire class of "works on my machine" failures that masquerade as code bugs.
|
|
18
|
+
|
|
19
|
+
This is the environment counterpart to `sentinel` (which checks code security) and `preflight` (which checks code quality). sentinel-env checks the MACHINE, not the code.
|
|
20
|
+
|
|
21
|
+
## Triggers
|
|
22
|
+
|
|
23
|
+
- Called by `cook` Phase 0.5 — before planning, after resume check (first run in a new project only)
|
|
24
|
+
- Called by `scaffold` — after project bootstrap, verify environment matches generated config
|
|
25
|
+
- Called by `onboard` — during project onboarding, verify developer can run the project
|
|
26
|
+
- `/rune env-check` — manual environment validation
|
|
27
|
+
- Auto-trigger: when `npm install`, `pip install`, or similar fails during cook
|
|
28
|
+
|
|
29
|
+
## Calls (outbound)
|
|
30
|
+
|
|
31
|
+
None — sentinel-env is a pure read-only utility. It checks and reports, never modifies.
|
|
32
|
+
|
|
33
|
+
## Called By (inbound)
|
|
34
|
+
|
|
35
|
+
- `cook` (L1): Phase 0.5 — first run detection (no `.rune/` directory exists)
|
|
36
|
+
- `scaffold` (L1): post-bootstrap environment validation
|
|
37
|
+
- `onboard` (L2): developer onboarding verification
|
|
38
|
+
- User: `/rune env-check` direct invocation
|
|
39
|
+
|
|
40
|
+
## Execution
|
|
41
|
+
|
|
42
|
+
### Step 1: Detect Project Type
|
|
43
|
+
|
|
44
|
+
Read project configuration files to determine what environment is needed:
|
|
45
|
+
|
|
46
|
+
1. Use `Glob` to check for project config files:
|
|
47
|
+
- `package.json` → Node.js project
|
|
48
|
+
- `pyproject.toml` / `setup.py` / `requirements.txt` → Python project
|
|
49
|
+
- `Cargo.toml` → Rust project
|
|
50
|
+
- `go.mod` → Go project
|
|
51
|
+
- `Gemfile` → Ruby project
|
|
52
|
+
- `docker-compose.yml` / `Dockerfile` → Docker project
|
|
53
|
+
- `.nvmrc` / `.node-version` → specific Node version required
|
|
54
|
+
- `.python-version` → specific Python version required
|
|
55
|
+
|
|
56
|
+
2. Read each detected config file to extract version constraints:
|
|
57
|
+
- `package.json` → `engines.node`, `engines.npm`, dependency versions
|
|
58
|
+
- `pyproject.toml` → `requires-python`, dependency versions
|
|
59
|
+
- `Cargo.toml` → `rust-version`
|
|
60
|
+
- `go.mod` → `go` directive version
|
|
61
|
+
|
|
62
|
+
3. Build an environment requirements checklist from the detected configs.
|
|
63
|
+
|
|
64
|
+
### Step 2: Runtime Version Check
|
|
65
|
+
|
|
66
|
+
For each detected runtime, verify the installed version matches constraints:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Node.js
|
|
70
|
+
node --version # Compare against package.json engines.node or .nvmrc
|
|
71
|
+
npm --version # Compare against package.json engines.npm
|
|
72
|
+
# or pnpm/yarn/bun depending on lockfile present
|
|
73
|
+
|
|
74
|
+
# Python
|
|
75
|
+
python --version # Compare against pyproject.toml requires-python
|
|
76
|
+
pip --version
|
|
77
|
+
|
|
78
|
+
# Rust
|
|
79
|
+
rustc --version # Compare against Cargo.toml rust-version
|
|
80
|
+
cargo --version
|
|
81
|
+
|
|
82
|
+
# Go
|
|
83
|
+
go version # Compare against go.mod go directive
|
|
84
|
+
|
|
85
|
+
# Docker
|
|
86
|
+
docker --version
|
|
87
|
+
docker compose version
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Version comparison logic:**
|
|
91
|
+
- If the constraint is `>=18.0.0` and installed is `20.11.1` → PASS
|
|
92
|
+
- If the constraint is `>=18.0.0` and installed is `16.20.2` → BLOCK (wrong major version)
|
|
93
|
+
- If the runtime is not installed at all → BLOCK
|
|
94
|
+
- If no version constraint exists in config → WARN (version unconstrained)
|
|
95
|
+
|
|
96
|
+
### Step 3: Required Tools Check
|
|
97
|
+
|
|
98
|
+
Detect and verify tools the project depends on:
|
|
99
|
+
|
|
100
|
+
1. **Package manager**: Check which lockfile exists and verify the matching tool is installed
|
|
101
|
+
- `package-lock.json` → npm
|
|
102
|
+
- `pnpm-lock.yaml` → pnpm
|
|
103
|
+
- `yarn.lock` → yarn
|
|
104
|
+
- `bun.lockb` → bun
|
|
105
|
+
- `poetry.lock` → poetry
|
|
106
|
+
- `uv.lock` → uv
|
|
107
|
+
- Mismatched lockfile + installed tool → WARN (e.g., yarn.lock exists but only npm installed)
|
|
108
|
+
|
|
109
|
+
2. **Git**: `git --version` — required for all projects
|
|
110
|
+
3. **Docker**: Check only if `Dockerfile` or `docker-compose.yml` exists
|
|
111
|
+
4. **Database tools**: Check if `prisma`, `drizzle`, `alembic`, `django` migrations exist → verify DB client installed
|
|
112
|
+
5. **Build tools**: Check for `turbo.json` (turborepo), `nx.json` (Nx), `Makefile`, etc.
|
|
113
|
+
|
|
114
|
+
6. **Hard dependencies** — tools the project WRAPS (not just uses as dev dependency):
|
|
115
|
+
Scan for evidence that the project wraps an external tool:
|
|
116
|
+
- `Grep` for `shutil.which(`, `which `, `command -v ` → project looks up an executable at runtime
|
|
117
|
+
- `Grep` for `subprocess.run(`, `child_process.exec(`, `Deno.Command(` → project invokes external CLI
|
|
118
|
+
- `Read` README/docs for "requires X installed" or "depends on X"
|
|
119
|
+
|
|
120
|
+
For each detected hard dependency:
|
|
121
|
+
```bash
|
|
122
|
+
# Verify the tool exists on PATH
|
|
123
|
+
which <tool-name> 2>/dev/null || echo "MISSING: <tool-name>"
|
|
124
|
+
# If found, check version
|
|
125
|
+
<tool-name> --version 2>/dev/null
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**Verdict:**
|
|
129
|
+
- Tool found on PATH → PASS (log version)
|
|
130
|
+
- Tool NOT found → **BLOCK** with clear install instructions per OS:
|
|
131
|
+
```
|
|
132
|
+
[ENV-XXX] Required tool '<tool>' not found on PATH
|
|
133
|
+
→ Debian/Ubuntu: sudo apt install <tool>
|
|
134
|
+
→ macOS: brew install <tool>
|
|
135
|
+
→ Windows: winget install <tool> (or choco install <tool>)
|
|
136
|
+
→ Manual: <download URL if known>
|
|
137
|
+
```
|
|
138
|
+
- This prevents the entire class of "it worked in CI but not locally" failures where `subprocess.run()` silently fails
|
|
139
|
+
|
|
140
|
+
### Step 4: Port Availability Check
|
|
141
|
+
|
|
142
|
+
Detect which ports the project needs and check if they're available:
|
|
143
|
+
|
|
144
|
+
1. Parse port information from:
|
|
145
|
+
- `package.json` scripts (look for `--port`, `-p`, `PORT=` patterns)
|
|
146
|
+
- `.env` / `.env.example` (look for `PORT=`, `DATABASE_URL` with port)
|
|
147
|
+
- `docker-compose.yml` (ports section)
|
|
148
|
+
- Common defaults: 3000 (Next.js/React), 5173 (Vite), 8000 (Django/FastAPI), 5432 (PostgreSQL), 6379 (Redis)
|
|
149
|
+
|
|
150
|
+
2. Check each port:
|
|
151
|
+
```bash
|
|
152
|
+
# Cross-platform port check
|
|
153
|
+
# Windows: netstat -ano | findstr :PORT
|
|
154
|
+
# Unix: lsof -i :PORT or ss -tlnp | grep :PORT
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
3. If port is in use → WARN with the process name using it
|
|
158
|
+
|
|
159
|
+
### Step 5: Environment Variables Check
|
|
160
|
+
|
|
161
|
+
Compare required env vars against actual configuration:
|
|
162
|
+
|
|
163
|
+
1. Read `.env.example` or `.env.template` if it exists
|
|
164
|
+
2. Read `.env` if it exists (DO NOT log values — only check key presence)
|
|
165
|
+
3. For each key in `.env.example`:
|
|
166
|
+
- Present in `.env` → PASS
|
|
167
|
+
- Missing from `.env` → WARN (with the key name, never the expected value)
|
|
168
|
+
4. Check for dangerous patterns:
|
|
169
|
+
- `.env` committed to git (check `.gitignore`) → BLOCK (security risk)
|
|
170
|
+
- Placeholder values still present (`your-api-key-here`, `changeme`, `xxx`) → WARN
|
|
171
|
+
|
|
172
|
+
### Step 6: Disk Space and System Resources
|
|
173
|
+
|
|
174
|
+
Quick system health check:
|
|
175
|
+
|
|
176
|
+
1. **Disk space**: Check available space on the project drive
|
|
177
|
+
- < 1 GB → WARN
|
|
178
|
+
- < 500 MB → BLOCK (npm install / docker build will fail)
|
|
179
|
+
|
|
180
|
+
2. **Platform-specific checks**:
|
|
181
|
+
- **Windows**: Check for long path support (`git config core.longpaths` for node_modules)
|
|
182
|
+
- **macOS**: Check Xcode CLI tools if native modules detected (`node-gyp` in dependencies)
|
|
183
|
+
- **Linux**: Check file watcher limit if large project (`fs.inotify.max_user_watches`)
|
|
184
|
+
|
|
185
|
+
### Step 7: Report
|
|
186
|
+
|
|
187
|
+
Produce a structured environment report:
|
|
188
|
+
|
|
189
|
+
**Verdict logic:**
|
|
190
|
+
- Any BLOCK finding → **BLOCKED** (environment cannot run this project)
|
|
191
|
+
- Any WARN finding → **READY WITH WARNINGS** (can run but may hit issues)
|
|
192
|
+
- All checks pass → **READY** (environment is correctly configured)
|
|
193
|
+
|
|
194
|
+
For each finding, include a specific remediation command the developer can copy-paste.
|
|
195
|
+
|
|
196
|
+
## Output Format
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
## Environment Check: [project name]
|
|
200
|
+
- **Project type**: [Node.js / Python / Rust / Go / Multi]
|
|
201
|
+
- **Checks run**: [count]
|
|
202
|
+
- **Verdict**: READY | READY WITH WARNINGS | BLOCKED
|
|
203
|
+
|
|
204
|
+
### BLOCKED
|
|
205
|
+
- [ENV-001] Node.js 16.20.2 installed but >=18.0.0 required
|
|
206
|
+
→ Fix: `nvm install 18 && nvm use 18`
|
|
207
|
+
|
|
208
|
+
### WARNINGS
|
|
209
|
+
- [ENV-002] Port 3000 in use by process "node" (PID 12345)
|
|
210
|
+
→ Fix: `kill 12345` or change PORT in .env
|
|
211
|
+
- [ENV-003] Missing env var: DATABASE_URL (required by .env.example)
|
|
212
|
+
→ Fix: Copy from .env.example and fill in your database connection string
|
|
213
|
+
|
|
214
|
+
### PASSED
|
|
215
|
+
- [ENV-004] pnpm 9.1.0 ✓ (matches pnpm-lock.yaml)
|
|
216
|
+
- [ENV-005] Git 2.44.0 ✓
|
|
217
|
+
- [ENV-006] Docker 25.0.3 ✓
|
|
218
|
+
- [ENV-007] Disk space: 42 GB available ✓
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Constraints
|
|
222
|
+
|
|
223
|
+
1. MUST be read-only — never install, update, or modify anything on the developer's machine
|
|
224
|
+
2. MUST NOT log environment variable VALUES — only check key presence (security)
|
|
225
|
+
3. MUST provide copy-paste remediation commands for every BLOCK and WARN finding
|
|
226
|
+
4. MUST handle cross-platform differences (Windows/macOS/Linux) gracefully
|
|
227
|
+
5. MUST complete in under 10 seconds — use parallel Bash calls where possible
|
|
228
|
+
6. MUST NOT block on WARN findings — only BLOCK findings prevent proceeding
|
|
229
|
+
|
|
230
|
+
## Sharp Edges
|
|
231
|
+
|
|
232
|
+
| Failure Mode | Severity | Mitigation |
|
|
233
|
+
|---|---|---|
|
|
234
|
+
| False BLOCK on version — semver parsing error | HIGH | Use simple major.minor comparison, not full semver regex |
|
|
235
|
+
| Slowness on Windows — netstat/port checks are slower | MEDIUM | Timeout port checks at 3s, skip if slow |
|
|
236
|
+
| .env file contains secrets — accidentally logged | CRITICAL | NEVER read .env values, only check key existence via grep for key names |
|
|
237
|
+
| Platform detection wrong — WSL vs native Windows | MEDIUM | Check for WSL explicitly (`uname -r` contains "microsoft") |
|
|
238
|
+
| Over-checking — flagging optional tools as required | MEDIUM | Only check tools evidenced by config files, not speculative |
|
|
239
|
+
| Missing hard dependency — project wraps external CLI but tool not checked | HIGH | Step 3.6: scan for `shutil.which`, `subprocess.run`, `child_process.exec` → verify tool exists on PATH |
|
|
240
|
+
| Hard dep found but wrong version — tool exists but API changed | MEDIUM | Log version for manual review. Version compatibility is project-specific — don't guess |
|
|
241
|
+
|
|
242
|
+
## Done When
|
|
243
|
+
|
|
244
|
+
- All detected project runtimes version-checked against constraints
|
|
245
|
+
- Package manager matches lockfile type
|
|
246
|
+
- Required ports checked for availability
|
|
247
|
+
- Environment variables compared against .env.example (keys only)
|
|
248
|
+
- Disk space verified adequate
|
|
249
|
+
- Structured report with READY / READY WITH WARNINGS / BLOCKED verdict
|
|
250
|
+
- Every BLOCK/WARN finding has a copy-paste remediation command
|
|
251
|
+
|
|
252
|
+
## Cost Profile
|
|
253
|
+
|
|
254
|
+
~500-1000 tokens input, ~500-1000 tokens output. Haiku model — this is fast, cheap, read-only scanning. Runs once per new project (or on manual invoke). Sub-10-second execution target.
|