@mesh-tech/mesh-cli 0.1.1 → 0.12.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 (504) hide show
  1. package/assets/intent/agents-fence.md +10 -0
  2. package/assets/intent/intent-claude-gate.mjs +255 -0
  3. package/assets/log-shipper.mjs +94 -0
  4. package/bin/mesh.mjs +80 -0
  5. package/dist/bin/mesh.d.ts +7 -9
  6. package/dist/bin/mesh.d.ts.map +1 -1
  7. package/dist/bin/mesh.js +20878 -37
  8. package/dist/bin/mesh.js.map +7 -1
  9. package/dist/build-info.json +4 -0
  10. package/dist/src/commands/agent-api-client.d.ts +79 -0
  11. package/dist/src/commands/agent-api-client.d.ts.map +1 -0
  12. package/dist/src/commands/agent-api-client.js +170 -0
  13. package/dist/src/commands/agent-api-client.js.map +1 -0
  14. package/dist/src/commands/artifacts.d.ts +13 -0
  15. package/dist/src/commands/artifacts.d.ts.map +1 -0
  16. package/dist/src/commands/artifacts.js +140 -0
  17. package/dist/src/commands/artifacts.js.map +1 -0
  18. package/dist/src/commands/cluster.d.ts +45 -0
  19. package/dist/src/commands/cluster.d.ts.map +1 -0
  20. package/dist/src/commands/cluster.js +259 -0
  21. package/dist/src/commands/cluster.js.map +1 -0
  22. package/dist/src/commands/conversations.d.ts +61 -0
  23. package/dist/src/commands/conversations.d.ts.map +1 -0
  24. package/dist/src/commands/conversations.js +239 -0
  25. package/dist/src/commands/conversations.js.map +1 -0
  26. package/dist/src/commands/create-app.d.ts +26 -3
  27. package/dist/src/commands/create-app.d.ts.map +1 -1
  28. package/dist/src/commands/create-app.js +465 -107
  29. package/dist/src/commands/create-app.js.map +1 -1
  30. package/dist/src/commands/deploy.d.ts +19 -0
  31. package/dist/src/commands/deploy.d.ts.map +1 -1
  32. package/dist/src/commands/deploy.js +83 -142
  33. package/dist/src/commands/deploy.js.map +1 -1
  34. package/dist/src/commands/dev-doctor.d.ts +137 -0
  35. package/dist/src/commands/dev-doctor.d.ts.map +1 -0
  36. package/dist/src/commands/dev-doctor.js +671 -0
  37. package/dist/src/commands/dev-doctor.js.map +1 -0
  38. package/dist/src/commands/dev-launch.d.ts +59 -0
  39. package/dist/src/commands/dev-launch.d.ts.map +1 -0
  40. package/dist/src/commands/dev-launch.js +118 -0
  41. package/dist/src/commands/dev-launch.js.map +1 -0
  42. package/dist/src/commands/dev-token-server.d.ts +32 -0
  43. package/dist/src/commands/dev-token-server.d.ts.map +1 -0
  44. package/dist/src/commands/dev-token-server.js +68 -0
  45. package/dist/src/commands/dev-token-server.js.map +1 -0
  46. package/dist/src/commands/dev.d.ts +289 -2
  47. package/dist/src/commands/dev.d.ts.map +1 -1
  48. package/dist/src/commands/dev.js +2501 -574
  49. package/dist/src/commands/dev.js.map +1 -1
  50. package/dist/src/commands/docs.d.ts +3 -0
  51. package/dist/src/commands/docs.d.ts.map +1 -0
  52. package/dist/src/commands/docs.js +262 -0
  53. package/dist/src/commands/docs.js.map +1 -0
  54. package/dist/src/commands/hub/index.d.ts +99 -0
  55. package/dist/src/commands/hub/index.d.ts.map +1 -0
  56. package/dist/src/commands/hub/index.js +452 -0
  57. package/dist/src/commands/hub/index.js.map +1 -0
  58. package/dist/src/commands/init.d.ts +65 -0
  59. package/dist/src/commands/init.d.ts.map +1 -0
  60. package/dist/src/commands/init.js +370 -0
  61. package/dist/src/commands/init.js.map +1 -0
  62. package/dist/src/commands/install-shim.d.ts +28 -0
  63. package/dist/src/commands/install-shim.d.ts.map +1 -0
  64. package/dist/src/commands/install-shim.js +191 -0
  65. package/dist/src/commands/install-shim.js.map +1 -0
  66. package/dist/src/commands/local/auth-provision.d.ts +71 -0
  67. package/dist/src/commands/local/auth-provision.d.ts.map +1 -0
  68. package/dist/src/commands/local/auth-provision.js +286 -0
  69. package/dist/src/commands/local/auth-provision.js.map +1 -0
  70. package/dist/src/commands/local/dev-local.d.ts +97 -0
  71. package/dist/src/commands/local/dev-local.d.ts.map +1 -0
  72. package/dist/src/commands/local/dev-local.js +306 -0
  73. package/dist/src/commands/local/dev-local.js.map +1 -0
  74. package/dist/src/commands/local/docker-runner.d.ts +37 -0
  75. package/dist/src/commands/local/docker-runner.d.ts.map +1 -0
  76. package/dist/src/commands/local/docker-runner.js +104 -0
  77. package/dist/src/commands/local/docker-runner.js.map +1 -0
  78. package/dist/src/commands/local/helpers.d.ts +22 -0
  79. package/dist/src/commands/local/helpers.d.ts.map +1 -0
  80. package/dist/src/commands/local/helpers.js +46 -0
  81. package/dist/src/commands/local/helpers.js.map +1 -0
  82. package/dist/src/commands/local/hub-local.d.ts +51 -0
  83. package/dist/src/commands/local/hub-local.d.ts.map +1 -0
  84. package/dist/src/commands/local/hub-local.js +197 -0
  85. package/dist/src/commands/local/hub-local.js.map +1 -0
  86. package/dist/src/commands/local/index.d.ts +23 -0
  87. package/dist/src/commands/local/index.d.ts.map +1 -0
  88. package/dist/src/commands/local/index.js +386 -0
  89. package/dist/src/commands/local/index.js.map +1 -0
  90. package/dist/src/commands/local/mocks.d.ts +361 -0
  91. package/dist/src/commands/local/mocks.d.ts.map +1 -0
  92. package/dist/src/commands/local/mocks.js +756 -0
  93. package/dist/src/commands/local/mocks.js.map +1 -0
  94. package/dist/src/commands/local/seed-zitadel.d.ts +151 -0
  95. package/dist/src/commands/local/seed-zitadel.d.ts.map +1 -0
  96. package/dist/src/commands/local/seed-zitadel.js +408 -0
  97. package/dist/src/commands/local/seed-zitadel.js.map +1 -0
  98. package/dist/src/commands/local/seed.d.ts +106 -0
  99. package/dist/src/commands/local/seed.d.ts.map +1 -0
  100. package/dist/src/commands/local/seed.js +252 -0
  101. package/dist/src/commands/local/seed.js.map +1 -0
  102. package/dist/src/commands/local/stack.d.ts +173 -0
  103. package/dist/src/commands/local/stack.d.ts.map +1 -0
  104. package/dist/src/commands/local/stack.js +499 -0
  105. package/dist/src/commands/local/stack.js.map +1 -0
  106. package/dist/src/commands/login.d.ts +256 -12
  107. package/dist/src/commands/login.d.ts.map +1 -1
  108. package/dist/src/commands/login.js +978 -50
  109. package/dist/src/commands/login.js.map +1 -1
  110. package/dist/src/commands/peer-addressing.d.ts +51 -0
  111. package/dist/src/commands/peer-addressing.d.ts.map +1 -0
  112. package/dist/src/commands/peer-addressing.js +64 -0
  113. package/dist/src/commands/peer-addressing.js.map +1 -0
  114. package/dist/src/commands/port-ownership.d.ts +69 -0
  115. package/dist/src/commands/port-ownership.d.ts.map +1 -0
  116. package/dist/src/commands/port-ownership.js +161 -0
  117. package/dist/src/commands/port-ownership.js.map +1 -0
  118. package/dist/src/commands/registry-publish.d.ts +3 -0
  119. package/dist/src/commands/registry-publish.d.ts.map +1 -0
  120. package/dist/src/commands/registry-publish.js +161 -0
  121. package/dist/src/commands/registry-publish.js.map +1 -0
  122. package/dist/src/commands/registry.d.ts +146 -2
  123. package/dist/src/commands/registry.d.ts.map +1 -1
  124. package/dist/src/commands/registry.js +541 -85
  125. package/dist/src/commands/registry.js.map +1 -1
  126. package/dist/src/commands/secrets/index.d.ts.map +1 -1
  127. package/dist/src/commands/secrets/index.js +15 -1
  128. package/dist/src/commands/secrets/index.js.map +1 -1
  129. package/dist/src/commands/secrets/migrate-config.d.ts +24 -0
  130. package/dist/src/commands/secrets/migrate-config.d.ts.map +1 -0
  131. package/dist/src/commands/secrets/migrate-config.js +277 -0
  132. package/dist/src/commands/secrets/migrate-config.js.map +1 -0
  133. package/dist/src/commands/secrets/set.d.ts +1 -0
  134. package/dist/src/commands/secrets/set.d.ts.map +1 -1
  135. package/dist/src/commands/secrets/set.js +96 -2
  136. package/dist/src/commands/secrets/set.js.map +1 -1
  137. package/dist/src/commands/skills.d.ts +34 -0
  138. package/dist/src/commands/skills.d.ts.map +1 -0
  139. package/dist/src/commands/skills.js +207 -0
  140. package/dist/src/commands/skills.js.map +1 -0
  141. package/dist/src/commands/stack.d.ts.map +1 -1
  142. package/dist/src/commands/stack.js +361 -23
  143. package/dist/src/commands/stack.js.map +1 -1
  144. package/dist/src/commands/temporal.d.ts +15 -0
  145. package/dist/src/commands/temporal.d.ts.map +1 -0
  146. package/dist/src/commands/temporal.js +781 -0
  147. package/dist/src/commands/temporal.js.map +1 -0
  148. package/dist/src/commands/tenant.d.ts +56 -0
  149. package/dist/src/commands/tenant.d.ts.map +1 -0
  150. package/dist/src/commands/tenant.js +233 -0
  151. package/dist/src/commands/tenant.js.map +1 -0
  152. package/dist/src/commands/tunnel/index.d.ts +49 -3
  153. package/dist/src/commands/tunnel/index.d.ts.map +1 -1
  154. package/dist/src/commands/tunnel/index.js +331 -8
  155. package/dist/src/commands/tunnel/index.js.map +1 -1
  156. package/dist/src/commands/vcs/clone.d.ts +3 -0
  157. package/dist/src/commands/vcs/clone.d.ts.map +1 -0
  158. package/dist/src/commands/vcs/clone.js +20 -0
  159. package/dist/src/commands/vcs/clone.js.map +1 -0
  160. package/dist/src/commands/vcs/common.d.ts +21 -0
  161. package/dist/src/commands/vcs/common.d.ts.map +1 -0
  162. package/dist/src/commands/vcs/common.js +62 -0
  163. package/dist/src/commands/vcs/common.js.map +1 -0
  164. package/dist/src/commands/vcs/drafts.d.ts +13 -0
  165. package/dist/src/commands/vcs/drafts.d.ts.map +1 -0
  166. package/dist/src/commands/vcs/drafts.js +45 -0
  167. package/dist/src/commands/vcs/drafts.js.map +1 -0
  168. package/dist/src/commands/vcs/get.d.ts +8 -0
  169. package/dist/src/commands/vcs/get.d.ts.map +1 -0
  170. package/dist/src/commands/vcs/get.js +61 -0
  171. package/dist/src/commands/vcs/get.js.map +1 -0
  172. package/dist/src/commands/vcs/index.d.ts +3 -0
  173. package/dist/src/commands/vcs/index.d.ts.map +1 -0
  174. package/dist/src/commands/vcs/index.js +58 -0
  175. package/dist/src/commands/vcs/index.js.map +1 -0
  176. package/dist/src/commands/vcs/propose.d.ts +23 -0
  177. package/dist/src/commands/vcs/propose.d.ts.map +1 -0
  178. package/dist/src/commands/vcs/propose.js +94 -0
  179. package/dist/src/commands/vcs/propose.js.map +1 -0
  180. package/dist/src/commands/vcs/review.d.ts +15 -0
  181. package/dist/src/commands/vcs/review.d.ts.map +1 -0
  182. package/dist/src/commands/vcs/review.js +35 -0
  183. package/dist/src/commands/vcs/review.js.map +1 -0
  184. package/dist/src/commands/vcs-enrich.d.ts +15 -0
  185. package/dist/src/commands/vcs-enrich.d.ts.map +1 -0
  186. package/dist/src/commands/vcs-enrich.js +28 -0
  187. package/dist/src/commands/vcs-enrich.js.map +1 -0
  188. package/dist/src/commands/vpn/index.d.ts +24 -0
  189. package/dist/src/commands/vpn/index.d.ts.map +1 -0
  190. package/dist/src/commands/vpn/index.js +543 -0
  191. package/dist/src/commands/vpn/index.js.map +1 -0
  192. package/dist/src/commands/vpn/tunnel.d.ts +11 -0
  193. package/dist/src/commands/vpn/tunnel.d.ts.map +1 -0
  194. package/dist/src/commands/vpn/tunnel.js +188 -0
  195. package/dist/src/commands/vpn/tunnel.js.map +1 -0
  196. package/dist/src/commands/workflow.d.ts +24 -0
  197. package/dist/src/commands/workflow.d.ts.map +1 -0
  198. package/dist/src/commands/workflow.js +577 -0
  199. package/dist/src/commands/workflow.js.map +1 -0
  200. package/dist/src/docs/assemble.d.ts +217 -0
  201. package/dist/src/docs/assemble.d.ts.map +1 -0
  202. package/dist/src/docs/assemble.js +739 -0
  203. package/dist/src/docs/assemble.js.map +1 -0
  204. package/dist/src/docs/cli-reference.d.ts +93 -0
  205. package/dist/src/docs/cli-reference.d.ts.map +1 -0
  206. package/dist/src/docs/cli-reference.js +256 -0
  207. package/dist/src/docs/cli-reference.js.map +1 -0
  208. package/dist/src/docs/discover.d.ts +60 -0
  209. package/dist/src/docs/discover.d.ts.map +1 -0
  210. package/dist/src/docs/discover.js +233 -0
  211. package/dist/src/docs/discover.js.map +1 -0
  212. package/dist/src/docs/portal.d.ts +79 -0
  213. package/dist/src/docs/portal.d.ts.map +1 -0
  214. package/dist/src/docs/portal.js +242 -0
  215. package/dist/src/docs/portal.js.map +1 -0
  216. package/dist/src/docs/registry-docs.d.ts +43 -0
  217. package/dist/src/docs/registry-docs.d.ts.map +1 -0
  218. package/dist/src/docs/registry-docs.js +138 -0
  219. package/dist/src/docs/registry-docs.js.map +1 -0
  220. package/dist/src/docs/schema.d.ts +48 -0
  221. package/dist/src/docs/schema.d.ts.map +1 -0
  222. package/dist/src/docs/schema.js +96 -0
  223. package/dist/src/docs/schema.js.map +1 -0
  224. package/dist/src/docs/serve.d.ts +27 -0
  225. package/dist/src/docs/serve.d.ts.map +1 -0
  226. package/dist/src/docs/serve.js +102 -0
  227. package/dist/src/docs/serve.js.map +1 -0
  228. package/dist/src/docs/start.d.ts +80 -0
  229. package/dist/src/docs/start.d.ts.map +1 -0
  230. package/dist/src/docs/start.js +313 -0
  231. package/dist/src/docs/start.js.map +1 -0
  232. package/dist/src/eval/agent-eval.d.mts +14 -0
  233. package/dist/src/eval/agent-eval.d.mts.map +1 -0
  234. package/dist/src/eval/agent-eval.mjs +273 -0
  235. package/dist/src/eval/agent-eval.mjs.map +1 -0
  236. package/dist/src/index.js +624 -7
  237. package/dist/src/index.js.map +7 -1
  238. package/dist/src/program.d.ts +26 -0
  239. package/dist/src/program.d.ts.map +1 -0
  240. package/dist/src/program.js +76 -0
  241. package/dist/src/program.js.map +1 -0
  242. package/dist/src/utils/auth-preflight.d.ts +159 -0
  243. package/dist/src/utils/auth-preflight.d.ts.map +1 -0
  244. package/dist/src/utils/auth-preflight.js +298 -0
  245. package/dist/src/utils/auth-preflight.js.map +1 -0
  246. package/dist/src/utils/aws-auth.d.ts +181 -0
  247. package/dist/src/utils/aws-auth.d.ts.map +1 -0
  248. package/dist/src/utils/aws-auth.js +527 -0
  249. package/dist/src/utils/aws-auth.js.map +1 -0
  250. package/dist/src/utils/bastion.d.ts +1 -1
  251. package/dist/src/utils/bastion.d.ts.map +1 -1
  252. package/dist/src/utils/bastion.js +29 -8
  253. package/dist/src/utils/bastion.js.map +1 -1
  254. package/dist/src/utils/build-info.d.ts +33 -0
  255. package/dist/src/utils/build-info.d.ts.map +1 -0
  256. package/dist/src/utils/build-info.js +102 -0
  257. package/dist/src/utils/build-info.js.map +1 -0
  258. package/dist/src/utils/capture-history.d.ts +62 -0
  259. package/dist/src/utils/capture-history.d.ts.map +1 -0
  260. package/dist/src/utils/capture-history.js +94 -0
  261. package/dist/src/utils/capture-history.js.map +1 -0
  262. package/dist/src/utils/deploy-preflight.d.ts +52 -0
  263. package/dist/src/utils/deploy-preflight.d.ts.map +1 -0
  264. package/dist/src/utils/deploy-preflight.js +183 -0
  265. package/dist/src/utils/deploy-preflight.js.map +1 -0
  266. package/dist/src/utils/errors.d.ts +75 -0
  267. package/dist/src/utils/errors.d.ts.map +1 -0
  268. package/dist/src/utils/errors.js +106 -0
  269. package/dist/src/utils/errors.js.map +1 -0
  270. package/dist/src/utils/first-party-contexts.d.ts +40 -0
  271. package/dist/src/utils/first-party-contexts.d.ts.map +1 -0
  272. package/dist/src/utils/first-party-contexts.js +53 -0
  273. package/dist/src/utils/first-party-contexts.js.map +1 -0
  274. package/dist/src/utils/index.d.ts +2 -0
  275. package/dist/src/utils/index.d.ts.map +1 -1
  276. package/dist/src/utils/index.js +2 -0
  277. package/dist/src/utils/index.js.map +1 -1
  278. package/dist/src/utils/kubeconfig.d.ts +62 -0
  279. package/dist/src/utils/kubeconfig.d.ts.map +1 -0
  280. package/dist/src/utils/kubeconfig.js +118 -0
  281. package/dist/src/utils/kubeconfig.js.map +1 -0
  282. package/dist/src/utils/log.d.ts +27 -1
  283. package/dist/src/utils/log.d.ts.map +1 -1
  284. package/dist/src/utils/log.js +59 -5
  285. package/dist/src/utils/log.js.map +1 -1
  286. package/dist/src/utils/pid.d.ts +47 -0
  287. package/dist/src/utils/pid.d.ts.map +1 -0
  288. package/dist/src/utils/pid.js +83 -0
  289. package/dist/src/utils/pid.js.map +1 -0
  290. package/dist/src/utils/pulumi-run.d.ts +23 -0
  291. package/dist/src/utils/pulumi-run.d.ts.map +1 -0
  292. package/dist/src/utils/pulumi-run.js +112 -0
  293. package/dist/src/utils/pulumi-run.js.map +1 -0
  294. package/dist/src/utils/pulumi.d.ts +15 -0
  295. package/dist/src/utils/pulumi.d.ts.map +1 -1
  296. package/dist/src/utils/pulumi.js +35 -0
  297. package/dist/src/utils/pulumi.js.map +1 -1
  298. package/dist/src/utils/reachability.d.ts +29 -0
  299. package/dist/src/utils/reachability.d.ts.map +1 -0
  300. package/dist/src/utils/reachability.js +81 -0
  301. package/dist/src/utils/reachability.js.map +1 -0
  302. package/dist/src/utils/recover-conversation.d.ts +154 -0
  303. package/dist/src/utils/recover-conversation.d.ts.map +1 -0
  304. package/dist/src/utils/recover-conversation.js +314 -0
  305. package/dist/src/utils/recover-conversation.js.map +1 -0
  306. package/dist/src/utils/registry-broker.d.ts +148 -0
  307. package/dist/src/utils/registry-broker.d.ts.map +1 -0
  308. package/dist/src/utils/registry-broker.js +180 -0
  309. package/dist/src/utils/registry-broker.js.map +1 -0
  310. package/dist/src/utils/socks-forward.d.ts +40 -0
  311. package/dist/src/utils/socks-forward.d.ts.map +1 -0
  312. package/dist/src/utils/socks-forward.js +97 -0
  313. package/dist/src/utils/socks-forward.js.map +1 -0
  314. package/dist/src/utils/stack-flag.d.ts +23 -0
  315. package/dist/src/utils/stack-flag.d.ts.map +1 -0
  316. package/dist/src/utils/stack-flag.js +41 -0
  317. package/dist/src/utils/stack-flag.js.map +1 -0
  318. package/dist/src/utils/tailscale-targets.d.ts +52 -0
  319. package/dist/src/utils/tailscale-targets.d.ts.map +1 -0
  320. package/dist/src/utils/tailscale-targets.js +93 -0
  321. package/dist/src/utils/tailscale-targets.js.map +1 -0
  322. package/dist/src/utils/tailscale.d.ts +277 -0
  323. package/dist/src/utils/tailscale.d.ts.map +1 -0
  324. package/dist/src/utils/tailscale.js +1007 -0
  325. package/dist/src/utils/tailscale.js.map +1 -0
  326. package/dist/src/utils/temporal-auth.d.ts +43 -0
  327. package/dist/src/utils/temporal-auth.d.ts.map +1 -0
  328. package/dist/src/utils/temporal-auth.js +176 -0
  329. package/dist/src/utils/temporal-auth.js.map +1 -0
  330. package/dist/src/utils/temporal-codec.d.ts +101 -0
  331. package/dist/src/utils/temporal-codec.d.ts.map +1 -0
  332. package/dist/src/utils/temporal-codec.js +319 -0
  333. package/dist/src/utils/temporal-codec.js.map +1 -0
  334. package/dist/src/utils/tunnel-ownership.d.ts +130 -0
  335. package/dist/src/utils/tunnel-ownership.d.ts.map +1 -0
  336. package/dist/src/utils/tunnel-ownership.js +274 -0
  337. package/dist/src/utils/tunnel-ownership.js.map +1 -0
  338. package/dist/src/utils/vpn-join.d.ts +32 -0
  339. package/dist/src/utils/vpn-join.d.ts.map +1 -0
  340. package/dist/src/utils/vpn-join.js +62 -0
  341. package/dist/src/utils/vpn-join.js.map +1 -0
  342. package/dist/src/utils/vpn.d.ts +62 -0
  343. package/dist/src/utils/vpn.d.ts.map +1 -0
  344. package/dist/src/utils/vpn.js +183 -0
  345. package/dist/src/utils/vpn.js.map +1 -0
  346. package/dist/src/utils/workflow-fingerprint.d.ts +49 -0
  347. package/dist/src/utils/workflow-fingerprint.d.ts.map +1 -0
  348. package/dist/src/utils/workflow-fingerprint.js +135 -0
  349. package/dist/src/utils/workflow-fingerprint.js.map +1 -0
  350. package/dist/src/utils/worktree-identity.d.ts +86 -0
  351. package/dist/src/utils/worktree-identity.d.ts.map +1 -0
  352. package/dist/src/utils/worktree-identity.js +164 -0
  353. package/dist/src/utils/worktree-identity.js.map +1 -0
  354. package/fragments/agents/AGENTS.md.hbs +92 -0
  355. package/fragments/agents/CLAUDE.md.hbs +8 -0
  356. package/fragments/base/Pulumi.dev.yaml.hbs +10 -0
  357. package/fragments/base/Pulumi.yaml.hbs +9 -0
  358. package/fragments/base/index.ts.hbs +107 -0
  359. package/fragments/base/package.json.hbs +22 -0
  360. package/{templates/api-web-db/api → fragments/base}/tsconfig.json +3 -4
  361. package/fragments/bucket/api/src/storage.ts.hbs +81 -0
  362. package/fragments/database/api/src/db.ts.hbs +23 -0
  363. package/fragments/database/prisma/schema.prisma.hbs +18 -0
  364. package/{templates/api-web-db → fragments/service}/api/.dockerignore +2 -0
  365. package/fragments/service/api/package.json.hbs +40 -0
  366. package/fragments/service/api/src/index.ts.hbs +58 -0
  367. package/{templates/api-web-db → fragments/service/api}/tsconfig.json +5 -3
  368. package/fragments/temporal/worker/.dockerignore +4 -0
  369. package/fragments/temporal/worker/Dockerfile +15 -0
  370. package/{templates/temporal-api-worker → fragments/temporal}/worker/package.json.hbs +3 -2
  371. package/fragments/temporal/worker/src/activities.ts.hbs +14 -0
  372. package/fragments/temporal/worker/src/worker.ts.hbs +27 -0
  373. package/fragments/temporal/worker/src/workflows.ts.hbs +24 -0
  374. package/fragments/temporal/worker/tsconfig.json +13 -0
  375. package/package.json +36 -22
  376. package/skills/core/SKILL.md +365 -0
  377. package/skills/pull-remote-agent-context/SKILL.md +194 -0
  378. package/stack/docker-compose.hub.yml +134 -0
  379. package/stack/docker-compose.yml +447 -0
  380. package/stack/hub/Dockerfile.api +18 -0
  381. package/stack/hub/Dockerfile.auth +10 -0
  382. package/stack/hub/Dockerfile.ui +10 -0
  383. package/stack/init/01-databases.sql +12 -0
  384. package/stack/observability/blackbox.yml +20 -0
  385. package/stack/observability/otel-collector.yaml +73 -0
  386. package/stack/observability/prometheus.yml +36 -0
  387. package/stack/observability/tempo.yaml +25 -0
  388. package/stack/temporal/local.yaml +44 -0
  389. package/templates/api-auth/AGENTS.md.hbs +16 -0
  390. package/templates/api-auth/Pulumi.dev.yaml.hbs +8 -0
  391. package/templates/api-auth/Pulumi.yaml.hbs +8 -0
  392. package/templates/api-auth/README.md.hbs +67 -0
  393. package/templates/api-auth/api/package.json.hbs +28 -0
  394. package/templates/api-auth/api/src/index.ts.hbs +96 -0
  395. package/templates/api-auth/api/src/schema.ts.hbs +35 -0
  396. package/templates/api-auth/api/src/seed-authz.ts.hbs +48 -0
  397. package/templates/api-auth/api/src/spicedb-http-provider.ts.hbs +89 -0
  398. package/templates/api-auth/index.ts.hbs +65 -0
  399. package/templates/api-auth/package.json.hbs +20 -0
  400. package/templates/api-auth/skills/develop/SKILL.md.hbs +32 -0
  401. package/templates/api-role-gating/AGENTS.md.hbs +20 -0
  402. package/templates/api-role-gating/Pulumi.dev.yaml.hbs +8 -0
  403. package/templates/api-role-gating/Pulumi.yaml.hbs +8 -0
  404. package/templates/api-role-gating/README.md.hbs +64 -0
  405. package/templates/api-role-gating/api/Dockerfile +17 -0
  406. package/templates/api-role-gating/api/package.json.hbs +28 -0
  407. package/templates/api-role-gating/api/src/authn.ts.hbs +29 -0
  408. package/templates/api-role-gating/api/src/authz.ts.hbs +12 -0
  409. package/templates/api-role-gating/api/src/main.ts.hbs +58 -0
  410. package/templates/api-role-gating/api/src/schema.ts.hbs +22 -0
  411. package/templates/api-role-gating/api/tsconfig.json +13 -0
  412. package/templates/api-role-gating/index.ts.hbs +107 -0
  413. package/templates/api-role-gating/package.json.hbs +21 -0
  414. package/templates/api-role-gating/skills/develop/SKILL.md.hbs +60 -0
  415. package/templates/api-role-gating/tsconfig.json +10 -0
  416. package/templates/apps-repo/README.md.hbs +24 -0
  417. package/templates/apps-repo/gitignore +41 -0
  418. package/templates/apps-repo/npmrc.hbs +7 -0
  419. package/templates/apps-repo/package.json.hbs +15 -0
  420. package/templates/apps-repo/pnpm-workspace.yaml +3 -0
  421. package/templates/apps-repo/tsconfig.json +18 -0
  422. package/templates/external-service/AGENTS.md.hbs +20 -0
  423. package/templates/external-service/Pulumi.dev.yaml.hbs +8 -0
  424. package/templates/external-service/Pulumi.yaml.hbs +8 -0
  425. package/templates/external-service/README.md.hbs +56 -0
  426. package/templates/external-service/api/Dockerfile +15 -0
  427. package/templates/external-service/api/package.json.hbs +25 -0
  428. package/templates/external-service/api/src/index.ts.hbs +81 -0
  429. package/templates/external-service/index.ts.hbs +82 -0
  430. package/templates/external-service/mocks/vendorpay/package.json.hbs +9 -0
  431. package/templates/external-service/mocks/vendorpay/server.mjs.hbs +61 -0
  432. package/templates/external-service/package.json.hbs +34 -0
  433. package/templates/external-service/skills/develop/SKILL.md.hbs +55 -0
  434. package/templates/external-service/tsconfig.json +10 -0
  435. package/templates/platform-repo/AGENTS.md.hbs +18 -0
  436. package/templates/platform-repo/README.md.hbs +38 -0
  437. package/templates/platform-repo/core/Pulumi.yaml.hbs +12 -0
  438. package/templates/platform-repo/core/Pulumi.{{tenant}}-{{env}}.yaml.hbs +57 -0
  439. package/templates/platform-repo/core/index.ts +62 -0
  440. package/templates/platform-repo/core/package.json.hbs +22 -0
  441. package/templates/platform-repo/core/tsconfig.json +8 -0
  442. package/templates/platform-repo/package.json.hbs +15 -0
  443. package/templates/platform-repo/platform/Pulumi.yaml.hbs +12 -0
  444. package/templates/platform-repo/platform/Pulumi.{{tenant}}-{{env}}.yaml.hbs +59 -0
  445. package/templates/platform-repo/platform/index.ts +95 -0
  446. package/templates/platform-repo/platform/package.json.hbs +26 -0
  447. package/templates/platform-repo/platform/tsconfig.json +8 -0
  448. package/templates/platform-repo/pnpm-workspace.yaml +3 -0
  449. package/templates/workflow/AGENTS.md.hbs +15 -0
  450. package/templates/workflow/Pulumi.dev.yaml.hbs +8 -0
  451. package/templates/workflow/Pulumi.yaml.hbs +8 -0
  452. package/templates/workflow/README.md.hbs +45 -0
  453. package/templates/workflow/api/.dockerignore +4 -0
  454. package/templates/workflow/api/Dockerfile +15 -0
  455. package/templates/{temporal-api-worker → workflow}/api/package.json.hbs +8 -6
  456. package/templates/workflow/api/src/index.ts.hbs +130 -0
  457. package/templates/workflow/api/tsconfig.json +14 -0
  458. package/templates/workflow/index.ts.hbs +67 -0
  459. package/templates/workflow/package.json.hbs +20 -0
  460. package/templates/workflow/skills/develop/SKILL.md.hbs +32 -0
  461. package/templates/workflow/tsconfig.json +10 -0
  462. package/templates/workflow/worker/.dockerignore +4 -0
  463. package/templates/workflow/worker/Dockerfile +13 -0
  464. package/templates/workflow/worker/package.json.hbs +25 -0
  465. package/templates/workflow/worker/src/worker.ts.hbs +24 -0
  466. package/templates/workflow/worker/tsconfig.json +14 -0
  467. package/dist/src/commands/devbox.d.ts +0 -22
  468. package/dist/src/commands/devbox.d.ts.map +0 -1
  469. package/dist/src/commands/devbox.js +0 -463
  470. package/dist/src/commands/devbox.js.map +0 -1
  471. package/templates/api-web-db/api/Dockerfile +0 -16
  472. package/templates/api-web-db/api/package.json.hbs +0 -21
  473. package/templates/api-web-db/api/src/index.ts.hbs +0 -123
  474. package/templates/api-web-db/package.json.hbs +0 -27
  475. package/templates/api-web-db/sst.config.ts.hbs +0 -151
  476. package/templates/api-web-db/web/.dockerignore +0 -3
  477. package/templates/api-web-db/web/Dockerfile +0 -17
  478. package/templates/api-web-db/web/app/lib/db.server.ts +0 -36
  479. package/templates/api-web-db/web/app/root.tsx +0 -29
  480. package/templates/api-web-db/web/app/routes/home.tsx.hbs +0 -114
  481. package/templates/api-web-db/web/app/routes.ts +0 -3
  482. package/templates/api-web-db/web/package.json.hbs +0 -30
  483. package/templates/api-web-db/web/prisma/schema.prisma +0 -25
  484. package/templates/api-web-db/web/prisma.config.ts +0 -18
  485. package/templates/api-web-db/web/react-router.config.ts +0 -5
  486. package/templates/api-web-db/web/tsconfig.json +0 -19
  487. package/templates/api-web-db/web/vite.config.ts +0 -9
  488. package/templates/temporal-api-worker/README.md.hbs +0 -133
  489. package/templates/temporal-api-worker/api/src/index.ts.hbs +0 -145
  490. package/templates/temporal-api-worker/package.json.hbs +0 -29
  491. package/templates/temporal-api-worker/sst.config.ts.hbs +0 -161
  492. package/templates/temporal-api-worker/worker/Dockerfile +0 -11
  493. package/templates/temporal-api-worker/worker/src/bundle-workflows.ts +0 -38
  494. package/templates/temporal-api-worker/worker/src/worker.ts.hbs +0 -93
  495. /package/templates/{temporal-api-worker → api-auth}/api/.dockerignore +0 -0
  496. /package/templates/{temporal-api-worker → api-auth}/api/Dockerfile +0 -0
  497. /package/templates/{temporal-api-worker → api-auth}/api/tsconfig.json +0 -0
  498. /package/templates/{temporal-api-worker → api-auth}/tsconfig.json +0 -0
  499. /package/templates/{temporal-api-worker/worker → api-role-gating/api}/.dockerignore +0 -0
  500. /package/templates/{temporal-api-worker/worker → external-service/api}/tsconfig.json +0 -0
  501. /package/templates/{temporal-api-worker → workflow}/api/src/encryption-codec.ts +0 -0
  502. /package/templates/{temporal-api-worker → workflow}/worker/src/activities.ts.hbs +0 -0
  503. /package/templates/{temporal-api-worker → workflow}/worker/src/encryption-codec.ts +0 -0
  504. /package/templates/{temporal-api-worker → workflow}/worker/src/workflows.ts.hbs +0 -0
@@ -0,0 +1,33 @@
1
+ /**
2
+ * CLI provenance for `mesh --version` (MESH-2479).
3
+ *
4
+ * A stale shim / stale global install is invisible when --version prints only
5
+ * the package version — two different checkouts (or a source tree vs a
6
+ * published dist) can share "0.5.1". This resolves WHERE the running CLI
7
+ * came from (TypeScript source vs published dist) plus the commit/build date,
8
+ * so "am I running the code I think I am?" is answerable from one command.
9
+ *
10
+ * Source layout: bin/mesh.ts runs under tsx from the repo — commit/date come
11
+ * from git at call time. Dist layout: the published package ships
12
+ * dist/build-info.json written by scripts/build-for-publish.ts.
13
+ */
14
+ export interface CliRuntimeInfo {
15
+ version: string;
16
+ mode: "source" | "dist";
17
+ commit?: string;
18
+ builtAt?: string;
19
+ }
20
+ /** Pure: a module path under a `dist/` segment is the published build. */
21
+ export declare function detectRuntimeMode(modulePath: string): "source" | "dist";
22
+ /** Pure: one-line version string with provenance, e.g.
23
+ * `0.5.1 (source @ abc1234 2026-07-30)` or
24
+ * `0.5.1 (published build 2026-07-28, commit abc1234)`. */
25
+ export declare function formatVersionLine(info: CliRuntimeInfo): string;
26
+ /** Resolve the running CLI's version + provenance. Never throws.
27
+ * `vcs: false` skips the git spawns in source mode (version + mode only) —
28
+ * commit/date cost two synchronous `git` runs, too slow to pay on every
29
+ * invocation when nothing will print them. */
30
+ export declare function resolveCliRuntime(opts?: {
31
+ vcs?: boolean;
32
+ }): CliRuntimeInfo;
33
+ //# sourceMappingURL=build-info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-info.d.ts","sourceRoot":"","sources":["../../../src/utils/build-info.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAEvE;AAED;;2DAE2D;AAC3D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAS9D;AAmBD;;;8CAG8C;AAC9C,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,cAAc,CA8C1E"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * CLI provenance for `mesh --version` (MESH-2479).
3
+ *
4
+ * A stale shim / stale global install is invisible when --version prints only
5
+ * the package version — two different checkouts (or a source tree vs a
6
+ * published dist) can share "0.5.1". This resolves WHERE the running CLI
7
+ * came from (TypeScript source vs published dist) plus the commit/build date,
8
+ * so "am I running the code I think I am?" is answerable from one command.
9
+ *
10
+ * Source layout: bin/mesh.ts runs under tsx from the repo — commit/date come
11
+ * from git at call time. Dist layout: the published package ships
12
+ * dist/build-info.json written by scripts/build-for-publish.ts.
13
+ */
14
+ import { execFileSync } from "child_process";
15
+ import * as fs from "fs";
16
+ import * as path from "path";
17
+ import { fileURLToPath } from "url";
18
+ /** Pure: a module path under a `dist/` segment is the published build. */
19
+ export function detectRuntimeMode(modulePath) {
20
+ return modulePath.split(/[\\/]/).includes("dist") ? "dist" : "source";
21
+ }
22
+ /** Pure: one-line version string with provenance, e.g.
23
+ * `0.5.1 (source @ abc1234 2026-07-30)` or
24
+ * `0.5.1 (published build 2026-07-28, commit abc1234)`. */
25
+ export function formatVersionLine(info) {
26
+ if (info.mode === "source") {
27
+ const at = [info.commit, info.builtAt].filter(Boolean).join(" ");
28
+ return `${info.version} (source${at ? ` @ ${at}` : ""})`;
29
+ }
30
+ const built = info.builtAt ? ` ${info.builtAt.slice(0, 10)}` : "";
31
+ const commit = info.commit ? `, commit ${info.commit}` : "";
32
+ const detail = built || commit ? `${built}${commit}` : " — build metadata unavailable";
33
+ return `${info.version} (published build${detail})`;
34
+ }
35
+ /** Walk up from `startDir` to the @mesh-tech/mesh-cli package root. */
36
+ function findCliPackageRoot(startDir) {
37
+ let dir = startDir;
38
+ for (let i = 0; i < 8; i++) {
39
+ try {
40
+ const pkg = JSON.parse(fs.readFileSync(path.join(dir, "package.json"), "utf-8"));
41
+ if (pkg.name === "@mesh-tech/mesh-cli")
42
+ return dir;
43
+ }
44
+ catch {
45
+ // keep walking
46
+ }
47
+ const parent = path.dirname(dir);
48
+ if (parent === dir)
49
+ break;
50
+ dir = parent;
51
+ }
52
+ return null;
53
+ }
54
+ /** Resolve the running CLI's version + provenance. Never throws.
55
+ * `vcs: false` skips the git spawns in source mode (version + mode only) —
56
+ * commit/date cost two synchronous `git` runs, too slow to pay on every
57
+ * invocation when nothing will print them. */
58
+ export function resolveCliRuntime(opts) {
59
+ const vcs = opts?.vcs ?? true;
60
+ const here = path.dirname(fileURLToPath(import.meta.url));
61
+ const mode = detectRuntimeMode(here);
62
+ const root = findCliPackageRoot(here);
63
+ let version = "0.0.0";
64
+ if (root) {
65
+ try {
66
+ version = JSON.parse(fs.readFileSync(path.join(root, "package.json"), "utf-8")).version ?? version;
67
+ }
68
+ catch {
69
+ // fall through with the placeholder
70
+ }
71
+ }
72
+ const info = { version, mode };
73
+ if (!root)
74
+ return info;
75
+ if (mode === "dist") {
76
+ try {
77
+ const meta = JSON.parse(fs.readFileSync(path.join(root, "dist", "build-info.json"), "utf-8"));
78
+ info.commit = meta.commit;
79
+ info.builtAt = meta.builtAt;
80
+ }
81
+ catch {
82
+ // pre-MESH-2479 publishes have no build-info.json
83
+ }
84
+ return info;
85
+ }
86
+ if (!vcs)
87
+ return info;
88
+ try {
89
+ const git = (args) => execFileSync("git", args, {
90
+ cwd: root,
91
+ encoding: "utf-8",
92
+ stdio: ["ignore", "pipe", "pipe"],
93
+ }).trim();
94
+ info.commit = git(["rev-parse", "--short", "HEAD"]);
95
+ info.builtAt = git(["log", "-1", "--format=%cs"]);
96
+ }
97
+ catch {
98
+ // not a git checkout (e.g. exported source) — version + mode still print
99
+ }
100
+ return info;
101
+ }
102
+ //# sourceMappingURL=build-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-info.js","sourceRoot":"","sources":["../../../src/utils/build-info.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AASpC,0EAA0E;AAC1E,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,OAAO,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;AACxE,CAAC;AAED;;2DAE2D;AAC3D,MAAM,UAAU,iBAAiB,CAAC,IAAoB;IACpD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,GAAG,IAAI,CAAC,OAAO,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;IAC3D,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,+BAA+B,CAAC;IACvF,OAAO,GAAG,IAAI,CAAC,OAAO,oBAAoB,MAAM,GAAG,CAAC;AACtD,CAAC;AAED,uEAAuE;AACvE,SAAS,kBAAkB,CAAC,QAAgB;IAC1C,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YACjF,IAAI,GAAG,CAAC,IAAI,KAAK,qBAAqB;gBAAE,OAAO,GAAG,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;8CAG8C;AAC9C,MAAM,UAAU,iBAAiB,CAAC,IAAwB;IACxD,MAAM,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAEtC,IAAI,OAAO,GAAG,OAAO,CAAC;IACtB,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC;QACrG,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CACrB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAC5B,CAAC;YAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,CAAC,IAAc,EAAE,EAAE,CAC7B,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE;YACxB,GAAG,EAAE,IAAI;YACT,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;IAC3E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Serialize a fetched Temporal workflow history into the replay-fixture JSON
3
+ * shape — the same canonical proto3-JSON `{ events: [...] }` that
4
+ * `@mesh-tech/agent-sdk`'s `replay/history-io.ts` `historyToFixture` produces,
5
+ * so a captured file replays via `replayFixture` (which rehydrates it with
6
+ * `historyFromJSON`) for LOCAL debugging. Captured PRODUCTION histories are
7
+ * never committed (they contain real, decrypted customer/conversation data —
8
+ * see the CLI's do-not-commit warning); only synthetic goldens live in
9
+ * `packages/agent-sdk/src/replay/fixtures/`.
10
+ *
11
+ * We reuse `@temporalio/common`'s `historyToJSON` directly (the exact helper
12
+ * agent-sdk's history-io uses) rather than importing `@mesh-tech/agent-sdk`:
13
+ * the CLI has no reason to pull in the whole worker/replay stack, and keeping
14
+ * the dependency pointed at the shared Temporal library guarantees the output
15
+ * round-trips through `historyFromJSON`.
16
+ *
17
+ * The one thing a *real* history needs that a synthetic golden fixture doesn't:
18
+ * its payloads are ENCRYPTED (the worker's AES-GCM codec). `historyToJSON`
19
+ * would just base64 the ciphertext, which `replayFixture`'s plaintext converter
20
+ * can't decode. So before serializing we walk every Payload in the history and
21
+ * replace each encrypted one with its decrypted inner Payload — yielding a
22
+ * plaintext fixture identical in shape to a codec-free golden capture.
23
+ */
24
+ import type { RawPayloadDecrypter } from "./temporal-codec.js";
25
+ /**
26
+ * Walk an arbitrary history-event tree and decrypt every encrypted Payload in
27
+ * place, using `decrypt` to turn an encrypted Payload into its plaintext inner
28
+ * Payload. Payloads the decrypter reports as non-encrypted (`null`) are left
29
+ * untouched. Returns the number of payloads that were decrypted.
30
+ *
31
+ * The `{ metadata, data }` heuristic mirrors Temporal's own `fixPayloads` in
32
+ * `@temporalio/common/lib/proto-utils`, so it identifies exactly the nodes
33
+ * proto3-JSON treats as payloads. Once a node is a Payload we do NOT recurse
34
+ * into it (its metadata values are bytes, not nested payloads).
35
+ */
36
+ export declare function decryptHistoryPayloads(node: unknown, decrypt: RawPayloadDecrypter): Promise<number>;
37
+ /** Result of {@link serializeHistoryToFixture}. */
38
+ export interface CaptureResult {
39
+ /** The parsed proto3-JSON fixture object (drop-in for `replayFixture`). */
40
+ fixture: unknown;
41
+ /** Total events serialized. */
42
+ eventCount: number;
43
+ /** How many encrypted payloads were decrypted (0 when no decrypter given). */
44
+ decryptedPayloads: number;
45
+ }
46
+ /**
47
+ * Turn an ordered list of raw history events into a replay fixture object.
48
+ *
49
+ * @param events - Raw proto-decoded history events, in order (as yielded by the
50
+ * CLI's `iterHistoryEvents` over `getWorkflowExecutionHistory`).
51
+ * @param decrypter - Optional raw payload decrypter. When provided, every
52
+ * encrypted payload in the history is decrypted in place before serialization
53
+ * so the fixture is replayable with a plaintext converter. When omitted, the
54
+ * payloads are serialized as-is (ciphertext, base64-encoded).
55
+ *
56
+ * `historyToJSON` runs its input through protobuf `History.fromObject`, so a
57
+ * plain `{ events }` object of raw events is accepted directly; it returns a
58
+ * proto3-JSON *string* which we parse back to a structured object (the same
59
+ * `JSON.parse(historyToJSON(...))` round-trip `historyToFixture` performs).
60
+ */
61
+ export declare function serializeHistoryToFixture(events: unknown[], decrypter?: RawPayloadDecrypter): Promise<CaptureResult>;
62
+ //# sourceMappingURL=capture-history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-history.d.ts","sourceRoot":"","sources":["../../../src/utils/capture-history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAOH,OAAO,KAAK,EAAc,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAqB3E;;;;;;;;;;GAUG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED,mDAAmD;AACnD,MAAM,WAAW,aAAa;IAC5B,2EAA2E;IAC3E,OAAO,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,OAAO,EAAE,EACjB,SAAS,CAAC,EAAE,mBAAmB,GAC9B,OAAO,CAAC,aAAa,CAAC,CAUxB"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Serialize a fetched Temporal workflow history into the replay-fixture JSON
3
+ * shape — the same canonical proto3-JSON `{ events: [...] }` that
4
+ * `@mesh-tech/agent-sdk`'s `replay/history-io.ts` `historyToFixture` produces,
5
+ * so a captured file replays via `replayFixture` (which rehydrates it with
6
+ * `historyFromJSON`) for LOCAL debugging. Captured PRODUCTION histories are
7
+ * never committed (they contain real, decrypted customer/conversation data —
8
+ * see the CLI's do-not-commit warning); only synthetic goldens live in
9
+ * `packages/agent-sdk/src/replay/fixtures/`.
10
+ *
11
+ * We reuse `@temporalio/common`'s `historyToJSON` directly (the exact helper
12
+ * agent-sdk's history-io uses) rather than importing `@mesh-tech/agent-sdk`:
13
+ * the CLI has no reason to pull in the whole worker/replay stack, and keeping
14
+ * the dependency pointed at the shared Temporal library guarantees the output
15
+ * round-trips through `historyFromJSON`.
16
+ *
17
+ * The one thing a *real* history needs that a synthetic golden fixture doesn't:
18
+ * its payloads are ENCRYPTED (the worker's AES-GCM codec). `historyToJSON`
19
+ * would just base64 the ciphertext, which `replayFixture`'s plaintext converter
20
+ * can't decode. So before serializing we walk every Payload in the history and
21
+ * replace each encrypted one with its decrypted inner Payload — yielding a
22
+ * plaintext fixture identical in shape to a codec-free golden capture.
23
+ */
24
+ // Explicit `.js` — this package publishes native ESM, so the compiled dist
25
+ // must use a fully-specified specifier or Node throws ERR_MODULE_NOT_FOUND at
26
+ // runtime (MESH-2262). tsx tolerates the extensionless form; node does not.
27
+ import { historyToJSON } from "@temporalio/common/lib/proto-utils.js";
28
+ function isPayload(value) {
29
+ return (value != null &&
30
+ typeof value === "object" &&
31
+ "metadata" in value &&
32
+ "data" in value);
33
+ }
34
+ /**
35
+ * Walk an arbitrary history-event tree and decrypt every encrypted Payload in
36
+ * place, using `decrypt` to turn an encrypted Payload into its plaintext inner
37
+ * Payload. Payloads the decrypter reports as non-encrypted (`null`) are left
38
+ * untouched. Returns the number of payloads that were decrypted.
39
+ *
40
+ * The `{ metadata, data }` heuristic mirrors Temporal's own `fixPayloads` in
41
+ * `@temporalio/common/lib/proto-utils`, so it identifies exactly the nodes
42
+ * proto3-JSON treats as payloads. Once a node is a Payload we do NOT recurse
43
+ * into it (its metadata values are bytes, not nested payloads).
44
+ */
45
+ export async function decryptHistoryPayloads(node, decrypt) {
46
+ if (node == null || typeof node !== "object")
47
+ return 0;
48
+ if (isPayload(node)) {
49
+ const inner = await decrypt(node);
50
+ if (inner === null)
51
+ return 0; // not encrypted — leave as-is
52
+ // Replace the encrypted envelope with the decrypted inner payload's bytes.
53
+ node.metadata = inner.metadata ?? {};
54
+ node.data = inner.data ?? new Uint8Array(0);
55
+ return 1;
56
+ }
57
+ let count = 0;
58
+ if (Array.isArray(node)) {
59
+ for (const item of node)
60
+ count += await decryptHistoryPayloads(item, decrypt);
61
+ }
62
+ else {
63
+ for (const value of Object.values(node)) {
64
+ count += await decryptHistoryPayloads(value, decrypt);
65
+ }
66
+ }
67
+ return count;
68
+ }
69
+ /**
70
+ * Turn an ordered list of raw history events into a replay fixture object.
71
+ *
72
+ * @param events - Raw proto-decoded history events, in order (as yielded by the
73
+ * CLI's `iterHistoryEvents` over `getWorkflowExecutionHistory`).
74
+ * @param decrypter - Optional raw payload decrypter. When provided, every
75
+ * encrypted payload in the history is decrypted in place before serialization
76
+ * so the fixture is replayable with a plaintext converter. When omitted, the
77
+ * payloads are serialized as-is (ciphertext, base64-encoded).
78
+ *
79
+ * `historyToJSON` runs its input through protobuf `History.fromObject`, so a
80
+ * plain `{ events }` object of raw events is accepted directly; it returns a
81
+ * proto3-JSON *string* which we parse back to a structured object (the same
82
+ * `JSON.parse(historyToJSON(...))` round-trip `historyToFixture` performs).
83
+ */
84
+ export async function serializeHistoryToFixture(events, decrypter) {
85
+ let decryptedPayloads = 0;
86
+ if (decrypter) {
87
+ for (const event of events) {
88
+ decryptedPayloads += await decryptHistoryPayloads(event, decrypter);
89
+ }
90
+ }
91
+ const fixture = JSON.parse(historyToJSON({ events }));
92
+ return { fixture, eventCount: events.length, decryptedPayloads };
93
+ }
94
+ //# sourceMappingURL=capture-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-history.js","sourceRoot":"","sources":["../../../src/utils/capture-history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,2EAA2E;AAC3E,8EAA8E;AAC9E,4EAA4E;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AActE,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,CACL,KAAK,IAAI,IAAI;QACb,OAAO,KAAK,KAAK,QAAQ;QACzB,UAAU,IAAI,KAAK;QACnB,MAAM,IAAI,KAAK,CAChB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAa,EACb,OAA4B;IAE5B,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IAEvD,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAkB,CAAC,CAAC;QAChD,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC,8BAA8B;QAC5D,2EAA2E;QAC3E,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,IAAI;YAAE,KAAK,IAAI,MAAM,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChF,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,IAA+B,CAAC,EAAE,CAAC;YACnE,KAAK,IAAI,MAAM,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAYD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,MAAiB,EACjB,SAA+B;IAE/B,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,iBAAiB,IAAI,MAAM,sBAAsB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,MAAM,EAAW,CAAC,CAAY,CAAC;IAC1E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC;AACnE,CAAC"}
@@ -0,0 +1,52 @@
1
+ /** A `@mesh-tech/*` dep whose installed version differs from the lockfile's. */
2
+ export interface DepMismatch {
3
+ name: string;
4
+ /** Version the lockfile says should be installed. */
5
+ expected: string;
6
+ /** Version actually resolvable in node_modules, or null if not installed. */
7
+ installed: string | null;
8
+ }
9
+ /** pulumi ops that EVALUATE the program (a stale install can produce a wrong plan). */
10
+ export declare const PROGRAM_EVAL_OPS: Set<string>;
11
+ /** Env escape hatch — set truthy to skip the preflight (e.g. deliberate local link testing). */
12
+ export declare const SKIP_ENV = "MESH_SKIP_DEPLOY_PREFLIGHT";
13
+ /**
14
+ * A lockfile `version:` is checkable only when it's a concrete published version.
15
+ * `link:…`/`file:…` (dev-link pnpmfile, local tarballs) point at live source and
16
+ * are never stale; anything not starting with a digit isn't a comparable version.
17
+ * Peer/patch suffixes (`1.0.1(react@18)`) are stripped to the bare version.
18
+ */
19
+ export declare function normalizeLockVersion(raw: unknown): string | null;
20
+ /**
21
+ * Pure: extract the gated (`@mesh-tech/*`), concretely-versioned deps for one
22
+ * importer of a parsed pnpm-lock document → `{ name: expectedVersion }`.
23
+ *
24
+ * Handles the pnpm v9 shape (`{ specifier, version }` per dep) and the older flat
25
+ * shape (`name: "1.0.1"`). Unknown importer → `{}` (nothing checkable).
26
+ */
27
+ export declare function extractImporterMeshVersions(lockDoc: unknown, importerRel: string): Record<string, string>;
28
+ /**
29
+ * Pure: diff the lockfile's expected versions against the installed ones. A dep
30
+ * is a mismatch when the installed version differs (or it isn't installed).
31
+ */
32
+ export declare function diffLockVsInstalled(expected: Record<string, string>, installed: Record<string, string | null>): DepMismatch[];
33
+ /** Walk up from `startDir` to the nearest directory containing a `pnpm-lock.yaml`. */
34
+ export declare function findPnpmLock(startDir: string): string | null;
35
+ /**
36
+ * Check that the `@mesh-tech/*` deps installed in `appRoot`'s `node_modules` match
37
+ * what the pnpm lockfile says. Returns the list of mismatches (empty = fresh), or
38
+ * `null` when the check does not apply (no lockfile — not a pnpm repo, or the
39
+ * monorepo running without one). IO wrapper around the pure helpers above.
40
+ */
41
+ export declare function checkDeployDepsFresh(appRoot: string): DepMismatch[] | null;
42
+ /** Human-readable stale-deps report (mirrors the stale-dist detector's style). */
43
+ export declare function formatStaleDepsError(mismatches: DepMismatch[]): string;
44
+ /**
45
+ * Gate a `mesh deploy` invocation: if `op` evaluates the pulumi program and the
46
+ * deploy repo's `node_modules` is stale vs the lockfile, print the fix and exit
47
+ * non-zero BEFORE pulumi runs. No-op for non-evaluating ops, a fresh install, a
48
+ * non-pnpm repo, or when the skip env is set. Kept side-effecting (log + exit) so
49
+ * `deploy.ts` stays a thin wiring layer; the decision logic is pure above.
50
+ */
51
+ export declare function assertDeployDepsFresh(appRoot: string, op: string): void;
52
+ //# sourceMappingURL=deploy-preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-preflight.d.ts","sourceRoot":"","sources":["../../../src/utils/deploy-preflight.ts"],"names":[],"mappings":"AAyBA,gFAAgF;AAChF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAKD,uFAAuF;AACvF,eAAO,MAAM,gBAAgB,aAA6D,CAAC;AAE3F,gGAAgG;AAChG,eAAO,MAAM,QAAQ,+BAA+B,CAAC;AAMrD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIhE;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,MAAM,GAClB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBxB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GACvC,WAAW,EAAE,CAOf;AAED,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS5D;AAwBD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,GAAG,IAAI,CAqB1E;AAED,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,CAqBtE;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAOvE"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Deploy preflight — guard `mesh deploy` (pulumi up/preview/destroy/refresh) in a
3
+ * DEPLOY repo against a stale `node_modules` (MESH-2266).
4
+ *
5
+ * The hazard: a teammate pulls a `@mesh-tech/*` version bump (package.json +
6
+ * pnpm-lock.yaml move together in the commit) but forgets `pnpm install`, so
7
+ * `node_modules` still links the OLD version. The pulumi program then evaluates
8
+ * OLD component code and produces a plan that DELETES resources the new code would
9
+ * keep — the exact incident that showed `VpnJoinBroker` (+~40 resources) as a
10
+ * delete on mesh-dev when node_modules lagged the 1.0.1 bump. This is the same
11
+ * stale-artifact class as the monorepo stale-dist detector (MESH-2019) and the
12
+ * canonical CLI (MESH-2261), one layer up with higher stakes.
13
+ *
14
+ * The check is cheap and precise: compare each `@mesh-tech/*` version the LOCKFILE
15
+ * says should be installed against what is ACTUALLY installed in `node_modules`.
16
+ * A mismatch means `pnpm install` hasn't run since the lockfile changed. We only
17
+ * gate program-EVALUATING ops (a stale install can't corrupt `whoami`/`stack
18
+ * output`), and source-linked deps (`link:`/`file:`/dev-link pnpmfile) are skipped
19
+ * — they are intentionally pointed at live source and never "stale".
20
+ */
21
+ import { existsSync, readFileSync } from 'node:fs';
22
+ import { dirname, join, relative } from 'node:path';
23
+ import { parse as parseYaml } from 'yaml';
24
+ import { logWarn } from './log.js';
25
+ /** Package-name prefixes whose version drift changes the pulumi plan. */
26
+ const GATED_PREFIXES = ['@mesh-tech/'];
27
+ /** pulumi ops that EVALUATE the program (a stale install can produce a wrong plan). */
28
+ export const PROGRAM_EVAL_OPS = new Set(['up', 'preview', 'destroy', 'refresh', 'import']);
29
+ /** Env escape hatch — set truthy to skip the preflight (e.g. deliberate local link testing). */
30
+ export const SKIP_ENV = 'MESH_SKIP_DEPLOY_PREFLIGHT';
31
+ function isGated(name) {
32
+ return GATED_PREFIXES.some((p) => name.startsWith(p));
33
+ }
34
+ /**
35
+ * A lockfile `version:` is checkable only when it's a concrete published version.
36
+ * `link:…`/`file:…` (dev-link pnpmfile, local tarballs) point at live source and
37
+ * are never stale; anything not starting with a digit isn't a comparable version.
38
+ * Peer/patch suffixes (`1.0.1(react@18)`) are stripped to the bare version.
39
+ */
40
+ export function normalizeLockVersion(raw) {
41
+ if (typeof raw !== 'string' || raw.length === 0)
42
+ return null;
43
+ const bare = raw.split('(')[0].trim();
44
+ return /^\d/.test(bare) ? bare : null;
45
+ }
46
+ /**
47
+ * Pure: extract the gated (`@mesh-tech/*`), concretely-versioned deps for one
48
+ * importer of a parsed pnpm-lock document → `{ name: expectedVersion }`.
49
+ *
50
+ * Handles the pnpm v9 shape (`{ specifier, version }` per dep) and the older flat
51
+ * shape (`name: "1.0.1"`). Unknown importer → `{}` (nothing checkable).
52
+ */
53
+ export function extractImporterMeshVersions(lockDoc, importerRel) {
54
+ const out = {};
55
+ const importers = lockDoc?.importers;
56
+ const importer = importers?.[importerRel];
57
+ if (!importer)
58
+ return out;
59
+ for (const group of ['dependencies', 'devDependencies', 'optionalDependencies']) {
60
+ const deps = importer[group];
61
+ if (!deps)
62
+ continue;
63
+ for (const [name, entry] of Object.entries(deps)) {
64
+ if (!isGated(name))
65
+ continue;
66
+ const raw = typeof entry === 'string' ? entry : entry?.version;
67
+ const version = normalizeLockVersion(raw);
68
+ if (version)
69
+ out[name] = version;
70
+ }
71
+ }
72
+ return out;
73
+ }
74
+ /**
75
+ * Pure: diff the lockfile's expected versions against the installed ones. A dep
76
+ * is a mismatch when the installed version differs (or it isn't installed).
77
+ */
78
+ export function diffLockVsInstalled(expected, installed) {
79
+ const out = [];
80
+ for (const [name, exp] of Object.entries(expected)) {
81
+ const got = installed[name] ?? null;
82
+ if (got !== exp)
83
+ out.push({ name, expected: exp, installed: got });
84
+ }
85
+ return out;
86
+ }
87
+ /** Walk up from `startDir` to the nearest directory containing a `pnpm-lock.yaml`. */
88
+ export function findPnpmLock(startDir) {
89
+ let dir = startDir;
90
+ for (;;) {
91
+ const candidate = join(dir, 'pnpm-lock.yaml');
92
+ if (existsSync(candidate))
93
+ return candidate;
94
+ const parent = dirname(dir);
95
+ if (parent === dir)
96
+ return null;
97
+ dir = parent;
98
+ }
99
+ }
100
+ /**
101
+ * Read the installed version of `name` from `fromDir`'s `node_modules`, or null.
102
+ *
103
+ * Reads `node_modules/<name>/package.json` DIRECTLY (following pnpm's symlink into
104
+ * the store) rather than `require.resolve(`${name}/package.json`)`: Node's exports
105
+ * gate throws `ERR_PACKAGE_PATH_NOT_EXPORTED` for the many `@mesh-tech/*` packages
106
+ * whose `exports` omit `./package.json` (e.g. `tsconfig`, `pulumi-utils`) — which
107
+ * would return null → a FALSE "stale" hard-stop on a correctly-installed repo that
108
+ * `pnpm install` can't clear. A plain read sidesteps the gate and stays scoped to
109
+ * THIS importer's node_modules instead of walking up to a hoisted copy owned by
110
+ * another importer (MESH-2266 review).
111
+ */
112
+ function readInstalledVersion(fromDir, name) {
113
+ try {
114
+ const pkgPath = join(fromDir, 'node_modules', name, 'package.json');
115
+ const version = JSON.parse(readFileSync(pkgPath, 'utf8')).version;
116
+ return typeof version === 'string' ? version : null;
117
+ }
118
+ catch {
119
+ return null;
120
+ }
121
+ }
122
+ /**
123
+ * Check that the `@mesh-tech/*` deps installed in `appRoot`'s `node_modules` match
124
+ * what the pnpm lockfile says. Returns the list of mismatches (empty = fresh), or
125
+ * `null` when the check does not apply (no lockfile — not a pnpm repo, or the
126
+ * monorepo running without one). IO wrapper around the pure helpers above.
127
+ */
128
+ export function checkDeployDepsFresh(appRoot) {
129
+ const lockPath = findPnpmLock(appRoot);
130
+ if (!lockPath)
131
+ return null;
132
+ let lockDoc;
133
+ try {
134
+ lockDoc = parseYaml(readFileSync(lockPath, 'utf8'));
135
+ }
136
+ catch {
137
+ // Don't block the deploy on our own parse failure — but a silently-disabled
138
+ // safety guard is worse than a noisy one, so surface that the check is off.
139
+ logWarn(`deploy preflight: could not parse ${lockPath} — skipping the stale-node_modules check.`);
140
+ return null;
141
+ }
142
+ const importerRel = relative(dirname(lockPath), appRoot) || '.';
143
+ const expected = extractImporterMeshVersions(lockDoc, importerRel);
144
+ const names = Object.keys(expected);
145
+ if (names.length === 0)
146
+ return [];
147
+ const installed = {};
148
+ for (const name of names)
149
+ installed[name] = readInstalledVersion(appRoot, name);
150
+ return diffLockVsInstalled(expected, installed);
151
+ }
152
+ /** Human-readable stale-deps report (mirrors the stale-dist detector's style). */
153
+ export function formatStaleDepsError(mismatches) {
154
+ const lines = [
155
+ `✗ ${mismatches.length} @mesh-tech/* dep${mismatches.length === 1 ? '' : 's'} in node_modules ` +
156
+ `do not match the lockfile — run pnpm install before deploying:`,
157
+ '',
158
+ ];
159
+ for (const m of mismatches) {
160
+ lines.push(` • ${m.name} — installed ${m.installed ?? '(missing)'}, lockfile wants ${m.expected}`);
161
+ }
162
+ lines.push('', ' A stale node_modules makes pulumi evaluate OLD component code and can plan to', ' DELETE resources the current code would keep (MESH-2266). Fix:', '', ' pnpm install', '', ` To bypass this check (rarely correct): ${SKIP_ENV}=1 mesh deploy …`);
163
+ return lines.join('\n');
164
+ }
165
+ /**
166
+ * Gate a `mesh deploy` invocation: if `op` evaluates the pulumi program and the
167
+ * deploy repo's `node_modules` is stale vs the lockfile, print the fix and exit
168
+ * non-zero BEFORE pulumi runs. No-op for non-evaluating ops, a fresh install, a
169
+ * non-pnpm repo, or when the skip env is set. Kept side-effecting (log + exit) so
170
+ * `deploy.ts` stays a thin wiring layer; the decision logic is pure above.
171
+ */
172
+ export function assertDeployDepsFresh(appRoot, op) {
173
+ if (!PROGRAM_EVAL_OPS.has(op))
174
+ return;
175
+ if (process.env[SKIP_ENV])
176
+ return;
177
+ const mismatches = checkDeployDepsFresh(appRoot);
178
+ if (!mismatches || mismatches.length === 0)
179
+ return;
180
+ process.stderr.write(formatStaleDepsError(mismatches) + '\n');
181
+ process.exit(1);
182
+ }
183
+ //# sourceMappingURL=deploy-preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-preflight.js","sourceRoot":"","sources":["../../../src/utils/deploy-preflight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Shared CLI error type with structured remediation.
3
+ *
4
+ * Every failure along the golden path should tell the user the exact `mesh`
5
+ * command (or doc) that fixes it. Remediation strings must be commands or
6
+ * docs — never "ask <person>".
7
+ */
8
+ export interface Remediation {
9
+ /** Exact command that fixes the failure, e.g. "mesh login trabian-dev" */
10
+ command?: string;
11
+ /** Documentation URL or repo-relative doc path with more context */
12
+ docs?: string;
13
+ /** Whether the owning command can apply this fix itself via --fix */
14
+ autoFixable?: boolean;
15
+ }
16
+ export interface MeshCliErrorOptions {
17
+ remediation?: Remediation;
18
+ /** Process exit code (default 1) */
19
+ exitCode?: number;
20
+ cause?: unknown;
21
+ }
22
+ export declare class MeshCliError extends Error {
23
+ readonly remediation?: Remediation;
24
+ readonly exitCode: number;
25
+ constructor(message: string, options?: MeshCliErrorOptions);
26
+ }
27
+ /**
28
+ * Render an error's BODY — the message plus its "→ run: <command>" /
29
+ * "→ see: <docs>" remediation lines, with no leading severity glyph.
30
+ *
31
+ * Use this when the caller supplies its own glyph: a recovery path that logs a
32
+ * refusal through `logWarn` (which prefixes ⚠) and carries on would otherwise
33
+ * print "⚠ ✗ …". The remediation lines are the part that must survive — they
34
+ * name the corrupt file to delete.
35
+ */
36
+ export declare function renderErrorBody(err: unknown): string;
37
+ /**
38
+ * Render an error for humans. MeshCliError gets its remediation appended as
39
+ * "→ run: <command>" / "→ see: <docs>" lines; anything else renders its message.
40
+ */
41
+ export declare function renderError(err: unknown): string;
42
+ /**
43
+ * Render an error as JSON for agents. Same structure as the human output:
44
+ * { error, remediation?: { command?, docs?, autoFixable? } }.
45
+ */
46
+ export declare function renderErrorJson(err: unknown): string;
47
+ /**
48
+ * Print a command's `--json` payload — the single machine-readable document on
49
+ * stdout — and record that it happened.
50
+ *
51
+ * A command that emits a payload and *then* throws (the `mesh init` doctor
52
+ * throws by design whenever a check fails) used to produce TWO concatenated
53
+ * JSON documents on stdout, because `handleCliError` appended `{"error":…}`.
54
+ * Two documents is not JSON: `mesh init app-tenant --json | jq` failed to parse
55
+ * on exactly the failure path a script cares about. Routing every payload
56
+ * through here lets the handler know stdout is already spoken for.
57
+ */
58
+ export declare function emitJsonPayload(payload: unknown): void;
59
+ /** True once a command has written its `--json` payload to stdout. */
60
+ export declare function hasEmittedJsonPayload(): boolean;
61
+ /** Test seam — the flag is module state, so specs have to be able to clear it. */
62
+ export declare function resetJsonPayloadEmitted(): void;
63
+ /**
64
+ * Top-level handler for bin/mesh.ts. Prints the error (JSON when the
65
+ * invocation asked for --json anywhere, since per-command flags aren't
66
+ * parsed once dispatch has failed) and exits with the error's code.
67
+ *
68
+ * When the command already emitted a `--json` payload, that payload IS the
69
+ * machine surface — and it says strictly more than this error would (the
70
+ * doctor's payload carries `ok:false` plus a per-check `fix` command). So the
71
+ * error goes to stderr as human diagnostics and stdout keeps exactly one
72
+ * parseable document.
73
+ */
74
+ export declare function handleCliError(err: unknown): never;
75
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,WAAW;IAC1B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB;CAM/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAWpD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAEhD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAQpD;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAGtD;AAED,sEAAsE;AACtE,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED,kFAAkF;AAClF,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAQlD"}