@pikku/cli 0.12.156 → 0.12.160

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 (280) hide show
  1. package/console-app/assets/{HelpPanel-DaE02BQE.js → HelpPanel-C06T226y.js} +1 -1
  2. package/console-app/assets/{abnfDiagram-VCTEODGH-CExRuljg.js → abnfDiagram-VCTEODGH-BVwdT3Es.js} +1 -1
  3. package/console-app/assets/architecture-7GRP2DOG-3y7bWtag.js +1 -0
  4. package/console-app/assets/{architectureDiagram-5GKGNRK7-uKjmdPIQ.js → architectureDiagram-5GKGNRK7-XfzqZ3mW.js} +1 -1
  5. package/console-app/assets/{blockDiagram-I7D4REHJ-DNgIFbT4.js → blockDiagram-I7D4REHJ-B5omSqDK.js} +1 -1
  6. package/console-app/assets/{c4Diagram-7LVT6UL2-0vP9sLld.js → c4Diagram-7LVT6UL2-DkPe7xCg.js} +1 -1
  7. package/console-app/assets/channel-CTiluQVw.js +1 -0
  8. package/console-app/assets/{chunk-4HAMMTFA-BJ59eqJI.js → chunk-4HAMMTFA-QfSXT_X7.js} +1 -1
  9. package/console-app/assets/{chunk-75Z2AOVW-Bge6xoqX.js → chunk-75Z2AOVW-h7UnPWNo.js} +1 -1
  10. package/console-app/assets/{chunk-DU6HZSFF-CkmYNhC5.js → chunk-DU6HZSFF-VaMy-LOI.js} +1 -1
  11. package/console-app/assets/{chunk-F27PBJKO-C44ef28t.js → chunk-F27PBJKO-toywqOqS.js} +1 -1
  12. package/console-app/assets/{chunk-GMAD6QVW-Bmqdx1l0.js → chunk-GMAD6QVW-Cpa-YKLB.js} +1 -1
  13. package/console-app/assets/{chunk-GVQU2GXP-AQp_KNx4.js → chunk-GVQU2GXP-BWSHPLNL.js} +1 -1
  14. package/console-app/assets/{chunk-IMKFNOWR-Ca3GoHnO.js → chunk-IMKFNOWR-yhQzfQuj.js} +1 -1
  15. package/console-app/assets/{chunk-L3NEJ4N5-C_GhayZt.js → chunk-L3NEJ4N5-C8pAfDlo.js} +1 -1
  16. package/console-app/assets/{chunk-OSK3NFVY-DGzfF4JV.js → chunk-OSK3NFVY-749yk2fa.js} +1 -1
  17. package/console-app/assets/{chunk-P2QGCYS3-N8xMDiFw.js → chunk-P2QGCYS3-C1Y9GyYT.js} +1 -1
  18. package/console-app/assets/{chunk-POPQ4Y6H-CdhIikwj.js → chunk-POPQ4Y6H-DzI9aRsX.js} +1 -1
  19. package/console-app/assets/{chunk-PWAF6VOD-CdTJmOYg.js → chunk-PWAF6VOD-D3fAPSwz.js} +1 -1
  20. package/console-app/assets/{chunk-SHT3W25Y-Ctj8zSAF.js → chunk-SHT3W25Y-D9w7LzM9.js} +1 -1
  21. package/console-app/assets/{chunk-SVP7TREG-DTNKveWo.js → chunk-SVP7TREG-D55MjOJw.js} +1 -1
  22. package/console-app/assets/{chunk-TICWLB2K-Df6e0LIf.js → chunk-TICWLB2K-DV8q7H-z.js} +1 -1
  23. package/console-app/assets/chunk-XXDRQBXY-DBtYQykd.js +1 -0
  24. package/console-app/assets/classDiagram-ZZMXUADV-BnWa-i9n.js +1 -0
  25. package/console-app/assets/classDiagram-v2-VYDZK3BY-BnWa-i9n.js +1 -0
  26. package/console-app/assets/{cose-bilkent-JH36ORCC-DBd_emhQ.js → cose-bilkent-JH36ORCC-CLedPW9a.js} +1 -1
  27. package/console-app/assets/{cynefin-OW5HDTMX-3aBVpBMI.js → cynefin-OW5HDTMX-CS5NKw2p.js} +1 -1
  28. package/console-app/assets/{cynefinDiagram-5FMLGOSQ-5BZzBehJ.js → cynefinDiagram-5FMLGOSQ-DGTHW90E.js} +1 -1
  29. package/console-app/assets/{dagre-DATELzSq.js → dagre-BNQdos_2.js} +1 -1
  30. package/console-app/assets/{dagre-GXQ25YYZ-orKIUXIt.js → dagre-GXQ25YYZ-DHZ8wtwQ.js} +1 -1
  31. package/console-app/assets/{diagram-S7CK7UJ4-CwwxVQ_N.js → diagram-S7CK7UJ4-C41Begsy.js} +1 -1
  32. package/console-app/assets/{diagram-UQ7AKVKN-CcEJxIEU.js → diagram-UQ7AKVKN-CU8D-sRT.js} +1 -1
  33. package/console-app/assets/{diagram-VSXAHHWV-DGfXNB6v.js → diagram-VSXAHHWV-DTTiXYnQ.js} +1 -1
  34. package/console-app/assets/{diagram-VX7I27RA-Kqkord1q.js → diagram-VX7I27RA-BBy91pxm.js} +1 -1
  35. package/console-app/assets/{diagram-Z3DM3KII-Dy5rfOxu.js → diagram-Z3DM3KII-D50xTYe5.js} +1 -1
  36. package/console-app/assets/{ebnfDiagram-PWID7BFC-y1bmj1ry.js → ebnfDiagram-PWID7BFC-BHjnFZgE.js} +1 -1
  37. package/console-app/assets/{erDiagram-RLTQ6QDP-CNk_w5Ib.js → erDiagram-RLTQ6QDP-B4-yVo9b.js} +1 -1
  38. package/console-app/assets/eventmodeling-NTZA5JFV-C_IpFSCw.js +1 -0
  39. package/console-app/assets/flowDiagram-HODETNUW-Q90rgVpx.js +1 -0
  40. package/console-app/assets/{ganttDiagram-EL5Y4UJY-DdVaRGRy.js → ganttDiagram-EL5Y4UJY-D1T-2BlO.js} +1 -1
  41. package/console-app/assets/{gitGraph-4MIJSDKK-DpSAepQv.js → gitGraph-4MIJSDKK-ClqKTUfQ.js} +1 -1
  42. package/console-app/assets/{gitGraphDiagram-WWUBYQGX-CIhGnwZW.js → gitGraphDiagram-WWUBYQGX-ruq2MAhM.js} +1 -1
  43. package/console-app/assets/{graphlib-CRp93vEd.js → graphlib-D-vLYPdw.js} +1 -1
  44. package/console-app/assets/{index-B34OoL_f.js → index-BIEZPuyK.js} +5 -5
  45. package/console-app/assets/{info-A6RAGUB7-DckDPZ56.js → info-A6RAGUB7-BGI-8HNB.js} +1 -1
  46. package/console-app/assets/{infoDiagram-27XIBGKW-DMk6mpjP.js → infoDiagram-27XIBGKW-BGURgKHv.js} +1 -1
  47. package/console-app/assets/{ishikawaDiagram-5VMMS53U-Dqr5CEc9.js → ishikawaDiagram-5VMMS53U-DzgAaPTR.js} +1 -1
  48. package/console-app/assets/{journeyDiagram-3NMN7TZE-Kv0orI9j.js → journeyDiagram-3NMN7TZE-BsyWad8z.js} +1 -1
  49. package/console-app/assets/{kanban-definition-UXKFOSKX-BrYb0IpS.js → kanban-definition-UXKFOSKX-g1nO2rWF.js} +1 -1
  50. package/console-app/assets/{line-D2jQ449E.js → line-CeFoQ5y-.js} +1 -1
  51. package/console-app/assets/{linear-BKu0S9-y.js → linear-C4Pk-YMX.js} +1 -1
  52. package/console-app/assets/{mermaid-parser.core-DhWf8x6B.js → mermaid-parser.core-U7wquvx8.js} +3 -3
  53. package/console-app/assets/{mermaid.core-RkgzUTr1.js → mermaid.core-8TRpFRm9.js} +4 -4
  54. package/console-app/assets/{mindmap-definition-YA3MSWOX-BKATx3X1.js → mindmap-definition-YA3MSWOX-C7lzwqBX.js} +1 -1
  55. package/console-app/assets/{packet-AYTQ26CC-Dek-5xov.js → packet-AYTQ26CC-DiQV_rU3.js} +1 -1
  56. package/console-app/assets/{pegDiagram-XKGWAZYB-CkEJ5MeF.js → pegDiagram-XKGWAZYB-63ajP7-W.js} +1 -1
  57. package/console-app/assets/{pie-WAS4IAKB-BIoN9DHQ.js → pie-WAS4IAKB-B5q_o6dr.js} +1 -1
  58. package/console-app/assets/{pieDiagram-E7YTZNPT-CEPQgMPk.js → pieDiagram-E7YTZNPT-BTbvj-by.js} +1 -1
  59. package/console-app/assets/{quadrantDiagram-AXDQQJYC-eJxMa_50.js → quadrantDiagram-AXDQQJYC-CulqsAYd.js} +1 -1
  60. package/console-app/assets/{radar-RG4KPBEZ-BwJnovJ0.js → radar-RG4KPBEZ-CW_KoURS.js} +1 -1
  61. package/console-app/assets/{railroad-74A4TZTK-D1_fi4Md.js → railroad-74A4TZTK-CUmF6uBQ.js} +1 -1
  62. package/console-app/assets/railroad-abnf-HS5TGJTU-CcPw9q8a.js +1 -0
  63. package/console-app/assets/railroad-ebnf-LZEXJU2U-Ci_fZics.js +1 -0
  64. package/console-app/assets/railroad-peg-WCYAUIDC-DTsDykSf.js +1 -0
  65. package/console-app/assets/{railroadDiagram-O6MQD6OU-BpOx1Ffe.js → railroadDiagram-O6MQD6OU-WlkBu_N3.js} +1 -1
  66. package/console-app/assets/{requirementDiagram-BXWQKSXE-D-IEFxpk.js → requirementDiagram-BXWQKSXE-CJK_CbPR.js} +1 -1
  67. package/console-app/assets/{sankeyDiagram-P5KCCOFB-SdALSgLt.js → sankeyDiagram-P5KCCOFB-C466WOH8.js} +1 -1
  68. package/console-app/assets/{sequenceDiagram-WJ2MYXX4-Burhioru.js → sequenceDiagram-WJ2MYXX4-CV0dCcj0.js} +1 -1
  69. package/console-app/assets/{src-BI-J79xw.js → src-P4Nw8sY0.js} +1 -1
  70. package/console-app/assets/{stateDiagram-D77RDMKH-BhWb5zb7.js → stateDiagram-D77RDMKH-HaLGm8V9.js} +1 -1
  71. package/console-app/assets/stateDiagram-v2-MP3YSRHH--GM14Hz5.js +1 -0
  72. package/console-app/assets/{swimlanes-42K2YHIH-BoaeXC6b.js → swimlanes-42K2YHIH-Bi-O5vWa.js} +1 -1
  73. package/console-app/assets/swimlanesDiagram-VR7AAH4N-_6rRi6Wt.js +8 -0
  74. package/console-app/assets/{timeline-definition-24CTP7MA-uuBDVcEL.js → timeline-definition-24CTP7MA-B4h-gx-i.js} +1 -1
  75. package/console-app/assets/{treeView-Q6P3EWNA-BRZawPMp.js → treeView-Q6P3EWNA-CXJ_pHQw.js} +1 -1
  76. package/console-app/assets/{treemap-WGGIJYW6-WSINjp5g.js → treemap-WGGIJYW6-M84p2a_3.js} +1 -1
  77. package/console-app/assets/{vennDiagram-4TSXK5OY-K6UjE9uq.js → vennDiagram-4TSXK5OY-BesF4k_r.js} +1 -1
  78. package/console-app/assets/{wardley-WFR3VGLG-BMecQ-Z6.js → wardley-WFR3VGLG-n9ulickP.js} +1 -1
  79. package/console-app/assets/{wardleyDiagram-VM6X3IG4-9blTcGMt.js → wardleyDiagram-VM6X3IG4-BG0nnWDf.js} +1 -1
  80. package/console-app/assets/{xychartDiagram-S5SC5T6Z-DSnHhis6.js → xychartDiagram-S5SC5T6Z-BtOW7fpF.js} +1 -1
  81. package/console-app/index.html +1 -1
  82. package/dist/.pikku/addon/index.d.ts +1 -1
  83. package/dist/.pikku/addon/index.js +1 -1
  84. package/dist/.pikku/addon/pikku-addon-types.gen.d.ts +1 -1
  85. package/dist/.pikku/addon/pikku-addon-types.gen.js +1 -1
  86. package/dist/.pikku/agent/index.d.ts +1 -1
  87. package/dist/.pikku/agent/index.js +1 -1
  88. package/dist/.pikku/agent/pikku-agent-types.gen.d.ts +1 -1
  89. package/dist/.pikku/agent/pikku-model-aliases.gen.js +1 -1
  90. package/dist/.pikku/analytics/index.d.ts +1 -1
  91. package/dist/.pikku/analytics/index.js +1 -1
  92. package/dist/.pikku/analytics/pikku-analytics-types.gen.d.ts +1 -1
  93. package/dist/.pikku/analytics/pikku-analytics-types.gen.js +1 -1
  94. package/dist/.pikku/auth/index.d.ts +1 -1
  95. package/dist/.pikku/auth/index.js +1 -1
  96. package/dist/.pikku/auth/pikku-auth-types.gen.d.ts +1 -1
  97. package/dist/.pikku/auth/pikku-auth-types.gen.js +1 -1
  98. package/dist/.pikku/channel/index.d.ts +1 -1
  99. package/dist/.pikku/channel/index.js +1 -1
  100. package/dist/.pikku/channel/pikku-channel-types.gen.d.ts +1 -1
  101. package/dist/.pikku/channel/pikku-channel-types.gen.js +1 -1
  102. package/dist/.pikku/cli/index.d.ts +1 -1
  103. package/dist/.pikku/cli/index.js +1 -1
  104. package/dist/.pikku/cli/pikku-cli-channel.js +6 -1
  105. package/dist/.pikku/cli/pikku-cli-client.gen.d.ts +1 -1
  106. package/dist/.pikku/cli/pikku-cli-client.gen.js +1 -1
  107. package/dist/.pikku/cli/pikku-cli-contracts-meta.gen.d.ts +1 -1
  108. package/dist/.pikku/cli/pikku-cli-contracts-meta.gen.js +1 -1
  109. package/dist/.pikku/cli/pikku-cli-contracts-meta.gen.json +11 -1
  110. package/dist/.pikku/cli/pikku-cli-types.gen.d.ts +1 -1
  111. package/dist/.pikku/cli/pikku-cli-types.gen.js +1 -1
  112. package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.js +1 -1
  113. package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.json +55 -3
  114. package/dist/.pikku/cli/pikku-cli-wirings.gen.d.ts +1 -1
  115. package/dist/.pikku/cli/pikku-cli-wirings.gen.js +1 -1
  116. package/dist/.pikku/cli/pikku-cli.gen.d.ts +1 -1
  117. package/dist/.pikku/cli/pikku-cli.gen.js +1 -1
  118. package/dist/.pikku/error/index.d.ts +1 -1
  119. package/dist/.pikku/error/index.js +1 -1
  120. package/dist/.pikku/error/pikku-error-types.gen.d.ts +1 -1
  121. package/dist/.pikku/error/pikku-error-types.gen.js +1 -1
  122. package/dist/.pikku/function/index.d.ts +1 -1
  123. package/dist/.pikku/function/index.js +1 -1
  124. package/dist/.pikku/function/pikku-function-types.gen.d.ts +1 -1
  125. package/dist/.pikku/function/pikku-function-types.gen.js +1 -1
  126. package/dist/.pikku/function/pikku-functions-meta.gen.js +1 -1
  127. package/dist/.pikku/function/pikku-functions-meta.gen.json +38 -21
  128. package/dist/.pikku/function/pikku-functions.gen.js +1 -1
  129. package/dist/.pikku/gateway/index.d.ts +1 -1
  130. package/dist/.pikku/gateway/index.js +1 -1
  131. package/dist/.pikku/gateway/pikku-gateway-types.gen.d.ts +1 -1
  132. package/dist/.pikku/gateway/pikku-gateway-types.gen.js +1 -1
  133. package/dist/.pikku/http/index.d.ts +1 -1
  134. package/dist/.pikku/http/index.js +1 -1
  135. package/dist/.pikku/http/pikku-http-types.gen.d.ts +1 -1
  136. package/dist/.pikku/http/pikku-http-types.gen.js +1 -1
  137. package/dist/.pikku/mcp/index.d.ts +1 -1
  138. package/dist/.pikku/mcp/index.js +1 -1
  139. package/dist/.pikku/mcp/pikku-mcp-types.gen.d.ts +1 -1
  140. package/dist/.pikku/mcp/pikku-mcp-types.gen.js +1 -1
  141. package/dist/.pikku/middleware/index.d.ts +1 -1
  142. package/dist/.pikku/middleware/index.js +1 -1
  143. package/dist/.pikku/middleware/pikku-middleware-types.gen.d.ts +1 -1
  144. package/dist/.pikku/middleware/pikku-middleware-types.gen.js +1 -1
  145. package/dist/.pikku/pikku-bootstrap-scenarios.gen.d.ts +1 -1
  146. package/dist/.pikku/pikku-bootstrap-scenarios.gen.js +1 -1
  147. package/dist/.pikku/pikku-bootstrap.gen.d.ts +1 -1
  148. package/dist/.pikku/pikku-bootstrap.gen.js +1 -1
  149. package/dist/.pikku/pikku-services.gen.d.ts +1 -1
  150. package/dist/.pikku/queue/index.d.ts +1 -1
  151. package/dist/.pikku/queue/index.js +1 -1
  152. package/dist/.pikku/queue/pikku-queue-types.gen.d.ts +1 -1
  153. package/dist/.pikku/queue/pikku-queue-types.gen.js +1 -1
  154. package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.js +1 -1
  155. package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.d.ts +1 -1
  156. package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.js +1 -1
  157. package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.js +1 -1
  158. package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.json +1 -0
  159. package/dist/.pikku/scenarios/index.d.ts +1 -1
  160. package/dist/.pikku/scenarios/index.js +1 -1
  161. package/dist/.pikku/scenarios/pikku-personas.gen.js +1 -1
  162. package/dist/.pikku/scenarios/pikku-scenario-functions-meta.gen.js +1 -1
  163. package/dist/.pikku/scenarios/pikku-scenario-functions.gen.d.ts +1 -1
  164. package/dist/.pikku/scenarios/pikku-scenario-types.gen.d.ts +7 -1
  165. package/dist/.pikku/scenarios/pikku-scenario-wirings-meta.gen.js +1 -1
  166. package/dist/.pikku/scenarios/pikku-scenario-wirings.gen.d.ts +1 -1
  167. package/dist/.pikku/scenarios/schemas/register.gen.d.ts +1 -1
  168. package/dist/.pikku/scenarios/schemas/register.gen.js +1 -1
  169. package/dist/.pikku/scheduler/index.d.ts +1 -1
  170. package/dist/.pikku/scheduler/index.js +1 -1
  171. package/dist/.pikku/scheduler/pikku-scheduler-types.gen.d.ts +1 -1
  172. package/dist/.pikku/scheduler/pikku-scheduler-types.gen.js +1 -1
  173. package/dist/.pikku/schemas/register.gen.js +3 -1
  174. package/dist/.pikku/schemas/schemas/FabricChangesAskInput.schema.json +1 -1
  175. package/dist/.pikku/schemas/schemas/FabricInitInput.schema.json +1 -1
  176. package/dist/.pikku/schemas/schemas/FabricLinkInput.schema.json +1 -1
  177. package/dist/.pikku/schemas/schemas/KnowledgeReconcileInput.schema.json +1 -1
  178. package/dist/.pikku/schemas/schemas/KnowledgeReconcileOutput.schema.json +1 -1
  179. package/dist/.pikku/schemas/schemas/PikkuSkillsInstallInput.schema.json +1 -1
  180. package/dist/.pikku/schemas/schemas/ScenarioGuideInput.schema.json +1 -0
  181. package/dist/.pikku/scopes/index.d.ts +1 -1
  182. package/dist/.pikku/scopes/index.js +1 -1
  183. package/dist/.pikku/scopes/pikku-flags.gen.d.ts +1 -1
  184. package/dist/.pikku/scopes/pikku-personas.gen.js +1 -1
  185. package/dist/.pikku/scopes/pikku-roles.gen.d.ts +1 -1
  186. package/dist/.pikku/scopes/pikku-scope-types.gen.d.ts +1 -1
  187. package/dist/.pikku/scopes/pikku-scope-types.gen.js +1 -1
  188. package/dist/.pikku/scopes/pikku-scopes.gen.d.ts +1 -1
  189. package/dist/.pikku/secrets/index.d.ts +1 -1
  190. package/dist/.pikku/secrets/index.js +1 -1
  191. package/dist/.pikku/secrets/pikku-secret-types.gen.d.ts +1 -1
  192. package/dist/.pikku/secrets/pikku-secret-types.gen.js +1 -1
  193. package/dist/.pikku/secrets/pikku-secrets.gen.d.ts +1 -1
  194. package/dist/.pikku/secrets/pikku-secrets.gen.js +1 -1
  195. package/dist/.pikku/services/pikku-meta-service.gen.d.ts +1 -1
  196. package/dist/.pikku/services/pikku-meta-service.gen.js +1 -1
  197. package/dist/.pikku/setup/index.d.ts +1 -1
  198. package/dist/.pikku/setup/index.js +1 -1
  199. package/dist/.pikku/setup/pikku-setup-types.gen.d.ts +1 -1
  200. package/dist/.pikku/setup/pikku-setup-types.gen.js +1 -1
  201. package/dist/.pikku/trigger/index.d.ts +1 -1
  202. package/dist/.pikku/trigger/index.js +1 -1
  203. package/dist/.pikku/trigger/pikku-trigger-types.gen.d.ts +1 -1
  204. package/dist/.pikku/trigger/pikku-trigger-types.gen.js +1 -1
  205. package/dist/.pikku/variables/index.d.ts +1 -1
  206. package/dist/.pikku/variables/index.js +1 -1
  207. package/dist/.pikku/variables/pikku-variable-types.gen.d.ts +1 -1
  208. package/dist/.pikku/variables/pikku-variable-types.gen.js +1 -1
  209. package/dist/.pikku/variables/pikku-variables.gen.d.ts +1 -1
  210. package/dist/.pikku/variables/pikku-variables.gen.js +1 -1
  211. package/dist/.pikku/workflow/index.d.ts +1 -1
  212. package/dist/.pikku/workflow/index.js +1 -1
  213. package/dist/.pikku/workflow/pikku-workflow-types.gen.d.ts +1 -1
  214. package/dist/.pikku/workflow/pikku-workflow-types.gen.js +1 -1
  215. package/dist/.pikku/workflow/pikku-workflow-wirings-meta.gen.js +1 -1
  216. package/dist/.pikku/workflow/pikku-workflow-wirings.gen.js +1 -1
  217. package/dist/bin/pikku-bin.mjs +3 -3
  218. package/dist/src/cli.wiring.js +44 -2
  219. package/dist/src/deploy/analyzer/analyzer.js +93 -4
  220. package/dist/src/deploy/build-pipeline.d.ts +2 -0
  221. package/dist/src/deploy/build-pipeline.js +4 -3
  222. package/dist/src/deploy/codegen/per-unit-codegen.js +24 -0
  223. package/dist/src/fabric/fabric-commands.d.ts +9 -0
  224. package/dist/src/fabric/fabric-commands.js +11 -1
  225. package/dist/src/fabric/functions/changes-ask.function.d.ts +4 -0
  226. package/dist/src/fabric/functions/changes-ask.function.js +7 -1
  227. package/dist/src/fabric/functions/init.function.d.ts +4 -0
  228. package/dist/src/fabric/functions/init.function.js +5 -1
  229. package/dist/src/fabric/functions/link.function.d.ts +4 -0
  230. package/dist/src/fabric/functions/link.function.js +9 -1
  231. package/dist/src/fabric/lib/organization.d.ts +8 -0
  232. package/dist/src/fabric/lib/organization.js +26 -0
  233. package/dist/src/functions/commands/deploy-apply.js +129 -13
  234. package/dist/src/functions/commands/deploy-plan.js +1 -0
  235. package/dist/src/functions/commands/dev-mcp-manifests.d.ts +27 -0
  236. package/dist/src/functions/commands/dev-mcp-manifests.js +52 -0
  237. package/dist/src/functions/commands/dev.js +10 -30
  238. package/dist/src/functions/commands/knowledge-reconcile.d.ts +15 -3
  239. package/dist/src/functions/commands/knowledge-reconcile.js +1 -1
  240. package/dist/src/functions/commands/scenario-guide.d.ts +184 -0
  241. package/dist/src/functions/commands/scenario-guide.js +313 -0
  242. package/dist/src/functions/commands/scenario-ladder.d.ts +3 -1
  243. package/dist/src/functions/commands/scenario-ladder.js +1 -0
  244. package/dist/src/functions/commands/scenario-plan.d.ts +17 -1
  245. package/dist/src/functions/commands/scenario-plan.js +15 -0
  246. package/dist/src/functions/commands/scenario.d.ts +30 -0
  247. package/dist/src/functions/commands/scenario.js +187 -23
  248. package/dist/src/functions/commands/skill-agents.d.ts +43 -0
  249. package/dist/src/functions/commands/skill-agents.js +135 -0
  250. package/dist/src/functions/commands/skills.d.ts +9 -0
  251. package/dist/src/functions/commands/skills.js +29 -2
  252. package/dist/src/functions/db/postgres/postgres-introspector.d.ts +6 -0
  253. package/dist/src/functions/db/postgres/postgres-introspector.js +7 -1
  254. package/dist/src/functions/knowledge/render.d.ts +1 -1
  255. package/dist/src/functions/knowledge/render.js +25 -2
  256. package/dist/src/functions/knowledge/schemas.d.ts +5 -1
  257. package/dist/src/functions/wirings/mcp/pikku-command-mcp-json.js +32 -5
  258. package/dist/src/functions/wirings/scenarios/serialize-feature-meta.js +1 -0
  259. package/dist/src/functions/wirings/workflow/serialize-scenario-types.js +6 -0
  260. package/dist/src/server/bun-server-runner.js +1 -0
  261. package/dist/src/server/dev-server-runner.interface.d.ts +13 -0
  262. package/dist/src/server/node-server-runner.js +1 -0
  263. package/dist/src/services.js +3 -1
  264. package/dist/src/utils/mcp-surface.d.ts +8 -0
  265. package/dist/src/utils/mcp-surface.js +9 -0
  266. package/dist/tsconfig.tsbuildinfo +1 -1
  267. package/package.json +12 -12
  268. package/surface.json +19 -13
  269. package/console-app/assets/architecture-7GRP2DOG-DMiKIh61.js +0 -1
  270. package/console-app/assets/channel-D3pFDQ-Y.js +0 -1
  271. package/console-app/assets/chunk-XXDRQBXY-CPBzG1Ie.js +0 -1
  272. package/console-app/assets/classDiagram-ZZMXUADV-Bh5HK4MN.js +0 -1
  273. package/console-app/assets/classDiagram-v2-VYDZK3BY-Bh5HK4MN.js +0 -1
  274. package/console-app/assets/eventmodeling-NTZA5JFV-DLjVcr4S.js +0 -1
  275. package/console-app/assets/flowDiagram-HODETNUW-CCiyVZIU.js +0 -1
  276. package/console-app/assets/railroad-abnf-HS5TGJTU-D-_q3UaA.js +0 -1
  277. package/console-app/assets/railroad-ebnf-LZEXJU2U-kh7JN-2k.js +0 -1
  278. package/console-app/assets/railroad-peg-WCYAUIDC-rrwoksLW.js +0 -1
  279. package/console-app/assets/stateDiagram-v2-MP3YSRHH-OjHOAFS5.js +0 -1
  280. package/console-app/assets/swimlanesDiagram-VR7AAH4N-CkKXVcij.js +0 -8
@@ -10,7 +10,56 @@ import { incompatibleServicesFor, resolveDeployTarget, } from '@pikku/inspector'
10
10
  import { relative } from 'node:path';
11
11
  import { isScenarioFunction, withoutScenarios, withoutScenarioWorkflows, } from '../../functions/wirings/scenarios/scenario-partition.js';
12
12
  import { toSafeKebab } from './naming.js';
13
+ import { mcpSurfaceSlug } from '../../utils/mcp-surface.js';
13
14
  import { createUnitResolver } from './grouping.js';
15
+ /**
16
+ * Where an MCP unit answers. Every runtime that mounts MCP defaults to `/mcp`,
17
+ * and pikku's own codegen never writes an `mcpPath` into the generated
18
+ * manifest, so the route table and the mount agree. A project that overrides
19
+ * `mcpPath` in `mcp.gen.json` moves the mount but not this — the analyzer never
20
+ * reads that file.
21
+ */
22
+ const MCP_PATH = '/mcp';
23
+ /** The discovery document `PikkuMCPServer` serves, per RFC 9728. */
24
+ const WELL_KNOWN_PRM = '/.well-known/oauth-protected-resource';
25
+ /**
26
+ * The routes an MCP unit has to receive to serve Streamable HTTP. Without them
27
+ * the unit deploys with an empty route table and nothing ever reaches it: POST
28
+ * carries the JSON-RPC calls, GET opens the server-to-client stream, and DELETE
29
+ * ends a session. The well-known paths are how a client discovers the
30
+ * authorization server when the endpoint refuses it.
31
+ *
32
+ * `bareDiscovery` is what keeps a multi-endpoint project's route table
33
+ * unambiguous. RFC 9728 folds the resource's path into the well-known route, so
34
+ * each endpoint's own document is distinct, but the bare path predates that and
35
+ * describes whichever resource answers it. Handing it to every unit would
36
+ * register the same route twice and let the router pick a winner, so only the
37
+ * project's default endpoint claims it; a surface serves its path-aware
38
+ * document alone.
39
+ *
40
+ * The ids are synthetic, as they are for the agent gateway's routes: no single
41
+ * pikku function answers here, because the MCP transport picks the tool out of
42
+ * the JSON-RPC body and dispatches it itself.
43
+ */
44
+ const mcpRoutes = (mcpPath, { bareDiscovery = true } = {}) => [
45
+ { method: 'post', route: mcpPath, pikkuFuncId: 'mcp:call' },
46
+ { method: 'get', route: mcpPath, pikkuFuncId: 'mcp:stream' },
47
+ { method: 'delete', route: mcpPath, pikkuFuncId: 'mcp:end' },
48
+ ...(bareDiscovery
49
+ ? [
50
+ {
51
+ method: 'get',
52
+ route: WELL_KNOWN_PRM,
53
+ pikkuFuncId: 'mcp:discovery',
54
+ },
55
+ ]
56
+ : []),
57
+ {
58
+ method: 'get',
59
+ route: `${WELL_KNOWN_PRM}${mcpPath}`,
60
+ pikkuFuncId: 'mcp:discovery',
61
+ },
62
+ ];
14
63
  export function analyzeDeployment(state, options) {
15
64
  const serverlessIncompatible = new Set(options.serverlessIncompatible ?? []);
16
65
  const defaultTarget = options.defaultTarget ?? 'serverless';
@@ -370,9 +419,25 @@ export function analyzeDeployment(state, options) {
370
419
  // place a scenario or step id can still arrive from raw state. A gateway that
371
420
  // lists one would depend on a unit that was never emitted.
372
421
  const deployableFuncId = (funcId) => !isScenarioFunction(state.functions.meta[funcId]);
373
- const mcpToolIds = values(state.mcpEndpoints.toolsMeta)
374
- .map((t) => t.pikkuFuncId)
375
- .filter(deployableFuncId);
422
+ // A tool naming a surface is served by that surface's endpoint and by no
423
+ // other, so it is grouped out of the default set here rather than pooled
424
+ // with it. Resources and prompts have no surface of their own yet.
425
+ const surfacePaths = state.mcpEndpoints.surfaces ?? {};
426
+ const toolIdsBySurface = new Map();
427
+ const mcpToolIds = [];
428
+ for (const tool of values(state.mcpEndpoints.toolsMeta)) {
429
+ if (!deployableFuncId(tool.pikkuFuncId))
430
+ continue;
431
+ const surface = tool.surface;
432
+ if (surface && surfacePaths[surface]) {
433
+ const ids = toolIdsBySurface.get(surface) ?? [];
434
+ ids.push(tool.pikkuFuncId);
435
+ toolIdsBySurface.set(surface, ids);
436
+ }
437
+ else {
438
+ mcpToolIds.push(tool.pikkuFuncId);
439
+ }
440
+ }
376
441
  const mcpResourceIds = values(state.mcpEndpoints.resourcesMeta)
377
442
  .map((r) => r.pikkuFuncId)
378
443
  .filter(deployableFuncId);
@@ -388,6 +453,30 @@ export function analyzeDeployment(state, options) {
388
453
  mcpToolIds.push(funcId);
389
454
  }
390
455
  }
456
+ for (const [surface, toolIds] of toolIdsBySurface) {
457
+ const unitName = `mcp-${mcpSurfaceSlug(surface)}`;
458
+ units.push({
459
+ name: unitName,
460
+ role: 'mcp',
461
+ target: 'serverless',
462
+ functionIds: [],
463
+ services: [],
464
+ dependsOn: toolIds.map((id) => unitFor(id)),
465
+ handlers: [
466
+ {
467
+ type: 'fetch',
468
+ routes: mcpRoutes(surfacePaths[surface], { bareDiscovery: false }),
469
+ },
470
+ ],
471
+ tags: collectTags(toolIds, tagsFor),
472
+ });
473
+ mcpEndpoints.push({
474
+ unitName,
475
+ toolFunctionIds: toolIds,
476
+ resourceFunctionIds: [],
477
+ promptFunctionIds: [],
478
+ });
479
+ }
391
480
  const allMcpIds = [...mcpToolIds, ...mcpResourceIds, ...mcpPromptIds];
392
481
  if (allMcpIds.length > 0) {
393
482
  const unitName = 'mcp-server';
@@ -399,7 +488,7 @@ export function analyzeDeployment(state, options) {
399
488
  functionIds: [], // No function code bundled
400
489
  services: [],
401
490
  dependsOn: mcpFuncUnitNames,
402
- handlers: [{ type: 'fetch', routes: [] }],
491
+ handlers: [{ type: 'fetch', routes: mcpRoutes(MCP_PATH) }],
403
492
  tags: collectTags(allMcpIds, tagsFor),
404
493
  });
405
494
  mcpEndpoints.push({
@@ -111,6 +111,8 @@ export declare function runBuildPipeline(options: {
111
111
  srcDirectories?: string[];
112
112
  /** Emit sourcemaps + per-unit `metafile.json` (debug-only). Default false. */
113
113
  debugArtifacts?: boolean;
114
+ /** Overrides the provider's own choice when set. See PikkuCLIConfig. */
115
+ mangleIdentifiers?: boolean;
114
116
  logger: BuildLogger;
115
117
  /** Runtime-specific bundler (esbuild for node, Bun.build for bun). */
116
118
  bundler: Bundler;
@@ -193,7 +193,7 @@ function resolveLifecycle(unitDir, state) {
193
193
  };
194
194
  }
195
195
  export async function runBuildPipeline(options) {
196
- const { projectDir, projectId, provider, inspectorState, getEntryContext, debugArtifacts, logger, bundler, } = options;
196
+ const { projectDir, projectId, provider, inspectorState, getEntryContext, debugArtifacts, mangleIdentifiers, logger, bundler, } = options;
197
197
  const deployDir = options.deployDir ?? join(projectDir, '.deploy');
198
198
  const providerDir = join(deployDir, provider.deployDirName);
199
199
  // Step 1: Analyze
@@ -263,7 +263,7 @@ export async function runBuildPipeline(options) {
263
263
  define: provider.getDefine?.(),
264
264
  platform: provider.getPlatform?.(),
265
265
  format: provider.getFormat?.(),
266
- mangleIdentifiers: provider.getMangleIdentifiers?.(),
266
+ mangleIdentifiers: mangleIdentifiers ?? provider.getMangleIdentifiers?.(),
267
267
  noRequireShim: provider.getNoRequireShim?.(),
268
268
  sourcemap: debugArtifacts,
269
269
  emitMetafile: debugArtifacts,
@@ -417,7 +417,7 @@ export async function runBuildPipeline(options) {
417
417
  define: provider.getDefine?.(),
418
418
  platform: provider.getPlatform?.(),
419
419
  format: provider.getFormat?.(),
420
- mangleIdentifiers: provider.getMangleIdentifiers?.(),
420
+ mangleIdentifiers: mangleIdentifiers ?? provider.getMangleIdentifiers?.(),
421
421
  noRequireShim: provider.getNoRequireShim?.(),
422
422
  sourcemap: debugArtifacts,
423
423
  emitMetafile: debugArtifacts,
@@ -442,6 +442,7 @@ export async function runBuildPipeline(options) {
442
442
  define: undefined,
443
443
  platform: 'node',
444
444
  format: 'esm',
445
+ mangleIdentifiers,
445
446
  noRequireShim: false,
446
447
  sourcemap: debugArtifacts,
447
448
  emitMetafile: debugArtifacts,
@@ -99,6 +99,30 @@ export function collectFilterNames(unit, manifest, inspectorState, workflowQueue
99
99
  for (const id of channelDef.functionIds)
100
100
  names.add(id);
101
101
  }
102
+ // A CLI channel is a whole program's transport, not a set of commands.
103
+ //
104
+ // `wireCLI` generates this channel and tags it ['cli', <program>]. Its
105
+ // own wirings are the per-command ones plus `__help` and `__raw`, and
106
+ // those two resolve against `CLIMeta.programs[<program>]` rather than
107
+ // against a wiring — so without the program the channel connects, serves
108
+ // a named command, and answers `__help` with "Program not found".
109
+ //
110
+ // CLI programs are filtered by COMMAND name (see the inspector's
111
+ // filter-inspector-state), and a command name matches nothing in the set
112
+ // above, so every command is dropped and the empty program with it. The
113
+ // program's commands are what has to be asked for.
114
+ if (unit.tags.includes('cli')) {
115
+ const programs = inspectorState.cli?.meta?.programs ?? {};
116
+ for (const tag of unit.tags) {
117
+ const programMeta = programs[tag];
118
+ if (!programMeta)
119
+ continue;
120
+ names.add(tag);
121
+ for (const commandName of Object.keys(programMeta.commands ?? {})) {
122
+ names.add(commandName);
123
+ }
124
+ }
125
+ }
102
126
  break;
103
127
  }
104
128
  case 'function': {
@@ -134,6 +134,7 @@ export declare const fabricCommands: {
134
134
  branch?: string | undefined;
135
135
  force?: boolean | undefined;
136
136
  apiUrl?: string | undefined;
137
+ organization?: string | undefined;
137
138
  }, {
138
139
  projectId: string;
139
140
  projectSlug: string;
@@ -144,6 +145,7 @@ export declare const fabricCommands: {
144
145
  branch?: string | undefined;
145
146
  force?: boolean | undefined;
146
147
  apiUrl?: string | undefined;
148
+ organization?: string | undefined;
147
149
  }, {
148
150
  projectId: string;
149
151
  projectSlug: string;
@@ -154,6 +156,7 @@ export declare const fabricCommands: {
154
156
  branch?: string | undefined;
155
157
  force?: boolean | undefined;
156
158
  apiUrl?: string | undefined;
159
+ organization?: string | undefined;
157
160
  }, {
158
161
  projectId: string;
159
162
  projectSlug: string;
@@ -164,6 +167,7 @@ export declare const fabricCommands: {
164
167
  github?: boolean | undefined;
165
168
  gitea?: boolean | undefined;
166
169
  repoName?: string | undefined;
170
+ organization?: string | undefined;
167
171
  }, {
168
172
  projectId: string;
169
173
  projectSlug: string;
@@ -174,6 +178,7 @@ export declare const fabricCommands: {
174
178
  github?: boolean | undefined;
175
179
  gitea?: boolean | undefined;
176
180
  repoName?: string | undefined;
181
+ organization?: string | undefined;
177
182
  }, {
178
183
  projectId: string;
179
184
  projectSlug: string;
@@ -184,6 +189,7 @@ export declare const fabricCommands: {
184
189
  github?: boolean | undefined;
185
190
  gitea?: boolean | undefined;
186
191
  repoName?: string | undefined;
192
+ organization?: string | undefined;
187
193
  }, {
188
194
  projectId: string;
189
195
  projectSlug: string;
@@ -1205,6 +1211,7 @@ export declare const fabricCommands: {
1205
1211
  apiUrl?: string | undefined;
1206
1212
  changeId: string;
1207
1213
  question: string;
1214
+ option?: string[] | undefined;
1208
1215
  authorName?: string | undefined;
1209
1216
  }, {
1210
1217
  message: any;
@@ -1212,6 +1219,7 @@ export declare const fabricCommands: {
1212
1219
  apiUrl?: string | undefined;
1213
1220
  changeId: string;
1214
1221
  question: string;
1222
+ option?: string[] | undefined;
1215
1223
  authorName?: string | undefined;
1216
1224
  }, {
1217
1225
  message: any;
@@ -1219,6 +1227,7 @@ export declare const fabricCommands: {
1219
1227
  apiUrl?: string | undefined;
1220
1228
  changeId: string;
1221
1229
  question: string;
1230
+ option?: string[] | undefined;
1222
1231
  authorName?: string | undefined;
1223
1232
  }, {
1224
1233
  message: any;
@@ -116,6 +116,9 @@ export const fabricCommands = defineCLICommands({
116
116
  description: 'Override the project display name (defaults to repo name)',
117
117
  },
118
118
  branch: { description: 'Default branch (defaults to main)' },
119
+ organization: {
120
+ description: 'Organization to import into — slug, name or id (defaults to the one your session is in)',
121
+ },
119
122
  force: {
120
123
  description: 'Replace existing fabric.config.json',
121
124
  default: false,
@@ -138,6 +141,9 @@ export const fabricCommands = defineCLICommands({
138
141
  repoName: {
139
142
  description: 'Name for a repo created by --gitea (defaults to the directory name)',
140
143
  },
144
+ organization: {
145
+ description: 'Organization to import into — slug, name or id (defaults to the one your session is in)',
146
+ },
141
147
  apiUrl: {
142
148
  description: 'Override the fabric-api URL stored in fabric.config.json',
143
149
  },
@@ -591,9 +597,13 @@ export const fabricCommands = defineCLICommands({
591
597
  options: {
592
598
  changeId: { description: 'The item the question is about' },
593
599
  question: {
594
- description: 'One decision, in the filer’s vocabulary, with the options named',
600
+ description: 'One decision, in the filer’s vocabulary. Name the choices with --option, not as “(a) … (b) …” inside this text',
595
601
  short: 'q',
596
602
  },
603
+ option: {
604
+ description: 'A choice the filer can click, repeatable — e.g. --option "Reprice them" --option "Leave them". Without these they have to type an answer',
605
+ type: 'string[]',
606
+ },
597
607
  authorName: { description: 'Who is asking, e.g. claude-code' },
598
608
  apiUrl: { description: 'Override the fabric-api URL for this call' },
599
609
  },
@@ -4,6 +4,7 @@ export declare const FabricChangesAskInput: z.ZodObject<{
4
4
  apiUrl: z.ZodOptional<z.ZodString>;
5
5
  changeId: z.ZodString;
6
6
  question: z.ZodString;
7
+ option: z.ZodOptional<z.ZodArray<z.ZodString>>;
7
8
  authorName: z.ZodOptional<z.ZodString>;
8
9
  }, z.core.$strip>;
9
10
  export declare const FabricChangesAskOutput: z.ZodObject<{
@@ -13,6 +14,7 @@ export declare const FabricChangesAsk: import("../../../.pikku/function/pikku-fu
13
14
  apiUrl?: string | undefined;
14
15
  changeId: string;
15
16
  question: string;
17
+ option?: string[] | undefined;
16
18
  authorName?: string | undefined;
17
19
  }, {
18
20
  message: any;
@@ -20,6 +22,7 @@ export declare const FabricChangesAsk: import("../../../.pikku/function/pikku-fu
20
22
  apiUrl?: string | undefined;
21
23
  changeId: string;
22
24
  question: string;
25
+ option?: string[] | undefined;
23
26
  authorName?: string | undefined;
24
27
  }, {
25
28
  message: any;
@@ -27,6 +30,7 @@ export declare const FabricChangesAsk: import("../../../.pikku/function/pikku-fu
27
30
  apiUrl?: string | undefined;
28
31
  changeId: string;
29
32
  question: string;
33
+ option?: string[] | undefined;
30
34
  authorName?: string | undefined;
31
35
  }, {
32
36
  message: any;
@@ -1,11 +1,12 @@
1
1
  import { z } from 'zod';
2
2
  import { pikkuSessionlessFunc } from '../../../.pikku/function/index.js';
3
3
  import { changesContext } from '../lib/changes.js';
4
- import { dim, safeBlock } from '../lib/output.js';
4
+ import { dim, safe, safeBlock } from '../lib/output.js';
5
5
  export const FabricChangesAskInput = z.object({
6
6
  apiUrl: z.string().optional(),
7
7
  changeId: z.string(),
8
8
  question: z.string().trim().min(1, 'Ask something — the question is empty.'),
9
+ option: z.array(z.string().trim().min(1)).max(6).optional(),
9
10
  authorName: z.string().optional(),
10
11
  });
11
12
  export const FabricChangesAskOutput = z.object({
@@ -21,10 +22,15 @@ export const FabricChangesAsk = pikkuSessionlessFunc({
21
22
  changeId: input.changeId,
22
23
  question: input.question,
23
24
  authorName: input.authorName ?? 'pikku-cli',
25
+ ...(input.option?.length ? { option: input.option } : {}),
24
26
  });
25
27
  },
26
28
  });
27
29
  export const renderChangesAsk = (_s, { message }) => {
30
+ const options = (message.attachments ?? []).filter((attachment) => attachment.kind === 'option');
28
31
  console.log('Asked — the item now shows as needing an answer in the panel.');
29
32
  console.log(dim(` ${safeBlock(message.body)}`));
33
+ if (options.length) {
34
+ console.log(dim(` they can click: ${options.map(({ label }) => safe(label)).join(' · ')}`));
35
+ }
30
36
  };
@@ -5,6 +5,7 @@ export declare const FabricInitInput: z.ZodObject<{
5
5
  branch: z.ZodOptional<z.ZodString>;
6
6
  force: z.ZodOptional<z.ZodBoolean>;
7
7
  apiUrl: z.ZodOptional<z.ZodString>;
8
+ organization: z.ZodOptional<z.ZodString>;
8
9
  }, z.core.$strip>;
9
10
  export declare const FabricInitOutput: z.ZodObject<{
10
11
  projectId: z.ZodString;
@@ -24,6 +25,7 @@ export declare const FabricInit: import("../../../.pikku/function/pikku-function
24
25
  branch?: string | undefined;
25
26
  force?: boolean | undefined;
26
27
  apiUrl?: string | undefined;
28
+ organization?: string | undefined;
27
29
  }, {
28
30
  projectId: string;
29
31
  projectSlug: string;
@@ -34,6 +36,7 @@ export declare const FabricInit: import("../../../.pikku/function/pikku-function
34
36
  branch?: string | undefined;
35
37
  force?: boolean | undefined;
36
38
  apiUrl?: string | undefined;
39
+ organization?: string | undefined;
37
40
  }, {
38
41
  projectId: string;
39
42
  projectSlug: string;
@@ -44,6 +47,7 @@ export declare const FabricInit: import("../../../.pikku/function/pikku-function
44
47
  branch?: string | undefined;
45
48
  force?: boolean | undefined;
46
49
  apiUrl?: string | undefined;
50
+ organization?: string | undefined;
47
51
  }, {
48
52
  projectId: string;
49
53
  projectSlug: string;
@@ -3,12 +3,14 @@ import { pikkuSessionlessFunc } from '../../../.pikku/function/index.js';
3
3
  import { findProjectConfig, isLinkedProjectId, resolveApiContext, writeProjectConfig, } from '../lib/config.js';
4
4
  import { getFabricRPC } from '../lib/http.js';
5
5
  import { FabricPreconditionError } from '../lib/errors.js';
6
+ import { resolveOrganizationId } from '../lib/organization.js';
6
7
  export const FabricInitInput = z.object({
7
8
  repo: z.string(),
8
9
  name: z.string().optional(),
9
10
  branch: z.string().optional(),
10
11
  force: z.boolean().optional(),
11
12
  apiUrl: z.string().optional(),
13
+ organization: z.string().optional(),
12
14
  });
13
15
  export const FabricInitOutput = z.object({
14
16
  projectId: z.string(),
@@ -26,7 +28,7 @@ export const FabricInit = pikkuSessionlessFunc({
26
28
  description: 'Adopt an existing repo as a fabric project (writes fabric.config.json).',
27
29
  input: FabricInitInput,
28
30
  output: FabricInitOutput,
29
- func: async (_services, { repo, name, branch, force, apiUrl: apiUrlOverride }) => {
31
+ func: async (_services, { repo, name, branch, force, apiUrl: apiUrlOverride, organization }) => {
30
32
  const ctx = await resolveApiContext({ apiUrlOverride });
31
33
  if (!ctx.token)
32
34
  throw new FabricPreconditionError('Not logged in. Run `pikku fabric login` first.');
@@ -35,11 +37,13 @@ export const FabricInit = pikkuSessionlessFunc({
35
37
  throw new FabricPreconditionError(`Already linked: ${existing.config.projectId} at ${existing.path}. Pass --force to replace.`);
36
38
  }
37
39
  const rpc = getFabricRPC({ apiUrl: ctx.apiUrl, token: ctx.token });
40
+ const organizationId = await resolveOrganizationId(rpc, organization);
38
41
  const result = await rpc.invoke('importProject', {
39
42
  repoUrl: repo,
40
43
  name,
41
44
  defaultBranch: branch,
42
45
  productionBranch: 'main',
46
+ ...(organizationId ? { organizationId } : {}),
43
47
  });
44
48
  const path = await writeProjectConfig(process.cwd(), {
45
49
  projectId: result.projectId,
@@ -4,6 +4,7 @@ export declare const FabricLinkInput: z.ZodObject<{
4
4
  github: z.ZodOptional<z.ZodBoolean>;
5
5
  gitea: z.ZodOptional<z.ZodBoolean>;
6
6
  repoName: z.ZodOptional<z.ZodString>;
7
+ organization: z.ZodOptional<z.ZodString>;
7
8
  }, z.core.$strip>;
8
9
  export declare const FabricLinkOutput: z.ZodObject<{
9
10
  projectId: z.ZodString;
@@ -16,6 +17,7 @@ export declare const FabricLink: import("../../../.pikku/function/pikku-function
16
17
  github?: boolean | undefined;
17
18
  gitea?: boolean | undefined;
18
19
  repoName?: string | undefined;
20
+ organization?: string | undefined;
19
21
  }, {
20
22
  projectId: string;
21
23
  projectSlug: string;
@@ -26,6 +28,7 @@ export declare const FabricLink: import("../../../.pikku/function/pikku-function
26
28
  github?: boolean | undefined;
27
29
  gitea?: boolean | undefined;
28
30
  repoName?: string | undefined;
31
+ organization?: string | undefined;
29
32
  }, {
30
33
  projectId: string;
31
34
  projectSlug: string;
@@ -36,6 +39,7 @@ export declare const FabricLink: import("../../../.pikku/function/pikku-function
36
39
  github?: boolean | undefined;
37
40
  gitea?: boolean | undefined;
38
41
  repoName?: string | undefined;
42
+ organization?: string | undefined;
39
43
  }, {
40
44
  projectId: string;
41
45
  projectSlug: string;
@@ -5,6 +5,7 @@ import { resolveApiContext, writeProjectConfig } from '../lib/config.js';
5
5
  import { getFabricRPC } from '../lib/http.js';
6
6
  import { addRemote, assertDeploySafety, currentBranch, getRemoteUrl, hasCommits, hasRemote, isWorkingTreeClean, pushWithCredential, removeRemote, } from '../lib/git.js';
7
7
  import { FabricPreconditionError } from '../lib/errors.js';
8
+ import { resolveOrganizationId } from '../lib/organization.js';
8
9
  import { promptConfirm } from '../lib/prompt.js';
9
10
  export const FabricLinkInput = z.object({
10
11
  apiUrl: z.string().optional(),
@@ -14,6 +15,8 @@ export const FabricLinkInput = z.object({
14
15
  gitea: z.boolean().optional(),
15
16
  /** Name for a repo created here. Defaults to the directory name. */
16
17
  repoName: z.string().optional(),
18
+ /** Slug, name or id of the organization to import into. Defaults to the session's. */
19
+ organization: z.string().optional(),
17
20
  });
18
21
  export const FabricLinkOutput = z.object({
19
22
  projectId: z.string(),
@@ -29,7 +32,7 @@ export const FabricLink = pikkuSessionlessFunc({
29
32
  description: 'Register the current git repo as a fabric project and queue an initial deploy.',
30
33
  input: FabricLinkInput,
31
34
  output: FabricLinkOutput,
32
- func: async (_services, { apiUrl: apiUrlOverride, github, gitea, repoName }) => {
35
+ func: async (_services, { apiUrl: apiUrlOverride, github, gitea, repoName, organization }) => {
33
36
  const ctx = await resolveApiContext({ apiUrlOverride });
34
37
  if (!ctx.token) {
35
38
  throw new FabricPreconditionError('Not logged in. Run `pikku fabric login` first.');
@@ -48,6 +51,10 @@ export const FabricLink = pikkuSessionlessFunc({
48
51
  if (!(await isWorkingTreeClean())) {
49
52
  throw new FabricPreconditionError('Deployment blocked: uncommitted changes detected.\nCommit and push your changes before deploying.');
50
53
  }
54
+ // Resolved here for the same reason, since `--gitea` reaches `createRemote`
55
+ // below: a misspelt organization must not cost the user a repository they
56
+ // then have to go and delete.
57
+ const organizationId = await resolveOrganizationId(rpc, organization);
51
58
  const remoteUrl = (await hasRemote())
52
59
  ? await adoptExistingRemote({ github, gitea })
53
60
  : await createRemote({ rpc, github, gitea, repoName });
@@ -85,6 +92,7 @@ export const FabricLink = pikkuSessionlessFunc({
85
92
  const project = await rpc.invoke('importProject', {
86
93
  repoUrl: remoteUrl,
87
94
  productionBranch: 'main',
95
+ ...(organizationId ? { organizationId } : {}),
88
96
  });
89
97
  await writeProjectConfig(process.cwd(), {
90
98
  projectId: project.projectId,
@@ -0,0 +1,8 @@
1
+ import type { getFabricRPC } from './http.js';
2
+ /**
3
+ * Turn `--organization` into an id. Fabric derives the owning org from the
4
+ * session when the flag is absent, which silently imports into whichever org
5
+ * the token happens to be scoped to — the flag is how a repo belonging to a
6
+ * different org gets linked without re-logging-in.
7
+ */
8
+ export declare function resolveOrganizationId(rpc: ReturnType<typeof getFabricRPC>, organization: string | undefined): Promise<string | undefined>;
@@ -0,0 +1,26 @@
1
+ import { FabricPreconditionError } from './errors.js';
2
+ const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
3
+ /**
4
+ * Turn `--organization` into an id. Fabric derives the owning org from the
5
+ * session when the flag is absent, which silently imports into whichever org
6
+ * the token happens to be scoped to — the flag is how a repo belonging to a
7
+ * different org gets linked without re-logging-in.
8
+ */
9
+ export async function resolveOrganizationId(rpc, organization) {
10
+ if (!organization)
11
+ return undefined;
12
+ if (UUID.test(organization))
13
+ return organization;
14
+ const { organizations } = await rpc.invoke('listMyOrganizations', {});
15
+ const wanted = organization.toLowerCase();
16
+ const matches = organizations.filter((org) => org.slug.toLowerCase() === wanted || org.name.toLowerCase() === wanted);
17
+ if (matches.length === 0) {
18
+ const known = organizations.map((org) => org.slug).join(', ');
19
+ throw new FabricPreconditionError(`No organization named "${organization}".\nYou belong to: ${known || '(none)'}`);
20
+ }
21
+ if (matches.length > 1) {
22
+ const ids = matches.map((org) => org.organizationId).join(', ');
23
+ throw new FabricPreconditionError(`"${organization}" matches more than one organization. Pass the id instead: ${ids}`);
24
+ }
25
+ return matches[0].organizationId;
26
+ }