hex-audit 0.7.0 → 0.8.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/CLAUDE.md +137 -77
- package/DEMO.md +40 -117
- package/README.md +200 -402
- package/dashboard/.next/BUILD_ID +1 -1
- package/dashboard/.next/app-build-manifest.json +56 -101
- package/dashboard/.next/app-path-routes-manifest.json +1 -1
- package/dashboard/.next/build-manifest.json +9 -9
- package/dashboard/.next/next-server.js.nft.json +1 -1
- package/dashboard/.next/prerender-manifest.json +1 -1
- package/dashboard/.next/react-loadable-manifest.json +436 -15
- package/dashboard/.next/routes-manifest.json +1 -1
- package/dashboard/.next/server/app/_not-found/page.js +1 -1
- package/dashboard/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/api/code/route.js +1 -1
- package/dashboard/.next/server/app/api/code/route.js.nft.json +1 -1
- package/dashboard/.next/server/app/api/comments/route.js +1 -0
- package/dashboard/.next/server/app/api/comments/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/diagrams/[name]/export/route.js +1 -0
- package/dashboard/.next/server/app/api/diagrams/[name]/export/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/diagrams/[name]/resolve/route.js +1 -0
- package/dashboard/.next/server/app/api/diagrams/[name]/resolve/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/diagrams/[name]/route.js +1 -0
- package/dashboard/.next/server/app/api/diagrams/[name]/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/figures/[name]/route.js +1 -0
- package/dashboard/.next/server/app/api/figures/[name]/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/focus/route.js +1 -0
- package/dashboard/.next/server/app/api/focus/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/github-status/route.js +1 -1
- package/dashboard/.next/server/app/api/invariants/[id]/route.js +1 -0
- package/dashboard/.next/server/app/api/invariants/[id]/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/issues/[id]/revert-auto/route.js +1 -0
- package/dashboard/.next/server/app/api/issues/[id]/revert-auto/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/nav/route.js +1 -0
- package/dashboard/.next/server/app/api/nav/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/notes/done/route.js +1 -1
- package/dashboard/.next/server/app/api/notes/done/route.js.nft.json +1 -1
- package/dashboard/.next/server/app/api/notes/lead/route.js +1 -1
- package/dashboard/.next/server/app/api/notes/lead/route.js.nft.json +1 -1
- package/dashboard/.next/server/app/api/notes/question/route.js +1 -1
- package/dashboard/.next/server/app/api/notes/question/route.js.nft.json +1 -1
- package/dashboard/.next/server/app/api/notes/record/route.js +3 -3
- package/dashboard/.next/server/app/api/notes/route.js +2 -2
- package/dashboard/.next/server/app/api/palette/route.js +1 -0
- package/dashboard/.next/server/app/api/palette/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/progress/route.js +1 -1
- package/dashboard/.next/server/app/api/progress/route.js.nft.json +1 -1
- package/dashboard/.next/server/app/api/watch/route.js +2 -2
- package/dashboard/.next/server/app/api/watch/route.js.nft.json +1 -1
- package/dashboard/.next/server/app/api/xref/route.js +1 -0
- package/dashboard/.next/server/app/changes/page.js +1 -20
- package/dashboard/.next/server/app/changes/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/changes/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/excalidraw-assets/[...path]/route.js +1 -0
- package/dashboard/.next/server/app/issues/page.js +5 -28
- package/dashboard/.next/server/app/issues/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/issues/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/model/page.js +1 -0
- package/dashboard/.next/server/app/{calls → model}/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/model/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/page.js +1 -20
- package/dashboard/.next/server/app/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/report/page.js +1 -1
- package/dashboard/.next/server/app/report/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/report/page_client-reference-manifest.js +1 -1
- package/dashboard/.next/server/app/review/page.js +1 -0
- package/dashboard/.next/server/app/{access → review}/page.js.nft.json +1 -1
- package/dashboard/.next/server/app/review/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app-paths-manifest.json +19 -16
- package/dashboard/.next/server/chunks/310.js +4 -0
- package/dashboard/.next/server/chunks/370.js +1 -0
- package/dashboard/.next/server/chunks/42.js +1 -1
- package/dashboard/.next/server/chunks/624.js +14 -0
- package/dashboard/.next/server/chunks/645.js +1 -1
- package/dashboard/.next/server/chunks/649.js +1 -1
- package/dashboard/.next/server/chunks/653.js +1 -0
- package/dashboard/.next/server/functions-config-manifest.json +1 -1
- package/dashboard/.next/server/middleware-build-manifest.js +1 -1
- package/dashboard/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dashboard/.next/server/pages/500.html +1 -1
- package/dashboard/.next/server/pages/_error.js +1 -1
- package/dashboard/.next/server/server-reference-manifest.js +1 -1
- package/dashboard/.next/server/server-reference-manifest.json +1 -1
- package/dashboard/.next/static/chunks/0bbe10ee.8e7ffa06d2170dfe.js +84 -0
- package/dashboard/.next/static/chunks/1026.0ef689a305302427.js +1 -0
- package/dashboard/.next/static/chunks/1164.34eb76767ebea46f.js +8 -0
- package/dashboard/.next/static/chunks/119.a9a79633900a235f.js +5 -0
- package/dashboard/.next/static/chunks/1291.6c486c9b1d4b1b3a.js +1 -0
- package/dashboard/.next/static/chunks/139.4691848fc5a46253.js +10 -0
- package/dashboard/.next/static/chunks/145.1bf74fecdb4022e3.js +11 -0
- package/dashboard/.next/static/chunks/1517.8e7075f78e22b3a0.js +8 -0
- package/dashboard/.next/static/chunks/165.6f174060a0ce2db4.js +6 -0
- package/dashboard/.next/static/chunks/1741.5c370b7702d2eb40.js +8 -0
- package/dashboard/.next/static/chunks/1e36816c.5748c83adc8a6bd6.js +108 -0
- package/dashboard/.next/static/chunks/2061.eab75b3c1dfa068a.js +1 -0
- package/dashboard/.next/static/chunks/2148.3ce718f62d1b2f7c.js +10 -0
- package/dashboard/.next/static/chunks/217-1d5b680ffd10e3f9.js +1 -0
- package/dashboard/.next/static/chunks/2208.fb884379aa3ae968.js +1 -0
- package/dashboard/.next/static/chunks/2276.112c7855333fca5f.js +6 -0
- package/dashboard/.next/static/chunks/2374-8c6f137938f8518a.js +1 -0
- package/dashboard/.next/static/chunks/2445.18a86507d2996b95.js +1 -0
- package/dashboard/.next/static/chunks/2712.15dd8577973baf22.js +10 -0
- package/dashboard/.next/static/chunks/2759.533dec5317e0a1d1.js +1 -0
- package/dashboard/.next/static/chunks/2812.62b213bef580b69a.js +1 -0
- package/dashboard/.next/static/chunks/2895.bb57cacb7aaf42a1.js +9 -0
- package/dashboard/.next/static/chunks/2972.e5a9251b538dcf19.js +9 -0
- package/dashboard/.next/static/chunks/3206.8d9a10db2b04b93f.js +1 -0
- package/dashboard/.next/static/chunks/3485.36766504793b7237.js +9 -0
- package/dashboard/.next/static/chunks/3725.de9376dc994735d4.js +9 -0
- package/dashboard/.next/static/chunks/3774.1df377928e8387f7.js +9 -0
- package/dashboard/.next/static/chunks/3963.39d72b3875dfe2e9.js +13 -0
- package/dashboard/.next/static/chunks/4013.73884b23bfaebdde.js +11 -0
- package/dashboard/.next/static/chunks/4117.278aff1fa23fd36e.js +6 -0
- package/dashboard/.next/static/chunks/4210.cc8594110017c579.js +11 -0
- package/dashboard/.next/static/chunks/4282.28485875540886cc.js +7 -0
- package/dashboard/.next/static/chunks/4318.a2f469a88d88f6d0.js +8 -0
- package/dashboard/.next/static/chunks/4363.8999a6e727c48003.js +1 -0
- package/dashboard/.next/static/chunks/4641.e03d118fffebd580.js +5 -0
- package/dashboard/.next/static/chunks/483.a910dab7734a1074.js +8 -0
- package/dashboard/.next/static/chunks/4926.76693f542e9cc062.js +6 -0
- package/dashboard/.next/static/chunks/4938.03f6d04dabf38745.js +10 -0
- package/dashboard/.next/static/chunks/5112.0757c2b0c285e62e.js +1 -0
- package/dashboard/.next/static/chunks/5199.c83ea7efb0eec705.js +11 -0
- package/dashboard/.next/static/chunks/530.849957a8907eb288.js +1 -0
- package/dashboard/.next/static/chunks/5424.4e8ca0711a32bccf.js +7 -0
- package/dashboard/.next/static/chunks/55.a593a78be9714679.js +1 -0
- package/dashboard/.next/static/chunks/5535.6cd0bd8d368d8902.js +4 -0
- package/dashboard/.next/static/chunks/5626.7d4e93d7acbeffc9.js +10 -0
- package/dashboard/.next/static/chunks/5775.a0d7c1b1e89b9a93.js +9 -0
- package/dashboard/.next/static/chunks/6118.266956b3333b1d7a.js +9 -0
- package/dashboard/.next/static/chunks/6121.a2e6d93720b1205e.js +77 -0
- package/dashboard/.next/static/chunks/6853.d3ad43614e8ca0ab.js +1 -0
- package/dashboard/.next/static/chunks/6951.02a3a158d02158c9.js +5 -0
- package/dashboard/.next/static/chunks/6970.013f24568c87d918.js +11 -0
- package/dashboard/.next/static/chunks/7013.39d41e82b37be63b.js +9 -0
- package/dashboard/.next/static/chunks/7107.1c5412197912b8ed.js +8 -0
- package/dashboard/.next/static/chunks/7508.dd60e2d06d149f5f.js +9 -0
- package/dashboard/.next/static/chunks/7524.0fde4c61553d1491.js +3 -0
- package/dashboard/.next/static/chunks/7834-47f318a04a05688f.js +1 -0
- package/dashboard/.next/static/chunks/8317.d0b3eddef4cae0d5.js +1 -0
- package/dashboard/.next/static/chunks/838.2b2aa006519ba44c.js +10 -0
- package/dashboard/.next/static/chunks/8398.924fd8f4c83417c0.js +7 -0
- package/dashboard/.next/static/chunks/8428b36f.8ac4e67061c01307.js +34 -0
- package/dashboard/.next/static/chunks/8514.85ccbbea8ab21d04.js +5 -0
- package/dashboard/.next/static/chunks/8538.5f7ebe76c4b63162.js +1 -0
- package/dashboard/.next/static/chunks/8687.9406baa8b5601fd0.js +1 -0
- package/dashboard/.next/static/chunks/8721.47346e2cb6412376.js +10 -0
- package/dashboard/.next/static/chunks/8770.4f544bd1a6f03a62.js +8 -0
- package/dashboard/.next/static/chunks/8812.3d96fd54dba566f8.js +9 -0
- package/dashboard/.next/static/chunks/8962.d22aa67a97970dd8.js +1 -0
- package/dashboard/.next/static/chunks/8986.b327224b83f4399a.js +5 -0
- package/dashboard/.next/static/chunks/9271.5f66c19a8ee1ff36.js +10 -0
- package/dashboard/.next/static/chunks/9282.f8d01442bab4c0da.js +2 -0
- package/dashboard/.next/static/chunks/9366.0ec24a0791b9b00f.js +1 -0
- package/dashboard/.next/static/chunks/9707.5cd7d2ee933a4af5.js +6 -0
- package/dashboard/.next/static/chunks/9716.15fffc0b0038601d.js +4 -0
- package/dashboard/.next/static/chunks/9791.e3b3f5a367f63c8a.js +1 -0
- package/dashboard/.next/static/chunks/9820.8c1efad5260e8137.js +1 -0
- package/dashboard/.next/static/chunks/985.50150e9eaa4bde33.js +39 -0
- package/dashboard/.next/static/chunks/997.56901b86e1b8a87b.js +8 -0
- package/dashboard/.next/static/chunks/app/changes/page-f8a860034221cad4.js +1 -0
- package/dashboard/.next/static/chunks/app/issues/page-da4da93188c414a6.js +1 -0
- package/dashboard/.next/static/chunks/app/layout-27a9da4610423c1e.js +1 -0
- package/dashboard/.next/static/chunks/app/model/page-9680e22fdd6ddb81.js +1 -0
- package/dashboard/.next/static/chunks/app/page-0e67750d99fb2836.js +1 -0
- package/dashboard/.next/static/chunks/app/report/page-b56b1db9b9dcf2b6.js +1 -0
- package/dashboard/.next/static/chunks/app/review/page-3ef69f0e0badd333.js +1 -0
- package/dashboard/.next/static/chunks/c75e29e3.d91220f782934d80.js +1 -0
- package/dashboard/.next/static/chunks/{main-cc3a889b25e9aa68.js → main-9c95a7ffedc7afb4.js} +1 -1
- package/dashboard/.next/static/chunks/webpack-6da70e4f9fcf1799.js +1 -0
- package/dashboard/.next/static/css/ceafd91ca8dd753d.css +3 -0
- package/dashboard/.next/static/css/e4aad1f9c715b79a.css +1 -0
- package/dashboard/.next/static/media/Assistant-Bold.c8f39f24.woff2 +0 -0
- package/dashboard/.next/static/media/Assistant-Medium.1e75d8e6.woff2 +0 -0
- package/dashboard/.next/static/media/Assistant-Regular.7acbabb8.woff2 +0 -0
- package/dashboard/.next/static/media/Assistant-SemiBold.167acbf8.woff2 +0 -0
- package/dashboard/app/api/code/route.ts +26 -20
- package/dashboard/app/api/comments/route.ts +158 -0
- package/dashboard/app/api/diagrams/[name]/export/route.ts +26 -0
- package/dashboard/app/api/diagrams/[name]/resolve/route.ts +25 -0
- package/dashboard/app/api/diagrams/[name]/route.ts +37 -0
- package/dashboard/app/api/figures/[name]/route.ts +15 -0
- package/dashboard/app/api/focus/route.ts +35 -0
- package/dashboard/app/api/invariants/[id]/route.ts +35 -0
- package/dashboard/app/api/issues/[id]/revert-auto/route.ts +18 -0
- package/dashboard/app/api/nav/route.ts +120 -0
- package/dashboard/app/api/palette/route.ts +68 -0
- package/dashboard/app/api/progress/route.ts +54 -23
- package/dashboard/app/api/xref/route.ts +30 -0
- package/dashboard/app/changes/ChangesClient.tsx +730 -356
- package/dashboard/app/changes/page.tsx +27 -19
- package/dashboard/app/excalidraw-assets/[...path]/route.ts +56 -0
- package/dashboard/app/globals.css +231 -77
- package/dashboard/app/issues/BoardClient.tsx +817 -0
- package/dashboard/app/issues/page.tsx +27 -272
- package/dashboard/app/layout.tsx +32 -17
- package/dashboard/app/model/ModelClient.tsx +1303 -0
- package/dashboard/app/model/page.tsx +98 -0
- package/dashboard/app/page.tsx +191 -277
- package/dashboard/app/report/ReportClient.tsx +147 -74
- package/dashboard/app/report/page.tsx +25 -14
- package/dashboard/app/review/ReviewClient.tsx +1180 -0
- package/dashboard/app/review/page.tsx +93 -0
- package/dashboard/components/AutoRefresh.tsx +22 -19
- package/dashboard/components/CodeComments.tsx +303 -0
- package/dashboard/components/CodeNav.tsx +523 -0
- package/dashboard/components/CodeReference.tsx +92 -99
- package/dashboard/components/CodeViewer.tsx +526 -0
- package/dashboard/components/CommandPalette.tsx +141 -66
- package/dashboard/components/DiagramCanvas.tsx +275 -0
- package/dashboard/components/DianeNote.tsx +244 -0
- package/dashboard/components/LiveStatus.tsx +30 -68
- package/dashboard/components/MarkdownRenderer.tsx +34 -32
- package/dashboard/components/RecordButton.tsx +132 -0
- package/dashboard/components/ui/Button.tsx +39 -0
- package/dashboard/components/ui/Chip.tsx +37 -0
- package/dashboard/components/ui/EmptyState.tsx +31 -0
- package/dashboard/components/ui/Icons.tsx +126 -0
- package/dashboard/components/ui/Inspector.tsx +122 -0
- package/dashboard/components/ui/Kbd.tsx +15 -0
- package/dashboard/components/ui/ListRow.tsx +92 -0
- package/dashboard/components/ui/LocalTime.tsx +14 -0
- package/dashboard/components/ui/ProgressRing.tsx +54 -0
- package/dashboard/components/ui/ResizeHandle.tsx +93 -0
- package/dashboard/components/ui/RiskMeter.tsx +27 -0
- package/dashboard/components/ui/SearchField.tsx +55 -0
- package/dashboard/components/ui/SegmentedControl.tsx +71 -0
- package/dashboard/components/ui/SeverityDot.tsx +57 -0
- package/dashboard/components/ui/Sidebar.tsx +236 -0
- package/dashboard/components/ui/SplitView.tsx +122 -0
- package/dashboard/components/ui/StateGlyph.tsx +66 -0
- package/dashboard/components/ui/Toast.tsx +91 -0
- package/dashboard/lib/api.ts +17 -0
- package/dashboard/lib/cn.ts +4 -0
- package/dashboard/lib/data.ts +2 -21
- package/dashboard/lib/finding-markdown.ts +1 -1
- package/dashboard/lib/focus.ts +42 -0
- package/dashboard/lib/hotkeys.ts +41 -0
- package/dashboard/lib/inline-markdown.test.ts +11 -0
- package/dashboard/lib/live.ts +32 -0
- package/dashboard/lib/pane-width.ts +36 -0
- package/dashboard/lib/server/board.ts +229 -0
- package/dashboard/lib/server/diagrams.ts +191 -0
- package/dashboard/lib/server/safe-path.ts +28 -0
- package/dashboard/lib/server/workspace.ts +113 -0
- package/dashboard/lib/server/xref.ts +42 -0
- package/dashboard/lib/solidity.test.ts +37 -0
- package/dashboard/lib/solidity.ts +191 -0
- package/dashboard/lib/source.ts +28 -0
- package/dashboard/lib/types.ts +164 -0
- package/dashboard/lib/url.ts +18 -0
- package/dashboard/lib/watcher.ts +31 -22
- package/dashboard/tailwind.config.ts +6 -3
- package/dist/analysis/code-model.d.ts.map +1 -1
- package/dist/analysis/code-model.js +4 -1
- package/dist/analysis/code-model.js.map +1 -1
- package/dist/analysis/diff.d.ts +12 -1
- package/dist/analysis/diff.d.ts.map +1 -1
- package/dist/analysis/diff.js +143 -0
- package/dist/analysis/diff.js.map +1 -1
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +17 -48
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/claude.d.ts.map +1 -1
- package/dist/commands/claude.js +5 -0
- package/dist/commands/claude.js.map +1 -1
- package/dist/commands/dashboard.d.ts.map +1 -1
- package/dist/commands/dashboard.js +10 -2
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/diagram.d.ts +3 -0
- package/dist/commands/diagram.d.ts.map +1 -0
- package/dist/commands/diagram.js +71 -0
- package/dist/commands/diagram.js.map +1 -0
- package/dist/commands/diff.d.ts +4 -5
- package/dist/commands/diff.d.ts.map +1 -1
- package/dist/commands/diff.js +56 -17
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +5 -18
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/facts.d.ts +23 -0
- package/dist/commands/facts.d.ts.map +1 -0
- package/dist/commands/facts.js +121 -0
- package/dist/commands/facts.js.map +1 -0
- package/dist/commands/fix-review.d.ts +9 -0
- package/dist/commands/fix-review.d.ts.map +1 -0
- package/dist/commands/fix-review.js +367 -0
- package/dist/commands/fix-review.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +51 -47
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/issue.d.ts.map +1 -1
- package/dist/commands/issue.js +151 -2
- package/dist/commands/issue.js.map +1 -1
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +11 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/model.d.ts +4 -0
- package/dist/commands/model.d.ts.map +1 -0
- package/dist/commands/model.js +275 -0
- package/dist/commands/model.js.map +1 -0
- package/dist/commands/note.d.ts.map +1 -1
- package/dist/commands/note.js +31 -1
- package/dist/commands/note.js.map +1 -1
- package/dist/commands/review.d.ts +4 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +164 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/core/comments.d.ts +59 -0
- package/dist/core/comments.d.ts.map +1 -0
- package/dist/core/comments.js +263 -0
- package/dist/core/comments.js.map +1 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +0 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/dedup.d.ts +56 -0
- package/dist/core/dedup.d.ts.map +1 -0
- package/dist/core/dedup.js +208 -0
- package/dist/core/dedup.js.map +1 -0
- package/dist/core/errors.d.ts +1 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +0 -15
- package/dist/core/errors.js.map +1 -1
- package/dist/core/external-tools.d.ts +0 -14
- package/dist/core/external-tools.d.ts.map +1 -1
- package/dist/core/external-tools.js +2 -52
- package/dist/core/external-tools.js.map +1 -1
- package/dist/core/fix-review.d.ts +54 -0
- package/dist/core/fix-review.d.ts.map +1 -0
- package/dist/core/fix-review.js +98 -0
- package/dist/core/fix-review.js.map +1 -0
- package/dist/core/fuzz-sync.d.ts +93 -0
- package/dist/core/fuzz-sync.d.ts.map +1 -0
- package/dist/core/fuzz-sync.js +516 -0
- package/dist/core/fuzz-sync.js.map +1 -0
- package/dist/core/git.d.ts +7 -0
- package/dist/core/git.d.ts.map +1 -1
- package/dist/core/git.js +42 -0
- package/dist/core/git.js.map +1 -1
- package/dist/core/issues.d.ts +32 -1
- package/dist/core/issues.d.ts.map +1 -1
- package/dist/core/issues.js +135 -3
- package/dist/core/issues.js.map +1 -1
- package/dist/core/mcp-config.d.ts +12 -0
- package/dist/core/mcp-config.d.ts.map +1 -0
- package/dist/core/mcp-config.js +29 -0
- package/dist/core/mcp-config.js.map +1 -0
- package/dist/core/model.d.ts +38 -0
- package/dist/core/model.d.ts.map +1 -0
- package/dist/core/model.js +160 -0
- package/dist/core/model.js.map +1 -0
- package/dist/core/notes.d.ts +2 -0
- package/dist/core/notes.d.ts.map +1 -1
- package/dist/core/notes.js +13 -3
- package/dist/core/notes.js.map +1 -1
- package/dist/core/review.d.ts +47 -0
- package/dist/core/review.d.ts.map +1 -1
- package/dist/core/review.js +177 -1
- package/dist/core/review.js.map +1 -1
- package/dist/core/rules.d.ts +12 -0
- package/dist/core/rules.d.ts.map +1 -0
- package/dist/core/rules.js +66 -0
- package/dist/core/rules.js.map +1 -0
- package/dist/core/schema.d.ts +4817 -2245
- package/dist/core/schema.d.ts.map +1 -1
- package/dist/core/schema.js +452 -113
- package/dist/core/schema.js.map +1 -1
- package/dist/core/scope.d.ts +8 -0
- package/dist/core/scope.d.ts.map +1 -0
- package/dist/core/scope.js +18 -0
- package/dist/core/scope.js.map +1 -0
- package/dist/diagrams/build.d.ts +18 -0
- package/dist/diagrams/build.d.ts.map +1 -0
- package/dist/diagrams/build.js +135 -0
- package/dist/diagrams/build.js.map +1 -0
- package/dist/diagrams/excalidraw.d.ts +27 -0
- package/dist/diagrams/excalidraw.d.ts.map +1 -0
- package/dist/diagrams/excalidraw.js +219 -0
- package/dist/diagrams/excalidraw.js.map +1 -0
- package/dist/diagrams/layout.d.ts +48 -0
- package/dist/diagrams/layout.d.ts.map +1 -0
- package/dist/diagrams/layout.js +686 -0
- package/dist/diagrams/layout.js.map +1 -0
- package/dist/facts/build.d.ts +23 -0
- package/dist/facts/build.d.ts.map +1 -0
- package/dist/facts/build.js +112 -0
- package/dist/facts/build.js.map +1 -0
- package/dist/facts/extract.d.ts +53 -0
- package/dist/facts/extract.d.ts.map +1 -0
- package/dist/facts/extract.js +635 -0
- package/dist/facts/extract.js.map +1 -0
- package/dist/facts/fallback.d.ts +7 -0
- package/dist/facts/fallback.d.ts.map +1 -0
- package/dist/facts/fallback.js +156 -0
- package/dist/facts/fallback.js.map +1 -0
- package/dist/facts/implementations.d.ts +29 -0
- package/dist/facts/implementations.d.ts.map +1 -0
- package/dist/facts/implementations.js +43 -0
- package/dist/facts/implementations.js.map +1 -0
- package/dist/facts/query.d.ts +35 -0
- package/dist/facts/query.d.ts.map +1 -0
- package/dist/facts/query.js +157 -0
- package/dist/facts/query.js.map +1 -0
- package/dist/facts/xref.d.ts +53 -0
- package/dist/facts/xref.d.ts.map +1 -0
- package/dist/facts/xref.js +282 -0
- package/dist/facts/xref.js.map +1 -0
- package/dist/index.js +14 -16
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +400 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/skills/ai-audit/SKILL.md +16 -6
- package/dist/skills/ai-audit/UPSTREAM.md +9 -4
- package/dist/skills/ai-audit/references/hex-board.md +34 -46
- package/dist/skills/diane.md +26 -12
- package/dist/skills/fix-review.md +58 -0
- package/dist/skills/fuzz/LICENSE +21 -0
- package/dist/skills/fuzz/SKILL.md +655 -0
- package/dist/skills/fuzz/UPSTREAM.md +119 -0
- package/dist/skills/fuzz/agents/implementers/global-property-implementer.md +81 -0
- package/dist/skills/fuzz/agents/implementers/specific-property-implementer.md +121 -0
- package/dist/skills/fuzz/agents/invariant-discovery/adversarial-profit-maximizer.md +123 -0
- package/dist/skills/fuzz/agents/invariant-discovery/conservation-auditor.md +92 -0
- package/dist/skills/fuzz/agents/invariant-discovery/protocol-type-specialist.md +173 -0
- package/dist/skills/fuzz/agents/invariant-discovery/roundtrip-rounding-analyst.md +164 -0
- package/dist/skills/fuzz/agents/invariant-discovery/state-transition-mapper.md +92 -0
- package/dist/skills/fuzz/agents/invariant-discovery/synthesizer.md +261 -0
- package/dist/skills/fuzz/agents/protocol-analyzer.md +80 -0
- package/dist/skills/fuzz/agents/report-writer.md +135 -0
- package/dist/skills/fuzz/references/handler-patterns.md +222 -0
- package/dist/skills/fuzz/references/hex-invariants.md +102 -0
- package/dist/skills/fuzz/references/property-generation.md +149 -0
- package/dist/skills/fuzz/references/selection-policy.md +49 -0
- package/dist/skills/fuzz/references/setup-playbook.md +92 -0
- package/dist/skills/fuzz/references/template-map.md +121 -0
- package/dist/skills/fuzz/scripts/ensure_foundry.sh +125 -0
- package/dist/skills/fuzz/scripts/estimate_cost.js +157 -0
- package/dist/skills/fuzz/scripts/extract_abis.js +303 -0
- package/dist/skills/fuzz/scripts/fizz_sync.js +692 -0
- package/dist/skills/fuzz/scripts/generate_handlers.js +370 -0
- package/dist/skills/fuzz/scripts/generate_suite.js +254 -0
- package/dist/skills/fuzz/scripts/lib/log-viewer.js +332 -0
- package/dist/skills/fuzz/scripts/run_echidna.js +192 -0
- package/dist/skills/fuzz/scripts/run_medusa.js +329 -0
- package/dist/skills/fuzz/scripts/select_functions.js +637 -0
- package/dist/skills/fuzz/scripts/setup_fuzz_profile.sh +142 -0
- package/dist/skills/fuzz/templates/Actor.sol +63 -0
- package/dist/skills/fuzz/templates/Base.sol +121 -0
- package/dist/skills/fuzz/templates/FoundryTester.sol +29 -0
- package/dist/skills/fuzz/templates/FuzzTester.sol +11 -0
- package/dist/skills/fuzz/templates/Properties.sol +17 -0
- package/dist/skills/fuzz/templates/README.md +56 -0
- package/dist/skills/fuzz/templates/Snapshots.sol +26 -0
- package/dist/skills/fuzz/templates/echidna.yaml +18 -0
- package/dist/skills/fuzz/templates/handlers/Handlers.sol +13 -0
- package/dist/skills/fuzz/templates/medusa.json +93 -0
- package/dist/skills/fuzz/templates/utils/Clamp.sol +223 -0
- package/dist/skills/fuzz/templates/utils/DecimalPrinter.sol +63 -0
- package/dist/skills/fuzz/templates/utils/Deployer.sol +17 -0
- package/dist/skills/fuzz/templates/utils/EnumerableSet.sol +206 -0
- package/dist/skills/fuzz/templates/utils/Hevm.sol +62 -0
- package/dist/skills/fuzz/templates/utils/Logger.sol +619 -0
- package/dist/skills/fuzz/templates/utils/Math.sol +52 -0
- package/dist/skills/fuzz/templates/utils/MockERC20.sol +279 -0
- package/dist/skills/fuzz/templates/utils/PropertiesAsserts.sol +238 -0
- package/dist/skills/fuzz/templates/utils/StringUtils.sol +85 -0
- package/dist/skills/fuzz-convert/SKILL.md +249 -0
- package/dist/skills/fuzz-sync/SKILL.md +342 -0
- package/dist/skills/generate-poc.md +8 -26
- package/dist/skills/generate-report.md +17 -5
- package/dist/skills/ingest-aa-report.md +11 -30
- package/dist/skills/init-audit/SKILL.md +155 -0
- package/dist/skills/init-audit/references/agents/conformance-checker.md +36 -0
- package/dist/skills/init-audit/references/agents/contract-reader.md +59 -0
- package/dist/skills/init-audit/references/agents/diagram-composer.md +48 -0
- package/dist/skills/init-audit/references/agents/docs-extractor.md +26 -0
- package/dist/skills/init-audit/references/agents/prior-audit.md +32 -0
- package/dist/skills/init-audit/references/agents/regression-checker.md +28 -0
- package/dist/skills/init-audit/references/agents/skeptic.md +31 -0
- package/dist/skills/init-audit/references/agents/standards-checker.md +39 -0
- package/dist/skills/init-audit/references/agents/synthesizer.md +50 -0
- package/dist/skills/prevalidate.md +62 -0
- package/dist/skills/sync-issues.md +11 -25
- package/dist/skills/validate-all-findings.md +2 -2
- package/dist/skills/validate-finding.md +25 -24
- package/dist/skills/write-finding.md +6 -5
- package/dist/types/index.d.ts +16 -12
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +5 -4
- package/dashboard/.next/server/app/access/page.js +0 -1
- package/dashboard/.next/server/app/access/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/api/flows/route.js +0 -1
- package/dashboard/.next/server/app/api/mermaid/route.js +0 -1
- package/dashboard/.next/server/app/calls/page.js +0 -1
- package/dashboard/.next/server/app/calls/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/conformance/page.js +0 -1
- package/dashboard/.next/server/app/conformance/page.js.nft.json +0 -1
- package/dashboard/.next/server/app/conformance/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/diagram/page.js +0 -1
- package/dashboard/.next/server/app/diagram/page.js.nft.json +0 -1
- package/dashboard/.next/server/app/diagram/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/flows/page.js +0 -1
- package/dashboard/.next/server/app/flows/page.js.nft.json +0 -1
- package/dashboard/.next/server/app/flows/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/functions/page.js +0 -1
- package/dashboard/.next/server/app/functions/page.js.nft.json +0 -1
- package/dashboard/.next/server/app/functions/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/notes/page.js +0 -22
- package/dashboard/.next/server/app/notes/page.js.nft.json +0 -1
- package/dashboard/.next/server/app/notes/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/progress/page.js +0 -1
- package/dashboard/.next/server/app/progress/page.js.nft.json +0 -1
- package/dashboard/.next/server/app/progress/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/app/stats/page.js +0 -1
- package/dashboard/.next/server/app/stats/page.js.nft.json +0 -1
- package/dashboard/.next/server/app/stats/page_client-reference-manifest.js +0 -1
- package/dashboard/.next/server/chunks/530.js +0 -1
- package/dashboard/.next/server/chunks/622.js +0 -3
- package/dashboard/.next/server/chunks/665.js +0 -13
- package/dashboard/.next/server/chunks/939.js +0 -1
- package/dashboard/.next/static/chunks/3017.4a5312e3c20a173f.js +0 -1
- package/dashboard/.next/static/chunks/7397-37adf76cad543297.js +0 -1
- package/dashboard/.next/static/chunks/7973.e34032723285a616.js +0 -79
- package/dashboard/.next/static/chunks/8452-6d77fa353402422c.js +0 -13
- package/dashboard/.next/static/chunks/8928-fc049decdfbdaa6d.js +0 -1
- package/dashboard/.next/static/chunks/app/access/page-f8403cbdfc1c176b.js +0 -1
- package/dashboard/.next/static/chunks/app/calls/page-41f20d01e12382ef.js +0 -1
- package/dashboard/.next/static/chunks/app/changes/page-82bf8b6f48cdc506.js +0 -1
- package/dashboard/.next/static/chunks/app/conformance/page-6bb8e3b372e38098.js +0 -1
- package/dashboard/.next/static/chunks/app/diagram/page-469cd7a6f183efba.js +0 -1
- package/dashboard/.next/static/chunks/app/flows/page-7872dd9141ba0b07.js +0 -1
- package/dashboard/.next/static/chunks/app/functions/page-5847bcb77a8e7edf.js +0 -1
- package/dashboard/.next/static/chunks/app/issues/page-1ffc64fe40439002.js +0 -1
- package/dashboard/.next/static/chunks/app/layout-6c6d2a0fd7c989d3.js +0 -1
- package/dashboard/.next/static/chunks/app/notes/page-8bcaa52304500098.js +0 -1
- package/dashboard/.next/static/chunks/app/page-d63800ddb072b77b.js +0 -1
- package/dashboard/.next/static/chunks/app/progress/page-e26554f655a62eef.js +0 -1
- package/dashboard/.next/static/chunks/app/report/page-18c04fb2f193b020.js +0 -1
- package/dashboard/.next/static/chunks/app/stats/page-67ff59fd69bed651.js +0 -1
- package/dashboard/.next/static/chunks/webpack-4de0e79bdd6a0418.js +0 -1
- package/dashboard/.next/static/css/1112cea2260b3926.css +0 -3
- package/dashboard/app/access/AccessClient.tsx +0 -402
- package/dashboard/app/access/ReadOnlyFunctions.tsx +0 -114
- package/dashboard/app/access/page.tsx +0 -125
- package/dashboard/app/api/flows/route.ts +0 -32
- package/dashboard/app/api/mermaid/route.ts +0 -25
- package/dashboard/app/calls/CallsClient.tsx +0 -170
- package/dashboard/app/calls/page.tsx +0 -57
- package/dashboard/app/conformance/ConformanceTable.tsx +0 -214
- package/dashboard/app/conformance/page.tsx +0 -186
- package/dashboard/app/diagram/page.tsx +0 -65
- package/dashboard/app/flows/page.tsx +0 -102
- package/dashboard/app/functions/FunctionsClient.tsx +0 -167
- package/dashboard/app/functions/page.tsx +0 -178
- package/dashboard/app/issues/IssuesBoardClient.tsx +0 -813
- package/dashboard/app/notes/NotesClient.tsx +0 -706
- package/dashboard/app/notes/page.tsx +0 -47
- package/dashboard/app/progress/ProgressClient.tsx +0 -354
- package/dashboard/app/progress/page.tsx +0 -127
- package/dashboard/app/stats/StatsClient.tsx +0 -452
- package/dashboard/app/stats/page.tsx +0 -50
- package/dashboard/components/ConfidenceBadge.tsx +0 -53
- package/dashboard/components/DashboardLayout.tsx +0 -510
- package/dashboard/components/FilterableTable.tsx +0 -293
- package/dashboard/components/MermaidViewer.tsx +0 -267
- package/dashboard/components/NotYetGenerated.tsx +0 -32
- package/dashboard/components/SeverityBadge.tsx +0 -28
- package/dashboard/components/SignalBars.tsx +0 -27
- package/dashboard/components/SortableTable.tsx +0 -122
- package/dashboard/lib/conformance-tokens.ts +0 -49
- package/dist/skills/init-audit.md +0 -386
- /package/dashboard/.next/server/app/api/{flows → xref}/route.js.nft.json +0 -0
- /package/dashboard/.next/server/app/{api/mermaid → excalidraw-assets/[...path]}/route.js.nft.json +0 -0
- /package/dashboard/.next/static/{z5XBev05xDAkDrxWxAjNu → bGV1ry1vvIbM5b506eVBR}/_buildManifest.js +0 -0
- /package/dashboard/.next/static/{z5XBev05xDAkDrxWxAjNu → bGV1ry1vvIbM5b506eVBR}/_ssgManifest.js +0 -0
- /package/dashboard/.next/static/chunks/{3205-47d09be47325709f.js → 3205-fd963acf2fdfd080.js} +0 -0
- /package/dashboard/.next/static/chunks/{3924-88d849290406ee6f.js → 3924-f1f85ccc7d59d7ab.js} +0 -0
- /package/dashboard/.next/static/chunks/{618f8807-69fc7bb97c2b87c1.js → 618f8807-fbb1466bc29c17c6.js} +0 -0
- /package/dashboard/.next/static/chunks/{7498-d1814d68ba346d13.js → 7498-7cf464d8af69cd0a.js} +0 -0
- /package/dashboard/.next/static/chunks/app/_not-found/{page-c299b935209993df.js → page-5ff5d54b6fd6f17e.js} +0 -0
package/README.md
CHANGED
|
@@ -1,461 +1,259 @@
|
|
|
1
|
-
# Hex
|
|
1
|
+
# Hex — AI-enhanced manual review for Solidity audits
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
You read the code and make the calls. Hex keeps an exact map of the protocol, runs AI where breadth beats depth, and makes the AI prove what it claims.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
The first versions of Hex automated the boring parts of an audit. Hex is now a way of auditing in which manual review and AI work as one loop: the AI covers ground fast and checks itself, and you spend your time where judgement matters.
|
|
6
6
|
|
|
7
|
-
](https://youtu.be/VIDEO_ID)
|
|
8
|
+
<!-- Replace VIDEO_ID with the YouTube video id once the demo is uploaded. -->
|
|
8
9
|
|
|
9
|
-
##
|
|
10
|
+
## The hybrid loop
|
|
10
11
|
|
|
11
|
-
You
|
|
12
|
+
| You | Hex |
|
|
13
|
+
|---|---|
|
|
14
|
+
| Read the code, follow the flows, decide what breaks | Exact facts from the compiler: call graph, every read and write, storage layout, every reference |
|
|
15
|
+
| Question the model and accept the invariants that hold | A protocol model built by agents working in silos, then attacked by skeptics; contested claims are marked |
|
|
16
|
+
| Write findings, narrate what you see, sign off function by function | Attacker agents over your scope; every finding deduplicated, then reproduced with a PoC or refuted twice |
|
|
17
|
+
| Judge the client's fixes | Fix review re-runs every PoC on the fix commit and flags the changes nobody explained |
|
|
18
|
+
| Own the report | A report drafted from what you verified |
|
|
12
19
|
|
|
13
|
-
|
|
20
|
+
The two halves meet on the dashboard's **Review** page, a calm workspace next to your Claude Code session:
|
|
21
|
+
- **Blind spots:** the riskiest code that nobody, human or AI, has looked at hard yet.
|
|
22
|
+
- **Walk flows like in your IDE:** go to definition through interfaces, peek inline, list every caller and every write.
|
|
23
|
+
- **Comments in the code**, pull-request style, and **Diane**, a voice pair-auditor who checks what you say against the code.
|
|
24
|
+
- **Ask about *this*:** select anything and ask Claude why it is safe; the Hex MCP server tells it what you are looking at.
|
|
14
25
|
|
|
15
|
-
|
|
26
|
+

|
|
16
27
|
|
|
17
|
-
|
|
28
|
+
## What Hex does
|
|
18
29
|
|
|
19
|
-
|
|
30
|
+
**Exact facts from the compiler.** `hex analyze` compiles the project into Hex's own cache (never your `out/`) and reads the solc AST: every call edge resolved by the compiler (`internal`, `super`, `library`, `external`, virtual dispatch, modifiers), every read and write of every state variable, inheritance linearization, entry points, and the compiler's own storage layout. No regexes, no heuristics. When a project does not compile, Hex falls back to a parser and says so.
|
|
20
31
|
|
|
21
|
-
|
|
32
|
+
**A verified protocol model, built by agents.** `/init-audit` runs a team of agents in waves:
|
|
33
|
+
- Independent readers each model one cluster of contracts, and a docs reader extracts what the documentation promises without ever seeing the code.
|
|
34
|
+
- A synthesizer merges the drafts into one model: actors, assets, privileges and their worst cases, trust assumptions, dependencies, state machines, accounting equations, risky flows, and proposed invariants.
|
|
35
|
+
- Skeptics then check every claim against the code without seeing the synthesizer's reasoning. Claims end up `verified` or `contested`, and contested claims are often where the bugs are.
|
|
22
36
|
|
|
23
|
-
|
|
37
|
+
**Diagrams that explain.** Five views drawn from the verified model, rendered in Excalidraw, each with a one-sentence takeaway:
|
|
38
|
+
- **custody**: where the money sits and who can move it
|
|
39
|
+
- **privilege**: who can do what, and the worst case
|
|
40
|
+
- **accounting**: the conservation law and every function that moves each term
|
|
41
|
+
- **state machine**: lifecycles and their guards
|
|
42
|
+
- **sequence**: the riskiest cross-contract flows
|
|
24
43
|
|
|
25
|
-
|
|
26
|
-
- **Node.js** (v18+) and npm
|
|
27
|
-
- **Foundry** (`forge`, `cast`) — or Hardhat if that's what the project uses
|
|
28
|
-
- **Slither** — `pip install slither-analyzer`
|
|
29
|
-
- **solc** — the Solidity compiler (managed via `solc-select` or Foundry)
|
|
30
|
-
- (Optional, for `/ingest-aa-report`) **AuditAgent CLI** — `pip install git+https://github.com/NethermindEth/auditagent-cli.git`
|
|
44
|
+
You can edit them in the dashboard and put them in the report.
|
|
31
45
|
|
|
32
|
-
|
|
46
|
+
**Findings with proof.** `/ai-audit` runs 12 attacker agents (a fork of pashov's solidity-auditor). `/prevalidate` reproduces each new machine finding with a PoC or refutes it with two independent agents, and conclusive cases move on their own. `/validate-finding` writes a PoC by default. One dedup engine serves every source. Triage rules (trusted roles, out-of-scope tokens, known issues) feed back into every AI run so the same false positives stop coming back.
|
|
33
47
|
|
|
34
|
-
|
|
48
|
+
**A review workspace next to the CLI.** The dashboard tracks review per function (unread → read → questioned → cleared), ranks blind spots by risk, lets you walk flows and comment in the code, and shows the board, the model and the report. Select something in the dashboard and ask Claude about "this": the Hex MCP server tells the CLI session what you are looking at.
|
|
35
49
|
|
|
36
|
-
|
|
50
|
+
Everything stays local: no server, no database, no accounts.
|
|
37
51
|
|
|
38
|
-
|
|
39
|
-
# Clone or receive the client project as usual
|
|
40
|
-
git clone https://github.com/client/protocol.git
|
|
41
|
-
cd protocol
|
|
52
|
+
## Prerequisites
|
|
42
53
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
54
|
+
- **Claude Code**
|
|
55
|
+
- **Node.js** (v18+) and npm
|
|
56
|
+
- **Foundry** (`forge`), or Hardhat if that is what the project uses
|
|
57
|
+
- Optional: **Medusa** / **Echidna** for `/fuzz`; `gh` (GitHub CLI) for `/sync-issues` and `/fix-review`; a local Whisper engine (`pip install faster-whisper`) for Diane; the AuditAgent CLI for `/ingest-aa-report`
|
|
46
58
|
|
|
47
|
-
|
|
59
|
+
`hex doctor` checks all of it.
|
|
60
|
+
|
|
61
|
+
## Quick Start
|
|
48
62
|
|
|
49
63
|
```bash
|
|
50
|
-
|
|
51
|
-
|
|
64
|
+
git clone https://github.com/client/protocol.git && cd protocol
|
|
65
|
+
npm install -g hex-audit
|
|
66
|
+
hex claude # installs the skills and registers the Hex MCP server in .mcp.json
|
|
67
|
+
claude # approve the "hex" MCP server once when asked
|
|
52
68
|
```
|
|
53
69
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
### 3. Let Claude initialise the audit
|
|
57
|
-
|
|
58
|
-
Inside Claude Code (switch to **Opus** first):
|
|
70
|
+
Inside Claude Code:
|
|
59
71
|
|
|
60
72
|
```
|
|
61
73
|
/init-audit
|
|
62
74
|
```
|
|
63
75
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
76
|
+
It asks for the scope, commit, chain, docs and (optionally) the GitHub repo, then:
|
|
77
|
+
1. Runs the dependency-safety gate before anything compiles.
|
|
78
|
+
2. Builds the exact facts.
|
|
79
|
+
3. Runs the agent waves.
|
|
80
|
+
4. Builds the diagrams.
|
|
81
|
+
5. Files conformance deviations as Potential cards.
|
|
82
|
+
6. Opens the dashboard at `http://localhost:3000`.
|
|
67
83
|
|
|
68
|
-
|
|
84
|
+
Accept the invariants that hold (on the Model page or with `hex invariant accept`), then start reading. The **Today** page tells you where.
|
|
69
85
|
|
|
70
|
-
|
|
86
|
+
> Always call the CLI as `hex …` or `npx --no-install hex …`. An unrelated npm package is named `hex`; a bare `npx hex` on a machine without hex-audit would download and run it.
|
|
71
87
|
|
|
72
88
|
---
|
|
73
89
|
|
|
74
90
|
## The Audit Workflow
|
|
75
91
|
|
|
76
|
-
|
|
92
|
+
### Phase 1: Pre-review (`/init-audit`)
|
|
77
93
|
|
|
78
|
-
|
|
94
|
+
**Waves and silos.** Agents work in silos where independence matters and share context where integration matters. They never message each other; they communicate through files under `.hex/model/` and answer exact questions with `hex facts query`.
|
|
79
95
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
- **Dependency safety scan.** Inspects `package.json` install hooks, Foundry `lib/` submodules, `foundry.toml` (FFI, fs_permissions, remappings), `.env*` for plaintext secrets, `.vscode/extensions.json` for untrusted publishers. Stops before compilation if anything looks risky.
|
|
89
|
-
- **`hex analyze`** runs stats, deps, access, state, calls, patterns, constraints in parallel, then surface last.
|
|
90
|
-
- **`overview.md`** — a 2-3 paragraph protocol overview with a key contracts table, external dependencies, and architecture notes. Same scope as the simpler standalone skill it replaced — pure description, no findings or speculation.
|
|
91
|
-
- **System diagram** — `.hex/diagrams/diagram.mmd` (split into multiple files if >15 nodes). Semantic symbols (🏦 Vault, 💰 Token, 🔮 Oracle, 🔒 Governance, 📦 Storage), trust-zone colour coding, typed edge labels (delegatecall, external call, access-controlled), visual legend.
|
|
92
|
-
- **Flow charts** — `.hex/diagrams/flow-*.mmd` per archetype (Vault → deposit/withdraw/strategy; Lending → borrow/repay/liquidate; Bridge → send/receive; Governance → propose/vote/execute; AMM → swap/add/remove; Staking → stake/claim/compound). Distinct shapes by semantic role. Every decision diamond shows both success and revert paths.
|
|
93
|
-
- **Spec conformance** — cross-references docs, NatSpec, interfaces, ERC/EIPs. Canonical specs are fetched from `eips.ethereum.org`. Output: `spec-conformance.json` with `CONFORMS / DEVIATES / PARTIAL / UNVERIFIABLE / UNDOCUMENTED` + spec-section URLs.
|
|
94
|
-
- **Materialize conformance items.** Every DEVIATES/PARTIAL spec item is materialized as a Potential card on the issue board (source `conformance`).
|
|
95
|
-
|
|
96
|
-
All pages support filtering by confidence level so you can focus on entries that need manual verification.
|
|
96
|
+
| Wave | Who | Silo? | Output |
|
|
97
|
+
|---|---|---|---|
|
|
98
|
+
| 0 | You + orchestrator: inputs, dependency-safety gate, `hex init`, `hex analyze` | — | `facts.json`, `stats.json`, `diff.json` |
|
|
99
|
+
| 1 | Contract readers (one per cluster), docs extractor (docs only), standards checker, prior-audit importer | **siloed** | claim drafts |
|
|
100
|
+
| 2 | Synthesizer | shared | `model/protocol.json`, `model/invariants.json`, `overview.md` |
|
|
101
|
+
| 3 | Skeptics (per model section), conformance checker, regression checker | **siloed** | verified / contested claims, conformance cards |
|
|
102
|
+
| 4 | Diagram composers (per view) | shared | `model/diagrams/*.excalidraw` |
|
|
97
103
|
|
|
98
104
|
#### Differential audits
|
|
99
105
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
-
|
|
112
|
-
- **
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
- **
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
#### Validate any Potential card (`/validate-finding`)
|
|
153
|
-
|
|
154
|
-
`/validate-finding` is source-agnostic. It validates:
|
|
155
|
-
|
|
156
|
-
- Manual `pending_validation` entries from `/write-finding`.
|
|
157
|
-
- Conformance DEVIATES/PARTIAL entries materialized by `/init-audit`.
|
|
158
|
-
- Auditagent `unverified` entries materialized by `/ingest-aa-report`.
|
|
159
|
-
- AI audit `unverified` entries filed by `/ai-audit`.
|
|
160
|
-
- Prior-audit regressions filed by `/init-audit` in a differential audit.
|
|
161
|
-
- GitHub teammate entries materialized by `/sync-issues`.
|
|
162
|
-
|
|
163
|
-
```
|
|
164
|
-
/validate-finding H-003
|
|
165
|
-
/validate-finding for the rounding issue in Vault.sol
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
Claude reads the relevant source record, traces the attack path in the code, and writes a validation memo to `.hex/validations/<id>_memo.md`. Then it asks per issue:
|
|
169
|
-
|
|
170
|
-
> The issue appears valid. PoC or memo-only?
|
|
171
|
-
|
|
172
|
-
If PoC: invokes `/generate-poc` to produce a runnable test and iterates until it passes. If memo-only: skips PoC, just records the validation reasoning.
|
|
173
|
-
|
|
174
|
-
Valid → the card moves to Verified (`hex issue move`). Invalid → it moves to Invalid. Severity adjustment is offered after promotion. To clear a whole backlog, **`/validate-all-findings`** runs this same flow over every Potential card, one at a time.
|
|
175
|
-
|
|
176
|
-
#### Ingest a Nethermind AuditAgent scan (`/ingest-aa-report`)
|
|
177
|
-
|
|
178
|
-
Hex's only AI integration is **Nethermind AuditAgent**, and it expects the scan to already exist. The skill **does not start scans** — you start the scan separately (the Nethermind portal or `aa scan --quality auditor <scope-files>` from the command line), then paste the scan ID:
|
|
179
|
-
|
|
180
|
-
```
|
|
181
|
-
/ingest-aa-report <scan-id>
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
The skill:
|
|
185
|
-
|
|
186
|
-
1. Calls `aa scan --status <scan_id>`. If the scan is still running, it prints status and exits — come back later. (`hex ai-status --watch` in a second terminal notifies when the scan finishes.)
|
|
187
|
-
2. On completion, fetches the report and writes raw output to `.hex/ai-results/auditagent/raw-output.md` plus normalised findings to `findings.json` + `metadata.json` under the same folder.
|
|
188
|
-
3. Materializes each finding as a Potential card (source `auditagent`, status `unverified`).
|
|
189
|
-
4. **Runs inline dedup** against every existing tracking entry. Auditagent findings that match a manual / conformance / github entry on contract+function+root_cause+attack_vector flip to `duplicate` and surface in the Duplicate column with the match_signals visible on the card.
|
|
190
|
-
|
|
191
|
-
#### Team mode (`/sync-issues`)
|
|
192
|
-
|
|
193
|
-
GitHub is the source of truth for an audit's findings. Set the repo at init time with `hex init --github-repo <owner/repo>` (or `settings.github.repo` in `.hex/config.json`) — the firm's internal repo, e.g. `nethermind/audit-vaultx` — and authenticate the `gh` CLI once:
|
|
194
|
-
|
|
195
|
-
```bash
|
|
196
|
-
gh auth login
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
Hex never stores GitHub credentials — `/sync-issues` drives the `gh` CLI directly. Then:
|
|
200
|
-
|
|
201
|
-
```
|
|
202
|
-
/sync-issues
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
One invocation does both directions. **Identity is the GitHub issue number `#N`** — there is no hidden footer in the issue body (auditors create issues by hand), so reconciliation matches a local finding to the issue number it has stored.
|
|
206
|
-
|
|
207
|
-
- **Pull every issue** in the repo (no label filter — audit repos contain only findings). Each issue's title (`[Severity] Title`) and five-field body are parsed back into the local finding. If a body is blatantly not in the Hex format it's skipped with a warning. Issues already linked by `#N` are refreshed from GitHub; new ones become local findings. All pulled issues land in the **Synced** column.
|
|
208
|
-
- **Push** every local finding whose tracking status is in `settings.github.publish_status` (default `["verified"]`) and that isn't already on GitHub. The body is exactly the five-field template (File(s), Description, Recommendation(s), Status, Update from the client) — no labels, no footer. The returned issue number is stored on the finding, which locks it into Synced.
|
|
209
|
-
|
|
210
|
-
**Once synced, an issue is read-only in Hex.** Edit it on GitHub (severity, description, recommendation, status), then re-run `/sync-issues` to pull the changes back. `/generate-report` reports only from synced issues. The board's `/issues` page surfaces sync state as a chip: `GH unsynced` (verified, not pushed), `GH #N open` / `GH #N closed`, or `GH conflict`.
|
|
211
|
-
|
|
212
|
-
Comments stay on GitHub — Hex never posts, edits, or deletes comments. Auditors discuss inside GitHub itself.
|
|
213
|
-
|
|
214
|
-
### Phase 4 — Deliverable (`/generate-report`)
|
|
215
|
-
|
|
216
|
-
Once findings are validated and the engagement is winding down:
|
|
217
|
-
|
|
218
|
-
```
|
|
219
|
-
/generate-report
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
The skill prompts once for any missing report metadata (initial/final commit, dates, audit type, documentation/test assessment, kick-off/availability notes) and persists them to `config.json` under `settings.report.*` so reruns don't re-prompt. Then it emits seven report sections into `.hex/report/`, each in two forms: a `.txt` for the dashboard viewer / copy-paste and a numbered `.tex` (`01-executive-summary.tex`, …) for direct `\input{}` into the Overleaf `main.tex`:
|
|
223
|
-
|
|
224
|
-
1. **Executive Summary** (§1) — project synopsis, severity histogram, status histogram, summary table.
|
|
225
|
-
2. **Audited Files** (§2) — LaTeX table of scope files (LoC, comments, ratio, blank, total).
|
|
226
|
-
3. **Summary of Issues** (§3) — table with `\hyperref` rows.
|
|
227
|
-
4. **System Overview** (§4) — descriptive protocol architecture (components, actors & roles, per-module/flow subsections) built from `overview.md` and the access-control/deps analysis.
|
|
228
|
-
5. **Issues** (§6) — one `\subsection{[Sev] title}\label{issue:N}` per synced finding (description, code blocks via `minted`, recommendation, status, client update).
|
|
229
|
-
6. **Documentation Evaluation** (§7) — a `tcolorbox` remarks paragraph about the client's documentation.
|
|
230
|
-
7. **Test Suite Evaluation** (§8) — coverage summary and automated-tooling note, generated from `stats.json.test_coverage`.
|
|
231
|
-
|
|
232
|
-
Upload these into the Nethermind Overleaf template's matching slots (§5 risk methodology and §9 conclusion stay template-static). Only `synced` findings make the report; duplicates, rejected, and pending entries are skipped.
|
|
233
|
-
|
|
234
|
-
---
|
|
235
|
-
|
|
236
|
-
## Claude Code Skills Reference
|
|
237
|
-
|
|
238
|
-
Each skill has a recommended model — switch your Claude Code model before invoking skills that recommend Opus.
|
|
239
|
-
|
|
240
|
-
| Skill | Phase | Recommended Model | What it does |
|
|
241
|
-
| ----------------------- | ----- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
242
|
-
| `init-audit` | 1 | Opus | Dependency-safety → `hex analyze` → overview → diagram → flows → spec conformance → materialize DEVIATES/PARTIAL items as Potential cards. Full or differential (base → head, impacted flows, prior-findings regression check) |
|
|
243
|
-
| `ai-audit` | 1-3 | Opus | 12 parallel attacker agents (fork of pashov's solidity-auditor v4.1); findings → Potential cards with dedup, leads → contract notes; diff-aware |
|
|
244
|
-
| `write-finding` | 2 | Sonnet | Records a manual issue to `findings.json` as a Potential card (`status: pending_validation`, `source: manual`) |
|
|
245
|
-
| `diane` | 2 | Sonnet | Voice pair-auditor: ingests recorded narration into a structured per-contract profile (Leads / Description / Questions), verifies your claims against the code, and surfaces leads |
|
|
246
|
-
| `validate-finding` | 3 | Opus | Validates any Potential card (manual / ai-audit / auditagent / conformance / github / prior-audit); per-issue choice of PoC vs memo-only; promotes to Verified or Invalid |
|
|
247
|
-
| `validate-all-findings` | 3 | Opus | Runs the `/validate-finding` flow over every Potential card, one at a time |
|
|
248
|
-
| `generate-poc` | 3 | Opus | Generates and runs a PoC test (invoked by `/validate-finding`) |
|
|
249
|
-
| `ingest-aa-report` | 3 | Sonnet | Ingests a completed Nethermind AuditAgent scan by ID; materializes findings + inline dedup |
|
|
250
|
-
| `sync-issues` | 3 | Sonnet | Two-way GitHub Issues sync; GitHub is the source of truth (issue number is identity, synced issues are read-only) |
|
|
251
|
-
| `generate-report` | 4 | Sonnet | Writes the LaTeX report sections (exec summary, audited files, summary, system overview, issues, documentation eval, test suite) as `.txt` + `.tex` from synced issues |
|
|
252
|
-
|
|
253
|
-
### Where Skills Live
|
|
254
|
-
|
|
255
|
-
Skills use Claude Code's native skill format, stored in `.claude/skills/<name>/SKILL.md`. They're copied there when you run `hex claude` or `hex init`.
|
|
256
|
-
|
|
257
|
-
```
|
|
258
|
-
.claude/skills/
|
|
259
|
-
├── .hex-skills.json # which skills Hex installed (cleanup never touches your own skills)
|
|
260
|
-
├── init-audit/SKILL.md
|
|
261
|
-
├── ai-audit/ # directory skill: SKILL.md + references/ (agents, assembler, LICENSE)
|
|
262
|
-
├── write-finding/SKILL.md
|
|
263
|
-
├── diane/SKILL.md
|
|
264
|
-
├── validate-finding/SKILL.md
|
|
265
|
-
├── validate-all-findings/SKILL.md
|
|
266
|
-
├── generate-poc/SKILL.md
|
|
267
|
-
├── ingest-aa-report/SKILL.md
|
|
268
|
-
├── sync-issues/SKILL.md
|
|
269
|
-
└── generate-report/SKILL.md
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
**How Claude Code finds them:** Claude Code auto-discovers skills in `.claude/skills/`. They appear as native slash commands — type `/` in Claude Code to see them.
|
|
273
|
-
|
|
274
|
-
**Customising skills:** Edit any `SKILL.md` file in place. `hex claude` and `hex update-skills` only remove skills Hex installed itself (tracked in `.hex-skills.json`), so a project's own skills, such as a separate `solidity-auditor` install, are left alone.
|
|
275
|
-
|
|
276
|
-
**Upgrading Hex:**
|
|
277
|
-
|
|
278
|
-
```bash
|
|
279
|
-
hex update # install latest hex-audit + prompt to re-sync skills (one command)
|
|
280
|
-
hex update --check # check for an available update without installing
|
|
281
|
-
hex update-skills # re-sync skills only (use if you've already npm-installed manually)
|
|
282
|
-
hex update-skills --keep-custom # skip existing skill files to preserve per-project modifications
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
`hex update` detects how Hex was installed (global or local), runs the appropriate `npm install …@latest`, then asks whether to re-copy the bundled skill files into the current project's `.claude/skills/`. Both commands remove orphaned skill directories so renamed/deleted skills clean up across versions.
|
|
286
|
-
|
|
287
|
-
---
|
|
288
|
-
|
|
289
|
-
## Notes & Diane (voice pair-auditor)
|
|
290
|
-
|
|
291
|
-
Diane is an optional companion for **Phase 2 manual review**. You read a contract top-to-bottom and narrate your thinking out loud; Diane records it, organizes it into a living per-contract profile, and audits alongside you.
|
|
292
|
-
|
|
293
|
-
**The loop:**
|
|
294
|
-
|
|
295
|
-
1. **Record** — open the dashboard **Notes** page (`/notes`), pick the contract from the dropdown, and hit Record. Audio is transcribed **locally** with a Whisper engine — nothing leaves your machine. The model is loaded only while the dashboard is running and is freed when you close it.
|
|
296
|
-
2. **Process** — run **`/diane`** in Claude Code. It ingests the latest recording into the contract's structured profile:
|
|
297
|
-
- **Leads** — things worth investigating (only open ones are shown; closing one or logging it as a finding removes it).
|
|
298
|
-
- **Description** — Purpose / Inheritance / Storage / Roles & Modifiers / Functions (one collapsible entry per function).
|
|
299
|
-
- **Questions** — your questions with answers, collapsible.
|
|
300
|
-
3. **Pair-audit** — Diane verifies the claims you make against the code, corrects what's wrong (with `file:line`), flags what you missed, and ends each run with a candid verdict.
|
|
301
|
-
4. **Track** — once a contract is marked "done reading" with no open leads and no unanswered questions, it auto-ticks as reviewed on `/progress`.
|
|
302
|
-
|
|
303
|
-
**Whisper setup (one-time):** install a local engine — `pip install faster-whisper` (lightweight, CPU) or `pip install openai-whisper`. Without one, recordings are still saved and Hex shows a setup hint; transcription just waits until an engine is present.
|
|
106
|
+
Pick **Differential** when `/init-audit` asks. Give the base commit (what the previous audit covered), the head commit, and optionally the previous audit (its `.hex/` folder or its report).
|
|
107
|
+
- **What changed:** `hex diff` compiles both commits and reports every changed function, modifier, variable, event, error, struct and base list.
|
|
108
|
+
- **Storage layout:** the compiler storage-layout diff, slot by slot. An insertion that shifts every later slot is called out explicitly.
|
|
109
|
+
- **Impact:** every function the change reaches, through calls, modifiers, state coupling, virtual dispatch and inheritance.
|
|
110
|
+
- **Focus:** every wave then focuses on the change.
|
|
111
|
+
- **Prior findings:** imported, and the ones the change touched are regression-checked. Only regressions become cards.
|
|
112
|
+
- **Dashboard and report:** a Changes page appears, and `/generate-report` writes a differential review.
|
|
113
|
+
|
|
114
|
+
### Phase 2: Review
|
|
115
|
+
|
|
116
|
+
**Review map.** Read the code with the dashboard's **Review** page open:
|
|
117
|
+
- Every in-scope function has a state (unread, read, questioned, cleared) and a risk score built from facts and the model: moves value, updates accounting, external calls, privileged, changed in a diff, and so on.
|
|
118
|
+
- **Blind spots** are the riskiest functions nobody, human or AI, has looked at hard.
|
|
119
|
+
- Mark functions with the keyboard (`r`/`q`/`c`) or the inspector.
|
|
120
|
+
- **Walk flows like in your IDE.** Ctrl/⌘-click (or F12) any call, variable, type or event to go to its definition; calls through an interface land where they run (`IToken.transferFrom` → `MockToken.transferFrom`). Alt-click (⌥F12) peeks the code inline under the call. On a function's name, or with ⇧F12, a band lists every call site (or every read and write of a state variable). Back and Forward retrace the path, and the code header shows the trail. Upstream and downstream come from the compiler (`.hex/xref.json`, written by `hex facts`); `hex facts query call-sites|implementations` gives the same answers to Claude.
|
|
121
|
+
- **Comment on code** like a pull request: hover a line and click `+`, or select lines and click *Comment*. Comments are stored in `.hex/notes/comments.json` and follow their code when lines move. *Write to source* puts a comment into the file as `// @audit` lines (and *Remove from file* takes it out again); Hex rebuilds the facts afterwards because the line numbers shift. Diane and Claude read them (`hex note comments`, MCP `hex_code_comments`).
|
|
122
|
+
|
|
123
|
+
**Diane, the voice pair-auditor.** Narrate while you read: record on the Review page, then run `/diane`. Diane:
|
|
124
|
+
- turns the narration into a structured note for the contract;
|
|
125
|
+
- checks your claims against the code, then corrects mistakes and flags what you missed;
|
|
126
|
+
- **ticks the functions you say you are done with**. Only what you say counts; she never ticks on inference, and a function where she found a problem goes to *questioned* instead.
|
|
127
|
+
|
|
128
|
+
Transcription is local (Whisper).
|
|
129
|
+
|
|
130
|
+
**Record findings and run the AI.**
|
|
131
|
+
- **Manual findings:** `/write-finding`.
|
|
132
|
+
- **AI audit:** `/ai-audit` runs 12 attacker agents over the scope, or over the changed and impacted code in a differential audit. Every agent is briefed with your accepted invariants and triage rules. Findings land on the board, deduped against everything there, and leads go to the contract notes. Then `/prevalidate` runs on the new cards.
|
|
133
|
+
- **AuditAgent:** `/ingest-aa-report <scan-id>` ingests a Nethermind AuditAgent scan the same way.
|
|
134
|
+
- **Fuzzing:** `/fuzz` (a fork of pashov's fizz) turns accepted invariants into Echidna/Medusa/Foundry suites. Results sync back to each invariant; a violation becomes a card whose repro test is its PoC.
|
|
135
|
+
|
|
136
|
+
### Phase 3: Validate, sync
|
|
137
|
+
|
|
138
|
+
- **`/prevalidate`.** Validates every new machine-generated card in parallel. It moves a card on its own only in two conclusive cases:
|
|
139
|
+
- **reproduced:** the PoC passes, asserts the impact, and the finding passes the reality gate → Verified;
|
|
140
|
+
- **refuted:** two independent agents cite the blocking code → Rejected.
|
|
141
|
+
|
|
142
|
+
Everything else waits for you with a verdict and memo. Every auto-move is marked and can be reverted with one click.
|
|
143
|
+
- **`/validate-finding`** and **`/validate-all-findings`**: correctness, then a reality gate (true *and* a security issue?). A PoC is the default and is recorded on the card. Rejecting a finding as by-design or out of scope proposes a triage rule.
|
|
144
|
+
- **`/sync-issues`.** Two-way sync with GitHub Issues, and GitHub is the source of truth:
|
|
145
|
+
- Identity is the issue number.
|
|
146
|
+
- Synced cards are read-only in Hex: edit on GitHub and pull.
|
|
147
|
+
- Verified cards are pushed as the five-field body (File(s), Description, Recommendation(s), Status, Update from the client).
|
|
148
|
+
|
|
149
|
+
### Phase 4: Fix review and report
|
|
150
|
+
|
|
151
|
+
- **`/fix-review`**. After the client fixes the issues, it:
|
|
152
|
+
1. Maps fix commits to cards.
|
|
153
|
+
2. Re-runs every PoC at the fix commit in a throwaway worktree. A PoC that reproduced the bug and now fails is the strongest proof of a fix.
|
|
154
|
+
3. Sends the rest to judgement agents.
|
|
155
|
+
4. Flags code the fixes changed that no finding explains, reviews each change, and records the verdict (a new card when it finds a problem).
|
|
156
|
+
5. After **one confirmation**, updates only the Status and Update-from-the-client fields of each GitHub issue.
|
|
157
|
+
- **`/generate-report`**. Emits the seven LaTeX report sections, as `.txt` + `.tex`, from the synced issues. The System Overview uses the verified model and embeds the diagrams you marked "Use in report".
|
|
304
158
|
|
|
305
159
|
---
|
|
306
160
|
|
|
307
|
-
##
|
|
308
|
-
|
|
309
|
-
The dashboard runs locally at `http://localhost:3000` and auto-refreshes when output files change. A live "Updated Ns ago" indicator in the sidebar footer tells you the watcher is connected.
|
|
310
|
-
|
|
311
|
-
| Page | URL | What you see |
|
|
312
|
-
| ---------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
313
|
-
| Home | `/` | Project info, AI overview, key stats. In a differential audit, a base → head banner linking to Changes |
|
|
314
|
-
| **Changes** | `/changes` | **Differential audits only.** Base → head summary, `diff-overview.md`, storage-layout changes, a filterable table of changed entities, the impacted flows with their reason chain and confidence, and the prior-findings regression check |
|
|
315
|
-
| Progress | `/progress` | Weighted progress bar (70% nSLOC reviewed, 20% audit steps, 10% findings triage), contract review checklist (auto-ticks a contract once its Diane notes are done — see Notes) |
|
|
316
|
-
| **Notes** | `/notes` | **Diane's workspace.** Record voice narration (local Whisper), then `/diane` builds a structured per-contract profile — **Leads** (open only), **Description** (Purpose / Inheritance / Storage / Roles / Functions, collapsible), **Questions** (collapsible). Per-contract section nav; close leads; "mark done reading." |
|
|
317
|
-
| Statistics | `/stats` | Per-contract metrics, test coverage, dependencies, ERCs |
|
|
318
|
-
| System Diagram | `/diagram` | Mermaid architecture diagram with zoom/pan |
|
|
319
|
-
| Flows | `/flows` | Mermaid flow charts with zoom/pan |
|
|
320
|
-
| Access Control | `/access` | Role → function matrix with "Show unprotected only" and "Show inferred / unknown modifiers" toggles |
|
|
321
|
-
| State Variables | `/state` | Variable inventory with reader/writer tracking and storage-collision warnings |
|
|
322
|
-
| External Calls | `/calls` | Call surface with filterable Trust column |
|
|
323
|
-
| Functions | `/functions` | Aggregated function view |
|
|
324
|
-
| Spec Conformance | `/conformance` | Code vs spec check results, deviations first, clickable spec links |
|
|
325
|
-
| **Issues** | `/issues` | **The board.** Five columns (Potential / Verified / Synced / Invalid / Duplicate). Drag cards between the editable columns, click to edit (severity, description, recommendation, resolution, client update), or copy a finding as HackMD markdown. The **Synced** column is reached only via `/sync-issues` and is read-only (edit on GitHub). GitHub-sync chip per verified/synced card. |
|
|
326
|
-
| **Report** | `/report` | The seven LaTeX report sections from `/generate-report`, each with a copy-to-clipboard button — paste straight into the Nethermind Overleaf template. |
|
|
161
|
+
## Claude Code Skills
|
|
327
162
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
163
|
+
| Skill | What it does |
|
|
164
|
+
|---|---|
|
|
165
|
+
| `init-audit` | Safety gate, exact facts, multi-agent protocol model + invariants + conformance + diagrams; full or differential |
|
|
166
|
+
| `ai-audit` | 12 parallel attacker agents (pashov solidity-auditor v4.1 fork); findings → board (deduped, pre-validated), leads → notes |
|
|
167
|
+
| `prevalidate` | Parallel PoC-or-refute validation of new machine cards; conclusive cases auto-move |
|
|
168
|
+
| `fuzz`, `fuzz-sync`, `fuzz-convert` | Fuzz accepted invariants (pashov fizz fork); violations become cards |
|
|
169
|
+
| `write-finding` | Record a manual finding as a Potential card |
|
|
170
|
+
| `validate-finding`, `validate-all-findings` | Validate cards; PoC by default; propose triage rules |
|
|
171
|
+
| `generate-poc` | Write and run a PoC (used by the validators) |
|
|
172
|
+
| `diane` | Narration → structured notes, pair-audit corrections, review ticks |
|
|
173
|
+
| `ingest-aa-report` | Ingest a Nethermind AuditAgent scan |
|
|
174
|
+
| `sync-issues` | Two-way GitHub Issues sync (GitHub canonical) |
|
|
175
|
+
| `fix-review` | Check fixes (PoCs re-run at the fix commit) and update GitHub after confirmation |
|
|
176
|
+
| `generate-report` | LaTeX report sections + figures |
|
|
331
177
|
|
|
332
|
-
|
|
178
|
+
Skills live in `.claude/skills/<name>/` and are editable per project. `hex claude` / `hex update-skills` only remove skills Hex installed itself (tracked in `.claude/skills/.hex-skills.json`).
|
|
333
179
|
|
|
334
|
-
|
|
180
|
+
## The Hex MCP Server
|
|
335
181
|
|
|
336
|
-
|
|
182
|
+
`hex claude` registers `hex mcp` in the project's `.mcp.json` (Claude Code asks you to approve it once). It gives the CLI session typed tools:
|
|
183
|
+
- **`hex_focus`**: what you have selected in the dashboard.
|
|
184
|
+
- **`hex_facts_query`**: exact callers, callees, readers, writers, layout, linearization and reach.
|
|
185
|
+
- **Model:** `hex_model_get`, `hex_invariant_*`.
|
|
186
|
+
- **Board:** `hex_board_list`, `hex_issue_*` (including validation, dedup and mark-duplicate).
|
|
187
|
+
- **Review map:** `hex_review_*`.
|
|
188
|
+
- **Notes and rules:** `hex_note_*`, `hex_rules_*`.
|
|
337
189
|
|
|
338
|
-
|
|
190
|
+
So "why is this safe?" in the terminal knows what "this" is.
|
|
339
191
|
|
|
340
|
-
|
|
192
|
+
## The Dashboard
|
|
341
193
|
|
|
342
|
-
|
|
194
|
+
Six destinations, one question each:
|
|
343
195
|
|
|
344
|
-
|
|
196
|
+
| Page | What it answers |
|
|
197
|
+
|---|---|
|
|
198
|
+
| **Today** | What should I do next? Progress, the top blind spots, cards that need triage, recent changes |
|
|
199
|
+
| **Model** | How does the system work? Excalidraw diagrams with takeaways (editable, exportable to the report), actors, assets, privileges, trust, dependencies, accounting, invariants, spec conformance; verified vs contested claims |
|
|
200
|
+
| **Review** | What have I read? Contracts → functions with review state and risk; full code viewer; inspector with facts, notes, cards and Diane's recorder |
|
|
201
|
+
| **Changes** | (differential audits, or after `/fix-review`) What changed, what it reaches, storage layout; fix review results |
|
|
202
|
+
| **Board** | Potential / Verified / Synced / Rejected / Duplicate, with validation verdicts, PoCs and auto-move reverts |
|
|
203
|
+
| **Report** | The LaTeX sections and figures, ready to paste into Overleaf |
|
|
345
204
|
|
|
346
|
-
|
|
205
|
+
It refreshes live as the CLI writes to `.hex/`. `⌘K` searches pages, contracts, functions, cards and invariants.
|
|
347
206
|
|
|
348
|
-
|
|
207
|
+
## Output Directory (`.hex/`)
|
|
349
208
|
|
|
350
209
|
```
|
|
351
210
|
.hex/
|
|
352
|
-
├── config.json #
|
|
353
|
-
├──
|
|
354
|
-
├── stats.json #
|
|
355
|
-
├──
|
|
356
|
-
├──
|
|
357
|
-
├──
|
|
358
|
-
├──
|
|
359
|
-
|
|
360
|
-
├──
|
|
361
|
-
├──
|
|
362
|
-
├──
|
|
363
|
-
├──
|
|
364
|
-
├──
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
├──
|
|
368
|
-
├──
|
|
369
|
-
├──
|
|
370
|
-
├──
|
|
371
|
-
├──
|
|
372
|
-
├──
|
|
373
|
-
├──
|
|
374
|
-
├──
|
|
375
|
-
|
|
376
|
-
│ └── review.json # Regression check per prior finding
|
|
377
|
-
├── ai-audit/ # /ai-audit scans
|
|
378
|
-
│ ├── runs/<stamp>/ # Run files, assembled full-report.md, winners.tsv, hex-digest.md
|
|
379
|
-
│ └── memory.tsv # Cross-scan ledger (when memory is on)
|
|
380
|
-
├── validations/ # Issue validation memos
|
|
381
|
-
│ ├── F001_memo.md
|
|
382
|
-
│ └── SC-003_memo.md
|
|
383
|
-
├── ai-results/ai-audit/ # /ai-audit records behind the board cards
|
|
384
|
-
│ └── findings.json
|
|
385
|
-
├── ai-results/auditagent/ # AuditAgent ingest output
|
|
386
|
-
│ ├── raw-output.md
|
|
387
|
-
│ ├── findings.json
|
|
388
|
-
│ └── metadata.json
|
|
389
|
-
├── ai-status.json # AuditAgent run status (used by `hex ai-status`)
|
|
390
|
-
├── external/github/ # Pulled teammate findings + sync metadata
|
|
391
|
-
│ ├── findings.json
|
|
392
|
-
│ ├── sync-status.json
|
|
393
|
-
│ └── raw-issues.json
|
|
394
|
-
└── report/ # Final LaTeX report sections, .txt + .tex (produced by /generate-report)
|
|
395
|
-
├── executive_summary.txt
|
|
396
|
-
├── audited_files.txt
|
|
397
|
-
├── summary_of_findings.txt
|
|
398
|
-
└── findings.txt
|
|
211
|
+
├── config.json # scope, mode, commits, settings
|
|
212
|
+
├── facts.json # exact compiler facts (or parser fallback, flagged)
|
|
213
|
+
├── stats.json # nSLOC, ERCs, coverage
|
|
214
|
+
├── model/
|
|
215
|
+
│ ├── protocol.json # verified protocol model
|
|
216
|
+
│ ├── invariants.json # invariants + test results
|
|
217
|
+
│ ├── drafts/, verdicts/ # agent working files
|
|
218
|
+
│ └── diagrams/ # <name>.spec.json, <name>.excalidraw, index.json
|
|
219
|
+
├── overview.md, diff-overview.md
|
|
220
|
+
├── spec-conformance.json/.md
|
|
221
|
+
├── diff.json, diff/changes.patch # differential mode
|
|
222
|
+
├── previous-audit/{findings,review}.json # differential mode with a prior audit
|
|
223
|
+
├── findings.json, tracking.json, comparison.json
|
|
224
|
+
├── validations/<id>_memo.md
|
|
225
|
+
├── progress.json # per-function review state
|
|
226
|
+
├── triage-rules.json
|
|
227
|
+
├── notes/ # Diane: contract notes, sessions, audio
|
|
228
|
+
├── ai-audit/runs/<stamp>/ # /ai-audit run files and reports
|
|
229
|
+
├── ai-results/{ai-audit,auditagent}/findings.json
|
|
230
|
+
├── fuzz/ # /fuzz PROPERTIES.md, run data, corpora
|
|
231
|
+
├── fix-review/<sha>.json
|
|
232
|
+
├── focus.json # current dashboard selection (read by hex_focus)
|
|
233
|
+
├── report/ # LaTeX sections + figures/
|
|
234
|
+
└── .cache/ # build-info, compiler output, worktrees
|
|
399
235
|
```
|
|
400
236
|
|
|
401
|
-
You can change the output directory by setting `settings.output_dir` in `config.json` before running init.
|
|
402
|
-
|
|
403
|
-
---
|
|
404
|
-
|
|
405
|
-
## Scope vs. Full Project Access
|
|
406
|
-
|
|
407
|
-
When you initialise an audit, you specify which files are in scope. This is the set of contracts you're responsible for auditing — all analysis tools focus on these files.
|
|
408
|
-
|
|
409
|
-
But the entire project remains accessible. Claude Code can read out-of-scope contracts, run the existing test suite, compile everything, and leverage the project's test infrastructure when writing PoCs. The scope simply tells the tools where to focus their output.
|
|
410
|
-
|
|
411
|
-
```
|
|
412
|
-
# In-scope: these are what you're auditing
|
|
413
|
-
src/core/Vault.sol, src/core/Strategy.sol, src/libraries/Math.sol
|
|
414
|
-
|
|
415
|
-
# Still accessible: tests, mocks, deploy scripts, dependencies, interfaces
|
|
416
|
-
# Claude Code can read them all, forge can compile and run tests against them
|
|
417
|
-
```
|
|
418
|
-
|
|
419
|
-
---
|
|
420
|
-
|
|
421
237
|
## CLI Reference
|
|
422
238
|
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
|
428
|
-
|
|
|
429
|
-
| `hex
|
|
430
|
-
| `hex
|
|
431
|
-
| `hex
|
|
432
|
-
| `hex
|
|
433
|
-
| `hex
|
|
434
|
-
| `hex
|
|
435
|
-
| `hex
|
|
436
|
-
| `hex
|
|
437
|
-
| `hex
|
|
438
|
-
| `hex
|
|
439
|
-
| `hex
|
|
440
|
-
| `hex
|
|
441
|
-
| `hex
|
|
442
|
-
| `hex
|
|
443
|
-
| `hex
|
|
444
|
-
| `hex context --target Vault` | Context for a specific contract and its dependencies |
|
|
445
|
-
| `hex context --estimate` | Show token count without generating context |
|
|
446
|
-
| `hex dashboard` | Start local dashboard and open in browser |
|
|
447
|
-
| `hex dashboard --port 8080` | Start dashboard on a custom port |
|
|
448
|
-
| `hex update` | Update hex-audit to the latest version on npm, then prompt to re-sync skills into the current project |
|
|
449
|
-
| `hex update --check` | Check for an available update without installing |
|
|
450
|
-
| `hex update --yes` | Update and re-sync skills without the post-install prompt |
|
|
451
|
-
| `hex update-skills` | Re-copy skill files from package, removing orphans (overwrites by default) |
|
|
452
|
-
| `hex update-skills --keep-custom` | Skip existing skill files instead of overwriting |
|
|
453
|
-
| `hex issue new\|move\|patch\|show` | Create and mutate board cards (sources: manual, conformance, auditagent, ai-audit, github, prior-audit) |
|
|
454
|
-
| `hex note lead <Contract>` | Add an open lead to a contract note; idempotent with `--source` + `--source-ref` (used by `/ai-audit`) |
|
|
455
|
-
| `hex ai-status` | Show the latest status for AuditAgent scans |
|
|
456
|
-
| `hex ai-status --watch` | Poll every 5 minutes until pending scans resolve (typical scan: 30-60 min) |
|
|
457
|
-
| `hex issue new --source <s> ...` | Allocate a uniform `H-NNN` id and create a board card (used by the skills) |
|
|
458
|
-
| `hex issue move <id> --to <col>` | Move an issue between board columns (potential / verified / invalid / duplicate); materializes a finding on verify |
|
|
459
|
-
| `hex issue patch <id> [...]` | Edit an issue's severity / resolution / description-file / recommendation-file / update-from-client / notes |
|
|
460
|
-
| `hex issue sync-set <id> ...` | Mark an issue synced to a GitHub issue number (used by `/sync-issues`) |
|
|
461
|
-
| `hex issue show <id>` | Print the merged finding + tracking record for an issue |
|
|
239
|
+
| Command | What it does |
|
|
240
|
+
|---|---|
|
|
241
|
+
| `hex doctor` | Preflight check |
|
|
242
|
+
| `hex claude` | Install skills into `.claude/skills/`, register the MCP server |
|
|
243
|
+
| `hex init [--mode diff --base <c>] …` | Initialise the audit config |
|
|
244
|
+
| `hex analyze` | `facts` + `stats` (+ `diff` in differential mode) |
|
|
245
|
+
| `hex facts` / `hex facts query <q> [ref]` | Build exact facts and the navigation index (`.hex/xref.json`) / query them: `callers`, `call-sites`, `callees`, `implementations`, `readers`, `writers`, `layout`, `linearization`, `entry-points`, `reach`, `function` |
|
|
246
|
+
| `hex stats` | nSLOC, ERCs, coverage |
|
|
247
|
+
| `hex diff [--focus <file>] [--scan-files]` | Differential analysis |
|
|
248
|
+
| `hex model show\|validate\|apply-verdicts` | The protocol model |
|
|
249
|
+
| `hex invariant list\|accept\|reject\|set-test\|link-issue\|export\|sync-fuzz` | Invariants |
|
|
250
|
+
| `hex diagram build\|list` | Build Excalidraw scenes from specs |
|
|
251
|
+
| `hex review mark\|status\|blind-spots` | The per-function review map |
|
|
252
|
+
| `hex issue new\|move\|patch\|show\|validation\|revert-auto\|dedup\|mark-duplicate\|exclude\|sync-set` | Board cards |
|
|
253
|
+
| `hex rules list\|add\|remove\|export` | Triage rules |
|
|
254
|
+
| `hex note …` | Notes (Diane), including `note lead` |
|
|
255
|
+
| `hex fix-review [run]\|propose\|reviewed\|apply` | Fix review |
|
|
256
|
+
| `hex mcp` | The MCP server (started by Claude Code) |
|
|
257
|
+
| `hex dashboard [--port <n>] [--no-open]` | The review workspace |
|
|
258
|
+
| `hex ai-status [--watch]` | AuditAgent scan status |
|
|
259
|
+
| `hex update`, `hex update-skills` | Update the package / re-sync skills |
|