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.
Files changed (584) hide show
  1. package/CLAUDE.md +137 -77
  2. package/DEMO.md +40 -117
  3. package/README.md +200 -402
  4. package/dashboard/.next/BUILD_ID +1 -1
  5. package/dashboard/.next/app-build-manifest.json +56 -101
  6. package/dashboard/.next/app-path-routes-manifest.json +1 -1
  7. package/dashboard/.next/build-manifest.json +9 -9
  8. package/dashboard/.next/next-server.js.nft.json +1 -1
  9. package/dashboard/.next/prerender-manifest.json +1 -1
  10. package/dashboard/.next/react-loadable-manifest.json +436 -15
  11. package/dashboard/.next/routes-manifest.json +1 -1
  12. package/dashboard/.next/server/app/_not-found/page.js +1 -1
  13. package/dashboard/.next/server/app/_not-found/page.js.nft.json +1 -1
  14. package/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/dashboard/.next/server/app/api/code/route.js +1 -1
  16. package/dashboard/.next/server/app/api/code/route.js.nft.json +1 -1
  17. package/dashboard/.next/server/app/api/comments/route.js +1 -0
  18. package/dashboard/.next/server/app/api/comments/route.js.nft.json +1 -0
  19. package/dashboard/.next/server/app/api/diagrams/[name]/export/route.js +1 -0
  20. package/dashboard/.next/server/app/api/diagrams/[name]/export/route.js.nft.json +1 -0
  21. package/dashboard/.next/server/app/api/diagrams/[name]/resolve/route.js +1 -0
  22. package/dashboard/.next/server/app/api/diagrams/[name]/resolve/route.js.nft.json +1 -0
  23. package/dashboard/.next/server/app/api/diagrams/[name]/route.js +1 -0
  24. package/dashboard/.next/server/app/api/diagrams/[name]/route.js.nft.json +1 -0
  25. package/dashboard/.next/server/app/api/figures/[name]/route.js +1 -0
  26. package/dashboard/.next/server/app/api/figures/[name]/route.js.nft.json +1 -0
  27. package/dashboard/.next/server/app/api/focus/route.js +1 -0
  28. package/dashboard/.next/server/app/api/focus/route.js.nft.json +1 -0
  29. package/dashboard/.next/server/app/api/github-status/route.js +1 -1
  30. package/dashboard/.next/server/app/api/invariants/[id]/route.js +1 -0
  31. package/dashboard/.next/server/app/api/invariants/[id]/route.js.nft.json +1 -0
  32. package/dashboard/.next/server/app/api/issues/[id]/revert-auto/route.js +1 -0
  33. package/dashboard/.next/server/app/api/issues/[id]/revert-auto/route.js.nft.json +1 -0
  34. package/dashboard/.next/server/app/api/nav/route.js +1 -0
  35. package/dashboard/.next/server/app/api/nav/route.js.nft.json +1 -0
  36. package/dashboard/.next/server/app/api/notes/done/route.js +1 -1
  37. package/dashboard/.next/server/app/api/notes/done/route.js.nft.json +1 -1
  38. package/dashboard/.next/server/app/api/notes/lead/route.js +1 -1
  39. package/dashboard/.next/server/app/api/notes/lead/route.js.nft.json +1 -1
  40. package/dashboard/.next/server/app/api/notes/question/route.js +1 -1
  41. package/dashboard/.next/server/app/api/notes/question/route.js.nft.json +1 -1
  42. package/dashboard/.next/server/app/api/notes/record/route.js +3 -3
  43. package/dashboard/.next/server/app/api/notes/route.js +2 -2
  44. package/dashboard/.next/server/app/api/palette/route.js +1 -0
  45. package/dashboard/.next/server/app/api/palette/route.js.nft.json +1 -0
  46. package/dashboard/.next/server/app/api/progress/route.js +1 -1
  47. package/dashboard/.next/server/app/api/progress/route.js.nft.json +1 -1
  48. package/dashboard/.next/server/app/api/watch/route.js +2 -2
  49. package/dashboard/.next/server/app/api/watch/route.js.nft.json +1 -1
  50. package/dashboard/.next/server/app/api/xref/route.js +1 -0
  51. package/dashboard/.next/server/app/changes/page.js +1 -20
  52. package/dashboard/.next/server/app/changes/page.js.nft.json +1 -1
  53. package/dashboard/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  54. package/dashboard/.next/server/app/excalidraw-assets/[...path]/route.js +1 -0
  55. package/dashboard/.next/server/app/issues/page.js +5 -28
  56. package/dashboard/.next/server/app/issues/page.js.nft.json +1 -1
  57. package/dashboard/.next/server/app/issues/page_client-reference-manifest.js +1 -1
  58. package/dashboard/.next/server/app/model/page.js +1 -0
  59. package/dashboard/.next/server/app/{calls → model}/page.js.nft.json +1 -1
  60. package/dashboard/.next/server/app/model/page_client-reference-manifest.js +1 -0
  61. package/dashboard/.next/server/app/page.js +1 -20
  62. package/dashboard/.next/server/app/page.js.nft.json +1 -1
  63. package/dashboard/.next/server/app/page_client-reference-manifest.js +1 -1
  64. package/dashboard/.next/server/app/report/page.js +1 -1
  65. package/dashboard/.next/server/app/report/page.js.nft.json +1 -1
  66. package/dashboard/.next/server/app/report/page_client-reference-manifest.js +1 -1
  67. package/dashboard/.next/server/app/review/page.js +1 -0
  68. package/dashboard/.next/server/app/{access → review}/page.js.nft.json +1 -1
  69. package/dashboard/.next/server/app/review/page_client-reference-manifest.js +1 -0
  70. package/dashboard/.next/server/app-paths-manifest.json +19 -16
  71. package/dashboard/.next/server/chunks/310.js +4 -0
  72. package/dashboard/.next/server/chunks/370.js +1 -0
  73. package/dashboard/.next/server/chunks/42.js +1 -1
  74. package/dashboard/.next/server/chunks/624.js +14 -0
  75. package/dashboard/.next/server/chunks/645.js +1 -1
  76. package/dashboard/.next/server/chunks/649.js +1 -1
  77. package/dashboard/.next/server/chunks/653.js +1 -0
  78. package/dashboard/.next/server/functions-config-manifest.json +1 -1
  79. package/dashboard/.next/server/middleware-build-manifest.js +1 -1
  80. package/dashboard/.next/server/middleware-react-loadable-manifest.js +1 -1
  81. package/dashboard/.next/server/pages/500.html +1 -1
  82. package/dashboard/.next/server/pages/_error.js +1 -1
  83. package/dashboard/.next/server/server-reference-manifest.js +1 -1
  84. package/dashboard/.next/server/server-reference-manifest.json +1 -1
  85. package/dashboard/.next/static/chunks/0bbe10ee.8e7ffa06d2170dfe.js +84 -0
  86. package/dashboard/.next/static/chunks/1026.0ef689a305302427.js +1 -0
  87. package/dashboard/.next/static/chunks/1164.34eb76767ebea46f.js +8 -0
  88. package/dashboard/.next/static/chunks/119.a9a79633900a235f.js +5 -0
  89. package/dashboard/.next/static/chunks/1291.6c486c9b1d4b1b3a.js +1 -0
  90. package/dashboard/.next/static/chunks/139.4691848fc5a46253.js +10 -0
  91. package/dashboard/.next/static/chunks/145.1bf74fecdb4022e3.js +11 -0
  92. package/dashboard/.next/static/chunks/1517.8e7075f78e22b3a0.js +8 -0
  93. package/dashboard/.next/static/chunks/165.6f174060a0ce2db4.js +6 -0
  94. package/dashboard/.next/static/chunks/1741.5c370b7702d2eb40.js +8 -0
  95. package/dashboard/.next/static/chunks/1e36816c.5748c83adc8a6bd6.js +108 -0
  96. package/dashboard/.next/static/chunks/2061.eab75b3c1dfa068a.js +1 -0
  97. package/dashboard/.next/static/chunks/2148.3ce718f62d1b2f7c.js +10 -0
  98. package/dashboard/.next/static/chunks/217-1d5b680ffd10e3f9.js +1 -0
  99. package/dashboard/.next/static/chunks/2208.fb884379aa3ae968.js +1 -0
  100. package/dashboard/.next/static/chunks/2276.112c7855333fca5f.js +6 -0
  101. package/dashboard/.next/static/chunks/2374-8c6f137938f8518a.js +1 -0
  102. package/dashboard/.next/static/chunks/2445.18a86507d2996b95.js +1 -0
  103. package/dashboard/.next/static/chunks/2712.15dd8577973baf22.js +10 -0
  104. package/dashboard/.next/static/chunks/2759.533dec5317e0a1d1.js +1 -0
  105. package/dashboard/.next/static/chunks/2812.62b213bef580b69a.js +1 -0
  106. package/dashboard/.next/static/chunks/2895.bb57cacb7aaf42a1.js +9 -0
  107. package/dashboard/.next/static/chunks/2972.e5a9251b538dcf19.js +9 -0
  108. package/dashboard/.next/static/chunks/3206.8d9a10db2b04b93f.js +1 -0
  109. package/dashboard/.next/static/chunks/3485.36766504793b7237.js +9 -0
  110. package/dashboard/.next/static/chunks/3725.de9376dc994735d4.js +9 -0
  111. package/dashboard/.next/static/chunks/3774.1df377928e8387f7.js +9 -0
  112. package/dashboard/.next/static/chunks/3963.39d72b3875dfe2e9.js +13 -0
  113. package/dashboard/.next/static/chunks/4013.73884b23bfaebdde.js +11 -0
  114. package/dashboard/.next/static/chunks/4117.278aff1fa23fd36e.js +6 -0
  115. package/dashboard/.next/static/chunks/4210.cc8594110017c579.js +11 -0
  116. package/dashboard/.next/static/chunks/4282.28485875540886cc.js +7 -0
  117. package/dashboard/.next/static/chunks/4318.a2f469a88d88f6d0.js +8 -0
  118. package/dashboard/.next/static/chunks/4363.8999a6e727c48003.js +1 -0
  119. package/dashboard/.next/static/chunks/4641.e03d118fffebd580.js +5 -0
  120. package/dashboard/.next/static/chunks/483.a910dab7734a1074.js +8 -0
  121. package/dashboard/.next/static/chunks/4926.76693f542e9cc062.js +6 -0
  122. package/dashboard/.next/static/chunks/4938.03f6d04dabf38745.js +10 -0
  123. package/dashboard/.next/static/chunks/5112.0757c2b0c285e62e.js +1 -0
  124. package/dashboard/.next/static/chunks/5199.c83ea7efb0eec705.js +11 -0
  125. package/dashboard/.next/static/chunks/530.849957a8907eb288.js +1 -0
  126. package/dashboard/.next/static/chunks/5424.4e8ca0711a32bccf.js +7 -0
  127. package/dashboard/.next/static/chunks/55.a593a78be9714679.js +1 -0
  128. package/dashboard/.next/static/chunks/5535.6cd0bd8d368d8902.js +4 -0
  129. package/dashboard/.next/static/chunks/5626.7d4e93d7acbeffc9.js +10 -0
  130. package/dashboard/.next/static/chunks/5775.a0d7c1b1e89b9a93.js +9 -0
  131. package/dashboard/.next/static/chunks/6118.266956b3333b1d7a.js +9 -0
  132. package/dashboard/.next/static/chunks/6121.a2e6d93720b1205e.js +77 -0
  133. package/dashboard/.next/static/chunks/6853.d3ad43614e8ca0ab.js +1 -0
  134. package/dashboard/.next/static/chunks/6951.02a3a158d02158c9.js +5 -0
  135. package/dashboard/.next/static/chunks/6970.013f24568c87d918.js +11 -0
  136. package/dashboard/.next/static/chunks/7013.39d41e82b37be63b.js +9 -0
  137. package/dashboard/.next/static/chunks/7107.1c5412197912b8ed.js +8 -0
  138. package/dashboard/.next/static/chunks/7508.dd60e2d06d149f5f.js +9 -0
  139. package/dashboard/.next/static/chunks/7524.0fde4c61553d1491.js +3 -0
  140. package/dashboard/.next/static/chunks/7834-47f318a04a05688f.js +1 -0
  141. package/dashboard/.next/static/chunks/8317.d0b3eddef4cae0d5.js +1 -0
  142. package/dashboard/.next/static/chunks/838.2b2aa006519ba44c.js +10 -0
  143. package/dashboard/.next/static/chunks/8398.924fd8f4c83417c0.js +7 -0
  144. package/dashboard/.next/static/chunks/8428b36f.8ac4e67061c01307.js +34 -0
  145. package/dashboard/.next/static/chunks/8514.85ccbbea8ab21d04.js +5 -0
  146. package/dashboard/.next/static/chunks/8538.5f7ebe76c4b63162.js +1 -0
  147. package/dashboard/.next/static/chunks/8687.9406baa8b5601fd0.js +1 -0
  148. package/dashboard/.next/static/chunks/8721.47346e2cb6412376.js +10 -0
  149. package/dashboard/.next/static/chunks/8770.4f544bd1a6f03a62.js +8 -0
  150. package/dashboard/.next/static/chunks/8812.3d96fd54dba566f8.js +9 -0
  151. package/dashboard/.next/static/chunks/8962.d22aa67a97970dd8.js +1 -0
  152. package/dashboard/.next/static/chunks/8986.b327224b83f4399a.js +5 -0
  153. package/dashboard/.next/static/chunks/9271.5f66c19a8ee1ff36.js +10 -0
  154. package/dashboard/.next/static/chunks/9282.f8d01442bab4c0da.js +2 -0
  155. package/dashboard/.next/static/chunks/9366.0ec24a0791b9b00f.js +1 -0
  156. package/dashboard/.next/static/chunks/9707.5cd7d2ee933a4af5.js +6 -0
  157. package/dashboard/.next/static/chunks/9716.15fffc0b0038601d.js +4 -0
  158. package/dashboard/.next/static/chunks/9791.e3b3f5a367f63c8a.js +1 -0
  159. package/dashboard/.next/static/chunks/9820.8c1efad5260e8137.js +1 -0
  160. package/dashboard/.next/static/chunks/985.50150e9eaa4bde33.js +39 -0
  161. package/dashboard/.next/static/chunks/997.56901b86e1b8a87b.js +8 -0
  162. package/dashboard/.next/static/chunks/app/changes/page-f8a860034221cad4.js +1 -0
  163. package/dashboard/.next/static/chunks/app/issues/page-da4da93188c414a6.js +1 -0
  164. package/dashboard/.next/static/chunks/app/layout-27a9da4610423c1e.js +1 -0
  165. package/dashboard/.next/static/chunks/app/model/page-9680e22fdd6ddb81.js +1 -0
  166. package/dashboard/.next/static/chunks/app/page-0e67750d99fb2836.js +1 -0
  167. package/dashboard/.next/static/chunks/app/report/page-b56b1db9b9dcf2b6.js +1 -0
  168. package/dashboard/.next/static/chunks/app/review/page-3ef69f0e0badd333.js +1 -0
  169. package/dashboard/.next/static/chunks/c75e29e3.d91220f782934d80.js +1 -0
  170. package/dashboard/.next/static/chunks/{main-cc3a889b25e9aa68.js → main-9c95a7ffedc7afb4.js} +1 -1
  171. package/dashboard/.next/static/chunks/webpack-6da70e4f9fcf1799.js +1 -0
  172. package/dashboard/.next/static/css/ceafd91ca8dd753d.css +3 -0
  173. package/dashboard/.next/static/css/e4aad1f9c715b79a.css +1 -0
  174. package/dashboard/.next/static/media/Assistant-Bold.c8f39f24.woff2 +0 -0
  175. package/dashboard/.next/static/media/Assistant-Medium.1e75d8e6.woff2 +0 -0
  176. package/dashboard/.next/static/media/Assistant-Regular.7acbabb8.woff2 +0 -0
  177. package/dashboard/.next/static/media/Assistant-SemiBold.167acbf8.woff2 +0 -0
  178. package/dashboard/app/api/code/route.ts +26 -20
  179. package/dashboard/app/api/comments/route.ts +158 -0
  180. package/dashboard/app/api/diagrams/[name]/export/route.ts +26 -0
  181. package/dashboard/app/api/diagrams/[name]/resolve/route.ts +25 -0
  182. package/dashboard/app/api/diagrams/[name]/route.ts +37 -0
  183. package/dashboard/app/api/figures/[name]/route.ts +15 -0
  184. package/dashboard/app/api/focus/route.ts +35 -0
  185. package/dashboard/app/api/invariants/[id]/route.ts +35 -0
  186. package/dashboard/app/api/issues/[id]/revert-auto/route.ts +18 -0
  187. package/dashboard/app/api/nav/route.ts +120 -0
  188. package/dashboard/app/api/palette/route.ts +68 -0
  189. package/dashboard/app/api/progress/route.ts +54 -23
  190. package/dashboard/app/api/xref/route.ts +30 -0
  191. package/dashboard/app/changes/ChangesClient.tsx +730 -356
  192. package/dashboard/app/changes/page.tsx +27 -19
  193. package/dashboard/app/excalidraw-assets/[...path]/route.ts +56 -0
  194. package/dashboard/app/globals.css +231 -77
  195. package/dashboard/app/issues/BoardClient.tsx +817 -0
  196. package/dashboard/app/issues/page.tsx +27 -272
  197. package/dashboard/app/layout.tsx +32 -17
  198. package/dashboard/app/model/ModelClient.tsx +1303 -0
  199. package/dashboard/app/model/page.tsx +98 -0
  200. package/dashboard/app/page.tsx +191 -277
  201. package/dashboard/app/report/ReportClient.tsx +147 -74
  202. package/dashboard/app/report/page.tsx +25 -14
  203. package/dashboard/app/review/ReviewClient.tsx +1180 -0
  204. package/dashboard/app/review/page.tsx +93 -0
  205. package/dashboard/components/AutoRefresh.tsx +22 -19
  206. package/dashboard/components/CodeComments.tsx +303 -0
  207. package/dashboard/components/CodeNav.tsx +523 -0
  208. package/dashboard/components/CodeReference.tsx +92 -99
  209. package/dashboard/components/CodeViewer.tsx +526 -0
  210. package/dashboard/components/CommandPalette.tsx +141 -66
  211. package/dashboard/components/DiagramCanvas.tsx +275 -0
  212. package/dashboard/components/DianeNote.tsx +244 -0
  213. package/dashboard/components/LiveStatus.tsx +30 -68
  214. package/dashboard/components/MarkdownRenderer.tsx +34 -32
  215. package/dashboard/components/RecordButton.tsx +132 -0
  216. package/dashboard/components/ui/Button.tsx +39 -0
  217. package/dashboard/components/ui/Chip.tsx +37 -0
  218. package/dashboard/components/ui/EmptyState.tsx +31 -0
  219. package/dashboard/components/ui/Icons.tsx +126 -0
  220. package/dashboard/components/ui/Inspector.tsx +122 -0
  221. package/dashboard/components/ui/Kbd.tsx +15 -0
  222. package/dashboard/components/ui/ListRow.tsx +92 -0
  223. package/dashboard/components/ui/LocalTime.tsx +14 -0
  224. package/dashboard/components/ui/ProgressRing.tsx +54 -0
  225. package/dashboard/components/ui/ResizeHandle.tsx +93 -0
  226. package/dashboard/components/ui/RiskMeter.tsx +27 -0
  227. package/dashboard/components/ui/SearchField.tsx +55 -0
  228. package/dashboard/components/ui/SegmentedControl.tsx +71 -0
  229. package/dashboard/components/ui/SeverityDot.tsx +57 -0
  230. package/dashboard/components/ui/Sidebar.tsx +236 -0
  231. package/dashboard/components/ui/SplitView.tsx +122 -0
  232. package/dashboard/components/ui/StateGlyph.tsx +66 -0
  233. package/dashboard/components/ui/Toast.tsx +91 -0
  234. package/dashboard/lib/api.ts +17 -0
  235. package/dashboard/lib/cn.ts +4 -0
  236. package/dashboard/lib/data.ts +2 -21
  237. package/dashboard/lib/finding-markdown.ts +1 -1
  238. package/dashboard/lib/focus.ts +42 -0
  239. package/dashboard/lib/hotkeys.ts +41 -0
  240. package/dashboard/lib/inline-markdown.test.ts +11 -0
  241. package/dashboard/lib/live.ts +32 -0
  242. package/dashboard/lib/pane-width.ts +36 -0
  243. package/dashboard/lib/server/board.ts +229 -0
  244. package/dashboard/lib/server/diagrams.ts +191 -0
  245. package/dashboard/lib/server/safe-path.ts +28 -0
  246. package/dashboard/lib/server/workspace.ts +113 -0
  247. package/dashboard/lib/server/xref.ts +42 -0
  248. package/dashboard/lib/solidity.test.ts +37 -0
  249. package/dashboard/lib/solidity.ts +191 -0
  250. package/dashboard/lib/source.ts +28 -0
  251. package/dashboard/lib/types.ts +164 -0
  252. package/dashboard/lib/url.ts +18 -0
  253. package/dashboard/lib/watcher.ts +31 -22
  254. package/dashboard/tailwind.config.ts +6 -3
  255. package/dist/analysis/code-model.d.ts.map +1 -1
  256. package/dist/analysis/code-model.js +4 -1
  257. package/dist/analysis/code-model.js.map +1 -1
  258. package/dist/analysis/diff.d.ts +12 -1
  259. package/dist/analysis/diff.d.ts.map +1 -1
  260. package/dist/analysis/diff.js +143 -0
  261. package/dist/analysis/diff.js.map +1 -1
  262. package/dist/commands/analyze.d.ts.map +1 -1
  263. package/dist/commands/analyze.js +17 -48
  264. package/dist/commands/analyze.js.map +1 -1
  265. package/dist/commands/claude.d.ts.map +1 -1
  266. package/dist/commands/claude.js +5 -0
  267. package/dist/commands/claude.js.map +1 -1
  268. package/dist/commands/dashboard.d.ts.map +1 -1
  269. package/dist/commands/dashboard.js +10 -2
  270. package/dist/commands/dashboard.js.map +1 -1
  271. package/dist/commands/diagram.d.ts +3 -0
  272. package/dist/commands/diagram.d.ts.map +1 -0
  273. package/dist/commands/diagram.js +71 -0
  274. package/dist/commands/diagram.js.map +1 -0
  275. package/dist/commands/diff.d.ts +4 -5
  276. package/dist/commands/diff.d.ts.map +1 -1
  277. package/dist/commands/diff.js +56 -17
  278. package/dist/commands/diff.js.map +1 -1
  279. package/dist/commands/doctor.d.ts.map +1 -1
  280. package/dist/commands/doctor.js +5 -18
  281. package/dist/commands/doctor.js.map +1 -1
  282. package/dist/commands/facts.d.ts +23 -0
  283. package/dist/commands/facts.d.ts.map +1 -0
  284. package/dist/commands/facts.js +121 -0
  285. package/dist/commands/facts.js.map +1 -0
  286. package/dist/commands/fix-review.d.ts +9 -0
  287. package/dist/commands/fix-review.d.ts.map +1 -0
  288. package/dist/commands/fix-review.js +367 -0
  289. package/dist/commands/fix-review.js.map +1 -0
  290. package/dist/commands/init.d.ts.map +1 -1
  291. package/dist/commands/init.js +51 -47
  292. package/dist/commands/init.js.map +1 -1
  293. package/dist/commands/issue.d.ts.map +1 -1
  294. package/dist/commands/issue.js +151 -2
  295. package/dist/commands/issue.js.map +1 -1
  296. package/dist/commands/mcp.d.ts +3 -0
  297. package/dist/commands/mcp.d.ts.map +1 -0
  298. package/dist/commands/mcp.js +11 -0
  299. package/dist/commands/mcp.js.map +1 -0
  300. package/dist/commands/model.d.ts +4 -0
  301. package/dist/commands/model.d.ts.map +1 -0
  302. package/dist/commands/model.js +275 -0
  303. package/dist/commands/model.js.map +1 -0
  304. package/dist/commands/note.d.ts.map +1 -1
  305. package/dist/commands/note.js +31 -1
  306. package/dist/commands/note.js.map +1 -1
  307. package/dist/commands/review.d.ts +4 -0
  308. package/dist/commands/review.d.ts.map +1 -0
  309. package/dist/commands/review.js +164 -0
  310. package/dist/commands/review.js.map +1 -0
  311. package/dist/core/comments.d.ts +59 -0
  312. package/dist/core/comments.d.ts.map +1 -0
  313. package/dist/core/comments.js +263 -0
  314. package/dist/core/comments.js.map +1 -0
  315. package/dist/core/config.d.ts.map +1 -1
  316. package/dist/core/config.js +0 -1
  317. package/dist/core/config.js.map +1 -1
  318. package/dist/core/dedup.d.ts +56 -0
  319. package/dist/core/dedup.d.ts.map +1 -0
  320. package/dist/core/dedup.js +208 -0
  321. package/dist/core/dedup.js.map +1 -0
  322. package/dist/core/errors.d.ts +1 -1
  323. package/dist/core/errors.d.ts.map +1 -1
  324. package/dist/core/errors.js +0 -15
  325. package/dist/core/errors.js.map +1 -1
  326. package/dist/core/external-tools.d.ts +0 -14
  327. package/dist/core/external-tools.d.ts.map +1 -1
  328. package/dist/core/external-tools.js +2 -52
  329. package/dist/core/external-tools.js.map +1 -1
  330. package/dist/core/fix-review.d.ts +54 -0
  331. package/dist/core/fix-review.d.ts.map +1 -0
  332. package/dist/core/fix-review.js +98 -0
  333. package/dist/core/fix-review.js.map +1 -0
  334. package/dist/core/fuzz-sync.d.ts +93 -0
  335. package/dist/core/fuzz-sync.d.ts.map +1 -0
  336. package/dist/core/fuzz-sync.js +516 -0
  337. package/dist/core/fuzz-sync.js.map +1 -0
  338. package/dist/core/git.d.ts +7 -0
  339. package/dist/core/git.d.ts.map +1 -1
  340. package/dist/core/git.js +42 -0
  341. package/dist/core/git.js.map +1 -1
  342. package/dist/core/issues.d.ts +32 -1
  343. package/dist/core/issues.d.ts.map +1 -1
  344. package/dist/core/issues.js +135 -3
  345. package/dist/core/issues.js.map +1 -1
  346. package/dist/core/mcp-config.d.ts +12 -0
  347. package/dist/core/mcp-config.d.ts.map +1 -0
  348. package/dist/core/mcp-config.js +29 -0
  349. package/dist/core/mcp-config.js.map +1 -0
  350. package/dist/core/model.d.ts +38 -0
  351. package/dist/core/model.d.ts.map +1 -0
  352. package/dist/core/model.js +160 -0
  353. package/dist/core/model.js.map +1 -0
  354. package/dist/core/notes.d.ts +2 -0
  355. package/dist/core/notes.d.ts.map +1 -1
  356. package/dist/core/notes.js +13 -3
  357. package/dist/core/notes.js.map +1 -1
  358. package/dist/core/review.d.ts +47 -0
  359. package/dist/core/review.d.ts.map +1 -1
  360. package/dist/core/review.js +177 -1
  361. package/dist/core/review.js.map +1 -1
  362. package/dist/core/rules.d.ts +12 -0
  363. package/dist/core/rules.d.ts.map +1 -0
  364. package/dist/core/rules.js +66 -0
  365. package/dist/core/rules.js.map +1 -0
  366. package/dist/core/schema.d.ts +4817 -2245
  367. package/dist/core/schema.d.ts.map +1 -1
  368. package/dist/core/schema.js +452 -113
  369. package/dist/core/schema.js.map +1 -1
  370. package/dist/core/scope.d.ts +8 -0
  371. package/dist/core/scope.d.ts.map +1 -0
  372. package/dist/core/scope.js +18 -0
  373. package/dist/core/scope.js.map +1 -0
  374. package/dist/diagrams/build.d.ts +18 -0
  375. package/dist/diagrams/build.d.ts.map +1 -0
  376. package/dist/diagrams/build.js +135 -0
  377. package/dist/diagrams/build.js.map +1 -0
  378. package/dist/diagrams/excalidraw.d.ts +27 -0
  379. package/dist/diagrams/excalidraw.d.ts.map +1 -0
  380. package/dist/diagrams/excalidraw.js +219 -0
  381. package/dist/diagrams/excalidraw.js.map +1 -0
  382. package/dist/diagrams/layout.d.ts +48 -0
  383. package/dist/diagrams/layout.d.ts.map +1 -0
  384. package/dist/diagrams/layout.js +686 -0
  385. package/dist/diagrams/layout.js.map +1 -0
  386. package/dist/facts/build.d.ts +23 -0
  387. package/dist/facts/build.d.ts.map +1 -0
  388. package/dist/facts/build.js +112 -0
  389. package/dist/facts/build.js.map +1 -0
  390. package/dist/facts/extract.d.ts +53 -0
  391. package/dist/facts/extract.d.ts.map +1 -0
  392. package/dist/facts/extract.js +635 -0
  393. package/dist/facts/extract.js.map +1 -0
  394. package/dist/facts/fallback.d.ts +7 -0
  395. package/dist/facts/fallback.d.ts.map +1 -0
  396. package/dist/facts/fallback.js +156 -0
  397. package/dist/facts/fallback.js.map +1 -0
  398. package/dist/facts/implementations.d.ts +29 -0
  399. package/dist/facts/implementations.d.ts.map +1 -0
  400. package/dist/facts/implementations.js +43 -0
  401. package/dist/facts/implementations.js.map +1 -0
  402. package/dist/facts/query.d.ts +35 -0
  403. package/dist/facts/query.d.ts.map +1 -0
  404. package/dist/facts/query.js +157 -0
  405. package/dist/facts/query.js.map +1 -0
  406. package/dist/facts/xref.d.ts +53 -0
  407. package/dist/facts/xref.d.ts.map +1 -0
  408. package/dist/facts/xref.js +282 -0
  409. package/dist/facts/xref.js.map +1 -0
  410. package/dist/index.js +14 -16
  411. package/dist/index.js.map +1 -1
  412. package/dist/mcp/server.d.ts +3 -0
  413. package/dist/mcp/server.d.ts.map +1 -0
  414. package/dist/mcp/server.js +400 -0
  415. package/dist/mcp/server.js.map +1 -0
  416. package/dist/skills/ai-audit/SKILL.md +16 -6
  417. package/dist/skills/ai-audit/UPSTREAM.md +9 -4
  418. package/dist/skills/ai-audit/references/hex-board.md +34 -46
  419. package/dist/skills/diane.md +26 -12
  420. package/dist/skills/fix-review.md +58 -0
  421. package/dist/skills/fuzz/LICENSE +21 -0
  422. package/dist/skills/fuzz/SKILL.md +655 -0
  423. package/dist/skills/fuzz/UPSTREAM.md +119 -0
  424. package/dist/skills/fuzz/agents/implementers/global-property-implementer.md +81 -0
  425. package/dist/skills/fuzz/agents/implementers/specific-property-implementer.md +121 -0
  426. package/dist/skills/fuzz/agents/invariant-discovery/adversarial-profit-maximizer.md +123 -0
  427. package/dist/skills/fuzz/agents/invariant-discovery/conservation-auditor.md +92 -0
  428. package/dist/skills/fuzz/agents/invariant-discovery/protocol-type-specialist.md +173 -0
  429. package/dist/skills/fuzz/agents/invariant-discovery/roundtrip-rounding-analyst.md +164 -0
  430. package/dist/skills/fuzz/agents/invariant-discovery/state-transition-mapper.md +92 -0
  431. package/dist/skills/fuzz/agents/invariant-discovery/synthesizer.md +261 -0
  432. package/dist/skills/fuzz/agents/protocol-analyzer.md +80 -0
  433. package/dist/skills/fuzz/agents/report-writer.md +135 -0
  434. package/dist/skills/fuzz/references/handler-patterns.md +222 -0
  435. package/dist/skills/fuzz/references/hex-invariants.md +102 -0
  436. package/dist/skills/fuzz/references/property-generation.md +149 -0
  437. package/dist/skills/fuzz/references/selection-policy.md +49 -0
  438. package/dist/skills/fuzz/references/setup-playbook.md +92 -0
  439. package/dist/skills/fuzz/references/template-map.md +121 -0
  440. package/dist/skills/fuzz/scripts/ensure_foundry.sh +125 -0
  441. package/dist/skills/fuzz/scripts/estimate_cost.js +157 -0
  442. package/dist/skills/fuzz/scripts/extract_abis.js +303 -0
  443. package/dist/skills/fuzz/scripts/fizz_sync.js +692 -0
  444. package/dist/skills/fuzz/scripts/generate_handlers.js +370 -0
  445. package/dist/skills/fuzz/scripts/generate_suite.js +254 -0
  446. package/dist/skills/fuzz/scripts/lib/log-viewer.js +332 -0
  447. package/dist/skills/fuzz/scripts/run_echidna.js +192 -0
  448. package/dist/skills/fuzz/scripts/run_medusa.js +329 -0
  449. package/dist/skills/fuzz/scripts/select_functions.js +637 -0
  450. package/dist/skills/fuzz/scripts/setup_fuzz_profile.sh +142 -0
  451. package/dist/skills/fuzz/templates/Actor.sol +63 -0
  452. package/dist/skills/fuzz/templates/Base.sol +121 -0
  453. package/dist/skills/fuzz/templates/FoundryTester.sol +29 -0
  454. package/dist/skills/fuzz/templates/FuzzTester.sol +11 -0
  455. package/dist/skills/fuzz/templates/Properties.sol +17 -0
  456. package/dist/skills/fuzz/templates/README.md +56 -0
  457. package/dist/skills/fuzz/templates/Snapshots.sol +26 -0
  458. package/dist/skills/fuzz/templates/echidna.yaml +18 -0
  459. package/dist/skills/fuzz/templates/handlers/Handlers.sol +13 -0
  460. package/dist/skills/fuzz/templates/medusa.json +93 -0
  461. package/dist/skills/fuzz/templates/utils/Clamp.sol +223 -0
  462. package/dist/skills/fuzz/templates/utils/DecimalPrinter.sol +63 -0
  463. package/dist/skills/fuzz/templates/utils/Deployer.sol +17 -0
  464. package/dist/skills/fuzz/templates/utils/EnumerableSet.sol +206 -0
  465. package/dist/skills/fuzz/templates/utils/Hevm.sol +62 -0
  466. package/dist/skills/fuzz/templates/utils/Logger.sol +619 -0
  467. package/dist/skills/fuzz/templates/utils/Math.sol +52 -0
  468. package/dist/skills/fuzz/templates/utils/MockERC20.sol +279 -0
  469. package/dist/skills/fuzz/templates/utils/PropertiesAsserts.sol +238 -0
  470. package/dist/skills/fuzz/templates/utils/StringUtils.sol +85 -0
  471. package/dist/skills/fuzz-convert/SKILL.md +249 -0
  472. package/dist/skills/fuzz-sync/SKILL.md +342 -0
  473. package/dist/skills/generate-poc.md +8 -26
  474. package/dist/skills/generate-report.md +17 -5
  475. package/dist/skills/ingest-aa-report.md +11 -30
  476. package/dist/skills/init-audit/SKILL.md +155 -0
  477. package/dist/skills/init-audit/references/agents/conformance-checker.md +36 -0
  478. package/dist/skills/init-audit/references/agents/contract-reader.md +59 -0
  479. package/dist/skills/init-audit/references/agents/diagram-composer.md +48 -0
  480. package/dist/skills/init-audit/references/agents/docs-extractor.md +26 -0
  481. package/dist/skills/init-audit/references/agents/prior-audit.md +32 -0
  482. package/dist/skills/init-audit/references/agents/regression-checker.md +28 -0
  483. package/dist/skills/init-audit/references/agents/skeptic.md +31 -0
  484. package/dist/skills/init-audit/references/agents/standards-checker.md +39 -0
  485. package/dist/skills/init-audit/references/agents/synthesizer.md +50 -0
  486. package/dist/skills/prevalidate.md +62 -0
  487. package/dist/skills/sync-issues.md +11 -25
  488. package/dist/skills/validate-all-findings.md +2 -2
  489. package/dist/skills/validate-finding.md +25 -24
  490. package/dist/skills/write-finding.md +6 -5
  491. package/dist/types/index.d.ts +16 -12
  492. package/dist/types/index.d.ts.map +1 -1
  493. package/package.json +5 -4
  494. package/dashboard/.next/server/app/access/page.js +0 -1
  495. package/dashboard/.next/server/app/access/page_client-reference-manifest.js +0 -1
  496. package/dashboard/.next/server/app/api/flows/route.js +0 -1
  497. package/dashboard/.next/server/app/api/mermaid/route.js +0 -1
  498. package/dashboard/.next/server/app/calls/page.js +0 -1
  499. package/dashboard/.next/server/app/calls/page_client-reference-manifest.js +0 -1
  500. package/dashboard/.next/server/app/conformance/page.js +0 -1
  501. package/dashboard/.next/server/app/conformance/page.js.nft.json +0 -1
  502. package/dashboard/.next/server/app/conformance/page_client-reference-manifest.js +0 -1
  503. package/dashboard/.next/server/app/diagram/page.js +0 -1
  504. package/dashboard/.next/server/app/diagram/page.js.nft.json +0 -1
  505. package/dashboard/.next/server/app/diagram/page_client-reference-manifest.js +0 -1
  506. package/dashboard/.next/server/app/flows/page.js +0 -1
  507. package/dashboard/.next/server/app/flows/page.js.nft.json +0 -1
  508. package/dashboard/.next/server/app/flows/page_client-reference-manifest.js +0 -1
  509. package/dashboard/.next/server/app/functions/page.js +0 -1
  510. package/dashboard/.next/server/app/functions/page.js.nft.json +0 -1
  511. package/dashboard/.next/server/app/functions/page_client-reference-manifest.js +0 -1
  512. package/dashboard/.next/server/app/notes/page.js +0 -22
  513. package/dashboard/.next/server/app/notes/page.js.nft.json +0 -1
  514. package/dashboard/.next/server/app/notes/page_client-reference-manifest.js +0 -1
  515. package/dashboard/.next/server/app/progress/page.js +0 -1
  516. package/dashboard/.next/server/app/progress/page.js.nft.json +0 -1
  517. package/dashboard/.next/server/app/progress/page_client-reference-manifest.js +0 -1
  518. package/dashboard/.next/server/app/stats/page.js +0 -1
  519. package/dashboard/.next/server/app/stats/page.js.nft.json +0 -1
  520. package/dashboard/.next/server/app/stats/page_client-reference-manifest.js +0 -1
  521. package/dashboard/.next/server/chunks/530.js +0 -1
  522. package/dashboard/.next/server/chunks/622.js +0 -3
  523. package/dashboard/.next/server/chunks/665.js +0 -13
  524. package/dashboard/.next/server/chunks/939.js +0 -1
  525. package/dashboard/.next/static/chunks/3017.4a5312e3c20a173f.js +0 -1
  526. package/dashboard/.next/static/chunks/7397-37adf76cad543297.js +0 -1
  527. package/dashboard/.next/static/chunks/7973.e34032723285a616.js +0 -79
  528. package/dashboard/.next/static/chunks/8452-6d77fa353402422c.js +0 -13
  529. package/dashboard/.next/static/chunks/8928-fc049decdfbdaa6d.js +0 -1
  530. package/dashboard/.next/static/chunks/app/access/page-f8403cbdfc1c176b.js +0 -1
  531. package/dashboard/.next/static/chunks/app/calls/page-41f20d01e12382ef.js +0 -1
  532. package/dashboard/.next/static/chunks/app/changes/page-82bf8b6f48cdc506.js +0 -1
  533. package/dashboard/.next/static/chunks/app/conformance/page-6bb8e3b372e38098.js +0 -1
  534. package/dashboard/.next/static/chunks/app/diagram/page-469cd7a6f183efba.js +0 -1
  535. package/dashboard/.next/static/chunks/app/flows/page-7872dd9141ba0b07.js +0 -1
  536. package/dashboard/.next/static/chunks/app/functions/page-5847bcb77a8e7edf.js +0 -1
  537. package/dashboard/.next/static/chunks/app/issues/page-1ffc64fe40439002.js +0 -1
  538. package/dashboard/.next/static/chunks/app/layout-6c6d2a0fd7c989d3.js +0 -1
  539. package/dashboard/.next/static/chunks/app/notes/page-8bcaa52304500098.js +0 -1
  540. package/dashboard/.next/static/chunks/app/page-d63800ddb072b77b.js +0 -1
  541. package/dashboard/.next/static/chunks/app/progress/page-e26554f655a62eef.js +0 -1
  542. package/dashboard/.next/static/chunks/app/report/page-18c04fb2f193b020.js +0 -1
  543. package/dashboard/.next/static/chunks/app/stats/page-67ff59fd69bed651.js +0 -1
  544. package/dashboard/.next/static/chunks/webpack-4de0e79bdd6a0418.js +0 -1
  545. package/dashboard/.next/static/css/1112cea2260b3926.css +0 -3
  546. package/dashboard/app/access/AccessClient.tsx +0 -402
  547. package/dashboard/app/access/ReadOnlyFunctions.tsx +0 -114
  548. package/dashboard/app/access/page.tsx +0 -125
  549. package/dashboard/app/api/flows/route.ts +0 -32
  550. package/dashboard/app/api/mermaid/route.ts +0 -25
  551. package/dashboard/app/calls/CallsClient.tsx +0 -170
  552. package/dashboard/app/calls/page.tsx +0 -57
  553. package/dashboard/app/conformance/ConformanceTable.tsx +0 -214
  554. package/dashboard/app/conformance/page.tsx +0 -186
  555. package/dashboard/app/diagram/page.tsx +0 -65
  556. package/dashboard/app/flows/page.tsx +0 -102
  557. package/dashboard/app/functions/FunctionsClient.tsx +0 -167
  558. package/dashboard/app/functions/page.tsx +0 -178
  559. package/dashboard/app/issues/IssuesBoardClient.tsx +0 -813
  560. package/dashboard/app/notes/NotesClient.tsx +0 -706
  561. package/dashboard/app/notes/page.tsx +0 -47
  562. package/dashboard/app/progress/ProgressClient.tsx +0 -354
  563. package/dashboard/app/progress/page.tsx +0 -127
  564. package/dashboard/app/stats/StatsClient.tsx +0 -452
  565. package/dashboard/app/stats/page.tsx +0 -50
  566. package/dashboard/components/ConfidenceBadge.tsx +0 -53
  567. package/dashboard/components/DashboardLayout.tsx +0 -510
  568. package/dashboard/components/FilterableTable.tsx +0 -293
  569. package/dashboard/components/MermaidViewer.tsx +0 -267
  570. package/dashboard/components/NotYetGenerated.tsx +0 -32
  571. package/dashboard/components/SeverityBadge.tsx +0 -28
  572. package/dashboard/components/SignalBars.tsx +0 -27
  573. package/dashboard/components/SortableTable.tsx +0 -122
  574. package/dashboard/lib/conformance-tokens.ts +0 -49
  575. package/dist/skills/init-audit.md +0 -386
  576. /package/dashboard/.next/server/app/api/{flows → xref}/route.js.nft.json +0 -0
  577. /package/dashboard/.next/server/app/{api/mermaid → excalidraw-assets/[...path]}/route.js.nft.json +0 -0
  578. /package/dashboard/.next/static/{z5XBev05xDAkDrxWxAjNu → bGV1ry1vvIbM5b506eVBR}/_buildManifest.js +0 -0
  579. /package/dashboard/.next/static/{z5XBev05xDAkDrxWxAjNu → bGV1ry1vvIbM5b506eVBR}/_ssgManifest.js +0 -0
  580. /package/dashboard/.next/static/chunks/{3205-47d09be47325709f.js → 3205-fd963acf2fdfd080.js} +0 -0
  581. /package/dashboard/.next/static/chunks/{3924-88d849290406ee6f.js → 3924-f1f85ccc7d59d7ab.js} +0 -0
  582. /package/dashboard/.next/static/chunks/{618f8807-69fc7bb97c2b87c1.js → 618f8807-fbb1466bc29c17c6.js} +0 -0
  583. /package/dashboard/.next/static/chunks/{7498-d1814d68ba346d13.js → 7498-7cf464d8af69cd0a.js} +0 -0
  584. /package/dashboard/.next/static/chunks/app/_not-found/{page-c299b935209993df.js → page-5ff5d54b6fd6f17e.js} +0 -0
@@ -1,122 +0,0 @@
1
- 'use client';
2
-
3
- import { useState } from 'react';
4
- import {
5
- flexRender,
6
- getCoreRowModel,
7
- getSortedRowModel,
8
- useReactTable,
9
- type ColumnDef,
10
- type SortingState,
11
- } from '@tanstack/react-table';
12
-
13
- interface SortableTableProps<T> {
14
- columns: ColumnDef<T, any>[];
15
- data: T[];
16
- }
17
-
18
- export function SortableTable<T>({ columns, data }: SortableTableProps<T>) {
19
- const [sorting, setSorting] = useState<SortingState>([]);
20
-
21
- const table = useReactTable({
22
- data,
23
- columns,
24
- state: { sorting },
25
- onSortingChange: setSorting,
26
- getCoreRowModel: getCoreRowModel(),
27
- getSortedRowModel: getSortedRowModel(),
28
- });
29
-
30
- return (
31
- <div className="overflow-x-auto border border-border-default" style={{ borderRadius: 'var(--radius-sm)' }}>
32
- <table className="w-full text-left text-body">
33
- <thead className="border-b border-border-default bg-surface-2 text-caption font-medium uppercase tracking-wider text-text-tertiary">
34
- {table.getHeaderGroups().map((headerGroup) => (
35
- <tr key={headerGroup.id}>
36
- {headerGroup.headers.map((header) => (
37
- <th
38
- key={header.id}
39
- scope="col"
40
- aria-sort={
41
- header.column.getIsSorted() === 'asc' ? 'ascending'
42
- : header.column.getIsSorted() === 'desc' ? 'descending'
43
- : undefined
44
- }
45
- className="px-sp-4 py-sp-2 font-medium"
46
- style={{ width: header.getSize() !== 150 ? header.getSize() : undefined }}
47
- >
48
- {header.isPlaceholder ? null : header.column.getCanSort() ? (
49
- <button
50
- type="button"
51
- className="inline-flex cursor-pointer select-none items-center gap-1 hover:text-text-secondary focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent rounded-sm"
52
- onClick={header.column.getToggleSortingHandler()}
53
- >
54
- {flexRender(header.column.columnDef.header, header.getContext())}
55
- {{
56
- asc: <SortAscIcon />,
57
- desc: <SortDescIcon />,
58
- }[header.column.getIsSorted() as string] ?? <SortNeutralIcon />}
59
- </button>
60
- ) : (
61
- <span className="inline-flex items-center gap-1">
62
- {flexRender(header.column.columnDef.header, header.getContext())}
63
- </span>
64
- )}
65
- </th>
66
- ))}
67
- </tr>
68
- ))}
69
- </thead>
70
- <tbody className="divide-y divide-border-subtle">
71
- {table.getRowModel().rows.length === 0 ? (
72
- <tr>
73
- <td
74
- colSpan={columns.length}
75
- className="px-sp-4 py-sp-6 text-center text-text-tertiary"
76
- >
77
- No data
78
- </td>
79
- </tr>
80
- ) : (
81
- table.getRowModel().rows.map((row) => (
82
- <tr
83
- key={row.id}
84
- className="min-h-9 bg-surface-1 hover:bg-surface-3"
85
- >
86
- {row.getVisibleCells().map((cell) => (
87
- <td key={cell.id} className="px-sp-4 py-sp-2 text-text-secondary align-top">
88
- {flexRender(cell.column.columnDef.cell, cell.getContext())}
89
- </td>
90
- ))}
91
- </tr>
92
- ))
93
- )}
94
- </tbody>
95
- </table>
96
- </div>
97
- );
98
- }
99
-
100
- function SortAscIcon() {
101
- return (
102
- <svg className="h-3.5 w-3.5" aria-hidden="true" viewBox="0 0 16 16" fill="currentColor">
103
- <path d="M8 4l4 6H4l4-6z" />
104
- </svg>
105
- );
106
- }
107
-
108
- function SortDescIcon() {
109
- return (
110
- <svg className="h-3.5 w-3.5" aria-hidden="true" viewBox="0 0 16 16" fill="currentColor">
111
- <path d="M8 12L4 6h8l-4 6z" />
112
- </svg>
113
- );
114
- }
115
-
116
- function SortNeutralIcon() {
117
- return (
118
- <svg className="h-3.5 w-3.5 text-text-tertiary" aria-hidden="true" viewBox="0 0 16 16" fill="currentColor">
119
- <path d="M8 3l3 4H5l3-4zm0 10L5 9h6l-3 4z" />
120
- </svg>
121
- );
122
- }
@@ -1,49 +0,0 @@
1
- /**
2
- * Shared conformance-status color tokens, used by the `/conformance` page summary
3
- * pills and the table itself. Keeping them in one module prevents the two
4
- * surfaces from drifting visually.
5
- *
6
- * Status keys mirror the values used in `spec-conformance.json` items.
7
- */
8
-
9
- export const CONFORMANCE_STATUSES = [
10
- 'DEVIATES',
11
- 'PARTIAL',
12
- 'UNVERIFIABLE',
13
- 'UNDOCUMENTED',
14
- 'CONFORMS',
15
- ] as const;
16
-
17
- export type ConformanceStatus = (typeof CONFORMANCE_STATUSES)[number];
18
-
19
- export const CONFORMANCE_STATUS_DOT: Record<ConformanceStatus, string> = {
20
- DEVIATES: 'bg-[var(--critical)]',
21
- PARTIAL: 'bg-[var(--medium)]',
22
- UNVERIFIABLE: 'bg-accent',
23
- UNDOCUMENTED: 'bg-[var(--neutral)]',
24
- CONFORMS: 'bg-[var(--success)]',
25
- };
26
-
27
- export const CONFORMANCE_STATUS_TEXT: Record<ConformanceStatus, string> = {
28
- DEVIATES: 'text-[var(--critical)]',
29
- PARTIAL: 'text-[var(--medium)]',
30
- UNVERIFIABLE: 'text-accent',
31
- UNDOCUMENTED: 'text-text-secondary',
32
- CONFORMS: 'text-[var(--success)]',
33
- };
34
-
35
- export const CONFORMANCE_STATUS_BADGE: Record<ConformanceStatus, string> = {
36
- DEVIATES: 'bg-[var(--critical)]/18 text-[var(--critical)]',
37
- PARTIAL: 'bg-[var(--medium)]/18 text-[var(--medium)]',
38
- UNVERIFIABLE: 'bg-accent/18 text-accent',
39
- UNDOCUMENTED: 'bg-[var(--neutral)]/18 text-[var(--neutral)]',
40
- CONFORMS: 'bg-[var(--success)]/18 text-[var(--success)]',
41
- };
42
-
43
- export const CONFORMANCE_STATUS_ROW_BG: Record<ConformanceStatus, string> = {
44
- DEVIATES: 'bg-[var(--critical)]/5',
45
- PARTIAL: 'bg-[var(--medium)]/5',
46
- UNVERIFIABLE: 'bg-accent/5',
47
- UNDOCUMENTED: 'bg-surface-1',
48
- CONFORMS: 'bg-[var(--success)]/5',
49
- };
@@ -1,386 +0,0 @@
1
- ---
2
- description: 'Initialize a Solidity audit project: deterministic analysis + protocol overview + system diagram + flow charts + spec conformance, all in one run'
3
- ---
4
-
5
- # Skill: Initialize Audit
6
-
7
- **Recommended model:** Opus (this skill performs all reasoning-heavy pre-review work; switch to Opus before invoking)
8
-
9
- You are setting up a new Solidity audit project with Hex. This single skill replaces the old chain of `/init-audit` → `/generate-overview` → `/generate-diagram` → `/generate-flows` → `/check-spec-conformance`. By the time it finishes, every analysis page on the dashboard has data and every DEVIATES/PARTIAL spec item has been materialized as a Potential card on the issue board.
10
-
11
- It runs in one of two modes, chosen in Phase 1:
12
-
13
- - **Full** — audit the whole scope at one commit (the default).
14
- - **Differential** — audit what changed between a previously audited **base** commit and the **head** commit, plus the flows those changes reach. Hex computes the change set and the impact deterministically (`hex diff` → `.hex/diff.json`); every phase below then narrows to it. Sections marked **(differential)** run only in this mode.
15
-
16
- ## Prerequisites
17
-
18
- - The auditor has cloned or received the client project.
19
- - Node.js and npm are installed.
20
- - Hex CLI is installed (`npm install -g hex-audit`).
21
-
22
- ## Phase 1 — Config + dependency safety
23
-
24
- ### 1.1 Gather information
25
-
26
- Ask the auditor for:
27
-
28
- - **Audit type** — *Full* or *Differential*. Ask this first; the rest branches on it.
29
- - **Project directory path** — where the client project lives (default: current directory).
30
- - **Scope** — glob or explicit list of files in audit scope (e.g., `src/core/**/*.sol`).
31
- - **Commit hash** — the specific commit being audited (default: HEAD).
32
- - **Chain** — target chain (default: ethereum).
33
- - **Documentation URL** — if available.
34
- - **GitHub repo** (optional) — the `owner/repo` the audit's findings sync to (e.g. `nethermind/audit-vaultx`). Pass it to `hex init --github-repo` so `/sync-issues` and `/generate-report` work later. Leave blank if the engagement isn't using GitHub.
35
-
36
- **(differential)** Also ask for:
37
-
38
- - **Base commit** (required) — the commit the previous audit covered.
39
- - **Head commit** — the commit audited now (default: `HEAD`). It must be **checked out**: Hex's analyses read the working tree, while `hex diff` reads both commits from git. If the clone is shallow, `git fetch --unshallow` first.
40
- - **Previous audit** (optional) — the earlier engagement's `.hex/` folder, or its report (PDF or Markdown). Its findings become known issues, and the ones the change touches get a regression check (Phase 5b).
41
-
42
- When a previous `.hex/` folder is given, propose its `config.json` → `project.scope_globs` (or `project.scope`) as the scope and its `project.commit` as the base commit, and confirm both with the auditor.
43
-
44
- ### 1.2 Audit dependencies (BEFORE compiling)
45
-
46
- Build scripts and `npm install` hooks are a primary supply-chain attack vector. Check these **before** running `forge build`, `npm install`, or any compilation command:
47
-
48
- 1. **`package.json` install hooks** — `preinstall`, `postinstall`, `prepare`, `prebuild`, `pretest` scripts that shell out, download from URLs, or touch files outside the project. Cross-reference with npmjs.com advisories.
49
- 2. **Foundry `lib/` submodules** — inspect each `lib/*/foundry.toml` for `ffi = true`, broad `fs_permissions`, or `script` entries.
50
- 3. **Root `foundry.toml`**:
51
- - `ffi = true` → **HIGH RISK** (arbitrary system commands during build/test).
52
- - `fs_permissions` broader than read-only on `./src` or `./out` → flag.
53
- - Profile overrides differing from main profile → flag.
54
- 4. **`remappings.txt`** — verify each target exists in `lib/`; flag shadowed paths, mismatched paths, or hijack vectors (a remap of `@openzeppelin/=lib/malicious-oz/`).
55
- 5. **Suspicious files** — root-level `*.sh`, `*.py`, `Makefile` targets, `.github/` workflows.
56
- 6. **Plaintext secrets** in `.env*` files (private keys, mnemonics, API keys). Do NOT log the values.
57
- 7. **`.vscode/extensions.json`** — flag extension recommendations from unknown publishers.
58
-
59
- **If any build-time threats are found: STOP and warn before compilation.**
60
-
61
- After build safety passes, evaluate Solidity dependencies:
62
-
63
- - Identify well-known libs (OpenZeppelin, Solmate, Solady, PRBMath). Flag outdated versions with known advisories (OZ < 4.9.3, Solmate `SafeTransferLib` missing code-size check, etc.).
64
- - Flag typosquats (`@openzepplin` vs `@openzeppelin`).
65
- - Flag unused dependencies (in `lib/` or `node_modules/` but not imported by scope files).
66
- - Spot-check unknown packages for inline assembly, `selfdestruct`, `delegatecall` to hardcoded addresses.
67
-
68
- ### 1.3 Initialize and analyze
69
-
70
- Run:
71
-
72
- ```bash
73
- npx hex init --project "<path>" --scope "<scope>" --commit <hash> --chain <chain> --docs "<url>" [--github-repo <owner/repo>] \
74
- [--mode diff --base <base-commit> [--previous-audit "<path>"]]
75
- npx hex analyze
76
- ```
77
-
78
- Include `--github-repo` only if the auditor gave one. Include the `--mode diff ...` part only for a differential audit.
79
-
80
- `hex analyze` runs stats → deps → access → state → calls → patterns → constraints in parallel, then `surface` last. If a tool is missing (Slither, forge), the corresponding analysis is skipped — note the limitation and move on.
81
-
82
- **(differential)** `hex analyze` then runs `diff`, which writes:
83
-
84
- - `.hex/diff.json` — changed files; changed entities (functions, modifiers, state variables, events, errors, structs, inheritance) as `added` / `modified` / `removed` / `comments_only`; `storage_layout_changes`; and `impacted` — every function the change reaches, with `depth`, `is_entry_point`, a `reasons` chain (`changed`, `calls`, `modifier`, `reads_state`, `override`, `inherits`) and a confidence.
85
- - `.hex/diff/changes.patch` — the in-scope unified diff.
86
-
87
- The analyses (stats, access, state, ...) still cover the whole scope at head: impacted flows run through unchanged code, and you need it as context. If `diff` failed (usually a commit missing from a shallow clone), stop and tell the auditor how to fetch it. A differential audit without the diff is a full audit under the wrong label.
88
-
89
- ### 1.4 Import prior findings (differential, previous audit given)
90
-
91
- Normalize the previous audit's findings into `.hex/previous-audit/findings.json`:
92
-
93
- ```json
94
- {
95
- "imported_at": "<ISO-8601>",
96
- "base_commit": "<base commit>",
97
- "source_path": "<the path the auditor gave>",
98
- "findings": [
99
- {
100
- "id": "<the prior report's own id, e.g. M-02 or H-007>",
101
- "title": "...",
102
- "severity": "Critical | High | Medium | Low | Info",
103
- "resolution": "Fixed | Mitigated | Acknowledged | Not Fixed | Unresolved (as the prior report states it)",
104
- "status": "<prior board status, when known>",
105
- "description": "...",
106
- "recommendation": "...",
107
- "locations": [{ "file": "src/Vault.sol", "function": "withdraw", "snippet": "<the vulnerable code as the prior report showed it>" }],
108
- "source": "hex | report"
109
- }
110
- ]
111
- }
112
- ```
113
-
114
- - **From a `.hex/` folder:** read its `findings.json` and `tracking.json`. Import every finding whose tracking status is `verified` or `synced`; skip `rejected`, `duplicate` and still-Potential cards. Keep `id`, `title`, `severity`, `resolution`, `description`, `recommendation` and `root_cause.locations` (file + snippet). Add the function name when the snippet makes it clear.
115
- - **From a report (PDF / Markdown):** read it (PDFs in page ranges) and extract every finding: id, title, severity, the status or resolution the report gives, the description, and the affected code. Keep the snippet verbatim; it drives the regression check.
116
-
117
- Do not create board cards here. Prior findings are context; only regressions become cards (Phase 5b).
118
-
119
- ## Phase 2 — Protocol overview
120
-
121
- Read from the output directory (`.hex/`):
122
-
123
- - `config.json` — project name, scope, chain, docs URL.
124
- - `stats.json` — contracts, nSLOC, ERCs, dependencies.
125
- - `deps.json` — contract relationships and clusters.
126
-
127
- Run `npx hex context` to load the full codebase. If `config.json.project.docs_url` is set, fetch and read the documentation.
128
-
129
- Write a 2–3 paragraph overview to `.hex/overview.md` covering:
130
-
131
- 1. **What the protocol does** — purpose, target users, the problem it solves.
132
- 2. **Core mechanism** — deposit/withdraw flows, token economics, governance model.
133
- 3. **Key contracts and their roles** — entry points, state holders, libraries.
134
- 4. **Notable design patterns** — upgradeability, access control, external dependencies, oracle usage.
135
-
136
- Write for an experienced Solidity auditor. Be precise and technical. Reference specific contract names and functions where relevant.
137
-
138
- **(differential)** The overview still describes the protocol as it stands at head. Write a second file, `.hex/diff-overview.md`, which the dashboard's Changes page shows above the change tables. Read `diff.json`, `diff/changes.patch` and `git log --oneline <base>..<head> -- <scope>` (commit messages carry the intent), then cover:
139
-
140
- 1. **What changed and why** — the features, fixes and refactors in this change set, in plain terms, with the contracts and functions involved.
141
- 2. **Removed or replaced behavior** — anything the base had that head no longer does.
142
- 3. **Storage layout** — every entry in `storage_layout_changes`, and whether the contract is deployed behind a proxy (from `patterns.json`). A shifted slot in an upgradeable contract is the first thing an auditor must see.
143
- 4. **Impacted flows** — the entry points in `impacted` (`is_entry_point: true`) grouped into user-level flows (deposit, withdraw, liquidation, ...), and how the change reaches each.
144
-
145
- Format: `# Changes: <base short sha> → <head short sha>`, then `##` sections in that order. Same rules as the overview: descriptive, no findings, no speculation.
146
-
147
- **Do NOT:**
148
-
149
- - List findings or security concerns (this is purely descriptive).
150
- - Speculate about vulnerabilities.
151
- - Include code snippets.
152
- - Add disclaimers about AI limitations.
153
-
154
- **Format:**
155
-
156
- ```markdown
157
- # Protocol Overview: [Name]
158
-
159
- [2-3 paragraphs]
160
-
161
- ## Key Contracts
162
-
163
- | Contract | Type | nSLOC | Role |
164
- | -------- | ---- | ----- | ---- |
165
- | ... | ... | ... | ... |
166
-
167
- ## External Dependencies
168
-
169
- - [Package] v[version] — used for [purpose]
170
-
171
- ## Architecture Notes
172
-
173
- - [Notable design decisions, patterns, or concerns to keep in mind during review]
174
- ```
175
-
176
- ## Phase 3 — System diagram
177
-
178
- Read `.hex/overview.md`, `.hex/patterns.json` (for `UPGRADEABLE`, `CROSS_CHAIN`, `DELEGATECALL`, `protocol_hints`), `.hex/attack-surface.json` (entry-point classification, token interactions, external deps), `.hex/access-control.json` (roles + modifiers).
179
-
180
- Detect the protocol archetype from `patterns.json` (Vault / Lending / Bridge / Governance / AMM / Staking). Multiple may apply.
181
-
182
- Write a Mermaid `graph TD` diagram to `.hex/diagrams/diagram.mmd`. Constraints:
183
-
184
- - **Only in-scope contracts** (per `config.json.project.scope`). Out-of-scope contracts may appear as simplified nodes if in-scope contracts interact with them; otherwise omit.
185
- - Skip interfaces, abstract contracts, and pure libraries.
186
- - **Maximum ~15 nodes per diagram.** If the protocol is larger, split into multiple files (`diagram-core.mmd`, `diagram-governance.mmd`, etc.) grouped by purpose.
187
- - Prefix contract labels with a semantic symbol where applicable:
188
- - 🏦 Vault / ERC-4626, 💰 Token, 🔮 Oracle, 🔒 Timelock/access control, 📦 Storage, ⚡ Flash loan, 🌉 Bridge.
189
- - Define a classDef palette at the bottom of every diagram:
190
- ```
191
- classDef core fill:#a5d8ff,stroke:#1971c2,color:#000
192
- classDef user fill:#b2f2bb,stroke:#2f9e44,color:#000
193
- classDef admin fill:#ff8787,stroke:#c92a2a,color:#000
194
- classDef ext fill:#ffd8a8,stroke:#e8590c,color:#000
195
- classDef proxy fill:#d0bfff,stroke:#7048e8,color:#000,stroke-dasharray:5 5
196
- classDef storage fill:#ffec99,stroke:#f08c00,color:#000
197
- ```
198
- - Apply class by role: core logic → `core`, user-facing → `user`, admin/governance → `admin`, external deps → `ext`, proxy/upgradeable → `proxy`, storage/registry → `storage`.
199
- - Edge labels: type the interaction — `-->|external call|`, `-.->|delegatecall|`, `==>|access-controlled|`, `-.->|reads|`.
200
- - Include a short overview header comment (`%% System architecture for <Project>`) and a visual legend at the bottom showing each classDef with one-line meaning.
201
-
202
- **(differential)** Add a `changed` classDef (`classDef changed stroke:#e8590c,stroke-width:3px`) and apply it to every contract with an entry in `diff.json` `changes` (other than `comments_only`). List it in the legend.
203
-
204
- ## Phase 4 — Flow charts
205
-
206
- Same context as Phase 3, plus `.hex/external-calls.json`.
207
-
208
- **(differential)** Do not draw the archetype flows below. Draw the **impacted flows** instead: group the impacted entry points in `diff.json` (`is_entry_point: true`) into user-level flows, and draw one chart per flow, from the entry point through the changed code. Mark changed steps with the `changed` classDef, and show storage-layout changes as a note on the affected state node. Same file names, shapes and limits as below.
209
-
210
- For each archetype, generate at minimum:
211
-
212
- - **Value Flow** — how tokens/ETH move (deposits, withdrawals, fees, swaps).
213
- - **Permission Flow** — who can do what; role grant/revoke; admin operations.
214
-
215
- Archetype-specific flows (only generate when the archetype is detected):
216
-
217
- - **Vault**: deposit/mint, withdraw/redeem, strategy allocation, fee collection.
218
- - **Lending**: borrow, repay, liquidation (health check → liquidation → seizure → bad debt).
219
- - **Governance**: proposal lifecycle (create → vote → queue → execute), delegation.
220
- - **Bridge**: send (lock/burn → relay → finality → mint/unlock), receive/verify.
221
- - **AMM/DEX**: swap, add liquidity, remove liquidity, fee accrual.
222
- - **Staking**: stake, unstake, claim, compound.
223
- - Add an **upgrade flow** if any upgradeable proxies are detected.
224
-
225
- Write each flow to `.hex/diagrams/flow-<name>.mmd` (e.g., `flow-deposit.mmd`). Constraints per flow:
226
-
227
- - **In-scope contracts only.** Out-of-scope contracts may appear as `ext` nodes when called by in-scope code.
228
- - **Max ~15 nodes per flow.** Split if larger.
229
- - Distinct shapes by semantic role:
230
- - Stadium `id(["Label"])` — entry point, success outcome, or revert
231
- - Rectangle `id["Label"]` — internal step or external call
232
- - Cylinder `id[("Label")]` — state change / storage mutation
233
- - Rhombus `id{"Label"}` — decision / validation
234
- - Use the same classDef palette as the diagram, plus `entry`, `state`, `decision`, `reject`, `success` variants per flow needs.
235
- - **Every decision diamond shows BOTH the success and the revert path** — don't omit failure branches.
236
- - Use plain-English labels (`"Burns user shares"`, not `"_burn(msg.sender, shares)"`).
237
- - Wrap each contract's nodes in a `subgraph` swim-lane.
238
-
239
- ## Phase 5 — Spec conformance
240
-
241
- Read `.hex/config.json` (docs URL, scope, ERCs), `.hex/stats.json` (ERC/EIP usage), `.hex/attack-surface.json` (token interactions).
242
-
243
- **(differential)** Check only what the change can affect: NatSpec, interface and ERC requirements of the changed and impacted functions in `diff.json`, plus any documentation claim about new or changed behavior. Unchanged functions were checked by the previous audit.
244
-
245
- Cross-reference four sources:
246
-
247
- **5.1 External documentation.** Fetch `config.json.project.docs_url`. Extract every behavioral claim ("users can deposit X and receive Y", "fees capped at 10%", "only admin can pause"). For each claim, find the implementing code and verify match.
248
-
249
- **5.2 NatSpec.** For every function with `@notice`/`@dev`/`@param`/`@return`:
250
-
251
- - Does the function actually do what `@notice` says?
252
- - Are `@param` constraints accurate?
253
- - Does it return what `@return` claims?
254
- - Pay extra attention to conditional NatSpec ("reverts if…", "only when…").
255
-
256
- **5.3 Interface conformance.** For every interface the contract implements (explicit `is IFoo` or implicit):
257
-
258
- - All interface functions implemented?
259
- - Behavioral semantics of each function respected?
260
-
261
- **5.4 ERC/EIP compliance.** For each ERC/EIP in `stats.json.erc_eip_usage`:
262
-
263
- - **Fetch the canonical spec** via WebFetch from `https://eips.ethereum.org/EIPS/eip-<number>`. If the fetch fails, note `"spec_fetched": false` and fall back to training knowledge.
264
- - Extract every MUST/SHOULD/MAY requirement into a checklist; verify each against the implementation.
265
-
266
- Known gotchas:
267
-
268
- - **ERC-20**: return values on transfer/approve, zero-amount transfers, approval race.
269
- - **ERC-4626**: rounding direction per spec, preview vs actual, max\* return values.
270
- - **ERC-721**: safeTransferFrom callbacks.
271
- - **ERC-2612**: permit deadline, nonce handling, domain separator chain ID.
272
-
273
- **Weird token compat.** For every contract interacting with ERC-20 tokens (check `attack-surface.json.token_interactions`), classify handling of:
274
-
275
- - Fee-on-transfer (balance-diff accounting vs trusting transfer amount).
276
- - Rebasing (shares vs absolute balances; stale balance caches).
277
- - Blocklist (DoS via blocked recipient in batches/loops; liquidation/withdrawal block).
278
- - Double-entry-point legacy tokens (dedup on contract address).
279
-
280
- ### Output format
281
-
282
- Write `.hex/spec-conformance.json`:
283
-
284
- ```json
285
- {
286
- "checked_at": "<ISO-8601>",
287
- "sources_checked": { "external_docs": true, "natspec": true, "interfaces": true, "erc_eip": ["ERC-20", "ERC-4626"] },
288
- "summary": { "total_checks": N, "conforms": N, "deviates": N, "partial": N, "unverifiable": N, "undocumented": N },
289
- "items": [
290
- {
291
- "id": "SC-001",
292
- "source": "erc_eip" | "natspec" | "interface" | "external_docs",
293
- "spec_text": "Verbatim text or paraphrase of the requirement",
294
- "spec_location": { "type": "eip", "number": 4626, "section": "Specification", "url": "https://eips.ethereum.org/EIPS/eip-4626" },
295
- "status": "CONFORMS" | "DEVIATES" | "PARTIAL" | "UNVERIFIABLE" | "UNDOCUMENTED",
296
- "finding": "Plain-English explanation of what the code does vs what the spec demands.",
297
- "code_location": { "file": "src/Vault.sol", "line_start": 120, "line_end": 145 },
298
- "severity_hint": "Low",
299
- "confidence": "high"
300
- }
301
- ]
302
- }
303
- ```
304
-
305
- The `finding` text becomes a board card's description when the item is materialized (Phase 6) and can be synced to the client's report, so write it to the same report-facing standard as a `/write-finding` finding: flat prose, no banned words / AI giveaways, and specifically **no source line numbers** ("line 56"), **no cross-references** to other items by id, and **no PoC mentions**. If code is needed to illustrate the deviation, embed a minimal fenced ```` ```solidity ```` block in the `finding` and refer to it by function/variable name. The precise line range stays in `code_location` for internal navigation only — do not transcribe it into the `finding` prose.
306
-
307
- Also write a human-readable `.hex/spec-conformance.md` rendering the same data grouped by status (DEVIATES first, CONFORMS last).
308
-
309
- ## Phase 6 — Materialize conformance items onto the board
310
-
311
- For every item in `spec-conformance.json.items` with `status` of `DEVIATES` or `PARTIAL`, create a board card via the CLI — it allocates a uniform `H-NNN` id, materializes the full finding (description, code location) from the spec item by `source_ref`, and writes the tracking entry. Never hand-edit `tracking.json`.
312
-
313
- ```bash
314
- npx hex issue new --source conformance --source-ref "<spec-item-id, e.g. SC-001>" \
315
- --title "<spec-item.finding's first sentence, ~80 chars>" \
316
- --severity "<spec-item.severity_hint, default Info>"
317
- ```
318
-
319
- `--source-ref` is the spec item's own id (e.g. `SC-001`) — Hex keeps that as the back-reference; the board card itself gets the uniform `H-NNN`. These appear on the Issues board as Potential cards immediately; the auditor validates them later with `/validate-finding <id>` (or `/validate-all-findings`).
320
-
321
- **Idempotency:** before creating, check whether a tracking entry already has this `source_ref` (re-running `/init-audit` shouldn't double-create). Skip items whose `source_ref` is already present.
322
-
323
- ## Phase 5b — Regression check of prior findings (differential, previous audit given)
324
-
325
- For each finding in `.hex/previous-audit/findings.json`, decide what the change did to it:
326
-
327
- | Status | Meaning |
328
- |---|---|
329
- | `fixed_unchanged` | The prior finding was fixed and the change does not touch that code. |
330
- | `fix_touched_ok` | The change touches the fixed code, and the fix still holds. |
331
- | `regressed` | The prior finding was fixed (or mitigated), and the change re-introduces it or undoes the fix. |
332
- | `acknowledged_still_present` | The prior finding was left open (acknowledged / not fixed) and is still present. A known issue. |
333
- | `code_removed` | The affected code no longer exists. |
334
-
335
- Do a deterministic first pass, then judge: a prior `snippet` that appears verbatim again in the head file is a strong regression signal for a finding marked Fixed; a finding whose file and function do not appear in `diff.json` `changes` is `fixed_unchanged` (or `acknowledged_still_present`) without further reading. Read the code for everything else.
336
-
337
- Write `.hex/previous-audit/review.json`:
338
-
339
- ```json
340
- {
341
- "reviewed_at": "<ISO-8601>",
342
- "items": [
343
- { "id": "M-02", "title": "...", "severity": "Medium", "status": "regressed", "reasoning": "<one or two sentences>", "issue_id": "H-012" }
344
- ]
345
- }
346
- ```
347
-
348
- Put **only `regressed` findings** on the board, through the CLI, which materializes the card from the prior record:
349
-
350
- ```bash
351
- npx hex issue new --source prior-audit --source-ref "<prior id>" --title "<title>" --severity <Severity>
352
- ```
353
-
354
- Store the printed `H-NNN` as that item's `issue_id`. Before creating, skip any prior id that already has a tracking entry with `source: prior-audit` (re-running this skill must not double-create). Then rewrite the card's description for this code with `npx hex issue patch <id> --description-file ...`: the prior text describes the base commit, and the report needs the bug as it exists at head. Acknowledged findings are **not** carded: the client already knows about them, and `/ai-audit` skips matches to them.
355
-
356
- ## Phase 7 — Report and auto-launch the dashboard
357
-
358
- Summarize:
359
-
360
- - Files / contracts in scope, total nSLOC.
361
- - Number of external/public functions, state variables.
362
- - Number of conformance DEVIATES/PARTIAL items materialized to the board.
363
- - Any warnings or limitations (missing tools, failed coverage, etc.).
364
- - **(differential)** Base → head, files changed (+/- lines), functions added / modified / removed, impacted entry points, storage-layout changes, and the prior-findings tally from `review.json` (regressed / still present / fixed). Suggest `/ai-audit` next: in a differential audit it scans only the changed and impacted files and briefs its agents on the change.
365
-
366
- Then launch the dashboard in the background so the auditor's browser opens automatically. Pass `--project` with the **absolute** project directory (so the dashboard reads the right `.hex/` regardless of the current working directory), and run with `run_in_background: true` so the skill returns control while Next.js keeps serving:
367
-
368
- ```bash
369
- npx hex dashboard --project "<absolute project dir>"
370
- ```
371
-
372
- Print a one-line confirmation after starting it: `Dashboard starting at http://localhost:3000 (live-refreshing as .hex/ changes).`
373
-
374
- Do NOT run the command in the foreground — that would block this skill's return. The dashboard's auto-open already handles the browser; you just need to launch the process and return.
375
-
376
- ## Outputs (recap)
377
-
378
- After this skill finishes, the following exist in `.hex/`:
379
-
380
- - `config.json`, `stats.json`, `deps.json`, `access-control.json`, `state-vars.json`, `external-calls.json`, `patterns.json`, `constraints.json`, `attack-surface.json`
381
- - `overview.md`
382
- - `diagrams/diagram.mmd` (+ split diagrams if needed)
383
- - `diagrams/flow-*.mmd`
384
- - `spec-conformance.json`, `spec-conformance.md`
385
- - `tracking.json` — populated with conformance DEVIATES/PARTIAL items as Potential issues
386
- - **(differential)** `diff.json`, `diff/changes.patch`, `diff-overview.md`, and with a previous audit `previous-audit/findings.json` and `previous-audit/review.json` (regressions carded with `source: prior-audit`)