@pikku/cli 0.12.20 → 0.12.22

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 (455) hide show
  1. package/cli.schema.json +1 -1
  2. package/console-app/assets/index-C52h1B_L.css +1 -0
  3. package/console-app/assets/index-CAk106ji.js +232 -0
  4. package/console-app/index.html +3 -6
  5. package/dist/.pikku/agent/pikku-agent-types.gen.d.ts +1 -1
  6. package/dist/.pikku/channel/pikku-channel-types.gen.d.ts +3 -3
  7. package/dist/.pikku/channel/pikku-channel-types.gen.js +1 -1
  8. package/dist/.pikku/cli/pikku-cli-channel.d.ts +6 -6
  9. package/dist/.pikku/cli/pikku-cli-channel.js +280 -1
  10. package/dist/.pikku/cli/pikku-cli-types.gen.d.ts +1 -1
  11. package/dist/.pikku/cli/pikku-cli-types.gen.js +1 -1
  12. package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.js +1 -1
  13. package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.json +792 -8
  14. package/dist/.pikku/cli/pikku-cli-wirings.gen.d.ts +1 -1
  15. package/dist/.pikku/cli/pikku-cli-wirings.gen.js +1 -1
  16. package/dist/.pikku/cli/pikku-cli.gen.d.ts +1 -1
  17. package/dist/.pikku/cli/pikku-cli.gen.js +1 -1
  18. package/dist/.pikku/console/pikku-node-types.gen.d.ts +1 -1
  19. package/dist/.pikku/function/pikku-function-types.gen.d.ts +44 -70
  20. package/dist/.pikku/function/pikku-function-types.gen.js +33 -40
  21. package/dist/.pikku/function/pikku-functions-meta.gen.js +1 -1
  22. package/dist/.pikku/function/pikku-functions-meta.gen.json +1439 -316
  23. package/dist/.pikku/function/pikku-functions.gen.js +21 -9
  24. package/dist/.pikku/http/pikku-http-types.gen.d.ts +1 -1
  25. package/dist/.pikku/http/pikku-http-types.gen.js +1 -1
  26. package/dist/.pikku/http/pikku-http-wirings-meta.gen.js +1 -1
  27. package/dist/.pikku/http/pikku-http-wirings.gen.d.ts +1 -1
  28. package/dist/.pikku/http/pikku-http-wirings.gen.js +1 -1
  29. package/dist/.pikku/mcp/pikku-mcp-types.gen.d.ts +1 -1
  30. package/dist/.pikku/mcp/pikku-mcp-types.gen.js +1 -1
  31. package/dist/.pikku/pikku-bootstrap.gen.d.ts +3 -1
  32. package/dist/.pikku/pikku-bootstrap.gen.js +3 -1
  33. package/dist/.pikku/pikku-meta-service.gen.d.ts +1 -1
  34. package/dist/.pikku/pikku-meta-service.gen.js +1 -1
  35. package/dist/.pikku/pikku-services.gen.d.ts +2 -1
  36. package/dist/.pikku/pikku-services.gen.js +1 -0
  37. package/dist/.pikku/pikku-types.gen.d.ts +1 -1
  38. package/dist/.pikku/pikku-types.gen.js +1 -1
  39. package/dist/.pikku/queue/pikku-queue-types.gen.d.ts +1 -1
  40. package/dist/.pikku/queue/pikku-queue-types.gen.js +1 -1
  41. package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.d.ts +1 -0
  42. package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.js +6 -0
  43. package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.json +250 -0
  44. package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.d.ts +4 -0
  45. package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.js +5 -0
  46. package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.js +1 -1
  47. package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.json +66 -10
  48. package/dist/.pikku/scheduler/pikku-scheduler-types.gen.d.ts +1 -1
  49. package/dist/.pikku/scheduler/pikku-scheduler-types.gen.js +1 -1
  50. package/dist/.pikku/schemas/register.gen.js +157 -11
  51. package/dist/.pikku/schemas/schemas/BinaryInput.schema.json +1 -0
  52. package/dist/.pikku/schemas/schemas/DbMigrateInput.schema.json +1 -0
  53. package/dist/.pikku/schemas/schemas/DbResetInput.schema.json +1 -0
  54. package/dist/.pikku/schemas/schemas/DbSeedInput.schema.json +1 -0
  55. package/dist/.pikku/schemas/schemas/FabricDbSchemaInput.schema.json +1 -0
  56. package/dist/.pikku/schemas/schemas/FabricDbSchemaOutput.schema.json +1 -0
  57. package/dist/.pikku/schemas/schemas/FabricDeployApplyInput.schema.json +1 -0
  58. package/dist/.pikku/schemas/schemas/FabricDeployApplyOutput.schema.json +1 -0
  59. package/dist/.pikku/schemas/schemas/FabricDeployListInput.schema.json +1 -0
  60. package/dist/.pikku/schemas/schemas/FabricDeployListOutput.schema.json +1 -0
  61. package/dist/.pikku/schemas/schemas/FabricDeployPlanInput.schema.json +1 -0
  62. package/dist/.pikku/schemas/schemas/FabricDeployPlanOutput.schema.json +1 -0
  63. package/dist/.pikku/schemas/schemas/FabricDeployUnitsInput.schema.json +1 -0
  64. package/dist/.pikku/schemas/schemas/FabricDeployUnitsOutput.schema.json +1 -0
  65. package/dist/.pikku/schemas/schemas/FabricDomainsAddInput.schema.json +1 -0
  66. package/dist/.pikku/schemas/schemas/FabricDomainsAddOutput.schema.json +1 -0
  67. package/dist/.pikku/schemas/schemas/FabricDomainsListInput.schema.json +1 -0
  68. package/dist/.pikku/schemas/schemas/FabricDomainsListOutput.schema.json +1 -0
  69. package/dist/.pikku/schemas/schemas/FabricDomainsRemoveInput.schema.json +1 -0
  70. package/dist/.pikku/schemas/schemas/FabricDomainsRemoveOutput.schema.json +1 -0
  71. package/dist/.pikku/schemas/schemas/FabricErrorsInput.schema.json +1 -0
  72. package/dist/.pikku/schemas/schemas/FabricErrorsOutput.schema.json +1 -0
  73. package/dist/.pikku/schemas/schemas/FabricInitInput.schema.json +1 -0
  74. package/dist/.pikku/schemas/schemas/FabricInitOutput.schema.json +1 -0
  75. package/dist/.pikku/schemas/schemas/FabricLLMKeyInput.schema.json +1 -0
  76. package/dist/.pikku/schemas/schemas/FabricLLMKeyOutput.schema.json +1 -0
  77. package/dist/.pikku/schemas/schemas/FabricLinkInput.schema.json +1 -0
  78. package/dist/.pikku/schemas/schemas/FabricLinkOutput.schema.json +1 -0
  79. package/dist/.pikku/schemas/schemas/FabricLoginInput.schema.json +1 -0
  80. package/dist/.pikku/schemas/schemas/FabricLoginOutput.schema.json +1 -0
  81. package/dist/.pikku/schemas/schemas/FabricLogsInput.schema.json +1 -0
  82. package/dist/.pikku/schemas/schemas/FabricLogsOutput.schema.json +1 -0
  83. package/dist/.pikku/schemas/schemas/FabricMetricsInput.schema.json +1 -0
  84. package/dist/.pikku/schemas/schemas/FabricMetricsOutput.schema.json +1 -0
  85. package/dist/.pikku/schemas/schemas/FabricRollbackInput.schema.json +1 -0
  86. package/dist/.pikku/schemas/schemas/FabricRollbackOutput.schema.json +1 -0
  87. package/dist/.pikku/schemas/schemas/FabricSecretsListInput.schema.json +1 -0
  88. package/dist/.pikku/schemas/schemas/FabricSecretsListOutput.schema.json +1 -0
  89. package/dist/.pikku/schemas/schemas/FabricSecretsSetInput.schema.json +1 -0
  90. package/dist/.pikku/schemas/schemas/FabricSecretsSetOutput.schema.json +1 -0
  91. package/dist/.pikku/schemas/schemas/FabricStatusInput.schema.json +1 -0
  92. package/dist/.pikku/schemas/schemas/FabricStatusOutput.schema.json +1 -0
  93. package/dist/.pikku/schemas/schemas/FabricTraceInput.schema.json +1 -0
  94. package/dist/.pikku/schemas/schemas/FabricTraceOutput.schema.json +1 -0
  95. package/dist/.pikku/schemas/schemas/FabricValidateInput.schema.json +1 -0
  96. package/dist/.pikku/schemas/schemas/FabricValidateOutput.schema.json +1 -0
  97. package/dist/.pikku/schemas/schemas/PikkuCLIConfig.schema.json +1 -1
  98. package/dist/.pikku/schemas/schemas/PikkuCommandChannelsOutput.schema.json +1 -0
  99. package/dist/.pikku/schemas/schemas/PikkuCommandHTTPOutput.schema.json +1 -0
  100. package/dist/.pikku/schemas/schemas/PikkuCommandQueueOutput.schema.json +1 -0
  101. package/dist/.pikku/schemas/schemas/PikkuEventsScaffoldOutput.schema.json +1 -0
  102. package/dist/.pikku/schemas/schemas/PikkuMetaClientsInput.schema.json +1 -0
  103. package/dist/.pikku/schemas/schemas/PikkuMetaContextInput.schema.json +1 -0
  104. package/dist/.pikku/schemas/schemas/PikkuMetaFunctionsGetInput.schema.json +1 -0
  105. package/dist/.pikku/schemas/schemas/PikkuMetaFunctionsListInput.schema.json +1 -0
  106. package/dist/.pikku/schemas/schemas/PikkuMetaMiddlewareGetInput.schema.json +1 -0
  107. package/dist/.pikku/schemas/schemas/PikkuMetaMiddlewareListInput.schema.json +1 -0
  108. package/dist/.pikku/schemas/schemas/PikkuMetaPermissionsGetInput.schema.json +1 -0
  109. package/dist/.pikku/schemas/schemas/PikkuMetaPermissionsListInput.schema.json +1 -0
  110. package/dist/.pikku/schemas/schemas/PikkuMetaSchemasGetInput.schema.json +1 -0
  111. package/dist/.pikku/schemas/schemas/PikkuMetaSchemasListInput.schema.json +1 -0
  112. package/dist/.pikku/schemas/schemas/PikkuMetaWiresChannelInput.schema.json +1 -0
  113. package/dist/.pikku/schemas/schemas/PikkuMetaWiresHttpInput.schema.json +1 -0
  114. package/dist/.pikku/schemas/schemas/PikkuMetaWiresListInput.schema.json +1 -0
  115. package/dist/.pikku/schemas/schemas/PikkuMetaWiresQueueInput.schema.json +1 -0
  116. package/dist/.pikku/schemas/schemas/PikkuMetaWiresSchedulerInput.schema.json +1 -0
  117. package/dist/.pikku/schemas/schemas/PikkuMetaWiresTriggerInput.schema.json +1 -0
  118. package/dist/.pikku/schemas/schemas/PikkuMetaWiresTypeInput.schema.json +1 -0
  119. package/dist/.pikku/schemas/schemas/PikkuMetaWorkflowsGetInput.schema.json +1 -0
  120. package/dist/.pikku/schemas/schemas/PikkuMetaWorkflowsListInput.schema.json +1 -0
  121. package/dist/.pikku/schemas/schemas/PikkuSkillsInstallInput.schema.json +1 -0
  122. package/dist/.pikku/schemas/schemas/PikkuSkillsListInput.schema.json +1 -0
  123. package/dist/.pikku/schemas/schemas/PikkuTestsCoverageInput.schema.json +1 -0
  124. package/dist/.pikku/schemas/schemas/PikkuTestsInitInput.schema.json +1 -0
  125. package/dist/.pikku/schemas/schemas/WorkflowRunStatus.schema.json +1 -1
  126. package/dist/.pikku/secrets/pikku-secret-types.gen.d.ts +1 -1
  127. package/dist/.pikku/secrets/pikku-secret-types.gen.js +1 -1
  128. package/dist/.pikku/secrets/pikku-secrets.gen.d.ts +1 -1
  129. package/dist/.pikku/secrets/pikku-secrets.gen.js +1 -1
  130. package/dist/.pikku/trigger/pikku-trigger-types.gen.d.ts +1 -1
  131. package/dist/.pikku/trigger/pikku-trigger-types.gen.js +1 -1
  132. package/dist/.pikku/variables/pikku-variable-types.gen.d.ts +1 -1
  133. package/dist/.pikku/variables/pikku-variable-types.gen.js +1 -1
  134. package/dist/.pikku/variables/pikku-variables.gen.d.ts +1 -1
  135. package/dist/.pikku/variables/pikku-variables.gen.js +1 -1
  136. package/dist/.pikku/workflow/meta/allWorkflow.gen.json +237 -629
  137. package/dist/.pikku/workflow/pikku-workflow-types.gen.d.ts +1 -1
  138. package/dist/.pikku/workflow/pikku-workflow-types.gen.js +1 -1
  139. package/dist/.pikku/workflow/pikku-workflow-wirings-meta.gen.js +1 -1
  140. package/dist/.pikku/workflow/pikku-workflow-wirings.gen.js +1 -1
  141. package/dist/bin/pikku-bin.mjs +23 -0
  142. package/dist/bin/pikku.js +28 -1
  143. package/dist/src/cli.wiring.js +286 -10
  144. package/dist/src/deploy/analyzer/analyzer.d.ts +16 -1
  145. package/dist/src/deploy/analyzer/analyzer.js +83 -43
  146. package/dist/src/deploy/analyzer/manifest.d.ts +10 -0
  147. package/dist/src/deploy/build-pipeline.d.ts +2 -0
  148. package/dist/src/deploy/build-pipeline.js +123 -19
  149. package/dist/src/deploy/bundler/bundler.d.ts +3 -1
  150. package/dist/src/deploy/bundler/bundler.js +40 -9
  151. package/dist/src/deploy/bundler/dep-extractor.d.ts +5 -2
  152. package/dist/src/deploy/bundler/dep-extractor.js +103 -23
  153. package/dist/src/deploy/bundler/types.d.ts +5 -1
  154. package/dist/src/deploy/codegen/per-unit-codegen.d.ts +11 -1
  155. package/dist/src/deploy/codegen/per-unit-codegen.js +49 -6
  156. package/dist/src/deploy/plan/planner.js +25 -3
  157. package/dist/src/deploy/plan/provider.d.ts +2 -0
  158. package/dist/src/deploy/provider-adapter.d.ts +34 -0
  159. package/dist/src/deploy/server-entry.d.ts +16 -0
  160. package/dist/src/deploy/server-entry.js +81 -0
  161. package/dist/src/fabric/fabric-commands.d.ts +522 -0
  162. package/dist/src/fabric/fabric-commands.js +299 -0
  163. package/dist/src/fabric/functions/db-schema.function.d.ts +35 -0
  164. package/dist/src/fabric/functions/db-schema.function.js +37 -0
  165. package/dist/src/fabric/functions/deploy-list.function.d.ts +41 -0
  166. package/dist/src/fabric/functions/deploy-list.function.js +43 -0
  167. package/dist/src/fabric/functions/deploy-units.function.d.ts +35 -0
  168. package/dist/src/fabric/functions/deploy-units.function.js +41 -0
  169. package/dist/src/fabric/functions/deploy.function.d.ts +105 -0
  170. package/dist/src/fabric/functions/deploy.function.js +122 -0
  171. package/dist/src/fabric/functions/domains-add.function.d.ts +35 -0
  172. package/dist/src/fabric/functions/domains-add.function.js +46 -0
  173. package/dist/src/fabric/functions/domains-list.function.d.ts +20 -0
  174. package/dist/src/fabric/functions/domains-list.function.js +50 -0
  175. package/dist/src/fabric/functions/domains-remove.function.d.ts +24 -0
  176. package/dist/src/fabric/functions/domains-remove.function.js +44 -0
  177. package/dist/src/fabric/functions/errors.function.d.ts +44 -0
  178. package/dist/src/fabric/functions/errors.function.js +50 -0
  179. package/dist/src/fabric/functions/init.function.d.ts +51 -0
  180. package/dist/src/fabric/functions/init.function.js +54 -0
  181. package/dist/src/fabric/functions/link.function.d.ts +28 -0
  182. package/dist/src/fabric/functions/link.function.js +77 -0
  183. package/dist/src/fabric/functions/llm-key.function.d.ts +46 -0
  184. package/dist/src/fabric/functions/llm-key.function.js +76 -0
  185. package/dist/src/fabric/functions/login.function.d.ts +42 -0
  186. package/dist/src/fabric/functions/login.function.js +68 -0
  187. package/dist/src/fabric/functions/logs.function.d.ts +40 -0
  188. package/dist/src/fabric/functions/logs.function.js +84 -0
  189. package/dist/src/fabric/functions/metrics.function.d.ts +32 -0
  190. package/dist/src/fabric/functions/metrics.function.js +49 -0
  191. package/dist/src/fabric/functions/rollback.function.d.ts +76 -0
  192. package/dist/src/fabric/functions/rollback.function.js +69 -0
  193. package/dist/src/fabric/functions/secrets-list.function.d.ts +24 -0
  194. package/dist/src/fabric/functions/secrets-list.function.js +37 -0
  195. package/dist/src/fabric/functions/secrets-set.function.d.ts +32 -0
  196. package/dist/src/fabric/functions/secrets-set.function.js +36 -0
  197. package/dist/src/fabric/functions/status.function.d.ts +34 -0
  198. package/dist/src/fabric/functions/status.function.js +43 -0
  199. package/dist/src/fabric/functions/trace.function.d.ts +28 -0
  200. package/dist/src/fabric/functions/trace.function.js +45 -0
  201. package/dist/src/fabric/functions/validate.function.d.ts +50 -0
  202. package/dist/src/fabric/functions/validate.function.js +363 -0
  203. package/dist/src/fabric/lib/config.d.ts +64 -0
  204. package/dist/src/fabric/lib/config.js +62 -0
  205. package/dist/src/fabric/lib/console-url.d.ts +5 -0
  206. package/dist/src/fabric/lib/console-url.js +13 -0
  207. package/dist/src/fabric/lib/git.d.ts +53 -0
  208. package/dist/src/fabric/lib/git.js +151 -0
  209. package/dist/src/fabric/lib/http.d.ts +4 -0
  210. package/dist/src/fabric/lib/http.js +12 -0
  211. package/dist/src/fabric/lib/not-implemented.d.ts +5 -0
  212. package/dist/src/fabric/lib/not-implemented.js +8 -0
  213. package/dist/src/fabric/lib/output.d.ts +23 -0
  214. package/dist/src/fabric/lib/output.js +39 -0
  215. package/dist/src/fabric/lib/prompt.d.ts +12 -0
  216. package/dist/src/fabric/lib/prompt.js +32 -0
  217. package/dist/src/fabric/lib/stage.d.ts +7 -0
  218. package/dist/src/fabric/lib/stage.js +14 -0
  219. package/dist/src/fabric/sdk/pikku-fetch.gen.d.ts +14 -0
  220. package/dist/src/fabric/sdk/pikku-fetch.gen.js +30 -0
  221. package/dist/src/fabric/sdk/pikku-rpc.gen.d.ts +105 -0
  222. package/dist/src/fabric/sdk/pikku-rpc.gen.js +126 -0
  223. package/dist/src/functions/commands/all.d.ts +1 -1
  224. package/dist/src/functions/commands/binary.d.ts +7 -0
  225. package/dist/src/functions/commands/binary.js +40 -0
  226. package/dist/src/functions/commands/bootstrap.d.ts +1 -1
  227. package/dist/src/functions/commands/bootstrap.js +7 -4
  228. package/dist/src/functions/commands/console.d.ts +3 -3
  229. package/dist/src/functions/commands/db-migrate.d.ts +1 -0
  230. package/dist/src/functions/commands/db-migrate.js +35 -0
  231. package/dist/src/functions/commands/db-reset.d.ts +1 -0
  232. package/dist/src/functions/commands/db-reset.js +36 -0
  233. package/dist/src/functions/commands/db-seed.d.ts +1 -0
  234. package/dist/src/functions/commands/db-seed.js +27 -0
  235. package/dist/src/functions/commands/db-shared.d.ts +32 -0
  236. package/dist/src/functions/commands/db-shared.js +26 -0
  237. package/dist/src/functions/commands/deploy-apply.d.ts +3 -3
  238. package/dist/src/functions/commands/deploy-apply.js +6 -4
  239. package/dist/src/functions/commands/deploy-info.d.ts +1 -1
  240. package/dist/src/functions/commands/deploy-plan.d.ts +3 -3
  241. package/dist/src/functions/commands/deploy-plan.js +7 -1
  242. package/dist/src/functions/commands/dev.d.ts +3 -3
  243. package/dist/src/functions/commands/dev.js +142 -86
  244. package/dist/src/functions/commands/enable.d.ts +5 -4
  245. package/dist/src/functions/commands/enable.js +4 -0
  246. package/dist/src/functions/commands/info.d.ts +4 -4
  247. package/dist/src/functions/commands/load-user-project.d.ts +11 -0
  248. package/dist/src/functions/commands/load-user-project.js +40 -0
  249. package/dist/src/functions/commands/meta.d.ts +82 -0
  250. package/dist/src/functions/commands/meta.js +454 -0
  251. package/dist/src/functions/commands/new-addon.d.ts +3 -3
  252. package/dist/src/functions/commands/new-function.d.ts +3 -3
  253. package/dist/src/functions/commands/new-middleware.d.ts +3 -3
  254. package/dist/src/functions/commands/new-permission.d.ts +3 -3
  255. package/dist/src/functions/commands/new-wiring.d.ts +3 -3
  256. package/dist/src/functions/commands/pikku-command-bootstrap.d.ts +1 -1
  257. package/dist/src/functions/commands/pikku-command-bootstrap.js +15 -1
  258. package/dist/src/functions/commands/pikku-command-summary.d.ts +1 -1
  259. package/dist/src/functions/commands/pikku-command-summary.js +7 -1
  260. package/dist/src/functions/commands/skills.d.ts +26 -0
  261. package/dist/src/functions/commands/skills.js +184 -0
  262. package/dist/src/functions/commands/tests-coverage.d.ts +7 -0
  263. package/dist/src/functions/commands/tests-coverage.js +231 -0
  264. package/dist/src/functions/commands/tests-init.d.ts +7 -0
  265. package/dist/src/functions/commands/tests-init.js +225 -0
  266. package/dist/src/functions/commands/versions-check.d.ts +1 -1
  267. package/dist/src/functions/commands/versions-init.d.ts +3 -3
  268. package/dist/src/functions/commands/versions-update.d.ts +1 -1
  269. package/dist/src/functions/commands/versions-update.js +4 -2
  270. package/dist/src/functions/commands/watch.d.ts +3 -3
  271. package/dist/src/functions/commands/watch.js +1 -1
  272. package/dist/src/functions/db/local-db.d.ts +48 -0
  273. package/dist/src/functions/db/local-db.js +106 -0
  274. package/dist/src/functions/db/seed.d.ts +11 -0
  275. package/dist/src/functions/db/seed.js +22 -0
  276. package/dist/src/functions/db/sql-migrator.d.ts +26 -0
  277. package/dist/src/functions/db/sql-migrator.js +104 -0
  278. package/dist/src/functions/db/sqlite-codegen.d.ts +45 -0
  279. package/dist/src/functions/db/sqlite-codegen.js +294 -0
  280. package/dist/src/functions/db/zod-codegen.d.ts +10 -0
  281. package/dist/src/functions/db/zod-codegen.js +109 -0
  282. package/dist/src/functions/runtimes/fetch/index.d.ts +1 -1
  283. package/dist/src/functions/runtimes/nextjs/pikku-command-nextjs.d.ts +1 -1
  284. package/dist/src/functions/runtimes/nextjs/pikku-command-nextjs.js +21 -2
  285. package/dist/src/functions/runtimes/nextjs/serialize-nextjs-backend-worker-rpc-wrapper.d.ts +1 -0
  286. package/dist/src/functions/runtimes/nextjs/serialize-nextjs-backend-worker-rpc-wrapper.js +163 -0
  287. package/dist/src/functions/runtimes/nextjs/serialize-nextjs-http-wrapper.d.ts +1 -1
  288. package/dist/src/functions/runtimes/nextjs/serialize-nextjs-http-wrapper.js +5 -2
  289. package/dist/src/functions/runtimes/tanstack-start/pikku-command-tanstack-start.d.ts +1 -0
  290. package/dist/src/functions/runtimes/tanstack-start/pikku-command-tanstack-start.js +32 -0
  291. package/dist/src/functions/runtimes/tanstack-start/serialize-tanstack-start-shim.d.ts +11 -0
  292. package/dist/src/functions/runtimes/tanstack-start/serialize-tanstack-start-shim.js +36 -0
  293. package/dist/src/functions/runtimes/websocket/pikku-command-websocket-typed.d.ts +1 -1
  294. package/dist/src/functions/wirings/ai-agent/pikku-command-ai-agent-types.d.ts +1 -1
  295. package/dist/src/functions/wirings/ai-agent/pikku-command-ai-agent.d.ts +1 -1
  296. package/dist/src/functions/wirings/ai-agent/pikku-command-ai-agent.js +1 -10
  297. package/dist/src/functions/wirings/ai-agent/pikku-command-public-agent.d.ts +1 -1
  298. package/dist/src/functions/wirings/ai-agent/serialize-public-agent.js +76 -1
  299. package/dist/src/functions/wirings/channels/pikku-channels.d.ts +1 -1
  300. package/dist/src/functions/wirings/channels/pikku-command-channel-types.d.ts +1 -1
  301. package/dist/src/functions/wirings/channels/pikku-command-channels-map.d.ts +1 -1
  302. package/dist/src/functions/wirings/channels/pikku-command-channels.d.ts +1 -1
  303. package/dist/src/functions/wirings/channels/pikku-command-channels.js +1 -1
  304. package/dist/src/functions/wirings/cli/pikku-command-cli-entry.d.ts +1 -1
  305. package/dist/src/functions/wirings/cli/pikku-command-cli-entry.js +5 -2
  306. package/dist/src/functions/wirings/cli/pikku-command-cli-types.d.ts +5 -1
  307. package/dist/src/functions/wirings/cli/pikku-command-cli-types.js +8 -2
  308. package/dist/src/functions/wirings/cli/pikku-command-cli.d.ts +1 -1
  309. package/dist/src/functions/wirings/cli/serialize-channel-cli-client.js +27 -9
  310. package/dist/src/functions/wirings/cli/serialize-channel-cli.d.ts +5 -1
  311. package/dist/src/functions/wirings/cli/serialize-channel-cli.js +13 -3
  312. package/dist/src/functions/wirings/console/pikku-command-console-functions.d.ts +1 -1
  313. package/dist/src/functions/wirings/console/pikku-command-console-functions.js +5 -1
  314. package/dist/src/functions/wirings/console/pikku-command-node-types.d.ts +1 -1
  315. package/dist/src/functions/wirings/console/pikku-command-nodes-meta.d.ts +1 -1
  316. package/dist/src/functions/wirings/console/serialize-console-functions.js +5 -0
  317. package/dist/src/functions/wirings/credentials/pikku-command-credentials.d.ts +1 -1
  318. package/dist/src/functions/wirings/functions/pikku-command-addon-types.d.ts +5 -1
  319. package/dist/src/functions/wirings/functions/pikku-command-addon-types.js +7 -2
  320. package/dist/src/functions/wirings/functions/pikku-command-function-types-split.d.ts +1 -1
  321. package/dist/src/functions/wirings/functions/pikku-command-function-types-split.js +1 -1
  322. package/dist/src/functions/wirings/functions/pikku-command-function-types.d.ts +1 -1
  323. package/dist/src/functions/wirings/functions/pikku-command-functions.d.ts +1 -1
  324. package/dist/src/functions/wirings/functions/pikku-command-services.d.ts +1 -1
  325. package/dist/src/functions/wirings/functions/schemas.d.ts +1 -1
  326. package/dist/src/functions/wirings/functions/serialize-function-types.js +105 -80
  327. package/dist/src/functions/wirings/gateway/pikku-command-gateway.d.ts +1 -1
  328. package/dist/src/functions/wirings/http/pikku-command-http-map.d.ts +1 -1
  329. package/dist/src/functions/wirings/http/pikku-command-http-routes.d.ts +1 -1
  330. package/dist/src/functions/wirings/http/pikku-command-http-routes.js +1 -1
  331. package/dist/src/functions/wirings/http/pikku-command-http-types.d.ts +1 -1
  332. package/dist/src/functions/wirings/http/pikku-command-openapi.d.ts +1 -1
  333. package/dist/src/functions/wirings/http/pikku-http-routes.d.ts +1 -1
  334. package/dist/src/functions/wirings/mcp/pikku-command-mcp-json.d.ts +1 -1
  335. package/dist/src/functions/wirings/mcp/pikku-command-mcp-types.d.ts +1 -1
  336. package/dist/src/functions/wirings/mcp/pikku-command-mcp.d.ts +1 -1
  337. package/dist/src/functions/wirings/middleware/pikku-command-middleware.d.ts +1 -1
  338. package/dist/src/functions/wirings/package/pikku-command-package-types.d.ts +2 -2
  339. package/dist/src/functions/wirings/package/pikku-command-package.d.ts +1 -1
  340. package/dist/src/functions/wirings/permissions/pikku-command-permissions.d.ts +1 -1
  341. package/dist/src/functions/wirings/queue/pikku-command-queue-map.d.ts +1 -1
  342. package/dist/src/functions/wirings/queue/pikku-command-queue-map.js +1 -1
  343. package/dist/src/functions/wirings/queue/pikku-command-queue-service.d.ts +1 -1
  344. package/dist/src/functions/wirings/queue/pikku-command-queue-types.d.ts +1 -1
  345. package/dist/src/functions/wirings/queue/pikku-command-queue.d.ts +1 -1
  346. package/dist/src/functions/wirings/queue/pikku-command-queue.js +1 -1
  347. package/dist/src/functions/wirings/queue/pikku-queue-map.d.ts +1 -1
  348. package/dist/src/functions/wirings/queue/pikku-queue.d.ts +1 -1
  349. package/dist/src/functions/wirings/realtime/pikku-command-events-scaffold.d.ts +1 -0
  350. package/dist/src/functions/wirings/realtime/pikku-command-events-scaffold.js +26 -0
  351. package/dist/src/functions/wirings/realtime/pikku-command-realtime.d.ts +1 -0
  352. package/dist/src/functions/wirings/realtime/pikku-command-realtime.js +35 -0
  353. package/dist/src/functions/wirings/realtime/serialize-events-scaffold.d.ts +23 -0
  354. package/dist/src/functions/wirings/realtime/serialize-events-scaffold.js +98 -0
  355. package/dist/src/functions/wirings/realtime/serialize-realtime-client.d.ts +22 -0
  356. package/dist/src/functions/wirings/realtime/serialize-realtime-client.js +337 -0
  357. package/dist/src/functions/wirings/rpc/pikku-command-public-rpc.d.ts +1 -1
  358. package/dist/src/functions/wirings/rpc/pikku-command-public-rpc.js +5 -1
  359. package/dist/src/functions/wirings/rpc/pikku-command-react-query.d.ts +1 -1
  360. package/dist/src/functions/wirings/rpc/pikku-command-remote-rpc.d.ts +1 -1
  361. package/dist/src/functions/wirings/rpc/pikku-command-remote-rpc.js +5 -1
  362. package/dist/src/functions/wirings/rpc/pikku-command-rpc-client.d.ts +1 -1
  363. package/dist/src/functions/wirings/rpc/pikku-command-rpc-client.js +3 -1
  364. package/dist/src/functions/wirings/rpc/pikku-command-rpc-map.d.ts +2 -2
  365. package/dist/src/functions/wirings/rpc/pikku-command-rpc.d.ts +2 -1
  366. package/dist/src/functions/wirings/rpc/pikku-command-rpc.js +13 -7
  367. package/dist/src/functions/wirings/rpc/serialize-public-rpc.js +1 -0
  368. package/dist/src/functions/wirings/rpc/serialize-react-query-hooks.js +1 -1
  369. package/dist/src/functions/wirings/rpc/serialize-remote-rpc.js +7 -1
  370. package/dist/src/functions/wirings/rpc/serialize-typed-rpc-map.js +16 -2
  371. package/dist/src/functions/wirings/scheduler/pikku-command-scheduler-types.d.ts +1 -1
  372. package/dist/src/functions/wirings/scheduler/pikku-command-scheduler.d.ts +1 -1
  373. package/dist/src/functions/wirings/secrets/pikku-command-secrets.d.ts +1 -1
  374. package/dist/src/functions/wirings/triggers/pikku-command-trigger-types.d.ts +1 -1
  375. package/dist/src/functions/wirings/triggers/pikku-command-trigger-types.js +1 -1
  376. package/dist/src/functions/wirings/triggers/pikku-command-trigger.d.ts +1 -1
  377. package/dist/src/functions/wirings/variables/pikku-command-variables.d.ts +1 -1
  378. package/dist/src/functions/wirings/workflow/pikku-command-workflow-routes.d.ts +1 -1
  379. package/dist/src/functions/wirings/workflow/pikku-command-workflow-routes.js +1 -1
  380. package/dist/src/functions/wirings/workflow/pikku-command-workflow.d.ts +5 -1
  381. package/dist/src/functions/wirings/workflow/pikku-command-workflow.js +18 -4
  382. package/dist/src/functions/wirings/workflow/serialize-workflow-bootstrap-map.d.ts +3 -0
  383. package/dist/src/functions/wirings/workflow/serialize-workflow-bootstrap-map.js +40 -0
  384. package/dist/src/functions/wirings/workflow/serialize-workflow-routes.js +56 -2
  385. package/dist/src/functions/workflows/all.workflow.js +45 -12
  386. package/dist/src/scaffold/rpc-remote.gen.d.ts +3 -3
  387. package/dist/src/scaffold/rpc-remote.gen.js +7 -2
  388. package/dist/src/scaffold/workflow-routes.gen.d.ts +18 -18
  389. package/dist/src/scaffold/workflow-routes.gen.js +33 -1
  390. package/dist/src/services/cli-logger.service.d.ts +22 -3
  391. package/dist/src/services/cli-logger.service.js +107 -41
  392. package/dist/src/services.js +32 -67
  393. package/dist/src/utils/generate-bootstrap-file.js +3 -0
  394. package/dist/src/utils/parse-cli-filters.d.ts +18 -0
  395. package/dist/src/utils/parse-cli-filters.js +99 -0
  396. package/dist/src/utils/pikku-cli-config.js +29 -9
  397. package/dist/tsconfig.tsbuildinfo +1 -1
  398. package/package.json +9 -4
  399. package/skills/pikku-addon/SKILL.md +330 -0
  400. package/skills/pikku-ai-agent/SKILL.md +227 -0
  401. package/skills/pikku-ai-vercel/SKILL.md +78 -0
  402. package/skills/pikku-ai-voice/SKILL.md +85 -0
  403. package/skills/pikku-auth-js/SKILL.md +106 -0
  404. package/skills/pikku-aws/SKILL.md +107 -0
  405. package/skills/pikku-backblaze/SKILL.md +70 -0
  406. package/skills/pikku-cli/SKILL.md +281 -0
  407. package/skills/pikku-concepts/SKILL.md +281 -0
  408. package/skills/pikku-concepts/references/concept-mapping.md +528 -0
  409. package/skills/pikku-config/SKILL.md +208 -0
  410. package/skills/pikku-cron/SKILL.md +211 -0
  411. package/skills/pikku-deploy-azure/SKILL.md +69 -0
  412. package/skills/pikku-deploy-cloudflare/SKILL.md +80 -0
  413. package/skills/pikku-deploy-express/SKILL.md +83 -0
  414. package/skills/pikku-deploy-fastify/SKILL.md +70 -0
  415. package/skills/pikku-deploy-lambda/SKILL.md +107 -0
  416. package/skills/pikku-deploy-nextjs/SKILL.md +76 -0
  417. package/skills/pikku-deploy-uws/SKILL.md +85 -0
  418. package/skills/pikku-fabric/SKILL.md +245 -0
  419. package/skills/pikku-feature/SKILL.md +258 -0
  420. package/skills/pikku-gateway-slack/SKILL.md +112 -0
  421. package/skills/pikku-http/SKILL.md +317 -0
  422. package/skills/pikku-i18n/SKILL.md +208 -0
  423. package/skills/pikku-info/SKILL.md +95 -0
  424. package/skills/pikku-jose/SKILL.md +102 -0
  425. package/skills/pikku-kysely/SKILL.md +145 -0
  426. package/skills/pikku-mcp/SKILL.md +237 -0
  427. package/skills/pikku-mongodb/SKILL.md +102 -0
  428. package/skills/pikku-n8n-addon-map/SKILL.md +178 -0
  429. package/skills/pikku-n8n-code-translate/SKILL.md +166 -0
  430. package/skills/pikku-pino/SKILL.md +77 -0
  431. package/skills/pikku-queue/SKILL.md +237 -0
  432. package/skills/pikku-react/SKILL.md +183 -0
  433. package/skills/pikku-react-query/SKILL.md +205 -0
  434. package/skills/pikku-realtime/SKILL.md +285 -0
  435. package/skills/pikku-redis/SKILL.md +87 -0
  436. package/skills/pikku-rpc/SKILL.md +168 -0
  437. package/skills/pikku-rtl/SKILL.md +205 -0
  438. package/skills/pikku-schedule/SKILL.md +54 -0
  439. package/skills/pikku-schema-ajv/SKILL.md +60 -0
  440. package/skills/pikku-schema-cfworker/SKILL.md +60 -0
  441. package/skills/pikku-security/SKILL.md +243 -0
  442. package/skills/pikku-services/SKILL.md +247 -0
  443. package/skills/pikku-template-clone/SKILL.md +39 -0
  444. package/skills/pikku-testing/SKILL.md +428 -0
  445. package/skills/pikku-trigger/SKILL.md +177 -0
  446. package/skills/pikku-versioning/SKILL.md +169 -0
  447. package/skills/pikku-websocket/SKILL.md +239 -0
  448. package/skills/pikku-workflow/SKILL.md +283 -0
  449. package/skills/pikku-workflows-client/SKILL.md +150 -0
  450. package/skills/pikku-ws/SKILL.md +45 -0
  451. package/console-app/assets/index-BpY2pSuA.css +0 -10
  452. package/console-app/assets/index-DXLy-_D4.js +0 -717
  453. package/dist/.pikku/cli/pikku-cli-client.gen.d.ts +0 -10
  454. package/dist/.pikku/cli/pikku-cli-client.gen.js +0 -44
  455. /package/dist/.pikku/schemas/schemas/{PikkuChannelsOutput.schema.json → PikkuCLIEntryOutput.schema.json} +0 -0
@@ -0,0 +1,205 @@
1
+ ---
2
+ name: pikku-rtl
3
+ description: 'Make a Pikku frontend work in both English (LTR) and Arabic / right-to-left languages. Direction is derived from the active locale, applied once at the document root, and the layout mirrors itself — but only if styling is written flow-relative (margin-inline-start, text-align: start, Mantine ms/me) instead of left/right. TRIGGER when: adding Arabic (or Hebrew/Farsi/Urdu), asked to "support RTL / right-to-left / bidi / mirror the layout", or writing layout styles in an app that may run RTL. Builds on pikku-i18n (an RTL language is just another locale file). DO NOT TRIGGER for backend functions or for LTR-only copy changes.'
4
+ installGroups: [core]
5
+ ---
6
+
7
+ # Pikku RTL (Arabic + English)
8
+
9
+ This skill sits **on top of** `pikku-i18n`. That skill maps a locale to `t()`
10
+ tokens; this one adds the second axis: a locale also has a **direction**.
11
+ Arabic is not special-cased — it is just another locale file (`ar.json`,
12
+ registered `satisfies typeof en`) plus the document being told it is `rtl`.
13
+
14
+ ## The one idea
15
+
16
+ Set `dir` **once at the document root** from the active locale, then let the
17
+ browser and Mantine mirror everything — *provided* every custom style is written
18
+ **flow-relative** (start/end), never **physical** (left/right). Get those two
19
+ things right and Arabic, Hebrew, Farsi and Urdu all work with zero per-component
20
+ RTL code.
21
+
22
+ ## Agent Operating Procedure
23
+
24
+ 1. **Tokens first.** Every visible string is already a `t()` token via
25
+ `pikku-i18n`. Arabic copy goes in `i18n/ar.json`, mirroring `en.json`'s keys,
26
+ registered with `satisfies typeof en` so a missing key is a compile error.
27
+ 2. **Add the direction helper** to the i18n config (one home for locale→dir):
28
+ ```ts
29
+ const RTL_LOCALES = new Set(['ar', 'he', 'fa', 'ur'])
30
+ export function localeDir(locale: string = defaultLocale): 'rtl' | 'ltr' {
31
+ return RTL_LOCALES.has(locale.split('-')[0]) ? 'rtl' : 'ltr'
32
+ }
33
+ ```
34
+ (The bundled templates already ship this helper — use it, don't reinvent it.)
35
+ 3. **Apply `dir` + `lang` at the root**, once, from the active locale — pick the
36
+ recipe for your framework below.
37
+ 4. **Write every layout style flow-relative.** This is the part that actually
38
+ makes mirroring work; see the rules. When editing existing UI to be
39
+ RTL-ready, the job is mostly a search-and-replace of physical properties.
40
+ 5. **Flip directional icons** (chevrons, back/forward arrows) — the one thing
41
+ logical properties can't do for you.
42
+ 6. Validate with the app's `tsc`, then load `?i18n-debug` / set `dir` and
43
+ eyeball that the layout mirrors and nothing is stuck on the wrong edge.
44
+
45
+ ## Flow-relative, not physical — the rules that make it mirror
46
+
47
+ Use the **inline-axis logical** property; never the physical one:
48
+
49
+ | Don't (physical) | Do (flow-relative) |
50
+ | --------------------------- | ------------------------------------------- |
51
+ | `margin-left` / `marginLeft`| `margin-inline-start` / `marginInlineStart` |
52
+ | `margin-right` | `margin-inline-end` / `marginInlineEnd` |
53
+ | `padding-left/right` | `padding-inline-start/end` |
54
+ | `left: 0` / `right: 0` | `inset-inline-start: 0` / `inset-inline-end`|
55
+ | `text-align: left/right` | `text-align: start / end` |
56
+ | `border-top-left-radius` | `border-start-start-radius` |
57
+ | `float: left/right` | `float: inline-start / inline-end` |
58
+
59
+ In **Mantine**, use the logical style props — they emit the logical CSS above:
60
+
61
+ | Don't | Do |
62
+ | ------------ | ------------- |
63
+ | `ml` / `mr` | `ms` / `me` |
64
+ | `pl` / `pr` | `ps` / `pe` |
65
+
66
+ Mantine's own components already use logical properties internally, so once the
67
+ direction is set they mirror automatically — you only have to be disciplined in
68
+ **your** styles.
69
+
70
+ **Leave flexbox and grid alone.** `display:flex` already follows `dir`:
71
+ `justify-content: flex-start` resolves to the right edge under RTL on its own.
72
+ Never "fix" RTL by swapping to `flex-direction: row-reverse` or reordering DOM —
73
+ that double-flips and breaks the moment direction changes. The DOM order is
74
+ logical order; let `dir` handle the visual order.
75
+
76
+ ## Applying direction at the root
77
+
78
+ ### Mantine app (e.g. environment-template)
79
+ Mantine ships first-class RTL: wrap the tree in `DirectionProvider` and set the
80
+ matching `dir` on `<html>`.
81
+
82
+ ```tsx
83
+ import { DirectionProvider, MantineProvider } from '@mantine/core'
84
+ import i18n, { detectLocale, localeDir } from './i18n/config'
85
+
86
+ const locale = typeof window !== 'undefined'
87
+ ? detectLocale(window.location.pathname)
88
+ : 'en'
89
+ const dir = localeDir(locale)
90
+
91
+ if (typeof document !== 'undefined') {
92
+ document.documentElement.lang = locale
93
+ document.documentElement.dir = dir // Mantine + browser read this
94
+ }
95
+
96
+ root.render(
97
+ <DirectionProvider initialDirection={dir}>
98
+ <MantineProvider theme={theme} defaultColorScheme="dark">
99
+ {/* …app… */}
100
+ </MantineProvider>
101
+ </DirectionProvider>,
102
+ )
103
+ ```
104
+ To flip direction live (a language switcher) call
105
+ `document.documentElement.setAttribute('dir', localeDir(next))` and Mantine's
106
+ `useDirection().setDirection(dir)`; both read the same value.
107
+
108
+ ### Plain Vite SPA (kanban, test-harness vite-spa)
109
+ No Mantine — just put `dir`/`lang` on `<html>` at bootstrap, after the locale is
110
+ detected (the same `detectLocale` the i18n config uses):
111
+
112
+ ```ts
113
+ import { detectLocale, localeDir } from './i18n/config'
114
+
115
+ const locale = detectLocale(window.location.pathname)
116
+ document.documentElement.lang = locale
117
+ document.documentElement.dir = localeDir(locale)
118
+ ```
119
+ Everything below inherits `dir` from `<html>`; logical CSS does the mirroring.
120
+
121
+ ### Vite SSR (test-harness vite-ssr)
122
+ The worker renders the full HTML, so set `lang`/`dir` on the server `<html>`
123
+ from the **URL** locale (the client inherits it on hydration — no flash):
124
+
125
+ ```tsx
126
+ import { detectLocale, localeDir } from './i18n/config'
127
+
128
+ const locale = detectLocale(new URL(request.url).pathname)
129
+ const dir = localeDir(locale)
130
+ const html = `<!doctype html>
131
+ <html lang="${locale}" dir="${dir}">
132
+
133
+ </html>`
134
+ ```
135
+ i18next's active language must match: call `i18n.changeLanguage(locale)` before
136
+ `renderToString` so the SSR'd text and `dir` agree.
137
+
138
+ ### Next.js app-router (test-harness next-ssr / next-static)
139
+ Set it on the `<html>` in `app/layout.tsx`. With locale-prefixed routes the
140
+ segment gives the locale; for a single-locale build it's a constant:
141
+
142
+ ```tsx
143
+ import { localeDir, defaultLocale } from './i18n/config'
144
+
145
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
146
+ const locale = defaultLocale // or the [lang] route segment / params
147
+ return (
148
+ <html lang={locale} dir={localeDir(locale)}>
149
+ <body>{children}</body>
150
+ </html>
151
+ )
152
+ }
153
+ ```
154
+ For `output: 'export'` with `/ar` prefixes, derive `locale` from the route
155
+ segment so each statically-exported tree carries the right `dir`.
156
+
157
+ ## Directional icons — the manual bit
158
+
159
+ Logical properties mirror box layout, **not glyphs**. An icon that points
160
+ somewhere (chevron, back/next arrow, send, undo) must flip under RTL; a
161
+ non-directional icon (search, settings, avatar) must **not**. Flip with the
162
+ `:dir()` selector — no JS, no per-locale branching:
163
+
164
+ ```css
165
+ :dir(rtl) .icon-directional { transform: scaleX(-1); }
166
+ ```
167
+ Or in CSS-in-JS / inline, gate on the resolved direction:
168
+ `transform: localeDir(locale) === 'rtl' ? 'scaleX(-1)' : undefined`.
169
+ Prefer logical icon components if your icon set ships them.
170
+
171
+ ## Arabic typography niceties
172
+
173
+ - **Font:** the default Latin stack renders Arabic with the system fallback,
174
+ which is inconsistent. Add an Arabic-capable family (e.g. *Noto Sans Arabic*,
175
+ *IBM Plex Sans Arabic*) to `font-family` so both scripts look intentional.
176
+ - **Numerals:** don't hardcode digits. Format numbers/dates with
177
+ `Intl.NumberFormat`/`Intl.DateTimeFormat` (or i18next formatters) given the
178
+ active locale, so Western vs Arabic-Indic digits follow the locale choice.
179
+ - **Line height:** Arabic diacritics sit tall — a slightly larger `line-height`
180
+ on Arabic body text avoids clipping. Keep it locale-scoped, not global.
181
+
182
+ ## Adding Arabic to an existing app — checklist
183
+
184
+ 1. `i18n/ar.json` mirroring `en.json`; register
185
+ `ar: { translation: ar satisfies typeof en }` and add `'ar'` to
186
+ `supportedLocales`. (Type-complete or it won't compile — the deploy blocks.)
187
+ 2. Confirm the `localeDir` helper includes `ar` (it does by default).
188
+ 3. Confirm the root sets `dir` from the locale (recipe above).
189
+ 4. Sweep the app's styles: replace every `left/right`, `ml/mr`, `text-align:
190
+ left` with the flow-relative equivalent; revert any manual `row-reverse`.
191
+ 5. Flip directional icons.
192
+ 6. `tsc`, then load the Arabic route and verify the whole layout mirrors —
193
+ sidebar on the right, text right-aligned, arrows pointing the other way.
194
+
195
+ ## What NOT to do
196
+
197
+ - Don't use physical `left`/`right` (or `ml`/`mr`) in any new layout style — even
198
+ in an English-only app. Writing logical from the start is the seam Arabic
199
+ slots into, exactly like tokens are for copy.
200
+ - Don't fake RTL with `flex-direction: row-reverse`, reversed DOM order, or
201
+ per-locale `if (rtl)` layout branches. Set `dir` once; let layout follow.
202
+ - Don't set `dir` on individual components — it belongs on `<html>` so the whole
203
+ document (and Mantine) agrees.
204
+ - Don't translate Arabic copy outside the `t()` token system; an RTL language is
205
+ a normal locale, governed by `pikku-i18n`.
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: pikku-schedule
3
+ description: 'Use when setting up in-memory cron scheduling in a Pikku app. Covers InMemorySchedulerService for running scheduled tasks.
4
+ TRIGGER when: code uses InMemorySchedulerService, PikkuTaskScheduler, or user asks about in-memory scheduling, cron jobs without external dependencies, or @pikku/schedule.
5
+ DO NOT TRIGGER when: user asks about cron wiring (use pikku-cron) or queue-based scheduling with BullMQ/PgBoss (use pikku-queue).'
6
+ installGroups: [core]
7
+ ---
8
+
9
+ # Pikku Schedule (In-Memory Scheduler)
10
+
11
+ ## Agent Operating Procedure
12
+
13
+ Use this skill as an execution checklist, not reference material.
14
+
15
+ 1. Discover before editing. Prefer OpenCode tools such as `pikku-meta` when available; otherwise run the relevant `pikku meta ... --json` command and inspect only the focused output you need.
16
+ 2. Identify the source files that own the behavior. Do not start by reading generated output, `.pikku`, `node_modules`, vendored packages, or broad build artifacts.
17
+ 3. Make the smallest source change that satisfies the task. Keep generated files generated, and avoid hand-editing SDKs, schema output, or typegen.
18
+ 4. Validate with the narrowest relevant command first, then run `pikku-verify` or `pikku all` when functions, wirings, schemas, or generated clients may have changed.
19
+ 5. If validation fails, fix the source cause and rerun validation. Do not paper over generated errors by editing generated files.
20
+
21
+ `@pikku/schedule` provides an in-memory cron scheduler for running Pikku scheduled functions without external dependencies like Redis or PostgreSQL.
22
+
23
+ ## Installation
24
+
25
+ ```bash
26
+ yarn add @pikku/schedule
27
+ ```
28
+
29
+ ## API Reference
30
+
31
+ ### `InMemorySchedulerService`
32
+
33
+ ```typescript
34
+ import { InMemorySchedulerService } from '@pikku/schedule'
35
+
36
+ const scheduler = new InMemorySchedulerService()
37
+ ```
38
+
39
+ Implements the scheduler service interface. Schedules are held in memory — they do not survive process restarts. Suitable for development and single-instance deployments.
40
+
41
+ ## Usage Patterns
42
+
43
+ ### Basic Setup
44
+
45
+ ```typescript
46
+ import { InMemorySchedulerService } from '@pikku/schedule'
47
+
48
+ const createSingletonServices = pikkuServices(async (config) => {
49
+ const scheduler = new InMemorySchedulerService()
50
+ return { config, scheduler }
51
+ })
52
+ ```
53
+
54
+ For distributed or persistent scheduling, use BullMQ (`BullSchedulerService`) or PgBoss (`PgBossSchedulerService`) from the queue packages instead. See `pikku-queue` for details.
@@ -0,0 +1,60 @@
1
+ ---
2
+ name: pikku-schema-ajv
3
+ description: 'Use when setting up JSON schema validation with AJV in a Pikku app. Covers AjvSchemaService for request/response validation.
4
+ TRIGGER when: code uses AjvSchemaService, user asks about AJV, JSON schema validation, or @pikku/schema-ajv.
5
+ DO NOT TRIGGER when: user asks about Cloudflare Workers schema validation (use pikku-schema-cfworker).'
6
+ installGroups: [core]
7
+ ---
8
+
9
+ # Pikku Schema AJV (JSON Schema Validation)
10
+
11
+ ## Agent Operating Procedure
12
+
13
+ Use this skill as an execution checklist, not reference material.
14
+
15
+ 1. Discover before editing. Prefer OpenCode tools such as `pikku-meta` when available; otherwise run the relevant `pikku meta ... --json` command and inspect only the focused output you need.
16
+ 2. Identify the source files that own the behavior. Do not start by reading generated output, `.pikku`, `node_modules`, vendored packages, or broad build artifacts.
17
+ 3. Make the smallest source change that satisfies the task. Keep generated files generated, and avoid hand-editing SDKs, schema output, or typegen.
18
+ 4. Validate with the narrowest relevant command first, then run `pikku-verify` or `pikku all` when functions, wirings, schemas, or generated clients may have changed.
19
+ 5. If validation fails, fix the source cause and rerun validation. Do not paper over generated errors by editing generated files.
20
+
21
+ `@pikku/schema-ajv` provides JSON schema validation using [AJV](https://ajv.js.org/). Implements the `SchemaService` interface from `@pikku/core`. This is the default schema validator for Node.js environments.
22
+
23
+ ## Installation
24
+
25
+ ```bash
26
+ yarn add @pikku/schema-ajv
27
+ ```
28
+
29
+ ## API Reference
30
+
31
+ ### `AjvSchemaService`
32
+
33
+ ```typescript
34
+ import { AjvSchemaService } from '@pikku/schema-ajv'
35
+
36
+ const schema = new AjvSchemaService(logger: Logger)
37
+ ```
38
+
39
+ **Methods:**
40
+
41
+ - `compileSchema(schema: string, value: any): void` — Compile and register a JSON schema
42
+ - `validateSchema(schemaName: string, json: any): void` — Validate data against a compiled schema (throws on failure)
43
+ - `getSchemaNames(): Set<string>` — Get all registered schema names
44
+ - `getSchemaKeys(schemaName: string): string[]` — Get property keys for a schema
45
+
46
+ ## Usage Patterns
47
+
48
+ ### With Pikku Services
49
+
50
+ ```typescript
51
+ import { AjvSchemaService } from '@pikku/schema-ajv'
52
+
53
+ const createSingletonServices = pikkuServices(async (config) => {
54
+ const logger = new ConsoleLogger()
55
+ const schema = new AjvSchemaService(logger)
56
+ return { config, logger, schema }
57
+ })
58
+ ```
59
+
60
+ Pikku automatically uses the schema service to validate function inputs and outputs when schemas are defined in your function definitions.
@@ -0,0 +1,60 @@
1
+ ---
2
+ name: pikku-schema-cfworker
3
+ description: 'Use when setting up JSON schema validation for Cloudflare Workers in a Pikku app. Covers CFWorkerSchemaService as a lightweight alternative to AJV.
4
+ TRIGGER when: code uses CFWorkerSchemaService, user asks about schema validation on Cloudflare Workers, or @pikku/schema-cfworker.
5
+ DO NOT TRIGGER when: user asks about AJV schema validation (use pikku-schema-ajv).'
6
+ installGroups: [core, fabric]
7
+ ---
8
+
9
+ # Pikku Schema CFWorker (Cloudflare Workers Validation)
10
+
11
+ ## Agent Operating Procedure
12
+
13
+ Use this skill as an execution checklist, not reference material.
14
+
15
+ 1. Discover before editing. Prefer OpenCode tools such as `pikku-meta` when available; otherwise run the relevant `pikku meta ... --json` command and inspect only the focused output you need.
16
+ 2. Identify the source files that own the behavior. Do not start by reading generated output, `.pikku`, `node_modules`, vendored packages, or broad build artifacts.
17
+ 3. Make the smallest source change that satisfies the task. Keep generated files generated, and avoid hand-editing SDKs, schema output, or typegen.
18
+ 4. Validate with the narrowest relevant command first, then run `pikku-verify` or `pikku all` when functions, wirings, schemas, or generated clients may have changed.
19
+ 5. If validation fails, fix the source cause and rerun validation. Do not paper over generated errors by editing generated files.
20
+
21
+ `@pikku/schema-cfworker` provides JSON schema validation using [@cfworker/json-schema](https://github.com/cfworker/cfworker), a lightweight validator compatible with Cloudflare Workers (no `eval` or `new Function`). Implements the `SchemaService` interface from `@pikku/core`.
22
+
23
+ ## Installation
24
+
25
+ ```bash
26
+ yarn add @pikku/schema-cfworker
27
+ ```
28
+
29
+ ## API Reference
30
+
31
+ ### `CFWorkerSchemaService`
32
+
33
+ ```typescript
34
+ import { CFWorkerSchemaService } from '@pikku/schema-cfworker'
35
+
36
+ const schema = new CFWorkerSchemaService(logger: Logger)
37
+ ```
38
+
39
+ **Methods:**
40
+
41
+ - `compileSchema(schema: string, value: any): void` — Compile and register a JSON schema
42
+ - `validateSchema(schemaName: string, json: any): void` — Validate data against a compiled schema (throws on failure)
43
+ - `getSchemaNames(): Set<string>` — Get all registered schema names
44
+ - `getSchemaKeys(schemaName: string): string[]` — Get property keys for a schema
45
+
46
+ ## Usage Patterns
47
+
48
+ ### With Cloudflare Workers
49
+
50
+ ```typescript
51
+ import { CFWorkerSchemaService } from '@pikku/schema-cfworker'
52
+
53
+ const createSingletonServices = pikkuServices(async (config) => {
54
+ const logger = new ConsoleLogger()
55
+ const schema = new CFWorkerSchemaService(logger)
56
+ return { config, logger, schema }
57
+ })
58
+ ```
59
+
60
+ Use this instead of `@pikku/schema-ajv` when deploying to Cloudflare Workers, as AJV uses `eval` which is not permitted in the Workers runtime.
@@ -0,0 +1,243 @@
1
+ ---
2
+ name: pikku-security
3
+ description: 'Use when adding authentication, authorization, permissions, middleware, or security to a Pikku app. Covers pikkuAuth, pikkuPermission, pikkuMiddleware, built-in auth strategies (bearer, cookie, API key), and permission scoping.
4
+ TRIGGER when: code uses pikkuAuth/pikkuPermission/pikkuMiddleware, user asks about auth, login, session, permissions, RBAC, middleware, or API keys.
5
+ DO NOT TRIGGER when: user asks about JWT service setup (use pikku-services) or secrets/env vars (use pikku-config).'
6
+ installGroups: [core]
7
+ ---
8
+
9
+ # Pikku Security (Auth, Permissions, Middleware)
10
+
11
+ ## Agent Operating Procedure
12
+
13
+ Use this skill as an execution checklist, not reference material.
14
+
15
+ 1. Discover before editing. Prefer OpenCode tools such as `pikku-meta` when available; otherwise run the relevant `pikku meta ... --json` command and inspect only the focused output you need.
16
+ 2. Identify the source files that own the behavior. Do not start by reading generated output, `.pikku`, `node_modules`, vendored packages, or broad build artifacts.
17
+ 3. Make the smallest source change that satisfies the task. Keep generated files generated, and avoid hand-editing SDKs, schema output, or typegen.
18
+ 4. Validate with the narrowest relevant command first, then run `pikku-verify` or `pikku all` when functions, wirings, schemas, or generated clients may have changed.
19
+ 5. If validation fails, fix the source cause and rerun validation. Do not paper over generated errors by editing generated files.
20
+
21
+ Pikku provides a layered security model: authentication middleware (who are you?), auth checks (are you logged in?), and permissions (can you do this?). All work across every transport (HTTP, WebSocket, CLI, queue, etc.).
22
+
23
+ ## Before You Start
24
+
25
+ ```bash
26
+ pikku info middleware --verbose # See existing middleware and where it's applied
27
+ pikku info permissions --verbose # See existing permissions
28
+ pikku info functions --verbose # See which functions have auth/permissions
29
+ ```
30
+
31
+ See `pikku-concepts` for the core mental model.
32
+
33
+ ## API Reference
34
+
35
+ ### Session Management
36
+
37
+ Functions access session via the wire object:
38
+
39
+ ```typescript
40
+ // In pikkuFunc (authenticated)
41
+ const getProfile = pikkuFunc({
42
+ func: async ({ db }, _data, { session }) => {
43
+ return await db.getUser(session.userId)
44
+ },
45
+ })
46
+
47
+ // Set session (e.g., after login)
48
+ const login = pikkuFunc({
49
+ auth: false,
50
+ func: async ({ jwt, db }, { email, password }, { setSession }) => {
51
+ const user = await db.verifyCredentials(email, password)
52
+ setSession({ userId: user.id, role: user.role })
53
+ return { token: jwt.sign({ userId: user.id }) }
54
+ },
55
+ })
56
+
57
+ // Clear session (logout)
58
+ const logout = pikkuFunc({
59
+ func: async ({}, _data, { clearSession }) => {
60
+ clearSession()
61
+ },
62
+ })
63
+ ```
64
+
65
+ ### `pikkuAuth(fn)` — Session-Only Checks
66
+
67
+ Use for authentication gates that only need the session (no request data).
68
+
69
+ ```typescript
70
+ import { pikkuAuth } from '#pikku'
71
+
72
+ // Receives (services, session)
73
+ export const isAuthenticated = pikkuAuth(
74
+ async (_services, session) => !!session
75
+ )
76
+
77
+ export const isAdmin = pikkuAuth(
78
+ async (_services, session) => session?.role === 'admin'
79
+ )
80
+ ```
81
+
82
+ ### `pikkuPermission(fn)` — Data-Aware Checks
83
+
84
+ Use when authorization depends on the actual request data.
85
+
86
+ ```typescript
87
+ import { pikkuPermission } from '#pikku'
88
+
89
+ // Receives (services, data, wire)
90
+ export const isOwner = pikkuPermission(
91
+ async ({ db }, { bookId }, { session }) => {
92
+ const book = await db.getBook(bookId)
93
+ return book?.authorId === session?.userId
94
+ }
95
+ )
96
+
97
+ export const hasBookAccess = pikkuPermission(
98
+ async ({ db }, { bookId }, { session }) => {
99
+ return await db.hasAccess(session?.userId, bookId)
100
+ }
101
+ )
102
+ ```
103
+
104
+ ### Permission Groups (OR/AND Logic)
105
+
106
+ ```typescript
107
+ {
108
+ admin: isAdmin, // OR: admins can access
109
+ owner: isOwner, // OR: owners can access
110
+ reviewer: [isAuthenticated, hasBookAccess], // AND: both must pass
111
+ }
112
+ // Logic: admin OR owner OR (isAuthenticated AND hasBookAccess)
113
+ ```
114
+
115
+ ### `pikkuMiddleware(fn)` — Before/After Wrapping
116
+
117
+ ```typescript
118
+ import { pikkuMiddleware } from '#pikku'
119
+
120
+ const logRequest = pikkuMiddleware(async ({ logger }, wire, next) => {
121
+ logger.info('Before')
122
+ await next()
123
+ logger.info('After')
124
+ })
125
+ ```
126
+
127
+ ### Built-in Auth Middleware
128
+
129
+ ```typescript
130
+ import { authBearer, authCookie, authAPIKey } from '@pikku/core/middleware'
131
+
132
+ // JWT bearer token — reads Authorization header
133
+ addHTTPMiddleware([authBearer()])
134
+
135
+ // Cookie-based sessions — auto-refreshes JWT
136
+ addHTTPMiddleware([
137
+ authCookie({
138
+ name: 'session',
139
+ expiresIn: { value: 30, unit: 'day' },
140
+ options: { httpOnly: true, secure: true },
141
+ }),
142
+ ])
143
+
144
+ // API key — from x-api-key header or ?apiKey= query
145
+ addHTTPMiddleware([authAPIKey({ source: 'all' })])
146
+ ```
147
+
148
+ ### Scoping: Where to Apply
149
+
150
+ Four levels of scoping, from broadest to narrowest:
151
+
152
+ ```typescript
153
+ // 1. Global: all HTTP routes
154
+ addHTTPMiddleware('*', [authBearer()])
155
+
156
+ // 2. Prefix-based: URL pattern
157
+ addHTTPMiddleware('/admin/*', [auditLog])
158
+ addHTTPPermission('/admin/*', { admin: requireAdmin })
159
+
160
+ // 3. Tag-based: any wiring with matching tag
161
+ addMiddleware('api', [rateLimiter])
162
+ addPermission('api', { auth: requireAuth })
163
+
164
+ // 4. Inline: per-wiring
165
+ wireHTTP({
166
+ route: '/books/:id',
167
+ func: getBook,
168
+ middleware: [cacheControl],
169
+ permissions: { owner: requireOwnership },
170
+ })
171
+ ```
172
+
173
+ ### Per-Function Permissions
174
+
175
+ ```typescript
176
+ export const deleteBook = pikkuFunc({
177
+ func: async ({ db }, { bookId }) => {
178
+ await db.deleteBook(bookId)
179
+ },
180
+ permissions: {
181
+ admin: isAdmin,
182
+ owner: isOwner,
183
+ reviewer: [isAuthenticated, hasBookAccess],
184
+ },
185
+ })
186
+ ```
187
+
188
+ ## Complete Example
189
+
190
+ ```typescript
191
+ // permissions.ts
192
+ import { pikkuAuth, pikkuPermission } from '#pikku'
193
+
194
+ export const isAuthenticated = pikkuAuth(
195
+ async (_services, session) => !!session
196
+ )
197
+
198
+ export const isAdmin = pikkuAuth(
199
+ async (_services, session) => session?.role === 'admin'
200
+ )
201
+
202
+ export const isBookOwner = pikkuPermission(
203
+ async ({ db }, { bookId }, { session }) => {
204
+ const book = await db.getBook(bookId)
205
+ return book?.authorId === session?.userId
206
+ }
207
+ )
208
+
209
+ // middleware.ts
210
+ import { pikkuMiddleware } from '#pikku'
211
+
212
+ export const auditLog = pikkuMiddleware(async ({ logger, db }, wire, next) => {
213
+ const start = Date.now()
214
+ await next()
215
+ await db.createAuditLog({
216
+ duration: Date.now() - start,
217
+ })
218
+ })
219
+
220
+ // wirings/security.wiring.ts
221
+ import { authBearer } from '@pikku/core/middleware'
222
+ import { addHTTPMiddleware, addHTTPPermission } from '#pikku'
223
+
224
+ // All routes require bearer auth
225
+ addHTTPMiddleware('*', [authBearer()])
226
+
227
+ // Admin routes need admin permission + audit logging
228
+ addHTTPMiddleware('/admin/*', [auditLog])
229
+ addHTTPPermission('/admin/*', { admin: isAdmin })
230
+
231
+ // functions/books.functions.ts
232
+ export const deleteBook = pikkuFunc({
233
+ title: 'Delete Book',
234
+ func: async ({ db }, { bookId }) => {
235
+ await db.deleteBook(bookId)
236
+ return { deleted: true }
237
+ },
238
+ permissions: {
239
+ admin: isAdmin,
240
+ owner: isBookOwner,
241
+ },
242
+ })
243
+ ```