{"_id":"@0xwuchuan/ward","_rev":"2-4a56f2610ede2023dbad24b54f2b7456","name":"@0xwuchuan/ward","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@0xwuchuan/ward","version":"0.1.0","_id":"@0xwuchuan/ward@0.1.0","maintainers":[{"name":"0xwuchuan","email":"wuchuank@proton.me"}],"bin":{"ward":"dist/cli.js"},"dist":{"shasum":"ef0f17ec2b0fc93c7ae0f90bf00955746808de67","tarball":"https://registry.npmjs.org/@0xwuchuan/ward/-/ward-0.1.0.tgz","fileCount":26,"integrity":"sha512-OG4jt/x+VtgrohmLpxafic9dN54l+Um5tWUZ/s7XN04odvBjz5zJ7auwPIEq1F32Y2Iqu3W4YzBDmnBW3N636g==","signatures":[{"sig":"MEYCIQC9lvutQOI1GXGA01yhcMWM+LFyrWxWaygx13WeNB2kggIhAN9sUMrhH+RgmXw4llCcyLogWIeWJw+zen6SMhtie3tH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1448173},"type":"module","shasum":"ef0f17ec2b0fc93c7ae0f90bf00955746808de67","engines":{"node":">=22"},"scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc -p tsconfig.json && npm --prefix frontend run build","start":"node dist/cli.js start","dev:server":"tsx src/server.ts"},"_npmUser":{"name":"0xwuchuan","email":"wuchuank@proton.me"},"_integrity":"sha512-OG4jt/x+VtgrohmLpxafic9dN54l+Um5tWUZ/s7XN04odvBjz5zJ7auwPIEq1F32Y2Iqu3W4YzBDmnBW3N636g==","_npmVersion":"10.8.3","directories":{},"_nodeVersion":"24.3.0","dependencies":{"zod":"^4.1.13","hono":"^4.10.7","incur":"^0.4.8","better-sqlite3":"^12.5.0","@hono/node-server":"^1.19.6"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","vitest":"^4.0.14","typescript":"^5.9.3","@types/node":"^24.10.2","@types/better-sqlite3":"^7.6.13"},"_npmOperationalInternal":{"tmp":"tmp/ward_0.1.0_1781345012012_0.946263802138128","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@0xwuchuan/ward","version":"0.1.1","type":"module","bin":{"ward":"dist/cli.js"},"engines":{"node":">=22"},"scripts":{"build":"tsc -p tsconfig.json && npm --prefix frontend run build","dev":"tsx src/cli.ts","dev:server":"tsx src/server.ts","test":"vitest run","start":"node dist/cli.js start"},"dependencies":{"@hono/node-server":"^1.19.6","better-sqlite3":"^12.5.0","hono":"^4.10.7","incur":"^0.4.8","zod":"^4.1.13"},"devDependencies":{"@types/better-sqlite3":"^7.6.13","@types/node":"^24.10.2","tsx":"^4.20.6","typescript":"^5.9.3","vitest":"^4.0.14"},"_id":"@0xwuchuan/ward@0.1.1","_integrity":"sha512-74MpyTL3Lf44EX+n0L6Zdihqp3HxWMYqXQUiGASsDZLWpulLYNvJAxIOPwnahYFYvD/l/5WBecv6xINIQKK5OA==","_nodeVersion":"24.3.0","_npmVersion":"10.8.3","shasum":"06e183de12ae957bc04c724348300b98ae8b3789","dist":{"integrity":"sha512-74MpyTL3Lf44EX+n0L6Zdihqp3HxWMYqXQUiGASsDZLWpulLYNvJAxIOPwnahYFYvD/l/5WBecv6xINIQKK5OA==","shasum":"06e183de12ae957bc04c724348300b98ae8b3789","tarball":"https://registry.npmjs.org/@0xwuchuan/ward/-/ward-0.1.1.tgz","fileCount":26,"unpackedSize":1448227,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIECzmmt1cGf9emQspCyOsFVWsk6RoWEEFox0dPJjalVDAiAYavTLokXzPMe3iWe9mX0qe+esEMtAfz6FCpgzXwFeoQ=="}]},"_npmUser":{"name":"0xwuchuan","email":"wuchuank@proton.me"},"directories":{},"maintainers":[{"name":"0xwuchuan","email":"wuchuank@proton.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ward_0.1.1_1781345259688_0.031840986126134174"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-13T10:03:31.825Z","modified":"2026-06-13T10:07:40.006Z","0.1.0":"2026-06-13T10:03:32.203Z","0.1.1":"2026-06-13T10:07:39.890Z"},"maintainers":[{"name":"0xwuchuan","email":"wuchuank@proton.me"}],"readme":"<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/0xwuchuan/ward/main/docs/assets/ward.png\" alt=\"Ward - Mission Control for Security Researchers\" width=\"900\">\n</p>\n\n<p align=\"center\">\n  <a href=\"#overview\">Overview</a> ·\n  <a href=\"#features\">Features</a> ·\n  <a href=\"#getting-started\">Getting Started</a> ·\n  <a href=\"AGENTS.md\">Development</a>\n</p>\n\n## Overview\n\nWard is a local-first audit workspace for tracking security review projects and findings without sending workspace data to an external service.\n\nIt ships as a Node-first npm package with a TypeScript CLI, a local Hono HTTP API, a React web UI, and SQLite persistence. Ward is built for both humans and agents: the CLI uses [`incur`](https://github.com/wevm/incur#readme) for structured output, script-friendly workflows, and LLM-readable command discovery.\n\n## Features\n\n- Local-first audit workspace backed by SQLite.\n- Project registration for repositories under review.\n- Structured finding capture with severity, status, category, source, impact, and recommendation fields.\n- File references that connect findings to related code locations.\n- Agent-oriented CLI workflows for scripts, terminals, and autonomous security review.\n- Agent discovery through skill files, MCP registration, and LLM-readable command manifests.\n- Token-efficient TOON output by default, with JSON, YAML, Markdown, and JSONL available when needed.\n- Local web UI for browsing projects, filtering findings, editing details, and previewing related code.\n\n## Getting Started\n\nInstall Ward:\n\n```sh\nnpm install -g ward\n```\n\nOr run from source:\n\n```sh\ngit clone <repo-url> ward\ncd ward\nnpm install\nnpm run build\nnpm link\n```\n\n**Using an agent?** Run `ward skills add` to register Ward with your agent, then ask it to explore the codebase and capture findings. View everything in the web UI when it's done:\n\n```sh\nward serve\n```\n\nOr do it manually:\n\nRegister the repository you are reviewing:\n\n```sh\ncd /path/to/project\nward place --name \"Protocol Audit\"\n```\n\nCapture a finding:\n\n```sh\nward finding create \\\n  --title \"Missing access control on withdrawal\" \\\n  --severity high \\\n  --fileRef src/Vault.sol:42-51 \\\n  --category access-control \\\n  --description \"The withdrawal path does not verify the caller role.\"\n```\n\nOpen the local web UI to browse and filter results:\n\n```sh\nward serve\n```\n\n## Data Storage\n\nWard stores all data locally in SQLite at `~/.ward/ward.db`. Set `WARD_DB_PATH` to use a different file:\n\n```sh\nWARD_DB_PATH=/path/to/ward.db ward finding list\n```\n","readmeFilename":"README.md"}