@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.
- package/console-app/assets/{HelpPanel-DaE02BQE.js → HelpPanel-C06T226y.js} +1 -1
- package/console-app/assets/{abnfDiagram-VCTEODGH-CExRuljg.js → abnfDiagram-VCTEODGH-BVwdT3Es.js} +1 -1
- package/console-app/assets/architecture-7GRP2DOG-3y7bWtag.js +1 -0
- package/console-app/assets/{architectureDiagram-5GKGNRK7-uKjmdPIQ.js → architectureDiagram-5GKGNRK7-XfzqZ3mW.js} +1 -1
- package/console-app/assets/{blockDiagram-I7D4REHJ-DNgIFbT4.js → blockDiagram-I7D4REHJ-B5omSqDK.js} +1 -1
- package/console-app/assets/{c4Diagram-7LVT6UL2-0vP9sLld.js → c4Diagram-7LVT6UL2-DkPe7xCg.js} +1 -1
- package/console-app/assets/channel-CTiluQVw.js +1 -0
- package/console-app/assets/{chunk-4HAMMTFA-BJ59eqJI.js → chunk-4HAMMTFA-QfSXT_X7.js} +1 -1
- package/console-app/assets/{chunk-75Z2AOVW-Bge6xoqX.js → chunk-75Z2AOVW-h7UnPWNo.js} +1 -1
- package/console-app/assets/{chunk-DU6HZSFF-CkmYNhC5.js → chunk-DU6HZSFF-VaMy-LOI.js} +1 -1
- package/console-app/assets/{chunk-F27PBJKO-C44ef28t.js → chunk-F27PBJKO-toywqOqS.js} +1 -1
- package/console-app/assets/{chunk-GMAD6QVW-Bmqdx1l0.js → chunk-GMAD6QVW-Cpa-YKLB.js} +1 -1
- package/console-app/assets/{chunk-GVQU2GXP-AQp_KNx4.js → chunk-GVQU2GXP-BWSHPLNL.js} +1 -1
- package/console-app/assets/{chunk-IMKFNOWR-Ca3GoHnO.js → chunk-IMKFNOWR-yhQzfQuj.js} +1 -1
- package/console-app/assets/{chunk-L3NEJ4N5-C_GhayZt.js → chunk-L3NEJ4N5-C8pAfDlo.js} +1 -1
- package/console-app/assets/{chunk-OSK3NFVY-DGzfF4JV.js → chunk-OSK3NFVY-749yk2fa.js} +1 -1
- package/console-app/assets/{chunk-P2QGCYS3-N8xMDiFw.js → chunk-P2QGCYS3-C1Y9GyYT.js} +1 -1
- package/console-app/assets/{chunk-POPQ4Y6H-CdhIikwj.js → chunk-POPQ4Y6H-DzI9aRsX.js} +1 -1
- package/console-app/assets/{chunk-PWAF6VOD-CdTJmOYg.js → chunk-PWAF6VOD-D3fAPSwz.js} +1 -1
- package/console-app/assets/{chunk-SHT3W25Y-Ctj8zSAF.js → chunk-SHT3W25Y-D9w7LzM9.js} +1 -1
- package/console-app/assets/{chunk-SVP7TREG-DTNKveWo.js → chunk-SVP7TREG-D55MjOJw.js} +1 -1
- package/console-app/assets/{chunk-TICWLB2K-Df6e0LIf.js → chunk-TICWLB2K-DV8q7H-z.js} +1 -1
- package/console-app/assets/chunk-XXDRQBXY-DBtYQykd.js +1 -0
- package/console-app/assets/classDiagram-ZZMXUADV-BnWa-i9n.js +1 -0
- package/console-app/assets/classDiagram-v2-VYDZK3BY-BnWa-i9n.js +1 -0
- package/console-app/assets/{cose-bilkent-JH36ORCC-DBd_emhQ.js → cose-bilkent-JH36ORCC-CLedPW9a.js} +1 -1
- package/console-app/assets/{cynefin-OW5HDTMX-3aBVpBMI.js → cynefin-OW5HDTMX-CS5NKw2p.js} +1 -1
- package/console-app/assets/{cynefinDiagram-5FMLGOSQ-5BZzBehJ.js → cynefinDiagram-5FMLGOSQ-DGTHW90E.js} +1 -1
- package/console-app/assets/{dagre-DATELzSq.js → dagre-BNQdos_2.js} +1 -1
- package/console-app/assets/{dagre-GXQ25YYZ-orKIUXIt.js → dagre-GXQ25YYZ-DHZ8wtwQ.js} +1 -1
- package/console-app/assets/{diagram-S7CK7UJ4-CwwxVQ_N.js → diagram-S7CK7UJ4-C41Begsy.js} +1 -1
- package/console-app/assets/{diagram-UQ7AKVKN-CcEJxIEU.js → diagram-UQ7AKVKN-CU8D-sRT.js} +1 -1
- package/console-app/assets/{diagram-VSXAHHWV-DGfXNB6v.js → diagram-VSXAHHWV-DTTiXYnQ.js} +1 -1
- package/console-app/assets/{diagram-VX7I27RA-Kqkord1q.js → diagram-VX7I27RA-BBy91pxm.js} +1 -1
- package/console-app/assets/{diagram-Z3DM3KII-Dy5rfOxu.js → diagram-Z3DM3KII-D50xTYe5.js} +1 -1
- package/console-app/assets/{ebnfDiagram-PWID7BFC-y1bmj1ry.js → ebnfDiagram-PWID7BFC-BHjnFZgE.js} +1 -1
- package/console-app/assets/{erDiagram-RLTQ6QDP-CNk_w5Ib.js → erDiagram-RLTQ6QDP-B4-yVo9b.js} +1 -1
- package/console-app/assets/eventmodeling-NTZA5JFV-C_IpFSCw.js +1 -0
- package/console-app/assets/flowDiagram-HODETNUW-Q90rgVpx.js +1 -0
- package/console-app/assets/{ganttDiagram-EL5Y4UJY-DdVaRGRy.js → ganttDiagram-EL5Y4UJY-D1T-2BlO.js} +1 -1
- package/console-app/assets/{gitGraph-4MIJSDKK-DpSAepQv.js → gitGraph-4MIJSDKK-ClqKTUfQ.js} +1 -1
- package/console-app/assets/{gitGraphDiagram-WWUBYQGX-CIhGnwZW.js → gitGraphDiagram-WWUBYQGX-ruq2MAhM.js} +1 -1
- package/console-app/assets/{graphlib-CRp93vEd.js → graphlib-D-vLYPdw.js} +1 -1
- package/console-app/assets/{index-B34OoL_f.js → index-BIEZPuyK.js} +5 -5
- package/console-app/assets/{info-A6RAGUB7-DckDPZ56.js → info-A6RAGUB7-BGI-8HNB.js} +1 -1
- package/console-app/assets/{infoDiagram-27XIBGKW-DMk6mpjP.js → infoDiagram-27XIBGKW-BGURgKHv.js} +1 -1
- package/console-app/assets/{ishikawaDiagram-5VMMS53U-Dqr5CEc9.js → ishikawaDiagram-5VMMS53U-DzgAaPTR.js} +1 -1
- package/console-app/assets/{journeyDiagram-3NMN7TZE-Kv0orI9j.js → journeyDiagram-3NMN7TZE-BsyWad8z.js} +1 -1
- package/console-app/assets/{kanban-definition-UXKFOSKX-BrYb0IpS.js → kanban-definition-UXKFOSKX-g1nO2rWF.js} +1 -1
- package/console-app/assets/{line-D2jQ449E.js → line-CeFoQ5y-.js} +1 -1
- package/console-app/assets/{linear-BKu0S9-y.js → linear-C4Pk-YMX.js} +1 -1
- package/console-app/assets/{mermaid-parser.core-DhWf8x6B.js → mermaid-parser.core-U7wquvx8.js} +3 -3
- package/console-app/assets/{mermaid.core-RkgzUTr1.js → mermaid.core-8TRpFRm9.js} +4 -4
- package/console-app/assets/{mindmap-definition-YA3MSWOX-BKATx3X1.js → mindmap-definition-YA3MSWOX-C7lzwqBX.js} +1 -1
- package/console-app/assets/{packet-AYTQ26CC-Dek-5xov.js → packet-AYTQ26CC-DiQV_rU3.js} +1 -1
- package/console-app/assets/{pegDiagram-XKGWAZYB-CkEJ5MeF.js → pegDiagram-XKGWAZYB-63ajP7-W.js} +1 -1
- package/console-app/assets/{pie-WAS4IAKB-BIoN9DHQ.js → pie-WAS4IAKB-B5q_o6dr.js} +1 -1
- package/console-app/assets/{pieDiagram-E7YTZNPT-CEPQgMPk.js → pieDiagram-E7YTZNPT-BTbvj-by.js} +1 -1
- package/console-app/assets/{quadrantDiagram-AXDQQJYC-eJxMa_50.js → quadrantDiagram-AXDQQJYC-CulqsAYd.js} +1 -1
- package/console-app/assets/{radar-RG4KPBEZ-BwJnovJ0.js → radar-RG4KPBEZ-CW_KoURS.js} +1 -1
- package/console-app/assets/{railroad-74A4TZTK-D1_fi4Md.js → railroad-74A4TZTK-CUmF6uBQ.js} +1 -1
- package/console-app/assets/railroad-abnf-HS5TGJTU-CcPw9q8a.js +1 -0
- package/console-app/assets/railroad-ebnf-LZEXJU2U-Ci_fZics.js +1 -0
- package/console-app/assets/railroad-peg-WCYAUIDC-DTsDykSf.js +1 -0
- package/console-app/assets/{railroadDiagram-O6MQD6OU-BpOx1Ffe.js → railroadDiagram-O6MQD6OU-WlkBu_N3.js} +1 -1
- package/console-app/assets/{requirementDiagram-BXWQKSXE-D-IEFxpk.js → requirementDiagram-BXWQKSXE-CJK_CbPR.js} +1 -1
- package/console-app/assets/{sankeyDiagram-P5KCCOFB-SdALSgLt.js → sankeyDiagram-P5KCCOFB-C466WOH8.js} +1 -1
- package/console-app/assets/{sequenceDiagram-WJ2MYXX4-Burhioru.js → sequenceDiagram-WJ2MYXX4-CV0dCcj0.js} +1 -1
- package/console-app/assets/{src-BI-J79xw.js → src-P4Nw8sY0.js} +1 -1
- package/console-app/assets/{stateDiagram-D77RDMKH-BhWb5zb7.js → stateDiagram-D77RDMKH-HaLGm8V9.js} +1 -1
- package/console-app/assets/stateDiagram-v2-MP3YSRHH--GM14Hz5.js +1 -0
- package/console-app/assets/{swimlanes-42K2YHIH-BoaeXC6b.js → swimlanes-42K2YHIH-Bi-O5vWa.js} +1 -1
- package/console-app/assets/swimlanesDiagram-VR7AAH4N-_6rRi6Wt.js +8 -0
- package/console-app/assets/{timeline-definition-24CTP7MA-uuBDVcEL.js → timeline-definition-24CTP7MA-B4h-gx-i.js} +1 -1
- package/console-app/assets/{treeView-Q6P3EWNA-BRZawPMp.js → treeView-Q6P3EWNA-CXJ_pHQw.js} +1 -1
- package/console-app/assets/{treemap-WGGIJYW6-WSINjp5g.js → treemap-WGGIJYW6-M84p2a_3.js} +1 -1
- package/console-app/assets/{vennDiagram-4TSXK5OY-K6UjE9uq.js → vennDiagram-4TSXK5OY-BesF4k_r.js} +1 -1
- package/console-app/assets/{wardley-WFR3VGLG-BMecQ-Z6.js → wardley-WFR3VGLG-n9ulickP.js} +1 -1
- package/console-app/assets/{wardleyDiagram-VM6X3IG4-9blTcGMt.js → wardleyDiagram-VM6X3IG4-BG0nnWDf.js} +1 -1
- package/console-app/assets/{xychartDiagram-S5SC5T6Z-DSnHhis6.js → xychartDiagram-S5SC5T6Z-BtOW7fpF.js} +1 -1
- package/console-app/index.html +1 -1
- package/dist/.pikku/addon/index.d.ts +1 -1
- package/dist/.pikku/addon/index.js +1 -1
- package/dist/.pikku/addon/pikku-addon-types.gen.d.ts +1 -1
- package/dist/.pikku/addon/pikku-addon-types.gen.js +1 -1
- package/dist/.pikku/agent/index.d.ts +1 -1
- package/dist/.pikku/agent/index.js +1 -1
- package/dist/.pikku/agent/pikku-agent-types.gen.d.ts +1 -1
- package/dist/.pikku/agent/pikku-model-aliases.gen.js +1 -1
- package/dist/.pikku/analytics/index.d.ts +1 -1
- package/dist/.pikku/analytics/index.js +1 -1
- package/dist/.pikku/analytics/pikku-analytics-types.gen.d.ts +1 -1
- package/dist/.pikku/analytics/pikku-analytics-types.gen.js +1 -1
- package/dist/.pikku/auth/index.d.ts +1 -1
- package/dist/.pikku/auth/index.js +1 -1
- package/dist/.pikku/auth/pikku-auth-types.gen.d.ts +1 -1
- package/dist/.pikku/auth/pikku-auth-types.gen.js +1 -1
- package/dist/.pikku/channel/index.d.ts +1 -1
- package/dist/.pikku/channel/index.js +1 -1
- package/dist/.pikku/channel/pikku-channel-types.gen.d.ts +1 -1
- package/dist/.pikku/channel/pikku-channel-types.gen.js +1 -1
- package/dist/.pikku/cli/index.d.ts +1 -1
- package/dist/.pikku/cli/index.js +1 -1
- package/dist/.pikku/cli/pikku-cli-channel.js +6 -1
- package/dist/.pikku/cli/pikku-cli-client.gen.d.ts +1 -1
- package/dist/.pikku/cli/pikku-cli-client.gen.js +1 -1
- package/dist/.pikku/cli/pikku-cli-contracts-meta.gen.d.ts +1 -1
- package/dist/.pikku/cli/pikku-cli-contracts-meta.gen.js +1 -1
- package/dist/.pikku/cli/pikku-cli-contracts-meta.gen.json +11 -1
- package/dist/.pikku/cli/pikku-cli-types.gen.d.ts +1 -1
- package/dist/.pikku/cli/pikku-cli-types.gen.js +1 -1
- package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.js +1 -1
- package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.json +55 -3
- package/dist/.pikku/cli/pikku-cli-wirings.gen.d.ts +1 -1
- package/dist/.pikku/cli/pikku-cli-wirings.gen.js +1 -1
- package/dist/.pikku/cli/pikku-cli.gen.d.ts +1 -1
- package/dist/.pikku/cli/pikku-cli.gen.js +1 -1
- package/dist/.pikku/error/index.d.ts +1 -1
- package/dist/.pikku/error/index.js +1 -1
- package/dist/.pikku/error/pikku-error-types.gen.d.ts +1 -1
- package/dist/.pikku/error/pikku-error-types.gen.js +1 -1
- package/dist/.pikku/function/index.d.ts +1 -1
- package/dist/.pikku/function/index.js +1 -1
- package/dist/.pikku/function/pikku-function-types.gen.d.ts +1 -1
- package/dist/.pikku/function/pikku-function-types.gen.js +1 -1
- package/dist/.pikku/function/pikku-functions-meta.gen.js +1 -1
- package/dist/.pikku/function/pikku-functions-meta.gen.json +38 -21
- package/dist/.pikku/function/pikku-functions.gen.js +1 -1
- package/dist/.pikku/gateway/index.d.ts +1 -1
- package/dist/.pikku/gateway/index.js +1 -1
- package/dist/.pikku/gateway/pikku-gateway-types.gen.d.ts +1 -1
- package/dist/.pikku/gateway/pikku-gateway-types.gen.js +1 -1
- package/dist/.pikku/http/index.d.ts +1 -1
- package/dist/.pikku/http/index.js +1 -1
- package/dist/.pikku/http/pikku-http-types.gen.d.ts +1 -1
- package/dist/.pikku/http/pikku-http-types.gen.js +1 -1
- package/dist/.pikku/mcp/index.d.ts +1 -1
- package/dist/.pikku/mcp/index.js +1 -1
- package/dist/.pikku/mcp/pikku-mcp-types.gen.d.ts +1 -1
- package/dist/.pikku/mcp/pikku-mcp-types.gen.js +1 -1
- package/dist/.pikku/middleware/index.d.ts +1 -1
- package/dist/.pikku/middleware/index.js +1 -1
- package/dist/.pikku/middleware/pikku-middleware-types.gen.d.ts +1 -1
- package/dist/.pikku/middleware/pikku-middleware-types.gen.js +1 -1
- package/dist/.pikku/pikku-bootstrap-scenarios.gen.d.ts +1 -1
- package/dist/.pikku/pikku-bootstrap-scenarios.gen.js +1 -1
- package/dist/.pikku/pikku-bootstrap.gen.d.ts +1 -1
- package/dist/.pikku/pikku-bootstrap.gen.js +1 -1
- package/dist/.pikku/pikku-services.gen.d.ts +1 -1
- package/dist/.pikku/queue/index.d.ts +1 -1
- package/dist/.pikku/queue/index.js +1 -1
- package/dist/.pikku/queue/pikku-queue-types.gen.d.ts +1 -1
- package/dist/.pikku/queue/pikku-queue-types.gen.js +1 -1
- package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.js +1 -1
- package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.d.ts +1 -1
- package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.js +1 -1
- package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.js +1 -1
- package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.json +1 -0
- package/dist/.pikku/scenarios/index.d.ts +1 -1
- package/dist/.pikku/scenarios/index.js +1 -1
- package/dist/.pikku/scenarios/pikku-personas.gen.js +1 -1
- package/dist/.pikku/scenarios/pikku-scenario-functions-meta.gen.js +1 -1
- package/dist/.pikku/scenarios/pikku-scenario-functions.gen.d.ts +1 -1
- package/dist/.pikku/scenarios/pikku-scenario-types.gen.d.ts +7 -1
- package/dist/.pikku/scenarios/pikku-scenario-wirings-meta.gen.js +1 -1
- package/dist/.pikku/scenarios/pikku-scenario-wirings.gen.d.ts +1 -1
- package/dist/.pikku/scenarios/schemas/register.gen.d.ts +1 -1
- package/dist/.pikku/scenarios/schemas/register.gen.js +1 -1
- package/dist/.pikku/scheduler/index.d.ts +1 -1
- package/dist/.pikku/scheduler/index.js +1 -1
- package/dist/.pikku/scheduler/pikku-scheduler-types.gen.d.ts +1 -1
- package/dist/.pikku/scheduler/pikku-scheduler-types.gen.js +1 -1
- package/dist/.pikku/schemas/register.gen.js +3 -1
- package/dist/.pikku/schemas/schemas/FabricChangesAskInput.schema.json +1 -1
- package/dist/.pikku/schemas/schemas/FabricInitInput.schema.json +1 -1
- package/dist/.pikku/schemas/schemas/FabricLinkInput.schema.json +1 -1
- package/dist/.pikku/schemas/schemas/KnowledgeReconcileInput.schema.json +1 -1
- package/dist/.pikku/schemas/schemas/KnowledgeReconcileOutput.schema.json +1 -1
- package/dist/.pikku/schemas/schemas/PikkuSkillsInstallInput.schema.json +1 -1
- package/dist/.pikku/schemas/schemas/ScenarioGuideInput.schema.json +1 -0
- package/dist/.pikku/scopes/index.d.ts +1 -1
- package/dist/.pikku/scopes/index.js +1 -1
- package/dist/.pikku/scopes/pikku-flags.gen.d.ts +1 -1
- package/dist/.pikku/scopes/pikku-personas.gen.js +1 -1
- package/dist/.pikku/scopes/pikku-roles.gen.d.ts +1 -1
- package/dist/.pikku/scopes/pikku-scope-types.gen.d.ts +1 -1
- package/dist/.pikku/scopes/pikku-scope-types.gen.js +1 -1
- package/dist/.pikku/scopes/pikku-scopes.gen.d.ts +1 -1
- package/dist/.pikku/secrets/index.d.ts +1 -1
- package/dist/.pikku/secrets/index.js +1 -1
- package/dist/.pikku/secrets/pikku-secret-types.gen.d.ts +1 -1
- package/dist/.pikku/secrets/pikku-secret-types.gen.js +1 -1
- package/dist/.pikku/secrets/pikku-secrets.gen.d.ts +1 -1
- package/dist/.pikku/secrets/pikku-secrets.gen.js +1 -1
- package/dist/.pikku/services/pikku-meta-service.gen.d.ts +1 -1
- package/dist/.pikku/services/pikku-meta-service.gen.js +1 -1
- package/dist/.pikku/setup/index.d.ts +1 -1
- package/dist/.pikku/setup/index.js +1 -1
- package/dist/.pikku/setup/pikku-setup-types.gen.d.ts +1 -1
- package/dist/.pikku/setup/pikku-setup-types.gen.js +1 -1
- package/dist/.pikku/trigger/index.d.ts +1 -1
- package/dist/.pikku/trigger/index.js +1 -1
- package/dist/.pikku/trigger/pikku-trigger-types.gen.d.ts +1 -1
- package/dist/.pikku/trigger/pikku-trigger-types.gen.js +1 -1
- package/dist/.pikku/variables/index.d.ts +1 -1
- package/dist/.pikku/variables/index.js +1 -1
- package/dist/.pikku/variables/pikku-variable-types.gen.d.ts +1 -1
- package/dist/.pikku/variables/pikku-variable-types.gen.js +1 -1
- package/dist/.pikku/variables/pikku-variables.gen.d.ts +1 -1
- package/dist/.pikku/variables/pikku-variables.gen.js +1 -1
- package/dist/.pikku/workflow/index.d.ts +1 -1
- package/dist/.pikku/workflow/index.js +1 -1
- package/dist/.pikku/workflow/pikku-workflow-types.gen.d.ts +1 -1
- package/dist/.pikku/workflow/pikku-workflow-types.gen.js +1 -1
- package/dist/.pikku/workflow/pikku-workflow-wirings-meta.gen.js +1 -1
- package/dist/.pikku/workflow/pikku-workflow-wirings.gen.js +1 -1
- package/dist/bin/pikku-bin.mjs +3 -3
- package/dist/src/cli.wiring.js +44 -2
- package/dist/src/deploy/analyzer/analyzer.js +93 -4
- package/dist/src/deploy/build-pipeline.d.ts +2 -0
- package/dist/src/deploy/build-pipeline.js +4 -3
- package/dist/src/deploy/codegen/per-unit-codegen.js +24 -0
- package/dist/src/fabric/fabric-commands.d.ts +9 -0
- package/dist/src/fabric/fabric-commands.js +11 -1
- package/dist/src/fabric/functions/changes-ask.function.d.ts +4 -0
- package/dist/src/fabric/functions/changes-ask.function.js +7 -1
- package/dist/src/fabric/functions/init.function.d.ts +4 -0
- package/dist/src/fabric/functions/init.function.js +5 -1
- package/dist/src/fabric/functions/link.function.d.ts +4 -0
- package/dist/src/fabric/functions/link.function.js +9 -1
- package/dist/src/fabric/lib/organization.d.ts +8 -0
- package/dist/src/fabric/lib/organization.js +26 -0
- package/dist/src/functions/commands/deploy-apply.js +129 -13
- package/dist/src/functions/commands/deploy-plan.js +1 -0
- package/dist/src/functions/commands/dev-mcp-manifests.d.ts +27 -0
- package/dist/src/functions/commands/dev-mcp-manifests.js +52 -0
- package/dist/src/functions/commands/dev.js +10 -30
- package/dist/src/functions/commands/knowledge-reconcile.d.ts +15 -3
- package/dist/src/functions/commands/knowledge-reconcile.js +1 -1
- package/dist/src/functions/commands/scenario-guide.d.ts +184 -0
- package/dist/src/functions/commands/scenario-guide.js +313 -0
- package/dist/src/functions/commands/scenario-ladder.d.ts +3 -1
- package/dist/src/functions/commands/scenario-ladder.js +1 -0
- package/dist/src/functions/commands/scenario-plan.d.ts +17 -1
- package/dist/src/functions/commands/scenario-plan.js +15 -0
- package/dist/src/functions/commands/scenario.d.ts +30 -0
- package/dist/src/functions/commands/scenario.js +187 -23
- package/dist/src/functions/commands/skill-agents.d.ts +43 -0
- package/dist/src/functions/commands/skill-agents.js +135 -0
- package/dist/src/functions/commands/skills.d.ts +9 -0
- package/dist/src/functions/commands/skills.js +29 -2
- package/dist/src/functions/db/postgres/postgres-introspector.d.ts +6 -0
- package/dist/src/functions/db/postgres/postgres-introspector.js +7 -1
- package/dist/src/functions/knowledge/render.d.ts +1 -1
- package/dist/src/functions/knowledge/render.js +25 -2
- package/dist/src/functions/knowledge/schemas.d.ts +5 -1
- package/dist/src/functions/wirings/mcp/pikku-command-mcp-json.js +32 -5
- package/dist/src/functions/wirings/scenarios/serialize-feature-meta.js +1 -0
- package/dist/src/functions/wirings/workflow/serialize-scenario-types.js +6 -0
- package/dist/src/server/bun-server-runner.js +1 -0
- package/dist/src/server/dev-server-runner.interface.d.ts +13 -0
- package/dist/src/server/node-server-runner.js +1 -0
- package/dist/src/services.js +3 -1
- package/dist/src/utils/mcp-surface.d.ts +8 -0
- package/dist/src/utils/mcp-surface.js +9 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +12 -12
- package/surface.json +19 -13
- package/console-app/assets/architecture-7GRP2DOG-DMiKIh61.js +0 -1
- package/console-app/assets/channel-D3pFDQ-Y.js +0 -1
- package/console-app/assets/chunk-XXDRQBXY-CPBzG1Ie.js +0 -1
- package/console-app/assets/classDiagram-ZZMXUADV-Bh5HK4MN.js +0 -1
- package/console-app/assets/classDiagram-v2-VYDZK3BY-Bh5HK4MN.js +0 -1
- package/console-app/assets/eventmodeling-NTZA5JFV-DLjVcr4S.js +0 -1
- package/console-app/assets/flowDiagram-HODETNUW-CCiyVZIU.js +0 -1
- package/console-app/assets/railroad-abnf-HS5TGJTU-D-_q3UaA.js +0 -1
- package/console-app/assets/railroad-ebnf-LZEXJU2U-kh7JN-2k.js +0 -1
- package/console-app/assets/railroad-peg-WCYAUIDC-rrwoksLW.js +0 -1
- package/console-app/assets/stateDiagram-v2-MP3YSRHH-OjHOAFS5.js +0 -1
- 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
|
-
|
|
374
|
-
|
|
375
|
-
|
|
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
|
|
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
|
+
}
|