movehat 0.1.9 → 0.2.1

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 (445) hide show
  1. package/README.md +132 -279
  2. package/dist/__tests__/deployContract.test.d.ts +2 -0
  3. package/dist/__tests__/deployContract.test.d.ts.map +1 -0
  4. package/dist/__tests__/deployContract.test.js +368 -0
  5. package/dist/__tests__/deployContract.test.js.map +1 -0
  6. package/dist/__tests__/errors.test.d.ts +2 -0
  7. package/dist/__tests__/errors.test.d.ts.map +1 -0
  8. package/dist/__tests__/errors.test.js +46 -0
  9. package/dist/__tests__/errors.test.js.map +1 -0
  10. package/dist/__tests__/fixtures/sigint-deploy-harness.d.ts +24 -0
  11. package/dist/__tests__/fixtures/sigint-deploy-harness.d.ts.map +1 -0
  12. package/dist/__tests__/fixtures/sigint-deploy-harness.js +82 -0
  13. package/dist/__tests__/fixtures/sigint-deploy-harness.js.map +1 -0
  14. package/dist/__tests__/fork/api.test.d.ts +2 -0
  15. package/dist/__tests__/fork/api.test.d.ts.map +1 -0
  16. package/dist/__tests__/fork/api.test.js +110 -0
  17. package/dist/__tests__/fork/api.test.js.map +1 -0
  18. package/dist/__tests__/harness/Harness.createLive.test.d.ts +2 -0
  19. package/dist/__tests__/harness/Harness.createLive.test.d.ts.map +1 -0
  20. package/dist/__tests__/harness/Harness.createLive.test.js +53 -0
  21. package/dist/__tests__/harness/Harness.createLive.test.js.map +1 -0
  22. package/dist/__tests__/harness/Harness.proxy.test.d.ts +2 -0
  23. package/dist/__tests__/harness/Harness.proxy.test.d.ts.map +1 -0
  24. package/dist/__tests__/harness/Harness.proxy.test.js +89 -0
  25. package/dist/__tests__/harness/Harness.proxy.test.js.map +1 -0
  26. package/dist/__tests__/harness/_fixture.d.ts +54 -0
  27. package/dist/__tests__/harness/_fixture.d.ts.map +1 -0
  28. package/dist/__tests__/harness/_fixture.js +69 -0
  29. package/dist/__tests__/harness/_fixture.js.map +1 -0
  30. package/dist/__tests__/harness/codeObject.deploy.test.d.ts +2 -0
  31. package/dist/__tests__/harness/codeObject.deploy.test.d.ts.map +1 -0
  32. package/dist/__tests__/harness/codeObject.deploy.test.js +288 -0
  33. package/dist/__tests__/harness/codeObject.deploy.test.js.map +1 -0
  34. package/dist/__tests__/harness/codeObject.upgrade.test.d.ts +2 -0
  35. package/dist/__tests__/harness/codeObject.upgrade.test.d.ts.map +1 -0
  36. package/dist/__tests__/harness/codeObject.upgrade.test.js +138 -0
  37. package/dist/__tests__/harness/codeObject.upgrade.test.js.map +1 -0
  38. package/dist/__tests__/harness/script.test.d.ts +2 -0
  39. package/dist/__tests__/harness/script.test.d.ts.map +1 -0
  40. package/dist/__tests__/harness/script.test.js +219 -0
  41. package/dist/__tests__/harness/script.test.js.map +1 -0
  42. package/dist/__tests__/harness/view.test.d.ts +2 -0
  43. package/dist/__tests__/harness/view.test.d.ts.map +1 -0
  44. package/dist/__tests__/harness/view.test.js +92 -0
  45. package/dist/__tests__/harness/view.test.js.map +1 -0
  46. package/dist/__tests__/runtime.test.d.ts +2 -0
  47. package/dist/__tests__/runtime.test.d.ts.map +1 -0
  48. package/dist/__tests__/runtime.test.js +141 -0
  49. package/dist/__tests__/runtime.test.js.map +1 -0
  50. package/dist/cli.js +2 -1
  51. package/dist/cli.js.map +1 -1
  52. package/dist/commands/__tests__/compile.test.d.ts +2 -0
  53. package/dist/commands/__tests__/compile.test.d.ts.map +1 -0
  54. package/dist/commands/__tests__/compile.test.js +351 -0
  55. package/dist/commands/__tests__/compile.test.js.map +1 -0
  56. package/dist/commands/__tests__/init.test.d.ts +2 -0
  57. package/dist/commands/__tests__/init.test.d.ts.map +1 -0
  58. package/dist/commands/__tests__/init.test.js +101 -0
  59. package/dist/commands/__tests__/init.test.js.map +1 -0
  60. package/dist/commands/__tests__/run.test.d.ts +2 -0
  61. package/dist/commands/__tests__/run.test.d.ts.map +1 -0
  62. package/dist/commands/__tests__/run.test.js +166 -0
  63. package/dist/commands/__tests__/run.test.js.map +1 -0
  64. package/dist/commands/__tests__/test-move.test.d.ts +2 -0
  65. package/dist/commands/__tests__/test-move.test.d.ts.map +1 -0
  66. package/dist/commands/__tests__/test-move.test.js +59 -0
  67. package/dist/commands/__tests__/test-move.test.js.map +1 -0
  68. package/dist/commands/__tests__/test.test.d.ts +2 -0
  69. package/dist/commands/__tests__/test.test.d.ts.map +1 -0
  70. package/dist/commands/__tests__/test.test.js +168 -0
  71. package/dist/commands/__tests__/test.test.js.map +1 -0
  72. package/dist/commands/__tests__/update.test.d.ts +2 -0
  73. package/dist/commands/__tests__/update.test.d.ts.map +1 -0
  74. package/dist/commands/__tests__/update.test.js +176 -0
  75. package/dist/commands/__tests__/update.test.js.map +1 -0
  76. package/dist/commands/compile.d.ts +7 -1
  77. package/dist/commands/compile.d.ts.map +1 -1
  78. package/dist/commands/compile.js +150 -33
  79. package/dist/commands/compile.js.map +1 -1
  80. package/dist/commands/fork/__tests__/create.test.d.ts +2 -0
  81. package/dist/commands/fork/__tests__/create.test.d.ts.map +1 -0
  82. package/dist/commands/fork/__tests__/create.test.js +108 -0
  83. package/dist/commands/fork/__tests__/create.test.js.map +1 -0
  84. package/dist/commands/fork/__tests__/fund.test.d.ts +2 -0
  85. package/dist/commands/fork/__tests__/fund.test.d.ts.map +1 -0
  86. package/dist/commands/fork/__tests__/fund.test.js +72 -0
  87. package/dist/commands/fork/__tests__/fund.test.js.map +1 -0
  88. package/dist/commands/fork/__tests__/list.test.d.ts +2 -0
  89. package/dist/commands/fork/__tests__/list.test.d.ts.map +1 -0
  90. package/dist/commands/fork/__tests__/list.test.js +119 -0
  91. package/dist/commands/fork/__tests__/list.test.js.map +1 -0
  92. package/dist/commands/fork/__tests__/serve.test.d.ts +2 -0
  93. package/dist/commands/fork/__tests__/serve.test.d.ts.map +1 -0
  94. package/dist/commands/fork/__tests__/serve.test.js +97 -0
  95. package/dist/commands/fork/__tests__/serve.test.js.map +1 -0
  96. package/dist/commands/fork/__tests__/view-resource.test.d.ts +2 -0
  97. package/dist/commands/fork/__tests__/view-resource.test.d.ts.map +1 -0
  98. package/dist/commands/fork/__tests__/view-resource.test.js +77 -0
  99. package/dist/commands/fork/__tests__/view-resource.test.js.map +1 -0
  100. package/dist/commands/fork/create.d.ts +1 -1
  101. package/dist/commands/fork/create.d.ts.map +1 -1
  102. package/dist/commands/fork/create.js +3 -2
  103. package/dist/commands/fork/create.js.map +1 -1
  104. package/dist/commands/fork/fund.d.ts.map +1 -1
  105. package/dist/commands/fork/fund.js +15 -8
  106. package/dist/commands/fork/fund.js.map +1 -1
  107. package/dist/commands/fork/list.d.ts.map +1 -1
  108. package/dist/commands/fork/list.js +2 -1
  109. package/dist/commands/fork/list.js.map +1 -1
  110. package/dist/commands/fork/serve.d.ts +1 -0
  111. package/dist/commands/fork/serve.d.ts.map +1 -1
  112. package/dist/commands/fork/serve.js +4 -2
  113. package/dist/commands/fork/serve.js.map +1 -1
  114. package/dist/commands/fork/view-resource.d.ts.map +1 -1
  115. package/dist/commands/fork/view-resource.js +10 -5
  116. package/dist/commands/fork/view-resource.js.map +1 -1
  117. package/dist/commands/run.d.ts +15 -0
  118. package/dist/commands/run.d.ts.map +1 -1
  119. package/dist/commands/run.js +50 -27
  120. package/dist/commands/run.js.map +1 -1
  121. package/dist/commands/test-move.d.ts.map +1 -1
  122. package/dist/commands/test-move.js +3 -2
  123. package/dist/commands/test-move.js.map +1 -1
  124. package/dist/commands/test.js +52 -46
  125. package/dist/commands/test.js.map +1 -1
  126. package/dist/commands/update.d.ts.map +1 -1
  127. package/dist/commands/update.js +15 -13
  128. package/dist/commands/update.js.map +1 -1
  129. package/dist/core/AccountManager.d.ts +1 -4
  130. package/dist/core/AccountManager.d.ts.map +1 -1
  131. package/dist/core/AccountManager.js +20 -12
  132. package/dist/core/AccountManager.js.map +1 -1
  133. package/dist/core/Publisher.d.ts +26 -0
  134. package/dist/core/Publisher.d.ts.map +1 -0
  135. package/dist/core/Publisher.js +240 -0
  136. package/dist/core/Publisher.js.map +1 -0
  137. package/dist/core/__tests__/AccountManager.test.d.ts +2 -0
  138. package/dist/core/__tests__/AccountManager.test.d.ts.map +1 -0
  139. package/dist/core/__tests__/AccountManager.test.js +239 -0
  140. package/dist/core/__tests__/AccountManager.test.js.map +1 -0
  141. package/dist/core/__tests__/config.test.d.ts +2 -0
  142. package/dist/core/__tests__/config.test.d.ts.map +1 -0
  143. package/dist/core/__tests__/config.test.js +311 -0
  144. package/dist/core/__tests__/config.test.js.map +1 -0
  145. package/dist/core/__tests__/deployments.test.d.ts +2 -0
  146. package/dist/core/__tests__/deployments.test.d.ts.map +1 -0
  147. package/dist/core/__tests__/deployments.test.js +201 -0
  148. package/dist/core/__tests__/deployments.test.js.map +1 -0
  149. package/dist/core/__tests__/shell.test.d.ts +2 -0
  150. package/dist/core/__tests__/shell.test.d.ts.map +1 -0
  151. package/dist/core/__tests__/shell.test.js +107 -0
  152. package/dist/core/__tests__/shell.test.js.map +1 -0
  153. package/dist/core/config.d.ts +13 -1
  154. package/dist/core/config.d.ts.map +1 -1
  155. package/dist/core/config.js +80 -11
  156. package/dist/core/config.js.map +1 -1
  157. package/dist/core/contract.d.ts +1 -4
  158. package/dist/core/contract.d.ts.map +1 -1
  159. package/dist/core/contract.js +15 -7
  160. package/dist/core/contract.js.map +1 -1
  161. package/dist/core/deployments.d.ts +2 -8
  162. package/dist/core/deployments.d.ts.map +1 -1
  163. package/dist/core/deployments.js +8 -18
  164. package/dist/core/deployments.js.map +1 -1
  165. package/dist/core/movementProfile.d.ts +34 -0
  166. package/dist/core/movementProfile.d.ts.map +1 -0
  167. package/dist/core/movementProfile.js +150 -0
  168. package/dist/core/movementProfile.js.map +1 -0
  169. package/dist/core/shell.d.ts +23 -7
  170. package/dist/core/shell.d.ts.map +1 -1
  171. package/dist/core/shell.js +32 -14
  172. package/dist/core/shell.js.map +1 -1
  173. package/dist/errors.d.ts +35 -0
  174. package/dist/errors.d.ts.map +1 -1
  175. package/dist/errors.js +54 -0
  176. package/dist/errors.js.map +1 -1
  177. package/dist/fork/__tests__/manager.test.d.ts +2 -0
  178. package/dist/fork/__tests__/manager.test.d.ts.map +1 -0
  179. package/dist/fork/__tests__/manager.test.js +309 -0
  180. package/dist/fork/__tests__/manager.test.js.map +1 -0
  181. package/dist/fork/__tests__/server.test.d.ts +2 -0
  182. package/dist/fork/__tests__/server.test.d.ts.map +1 -0
  183. package/dist/fork/__tests__/server.test.js +54 -0
  184. package/dist/fork/__tests__/server.test.js.map +1 -0
  185. package/dist/fork/__tests__/storage.test.d.ts +2 -0
  186. package/dist/fork/__tests__/storage.test.d.ts.map +1 -0
  187. package/dist/fork/__tests__/storage.test.js +222 -0
  188. package/dist/fork/__tests__/storage.test.js.map +1 -0
  189. package/dist/fork/__tests__/test.test.d.ts +2 -0
  190. package/dist/fork/__tests__/test.test.d.ts.map +1 -0
  191. package/dist/fork/__tests__/test.test.js +81 -0
  192. package/dist/fork/__tests__/test.test.js.map +1 -0
  193. package/dist/fork/api.d.ts +14 -3
  194. package/dist/fork/api.d.ts.map +1 -1
  195. package/dist/fork/api.js +25 -14
  196. package/dist/fork/api.js.map +1 -1
  197. package/dist/fork/manager.d.ts +23 -29
  198. package/dist/fork/manager.d.ts.map +1 -1
  199. package/dist/fork/manager.js +79 -76
  200. package/dist/fork/manager.js.map +1 -1
  201. package/dist/fork/server.d.ts +11 -3
  202. package/dist/fork/server.d.ts.map +1 -1
  203. package/dist/fork/server.js +45 -13
  204. package/dist/fork/server.js.map +1 -1
  205. package/dist/fork/storage.d.ts +4 -4
  206. package/dist/fork/storage.d.ts.map +1 -1
  207. package/dist/fork/storage.js +7 -9
  208. package/dist/fork/storage.js.map +1 -1
  209. package/dist/fork/test.d.ts +12 -4
  210. package/dist/fork/test.d.ts.map +1 -1
  211. package/dist/fork/test.js +36 -27
  212. package/dist/fork/test.js.map +1 -1
  213. package/dist/harness/Harness.d.ts +118 -0
  214. package/dist/harness/Harness.d.ts.map +1 -0
  215. package/dist/harness/Harness.js +187 -0
  216. package/dist/harness/Harness.js.map +1 -0
  217. package/dist/harness/codeObject.d.ts +31 -0
  218. package/dist/harness/codeObject.d.ts.map +1 -0
  219. package/dist/harness/codeObject.js +267 -0
  220. package/dist/harness/codeObject.js.map +1 -0
  221. package/dist/harness/errors.d.ts +14 -0
  222. package/dist/harness/errors.d.ts.map +1 -0
  223. package/dist/harness/errors.js +22 -0
  224. package/dist/harness/errors.js.map +1 -0
  225. package/dist/harness/index.d.ts +4 -0
  226. package/dist/harness/index.d.ts.map +1 -0
  227. package/dist/harness/index.js +3 -0
  228. package/dist/harness/index.js.map +1 -0
  229. package/dist/harness/proxy.d.ts +7 -0
  230. package/dist/harness/proxy.d.ts.map +1 -0
  231. package/dist/harness/proxy.js +36 -0
  232. package/dist/harness/proxy.js.map +1 -0
  233. package/dist/harness/script.d.ts +21 -0
  234. package/dist/harness/script.d.ts.map +1 -0
  235. package/dist/harness/script.js +155 -0
  236. package/dist/harness/script.js.map +1 -0
  237. package/dist/harness/view.d.ts +22 -0
  238. package/dist/harness/view.d.ts.map +1 -0
  239. package/dist/harness/view.js +28 -0
  240. package/dist/harness/view.js.map +1 -0
  241. package/dist/helpers/__tests__/semver-utils.test.d.ts +2 -0
  242. package/dist/helpers/__tests__/semver-utils.test.d.ts.map +1 -0
  243. package/dist/helpers/__tests__/semver-utils.test.js +103 -0
  244. package/dist/helpers/__tests__/semver-utils.test.js.map +1 -0
  245. package/dist/helpers/index.d.ts +3 -2
  246. package/dist/helpers/index.d.ts.map +1 -1
  247. package/dist/helpers/index.js +2 -2
  248. package/dist/helpers/index.js.map +1 -1
  249. package/dist/helpers/move-tests.d.ts +3 -3
  250. package/dist/helpers/move-tests.d.ts.map +1 -1
  251. package/dist/helpers/move-tests.js +21 -20
  252. package/dist/helpers/move-tests.js.map +1 -1
  253. package/dist/helpers/npm-registry.d.ts.map +1 -1
  254. package/dist/helpers/npm-registry.js +1 -3
  255. package/dist/helpers/npm-registry.js.map +1 -1
  256. package/dist/helpers/semver-utils.d.ts.map +1 -1
  257. package/dist/helpers/semver-utils.js +4 -3
  258. package/dist/helpers/semver-utils.js.map +1 -1
  259. package/dist/helpers/setup.d.ts.map +1 -1
  260. package/dist/helpers/setup.js +6 -4
  261. package/dist/helpers/setup.js.map +1 -1
  262. package/dist/helpers/setupLocalTesting.d.ts +31 -27
  263. package/dist/helpers/setupLocalTesting.d.ts.map +1 -1
  264. package/dist/helpers/setupLocalTesting.js +179 -180
  265. package/dist/helpers/setupLocalTesting.js.map +1 -1
  266. package/dist/helpers/testFixtures.d.ts +19 -53
  267. package/dist/helpers/testFixtures.d.ts.map +1 -1
  268. package/dist/helpers/testFixtures.js +89 -107
  269. package/dist/helpers/testFixtures.js.map +1 -1
  270. package/dist/index.d.ts +4 -2
  271. package/dist/index.d.ts.map +1 -1
  272. package/dist/index.js +6 -3
  273. package/dist/index.js.map +1 -1
  274. package/dist/node/LocalNodeManager.d.ts +9 -1
  275. package/dist/node/LocalNodeManager.d.ts.map +1 -1
  276. package/dist/node/LocalNodeManager.js +75 -58
  277. package/dist/node/LocalNodeManager.js.map +1 -1
  278. package/dist/node/__tests__/LocalNodeManager.test.d.ts +2 -0
  279. package/dist/node/__tests__/LocalNodeManager.test.d.ts.map +1 -0
  280. package/dist/node/__tests__/LocalNodeManager.test.js +349 -0
  281. package/dist/node/__tests__/LocalNodeManager.test.js.map +1 -0
  282. package/dist/runtime.d.ts +12 -15
  283. package/dist/runtime.d.ts.map +1 -1
  284. package/dist/runtime.js +26 -239
  285. package/dist/runtime.js.map +1 -1
  286. package/dist/templates/README.md +1 -1
  287. package/dist/templates/movehat.config.ts +10 -0
  288. package/dist/templates/package.json +2 -1
  289. package/dist/templates/scripts/deploy-counter.ts +46 -38
  290. package/dist/templates/tests/Counter.test.ts +39 -51
  291. package/dist/templates/types/movehat.d.ts +6 -9
  292. package/dist/types/config.d.ts +8 -0
  293. package/dist/types/config.d.ts.map +1 -1
  294. package/dist/types/fork.d.ts +7 -1
  295. package/dist/types/fork.d.ts.map +1 -1
  296. package/dist/types/harness.d.ts +166 -0
  297. package/dist/types/harness.d.ts.map +1 -0
  298. package/dist/types/harness.js +2 -0
  299. package/dist/types/harness.js.map +1 -0
  300. package/dist/types/runtime.d.ts +7 -1
  301. package/dist/types/runtime.d.ts.map +1 -1
  302. package/dist/ui/__tests__/colors.test.d.ts +2 -0
  303. package/dist/ui/__tests__/colors.test.d.ts.map +1 -0
  304. package/dist/ui/__tests__/colors.test.js +127 -0
  305. package/dist/ui/__tests__/colors.test.js.map +1 -0
  306. package/dist/ui/colors.d.ts.map +1 -1
  307. package/dist/ui/colors.js +6 -2
  308. package/dist/ui/colors.js.map +1 -1
  309. package/dist/ui/logger.d.ts +17 -0
  310. package/dist/ui/logger.d.ts.map +1 -1
  311. package/dist/ui/logger.js +22 -0
  312. package/dist/ui/logger.js.map +1 -1
  313. package/dist/ui/symbols.d.ts +1 -0
  314. package/dist/ui/symbols.d.ts.map +1 -1
  315. package/dist/ui/symbols.js +7 -1
  316. package/dist/ui/symbols.js.map +1 -1
  317. package/dist/utils/__tests__/address.test.d.ts +2 -0
  318. package/dist/utils/__tests__/address.test.d.ts.map +1 -0
  319. package/dist/utils/__tests__/address.test.js +70 -0
  320. package/dist/utils/__tests__/address.test.js.map +1 -0
  321. package/dist/utils/__tests__/childProcessAdapter.test.d.ts +2 -0
  322. package/dist/utils/__tests__/childProcessAdapter.test.d.ts.map +1 -0
  323. package/dist/utils/__tests__/childProcessAdapter.test.js +217 -0
  324. package/dist/utils/__tests__/childProcessAdapter.test.js.map +1 -0
  325. package/dist/utils/__tests__/runCli.test.d.ts +2 -0
  326. package/dist/utils/__tests__/runCli.test.d.ts.map +1 -0
  327. package/dist/utils/__tests__/runCli.test.js +187 -0
  328. package/dist/utils/__tests__/runCli.test.js.map +1 -0
  329. package/dist/utils/address.d.ts +29 -0
  330. package/dist/utils/address.d.ts.map +1 -0
  331. package/dist/utils/address.js +48 -0
  332. package/dist/utils/address.js.map +1 -0
  333. package/dist/utils/childProcessAdapter.d.ts +93 -0
  334. package/dist/utils/childProcessAdapter.d.ts.map +1 -0
  335. package/dist/utils/childProcessAdapter.js +108 -0
  336. package/dist/utils/childProcessAdapter.js.map +1 -0
  337. package/dist/utils/parseCliOutput.d.ts +20 -0
  338. package/dist/utils/parseCliOutput.d.ts.map +1 -0
  339. package/dist/utils/parseCliOutput.js +26 -0
  340. package/dist/utils/parseCliOutput.js.map +1 -0
  341. package/dist/utils/redact.d.ts +15 -0
  342. package/dist/utils/redact.d.ts.map +1 -0
  343. package/dist/utils/redact.js +24 -0
  344. package/dist/utils/redact.js.map +1 -0
  345. package/dist/utils/runCli.d.ts +24 -0
  346. package/dist/utils/runCli.d.ts.map +1 -0
  347. package/dist/utils/runCli.js +37 -0
  348. package/dist/utils/runCli.js.map +1 -0
  349. package/package.json +15 -4
  350. package/src/__tests__/deployContract.test.ts +429 -0
  351. package/src/__tests__/errors.test.ts +84 -0
  352. package/src/__tests__/fixtures/sigint-deploy-harness.ts +95 -0
  353. package/src/__tests__/fork/api.test.ts +143 -0
  354. package/src/__tests__/harness/Harness.createLive.test.ts +57 -0
  355. package/src/__tests__/harness/Harness.proxy.test.ts +111 -0
  356. package/src/__tests__/harness/_fixture.ts +131 -0
  357. package/src/__tests__/harness/codeObject.deploy.test.ts +319 -0
  358. package/src/__tests__/harness/codeObject.upgrade.test.ts +156 -0
  359. package/src/__tests__/harness/script.test.ts +245 -0
  360. package/src/__tests__/harness/view.test.ts +104 -0
  361. package/src/__tests__/runtime.test.ts +182 -0
  362. package/src/cli.ts +2 -1
  363. package/src/commands/__tests__/compile.test.ts +407 -0
  364. package/src/commands/__tests__/init.test.ts +125 -0
  365. package/src/commands/__tests__/run.test.ts +192 -0
  366. package/src/commands/__tests__/test-move.test.ts +81 -0
  367. package/src/commands/__tests__/test.test.ts +204 -0
  368. package/src/commands/__tests__/update.test.ts +223 -0
  369. package/src/commands/compile.ts +168 -32
  370. package/src/commands/fork/__tests__/create.test.ts +132 -0
  371. package/src/commands/fork/__tests__/fund.test.ts +104 -0
  372. package/src/commands/fork/__tests__/list.test.ts +139 -0
  373. package/src/commands/fork/__tests__/serve.test.ts +121 -0
  374. package/src/commands/fork/__tests__/view-resource.test.ts +101 -0
  375. package/src/commands/fork/create.ts +4 -3
  376. package/src/commands/fork/fund.ts +16 -9
  377. package/src/commands/fork/list.ts +3 -2
  378. package/src/commands/fork/serve.ts +6 -3
  379. package/src/commands/fork/view-resource.ts +11 -6
  380. package/src/commands/run.ts +54 -28
  381. package/src/commands/test-move.ts +4 -3
  382. package/src/commands/test.ts +56 -44
  383. package/src/commands/update.ts +19 -16
  384. package/src/core/AccountManager.ts +23 -22
  385. package/src/core/Publisher.ts +314 -0
  386. package/src/core/__tests__/AccountManager.test.ts +290 -0
  387. package/src/core/__tests__/config.test.ts +377 -0
  388. package/src/core/__tests__/deployments.test.ts +247 -0
  389. package/src/core/__tests__/shell.test.ts +138 -0
  390. package/src/core/config.ts +96 -12
  391. package/src/core/contract.ts +13 -7
  392. package/src/core/deployments.ts +13 -23
  393. package/src/core/movementProfile.ts +179 -0
  394. package/src/core/shell.ts +34 -14
  395. package/src/errors.ts +60 -0
  396. package/src/fork/__tests__/manager.test.ts +385 -0
  397. package/src/fork/__tests__/server.test.ts +65 -0
  398. package/src/fork/__tests__/storage.test.ts +281 -0
  399. package/src/fork/__tests__/test.test.ts +97 -0
  400. package/src/fork/api.ts +28 -14
  401. package/src/fork/manager.ts +88 -83
  402. package/src/fork/server.ts +53 -19
  403. package/src/fork/storage.ts +12 -15
  404. package/src/fork/test.ts +57 -32
  405. package/src/harness/Harness.ts +222 -0
  406. package/src/harness/codeObject.ts +384 -0
  407. package/src/harness/errors.ts +22 -0
  408. package/src/harness/index.ts +3 -0
  409. package/src/harness/proxy.ts +40 -0
  410. package/src/harness/script.ts +196 -0
  411. package/src/harness/view.ts +34 -0
  412. package/src/helpers/__tests__/semver-utils.test.ts +121 -0
  413. package/src/helpers/index.ts +2 -8
  414. package/src/helpers/move-tests.ts +27 -23
  415. package/src/helpers/npm-registry.ts +4 -3
  416. package/src/helpers/semver-utils.ts +4 -3
  417. package/src/helpers/setup.ts +6 -4
  418. package/src/helpers/setupLocalTesting.ts +218 -200
  419. package/src/helpers/testFixtures.ts +106 -118
  420. package/src/index.ts +8 -3
  421. package/src/node/LocalNodeManager.ts +87 -62
  422. package/src/node/__tests__/LocalNodeManager.test.ts +452 -0
  423. package/src/runtime.ts +28 -288
  424. package/src/templates/README.md +1 -1
  425. package/src/templates/movehat.config.ts +10 -0
  426. package/src/templates/package.json +2 -1
  427. package/src/templates/scripts/deploy-counter.ts +46 -38
  428. package/src/templates/tests/Counter.test.ts +39 -51
  429. package/src/templates/types/movehat.d.ts +6 -9
  430. package/src/types/config.ts +8 -0
  431. package/src/types/fork.ts +7 -1
  432. package/src/types/harness.ts +182 -0
  433. package/src/types/runtime.ts +11 -3
  434. package/src/ui/__tests__/colors.test.ts +156 -0
  435. package/src/ui/colors.ts +5 -2
  436. package/src/ui/logger.ts +22 -0
  437. package/src/ui/symbols.ts +7 -1
  438. package/src/utils/__tests__/address.test.ts +93 -0
  439. package/src/utils/__tests__/childProcessAdapter.test.ts +266 -0
  440. package/src/utils/__tests__/runCli.test.ts +240 -0
  441. package/src/utils/address.ts +52 -0
  442. package/src/utils/childProcessAdapter.ts +214 -0
  443. package/src/utils/parseCliOutput.ts +27 -0
  444. package/src/utils/redact.ts +24 -0
  445. package/src/utils/runCli.ts +64 -0
@@ -1,4 +1,3 @@
1
- import { spawn } from "child_process";
2
1
  import { readFileSync, existsSync } from "fs";
3
2
  import { join, dirname, resolve } from "path";
4
3
  import { fileURLToPath } from "url";
@@ -7,6 +6,7 @@ import prompts from "prompts";
7
6
  import { isNewerVersion } from "../helpers/semver-utils.js";
8
7
  import { fetchLatestVersion } from "../helpers/npm-registry.js";
9
8
  import { logger, withSpinner, box, colors } from "../ui/index.js";
9
+ import { runCli } from "../utils/runCli.js";
10
10
 
11
11
  const __filename = fileURLToPath(import.meta.url);
12
12
  const __dirname = dirname(__filename);
@@ -159,35 +159,38 @@ export default async function updateCommand() {
159
159
  break;
160
160
  }
161
161
 
162
- // Execute update
163
- // Use home directory as cwd to avoid packageManager conflicts from local package.json
164
- const child = spawn(packageManager, updateArgs, {
165
- stdio: "inherit",
166
- cwd: homedir() || process.cwd(),
167
- });
168
-
169
- child.on("exit", (code) => {
170
- if (code === 0) {
162
+ // Execute update.
163
+ // Use home directory as cwd to avoid packageManager conflicts from local package.json.
164
+ try {
165
+ const result = await runCli(
166
+ {
167
+ command: packageManager,
168
+ args: updateArgs,
169
+ cwd: homedir() || process.cwd(),
170
+ inheritStdio: true,
171
+ },
172
+ { throwOnNonZeroExit: false }
173
+ );
174
+
175
+ if (result.exitCode === 0) {
171
176
  logger.newline();
172
177
  logger.success(`Successfully updated to version ${latestVersion}!`);
173
178
  logger.newline();
174
179
  process.exit(0);
175
180
  } else {
176
181
  logger.newline();
177
- logger.error('Update failed');
182
+ logger.error("Update failed");
178
183
  logger.plain(` Try manually: ${packageManager} ${updateArgs.join(" ")}`);
179
184
  logger.newline();
180
185
  process.exit(1);
181
186
  }
182
- });
183
-
184
- child.on("error", (error) => {
187
+ } catch (error) {
185
188
  logger.newline();
186
- logger.error(`Failed to update: ${error.message}`);
189
+ logger.error(`Failed to update: ${(error as Error).message}`);
187
190
  logger.plain(` Try manually: ${packageManager} ${updateArgs.join(" ")}`);
188
191
  logger.newline();
189
192
  process.exit(1);
190
- });
193
+ }
191
194
  } catch (error) {
192
195
  const message = error instanceof Error ? error.message : String(error);
193
196
  logger.newline();
@@ -2,23 +2,17 @@ import {
2
2
  Account,
3
3
  Ed25519PrivateKey,
4
4
  } from "@aptos-labs/ts-sdk";
5
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
5
+ import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
6
6
  import { join } from "path";
7
7
  import { MovehatConfig } from "../types/config.js";
8
8
 
9
- /**
10
- * Represents a stored account in the pool
11
- */
12
9
  export interface StoredAccount {
13
- label?: string;
10
+ label?: string | undefined;
14
11
  privateKey: string;
15
12
  address: string;
16
13
  createdAt: number;
17
14
  }
18
15
 
19
- /**
20
- * Account pool storage structure
21
- */
22
16
  interface AccountPool {
23
17
  accounts: StoredAccount[];
24
18
  labelMap: Record<string, string>; // label → address
@@ -49,7 +43,6 @@ export class AccountManager {
49
43
  * const randomAccount = AccountManager.getTestAccount();
50
44
  */
51
45
  static getTestAccount(label?: string): Account {
52
- // If label provided, try to get existing labeled account
53
46
  if (label) {
54
47
  const existingAccount = this.getAccountByLabel(label);
55
48
  if (existingAccount) {
@@ -57,7 +50,6 @@ export class AccountManager {
57
50
  }
58
51
  }
59
52
 
60
- // Create new account with optional label
61
53
  return this.createAccount(label, false);
62
54
  }
63
55
 
@@ -76,13 +68,9 @@ export class AccountManager {
76
68
  const account = Account.generate();
77
69
  const address = account.accountAddress.toString();
78
70
 
79
- // Add to pool
80
71
  this.pool.set(address, account);
81
-
82
- // Store private key
83
72
  this.privateKeys.set(address, account.privateKey.toString());
84
73
 
85
- // If label provided, add to label map
86
74
  if (label) {
87
75
  this.labelMap.set(label, address);
88
76
  }
@@ -173,9 +161,10 @@ export class AccountManager {
173
161
  try {
174
162
  const account = this.loadAccountFromPrivateKey(privateKeyHex);
175
163
  accounts.push(account);
176
- } catch (error: any) {
164
+ } catch (error) {
165
+ const msg = error instanceof Error ? error.message : String(error);
177
166
  console.warn(
178
- `Warning: Failed to load account from config: ${error.message}`
167
+ `Warning: Failed to load account from config: ${msg}`
179
168
  );
180
169
  }
181
170
  }
@@ -216,10 +205,14 @@ export class AccountManager {
216
205
  static saveAccountPool(poolPath?: string): void {
217
206
  const basePath = poolPath || this.defaultPoolPath;
218
207
 
219
- // Ensure directory exists
208
+ // Ensure directory exists with restrictive perms (the pool file holds
209
+ // plaintext private keys, so the directory must not be world-readable).
210
+ // Note: mkdirSync's mode is masked by the process umask, so we chmod
211
+ // explicitly afterwards to guarantee 0o700 regardless of umask.
220
212
  if (!existsSync(basePath)) {
221
- mkdirSync(basePath, { recursive: true });
213
+ mkdirSync(basePath, { recursive: true, mode: 0o700 });
222
214
  }
215
+ chmodSync(basePath, 0o700);
223
216
 
224
217
  // Build stored accounts array
225
218
  const storedAccounts: StoredAccount[] = [];
@@ -255,9 +248,16 @@ export class AccountManager {
255
248
  labelMap: labelMapObject,
256
249
  };
257
250
 
258
- // Write to file
251
+ // Write to file with owner-only permissions — file contains plaintext
252
+ // private keys for test accounts. writeFileSync's mode is masked by
253
+ // the process umask, so we chmod explicitly afterwards to guarantee
254
+ // 0o600 regardless of umask.
259
255
  const poolFilePath = join(basePath, "test-pool.json");
260
- writeFileSync(poolFilePath, JSON.stringify(poolData, null, 2), "utf-8");
256
+ writeFileSync(poolFilePath, JSON.stringify(poolData, null, 2), {
257
+ encoding: "utf-8",
258
+ mode: 0o600,
259
+ });
260
+ chmodSync(poolFilePath, 0o600);
261
261
  }
262
262
 
263
263
  /**
@@ -311,9 +311,10 @@ export class AccountManager {
311
311
 
312
312
  this.poolLoaded = true;
313
313
  return true;
314
- } catch (error: any) {
314
+ } catch (error) {
315
+ const msg = error instanceof Error ? error.message : String(error);
315
316
  console.warn(
316
- `Warning: Failed to load account pool: ${error.message}`
317
+ `Warning: Failed to load account pool: ${msg}`
317
318
  );
318
319
  return false;
319
320
  }
@@ -0,0 +1,314 @@
1
+ import { homedir } from "os";
2
+ import { join } from "path";
3
+ import { randomUUID } from "crypto";
4
+ import { Account } from "@aptos-labs/ts-sdk";
5
+ import { MovehatConfig } from "../types/config.js";
6
+ import { extractNamedAddresses } from "../commands/compile.js";
7
+ import {
8
+ saveDeployment,
9
+ loadDeployment,
10
+ DeploymentInfo,
11
+ validateSafeName,
12
+ } from "./deployments.js";
13
+ import { validatePathSafety, validateProfileSafety } from "./shell.js";
14
+ import { CliExecutionError, ModuleAlreadyDeployedError, PostPublishError } from "../errors.js";
15
+ import { runCli } from "../utils/runCli.js";
16
+ import { logger } from "../ui/index.js";
17
+ import type { ChildProcessAdapter } from "../utils/childProcessAdapter.js";
18
+ import {
19
+ withYamlLock,
20
+ addProfile,
21
+ removeProfile,
22
+ removeProfileSync,
23
+ ensureSignalHandler,
24
+ cleanupCallbacks,
25
+ } from "./movementProfile.js";
26
+ import { parseTxHash } from "../utils/parseCliOutput.js";
27
+
28
+ /** @internal */
29
+ export interface PublisherDeps {
30
+ adapter?: ChildProcessAdapter | undefined;
31
+ }
32
+
33
+ /** @internal */
34
+ export interface PublishInput {
35
+ moduleName: string;
36
+ config: MovehatConfig;
37
+ account: Account;
38
+ packageDir?: string | undefined;
39
+ }
40
+
41
+ /**
42
+ * Publishes a Move module via the Movement CLI.
43
+ *
44
+ * @internal
45
+ */
46
+ export class Publisher {
47
+ constructor(private readonly deps: PublisherDeps = {}) {}
48
+
49
+ async deploy(input: PublishInput): Promise<DeploymentInfo> {
50
+ const { moduleName, config, account } = input;
51
+
52
+ validateSafeName(moduleName, "module");
53
+
54
+ const forceRedeploy = process.env.MH_CLI_REDEPLOY === "true";
55
+
56
+ const existingDeployment = loadDeployment(config.network, moduleName);
57
+ if (existingDeployment && !forceRedeploy) {
58
+ // Build detailed error message with all deployment info
59
+ const errorDetails = [
60
+ `Module "${moduleName}" is already deployed on ${config.network}`,
61
+ `Address: ${existingDeployment.address}`,
62
+ `Deployed at: ${new Date(existingDeployment.timestamp).toLocaleString()}`,
63
+ existingDeployment.txHash ? `Transaction: ${existingDeployment.txHash}` : null,
64
+ `\nTo redeploy, run with the --redeploy flag:`,
65
+ `movehat run <script> --network ${config.network} --redeploy`,
66
+ ]
67
+ .filter(Boolean)
68
+ .join("\n");
69
+
70
+ // Log formatted error message for user
71
+ logger.error(`Module "${moduleName}" is already deployed on ${config.network}`);
72
+ logger.plain(` Address: ${existingDeployment.address}`);
73
+ logger.plain(
74
+ ` Deployed at: ${new Date(existingDeployment.timestamp).toLocaleString()}`
75
+ );
76
+ if (existingDeployment.txHash) {
77
+ logger.plain(` Transaction: ${existingDeployment.txHash}`);
78
+ }
79
+ logger.newline();
80
+ logger.info("To redeploy, run with the --redeploy flag:");
81
+ logger.plain(` movehat run <script> --network ${config.network} --redeploy`);
82
+ logger.newline();
83
+
84
+ // Throw custom error with complete context for programmatic handling
85
+ throw new ModuleAlreadyDeployedError(
86
+ errorDetails,
87
+ moduleName,
88
+ config.network,
89
+ existingDeployment.address,
90
+ existingDeployment.timestamp,
91
+ existingDeployment.txHash
92
+ );
93
+ }
94
+
95
+ if (forceRedeploy && existingDeployment) {
96
+ logger.info(`Redeploying module "${moduleName}" on ${config.network}...`);
97
+ }
98
+
99
+ const dir = input.packageDir || config.moveDir;
100
+
101
+ // Bug #37: use a UUID-suffixed profile name per deploy so concurrent
102
+ // Publisher.deploy() calls in the same process don't fight over the
103
+ // same key in ~/.aptos/config.yaml. The previous code reused
104
+ // config.profile (default "default"), which meant two parallel
105
+ // deploys would clobber each other's profile data mid-publish.
106
+ const profile = `movehat-deploy-${randomUUID().slice(0, 8)}`;
107
+
108
+ // Validate (no shell escape — runCli uses spawn, which takes args
109
+ // verbatim and would treat the single-quote wrapping as part of the
110
+ // literal path/profile, breaking Movement CLI argument parsing).
111
+ const safeDir = validatePathSafety(dir, "package directory");
112
+ const safeProfile = validateProfileSafety(profile);
113
+
114
+ logger.step(`Publishing module "${moduleName}" from ${dir}...`);
115
+
116
+ try {
117
+ // Get the deployer address to use for named addresses
118
+ const deployerAddress = account.accountAddress.toString();
119
+
120
+ // Detect named addresses from Move files
121
+ const detectedAddresses = extractNamedAddresses(dir);
122
+
123
+ // Build named addresses argument - use deployer address for all detected addresses.
124
+ // Stored as a pre-split args fragment so the spawn path never has to parse
125
+ // shell tokens; an empty fragment becomes a no-op via spread.
126
+ const namedAddrArgs: string[] =
127
+ detectedAddresses.size > 0
128
+ ? [
129
+ "--named-addresses",
130
+ Array.from(detectedAddresses)
131
+ .map((name) => `${name}=${deployerAddress}`)
132
+ .join(","),
133
+ ]
134
+ : [];
135
+
136
+ // Build first with named addresses
137
+ logger.step("Building package...");
138
+ const buildResult = await runCli(
139
+ {
140
+ command: "movement",
141
+ args: ["move", "build", "--package-dir", safeDir, ...namedAddrArgs],
142
+ timeoutMs: 120000, // 2 minutes for git dependency downloads
143
+ },
144
+ { adapter: this.deps.adapter }
145
+ );
146
+ if (buildResult.stdout) console.log(buildResult.stdout.trim());
147
+
148
+ // Publish using direct parameters (avoid config file issues)
149
+ logger.step("Publishing to blockchain...");
150
+
151
+ // Use parameters directly instead of relying on config file
152
+ // Strip any ed25519-priv- prefix if present
153
+ let cleanPrivateKey = config.privateKey;
154
+ if (cleanPrivateKey.startsWith("ed25519-priv-")) {
155
+ cleanPrivateKey = cleanPrivateKey.replace("ed25519-priv-", "");
156
+ }
157
+
158
+ // Bug #38: Move.toml is NOT mutated. All address overrides flow
159
+ // through the `--named-addresses` flag above, which Movement CLI
160
+ // applies during build + publish. The previous regex rewrite +
161
+ // restore-in-finally was destructive: if the process died between
162
+ // write and restore, the user's Move.toml stayed mutated.
163
+
164
+ let publishOut = "";
165
+ let publishErr = "";
166
+
167
+ // Setup Movement CLI config with private key securely.
168
+ // Movement CLI uses .aptos config directory (not .movement).
169
+ const movementConfigPath = join(homedir(), ".aptos", "config.yaml");
170
+
171
+ // Register a sync cleanup hook BEFORE writing the private key.
172
+ // If the user Ctrl+C's (or the process is SIGTERM'd) between the
173
+ // yaml write and our async finally, the SIGINT handler iterates
174
+ // every registered callback and removes this deploy's profile
175
+ // synchronously — closes bug #36 (private key persisting on disk
176
+ // after abnormal exit).
177
+ ensureSignalHandler();
178
+ const syncCleanup = () => removeProfileSync(movementConfigPath, profile);
179
+ cleanupCallbacks.add(syncCleanup);
180
+
181
+ // Add our deploy profile under the unique key. The mutex serializes
182
+ // read-modify-write cycles so concurrent deploys in the same process
183
+ // can't drop each other's profiles. Other user profiles in the same
184
+ // file are preserved untouched.
185
+ await withYamlLock(() =>
186
+ addProfile(movementConfigPath, profile, {
187
+ private_key: cleanPrivateKey,
188
+ public_key: account.publicKey.toString(),
189
+ account: deployerAddress,
190
+ rest_url: config.rpc,
191
+ })
192
+ );
193
+
194
+ try {
195
+ // Execute publish command without exposing private key in CLI.
196
+ // Routed through runCli so stdout/stderr are redacted of any
197
+ // `ed25519-priv-…` shape before reaching console.log/console.error
198
+ // or the thrown CliExecutionError — that's bug #43.
199
+ const publishResult = await runCli(
200
+ {
201
+ command: "movement",
202
+ args: [
203
+ "move",
204
+ "publish",
205
+ "--package-dir",
206
+ safeDir,
207
+ "--url",
208
+ config.rpc,
209
+ "--profile",
210
+ safeProfile,
211
+ "--assume-yes",
212
+ ...namedAddrArgs,
213
+ ],
214
+ timeoutMs: 120000, // 2 minutes for blockchain transactions
215
+ },
216
+ { adapter: this.deps.adapter }
217
+ );
218
+ publishOut = publishResult.stdout;
219
+ publishErr = publishResult.stderr;
220
+ if (publishOut) console.log(publishOut.trim());
221
+ if (publishErr) console.error(publishErr.trim());
222
+ } finally {
223
+ // Always remove our profile from the shared yaml — never restore
224
+ // a "snapshot" of the whole file (that's what the old code did,
225
+ // and that's the bug #37 race). Removing only our key leaves
226
+ // other concurrent deploys' profiles intact.
227
+ //
228
+ // CRITICAL: catch + log instead of throwing. `await` in a finally
229
+ // block that throws will clobber both the try block's successful
230
+ // return value AND any error already propagating. Without this
231
+ // catch, a yaml-write failure here would mask a successful
232
+ // publish (making the deploy look failed and inviting a redeploy)
233
+ // or mask the real publish error.
234
+ await withYamlLock(() => removeProfile(movementConfigPath, profile)).catch((err) => {
235
+ const cleanupMsg = err instanceof Error ? err.message : String(err);
236
+ logger.warning(
237
+ `Failed to remove deploy profile "${profile}" from ${movementConfigPath}: ${cleanupMsg}. ` +
238
+ `Run 'movement config delete-profile --profile ${profile}' to clean up manually.`
239
+ );
240
+ });
241
+ // Unregister the sync cleanup hook — normal path. (The signal
242
+ // handler stays installed for the process lifetime; cheap.)
243
+ cleanupCallbacks.delete(syncCleanup);
244
+ }
245
+
246
+ // Extract transaction hash from output via the shared helper
247
+ // (`utils/parseCliOutput.ts`). Same regex pair as before; lifted
248
+ // for reuse by harness/codeObject.ts and harness/script.ts.
249
+ const txHash = parseTxHash(publishOut);
250
+
251
+ logger.success("Module published successfully!");
252
+
253
+ // ←← "Publish succeeded" boundary. Anything thrown below this
254
+ // point did NOT cause the publish to fail — the module is on
255
+ // chain. We surface those failures as PostPublishError so callers
256
+ // can distinguish a genuine publish failure from a local
257
+ // bookkeeping failure (and avoid a wasteful redeploy).
258
+
259
+ const deployment: DeploymentInfo = {
260
+ address: account.accountAddress.toString(),
261
+ moduleName,
262
+ network: config.network,
263
+ deployer: account.accountAddress.toString(),
264
+ timestamp: Date.now(),
265
+ txHash,
266
+ };
267
+
268
+ try {
269
+ saveDeployment(deployment);
270
+ } catch (error) {
271
+ const err = error instanceof Error ? error : new Error(String(error));
272
+ throw new PostPublishError(
273
+ `Module "${moduleName}" published to ${deployment.address} ` +
274
+ `but local deployment record could not be written: ${err.message}`,
275
+ deployment,
276
+ err
277
+ );
278
+ }
279
+
280
+ return deployment;
281
+ } catch (error) {
282
+ if (error instanceof PostPublishError) {
283
+ // Publish DID succeed; only local persistence failed. Log as
284
+ // warning (not error) so the user knows the deploy is real on
285
+ // chain. Re-throw so programmatic callers can react.
286
+ logger.warning(
287
+ `Module published successfully to ${error.deployment.address} ` +
288
+ `(tx=${error.deployment.txHash ?? "unknown"}) ` +
289
+ `but local deployment record could not be written.`
290
+ );
291
+ logger.warning(` Cause: ${error.cause.message}`);
292
+ logger.warning(
293
+ ` To recover, manually write the deployment to ` +
294
+ `deployments/${error.deployment.network}/${error.deployment.moduleName}.json.`
295
+ );
296
+ throw error;
297
+ }
298
+ if (error instanceof CliExecutionError) {
299
+ // stdout/stderr are already redacted by runCli before reaching here,
300
+ // so this branch is safe to log verbatim.
301
+ if (error.stdoutPreview) console.log(error.stdoutPreview);
302
+ logger.error(`Failed to publish module: ${error.message}\n${error.stderr}`);
303
+ } else {
304
+ // Preserve existing behaviour for non-CLI errors (filesystem write
305
+ // failures from Move.toml / ~/.aptos/config.yaml, yaml parse errors,
306
+ // etc.). These paths can't carry private-key material so logging raw
307
+ // is safe.
308
+ const err = error instanceof Error ? error : new Error(String(error));
309
+ logger.error(`Failed to publish module: ${err.message}`);
310
+ }
311
+ throw error;
312
+ }
313
+ }
314
+ }