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