@mesh-tech/mesh-cli 0.1.0 → 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 +4 -0
  134. package/dist/src/commands/secrets/set.d.ts.map +1 -1
  135. package/dist/src/commands/secrets/set.js +243 -64
  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 +35 -21
  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,233 @@
1
+ /**
2
+ * Doc-root discovery.
3
+ *
4
+ * The one rule of the portal: **a directory publishes its markdown if, and
5
+ * only if, it contains a `docs.json`.** This module finds those directories,
6
+ * validates their declarations, and walks them for publishable pages —
7
+ * skipping any path with a reserved segment (at any depth) and any `README.md`
8
+ * (a README is the directory's GitHub face, not portal content; a root that
9
+ * wants one published names it in `include[]`, the escape hatch).
10
+ *
11
+ * Discovery is purely about *which files* publish. Reading their content —
12
+ * titles, front-matter, links — is assembly's job (`assemble.ts`).
13
+ */
14
+ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
15
+ import path from "node:path";
16
+ import { docsJsonSchema, hasReservedSegment, slugify } from "./schema.js";
17
+ /**
18
+ * Directories the walk never descends into while LOOKING FOR roots. This list
19
+ * is about walk performance and sanity (`.git`, build output), and is
20
+ * deliberately separate from the reserved list, which is about publish
21
+ * safety. `node_modules` is on both: it is huge, and it must never publish.
22
+ */
23
+ const ROOT_WALK_SKIP = new Set([
24
+ ".git",
25
+ "node_modules",
26
+ "dist",
27
+ ".turbo",
28
+ ".next",
29
+ ".deploy",
30
+ ".generated",
31
+ "coverage",
32
+ ".portal",
33
+ ".vercel",
34
+ ".wrangler",
35
+ ]);
36
+ /**
37
+ * The route a page gets inside its section: the path relative to the root,
38
+ * each segment slugified, the `.md` dropped, and a trailing `index` collapsed
39
+ * so a directory's index page serves at the directory's route.
40
+ */
41
+ export function routePathFor(relPath) {
42
+ const withoutExt = relPath.replace(/\.md$/i, "");
43
+ const parts = withoutExt.split("/").map(slugify);
44
+ // A trailing `index` segment collapses: the file serves at its directory's
45
+ // route (a root-level index.md is the section's own landing page).
46
+ if (parts[parts.length - 1] === "index")
47
+ parts.pop();
48
+ return parts.join("/");
49
+ }
50
+ /** Recursively collect `*.md` files under `dir`, skipping reserved segments. */
51
+ function walkMarkdown(absDir, relDir, errors, rootDir) {
52
+ const out = [];
53
+ let entries;
54
+ try {
55
+ entries = readdirSync(absDir, { withFileTypes: true });
56
+ }
57
+ catch {
58
+ return out;
59
+ }
60
+ for (const entry of entries) {
61
+ const rel = relDir ? `${relDir}/${entry.name}` : entry.name;
62
+ if (hasReservedSegment(entry.name)) {
63
+ // Reserved names are silently skipped in the walk — exclusion here is
64
+ // the normal case, not an error. The gate separately asserts that
65
+ // nothing reserved ever reaches the OUTPUT (fail-closed).
66
+ continue;
67
+ }
68
+ const abs = path.join(absDir, entry.name);
69
+ if (entry.isDirectory()) {
70
+ if (entry.name === "node_modules" || entry.name.startsWith("."))
71
+ continue;
72
+ out.push(...walkMarkdown(abs, rel, errors, rootDir));
73
+ }
74
+ else if (entry.isFile() && entry.name.toLowerCase().endsWith(".md")) {
75
+ // A README is the directory's GitHub face — it does not publish via the
76
+ // walk. The include[] escape hatch is how a README becomes a page.
77
+ if (entry.name.toLowerCase() === "readme.md")
78
+ continue;
79
+ out.push(rel);
80
+ }
81
+ else if (entry.isFile() &&
82
+ entry.name === "docs.json" &&
83
+ relDir !== "" // the root's own docs.json is the declaration, not content
84
+ ) {
85
+ errors.push(`nested doc root: ${rootDir}/.../${rel} — a docs.json inside another doc root is ambiguous; give it its own sibling root or remove it`);
86
+ }
87
+ }
88
+ return out;
89
+ }
90
+ /**
91
+ * Find every doc root under `repoRoot`, validate it, and collect its pages.
92
+ *
93
+ * The walk looks for `docs.json` files anywhere in the repo (excluding the
94
+ * ROOT_WALK_SKIP directories), so a package opts in by adding one file and
95
+ * nothing else. Roots are sorted by (order, title); pages within a root are
96
+ * sorted by route path so assembly is deterministic.
97
+ */
98
+ export function discoverDocRoots(repoRoot) {
99
+ const errors = [];
100
+ const roots = [];
101
+ const findRoots = (absDir, relDir, insideReserved) => {
102
+ let entries;
103
+ try {
104
+ entries = readdirSync(absDir, { withFileTypes: true });
105
+ }
106
+ catch {
107
+ return;
108
+ }
109
+ const hasDocsJson = entries.some((e) => e.isFile() && e.name === "docs.json");
110
+ if (hasDocsJson) {
111
+ const rel = relDir || ".";
112
+ if (insideReserved || (relDir && hasReservedSegment(relDir))) {
113
+ // Fail-closed: a root under a reserved directory is the "mistake one"
114
+ // half of the leak scenario. Refusing it here means even a deliberate
115
+ // docs.json in docs/plans/ publishes nothing.
116
+ errors.push(`doc root ${rel}/ is under a reserved segment — it publishes nothing. Move the content out of the reserved directory instead.`);
117
+ }
118
+ else {
119
+ const root = loadRoot(absDir, rel, errors);
120
+ // An invalid declaration publishes NOTHING — assembling pages under a
121
+ // guessed title/slug could put content at routes nobody reviewed.
122
+ if (root)
123
+ roots.push(root);
124
+ }
125
+ // Never look for further roots inside a claimed root — a nested
126
+ // docs.json is reported by the page walk instead (ambiguous ownership).
127
+ return;
128
+ }
129
+ for (const entry of entries) {
130
+ if (!entry.isDirectory())
131
+ continue;
132
+ if (ROOT_WALK_SKIP.has(entry.name))
133
+ continue;
134
+ // Dot-directories are tooling, not content — ALL of them, so a
135
+ // .pi/docs.json is skipped here exactly like a .claude one. The page
136
+ // walk does the same, so a root found there could never publish anyway.
137
+ if (entry.name.startsWith("."))
138
+ continue;
139
+ const rel = relDir ? `${relDir}/${entry.name}` : entry.name;
140
+ findRoots(path.join(absDir, entry.name), rel, insideReserved || hasReservedSegment(entry.name));
141
+ }
142
+ };
143
+ findRoots(repoRoot, "", false);
144
+ const pages = [];
145
+ for (const root of roots) {
146
+ const absRoot = path.join(repoRoot, root.dir);
147
+ const relFiles = walkMarkdown(absRoot, "", errors, root.dir);
148
+ for (const relPath of relFiles.sort()) {
149
+ pages.push({
150
+ source: root.dir === "." ? relPath : `${root.dir}/${relPath}`,
151
+ root,
152
+ routePath: routePathFor(relPath),
153
+ included: false,
154
+ });
155
+ }
156
+ for (const includePath of root.config.include) {
157
+ const normalized = includePath
158
+ .replace(/\\/g, "/")
159
+ .replace(/^\.\//, "")
160
+ .replace(/\/+$/, "");
161
+ if (hasReservedSegment(normalized)) {
162
+ errors.push(`${root.dir}/docs.json includes ${normalized}, which is under a reserved segment — include[] cannot pull internal material into the site`);
163
+ continue;
164
+ }
165
+ if (!normalized.toLowerCase().endsWith(".md")) {
166
+ errors.push(`${root.dir}/docs.json includes ${normalized}, which is not a markdown file`);
167
+ continue;
168
+ }
169
+ if (!existsSync(path.join(repoRoot, normalized))) {
170
+ errors.push(`${root.dir}/docs.json includes ${normalized}, which does not exist`);
171
+ continue;
172
+ }
173
+ if (pages.some((p) => p.source === normalized))
174
+ continue; // walked already
175
+ const stem = path.posix.basename(normalized).replace(/\.md$/i, "");
176
+ pages.push({
177
+ source: normalized,
178
+ root,
179
+ // An included README is the section's index page — "a package README
180
+ // is its natural overview page". Anything else routes by its stem.
181
+ routePath: stem.toLowerCase() === "readme" ? "" : slugify(stem),
182
+ included: true,
183
+ });
184
+ }
185
+ }
186
+ // Route collisions are authoring mistakes two files cannot both survive —
187
+ // catch them at discovery so the failure names both sources.
188
+ const seenRoutes = new Map();
189
+ for (const page of pages) {
190
+ const route = [page.root.slug, page.routePath].filter(Boolean).join("/");
191
+ const existing = seenRoutes.get(route);
192
+ if (existing) {
193
+ errors.push(`route collision: ${page.source} and ${existing} both map to /${route || "(site root)"}`);
194
+ }
195
+ seenRoutes.set(route, page.source);
196
+ }
197
+ roots.sort((a, b) => a.config.order - b.config.order ||
198
+ a.config.title.localeCompare(b.config.title));
199
+ return { roots, pages, errors };
200
+ }
201
+ /** Parse and validate one root's docs.json. Returns null (and records why) when invalid — an invalid declaration publishes nothing. */
202
+ function loadRoot(absDir, relDir, errors) {
203
+ const configPath = path.join(absDir, "docs.json");
204
+ let raw;
205
+ try {
206
+ raw = JSON.parse(readFileSync(configPath, "utf-8"));
207
+ }
208
+ catch (error) {
209
+ errors.push(`${relDir}/docs.json is not valid JSON: ${error instanceof Error ? error.message : String(error)}`);
210
+ return null;
211
+ }
212
+ const parsed = docsJsonSchema.safeParse(raw);
213
+ if (!parsed.success) {
214
+ for (const issue of parsed.error.issues) {
215
+ errors.push(`${relDir}/docs.json: ${issue.path.join(".") || "(root)"}: ${issue.message}`);
216
+ }
217
+ return null;
218
+ }
219
+ const config = parsed.data;
220
+ const slug = config.slug ?? slugify(config.title);
221
+ return { dir: relDir, config, slug };
222
+ }
223
+ /** What exists at `candidate`, or null. Link resolution needs the file/dir split for blob-vs-tree URLs. */
224
+ export function pathKind(candidate) {
225
+ try {
226
+ const stat = statSync(candidate);
227
+ return stat.isDirectory() ? "dir" : "file";
228
+ }
229
+ catch {
230
+ return null;
231
+ }
232
+ }
233
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../src/docs/discover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * `mesh docs portal` — assemble the developer portal from the repo's
3
+ * docs.json-discovered markdown and hand it to the renderer (Zudoku) to build
4
+ * or serve.
5
+ *
6
+ * Modes:
7
+ *
8
+ * mesh docs portal assemble → `zudoku build` → apps/docs/dist
9
+ * mesh docs portal --serve assemble → `zudoku dev` (local preview)
10
+ * mesh docs portal --assemble-only assemble and stop (content/, config,
11
+ * manifests) — what CI runs before `build`
12
+ * mesh docs portal --check the CI gate: assemble to a scratch dir and
13
+ * fail on any of the four assertions below
14
+ *
15
+ * The four --check assertions, any of which exits non-zero:
16
+ * 1. a docs.json fails schema validation (or any other discovery error)
17
+ * 2. an assembled output path contains a reserved segment (fail-closed —
18
+ * internal material must never be publishable)
19
+ * 3. an internal link resolves to nothing
20
+ * 4. the committed CLI reference is stale (the command tree drifted)
21
+ *
22
+ * Assembly always writes `publish-manifest.json` — every source path that
23
+ * made it into the site — which CI uploads as an artifact; on PRs
24
+ * `--diff-base <ref>` also prints the added/removed published paths into the
25
+ * GitHub job summary.
26
+ */
27
+ import type { AssembleResult } from "./assemble.js";
28
+ /** The Zudoku app package directory, relative to the repo root. */
29
+ export declare const DOCS_APP_DIR = "apps/docs";
30
+ export interface PortalRunResult {
31
+ assembled: AssembleResult;
32
+ errors: string[];
33
+ }
34
+ /**
35
+ * Run discovery + assembly. Shared by every mode; the scratch-dir variant is
36
+ * what --check uses so the gate never depends on (or dirties) apps/docs.
37
+ */
38
+ export declare function runAssemble(args: {
39
+ repoRoot: string;
40
+ outDir: string;
41
+ configOut?: string;
42
+ writeFiles?: boolean;
43
+ }): PortalRunResult;
44
+ /** Print the assembly report: counts, external-link note, broken-link list. */
45
+ export declare function reportAssembly(result: PortalRunResult): void;
46
+ /**
47
+ * The --check gate. Returns the failure list (empty = pass). Also writes the
48
+ * job-summary publish-set diff when --diff-base names a ref and
49
+ * GITHUB_STEP_SUMMARY is writable.
50
+ */
51
+ export declare function checkPortal(args: {
52
+ repoRoot: string;
53
+ diffBase?: string | undefined;
54
+ printManifest?: boolean;
55
+ /** Stable path to write publish-manifest.json to (CI uploads it as an artifact). */
56
+ manifestOut?: string | undefined;
57
+ checkCliReference: () => Promise<string | null>;
58
+ }): Promise<string[]>;
59
+ export interface PortalCommandOptions {
60
+ out?: string | undefined;
61
+ assembleOnly?: boolean;
62
+ serve?: boolean;
63
+ port?: string;
64
+ check?: boolean;
65
+ printManifest?: boolean;
66
+ diffBase?: string | undefined;
67
+ manifestOut?: string | undefined;
68
+ }
69
+ /**
70
+ * The command body. Kept free of commander types so the test suite can drive
71
+ * it directly; `commands/docs.ts` is a thin flag adapter.
72
+ */
73
+ export declare function runPortalCommand(opts: PortalCommandOptions, deps: {
74
+ repoRoot: string;
75
+ checkCliReference: () => Promise<string | null>;
76
+ }): Promise<void>;
77
+ /** Re-exported so commands/docs.ts can wire the CLI-reference staleness check. */
78
+ export declare function cliReferenceStaleness(repoRoot: string): Promise<string | null>;
79
+ //# sourceMappingURL=portal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal.d.ts","sourceRoot":"","sources":["../../../src/docs/portal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAyBH,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,eAAe,CAAC;AAGrE,mEAAmE;AACnE,eAAO,MAAM,YAAY,cAAc,CAAC;AAWxC,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,cAAc,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,eAAe,CAsDlB;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAqB5D;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACjD,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA4CpB;AAqDD,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,oBAAoB,EAC1B,IAAI,EAAE;IACJ,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACjD,GACA,OAAO,CAAC,IAAI,CAAC,CAmEf;AAED,kFAAkF;AAClF,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiBxB"}
@@ -0,0 +1,242 @@
1
+ /**
2
+ * `mesh docs portal` — assemble the developer portal from the repo's
3
+ * docs.json-discovered markdown and hand it to the renderer (Zudoku) to build
4
+ * or serve.
5
+ *
6
+ * Modes:
7
+ *
8
+ * mesh docs portal assemble → `zudoku build` → apps/docs/dist
9
+ * mesh docs portal --serve assemble → `zudoku dev` (local preview)
10
+ * mesh docs portal --assemble-only assemble and stop (content/, config,
11
+ * manifests) — what CI runs before `build`
12
+ * mesh docs portal --check the CI gate: assemble to a scratch dir and
13
+ * fail on any of the four assertions below
14
+ *
15
+ * The four --check assertions, any of which exits non-zero:
16
+ * 1. a docs.json fails schema validation (or any other discovery error)
17
+ * 2. an assembled output path contains a reserved segment (fail-closed —
18
+ * internal material must never be publishable)
19
+ * 3. an internal link resolves to nothing
20
+ * 4. the committed CLI reference is stale (the command tree drifted)
21
+ *
22
+ * Assembly always writes `publish-manifest.json` — every source path that
23
+ * made it into the site — which CI uploads as an artifact; on PRs
24
+ * `--diff-base <ref>` also prints the added/removed published paths into the
25
+ * GitHub job summary.
26
+ */
27
+ import { spawn } from "node:child_process";
28
+ import { appendFileSync, existsSync, mkdirSync, mkdtempSync, readFileSync, writeFileSync, } from "node:fs";
29
+ import { tmpdir } from "node:os";
30
+ import path from "node:path";
31
+ import { logError, logInfo, logSuccess, logWarn } from "../utils/log.js";
32
+ import { assemblePortal, currentBaseline, currentCommit, diffPublishSets, publishSetAtRef, renderPublishSetSummary, renderVersionJson, renderZudokuConfig, } from "./assemble.js";
33
+ import { discoverDocRoots } from "./discover.js";
34
+ /** The Zudoku app package directory, relative to the repo root. */
35
+ export const DOCS_APP_DIR = "apps/docs";
36
+ const CONTENT_DIR = "content";
37
+ const GENERATED_CONFIG = "zudoku.config.ts";
38
+ const PUBLISH_MANIFEST = "publish-manifest.json";
39
+ const VERSION_JSON_DIR = "public";
40
+ const VERSION_JSON = "version.json";
41
+ const SITE_TITLE = "Mesh Developer Portal";
42
+ const SITE_DESCRIPTION = "Build and run financial-services apps on Mesh Platform with the mesh developer CLI.";
43
+ /**
44
+ * Run discovery + assembly. Shared by every mode; the scratch-dir variant is
45
+ * what --check uses so the gate never depends on (or dirties) apps/docs.
46
+ */
47
+ export function runAssemble(args) {
48
+ const discovery = discoverDocRoots(args.repoRoot);
49
+ const assembled = assemblePortal({
50
+ repoRoot: args.repoRoot,
51
+ discovery,
52
+ outDir: args.outDir,
53
+ meshBaseline: currentBaseline(args.repoRoot),
54
+ commit: currentCommit(args.repoRoot),
55
+ });
56
+ const errors = [...discovery.errors];
57
+ if (args.writeFiles !== false) {
58
+ // The manifest lands BESIDE the content dir for a real assemble
59
+ // (apps/docs/publish-manifest.json — gitignored derived state) and INSIDE
60
+ // the scratch dir for a --check run, so concurrent checks never share a
61
+ // file and nothing is written loose to the tmpdir root.
62
+ const manifestPath = args.outDir.includes(tmpdir())
63
+ ? path.join(args.outDir, PUBLISH_MANIFEST)
64
+ : path.join(args.outDir, "..", PUBLISH_MANIFEST);
65
+ writeFileSync(manifestPath, `${JSON.stringify(assembled.publishManifest, null, 2)}\n`);
66
+ if (args.configOut) {
67
+ writeFileSync(args.configOut, renderZudokuConfig({
68
+ navigation: assembled.navigation,
69
+ title: SITE_TITLE,
70
+ description: SITE_DESCRIPTION,
71
+ baseline: currentBaseline(args.repoRoot),
72
+ commit: currentCommit(args.repoRoot),
73
+ }));
74
+ const versionDir = path.join(path.dirname(args.configOut), VERSION_JSON_DIR);
75
+ mkdirSync(versionDir, { recursive: true });
76
+ writeFileSync(path.join(versionDir, VERSION_JSON), renderVersionJson({
77
+ baseline: currentBaseline(args.repoRoot),
78
+ commit: currentCommit(args.repoRoot),
79
+ builtAt: new Date().toISOString(),
80
+ }));
81
+ }
82
+ }
83
+ return { assembled, errors };
84
+ }
85
+ /** Print the assembly report: counts, external-link note, broken-link list. */
86
+ export function reportAssembly(result) {
87
+ const { assembled } = result;
88
+ logSuccess(`Assembled ${assembled.pages.length} pages from ${new Set(assembled.pages.map((p) => p.sectionTitle)).size} sections → ${assembled.outDir}`);
89
+ if (assembled.externalLinks.length > 0) {
90
+ const unique = new Set(assembled.externalLinks.map((issue) => `${issue.page} → ${issue.href}`));
91
+ logInfo(`${unique.size} link${unique.size === 1 ? "" : "s"} point at repo files outside the portal and were rewritten to blob links`);
92
+ }
93
+ if (assembled.brokenLinks.length > 0) {
94
+ logWarn(`${assembled.brokenLinks.length} link(s) resolve to nothing:`);
95
+ for (const issue of assembled.brokenLinks) {
96
+ logWarn(` ${issue.page}: ${issue.href}`);
97
+ }
98
+ }
99
+ }
100
+ /**
101
+ * The --check gate. Returns the failure list (empty = pass). Also writes the
102
+ * job-summary publish-set diff when --diff-base names a ref and
103
+ * GITHUB_STEP_SUMMARY is writable.
104
+ */
105
+ export async function checkPortal(args) {
106
+ const scratch = mkdtempSync(path.join(tmpdir(), "mesh-docs-check-"));
107
+ const result = runAssemble({ repoRoot: args.repoRoot, outDir: scratch });
108
+ const failures = [...result.errors];
109
+ for (const violation of result.assembled.reservedViolations) {
110
+ failures.push(`assembled output path contains a reserved segment: ${violation}`);
111
+ }
112
+ for (const issue of result.assembled.brokenLinks) {
113
+ failures.push(`broken link on ${issue.page}: ${issue.href}`);
114
+ }
115
+ const cliReferenceError = await args.checkCliReference();
116
+ if (cliReferenceError)
117
+ failures.push(cliReferenceError);
118
+ reportAssembly(result);
119
+ if (args.printManifest) {
120
+ process.stdout.write(`${JSON.stringify(result.assembled.publishManifest, null, 2)}\n`);
121
+ }
122
+ if (args.manifestOut) {
123
+ mkdirSync(path.dirname(args.manifestOut), { recursive: true });
124
+ writeFileSync(args.manifestOut, `${JSON.stringify(result.assembled.publishManifest, null, 2)}\n`);
125
+ }
126
+ if (args.diffBase) {
127
+ writePublishSetSummary(args.repoRoot, args.diffBase, result.assembled.publishManifest);
128
+ }
129
+ return failures;
130
+ }
131
+ /** Diff the publish set against a git ref; print + append to the GH job summary. */
132
+ function writePublishSetSummary(repoRoot, diffBase, manifest) {
133
+ let diff = null;
134
+ try {
135
+ const base = publishSetAtRef(repoRoot, diffBase);
136
+ diff = diffPublishSets(base, manifest.sources);
137
+ }
138
+ catch (error) {
139
+ logWarn(`could not compute the publish-set diff against ${diffBase}: ${error instanceof Error ? error.message : String(error)}`);
140
+ }
141
+ const summary = renderPublishSetSummary(manifest, diff);
142
+ process.stdout.write(`\n${summary}`);
143
+ const summaryPath = process.env.GITHUB_STEP_SUMMARY;
144
+ if (summaryPath) {
145
+ try {
146
+ appendFileSync(summaryPath, summary);
147
+ }
148
+ catch {
149
+ logWarn(`GITHUB_STEP_SUMMARY is set but not writable (${summaryPath})`);
150
+ }
151
+ }
152
+ }
153
+ /** Spawn the renderer. Returns its exit code. */
154
+ function runZudoku(args) {
155
+ const cliArgs = args.mode === "dev"
156
+ ? ["dev", "--port", String(args.port ?? 3000)]
157
+ : ["build"];
158
+ logInfo(`Running \`zudoku ${cliArgs.join(" ")}\` in ${args.appDir}`);
159
+ return new Promise((resolve, reject) => {
160
+ const child = spawn("pnpm", ["exec", "zudoku", ...cliArgs], {
161
+ cwd: args.appDir,
162
+ stdio: "inherit",
163
+ env: process.env,
164
+ });
165
+ child.on("error", reject);
166
+ child.on("close", (code) => resolve(code ?? 1));
167
+ });
168
+ }
169
+ /**
170
+ * The command body. Kept free of commander types so the test suite can drive
171
+ * it directly; `commands/docs.ts` is a thin flag adapter.
172
+ */
173
+ export async function runPortalCommand(opts, deps) {
174
+ const { repoRoot } = deps;
175
+ if (opts.check) {
176
+ const failures = await checkPortal({
177
+ repoRoot,
178
+ diffBase: opts.diffBase,
179
+ printManifest: opts.printManifest ?? false,
180
+ manifestOut: opts.manifestOut,
181
+ checkCliReference: deps.checkCliReference,
182
+ });
183
+ if (failures.length > 0) {
184
+ for (const failure of failures)
185
+ logError(failure);
186
+ throw new Error(`docs portal check failed with ${failures.length} problem(s)`);
187
+ }
188
+ logSuccess("Docs portal check passed");
189
+ return;
190
+ }
191
+ const appDir = path.join(repoRoot, DOCS_APP_DIR);
192
+ const outDir = opts.out
193
+ ? path.resolve(repoRoot, opts.out)
194
+ : path.join(appDir, CONTENT_DIR);
195
+ const result = runAssemble({
196
+ repoRoot,
197
+ outDir,
198
+ configOut: path.join(appDir, GENERATED_CONFIG),
199
+ });
200
+ reportAssembly(result);
201
+ if (result.errors.length > 0) {
202
+ for (const error of result.errors)
203
+ logError(error);
204
+ throw new Error(`docs portal assembly failed with ${result.errors.length} problem(s)`);
205
+ }
206
+ if (opts.assembleOnly || opts.out) {
207
+ logInfo(`Assembled content at ${path.relative(repoRoot, outDir)} — build with: pnpm --filter @mesh-tech/docs build`);
208
+ return;
209
+ }
210
+ const mode = opts.serve ? "dev" : "build";
211
+ let port;
212
+ if (opts.serve && opts.port) {
213
+ port = Number.parseInt(opts.port, 10);
214
+ if (!Number.isInteger(port) || port < 0 || port > 65535) {
215
+ throw new Error(`Invalid --port: ${opts.port}`);
216
+ }
217
+ }
218
+ const code = await runZudoku({
219
+ appDir,
220
+ mode,
221
+ ...(port !== undefined ? { port } : {}),
222
+ });
223
+ if (code !== 0)
224
+ throw new Error(`zudoku ${mode} exited with code ${code}`);
225
+ if (mode === "build") {
226
+ logSuccess(`Portal built → ${path.join(path.relative(repoRoot, appDir), "dist")}`);
227
+ }
228
+ }
229
+ /** Re-exported so commands/docs.ts can wire the CLI-reference staleness check. */
230
+ export async function cliReferenceStaleness(repoRoot) {
231
+ const [{ createProgram }, { extractCliReference, renderCliReferenceMarkdown },] = await Promise.all([
232
+ import("../program.js"),
233
+ import("./cli-reference.js"),
234
+ ]);
235
+ const outPath = path.join(repoRoot, "docs/portal/generated/cli-reference.md");
236
+ const markdown = renderCliReferenceMarkdown(extractCliReference(createProgram()));
237
+ const existing = existsSync(outPath) ? readFileSync(outPath, "utf-8") : null;
238
+ if (existing === markdown)
239
+ return null;
240
+ return `${existing === null ? "CLI reference is missing" : "CLI reference is stale"}: docs/portal/generated/cli-reference.md — the commander tree changed; regenerate and commit with \`pnpm exec mesh docs cli-reference\``;
241
+ }
242
+ //# sourceMappingURL=portal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal.js","sourceRoot":"","sources":["../../../src/docs/portal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * The docs-as-registry-artifact client.
3
+ *
4
+ * The release job publishes the built portal as `@mesh-tech/docs` in the
5
+ * fixed lockstep group, so the docs version IS the @mesh-tech/* baseline
6
+ * version it describes. The audience is exactly "people who can install the
7
+ * packages": the CodeArtifact registry is Zitadel-role-gated (see
8
+ * `mesh registry login`), so no public hosting is required for the docs to
9
+ * reach precisely the authorized set.
10
+ *
11
+ * This module reads the user's existing `~/.npmrc` CodeArtifact token (the
12
+ * one `mesh registry login` writes), lists published docs versions, and
13
+ * fetches + caches a version's tarball. It never talks to AWS directly.
14
+ */
15
+ export declare const DOCS_PACKAGE = "@mesh-tech/docs";
16
+ export interface DocsRegistryAuth {
17
+ endpoint: string;
18
+ token: string;
19
+ }
20
+ /** The CodeArtifact token + endpoint from `mesh registry login`'s ~/.npmrc line. */
21
+ export declare function readDocsRegistryAuth(npmrcPath?: string): DocsRegistryAuth | null;
22
+ /** x.y.z numeric compare (release versions carry no prerelease suffixes). */
23
+ export declare function compareVersions(a: string, b: string): number;
24
+ export interface DocsVersionList {
25
+ versions: string[];
26
+ latest: string | undefined;
27
+ }
28
+ /**
29
+ * Every published docs version, oldest → newest, plus the registry's
30
+ * `latest` dist-tag. Throws with the login remediation when the registry
31
+ * rejects the token — an expired token is the common case (12h TTL).
32
+ */
33
+ export declare function listDocsVersions(auth: DocsRegistryAuth, fetchImpl?: typeof fetch): Promise<DocsVersionList>;
34
+ /** Where fetched docs versions live: `~/.cache/mesh/docs/<version>/`. */
35
+ export declare function docsCacheRoot(): string;
36
+ /**
37
+ * Fetch and extract a docs version into the cache; returns the directory
38
+ * containing the site's `dist/`. Cache hit = the directory already has a
39
+ * `dist/index.html`. Partial downloads extract to a temp sibling and rename,
40
+ * so an interrupted fetch never leaves a half-written "good" cache entry.
41
+ */
42
+ export declare function fetchDocsArtifact(auth: DocsRegistryAuth, version: string, cacheRoot?: string, fetchImpl?: typeof fetch): Promise<string>;
43
+ //# sourceMappingURL=registry-docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-docs.d.ts","sourceRoot":"","sources":["../../../src/docs/registry-docs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AASH,eAAO,MAAM,YAAY,oBAAoB,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,oFAAoF;AACpF,wBAAgB,oBAAoB,CAAC,SAAS,GAAE,MAAwB,GAAG,gBAAgB,GAAG,IAAI,CAGjG;AAoBD,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAY5D;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,gBAAgB,EACtB,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,eAAe,CAAC,CA2B1B;AAED,yEAAyE;AACzE,wBAAgB,aAAa,IAAI,MAAM,CAGtC;AAMD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAwB,EACnC,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,MAAM,CAAC,CAyDjB"}