hex-audit 0.4.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 (486) hide show
  1. package/CLAUDE.md +105 -0
  2. package/DEMO.md +141 -0
  3. package/README.md +378 -0
  4. package/dashboard/.next/BUILD_ID +1 -0
  5. package/dashboard/.next/app-build-manifest.json +99 -0
  6. package/dashboard/.next/app-path-routes-manifest.json +1 -0
  7. package/dashboard/.next/build-manifest.json +32 -0
  8. package/dashboard/.next/cache/.tsbuildinfo +1 -0
  9. package/dashboard/.next/cache/webpack/client-production/0.pack +0 -0
  10. package/dashboard/.next/cache/webpack/client-production/index.pack +0 -0
  11. package/dashboard/.next/cache/webpack/edge-server-production/0.pack +0 -0
  12. package/dashboard/.next/cache/webpack/edge-server-production/index.pack +0 -0
  13. package/dashboard/.next/cache/webpack/server-production/0.pack +0 -0
  14. package/dashboard/.next/cache/webpack/server-production/1.pack +0 -0
  15. package/dashboard/.next/cache/webpack/server-production/2.pack +0 -0
  16. package/dashboard/.next/cache/webpack/server-production/index.pack +0 -0
  17. package/dashboard/.next/cache/webpack/server-production/index.pack.old +0 -0
  18. package/dashboard/.next/export-marker.json +1 -0
  19. package/dashboard/.next/images-manifest.json +1 -0
  20. package/dashboard/.next/next-minimal-server.js.nft.json +1 -0
  21. package/dashboard/.next/next-server.js.nft.json +1 -0
  22. package/dashboard/.next/package.json +1 -0
  23. package/dashboard/.next/prerender-manifest.js +1 -0
  24. package/dashboard/.next/prerender-manifest.json +1 -0
  25. package/dashboard/.next/react-loadable-manifest.json +300 -0
  26. package/dashboard/.next/required-server-files.json +1 -0
  27. package/dashboard/.next/routes-manifest.json +1 -0
  28. package/dashboard/.next/server/app/_not-found/page.js +1 -0
  29. package/dashboard/.next/server/app/_not-found/page.js.nft.json +1 -0
  30. package/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  31. package/dashboard/.next/server/app/_not-found.html +1 -0
  32. package/dashboard/.next/server/app/_not-found.meta +6 -0
  33. package/dashboard/.next/server/app/_not-found.rsc +12 -0
  34. package/dashboard/.next/server/app/access/page.js +1 -0
  35. package/dashboard/.next/server/app/access/page.js.nft.json +1 -0
  36. package/dashboard/.next/server/app/access/page_client-reference-manifest.js +1 -0
  37. package/dashboard/.next/server/app/access.html +1 -0
  38. package/dashboard/.next/server/app/access.meta +5 -0
  39. package/dashboard/.next/server/app/access.rsc +8 -0
  40. package/dashboard/.next/server/app/api/code/route.js +1 -0
  41. package/dashboard/.next/server/app/api/code/route.js.nft.json +1 -0
  42. package/dashboard/.next/server/app/api/flows/route.js +1 -0
  43. package/dashboard/.next/server/app/api/flows/route.js.nft.json +1 -0
  44. package/dashboard/.next/server/app/api/flows.body +1 -0
  45. package/dashboard/.next/server/app/api/flows.meta +1 -0
  46. package/dashboard/.next/server/app/api/github-status/route.js +1 -0
  47. package/dashboard/.next/server/app/api/github-status/route.js.nft.json +1 -0
  48. package/dashboard/.next/server/app/api/issues/[id]/move/route.js +1 -0
  49. package/dashboard/.next/server/app/api/issues/[id]/move/route.js.nft.json +1 -0
  50. package/dashboard/.next/server/app/api/issues/[id]/route.js +1 -0
  51. package/dashboard/.next/server/app/api/issues/[id]/route.js.nft.json +1 -0
  52. package/dashboard/.next/server/app/api/mermaid/route.js +1 -0
  53. package/dashboard/.next/server/app/api/mermaid/route.js.nft.json +1 -0
  54. package/dashboard/.next/server/app/api/progress/route.js +1 -0
  55. package/dashboard/.next/server/app/api/progress/route.js.nft.json +1 -0
  56. package/dashboard/.next/server/app/api/watch/route.js +3 -0
  57. package/dashboard/.next/server/app/api/watch/route.js.nft.json +1 -0
  58. package/dashboard/.next/server/app/calls/page.js +1 -0
  59. package/dashboard/.next/server/app/calls/page.js.nft.json +1 -0
  60. package/dashboard/.next/server/app/calls/page_client-reference-manifest.js +1 -0
  61. package/dashboard/.next/server/app/calls.html +1 -0
  62. package/dashboard/.next/server/app/calls.meta +5 -0
  63. package/dashboard/.next/server/app/calls.rsc +8 -0
  64. package/dashboard/.next/server/app/conformance/page.js +1 -0
  65. package/dashboard/.next/server/app/conformance/page.js.nft.json +1 -0
  66. package/dashboard/.next/server/app/conformance/page_client-reference-manifest.js +1 -0
  67. package/dashboard/.next/server/app/conformance.html +1 -0
  68. package/dashboard/.next/server/app/conformance.meta +5 -0
  69. package/dashboard/.next/server/app/conformance.rsc +8 -0
  70. package/dashboard/.next/server/app/diagram/page.js +1 -0
  71. package/dashboard/.next/server/app/diagram/page.js.nft.json +1 -0
  72. package/dashboard/.next/server/app/diagram/page_client-reference-manifest.js +1 -0
  73. package/dashboard/.next/server/app/diagram.html +1 -0
  74. package/dashboard/.next/server/app/diagram.meta +5 -0
  75. package/dashboard/.next/server/app/diagram.rsc +10 -0
  76. package/dashboard/.next/server/app/flows/page.js +1 -0
  77. package/dashboard/.next/server/app/flows/page.js.nft.json +1 -0
  78. package/dashboard/.next/server/app/flows/page_client-reference-manifest.js +1 -0
  79. package/dashboard/.next/server/app/flows.html +1 -0
  80. package/dashboard/.next/server/app/flows.meta +5 -0
  81. package/dashboard/.next/server/app/flows.rsc +10 -0
  82. package/dashboard/.next/server/app/functions/page.js +1 -0
  83. package/dashboard/.next/server/app/functions/page.js.nft.json +1 -0
  84. package/dashboard/.next/server/app/functions/page_client-reference-manifest.js +1 -0
  85. package/dashboard/.next/server/app/functions.html +1 -0
  86. package/dashboard/.next/server/app/functions.meta +5 -0
  87. package/dashboard/.next/server/app/functions.rsc +8 -0
  88. package/dashboard/.next/server/app/icon.svg/route.js +12 -0
  89. package/dashboard/.next/server/app/icon.svg/route.js.nft.json +1 -0
  90. package/dashboard/.next/server/app/icon.svg.body +18 -0
  91. package/dashboard/.next/server/app/icon.svg.meta +1 -0
  92. package/dashboard/.next/server/app/index.html +1 -0
  93. package/dashboard/.next/server/app/index.meta +5 -0
  94. package/dashboard/.next/server/app/index.rsc +9 -0
  95. package/dashboard/.next/server/app/issues/page.js +1 -0
  96. package/dashboard/.next/server/app/issues/page.js.nft.json +1 -0
  97. package/dashboard/.next/server/app/issues/page_client-reference-manifest.js +1 -0
  98. package/dashboard/.next/server/app/issues.html +1 -0
  99. package/dashboard/.next/server/app/issues.meta +5 -0
  100. package/dashboard/.next/server/app/issues.rsc +8 -0
  101. package/dashboard/.next/server/app/page.js +20 -0
  102. package/dashboard/.next/server/app/page.js.nft.json +1 -0
  103. package/dashboard/.next/server/app/page_client-reference-manifest.js +1 -0
  104. package/dashboard/.next/server/app/progress/page.js +1 -0
  105. package/dashboard/.next/server/app/progress/page.js.nft.json +1 -0
  106. package/dashboard/.next/server/app/progress/page_client-reference-manifest.js +1 -0
  107. package/dashboard/.next/server/app/progress.html +1 -0
  108. package/dashboard/.next/server/app/progress.meta +5 -0
  109. package/dashboard/.next/server/app/progress.rsc +8 -0
  110. package/dashboard/.next/server/app/stats/page.js +1 -0
  111. package/dashboard/.next/server/app/stats/page.js.nft.json +1 -0
  112. package/dashboard/.next/server/app/stats/page_client-reference-manifest.js +1 -0
  113. package/dashboard/.next/server/app/stats.html +1 -0
  114. package/dashboard/.next/server/app/stats.meta +5 -0
  115. package/dashboard/.next/server/app/stats.rsc +8 -0
  116. package/dashboard/.next/server/app-paths-manifest.json +22 -0
  117. package/dashboard/.next/server/chunks/431.js +1 -0
  118. package/dashboard/.next/server/chunks/557.js +1 -0
  119. package/dashboard/.next/server/chunks/645.js +6 -0
  120. package/dashboard/.next/server/chunks/649.js +2 -0
  121. package/dashboard/.next/server/chunks/665.js +13 -0
  122. package/dashboard/.next/server/chunks/786.js +12 -0
  123. package/dashboard/.next/server/chunks/818.js +6 -0
  124. package/dashboard/.next/server/chunks/916.js +2 -0
  125. package/dashboard/.next/server/chunks/font-manifest.json +1 -0
  126. package/dashboard/.next/server/font-manifest.json +1 -0
  127. package/dashboard/.next/server/functions-config-manifest.json +1 -0
  128. package/dashboard/.next/server/interception-route-rewrite-manifest.js +1 -0
  129. package/dashboard/.next/server/middleware-build-manifest.js +1 -0
  130. package/dashboard/.next/server/middleware-manifest.json +6 -0
  131. package/dashboard/.next/server/middleware-react-loadable-manifest.js +1 -0
  132. package/dashboard/.next/server/next-font-manifest.js +1 -0
  133. package/dashboard/.next/server/next-font-manifest.json +1 -0
  134. package/dashboard/.next/server/pages/404.html +1 -0
  135. package/dashboard/.next/server/pages/500.html +1 -0
  136. package/dashboard/.next/server/pages/_app.js +1 -0
  137. package/dashboard/.next/server/pages/_app.js.nft.json +1 -0
  138. package/dashboard/.next/server/pages/_document.js +1 -0
  139. package/dashboard/.next/server/pages/_document.js.nft.json +1 -0
  140. package/dashboard/.next/server/pages/_error.js +1 -0
  141. package/dashboard/.next/server/pages/_error.js.nft.json +1 -0
  142. package/dashboard/.next/server/pages-manifest.json +1 -0
  143. package/dashboard/.next/server/server-reference-manifest.js +1 -0
  144. package/dashboard/.next/server/server-reference-manifest.json +1 -0
  145. package/dashboard/.next/server/webpack-runtime.js +1 -0
  146. package/dashboard/.next/static/0IZAlhEwk5-v4myUvWKBd/_buildManifest.js +1 -0
  147. package/dashboard/.next/static/0IZAlhEwk5-v4myUvWKBd/_ssgManifest.js +1 -0
  148. package/dashboard/.next/static/chunks/1.8868c4d131111be7.js +36 -0
  149. package/dashboard/.next/static/chunks/1015.3ab89142e5f44120.js +226 -0
  150. package/dashboard/.next/static/chunks/1151.b6ef5c786e587ed7.js +1 -0
  151. package/dashboard/.next/static/chunks/1199.a072929dbec89965.js +148 -0
  152. package/dashboard/.next/static/chunks/1375.d4d2f7fc9c9c2ff1.js +43 -0
  153. package/dashboard/.next/static/chunks/1799.83206776abbbf1fc.js +9 -0
  154. package/dashboard/.next/static/chunks/20154aaa.ccc347c04ab5ad4a.js +1 -0
  155. package/dashboard/.next/static/chunks/2077.7011a570c87aa7b1.js +1 -0
  156. package/dashboard/.next/static/chunks/2166.cc0fabeb2e89b840.js +215 -0
  157. package/dashboard/.next/static/chunks/2291.85a70cb0c228157b.js +29 -0
  158. package/dashboard/.next/static/chunks/2325.2c55cb9a6282ae3f.js +24 -0
  159. package/dashboard/.next/static/chunks/2383.62c035a052272594.js +1 -0
  160. package/dashboard/.next/static/chunks/2694.92bbe252063e4786.js +1 -0
  161. package/dashboard/.next/static/chunks/275.0d761aa0e5b030b8.js +34 -0
  162. package/dashboard/.next/static/chunks/2781.8536b644a480aede.js +93 -0
  163. package/dashboard/.next/static/chunks/2805.a8d71d2f92bb6ba9.js +1 -0
  164. package/dashboard/.next/static/chunks/2879.51436986f93981d9.js +1 -0
  165. package/dashboard/.next/static/chunks/3017.e55781da9dd32d37.js +1 -0
  166. package/dashboard/.next/static/chunks/3205-728c260fbb4f89c6.js +2 -0
  167. package/dashboard/.next/static/chunks/3236.dff44fa7961d9d5e.js +1 -0
  168. package/dashboard/.next/static/chunks/3480.9451396ad7ee7613.js +1 -0
  169. package/dashboard/.next/static/chunks/3626.ba1cf848a9f2e93d.js +64 -0
  170. package/dashboard/.next/static/chunks/3865.a432a7910a2f5281.js +90 -0
  171. package/dashboard/.next/static/chunks/3887.c22cbfa3f095826c.js +1 -0
  172. package/dashboard/.next/static/chunks/3924-4a05057b5450abe1.js +1 -0
  173. package/dashboard/.next/static/chunks/3948.fe3c7d758568d98b.js +287 -0
  174. package/dashboard/.next/static/chunks/4728.07d87640a3e7dd0d.js +24 -0
  175. package/dashboard/.next/static/chunks/4787.4e5f6a0e0e40a583.js +23 -0
  176. package/dashboard/.next/static/chunks/5060.baca226af35ed016.js +1 -0
  177. package/dashboard/.next/static/chunks/5284.f949ac90c95ff143.js +1 -0
  178. package/dashboard/.next/static/chunks/5715.1524bcc9591e180b.js +115 -0
  179. package/dashboard/.next/static/chunks/6014.700ae4969b64d728.js +104 -0
  180. package/dashboard/.next/static/chunks/6024.4d23707c65514679.js +79 -0
  181. package/dashboard/.next/static/chunks/6052.033a6f1013c666eb.js +141 -0
  182. package/dashboard/.next/static/chunks/6177.e5c84cfc4c0dea51.js +1 -0
  183. package/dashboard/.next/static/chunks/618f8807-547c5614e1318888.js +1 -0
  184. package/dashboard/.next/static/chunks/6434.9481771c33195d29.js +1 -0
  185. package/dashboard/.next/static/chunks/6468.f4a3e8fa6accc6da.js +77 -0
  186. package/dashboard/.next/static/chunks/6540.86f367d7390738d4.js +1 -0
  187. package/dashboard/.next/static/chunks/6549.4d0d472df96429a5.js +1 -0
  188. package/dashboard/.next/static/chunks/690f35d0.3e40ca0930e4bbdb.js +119 -0
  189. package/dashboard/.next/static/chunks/7020.831e16e26d91abc1.js +166 -0
  190. package/dashboard/.next/static/chunks/7397-f6f4dddc7a20bfc1.js +1 -0
  191. package/dashboard/.next/static/chunks/7498-ea83cb9e30ec5491.js +1 -0
  192. package/dashboard/.next/static/chunks/7802.89aec9ee11680850.js +80 -0
  193. package/dashboard/.next/static/chunks/7973.8b526f589aca5d84.js +79 -0
  194. package/dashboard/.next/static/chunks/7a04ac15.1c6cea694301806c.js +62 -0
  195. package/dashboard/.next/static/chunks/8216.1bead812eb126c35.js +5 -0
  196. package/dashboard/.next/static/chunks/8233babc.780b8e272eda298f.js +92 -0
  197. package/dashboard/.next/static/chunks/8452-e616b5f43bceb95f.js +13 -0
  198. package/dashboard/.next/static/chunks/8645.a5ca76f11edc9633.js +1 -0
  199. package/dashboard/.next/static/chunks/8928-60c623ee89d2e6ad.js +1 -0
  200. package/dashboard/.next/static/chunks/9173.2486ffca31131ec5.js +1 -0
  201. package/dashboard/.next/static/chunks/9178.469341860bf8caec.js +1 -0
  202. package/dashboard/.next/static/chunks/9466.e904660d38c03eea.js +1 -0
  203. package/dashboard/.next/static/chunks/9660.84a85811380c5f33.js +1 -0
  204. package/dashboard/.next/static/chunks/9717.6cf5c8c89403b651.js +1 -0
  205. package/dashboard/.next/static/chunks/9720.67d4d0d15a96d691.js +1 -0
  206. package/dashboard/.next/static/chunks/9811.65e1d080c2d256af.js +1 -0
  207. package/dashboard/.next/static/chunks/app/_not-found/page-548ab392d0e890d1.js +1 -0
  208. package/dashboard/.next/static/chunks/app/access/page-3668562e7464eb5d.js +1 -0
  209. package/dashboard/.next/static/chunks/app/calls/page-d07f5b8664cc8303.js +1 -0
  210. package/dashboard/.next/static/chunks/app/conformance/page-2fede1d7b5f9265d.js +1 -0
  211. package/dashboard/.next/static/chunks/app/diagram/page-b228444265546495.js +1 -0
  212. package/dashboard/.next/static/chunks/app/flows/page-fa67783d8cd79cab.js +1 -0
  213. package/dashboard/.next/static/chunks/app/functions/page-686f0296639133a3.js +1 -0
  214. package/dashboard/.next/static/chunks/app/issues/page-dc110d4cc0a5c398.js +1 -0
  215. package/dashboard/.next/static/chunks/app/layout-e7b50543ba216d12.js +1 -0
  216. package/dashboard/.next/static/chunks/app/page-a0f25953d4457935.js +1 -0
  217. package/dashboard/.next/static/chunks/app/progress/page-f07ac39d1d27b480.js +1 -0
  218. package/dashboard/.next/static/chunks/app/stats/page-db81f600a086f252.js +1 -0
  219. package/dashboard/.next/static/chunks/b7167ec1.7afbab6f609e3326.js +153 -0
  220. package/dashboard/.next/static/chunks/c7ea4e13.5effeeba6618bdb7.js +1 -0
  221. package/dashboard/.next/static/chunks/framework-cf6f5bdca6ba0184.js +33 -0
  222. package/dashboard/.next/static/chunks/main-70c6d841ad572657.js +1 -0
  223. package/dashboard/.next/static/chunks/main-app-9d2f6b8a47133e9b.js +1 -0
  224. package/dashboard/.next/static/chunks/pages/_app-6ad2b50514c24ab4.js +1 -0
  225. package/dashboard/.next/static/chunks/pages/_error-d5eb11c5c4626811.js +1 -0
  226. package/dashboard/.next/static/chunks/polyfills-78c92fac7aa8fdd8.js +1 -0
  227. package/dashboard/.next/static/chunks/webpack-08869f2b18792e51.js +1 -0
  228. package/dashboard/.next/static/css/e6cb67f77f13ae8e.css +3 -0
  229. package/dashboard/.next/static/media/0aa834ed78bf6d07-s.woff2 +0 -0
  230. package/dashboard/.next/static/media/438aa629764e75f3-s.woff2 +0 -0
  231. package/dashboard/.next/static/media/4c9affa5bc8f420e-s.p.woff2 +0 -0
  232. package/dashboard/.next/static/media/51251f8b9793cdb3-s.woff2 +0 -0
  233. package/dashboard/.next/static/media/67957d42bae0796d-s.woff2 +0 -0
  234. package/dashboard/.next/static/media/875ae681bfde4580-s.woff2 +0 -0
  235. package/dashboard/.next/static/media/886030b0b59bc5a7-s.woff2 +0 -0
  236. package/dashboard/.next/static/media/939c4f875ee75fbb-s.woff2 +0 -0
  237. package/dashboard/.next/static/media/bb3ef058b751a6ad-s.p.woff2 +0 -0
  238. package/dashboard/.next/static/media/cc978ac5ee68c2b6-s.woff2 +0 -0
  239. package/dashboard/.next/static/media/e857b654a2caa584-s.woff2 +0 -0
  240. package/dashboard/.next/static/media/f911b923c6adde36-s.woff2 +0 -0
  241. package/dashboard/.next/trace +80 -0
  242. package/dashboard/.next/types/app/access/page.ts +79 -0
  243. package/dashboard/.next/types/app/api/code/route.ts +343 -0
  244. package/dashboard/.next/types/app/api/flows/route.ts +343 -0
  245. package/dashboard/.next/types/app/api/github-status/route.ts +343 -0
  246. package/dashboard/.next/types/app/api/issues/[id]/move/route.ts +343 -0
  247. package/dashboard/.next/types/app/api/issues/[id]/route.ts +343 -0
  248. package/dashboard/.next/types/app/api/mermaid/route.ts +343 -0
  249. package/dashboard/.next/types/app/api/progress/route.ts +343 -0
  250. package/dashboard/.next/types/app/api/watch/route.ts +343 -0
  251. package/dashboard/.next/types/app/calls/page.ts +79 -0
  252. package/dashboard/.next/types/app/conformance/page.ts +79 -0
  253. package/dashboard/.next/types/app/diagram/page.ts +79 -0
  254. package/dashboard/.next/types/app/flows/page.ts +79 -0
  255. package/dashboard/.next/types/app/functions/page.ts +79 -0
  256. package/dashboard/.next/types/app/issues/page.ts +79 -0
  257. package/dashboard/.next/types/app/page.ts +79 -0
  258. package/dashboard/.next/types/app/progress/page.ts +79 -0
  259. package/dashboard/.next/types/app/stats/page.ts +79 -0
  260. package/dashboard/.next/types/package.json +1 -0
  261. package/dashboard/app/access/AccessClient.tsx +402 -0
  262. package/dashboard/app/access/ReadOnlyFunctions.tsx +114 -0
  263. package/dashboard/app/access/page.tsx +118 -0
  264. package/dashboard/app/api/code/route.ts +35 -0
  265. package/dashboard/app/api/flows/route.ts +28 -0
  266. package/dashboard/app/api/github-status/route.ts +23 -0
  267. package/dashboard/app/api/issues/[id]/move/route.ts +74 -0
  268. package/dashboard/app/api/issues/[id]/route.ts +109 -0
  269. package/dashboard/app/api/mermaid/route.ts +25 -0
  270. package/dashboard/app/api/progress/route.ts +36 -0
  271. package/dashboard/app/api/watch/route.ts +52 -0
  272. package/dashboard/app/calls/CallsClient.tsx +170 -0
  273. package/dashboard/app/calls/page.tsx +50 -0
  274. package/dashboard/app/conformance/ConformanceTable.tsx +214 -0
  275. package/dashboard/app/conformance/page.tsx +179 -0
  276. package/dashboard/app/diagram/page.tsx +65 -0
  277. package/dashboard/app/flows/page.tsx +102 -0
  278. package/dashboard/app/functions/FunctionsClient.tsx +167 -0
  279. package/dashboard/app/functions/page.tsx +171 -0
  280. package/dashboard/app/globals.css +157 -0
  281. package/dashboard/app/icon.svg +18 -0
  282. package/dashboard/app/issues/IssuesBoardClient.tsx +636 -0
  283. package/dashboard/app/issues/page.tsx +239 -0
  284. package/dashboard/app/layout.tsx +40 -0
  285. package/dashboard/app/page.tsx +259 -0
  286. package/dashboard/app/progress/ProgressClient.tsx +333 -0
  287. package/dashboard/app/progress/page.tsx +118 -0
  288. package/dashboard/app/stats/StatsClient.tsx +452 -0
  289. package/dashboard/app/stats/page.tsx +43 -0
  290. package/dashboard/components/AutoRefresh.tsx +37 -0
  291. package/dashboard/components/CodeReference.tsx +129 -0
  292. package/dashboard/components/CommandPalette.tsx +135 -0
  293. package/dashboard/components/ConfidenceBadge.tsx +53 -0
  294. package/dashboard/components/DashboardLayout.tsx +450 -0
  295. package/dashboard/components/FilterableTable.tsx +293 -0
  296. package/dashboard/components/LiveStatus.tsx +99 -0
  297. package/dashboard/components/MarkdownRenderer.tsx +40 -0
  298. package/dashboard/components/MermaidViewer.tsx +267 -0
  299. package/dashboard/components/NotYetGenerated.tsx +32 -0
  300. package/dashboard/components/SeverityBadge.tsx +28 -0
  301. package/dashboard/components/SignalBars.tsx +27 -0
  302. package/dashboard/components/SortableTable.tsx +122 -0
  303. package/dashboard/lib/conformance-tokens.ts +49 -0
  304. package/dashboard/lib/data.ts +102 -0
  305. package/dashboard/lib/watcher.ts +45 -0
  306. package/dashboard/next-env.d.ts +5 -0
  307. package/dashboard/next.config.mjs +9 -0
  308. package/dashboard/postcss.config.cjs +6 -0
  309. package/dashboard/tailwind.config.ts +79 -0
  310. package/dashboard/tsconfig.json +21 -0
  311. package/dist/analysis/access-control.d.ts +24 -0
  312. package/dist/analysis/access-control.d.ts.map +1 -0
  313. package/dist/analysis/access-control.js +378 -0
  314. package/dist/analysis/access-control.js.map +1 -0
  315. package/dist/analysis/attack-surface.d.ts +51 -0
  316. package/dist/analysis/attack-surface.d.ts.map +1 -0
  317. package/dist/analysis/attack-surface.js +206 -0
  318. package/dist/analysis/attack-surface.js.map +1 -0
  319. package/dist/analysis/constraint-extraction.d.ts +25 -0
  320. package/dist/analysis/constraint-extraction.d.ts.map +1 -0
  321. package/dist/analysis/constraint-extraction.js +398 -0
  322. package/dist/analysis/constraint-extraction.js.map +1 -0
  323. package/dist/analysis/context-assembler.d.ts +16 -0
  324. package/dist/analysis/context-assembler.d.ts.map +1 -0
  325. package/dist/analysis/context-assembler.js +88 -0
  326. package/dist/analysis/context-assembler.js.map +1 -0
  327. package/dist/analysis/dependency-graph.d.ts +31 -0
  328. package/dist/analysis/dependency-graph.d.ts.map +1 -0
  329. package/dist/analysis/dependency-graph.js +223 -0
  330. package/dist/analysis/dependency-graph.js.map +1 -0
  331. package/dist/analysis/erc-detection.d.ts +16 -0
  332. package/dist/analysis/erc-detection.d.ts.map +1 -0
  333. package/dist/analysis/erc-detection.js +81 -0
  334. package/dist/analysis/erc-detection.js.map +1 -0
  335. package/dist/analysis/external-calls.d.ts +8 -0
  336. package/dist/analysis/external-calls.d.ts.map +1 -0
  337. package/dist/analysis/external-calls.js +124 -0
  338. package/dist/analysis/external-calls.js.map +1 -0
  339. package/dist/analysis/nsloc.d.ts +46 -0
  340. package/dist/analysis/nsloc.d.ts.map +1 -0
  341. package/dist/analysis/nsloc.js +106 -0
  342. package/dist/analysis/nsloc.js.map +1 -0
  343. package/dist/analysis/pattern-detection.d.ts +20 -0
  344. package/dist/analysis/pattern-detection.d.ts.map +1 -0
  345. package/dist/analysis/pattern-detection.js +236 -0
  346. package/dist/analysis/pattern-detection.js.map +1 -0
  347. package/dist/analysis/state-variables.d.ts +33 -0
  348. package/dist/analysis/state-variables.d.ts.map +1 -0
  349. package/dist/analysis/state-variables.js +179 -0
  350. package/dist/analysis/state-variables.js.map +1 -0
  351. package/dist/commands/access.d.ts +3 -0
  352. package/dist/commands/access.d.ts.map +1 -0
  353. package/dist/commands/access.js +99 -0
  354. package/dist/commands/access.js.map +1 -0
  355. package/dist/commands/ai-status.d.ts +3 -0
  356. package/dist/commands/ai-status.d.ts.map +1 -0
  357. package/dist/commands/ai-status.js +172 -0
  358. package/dist/commands/ai-status.js.map +1 -0
  359. package/dist/commands/analyze.d.ts +3 -0
  360. package/dist/commands/analyze.d.ts.map +1 -0
  361. package/dist/commands/analyze.js +101 -0
  362. package/dist/commands/analyze.js.map +1 -0
  363. package/dist/commands/calls.d.ts +3 -0
  364. package/dist/commands/calls.d.ts.map +1 -0
  365. package/dist/commands/calls.js +92 -0
  366. package/dist/commands/calls.js.map +1 -0
  367. package/dist/commands/claude.d.ts +3 -0
  368. package/dist/commands/claude.d.ts.map +1 -0
  369. package/dist/commands/claude.js +42 -0
  370. package/dist/commands/claude.js.map +1 -0
  371. package/dist/commands/constraints.d.ts +3 -0
  372. package/dist/commands/constraints.d.ts.map +1 -0
  373. package/dist/commands/constraints.js +32 -0
  374. package/dist/commands/constraints.js.map +1 -0
  375. package/dist/commands/context.d.ts +3 -0
  376. package/dist/commands/context.d.ts.map +1 -0
  377. package/dist/commands/context.js +57 -0
  378. package/dist/commands/context.js.map +1 -0
  379. package/dist/commands/dashboard.d.ts +3 -0
  380. package/dist/commands/dashboard.d.ts.map +1 -0
  381. package/dist/commands/dashboard.js +95 -0
  382. package/dist/commands/dashboard.js.map +1 -0
  383. package/dist/commands/deps.d.ts +3 -0
  384. package/dist/commands/deps.d.ts.map +1 -0
  385. package/dist/commands/deps.js +67 -0
  386. package/dist/commands/deps.js.map +1 -0
  387. package/dist/commands/doctor.d.ts +17 -0
  388. package/dist/commands/doctor.d.ts.map +1 -0
  389. package/dist/commands/doctor.js +154 -0
  390. package/dist/commands/doctor.js.map +1 -0
  391. package/dist/commands/init.d.ts +3 -0
  392. package/dist/commands/init.d.ts.map +1 -0
  393. package/dist/commands/init.js +330 -0
  394. package/dist/commands/init.js.map +1 -0
  395. package/dist/commands/patterns.d.ts +3 -0
  396. package/dist/commands/patterns.d.ts.map +1 -0
  397. package/dist/commands/patterns.js +40 -0
  398. package/dist/commands/patterns.js.map +1 -0
  399. package/dist/commands/state.d.ts +3 -0
  400. package/dist/commands/state.d.ts.map +1 -0
  401. package/dist/commands/state.js +92 -0
  402. package/dist/commands/state.js.map +1 -0
  403. package/dist/commands/stats.d.ts +3 -0
  404. package/dist/commands/stats.d.ts.map +1 -0
  405. package/dist/commands/stats.js +347 -0
  406. package/dist/commands/stats.js.map +1 -0
  407. package/dist/commands/surface.d.ts +3 -0
  408. package/dist/commands/surface.d.ts.map +1 -0
  409. package/dist/commands/surface.js +45 -0
  410. package/dist/commands/surface.js.map +1 -0
  411. package/dist/commands/update-skills.d.ts +3 -0
  412. package/dist/commands/update-skills.d.ts.map +1 -0
  413. package/dist/commands/update-skills.js +40 -0
  414. package/dist/commands/update-skills.js.map +1 -0
  415. package/dist/commands/update.d.ts +3 -0
  416. package/dist/commands/update.d.ts.map +1 -0
  417. package/dist/commands/update.js +157 -0
  418. package/dist/commands/update.js.map +1 -0
  419. package/dist/core/config.d.ts +24 -0
  420. package/dist/core/config.d.ts.map +1 -0
  421. package/dist/core/config.js +70 -0
  422. package/dist/core/config.js.map +1 -0
  423. package/dist/core/errors.d.ts +17 -0
  424. package/dist/core/errors.d.ts.map +1 -0
  425. package/dist/core/errors.js +113 -0
  426. package/dist/core/errors.js.map +1 -0
  427. package/dist/core/external-tools.d.ts +39 -0
  428. package/dist/core/external-tools.d.ts.map +1 -0
  429. package/dist/core/external-tools.js +151 -0
  430. package/dist/core/external-tools.js.map +1 -0
  431. package/dist/core/logger.d.ts +16 -0
  432. package/dist/core/logger.d.ts.map +1 -0
  433. package/dist/core/logger.js +22 -0
  434. package/dist/core/logger.js.map +1 -0
  435. package/dist/core/output.d.ts +13 -0
  436. package/dist/core/output.d.ts.map +1 -0
  437. package/dist/core/output.js +45 -0
  438. package/dist/core/output.js.map +1 -0
  439. package/dist/core/paths.d.ts +21 -0
  440. package/dist/core/paths.d.ts.map +1 -0
  441. package/dist/core/paths.js +32 -0
  442. package/dist/core/paths.js.map +1 -0
  443. package/dist/core/progress.d.ts +34 -0
  444. package/dist/core/progress.d.ts.map +1 -0
  445. package/dist/core/progress.js +119 -0
  446. package/dist/core/progress.js.map +1 -0
  447. package/dist/core/schema.d.ts +3197 -0
  448. package/dist/core/schema.d.ts.map +1 -0
  449. package/dist/core/schema.js +420 -0
  450. package/dist/core/schema.js.map +1 -0
  451. package/dist/core/skills.d.ts +28 -0
  452. package/dist/core/skills.d.ts.map +1 -0
  453. package/dist/core/skills.js +82 -0
  454. package/dist/core/skills.js.map +1 -0
  455. package/dist/index.d.ts +3 -0
  456. package/dist/index.d.ts.map +1 -0
  457. package/dist/index.js +43 -0
  458. package/dist/index.js.map +1 -0
  459. package/dist/parsers/lcov.d.ts +27 -0
  460. package/dist/parsers/lcov.d.ts.map +1 -0
  461. package/dist/parsers/lcov.js +68 -0
  462. package/dist/parsers/lcov.js.map +1 -0
  463. package/dist/parsers/slither.d.ts +63 -0
  464. package/dist/parsers/slither.d.ts.map +1 -0
  465. package/dist/parsers/slither.js +160 -0
  466. package/dist/parsers/slither.js.map +1 -0
  467. package/dist/parsers/solc.d.ts +19 -0
  468. package/dist/parsers/solc.d.ts.map +1 -0
  469. package/dist/parsers/solc.js +43 -0
  470. package/dist/parsers/solc.js.map +1 -0
  471. package/dist/parsers/solidity-parser.d.ts +77 -0
  472. package/dist/parsers/solidity-parser.d.ts.map +1 -0
  473. package/dist/parsers/solidity-parser.js +357 -0
  474. package/dist/parsers/solidity-parser.js.map +1 -0
  475. package/dist/skills/generate-overleaf.md +326 -0
  476. package/dist/skills/generate-poc.md +186 -0
  477. package/dist/skills/ingest-aa-report.md +172 -0
  478. package/dist/skills/init-audit.md +271 -0
  479. package/dist/skills/sync-issues.md +266 -0
  480. package/dist/skills/validate-issue.md +149 -0
  481. package/dist/skills/write-finding.md +142 -0
  482. package/dist/types/index.d.ts +30 -0
  483. package/dist/types/index.d.ts.map +1 -0
  484. package/dist/types/index.js +2 -0
  485. package/dist/types/index.js.map +1 -0
  486. package/package.json +81 -0
@@ -0,0 +1,330 @@
1
+ import { Command } from 'commander';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { glob } from 'glob';
5
+ import { logger } from '../core/logger.js';
6
+ import { createConfig } from '../core/config.js';
7
+ import { normalizePath, getOutputDir } from '../core/paths.js';
8
+ import { runForge, detectTools } from '../core/external-tools.js';
9
+ import { parseSolidity, extractSolidityVersion } from '../parsers/solidity-parser.js';
10
+ import { copySkillsToClaudeFormat, getClaudeSkillsDir } from '../core/skills.js';
11
+ import { ProgressTracker } from '../core/progress.js';
12
+ import { HexError, reportError } from '../core/errors.js';
13
+ export const initCommand = new Command('init')
14
+ .description('Initialize a new audit project')
15
+ .option('--project <dir>', 'Project directory (default: cwd)')
16
+ .option('--scope <globs>', 'Comma-separated scope file globs')
17
+ .option('--commit <hash>', 'Git commit hash')
18
+ .option('--chain <chain>', 'Target chain', 'ethereum')
19
+ .option('--name <name>', 'Project name')
20
+ .option('--docs <url>', 'Documentation URL')
21
+ .option('--output-dir <dir>', 'Output directory', '.hex')
22
+ .option('--exclude <globs>', 'Comma-separated exclude globs')
23
+ .option('--no-verify', 'Skip build verification')
24
+ .action(async (opts) => {
25
+ const STEPS = [
26
+ 'detect project',
27
+ 'check tools',
28
+ 'resolve scope',
29
+ 'detect solidity version',
30
+ 'create config',
31
+ 'copy skills',
32
+ 'verify build',
33
+ 'write CLAUDE.md',
34
+ ];
35
+ const tracker = new ProgressTracker(STEPS);
36
+ tracker.start();
37
+ try {
38
+ const projectDir = path.resolve(opts.project ?? process.cwd());
39
+ if (!fs.existsSync(projectDir)) {
40
+ tracker.update('detect project', 'failed', 'project dir missing');
41
+ throw new HexError('project.foundry-missing', `path: ${projectDir}`);
42
+ }
43
+ tracker.update('detect project', 'running');
44
+ const isFoundry = fs.existsSync(path.join(projectDir, 'foundry.toml'));
45
+ const isHardhat = fs.existsSync(path.join(projectDir, 'hardhat.config.ts')) ||
46
+ fs.existsSync(path.join(projectDir, 'hardhat.config.js'));
47
+ const projectTypeDetail = isFoundry ? 'Foundry' : isHardhat ? 'Hardhat' : 'none detected';
48
+ tracker.update('detect project', 'ok', projectTypeDetail);
49
+ tracker.update('check tools', 'running');
50
+ const tools = await detectTools();
51
+ const toolDetails = [];
52
+ for (const tool of tools) {
53
+ if (tool.available) {
54
+ toolDetails.push(`${tool.name} ok`);
55
+ }
56
+ else {
57
+ toolDetails.push(`${tool.name} missing`);
58
+ }
59
+ }
60
+ const allMissing = tools.every((t) => !t.available);
61
+ tracker.update('check tools', allMissing ? 'failed' : 'ok', toolDetails.join(', '));
62
+ if (!tools.find((t) => t.name === 'forge')?.available) {
63
+ logger.warn('forge not found — compilation verification and test coverage will be unavailable');
64
+ }
65
+ if (!tools.find((t) => t.name === 'slither')?.available) {
66
+ logger.warn('slither not found — access control, state variable, and external call analysis will be limited');
67
+ }
68
+ if (!tools.find((t) => t.name === 'solc')?.available) {
69
+ logger.warn('solc not found — storage layout extraction will be unavailable');
70
+ }
71
+ // Resolve scope globs
72
+ if (!opts.scope) {
73
+ tracker.update('resolve scope', 'failed', '--scope missing');
74
+ throw new HexError('project.scope.empty');
75
+ }
76
+ tracker.update('resolve scope', 'running');
77
+ const scopeGlobs = opts.scope.split(',').map((g) => g.trim());
78
+ const excludeGlobs = opts.exclude ? opts.exclude.split(',').map((g) => g.trim()) : [];
79
+ const scopeFiles = [];
80
+ for (const pattern of scopeGlobs) {
81
+ const matches = await glob(pattern, {
82
+ cwd: projectDir,
83
+ ignore: excludeGlobs,
84
+ posix: true,
85
+ });
86
+ scopeFiles.push(...matches);
87
+ }
88
+ const uniqueScope = [...new Set(scopeFiles)].sort();
89
+ if (uniqueScope.length === 0) {
90
+ tracker.update('resolve scope', 'failed', `no match for ${scopeGlobs.join(', ')}`);
91
+ throw new HexError('project.scope.unmatched', `globs: ${scopeGlobs.join(', ')}`);
92
+ }
93
+ for (const file of uniqueScope) {
94
+ const fullPath = path.join(projectDir, file);
95
+ if (!fs.existsSync(fullPath)) {
96
+ tracker.update('resolve scope', 'failed', `missing file: ${file}`);
97
+ throw new HexError('project.scope.missing-file', `path: ${file}`);
98
+ }
99
+ }
100
+ tracker.update('resolve scope', 'ok', `${uniqueScope.length} files`);
101
+ // Detect Solidity version
102
+ tracker.update('detect solidity version', 'running');
103
+ let solidityVersion = '0.8.20'; // default
104
+ let versionSource = 'default';
105
+ if (isFoundry) {
106
+ const foundryToml = fs.readFileSync(path.join(projectDir, 'foundry.toml'), 'utf-8');
107
+ const versionMatch = foundryToml.match(/solc[_-]version\s*=\s*["']?([\d.]+)/);
108
+ if (versionMatch) {
109
+ solidityVersion = versionMatch[1];
110
+ versionSource = 'foundry.toml';
111
+ }
112
+ }
113
+ if (versionSource === 'default') {
114
+ for (const file of uniqueScope.slice(0, 5)) {
115
+ const source = fs.readFileSync(path.join(projectDir, file), 'utf-8');
116
+ const result = parseSolidity(source, file);
117
+ const version = extractSolidityVersion(result.pragmas);
118
+ if (version) {
119
+ solidityVersion = version;
120
+ versionSource = 'pragma';
121
+ break;
122
+ }
123
+ }
124
+ }
125
+ tracker.update('detect solidity version', 'ok', `${solidityVersion} (${versionSource})`);
126
+ // Detect commit hash
127
+ let commit = opts.commit;
128
+ if (!commit) {
129
+ try {
130
+ const { execSync } = await import('node:child_process');
131
+ commit = execSync('git rev-parse HEAD', {
132
+ cwd: projectDir,
133
+ encoding: 'utf-8',
134
+ }).trim();
135
+ }
136
+ catch {
137
+ commit = 'unknown';
138
+ logger.warn('Could not detect git commit hash. Use --commit to specify.');
139
+ }
140
+ }
141
+ // Determine project name
142
+ const name = opts.name ?? path.basename(projectDir);
143
+ // Create config
144
+ tracker.update('create config', 'running');
145
+ const config = createConfig({
146
+ name,
147
+ projectDir,
148
+ commit,
149
+ chain: opts.chain,
150
+ solidityVersion,
151
+ docsUrl: opts.docs,
152
+ scope: uniqueScope,
153
+ exclude: excludeGlobs,
154
+ outputDir: opts.outputDir,
155
+ });
156
+ const outputDir = getOutputDir(projectDir, config.settings.output_dir);
157
+ tracker.update('create config', 'ok', normalizePath(outputDir));
158
+ // Copy skill files to .claude/skills/<name>/SKILL.md
159
+ tracker.update('copy skills', 'running');
160
+ const claudeSkillsDir = getClaudeSkillsDir(projectDir);
161
+ const skillsResult = copySkillsToClaudeFormat({ targetDir: claudeSkillsDir });
162
+ tracker.update('copy skills', 'ok', `${skillsResult.updated + skillsResult.added} skill(s)`);
163
+ // Create subdirectories
164
+ for (const subdir of ['validations', 'ai-results']) {
165
+ const dir = path.join(outputDir, subdir);
166
+ if (!fs.existsSync(dir)) {
167
+ fs.mkdirSync(dir, { recursive: true });
168
+ }
169
+ }
170
+ // Create ai-results subdirectory for auditagent (the only supported AI tool)
171
+ const auditagentDir = path.join(outputDir, 'ai-results', 'auditagent');
172
+ if (!fs.existsSync(auditagentDir)) {
173
+ fs.mkdirSync(auditagentDir, { recursive: true });
174
+ }
175
+ // Optionally verify compilation
176
+ if (opts.verify !== false && isFoundry) {
177
+ tracker.update('verify build', 'running');
178
+ const result = await runForge(projectDir, ['build']);
179
+ if (result.exitCode === 0) {
180
+ tracker.update('verify build', 'ok');
181
+ }
182
+ else {
183
+ tracker.update('verify build', 'failed', 'forge build returned non-zero (non-fatal)');
184
+ logger.dim(result.stderr.slice(0, 500));
185
+ }
186
+ }
187
+ else {
188
+ tracker.update('verify build', 'skipped', isFoundry ? '--no-verify' : 'not a Foundry project');
189
+ }
190
+ // Create CLAUDE.md for Claude Code skill discovery
191
+ const claudeMdPath = path.join(projectDir, 'CLAUDE.md');
192
+ if (!fs.existsSync(claudeMdPath)) {
193
+ const claudeMd = `# Hex Project: ${config.project.name}
194
+
195
+ This project is being audited with Hex.
196
+
197
+ - **Chain:** ${config.project.chain}
198
+ - **Solidity:** ${config.project.solidity_version}
199
+ - **Commit:** \`${config.project.commit}\`${config.project.docs_url ? `\n- **Docs:** ${config.project.docs_url}` : ''}
200
+ - **Config:** \`${config.settings.output_dir}/config.json\` — source of truth for all project metadata
201
+
202
+ ## Scope
203
+
204
+ The following files are in audit scope:
205
+ ${uniqueScope.map((f) => `- \`${f}\``).join('\n')}
206
+
207
+ ## Output Directory (\`${config.settings.output_dir}/\`)
208
+
209
+ All analysis outputs live here. Key files and what they answer:
210
+
211
+ | File | Contains | Use when asked about... |
212
+ |------|----------|------------------------|
213
+ | \`config.json\` | Project config (scope, chain, docs URL, commit) | project setup, documentation, scope |
214
+ | \`stats.json\` | nSLOC, contracts, functions, test coverage, dependencies | codebase size, complexity, coverage |
215
+ | \`deps.json\` | Inheritance, imports, calls, clusters | contract relationships, dependency graph |
216
+ | \`access-control.json\` | Roles, modifiers, function access | who can call what, privileged functions |
217
+ | \`state-vars.json\` | State variables, types, visibility, read/write | storage, mutability, state layout |
218
+ | \`external-calls.json\` | External calls, reentrancy guards, trust levels | external interactions, reentrancy risk |
219
+ | \`overview.md\` | AI-generated protocol overview | what the protocol does, architecture |
220
+ | \`invariants.md\` | Protocol invariants from docs and code | invariants, assumptions, properties |
221
+ | \`spec-conformance.json\` | Spec vs code deviations | spec compliance, ERC conformance |
222
+ | \`findings.json\` | Audit findings (canonical) | reported issues, vulnerabilities |
223
+ | \`tracking.json\` | Finding status and duplicates | finding triage, status |
224
+ | \`comparison.json\` | AI cross-check results | AI-found issues, novel findings |
225
+ | \`progress.json\` | Audit progress tracking | what has been reviewed |
226
+ | \`diagrams/\` | Mermaid architecture and flow diagrams | system diagrams, flows |
227
+
228
+ Not all files exist initially — they are created as you run skills and CLI commands.
229
+
230
+ ## Skills (Slash Commands)
231
+
232
+ Skills are in \`.claude/skills/\` and auto-discovered by Claude Code. Type \`/\` to list them.
233
+
234
+ **Recommended workflow order:**
235
+
236
+ 1. \`/init-audit\` — Initialize project, audit dependencies, run analysis pipeline
237
+ 2. \`/generate-overview\` — Write protocol overview from analysis data
238
+ 3. \`/generate-diagram\` — Create Mermaid architecture diagram
239
+ 4. \`/generate-flows\` — Create Mermaid flow charts per user type
240
+ 5. \`/identify-invariants\` — Three-pass invariant identification (docs, code, comparison)
241
+ 6. \`/check-spec-conformance\` — Verify code matches docs, NatSpec, interfaces, ERCs
242
+ 7. \`/generate-poc\` — Validate an issue with a runnable proof-of-concept test
243
+ 8. \`/write-finding\` — Write a structured finding with severity and recommendation
244
+ 9. \`/conformance-to-findings\` — Batch-convert spec deviations into findings
245
+ 10. \`/run-ai-analysis\` — Orchestrate all AI audit tools with preflight checks
246
+ 11. \`/compare-findings\` — Cross-check findings against AI agent results
247
+ 12. \`/validate-ai-finding\` — Independently verify a novel AI-found issue
248
+
249
+ Each skill builds on previous outputs. Run them in order for best results.
250
+
251
+ ## CLI Commands
252
+
253
+ - \`npx hex analyze\` — Run all deterministic analysis (stats, deps, access, state, calls)
254
+ - \`npx hex context\` — Assemble full codebase context for AI prompts
255
+ - \`npx hex context --target <Contract>\` — Focused context for a single contract
256
+ - \`npx hex dashboard\` — Open browser dashboard at http://localhost:3000
257
+
258
+ ## Writing Style (applies to every skill that produces text)
259
+
260
+ Anything you write into \`.hex/\` files (findings, overview, invariants, spec conformance) ends up in front of a security team or in a public report. Write like a senior auditor, not like an AI model showing off. The detectable patterns below are off-limits:
261
+
262
+ ### Banned punctuation and words
263
+
264
+ - **No em dashes (—)** anywhere. Use commas, parentheses, semicolons, or split into separate sentences. This is the single biggest AI tell in audit reports.
265
+ - **No en dashes (–) in prose either.** Hyphens are fine for compounds (\`fee-on-transfer\`).
266
+ - Avoid these words: *delve, moreover, furthermore, seamlessly, cutting-edge, revolutionize, unlock the potential, streamline, in essence, at its core, it is worth noting, indeed, harness, underscore, illuminate, pivotal, groundbreaking, multifaceted, robust (outside technical contexts), holistic, paradigm, synergy, empower, foster, facilitate*.
267
+ - Avoid metaphorical *navigate*, *landscape*, *benchmark* (as a verb).
268
+ - Avoid filler openings: *In today's world*, *When it comes to*, *In this article*, *As previously mentioned*, *It goes without saying*.
269
+
270
+ ### Structure
271
+
272
+ - Don't force the rule of three. If two points cover it, stop at two.
273
+ - Don't start consecutive paragraphs with the same syntactic pattern.
274
+ - Skip the intro-body-summary shape. Not every paragraph needs a topic sentence and a wrap-up.
275
+ - Don't pad bullet points to make the list look fuller.
276
+
277
+ ### Sentences
278
+
279
+ - Vary sentence length. Mix short with long.
280
+ - Don't use parallel grammatical construction across three or more consecutive sentences.
281
+ - One present-participle opener per page max (\`Showcasing...\`, \`Leveraging...\`).
282
+ - Don't over-hedge with *it could be said*, *one might argue*, *perhaps it is fair to say*.
283
+
284
+ ### Recommendation tone (specific to findings)
285
+
286
+ Recommendations are suggestions, not orders. The protocol team owns the fix; you propose direction.
287
+
288
+ - Start with *Consider...*, *One option is...*, *The team may want to...*, *It would be worth...*.
289
+ - Avoid *Replace X with Y*, *You must...*, *Always do...*, *Never do...*.
290
+ - If you point at a specific pattern (e.g. reentrancy guard, checks-effects-interactions), present it as the common fix rather than the only fix. The team may have constraints you can't see.
291
+
292
+ ### Tone
293
+
294
+ - Match formality to context, not to a corporate default.
295
+ - Be direct and specific over vaguely positive.
296
+ - Use concrete numbers and details over generic descriptors.
297
+ - Don't restate or summarise what you just said.
298
+ - Don't add trailing summaries unless asked.
299
+
300
+ ### Content
301
+
302
+ - Prefer specific facts over generic claims.
303
+ - Don't pad with unnecessary comprehensiveness. Say what needs saying, then stop.
304
+ - Avoid rhetorical questions as transitions.
305
+
306
+ Apply these to every skill output without being reminded.
307
+ `;
308
+ fs.writeFileSync(claudeMdPath, claudeMd, 'utf-8');
309
+ tracker.update('write CLAUDE.md', 'ok', normalizePath(claudeMdPath));
310
+ }
311
+ else {
312
+ tracker.update('write CLAUDE.md', 'skipped', 'already exists');
313
+ }
314
+ tracker.finish();
315
+ logger.success('Audit initialized');
316
+ logger.info(`Config: ${normalizePath(path.join(outputDir, 'config.json'))}`);
317
+ logger.info(`Output: ${normalizePath(outputDir)}`);
318
+ logger.info('');
319
+ logger.info('Next steps:');
320
+ logger.dim(' hex stats # Generate codebase statistics');
321
+ logger.dim(' hex deps # Build dependency graph');
322
+ logger.dim(' hex access # Map access control');
323
+ }
324
+ catch (err) {
325
+ tracker.finish();
326
+ reportError(err);
327
+ process.exit(1);
328
+ }
329
+ });
330
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const patternsCommand: Command;
3
+ //# sourceMappingURL=patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../src/commands/patterns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,eAAe,SAoCxB,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { Command } from 'commander';
2
+ import { logger } from '../core/logger.js';
3
+ import { loadConfig } from '../core/config.js';
4
+ import { getOutputDir } from '../core/paths.js';
5
+ import { writeJsonOutput } from '../core/output.js';
6
+ import { detectPatterns } from '../analysis/pattern-detection.js';
7
+ export const patternsCommand = new Command('patterns')
8
+ .description('Detect security-relevant patterns in scope files')
9
+ .option('--project <dir>', 'Project directory')
10
+ .action(async (opts) => {
11
+ const spin = logger.spinner('Detecting security patterns...');
12
+ try {
13
+ const projectDir = opts.project ?? process.cwd();
14
+ const config = loadConfig(projectDir);
15
+ const outputDir = getOutputDir(config.project.project_dir, config.settings.output_dir);
16
+ spin.text = 'Scanning scope files for security patterns...';
17
+ const result = detectPatterns(config.project.project_dir, config.project.scope);
18
+ const detectedFlags = Object.entries(result.flags)
19
+ .filter(([, v]) => v.detected)
20
+ .map(([k]) => k);
21
+ const outPath = writeJsonOutput(outputDir, 'patterns.json', result);
22
+ spin.succeed(`Detected ${detectedFlags.length} pattern flags`);
23
+ if (detectedFlags.length > 0) {
24
+ logger.info(` Flags: ${detectedFlags.join(', ')}`);
25
+ }
26
+ if (result.protocol_hints.length > 0) {
27
+ logger.info(` Protocol hints: ${result.protocol_hints.join(', ')}`);
28
+ }
29
+ if (result.risk_areas.length > 0) {
30
+ logger.info(` Risk areas: ${result.risk_areas.length}`);
31
+ }
32
+ logger.dim(` → ${outPath}`);
33
+ }
34
+ catch (err) {
35
+ spin.fail('Pattern detection failed');
36
+ logger.error(err instanceof Error ? err.message : String(err));
37
+ process.exit(1);
38
+ }
39
+ });
40
+ //# sourceMappingURL=patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/commands/patterns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAElE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,WAAW,CAAC,kDAAkD,CAAC;KAC/D,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;KAC9C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAEvF,IAAI,CAAC,IAAI,GAAG,+CAA+C,CAAC;QAC5D,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEhF,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;aAC/C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;aAC7B,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAEnB,MAAM,OAAO,GAAG,eAAe,CAAC,SAAS,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;QAEpE,IAAI,CAAC,OAAO,CAAC,YAAY,aAAa,CAAC,MAAM,gBAAgB,CAAC,CAAC;QAC/D,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,YAAY,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const stateCommand: Command;
3
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/commands/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,eAAO,MAAM,YAAY,SA6FrB,CAAC"}
@@ -0,0 +1,92 @@
1
+ import { Command } from 'commander';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { logger } from '../core/logger.js';
5
+ import { loadConfig } from '../core/config.js';
6
+ import { getOutputDir, normalizePath } from '../core/paths.js';
7
+ import { writeJsonOutput } from '../core/output.js';
8
+ import { parseSolidityCached } from '../parsers/solidity-parser.js';
9
+ import { parseFunctionSummary } from '../parsers/slither.js';
10
+ import { parseStorageLayout } from '../parsers/solc.js';
11
+ import { extractStateVariables } from '../analysis/state-variables.js';
12
+ import { getSlitherFunctionSummary } from '../core/external-tools.js';
13
+ export const stateCommand = new Command('state')
14
+ .description('Generate state variable inventory')
15
+ .option('--project <dir>', 'Project directory')
16
+ .action(async (opts) => {
17
+ const spin = logger.spinner('Analyzing state variables...');
18
+ try {
19
+ const projectDir = opts.project ?? process.cwd();
20
+ const config = loadConfig(projectDir);
21
+ const outputDir = getOutputDir(config.project.project_dir, config.settings.output_dir);
22
+ // Parse all scope files
23
+ spin.text = 'Parsing contracts...';
24
+ const allContracts = [];
25
+ const fileMap = new Map();
26
+ for (const scopeFile of config.project.scope) {
27
+ const filePath = path.resolve(config.project.project_dir, scopeFile);
28
+ if (!fs.existsSync(filePath))
29
+ continue;
30
+ const source = fs.readFileSync(filePath, 'utf-8');
31
+ const parsed = parseSolidityCached(source, scopeFile);
32
+ for (const contract of parsed.contracts) {
33
+ allContracts.push(contract);
34
+ fileMap.set(contract.name, normalizePath(scopeFile));
35
+ }
36
+ }
37
+ // Try Slither for read/write data
38
+ spin.text = 'Running Slither data dependency analysis...';
39
+ let slitherSummary = null;
40
+ try {
41
+ const result = await getSlitherFunctionSummary(config.project.project_dir, outputDir);
42
+ if (result.exitCode === 0 && result.stdout) {
43
+ slitherSummary = parseFunctionSummary(JSON.parse(result.stdout));
44
+ }
45
+ }
46
+ catch {
47
+ logger.warn('Slither not available — read/write tracking limited');
48
+ }
49
+ // Try solc for storage layout
50
+ spin.text = 'Checking storage layout...';
51
+ let storageLayout = null;
52
+ try {
53
+ // Try reading from forge build artifacts
54
+ const outDir = path.join(config.project.project_dir, 'out');
55
+ if (fs.existsSync(outDir)) {
56
+ for (const contract of allContracts) {
57
+ const artifactPath = path.join(outDir, `${contract.name}.sol`, `${contract.name}.json`);
58
+ if (fs.existsSync(artifactPath)) {
59
+ const artifact = JSON.parse(fs.readFileSync(artifactPath, 'utf-8'));
60
+ if (artifact.storageLayout) {
61
+ storageLayout = parseStorageLayout({ contracts: { '': { [contract.name]: { storageLayout: artifact.storageLayout } } } }, contract.name);
62
+ }
63
+ }
64
+ }
65
+ }
66
+ }
67
+ catch {
68
+ logger.dim('Storage layout not available from build artifacts');
69
+ }
70
+ // Extract state variables
71
+ const result = extractStateVariables(allContracts, fileMap, slitherSummary, storageLayout);
72
+ const stateVars = {
73
+ variables: result.variables,
74
+ storage_layout_source: result.storageLayoutSource,
75
+ storage_collisions: result.storageCollisions,
76
+ };
77
+ const outPath = writeJsonOutput(outputDir, 'state-vars.json', stateVars);
78
+ spin.succeed('State variable analysis complete');
79
+ logger.info(`Output: ${outPath}`);
80
+ logger.info(`Found: ${stateVars.variables.length} state variables`);
81
+ const unused = stateVars.variables.filter((v) => v.is_unused);
82
+ if (unused.length > 0) {
83
+ logger.warn(`${unused.length} potentially unused variables detected`);
84
+ }
85
+ }
86
+ catch (err) {
87
+ spin.fail('State variable analysis failed');
88
+ logger.error(err instanceof Error ? err.message : String(err));
89
+ process.exit(1);
90
+ }
91
+ });
92
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/commands/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAiB,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,yBAAyB,EAAW,MAAM,2BAA2B,CAAC;AAG/E,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;KAC9C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAEvF,wBAAwB;QACxB,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,MAAM,YAAY,GAAkD,EAAE,CAAC;QACvE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE1C,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACrE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;gBAAE,SAAS;YAEvC,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAEtD,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACxC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,IAAI,CAAC,IAAI,GAAG,6CAA6C,CAAC;QAC1D,IAAI,cAAc,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACtF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC3C,cAAc,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACrE,CAAC;QAED,8BAA8B;QAC9B,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;QACzC,IAAI,aAAa,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC;YACH,yCAAyC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;oBACpC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,OAAO,CAAC,CAAC;oBACxF,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;wBAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;wBACpE,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;4BAC3B,aAAa,GAAG,kBAAkB,CAChC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,EACrF,QAAQ,CAAC,IAAI,CACd,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QAClE,CAAC;QAED,0BAA0B;QAC1B,MAAM,MAAM,GAAG,qBAAqB,CAClC,YAAY,EACZ,OAAO,EACP,cAAc,EACd,aAAa,CACd,CAAC;QAEF,MAAM,SAAS,GAAc;YAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,qBAAqB,EAAE,MAAM,CAAC,mBAAmB;YACjD,kBAAkB,EAAE,MAAM,CAAC,iBAAiB;SAC7C,CAAC;QAEF,MAAM,OAAO,GAAG,eAAe,CAAC,SAAS,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;QACzE,IAAI,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,UAAU,SAAS,CAAC,SAAS,CAAC,MAAM,kBAAkB,CAAC,CAAC;QAEpE,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC9D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,wCAAwC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const statsCommand: Command;
3
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,eAAO,MAAM,YAAY,SAoMrB,CAAC"}