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