@mesh-tech/mesh-cli 0.1.1 → 0.12.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 (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 +20826 -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 +21 -0
  63. package/dist/src/commands/install-shim.d.ts.map +1 -0
  64. package/dist/src/commands/install-shim.js +132 -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 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,OAAO,EAGL,kBAAkB,EACnB,MAAM,4BAA4B,CAAC;AAMpC,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5C,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAgCD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAM7E;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,uFAAuF;IACvF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,KAAK,CAAC,EAAE,OAAO,kBAAkB,CAAC;IAClC,kDAAkD;IAClD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAqFzB;AA6HD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8G3D"}
@@ -0,0 +1,370 @@
1
+ /**
2
+ * mesh init app-tenant — the doctor for a tenant apps repo (design §3.1,
3
+ * AC A1–A3).
4
+ *
5
+ * Runs a read-only check pipeline; every failure names the exact `mesh`
6
+ * command that fixes it (never a person — A2). Re-running IS the doctor
7
+ * (A3): exit 0 iff everything passes. `--json` is the agent surface (A5);
8
+ * `--fix` applies the developer-scope fixes directly (registry token
9
+ * refresh, skills sync) and leaves operator actions as remediations.
10
+ *
11
+ * Checks (API-first; local platform = the same Hub API on localhost):
12
+ * 1. CLI auth — cached `mesh login` credentials for the context
13
+ * 2. Registry access — the CodeArtifact token in ~/.npmrc is accepted by the
14
+ * registry (a live probe, not a substring match — an
15
+ * expired token used to report `pass`); local: skipped
16
+ * 2b. Public npm not hijacked — no unscoped `registry=<codeartifact>` in
17
+ * ~/.npmrc making CodeArtifact the DEFAULT registry
18
+ * 3. Platform tenant — Hub API /tenants (the platform registry)
19
+ * 4. App tenant — tenant present in the Hub registry
20
+ * 5. Deployer role — mesh:deployerRole config present (cloud contexts)
21
+ * 6. Repo shape — pnpm workspace + apps layout create-app expects
22
+ * 7. Skills wired — `mesh skills sync --check`
23
+ */
24
+ import chalk from "chalk";
25
+ import * as fs from "fs";
26
+ import * as path from "path";
27
+ import { logInfo } from "../utils/log.js";
28
+ import { MeshCliError, emitJsonPayload } from "../utils/errors.js";
29
+ import { findUnscopedCodeArtifactRegistry, homeNpmrcPath, probeRegistryToken, } from "../utils/auth-preflight.js";
30
+ import { readCredentials } from "./login.js";
31
+ import { resolveTargetRoot, syncSkills } from "./skills.js";
32
+ import { detectLocalTenant } from "./local/dev-local.js";
33
+ import { LOGIN_CONTEXT } from "./local/seed-zitadel.js";
34
+ const LOCAL_HUB_API = "http://localhost:4568";
35
+ function isLocalContext(context) {
36
+ return context === LOGIN_CONTEXT;
37
+ }
38
+ async function probeHubTenants(hubUrl, accessToken) {
39
+ try {
40
+ const response = await fetch(`${hubUrl}/tenants`, {
41
+ headers: accessToken ? { Authorization: `Bearer ${accessToken}` } : {},
42
+ signal: AbortSignal.timeout(5000),
43
+ });
44
+ if (response.status === 401)
45
+ return { ok: false, reason: "unauthenticated against the Hub API" };
46
+ if (!response.ok)
47
+ return { ok: false, reason: `Hub API returned ${response.status}` };
48
+ return { ok: true, tenants: (await response.json()) };
49
+ }
50
+ catch {
51
+ return { ok: false, reason: `Hub API unreachable at ${hubUrl}` };
52
+ }
53
+ }
54
+ function readHomeNpmrc() {
55
+ try {
56
+ return fs.readFileSync(homeNpmrcPath(), "utf-8");
57
+ }
58
+ catch {
59
+ return "";
60
+ }
61
+ }
62
+ /**
63
+ * The remediation string the doctor prints for a registry fault. It must render
64
+ * the command `--fix` actually executes: `runRegistryLogin` is called with the
65
+ * doctor's own `--profile` (or none), so advertising a hardcoded
66
+ * `--profile mesh-dev` would be a command the doctor never runs.
67
+ */
68
+ export function registryFixCommand(profile, context) {
69
+ // Context first: `--fix` calls runRegistryLogin(ctx, …), and a context-less
70
+ // `mesh registry login` skips the broker entirely — so advertising the bare
71
+ // form sends someone with no AWS account to a command that cannot work.
72
+ const base = context ? `mesh registry login ${context}` : "mesh registry login";
73
+ return profile ? `${base} --profile ${profile}` : base;
74
+ }
75
+ /**
76
+ * The two registry checks, exported for tests.
77
+ *
78
+ * 1. **Registry access** — does the token in ~/.npmrc actually work? The old
79
+ * check was `content.includes("codeartifact")`, which reports `pass` for a
80
+ * token that expired two days ago. `probeRegistryToken` asks the registry.
81
+ * 2. **Public npm not hijacked** — is there an *unscoped* `registry=` line
82
+ * pointing at CodeArtifact? A bare `aws codeartifact login` (no
83
+ * `--namespace @mesh-tech`) writes one, which routes every public package
84
+ * through CodeArtifact and makes the whole of npm 401 at the 12h token
85
+ * expiry. `mesh registry login` now removes it, so it is the fix for both.
86
+ */
87
+ export async function registryChecks(args) {
88
+ const { context, fix, profile } = args;
89
+ const probe = args.probe ?? probeRegistryToken;
90
+ const login = args.login ??
91
+ (async (ctx) => {
92
+ const { runRegistryLogin } = await import("./registry.js");
93
+ await runRegistryLogin(ctx, profile ? { profile } : {});
94
+ });
95
+ // The command we ADVERTISE must be the command `--fix` RUNS — otherwise the
96
+ // doctor tells you to pass a profile it then silently drops.
97
+ const REGISTRY_FIX = registryFixCommand(profile, context);
98
+ let tokenState = await probe({ npmrcPath: homeNpmrcPath() });
99
+ let hijack = findUnscopedCodeArtifactRegistry(readHomeNpmrc());
100
+ let repaired = false;
101
+ let loginError = null;
102
+ // One login repairs both: it refreshes the token AND strips the unscoped line.
103
+ if (fix && (tokenState.state === "expired" || tokenState.state === "missing" || hijack)) {
104
+ try {
105
+ await login(context);
106
+ repaired = true;
107
+ tokenState = await probe({ npmrcPath: homeNpmrcPath() });
108
+ hijack = findUnscopedCodeArtifactRegistry(readHomeNpmrc());
109
+ }
110
+ catch (err) {
111
+ loginError = err instanceof Error ? err.message : String(err);
112
+ }
113
+ }
114
+ const suffix = repaired ? " (--fix)" : "";
115
+ const checks = [];
116
+ if (loginError) {
117
+ checks.push({
118
+ name: "Registry access",
119
+ status: "fail",
120
+ detail: `token refresh failed: ${loginError}`,
121
+ fix: REGISTRY_FIX,
122
+ });
123
+ }
124
+ else if (tokenState.state === "fresh") {
125
+ checks.push({
126
+ name: "Registry access",
127
+ status: "pass",
128
+ detail: `CodeArtifact token in ~/.npmrc is accepted by the registry${suffix}`,
129
+ });
130
+ }
131
+ else if (tokenState.state === "unreachable") {
132
+ // A network fault is not an auth fault — don't send someone to `aws sso login`.
133
+ checks.push({
134
+ name: "Registry access",
135
+ status: "warn",
136
+ detail: `could not reach the registry to verify the token (${tokenState.detail ?? "unknown error"})`,
137
+ fix: REGISTRY_FIX,
138
+ });
139
+ }
140
+ else {
141
+ checks.push({
142
+ name: "Registry access",
143
+ status: "fail",
144
+ detail: tokenState.state === "expired"
145
+ ? `the CodeArtifact token in ~/.npmrc is expired (${tokenState.detail ?? "rejected by the registry"})`
146
+ : "no CodeArtifact token in ~/.npmrc",
147
+ fix: REGISTRY_FIX,
148
+ });
149
+ }
150
+ checks.push(hijack
151
+ ? {
152
+ name: "Public npm not hijacked",
153
+ status: "fail",
154
+ detail: `~/.npmrc makes CodeArtifact the DEFAULT registry (${hijack.trim()}) — every public ` +
155
+ "package resolves through it and 401s when the 12h token expires",
156
+ fix: REGISTRY_FIX,
157
+ }
158
+ : {
159
+ name: "Public npm not hijacked",
160
+ status: "pass",
161
+ detail: `no unscoped CodeArtifact registry= in ~/.npmrc${repaired ? " (--fix removed it)" : ""}`,
162
+ });
163
+ return checks;
164
+ }
165
+ async function runChecks(args) {
166
+ const { root, tenant, context, hubUrl, fix, profile } = args;
167
+ const checks = [];
168
+ const local = isLocalContext(context);
169
+ // 1. CLI auth
170
+ const creds = readCredentials(context);
171
+ const expired = creds ? new Date(creds.expiresAt).getTime() < Date.now() : true;
172
+ checks.push(creds && !expired
173
+ ? { name: "CLI auth", status: "pass", detail: `logged in (${context}${creds.email ? `, ${creds.email}` : ""})` }
174
+ : {
175
+ name: "CLI auth",
176
+ status: "fail",
177
+ detail: creds ? `credentials for '${context}' are expired` : `no credentials for context '${context}'`,
178
+ fix: `mesh login ${context}`,
179
+ });
180
+ const accessToken = creds && !expired ? creds.accessToken : null;
181
+ // 2 + 2b. Registry access (CodeArtifact) — the local platform has no registry
182
+ if (local) {
183
+ checks.push({ name: "Registry access", status: "pass", detail: "local context — no registry required" });
184
+ checks.push({ name: "Public npm not hijacked", status: "pass", detail: "local context — no registry required" });
185
+ }
186
+ else {
187
+ checks.push(...(await registryChecks({ context, fix, profile })));
188
+ }
189
+ // 3 + 4. Platform tenant + app tenant via the Hub API (the registry)
190
+ const hub = await probeHubTenants(hubUrl, accessToken);
191
+ if (!hub.ok) {
192
+ const fixCmd = local ? "mesh start" : `mesh login ${context}`;
193
+ checks.push({ name: "Platform reachable", status: "fail", detail: hub.reason, fix: fixCmd });
194
+ checks.push({
195
+ name: `App tenant '${tenant}'`,
196
+ status: "warn",
197
+ detail: "not verifiable while the platform registry is unreachable",
198
+ fix: fixCmd,
199
+ });
200
+ }
201
+ else {
202
+ checks.push({
203
+ name: "Platform reachable",
204
+ status: "pass",
205
+ detail: `Hub API at ${hubUrl} (${hub.tenants.length} tenant(s) registered)`,
206
+ });
207
+ const registered = hub.tenants.some((t) => t.name === tenant);
208
+ checks.push(registered
209
+ ? { name: `App tenant '${tenant}'`, status: "pass", detail: "registered in the platform registry" }
210
+ : {
211
+ name: `App tenant '${tenant}'`,
212
+ status: local ? "warn" : "fail",
213
+ detail: local
214
+ ? "not registered yet — auto-created on the first `mesh dev` run of an app in this repo"
215
+ : "not registered — register it on the platform stack and deploy",
216
+ fix: local ? "mesh dev" : `mesh tenant add ${tenant} # in the platform repo, then: mesh deploy up`,
217
+ });
218
+ }
219
+ // 5. Deployer role (cloud contexts only — local has no IAM)
220
+ if (local) {
221
+ checks.push({ name: "Deployer role", status: "pass", detail: "local context — no deployer role required" });
222
+ }
223
+ else {
224
+ const stackFiles = fs.existsSync(root)
225
+ ? fs.readdirSync(root).filter((f) => /^Pulumi\..*\.yaml$/.test(f))
226
+ : [];
227
+ const hasRole = stackFiles.some((f) => /mesh:deployerRole/.test(fs.readFileSync(path.join(root, f), "utf-8")));
228
+ checks.push(hasRole
229
+ ? { name: "Deployer role", status: "pass", detail: "mesh:deployerRole configured in stack config" }
230
+ : {
231
+ name: "Deployer role",
232
+ status: "warn",
233
+ detail: "no mesh:deployerRole in Pulumi.*.yaml — `mesh deploy` will not be able to assume a role",
234
+ fix: "mesh create-app # scaffolds stack config with the deployer role",
235
+ });
236
+ }
237
+ // 6. Repo shape (what create-app/mesh dev expect)
238
+ const shapeProblems = [];
239
+ if (!fs.existsSync(path.join(root, "package.json")))
240
+ shapeProblems.push("package.json");
241
+ const hasWorkspace = fs.existsSync(path.join(root, "pnpm-workspace.yaml")) ||
242
+ fs.existsSync(path.join(root, "pnpm-lock.yaml"));
243
+ if (!hasWorkspace)
244
+ shapeProblems.push("pnpm-workspace.yaml");
245
+ checks.push(shapeProblems.length === 0
246
+ ? { name: "Repo shape", status: "pass", detail: "pnpm workspace layout present" }
247
+ : {
248
+ name: "Repo shape",
249
+ status: "warn",
250
+ detail: `missing: ${shapeProblems.join(", ")}`,
251
+ fix: "mesh create-app # scaffold an app (workspace files included)",
252
+ });
253
+ // 7. Skills wired
254
+ const skillsOk = fix ? syncSkills(root) : syncSkills(root, { check: true });
255
+ checks.push(skillsOk
256
+ ? { name: "Agent skills", status: "pass", detail: "base skills + Intent discovery in sync" }
257
+ : {
258
+ name: "Agent skills",
259
+ status: fix ? "pass" : "fail",
260
+ detail: fix ? "synced (--fix)" : "missing or stale",
261
+ fix: "mesh skills sync",
262
+ });
263
+ return checks;
264
+ }
265
+ export function registerInitCommands(program) {
266
+ const init = program.command("init").description("Initialize / diagnose a repo against the Mesh platform");
267
+ init
268
+ .command("platform <tenant>")
269
+ .description("Scaffold a tenant PLATFORM repo (core + platform Pulumi layers on @mesh-tech/infra-components) that deploys with `mesh deploy` unmodified — the proven mesh-sandbox shape, annotated.")
270
+ .option("--env <env>", "environment the first stack targets", "dev")
271
+ .option("--region <region>", "AWS region", "us-east-2")
272
+ .option("--domain <domain>", "base public domain (ingress zone becomes {env}.{domain})", "example.com")
273
+ .option("--profile <profile>", "AWS profile the stack config references", "default")
274
+ .option("--state-bucket <bucket>", "Pulumi state S3 bucket (created by an operator)", undefined)
275
+ .option("--dir <path>", "target directory (default: ./{tenant}-mesh-platform)")
276
+ .action(async (tenant, opts) => {
277
+ if (!/^[a-z][a-z0-9-]*$/.test(tenant)) {
278
+ throw new MeshCliError(`Invalid tenant name '${tenant}' (lowercase alphanumeric + dashes).`);
279
+ }
280
+ const targetDir = path.resolve(opts.dir ?? `${tenant}-mesh-platform`);
281
+ if (fs.existsSync(targetDir) && fs.readdirSync(targetDir).length > 0) {
282
+ throw new MeshCliError(`Target directory is not empty: ${targetDir}`, {
283
+ remediation: { command: `mesh init platform ${tenant} --dir <empty-dir>` },
284
+ });
285
+ }
286
+ const { copyTemplate } = await import("./create-app.js");
287
+ const { findPackageRoot } = await import("./local/stack.js");
288
+ const templateDir = path.join(findPackageRoot(), "templates", "platform-repo");
289
+ const context = {
290
+ tenant,
291
+ env: opts.env,
292
+ region: opts.region,
293
+ domain: opts.domain,
294
+ profile: opts.profile,
295
+ stateBucket: opts.stateBucket ?? `${tenant}-mesh-platform-pulumi-state`,
296
+ };
297
+ fs.mkdirSync(targetDir, { recursive: true });
298
+ copyTemplate(templateDir, targetDir, context);
299
+ syncSkills(targetDir);
300
+ logInfo(`Platform repo scaffolded at ${targetDir}`);
301
+ console.log("");
302
+ console.log("Next steps:");
303
+ console.log(` cd ${path.relative(process.cwd(), targetDir) || "."}`);
304
+ console.log(` mesh login ${tenant}.${opts.env} # or an operator context with access`);
305
+ console.log(" pnpm install");
306
+ console.log(" cd core && mesh deploy up");
307
+ console.log(" cd ../platform && mesh deploy up");
308
+ console.log("");
309
+ logInfo(`Review the annotated stack configs (Pulumi.${tenant}-${opts.env}.yaml) before the first deploy.`);
310
+ });
311
+ init
312
+ .command("app-tenant")
313
+ .description("Check (and with --fix, repair) everything an app-tenant repo needs: auth, registry, tenant registration, repo shape, agent skills. Re-run any time — it is the doctor.")
314
+ .option("--tenant <name>", "app tenant (default: mesh:tenant from Pulumi config, else 'local')")
315
+ .option("--context <ctx>", "login context to check against (default: 'local' when the local platform is targeted)", LOGIN_CONTEXT)
316
+ .option("--hub-url <url>", "platform Hub API base URL", LOCAL_HUB_API)
317
+ .option("--fix", "apply developer-scope fixes (registry token, skills sync)", false)
318
+ .option("--profile <profile>", "AWS SSO profile --fix logs into CodeArtifact with (e.g. mesh-dev)")
319
+ .option("--json", "machine-readable output", false)
320
+ .action(async (opts) => {
321
+ const root = resolveTargetRoot();
322
+ const tenant = opts.tenant ?? detectLocalTenant(root);
323
+ if (!opts.json) {
324
+ logInfo(`Checking app-tenant repo ${root} (tenant '${tenant}', context '${opts.context}')…`);
325
+ }
326
+ // Under --json, stdout is the machine surface (A5): route the check
327
+ // helpers' human chatter (syncSkills / registry login logInfo etc.) to
328
+ // stderr so stdout stays pure parseable JSON.
329
+ const origLog = console.log;
330
+ if (opts.json)
331
+ console.log = (...a) => console.error(...a);
332
+ let checks;
333
+ try {
334
+ checks = await runChecks({
335
+ root,
336
+ tenant,
337
+ context: opts.context,
338
+ hubUrl: opts.hubUrl.replace(/\/+$/, ""),
339
+ fix: opts.fix,
340
+ profile: opts.profile,
341
+ });
342
+ }
343
+ finally {
344
+ console.log = origLog;
345
+ }
346
+ // Warns are advisory (expected on a fresh repo pre-`mesh dev`): only
347
+ // hard failures gate the exit code (A3). `ok` mirrors that contract.
348
+ const ok = !checks.some((c) => c.status === "fail");
349
+ if (opts.json) {
350
+ emitJsonPayload({ ok, root, tenant, context: opts.context, checks });
351
+ }
352
+ else {
353
+ console.log("");
354
+ for (const check of checks) {
355
+ const icon = check.status === "pass" ? chalk.green("✔") : check.status === "warn" ? chalk.yellow("▲") : chalk.red("✘");
356
+ console.log(` ${icon} ${check.name.padEnd(24)} ${check.detail}`);
357
+ if (check.fix && check.status !== "pass") {
358
+ console.log(` ${chalk.dim("→ run:")} ${chalk.cyan(check.fix)}`);
359
+ }
360
+ }
361
+ console.log("");
362
+ }
363
+ if (!ok) {
364
+ throw new MeshCliError("app-tenant checks failed — apply the fixes above and re-run.", {
365
+ remediation: { command: "mesh init app-tenant --fix" },
366
+ });
367
+ }
368
+ });
369
+ }
370
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * `mesh install-shim` — make bare `mesh` work on the PATH without a build.
4
+ *
5
+ * People and agents reach for `mesh dev`, not `pnpm exec mesh dev`. Getting a
6
+ * bare `mesh` onto the PATH inherently needs one PATH entry — but it can be a
7
+ * build-free, cwd-aware resolver: a tiny shell script that, on each run, walks
8
+ * up from the current directory to the nearest workspace `node_modules/.bin/mesh`
9
+ * and execs it. That `.bin/mesh` is the `bin/mesh.mjs` launcher, which runs the
10
+ * CLI from TypeScript source — so bare `mesh` always runs the LOCAL source of
11
+ * whatever worktree/app you are in, with no build and nothing global to keep in
12
+ * sync (MESH-2261). Run this once; it survives worktree switches and pulls.
13
+ */
14
+ /** The cwd-aware resolver written to the PATH. Pure so it can be unit-tested. */
15
+ export declare function shimScript(): string;
16
+ /** Default install target: ~/.local/bin (conventional per-user PATH dir). */
17
+ export declare function defaultShimDir(): string;
18
+ /** True if `dir` is a component of the PATH env string. */
19
+ export declare function dirOnPath(dir: string, pathEnv: string | undefined): boolean;
20
+ export declare function registerInstallShimCommand(program: Command): void;
21
+ //# sourceMappingURL=install-shim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-shim.d.ts","sourceRoot":"","sources":["../../../src/commands/install-shim.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC;;;;;;;;;;;GAWG;AAEH,iFAAiF;AACjF,wBAAgB,UAAU,IAAI,MAAM,CAkBnC;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,2DAA2D;AAC3D,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAG3E;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmFjE"}
@@ -0,0 +1,132 @@
1
+ import { execFileSync } from "child_process";
2
+ import * as fs from "fs";
3
+ import * as os from "os";
4
+ import * as path from "path";
5
+ import { logError, logInfo, logSuccess, logWarn } from "../utils/log.js";
6
+ /**
7
+ * `mesh install-shim` — make bare `mesh` work on the PATH without a build.
8
+ *
9
+ * People and agents reach for `mesh dev`, not `pnpm exec mesh dev`. Getting a
10
+ * bare `mesh` onto the PATH inherently needs one PATH entry — but it can be a
11
+ * build-free, cwd-aware resolver: a tiny shell script that, on each run, walks
12
+ * up from the current directory to the nearest workspace `node_modules/.bin/mesh`
13
+ * and execs it. That `.bin/mesh` is the `bin/mesh.mjs` launcher, which runs the
14
+ * CLI from TypeScript source — so bare `mesh` always runs the LOCAL source of
15
+ * whatever worktree/app you are in, with no build and nothing global to keep in
16
+ * sync (MESH-2261). Run this once; it survives worktree switches and pulls.
17
+ */
18
+ /** The cwd-aware resolver written to the PATH. Pure so it can be unit-tested. */
19
+ export function shimScript() {
20
+ return `#!/bin/sh
21
+ # mesh — canonical launcher shim (installed by \`mesh install-shim\`, MESH-2261).
22
+ # Walks up from the current directory to the nearest workspace mesh CLI and runs
23
+ # it. That resolves to bin/mesh.mjs, which runs the CLI from TypeScript source —
24
+ # so this always runs the LOCAL source of whatever worktree/app you are in, with
25
+ # no build step. Nothing here is version-pinned; do not edit by hand.
26
+ dir=$(pwd)
27
+ while [ "$dir" != "/" ]; do
28
+ if [ -x "$dir/node_modules/.bin/mesh" ]; then
29
+ exec "$dir/node_modules/.bin/mesh" "$@"
30
+ fi
31
+ dir=$(dirname "$dir")
32
+ done
33
+ echo "mesh: not inside a Mesh workspace (no node_modules/.bin/mesh found)." >&2
34
+ echo " cd into your app/repo (after 'pnpm install'), or run 'pnpm exec mesh'." >&2
35
+ exit 1
36
+ `;
37
+ }
38
+ /** Default install target: ~/.local/bin (conventional per-user PATH dir). */
39
+ export function defaultShimDir() {
40
+ return path.join(os.homedir(), ".local", "bin");
41
+ }
42
+ /** True if `dir` is a component of the PATH env string. */
43
+ export function dirOnPath(dir, pathEnv) {
44
+ if (!pathEnv)
45
+ return false;
46
+ return pathEnv.split(path.delimiter).some((p) => p === dir);
47
+ }
48
+ export function registerInstallShimCommand(program) {
49
+ program
50
+ .command("install-shim")
51
+ .description("Install a build-free `mesh` shim on your PATH so bare `mesh` runs the local source")
52
+ .option("--dir <dir>", "Directory to install into (must be on your PATH)", defaultShimDir())
53
+ .option("-f, --force", "Overwrite an existing file at the target path", false)
54
+ .action((opts) => {
55
+ const dir = path.resolve(opts.dir);
56
+ const target = path.join(dir, "mesh");
57
+ if (fs.existsSync(target) && !opts.force) {
58
+ logWarn(`A file already exists at ${target}.`);
59
+ logInfo("Re-run with --force to overwrite it, or pass --dir <other-path-on-PATH>.");
60
+ return;
61
+ }
62
+ try {
63
+ fs.mkdirSync(dir, { recursive: true });
64
+ fs.writeFileSync(target, shimScript(), { mode: 0o755 });
65
+ fs.chmodSync(target, 0o755);
66
+ }
67
+ catch (err) {
68
+ logError(`Could not write the shim to ${target}: ${err.message}`);
69
+ process.exitCode = 1;
70
+ return;
71
+ }
72
+ logSuccess(`Installed mesh shim → ${target}`);
73
+ if (!dirOnPath(dir, process.env.PATH)) {
74
+ logWarn(`${dir} is not on your PATH.`);
75
+ logInfo(`Add it, e.g.: echo 'export PATH="${dir}:$PATH"' >> ~/.zshrc && source ~/.zshrc`);
76
+ }
77
+ else {
78
+ logInfo("Bare `mesh <cmd>` now runs the local source of whatever workspace you're in.");
79
+ }
80
+ // Post-install self-test: run the freshly installed shim and record a full
81
+ // diagnostic (env + stdout/stderr + exit) to a file, so a failure is
82
+ // debuggable without copy-pasting terminal output.
83
+ const diagPath = path.join(os.tmpdir(), "mesh-shim-selftest.log");
84
+ let stdout = "";
85
+ let stderr = "";
86
+ let status = 0;
87
+ let ok = true;
88
+ try {
89
+ stdout = execFileSync(target, ["--help"], {
90
+ cwd: process.cwd(),
91
+ encoding: "utf8",
92
+ stdio: ["ignore", "pipe", "pipe"],
93
+ });
94
+ }
95
+ catch (err) {
96
+ ok = false;
97
+ const e = err;
98
+ status = typeof e.status === "number" ? e.status : 1;
99
+ stdout = e.stdout?.toString?.() ?? "";
100
+ stderr = e.stderr?.toString?.() ?? String(e.message ?? err);
101
+ }
102
+ const diag = [
103
+ `mesh install-shim self-test — ${new Date().toISOString()}`,
104
+ `cwd: ${process.cwd()}`,
105
+ `shim: ${target}`,
106
+ `node: ${process.execPath} (${process.version})`,
107
+ `PATH: ${process.env.PATH ?? ""}`,
108
+ `command: mesh --help`,
109
+ `exit: ${status}`,
110
+ `--- stdout (${stdout.length} bytes) ---`,
111
+ stdout,
112
+ `--- stderr (${stderr.length} bytes) ---`,
113
+ stderr,
114
+ "",
115
+ ].join("\n");
116
+ try {
117
+ fs.writeFileSync(diagPath, diag);
118
+ }
119
+ catch {
120
+ /* diagnostics are best-effort */
121
+ }
122
+ if (ok && /Commands:|Usage:/.test(stdout)) {
123
+ logSuccess(`Self-test passed: \`mesh --help\` ran cleanly. Diagnostic: ${diagPath}`);
124
+ }
125
+ else {
126
+ logError(`Self-test FAILED (exit ${status}). Full diagnostic written to:`);
127
+ logError(` ${diagPath}`);
128
+ process.exitCode = 1;
129
+ }
130
+ });
131
+ }
132
+ //# sourceMappingURL=install-shim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-shim.js","sourceRoot":"","sources":["../../../src/commands/install-shim.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * App-tenant auth auto-provisioning for the local platform — the local analog
3
+ * of what the Pulumi components do in the cloud, per the approved Zitadel
4
+ * tenant-auth pattern (Org / Project / Application / Service User):
5
+ *
6
+ * Org = app tenant (ZitadelTenantIdentity parity)
7
+ * Project = one per app, (ZitadelAppIdentity parity —
8
+ * name = authz schema namespace the app IS the authz boundary)
9
+ * Application = one per service inside it (API app, Basic creds)
10
+ * Secret = mesh/{tenant}/{env}/apps/{app}/zitadel/{service}
11
+ * (ministack Secrets Manager — same canonical path as cloud)
12
+ *
13
+ * `mesh dev --local` calls this on startup so scaffolding + running an app
14
+ * auto-creates its auth config — no Pulumi deploy, no manual Zitadel steps.
15
+ * Idempotent: search-before-create everywhere; the credential secret is only
16
+ * written when the application is first created (Zitadel returns the secret
17
+ * once).
18
+ */
19
+ export interface AppTenantAuthArgs {
20
+ /** App tenant (org name), e.g. "acme" */
21
+ tenant: string;
22
+ /** App name = project name = authz schema namespace */
23
+ app: string;
24
+ /** Service names → one API application each (api, worker, …) */
25
+ services: string[];
26
+ /**
27
+ * App-declared project roles (package.json → mesh.auth.roles). Created on
28
+ * the app's Zitadel project and granted to the local `{app}-m2m` caller so
29
+ * role-scoped services (roles claim → scopes) accept its tokens.
30
+ */
31
+ roles?: string[];
32
+ }
33
+ export interface ProvisionedAuth {
34
+ orgId: string;
35
+ projectId: string;
36
+ /** Services whose application (and secret) was created this run */
37
+ created: string[];
38
+ }
39
+ export declare function authSecretPath(tenant: string, app: string, service: string): string;
40
+ /**
41
+ * Register the running app in the local platform registry — the same
42
+ * self-registration path deployed apps use (/mesh-platform/{tenant}/{env}/
43
+ * apps/{app}/meta), so StackPort (and the local Hub once its images land)
44
+ * can visualize local apps.
45
+ */
46
+ export declare function registerLocalApp(args: AppTenantAuthArgs & {
47
+ ports?: Record<string, number>;
48
+ /** ExternalService names the app's services consume (ExternalService.link()
49
+ * parity) — the Hub derives Integrations consumers + uptime from these. */
50
+ links?: string[];
51
+ }): Promise<string>;
52
+ /**
53
+ * Reconcile the platform registry from Zitadel — every app-tenant org (and
54
+ * its projects = apps, applications = services) provisioned in Zitadel gets
55
+ * a Hub-readable registration, even if the app hasn't been run since it was
56
+ * provisioned. Zitadel is the auth source of truth; the registry mirrors it,
57
+ * exactly like the cloud where ZitadelTenantIdentity/ZitadelAppIdentity and
58
+ * the app's self-registration both flow from the same deploy. Idempotent:
59
+ * existing per-stack registrations (which carry live ports/URLs from
60
+ * `mesh dev --local`) are never overwritten.
61
+ */
62
+ export declare function reconcileRegistryFromZitadel(): Promise<{
63
+ tenants: string[];
64
+ apps: number;
65
+ }>;
66
+ /**
67
+ * Ensure the app tenant's full auth config exists (org → project →
68
+ * application-per-service → credential secrets).
69
+ */
70
+ export declare function ensureAppTenantAuth(args: AppTenantAuthArgs): Promise<ProvisionedAuth>;
71
+ //# sourceMappingURL=auth-provision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-provision.d.ts","sourceRoot":"","sources":["../../../../src/commands/local/auth-provision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAOH,MAAM,WAAW,iBAAiB;IAChC,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnF;AA6KD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,iBAAiB,GAAG;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B;+EAC2E;IAC3E,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB,GACA,OAAO,CAAC,MAAM,CAAC,CA2DjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,4BAA4B,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAsEjG;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC,CA+C3F"}