hex-audit 0.6.3 → 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 (746) hide show
  1. package/CLAUDE.md +137 -77
  2. package/DEMO.md +41 -105
  3. package/README.md +205 -353
  4. package/dashboard/.next/BUILD_ID +1 -1
  5. package/dashboard/.next/app-build-manifest.json +65 -99
  6. package/dashboard/.next/app-path-routes-manifest.json +1 -1
  7. package/dashboard/.next/build-manifest.json +14 -14
  8. package/dashboard/.next/next-minimal-server.js.nft.json +1 -1
  9. package/dashboard/.next/next-server.js.nft.json +1 -1
  10. package/dashboard/.next/prerender-manifest.js +1 -1
  11. package/dashboard/.next/prerender-manifest.json +1 -1
  12. package/dashboard/.next/react-loadable-manifest.json +540 -119
  13. package/dashboard/.next/routes-manifest.json +1 -1
  14. package/dashboard/.next/server/app/_not-found/page.js +1 -1
  15. package/dashboard/.next/server/app/_not-found/page.js.nft.json +1 -1
  16. package/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  17. package/dashboard/.next/server/app/api/code/route.js +1 -1
  18. package/dashboard/.next/server/app/api/code/route.js.nft.json +1 -1
  19. package/dashboard/.next/server/app/api/comments/route.js +1 -0
  20. package/dashboard/.next/server/app/api/comments/route.js.nft.json +1 -0
  21. package/dashboard/.next/server/app/api/diagrams/[name]/export/route.js +1 -0
  22. package/dashboard/.next/server/app/api/diagrams/[name]/export/route.js.nft.json +1 -0
  23. package/dashboard/.next/server/app/api/diagrams/[name]/resolve/route.js +1 -0
  24. package/dashboard/.next/server/app/api/diagrams/[name]/resolve/route.js.nft.json +1 -0
  25. package/dashboard/.next/server/app/api/diagrams/[name]/route.js +1 -0
  26. package/dashboard/.next/server/app/api/diagrams/[name]/route.js.nft.json +1 -0
  27. package/dashboard/.next/server/app/api/figures/[name]/route.js +1 -0
  28. package/dashboard/.next/server/app/api/figures/[name]/route.js.nft.json +1 -0
  29. package/dashboard/.next/server/app/api/focus/route.js +1 -0
  30. package/dashboard/.next/server/app/api/focus/route.js.nft.json +1 -0
  31. package/dashboard/.next/server/app/api/github-status/route.js +1 -1
  32. package/dashboard/.next/server/app/api/invariants/[id]/route.js +1 -0
  33. package/dashboard/.next/server/app/api/invariants/[id]/route.js.nft.json +1 -0
  34. package/dashboard/.next/server/app/api/issues/[id]/revert-auto/route.js +1 -0
  35. package/dashboard/.next/server/app/api/issues/[id]/revert-auto/route.js.nft.json +1 -0
  36. package/dashboard/.next/server/app/api/nav/route.js +1 -0
  37. package/dashboard/.next/server/app/api/nav/route.js.nft.json +1 -0
  38. package/dashboard/.next/server/app/api/notes/done/route.js +1 -1
  39. package/dashboard/.next/server/app/api/notes/done/route.js.nft.json +1 -1
  40. package/dashboard/.next/server/app/api/notes/lead/route.js +1 -1
  41. package/dashboard/.next/server/app/api/notes/lead/route.js.nft.json +1 -1
  42. package/dashboard/.next/server/app/api/notes/question/route.js +1 -1
  43. package/dashboard/.next/server/app/api/notes/question/route.js.nft.json +1 -1
  44. package/dashboard/.next/server/app/api/notes/record/route.js +3 -3
  45. package/dashboard/.next/server/app/api/notes/route.js +2 -2
  46. package/dashboard/.next/server/app/api/palette/route.js +1 -0
  47. package/dashboard/.next/server/app/api/palette/route.js.nft.json +1 -0
  48. package/dashboard/.next/server/app/api/progress/route.js +1 -1
  49. package/dashboard/.next/server/app/api/progress/route.js.nft.json +1 -1
  50. package/dashboard/.next/server/app/api/watch/route.js +2 -2
  51. package/dashboard/.next/server/app/api/watch/route.js.nft.json +1 -1
  52. package/dashboard/.next/server/app/api/xref/route.js +1 -0
  53. package/dashboard/.next/server/app/changes/page.js +1 -0
  54. package/dashboard/.next/server/app/{access → changes}/page.js.nft.json +1 -1
  55. package/dashboard/.next/server/app/changes/page_client-reference-manifest.js +1 -0
  56. package/dashboard/.next/server/app/excalidraw-assets/[...path]/route.js +1 -0
  57. package/dashboard/.next/server/app/issues/page.js +5 -28
  58. package/dashboard/.next/server/app/issues/page.js.nft.json +1 -1
  59. package/dashboard/.next/server/app/issues/page_client-reference-manifest.js +1 -1
  60. package/dashboard/.next/server/app/model/page.js +1 -0
  61. package/dashboard/.next/server/app/{calls → model}/page.js.nft.json +1 -1
  62. package/dashboard/.next/server/app/model/page_client-reference-manifest.js +1 -0
  63. package/dashboard/.next/server/app/page.js +1 -20
  64. package/dashboard/.next/server/app/page.js.nft.json +1 -1
  65. package/dashboard/.next/server/app/page_client-reference-manifest.js +1 -1
  66. package/dashboard/.next/server/app/report/page.js +1 -1
  67. package/dashboard/.next/server/app/report/page.js.nft.json +1 -1
  68. package/dashboard/.next/server/app/report/page_client-reference-manifest.js +1 -1
  69. package/dashboard/.next/server/app/review/page.js +1 -0
  70. package/dashboard/.next/server/app/{conformance → review}/page.js.nft.json +1 -1
  71. package/dashboard/.next/server/app/review/page_client-reference-manifest.js +1 -0
  72. package/dashboard/.next/server/app-paths-manifest.json +20 -16
  73. package/dashboard/.next/server/chunks/310.js +4 -0
  74. package/dashboard/.next/server/chunks/370.js +1 -0
  75. package/dashboard/.next/server/chunks/42.js +1 -1
  76. package/dashboard/.next/server/chunks/624.js +14 -0
  77. package/dashboard/.next/server/chunks/645.js +1 -1
  78. package/dashboard/.next/server/chunks/649.js +1 -1
  79. package/dashboard/.next/server/chunks/653.js +1 -0
  80. package/dashboard/.next/server/functions-config-manifest.json +1 -1
  81. package/dashboard/.next/server/middleware-build-manifest.js +1 -1
  82. package/dashboard/.next/server/middleware-react-loadable-manifest.js +1 -1
  83. package/dashboard/.next/server/next-font-manifest.js +1 -1
  84. package/dashboard/.next/server/next-font-manifest.json +1 -1
  85. package/dashboard/.next/server/pages/500.html +1 -1
  86. package/dashboard/.next/server/pages/_error.js +1 -1
  87. package/dashboard/.next/server/pages-manifest.json +1 -1
  88. package/dashboard/.next/server/server-reference-manifest.js +1 -1
  89. package/dashboard/.next/server/server-reference-manifest.json +1 -1
  90. package/dashboard/.next/static/bGV1ry1vvIbM5b506eVBR/_buildManifest.js +1 -0
  91. package/dashboard/.next/static/chunks/0bbe10ee.8e7ffa06d2170dfe.js +84 -0
  92. package/dashboard/.next/static/chunks/{1.8868c4d131111be7.js → 1.a666047ea18866fb.js} +2 -2
  93. package/dashboard/.next/static/chunks/1015.39008440ab15e196.js +226 -0
  94. package/dashboard/.next/static/chunks/1026.0ef689a305302427.js +1 -0
  95. package/dashboard/.next/static/chunks/1151.497fa63c5b9eba52.js +1 -0
  96. package/dashboard/.next/static/chunks/1164.34eb76767ebea46f.js +8 -0
  97. package/dashboard/.next/static/chunks/119.a9a79633900a235f.js +5 -0
  98. package/dashboard/.next/static/chunks/1199.f30cbfa151e56076.js +148 -0
  99. package/dashboard/.next/static/chunks/1291.6c486c9b1d4b1b3a.js +1 -0
  100. package/dashboard/.next/static/chunks/1375.64c20f1064a38a10.js +43 -0
  101. package/dashboard/.next/static/chunks/139.4691848fc5a46253.js +10 -0
  102. package/dashboard/.next/static/chunks/145.1bf74fecdb4022e3.js +11 -0
  103. package/dashboard/.next/static/chunks/1517.8e7075f78e22b3a0.js +8 -0
  104. package/dashboard/.next/static/chunks/165.6f174060a0ce2db4.js +6 -0
  105. package/dashboard/.next/static/chunks/1741.5c370b7702d2eb40.js +8 -0
  106. package/dashboard/.next/static/chunks/1799.8dc56017eede704e.js +9 -0
  107. package/dashboard/.next/static/chunks/1e36816c.5748c83adc8a6bd6.js +108 -0
  108. package/dashboard/.next/static/chunks/20154aaa.e87f69fe10483f8b.js +1 -0
  109. package/dashboard/.next/static/chunks/2061.eab75b3c1dfa068a.js +1 -0
  110. package/dashboard/.next/static/chunks/2077.5603adeb156c7d10.js +1 -0
  111. package/dashboard/.next/static/chunks/2148.3ce718f62d1b2f7c.js +10 -0
  112. package/dashboard/.next/static/chunks/2166.9f6592b9399eadd8.js +215 -0
  113. package/dashboard/.next/static/chunks/217-1d5b680ffd10e3f9.js +1 -0
  114. package/dashboard/.next/static/chunks/2208.fb884379aa3ae968.js +1 -0
  115. package/dashboard/.next/static/chunks/2276.112c7855333fca5f.js +6 -0
  116. package/dashboard/.next/static/chunks/{2291.85a70cb0c228157b.js → 2291.584b42ccad079b99.js} +1 -1
  117. package/dashboard/.next/static/chunks/2325.7decd077edfb81d9.js +24 -0
  118. package/dashboard/.next/static/chunks/2374-8c6f137938f8518a.js +1 -0
  119. package/dashboard/.next/static/chunks/{2383.62c035a052272594.js → 2383.ca81f980ce6528a4.js} +1 -1
  120. package/dashboard/.next/static/chunks/2445.18a86507d2996b95.js +1 -0
  121. package/dashboard/.next/static/chunks/2694.7dfa5fef28851903.js +1 -0
  122. package/dashboard/.next/static/chunks/2712.15dd8577973baf22.js +10 -0
  123. package/dashboard/.next/static/chunks/275.38af87389c1d33d7.js +34 -0
  124. package/dashboard/.next/static/chunks/2759.533dec5317e0a1d1.js +1 -0
  125. package/dashboard/.next/static/chunks/2781.fba46046dbf2693b.js +93 -0
  126. package/dashboard/.next/static/chunks/2805.35b4cd8a94978aaf.js +1 -0
  127. package/dashboard/.next/static/chunks/2812.62b213bef580b69a.js +1 -0
  128. package/dashboard/.next/static/chunks/{2879.51436986f93981d9.js → 2879.74d65e33e60505ee.js} +1 -1
  129. package/dashboard/.next/static/chunks/2895.bb57cacb7aaf42a1.js +9 -0
  130. package/dashboard/.next/static/chunks/2972.e5a9251b538dcf19.js +9 -0
  131. package/dashboard/.next/static/chunks/3205-fd963acf2fdfd080.js +2 -0
  132. package/dashboard/.next/static/chunks/3206.8d9a10db2b04b93f.js +1 -0
  133. package/dashboard/.next/static/chunks/3236.eac9855778a54518.js +1 -0
  134. package/dashboard/.next/static/chunks/3480.853a445a3784642a.js +1 -0
  135. package/dashboard/.next/static/chunks/3485.36766504793b7237.js +9 -0
  136. package/dashboard/.next/static/chunks/3626.c5dacee11c8fbc4d.js +64 -0
  137. package/dashboard/.next/static/chunks/3725.de9376dc994735d4.js +9 -0
  138. package/dashboard/.next/static/chunks/3774.1df377928e8387f7.js +9 -0
  139. package/dashboard/.next/static/chunks/3865.5e6d2d501380e03b.js +90 -0
  140. package/dashboard/.next/static/chunks/3887.073cece834a4eae2.js +1 -0
  141. package/dashboard/.next/static/chunks/3924-f1f85ccc7d59d7ab.js +1 -0
  142. package/dashboard/.next/static/chunks/3948.74201b9f0672234d.js +287 -0
  143. package/dashboard/.next/static/chunks/3963.39d72b3875dfe2e9.js +13 -0
  144. package/dashboard/.next/static/chunks/4013.73884b23bfaebdde.js +11 -0
  145. package/dashboard/.next/static/chunks/4117.278aff1fa23fd36e.js +6 -0
  146. package/dashboard/.next/static/chunks/4210.cc8594110017c579.js +11 -0
  147. package/dashboard/.next/static/chunks/4282.28485875540886cc.js +7 -0
  148. package/dashboard/.next/static/chunks/4318.a2f469a88d88f6d0.js +8 -0
  149. package/dashboard/.next/static/chunks/4363.8999a6e727c48003.js +1 -0
  150. package/dashboard/.next/static/chunks/4641.e03d118fffebd580.js +5 -0
  151. package/dashboard/.next/static/chunks/4728.e69372b5e5b61b8d.js +24 -0
  152. package/dashboard/.next/static/chunks/4787.821a6ad2816cdc60.js +23 -0
  153. package/dashboard/.next/static/chunks/483.a910dab7734a1074.js +8 -0
  154. package/dashboard/.next/static/chunks/4926.76693f542e9cc062.js +6 -0
  155. package/dashboard/.next/static/chunks/4938.03f6d04dabf38745.js +10 -0
  156. package/dashboard/.next/static/chunks/5060.47402abc10273699.js +1 -0
  157. package/dashboard/.next/static/chunks/5112.0757c2b0c285e62e.js +1 -0
  158. package/dashboard/.next/static/chunks/5199.c83ea7efb0eec705.js +11 -0
  159. package/dashboard/.next/static/chunks/5284.334c7c0587d5d47a.js +1 -0
  160. package/dashboard/.next/static/chunks/530.849957a8907eb288.js +1 -0
  161. package/dashboard/.next/static/chunks/5424.4e8ca0711a32bccf.js +7 -0
  162. package/dashboard/.next/static/chunks/55.a593a78be9714679.js +1 -0
  163. package/dashboard/.next/static/chunks/5535.6cd0bd8d368d8902.js +4 -0
  164. package/dashboard/.next/static/chunks/5626.7d4e93d7acbeffc9.js +10 -0
  165. package/dashboard/.next/static/chunks/5715.e16b1230cc4b4652.js +115 -0
  166. package/dashboard/.next/static/chunks/5775.a0d7c1b1e89b9a93.js +9 -0
  167. package/dashboard/.next/static/chunks/6014.641a2c53ba506241.js +104 -0
  168. package/dashboard/.next/static/chunks/6024.f099c15f75aa6722.js +79 -0
  169. package/dashboard/.next/static/chunks/{6052.033a6f1013c666eb.js → 6052.3001318955e5b36c.js} +2 -2
  170. package/dashboard/.next/static/chunks/6118.266956b3333b1d7a.js +9 -0
  171. package/dashboard/.next/static/chunks/6121.a2e6d93720b1205e.js +77 -0
  172. package/dashboard/.next/static/chunks/6177.a01cf0a03734cf09.js +1 -0
  173. package/dashboard/.next/static/chunks/618f8807-fbb1466bc29c17c6.js +1 -0
  174. package/dashboard/.next/static/chunks/6434.f560693253fea8de.js +1 -0
  175. package/dashboard/.next/static/chunks/6468.976d89ba133185f1.js +77 -0
  176. package/dashboard/.next/static/chunks/6540.6f3c4f2c6877ed89.js +1 -0
  177. package/dashboard/.next/static/chunks/6549.e3c4c1766cff1449.js +1 -0
  178. package/dashboard/.next/static/chunks/6853.d3ad43614e8ca0ab.js +1 -0
  179. package/dashboard/.next/static/chunks/690f35d0.ab57e02a04c7e9e0.js +119 -0
  180. package/dashboard/.next/static/chunks/6951.02a3a158d02158c9.js +5 -0
  181. package/dashboard/.next/static/chunks/6970.013f24568c87d918.js +11 -0
  182. package/dashboard/.next/static/chunks/7013.39d41e82b37be63b.js +9 -0
  183. package/dashboard/.next/static/chunks/{7020.831e16e26d91abc1.js → 7020.b718b1b9cea36e60.js} +2 -2
  184. package/dashboard/.next/static/chunks/7107.1c5412197912b8ed.js +8 -0
  185. package/dashboard/.next/static/chunks/7498-7cf464d8af69cd0a.js +1 -0
  186. package/dashboard/.next/static/chunks/7508.dd60e2d06d149f5f.js +9 -0
  187. package/dashboard/.next/static/chunks/7524.0fde4c61553d1491.js +3 -0
  188. package/dashboard/.next/static/chunks/7802.f0134c792fccd382.js +80 -0
  189. package/dashboard/.next/static/chunks/7834-47f318a04a05688f.js +1 -0
  190. package/dashboard/.next/static/chunks/{7a04ac15.1c6cea694301806c.js → 7a04ac15.e49de94ece135900.js} +1 -1
  191. package/dashboard/.next/static/chunks/8216.1138ec313908a708.js +5 -0
  192. package/dashboard/.next/static/chunks/{8233babc.780b8e272eda298f.js → 8233babc.09872dcb3ff44064.js} +1 -1
  193. package/dashboard/.next/static/chunks/8317.d0b3eddef4cae0d5.js +1 -0
  194. package/dashboard/.next/static/chunks/838.2b2aa006519ba44c.js +10 -0
  195. package/dashboard/.next/static/chunks/8398.924fd8f4c83417c0.js +7 -0
  196. package/dashboard/.next/static/chunks/8428b36f.8ac4e67061c01307.js +34 -0
  197. package/dashboard/.next/static/chunks/8514.85ccbbea8ab21d04.js +5 -0
  198. package/dashboard/.next/static/chunks/8538.5f7ebe76c4b63162.js +1 -0
  199. package/dashboard/.next/static/chunks/8645.98a43217d406500e.js +1 -0
  200. package/dashboard/.next/static/chunks/8687.9406baa8b5601fd0.js +1 -0
  201. package/dashboard/.next/static/chunks/8721.47346e2cb6412376.js +10 -0
  202. package/dashboard/.next/static/chunks/8770.4f544bd1a6f03a62.js +8 -0
  203. package/dashboard/.next/static/chunks/8812.3d96fd54dba566f8.js +9 -0
  204. package/dashboard/.next/static/chunks/8962.d22aa67a97970dd8.js +1 -0
  205. package/dashboard/.next/static/chunks/8986.b327224b83f4399a.js +5 -0
  206. package/dashboard/.next/static/chunks/9173.a7160f7d0b685fa7.js +1 -0
  207. package/dashboard/.next/static/chunks/9178.998a8c49996de8e4.js +1 -0
  208. package/dashboard/.next/static/chunks/9271.5f66c19a8ee1ff36.js +10 -0
  209. package/dashboard/.next/static/chunks/9282.f8d01442bab4c0da.js +2 -0
  210. package/dashboard/.next/static/chunks/9366.0ec24a0791b9b00f.js +1 -0
  211. package/dashboard/.next/static/chunks/9466.a914ce0de7d3bb84.js +1 -0
  212. package/dashboard/.next/static/chunks/9660.b1c8deae2c449d14.js +1 -0
  213. package/dashboard/.next/static/chunks/9707.5cd7d2ee933a4af5.js +6 -0
  214. package/dashboard/.next/static/chunks/9716.15fffc0b0038601d.js +4 -0
  215. package/dashboard/.next/static/chunks/{9717.6cf5c8c89403b651.js → 9717.bba51b78ebd8fd29.js} +1 -1
  216. package/dashboard/.next/static/chunks/9720.d63a0696776bcc60.js +1 -0
  217. package/dashboard/.next/static/chunks/9791.e3b3f5a367f63c8a.js +1 -0
  218. package/dashboard/.next/static/chunks/9811.2993c4cbd28e8d1b.js +1 -0
  219. package/dashboard/.next/static/chunks/9820.8c1efad5260e8137.js +1 -0
  220. package/dashboard/.next/static/chunks/985.50150e9eaa4bde33.js +39 -0
  221. package/dashboard/.next/static/chunks/997.56901b86e1b8a87b.js +8 -0
  222. package/dashboard/.next/static/chunks/app/_not-found/page-5ff5d54b6fd6f17e.js +1 -0
  223. package/dashboard/.next/static/chunks/app/changes/page-f8a860034221cad4.js +1 -0
  224. package/dashboard/.next/static/chunks/app/issues/page-da4da93188c414a6.js +1 -0
  225. package/dashboard/.next/static/chunks/app/layout-27a9da4610423c1e.js +1 -0
  226. package/dashboard/.next/static/chunks/app/model/page-9680e22fdd6ddb81.js +1 -0
  227. package/dashboard/.next/static/chunks/app/page-0e67750d99fb2836.js +1 -0
  228. package/dashboard/.next/static/chunks/app/report/page-b56b1db9b9dcf2b6.js +1 -0
  229. package/dashboard/.next/static/chunks/app/review/page-3ef69f0e0badd333.js +1 -0
  230. package/dashboard/.next/static/chunks/{b7167ec1.7afbab6f609e3326.js → b7167ec1.708a3d61698ca2e6.js} +1 -1
  231. package/dashboard/.next/static/chunks/c75e29e3.d91220f782934d80.js +1 -0
  232. package/dashboard/.next/static/chunks/c7ea4e13.3073a2f551aa5ac8.js +1 -0
  233. package/dashboard/.next/static/chunks/framework-a117d81bf1b91f9a.js +33 -0
  234. package/dashboard/.next/static/chunks/main-9c95a7ffedc7afb4.js +1 -0
  235. package/dashboard/.next/static/chunks/main-app-5662c64b50ba40d1.js +1 -0
  236. package/dashboard/.next/static/chunks/pages/_app-308fef0bf9b328f2.js +1 -0
  237. package/dashboard/.next/static/chunks/pages/_error-c91b5eabd7ac9382.js +1 -0
  238. package/dashboard/.next/static/chunks/webpack-6da70e4f9fcf1799.js +1 -0
  239. package/dashboard/.next/static/css/ceafd91ca8dd753d.css +3 -0
  240. package/dashboard/.next/static/css/e4aad1f9c715b79a.css +1 -0
  241. package/dashboard/.next/static/media/39f449c8730c2295-s.woff2 +0 -0
  242. package/dashboard/.next/static/media/86f65e8637cc94e3-s.woff2 +0 -0
  243. package/dashboard/.next/static/media/8760c4774489e4ba-s.p.woff2 +0 -0
  244. package/dashboard/.next/static/media/9fabb9c65b63d798-s.woff2 +0 -0
  245. package/dashboard/.next/static/media/Assistant-Bold.c8f39f24.woff2 +0 -0
  246. package/dashboard/.next/static/media/Assistant-Medium.1e75d8e6.woff2 +0 -0
  247. package/dashboard/.next/static/media/Assistant-Regular.7acbabb8.woff2 +0 -0
  248. package/dashboard/.next/static/media/Assistant-SemiBold.167acbf8.woff2 +0 -0
  249. package/dashboard/.next/static/media/a1f87af3f44fadbb-s.woff2 +0 -0
  250. package/dashboard/.next/static/media/f9e1dbe9676d9bb6-s.woff2 +0 -0
  251. package/dashboard/app/api/code/route.ts +26 -20
  252. package/dashboard/app/api/comments/route.ts +158 -0
  253. package/dashboard/app/api/diagrams/[name]/export/route.ts +26 -0
  254. package/dashboard/app/api/diagrams/[name]/resolve/route.ts +25 -0
  255. package/dashboard/app/api/diagrams/[name]/route.ts +37 -0
  256. package/dashboard/app/api/figures/[name]/route.ts +15 -0
  257. package/dashboard/app/api/focus/route.ts +35 -0
  258. package/dashboard/app/api/invariants/[id]/route.ts +35 -0
  259. package/dashboard/app/api/issues/[id]/revert-auto/route.ts +18 -0
  260. package/dashboard/app/api/nav/route.ts +120 -0
  261. package/dashboard/app/api/palette/route.ts +68 -0
  262. package/dashboard/app/api/progress/route.ts +54 -23
  263. package/dashboard/app/api/xref/route.ts +30 -0
  264. package/dashboard/app/changes/ChangesClient.tsx +838 -0
  265. package/dashboard/app/changes/page.tsx +44 -0
  266. package/dashboard/app/excalidraw-assets/[...path]/route.ts +56 -0
  267. package/dashboard/app/globals.css +231 -77
  268. package/dashboard/app/issues/BoardClient.tsx +817 -0
  269. package/dashboard/app/issues/page.tsx +27 -272
  270. package/dashboard/app/layout.tsx +37 -10
  271. package/dashboard/app/model/ModelClient.tsx +1303 -0
  272. package/dashboard/app/model/page.tsx +98 -0
  273. package/dashboard/app/page.tsx +195 -239
  274. package/dashboard/app/report/ReportClient.tsx +147 -74
  275. package/dashboard/app/report/page.tsx +25 -14
  276. package/dashboard/app/review/ReviewClient.tsx +1180 -0
  277. package/dashboard/app/review/page.tsx +93 -0
  278. package/dashboard/components/AutoRefresh.tsx +22 -19
  279. package/dashboard/components/CodeComments.tsx +303 -0
  280. package/dashboard/components/CodeNav.tsx +523 -0
  281. package/dashboard/components/CodeReference.tsx +92 -99
  282. package/dashboard/components/CodeViewer.tsx +526 -0
  283. package/dashboard/components/CommandPalette.tsx +141 -66
  284. package/dashboard/components/DiagramCanvas.tsx +275 -0
  285. package/dashboard/components/DianeNote.tsx +244 -0
  286. package/dashboard/components/LiveStatus.tsx +30 -68
  287. package/dashboard/components/MarkdownRenderer.tsx +34 -32
  288. package/dashboard/components/RecordButton.tsx +132 -0
  289. package/dashboard/components/ui/Button.tsx +39 -0
  290. package/dashboard/components/ui/Chip.tsx +37 -0
  291. package/dashboard/components/ui/EmptyState.tsx +31 -0
  292. package/dashboard/components/ui/Icons.tsx +126 -0
  293. package/dashboard/components/ui/Inspector.tsx +122 -0
  294. package/dashboard/components/ui/Kbd.tsx +15 -0
  295. package/dashboard/components/ui/ListRow.tsx +92 -0
  296. package/dashboard/components/ui/LocalTime.tsx +14 -0
  297. package/dashboard/components/ui/ProgressRing.tsx +54 -0
  298. package/dashboard/components/ui/ResizeHandle.tsx +93 -0
  299. package/dashboard/components/ui/RiskMeter.tsx +27 -0
  300. package/dashboard/components/ui/SearchField.tsx +55 -0
  301. package/dashboard/components/ui/SegmentedControl.tsx +71 -0
  302. package/dashboard/components/ui/SeverityDot.tsx +57 -0
  303. package/dashboard/components/ui/Sidebar.tsx +236 -0
  304. package/dashboard/components/ui/SplitView.tsx +122 -0
  305. package/dashboard/components/ui/StateGlyph.tsx +66 -0
  306. package/dashboard/components/ui/Toast.tsx +91 -0
  307. package/dashboard/lib/api.ts +17 -0
  308. package/dashboard/lib/cn.ts +4 -0
  309. package/dashboard/lib/data.ts +2 -21
  310. package/dashboard/lib/finding-markdown.ts +1 -1
  311. package/dashboard/lib/focus.ts +42 -0
  312. package/dashboard/lib/hotkeys.ts +41 -0
  313. package/dashboard/lib/inline-markdown.test.ts +11 -0
  314. package/dashboard/lib/live.ts +32 -0
  315. package/dashboard/lib/pane-width.ts +36 -0
  316. package/dashboard/lib/server/board.ts +229 -0
  317. package/dashboard/lib/server/diagrams.ts +191 -0
  318. package/dashboard/lib/server/safe-path.ts +28 -0
  319. package/dashboard/lib/server/workspace.ts +113 -0
  320. package/dashboard/lib/server/xref.ts +42 -0
  321. package/dashboard/lib/solidity.test.ts +37 -0
  322. package/dashboard/lib/solidity.ts +191 -0
  323. package/dashboard/lib/source.ts +28 -0
  324. package/dashboard/lib/types.ts +164 -0
  325. package/dashboard/lib/url.ts +18 -0
  326. package/dashboard/lib/watcher.ts +31 -22
  327. package/dashboard/tailwind.config.ts +6 -3
  328. package/dist/analysis/code-model.d.ts +113 -0
  329. package/dist/analysis/code-model.d.ts.map +1 -0
  330. package/dist/analysis/code-model.js +532 -0
  331. package/dist/analysis/code-model.js.map +1 -0
  332. package/dist/analysis/diff.d.ts +75 -0
  333. package/dist/analysis/diff.d.ts.map +1 -0
  334. package/dist/analysis/diff.js +787 -0
  335. package/dist/analysis/diff.js.map +1 -0
  336. package/dist/commands/analyze.d.ts.map +1 -1
  337. package/dist/commands/analyze.js +25 -40
  338. package/dist/commands/analyze.js.map +1 -1
  339. package/dist/commands/claude.d.ts.map +1 -1
  340. package/dist/commands/claude.js +5 -0
  341. package/dist/commands/claude.js.map +1 -1
  342. package/dist/commands/dashboard.d.ts.map +1 -1
  343. package/dist/commands/dashboard.js +10 -2
  344. package/dist/commands/dashboard.js.map +1 -1
  345. package/dist/commands/diagram.d.ts +3 -0
  346. package/dist/commands/diagram.d.ts.map +1 -0
  347. package/dist/commands/diagram.js +71 -0
  348. package/dist/commands/diagram.js.map +1 -0
  349. package/dist/commands/diff.d.ts +25 -0
  350. package/dist/commands/diff.d.ts.map +1 -0
  351. package/dist/commands/diff.js +257 -0
  352. package/dist/commands/diff.js.map +1 -0
  353. package/dist/commands/doctor.d.ts.map +1 -1
  354. package/dist/commands/doctor.js +5 -18
  355. package/dist/commands/doctor.js.map +1 -1
  356. package/dist/commands/facts.d.ts +23 -0
  357. package/dist/commands/facts.d.ts.map +1 -0
  358. package/dist/commands/facts.js +121 -0
  359. package/dist/commands/facts.js.map +1 -0
  360. package/dist/commands/fix-review.d.ts +9 -0
  361. package/dist/commands/fix-review.d.ts.map +1 -0
  362. package/dist/commands/fix-review.js +367 -0
  363. package/dist/commands/fix-review.js.map +1 -0
  364. package/dist/commands/init.d.ts.map +1 -1
  365. package/dist/commands/init.js +106 -42
  366. package/dist/commands/init.js.map +1 -1
  367. package/dist/commands/issue.d.ts.map +1 -1
  368. package/dist/commands/issue.js +154 -5
  369. package/dist/commands/issue.js.map +1 -1
  370. package/dist/commands/mcp.d.ts +3 -0
  371. package/dist/commands/mcp.d.ts.map +1 -0
  372. package/dist/commands/mcp.js +11 -0
  373. package/dist/commands/mcp.js.map +1 -0
  374. package/dist/commands/model.d.ts +4 -0
  375. package/dist/commands/model.d.ts.map +1 -0
  376. package/dist/commands/model.js +275 -0
  377. package/dist/commands/model.js.map +1 -0
  378. package/dist/commands/note.d.ts.map +1 -1
  379. package/dist/commands/note.js +61 -3
  380. package/dist/commands/note.js.map +1 -1
  381. package/dist/commands/review.d.ts +4 -0
  382. package/dist/commands/review.d.ts.map +1 -0
  383. package/dist/commands/review.js +164 -0
  384. package/dist/commands/review.js.map +1 -0
  385. package/dist/core/comments.d.ts +59 -0
  386. package/dist/core/comments.d.ts.map +1 -0
  387. package/dist/core/comments.js +263 -0
  388. package/dist/core/comments.js.map +1 -0
  389. package/dist/core/config.d.ts +9 -0
  390. package/dist/core/config.d.ts.map +1 -1
  391. package/dist/core/config.js +18 -1
  392. package/dist/core/config.js.map +1 -1
  393. package/dist/core/dedup.d.ts +56 -0
  394. package/dist/core/dedup.d.ts.map +1 -0
  395. package/dist/core/dedup.js +208 -0
  396. package/dist/core/dedup.js.map +1 -0
  397. package/dist/core/errors.d.ts +1 -1
  398. package/dist/core/errors.d.ts.map +1 -1
  399. package/dist/core/errors.js +16 -15
  400. package/dist/core/errors.js.map +1 -1
  401. package/dist/core/external-tools.d.ts +0 -14
  402. package/dist/core/external-tools.d.ts.map +1 -1
  403. package/dist/core/external-tools.js +2 -52
  404. package/dist/core/external-tools.js.map +1 -1
  405. package/dist/core/fix-review.d.ts +54 -0
  406. package/dist/core/fix-review.d.ts.map +1 -0
  407. package/dist/core/fix-review.js +98 -0
  408. package/dist/core/fix-review.js.map +1 -0
  409. package/dist/core/fuzz-sync.d.ts +93 -0
  410. package/dist/core/fuzz-sync.d.ts.map +1 -0
  411. package/dist/core/fuzz-sync.js +516 -0
  412. package/dist/core/fuzz-sync.js.map +1 -0
  413. package/dist/core/git.d.ts +31 -0
  414. package/dist/core/git.d.ts.map +1 -0
  415. package/dist/core/git.js +157 -0
  416. package/dist/core/git.js.map +1 -0
  417. package/dist/core/issues.d.ts +35 -2
  418. package/dist/core/issues.d.ts.map +1 -1
  419. package/dist/core/issues.js +201 -30
  420. package/dist/core/issues.js.map +1 -1
  421. package/dist/core/mcp-config.d.ts +12 -0
  422. package/dist/core/mcp-config.d.ts.map +1 -0
  423. package/dist/core/mcp-config.js +29 -0
  424. package/dist/core/mcp-config.js.map +1 -0
  425. package/dist/core/model.d.ts +38 -0
  426. package/dist/core/model.d.ts.map +1 -0
  427. package/dist/core/model.js +160 -0
  428. package/dist/core/model.js.map +1 -0
  429. package/dist/core/notes.d.ts +27 -1
  430. package/dist/core/notes.d.ts.map +1 -1
  431. package/dist/core/notes.js +47 -5
  432. package/dist/core/notes.js.map +1 -1
  433. package/dist/core/review.d.ts +47 -0
  434. package/dist/core/review.d.ts.map +1 -1
  435. package/dist/core/review.js +177 -1
  436. package/dist/core/review.js.map +1 -1
  437. package/dist/core/rules.d.ts +12 -0
  438. package/dist/core/rules.d.ts.map +1 -0
  439. package/dist/core/rules.js +66 -0
  440. package/dist/core/rules.js.map +1 -0
  441. package/dist/core/schema.d.ts +5458 -2189
  442. package/dist/core/schema.d.ts.map +1 -1
  443. package/dist/core/schema.js +605 -114
  444. package/dist/core/schema.js.map +1 -1
  445. package/dist/core/scope.d.ts +8 -0
  446. package/dist/core/scope.d.ts.map +1 -0
  447. package/dist/core/scope.js +18 -0
  448. package/dist/core/scope.js.map +1 -0
  449. package/dist/core/skills.d.ts +10 -4
  450. package/dist/core/skills.d.ts.map +1 -1
  451. package/dist/core/skills.js +100 -37
  452. package/dist/core/skills.js.map +1 -1
  453. package/dist/diagrams/build.d.ts +18 -0
  454. package/dist/diagrams/build.d.ts.map +1 -0
  455. package/dist/diagrams/build.js +135 -0
  456. package/dist/diagrams/build.js.map +1 -0
  457. package/dist/diagrams/excalidraw.d.ts +27 -0
  458. package/dist/diagrams/excalidraw.d.ts.map +1 -0
  459. package/dist/diagrams/excalidraw.js +219 -0
  460. package/dist/diagrams/excalidraw.js.map +1 -0
  461. package/dist/diagrams/layout.d.ts +48 -0
  462. package/dist/diagrams/layout.d.ts.map +1 -0
  463. package/dist/diagrams/layout.js +686 -0
  464. package/dist/diagrams/layout.js.map +1 -0
  465. package/dist/facts/build.d.ts +23 -0
  466. package/dist/facts/build.d.ts.map +1 -0
  467. package/dist/facts/build.js +112 -0
  468. package/dist/facts/build.js.map +1 -0
  469. package/dist/facts/extract.d.ts +53 -0
  470. package/dist/facts/extract.d.ts.map +1 -0
  471. package/dist/facts/extract.js +635 -0
  472. package/dist/facts/extract.js.map +1 -0
  473. package/dist/facts/fallback.d.ts +7 -0
  474. package/dist/facts/fallback.d.ts.map +1 -0
  475. package/dist/facts/fallback.js +156 -0
  476. package/dist/facts/fallback.js.map +1 -0
  477. package/dist/facts/implementations.d.ts +29 -0
  478. package/dist/facts/implementations.d.ts.map +1 -0
  479. package/dist/facts/implementations.js +43 -0
  480. package/dist/facts/implementations.js.map +1 -0
  481. package/dist/facts/query.d.ts +35 -0
  482. package/dist/facts/query.d.ts.map +1 -0
  483. package/dist/facts/query.js +157 -0
  484. package/dist/facts/query.js.map +1 -0
  485. package/dist/facts/xref.d.ts +53 -0
  486. package/dist/facts/xref.d.ts.map +1 -0
  487. package/dist/facts/xref.js +282 -0
  488. package/dist/facts/xref.js.map +1 -0
  489. package/dist/index.js +16 -16
  490. package/dist/index.js.map +1 -1
  491. package/dist/mcp/server.d.ts +3 -0
  492. package/dist/mcp/server.d.ts.map +1 -0
  493. package/dist/mcp/server.js +400 -0
  494. package/dist/mcp/server.js.map +1 -0
  495. package/dist/skills/ai-audit/LICENSE +21 -0
  496. package/dist/skills/ai-audit/SKILL.md +486 -0
  497. package/dist/skills/ai-audit/UPSTREAM.md +51 -0
  498. package/dist/skills/ai-audit/references/agent-prompts.md +133 -0
  499. package/dist/skills/ai-audit/references/assemble.sh +357 -0
  500. package/dist/skills/ai-audit/references/dedup-and-assembly.md +420 -0
  501. package/dist/skills/ai-audit/references/hacking-agents/access-control-agent.md +27 -0
  502. package/dist/skills/ai-audit/references/hacking-agents/asymmetry-agent.md +77 -0
  503. package/dist/skills/ai-audit/references/hacking-agents/boundary-agent.md +79 -0
  504. package/dist/skills/ai-audit/references/hacking-agents/economic-security-agent.md +35 -0
  505. package/dist/skills/ai-audit/references/hacking-agents/execution-trace-agent.md +33 -0
  506. package/dist/skills/ai-audit/references/hacking-agents/first-principles-agent.md +36 -0
  507. package/dist/skills/ai-audit/references/hacking-agents/flow-gap-agent.md +49 -0
  508. package/dist/skills/ai-audit/references/hacking-agents/invariant-agent.md +44 -0
  509. package/dist/skills/ai-audit/references/hacking-agents/math-precision-agent.md +48 -0
  510. package/dist/skills/ai-audit/references/hacking-agents/numerical-gap-agent.md +46 -0
  511. package/dist/skills/ai-audit/references/hacking-agents/periphery-agent.md +27 -0
  512. package/dist/skills/ai-audit/references/hacking-agents/shared-rules.md +61 -0
  513. package/dist/skills/ai-audit/references/hacking-agents/trust-gap-agent.md +40 -0
  514. package/dist/skills/ai-audit/references/hex-board.md +211 -0
  515. package/dist/skills/ai-audit/references/hex-export.sh +71 -0
  516. package/dist/skills/ai-audit/references/judging.md +75 -0
  517. package/dist/skills/ai-audit/references/report-formatting.md +385 -0
  518. package/dist/skills/ai-audit/references/report-language.md +151 -0
  519. package/dist/skills/ai-audit/references/senior-auditor-sop.md +63 -0
  520. package/dist/skills/diane.md +26 -12
  521. package/dist/skills/fix-review.md +58 -0
  522. package/dist/skills/fuzz/LICENSE +21 -0
  523. package/dist/skills/fuzz/SKILL.md +655 -0
  524. package/dist/skills/fuzz/UPSTREAM.md +119 -0
  525. package/dist/skills/fuzz/agents/implementers/global-property-implementer.md +81 -0
  526. package/dist/skills/fuzz/agents/implementers/specific-property-implementer.md +121 -0
  527. package/dist/skills/fuzz/agents/invariant-discovery/adversarial-profit-maximizer.md +123 -0
  528. package/dist/skills/fuzz/agents/invariant-discovery/conservation-auditor.md +92 -0
  529. package/dist/skills/fuzz/agents/invariant-discovery/protocol-type-specialist.md +173 -0
  530. package/dist/skills/fuzz/agents/invariant-discovery/roundtrip-rounding-analyst.md +164 -0
  531. package/dist/skills/fuzz/agents/invariant-discovery/state-transition-mapper.md +92 -0
  532. package/dist/skills/fuzz/agents/invariant-discovery/synthesizer.md +261 -0
  533. package/dist/skills/fuzz/agents/protocol-analyzer.md +80 -0
  534. package/dist/skills/fuzz/agents/report-writer.md +135 -0
  535. package/dist/skills/fuzz/references/handler-patterns.md +222 -0
  536. package/dist/skills/fuzz/references/hex-invariants.md +102 -0
  537. package/dist/skills/fuzz/references/property-generation.md +149 -0
  538. package/dist/skills/fuzz/references/selection-policy.md +49 -0
  539. package/dist/skills/fuzz/references/setup-playbook.md +92 -0
  540. package/dist/skills/fuzz/references/template-map.md +121 -0
  541. package/dist/skills/fuzz/scripts/ensure_foundry.sh +125 -0
  542. package/dist/skills/fuzz/scripts/estimate_cost.js +157 -0
  543. package/dist/skills/fuzz/scripts/extract_abis.js +303 -0
  544. package/dist/skills/fuzz/scripts/fizz_sync.js +692 -0
  545. package/dist/skills/fuzz/scripts/generate_handlers.js +370 -0
  546. package/dist/skills/fuzz/scripts/generate_suite.js +254 -0
  547. package/dist/skills/fuzz/scripts/lib/log-viewer.js +332 -0
  548. package/dist/skills/fuzz/scripts/run_echidna.js +192 -0
  549. package/dist/skills/fuzz/scripts/run_medusa.js +329 -0
  550. package/dist/skills/fuzz/scripts/select_functions.js +637 -0
  551. package/dist/skills/fuzz/scripts/setup_fuzz_profile.sh +142 -0
  552. package/dist/skills/fuzz/templates/Actor.sol +63 -0
  553. package/dist/skills/fuzz/templates/Base.sol +121 -0
  554. package/dist/skills/fuzz/templates/FoundryTester.sol +29 -0
  555. package/dist/skills/fuzz/templates/FuzzTester.sol +11 -0
  556. package/dist/skills/fuzz/templates/Properties.sol +17 -0
  557. package/dist/skills/fuzz/templates/README.md +56 -0
  558. package/dist/skills/fuzz/templates/Snapshots.sol +26 -0
  559. package/dist/skills/fuzz/templates/echidna.yaml +18 -0
  560. package/dist/skills/fuzz/templates/handlers/Handlers.sol +13 -0
  561. package/dist/skills/fuzz/templates/medusa.json +93 -0
  562. package/dist/skills/fuzz/templates/utils/Clamp.sol +223 -0
  563. package/dist/skills/fuzz/templates/utils/DecimalPrinter.sol +63 -0
  564. package/dist/skills/fuzz/templates/utils/Deployer.sol +17 -0
  565. package/dist/skills/fuzz/templates/utils/EnumerableSet.sol +206 -0
  566. package/dist/skills/fuzz/templates/utils/Hevm.sol +62 -0
  567. package/dist/skills/fuzz/templates/utils/Logger.sol +619 -0
  568. package/dist/skills/fuzz/templates/utils/Math.sol +52 -0
  569. package/dist/skills/fuzz/templates/utils/MockERC20.sol +279 -0
  570. package/dist/skills/fuzz/templates/utils/PropertiesAsserts.sol +238 -0
  571. package/dist/skills/fuzz/templates/utils/StringUtils.sol +85 -0
  572. package/dist/skills/fuzz-convert/SKILL.md +249 -0
  573. package/dist/skills/fuzz-sync/SKILL.md +342 -0
  574. package/dist/skills/generate-poc.md +8 -26
  575. package/dist/skills/generate-report.md +24 -8
  576. package/dist/skills/ingest-aa-report.md +11 -30
  577. package/dist/skills/init-audit/SKILL.md +155 -0
  578. package/dist/skills/init-audit/references/agents/conformance-checker.md +36 -0
  579. package/dist/skills/init-audit/references/agents/contract-reader.md +59 -0
  580. package/dist/skills/init-audit/references/agents/diagram-composer.md +48 -0
  581. package/dist/skills/init-audit/references/agents/docs-extractor.md +26 -0
  582. package/dist/skills/init-audit/references/agents/prior-audit.md +32 -0
  583. package/dist/skills/init-audit/references/agents/regression-checker.md +28 -0
  584. package/dist/skills/init-audit/references/agents/skeptic.md +31 -0
  585. package/dist/skills/init-audit/references/agents/standards-checker.md +39 -0
  586. package/dist/skills/init-audit/references/agents/synthesizer.md +50 -0
  587. package/dist/skills/prevalidate.md +62 -0
  588. package/dist/skills/sync-issues.md +11 -25
  589. package/dist/skills/validate-all-findings.md +3 -3
  590. package/dist/skills/validate-finding.md +33 -28
  591. package/dist/skills/write-finding.md +6 -5
  592. package/dist/types/index.d.ts +22 -12
  593. package/dist/types/index.d.ts.map +1 -1
  594. package/package.json +6 -4
  595. package/dashboard/.next/server/app/_not-found.html +0 -1
  596. package/dashboard/.next/server/app/_not-found.meta +0 -6
  597. package/dashboard/.next/server/app/_not-found.rsc +0 -12
  598. package/dashboard/.next/server/app/access/page.js +0 -1
  599. package/dashboard/.next/server/app/access/page_client-reference-manifest.js +0 -1
  600. package/dashboard/.next/server/app/api/flows/route.js +0 -1
  601. package/dashboard/.next/server/app/api/mermaid/route.js +0 -1
  602. package/dashboard/.next/server/app/calls/page.js +0 -1
  603. package/dashboard/.next/server/app/calls/page_client-reference-manifest.js +0 -1
  604. package/dashboard/.next/server/app/conformance/page.js +0 -1
  605. package/dashboard/.next/server/app/conformance/page_client-reference-manifest.js +0 -1
  606. package/dashboard/.next/server/app/diagram/page.js +0 -1
  607. package/dashboard/.next/server/app/diagram/page.js.nft.json +0 -1
  608. package/dashboard/.next/server/app/diagram/page_client-reference-manifest.js +0 -1
  609. package/dashboard/.next/server/app/diagram.html +0 -1
  610. package/dashboard/.next/server/app/diagram.meta +0 -5
  611. package/dashboard/.next/server/app/diagram.rsc +0 -10
  612. package/dashboard/.next/server/app/flows/page.js +0 -1
  613. package/dashboard/.next/server/app/flows/page.js.nft.json +0 -1
  614. package/dashboard/.next/server/app/flows/page_client-reference-manifest.js +0 -1
  615. package/dashboard/.next/server/app/flows.html +0 -1
  616. package/dashboard/.next/server/app/flows.meta +0 -5
  617. package/dashboard/.next/server/app/flows.rsc +0 -10
  618. package/dashboard/.next/server/app/functions/page.js +0 -1
  619. package/dashboard/.next/server/app/functions/page.js.nft.json +0 -1
  620. package/dashboard/.next/server/app/functions/page_client-reference-manifest.js +0 -1
  621. package/dashboard/.next/server/app/notes/page.js +0 -22
  622. package/dashboard/.next/server/app/notes/page.js.nft.json +0 -1
  623. package/dashboard/.next/server/app/notes/page_client-reference-manifest.js +0 -1
  624. package/dashboard/.next/server/app/progress/page.js +0 -1
  625. package/dashboard/.next/server/app/progress/page.js.nft.json +0 -1
  626. package/dashboard/.next/server/app/progress/page_client-reference-manifest.js +0 -1
  627. package/dashboard/.next/server/app/stats/page.js +0 -1
  628. package/dashboard/.next/server/app/stats/page.js.nft.json +0 -1
  629. package/dashboard/.next/server/app/stats/page_client-reference-manifest.js +0 -1
  630. package/dashboard/.next/server/chunks/44.js +0 -1
  631. package/dashboard/.next/server/chunks/530.js +0 -1
  632. package/dashboard/.next/server/chunks/622.js +0 -3
  633. package/dashboard/.next/server/chunks/665.js +0 -13
  634. package/dashboard/.next/server/pages/404.html +0 -1
  635. package/dashboard/.next/static/AyrRAwu4mazjp8iX4Yjbb/_buildManifest.js +0 -1
  636. package/dashboard/.next/static/chunks/1015.3ab89142e5f44120.js +0 -226
  637. package/dashboard/.next/static/chunks/1151.b6ef5c786e587ed7.js +0 -1
  638. package/dashboard/.next/static/chunks/1199.a072929dbec89965.js +0 -148
  639. package/dashboard/.next/static/chunks/1375.d4d2f7fc9c9c2ff1.js +0 -43
  640. package/dashboard/.next/static/chunks/1799.83206776abbbf1fc.js +0 -9
  641. package/dashboard/.next/static/chunks/20154aaa.ccc347c04ab5ad4a.js +0 -1
  642. package/dashboard/.next/static/chunks/2077.7011a570c87aa7b1.js +0 -1
  643. package/dashboard/.next/static/chunks/2166.cc0fabeb2e89b840.js +0 -215
  644. package/dashboard/.next/static/chunks/2325.2c55cb9a6282ae3f.js +0 -24
  645. package/dashboard/.next/static/chunks/2694.92bbe252063e4786.js +0 -1
  646. package/dashboard/.next/static/chunks/275.0d761aa0e5b030b8.js +0 -34
  647. package/dashboard/.next/static/chunks/2781.8536b644a480aede.js +0 -93
  648. package/dashboard/.next/static/chunks/2805.a8d71d2f92bb6ba9.js +0 -1
  649. package/dashboard/.next/static/chunks/3017.e55781da9dd32d37.js +0 -1
  650. package/dashboard/.next/static/chunks/3205-728c260fbb4f89c6.js +0 -2
  651. package/dashboard/.next/static/chunks/3236.dff44fa7961d9d5e.js +0 -1
  652. package/dashboard/.next/static/chunks/3480.9451396ad7ee7613.js +0 -1
  653. package/dashboard/.next/static/chunks/3626.ba1cf848a9f2e93d.js +0 -64
  654. package/dashboard/.next/static/chunks/3865.a432a7910a2f5281.js +0 -90
  655. package/dashboard/.next/static/chunks/3887.c22cbfa3f095826c.js +0 -1
  656. package/dashboard/.next/static/chunks/3924-4a05057b5450abe1.js +0 -1
  657. package/dashboard/.next/static/chunks/3948.fe3c7d758568d98b.js +0 -287
  658. package/dashboard/.next/static/chunks/4728.07d87640a3e7dd0d.js +0 -24
  659. package/dashboard/.next/static/chunks/4787.4e5f6a0e0e40a583.js +0 -23
  660. package/dashboard/.next/static/chunks/5060.baca226af35ed016.js +0 -1
  661. package/dashboard/.next/static/chunks/5284.f949ac90c95ff143.js +0 -1
  662. package/dashboard/.next/static/chunks/5715.1524bcc9591e180b.js +0 -115
  663. package/dashboard/.next/static/chunks/6014.700ae4969b64d728.js +0 -104
  664. package/dashboard/.next/static/chunks/6024.4d23707c65514679.js +0 -79
  665. package/dashboard/.next/static/chunks/6177.e5c84cfc4c0dea51.js +0 -1
  666. package/dashboard/.next/static/chunks/618f8807-547c5614e1318888.js +0 -1
  667. package/dashboard/.next/static/chunks/6434.9481771c33195d29.js +0 -1
  668. package/dashboard/.next/static/chunks/6468.f4a3e8fa6accc6da.js +0 -77
  669. package/dashboard/.next/static/chunks/6540.86f367d7390738d4.js +0 -1
  670. package/dashboard/.next/static/chunks/6549.4d0d472df96429a5.js +0 -1
  671. package/dashboard/.next/static/chunks/690f35d0.3e40ca0930e4bbdb.js +0 -119
  672. package/dashboard/.next/static/chunks/7397-f6f4dddc7a20bfc1.js +0 -1
  673. package/dashboard/.next/static/chunks/7498-ea83cb9e30ec5491.js +0 -1
  674. package/dashboard/.next/static/chunks/7802.89aec9ee11680850.js +0 -80
  675. package/dashboard/.next/static/chunks/7973.8b526f589aca5d84.js +0 -79
  676. package/dashboard/.next/static/chunks/8216.1bead812eb126c35.js +0 -5
  677. package/dashboard/.next/static/chunks/8452-e616b5f43bceb95f.js +0 -13
  678. package/dashboard/.next/static/chunks/8645.a5ca76f11edc9633.js +0 -1
  679. package/dashboard/.next/static/chunks/8928-60c623ee89d2e6ad.js +0 -1
  680. package/dashboard/.next/static/chunks/9173.2486ffca31131ec5.js +0 -1
  681. package/dashboard/.next/static/chunks/9178.469341860bf8caec.js +0 -1
  682. package/dashboard/.next/static/chunks/9466.e904660d38c03eea.js +0 -1
  683. package/dashboard/.next/static/chunks/9660.84a85811380c5f33.js +0 -1
  684. package/dashboard/.next/static/chunks/9720.67d4d0d15a96d691.js +0 -1
  685. package/dashboard/.next/static/chunks/9811.65e1d080c2d256af.js +0 -1
  686. package/dashboard/.next/static/chunks/app/_not-found/page-548ab392d0e890d1.js +0 -1
  687. package/dashboard/.next/static/chunks/app/access/page-3668562e7464eb5d.js +0 -1
  688. package/dashboard/.next/static/chunks/app/calls/page-d07f5b8664cc8303.js +0 -1
  689. package/dashboard/.next/static/chunks/app/conformance/page-2fede1d7b5f9265d.js +0 -1
  690. package/dashboard/.next/static/chunks/app/diagram/page-b228444265546495.js +0 -1
  691. package/dashboard/.next/static/chunks/app/flows/page-fa67783d8cd79cab.js +0 -1
  692. package/dashboard/.next/static/chunks/app/functions/page-686f0296639133a3.js +0 -1
  693. package/dashboard/.next/static/chunks/app/issues/page-98a298e1c1045c91.js +0 -1
  694. package/dashboard/.next/static/chunks/app/layout-49f2496c7637d931.js +0 -1
  695. package/dashboard/.next/static/chunks/app/notes/page-17af94c67ba79c00.js +0 -1
  696. package/dashboard/.next/static/chunks/app/page-24bac51dfe007c66.js +0 -1
  697. package/dashboard/.next/static/chunks/app/progress/page-427fb18da3afb061.js +0 -1
  698. package/dashboard/.next/static/chunks/app/report/page-796f2f4a8a5ac8f7.js +0 -1
  699. package/dashboard/.next/static/chunks/app/stats/page-db81f600a086f252.js +0 -1
  700. package/dashboard/.next/static/chunks/c7ea4e13.5effeeba6618bdb7.js +0 -1
  701. package/dashboard/.next/static/chunks/framework-cf6f5bdca6ba0184.js +0 -33
  702. package/dashboard/.next/static/chunks/main-63ff429eab01f5bf.js +0 -1
  703. package/dashboard/.next/static/chunks/main-app-9d2f6b8a47133e9b.js +0 -1
  704. package/dashboard/.next/static/chunks/pages/_app-6ad2b50514c24ab4.js +0 -1
  705. package/dashboard/.next/static/chunks/pages/_error-d5eb11c5c4626811.js +0 -1
  706. package/dashboard/.next/static/chunks/webpack-08869f2b18792e51.js +0 -1
  707. package/dashboard/.next/static/css/4a38d8f6f6b7a68f.css +0 -3
  708. package/dashboard/.next/static/media/438aa629764e75f3-s.woff2 +0 -0
  709. package/dashboard/.next/static/media/4c9affa5bc8f420e-s.p.woff2 +0 -0
  710. package/dashboard/.next/static/media/51251f8b9793cdb3-s.woff2 +0 -0
  711. package/dashboard/.next/static/media/875ae681bfde4580-s.woff2 +0 -0
  712. package/dashboard/.next/static/media/cc978ac5ee68c2b6-s.woff2 +0 -0
  713. package/dashboard/.next/static/media/e857b654a2caa584-s.woff2 +0 -0
  714. package/dashboard/app/access/AccessClient.tsx +0 -402
  715. package/dashboard/app/access/ReadOnlyFunctions.tsx +0 -114
  716. package/dashboard/app/access/page.tsx +0 -125
  717. package/dashboard/app/api/flows/route.ts +0 -32
  718. package/dashboard/app/api/mermaid/route.ts +0 -25
  719. package/dashboard/app/calls/CallsClient.tsx +0 -170
  720. package/dashboard/app/calls/page.tsx +0 -57
  721. package/dashboard/app/conformance/ConformanceTable.tsx +0 -214
  722. package/dashboard/app/conformance/page.tsx +0 -186
  723. package/dashboard/app/diagram/page.tsx +0 -65
  724. package/dashboard/app/flows/page.tsx +0 -102
  725. package/dashboard/app/functions/FunctionsClient.tsx +0 -167
  726. package/dashboard/app/functions/page.tsx +0 -178
  727. package/dashboard/app/issues/IssuesBoardClient.tsx +0 -803
  728. package/dashboard/app/notes/NotesClient.tsx +0 -701
  729. package/dashboard/app/notes/page.tsx +0 -47
  730. package/dashboard/app/progress/ProgressClient.tsx +0 -354
  731. package/dashboard/app/progress/page.tsx +0 -127
  732. package/dashboard/app/stats/StatsClient.tsx +0 -452
  733. package/dashboard/app/stats/page.tsx +0 -50
  734. package/dashboard/components/ConfidenceBadge.tsx +0 -53
  735. package/dashboard/components/DashboardLayout.tsx +0 -485
  736. package/dashboard/components/FilterableTable.tsx +0 -293
  737. package/dashboard/components/MermaidViewer.tsx +0 -267
  738. package/dashboard/components/NotYetGenerated.tsx +0 -32
  739. package/dashboard/components/SeverityBadge.tsx +0 -28
  740. package/dashboard/components/SignalBars.tsx +0 -27
  741. package/dashboard/components/SortableTable.tsx +0 -122
  742. package/dashboard/lib/conformance-tokens.ts +0 -49
  743. package/dist/skills/init-audit.md +0 -284
  744. /package/dashboard/.next/server/app/api/{flows → xref}/route.js.nft.json +0 -0
  745. /package/dashboard/.next/server/app/{api/mermaid → excalidraw-assets/[...path]}/route.js.nft.json +0 -0
  746. /package/dashboard/.next/static/{AyrRAwu4mazjp8iX4Yjbb → bGV1ry1vvIbM5b506eVBR}/_ssgManifest.js +0 -0
@@ -0,0 +1,367 @@
1
+ import { Command } from 'commander';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { execFileSync, spawnSync } from 'node:child_process';
5
+ import { logger } from '../core/logger.js';
6
+ import { loadProjectContext } from '../core/config.js';
7
+ import { reportError } from '../core/errors.js';
8
+ import { resolveCommit, withWorktree } from '../core/git.js';
9
+ import { FixReviewSchema } from '../core/schema.js';
10
+ import { functionsForFinding } from '../core/dedup.js';
11
+ import { classifyCard, commitsForCard, findUnmappedChange, rewriteIssueBody, } from '../core/fix-review.js';
12
+ import { loadFacts } from '../facts/query.js';
13
+ import { computeProjectDiff } from './diff.js';
14
+ function readJson(file) {
15
+ try {
16
+ return JSON.parse(fs.readFileSync(file, 'utf-8'));
17
+ }
18
+ catch {
19
+ return null;
20
+ }
21
+ }
22
+ function gitLog(projectDir, from, to) {
23
+ const out = execFileSync('git', ['-C', projectDir, 'log', '--format=%H%x1f%s%x1f%b%x1e', `${from}..${to}`], {
24
+ encoding: 'utf-8',
25
+ maxBuffer: 64 * 1024 * 1024,
26
+ });
27
+ return out
28
+ .split('\x1e')
29
+ .map((r) => r.trim())
30
+ .filter(Boolean)
31
+ .map((r) => {
32
+ const [sha, subject, body] = r.split('\x1f');
33
+ return { sha, subject, body };
34
+ });
35
+ }
36
+ /** Run one PoC test file with forge in `dir`; map the outcome to a PoC result. */
37
+ function runPoc(dir, file) {
38
+ if (!fs.existsSync(path.join(dir, file)))
39
+ return 'missing';
40
+ const r = spawnSync('forge', ['test', '--match-path', file, '-vv'], {
41
+ cwd: dir,
42
+ encoding: 'utf-8',
43
+ timeout: 15 * 60_000,
44
+ maxBuffer: 64 * 1024 * 1024,
45
+ });
46
+ const text = `${r.stdout ?? ''}${r.stderr ?? ''}`;
47
+ if (/Compiler run failed|Error \(\d+\)|compilation failed/i.test(text))
48
+ return 'error';
49
+ if (r.status === 0 && /\[PASS\]/.test(text))
50
+ return 'passing';
51
+ if (/\[FAIL/.test(text))
52
+ return 'failing';
53
+ return 'error';
54
+ }
55
+ export function computeFixReview(config, outputDir, from, to, opts) {
56
+ const projectDir = config.project.project_dir;
57
+ const { diff } = computeProjectDiff(config, {
58
+ base: from,
59
+ head: to,
60
+ outputDir,
61
+ noCompile: !opts.compile,
62
+ });
63
+ const facts = loadFacts(outputDir);
64
+ const findings = readJson(path.join(outputDir, 'findings.json'))?.findings ?? [];
65
+ const tracking = readJson(path.join(outputDir, 'tracking.json'))?.findings ?? [];
66
+ const reportable = new Set(tracking.filter((t) => t.status === 'verified' || t.status === 'synced').map((t) => t.id));
67
+ const cards = findings.filter((f) => reportable.has(f.id));
68
+ const codeChanges = diff.changes.filter((c) => c.change !== 'comments_only' &&
69
+ (c.kind === 'function' || c.kind === 'modifier' || c.kind === 'state_variable'));
70
+ const changedIds = new Set(codeChanges.map((c) => `${c.contract}.${c.entity}`));
71
+ const removedIds = new Set(codeChanges.filter((c) => c.change === 'removed').map((c) => `${c.contract}.${c.entity}`));
72
+ const log = gitLog(projectDir, from, to);
73
+ // PoC results at the fix commit, in one throwaway worktree. PoC files live in
74
+ // the auditor's checkout (test/hex-pocs), so they are copied in first.
75
+ const after = new Map();
76
+ if (opts.runPocs) {
77
+ const withPoc = cards.filter((c) => c.poc?.file);
78
+ if (withPoc.length) {
79
+ withWorktree(projectDir, to, path.join(outputDir, '.cache'), (wt) => {
80
+ for (const c of withPoc) {
81
+ const file = c.poc.file;
82
+ const src = path.join(projectDir, file);
83
+ if (!fs.existsSync(src)) {
84
+ after.set(c.id, 'missing');
85
+ continue;
86
+ }
87
+ fs.mkdirSync(path.dirname(path.join(wt, file)), { recursive: true });
88
+ fs.copyFileSync(src, path.join(wt, file));
89
+ logger.dim(` PoC ${c.id}: forge test --match-path ${file}`);
90
+ after.set(c.id, runPoc(wt, file));
91
+ }
92
+ });
93
+ }
94
+ }
95
+ const mapped = new Set();
96
+ const out = cards.map((c) => {
97
+ const fns = facts ? functionsForFinding(facts, c, projectDir) : [];
98
+ const changed = fns.filter((f) => changedIds.has(f));
99
+ for (const f of changed)
100
+ mapped.add(f);
101
+ const commits = commitsForCard(log, { id: c.id, github_issue: c.github?.issue_number });
102
+ const before = c.poc?.status === 'passing'
103
+ ? 'passing'
104
+ : c.poc?.status === 'failing'
105
+ ? 'failing'
106
+ : c.poc?.file
107
+ ? undefined
108
+ : 'missing';
109
+ const pocAfter = after.get(c.id);
110
+ const { status, evidence } = classifyCard({
111
+ pocBefore: before,
112
+ pocAfter,
113
+ cardFunctions: fns,
114
+ changedFunctions: changed,
115
+ removedFunctions: fns.filter((f) => removedIds.has(f)),
116
+ commits,
117
+ });
118
+ const proposed = status === 'fixed'
119
+ ? { resolution: 'Fixed' }
120
+ : status === 'not_fixed' || status === 'unaddressed'
121
+ ? { resolution: 'Unresolved' }
122
+ : {};
123
+ return {
124
+ id: c.id,
125
+ title: c.title,
126
+ severity: c.severity,
127
+ ...(c.github?.issue_number ? { github_issue: c.github.issue_number } : {}),
128
+ status,
129
+ evidence,
130
+ poc: {
131
+ ...(c.poc?.file ? { file: c.poc.file } : {}),
132
+ ...(before ? { before: before } : {}),
133
+ ...(pocAfter ? { after: pocAfter } : {}),
134
+ },
135
+ changed_functions: changed,
136
+ commits,
137
+ proposed,
138
+ };
139
+ });
140
+ const unmapped = codeChanges
141
+ .filter((c) => !mapped.has(`${c.contract}.${c.entity}`))
142
+ .map((c) => ({
143
+ contract: c.contract,
144
+ entity: c.entity,
145
+ kind: c.kind,
146
+ change: c.change,
147
+ file: c.file,
148
+ // Head-side impact from the diff (the change may not exist in the audit-time facts).
149
+ impacted_entry_points: [
150
+ ...new Set(diff.impacted
151
+ .filter((i) => i.is_entry_point &&
152
+ (`${i.contract}.${i.function}` === `${c.contract}.${c.entity}` ||
153
+ i.reasons.some((r) => r.via === `${c.contract}.${c.entity}` || r.via.startsWith(`${c.entity} `))))
154
+ .map((i) => `${i.contract}.${i.function}`)),
155
+ ].sort(),
156
+ reviewed: false,
157
+ }));
158
+ const count = (s) => out.filter((c) => c.status === s).length;
159
+ return FixReviewSchema.parse({
160
+ generated_at: new Date().toISOString(),
161
+ from_commit: diff.base_commit,
162
+ to_commit: diff.head_commit,
163
+ cards: out,
164
+ unmapped_changes: unmapped,
165
+ summary: {
166
+ fixed: count('fixed'),
167
+ partially_fixed: count('partially_fixed'),
168
+ not_fixed: count('not_fixed'),
169
+ unaddressed: count('unaddressed'),
170
+ unknown: count('unknown'),
171
+ unmapped: unmapped.length,
172
+ },
173
+ });
174
+ }
175
+ const fixReviewPath = (outputDir, sha) => path.join(outputDir, 'fix-review', `${sha.slice(0, 12)}.json`);
176
+ /**
177
+ * The saved review of a fix commit named the way people (and the skill) name it: a short or
178
+ * full SHA, a branch or any other ref. Files are keyed by the first 12 characters of the full SHA.
179
+ */
180
+ function savedFixReview(config, outputDir, ref) {
181
+ let sha = ref;
182
+ try {
183
+ sha = resolveCommit(config.project.project_dir, ref);
184
+ }
185
+ catch {
186
+ /* not resolvable here (e.g. a shallow clone): match the file name instead */
187
+ }
188
+ const exact = fixReviewPath(outputDir, sha);
189
+ if (fs.existsSync(exact))
190
+ return exact;
191
+ const dir = path.dirname(exact);
192
+ const hits = fs.existsSync(dir)
193
+ ? fs.readdirSync(dir).filter((f) => f.endsWith('.json') && f.startsWith(ref.slice(0, 12)))
194
+ : [];
195
+ if (hits.length === 1)
196
+ return path.join(dir, hits[0]);
197
+ throw new Error(`No fix review for ${ref} in ${dir}; run \`hex fix-review --to ${ref}\` first.`);
198
+ }
199
+ const runCmd = new Command('run')
200
+ .description('Map fix commits to cards, re-run PoCs at the fix commit, and flag unmapped changes (default)')
201
+ .option('--from <commit>', 'Audited commit (default: settings.report.initial_commit, else project.commit)')
202
+ .option('--to <commit>', 'Fix commit (default: HEAD)')
203
+ .option('--no-poc', 'Do not re-run PoCs')
204
+ .option('--no-compile', 'Do not compile either commit (parser-based diff)')
205
+ .option('--project <dir>', 'Project directory')
206
+ .action((opts) => {
207
+ try {
208
+ const { config, outputDir } = loadProjectContext(opts.project ?? process.cwd());
209
+ const projectDir = config.project.project_dir;
210
+ const report = config.settings.report;
211
+ const from = resolveCommit(projectDir, opts.from ?? report?.initial_commit ?? config.project.commit);
212
+ const to = resolveCommit(projectDir, opts.to ?? 'HEAD');
213
+ const fr = computeFixReview(config, outputDir, from, to, {
214
+ runPocs: opts.poc !== false,
215
+ compile: opts.compile !== false,
216
+ });
217
+ const file = fixReviewPath(outputDir, to);
218
+ fs.mkdirSync(path.dirname(file), { recursive: true });
219
+ fs.writeFileSync(file, JSON.stringify(fr, null, 2) + '\n', 'utf-8');
220
+ const s = fr.summary;
221
+ logger.success(`${from.slice(0, 8)} → ${to.slice(0, 8)}: ${s.fixed} fixed · ${s.not_fixed} not fixed · ${s.unknown} need judgement · ${s.unaddressed} unaddressed · ${s.unmapped} unmapped change(s)`);
222
+ logger.dim(` ${file}`);
223
+ }
224
+ catch (err) {
225
+ reportError(err);
226
+ process.exit(1);
227
+ }
228
+ });
229
+ /**
230
+ * Apply the proposals (Status + Update from the client) to the GitHub issues.
231
+ * Outward-facing: the /fix-review skill shows the batch and gets one explicit
232
+ * confirmation before calling this. Only the two fields change.
233
+ */
234
+ const applyCmd = new Command('apply')
235
+ .description('Write proposed Status / Update-from-the-client to the GitHub issues (after confirmation)')
236
+ .argument('<sha>', 'Fix commit (as in .hex/fix-review/<sha>.json)')
237
+ .option('--only <ids...>', 'Only these cards')
238
+ .option('--dry-run', 'Print the new bodies instead of editing')
239
+ .option('--project <dir>', 'Project directory')
240
+ .action((sha, opts) => {
241
+ try {
242
+ const { config, outputDir } = loadProjectContext(opts.project ?? process.cwd());
243
+ const repo = config.settings.github?.repo;
244
+ if (!repo)
245
+ throw new Error('settings.github.repo is not set; fix review edits GitHub issues.');
246
+ const file = savedFixReview(config, outputDir, sha);
247
+ const fr = FixReviewSchema.parse(JSON.parse(fs.readFileSync(file, 'utf-8')));
248
+ let edited = 0;
249
+ for (const card of fr.cards) {
250
+ if (opts.only && !opts.only.includes(card.id))
251
+ continue;
252
+ if (!card.github_issue || (!card.proposed.resolution && !card.proposed.update_from_client))
253
+ continue;
254
+ const body = execFileSync('gh', [
255
+ 'issue',
256
+ 'view',
257
+ String(card.github_issue),
258
+ '--repo',
259
+ repo,
260
+ '--json',
261
+ 'body',
262
+ '--jq',
263
+ '.body',
264
+ ], {
265
+ encoding: 'utf-8',
266
+ }).replace(/\n$/, '');
267
+ const next = rewriteIssueBody(body, {
268
+ status: card.proposed.resolution,
269
+ update: card.proposed.update_from_client,
270
+ });
271
+ if (next === body)
272
+ continue;
273
+ if (opts.dryRun) {
274
+ console.log(`── #${card.github_issue} (${card.id})\n${next}\n`);
275
+ continue;
276
+ }
277
+ const tmp = path.join(outputDir, '.cache', `issue-${card.github_issue}.md`);
278
+ fs.mkdirSync(path.dirname(tmp), { recursive: true });
279
+ fs.writeFileSync(tmp, next, 'utf-8');
280
+ execFileSync('gh', ['issue', 'edit', String(card.github_issue), '--repo', repo, '--body-file', tmp], { stdio: 'inherit' });
281
+ fs.rmSync(tmp, { force: true });
282
+ card.applied_at = new Date().toISOString();
283
+ edited++;
284
+ }
285
+ if (!opts.dryRun) {
286
+ fs.writeFileSync(file, JSON.stringify(fr, null, 2) + '\n', 'utf-8');
287
+ logger.success(`Edited ${edited} GitHub issue(s). Run /sync-issues to pull them back.`);
288
+ }
289
+ }
290
+ catch (err) {
291
+ reportError(err);
292
+ process.exit(1);
293
+ }
294
+ });
295
+ const proposeCmd = new Command('propose')
296
+ .description('Set the proposed resolution / client update for a card (used by /fix-review)')
297
+ .argument('<sha>', 'Fix commit')
298
+ .argument('<id>', 'Card id')
299
+ .option('--status <s>', 'fixed | partially_fixed | not_fixed | unaddressed | unknown')
300
+ .option('--resolution <r>', 'Fixed | Mitigated | Acknowledged | Not Fixed | Unresolved')
301
+ .option('--update-file <path>', 'Text for "Update from the client"')
302
+ .option('--evidence <text>', 'Why (one or two sentences)')
303
+ .option('--project <dir>', 'Project directory')
304
+ .action((sha, id, opts) => {
305
+ try {
306
+ const { config, outputDir } = loadProjectContext(opts.project ?? process.cwd());
307
+ const file = savedFixReview(config, outputDir, sha);
308
+ const fr = FixReviewSchema.parse(JSON.parse(fs.readFileSync(file, 'utf-8')));
309
+ const card = fr.cards.find((c) => c.id === id);
310
+ if (!card)
311
+ throw new Error(`${id} is not in ${file}`);
312
+ if (opts.status)
313
+ card.status = opts.status;
314
+ if (opts.evidence)
315
+ card.evidence = opts.evidence;
316
+ if (opts.resolution)
317
+ card.proposed.resolution = opts.resolution;
318
+ if (opts.updateFile)
319
+ card.proposed.update_from_client = fs
320
+ .readFileSync(path.resolve(opts.updateFile), 'utf-8')
321
+ .trim();
322
+ const count = (s) => fr.cards.filter((c) => c.status === s).length;
323
+ fr.summary = {
324
+ ...fr.summary,
325
+ fixed: count('fixed'),
326
+ partially_fixed: count('partially_fixed'),
327
+ not_fixed: count('not_fixed'),
328
+ unaddressed: count('unaddressed'),
329
+ unknown: count('unknown'),
330
+ };
331
+ fs.writeFileSync(file, JSON.stringify(FixReviewSchema.parse(fr), null, 2) + '\n', 'utf-8');
332
+ logger.success(`${id}: ${card.status}${card.proposed.resolution ? ` → ${card.proposed.resolution}` : ''}`);
333
+ }
334
+ catch (err) {
335
+ reportError(err);
336
+ process.exit(1);
337
+ }
338
+ });
339
+ const reviewedCmd = new Command('reviewed')
340
+ .description('Record the review of an unmapped change (used by /fix-review)')
341
+ .argument('<sha>', 'Fix commit')
342
+ .argument('<ref>', 'Contract.function, with or without the signature')
343
+ .requiredOption('--note <text>', 'The verdict in one or two sentences, with any card filed')
344
+ .option('--project <dir>', 'Project directory')
345
+ .action((sha, ref, opts) => {
346
+ try {
347
+ const { config, outputDir } = loadProjectContext(opts.project ?? process.cwd());
348
+ const file = savedFixReview(config, outputDir, sha);
349
+ const fr = FixReviewSchema.parse(JSON.parse(fs.readFileSync(file, 'utf-8')));
350
+ const u = fr.unmapped_changes[findUnmappedChange(fr.unmapped_changes, ref)];
351
+ u.reviewed = true;
352
+ u.note = opts.note.trim();
353
+ fs.writeFileSync(file, JSON.stringify(FixReviewSchema.parse(fr), null, 2) + '\n', 'utf-8');
354
+ logger.success(`${u.contract}.${u.entity}: reviewed`);
355
+ }
356
+ catch (err) {
357
+ reportError(err);
358
+ process.exit(1);
359
+ }
360
+ });
361
+ export const fixReviewCommand = new Command('fix-review')
362
+ .description('Fix review: which issues the client fixed, with PoCs re-run at the fix commit')
363
+ .addCommand(runCmd, { isDefault: true })
364
+ .addCommand(proposeCmd)
365
+ .addCommand(reviewedCmd)
366
+ .addCommand(applyCmd);
367
+ //# sourceMappingURL=fix-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix-review.js","sourceRoot":"","sources":["../../src/commands/fix-review.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,eAAO,MAAM,WAAW,SAkWpB,CAAC"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,eAAO,MAAM,WAAW,SAyapB,CAAC"}
@@ -8,8 +8,10 @@ import { normalizePath, getOutputDir } from '../core/paths.js';
8
8
  import { runForge, detectTools } from '../core/external-tools.js';
9
9
  import { parseSolidity, extractSolidityVersion } from '../parsers/solidity-parser.js';
10
10
  import { copySkillsToClaudeFormat, getClaudeSkillsDir } from '../core/skills.js';
11
+ import { ensureMcpConfig } from '../core/mcp-config.js';
11
12
  import { ProgressTracker } from '../core/progress.js';
12
13
  import { HexError, reportError } from '../core/errors.js';
14
+ import { headCommit, isGitRepo, resolveCommit } from '../core/git.js';
13
15
  export const initCommand = new Command('init')
14
16
  .description('Initialize a new audit project')
15
17
  .option('--project <dir>', 'Project directory (default: cwd)')
@@ -21,6 +23,9 @@ export const initCommand = new Command('init')
21
23
  .option('--output-dir <dir>', 'Output directory', '.hex')
22
24
  .option('--exclude <globs>', 'Comma-separated exclude globs')
23
25
  .option('--github-repo <owner/repo>', 'GitHub repo for issue syncing (sets settings.github.repo)')
26
+ .option('--mode <mode>', 'Audit mode: full | diff (differential audit against --base)', 'full')
27
+ .option('--base <commit>', 'Differential mode: the previously audited commit')
28
+ .option('--previous-audit <path>', "Differential mode: the previous engagement's .hex/ folder or its report (PDF/MD)")
24
29
  .option('--no-verify', 'Skip build verification')
25
30
  .action(async (opts) => {
26
31
  const STEPS = [
@@ -61,13 +66,16 @@ export const initCommand = new Command('init')
61
66
  const allMissing = tools.every((t) => !t.available);
62
67
  tracker.update('check tools', allMissing ? 'failed' : 'ok', toolDetails.join(', '));
63
68
  if (!tools.find((t) => t.name === 'forge')?.available) {
64
- logger.warn('forge not found — compilation verification and test coverage will be unavailable');
69
+ logger.warn('forge not found — exact compiler facts and test coverage will be unavailable (parser fallback)');
65
70
  }
66
- if (!tools.find((t) => t.name === 'slither')?.available) {
67
- logger.warn('slither not found — access control, state variable, and external call analysis will be limited');
71
+ // Audit mode
72
+ const mode = opts.mode === 'diff' ? 'diff' : 'full';
73
+ if (opts.mode !== 'full' && opts.mode !== 'diff') {
74
+ throw new Error(`Invalid --mode: ${opts.mode}. Use full or diff.`);
68
75
  }
69
- if (!tools.find((t) => t.name === 'solc')?.available) {
70
- logger.warn('solc not found — storage layout extraction will be unavailable');
76
+ if (mode === 'diff' && !opts.base) {
77
+ tracker.update('resolve scope', 'failed', '--base missing');
78
+ throw new HexError('diff.base-required');
71
79
  }
72
80
  // Resolve scope globs
73
81
  if (!opts.scope) {
@@ -139,6 +147,32 @@ export const initCommand = new Command('init')
139
147
  logger.warn('Could not detect git commit hash. Use --commit to specify.');
140
148
  }
141
149
  }
150
+ // Differential mode: pin the base commit and record the previous audit.
151
+ let baseCommit;
152
+ let previousAudit;
153
+ if (mode === 'diff') {
154
+ if (!isGitRepo(projectDir))
155
+ throw new HexError('diff.not-git', `path: ${projectDir}`);
156
+ baseCommit = resolveCommit(projectDir, opts.base);
157
+ if (commit && commit !== 'unknown') {
158
+ const resolvedHead = resolveCommit(projectDir, commit);
159
+ const wt = headCommit(projectDir);
160
+ if (wt && wt !== resolvedHead) {
161
+ logger.warn(`Working tree is at ${wt.slice(0, 8)} but --commit is ${resolvedHead.slice(0, 8)}. ` +
162
+ 'Analyses read the working tree: check out the head commit before `hex analyze`.');
163
+ }
164
+ }
165
+ if (opts.previousAudit) {
166
+ const prev = path.resolve(opts.previousAudit);
167
+ if (!fs.existsSync(prev)) {
168
+ throw new Error(`--previous-audit path not found: ${prev}`);
169
+ }
170
+ const isHexDir = fs.statSync(prev).isDirectory() &&
171
+ (fs.existsSync(path.join(prev, 'config.json')) ||
172
+ fs.existsSync(path.join(prev, '.hex', 'config.json')));
173
+ previousAudit = { kind: isHexDir ? 'hex' : 'report', path: prev };
174
+ }
175
+ }
142
176
  // Determine project name
143
177
  const name = opts.name ?? path.basename(projectDir);
144
178
  // Create config
@@ -154,6 +188,10 @@ export const initCommand = new Command('init')
154
188
  exclude: excludeGlobs,
155
189
  outputDir: opts.outputDir,
156
190
  githubRepo: opts.githubRepo,
191
+ scopeGlobs: scopeGlobs,
192
+ mode,
193
+ baseCommit,
194
+ previousAudit,
157
195
  });
158
196
  const outputDir = getOutputDir(projectDir, config.settings.output_dir);
159
197
  tracker.update('create config', 'ok', normalizePath(outputDir));
@@ -161,6 +199,7 @@ export const initCommand = new Command('init')
161
199
  tracker.update('copy skills', 'running');
162
200
  const claudeSkillsDir = getClaudeSkillsDir(projectDir);
163
201
  const skillsResult = copySkillsToClaudeFormat({ targetDir: claudeSkillsDir });
202
+ ensureMcpConfig(projectDir);
164
203
  tracker.update('copy skills', 'ok', `${skillsResult.updated + skillsResult.added} skill(s)`);
165
204
  // Create subdirectories
166
205
  for (const subdir of ['validations', 'ai-results']) {
@@ -177,7 +216,15 @@ export const initCommand = new Command('init')
177
216
  // Optionally verify compilation
178
217
  if (opts.verify !== false && isFoundry) {
179
218
  tracker.update('verify build', 'running');
180
- const result = await runForge(projectDir, ['build']);
219
+ // Build into Hex's cache, never the client's out/ and cache/.
220
+ const cache = path.join(outputDir, '.cache');
221
+ const result = await runForge(projectDir, [
222
+ 'build',
223
+ '--out',
224
+ path.join(cache, 'forge-out'),
225
+ '--cache-path',
226
+ path.join(cache, 'forge-cache'),
227
+ ]);
181
228
  if (result.exitCode === 0) {
182
229
  tracker.update('verify build', 'ok');
183
230
  }
@@ -199,7 +246,20 @@ This project is being audited with Hex.
199
246
  - **Chain:** ${config.project.chain}
200
247
  - **Solidity:** ${config.project.solidity_version}
201
248
  - **Commit:** \`${config.project.commit}\`${config.project.docs_url ? `\n- **Docs:** ${config.project.docs_url}` : ''}
202
- - **Config:** \`${config.settings.output_dir}/config.json\` — source of truth for all project metadata
249
+ - **Config:** \`${config.settings.output_dir}/config.json\` — source of truth for all project metadata${mode === 'diff' && baseCommit
250
+ ? `
251
+
252
+ ## Differential audit
253
+
254
+ This is a **differential audit** of \`${baseCommit.slice(0, 8)}\` → \`${String(config.project.commit).slice(0, 8)}\`. Review effort goes to the changed code and the flows it reaches, not the whole scope.
255
+
256
+ - \`${config.settings.output_dir}/diff.json\` — changed files and entities, storage-layout changes, and every impacted function with the reason chain (from \`hex diff\`)
257
+ - \`${config.settings.output_dir}/diff/changes.patch\` — the in-scope unified diff
258
+ - \`${config.settings.output_dir}/diff-overview.md\` — what changed and why (written by /init-audit)${previousAudit
259
+ ? `
260
+ - \`${config.settings.output_dir}/previous-audit/\` — prior findings (\`findings.json\`) and their regression check (\`review.json\`)`
261
+ : ''}`
262
+ : ''}
203
263
 
204
264
  ## Scope
205
265
 
@@ -208,24 +268,25 @@ ${uniqueScope.map((f) => `- \`${f}\``).join('\n')}
208
268
 
209
269
  ## Output Directory (\`${config.settings.output_dir}/\`)
210
270
 
211
- All analysis outputs live here. Key files and what they answer:
271
+ All Hex data lives here. Key files and what they answer:
212
272
 
213
273
  | File | Contains | Use when asked about... |
214
274
  |------|----------|------------------------|
215
- | \`config.json\` | Project config (scope, chain, docs URL, commit) | project setup, documentation, scope |
216
- | \`stats.json\` | nSLOC, contracts, functions, test coverage, dependencies | codebase size, complexity, coverage |
217
- | \`deps.json\` | Inheritance, imports, calls, clusters | contract relationships, dependency graph |
218
- | \`access-control.json\` | Roles, modifiers, function access | who can call what, privileged functions |
219
- | \`state-vars.json\` | State variables, types, visibility, read/write | storage, mutability, state layout |
220
- | \`external-calls.json\` | External calls, reentrancy guards, trust levels | external interactions, reentrancy risk |
221
- | \`overview.md\` | AI-generated protocol overview | what the protocol does, architecture |
222
- | \`spec-conformance.json\` | Spec vs code deviations | spec compliance, ERC conformance |
223
- | \`findings.json\` | Audit findings (canonical), wrapped as \`{ "findings": [...] }\` | reported issues, vulnerabilities |
224
- | \`tracking.json\` | Board state per issue (status, source, duplicate_of), wrapped as \`{ "findings": [...] }\` | finding triage, board columns |
225
- | \`comparison.json\` | Dedup match_signals (auditagent / github) | duplicate detection |
226
- | \`progress.json\` | Audit progress tracking | what has been reviewed |
227
- | \`diagrams/\` | Mermaid architecture and flow diagrams | system diagrams, flows |
228
- | \`report/\` | LaTeX report sections (executive summary, audited files, summary of issues, system overview, issues, documentation eval, test suite) as \`.txt\` + \`.tex\` | final report export |
275
+ | \`config.json\` | Project config (scope, mode, chain, docs URL, commit) | project setup, documentation, scope |
276
+ | \`facts.json\` | **Exact compiler facts**: call graph, reads/writes, modifiers, inheritance, entry points, storage layout | who calls what, who writes a variable, storage slots |
277
+ | \`stats.json\` | nSLOC, ERCs, test coverage, dependencies | codebase size, complexity, coverage |
278
+ | \`model/protocol.json\` | Verified protocol model: actors, assets, privileges, trust, dependencies, state machines, accounting, risky flows (each claim verified or contested) | how the protocol works, who can do what |
279
+ | \`model/invariants.json\` | Invariants (proposed / accepted / rejected) and their test results | what must always hold |
280
+ | \`model/diagrams/\` | Diagram specs and Excalidraw scenes | system pictures |
281
+ | \`overview.md\` | Protocol overview | what the protocol does, architecture |
282
+ | \`spec-conformance.json\` | Docs / NatSpec / ERC promises vs code | spec compliance |
283
+ | \`findings.json\` / \`tracking.json\` | Board cards (content / status, source, validation) | reported issues, triage |
284
+ | \`progress.json\` | Per-function review state (unread / read / questioned / cleared) | review progress, blind spots |
285
+ | \`triage-rules.json\` | The auditor's standing decisions (trusted roles, out of scope, by design, known issues) | what not to report |
286
+ | \`notes/\` | Contract notes, questions and leads (Diane) | auditor's notes |
287
+ | \`ai-audit/\`, \`ai-results/\` | /ai-audit runs and the records behind AI cards | AI audit results |
288
+ | \`fix-review/\` | Fix review results per fix commit | which issues the client fixed |
289
+ | \`report/\` | LaTeX report sections and figures | final report |
229
290
 
230
291
  Not all files exist initially — they are created as you run skills and CLI commands.
231
292
 
@@ -233,27 +294,31 @@ Not all files exist initially — they are created as you run skills and CLI com
233
294
 
234
295
  Skills are in \`.claude/skills/\` and auto-discovered by Claude Code. Type \`/\` to list them.
235
296
 
236
- **Recommended workflow order:**
297
+ 1. \`/init-audit\` — Safety gate, exact facts, then agents build and verify the protocol model, invariants, conformance and diagrams
298
+ 2. \`/ai-audit\` — 12 parallel attacker agents; findings land on the board (pre-validated), leads in notes
299
+ 3. \`/write-finding\` — Record a manual issue as a Potential card
300
+ 4. \`/validate-finding\` / \`/validate-all-findings\` — Validate cards; PoC by default
301
+ 5. \`/prevalidate\` — Parallel agent validation of new machine-generated cards; conclusive cases move automatically
302
+ 6. \`/fuzz\` — Fuzz the accepted invariants (Echidna / Medusa / Foundry); violations become cards
303
+ 7. \`/diane\` — Turn recorded narration into notes and review ticks
304
+ 8. \`/ingest-aa-report\` — Ingest a Nethermind AuditAgent scan
305
+ 9. \`/sync-issues\` — Two-way GitHub Issues sync (GitHub canonical)
306
+ 10. \`/fix-review\` — Check the client's fixes (PoCs re-run at the fix commit) and update GitHub
307
+ 11. \`/generate-report\` — Emit the LaTeX report sections
237
308
 
238
- 1. \`/init-audit\` — Initialize, dependency safety, full analysis pipeline, overview, diagrams, flows, spec conformance, board materialization (all in one)
239
- 2. \`/write-finding\` — Record a manual issue as a Potential card on the board
240
- 3. \`/validate-finding\` — Validate any Potential card (manual / auditagent / conformance / github); per-issue PoC or memo-only
241
- 4. \`/generate-poc\` — Generate and run a proof-of-concept test (invoked by /validate-finding)
242
- 5. \`/ingest-aa-report\` — Ingest a completed Nethermind AuditAgent scan by ID, with inline dedup
243
- 6. \`/sync-issues\` — Two-way GitHub Issues sync (GitHub canonical)
244
- 7. \`/generate-report\` — Emit the LaTeX report sections into \`${config.settings.output_dir}/report/\`
309
+ ## Hex MCP tools
245
310
 
246
- Each skill builds on previous outputs.
311
+ The project's \`.mcp.json\` registers the Hex MCP server. **When the auditor says "this", "here" or "the selected …", call \`hex_focus\` first**: it returns what they have selected in the dashboard. Use \`hex_facts_query\` for exact code relationships instead of grepping.
247
312
 
248
- ## CLI Commands
313
+ ## CLI Commands (always \`npx --no-install hex …\`; an unrelated npm package is named \`hex\`)
249
314
 
250
- - \`npx hex analyze\` — Run all deterministic analysis (stats, deps, access, state, calls, patterns, constraints, surface)
251
- - \`npx hex context\` — Assemble full codebase context for AI prompts
252
- - \`npx hex context --target <Contract>\` — Focused context for a single contract
253
- - \`npx hex dashboard\` — Open browser dashboard at http://localhost:3000
254
- - \`npx hex issue move <id> --to <column>\` — Move an issue between board columns
255
- - \`npx hex issue patch <id> [--severity ...] [--resolution ...]\` — Edit issue fields
256
- - \`npx hex update\` — Update hex-audit to the latest version
315
+ - \`analyze\` — stats + compiler facts (+ diff in differential mode)
316
+ - \`facts query <callers|callees|readers|writers|layout|linearization|entry-points|reach|function> [ref]\` — exact relationships
317
+ - \`model show|validate\`, \`invariant list|accept|reject|set-test|export\`
318
+ - \`review mark <ref> --state <read|questioned|cleared>\`, \`review status\`, \`review blind-spots\`
319
+ - \`issue new|move|patch|show|validation|dedup|mark-duplicate|exclude\`
320
+ - \`rules list|add|remove|export\`
321
+ - \`diagram build|list\`, \`diff\`, \`fix-review\`, \`dashboard\`, \`update\`
257
322
 
258
323
  ## Writing Style (applies to every skill that produces text)
259
324
 
@@ -330,9 +395,8 @@ Apply these to every skill output without being reminded.
330
395
  logger.info(`Output: ${normalizePath(outputDir)}`);
331
396
  logger.info('');
332
397
  logger.info('Next steps:');
333
- logger.dim(' hex stats # Generate codebase statistics');
334
- logger.dim(' hex deps # Build dependency graph');
335
- logger.dim(' hex access # Map access control');
398
+ logger.dim(' hex analyze # Stats + exact compiler facts (+ diff in differential mode)');
399
+ logger.dim(' hex dashboard # Open the review workspace');
336
400
  }
337
401
  catch (err) {
338
402
  tracker.finish();