@pikku/cli 0.12.159 → 0.12.162

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 (255) hide show
  1. package/console-app/assets/{HelpPanel-C06T226y.js → HelpPanel-DR6oJReA.js} +1 -1
  2. package/console-app/assets/{abnfDiagram-VCTEODGH-BVwdT3Es.js → abnfDiagram-VCTEODGH-C6mt0F-I.js} +1 -1
  3. package/console-app/assets/architecture-7GRP2DOG-C3gcY2os.js +1 -0
  4. package/console-app/assets/{architectureDiagram-5GKGNRK7-XfzqZ3mW.js → architectureDiagram-5GKGNRK7-BPUTuzrJ.js} +1 -1
  5. package/console-app/assets/{blockDiagram-I7D4REHJ-B5omSqDK.js → blockDiagram-I7D4REHJ-IE8X3BZC.js} +1 -1
  6. package/console-app/assets/{c4Diagram-7LVT6UL2-DkPe7xCg.js → c4Diagram-7LVT6UL2--HhbjXSJ.js} +1 -1
  7. package/console-app/assets/channel-CGrTWPVh.js +1 -0
  8. package/console-app/assets/{chunk-4HAMMTFA-QfSXT_X7.js → chunk-4HAMMTFA-B2Cljp_-.js} +1 -1
  9. package/console-app/assets/{chunk-75Z2AOVW-h7UnPWNo.js → chunk-75Z2AOVW-D4684ofZ.js} +1 -1
  10. package/console-app/assets/{chunk-DU6HZSFF-VaMy-LOI.js → chunk-DU6HZSFF-BXipkMhY.js} +1 -1
  11. package/console-app/assets/{chunk-F27PBJKO-toywqOqS.js → chunk-F27PBJKO-BsSS2TqC.js} +1 -1
  12. package/console-app/assets/{chunk-GMAD6QVW-Cpa-YKLB.js → chunk-GMAD6QVW-DJqDw8yU.js} +1 -1
  13. package/console-app/assets/{chunk-GVQU2GXP-BWSHPLNL.js → chunk-GVQU2GXP-CguL9TtP.js} +1 -1
  14. package/console-app/assets/{chunk-IMKFNOWR-yhQzfQuj.js → chunk-IMKFNOWR-DoB5kv29.js} +1 -1
  15. package/console-app/assets/{chunk-L3NEJ4N5-C8pAfDlo.js → chunk-L3NEJ4N5-BspKBmrG.js} +1 -1
  16. package/console-app/assets/{chunk-OSK3NFVY-749yk2fa.js → chunk-OSK3NFVY-DzLs9ozF.js} +1 -1
  17. package/console-app/assets/{chunk-P2QGCYS3-C1Y9GyYT.js → chunk-P2QGCYS3-DAxcyv2x.js} +1 -1
  18. package/console-app/assets/{chunk-POPQ4Y6H-DzI9aRsX.js → chunk-POPQ4Y6H-DyLFn-sn.js} +1 -1
  19. package/console-app/assets/{chunk-PWAF6VOD-D3fAPSwz.js → chunk-PWAF6VOD-VPwoG6QJ.js} +1 -1
  20. package/console-app/assets/{chunk-SHT3W25Y-D9w7LzM9.js → chunk-SHT3W25Y-C0R9Ptyj.js} +1 -1
  21. package/console-app/assets/{chunk-SVP7TREG-D55MjOJw.js → chunk-SVP7TREG-cLgcNTyh.js} +1 -1
  22. package/console-app/assets/{chunk-TICWLB2K-DV8q7H-z.js → chunk-TICWLB2K-C3se3Npx.js} +1 -1
  23. package/console-app/assets/chunk-XXDRQBXY-DLdC0jYP.js +1 -0
  24. package/console-app/assets/classDiagram-ZZMXUADV-yt7BCzQS.js +1 -0
  25. package/console-app/assets/classDiagram-v2-VYDZK3BY-yt7BCzQS.js +1 -0
  26. package/console-app/assets/{cose-bilkent-JH36ORCC-CLedPW9a.js → cose-bilkent-JH36ORCC-L5Nhs9N1.js} +1 -1
  27. package/console-app/assets/{cynefin-OW5HDTMX-CS5NKw2p.js → cynefin-OW5HDTMX-jbgNKIs_.js} +1 -1
  28. package/console-app/assets/{cynefinDiagram-5FMLGOSQ-DGTHW90E.js → cynefinDiagram-5FMLGOSQ-D10NQDH4.js} +1 -1
  29. package/console-app/assets/{dagre-BNQdos_2.js → dagre-DrsKN-Kd.js} +1 -1
  30. package/console-app/assets/{dagre-GXQ25YYZ-DHZ8wtwQ.js → dagre-GXQ25YYZ-NDp4fO1z.js} +1 -1
  31. package/console-app/assets/{diagram-S7CK7UJ4-C41Begsy.js → diagram-S7CK7UJ4-B-9PMbK8.js} +1 -1
  32. package/console-app/assets/{diagram-UQ7AKVKN-CU8D-sRT.js → diagram-UQ7AKVKN-NXSn7aYB.js} +1 -1
  33. package/console-app/assets/{diagram-VSXAHHWV-DTTiXYnQ.js → diagram-VSXAHHWV-DrZgXRIZ.js} +1 -1
  34. package/console-app/assets/{diagram-VX7I27RA-BBy91pxm.js → diagram-VX7I27RA-V3OLFF3v.js} +1 -1
  35. package/console-app/assets/{diagram-Z3DM3KII-D50xTYe5.js → diagram-Z3DM3KII-CawCD3BR.js} +1 -1
  36. package/console-app/assets/{ebnfDiagram-PWID7BFC-BHjnFZgE.js → ebnfDiagram-PWID7BFC-QScQWlzV.js} +1 -1
  37. package/console-app/assets/{erDiagram-RLTQ6QDP-B4-yVo9b.js → erDiagram-RLTQ6QDP-DIhmCYb6.js} +1 -1
  38. package/console-app/assets/eventmodeling-NTZA5JFV-BbwPCOs2.js +1 -0
  39. package/console-app/assets/flowDiagram-HODETNUW-B-xUNJdv.js +1 -0
  40. package/console-app/assets/{ganttDiagram-EL5Y4UJY-D1T-2BlO.js → ganttDiagram-EL5Y4UJY-Bcg0H_3-.js} +1 -1
  41. package/console-app/assets/{gitGraph-4MIJSDKK-ClqKTUfQ.js → gitGraph-4MIJSDKK-BUYXp4LH.js} +1 -1
  42. package/console-app/assets/{gitGraphDiagram-WWUBYQGX-ruq2MAhM.js → gitGraphDiagram-WWUBYQGX-DRxwgliX.js} +1 -1
  43. package/console-app/assets/{graphlib-D-vLYPdw.js → graphlib-BXZn3TnO.js} +1 -1
  44. package/console-app/assets/{index-BIEZPuyK.js → index-D7ATEpJh.js} +27 -27
  45. package/console-app/assets/{info-A6RAGUB7-BGI-8HNB.js → info-A6RAGUB7-BAfA_BVB.js} +1 -1
  46. package/console-app/assets/{infoDiagram-27XIBGKW-BGURgKHv.js → infoDiagram-27XIBGKW-JPbCbDjB.js} +1 -1
  47. package/console-app/assets/{ishikawaDiagram-5VMMS53U-DzgAaPTR.js → ishikawaDiagram-5VMMS53U-528xNFds.js} +1 -1
  48. package/console-app/assets/{journeyDiagram-3NMN7TZE-BsyWad8z.js → journeyDiagram-3NMN7TZE-CpnC76my.js} +1 -1
  49. package/console-app/assets/{kanban-definition-UXKFOSKX-g1nO2rWF.js → kanban-definition-UXKFOSKX-7v_OexVf.js} +1 -1
  50. package/console-app/assets/{line-CeFoQ5y-.js → line-BXTtRzTv.js} +1 -1
  51. package/console-app/assets/{linear-C4Pk-YMX.js → linear-BXIxFuy8.js} +1 -1
  52. package/console-app/assets/{mermaid-parser.core-U7wquvx8.js → mermaid-parser.core-Bn81UzgU.js} +3 -3
  53. package/console-app/assets/{mermaid.core-8TRpFRm9.js → mermaid.core-CShTFU_y.js} +4 -4
  54. package/console-app/assets/{mindmap-definition-YA3MSWOX-C7lzwqBX.js → mindmap-definition-YA3MSWOX-Dozk2qNE.js} +1 -1
  55. package/console-app/assets/{packet-AYTQ26CC-DiQV_rU3.js → packet-AYTQ26CC-CQ1T9gCW.js} +1 -1
  56. package/console-app/assets/{pegDiagram-XKGWAZYB-63ajP7-W.js → pegDiagram-XKGWAZYB-CAKNYwkF.js} +1 -1
  57. package/console-app/assets/{pie-WAS4IAKB-B5q_o6dr.js → pie-WAS4IAKB-XBhMekP0.js} +1 -1
  58. package/console-app/assets/{pieDiagram-E7YTZNPT-BTbvj-by.js → pieDiagram-E7YTZNPT-CQH9g9Im.js} +1 -1
  59. package/console-app/assets/{quadrantDiagram-AXDQQJYC-CulqsAYd.js → quadrantDiagram-AXDQQJYC-BYry9NEL.js} +1 -1
  60. package/console-app/assets/{radar-RG4KPBEZ-CW_KoURS.js → radar-RG4KPBEZ-BHk3GM2h.js} +1 -1
  61. package/console-app/assets/{railroad-74A4TZTK-CUmF6uBQ.js → railroad-74A4TZTK-B-GsJq3u.js} +1 -1
  62. package/console-app/assets/railroad-abnf-HS5TGJTU-Dqco3Udm.js +1 -0
  63. package/console-app/assets/railroad-ebnf-LZEXJU2U-DZqyOzxq.js +1 -0
  64. package/console-app/assets/railroad-peg-WCYAUIDC-DtfiBwRd.js +1 -0
  65. package/console-app/assets/{railroadDiagram-O6MQD6OU-WlkBu_N3.js → railroadDiagram-O6MQD6OU-CAIv58C8.js} +1 -1
  66. package/console-app/assets/{requirementDiagram-BXWQKSXE-CJK_CbPR.js → requirementDiagram-BXWQKSXE-DJ3f5870.js} +1 -1
  67. package/console-app/assets/{sankeyDiagram-P5KCCOFB-C466WOH8.js → sankeyDiagram-P5KCCOFB-YrQnQsb7.js} +1 -1
  68. package/console-app/assets/{sequenceDiagram-WJ2MYXX4-CV0dCcj0.js → sequenceDiagram-WJ2MYXX4-B-tyzF2R.js} +1 -1
  69. package/console-app/assets/{src-P4Nw8sY0.js → src-DV6LWVlf.js} +1 -1
  70. package/console-app/assets/{stateDiagram-D77RDMKH-HaLGm8V9.js → stateDiagram-D77RDMKH-vMePRkxV.js} +1 -1
  71. package/console-app/assets/stateDiagram-v2-MP3YSRHH-Cojsq9SW.js +1 -0
  72. package/console-app/assets/{swimlanes-42K2YHIH-Bi-O5vWa.js → swimlanes-42K2YHIH-CqQsTH0R.js} +1 -1
  73. package/console-app/assets/swimlanesDiagram-VR7AAH4N-0DUuvodn.js +8 -0
  74. package/console-app/assets/{timeline-definition-24CTP7MA-B4h-gx-i.js → timeline-definition-24CTP7MA-D3OGq7c8.js} +1 -1
  75. package/console-app/assets/{treeView-Q6P3EWNA-CXJ_pHQw.js → treeView-Q6P3EWNA-DZA143I6.js} +1 -1
  76. package/console-app/assets/{treemap-WGGIJYW6-M84p2a_3.js → treemap-WGGIJYW6-N5Dr2J8o.js} +1 -1
  77. package/console-app/assets/{vennDiagram-4TSXK5OY-BesF4k_r.js → vennDiagram-4TSXK5OY-CjQrrdPE.js} +1 -1
  78. package/console-app/assets/{wardley-WFR3VGLG-n9ulickP.js → wardley-WFR3VGLG-CWrUebhA.js} +1 -1
  79. package/console-app/assets/{wardleyDiagram-VM6X3IG4-BG0nnWDf.js → wardleyDiagram-VM6X3IG4-Bd-nerY3.js} +1 -1
  80. package/console-app/assets/{xychartDiagram-S5SC5T6Z-BtOW7fpF.js → xychartDiagram-S5SC5T6Z-CK3-JaeF.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-types.gen.d.ts +1 -1
  110. package/dist/.pikku/cli/pikku-cli-types.gen.js +1 -1
  111. package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.js +1 -1
  112. package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.json +25 -0
  113. package/dist/.pikku/cli/pikku-cli-wirings.gen.d.ts +1 -1
  114. package/dist/.pikku/cli/pikku-cli-wirings.gen.js +1 -1
  115. package/dist/.pikku/cli/pikku-cli.gen.d.ts +1 -1
  116. package/dist/.pikku/cli/pikku-cli.gen.js +1 -1
  117. package/dist/.pikku/error/index.d.ts +1 -1
  118. package/dist/.pikku/error/index.js +1 -1
  119. package/dist/.pikku/error/pikku-error-types.gen.d.ts +1 -1
  120. package/dist/.pikku/error/pikku-error-types.gen.js +1 -1
  121. package/dist/.pikku/function/index.d.ts +1 -1
  122. package/dist/.pikku/function/index.js +1 -1
  123. package/dist/.pikku/function/pikku-function-types.gen.d.ts +1 -1
  124. package/dist/.pikku/function/pikku-function-types.gen.js +1 -1
  125. package/dist/.pikku/function/pikku-functions-meta.gen.js +1 -1
  126. package/dist/.pikku/function/pikku-functions-meta.gen.json +22 -5
  127. package/dist/.pikku/function/pikku-functions.gen.js +1 -1
  128. package/dist/.pikku/gateway/index.d.ts +1 -1
  129. package/dist/.pikku/gateway/index.js +1 -1
  130. package/dist/.pikku/gateway/pikku-gateway-types.gen.d.ts +1 -1
  131. package/dist/.pikku/gateway/pikku-gateway-types.gen.js +1 -1
  132. package/dist/.pikku/http/index.d.ts +1 -1
  133. package/dist/.pikku/http/index.js +1 -1
  134. package/dist/.pikku/http/pikku-http-types.gen.d.ts +1 -1
  135. package/dist/.pikku/http/pikku-http-types.gen.js +1 -1
  136. package/dist/.pikku/mcp/index.d.ts +1 -1
  137. package/dist/.pikku/mcp/index.js +1 -1
  138. package/dist/.pikku/mcp/pikku-mcp-types.gen.d.ts +1 -1
  139. package/dist/.pikku/mcp/pikku-mcp-types.gen.js +1 -1
  140. package/dist/.pikku/middleware/index.d.ts +1 -1
  141. package/dist/.pikku/middleware/index.js +1 -1
  142. package/dist/.pikku/middleware/pikku-middleware-types.gen.d.ts +1 -1
  143. package/dist/.pikku/middleware/pikku-middleware-types.gen.js +1 -1
  144. package/dist/.pikku/pikku-bootstrap-scenarios.gen.d.ts +1 -1
  145. package/dist/.pikku/pikku-bootstrap-scenarios.gen.js +1 -1
  146. package/dist/.pikku/pikku-bootstrap.gen.d.ts +1 -1
  147. package/dist/.pikku/pikku-bootstrap.gen.js +1 -1
  148. package/dist/.pikku/pikku-services.gen.d.ts +1 -1
  149. package/dist/.pikku/queue/index.d.ts +1 -1
  150. package/dist/.pikku/queue/index.js +1 -1
  151. package/dist/.pikku/queue/pikku-queue-types.gen.d.ts +1 -1
  152. package/dist/.pikku/queue/pikku-queue-types.gen.js +1 -1
  153. package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.js +1 -1
  154. package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.d.ts +1 -1
  155. package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.js +1 -1
  156. package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.js +1 -1
  157. package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.json +1 -0
  158. package/dist/.pikku/scenarios/index.d.ts +1 -1
  159. package/dist/.pikku/scenarios/index.js +1 -1
  160. package/dist/.pikku/scenarios/pikku-personas.gen.js +1 -1
  161. package/dist/.pikku/scenarios/pikku-scenario-functions-meta.gen.js +1 -1
  162. package/dist/.pikku/scenarios/pikku-scenario-functions.gen.d.ts +1 -1
  163. package/dist/.pikku/scenarios/pikku-scenario-types.gen.d.ts +7 -1
  164. package/dist/.pikku/scenarios/pikku-scenario-wirings-meta.gen.js +1 -1
  165. package/dist/.pikku/scenarios/pikku-scenario-wirings.gen.d.ts +1 -1
  166. package/dist/.pikku/scenarios/schemas/register.gen.d.ts +1 -1
  167. package/dist/.pikku/scenarios/schemas/register.gen.js +1 -1
  168. package/dist/.pikku/scheduler/index.d.ts +1 -1
  169. package/dist/.pikku/scheduler/index.js +1 -1
  170. package/dist/.pikku/scheduler/pikku-scheduler-types.gen.d.ts +1 -1
  171. package/dist/.pikku/scheduler/pikku-scheduler-types.gen.js +1 -1
  172. package/dist/.pikku/schemas/register.gen.js +3 -1
  173. package/dist/.pikku/schemas/schemas/ScenarioGuideInput.schema.json +1 -0
  174. package/dist/.pikku/scopes/index.d.ts +1 -1
  175. package/dist/.pikku/scopes/index.js +1 -1
  176. package/dist/.pikku/scopes/pikku-flags.gen.d.ts +1 -1
  177. package/dist/.pikku/scopes/pikku-personas.gen.js +1 -1
  178. package/dist/.pikku/scopes/pikku-roles.gen.d.ts +1 -1
  179. package/dist/.pikku/scopes/pikku-scope-types.gen.d.ts +1 -1
  180. package/dist/.pikku/scopes/pikku-scope-types.gen.js +1 -1
  181. package/dist/.pikku/scopes/pikku-scopes.gen.d.ts +1 -1
  182. package/dist/.pikku/secrets/index.d.ts +1 -1
  183. package/dist/.pikku/secrets/index.js +1 -1
  184. package/dist/.pikku/secrets/pikku-secret-types.gen.d.ts +1 -1
  185. package/dist/.pikku/secrets/pikku-secret-types.gen.js +1 -1
  186. package/dist/.pikku/secrets/pikku-secrets.gen.d.ts +1 -1
  187. package/dist/.pikku/secrets/pikku-secrets.gen.js +1 -1
  188. package/dist/.pikku/services/pikku-meta-service.gen.d.ts +1 -1
  189. package/dist/.pikku/services/pikku-meta-service.gen.js +1 -1
  190. package/dist/.pikku/setup/index.d.ts +1 -1
  191. package/dist/.pikku/setup/index.js +1 -1
  192. package/dist/.pikku/setup/pikku-setup-types.gen.d.ts +1 -1
  193. package/dist/.pikku/setup/pikku-setup-types.gen.js +1 -1
  194. package/dist/.pikku/trigger/index.d.ts +1 -1
  195. package/dist/.pikku/trigger/index.js +1 -1
  196. package/dist/.pikku/trigger/pikku-trigger-types.gen.d.ts +1 -1
  197. package/dist/.pikku/trigger/pikku-trigger-types.gen.js +1 -1
  198. package/dist/.pikku/variables/index.d.ts +1 -1
  199. package/dist/.pikku/variables/index.js +1 -1
  200. package/dist/.pikku/variables/pikku-variable-types.gen.d.ts +1 -1
  201. package/dist/.pikku/variables/pikku-variable-types.gen.js +1 -1
  202. package/dist/.pikku/variables/pikku-variables.gen.d.ts +1 -1
  203. package/dist/.pikku/variables/pikku-variables.gen.js +1 -1
  204. package/dist/.pikku/workflow/index.d.ts +1 -1
  205. package/dist/.pikku/workflow/index.js +1 -1
  206. package/dist/.pikku/workflow/pikku-workflow-types.gen.d.ts +1 -1
  207. package/dist/.pikku/workflow/pikku-workflow-types.gen.js +1 -1
  208. package/dist/.pikku/workflow/pikku-workflow-wirings-meta.gen.js +1 -1
  209. package/dist/.pikku/workflow/pikku-workflow-wirings.gen.js +1 -1
  210. package/dist/bin/pikku-bin.mjs +2 -2
  211. package/dist/src/cli.wiring.js +25 -1
  212. package/dist/src/deploy/analyzer/analyzer.js +7 -1
  213. package/dist/src/deploy/build-pipeline.d.ts +2 -0
  214. package/dist/src/deploy/build-pipeline.js +4 -3
  215. package/dist/src/functions/commands/deploy-apply.js +1 -0
  216. package/dist/src/functions/commands/deploy-plan.js +1 -0
  217. package/dist/src/functions/commands/scenario-guide.d.ts +184 -0
  218. package/dist/src/functions/commands/scenario-guide.js +313 -0
  219. package/dist/src/functions/commands/scenario-ladder.d.ts +3 -1
  220. package/dist/src/functions/commands/scenario-ladder.js +1 -0
  221. package/dist/src/functions/commands/scenario-plan.d.ts +17 -1
  222. package/dist/src/functions/commands/scenario-plan.js +15 -0
  223. package/dist/src/functions/commands/scenario.d.ts +30 -0
  224. package/dist/src/functions/commands/scenario.js +186 -22
  225. package/dist/src/functions/commands/serve.js +7 -2
  226. package/dist/src/functions/surface/collect-snippets.d.ts +1 -13
  227. package/dist/src/functions/surface/collect-snippets.js +1 -83
  228. package/dist/src/functions/validate/type-identity-checks.d.ts +3 -2
  229. package/dist/src/functions/validate/type-identity-checks.js +74 -5
  230. package/dist/src/functions/validate/validate-registry.js +3 -3
  231. package/dist/src/functions/wirings/auth/serialize-auth-gen.js +33 -1
  232. package/dist/src/functions/wirings/functions/serialize-addon-types.js +4 -2
  233. package/dist/src/functions/wirings/rpc/pikku-command-react-query.js +3 -2
  234. package/dist/src/functions/wirings/rpc/serialize-react-query-hooks.d.ts +1 -1
  235. package/dist/src/functions/wirings/rpc/serialize-react-query-hooks.js +54 -3
  236. package/dist/src/functions/wirings/scenarios/serialize-feature-meta.js +1 -0
  237. package/dist/src/functions/wirings/workflow/serialize-scenario-types.js +6 -0
  238. package/dist/src/services.js +3 -1
  239. package/dist/tsconfig.tsbuildinfo +1 -1
  240. package/package.json +10 -10
  241. package/snippets-meta.json +1 -0
  242. package/snippets.json +1 -0
  243. package/surface.json +7 -3
  244. package/console-app/assets/architecture-7GRP2DOG-3y7bWtag.js +0 -1
  245. package/console-app/assets/channel-CTiluQVw.js +0 -1
  246. package/console-app/assets/chunk-XXDRQBXY-DBtYQykd.js +0 -1
  247. package/console-app/assets/classDiagram-ZZMXUADV-BnWa-i9n.js +0 -1
  248. package/console-app/assets/classDiagram-v2-VYDZK3BY-BnWa-i9n.js +0 -1
  249. package/console-app/assets/eventmodeling-NTZA5JFV-C_IpFSCw.js +0 -1
  250. package/console-app/assets/flowDiagram-HODETNUW-Q90rgVpx.js +0 -1
  251. package/console-app/assets/railroad-abnf-HS5TGJTU-CcPw9q8a.js +0 -1
  252. package/console-app/assets/railroad-ebnf-LZEXJU2U-Ci_fZics.js +0 -1
  253. package/console-app/assets/railroad-peg-WCYAUIDC-DTsDykSf.js +0 -1
  254. package/console-app/assets/stateDiagram-v2-MP3YSRHH--GM14Hz5.js +0 -1
  255. package/console-app/assets/swimlanesDiagram-VR7AAH4N-_6rRi6Wt.js +0 -8
@@ -0,0 +1,313 @@
1
+ /**
2
+ * The user guide a scenario suite already contains.
3
+ *
4
+ * A feature reads as a page and a scenario as a section — `pikku scenario
5
+ * guide` is the compiler that joins that to the editorial prose an app checks
6
+ * in under `docs/`, and writes markdown. It renders no HTML, resolves no asset
7
+ * URLs and knows about no website: an image is an ordinary relative
8
+ * `![alt](path)`, and a consumer that needs a different path rewrites it.
9
+ *
10
+ * Nothing here reads the filesystem or the registry. The command assembles a
11
+ * {@link GuideFeature} per registered feature and a {@link GuidePage} per
12
+ * editorial source; everything below is a pure function of those, which is what
13
+ * makes the output byte-identical across runs.
14
+ */
15
+ import { createHash } from 'node:crypto';
16
+ import { parse, stringify } from 'yaml';
17
+ const FRONTMATTER = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/;
18
+ /**
19
+ * Read one editorial source.
20
+ *
21
+ * A page cites a feature by leaving the marker pair where the block belongs —
22
+ * an author writing `<!-- pikku:guide feature=x -->` followed by
23
+ * `<!-- /pikku:guide -->` and nothing between them. That one line is both
24
+ * halves of the job: it says *where* the block goes, which a frontmatter list
25
+ * cannot express, and it is what the coverage gate counts to decide *whether* a
26
+ * feature is documented at all. The mapping stays many-to-many and falls out of
27
+ * the union of every marker in the tree, so a feature written about in three
28
+ * places needs no index to say so.
29
+ */
30
+ export const parseGuidePage = (path, content) => {
31
+ const match = content.match(FRONTMATTER);
32
+ if (!match) {
33
+ throw new Error(`${path} has no frontmatter — a guide page opens with a \`---\` block carrying at least a title.`);
34
+ }
35
+ let frontmatter;
36
+ try {
37
+ frontmatter = parse(match[1]) ?? {};
38
+ }
39
+ catch (e) {
40
+ throw new Error(`${path} has unreadable frontmatter: ${e?.message ?? e}`);
41
+ }
42
+ if (frontmatter.features !== undefined) {
43
+ throw new Error(`${path} declares \`features:\` in its frontmatter. A page cites a feature by placing \`<!-- pikku:guide feature=<id> -->\` and \`<!-- /pikku:guide -->\` in the body where the block belongs.`);
44
+ }
45
+ const body = match[2] ?? '';
46
+ return {
47
+ path,
48
+ ...(typeof frontmatter.title === 'string'
49
+ ? { title: frontmatter.title }
50
+ : {}),
51
+ ...(typeof frontmatter.description === 'string'
52
+ ? { description: frontmatter.description }
53
+ : {}),
54
+ frontmatter,
55
+ features: citedFeatures(body),
56
+ body,
57
+ };
58
+ };
59
+ const CITATION = /<!--\s*pikku:guide\s+feature=([^\s]+)[^>]*-->/g;
60
+ const citedFeatures = (body) => {
61
+ const seen = [];
62
+ for (const [, id] of body.matchAll(CITATION)) {
63
+ if (id && !seen.includes(id)) {
64
+ seen.push(id);
65
+ }
66
+ }
67
+ return seen;
68
+ };
69
+ /**
70
+ * The hash a page's prose is written against.
71
+ *
72
+ * The input is the feature's **step sentences and artifact ids**, and
73
+ * deliberately not the image bytes and not the prose: restyling a UI changes
74
+ * every screenshot and no sentence, while inserting, reordering or renaming a
75
+ * step changes the sentence list — and that is what actually invalidates a
76
+ * paragraph describing the flow. It watches something the reader never sees.
77
+ *
78
+ * Canonically, the hashed value is the JSON of
79
+ * `[[scenarioName, [sentence, …], [artifactId, …]], …]` where:
80
+ *
81
+ * - scenarios are sorted by name then title, because a run's order is a
82
+ * property of how the suite was selected that day, not of the feature;
83
+ * - sentences keep their ladder order, keyword included, because that order is
84
+ * the flow being described — the one thing a step change must move;
85
+ * - each sentence is whitespace-collapsed, so the reporter's column padding is
86
+ * not part of the promise;
87
+ * - artifact ids are sorted, because artifacts are filed as they are finalised
88
+ * rather than as they were taken.
89
+ *
90
+ * Seven hex characters, like a short commit hash: it is read by a human
91
+ * comparing two lines, not by a collision-resistant protocol.
92
+ */
93
+ export const featureEvidence = (feature) => {
94
+ const scenarios = [...feature.scenarios]
95
+ .sort((a, b) => a.name.localeCompare(b.name) || a.title.localeCompare(b.title))
96
+ .map((scenario) => [
97
+ scenario.name,
98
+ scenario.steps.map((step) => [step.phase, step.sentence]
99
+ .filter(Boolean)
100
+ .join(' ')
101
+ .replace(/\s+/g, ' ')
102
+ .trim()),
103
+ scenario.screenshots
104
+ .map((shot) => shot.id ?? shot.name ?? shot.path)
105
+ .sort((a, b) => a.localeCompare(b)),
106
+ ]);
107
+ return createHash('sha256')
108
+ .update(JSON.stringify(scenarios))
109
+ .digest('hex')
110
+ .slice(0, 7);
111
+ };
112
+ export const parseGuideLock = (content) => {
113
+ let parsed;
114
+ try {
115
+ parsed = JSON.parse(content);
116
+ }
117
+ catch (e) {
118
+ throw new Error(`The guide lock is unreadable: ${e?.message ?? e}`);
119
+ }
120
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
121
+ throw new Error('The guide lock is not an object of feature id to evidence.');
122
+ }
123
+ const lock = {};
124
+ for (const [id, evidence] of Object.entries(parsed)) {
125
+ if (typeof evidence !== 'string') {
126
+ throw new Error(`The guide lock holds a non-string evidence for '${id}'.`);
127
+ }
128
+ lock[id] = evidence;
129
+ }
130
+ return lock;
131
+ };
132
+ export const renderGuideLock = (features, cited) => {
133
+ const documented = new Set(cited);
134
+ const lock = {};
135
+ for (const feature of [...features].sort((a, b) => a.id.localeCompare(b.id))) {
136
+ if (feature.document && documented.has(feature.id)) {
137
+ lock[feature.id] = featureEvidence(feature);
138
+ }
139
+ }
140
+ return `${JSON.stringify(lock, null, 2)}\n`;
141
+ };
142
+ export const checkGuideCoverage = (features, pages, lock = {}) => {
143
+ const byId = new Map(features.map((feature) => [feature.id, feature]));
144
+ const cited = new Set();
145
+ const unknown = [];
146
+ const optedOut = [];
147
+ const figureless = [];
148
+ const stale = [];
149
+ for (const page of [...pages].sort((a, b) => a.path.localeCompare(b.path))) {
150
+ for (const id of page.features) {
151
+ const feature = byId.get(id);
152
+ if (!feature) {
153
+ unknown.push({ path: page.path, featureId: id });
154
+ continue;
155
+ }
156
+ if (!feature.document) {
157
+ optedOut.push({ path: page.path, featureId: id });
158
+ continue;
159
+ }
160
+ cited.add(id);
161
+ const figures = feature.scenarios.reduce((total, scenario) => total + scenario.screenshots.length + (scenario.videos?.length ?? 0), 0);
162
+ if (figures === 0) {
163
+ figureless.push({ path: page.path, featureId: id });
164
+ }
165
+ const locked = lock[id];
166
+ const current = featureEvidence(feature);
167
+ if (locked !== undefined && locked !== current) {
168
+ stale.push({ path: page.path, featureId: id, locked, current });
169
+ }
170
+ }
171
+ }
172
+ return {
173
+ cited: [...cited].sort((a, b) => a.localeCompare(b)),
174
+ missing: features
175
+ .filter((feature) => feature.document && !cited.has(feature.id))
176
+ .map((feature) => feature.id)
177
+ .sort((a, b) => a.localeCompare(b)),
178
+ unknown,
179
+ optedOut,
180
+ figureless,
181
+ stale,
182
+ };
183
+ };
184
+ /**
185
+ * The marker a generated region opens with.
186
+ *
187
+ * An HTML comment, because it is the one thing every markdown renderer already
188
+ * agrees to ignore, and because a page that has been through the compiler still
189
+ * reads as an ordinary document in an editor, a diff and a preview. It carries
190
+ * the feature id and nothing else: a rebuild rewrites exactly the block for that
191
+ * feature and leaves every sentence a human wrote — before it, after it, or
192
+ * around another feature's block — untouched, and there is no value on the line
193
+ * anyone has to keep correct.
194
+ */
195
+ const generatedOpen = (featureId) => `<!-- pikku:guide feature=${featureId} -->`;
196
+ const GENERATED_CLOSE = '<!-- /pikku:guide -->';
197
+ /**
198
+ * The `evidence=` attribute is still matched, never written: guides built
199
+ * before the hash moved into the lock carry it, and a rebuild is what removes
200
+ * it.
201
+ */
202
+ const generatedRegion = (featureId) => new RegExp(`<!--\\s*pikku:guide\\s+feature=${escapeRegExp(featureId)}[^>]*-->[\\s\\S]*?${escapeRegExp(GENERATED_CLOSE)}`);
203
+ /** Any region, for dropping the blocks of features a page no longer cites. */
204
+ const ANY_GENERATED_REGION = /<!--\s*pikku:guide\s+feature=[^\s]+[^>]*-->[\s\S]*?<!-- \/pikku:guide -->/g;
205
+ const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
206
+ const GENERATED_FEATURE = /<!--\s*pikku:guide\s+feature=([^\s]+)/;
207
+ /**
208
+ * One feature's generated region: the figures its run filed, and nothing else.
209
+ *
210
+ * Neither the steps nor the scenario's own title and description are rendered.
211
+ * All three are written to name and prove a test — third person, about the
212
+ * system, ending in the regression they guard — and a reader arriving at a
213
+ * documentation page wants none of it. The words on the page are the author's;
214
+ * what a run can contribute that no author can is the evidence that the words
215
+ * are still true, which is a picture of the thing actually doing it.
216
+ *
217
+ * A data-driven scenario runs once per row and so appears once per row in the
218
+ * record. The rows differ only in their inputs, so their figures are collected
219
+ * in run order and deduplicated by artifact id rather than repeated.
220
+ *
221
+ * A recording leads the scenario it belongs to, because it shows the whole flow
222
+ * the stills are moments of. It is emitted as an ordinary figure: this module
223
+ * writes no HTML, so what makes a `.webm` a player rather than a broken image
224
+ * is the consumer's renderer, the same way a consumer resolves the base.
225
+ */
226
+ const renderFeature = (feature, artifactBase) => {
227
+ const figures = [];
228
+ const seen = new Set();
229
+ for (const scenario of feature.scenarios) {
230
+ for (const video of scenario.videos ?? []) {
231
+ const key = video.id ?? video.path;
232
+ if (seen.has(key)) {
233
+ continue;
234
+ }
235
+ seen.add(key);
236
+ const caption = video.actor
237
+ ? `${scenario.title} — ${video.actor}`
238
+ : scenario.title;
239
+ figures.push(`![${caption}](${artifactBase}${video.path})`);
240
+ }
241
+ for (const shot of scenario.screenshots) {
242
+ const key = shot.id ?? shot.path;
243
+ if (seen.has(key)) {
244
+ continue;
245
+ }
246
+ seen.add(key);
247
+ figures.push(`![${shot.name ?? scenario.title}](${artifactBase}${shot.path})`);
248
+ }
249
+ }
250
+ return figures.join('\n\n');
251
+ };
252
+ /**
253
+ * Merge one editorial source with the blocks its features generate.
254
+ *
255
+ * Hand-written prose and generated blocks stay separable, so a rebuild never
256
+ * clobbers writing: the body is the author's file, and only the regions between
257
+ * the markers are replaced. A block whose feature the page has stopped citing is
258
+ * dropped, since nothing would ever rewrite it again.
259
+ *
260
+ * `artifactBase` is prefixed onto every artifact key: the relative path from
261
+ * this page to the run's artifact root, which is all this module knows about
262
+ * where anything lives.
263
+ */
264
+ export const renderGuidePage = (page, features, artifactBase) => {
265
+ const cited = page.features.filter((id) => features.has(id));
266
+ const first = cited[0] ? features.get(cited[0]) : undefined;
267
+ let body = page.body.replace(ANY_GENERATED_REGION, (region) => {
268
+ const id = region.match(GENERATED_FEATURE)?.[1];
269
+ return id && cited.includes(id) ? region : '';
270
+ });
271
+ for (const id of cited) {
272
+ const feature = features.get(id);
273
+ const block = [
274
+ generatedOpen(id),
275
+ renderFeature(feature, artifactBase),
276
+ GENERATED_CLOSE,
277
+ ]
278
+ .filter((part) => part.length > 0)
279
+ .join('\n\n');
280
+ body = body.replace(generatedRegion(id), block);
281
+ }
282
+ const title = page.title ?? first?.name;
283
+ const description = page.description ?? first?.description;
284
+ // Only `title` and `description` are the compiler's to fill in, and only when
285
+ // the page states neither; every other key the author wrote passes through in
286
+ // the order they wrote it.
287
+ const { title: _t, description: _d, ...rest } = page.frontmatter;
288
+ const frontmatter = {
289
+ ...(title ? { title } : {}),
290
+ ...(description ? { description } : {}),
291
+ ...rest,
292
+ };
293
+ const head = Object.keys(frontmatter).length > 0
294
+ ? `---\n${stringify(frontmatter, { lineWidth: 0 }).trimEnd()}\n---`
295
+ : '---\n---';
296
+ return `${head}\n\n${trim(body)}\n`;
297
+ };
298
+ const trim = (value) => value.replace(/^\n+/, '').replace(/\s+$/, '');
299
+ /** The phase a recorded sentence opens with, split back off it. */
300
+ const PHASE = /^(Given|When|Then|And)\s+([\s\S]*)$/;
301
+ /**
302
+ * A recorded step sentence, split into its gherkin keyword and the rest.
303
+ *
304
+ * The run stores the composed sentence — `Given yasser signs in`, padded to
305
+ * the reporter's keyword column — so the phase is already in it and is read
306
+ * back off the record rather than re-derived from today's source.
307
+ */
308
+ export const guideStep = (sentence) => {
309
+ const match = sentence.trim().match(PHASE);
310
+ return match
311
+ ? { phase: match[1], sentence: match[2].replace(/\s+/g, ' ').trim() }
312
+ : { sentence: sentence.replace(/\s+/g, ' ').trim() };
313
+ };
@@ -2,7 +2,7 @@ import type { ScenarioSurface, ScenarioStepPhase } from '@pikku/core/scenario';
2
2
  import type { WorkflowStepMeta } from '@pikku/core/workflow';
3
3
  import type { FunctionsMeta } from '@pikku/core/services';
4
4
  import type { PersonaDefinitions } from '@pikku/core/persona';
5
- import type { ScenarioFailureDetail, ScenarioStepRow } from '@pikku/core/scenario';
5
+ import type { ScenarioFailureDetail, ScenarioStepRow, ScenarioStepVideoOffset } from '@pikku/core/scenario';
6
6
  export interface ScenarioStepProse {
7
7
  phase: ScenarioStepPhase;
8
8
  description: string;
@@ -25,6 +25,8 @@ export interface ScenarioStepOutcome {
25
25
  input?: unknown;
26
26
  /** The step function that ran it, as recorded on the run. */
27
27
  stepFunc?: string;
28
+ /** Where the step fell in each recorded actor's video, as the run stamped it. */
29
+ video?: ScenarioStepVideoOffset[];
28
30
  }
29
31
  /**
30
32
  * One scenario's prose, indexed the two ways a run step can be joined back to
@@ -203,6 +203,7 @@ export const scenarioStepRows = (steps, prose) => {
203
203
  status: step.status,
204
204
  durationMs: step.durationMs,
205
205
  error: step.error,
206
+ ...(step.video?.length ? { video: step.video } : {}),
206
207
  };
207
208
  });
208
209
  };
@@ -1,5 +1,5 @@
1
1
  import type { CoreWorkflow } from '@pikku/core/workflow';
2
- import type { CoreFeature } from '@pikku/core/scenario';
2
+ import type { CoreFeature, ScenarioResult } from '@pikku/core/scenario';
3
3
  /** One scenario run: a scenario name and, for a feature's paired entry, its input. */
4
4
  export type ScenarioPlanEntry = {
5
5
  scenarioName: string;
@@ -60,3 +60,19 @@ export type ScenarioPlan = {
60
60
  * five scenarios still runs the feature's hooks exactly once around those two.
61
61
  */
62
62
  export declare const buildScenarioPlan: ({ scenarios, features, registrations, flows, featureIds, tags, excludeTags, }: ScenarioPlanInput) => ScenarioPlan;
63
+ /** Which registration ran, and under which feature, as the registry names them. */
64
+ export type ScenarioRunIdentity = {
65
+ scenarioName: string;
66
+ featureId?: string;
67
+ featureName?: string;
68
+ tags?: string[];
69
+ };
70
+ /**
71
+ * What a result carries beyond its own outcome.
72
+ *
73
+ * The ids come from the plan, which read them off the registry, rather than
74
+ * from the run's label: a label is assembled out of a feature's title and a
75
+ * scenario's prose, and both are rewritten freely, so nothing that outlives a
76
+ * run can be recovered from one.
77
+ */
78
+ export declare const identifyScenarioResult: (result: ScenarioResult, identity: ScenarioRunIdentity) => ScenarioResult;
@@ -104,3 +104,18 @@ export const buildScenarioPlan = ({ scenarios, features, registrations, flows, f
104
104
  }
105
105
  return { groups, unresolved };
106
106
  };
107
+ /**
108
+ * What a result carries beyond its own outcome.
109
+ *
110
+ * The ids come from the plan, which read them off the registry, rather than
111
+ * from the run's label: a label is assembled out of a feature's title and a
112
+ * scenario's prose, and both are rewritten freely, so nothing that outlives a
113
+ * run can be recovered from one.
114
+ */
115
+ export const identifyScenarioResult = (result, identity) => ({
116
+ ...result,
117
+ scenarioName: identity.scenarioName,
118
+ ...(identity.featureId ? { featureId: identity.featureId } : {}),
119
+ ...(identity.featureName ? { feature: identity.featureName } : {}),
120
+ ...(identity.tags?.length ? { tags: identity.tags } : {}),
121
+ });
@@ -49,3 +49,33 @@ export declare const scenarioRun: import("#pikku/function").PikkuFunctionConfig<
49
49
  apiUrl?: string;
50
50
  appUrl?: string;
51
51
  }, void, "rpc" | "session", import("#pikku/function").WiredServices, unknown>, undefined, undefined>;
52
+ /**
53
+ * `pikku scenario guide` — the suite, written out as markdown.
54
+ *
55
+ * Structure comes from the registry (which features exist, what their scenarios
56
+ * are called), and evidence from the latest run record (what the steps actually
57
+ * said, and what they filed). Editorial prose comes from the project's own
58
+ * `docs/` sources, which cite a feature by leaving the marker pair where its
59
+ * block belongs; this merges the three and writes one markdown file per source.
60
+ * It renders nothing, resolves no asset URLs and calls no model: the writing is
61
+ * somebody else's concern, and this is the compiler that keeps it honest.
62
+ */
63
+ export declare const scenarioGuide: import("#pikku/function").PikkuFunctionConfig<{
64
+ docs?: string;
65
+ output?: string;
66
+ runId?: string;
67
+ allowUndocumented?: boolean;
68
+ artifactBase?: string;
69
+ }, void, "rpc" | "session", import("#pikku/function").PikkuFunction<{
70
+ docs?: string;
71
+ output?: string;
72
+ runId?: string;
73
+ allowUndocumented?: boolean;
74
+ artifactBase?: string;
75
+ }, void, "rpc" | "session", import("#pikku/function").WiredServices> | import("#pikku/function").PikkuFunctionSessionless<{
76
+ docs?: string;
77
+ output?: string;
78
+ runId?: string;
79
+ allowUndocumented?: boolean;
80
+ artifactBase?: string;
81
+ }, void, "rpc" | "session", import("#pikku/function").WiredServices, unknown>, undefined, undefined>;