hex-audit 0.4.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 +105 -0
- package/DEMO.md +141 -0
- package/README.md +378 -0
- package/dashboard/.next/BUILD_ID +1 -0
- package/dashboard/.next/app-build-manifest.json +99 -0
- package/dashboard/.next/app-path-routes-manifest.json +1 -0
- package/dashboard/.next/build-manifest.json +32 -0
- package/dashboard/.next/cache/.tsbuildinfo +1 -0
- package/dashboard/.next/cache/webpack/client-production/0.pack +0 -0
- package/dashboard/.next/cache/webpack/client-production/index.pack +0 -0
- package/dashboard/.next/cache/webpack/edge-server-production/0.pack +0 -0
- package/dashboard/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/dashboard/.next/cache/webpack/server-production/0.pack +0 -0
- package/dashboard/.next/cache/webpack/server-production/1.pack +0 -0
- package/dashboard/.next/cache/webpack/server-production/2.pack +0 -0
- package/dashboard/.next/cache/webpack/server-production/index.pack +0 -0
- package/dashboard/.next/cache/webpack/server-production/index.pack.old +0 -0
- package/dashboard/.next/export-marker.json +1 -0
- package/dashboard/.next/images-manifest.json +1 -0
- package/dashboard/.next/next-minimal-server.js.nft.json +1 -0
- package/dashboard/.next/next-server.js.nft.json +1 -0
- package/dashboard/.next/package.json +1 -0
- package/dashboard/.next/prerender-manifest.js +1 -0
- package/dashboard/.next/prerender-manifest.json +1 -0
- package/dashboard/.next/react-loadable-manifest.json +300 -0
- package/dashboard/.next/required-server-files.json +1 -0
- package/dashboard/.next/routes-manifest.json +1 -0
- package/dashboard/.next/server/app/_not-found/page.js +1 -0
- package/dashboard/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/_not-found.html +1 -0
- package/dashboard/.next/server/app/_not-found.meta +6 -0
- package/dashboard/.next/server/app/_not-found.rsc +12 -0
- package/dashboard/.next/server/app/access/page.js +1 -0
- package/dashboard/.next/server/app/access/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/access/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/access.html +1 -0
- package/dashboard/.next/server/app/access.meta +5 -0
- package/dashboard/.next/server/app/access.rsc +8 -0
- package/dashboard/.next/server/app/api/code/route.js +1 -0
- package/dashboard/.next/server/app/api/code/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/flows/route.js +1 -0
- package/dashboard/.next/server/app/api/flows/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/flows.body +1 -0
- package/dashboard/.next/server/app/api/flows.meta +1 -0
- package/dashboard/.next/server/app/api/github-status/route.js +1 -0
- package/dashboard/.next/server/app/api/github-status/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/issues/[id]/move/route.js +1 -0
- package/dashboard/.next/server/app/api/issues/[id]/move/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/issues/[id]/route.js +1 -0
- package/dashboard/.next/server/app/api/issues/[id]/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/mermaid/route.js +1 -0
- package/dashboard/.next/server/app/api/mermaid/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/progress/route.js +1 -0
- package/dashboard/.next/server/app/api/progress/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/api/watch/route.js +3 -0
- package/dashboard/.next/server/app/api/watch/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/calls/page.js +1 -0
- package/dashboard/.next/server/app/calls/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/calls/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/calls.html +1 -0
- package/dashboard/.next/server/app/calls.meta +5 -0
- package/dashboard/.next/server/app/calls.rsc +8 -0
- package/dashboard/.next/server/app/conformance/page.js +1 -0
- package/dashboard/.next/server/app/conformance/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/conformance/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/conformance.html +1 -0
- package/dashboard/.next/server/app/conformance.meta +5 -0
- package/dashboard/.next/server/app/conformance.rsc +8 -0
- package/dashboard/.next/server/app/diagram/page.js +1 -0
- package/dashboard/.next/server/app/diagram/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/diagram/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/diagram.html +1 -0
- package/dashboard/.next/server/app/diagram.meta +5 -0
- package/dashboard/.next/server/app/diagram.rsc +10 -0
- package/dashboard/.next/server/app/flows/page.js +1 -0
- package/dashboard/.next/server/app/flows/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/flows/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/flows.html +1 -0
- package/dashboard/.next/server/app/flows.meta +5 -0
- package/dashboard/.next/server/app/flows.rsc +10 -0
- package/dashboard/.next/server/app/functions/page.js +1 -0
- package/dashboard/.next/server/app/functions/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/functions/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/functions.html +1 -0
- package/dashboard/.next/server/app/functions.meta +5 -0
- package/dashboard/.next/server/app/functions.rsc +8 -0
- package/dashboard/.next/server/app/icon.svg/route.js +12 -0
- package/dashboard/.next/server/app/icon.svg/route.js.nft.json +1 -0
- package/dashboard/.next/server/app/icon.svg.body +18 -0
- package/dashboard/.next/server/app/icon.svg.meta +1 -0
- package/dashboard/.next/server/app/index.html +1 -0
- package/dashboard/.next/server/app/index.meta +5 -0
- package/dashboard/.next/server/app/index.rsc +9 -0
- package/dashboard/.next/server/app/issues/page.js +1 -0
- package/dashboard/.next/server/app/issues/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/issues/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/issues.html +1 -0
- package/dashboard/.next/server/app/issues.meta +5 -0
- package/dashboard/.next/server/app/issues.rsc +8 -0
- package/dashboard/.next/server/app/page.js +20 -0
- package/dashboard/.next/server/app/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/progress/page.js +1 -0
- package/dashboard/.next/server/app/progress/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/progress/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/progress.html +1 -0
- package/dashboard/.next/server/app/progress.meta +5 -0
- package/dashboard/.next/server/app/progress.rsc +8 -0
- package/dashboard/.next/server/app/stats/page.js +1 -0
- package/dashboard/.next/server/app/stats/page.js.nft.json +1 -0
- package/dashboard/.next/server/app/stats/page_client-reference-manifest.js +1 -0
- package/dashboard/.next/server/app/stats.html +1 -0
- package/dashboard/.next/server/app/stats.meta +5 -0
- package/dashboard/.next/server/app/stats.rsc +8 -0
- package/dashboard/.next/server/app-paths-manifest.json +22 -0
- package/dashboard/.next/server/chunks/431.js +1 -0
- package/dashboard/.next/server/chunks/557.js +1 -0
- package/dashboard/.next/server/chunks/645.js +6 -0
- package/dashboard/.next/server/chunks/649.js +2 -0
- package/dashboard/.next/server/chunks/665.js +13 -0
- package/dashboard/.next/server/chunks/786.js +12 -0
- package/dashboard/.next/server/chunks/818.js +6 -0
- package/dashboard/.next/server/chunks/916.js +2 -0
- package/dashboard/.next/server/chunks/font-manifest.json +1 -0
- package/dashboard/.next/server/font-manifest.json +1 -0
- package/dashboard/.next/server/functions-config-manifest.json +1 -0
- package/dashboard/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/dashboard/.next/server/middleware-build-manifest.js +1 -0
- package/dashboard/.next/server/middleware-manifest.json +6 -0
- package/dashboard/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/dashboard/.next/server/next-font-manifest.js +1 -0
- package/dashboard/.next/server/next-font-manifest.json +1 -0
- package/dashboard/.next/server/pages/404.html +1 -0
- package/dashboard/.next/server/pages/500.html +1 -0
- package/dashboard/.next/server/pages/_app.js +1 -0
- package/dashboard/.next/server/pages/_app.js.nft.json +1 -0
- package/dashboard/.next/server/pages/_document.js +1 -0
- package/dashboard/.next/server/pages/_document.js.nft.json +1 -0
- package/dashboard/.next/server/pages/_error.js +1 -0
- package/dashboard/.next/server/pages/_error.js.nft.json +1 -0
- package/dashboard/.next/server/pages-manifest.json +1 -0
- package/dashboard/.next/server/server-reference-manifest.js +1 -0
- package/dashboard/.next/server/server-reference-manifest.json +1 -0
- package/dashboard/.next/server/webpack-runtime.js +1 -0
- package/dashboard/.next/static/0IZAlhEwk5-v4myUvWKBd/_buildManifest.js +1 -0
- package/dashboard/.next/static/0IZAlhEwk5-v4myUvWKBd/_ssgManifest.js +1 -0
- package/dashboard/.next/static/chunks/1.8868c4d131111be7.js +36 -0
- package/dashboard/.next/static/chunks/1015.3ab89142e5f44120.js +226 -0
- package/dashboard/.next/static/chunks/1151.b6ef5c786e587ed7.js +1 -0
- package/dashboard/.next/static/chunks/1199.a072929dbec89965.js +148 -0
- package/dashboard/.next/static/chunks/1375.d4d2f7fc9c9c2ff1.js +43 -0
- package/dashboard/.next/static/chunks/1799.83206776abbbf1fc.js +9 -0
- package/dashboard/.next/static/chunks/20154aaa.ccc347c04ab5ad4a.js +1 -0
- package/dashboard/.next/static/chunks/2077.7011a570c87aa7b1.js +1 -0
- package/dashboard/.next/static/chunks/2166.cc0fabeb2e89b840.js +215 -0
- package/dashboard/.next/static/chunks/2291.85a70cb0c228157b.js +29 -0
- package/dashboard/.next/static/chunks/2325.2c55cb9a6282ae3f.js +24 -0
- package/dashboard/.next/static/chunks/2383.62c035a052272594.js +1 -0
- package/dashboard/.next/static/chunks/2694.92bbe252063e4786.js +1 -0
- package/dashboard/.next/static/chunks/275.0d761aa0e5b030b8.js +34 -0
- package/dashboard/.next/static/chunks/2781.8536b644a480aede.js +93 -0
- package/dashboard/.next/static/chunks/2805.a8d71d2f92bb6ba9.js +1 -0
- package/dashboard/.next/static/chunks/2879.51436986f93981d9.js +1 -0
- package/dashboard/.next/static/chunks/3017.e55781da9dd32d37.js +1 -0
- package/dashboard/.next/static/chunks/3205-728c260fbb4f89c6.js +2 -0
- package/dashboard/.next/static/chunks/3236.dff44fa7961d9d5e.js +1 -0
- package/dashboard/.next/static/chunks/3480.9451396ad7ee7613.js +1 -0
- package/dashboard/.next/static/chunks/3626.ba1cf848a9f2e93d.js +64 -0
- package/dashboard/.next/static/chunks/3865.a432a7910a2f5281.js +90 -0
- package/dashboard/.next/static/chunks/3887.c22cbfa3f095826c.js +1 -0
- package/dashboard/.next/static/chunks/3924-4a05057b5450abe1.js +1 -0
- package/dashboard/.next/static/chunks/3948.fe3c7d758568d98b.js +287 -0
- package/dashboard/.next/static/chunks/4728.07d87640a3e7dd0d.js +24 -0
- package/dashboard/.next/static/chunks/4787.4e5f6a0e0e40a583.js +23 -0
- package/dashboard/.next/static/chunks/5060.baca226af35ed016.js +1 -0
- package/dashboard/.next/static/chunks/5284.f949ac90c95ff143.js +1 -0
- package/dashboard/.next/static/chunks/5715.1524bcc9591e180b.js +115 -0
- package/dashboard/.next/static/chunks/6014.700ae4969b64d728.js +104 -0
- package/dashboard/.next/static/chunks/6024.4d23707c65514679.js +79 -0
- package/dashboard/.next/static/chunks/6052.033a6f1013c666eb.js +141 -0
- package/dashboard/.next/static/chunks/6177.e5c84cfc4c0dea51.js +1 -0
- package/dashboard/.next/static/chunks/618f8807-547c5614e1318888.js +1 -0
- package/dashboard/.next/static/chunks/6434.9481771c33195d29.js +1 -0
- package/dashboard/.next/static/chunks/6468.f4a3e8fa6accc6da.js +77 -0
- package/dashboard/.next/static/chunks/6540.86f367d7390738d4.js +1 -0
- package/dashboard/.next/static/chunks/6549.4d0d472df96429a5.js +1 -0
- package/dashboard/.next/static/chunks/690f35d0.3e40ca0930e4bbdb.js +119 -0
- package/dashboard/.next/static/chunks/7020.831e16e26d91abc1.js +166 -0
- package/dashboard/.next/static/chunks/7397-f6f4dddc7a20bfc1.js +1 -0
- package/dashboard/.next/static/chunks/7498-ea83cb9e30ec5491.js +1 -0
- package/dashboard/.next/static/chunks/7802.89aec9ee11680850.js +80 -0
- package/dashboard/.next/static/chunks/7973.8b526f589aca5d84.js +79 -0
- package/dashboard/.next/static/chunks/7a04ac15.1c6cea694301806c.js +62 -0
- package/dashboard/.next/static/chunks/8216.1bead812eb126c35.js +5 -0
- package/dashboard/.next/static/chunks/8233babc.780b8e272eda298f.js +92 -0
- package/dashboard/.next/static/chunks/8452-e616b5f43bceb95f.js +13 -0
- package/dashboard/.next/static/chunks/8645.a5ca76f11edc9633.js +1 -0
- package/dashboard/.next/static/chunks/8928-60c623ee89d2e6ad.js +1 -0
- package/dashboard/.next/static/chunks/9173.2486ffca31131ec5.js +1 -0
- package/dashboard/.next/static/chunks/9178.469341860bf8caec.js +1 -0
- package/dashboard/.next/static/chunks/9466.e904660d38c03eea.js +1 -0
- package/dashboard/.next/static/chunks/9660.84a85811380c5f33.js +1 -0
- package/dashboard/.next/static/chunks/9717.6cf5c8c89403b651.js +1 -0
- package/dashboard/.next/static/chunks/9720.67d4d0d15a96d691.js +1 -0
- package/dashboard/.next/static/chunks/9811.65e1d080c2d256af.js +1 -0
- package/dashboard/.next/static/chunks/app/_not-found/page-548ab392d0e890d1.js +1 -0
- package/dashboard/.next/static/chunks/app/access/page-3668562e7464eb5d.js +1 -0
- package/dashboard/.next/static/chunks/app/calls/page-d07f5b8664cc8303.js +1 -0
- package/dashboard/.next/static/chunks/app/conformance/page-2fede1d7b5f9265d.js +1 -0
- package/dashboard/.next/static/chunks/app/diagram/page-b228444265546495.js +1 -0
- package/dashboard/.next/static/chunks/app/flows/page-fa67783d8cd79cab.js +1 -0
- package/dashboard/.next/static/chunks/app/functions/page-686f0296639133a3.js +1 -0
- package/dashboard/.next/static/chunks/app/issues/page-dc110d4cc0a5c398.js +1 -0
- package/dashboard/.next/static/chunks/app/layout-e7b50543ba216d12.js +1 -0
- package/dashboard/.next/static/chunks/app/page-a0f25953d4457935.js +1 -0
- package/dashboard/.next/static/chunks/app/progress/page-f07ac39d1d27b480.js +1 -0
- package/dashboard/.next/static/chunks/app/stats/page-db81f600a086f252.js +1 -0
- package/dashboard/.next/static/chunks/b7167ec1.7afbab6f609e3326.js +153 -0
- package/dashboard/.next/static/chunks/c7ea4e13.5effeeba6618bdb7.js +1 -0
- package/dashboard/.next/static/chunks/framework-cf6f5bdca6ba0184.js +33 -0
- package/dashboard/.next/static/chunks/main-70c6d841ad572657.js +1 -0
- package/dashboard/.next/static/chunks/main-app-9d2f6b8a47133e9b.js +1 -0
- package/dashboard/.next/static/chunks/pages/_app-6ad2b50514c24ab4.js +1 -0
- package/dashboard/.next/static/chunks/pages/_error-d5eb11c5c4626811.js +1 -0
- package/dashboard/.next/static/chunks/polyfills-78c92fac7aa8fdd8.js +1 -0
- package/dashboard/.next/static/chunks/webpack-08869f2b18792e51.js +1 -0
- package/dashboard/.next/static/css/e6cb67f77f13ae8e.css +3 -0
- package/dashboard/.next/static/media/0aa834ed78bf6d07-s.woff2 +0 -0
- package/dashboard/.next/static/media/438aa629764e75f3-s.woff2 +0 -0
- package/dashboard/.next/static/media/4c9affa5bc8f420e-s.p.woff2 +0 -0
- package/dashboard/.next/static/media/51251f8b9793cdb3-s.woff2 +0 -0
- package/dashboard/.next/static/media/67957d42bae0796d-s.woff2 +0 -0
- package/dashboard/.next/static/media/875ae681bfde4580-s.woff2 +0 -0
- package/dashboard/.next/static/media/886030b0b59bc5a7-s.woff2 +0 -0
- package/dashboard/.next/static/media/939c4f875ee75fbb-s.woff2 +0 -0
- package/dashboard/.next/static/media/bb3ef058b751a6ad-s.p.woff2 +0 -0
- package/dashboard/.next/static/media/cc978ac5ee68c2b6-s.woff2 +0 -0
- package/dashboard/.next/static/media/e857b654a2caa584-s.woff2 +0 -0
- package/dashboard/.next/static/media/f911b923c6adde36-s.woff2 +0 -0
- package/dashboard/.next/trace +80 -0
- package/dashboard/.next/types/app/access/page.ts +79 -0
- package/dashboard/.next/types/app/api/code/route.ts +343 -0
- package/dashboard/.next/types/app/api/flows/route.ts +343 -0
- package/dashboard/.next/types/app/api/github-status/route.ts +343 -0
- package/dashboard/.next/types/app/api/issues/[id]/move/route.ts +343 -0
- package/dashboard/.next/types/app/api/issues/[id]/route.ts +343 -0
- package/dashboard/.next/types/app/api/mermaid/route.ts +343 -0
- package/dashboard/.next/types/app/api/progress/route.ts +343 -0
- package/dashboard/.next/types/app/api/watch/route.ts +343 -0
- package/dashboard/.next/types/app/calls/page.ts +79 -0
- package/dashboard/.next/types/app/conformance/page.ts +79 -0
- package/dashboard/.next/types/app/diagram/page.ts +79 -0
- package/dashboard/.next/types/app/flows/page.ts +79 -0
- package/dashboard/.next/types/app/functions/page.ts +79 -0
- package/dashboard/.next/types/app/issues/page.ts +79 -0
- package/dashboard/.next/types/app/page.ts +79 -0
- package/dashboard/.next/types/app/progress/page.ts +79 -0
- package/dashboard/.next/types/app/stats/page.ts +79 -0
- package/dashboard/.next/types/package.json +1 -0
- package/dashboard/app/access/AccessClient.tsx +402 -0
- package/dashboard/app/access/ReadOnlyFunctions.tsx +114 -0
- package/dashboard/app/access/page.tsx +118 -0
- package/dashboard/app/api/code/route.ts +35 -0
- package/dashboard/app/api/flows/route.ts +28 -0
- package/dashboard/app/api/github-status/route.ts +23 -0
- package/dashboard/app/api/issues/[id]/move/route.ts +74 -0
- package/dashboard/app/api/issues/[id]/route.ts +109 -0
- package/dashboard/app/api/mermaid/route.ts +25 -0
- package/dashboard/app/api/progress/route.ts +36 -0
- package/dashboard/app/api/watch/route.ts +52 -0
- package/dashboard/app/calls/CallsClient.tsx +170 -0
- package/dashboard/app/calls/page.tsx +50 -0
- package/dashboard/app/conformance/ConformanceTable.tsx +214 -0
- package/dashboard/app/conformance/page.tsx +179 -0
- package/dashboard/app/diagram/page.tsx +65 -0
- package/dashboard/app/flows/page.tsx +102 -0
- package/dashboard/app/functions/FunctionsClient.tsx +167 -0
- package/dashboard/app/functions/page.tsx +171 -0
- package/dashboard/app/globals.css +157 -0
- package/dashboard/app/icon.svg +18 -0
- package/dashboard/app/issues/IssuesBoardClient.tsx +636 -0
- package/dashboard/app/issues/page.tsx +239 -0
- package/dashboard/app/layout.tsx +40 -0
- package/dashboard/app/page.tsx +259 -0
- package/dashboard/app/progress/ProgressClient.tsx +333 -0
- package/dashboard/app/progress/page.tsx +118 -0
- package/dashboard/app/stats/StatsClient.tsx +452 -0
- package/dashboard/app/stats/page.tsx +43 -0
- package/dashboard/components/AutoRefresh.tsx +37 -0
- package/dashboard/components/CodeReference.tsx +129 -0
- package/dashboard/components/CommandPalette.tsx +135 -0
- package/dashboard/components/ConfidenceBadge.tsx +53 -0
- package/dashboard/components/DashboardLayout.tsx +450 -0
- package/dashboard/components/FilterableTable.tsx +293 -0
- package/dashboard/components/LiveStatus.tsx +99 -0
- package/dashboard/components/MarkdownRenderer.tsx +40 -0
- package/dashboard/components/MermaidViewer.tsx +267 -0
- package/dashboard/components/NotYetGenerated.tsx +32 -0
- package/dashboard/components/SeverityBadge.tsx +28 -0
- package/dashboard/components/SignalBars.tsx +27 -0
- package/dashboard/components/SortableTable.tsx +122 -0
- package/dashboard/lib/conformance-tokens.ts +49 -0
- package/dashboard/lib/data.ts +102 -0
- package/dashboard/lib/watcher.ts +45 -0
- package/dashboard/next-env.d.ts +5 -0
- package/dashboard/next.config.mjs +9 -0
- package/dashboard/postcss.config.cjs +6 -0
- package/dashboard/tailwind.config.ts +79 -0
- package/dashboard/tsconfig.json +21 -0
- package/dist/analysis/access-control.d.ts +24 -0
- package/dist/analysis/access-control.d.ts.map +1 -0
- package/dist/analysis/access-control.js +378 -0
- package/dist/analysis/access-control.js.map +1 -0
- package/dist/analysis/attack-surface.d.ts +51 -0
- package/dist/analysis/attack-surface.d.ts.map +1 -0
- package/dist/analysis/attack-surface.js +206 -0
- package/dist/analysis/attack-surface.js.map +1 -0
- package/dist/analysis/constraint-extraction.d.ts +25 -0
- package/dist/analysis/constraint-extraction.d.ts.map +1 -0
- package/dist/analysis/constraint-extraction.js +398 -0
- package/dist/analysis/constraint-extraction.js.map +1 -0
- package/dist/analysis/context-assembler.d.ts +16 -0
- package/dist/analysis/context-assembler.d.ts.map +1 -0
- package/dist/analysis/context-assembler.js +88 -0
- package/dist/analysis/context-assembler.js.map +1 -0
- package/dist/analysis/dependency-graph.d.ts +31 -0
- package/dist/analysis/dependency-graph.d.ts.map +1 -0
- package/dist/analysis/dependency-graph.js +223 -0
- package/dist/analysis/dependency-graph.js.map +1 -0
- package/dist/analysis/erc-detection.d.ts +16 -0
- package/dist/analysis/erc-detection.d.ts.map +1 -0
- package/dist/analysis/erc-detection.js +81 -0
- package/dist/analysis/erc-detection.js.map +1 -0
- package/dist/analysis/external-calls.d.ts +8 -0
- package/dist/analysis/external-calls.d.ts.map +1 -0
- package/dist/analysis/external-calls.js +124 -0
- package/dist/analysis/external-calls.js.map +1 -0
- package/dist/analysis/nsloc.d.ts +46 -0
- package/dist/analysis/nsloc.d.ts.map +1 -0
- package/dist/analysis/nsloc.js +106 -0
- package/dist/analysis/nsloc.js.map +1 -0
- package/dist/analysis/pattern-detection.d.ts +20 -0
- package/dist/analysis/pattern-detection.d.ts.map +1 -0
- package/dist/analysis/pattern-detection.js +236 -0
- package/dist/analysis/pattern-detection.js.map +1 -0
- package/dist/analysis/state-variables.d.ts +33 -0
- package/dist/analysis/state-variables.d.ts.map +1 -0
- package/dist/analysis/state-variables.js +179 -0
- package/dist/analysis/state-variables.js.map +1 -0
- package/dist/commands/access.d.ts +3 -0
- package/dist/commands/access.d.ts.map +1 -0
- package/dist/commands/access.js +99 -0
- package/dist/commands/access.js.map +1 -0
- package/dist/commands/ai-status.d.ts +3 -0
- package/dist/commands/ai-status.d.ts.map +1 -0
- package/dist/commands/ai-status.js +172 -0
- package/dist/commands/ai-status.js.map +1 -0
- package/dist/commands/analyze.d.ts +3 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +101 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/calls.d.ts +3 -0
- package/dist/commands/calls.d.ts.map +1 -0
- package/dist/commands/calls.js +92 -0
- package/dist/commands/calls.js.map +1 -0
- package/dist/commands/claude.d.ts +3 -0
- package/dist/commands/claude.d.ts.map +1 -0
- package/dist/commands/claude.js +42 -0
- package/dist/commands/claude.js.map +1 -0
- package/dist/commands/constraints.d.ts +3 -0
- package/dist/commands/constraints.d.ts.map +1 -0
- package/dist/commands/constraints.js +32 -0
- package/dist/commands/constraints.js.map +1 -0
- package/dist/commands/context.d.ts +3 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +57 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/dashboard.d.ts +3 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +95 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/deps.d.ts +3 -0
- package/dist/commands/deps.d.ts.map +1 -0
- package/dist/commands/deps.js +67 -0
- package/dist/commands/deps.js.map +1 -0
- package/dist/commands/doctor.d.ts +17 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +154 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +330 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/patterns.d.ts +3 -0
- package/dist/commands/patterns.d.ts.map +1 -0
- package/dist/commands/patterns.js +40 -0
- package/dist/commands/patterns.js.map +1 -0
- package/dist/commands/state.d.ts +3 -0
- package/dist/commands/state.d.ts.map +1 -0
- package/dist/commands/state.js +92 -0
- package/dist/commands/state.js.map +1 -0
- package/dist/commands/stats.d.ts +3 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +347 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/surface.d.ts +3 -0
- package/dist/commands/surface.d.ts.map +1 -0
- package/dist/commands/surface.js +45 -0
- package/dist/commands/surface.js.map +1 -0
- package/dist/commands/update-skills.d.ts +3 -0
- package/dist/commands/update-skills.d.ts.map +1 -0
- package/dist/commands/update-skills.js +40 -0
- package/dist/commands/update-skills.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +157 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/core/config.d.ts +24 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +70 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/errors.d.ts +17 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +113 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/external-tools.d.ts +39 -0
- package/dist/core/external-tools.d.ts.map +1 -0
- package/dist/core/external-tools.js +151 -0
- package/dist/core/external-tools.js.map +1 -0
- package/dist/core/logger.d.ts +16 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +22 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/output.d.ts +13 -0
- package/dist/core/output.d.ts.map +1 -0
- package/dist/core/output.js +45 -0
- package/dist/core/output.js.map +1 -0
- package/dist/core/paths.d.ts +21 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +32 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/progress.d.ts +34 -0
- package/dist/core/progress.d.ts.map +1 -0
- package/dist/core/progress.js +119 -0
- package/dist/core/progress.js.map +1 -0
- package/dist/core/schema.d.ts +3197 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js +420 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/skills.d.ts +28 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +82 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/lcov.d.ts +27 -0
- package/dist/parsers/lcov.d.ts.map +1 -0
- package/dist/parsers/lcov.js +68 -0
- package/dist/parsers/lcov.js.map +1 -0
- package/dist/parsers/slither.d.ts +63 -0
- package/dist/parsers/slither.d.ts.map +1 -0
- package/dist/parsers/slither.js +160 -0
- package/dist/parsers/slither.js.map +1 -0
- package/dist/parsers/solc.d.ts +19 -0
- package/dist/parsers/solc.d.ts.map +1 -0
- package/dist/parsers/solc.js +43 -0
- package/dist/parsers/solc.js.map +1 -0
- package/dist/parsers/solidity-parser.d.ts +77 -0
- package/dist/parsers/solidity-parser.d.ts.map +1 -0
- package/dist/parsers/solidity-parser.js +357 -0
- package/dist/parsers/solidity-parser.js.map +1 -0
- package/dist/skills/generate-overleaf.md +326 -0
- package/dist/skills/generate-poc.md +186 -0
- package/dist/skills/ingest-aa-report.md +172 -0
- package/dist/skills/init-audit.md +271 -0
- package/dist/skills/sync-issues.md +266 -0
- package/dist/skills/validate-issue.md +149 -0
- package/dist/skills/write-finding.md +142 -0
- package/dist/types/index.d.ts +30 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +81 -0
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Hex Design System & Style Guide
|
|
2
|
+
|
|
3
|
+
## Brand
|
|
4
|
+
- Product name: **Hex** (lowercase `hex` in CLI and code, title case `Hex` in docs)
|
|
5
|
+
- CLI command: `hex`
|
|
6
|
+
- Output directory: `.hex/`
|
|
7
|
+
- Dashboard package: `hex-dashboard`
|
|
8
|
+
|
|
9
|
+
## Typography
|
|
10
|
+
- **Display/body**: Manrope (Google Fonts), variable weight 200-800
|
|
11
|
+
- **Code only**: JetBrains Mono (file paths, code snippets, code blocks)
|
|
12
|
+
- **Fallback (sans)**: `system-ui, -apple-system, sans-serif`
|
|
13
|
+
- **Fallback (mono)**: `ui-monospace, 'SF Mono', monospace`
|
|
14
|
+
- **Scale**: display (28px/600), title (20px/600), heading (15px/500), body (14px/400), caption (12px/400)
|
|
15
|
+
- **Section headers**: sentence case, medium weight (not uppercase)
|
|
16
|
+
|
|
17
|
+
## Color Palette
|
|
18
|
+
|
|
19
|
+
### Dark Mode (primary)
|
|
20
|
+
Surfaces are blue-tinted (hue 265), not pure black. Built with OKLCH for perceptual uniformity.
|
|
21
|
+
|
|
22
|
+
| Token | Value | Usage |
|
|
23
|
+
|-------|-------|-------|
|
|
24
|
+
| `--surface-0` | `oklch(0.13 0.005 265)` | Page background |
|
|
25
|
+
| `--surface-1` | `oklch(0.17 0.006 265)` | Cards, sidebar |
|
|
26
|
+
| `--surface-2` | `oklch(0.21 0.006 265)` | Elevated surfaces, inputs |
|
|
27
|
+
| `--surface-3` | `oklch(0.26 0.006 265)` | Hover states |
|
|
28
|
+
| `--text-primary` | `oklch(0.93 0.005 265)` | Body text |
|
|
29
|
+
| `--text-secondary` | `oklch(0.65 0.01 265)` | Secondary labels |
|
|
30
|
+
| `--text-tertiary` | `oklch(0.48 0.008 265)` | Disabled, hints |
|
|
31
|
+
| `--accent` | `oklch(0.58 0.19 265)` | Indigo (links, active states) |
|
|
32
|
+
| `--accent-subtle` | `oklch(0.58 0.19 265 / 0.10)` | Hover tint |
|
|
33
|
+
| `--accent-secondary` | `oklch(0.68 0.14 265)` | Lighter indigo |
|
|
34
|
+
| `--border-subtle` | `oklch(0.25 0.005 265 / 0.5)` | Faint dividers |
|
|
35
|
+
| `--border-default` | `oklch(0.30 0.006 265 / 0.6)` | Standard borders |
|
|
36
|
+
| `--border-emphasis` | `oklch(0.40 0.01 265 / 0.7)` | Active borders |
|
|
37
|
+
|
|
38
|
+
### Severity Colors (both modes)
|
|
39
|
+
| Severity | Color | Value |
|
|
40
|
+
|----------|-------|-------|
|
|
41
|
+
| Critical | Red | `oklch(0.58 0.22 25)` |
|
|
42
|
+
| High | Amber | `oklch(0.68 0.16 55)` |
|
|
43
|
+
| Medium | Yellow | `oklch(0.72 0.14 85)` |
|
|
44
|
+
| Low | Blue | `oklch(0.58 0.14 250)` |
|
|
45
|
+
| Info | Gray | `oklch(0.55 0.01 265)` |
|
|
46
|
+
|
|
47
|
+
### Light Mode (secondary)
|
|
48
|
+
Surfaces start at near-white. Accent shifts to deeper indigo for contrast. Lower priority; dark mode is the primary experience.
|
|
49
|
+
|
|
50
|
+
## Layout Patterns
|
|
51
|
+
|
|
52
|
+
### Page Structure
|
|
53
|
+
1. **Page title**: title size, semibold
|
|
54
|
+
2. **Summary metrics** (where applicable): grid of stat cards
|
|
55
|
+
3. **Detail table**: FilterableTable or SortableTable with the full dataset
|
|
56
|
+
|
|
57
|
+
### Sidebar Navigation
|
|
58
|
+
- Fixed 220px width, `bg-surface-1`, right border `border-subtle`
|
|
59
|
+
- Groups labeled in sentence case, caption size
|
|
60
|
+
- Active item: `bg-accent-subtle text-accent` (no border-left stripe)
|
|
61
|
+
- Footer: theme toggle + `⌘K` hint
|
|
62
|
+
|
|
63
|
+
### Cards
|
|
64
|
+
- Background: `bg-surface-1`
|
|
65
|
+
- Border: `border border-border-subtle`
|
|
66
|
+
- Border radius: `rounded-lg` (12px)
|
|
67
|
+
- Hover: `border-border-default bg-surface-2`
|
|
68
|
+
- Padding: `p-4` to `p-6`
|
|
69
|
+
|
|
70
|
+
## Animations & Motion
|
|
71
|
+
|
|
72
|
+
### Principles
|
|
73
|
+
- Subtle, functional, not decorative
|
|
74
|
+
- All transitions: 200ms ease on interactive elements only (not universal)
|
|
75
|
+
- No persistent background effects
|
|
76
|
+
|
|
77
|
+
### Utilities
|
|
78
|
+
- `.stagger`: children fade-in with 30ms staggered delay
|
|
79
|
+
- `.scale-in`: KPI number scale animation (0.92 to 1, 350ms)
|
|
80
|
+
|
|
81
|
+
## Component Conventions
|
|
82
|
+
|
|
83
|
+
### Tables
|
|
84
|
+
- Header row: caption size, text-tertiary
|
|
85
|
+
- Row hover: `bg-surface-3`
|
|
86
|
+
- Row dividers: `border-border-subtle`
|
|
87
|
+
- Filter pills: rounded-md, `bg-accent text-surface-0` when active
|
|
88
|
+
|
|
89
|
+
### Badges
|
|
90
|
+
- Severity badges use the severity color palette
|
|
91
|
+
- All badges: `rounded-md`, `px-2.5 py-1 text-caption`
|
|
92
|
+
|
|
93
|
+
### Code References
|
|
94
|
+
- Clickable `file:line` format in monospace
|
|
95
|
+
- Modal with clean surface, subtle shadow
|
|
96
|
+
- Highlighted lines: `bg-accent/10`
|
|
97
|
+
|
|
98
|
+
## Do NOT
|
|
99
|
+
- Use monospace fonts outside of code blocks
|
|
100
|
+
- Use colored border-left/right stripes on cards (>1px)
|
|
101
|
+
- Add gradient text
|
|
102
|
+
- Use bounce/elastic easing
|
|
103
|
+
- Use green (#00cc33) or neon accent colors
|
|
104
|
+
- Use glassmorphism/backdrop-blur decoratively
|
|
105
|
+
- Default to all-uppercase labels
|
package/DEMO.md
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Hex Demo Guide
|
|
2
|
+
|
|
3
|
+
Step-by-step demo of Hex's audit workflow using Claude Code.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
1. Pick any Foundry project with Solidity contracts. If you don't have one handy:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
git clone https://github.com/transmissions11/solmate.git
|
|
11
|
+
cd solmate
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
2. Install skills (works before init — no config required):
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
hex claude
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
3. Open Claude Code:
|
|
21
|
+
```bash
|
|
22
|
+
claude
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Demo flow (all inside Claude Code)
|
|
26
|
+
|
|
27
|
+
### Phase 1 — One-shot pre-review (`/init-audit`)
|
|
28
|
+
|
|
29
|
+
Switch your Claude Code model to **Opus** for this one — it does all of the reasoning-heavy pre-review work in a single skill.
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
/init-audit
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
It asks for scope, commit, chain, and docs URL. For solmate something like `--scope "src/**/*.sol"` works. Then the skill runs end-to-end:
|
|
36
|
+
|
|
37
|
+
1. **Dependency safety audit** — checks `package.json` install hooks, Foundry `lib/` submodules, `foundry.toml` (FFI, fs_permissions, remappings), plaintext secrets in `.env*`, suspicious VS Code extensions. Stops before compilation if anything looks risky.
|
|
38
|
+
2. **`hex init` + `hex analyze`** — runs the seven deterministic analyses (stats, deps, access, state, calls, patterns, constraints) in parallel, plus surface last. Slither and forge flatten results are cached across commands.
|
|
39
|
+
3. **Protocol overview** — writes a 2-3 paragraph `overview.md` (key contracts table, external deps, architecture notes).
|
|
40
|
+
4. **System diagram** — `.hex/diagrams/diagram.mmd` Mermaid architecture with trust zones and semantic symbols. Split into multiple files if >15 nodes.
|
|
41
|
+
5. **Flow charts** — `.hex/diagrams/flow-*.mmd` per archetype (deposit/withdraw, governance, liquidation, etc.) with distinct shapes per node role and explicit success+revert branches on every decision.
|
|
42
|
+
6. **Spec conformance** — cross-references docs, NatSpec, interfaces, and ERC/EIPs (fetches canonical specs from `eips.ethereum.org`). Writes `spec-conformance.json`.
|
|
43
|
+
7. **Materialize conformance items to the board** — every DEVIATES/PARTIAL spec item becomes a Potential card in `tracking.json` (source `conformance`).
|
|
44
|
+
|
|
45
|
+
If anything fails, `hex doctor` prints a labelled preflight table (node, forge, slither, solc, Claude Code, output dir, `.hex/config.json`) with one-line install hints.
|
|
46
|
+
|
|
47
|
+
### Dashboard opens automatically
|
|
48
|
+
|
|
49
|
+
The last step of `/init-audit` launches `hex dashboard` in the background, so `http://localhost:3000` opens in your browser when the pipeline finishes. Live-refreshes on every `.hex/` change. If you ever need to start it manually, run `hex dashboard` in a second terminal.
|
|
50
|
+
|
|
51
|
+
Key pages:
|
|
52
|
+
|
|
53
|
+
- `/progress` — Weighted progress bar (70% nSLOC reviewed, 20% audit steps, 10% findings triage), contract review checklist.
|
|
54
|
+
- `/stats` — KPI cards, ERC badges, per-contract metrics, coverage, dependencies.
|
|
55
|
+
- `/access` — Role → function matrix with "Show unprotected only" and "Show inferred / unknown modifiers" toggles.
|
|
56
|
+
- `/state` — State variable inventory with reader/writer tracking and storage-collision warnings.
|
|
57
|
+
- `/calls` — External call surface with filterable Trust column.
|
|
58
|
+
- `/functions` — Aggregated function view.
|
|
59
|
+
- `/diagram` and `/flows` — Full-bleed Mermaid canvas with auto-fit zoom and legend overlay.
|
|
60
|
+
- `/conformance` — Conformance check results, deviations first, clickable spec links.
|
|
61
|
+
- `/issues` — **The board.** Four columns: Potential / Verified / Invalid / Duplicate. Cards with severity, source badge, GitHub sync chip, duplicate signals. Drag a card to change column. Click to open a modal that edits severity, description, recommendation, resolution, and client update.
|
|
62
|
+
|
|
63
|
+
### Phase 2 — Manual review + `/write-finding`
|
|
64
|
+
|
|
65
|
+
Read the code in your editor. Leave `// @audit-issue ...` comments above anything suspicious.
|
|
66
|
+
|
|
67
|
+
When you have something concrete, point Claude at it:
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
/write-finding for the rounding error in src/Vault.sol
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
`/write-finding` records the finding to `findings.json` and adds a tracking entry with status `pending_validation` and source `manual` — it shows up on the **Potential** column of the board. (No more "born verified" findings — every issue is validated explicitly.)
|
|
74
|
+
|
|
75
|
+
### Phase 3 — Validate, ingest AI, sync GitHub
|
|
76
|
+
|
|
77
|
+
#### `/validate-issue` for any potential issue
|
|
78
|
+
|
|
79
|
+
`/validate-issue` is source-agnostic. Pass an id (`F003`, `SC-007`, `AA-N002`, `github-42`) or a free-text reference:
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
/validate-issue F003
|
|
83
|
+
/validate-issue for the rounding issue
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Claude traces the attack path in the code, writes a validation memo (always), and asks per-issue whether you want a PoC or memo-only. On valid → tracking entry promotes to `verified` and the card moves to Verified on the board. On invalid → tracking entry becomes `rejected` and the card moves to Invalid.
|
|
87
|
+
|
|
88
|
+
#### `/ingest-aa-report` — Nethermind AuditAgent only
|
|
89
|
+
|
|
90
|
+
Hex only integrates with **AuditAgent** (Nethermind's cloud scanner). You start a scan separately (Nethermind portal or `aa scan ...`) and paste the scan ID into Hex:
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
/ingest-aa-report <scan-id>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
The skill checks status via `aa scan --status`. If the scan is still running it prints a status line and exits — you come back later. Run `hex ai-status --watch` in another terminal to be notified when the scan finishes.
|
|
97
|
+
|
|
98
|
+
When complete, the skill fetches findings, materializes them as Potential cards (`source: "auditagent"`), and runs **inline dedup** against existing entries. Auditagent findings that match a manual or conformance issue are flipped to `duplicate` and surface in the Duplicate column with `match_signals` (contract / function / root_cause / attack_vector).
|
|
99
|
+
|
|
100
|
+
#### `/sync-issues` — team mode via GitHub Issues
|
|
101
|
+
|
|
102
|
+
If `settings.github.repo` is configured in `.hex/config.json` (e.g. `nethermind/audit-vaultx`) and `gh auth login` has been run:
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
/sync-issues
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
One run does both directions:
|
|
109
|
+
|
|
110
|
+
- **Pulls** every issue with the `hex` label. Issues with the round-trip footer `<!-- hex-finding-id: F<NNN> -->` link back to local findings; issues without the footer are teammate findings, materialized as new tracking entries (`source: "github"`).
|
|
111
|
+
- **Inline dedup, GitHub-canonical.** If a pulled GitHub issue matches a local potential, **the local entry becomes the duplicate** (`status: "duplicate"`, `duplicate_of: "github-<num>"`). Reason: a teammate has already filed it — your in-progress card is redundant.
|
|
112
|
+
- **Pushes** local findings whose tracking status is in `settings.github.publish_status` (default `["verified"]`). Updates existing issues by `github.issue_number`, never creates labels.
|
|
113
|
+
|
|
114
|
+
GitHub-sync state shows as a chip on each card on the board.
|
|
115
|
+
|
|
116
|
+
### Phase 4 — Final deliverable (`/generate-overleaf`)
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
/generate-overleaf
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Writes four `.txt` LaTeX section files to `.hex/overleaf/`:
|
|
123
|
+
|
|
124
|
+
1. `executive_summary.txt` — `\section{Executive Summary}` with project synopsis, severity histogram, status histogram, summary table.
|
|
125
|
+
2. `audited_files.txt` — `\section{Audited Files}` table of in-scope files (LoC, comments, ratio, blank, total).
|
|
126
|
+
3. `summary_of_findings.txt` — `\section{Summary of Issues}` table linking to per-finding subsections.
|
|
127
|
+
4. `findings.txt` — `\section{Issues}` with one `\subsection{[Sev] title}\label{issue:N}` per verified finding (description, code blocks via minted, recommendation, status, client update).
|
|
128
|
+
|
|
129
|
+
The skill prompts once for any missing report metadata (initial/final commit, dates, doc/test assessment) and persists them under `settings.report.*` so reruns don't re-prompt. Upload the four files into your Nethermind Overleaf template's matching slots.
|
|
130
|
+
|
|
131
|
+
Only `verified` findings make the cut. Duplicates, rejected, and pending entries are skipped.
|
|
132
|
+
|
|
133
|
+
## Key points
|
|
134
|
+
|
|
135
|
+
- `/init-audit` is now a single skill that runs everything pre-manual-review.
|
|
136
|
+
- The board (`/issues`) is the only findings page. Cards are interactive: drag to change column, click to edit.
|
|
137
|
+
- `/write-finding` records Potential issues — promote them via `/validate-issue` or by dragging on the board.
|
|
138
|
+
- `/ingest-aa-report` takes a scan ID, never starts a scan.
|
|
139
|
+
- `/sync-issues` treats GitHub as the source of truth — your local entry is the duplicate on a match.
|
|
140
|
+
- `/generate-overleaf` is the final handoff to the LaTeX report.
|
|
141
|
+
- `hex update` upgrades the package and prompts to re-sync skills in one shot; `hex update-skills` re-syncs skills only.
|
package/README.md
ADDED
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
# Hex
|
|
2
|
+
|
|
3
|
+
A toolkit for Solidity smart contract auditors. Hex combines Claude Code skills, deterministic analysis tools, and a local dashboard to take you from "I just received the code" to "here are my validated findings" — faster and with better coverage.
|
|
4
|
+
|
|
5
|
+
Hex does not replace your expertise. It automates the mechanical parts of auditing (parsing, stat collection, diagramming, PoC scaffolding, finding write-ups, LaTeX report generation) so you can spend your time on what actually matters: reading code and thinking about what can break.
|
|
6
|
+
|
|
7
|
+

|
|
8
|
+
|
|
9
|
+
## How It Works
|
|
10
|
+
|
|
11
|
+
You drive Hex through Claude Code. Type `/init-audit` and Claude runs the whole pre-review pipeline. Three components do the work behind the scenes off a shared project directory:
|
|
12
|
+
|
|
13
|
+
**Claude Code skills** are the front door. They handle anything that requires reasoning — generating the protocol overview and diagrams, checking spec conformance, writing PoCs, drafting findings, ingesting external AI reports, syncing with GitHub, producing the final LaTeX report. You invoke them as native slash commands (e.g., `/init-audit`, `/write-finding`, `/validate-issue`). Skills are markdown files that ship with the `hex` package and get copied into your project's `.claude/skills/` directory. They're editable per-project if you need to customise them.
|
|
14
|
+
|
|
15
|
+
**The `hex` CLI** is the deterministic engine the skills call into. It wraps battle-tested tools like Slither, solc, and Forge rather than reinventing static analysis, and it emits structured JSON with confidence metadata so you always know how much to trust a given data point. You can call it directly when you want to, but you usually won't — `/init-audit` does it for you.
|
|
16
|
+
|
|
17
|
+
**The dashboard** is a local Next.js app that visualises everything the tools and skills produce. It reads directly from your project directory and auto-refreshes when files change. The Issues board writes back to `tracking.json`/`findings.json` when you drag a card between columns or edit it in the modal.
|
|
18
|
+
|
|
19
|
+
All three components read from and write to the same project directory. There is no server, no database, no accounts. Everything stays local.
|
|
20
|
+
|
|
21
|
+
## Prerequisites
|
|
22
|
+
|
|
23
|
+
Before using Hex, make sure you have the following installed:
|
|
24
|
+
|
|
25
|
+
- **Claude Code** — Anthropic's CLI tool for agentic coding
|
|
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`
|
|
31
|
+
|
|
32
|
+
Run `hex doctor` once you've installed Hex (next section) to confirm everything is in place — it prints a labelled preflight table with install hints for anything missing.
|
|
33
|
+
|
|
34
|
+
## Quick Start
|
|
35
|
+
|
|
36
|
+
### 1. Clone the client project and install Hex
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# Clone or receive the client project as usual
|
|
40
|
+
git clone https://github.com/client/protocol.git
|
|
41
|
+
cd protocol
|
|
42
|
+
|
|
43
|
+
# Install Hex globally
|
|
44
|
+
npm install -g hex-audit
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 2. Drop the skills into the project and open Claude Code
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
hex claude # copies the audit skills into .claude/skills/
|
|
51
|
+
claude # open Claude Code in this directory
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
`hex claude` is the only CLI call you need before Claude Code can take over — it copies the skill files so `/init-audit` and friends show up as native slash commands.
|
|
55
|
+
|
|
56
|
+
### 3. Let Claude initialise the audit
|
|
57
|
+
|
|
58
|
+
Inside Claude Code (switch to **Opus** first):
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
/init-audit
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Claude will ask you for scope, commit, chain, and docs URL, then run the entire pre-manual-review pipeline in one skill: dependency-safety audit → `hex analyze` → protocol overview → system diagram → flow charts → spec conformance → materialize conformance deviations onto the issue board as Potential cards.
|
|
65
|
+
|
|
66
|
+
By the time `/init-audit` finishes, every analysis page on the dashboard has data and the `/issues` board shows the conformance-derived items waiting for manual triage.
|
|
67
|
+
|
|
68
|
+
### 4. Dashboard opens automatically
|
|
69
|
+
|
|
70
|
+
`/init-audit` launches `hex dashboard` in the background as its last step, so `http://localhost:3000` opens in your browser when the pre-review pipeline finishes. Leave it open as you work — every page fills in automatically as Claude generates more analysis. If you ever need to start it manually, just run `hex dashboard` in a second terminal (`--port 8080` for a custom port, `--no-open` to skip the auto-open).
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## The Audit Workflow
|
|
75
|
+
|
|
76
|
+
Hex follows a four-phase workflow. You move through the phases sequentially, but you can always go back and re-run earlier steps. Every command in this section is typed inside Claude Code.
|
|
77
|
+
|
|
78
|
+
### Phase 1 — Pre-review (`/init-audit`)
|
|
79
|
+
|
|
80
|
+
One skill does it all:
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
/init-audit
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Inside `/init-audit`:
|
|
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.
|
|
97
|
+
|
|
98
|
+
### Phase 2 — Manual review
|
|
99
|
+
|
|
100
|
+
Read the code in your editor. Drop `@audit-issue` comments above anything suspicious:
|
|
101
|
+
|
|
102
|
+
```solidity
|
|
103
|
+
// @audit-issue Possible reentrancy — external call before state update.
|
|
104
|
+
IERC20(token).transfer(recipient, amount);
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
When you have something concrete, file it as a Potential issue:
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
/write-finding for the rounding error in src/Vault.sol
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
`/write-finding` writes the finding to `findings.json` with the next sequential `F<NNN>` ID. The corresponding tracking entry has `status: "pending_validation"` and `source: "manual"`, so the card lands in the **Potential** column on the dashboard board.
|
|
114
|
+
|
|
115
|
+
Phase 2 is where Hex gets out of your way. You think; the toolkit just gives you a place to record what you find.
|
|
116
|
+
|
|
117
|
+
### Phase 3 — Validate, ingest, sync
|
|
118
|
+
|
|
119
|
+
#### Validate any Potential card (`/validate-issue`)
|
|
120
|
+
|
|
121
|
+
`/validate-issue` is source-agnostic. It validates:
|
|
122
|
+
|
|
123
|
+
- Manual `pending_validation` entries from `/write-finding`.
|
|
124
|
+
- Conformance DEVIATES/PARTIAL entries materialized by `/init-audit`.
|
|
125
|
+
- Auditagent `unverified` entries materialized by `/ingest-aa-report`.
|
|
126
|
+
- GitHub teammate entries materialized by `/sync-issues`.
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
/validate-issue F003
|
|
130
|
+
/validate-issue SC-007
|
|
131
|
+
/validate-issue AA-N002
|
|
132
|
+
/validate-issue for the rounding issue in Vault.sol
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Claude reads the relevant source-of-truth (findings.json | ai-results/auditagent/findings.json | spec-conformance.json | external/github/findings.json), traces the attack path in the code, and writes a validation memo to `.hex/validations/<id>_memo.md`. Then it asks per issue:
|
|
136
|
+
|
|
137
|
+
> The issue appears valid. PoC or memo-only?
|
|
138
|
+
|
|
139
|
+
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.
|
|
140
|
+
|
|
141
|
+
Valid → tracking entry promotes to `verified` (the card moves to Verified). Invalid → tracking entry becomes `rejected` (the card moves to Invalid). Severity adjustment is offered after promotion.
|
|
142
|
+
|
|
143
|
+
#### Ingest a Nethermind AuditAgent scan (`/ingest-aa-report`)
|
|
144
|
+
|
|
145
|
+
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:
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
/ingest-aa-report <scan-id>
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
The skill:
|
|
152
|
+
|
|
153
|
+
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.)
|
|
154
|
+
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.
|
|
155
|
+
3. Materializes each finding as a Potential card (source `auditagent`, status `unverified`).
|
|
156
|
+
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.
|
|
157
|
+
|
|
158
|
+
#### Team mode (`/sync-issues`)
|
|
159
|
+
|
|
160
|
+
When two or three auditors share an engagement, sync findings through a shared GitHub repo. Set `settings.github.repo` in `.hex/config.json` (the firm's internal repo, e.g. `nethermind/audit-vaultx`) and authenticate the `gh` CLI once:
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
gh auth login
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Hex itself never stores GitHub credentials — `/sync-issues` drives the `gh` CLI directly. Then:
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
/sync-issues
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
One invocation does both directions:
|
|
173
|
+
|
|
174
|
+
- **Pull** every issue with the configured labels. Issues with a hidden footer `<!-- hex-finding-id: F<NNN> -->` link back to local findings. Issues without the footer become teammate findings (`source: "github"`, status `pending_validation`).
|
|
175
|
+
- **Inline dedup, GitHub-canonical.** When a pulled GitHub issue matches a local potential entry, **the local entry becomes the duplicate** (`status: "duplicate"`, `duplicate_of: "github-<num>"`). Rationale: a teammate already filed it, so your in-progress local card is redundant. This is the opposite of the auditagent dedup direction, which flips the auditagent entry to duplicate.
|
|
176
|
+
- **Push** every local finding whose tracking status is in `settings.github.publish_status` (default `["verified"]`). Body rendered from the description, code locations, recommendation. Labels applied for severity, source, status. Existing issues are updated by their `github.issue_number`.
|
|
177
|
+
|
|
178
|
+
The dashboard's `/issues` page surfaces GitHub-sync state as a chip on each card (✓ open, ✕ closed).
|
|
179
|
+
|
|
180
|
+
Comments stay on GitHub — Hex never posts, edits, or deletes comments. Auditors discuss inside GitHub itself.
|
|
181
|
+
|
|
182
|
+
### Phase 4 — Deliverable (`/generate-overleaf`)
|
|
183
|
+
|
|
184
|
+
Once findings are validated and the engagement is winding down:
|
|
185
|
+
|
|
186
|
+
```
|
|
187
|
+
/generate-overleaf
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
The skill prompts once for any missing report metadata (initial/final commit, dates, audit type, documentation/test assessment) and persists them to `config.json` under `settings.report.*` so reruns don't re-prompt. Then it emits four `.txt` LaTeX files into `.hex/overleaf/`:
|
|
191
|
+
|
|
192
|
+
1. **`executive_summary.txt`** — `\section{Executive Summary}` with project synopsis, severity histogram, status histogram, summary table.
|
|
193
|
+
2. **`audited_files.txt`** — `\section{Audited Files}` LaTeX table of scope files (LoC, comments, ratio, blank, total).
|
|
194
|
+
3. **`summary_of_findings.txt`** — `\section{Summary of Issues}` table with `\hyperref` rows.
|
|
195
|
+
4. **`findings.txt`** — `\section{Issues}` with one `\subsection{[Sev] title}\label{issue:N}` per verified finding (description, code blocks via `minted`, recommendation, status, client update).
|
|
196
|
+
|
|
197
|
+
Upload these into the Nethermind Overleaf template's matching slots. Only `verified` findings make the report; duplicates, rejected, and pending entries are skipped.
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## Claude Code Skills Reference
|
|
202
|
+
|
|
203
|
+
Each skill has a recommended model — switch your Claude Code model before invoking skills that recommend Opus.
|
|
204
|
+
|
|
205
|
+
| Skill | Phase | Recommended Model | What it does |
|
|
206
|
+
| ------------------- | ----- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
207
|
+
| `init-audit` | 1 | Opus | Dependency-safety → `hex analyze` → overview → diagram → flows → spec conformance → materialize DEVIATES/PARTIAL items as Potential cards |
|
|
208
|
+
| `write-finding` | 2 | Sonnet | Records a manual issue to `findings.json` as a Potential card (`status: pending_validation`, `source: manual`) |
|
|
209
|
+
| `validate-issue` | 3 | Opus | Validates any Potential card (manual / auditagent / conformance / github); per-issue choice of PoC vs memo-only; promotes to Verified or Invalid |
|
|
210
|
+
| `generate-poc` | 3 | Opus | Generates and runs a PoC test (invoked by `/validate-issue`) |
|
|
211
|
+
| `ingest-aa-report` | 3 | Sonnet | Ingests a completed Nethermind AuditAgent scan by ID; materializes findings + inline dedup |
|
|
212
|
+
| `sync-issues` | 3 | Sonnet | Two-way GitHub Issues sync with GitHub-canonical inline dedup |
|
|
213
|
+
| `generate-overleaf` | 4 | Sonnet | Writes the four LaTeX section files for the final report |
|
|
214
|
+
|
|
215
|
+
### Where Skills Live
|
|
216
|
+
|
|
217
|
+
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`.
|
|
218
|
+
|
|
219
|
+
```
|
|
220
|
+
.claude/skills/
|
|
221
|
+
├── init-audit/SKILL.md
|
|
222
|
+
├── write-finding/SKILL.md
|
|
223
|
+
├── validate-issue/SKILL.md
|
|
224
|
+
├── generate-poc/SKILL.md
|
|
225
|
+
├── ingest-aa-report/SKILL.md
|
|
226
|
+
├── sync-issues/SKILL.md
|
|
227
|
+
└── generate-overleaf/SKILL.md
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
**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.
|
|
231
|
+
|
|
232
|
+
**Customising skills:** Edit any `SKILL.md` file in place.
|
|
233
|
+
|
|
234
|
+
**Upgrading Hex:**
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
hex update # install latest hex-audit + prompt to re-sync skills (one command)
|
|
238
|
+
hex update --check # check for an available update without installing
|
|
239
|
+
hex update-skills # re-sync skills only (use if you've already npm-installed manually)
|
|
240
|
+
hex update-skills --keep-custom # skip existing skill files to preserve per-project modifications
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
`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.
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## Dashboard Pages
|
|
248
|
+
|
|
249
|
+
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.
|
|
250
|
+
|
|
251
|
+
| Page | URL | What you see |
|
|
252
|
+
| ---------------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
253
|
+
| Home | `/` | Project info, AI overview, key stats |
|
|
254
|
+
| Progress | `/progress` | Weighted progress bar (70% nSLOC reviewed, 20% audit steps, 10% findings triage), contract review checklist |
|
|
255
|
+
| Statistics | `/stats` | Per-contract metrics, test coverage, dependencies, ERCs |
|
|
256
|
+
| System Diagram | `/diagram` | Mermaid architecture diagram with zoom/pan |
|
|
257
|
+
| Flows | `/flows` | Mermaid flow charts with zoom/pan |
|
|
258
|
+
| Access Control | `/access` | Role → function matrix with "Show unprotected only" and "Show inferred / unknown modifiers" toggles |
|
|
259
|
+
| State Variables | `/state` | Variable inventory with reader/writer tracking and storage-collision warnings |
|
|
260
|
+
| External Calls | `/calls` | Call surface with filterable Trust column |
|
|
261
|
+
| Functions | `/functions` | Aggregated function view |
|
|
262
|
+
| Spec Conformance | `/conformance` | Code vs spec check results, deviations first, clickable spec links |
|
|
263
|
+
| **Issues** | `/issues` | **The board.** Four columns (Potential / Verified / Invalid / Duplicate). Drag cards to change column, click to edit (severity, description, recommendation, resolution, client update). |
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## Understanding Confidence Levels
|
|
268
|
+
|
|
269
|
+
Every analysis output includes confidence metadata so you know how much to trust it.
|
|
270
|
+
|
|
271
|
+
**High confidence** — Derived from compiler artifacts or established static analysis tools (solc AST, Slither detectors, compiler storage layout). Treat as ground truth.
|
|
272
|
+
|
|
273
|
+
**Medium confidence** — Derived from AST pattern matching or known library detection (e.g., recognising OpenZeppelin Ownable). Reliable for standard patterns, but may miss custom implementations.
|
|
274
|
+
|
|
275
|
+
**Low confidence** — Derived from naming heuristics (e.g., inferring a "keeper" role from a modifier named `onlyKeeper`). Use as a starting point, then verify manually.
|
|
276
|
+
|
|
277
|
+
Access-control roles also carry a `kind` field (`access_control`, `state_check`, `guard`, or `unknown`) and an `is_likely_access_control` flag. `/access` hides roles classified as `unknown` by default and exposes a "Show inferred / unknown modifiers" toggle.
|
|
278
|
+
|
|
279
|
+
Storage-slot collisions and inheritance-layout divergences detected from the compiler's storage layout are flagged with `Critical` severity in `state-vars.json` and roll into `attack-surface.json`.
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## Output Directory Structure
|
|
284
|
+
|
|
285
|
+
All Hex outputs live in a single directory inside the project (default: `.hex/`, configurable in `config.json`).
|
|
286
|
+
|
|
287
|
+
```
|
|
288
|
+
.hex/
|
|
289
|
+
├── config.json # Audit scope, settings (incl. settings.ai.auditagent_scan_id, settings.report.*)
|
|
290
|
+
├── overview.md # AI-generated protocol overview
|
|
291
|
+
├── stats.json # Codebase statistics and test coverage
|
|
292
|
+
├── deps.json # Contract dependency graph
|
|
293
|
+
├── access-control.json # Role → function mapping (with `kind`, `is_likely_access_control`)
|
|
294
|
+
├── state-vars.json # State variable inventory + storage_collisions
|
|
295
|
+
├── external-calls.json # External call surface
|
|
296
|
+
├── patterns.json # Security pattern flags (ORACLE, TEMPORAL, etc.)
|
|
297
|
+
├── constraints.json # Setter validation and event analysis
|
|
298
|
+
├── attack-surface.json # Attack surface summary
|
|
299
|
+
├── spec-conformance.json # Spec vs code conformance checks (with spec_location.url for ERCs)
|
|
300
|
+
├── spec-conformance.md # Rendered conformance report
|
|
301
|
+
├── diagrams/ # All Mermaid diagram files
|
|
302
|
+
│ ├── diagram.mmd # System architecture diagram (possibly split)
|
|
303
|
+
│ └── flow-*.mmd # Flow charts (one per flow)
|
|
304
|
+
├── progress.json # Audit progress tracking (contract review state)
|
|
305
|
+
├── findings.json # Canonical finding data (incl. resolution, update_from_client)
|
|
306
|
+
├── tracking.json # Board state (status, source, duplicate_of)
|
|
307
|
+
├── comparison.json # Dedup match_signals (written by /ingest-aa-report and /sync-issues)
|
|
308
|
+
├── validations/ # Issue validation memos
|
|
309
|
+
│ ├── F001_memo.md
|
|
310
|
+
│ └── SC-003_memo.md
|
|
311
|
+
├── ai-results/auditagent/ # AuditAgent ingest output
|
|
312
|
+
│ ├── raw-output.md
|
|
313
|
+
│ ├── findings.json
|
|
314
|
+
│ └── metadata.json
|
|
315
|
+
├── ai-status.json # AuditAgent run status (used by `hex ai-status`)
|
|
316
|
+
├── external/github/ # Pulled teammate findings + sync metadata
|
|
317
|
+
│ ├── findings.json
|
|
318
|
+
│ ├── sync-status.json
|
|
319
|
+
│ └── raw-issues.json
|
|
320
|
+
└── overleaf/ # Final LaTeX section files (produced by /generate-overleaf)
|
|
321
|
+
├── executive_summary.txt
|
|
322
|
+
├── audited_files.txt
|
|
323
|
+
├── summary_of_findings.txt
|
|
324
|
+
└── findings.txt
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
You can change the output directory by setting `settings.output_dir` in `config.json` before running init.
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## Scope vs. Full Project Access
|
|
332
|
+
|
|
333
|
+
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.
|
|
334
|
+
|
|
335
|
+
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.
|
|
336
|
+
|
|
337
|
+
```
|
|
338
|
+
# In-scope: these are what you're auditing
|
|
339
|
+
src/core/Vault.sol, src/core/Strategy.sol, src/libraries/Math.sol
|
|
340
|
+
|
|
341
|
+
# Still accessible: tests, mocks, deploy scripts, dependencies, interfaces
|
|
342
|
+
# Claude Code can read them all, forge can compile and run tests against them
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
## CLI Reference
|
|
348
|
+
|
|
349
|
+
You usually don't call these directly — `/init-audit` and the other skills do. But they're the deterministic engine underneath, and they're useful when you want to re-run a single analysis, script something, or troubleshoot.
|
|
350
|
+
|
|
351
|
+
All commands run from within the project directory (or with `--project /path/to/project`).
|
|
352
|
+
|
|
353
|
+
| Command | What it does |
|
|
354
|
+
| --------------------------------- | -------------------------------------------------------------------------------------------------------------- |
|
|
355
|
+
| `hex doctor` | Preflight check: node, forge, slither, solc, Claude Code, output-dir writability, project config |
|
|
356
|
+
| `hex claude` | Copy skills to `.claude/skills/` for Claude Code discovery |
|
|
357
|
+
| `hex init` | Initialise audit config — scope, commit, chain, docs URL (called by `/init-audit`) |
|
|
358
|
+
| `hex analyze` | Run all analysis commands in parallel (stats, deps, access, state, calls, patterns, constraints), then surface |
|
|
359
|
+
| `hex stats` | Generate codebase statistics and test coverage |
|
|
360
|
+
| `hex deps` | Build contract dependency graph |
|
|
361
|
+
| `hex access` | Extract access control mapping (roles → functions, including inherited) |
|
|
362
|
+
| `hex state` | Generate state variable inventory + storage-collision detection |
|
|
363
|
+
| `hex calls` | Map external call surface (AST-based, Slither optional) |
|
|
364
|
+
| `hex patterns` | Detect security-relevant patterns (ORACLE, FLASH_LOAN, TEMPORAL, etc.) |
|
|
365
|
+
| `hex constraints` | Extract setter validation status (AST-aware, follows helpers and modifiers) |
|
|
366
|
+
| `hex surface` | Build attack surface summary cross-referencing all analysis |
|
|
367
|
+
| `hex context` | Assemble optimised AI context from codebase |
|
|
368
|
+
| `hex context --target Vault` | Context for a specific contract and its dependencies |
|
|
369
|
+
| `hex context --estimate` | Show token count without generating context |
|
|
370
|
+
| `hex dashboard` | Start local dashboard and open in browser |
|
|
371
|
+
| `hex dashboard --port 8080` | Start dashboard on a custom port |
|
|
372
|
+
| `hex update` | Update hex-audit to the latest version on npm, then prompt to re-sync skills into the current project |
|
|
373
|
+
| `hex update --check` | Check for an available update without installing |
|
|
374
|
+
| `hex update --yes` | Update and re-sync skills without the post-install prompt |
|
|
375
|
+
| `hex update-skills` | Re-copy skill files from package, removing orphans (overwrites by default) |
|
|
376
|
+
| `hex update-skills --keep-custom` | Skip existing skill files instead of overwriting |
|
|
377
|
+
| `hex ai-status` | Show the latest status for AuditAgent scans |
|
|
378
|
+
| `hex ai-status --watch` | Poll every 5 minutes until pending scans resolve (typical scan: 30-60 min) |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0IZAlhEwk5-v4myUvWKBd
|