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
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `hex mcp`: a stdio MCP server that gives a Claude Code session typed access
|
|
3
|
+
* to the Hex project — what the auditor is looking at in the dashboard, exact
|
|
4
|
+
* compiler facts, the protocol model, the board, the review map, notes and
|
|
5
|
+
* triage rules. Tools only (no channels). Every tool wraps the same core
|
|
6
|
+
* modules the CLI uses, so behaviour is identical either way.
|
|
7
|
+
*/
|
|
8
|
+
import fs from 'node:fs';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
12
|
+
import { findOutputDir } from '../core/locate.js';
|
|
13
|
+
import { COLUMN_TO_STATUS, createIssue, ISSUE_SOURCES, moveIssue, patchIssue, recordValidation, } from '../core/issues.js';
|
|
14
|
+
import { dedupCandidates, markDuplicate } from '../core/dedup.js';
|
|
15
|
+
import { markFunctions, REVIEW_STATES, reviewSummary } from '../core/review.js';
|
|
16
|
+
import { addLeadIdempotent, readContractNote, resolveNoteTarget } from '../core/notes.js';
|
|
17
|
+
import { commentsForFile, readComments } from '../core/comments.js';
|
|
18
|
+
import { addRule, readRules } from '../core/rules.js';
|
|
19
|
+
import { readInvariants, readProtocolModel, setInvariantStatus, setInvariantTest, } from '../core/model.js';
|
|
20
|
+
import { FACT_QUERIES, loadFacts, resolveFunctions, runFactQuery, } from '../facts/query.js';
|
|
21
|
+
const INSTRUCTIONS = `Hex is the auditor's Solidity audit workspace for this repository (data in .hex/).
|
|
22
|
+
- When the user says "this", "here", "the selected …", "what I'm looking at" or similar, call hex_focus first: it returns what they have selected in the Hex dashboard (a function, card, diagram node, code range, invariant or code comment).
|
|
23
|
+
- For exact code relationships (who calls X, who writes Y, storage layout, linearization, which entry points reach X) use hex_facts_query instead of grepping: it comes from the compiler AST.
|
|
24
|
+
- The auditor's comments on lines of code (written in the dashboard's code viewer) come from hex_code_comments.
|
|
25
|
+
- Board changes (new card, move, patch, duplicate, validation) and review marks go through these tools; never edit .hex JSON by hand.`;
|
|
26
|
+
function ok(data) {
|
|
27
|
+
return {
|
|
28
|
+
content: [
|
|
29
|
+
{
|
|
30
|
+
type: 'text',
|
|
31
|
+
text: typeof data === 'string' ? data : JSON.stringify(data, null, 2),
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function err(message) {
|
|
37
|
+
return { content: [{ type: 'text', text: message }], isError: true };
|
|
38
|
+
}
|
|
39
|
+
function readJson(file) {
|
|
40
|
+
try {
|
|
41
|
+
return JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function createHexServer(cwd = process.cwd()) {
|
|
48
|
+
const server = new McpServer({ name: 'hex', version: '0.8.0' }, { instructions: INSTRUCTIONS });
|
|
49
|
+
const outDir = () => {
|
|
50
|
+
const d = findOutputDir(cwd);
|
|
51
|
+
if (!d)
|
|
52
|
+
throw new Error('No Hex project here (no .hex/config.json). Run `hex init` first.');
|
|
53
|
+
return d;
|
|
54
|
+
};
|
|
55
|
+
const guard = (fn) => async (args) => {
|
|
56
|
+
try {
|
|
57
|
+
return ok(fn(args));
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
return err(e instanceof Error ? e.message : String(e));
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
// ── Focus ─────────────────────────────────────────────────────────
|
|
64
|
+
server.registerTool('hex_focus', {
|
|
65
|
+
title: 'What the auditor is looking at',
|
|
66
|
+
description: 'Returns the current selection in the Hex dashboard (function, card, diagram node, code range or invariant), enriched with facts, review state and related cards. Call this whenever the user refers to "this" or "the selected" thing.',
|
|
67
|
+
inputSchema: {},
|
|
68
|
+
}, guard(() => {
|
|
69
|
+
const dir = outDir();
|
|
70
|
+
const focus = readJson(path.join(dir, 'focus.json'));
|
|
71
|
+
if (!focus)
|
|
72
|
+
return { focus: null, hint: 'Nothing selected in the dashboard yet.' };
|
|
73
|
+
const ageSec = focus.updated_at
|
|
74
|
+
? Math.round((Date.now() - Date.parse(focus.updated_at)) / 1000)
|
|
75
|
+
: null;
|
|
76
|
+
const out = { focus, age_seconds: ageSec };
|
|
77
|
+
const facts = loadFacts(dir);
|
|
78
|
+
if (facts && (focus.kind === 'function' || focus.kind === 'diagram_node')) {
|
|
79
|
+
const fns = resolveFunctions(facts, focus.ref);
|
|
80
|
+
if (fns.length) {
|
|
81
|
+
const review = reviewSummary(dir);
|
|
82
|
+
out.functions = fns.map((f) => ({
|
|
83
|
+
...f,
|
|
84
|
+
review: review.rows.find((r) => r.id === f.id) ?? null,
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (focus.kind === 'card') {
|
|
89
|
+
const findings = readJson(path.join(dir, 'findings.json'))
|
|
90
|
+
?.findings ?? [];
|
|
91
|
+
const tracking = readJson(path.join(dir, 'tracking.json'))
|
|
92
|
+
?.findings ?? [];
|
|
93
|
+
out.card = {
|
|
94
|
+
finding: findings.find((f) => f.id === focus.ref) ?? null,
|
|
95
|
+
tracking: tracking.find((t) => t.id === focus.ref) ?? null,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
return out;
|
|
99
|
+
}));
|
|
100
|
+
// ── Facts ─────────────────────────────────────────────────────────
|
|
101
|
+
server.registerTool('hex_facts_query', {
|
|
102
|
+
title: 'Exact compiler facts',
|
|
103
|
+
description: 'Query the compiler AST facts: callers / callees (optionally transitive), readers / writers of a state variable, storage layout, linearization, entry points, which entry points reach a function, or a function record.',
|
|
104
|
+
inputSchema: {
|
|
105
|
+
query: z.enum(FACT_QUERIES),
|
|
106
|
+
ref: z
|
|
107
|
+
.string()
|
|
108
|
+
.optional()
|
|
109
|
+
.describe('Function (Vault.withdraw or Vault.withdraw(uint256) or withdraw), state var (Vault.totalAssets or totalAssets), or contract'),
|
|
110
|
+
transitive: z.boolean().optional(),
|
|
111
|
+
},
|
|
112
|
+
}, guard(({ query, ref, transitive }) => {
|
|
113
|
+
const facts = loadFacts(outDir());
|
|
114
|
+
if (!facts)
|
|
115
|
+
throw new Error('No .hex/facts.json yet. Run `hex facts`.');
|
|
116
|
+
return {
|
|
117
|
+
source: facts.source,
|
|
118
|
+
result: runFactQuery(facts, query, ref, { transitive }),
|
|
119
|
+
};
|
|
120
|
+
}));
|
|
121
|
+
// ── Model + invariants ────────────────────────────────────────────
|
|
122
|
+
server.registerTool('hex_model_get', {
|
|
123
|
+
title: 'Protocol model',
|
|
124
|
+
description: 'The verified protocol model: actors, assets, privileges, trust assumptions, dependencies, state machines, accounting, risky flows.',
|
|
125
|
+
inputSchema: { section: z.string().optional() },
|
|
126
|
+
}, guard(({ section }) => {
|
|
127
|
+
const model = readProtocolModel(outDir());
|
|
128
|
+
if (!model)
|
|
129
|
+
throw new Error('No protocol model yet (/init-audit writes .hex/model/protocol.json).');
|
|
130
|
+
return (section ? model[section] : model);
|
|
131
|
+
}));
|
|
132
|
+
server.registerTool('hex_invariant_list', {
|
|
133
|
+
title: 'Invariants',
|
|
134
|
+
description: 'List invariants with status and test results.',
|
|
135
|
+
inputSchema: { status: z.enum(['proposed', 'accepted', 'rejected']).optional() },
|
|
136
|
+
}, guard(({ status }) => readInvariants(outDir()).invariants.filter((i) => !status || i.status === status)));
|
|
137
|
+
server.registerTool('hex_invariant_set', {
|
|
138
|
+
title: 'Update an invariant',
|
|
139
|
+
description: 'Accept or reject an invariant, or record its test/fuzz result.',
|
|
140
|
+
inputSchema: {
|
|
141
|
+
id: z.string(),
|
|
142
|
+
status: z.enum(['proposed', 'accepted', 'rejected']).optional(),
|
|
143
|
+
reason: z.string().optional(),
|
|
144
|
+
test_tool: z.enum(['fizz', 'foundry']).optional(),
|
|
145
|
+
test_status: z.enum(['not_written', 'passing', 'failing', 'broken']).optional(),
|
|
146
|
+
test_file: z.string().optional(),
|
|
147
|
+
repro_file: z.string().optional(),
|
|
148
|
+
},
|
|
149
|
+
}, guard((a) => {
|
|
150
|
+
const dir = outDir();
|
|
151
|
+
if (a.status)
|
|
152
|
+
setInvariantStatus(dir, a.id, a.status, a.reason);
|
|
153
|
+
if (a.test_tool || a.test_status || a.test_file || a.repro_file) {
|
|
154
|
+
setInvariantTest(dir, a.id, {
|
|
155
|
+
...(a.test_tool ? { tool: a.test_tool } : {}),
|
|
156
|
+
...(a.test_status ? { status: a.test_status } : {}),
|
|
157
|
+
...(a.test_file ? { file: a.test_file } : {}),
|
|
158
|
+
...(a.repro_file ? { repro_file: a.repro_file } : {}),
|
|
159
|
+
last_run_at: new Date().toISOString(),
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
return readInvariants(dir).invariants.find((i) => i.id === a.id);
|
|
163
|
+
}));
|
|
164
|
+
// ── Board ─────────────────────────────────────────────────────────
|
|
165
|
+
server.registerTool('hex_board_list', {
|
|
166
|
+
title: 'Board',
|
|
167
|
+
description: 'Compact list of cards: id, title, severity, status, source, validation verdict.',
|
|
168
|
+
inputSchema: { status: z.string().optional(), source: z.string().optional() },
|
|
169
|
+
}, guard(({ status, source }) => {
|
|
170
|
+
const tracking = readJson(path.join(outDir(), 'tracking.json'))
|
|
171
|
+
?.findings ?? [];
|
|
172
|
+
return tracking
|
|
173
|
+
.filter((t) => (!status || t.status === status) && (!source || t.source === source))
|
|
174
|
+
.map((t) => ({
|
|
175
|
+
id: t.id,
|
|
176
|
+
title: t.title,
|
|
177
|
+
severity: t.severity,
|
|
178
|
+
status: t.status,
|
|
179
|
+
source: t.source,
|
|
180
|
+
...(t.validation ? { verdict: t.validation.verdict } : {}),
|
|
181
|
+
...(t.duplicate_of ? { duplicate_of: t.duplicate_of } : {}),
|
|
182
|
+
}));
|
|
183
|
+
}));
|
|
184
|
+
server.registerTool('hex_issue_show', {
|
|
185
|
+
title: 'Card',
|
|
186
|
+
description: 'Full finding + tracking record of a card.',
|
|
187
|
+
inputSchema: { id: z.string() },
|
|
188
|
+
}, guard(({ id }) => {
|
|
189
|
+
const dir = outDir();
|
|
190
|
+
const f = readJson(path.join(dir, 'findings.json'))?.findings.find((x) => x.id === id) ?? null;
|
|
191
|
+
const t = readJson(path.join(dir, 'tracking.json'))?.findings.find((x) => x.id === id) ?? null;
|
|
192
|
+
if (!f && !t)
|
|
193
|
+
throw new Error(`No card ${id}`);
|
|
194
|
+
return { id, finding: f, tracking: t };
|
|
195
|
+
}));
|
|
196
|
+
server.registerTool('hex_issue_new', {
|
|
197
|
+
title: 'New card',
|
|
198
|
+
description: 'Create a Potential card with a uniform H-NNN id. Then fill description/recommendation with hex_issue_patch.',
|
|
199
|
+
inputSchema: {
|
|
200
|
+
source: z.enum(ISSUE_SOURCES),
|
|
201
|
+
title: z.string(),
|
|
202
|
+
severity: z.enum(['Critical', 'High', 'Medium', 'Low', 'Info']).optional(),
|
|
203
|
+
source_ref: z.string().optional(),
|
|
204
|
+
files: z.array(z.string()).optional(),
|
|
205
|
+
},
|
|
206
|
+
}, guard((a) => ({
|
|
207
|
+
id: createIssue(outDir(), {
|
|
208
|
+
source: a.source,
|
|
209
|
+
title: a.title,
|
|
210
|
+
severity: a.severity,
|
|
211
|
+
source_ref: a.source_ref ?? null,
|
|
212
|
+
files: a.files,
|
|
213
|
+
}),
|
|
214
|
+
})));
|
|
215
|
+
server.registerTool('hex_issue_move', {
|
|
216
|
+
title: 'Move card',
|
|
217
|
+
description: 'Move a card between columns (potential | verified | rejected | duplicate). Synced cards are read-only.',
|
|
218
|
+
inputSchema: {
|
|
219
|
+
id: z.string(),
|
|
220
|
+
to: z.enum(Object.keys(COLUMN_TO_STATUS)),
|
|
221
|
+
duplicate_of: z.string().optional(),
|
|
222
|
+
},
|
|
223
|
+
}, guard(({ id, to, duplicate_of }) => moveIssue(outDir(), id, to, duplicate_of)));
|
|
224
|
+
server.registerTool('hex_issue_patch', {
|
|
225
|
+
title: 'Edit card',
|
|
226
|
+
description: 'Edit card fields (title, severity, description, recommendation, resolution, update_from_client, notes, files).',
|
|
227
|
+
inputSchema: {
|
|
228
|
+
id: z.string(),
|
|
229
|
+
title: z.string().optional(),
|
|
230
|
+
severity: z.enum(['Critical', 'High', 'Medium', 'Low', 'Info']).optional(),
|
|
231
|
+
description: z.string().optional(),
|
|
232
|
+
recommendation: z.string().optional(),
|
|
233
|
+
resolution: z.string().optional(),
|
|
234
|
+
update_from_client: z.string().optional(),
|
|
235
|
+
notes: z.string().optional(),
|
|
236
|
+
files: z.array(z.string()).optional(),
|
|
237
|
+
},
|
|
238
|
+
}, guard(({ id, ...fields }) => {
|
|
239
|
+
const updates = Object.fromEntries(Object.entries(fields).filter(([, v]) => v !== undefined));
|
|
240
|
+
return patchIssue(outDir(), id, updates);
|
|
241
|
+
}));
|
|
242
|
+
server.registerTool('hex_issue_validation', {
|
|
243
|
+
title: 'Record validation',
|
|
244
|
+
description: 'Record a verdict, memo and PoC result. With auto_move (agents only) a conclusive verdict moves the card: reproduced + passing PoC + reality gate → Verified; refuted by 2 independent refuters → Rejected.',
|
|
245
|
+
inputSchema: {
|
|
246
|
+
id: z.string(),
|
|
247
|
+
verdict: z.enum(['reproduced', 'refuted', 'uncertain', 'valid_no_poc']),
|
|
248
|
+
by: z.enum(['auditor', 'agent']),
|
|
249
|
+
memo: z.string().optional(),
|
|
250
|
+
poc_file: z.string().optional(),
|
|
251
|
+
poc_status: z.enum(['passing', 'failing', 'not_started']).optional(),
|
|
252
|
+
refuters: z.number().int().optional(),
|
|
253
|
+
reality_gate: z.boolean().optional(),
|
|
254
|
+
auto_move: z.boolean().optional(),
|
|
255
|
+
},
|
|
256
|
+
}, guard((a) => {
|
|
257
|
+
const r = recordValidation(outDir(), a.id, {
|
|
258
|
+
verdict: a.verdict,
|
|
259
|
+
validated_by: a.by,
|
|
260
|
+
memo: a.memo,
|
|
261
|
+
poc_file: a.poc_file,
|
|
262
|
+
poc_status: a.poc_status,
|
|
263
|
+
refuters: a.refuters,
|
|
264
|
+
reality_gate: a.reality_gate,
|
|
265
|
+
}, { autoMove: a.auto_move });
|
|
266
|
+
return { id: a.id, moved_to: r.movedTo };
|
|
267
|
+
}));
|
|
268
|
+
server.registerTool('hex_issue_dedup', {
|
|
269
|
+
title: 'Duplicate candidates',
|
|
270
|
+
description: 'Cards that may duplicate this one (exact-function overlap first), plus the match rules and triage rules.',
|
|
271
|
+
inputSchema: { id: z.string() },
|
|
272
|
+
}, guard(({ id }) => {
|
|
273
|
+
const dir = outDir();
|
|
274
|
+
return { ...dedupCandidates(dir, id), triage_rules: readRules(dir) };
|
|
275
|
+
}));
|
|
276
|
+
server.registerTool('hex_issue_mark_duplicate', {
|
|
277
|
+
title: 'Mark duplicate',
|
|
278
|
+
description: 'Move a card to Duplicate of a canonical card and record the match signals.',
|
|
279
|
+
inputSchema: {
|
|
280
|
+
id: z.string(),
|
|
281
|
+
of: z.string(),
|
|
282
|
+
same_contract: z.boolean(),
|
|
283
|
+
same_function: z.boolean(),
|
|
284
|
+
root_cause: z.enum(['same', 'overlapping', 'different']),
|
|
285
|
+
attack_vector: z.enum(['same', 'overlapping', 'different']),
|
|
286
|
+
reasoning: z.string(),
|
|
287
|
+
confidence: z.enum(['high', 'medium', 'low']).default('high'),
|
|
288
|
+
},
|
|
289
|
+
}, guard((a) => {
|
|
290
|
+
markDuplicate(outDir(), a.id, a.of, {
|
|
291
|
+
signals: {
|
|
292
|
+
contract: a.same_contract,
|
|
293
|
+
function: a.same_function,
|
|
294
|
+
root_cause: a.root_cause,
|
|
295
|
+
attack_vector: a.attack_vector,
|
|
296
|
+
},
|
|
297
|
+
reasoning: a.reasoning,
|
|
298
|
+
confidence: a.confidence,
|
|
299
|
+
});
|
|
300
|
+
return { id: a.id, duplicate_of: a.of };
|
|
301
|
+
}));
|
|
302
|
+
// ── Review map ────────────────────────────────────────────────────
|
|
303
|
+
server.registerTool('hex_review_mark', {
|
|
304
|
+
title: 'Mark review state',
|
|
305
|
+
description: 'Set functions (or every function of a contract) to unread / read / questioned / cleared.',
|
|
306
|
+
inputSchema: {
|
|
307
|
+
refs: z.array(z.string()),
|
|
308
|
+
state: z.enum(REVIEW_STATES),
|
|
309
|
+
note: z.string().optional(),
|
|
310
|
+
by: z.enum(['auditor', 'diane', 'dashboard', 'agent']).default('auditor'),
|
|
311
|
+
},
|
|
312
|
+
}, guard(({ refs, state, note, by, }) => {
|
|
313
|
+
const dir = outDir();
|
|
314
|
+
const facts = loadFacts(dir);
|
|
315
|
+
if (!facts)
|
|
316
|
+
throw new Error('No .hex/facts.json yet. Run `hex facts`.');
|
|
317
|
+
const ids = new Set();
|
|
318
|
+
const missing = [];
|
|
319
|
+
for (const ref of refs) {
|
|
320
|
+
const byContract = facts.functions.filter((f) => f.contract === ref && f.in_scope);
|
|
321
|
+
const hits = byContract.length
|
|
322
|
+
? byContract
|
|
323
|
+
: resolveFunctions(facts, ref).filter((f) => f.in_scope);
|
|
324
|
+
if (!hits.length)
|
|
325
|
+
missing.push(ref);
|
|
326
|
+
for (const f of hits)
|
|
327
|
+
ids.add(f.id);
|
|
328
|
+
}
|
|
329
|
+
if (missing.length)
|
|
330
|
+
throw new Error(`Unknown function(s): ${missing.join(', ')}`);
|
|
331
|
+
markFunctions(dir, [...ids], state, by, note);
|
|
332
|
+
return { marked: [...ids], state };
|
|
333
|
+
}));
|
|
334
|
+
server.registerTool('hex_review_status', {
|
|
335
|
+
title: 'Review progress',
|
|
336
|
+
description: 'Cleared nSLOC, per-state counts and the top blind spots.',
|
|
337
|
+
inputSchema: { blind_spots: z.number().int().optional() },
|
|
338
|
+
}, guard(({ blind_spots }) => {
|
|
339
|
+
const s = reviewSummary(outDir(), { blindSpots: blind_spots ?? 10 });
|
|
340
|
+
return {
|
|
341
|
+
pct: s.pct,
|
|
342
|
+
cleared_nsloc: s.cleared_nsloc,
|
|
343
|
+
total_nsloc: s.total_nsloc,
|
|
344
|
+
counts: s.counts,
|
|
345
|
+
blind_spots: s.blind_spots,
|
|
346
|
+
};
|
|
347
|
+
}));
|
|
348
|
+
// ── Notes + rules ─────────────────────────────────────────────────
|
|
349
|
+
server.registerTool('hex_note_show', {
|
|
350
|
+
title: 'Contract note',
|
|
351
|
+
description: "A contract's structured note: description, questions, leads.",
|
|
352
|
+
inputSchema: { contract: z.string() },
|
|
353
|
+
}, guard(({ contract }) => {
|
|
354
|
+
const dir = outDir();
|
|
355
|
+
return readContractNote(dir, resolveNoteTarget(dir, contract));
|
|
356
|
+
}));
|
|
357
|
+
server.registerTool('hex_code_comments', {
|
|
358
|
+
title: 'Code comments',
|
|
359
|
+
description: "The auditor's comments pinned to lines of source in the dashboard's code viewer, at the lines their code sits on now (stale = the code changed). Omit file for all files.",
|
|
360
|
+
inputSchema: { file: z.string().optional() },
|
|
361
|
+
}, guard(({ file }) => {
|
|
362
|
+
const dir = outDir();
|
|
363
|
+
const files = file ? [file] : [...new Set(readComments(dir).map((c) => c.file))].sort();
|
|
364
|
+
return files.flatMap((f) => commentsForFile(dir, f));
|
|
365
|
+
}));
|
|
366
|
+
server.registerTool('hex_note_lead', {
|
|
367
|
+
title: 'Add lead',
|
|
368
|
+
description: 'Add an open lead to a contract note (idempotent on source + source_ref).',
|
|
369
|
+
inputSchema: {
|
|
370
|
+
contract: z.string(),
|
|
371
|
+
text: z.string(),
|
|
372
|
+
source: z.string().optional(),
|
|
373
|
+
source_ref: z.string().optional(),
|
|
374
|
+
},
|
|
375
|
+
}, guard(({ contract, text, source, source_ref, }) => {
|
|
376
|
+
const dir = outDir();
|
|
377
|
+
const { lead, created } = addLeadIdempotent(dir, resolveNoteTarget(dir, contract), text, {
|
|
378
|
+
source,
|
|
379
|
+
source_ref,
|
|
380
|
+
});
|
|
381
|
+
return { lead, created };
|
|
382
|
+
}));
|
|
383
|
+
server.registerTool('hex_rules_list', {
|
|
384
|
+
title: 'Triage rules',
|
|
385
|
+
description: "The auditor's standing decisions (out of scope, trusted roles, by design, known issues).",
|
|
386
|
+
inputSchema: {},
|
|
387
|
+
}, guard(() => readRules(outDir())));
|
|
388
|
+
server.registerTool('hex_rules_add', {
|
|
389
|
+
title: 'Add triage rule',
|
|
390
|
+
description: 'Record a standing decision so AI runs stop raising it. Ask the auditor before adding one.',
|
|
391
|
+
inputSchema: {
|
|
392
|
+
kind: z.enum(['out_of_scope', 'trusted_role', 'by_design', 'known_issue']),
|
|
393
|
+
text: z.string(),
|
|
394
|
+
scope: z.array(z.string()).optional(),
|
|
395
|
+
created_from: z.string().optional(),
|
|
396
|
+
},
|
|
397
|
+
}, guard((a) => addRule(outDir(), a)));
|
|
398
|
+
return server;
|
|
399
|
+
}
|
|
400
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,7 @@ You are the orchestrator of a parallelized smart contract security audit.
|
|
|
19
19
|
- **Differential audit** — `project.mode` is `diff`: scan only the in-scope files that hold changed or impacted code. Get the list from the CLI, never by reading `diff.json` by eye:
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
npx hex diff --scan-files
|
|
22
|
+
npx --no-install hex diff --scan-files
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
It recomputes `.hex/diff.json` and prints the files, space separated, on one line, in scope order. `{mode}` is `diff`. Turn 2 also writes `{bundle_dir}/diff-focus.md` (Turn 2 step 1b). If the command fails, print its error and stop: a differential scan without the diff is a full scan under a wrong label.
|
|
@@ -70,7 +70,7 @@ The pass count the scan runs is `{passes}` — settled in Turn 1b, 1 or more. Th
|
|
|
70
70
|
|
|
71
71
|
**Turn 1 — Discover.** Print the banner, then make these parallel tool calls in one message:
|
|
72
72
|
|
|
73
|
-
a. The in-scope file list, per Mode Selection. In a Hex project this depends on step d, so it may take a second message: `hex-scope` mode needs no Bash (the list is `project.scope`), `diff` mode runs `npx hex diff --scan-files`, and only the upstream default mode runs the `find`. Everything else in this turn stays parallel.
|
|
73
|
+
a. The in-scope file list, per Mode Selection. In a Hex project this depends on step d, so it may take a second message: `hex-scope` mode needs no Bash (the list is `project.scope`), `diff` mode runs `npx --no-install hex diff --scan-files`, and only the upstream default mode runs the `find`. Everything else in this turn stays parallel.
|
|
74
74
|
b. Resolve `{resolved_path}` — the `references/` directory next to this `SKILL.md`. Claude Code prints the skill's base directory when it loads the skill (`Base directory for this skill: …`); `{resolved_path}` is that directory plus `/references`. Only when no base directory was printed, Glob for exactly `.claude/skills/ai-audit/references/hacking-agents/shared-rules.md` and take the directory two levels up. **Never Glob `**/references/hacking-agents/shared-rules.md`**: it also matches pashov's own `solidity-auditor`, a `node_modules/hex-audit` copy or a `lib/` vendor, and the scan would then run another skill's assembler.
|
|
75
75
|
c. ToolSearch `select:Agent`
|
|
76
76
|
d. Read `.hex/config.json` — it settles Mode Selection (`project.scope`, `project.mode`). Absent → the upstream default mode.
|
|
@@ -100,7 +100,7 @@ printf '%s\t%s\n' files "{file list}" >> .hex/ai-audit/runs/{stamp}/scope.tsv
|
|
|
100
100
|
>
|
|
101
101
|
> `name` and `mode` are the **only two keys a model types**. Everything else is either shell knowledge or read by the assembler for itself: the threshold from the constant, `N` in `seen in k/N runs` from counting run files, the stamp from the directory's own name.
|
|
102
102
|
|
|
103
|
-
> **No upstream version check.** Upstream compares a local `VERSION` file against pashov/skills on every scan. Hex ships this skill inside `hex-audit`, so `npx hex update` is the upgrade path and the check is removed.
|
|
103
|
+
> **No upstream version check.** Upstream compares a local `VERSION` file against pashov/skills on every scan. Hex ships this skill inside `hex-audit`, so `npx --no-install hex update` is the upgrade path and the check is removed.
|
|
104
104
|
|
|
105
105
|
**Turn 1b — Model and pass count.** This turn asks **two questions in one `AskUserQuestion` call**: which model the 12 agents use, and how many passes the scan runs. The runner is interrupted once, before any work starts.
|
|
106
106
|
|
|
@@ -279,10 +279,19 @@ Then build `source.md`, run the memory step, and only then cat the bundles — i
|
|
|
279
279
|
1b. **Differential audit only** (`{mode}` is `diff`) — write the agents' focus brief, once per scan, from the CLI:
|
|
280
280
|
|
|
281
281
|
```bash
|
|
282
|
-
npx hex diff --focus {bundle_dir}/diff-focus.md
|
|
282
|
+
npx --no-install hex diff --focus {bundle_dir}/diff-focus.md
|
|
283
283
|
```
|
|
284
284
|
|
|
285
285
|
It lists the changed entities, the storage-layout changes and the impacted functions with their reason chains, then the in-scope patch, and opens with the rule the agents follow: effort on the change and the flows it reaches; a bug in unchanged code is reported only when the change makes it reachable or worse. Do not write or edit this file by hand.
|
|
286
|
+
|
|
287
|
+
1c. **Hex project only** — the auditor's decisions, once per scan, from the CLI:
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
npx --no-install hex invariant export > {bundle_dir}/invariants.md
|
|
291
|
+
npx --no-install hex rules export > {bundle_dir}/triage-rules.md
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
Both print nothing when there is nothing to say (no accepted invariants, no rules); delete an empty file rather than appending it, because an empty section sends agents hunting.
|
|
286
295
|
2. **Turn 2 step 2 — Name map, prune and known findings** (below). SKIPPED whole when memory is off. Parts a and b run once per scan; part c runs **every pass**, because the ledger it reads grows as the loop learns.
|
|
287
296
|
3. **Every pass.** Agent bundles, in a single Bash command using `cat` (not shell variables or heredocs) = `source.md` + agent-specific files:
|
|
288
297
|
|
|
@@ -302,9 +311,10 @@ Then build `source.md`, run the memory step, and only then cat the bundles — i
|
|
|
302
311
|
| `agent-12-bundle.md` | `source.md` + `senior-auditor-sop.md` + `hacking-agents/flow-gap-agent.md` + `hacking-agents/shared-rules.md` |
|
|
303
312
|
| **every one of the 12** | **+ `report-language.md`, appended after `shared-rules.md`** — unconditional, every mode, every pass. The agent's `description:` is the seed of the report's Description, so the language rule has to reach the writer and not only the editor. |
|
|
304
313
|
| **every one of the 12** | **+ `{bundle_dir}/diff-focus.md`, appended after `report-language.md`** — only in a differential audit (`{mode}` is `diff`). Before the known findings, which stay last. |
|
|
314
|
+
| **every one of the 12** | **+ `{bundle_dir}/invariants.md` and `{bundle_dir}/triage-rules.md`**, after `diff-focus.md` — only when step 1c wrote them. Accepted invariants are properties a finding can break; triage rules are what the auditor already decided not to report. |
|
|
305
315
|
| **every one of the 12** | **+ `{bundle_dir}/known-findings.md`, appended last** — only when memory is on **and** step 2 wrote that file. Never appended on a plain scan, and never appended when the ledger holds no record. |
|
|
306
316
|
|
|
307
|
-
Each bundle = source.md + SOP + specialty + shared-rules + report-language (+ diff focus, in a differential audit) (+ known findings, when there are any). Agents read the bundle; no Read/Grep needed for the initial scan. Targeted Read/Grep allowed for cross-file investigation.
|
|
317
|
+
Each bundle = source.md + SOP + specialty + shared-rules + report-language (+ diff focus, in a differential audit) (+ invariants and triage rules, in a Hex project that has them) (+ known findings, when there are any). Agents read the bundle; no Read/Grep needed for the initial scan. Targeted Read/Grep allowed for cross-file investigation.
|
|
308
318
|
|
|
309
319
|
**Turn 2 step 2 — Name map, prune and known findings.** **SKIP this step entirely when memory is off.** It lives in Turn 2 and not in a turn of its own because all three parts read `source.md`, which Turn 2 has just built — a separate turn would only carry that file across a boundary. It is numbered **2**, ahead of the bundle cat, because part c writes a file every bundle carries; a pruned record must never reach an agent.
|
|
310
320
|
|
|
@@ -463,7 +473,7 @@ Then, after the loop body has run `{passes}` times (or stopped early), go to Tur
|
|
|
463
473
|
|
|
464
474
|
Follow `{resolved_path}/dedup-and-assembly.md`, section **"Turn 5"**, step by step. Its step 1 is SKIPPED when memory is off; its step 4 runs only when `--file-output` was passed.
|
|
465
475
|
|
|
466
|
-
**Turn 6 — Publish to the Hex board.** Runs **once per scan**, after Turn 5, at any pass count — a scan that raised nothing publishes nothing and says so. SKIPPED only when there is no `.hex/config.json` (the upstream default mode, outside a Hex project). Read `{resolved_path}/hex-board.md` now, not earlier, and follow it step by step. It is the only turn that writes outside `.hex/ai-audit/`: board cards through `npx hex issue`, leads through `npx hex note lead`, and the raw records in `.hex/ai-results/ai-audit/`. It never edits the report Turn 5 printed.
|
|
476
|
+
**Turn 6 — Publish to the Hex board.** Runs **once per scan**, after Turn 5, at any pass count — a scan that raised nothing publishes nothing and says so. SKIPPED only when there is no `.hex/config.json` (the upstream default mode, outside a Hex project). Read `{resolved_path}/hex-board.md` now, not earlier, and follow it step by step. It is the only turn that writes outside `.hex/ai-audit/`: board cards through `npx --no-install hex issue`, leads through `npx --no-install hex note lead`, and the raw records in `.hex/ai-results/ai-audit/`. It never edits the report Turn 5 printed.
|
|
467
477
|
|
|
468
478
|
## Banner
|
|
469
479
|
|
|
@@ -27,12 +27,14 @@ By hand:
|
|
|
27
27
|
|
|
28
28
|
- `SKILL.md` — `name: ai-audit` and a Hex description; a "Hex fork" note; Mode Selection gains
|
|
29
29
|
`hex-scope` (files from `.hex/config.json` → `project.scope`) and `diff` (changed + impacted
|
|
30
|
-
files from `npx hex diff --scan-files`), with upstream's `find` kept as the fallback outside a
|
|
30
|
+
files from `npx --no-install hex diff --scan-files`), with upstream's `find` kept as the fallback outside a
|
|
31
31
|
Hex project; Turn 1 resolves `{resolved_path}` from the skill's base directory (never a
|
|
32
32
|
`**/references/...` Glob, which matches other copies of this skill) and drops the `VERSION`
|
|
33
|
-
check against pashov/skills; Turn 2 step 1b writes `diff-focus.md` via `npx hex diff --focus`
|
|
33
|
+
check against pashov/skills; Turn 2 step 1b writes `diff-focus.md` via `npx --no-install hex diff --focus`
|
|
34
34
|
and the bundle table appends it in a differential audit; the prune does not run in `diff`
|
|
35
35
|
mode; **Turn 6** publishes to the Hex board; a one-line Hex banner replaces the ASCII banner.
|
|
36
|
+
- `SKILL.md` Turn 2 step 1c — accepted invariants (`hex invariant export`) and triage rules
|
|
37
|
+
(`hex rules list`) are appended to every bundle when the Hex project has them.
|
|
36
38
|
- `references/agent-prompts.md` — a "differential audit" paragraph in both prompt templates,
|
|
37
39
|
included only when `diff-focus.md` is appended.
|
|
38
40
|
- `references/dedup-and-assembly.md` — Turn 4 step 5a: the `key` is built on every scan (memory
|
|
@@ -41,6 +43,9 @@ By hand:
|
|
|
41
43
|
`{dir}/winners.tsv` before the work dir is deleted. The report it writes is unchanged apart
|
|
42
44
|
from the disclaimer.
|
|
43
45
|
- New: `references/hex-export.sh` (winners → `hex-digest.md`) and `references/hex-board.md`
|
|
44
|
-
(Turn 6: digest → raw records → `hex issue new` cards
|
|
46
|
+
(Turn 6: digest → raw records → `hex issue new` cards; triage-rule exclusions; dedup through
|
|
47
|
+
the shared `hex issue dedup` / `mark-duplicate` engine; leads → `hex note lead`; then
|
|
48
|
+
`/prevalidate` on the new cards).
|
|
49
|
+
- Every Hex command is `npx --no-install hex …` (an unrelated npm package is named `hex`).
|
|
45
50
|
- Removed: upstream `README.md` and `VERSION` (Hex ships the skill inside `hex-audit`; use
|
|
46
|
-
`npx hex update`).
|
|
51
|
+
`npx --no-install hex update`).
|