{"_id":"@allenpan2026/harshjudge","_rev":"6-519010efddf6953af3bfb2a4cd9f018e","name":"@allenpan2026/harshjudge","dist-tags":{"latest":"0.4.5"},"versions":{"0.4.0":{"name":"@allenpan2026/harshjudge","version":"0.4.0","_id":"@allenpan2026/harshjudge@0.4.0","maintainers":[{"name":"allenpan2026","email":"therealjunchen@163.com"}],"bin":{"harshjudge":"dist/cli.js"},"dist":{"shasum":"eba7b639eebe4dc68192455cd3d124694f717184","tarball":"https://registry.npmjs.org/@allenpan2026/harshjudge/-/harshjudge-0.4.0.tgz","fileCount":18,"integrity":"sha512-9XY3yy6z68lJkKwJJApTe79rgKsKRi5ih1dmNFRsrcXcjiRJGFzMKk5AivIAdKayKYjDqireaiAK0oCUudGt+A==","signatures":[{"sig":"MEQCICJygxt1aXf11rTuGvlRPlh7nwVq0yYtO5Cs5gN+t1SvAiBVeme9WyjH2czbbU3Pyi/5zlSsqU3/4bg+Ugor+fMXtw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":337333},"main":"./dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"a01a04158cf4dbc614775a75ce7f3dbe04db4b3a","scripts":{"dev":"tsup --watch","lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup && vite build","clean":"rm -rf dist dist-ux","build:ux":"vite build","build:cli":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"allenpan2026","email":"therealjunchen@163.com"},"_npmVersion":"11.4.2","description":"AI-native E2E testing orchestration CLI for Claude Code.","directories":{},"_nodeVersion":"23.7.0","dependencies":{"zod":"^3.23.0","react":"^18.3.1","nanoid":"^5.0.9","js-yaml":"^4.1.0","chokidar":"^3.6.0","commander":"^12.0.0","react-dom":"^18.3.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@9.14.4","devDependencies":{"tsup":"^8.5.1","vite":"^5.4.0","jsdom":"^24.0.0","memfs":"^4.6.0","eslint":"^8.57.0","vitest":"^1.6.0","postcss":"^8.4.35","prettier":"^3.2.0","typescript":"^5.3.0","@types/node":"^20.10.0","tailwindcss":"^3.4.1","@types/react":"^18.3.0","autoprefixer":"^10.4.18","@types/js-yaml":"^4.0.9","@types/react-dom":"^18.3.0","@vitest/coverage-v8":"^1.6.0","@vitejs/plugin-react":"^4.3.0","@testing-library/react":"^14.2.0","eslint-config-prettier":"^9.1.0","@testing-library/jest-dom":"^6.4.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/harshjudge_0.4.0_1774146204016_0.9390996842397048","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@allenpan2026/harshjudge","version":"0.4.1","_id":"@allenpan2026/harshjudge@0.4.1","maintainers":[{"name":"allenpan2026","email":"therealjunchen@163.com"}],"bin":{"harshjudge":"dist/cli.js"},"dist":{"shasum":"638552c4060c173d056f75ccd0924377821b19cf","tarball":"https://registry.npmjs.org/@allenpan2026/harshjudge/-/harshjudge-0.4.1.tgz","fileCount":18,"integrity":"sha512-c2fb1cKFdrp/mgcsjcD7otO0dqcDvvE8UNAivb+61n6IamIPVbX4ybjuGWZAWt19ygmGKgc3cFQRhtNsgGX3WA==","signatures":[{"sig":"MEYCIQDT2b0dIk1Tq43qFcPxKp2pxNaP4ZZuCskEUmrXAiHbMAIhAJjxhoLYvLmpd6ZGrn/VhstseFmyEGwyF4QrziFe0WAY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":337663},"main":"./dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"58ed28b6c3c76e2bab2c7ba8cf390d31642ffa72","scripts":{"dev":"tsup --watch","lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup && vite build","clean":"rm -rf dist dist-ux","build:ux":"vite build","build:cli":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"allenpan2026","email":"therealjunchen@163.com"},"_npmVersion":"11.4.2","description":"AI-native E2E testing orchestration CLI for Claude Code.","directories":{},"_nodeVersion":"23.7.0","dependencies":{"zod":"^3.23.0","react":"^18.3.1","nanoid":"^5.0.9","js-yaml":"^4.1.0","chokidar":"^3.6.0","commander":"^12.0.0","react-dom":"^18.3.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@9.14.4","devDependencies":{"tsup":"^8.5.1","vite":"^5.4.0","jsdom":"^24.0.0","memfs":"^4.6.0","eslint":"^8.57.0","vitest":"^1.6.0","postcss":"^8.4.35","prettier":"^3.2.0","typescript":"^5.3.0","@types/node":"^20.10.0","tailwindcss":"^3.4.1","@types/react":"^18.3.0","autoprefixer":"^10.4.18","@types/js-yaml":"^4.0.9","@types/react-dom":"^18.3.0","@vitest/coverage-v8":"^1.6.0","@vitejs/plugin-react":"^4.3.0","@testing-library/react":"^14.2.0","eslint-config-prettier":"^9.1.0","@testing-library/jest-dom":"^6.4.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/harshjudge_0.4.1_1774156873617_0.4987935238340133","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@allenpan2026/harshjudge","version":"0.4.2","_id":"@allenpan2026/harshjudge@0.4.2","maintainers":[{"name":"allenpan2026","email":"therealjunchen@163.com"}],"bin":{"harshjudge":"dist/cli.js"},"dist":{"shasum":"dbb1ae2d6e7137327137aa153dcdbb31756a9a37","tarball":"https://registry.npmjs.org/@allenpan2026/harshjudge/-/harshjudge-0.4.2.tgz","fileCount":18,"integrity":"sha512-bPUr92y8M3qnCAghiYSnJ+3XNb41puJgA2ROUvppAnXA804Lc084N6bHXN+J0Y8tKB136AQIUOK3Bnyfcq+rDA==","signatures":[{"sig":"MEUCIFH0RIxenOXkDEjcCTrkut77sf73maVm40f3duO31lrCAiEA2CvKoo8XIL5pEj2U2i0LCPaiJd17zSSxKREjIoKYe0k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":338458},"main":"./dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"9c72e2bc5ceb728c486fb3bb42e0cfd7df6dc348","scripts":{"dev":"tsup --watch","lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"tsup && vite build","clean":"rm -rf dist dist-ux","build:ux":"vite build","build:cli":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"allenpan2026","email":"therealjunchen@163.com"},"_npmVersion":"11.4.2","description":"AI-native E2E testing orchestration CLI for Claude Code.","directories":{},"_nodeVersion":"23.7.0","dependencies":{"zod":"^3.23.0","react":"^18.3.1","nanoid":"^5.0.9","js-yaml":"^4.1.0","chokidar":"^3.6.0","commander":"^12.0.0","react-dom":"^18.3.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@9.14.4","devDependencies":{"tsup":"^8.5.1","vite":"^5.4.0","jsdom":"^24.0.0","memfs":"^4.6.0","eslint":"^8.57.0","vitest":"^1.6.0","postcss":"^8.4.35","prettier":"^3.2.0","typescript":"^5.3.0","@types/node":"^20.10.0","tailwindcss":"^3.4.1","@types/react":"^18.3.0","autoprefixer":"^10.4.18","@types/js-yaml":"^4.0.9","@types/react-dom":"^18.3.0","@vitest/coverage-v8":"^1.6.0","@vitejs/plugin-react":"^4.3.0","@testing-library/react":"^14.2.0","eslint-config-prettier":"^9.1.0","@testing-library/jest-dom":"^6.4.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/harshjudge_0.4.2_1774227018162_0.6265140927237909","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@allenpan2026/harshjudge","version":"0.4.3","_id":"@allenpan2026/harshjudge@0.4.3","maintainers":[{"name":"allenpan2026","email":"therealjunchen@163.com"}],"bin":{"harshjudge":"dist/cli.js"},"dist":{"shasum":"eeb0e2933dcfb740f5927456207b5b2cbcafdf0b","tarball":"https://registry.npmjs.org/@allenpan2026/harshjudge/-/harshjudge-0.4.3.tgz","fileCount":21,"integrity":"sha512-832xLpRpMgmAJmCSX5dDLTpA29z62iQpZ6wnF7UBvSBk/gX78ZxgEvgFv+VCSdbMMLgVE6YbEwgVtcEkQSyPtg==","signatures":[{"sig":"MEUCIGKfEUDT2FXAQD/LeKD3261E3rWNbu5VLWbGVG5MptXeAiEA6hOtC7R385nq4rhEp9P5OJy5w4IUbQjFedNJ4Gtt5Z0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":622031},"main":"./dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"c9e50ad69ee8fa14f75837513a543e431f651d9c","scripts":{"dev":"tsup --watch","lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"vite build && tsup","clean":"rm -rf dist dist-ux","build:ux":"vite build","build:cli":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"allenpan2026","email":"therealjunchen@163.com"},"_npmVersion":"11.4.2","description":"AI-native E2E testing orchestration CLI for Claude Code.","directories":{},"_nodeVersion":"23.7.0","dependencies":{"zod":"^3.23.0","react":"^18.3.1","nanoid":"^5.0.9","js-yaml":"^4.1.0","chokidar":"^3.6.0","commander":"^12.0.0","react-dom":"^18.3.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@9.14.4","devDependencies":{"tsup":"^8.5.1","vite":"^5.4.0","jsdom":"^24.0.0","memfs":"^4.6.0","eslint":"^8.57.0","vitest":"^1.6.0","postcss":"^8.4.35","prettier":"^3.2.0","typescript":"^5.3.0","@types/node":"^20.10.0","tailwindcss":"^3.4.1","@types/react":"^18.3.0","autoprefixer":"^10.4.18","@types/js-yaml":"^4.0.9","@types/react-dom":"^18.3.0","@vitest/coverage-v8":"^1.6.0","@vitejs/plugin-react":"^4.3.0","@testing-library/react":"^14.2.0","eslint-config-prettier":"^9.1.0","@testing-library/jest-dom":"^6.4.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/harshjudge_0.4.3_1774228187362_0.4400672478784122","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"@allenpan2026/harshjudge","version":"0.4.4","_id":"@allenpan2026/harshjudge@0.4.4","maintainers":[{"name":"allenpan2026","email":"therealjunchen@163.com"}],"bin":{"harshjudge":"dist/cli.js"},"dist":{"shasum":"9ffa43041a5e9f500e8f20251d878730b3899bfa","tarball":"https://registry.npmjs.org/@allenpan2026/harshjudge/-/harshjudge-0.4.4.tgz","fileCount":21,"integrity":"sha512-z0MRa4IpoFnaZ+Ac9sv3ZenHSw9XKzTqjEutUsvnbS1Pjb2Nk6ObtFi4MsJegJHn/SZsfWkFkIUzhIuE586vZQ==","signatures":[{"sig":"MEUCIDyrTi4kPudAqXR0exGl8BeBb/xlakoxr0S6c5QdIW2sAiEAh0UdUCL3OHABRLZKEHTwQjjkopj7u2VDzDiRZS1/0qQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":622303},"main":"./dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"fa86e76302c17daf4869cf21658c190faec66942","scripts":{"dev":"tsup --watch","lint":"eslint src --ext .ts,.tsx","test":"vitest run","build":"vite build && tsup","clean":"rm -rf dist dist-ux","build:ux":"vite build","build:cli":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"allenpan2026","email":"therealjunchen@163.com"},"_npmVersion":"11.4.2","description":"AI-native E2E testing orchestration CLI for Claude Code.","directories":{},"_nodeVersion":"23.7.0","dependencies":{"zod":"^3.23.0","react":"^18.3.1","nanoid":"^5.0.9","js-yaml":"^4.1.0","chokidar":"^3.6.0","commander":"^12.0.0","react-dom":"^18.3.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@9.14.4","devDependencies":{"tsup":"^8.5.1","vite":"^5.4.0","jsdom":"^24.0.0","memfs":"^4.6.0","eslint":"^8.57.0","vitest":"^1.6.0","postcss":"^8.4.35","prettier":"^3.2.0","typescript":"^5.3.0","@types/node":"^20.10.0","tailwindcss":"^3.4.1","@types/react":"^18.3.0","autoprefixer":"^10.4.18","@types/js-yaml":"^4.0.9","@types/react-dom":"^18.3.0","@vitest/coverage-v8":"^1.6.0","@vitejs/plugin-react":"^4.3.0","@testing-library/react":"^14.2.0","eslint-config-prettier":"^9.1.0","@testing-library/jest-dom":"^6.4.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/harshjudge_0.4.4_1774304327909_0.7663721434039437","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"@allenpan2026/harshjudge","version":"0.4.5","description":"AI-native E2E testing orchestration CLI for Claude Code.","type":"module","main":"./dist/index.js","bin":{"harshjudge":"dist/cli.js"},"scripts":{"build":"vite build && tsup","build:cli":"tsup","build:ux":"vite build","dev":"tsup --watch","test":"vitest run","typecheck":"tsc --noEmit","lint":"eslint src --ext .ts,.tsx","clean":"rm -rf dist dist-ux"},"dependencies":{"chokidar":"^3.6.0","commander":"^12.0.0","js-yaml":"^4.1.0","nanoid":"^5.0.9","react":"^18.3.1","react-dom":"^18.3.1","zod":"^3.23.0"},"devDependencies":{"@testing-library/jest-dom":"^6.4.0","@testing-library/react":"^14.2.0","@types/js-yaml":"^4.0.9","@types/node":"^20.10.0","@types/react":"^18.3.0","@types/react-dom":"^18.3.0","@typescript-eslint/eslint-plugin":"^8.0.0","@typescript-eslint/parser":"^8.0.0","@vitest/coverage-v8":"^1.6.0","@vitejs/plugin-react":"^4.3.0","autoprefixer":"^10.4.18","eslint":"^8.57.0","eslint-config-prettier":"^9.1.0","jsdom":"^24.0.0","memfs":"^4.6.0","postcss":"^8.4.35","prettier":"^3.2.0","tailwindcss":"^3.4.1","tsup":"^8.5.1","typescript":"^5.3.0","vite":"^5.4.0","vitest":"^1.6.0"},"packageManager":"pnpm@9.14.4","engines":{"node":">=18.0.0"},"_id":"@allenpan2026/harshjudge@0.4.5","gitHead":"7d34c2d912986c1f8d471d0200f082f6d3dbb955","_nodeVersion":"23.7.0","_npmVersion":"11.4.2","dist":{"integrity":"sha512-suyeHxkyu+mQSoz1XxvNyJiRhECAokwk+RtHy1eWp4kNmOyZXu3HeTEaOErpp0vkthL1HFEZ4t1PJmPyE6Kf5A==","shasum":"5ccdde95864c3d0dff68d126bd3ca2e0e3bbec1d","tarball":"https://registry.npmjs.org/@allenpan2026/harshjudge/-/harshjudge-0.4.5.tgz","fileCount":21,"unpackedSize":625803,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCplP5WDbuNqdhv+ZgAa8LgSsAjRlYTLCMIKBlCtbGjyQIgLhAMAAi3mHd7hKO5O0VzoRRtgKT+21CmwYn6HcC99SM="}]},"_npmUser":{"name":"allenpan2026","email":"therealjunchen@163.com"},"directories":{},"maintainers":[{"name":"allenpan2026","email":"therealjunchen@163.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/harshjudge_0.4.5_1774426687415_0.989228465400505"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-22T02:23:23.910Z","modified":"2026-03-25T08:18:07.694Z","0.4.0":"2026-03-22T02:23:24.170Z","0.4.1":"2026-03-22T05:21:13.771Z","0.4.2":"2026-03-23T00:50:18.310Z","0.4.3":"2026-03-23T01:09:47.546Z","0.4.4":"2026-03-23T22:18:48.139Z","0.4.5":"2026-03-25T08:18:07.591Z"},"description":"AI-native E2E testing orchestration CLI for Claude Code.","maintainers":[{"name":"allenpan2026","email":"therealjunchen@163.com"}],"readme":"# HarshJudge\n\nAI-native E2E testing orchestration for Claude Code. Create, run, and manage end-to-end test scenarios with visual evidence capture — powered by a CLI tool and Claude Code skills.\n\n**Key design:** file-system-as-database (local-first, git-friendly, no cloud dependencies).\n\n## Architecture\n\n```\nClaude Code Skill  →  Bash  →  CLI  →  FileSystem\n   (workflow)               (storage)\n```\n\n| Component | Description |\n|-----------|-------------|\n| **Skill** | Structured workflows that guide Claude through test creation, execution, and iteration |\n| **CLI** | Commands for managing scenarios, runs, evidence, and dashboard lifecycle |\n| **Dashboard** | React-based 3-column UI for browsing results with real-time file watching |\n\n## Quick Start\n\n```bash\n# Install globally\nnpm install -g @allenpan2026/harshjudge\n\n# Or run without installing\nnpx @allenpan2026/harshjudge --help\n\n# Initialize HarshJudge in your project\nharshjudge init my-app\n```\n\n## Prerequisites\n\n- **Node.js**: 18+ LTS\n- **Claude Code**: Latest version\n- **A browser automation tool** (any one of):\n  - Playwright MCP (default, most common)\n  - browser-use MCP (token efficient alternative)\n  - Chrome DevTools MCP\n\n## Installation\n\n### Global Install (Recommended)\n\n```bash\nnpm install -g @allenpan2026/harshjudge\n```\n\n### Or use with npx (no install required)\n\n```bash\nnpx @allenpan2026/harshjudge --help\n```\n\n## CLI Commands\n\n| Command | Purpose |\n|---------|---------|\n| `harshjudge init <name>` | Initialize `.harshJudge/` directory structure |\n| `harshjudge create <slug>` | Create test scenarios with structured step files |\n| `harshjudge star <slug>` | Mark/unmark scenarios as favorites |\n| `harshjudge start <slug>` | Begin a new test execution run |\n| `harshjudge evidence <runId>` | Capture screenshots, logs, DB snapshots |\n| `harshjudge complete-step <runId>` | Mark individual step as pass/fail/skipped |\n| `harshjudge complete-run <runId>` | Finalize run and update scenario statistics |\n| `harshjudge status [slug]` | Query project-wide or per-scenario status |\n| `harshjudge discover tree [path]` | Browse `.harshJudge/` directory structure |\n| `harshjudge discover search <pattern>` | Search file content within `.harshJudge/` |\n| `harshjudge dashboard open` | Start the dashboard UI server |\n| `harshjudge dashboard close` | Stop the dashboard server |\n| `harshjudge dashboard status` | Check if dashboard is running |\n\n## Usage with Claude Code\n\n### 1. Install the Skill\n\nCopy the `skills/harshjudge/` directory to your project:\n\n```bash\ncp -r skills/harshjudge/ .claude/skills/harshjudge/\n```\n\n### 2. Initialize Project\n\nAsk Claude: *\"Initialize HarshJudge in this project\"*\n\nThis runs `harshjudge init` and creates the `.harshJudge/` structure with a config file, PRD template, and scenarios directory.\n\n### 3. Create Test Scenarios\n\nUse the HarshJudge skill: `/harshjudge`\n\nClaude guides you through defining scenarios with steps. Each step includes:\n- **Title** and description\n- **Actions** to perform\n- **Expected outcome** to verify\n\n### 4. Run Tests\n\nClaude orchestrates test execution using Playwright MCP for browser automation:\n- Screenshots before/after every action\n- Console and network logs\n- Database snapshots (if configured)\n- Each step tracked individually with pass/fail status\n\n### 5. View Results\n\nUse `harshjudge dashboard open` to launch the visual dashboard (default port 7002):\n- **3-column layout**: Projects → Scenarios → Detail\n- **Real-time updates** via file watching\n- **Evidence viewers**: screenshot timeline, log viewer, DB snapshots\n- **Statistics**: pass rate, run history, average duration\n\n## Data Structure\n\n```\nyour-project/\n└── .harshJudge/\n    ├── config.yaml                 # Project configuration\n    ├── prd.md                      # Product requirements\n    ├── .gitignore                  # Excludes large evidence files\n    └── scenarios/\n        └── login-flow/             # Example scenario\n            ├── meta.yaml           # Metadata + run statistics\n            ├── steps/              # Individual step definitions\n            │   ├── 01-navigate.md\n            │   ├── 02-fill-form.md\n            │   └── 03-verify.md\n            └── runs/\n                └── {runId}/\n                    ├── result.json          # Run outcome\n                    ├── step-01/\n                    │   └── evidence/\n                    │       ├── screenshot-before.png\n                    │       ├── screenshot-before.meta.json\n                    │       ├── screenshot-after.png\n                    │       └── screenshot-after.meta.json\n                    ├── step-02/evidence/...\n                    └── step-03/evidence/...\n```\n\n## Verification\n\nAfter installation, verify your setup:\n\n1. **Check CLI is available** — `harshjudge --help` should list all commands\n2. **Initialize project** — `harshjudge init my-app` in your project root\n3. **Check status** — `harshjudge status`\n\n## Troubleshooting\n\n### \"command not found: harshjudge\"\n1. Ensure global npm bin is in PATH: `npm bin -g`\n2. Or use `npx @allenpan2026/harshjudge <command>`\n\n### \"Dashboard won't start\"\n```bash\n# Check if port is in use\nlsof -i :7002\n\n# Use a different port\nharshjudge dashboard open --port 7003\n```\n\n### \"Project not initialized\"\n```bash\nharshjudge init <project-name>\n```\n\n### Getting Help\n\n- File issues at [GitHub Issues](https://github.com/HuskyDanny/HarshJudge/issues)\n\n## Development\n\n### Project Structure\n\n```\nHarshJudge/\n├── src/\n│   ├── cli.ts              # CLI entry point\n│   ├── commands/           # Command implementations (init, create, run, etc.)\n│   ├── handlers/           # Core business logic handlers\n│   ├── services/           # FileSystemService, DashboardManager\n│   ├── types/              # TypeScript type definitions\n│   └── utils/              # Utility helpers\n├── skills/\n│   └── harshjudge/         # Claude Code skill (5 workflow guides)\n├── docs/                   # Architecture docs, PRD, user stories\n├── tests/                  # Vitest test suite\n└── examples/               # Demo projects\n```\n\n### Tech Stack\n\n| Layer | Technology |\n|-------|-----------|\n| **Build** | tsup + pnpm |\n| **Language** | TypeScript 5.3+, Node.js 18+ |\n| **Validation** | Zod schemas |\n| **Frontend** | React 18 + Tailwind CSS |\n| **Testing** | Vitest |\n\n### Commands\n\n| Command | Description |\n|---------|-------------|\n| `pnpm install` | Install all dependencies |\n| `pnpm build` | Build CLI and dashboard |\n| `pnpm test` | Run all tests |\n| `pnpm typecheck` | TypeScript type checking |\n\n### Publishing\n\n```bash\n# 1. Bump version in package.json\n# 2. Build\npnpm build\n\n# 3. Publish\nnpm publish --access public\n```\n\n## License\n\nMIT License - See [LICENSE](LICENSE) for details.\n","readmeFilename":"README.md"}