{"_id":"@azghr/crux","_rev":"15-7d499fdd4e9dbdbc95b05e25c4fc31c6","name":"@azghr/crux","dist-tags":{"latest":"1.0.4"},"versions":{"1.0.0":{"name":"@azghr/crux","version":"1.0.0","keywords":["cli","decision-engine","mcp","developer-tools","architecture","code-review","guardrails"],"license":"MIT","_id":"@azghr/crux@1.0.0","maintainers":[{"name":"azghr","email":"masgharali.eng@gmail.com"}],"homepage":"https://www.npmjs.com/package/@azghr/crux","bugs":{"url":"https://github.com/azghr/crux/issues"},"bin":{"crux":"dist/cli.js","crux-mcp":"dist/mcp.js","crux-serve":"dist/web/server.js"},"dist":{"shasum":"a852c19f314b1e6e972e6a38ad0bcea26b133363","tarball":"https://registry.npmjs.org/@azghr/crux/-/crux-1.0.0.tgz","fileCount":105,"integrity":"sha512-BQNCtL94F1eSmQ5niWNBXqGWS+CxUXq042B4P98A1+n10YcXbVwoGsKL5XMieLXaKt+BTwze7LGbwnT1C78g0w==","signatures":[{"sig":"MEYCIQDc29JqlJdi1XbkQyWxdxY5zooO5rBzE0Ri6b6ZPmWAsAIhALPuNuSkjE89qju3gN7abPdugwV0sKCAy2QwUhXNs8tw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":339178},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./serve":{"types":"./dist/web/server.d.ts","import":"./dist/web/server.js"},"./package.json":"./package.json"},"gitHead":"3b211f4646646b012950fd4b8a55a17b5ca08b72","scripts":{"test":"vitest run","build":"tsc && tsc-alias -f && cp -R src/eval/cases dist/eval/cases && cp -R web/. dist/web","prepack":"npm run build && node scripts/smoke-test.js","prepare":"npm run build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"azghr","email":"masgharali.eng@gmail.com"},"repository":{"url":"git+https://github.com/azghr/crux.git","type":"git"},"_npmVersion":"11.6.2","description":"A decision engine for developers. State a tooling/library/architecture choice; it infers what matters, researches current facts on the web, and returns one ruling — flagging what it could not verify.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"zod":"^3.23.8","openai":"^7.5.0","commander":"^15.0.0","smol-toml":"^1.3.0","@anthropic-ai/sdk":"^0.32.1","@modelcontextprotocol/sdk":"^1.0.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","vitest":"^2.1.8","tsc-alias":"^1.9.2","typescript":"^5.6.3","@types/node":"^22.9.0","@changesets/cli":"^2.31.1","@vitest/coverage-v8":"^2.1.8"},"_npmOperationalInternal":{"tmp":"tmp/crux_1.0.0_1788680077623_0.8760956550163392","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@azghr/crux","version":"1.0.1","keywords":["cli","decision-engine","mcp","developer-tools","architecture","code-review","guardrails"],"license":"MIT","_id":"@azghr/crux@1.0.1","maintainers":[{"name":"azghr","email":"masgharali.eng@gmail.com"}],"homepage":"https://www.npmjs.com/package/@azghr/crux","bugs":{"url":"https://github.com/azghr/crux/issues"},"bin":{"crux":"dist/cli.js","crux-mcp":"dist/mcp.js","crux-serve":"dist/web/server.js"},"dist":{"shasum":"9388009a155c1003a8cd163e5734c41ca8a30922","tarball":"https://registry.npmjs.org/@azghr/crux/-/crux-1.0.1.tgz","fileCount":107,"integrity":"sha512-AeypKZ4E/0yroEqro0gsIxH5L5GgN8LumV932sMlD0zI5ZKl2AxcqNreecz4BspdgcSD8EcpB5U+3A0Z4Ip46A==","signatures":[{"sig":"MEUCIFHYYkFpHRMfcOB81OrE9boqeTPUCD0eC4G854K63vbsAiEA7JJnhKTUhWD+Bz13QQ6ExIxDSTmWsMdqdcxeTdUCa88=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":344337},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./serve":{"types":"./dist/web/server.d.ts","import":"./dist/web/server.js"},"./package.json":"./package.json"},"gitHead":"fece2eb8d019ae972dab4b2e88904aa8cfe35872","scripts":{"test":"vitest run","build":"tsc && tsc-alias -f && cp -R src/eval/cases dist/eval/cases && cp -R web/. dist/web","prepack":"npm run build && node scripts/smoke-test.js","prepare":"npm run build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"azghr","email":"masgharali.eng@gmail.com"},"repository":{"url":"git+https://github.com/azghr/crux.git","type":"git"},"_npmVersion":"11.6.2","description":"A decision engine for developers. State a tooling/library/architecture choice; it infers what matters, researches current facts on the web, and returns one ruling — flagging what it could not verify.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"zod":"^3.23.8","openai":"^7.5.0","commander":"^15.0.0","smol-toml":"^1.3.0","@anthropic-ai/sdk":"^0.32.1","@modelcontextprotocol/sdk":"^1.0.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","vitest":"^2.1.8","tsc-alias":"^1.9.2","typescript":"^5.6.3","@types/node":"^22.9.0","@changesets/cli":"^2.31.1","@vitest/coverage-v8":"^2.1.8"},"_npmOperationalInternal":{"tmp":"tmp/crux_1.0.1_1788682182174_0.5654236084473818","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@azghr/crux","version":"1.0.2","keywords":["cli","decision-engine","mcp","developer-tools","architecture","code-review","guardrails"],"license":"MIT","_id":"@azghr/crux@1.0.2","maintainers":[{"name":"azghr","email":"masgharali.eng@gmail.com"}],"homepage":"https://www.npmjs.com/package/@azghr/crux","bugs":{"url":"https://github.com/azghr/crux/issues"},"bin":{"crux":"dist/cli.js","crux-mcp":"dist/mcp.js","crux-serve":"dist/web/server.js"},"dist":{"shasum":"833155cf131b7ea4513b50488ea6b4a19215887d","tarball":"https://registry.npmjs.org/@azghr/crux/-/crux-1.0.2.tgz","fileCount":107,"integrity":"sha512-KC/0/tdcWZDVuDdE+1XDIriIiBakK2AMYDm5Vk68vbmPwXrqZpDxX4AX9EzalpJX8EEpmsCd29/1iVMJ/1mKug==","signatures":[{"sig":"MEYCIQD44dAChnwe9BIP5fsV7nQi/SEf/yc2ADKSWJ+iJTuV1AIhAIKDXaSAn3r5QNEg8p7klh7Qb/dbelElRv5sVC1TG67f","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":348216},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./serve":{"types":"./dist/web/server.d.ts","import":"./dist/web/server.js"},"./package.json":"./package.json"},"gitHead":"7410f42b2c4b37cc5bd880974f46e0c137b99836","scripts":{"test":"vitest run","build":"tsc && tsc-alias -f && cp -R src/eval/cases dist/eval/cases && cp -R web/. dist/web","prepack":"npm run build && node scripts/smoke-test.js","prepare":"npm run build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"azghr","email":"masgharali.eng@gmail.com"},"repository":{"url":"git+https://github.com/azghr/crux.git","type":"git"},"_npmVersion":"11.6.2","description":"A decision engine for developers. State a tooling/library/architecture choice; it infers what matters, researches current facts on the web, and returns one ruling — flagging what it could not verify.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"zod":"^3.23.8","openai":"^7.5.0","commander":"^15.0.0","smol-toml":"^1.3.0","@anthropic-ai/sdk":"^0.32.1","@modelcontextprotocol/sdk":"^1.0.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","vitest":"^2.1.8","tsc-alias":"^1.9.2","typescript":"^5.6.3","@types/node":"^22.9.0","@changesets/cli":"^2.31.1","@vitest/coverage-v8":"^2.1.8"},"_npmOperationalInternal":{"tmp":"tmp/crux_1.0.2_1788685916701_0.12170265197603003","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@azghr/crux","version":"1.0.3","keywords":["cli","decision-engine","mcp","developer-tools","architecture","code-review","guardrails"],"license":"MIT","_id":"@azghr/crux@1.0.3","maintainers":[{"name":"azghr","email":"masgharali.eng@gmail.com"}],"homepage":"https://www.npmjs.com/package/@azghr/crux","bugs":{"url":"https://github.com/azghr/crux/issues"},"bin":{"crux":"dist/cli.js","crux-mcp":"dist/mcp.js","crux-serve":"dist/web/server.js"},"dist":{"shasum":"22a9e87449987f0110ce7956cd77b58e13febe3f","tarball":"https://registry.npmjs.org/@azghr/crux/-/crux-1.0.3.tgz","fileCount":107,"integrity":"sha512-MYQToZH81ADB3imRvf+IL2Du87P+0FX0yaKWgMHN9eY73oAoi5AqC3tJ+/uMk9fIQJfG/VyUJ+CAWoZGWEaf1g==","signatures":[{"sig":"MEUCIQDVCIucxkVCqwPECu1pxKuaH5R1BFVx8+3gqYO2vWR+dwIgSPvBuIkF+psCjt+y4GODVZO7c/GOSJh0GTQrlmrVkEg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":349354},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./serve":{"types":"./dist/web/server.d.ts","import":"./dist/web/server.js"},"./package.json":"./package.json"},"gitHead":"aed517ae8070967bf853a67b4e85bc0f5f35fab0","scripts":{"test":"vitest run","build":"tsc && tsc-alias -f && cp -R src/eval/cases dist/eval/cases && cp -R web/. dist/web","prepack":"npm run build && node scripts/smoke-test.js","prepare":"npm run build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"azghr","email":"masgharali.eng@gmail.com"},"repository":{"url":"git+https://github.com/azghr/crux.git","type":"git"},"_npmVersion":"11.6.2","description":"A decision engine for developers. State a tooling/library/architecture choice; it infers what matters, researches current facts on the web, and returns one ruling — flagging what it could not verify.","directories":{},"_nodeVersion":"24.12.0","dependencies":{"zod":"^3.23.8","openai":"^7.5.0","commander":"^15.0.0","smol-toml":"^1.3.0","@anthropic-ai/sdk":"^0.32.1","@modelcontextprotocol/sdk":"^1.0.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","vitest":"^2.1.8","tsc-alias":"^1.9.2","typescript":"^5.6.3","@types/node":"^22.9.0","@changesets/cli":"^2.31.1","@vitest/coverage-v8":"^2.1.8"},"_npmOperationalInternal":{"tmp":"tmp/crux_1.0.3_1788707910171_0.38599975483632076","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@azghr/crux","version":"1.0.4","description":"A decision engine for developers. State a tooling/library/architecture choice; it infers what matters, researches current facts on the web, and returns one ruling — flagging what it could not verify.","type":"module","bin":{"crux":"dist/cli.js","crux-serve":"dist/web/server.js","crux-mcp":"dist/mcp.js"},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./serve":{"types":"./dist/web/server.d.ts","import":"./dist/web/server.js"},"./package.json":"./package.json"},"scripts":{"build":"tsc && tsc-alias -f && cp -R src/eval/cases dist/eval/cases && cp -R web/. dist/web","typecheck":"tsc --noEmit","test":"vitest run","prepare":"npm run build","prepack":"npm run build && node scripts/smoke-test.js"},"engines":{"node":">=20"},"dependencies":{"@anthropic-ai/sdk":"^0.32.1","@modelcontextprotocol/sdk":"^1.0.4","commander":"^15.0.0","openai":"^7.5.0","smol-toml":"^1.3.0","zod":"^3.23.8"},"devDependencies":{"@changesets/cli":"^2.31.1","@types/node":"^22.9.0","@vitest/coverage-v8":"^2.1.8","tsc-alias":"^1.9.2","tsx":"^4.19.2","typescript":"^5.6.3","vitest":"^2.1.8"},"license":"MIT","keywords":["cli","decision-engine","mcp","developer-tools","architecture","code-review","guardrails"],"publishConfig":{"access":"public"},"gitHead":"638cc99cbe415c4ba58167b14b0a2bfc26420fb0","_id":"@azghr/crux@1.0.4","_nodeVersion":"24.12.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-AZ613XAAbJCxvzxlCIZyQz+AzR+FcX6EXTMw9eHg80NUAJFZdtZd6mDiLVYU4YOc0G5w5zlouVGanYBXjjIHeA==","shasum":"b5f90225dd304cd72fae20a0eb30433375be4590","tarball":"https://registry.npmjs.org/@azghr/crux/-/crux-1.0.4.tgz","fileCount":107,"unpackedSize":349402,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDzJQdYGLv6LCS/L71yizB3WoXC347mmPklw+oZQV0k4gIhAMcGUxz/qeWHWvL8Zy7xUgbiaNpju1mf5Y1CkcgirWdr"}]},"_npmUser":{"name":"azghr","email":"masgharali.eng@gmail.com"},"directories":{},"maintainers":[{"name":"azghr","email":"masgharali.eng@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/crux_1.0.4_1788713122223_0.02779029852674042"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-06T07:34:37.451Z","modified":"2026-09-06T16:45:22.498Z","0.1.0":"2026-08-18T11:59:42.442Z","0.2.0":"2026-08-18T12:18:17.417Z","0.2.1":"2026-08-18T13:18:59.879Z","0.2.2":"2026-08-18T13:41:50.495Z","0.2.3":"2026-08-18T13:48:11.392Z","0.2.4":"2026-08-18T14:16:21.838Z","0.2.5":"2026-08-18T14:32:07.356Z","0.2.6":"2026-08-18T14:54:33.382Z","1.0.0":"2026-09-06T07:34:37.784Z","1.0.1":"2026-09-06T08:09:42.345Z","1.0.2":"2026-09-06T09:11:56.863Z","1.0.3":"2026-09-06T15:18:30.306Z","1.0.4":"2026-09-06T16:45:22.356Z"},"license":"MIT","keywords":["cli","decision-engine","mcp","developer-tools","architecture","code-review","guardrails"],"description":"A decision engine for developers. State a tooling/library/architecture choice; it infers what matters, researches current facts on the web, and returns one ruling — flagging what it could not verify.","maintainers":[{"name":"azghr","email":"masgharali.eng@gmail.com"}],"readme":"# Crux\n\nA decision engine for developers. State a tooling/library/architecture choice; Crux researches current facts, analyzes what matters for your specific situation, and returns one clear recommendation with explicit uncertainties.\n\n## How it works\n\nCrux analyzes your decision in stages:\n\n1. **Analyze your repository** (optional) - understands your tech stack and constraints\n2. **Research current facts** - gathers latest information from the web\n3. **Evaluate options** - scores candidates against weighted criteria\n4. **Return one ruling** - single recommendation with runner-up and explicit uncertainties\n\n## Installation\n\n```bash\nnpm install -g @azghr/crux\n```\n\nOr use zero-install:\n\n```bash\nnpx @azghr/crux \"your decision here\"\n```\n\n## Setup\n\nOnly two variables are required — endpoints and models are chosen automatically per provider:\n\n```bash\nexport CRUX_PROVIDER=anthropic        # anthropic | openrouter | openai-compat | groq\nexport CRUX_API_KEY=sk-...            # your provider's API key\n```\n\nOptional overrides for custom setups (Ollama, vLLM, custom proxies):\n\n```bash\nexport CRUX_BASE_URL=http://localhost:11434/v1              # generic (mainly for openai-compat)\nexport CRUX_GROQ_BASE_URL=https://api.groq.com/openai/v1    # per-provider, wins over the generic var\nexport CRUX_ANTHROPIC_BASE_URL=https://api.anthropic.com/v1\n```\n\nA generic `CRUX_BASE_URL` that points at a different provider's known host is ignored — it can never send your key to the wrong API. Use the per-provider var in that case. See `.env.example` for ready-to-copy setups.\n\n## Usage\n\n```bash\n# Simple decision\ncrux \"Zustand vs Redux vs Jotai\" -c \"TypeScript, solo dev, SSR\"\n\n# Structured JSON output (pipe to jq)\ncrux --json \"pick an HTTP client\" -c \"Node 20, ESM\" | jq .verdict.recommendation\n\n# Run without web search, or bypass the cache\ncrux \"ORM choice\" -r . --offline --no-cache\n\n# Based on your current repository\ncrux \"add a form library\" -r .\n\n# For specific programming languages\ncrux \"web framework\" -r /path/to/go/repo --eco go\ncrux \"ORM choice\" -r /path/to/python/repo --eco python\n```\n\nThe `-r` flag analyzes your repository to understand your stack automatically. For local repos use `.` for current directory, or specify a path. Remote repos may require authentication tokens.\n\n## Guardrails for AI Agents\n\nCrux provides three integration layers for coding agents:\n\n**1. Rules File (Universal)**\n\n```bash\ncrux rules -r . --also-claude\n```\n\nGenerates `AGENTS.md` with domain-specific guidance for any AI agent.\n\n**2. MCP Server**\n\n```bash\ncrux mcp\n```\n\nExposes tools for MCP-compatible clients (Claude Code, OpenCode, etc.).\n\n**3. Code Review**\n\n```bash\ngit diff | crux review --diff\n```\n\nAnalyzes code changes for potential issues.\n\n## Library Usage\n\n```ts\nimport { Crux } from \"@azghr/crux\";\n\nconst verdict = await new Crux().decide(\n  { decision: \"message queue for a Node service\", constraints: \"AWS, low ops\" },\n  { onStage: (s) => console.log(s) },\n);\nconsole.log(verdict.recommendation, verdict.uncertainties);\n```\n\n## Web UI (`crux-serve`)\n\nSelf-hosted server with a terminal-style web UI. No framework, no build step — the UI ships as static assets served by `crux-serve`.\n\n```bash\nexport CRUX_API_KEY=sk-...\ncrux-serve                 # http://localhost:8787\ncrux-serve --port 8788     # or CRUX_SERVE_PORT / CRUX_SERVE_HOST\n```\n\nThe UI streams pipeline stages live (SSE), lets you pick provider/model per request, and falls back to your server-side env config when no key is supplied. Use it as a library too:\n\n```ts\nimport { startServer } from \"@azghr/crux/serve\";\n\nconst { port, close } = await startServer({ port: 8787 });\n```\n\n## Providers\n\n| Provider        | Web Search               | JSON Mode | Notes                                                     |\n| --------------- | ------------------------ | --------- | --------------------------------------------------------- |\n| `anthropic`     | Yes                      | No        | Default. Full web search support.                         |\n| `openrouter`    | Opt-in (`CRUX_WEB=true`) | Yes       | Many free models available. Web search is pay-per-use.    |\n| `groq`          | No                       | Yes       | Fast inference, no web search.                            |\n| `openai-compat` | No                       | Yes       | Any OpenAI-compatible API. Override with `CRUX_BASE_URL`. |\n\n## Configuration\n\nA `.env` file in the directory where you run the CLI is loaded automatically\n(real exported env vars always win). `CRUX_MODEL`, `CRUX_MODEL_FAST` and\n`CRUX_MODEL_STRONG` override the automatic per-provider model selection; on\n`groq` the current default is `openai/gpt-oss-120b` (fast tier\n`openai/gpt-oss-20b`).\n\n| Variable                      | Default           | Description                                     |\n| ----------------------------- | ----------------- | ----------------------------------------------- |\n| `CRUX_PROVIDER`               | `anthropic`       | LLM provider                                    |\n| `CRUX_API_KEY`                | (required)        | Provider API key                                |\n| `CRUX_BASE_URL`               | Provider-specific | Optional. Override API endpoint (custom setups) |\n| `CRUX_MODEL`                  | Provider default  | Optional. Override model ID                     |\n| `CRUX_MODEL_FAST`             | Provider default  | Optional. Override framing/filter/score model   |\n| `CRUX_MODEL_STRONG`           | Provider default  | Optional. Override research/verdict model       |\n| `CRUX_WEB`                    | `false`           | Enable web search (paid on OpenRouter)          |\n| `CRUX_OFFLINE`                | `false`           | Run without web search                          |\n| `CRUX_TIMEOUT_MS`             | `60000`           | Request timeout in ms                           |\n| `CRUX_MAX_RETRIES`            | `3`               | Retry attempts for transient failures           |\n| `CRUX_MAX_TOKENS_PER_REQUEST` | `4096`            | Output token cap per API call                   |\n| `CRUX_MAX_CALLS`              | `50`              | Max LLM calls per decision                      |\n| `CRUX_MAX_TOKENS`             | `100000`          | Approximate token budget per decision           |\n| `CRUX_CACHE_ENABLED`          | `true`            | Enable file-backed caching                      |\n| `CRUX_NO_CACHE`               | `false`           | Bypass cache for this run                       |\n| `CRUX_CACHE_TTL`              | `86400000`        | Cache entry lifetime (ms)                       |\n| `CRUX_SERVE_PORT`             | `8787`            | Web UI listen port                              |\n| `CRUX_SERVE_HOST`             | `localhost`       | Web UI listen host                              |\n| `CRUX_SERVE_WEB_DIR`          | bundled `web/`    | Override static UI directory                    |\n\n## Logging & Debugging\n\n**JSON output:** `crux --json \"decision\"` emits one JSON record per line on stdout — the verdict on success, a machine-readable `{ \"kind\", ... }` error record on failure. Diagnostics always go to stderr so both streams stay pipeable.\n\n**Quiet mode:** `crux --quiet \"decision\"` to suppress progress output\n\n**Debug:** `crux --debug \"decision\"` or `--log-level debug`\n\n**No colors:** Set `NO_COLOR=1` to disable ANSI codes\n\n## Output Format\n\nExit codes: `0` (success), `1` (error / bad config / budget exceeded), `2` (needs clarification), `3` (unparseable model output), `4` (rate limited). `crux review` exits `1` on a `rethink` verdict.\n\nError record kinds in JSON mode: `config_error`, `clarification`, `budget_exceeded`, `parse_error`, `rate_limited`, `error`.\n\nAll output automatically redacts API keys, passwords, and sensitive data.\n\n## Notes\n\n- Research freshness depends on web search availability\n- Uncertainties are explicitly listed - thin margins or weak evidence appear there\n- Free models may have limited context and rate limits\n- Repository analysis is read-only (except `crux rules` which writes AGENTS.md/CLAUDE.md)\n\n## Development\n\nRequires [just](https://just.systems/) for task automation.\n\n```bash\njust              # Run typecheck + tests + build + smoke test\njust test         # Unit tests\njust coverage     # Tests with coverage report\njust typecheck    # TypeScript type check\njust build        # Compile to dist/\njust smoke        # Release smoke test\njust dev \"...\"    # Run CLI in dev mode (no build needed)\njust eval         # Run evaluation suite\n```\n\n## Release Process\n\nReleases are managed with [Changesets](https://github.com/changesets/changesets).\n\n1. Add a changeset for user-facing changes: `pnpm changeset`\n2. The `Release` GitHub Action opens a version PR on `main`\n3. Merging that PR publishes `@azghr/crux` to npm automatically\n\nRun the local gates with `just check` (typecheck + tests + build + smoke) before pushing.\n","readmeFilename":"README.md"}