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
@@ -0,0 +1,50 @@
1
+ # Synthesizer
2
+
3
+ You turn the independent readers' drafts into **one** consistent protocol model. You are the only agent that sees every draft, so your job is integration: merge duplicates, reconcile conflicting framings by checking the code, and fill cross-cluster gaps (a flow that starts in one cluster and ends in another).
4
+
5
+ **Inputs:** `.hex/model/drafts/*.json` (readers; docs and standards drafts are for the conformance checker, so read docs claims only for vocabulary), `.hex/facts.json`, `.hex/stats.json`, **(differential)** `.hex/diff.json` and `.hex/diff/changes.patch`.
6
+ **Exact relationships:** `npx --no-install hex facts query …` (function, callers, callees, readers, writers, reach, layout, linearization, entry-points).
7
+
8
+ ## Write `.hex/model/protocol.json`
9
+
10
+ Every item carries `claim_id` (keep the reader's id when one claim maps to it; mint `S-NNN` for new ones), `evidence` (`[{file, line_start, line_end}]`) and `status: "unverified"` (skeptics verify later). Function references are **exact facts ids** (`Vault.withdraw(uint256)`); `npx --no-install hex model validate` rejects unknown ids.
11
+
12
+ ```json
13
+ {
14
+ "generated_at": "<ISO>",
15
+ "summary": "One paragraph: what the protocol does and for whom.",
16
+ "actors": [{ "claim_id": "", "id": "owner", "name": "Owner", "kind": "user|admin|keeper|guardian|external_protocol|other", "trust": "trusted|semi_trusted|untrusted", "powers": ["<fn id>"], "description": "", "evidence": [], "status": "unverified" }],
17
+ "assets": [{ "claim_id": "", "id": "usdc", "name": "USDC", "kind": "erc20|native|nft|shares|debt|other", "token": "", "held_by": ["Vault"], "moved_by": ["<fn id>"], "description": "", "evidence": [], "status": "unverified" }],
18
+ "privileges": [{ "claim_id": "", "actor": "<actor id>", "function": "<fn id>", "effect": "", "worst_case": "", "timelock": "", "evidence": [], "status": "unverified" }],
19
+ "trust_assumptions": [{ "claim_id": "", "text": "", "evidence": [], "status": "unverified" }],
20
+ "external_dependencies": [{ "claim_id": "", "id": "", "name": "", "kind": "oracle|dex|bridge|lending|token|other", "used_by": ["<fn id>"], "failure_modes": [""], "evidence": [], "status": "unverified" }],
21
+ "state_machines": [{ "claim_id": "", "id": "", "entity": "", "states": [""], "transitions": [{ "from": "", "to": "", "function": "<fn id>", "guard": "" }], "evidence": [], "status": "unverified" }],
22
+ "accounting": [{ "claim_id": "", "id": "", "name": "", "equation": "", "terms": [{ "term": "", "updated_by": [{ "function": "<fn id>", "direction": "increase|decrease|set" }] }], "evidence": [], "status": "unverified" }],
23
+ "risky_flows": [{ "claim_id": "", "id": "", "name": "", "entry": "<fn id>", "steps": [{ "actor": "", "contract": "", "function": "", "kind": "call|callback|oracle|transfer|state", "note": "" }], "risk": "", "evidence": [], "status": "unverified" }]
24
+ }
25
+ ```
26
+
27
+ ## Write `.hex/model/invariants.json`
28
+
29
+ From the readers' `invariant_candidates` plus what the accounting and state machines imply. Deduplicate; make each one precise and testable.
30
+
31
+ ```json
32
+ {
33
+ "updated_at": "<ISO>",
34
+ "invariants": [
35
+ { "id": "INV-001", "statement": "", "kind": "accounting|access|bound|monotonic|state-machine|liveness|economic", "scope": { "contracts": [""], "functions": ["<fn id>"] }, "evidence": [], "on_chain_enforced": false, "status": "proposed" }
36
+ ]
37
+ }
38
+ ```
39
+
40
+ All invariants start `proposed`; the auditor accepts them.
41
+
42
+ ## Write `.hex/overview.md`
43
+
44
+ `# Protocol Overview: <Name>` + 2–3 paragraphs (what it does, the core mechanism, the key contracts and their roles, notable patterns: upgradeability, oracles, external dependencies) + `## Key Contracts` table (Contract | Type | nSLOC | Role, nSLOC from `stats.json`) + `## External Dependencies` + `## Architecture Notes`. Descriptive only: no findings, no speculation, no code snippets, no AI disclaimers.
45
+
46
+ ## (differential) Write `.hex/diff-overview.md`
47
+
48
+ `# Changes: <base short> → <head short>`, then sections: **What changed and why** (from the diff and `git log --oneline <base>..<head> -- <scope>`), **Removed or replaced behavior**, **Storage layout** (every `storage_layout_changes` entry, and whether the contract sits behind a proxy), **Impacted flows** (impacted entry points grouped into user flows, and how the change reaches each). Descriptive, no findings.
49
+
50
+ Write leads you notice to the relevant contract with `npx --no-install hex note lead <Contract> --text "…" --source init-audit --source-ref <claim_id>`. Do not create cards.
@@ -0,0 +1,62 @@
1
+ ---
2
+ description: 'Pre-validate new machine-generated cards (AI audit, AuditAgent, invariant violations) in parallel: PoC or refutation per card; conclusive cases move automatically, the rest wait for the auditor'
3
+ ---
4
+
5
+ # Skill: Pre-validate
6
+
7
+ Machine-generated findings favour recall over precision. This skill puts every new `unverified` card through an independent validation by background agents, so the auditor triages conclusions ("6 reproduced, 5 refuted, 3 need you"), not raw claims. `/ai-audit` and `/ingest-aa-report` call it at the end; the auditor can also run it directly (`/prevalidate`, or `/prevalidate H-012 H-015`).
8
+
9
+ Use `npx --no-install hex …` for every Hex command.
10
+
11
+ ## What may move on its own
12
+
13
+ The CLI enforces this; agents cannot override it:
14
+
15
+ - **Reproduced → Verified** only when the PoC **passes** and **asserts the impact**, and the finding **passes the reality gate** (it is true *and* a security issue, not by design, not self-inflicted, not out of scope).
16
+ - **Refuted → Rejected** only when **two independent refuter agents** both cite the code that blocks the attack.
17
+ - Everything else stays in **Potential** with its verdict (`uncertain`) and memo. The auditor decides.
18
+
19
+ Every auto-move is marked on the card and can be reverted from the board (or `npx --no-install hex issue revert-auto <id>`).
20
+
21
+ ## Step 1 — Pick the cards
22
+
23
+ Arguments, if given; otherwise every tracking entry with `status: "unverified"` and no `validation` yet (`npx --no-install hex issue show <id>` shows it). Skip cards in Duplicate or Rejected. If there are none, say so and stop.
24
+
25
+ ## Step 2 — Validate in parallel
26
+
27
+ Spawn one **validator** agent per card as background Agent calls, **at most 6 at a time** (start the next batch as earlier ones finish). Give each validator this brief, with the card id substituted:
28
+
29
+ > Validate card **{id}** in this Hex project. Read it with `npx --no-install hex issue show {id}`, the code it points to, and exact facts via `npx --no-install hex facts query …`. Also read the triage rules (`npx --no-install hex rules list`): a finding whose whole impact depends on a rule is not security-relevant.
30
+ >
31
+ > 1. **Correctness.** Trace the claimed path in the code. Find every guard, modifier, check and invariant that could stop it.
32
+ > 2. **Reality gate.** Is it security-relevant? Not by design, not a missing feature, not only self-inflicted by a trusted role, not defense-in-depth noise.
33
+ > 3. **PoC.** If it is correct and security-relevant, write a minimal PoC following the project's own test setup in `test/hex-pocs/{id}_<short>.t.sol` (Foundry; `.test.ts` for Hardhat). Assert the **impact** (funds lost, invariant broken, access gained), not just that a call succeeds, and log the economic impact. Run it (`forge test --match-path <file> -vv`) and iterate until it passes or you are convinced it cannot.
34
+ > 4. Write the memo to `.hex/validations/{id}_memo.md` (sections: Claim, Analysis, Protections evaluated, Reality gate, PoC, Verdict).
35
+ > 5. Record the result. Use exactly one of:
36
+ > - `npx --no-install hex issue validation {id} --verdict reproduced --by agent --poc <file> --poc-status passing --reality-gate --memo .hex/validations/{id}_memo.md --auto-move`
37
+ > - `npx --no-install hex issue validation {id} --verdict refuted --by agent --memo .hex/validations/{id}_memo.md` (a single refutation never moves the card)
38
+ > - `npx --no-install hex issue validation {id} --verdict uncertain --by agent --memo .hex/validations/{id}_memo.md`
39
+ >
40
+ > Do not move the card yourself and do not edit .hex JSON by hand.
41
+
42
+ ## Step 3 — Second refuter
43
+
44
+ For every card a validator **refuted**, spawn a second, **independent** refuter that does not see the first memo: the same brief, plus "Look for the strongest reason this finding is NOT real; cite the exact code." If it also refutes, record both:
45
+
46
+ ```bash
47
+ npx --no-install hex issue validation <id> --verdict refuted --by agent --refuters 2 --memo .hex/validations/<id>_memo.md --auto-move
48
+ ```
49
+
50
+ (Append the second refuter's reasoning to the memo first.) If the two disagree, record `--verdict uncertain` with both arguments in the memo.
51
+
52
+ ## Step 4 — Summary
53
+
54
+ ```
55
+ Pre-validation — N cards
56
+ - R reproduced → Verified (auto): H-…, H-…
57
+ - X refuted → Rejected (auto, 2 refuters): H-…
58
+ - U uncertain → still in Potential: H-…
59
+ Review the auto-moves on the Board; revert any with one click.
60
+ ```
61
+
62
+ Then, for each uncertain card, one line on what it needs from the auditor.
@@ -4,7 +4,6 @@ description: 'Two-way sync between local Hex findings and GitHub Issues — GitH
4
4
 
5
5
  # Skill: Sync Issues
6
6
 
7
- **Recommended model:** Sonnet
8
7
 
9
8
  Hex's GitHub Issues integration. Hex never authenticates with GitHub — you authenticate once via `gh auth login` and this skill drives the `gh` CLI. One invocation runs both directions.
10
9
 
@@ -66,15 +65,15 @@ Extract severity from the title, and the four body fields. If a body is **blatan
66
65
  **1c. Reconcile by issue number `#N`:**
67
66
  - **A local finding already records `github.issue_number === N`** → it's the same issue; pull GitHub's content into it:
68
67
  ```bash
69
- npx hex issue sync-set <local-H-id> --issue-number N --issue-url <url> --state <open|closed> \
68
+ npx --no-install hex issue sync-set <local-H-id> --issue-number N --issue-url <url> --state <open|closed> \
70
69
  --title "<title-without-[Severity]>" --severity <Severity> \
71
70
  --description-file /tmp/N_desc.md --recommendation-file /tmp/N_reco.md \
72
71
  --resolution "<Status>" --update-from-client-file /tmp/N_update.md
73
72
  ```
74
73
  - **No local finding has `#N`** (a teammate's hand-added issue, or one created outside Hex) → create a local finding for it, then sync-set:
75
74
  ```bash
76
- ID=$(npx hex issue new --source github --source-ref N --title "<title>" --severity <Severity>)
77
- npx hex issue sync-set "$ID" --issue-number N --issue-url <url> --state <open|closed> \
75
+ ID=$(npx --no-install hex issue new --source github --source-ref N --title "<title>" --severity <Severity>)
76
+ npx --no-install hex issue sync-set "$ID" --issue-number N --issue-url <url> --state <open|closed> \
78
77
  --description-file /tmp/N_desc.md --recommendation-file /tmp/N_reco.md \
79
78
  --resolution "<Status>" --update-from-client-file /tmp/N_update.md
80
79
  ```
@@ -83,33 +82,20 @@ Either way the card lands in the **Synced** column, locked. Reconcile strictly b
83
82
 
84
83
  ## Phase 1.5 — Dedup before push (GitHub is canonical)
85
84
 
86
- Before pushing, guard against filing a finding that is already on GitHub (e.g. a teammate created it by hand, and you pulled it into Synced in Phase 1). For each **verified** local finding that has no `github.issue_number` yet, semantically compare it against every **synced** finding on these axes:
87
-
88
- | Signal | Compare |
89
- |---|---|
90
- | **contract** (boolean) | affected contract name |
91
- | **function** (boolean) | affected function name |
92
- | **root_cause** (`same`/`overlapping`/`different`) | the technical mechanism |
93
- | **attack_vector** (`same`/`overlapping`/`different`) | what an attacker actually does |
94
-
95
- A match is at least one of: `root_cause = same` AND `function = true`; or `root_cause = same` AND `contract = true` AND `attack_vector = same`; or `root_cause = overlapping` AND `function = true` AND `attack_vector = same`.
96
-
97
- On match — the synced (on-GitHub) finding is canonical, so the local verified copy becomes the duplicate. Do **not** push it:
85
+ Before pushing, guard against filing a finding that is already on GitHub (e.g. a teammate created it by hand, and you pulled it into Synced in Phase 1). For each **verified** local finding with no `github.issue_number` yet:
98
86
 
99
87
  ```bash
100
- npx hex issue move <verified-H-id> --to duplicate --duplicate-of <synced-H-id>
88
+ npx --no-install hex issue dedup <verified-H-id>
101
89
  ```
102
90
 
103
- Then append to `<output_dir>/comparison.json` under `duplicates` (the board renders the chip + signals from this):
91
+ It lists candidates touching the same exact functions first and prints the match rules (one engine for every source). Judge only **synced** candidates here. On a match, the synced (on-GitHub) finding is canonical, so the local verified copy becomes the duplicate and is **not** pushed:
104
92
 
105
- ```json
106
- { "ai_finding": "<verified-H-id>", "matches": "<synced-H-id>", "confidence": "high|medium|low",
107
- "match_signals": { "contract": true, "function": true, "root_cause": "same", "attack_vector": "same" },
108
- "reasoning": "<one sentence>" }
93
+ ```bash
94
+ npx --no-install hex issue mark-duplicate <verified-H-id> --of <synced-H-id> \
95
+ --root-cause <same|overlapping|different> --attack-vector <same|overlapping|different> \
96
+ [--same-contract] [--same-function] --reasoning "<one sentence>"
109
97
  ```
110
98
 
111
- If `comparison.json` doesn't exist, create it with `{ "duplicates": [], "novel": [], "rejected": [] }`.
112
-
113
99
  ## Phase 2 — Push (verified local findings → GitHub)
114
100
 
115
101
  Skip if `push_enabled` is false.
@@ -137,7 +123,7 @@ Stamp labels **only at creation** — never edit labels on an issue that already
137
123
  Parse the returned URL for `#N`, then lock it into Synced and record the number:
138
124
 
139
125
  ```bash
140
- npx hex issue sync-set <H-id> --issue-number N --issue-url <url> --state open
126
+ npx --no-install hex issue sync-set <H-id> --issue-number N --issue-url <url> --state open
141
127
  ```
142
128
 
143
129
  From now on the finding is identified by `#N`; the next pull matches it by number, so it never duplicates.
@@ -4,12 +4,12 @@ description: "Walk every Potential issue on the board and validate them one by o
4
4
 
5
5
  # Skill: Validate All Findings
6
6
 
7
- **Recommended model:** Opus
8
-
9
7
  Runs `/validate-finding` over every issue currently in the **Potential** column, one at a time, so the auditor can clear the backlog in a single pass without naming each id.
10
8
 
11
9
  Each issue gets `/validate-finding`'s full two-axis verdict — correctness **and** the Step-2.5 security-relevance gate. **`auditagent` / `ai-audit` / `github` findings skew recall-over-precision, so the realism gate is mandatory for them**; `manual` / `conformance` items already passed an auditor's eye and can lean lighter.
12
10
 
11
+ **Machine-generated cards first go through `/prevalidate`.** If the Potential column holds `unverified` cards (AI audit, AuditAgent, invariant) that have no `validation` yet, offer to run `/prevalidate` on them first: it validates them in parallel with PoCs and moves the conclusive ones, so this interactive pass only sees what really needs the auditor. Cards that already carry an agent verdict show it; start from that memo (`.hex/validations/<id>_memo.md`) instead of from scratch.
12
+
13
13
  ## Step 1 — Build the work list
14
14
 
15
15
  Read `<output_dir>/tracking.json`. The Potential column is every entry whose `status` is `pending_validation` or `unverified`. Collect their ids in a stable order: severity (Critical → High → Medium → Low → Info), then id. Call this list `POTENTIAL` with size `N`.
@@ -4,8 +4,6 @@ description: "Validate any potential finding on the board (manual / ai-audit / a
4
4
 
5
5
  # Skill: Validate Finding
6
6
 
7
- **Recommended model:** Opus
8
-
9
7
  ## What this skill does
10
8
 
11
9
  Takes a single potential issue from the dashboard's Issues board and runs an independent validation pass on it. Source-agnostic — the issue can come from any of:
@@ -46,8 +44,10 @@ Once the issue is resolved, read:
46
44
  - `prior-audit` → `<output_dir>/previous-audit/findings.json` (the prior finding) and `previous-audit/review.json` (why it was judged a regression).
47
45
  - `conformance` → `<output_dir>/spec-conformance.json` (the matching `items[*]` entry).
48
46
  - `github` → `<output_dir>/external/github/findings.json` (the matching entry).
49
- - `<output_dir>/state-vars.json`, `<output_dir>/access-control.json`, `<output_dir>/external-calls.json` for cross-referenced facts.
50
- - The affected contract source via `npx hex context --target <affected_contract>`.
47
+ - The affected source files themselves (read them; do not rely on summaries).
48
+ - Exact relationships from the compiler facts: `npx --no-install hex facts query function|callers|callees|readers|writers|reach <ref>` (who can reach the vulnerable code, who else writes the state it depends on).
49
+ - The protocol model (`.hex/model/protocol.json`): trust assumptions and privileges, which decide many reality-gate calls.
50
+ - The triage rules: `npx --no-install hex rules list`. A finding whose whole impact depends on a rule (trusted role, out-of-scope token type, known issue) is not security-relevant.
51
51
 
52
52
  ## Validation pass
53
53
 
@@ -96,17 +96,17 @@ Combine the two axes — correctness (Step 2) and security relevance (Step 2.5):
96
96
 
97
97
  **Verified — true and security-relevant:**
98
98
 
99
- 1. Use **AskUserQuestion** to ask:
100
- > The finding appears **VALID and security-relevant**. How would you like to proceed?
101
- >
102
- > 1. Generate a full PoC test, then promote to Verified.
103
- > 2. Accept with rational verification only — validation memo, no PoC.
104
- >
105
- > Reply **1** or **2**.
99
+ 1. **Write a PoC. This is the default.** Follow the `generate-poc` flow: read the project's test setup, write `test/hex-pocs/<id>_<name>.t.sol` (or `.test.ts`), assert the **impact**, run it, and iterate until it passes. The PoC is what fix review re-runs later to prove the fix.
106
100
 
107
- 2. **If PoC chosen:** invoke the `generate-poc` skill flow (read the project test setup, write the PoC, run and iterate until it passes). Note the test path, e.g. `test/hex-pocs/<id>_<name>.t.sol`.
101
+ 2. **Memo-only is the exception.** Skip the PoC only when one cannot reasonably exist (an off-chain or governance-process issue, a pure spec deviation with no exploit, an Info-level code-quality finding), and say why in the memo.
108
102
 
109
- 3. **If memo-only chosen:** no PoC file.
103
+ 3. **Record the result on the card:**
104
+ ```bash
105
+ npx --no-install hex issue validation <id> --verdict reproduced --by auditor \
106
+ --poc test/hex-pocs/<id>_<name>.t.sol --poc-status passing --memo .hex/validations/<id>_memo.md
107
+ # memo-only:
108
+ npx --no-install hex issue validation <id> --verdict valid_no_poc --by auditor --memo .hex/validations/<id>_memo.md
109
+ ```
110
110
 
111
111
  4. **Calibrate severity — don't inherit it.** The source's severity (especially AuditAgent's) is a *hypothesis*, not authoritative. Re-derive it from realistic impact × likelihood; many technically-true findings collapse to Info. A finding whose worst case is self-inflicted or chain-conditional must say so and re-rate accordingly.
112
112
 
@@ -114,17 +114,17 @@ Combine the two axes — correctness (Step 2) and security relevance (Step 2.5):
114
114
 
115
115
  ```bash
116
116
  # Land the editable fields (materializes a finding for conformance/auditagent/github ids):
117
- npx hex issue patch <id> \
117
+ npx --no-install hex issue patch <id> \
118
118
  --severity <Severity> \
119
119
  --description-file <output_dir>/validations/<id>_memo.md \
120
120
  --recommendation-file /tmp/<id>_reco.md
121
121
  # Promote to Verified:
122
- npx hex issue move <id> --to verified
122
+ npx --no-install hex issue move <id> --to verified
123
123
  ```
124
124
 
125
125
  For a memo-only verdict, the same two commands apply (the PoC fields just stay unset). For `--description-file`, you may pass either the memo or a dedicated description file; prefer a clean description file if the memo is long.
126
126
 
127
- Any description you write must be **structured, readable prose** (no markdown headings), not a single dense block. Split it into short paragraphs that separate how the code is supposed to work (expected behavior / the spec), what is wrong (the flaw), and the impact, and include a fenced ```` ```solidity ```` block of the offending code. Do not introduce paragraphs with bold section labels (`**Summary**:`/`**Impact**:`/`**Details**:`/`**Affected code**:`) — the separation is paragraph breaks, not headers. **Backtick every Solidity identifier**, writing functions as `` `functionName(...)` `` with literal `(...)` and contracts/variables/constants in plain backticks; never leave a bare identifier in the prose. Keep each paragraph tight (no padding), and add a 1–2 sentence hedged recommendation. This matches the finding template used by the dashboard copy and the GitHub issue body. If the affected files are missing or wrong, set them with `--file` (repeatable) rather than narrating them in the description: `npx hex issue patch <id> --file src/Foo.sol [--file src/Bar.sol]`.
127
+ Any description you write must be **structured, readable prose** (no markdown headings), not a single dense block. Split it into short paragraphs that separate how the code is supposed to work (expected behavior / the spec), what is wrong (the flaw), and the impact, and include a fenced ```` ```solidity ```` block of the offending code. Do not introduce paragraphs with bold section labels (`**Summary**:`/`**Impact**:`/`**Details**:`/`**Affected code**:`) — the separation is paragraph breaks, not headers. **Backtick every Solidity identifier**, writing functions as `` `functionName(...)` `` with literal `(...)` and contracts/variables/constants in plain backticks; never leave a bare identifier in the prose. Keep each paragraph tight (no padding), and add a 1–2 sentence hedged recommendation. This matches the finding template used by the dashboard copy and the GitHub issue body. If the affected files are missing or wrong, set them with `--file` (repeatable) rather than narrating them in the description: `npx --no-install hex issue patch <id> --file src/Foo.sol [--file src/Bar.sol]`.
128
128
 
129
129
  **A conformance-sourced (or auditagent/github) finding must be rewritten to the exact same standard as a manual `/write-finding` finding** — do not pass the raw source text through. AuditAgent findings in particular arrive as one long unformatted paragraph; reshape them into the structured, backticked, snippet-bearing form above. Specifically, the prose you land must obey the report-facing content rules:
130
130
  - **Structure + identifiers:** short expected/flaw/impact paragraphs, a ```solidity snippet, every identifier backticked and functions as `` `name(...)` `` (as above).
@@ -142,20 +142,21 @@ Combine the two axes — correctness (Step 2) and security relevance (Step 2.5):
142
142
  >
143
143
  > Would you like to change the severity? Reply with the new severity (Critical / High / Medium / Low / Info), or **no** to keep it.
144
144
 
145
- 7. If the user provides a new severity, run `npx hex issue patch <id> --severity <NewSeverity>`.
145
+ 7. If the user provides a new severity, run `npx --no-install hex issue patch <id> --severity <NewSeverity>`.
146
146
 
147
147
  **Rejected — true but not a security issue (by-design / informational):**
148
148
 
149
149
  The claim is correct, but Step 2.5 says it isn't a vuln worth reporting (self-inflicted, design decision, missing feature, defense-in-depth noise). This is **not** the same as "incorrect" — give it its own disposition so it's distinguishable from a false positive and AuditAgent gets honest feedback.
150
150
 
151
- 1. Write the memo with `Disposition: by-design` (or `informational`) and the Step-2.5 reasoning.
152
- 2. Mark the disposition and move it:
151
+ 1. Write the memo with `Disposition: by-design` (or `informational`) and the Step-2.5 reasoning, and record it: `npx --no-install hex issue validation <id> --verdict refuted --by auditor --memo .hex/validations/<id>_memo.md`.
152
+ 2. **Propose a triage rule** when the reason is general (a trusted role, an out-of-scope token type, a deliberate design choice), so AI runs stop raising the same class. Ask the auditor once, with AskUserQuestion: "Add a triage rule: *<one sentence>*?". On yes: `npx --no-install hex rules add --kind <trusted_role|out_of_scope|by_design|known_issue> --text "<sentence>" --from <id>`.
153
+ 3. Mark the disposition and move it:
153
154
  ```bash
154
- npx hex issue patch <id> --resolution Acknowledged
155
- npx hex issue move <id> --to rejected
155
+ npx --no-install hex issue patch <id> --resolution Acknowledged
156
+ npx --no-install hex issue move <id> --to rejected
156
157
  ```
157
158
  `Acknowledged` on a Rejected card means "AA was right, but it's by-design / not a security issue" — the board shows a **By-design** chip. (A Rejected card with *no* resolution = factually incorrect; see below.)
158
- 3. Do NOT write a finding body or carry it into the report.
159
+ 4. Do NOT write a finding body or carry it into the report.
159
160
 
160
161
  **Rejected — incorrect (false positive):**
161
162
 
@@ -164,13 +165,13 @@ The claim is factually wrong. Explain why:
164
165
  - Are the preconditions impossible? Why?
165
166
  - Is the impact assessment wrong? What actually happens?
166
167
 
167
- Move it to the Rejected column with **no** resolution (the board shows an **Invalid** chip): `npx hex issue move <id> --to rejected`. Do NOT write a finding body — the memo records the reasoning.
168
+ Record and move it with **no** resolution (the board shows an **Invalid** chip): `npx --no-install hex issue validation <id> --verdict refuted --by auditor --memo .hex/validations/<id>_memo.md`, then `npx --no-install hex issue move <id> --to rejected`. Do NOT write a finding body — the memo records the reasoning.
168
169
 
169
170
  **Uncertain:**
170
171
 
171
172
  1. List specific questions that need manual investigation.
172
173
  2. State what would confirm or deny the issue.
173
- 3. Leave the column as-is (no `hex issue move`). Record the open questions on the card: `npx hex issue patch <id> --notes "<open questions>"`.
174
+ 3. Leave the column as-is (no `hex issue move`). Record it: `npx --no-install hex issue validation <id> --verdict uncertain --by auditor --memo .hex/validations/<id>_memo.md` and the open questions: `npx --no-install hex issue patch <id> --notes "<open questions>"`.
174
175
 
175
176
  ## Output: validation memo
176
177
 
@@ -4,7 +4,6 @@ description: "Write a manual issue as a Potential card on the board (pending val
4
4
 
5
5
  # Skill: Write Finding
6
6
 
7
- **Recommended model:** Sonnet
8
7
 
9
8
  This skill records a manual issue that the auditor has spotted during review. The issue lands on the dashboard's Issues board as a **Potential** card with `status: "pending_validation"` and `source: "manual"`. The auditor promotes it to Verified later (via drag-drop on the board, or by running `/validate-finding <id>` which produces a validation memo and optional PoC).
10
9
 
@@ -17,11 +16,11 @@ Read:
17
16
 
18
17
  ## Step 0: Duplicate gate
19
18
 
20
- Scan `findings.json` and `tracking.json` for any existing entry that covers the same vulnerability (same affected contract/function, same or overlapping root cause). If a match is found, warn the auditor:
19
+ After filling the card (Actions steps 1 and 2), run `npx --no-install hex issue dedup <id>`: it finds the exact functions from the description's code block and backticked names, lists existing cards on those functions, and prints the match rules. Run it on the filled card; on an empty one it finds no functions and misses every duplicate. If a candidate matches under those rules, warn the auditor:
21
20
 
22
21
  > "This appears to duplicate `<H-NNN>`: \<title\>. Proceed anyway?"
23
22
 
24
- Only continue if confirmed.
23
+ If they say it is a duplicate, record it with `npx --no-install hex issue mark-duplicate <id> --of <H-NNN> …` (signals as the rules describe) instead of filling in the fields. Otherwise continue.
25
24
 
26
25
  ## Severity Guide
27
26
 
@@ -133,17 +132,19 @@ Persist through the `hex issue` CLI — never hand-edit `findings.json` or `trac
133
132
 
134
133
  1. **Create the issue** — pass `--file` once per affected file so the **File(s)** line is populated (repeatable). Do **not** narrate the affected files in the description instead:
135
134
  ```bash
136
- npx hex issue new --source manual --title "<concise title>" --severity <Severity> \
135
+ npx --no-install hex issue new --source manual --title "<concise title>" --severity <Severity> \
137
136
  --file src/Foo.sol [--file src/Bar.sol]
138
137
  ```
139
138
  This prints the allocated id (e.g. `H-007`). Capture it.
140
139
 
141
140
  2. **Fill the fields** (write the description and recommendation to temp files first, to preserve newlines):
142
141
  ```bash
143
- npx hex issue patch <id> --description-file /tmp/<id>_desc.md --recommendation-file /tmp/<id>_reco.md
142
+ npx --no-install hex issue patch <id> --description-file /tmp/<id>_desc.md --recommendation-file /tmp/<id>_reco.md
144
143
  ```
145
144
  The description must be self-contained (what the issue is, why it exists, the impact) and follow the **Description format** rules below. The recommendation is prose only, hedged (`Consider...`), no code.
146
145
 
146
+ 3. **Run the duplicate gate** (Step 0) on the filled card.
147
+
147
148
  There is **no source-file annotation** — Hex does not write `@audit-issue` comments into the client's `.sol` files. The board and the finding record are the single place the issue lives.
148
149
 
149
150
  ## After writing
@@ -1,11 +1,7 @@
1
1
  import { z } from 'zod';
2
- import { ConfigSchema, StatsSchema, DepsSchema, AccessControlSchema, StateVarsSchema, ExternalCallsSchema, FindingsSchema, TrackingSchema, ComparisonSchema, SpecConformanceSchema, EvidenceSchema, ConfidenceSchema, DerivedFromSchema, PerContractStatsSchema, TestCoverageSchema, GraphNodeSchema, ClusterSchema, AccessFunctionSchema, RoleFunctionRefSchema, RoleSchema, StateVariableSchema, ExternalCallSchema, FindingSchema, TrackingEntrySchema, TrackingSourceSchema, ResolutionSchema, SpecItemSchema, DiffSchema, DiffChangeSchema, ImpactedFunctionSchema, StorageLayoutChangeSchema, PriorFindingsSchema, PriorReviewSchema } from '../core/schema.js';
2
+ import { ConfigSchema, StatsSchema, FindingsSchema, TrackingSchema, ComparisonSchema, SpecConformanceSchema, EvidenceSchema, ConfidenceSchema, DerivedFromSchema, PerContractStatsSchema, TestCoverageSchema, FindingSchema, TrackingEntrySchema, TrackingSourceSchema, ResolutionSchema, SpecItemSchema, DiffSchema, DiffChangeSchema, ImpactedFunctionSchema, StorageLayoutChangeSchema, PriorFindingsSchema, PriorReviewSchema, FactsSchema, FactsFunctionSchema, FactsContractSchema, FactsStateVarSchema, FactsStorageSlotSchema, ProtocolModelSchema, InvariantSchema, InvariantsFileSchema, TriageRuleSchema, ValidationSchema, FunctionReviewSchema, DiagramSpecSchema, DiagramIndexEntrySchema, FixReviewSchema, FixReviewCardSchema } from '../core/schema.js';
3
3
  export type Config = z.infer<typeof ConfigSchema>;
4
4
  export type Stats = z.infer<typeof StatsSchema>;
5
- export type Deps = z.infer<typeof DepsSchema>;
6
- export type AccessControl = z.infer<typeof AccessControlSchema>;
7
- export type StateVars = z.infer<typeof StateVarsSchema>;
8
- export type ExternalCalls = z.infer<typeof ExternalCallsSchema>;
9
5
  export type Findings = z.infer<typeof FindingsSchema>;
10
6
  export type Tracking = z.infer<typeof TrackingSchema>;
11
7
  export type Comparison = z.infer<typeof ComparisonSchema>;
@@ -15,13 +11,6 @@ export type Confidence = z.infer<typeof ConfidenceSchema>;
15
11
  export type DerivedFrom = z.infer<typeof DerivedFromSchema>;
16
12
  export type PerContractStats = z.infer<typeof PerContractStatsSchema>;
17
13
  export type TestCoverage = z.infer<typeof TestCoverageSchema>;
18
- export type GraphNode = z.infer<typeof GraphNodeSchema>;
19
- export type Cluster = z.infer<typeof ClusterSchema>;
20
- export type AccessFunction = z.infer<typeof AccessFunctionSchema>;
21
- export type RoleFunctionRef = z.infer<typeof RoleFunctionRefSchema>;
22
- export type Role = z.infer<typeof RoleSchema>;
23
- export type StateVariable = z.infer<typeof StateVariableSchema>;
24
- export type ExternalCall = z.infer<typeof ExternalCallSchema>;
25
14
  export type Finding = z.infer<typeof FindingSchema>;
26
15
  export type TrackingEntry = z.infer<typeof TrackingEntrySchema>;
27
16
  export type TrackingSource = z.infer<typeof TrackingSourceSchema>;
@@ -33,4 +22,19 @@ export type ImpactedFunction = z.infer<typeof ImpactedFunctionSchema>;
33
22
  export type StorageLayoutChange = z.infer<typeof StorageLayoutChangeSchema>;
34
23
  export type PriorFindings = z.infer<typeof PriorFindingsSchema>;
35
24
  export type PriorReview = z.infer<typeof PriorReviewSchema>;
25
+ export type Facts = z.infer<typeof FactsSchema>;
26
+ export type FactsFunction = z.infer<typeof FactsFunctionSchema>;
27
+ export type FactsContract = z.infer<typeof FactsContractSchema>;
28
+ export type FactsStateVar = z.infer<typeof FactsStateVarSchema>;
29
+ export type FactsStorageSlot = z.infer<typeof FactsStorageSlotSchema>;
30
+ export type ProtocolModel = z.infer<typeof ProtocolModelSchema>;
31
+ export type Invariant = z.infer<typeof InvariantSchema>;
32
+ export type InvariantsFile = z.infer<typeof InvariantsFileSchema>;
33
+ export type TriageRule = z.infer<typeof TriageRuleSchema>;
34
+ export type Validation = z.infer<typeof ValidationSchema>;
35
+ export type FunctionReview = z.infer<typeof FunctionReviewSchema>;
36
+ export type DiagramSpec = z.infer<typeof DiagramSpecSchema>;
37
+ export type DiagramIndexEntry = z.infer<typeof DiagramIndexEntrySchema>;
38
+ export type FixReview = z.infer<typeof FixReviewSchema>;
39
+ export type FixReviewCard = z.infer<typeof FixReviewCardSchema>;
36
40
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "hex-audit",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "type": "module",
5
- "description": "CLI toolkit for Solidity smart contract auditors",
5
+ "description": "AI-enhanced manual review for Solidity audits: exact compiler facts, a verified protocol model, attacker agents that must prove their findings, and a review workspace next to Claude Code",
6
6
  "bin": {
7
7
  "hex": "./dist/index.js"
8
8
  },
@@ -50,14 +50,15 @@
50
50
  "node": ">=18.0.0"
51
51
  },
52
52
  "dependencies": {
53
+ "@dagrejs/dagre": "^3.1.3",
53
54
  "@dnd-kit/core": "^6.1.0",
55
+ "@excalidraw/excalidraw": "^0.18.1",
56
+ "@modelcontextprotocol/sdk": "^1.32.2",
54
57
  "@solidity-parser/parser": "^0.18.0",
55
- "@tanstack/react-table": "^8.17.0",
56
58
  "chalk": "^5.3.0",
57
59
  "chokidar": "^3.6.0",
58
60
  "commander": "^12.1.0",
59
61
  "glob": "^10.3.10",
60
- "mermaid": "^11.4.0",
61
62
  "minimatch": "^9.0.4",
62
63
  "next": "14.2.5",
63
64
  "next-themes": "^0.4.6",
@@ -1 +0,0 @@
1
- (()=>{var e={};e.id=980,e.ids=[980],e.modules={7849:e=>{"use strict";e.exports=require("next/dist/client/components/action-async-storage.external")},2934:e=>{"use strict";e.exports=require("next/dist/client/components/action-async-storage.external.js")},5403:e=>{"use strict";e.exports=require("next/dist/client/components/request-async-storage.external")},4580:e=>{"use strict";e.exports=require("next/dist/client/components/request-async-storage.external.js")},4749:e=>{"use strict";e.exports=require("next/dist/client/components/static-generation-async-storage.external")},5869:e=>{"use strict";e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},399:e=>{"use strict";e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},7561:e=>{"use strict";e.exports=require("node:fs")},9411:e=>{"use strict";e.exports=require("node:path")},1017:e=>{"use strict";e.exports=require("path")},7310:e=>{"use strict";e.exports=require("url")},1166:(e,t,s)=>{"use strict";s.r(t),s.d(t,{GlobalError:()=>i.a,__next_app__:()=>p,originalPathname:()=>x,pages:()=>d,routeModule:()=>m,tree:()=>o}),s(7824),s(819),s(2874);var a=s(7105),r=s(5265),n=s(157),i=s.n(n),c=s(4665),l={};for(let e in c)0>["default","tree","pages","GlobalError","originalPathname","__next_app__","routeModule"].indexOf(e)&&(l[e]=()=>c[e]);s.d(t,l);let o=["",{children:["access",{children:["__PAGE__",{},{page:[()=>Promise.resolve().then(s.bind(s,7824)),"/home/dx/Work/hex/dashboard/app/access/page.tsx"]}]},{metadata:{icon:[async e=>(await Promise.resolve().then(s.bind(s,2950))).default(e)],apple:[],openGraph:[],twitter:[],manifest:void 0}}]},{layout:[()=>Promise.resolve().then(s.bind(s,819)),"/home/dx/Work/hex/dashboard/app/layout.tsx"],"not-found":[()=>Promise.resolve().then(s.t.bind(s,2874,23)),"next/dist/client/components/not-found-error"],metadata:{icon:[async e=>(await Promise.resolve().then(s.bind(s,2950))).default(e)],apple:[],openGraph:[],twitter:[],manifest:void 0}}],d=["/home/dx/Work/hex/dashboard/app/access/page.tsx"],x="/access/page",p={require:s,loadChunk:()=>Promise.resolve()},m=new a.AppPageRouteModule({definition:{kind:r.x.APP_PAGE,page:"/access/page",pathname:"/access",bundlePath:"",filename:"",appPaths:[]},userland:{loaderTree:o}})},4722:(e,t,s)=>{Promise.resolve().then(s.bind(s,226))},226:(e,t,s)=>{"use strict";s.d(t,{AccessClient:()=>m});var a=s(9899),r=s(5507),n=s(983),i=s(366),c=s(9687);let l={access_control:"bg-accent-subtle text-accent",state_check:"bg-[var(--medium)]/15 text-[var(--medium)]",guard:"bg-[var(--low)]/15 text-[var(--low)]",unknown:"bg-[var(--neutral)]/15 text-[var(--neutral)]"};function o(e){return e.is_likely_access_control??!0}let d={external:"bg-[var(--critical)]/15 text-[var(--critical)]",public:"bg-[var(--high)]/15 text-[var(--high)]",internal:"bg-[var(--low)]/15 text-[var(--low)]",private:"bg-[var(--neutral)]/15 text-[var(--neutral)]"};function x({visibility:e}){let t=d[e]??"bg-[var(--neutral)]/15 text-[var(--neutral)]";return a.jsx("span",{className:`inline-flex items-center rounded-sm px-2 py-0.5 text-caption font-medium ${t}`,children:e})}let p=["All","State-Changing","Read-Only"];function m({writeFunctions:e,readOnlyFunctions:t,anyoneFnKeys:s,otherRoles:d,allRoles:m}){let[u,h]=(0,r.useState)("All"),[f,b]=(0,r.useState)(!1),[g,v]=(0,r.useState)(!1),y=(0,r.useMemo)(()=>new Set(s),[s]),j=(0,r.useMemo)(()=>d.filter(e=>!o(e)),[d]),N=(0,r.useMemo)(()=>g?d:d.filter(o),[d,g]),w=(0,r.useMemo)(()=>{let e=new Map;for(let t of m)if(o(t))for(let s of t.functions){let a=`${s.contract}::${s.function}`,r=e.get(a)??[];r.push(t.role),e.set(a,r)}return e},[m]),_=(0,r.useMemo)(()=>[...e,...t],[e,t]),C=(0,r.useMemo)(()=>e.filter(e=>y.has(`${e.contract}::${e.function}`)),[e,y]),$=(0,r.useMemo)(()=>{switch(u){case"All":return _;case"State-Changing":return f?C:e;case"Read-Only":return t}},[u,f,_,e,t,C]),k="All"===u||"Read-Only"===u,P=(0,r.useMemo)(()=>(function(e,t,s){let r=[{id:"contract",header:"Contract",accessorKey:"contract",enableColumnFilter:!0,cell:e=>a.jsx("span",{className:"font-medium text-text-primary",children:e.contract})},{id:"function",header:"Function",accessorKey:"function",cell:e=>a.jsx("span",{className:"font-mono text-body text-text-secondary",children:e.function})},{id:"caller",header:"Who can call",accessorKey:"function",cell:s=>{let r=`${s.contract}::${s.function}`,n=t.get(r)??[],i=e.has(r);return 0!==n.length||i?(0,a.jsxs)("div",{className:"flex flex-wrap gap-1",children:[i&&a.jsx("span",{className:"inline-flex items-center rounded-md bg-[var(--critical)]/10 px-2 py-0.5 text-caption font-medium text-[var(--critical)]",children:"Anyone"}),n.filter(e=>"anyone"!==e.toLowerCase()&&"public"!==e.toLowerCase()).map(e=>a.jsx("span",{className:"inline-flex items-center rounded-md bg-accent-subtle px-2 py-0.5 text-caption font-medium text-accent",children:e},e))]}):a.jsx("span",{className:"text-text-tertiary",children:"--"})}},{id:"visibility",header:"Visibility",accessorKey:"visibility",enableColumnFilter:!0,cell:e=>a.jsx(x,{visibility:e.visibility})}];return s&&r.push({id:"mutability",header:"Mutability",accessorKey:"state_mutability",cell:e=>a.jsx("span",{className:"text-caption text-text-tertiary",children:e.state_mutability??"--"})}),r.push({id:"modifiers",header:"Modifiers",accessorKey:"modifiers",cell:e=>e.modifiers.length>0?a.jsx("div",{className:"flex flex-wrap gap-1",children:e.modifiers.map(e=>a.jsx("span",{className:"inline-flex items-center rounded-sm bg-surface-3 px-2 py-0.5 text-caption text-text-secondary",children:e},e))}):a.jsx("span",{className:"text-text-tertiary",children:"--"})},{id:"location",header:"Location",accessorKey:"evidence",cell:e=>a.jsx(i.i,{file:e.evidence.file,lineStart:e.evidence.line_start,lineEnd:e.evidence.line_end,snippet:e.evidence.snippet})}),r})(y,w,k),[y,w,k]);return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"mb-sp-5 flex flex-wrap items-center gap-sp-3",children:[a.jsx("div",{className:"inline-flex overflow-x-auto rounded-md bg-surface-3 p-1",children:p.map(s=>(0,a.jsxs)("button",{type:"button",onClick:()=>{h(s),"State-Changing"!==s&&b(!1)},className:`whitespace-nowrap rounded-sm px-sp-3 py-1.5 text-body font-medium ${u===s?"bg-surface-2 text-text-primary shadow-sm":"text-text-secondary hover:text-text-primary"}`,children:[s,(0,a.jsxs)("span",{className:"ml-1.5 text-caption opacity-60",children:["All"===s&&_.length,"State-Changing"===s&&e.length,"Read-Only"===s&&t.length]})]},s))}),"State-Changing"===u&&C.length>0&&(0,a.jsxs)("button",{type:"button",onClick:()=>b(e=>!e),className:`rounded-sm px-sp-3 py-1.5 text-body font-medium ${f?"bg-[var(--critical)]/15 text-[var(--critical)] shadow-sm":"bg-surface-3 text-text-secondary hover:text-text-primary"}`,children:["Unprotected only",a.jsx("span",{className:"ml-1.5 text-caption opacity-60",children:C.length})]})]}),a.jsx("div",{className:"mb-sp-6",children:a.jsx(n.v,{columns:P,data:$,defaultOpen:!0,rowClassName:e=>{let t=`${e.contract}::${e.function}`;return y.has(t)?"bg-[var(--critical)]/5 hover:bg-[var(--critical)]/10":"bg-surface-1 hover:bg-surface-3"}})}),d.length>0&&(0,a.jsxs)("div",{className:"mb-sp-6",children:[(0,a.jsxs)("div",{className:"mb-sp-3 flex items-center justify-between gap-sp-3",children:[(0,a.jsxs)("h3",{className:"text-heading font-medium text-text-primary",children:["Roles",(0,a.jsxs)("span",{className:"ml-2 text-caption font-normal text-text-tertiary",children:[N.length," shown \xb7 ",j.length," inferred / unknown hidden"]})]}),j.length>0&&(0,a.jsxs)("button",{type:"button",onClick:()=>v(e=>!e),"aria-pressed":g,className:`rounded-md px-3 py-1.5 text-caption font-medium focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent ${g?"bg-accent text-surface-0":"bg-surface-3 text-text-secondary hover:text-text-primary"}`,children:[g?"Hide":"Show"," inferred / unknown (",j.length,")"]})]}),a.jsx("div",{className:"grid gap-sp-3 sm:grid-cols-2",children:N.map(e=>(0,a.jsxs)("div",{className:`rounded-md border bg-surface-2 p-sp-4 ${o(e)?"border-border-default":"border-dashed border-border-emphasis opacity-90"}`,children:[(0,a.jsxs)("div",{className:"mb-sp-2 flex items-center justify-between gap-sp-2",children:[(0,a.jsxs)("div",{className:"flex items-center gap-sp-2",children:[a.jsx("h4",{className:"text-heading font-medium text-text-primary",children:e.role}),e.kind&&a.jsx("span",{className:`inline-flex items-center rounded-md px-2 py-0.5 text-caption font-medium ${l[e.kind]}`,children:e.kind.replace("_"," ")})]}),a.jsx(c.o,{level:e.confidence,derivedFrom:e.derived_from})]}),a.jsx("p",{className:"mb-sp-3 text-body text-text-secondary",children:e.description}),e.modifier&&(0,a.jsxs)("p",{className:"mb-sp-2 text-caption text-text-tertiary",children:["Modifier:"," ",a.jsx("code",{className:"rounded-sm bg-surface-0 px-1.5 py-0.5 text-text-secondary",children:e.modifier})]}),e.functions.length>0&&(0,a.jsxs)("div",{className:"mb-sp-2",children:[(0,a.jsxs)("p",{className:"mb-1 text-caption font-medium uppercase text-text-tertiary",children:["Functions (",e.functions.length,")"]}),a.jsx("div",{className:"flex flex-wrap gap-1",children:e.functions.map(e=>(0,a.jsxs)("span",{className:"inline-flex items-center rounded-sm bg-surface-3 px-2 py-0.5 font-mono text-caption text-text-secondary",children:[e.contract,".",e.function]},`${e.contract}::${e.function}`))})]}),e.warnings.length>0&&a.jsx("div",{className:"mt-sp-2 space-y-1 border-t border-border-subtle pt-sp-2",children:e.warnings.map((e,t)=>a.jsx("p",{className:"text-caption text-[var(--medium)]",children:e},t))})]},e.role))})]})]})}},9687:(e,t,s)=>{"use strict";s.d(t,{o:()=>i});var a=s(9899),r=s(5507);let n={high:"bg-[var(--success)]/15 text-[var(--success)]",medium:"bg-[var(--medium)]/15 text-[var(--medium)]",low:"bg-[var(--critical)]/15 text-[var(--critical)]"};function i({level:e,derivedFrom:t}){let[s,i]=(0,r.useState)(!1),c=n[e.toLowerCase()]??n.low,l=t?`confidence-${e}-${t.replace(/\W+/g,"-")}`:void 0,o=t?`${e} confidence, derived from ${t}`:`${e} confidence`;return(0,a.jsxs)("span",{className:"relative inline-block focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent rounded-md",tabIndex:t?0:void 0,role:t?"group":void 0,"aria-label":o,"aria-describedby":s&&l?l:void 0,onMouseEnter:()=>i(!0),onMouseLeave:()=>i(!1),onFocus:()=>i(!0),onBlur:()=>i(!1),children:[a.jsx("span",{className:`inline-flex items-center rounded-md px-2 py-0.5 text-caption font-medium ${c}`,children:e}),t&&s&&(0,a.jsxs)("span",{id:l,role:"tooltip",className:"absolute bottom-full left-1/2 z-50 mb-2 -translate-x-1/2 whitespace-nowrap rounded-md border border-border-default bg-surface-3 px-2 py-1 text-caption text-text-secondary shadow-lg",children:["Derived from: ",t]})]})}},7824:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>p,dynamic:()=>x});var a=s(5023),r=s(1720),n=s(446),i=s(2772);let c=(0,i.createProxy)(String.raw`/home/dx/Work/hex/dashboard/app/access/AccessClient.tsx`),{__esModule:l,$$typeof:o}=c;c.default;let d=(0,i.createProxy)(String.raw`/home/dx/Work/hex/dashboard/app/access/AccessClient.tsx#AccessClient`),x="force-dynamic";function p(){let e=(0,r.gn)("access-control.json");if(!e)return(0,a.jsxs)("div",{children:[a.jsx("h2",{className:"mb-sp-5 text-title font-semibold text-text-primary",children:"Access Control"}),a.jsx(n.v,{command:"hex access"})]});let{functions:t,roles:s}=e,i=t.filter(e=>"external"===e.visibility||"public"===e.visibility),c=i.filter(e=>"view"!==e.state_mutability&&"pure"!==e.state_mutability),l=i.filter(e=>"view"===e.state_mutability||"pure"===e.state_mutability),o=s.find(e=>"anyone"===e.role.toLowerCase()||"public"===e.role.toLowerCase()),x=s.filter(e=>"anyone"!==e.role.toLowerCase()&&"public"!==e.role.toLowerCase()),p=o?.functions.map(e=>`${e.contract}::${e.function}`)??[],m=new Set(c.map(e=>`${e.contract}::${e.function}`)),u=p.filter(e=>m.has(e)).length;return(0,a.jsxs)("div",{children:[a.jsx("h2",{className:"mb-sp-5 text-title font-semibold text-text-primary",children:"Access Control"}),(0,a.jsxs)("div",{className:"mb-sp-5 flex flex-wrap gap-sp-3",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 rounded-md border border-border-default bg-surface-2 px-sp-4 py-sp-2",children:[a.jsx("span",{className:"text-heading font-semibold text-text-primary",children:i.length}),a.jsx("span",{className:"text-caption text-text-secondary",children:"Total"})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2 rounded-md border border-border-default bg-surface-2 px-sp-4 py-sp-2",children:[a.jsx("span",{className:"text-heading font-semibold text-text-primary",children:c.length}),a.jsx("span",{className:"text-caption text-text-secondary",children:"State-Changing"})]}),u>0&&(0,a.jsxs)("div",{className:"flex items-center gap-2 rounded-md border border-[var(--critical)]/30 bg-[var(--critical)]/5 px-sp-4 py-sp-2",children:[a.jsx("span",{className:"text-heading font-semibold text-[var(--critical)]",children:u}),a.jsx("span",{className:"text-caption text-[var(--critical)]/80",children:"Unprotected"})]})]}),a.jsx(d,{writeFunctions:c,readOnlyFunctions:l,anyoneFnKeys:p,anyoneRole:o??null,otherRoles:x,allRoles:s})]})}}};var t=require("../../webpack-runtime.js");t.C(e);var s=e=>t(t.s=e),a=t.X(0,[916,649,645,665,530,939],()=>s(1166));module.exports=a})();
@@ -1 +0,0 @@
1
- globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/access/page"]={"moduleLoading":{"prefix":"/_next/","crossOrigin":null},"ssrModuleMapping":{"3443":{"*":{"id":"7406","name":"*","chunks":[],"async":false}},"4595":{"*":{"id":"1388","name":"*","chunks":[],"async":false}},"9922":{"*":{"id":"8033","name":"*","chunks":[],"async":false}},"11076":{"*":{"id":"9323","name":"*","chunks":[],"async":false}},"11447":{"*":{"id":"5915","name":"*","chunks":[],"async":false}},"13037":{"*":{"id":"226","name":"*","chunks":[],"async":false}},"15276":{"*":{"id":"820","name":"*","chunks":[],"async":false}},"25268":{"*":{"id":"3817","name":"*","chunks":[],"async":false}},"27542":{"*":{"id":"9555","name":"*","chunks":[],"async":false}},"29487":{"*":{"id":"6844","name":"*","chunks":[],"async":false}},"30274":{"*":{"id":"7918","name":"*","chunks":[],"async":false}},"37780":{"*":{"id":"8664","name":"*","chunks":[],"async":false}},"43297":{"*":{"id":"1611","name":"*","chunks":[],"async":false}},"56902":{"*":{"id":"2541","name":"*","chunks":[],"async":false}},"67498":{"*":{"id":"696","name":"*","chunks":[],"async":false}},"71520":{"*":{"id":"5707","name":"*","chunks":[],"async":false}},"72024":{"*":{"id":"2857","name":"*","chunks":[],"async":false}},"73719":{"*":{"id":"526","name":"*","chunks":[],"async":false}},"77701":{"*":{"id":"8530","name":"*","chunks":[],"async":false}},"89690":{"*":{"id":"2204","name":"*","chunks":[],"async":false}},"92198":{"*":{"id":"9915","name":"*","chunks":[],"async":false}},"93362":{"*":{"id":"5289","name":"*","chunks":[],"async":false}},"99754":{"*":{"id":"4790","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/home/dx/Work/hex/node_modules/next/dist/client/components/app-router.js":{"id":25268,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/node_modules/next/dist/esm/client/components/app-router.js":{"id":25268,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/node_modules/next/dist/client/components/client-page.js":{"id":11076,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/node_modules/next/dist/esm/client/components/client-page.js":{"id":11076,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/node_modules/next/dist/client/components/error-boundary.js":{"id":89690,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/node_modules/next/dist/esm/client/components/error-boundary.js":{"id":89690,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/node_modules/next/dist/client/components/layout-router.js":{"id":15276,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/node_modules/next/dist/esm/client/components/layout-router.js":{"id":15276,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/node_modules/next/dist/client/components/not-found-boundary.js":{"id":11447,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/node_modules/next/dist/esm/client/components/not-found-boundary.js":{"id":11447,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/node_modules/next/dist/client/components/render-from-template-context.js":{"id":43297,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":43297,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/dashboard/app/globals.css":{"id":13812,"name":"*","chunks":["7498","static/chunks/7498-d1814d68ba346d13.js","3185","static/chunks/app/layout-6c6d2a0fd7c989d3.js"],"async":false},"/home/dx/Work/hex/dashboard/components/CommandPalette.tsx":{"id":92198,"name":"*","chunks":["7498","static/chunks/7498-d1814d68ba346d13.js","3185","static/chunks/app/layout-6c6d2a0fd7c989d3.js"],"async":false},"/home/dx/Work/hex/dashboard/components/DashboardLayout.tsx":{"id":30274,"name":"*","chunks":["7498","static/chunks/7498-d1814d68ba346d13.js","3185","static/chunks/app/layout-6c6d2a0fd7c989d3.js"],"async":false},"/home/dx/Work/hex/node_modules/next-themes/dist/index.mjs":{"id":4595,"name":"*","chunks":["7498","static/chunks/7498-d1814d68ba346d13.js","3185","static/chunks/app/layout-6c6d2a0fd7c989d3.js"],"async":false},"/home/dx/Work/hex/node_modules/next/font/google/target.css?{\"path\":\"app/layout.tsx\",\"import\":\"Manrope\",\"arguments\":[{\"subsets\":[\"latin\"],\"variable\":\"--font-sans\",\"display\":\"swap\"}],\"variableName\":\"manrope\"}":{"id":41600,"name":"*","chunks":["7498","static/chunks/7498-d1814d68ba346d13.js","3185","static/chunks/app/layout-6c6d2a0fd7c989d3.js"],"async":false},"/home/dx/Work/hex/node_modules/next/font/google/target.css?{\"path\":\"app/layout.tsx\",\"import\":\"JetBrains_Mono\",\"arguments\":[{\"subsets\":[\"latin\"],\"variable\":\"--font-mono\",\"display\":\"swap\"}],\"variableName\":\"jetbrainsMono\"}":{"id":55256,"name":"*","chunks":["7498","static/chunks/7498-d1814d68ba346d13.js","3185","static/chunks/app/layout-6c6d2a0fd7c989d3.js"],"async":false},"/home/dx/Work/hex/dashboard/app/diagram/page.tsx":{"id":73719,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/dashboard/app/flows/page.tsx":{"id":3443,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/dashboard/app/calls/CallsClient.tsx":{"id":93362,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/dashboard/app/changes/ChangesClient.tsx":{"id":71520,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/dashboard/app/access/AccessClient.tsx":{"id":13037,"name":"*","chunks":["8452","static/chunks/8452-6d77fa353402422c.js","8928","static/chunks/8928-fc049decdfbdaa6d.js","2980","static/chunks/app/access/page-f8403cbdfc1c176b.js"],"async":false},"/home/dx/Work/hex/dashboard/app/notes/NotesClient.tsx":{"id":72024,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/dashboard/app/conformance/ConformanceTable.tsx":{"id":27542,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/dashboard/app/functions/FunctionsClient.tsx":{"id":37780,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/dashboard/app/report/ReportClient.tsx":{"id":56902,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/dashboard/app/stats/StatsClient.tsx":{"id":9922,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/dashboard/app/progress/ProgressClient.tsx":{"id":77701,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/dashboard/app/issues/IssuesBoardClient.tsx":{"id":99754,"name":"*","chunks":[],"async":false},"/home/dx/Work/hex/dashboard/components/MarkdownRenderer.tsx":{"id":29487,"name":"*","chunks":["7397","static/chunks/7397-37adf76cad543297.js","7498","static/chunks/7498-d1814d68ba346d13.js","1931","static/chunks/app/page-d63800ddb072b77b.js"],"async":false},"/home/dx/Work/hex/node_modules/next/dist/client/link.js":{"id":67498,"name":"*","chunks":["7397","static/chunks/7397-37adf76cad543297.js","7498","static/chunks/7498-d1814d68ba346d13.js","1931","static/chunks/app/page-d63800ddb072b77b.js"],"async":false},"/home/dx/Work/hex/node_modules/next/dist/esm/client/link.js":{"id":67498,"name":"*","chunks":["7397","static/chunks/7397-37adf76cad543297.js","7498","static/chunks/7498-d1814d68ba346d13.js","1931","static/chunks/app/page-d63800ddb072b77b.js"],"async":false}},"entryCSSFiles":{"/home/dx/Work/hex/dashboard/":[],"/home/dx/Work/hex/dashboard/app/layout":["static/css/1112cea2260b3926.css"],"/home/dx/Work/hex/dashboard/app/page":[],"/home/dx/Work/hex/dashboard/app/access/page":[]}}
@@ -1 +0,0 @@
1
- "use strict";(()=>{var e={};e.id=141,e.ids=[141],e.modules={399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},7561:e=>{e.exports=require("node:fs")},9411:e=>{e.exports=require("node:path")},3191:(e,r,t)=>{t.r(r),t.d(r,{originalPathname:()=>j,patchFetch:()=>g,requestAsyncStorage:()=>h,routeModule:()=>y,serverHooks:()=>w,staticGenerationAsyncStorage:()=>x});var n={};t.r(n),t.d(n,{GET:()=>m,dynamic:()=>d});var o=t(3277),i=t(5265),u=t(5356),a=t(7076),s=t(7561),c=t.n(s),l=t(9411),p=t.n(l),f=t(1720);let d="force-dynamic";async function m(){let e=(0,f.ZN)();try{let r=c().readdirSync(p().join(e,"diagrams")),t=[];for(let e of r)if(/^flow-[\w-]+\.mmd$/.test(e)){let r=e.replace(/^flow-/,"").replace(/\.mmd$/,"").replace(/-/g," ").replace(/\b\w/g,e=>e.toUpperCase());t.push({name:r,filename:e})}return a.NextResponse.json({flows:t})}catch{return a.NextResponse.json({flows:[]})}}let y=new o.AppRouteRouteModule({definition:{kind:i.x.APP_ROUTE,page:"/api/flows/route",pathname:"/api/flows",filename:"route",bundlePath:"app/api/flows/route"},resolvedPagePath:"/home/dx/Work/hex/dashboard/app/api/flows/route.ts",nextConfigOutput:"",userland:n}),{requestAsyncStorage:h,staticGenerationAsyncStorage:x,serverHooks:w}=y,j="/api/flows/route";function g(){return(0,u.patchFetch)({serverHooks:w,staticGenerationAsyncStorage:x})}},1720:(e,r,t)=>{t.d(r,{ki:()=>d,ZN:()=>m,J1:()=>y,gn:()=>l,ws:()=>p,V9:()=>h,au:()=>f});var n=t(7561),o=t.n(n),i=t(9411),u=t.n(i);let a=[".hex",".solaudit","solaudit-output"];function s(e){return e.replace(/\\/g,"/")}function c(){try{let e=function(e=process.cwd()){let r=u().resolve(e);for(;;){let e=function(e){for(let r of[...a.map(r=>u().join(e,r,"config.json")),u().join(e,"config.json")])if(o().existsSync(r))return s(r);return null}(r);if(e)return s(u().dirname(e));let t=u().dirname(r);if(t===r)return null;r=t}}(process.cwd());if(e)return e}catch{}return u().join(process.cwd(),".hex")}function l(e){try{let r=u().join(c(),e),t=o().readFileSync(r,"utf-8");return JSON.parse(t)}catch{return null}}function p(e){try{let r=u().join(c(),e);return o().readFileSync(r,"utf-8")}catch{return null}}function f(e,r){let t=u().join(c(),e);o().writeFileSync(t,JSON.stringify(r,null,2),"utf-8")}function d(e){try{let r=u().join(c(),e);return o().existsSync(r)}catch{return!1}}function m(){return c()}function y(e){try{let r=u().join(c(),e);if(!o().existsSync(r))return[];return o().readdirSync(r,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>e.name)}catch{return[]}}function h(e){try{let r=u().join(c(),e),t=o().readFileSync(r,"utf-8");return JSON.parse(t)}catch{return null}}}};var r=require("../../../webpack-runtime.js");r.C(e);var t=e=>r(r.s=e),n=r.X(0,[916,786],()=>t(3191));module.exports=n})();
@@ -1 +0,0 @@
1
- "use strict";(()=>{var e={};e.id=266,e.ids=[266],e.modules={399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},7561:e=>{e.exports=require("node:fs")},9411:e=>{e.exports=require("node:path")},1671:(e,r,t)=>{t.r(r),t.d(r,{originalPathname:()=>j,patchFetch:()=>g,requestAsyncStorage:()=>h,routeModule:()=>m,serverHooks:()=>y,staticGenerationAsyncStorage:()=>x});var n={};t.r(n),t.d(n,{GET:()=>f});var i=t(3277),o=t(5265),u=t(5356),a=t(7076),s=t(7561),c=t.n(s),l=t(9411),d=t.n(l),p=t(1720);async function f(e){let r=e.nextUrl.searchParams.get("file");if(!r||!/^[\w.-]+\.mmd$/.test(r))return a.NextResponse.json({error:"Invalid filename"},{status:400});let t=(0,p.ZN)(),n=d().join(t,"diagrams",r);try{let e=c().readFileSync(n,"utf-8");return a.NextResponse.json({syntax:e})}catch{return a.NextResponse.json({error:`File not found: ${r}`},{status:404})}}let m=new i.AppRouteRouteModule({definition:{kind:o.x.APP_ROUTE,page:"/api/mermaid/route",pathname:"/api/mermaid",filename:"route",bundlePath:"app/api/mermaid/route"},resolvedPagePath:"/home/dx/Work/hex/dashboard/app/api/mermaid/route.ts",nextConfigOutput:"",userland:n}),{requestAsyncStorage:h,staticGenerationAsyncStorage:x,serverHooks:y}=m,j="/api/mermaid/route";function g(){return(0,u.patchFetch)({serverHooks:y,staticGenerationAsyncStorage:x})}},1720:(e,r,t)=>{t.d(r,{ki:()=>f,ZN:()=>m,J1:()=>h,gn:()=>l,ws:()=>d,V9:()=>x,au:()=>p});var n=t(7561),i=t.n(n),o=t(9411),u=t.n(o);let a=[".hex",".solaudit","solaudit-output"];function s(e){return e.replace(/\\/g,"/")}function c(){try{let e=function(e=process.cwd()){let r=u().resolve(e);for(;;){let e=function(e){for(let r of[...a.map(r=>u().join(e,r,"config.json")),u().join(e,"config.json")])if(i().existsSync(r))return s(r);return null}(r);if(e)return s(u().dirname(e));let t=u().dirname(r);if(t===r)return null;r=t}}(process.cwd());if(e)return e}catch{}return u().join(process.cwd(),".hex")}function l(e){try{let r=u().join(c(),e),t=i().readFileSync(r,"utf-8");return JSON.parse(t)}catch{return null}}function d(e){try{let r=u().join(c(),e);return i().readFileSync(r,"utf-8")}catch{return null}}function p(e,r){let t=u().join(c(),e);i().writeFileSync(t,JSON.stringify(r,null,2),"utf-8")}function f(e){try{let r=u().join(c(),e);return i().existsSync(r)}catch{return!1}}function m(){return c()}function h(e){try{let r=u().join(c(),e);if(!i().existsSync(r))return[];return i().readdirSync(r,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>e.name)}catch{return[]}}function x(e){try{let r=u().join(c(),e),t=i().readFileSync(r,"utf-8");return JSON.parse(t)}catch{return null}}}};var r=require("../../../webpack-runtime.js");r.C(e);var t=e=>r(r.s=e),n=r.X(0,[916,786],()=>t(1671));module.exports=n})();