@cosmicdrift/kumiko-framework 0.386.0 → 0.388.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (468) hide show
  1. package/AGENTS.md +6 -1
  2. package/LICENSE +21 -57
  3. package/README.md +2 -2
  4. package/agents/examples/anonymous-access.md +1 -1
  5. package/agents/examples/apex-landing.md +204 -0
  6. package/agents/examples/api-worker-split.md +64 -0
  7. package/agents/examples/app-config.md +14 -0
  8. package/agents/examples/auth-mfa.md +115 -0
  9. package/agents/examples/env-composition.md +28 -1
  10. package/agents/examples/legal-pages.md +1 -1
  11. package/agents/examples/prod-boot-options.md +16 -0
  12. package/agents/examples/rate-limiting.md +48 -0
  13. package/agents/examples/record-detail-layout.md +692 -0
  14. package/agents/examples/seed-migration.md +212 -0
  15. package/agents/examples/wizard-form.md +941 -0
  16. package/agents/examples/writeform-section.md +548 -0
  17. package/agents/features.md +19 -2
  18. package/agents/widgets.md +40 -39
  19. package/dist/api/api-constants.js +2 -2
  20. package/dist/api/auth-middleware.js +7 -7
  21. package/dist/api/auth-rate-limiters.js +7 -3
  22. package/dist/api/auth-routes-mfa.js +1 -1
  23. package/dist/api/auth-routes-session.js +1 -1
  24. package/dist/api/auth-routes-shared.js +7 -3
  25. package/dist/api/auth-routes-signup.js +1 -1
  26. package/dist/api/client-error-route.js +8 -2
  27. package/dist/api/client-ip.js +3 -1
  28. package/dist/api/extra-route.js +1 -1
  29. package/dist/api/index.d.ts +3 -1
  30. package/dist/api/index.js +3 -1
  31. package/dist/api/pii-leak-guard.js +4 -2
  32. package/dist/api/readiness.js +5 -5
  33. package/dist/api/redis-sse-broker.js +8 -6
  34. package/dist/api/request-context.d.ts +1 -1
  35. package/dist/api/request-context.js +1 -1
  36. package/dist/api/routes.js +2 -2
  37. package/dist/api/server-boot-checks.d.ts +10 -0
  38. package/dist/api/server-boot-checks.js +157 -0
  39. package/dist/api/server-event-dispatcher.d.ts +26 -0
  40. package/dist/api/server-event-dispatcher.js +208 -0
  41. package/dist/api/server-extra-routes.d.ts +11 -0
  42. package/dist/api/server-extra-routes.js +203 -0
  43. package/dist/api/server-middleware.d.ts +20 -0
  44. package/dist/api/server-middleware.js +211 -0
  45. package/dist/api/server-routes.d.ts +19 -0
  46. package/dist/api/server-routes.js +293 -0
  47. package/dist/api/server-websocket-routes.d.ts +4 -0
  48. package/dist/api/server-websocket-routes.js +108 -0
  49. package/dist/api/server-wiring.d.ts +32 -0
  50. package/dist/api/server-wiring.js +236 -0
  51. package/dist/api/server.d.ts +10 -15
  52. package/dist/api/server.js +48 -1250
  53. package/dist/api/session-cookies.js +4 -4
  54. package/dist/api/sse-broker.js +1 -1
  55. package/dist/api/sse-route.d.ts +13 -13
  56. package/dist/api/sse-route.js +31 -27
  57. package/dist/auth/index.js +4 -4
  58. package/dist/auth/roles.d.ts +4 -4
  59. package/dist/auth/roles.js +24 -24
  60. package/dist/compliance/duration-spec.js +18 -20
  61. package/dist/compliance/index.js +2 -3
  62. package/dist/compliance/override-schema.d.ts +4 -4
  63. package/dist/compliance/override-schema.js +19 -22
  64. package/dist/compliance/profiles.d.ts +26 -29
  65. package/dist/compliance/profiles.js +62 -69
  66. package/dist/compliance/sub-processors.d.ts +28 -30
  67. package/dist/compliance/sub-processors.js +17 -21
  68. package/dist/consumer-cli.js +4 -4
  69. package/dist/crypto/blind-index.js +18 -17
  70. package/dist/crypto/ciphertext-pattern.js +1 -1
  71. package/dist/crypto/event-pii.js +3 -3
  72. package/dist/crypto/kek-source.d.ts +1 -1
  73. package/dist/crypto/kek-source.js +3 -2
  74. package/dist/crypto/kms-adapter.d.ts +1 -1
  75. package/dist/crypto/kms-adapter.js +4 -6
  76. package/dist/crypto/kms-wiring.d.ts +1 -2
  77. package/dist/crypto/kms-wiring.js +2 -2
  78. package/dist/crypto/owner-transition-rekey.d.ts +5 -1
  79. package/dist/crypto/owner-transition-rekey.js +1 -1
  80. package/dist/crypto/pg-kms-adapter.js +2 -6
  81. package/dist/crypto/pii-field-encryption.d.ts +5 -1
  82. package/dist/crypto/pii-field-encryption.js +7 -5
  83. package/dist/crypto/subject-resolver.d.ts +1 -1
  84. package/dist/crypto/subject-resolver.js +2 -2
  85. package/dist/db/aggregate-sql.d.ts +21 -0
  86. package/dist/db/aggregate-sql.js +155 -0
  87. package/dist/db/apply-entity-event.d.ts +6 -6
  88. package/dist/db/apply-entity-event.js +55 -55
  89. package/dist/db/blind-index-cleanup.js +7 -7
  90. package/dist/db/closed-connection.d.ts +9 -0
  91. package/dist/db/closed-connection.js +95 -0
  92. package/dist/db/collect-table-metas.js +10 -11
  93. package/dist/db/compound-types.d.ts +1 -1
  94. package/dist/db/compound-types.js +12 -12
  95. package/dist/db/cursor.js +3 -4
  96. package/dist/db/dialect.d.ts +2 -2
  97. package/dist/db/dialect.js +3 -3
  98. package/dist/db/distinct-on.d.ts +1 -1
  99. package/dist/db/driver-row-coercion.d.ts +2 -0
  100. package/dist/db/driver-row-coercion.js +186 -0
  101. package/dist/db/driver-value-preparation.d.ts +16 -0
  102. package/dist/db/driver-value-preparation.js +99 -0
  103. package/dist/db/eagerload.d.ts +3 -3
  104. package/dist/db/eagerload.js +21 -12
  105. package/dist/db/entity-field-encryption.d.ts +1 -0
  106. package/dist/db/entity-field-encryption.js +1 -1
  107. package/dist/db/entity-table-meta.d.ts +2 -2
  108. package/dist/db/entity-table-meta.js +105 -112
  109. package/dist/db/event-store-executor-context.d.ts +3 -2
  110. package/dist/db/event-store-executor-context.js +13 -13
  111. package/dist/db/event-store-executor-read-aggregate.d.ts +8 -0
  112. package/dist/db/event-store-executor-read-aggregate.js +112 -0
  113. package/dist/db/event-store-executor-read-filter.d.ts +31 -0
  114. package/dist/db/event-store-executor-read-filter.js +203 -0
  115. package/dist/db/event-store-executor-read-paging.d.ts +14 -0
  116. package/dist/db/event-store-executor-read-paging.js +99 -0
  117. package/dist/db/event-store-executor-read-rows.d.ts +6 -0
  118. package/dist/db/event-store-executor-read-rows.js +32 -0
  119. package/dist/db/event-store-executor-read-search.d.ts +28 -0
  120. package/dist/db/event-store-executor-read-search.js +221 -0
  121. package/dist/db/event-store-executor-read-sort.d.ts +41 -0
  122. package/dist/db/event-store-executor-read-sort.js +130 -0
  123. package/dist/db/event-store-executor-read-where.d.ts +24 -0
  124. package/dist/db/event-store-executor-read-where.js +81 -0
  125. package/dist/db/event-store-executor-read.d.ts +2 -9
  126. package/dist/db/event-store-executor-read.js +50 -704
  127. package/dist/db/event-store-executor-write-steps.d.ts +20 -0
  128. package/dist/db/event-store-executor-write-steps.js +100 -0
  129. package/dist/db/event-store-executor-write.js +401 -510
  130. package/dist/db/index.d.ts +6 -2
  131. package/dist/db/index.js +5 -1
  132. package/dist/db/list-aggregate-labels.d.ts +14 -0
  133. package/dist/db/list-aggregate-labels.js +26 -0
  134. package/dist/db/located-timestamp.d.ts +11 -11
  135. package/dist/db/located-timestamp.js +29 -30
  136. package/dist/db/migrate-generator.d.ts +1 -1
  137. package/dist/db/migrate-generator.js +97 -105
  138. package/dist/db/migrate-runner.js +29 -26
  139. package/dist/db/money.d.ts +6 -6
  140. package/dist/db/money.js +29 -27
  141. package/dist/db/queries/backfill-pii.js +5 -5
  142. package/dist/db/queries/ddl.js +1 -1
  143. package/dist/db/queries/es-ops.d.ts +1 -1
  144. package/dist/db/queries/es-ops.js +1 -1
  145. package/dist/db/queries/event-consumer.js +3 -3
  146. package/dist/db/queries/event-store.js +4 -2
  147. package/dist/db/queries/projection-rebuild.js +3 -3
  148. package/dist/db/queries/raw-sql.d.ts +2 -2
  149. package/dist/db/queries/raw-sql.js +2 -2
  150. package/dist/db/queries/shadow-swap.js +19 -19
  151. package/dist/db/query.d.ts +3 -16
  152. package/dist/db/query.js +8 -761
  153. package/dist/db/rebuild-marker.js +20 -21
  154. package/dist/db/reference-data.js +6 -1
  155. package/dist/db/replay-migration-sql.js +2 -2
  156. package/dist/db/schema-inspection.js +4 -5
  157. package/dist/db/table-builder.d.ts +1 -2
  158. package/dist/db/table-builder.js +137 -190
  159. package/dist/db/table-info.d.ts +10 -0
  160. package/dist/db/table-info.js +45 -0
  161. package/dist/db/temporal-value-guards.d.ts +6 -0
  162. package/dist/db/temporal-value-guards.js +15 -0
  163. package/dist/db/tenant-db-runner.d.ts +1 -0
  164. package/dist/db/tenant-db-runner.js +3 -0
  165. package/dist/db/tenant-db.d.ts +2 -2
  166. package/dist/db/tenant-db.js +48 -11
  167. package/dist/db/where-clause.d.ts +6 -0
  168. package/dist/db/where-clause.js +236 -0
  169. package/dist/derivatives/delete-stored-file.js +6 -2
  170. package/dist/derivatives/derivatives-context.js +1 -1
  171. package/dist/engine/boot-validator/access-roles.js +4 -3
  172. package/dist/engine/boot-validator/api-ext.js +14 -14
  173. package/dist/engine/boot-validator/boot-check.js +1 -1
  174. package/dist/engine/boot-validator/config-deps.js +7 -6
  175. package/dist/engine/boot-validator/detail-screens.js +4 -4
  176. package/dist/engine/boot-validator/entity-handler.d.ts +1 -0
  177. package/dist/engine/boot-validator/entity-handler.js +77 -61
  178. package/dist/engine/boot-validator/form-derivations.js +35 -1
  179. package/dist/engine/boot-validator/gdpr-storage.js +4 -4
  180. package/dist/engine/boot-validator/i18n-keys.js +6 -4
  181. package/dist/engine/boot-validator/index.d.ts +2 -2
  182. package/dist/engine/boot-validator/index.js +22 -20
  183. package/dist/engine/boot-validator/nav.js +5 -5
  184. package/dist/engine/boot-validator/ownership.js +12 -9
  185. package/dist/engine/boot-validator/parent-ref.js +1 -1
  186. package/dist/engine/boot-validator/pii-retention.js +258 -187
  187. package/dist/engine/boot-validator/projection-list-screens.js +7 -7
  188. package/dist/engine/boot-validator/query-refs.js +1 -1
  189. package/dist/engine/boot-validator/screens-actions.d.ts +1 -0
  190. package/dist/engine/boot-validator/screens-actions.js +23 -17
  191. package/dist/engine/boot-validator/screens-dashboard.js +2 -5
  192. package/dist/engine/boot-validator/screens-forms.js +12 -17
  193. package/dist/engine/boot-validator/screens-kind-config-edit.d.ts +3 -0
  194. package/dist/engine/boot-validator/screens-kind-config-edit.js +88 -0
  195. package/dist/engine/boot-validator/screens-kind-entity-edit.d.ts +3 -0
  196. package/dist/engine/boot-validator/screens-kind-entity-edit.js +55 -0
  197. package/dist/engine/boot-validator/screens-kind-entity-list.d.ts +3 -0
  198. package/dist/engine/boot-validator/screens-kind-entity-list.js +228 -0
  199. package/dist/engine/boot-validator/screens-kind-projection-detail.d.ts +3 -0
  200. package/dist/engine/boot-validator/screens-kind-projection-detail.js +235 -0
  201. package/dist/engine/boot-validator/screens-kind-projection-list.d.ts +3 -0
  202. package/dist/engine/boot-validator/screens-kind-projection-list.js +52 -0
  203. package/dist/engine/boot-validator/screens-kind-secret-mint.d.ts +3 -0
  204. package/dist/engine/boot-validator/screens-kind-secret-mint.js +28 -0
  205. package/dist/engine/boot-validator/screens-kind-shared.d.ts +37 -0
  206. package/dist/engine/boot-validator/screens-kind-shared.js +142 -0
  207. package/dist/engine/boot-validator/screens-lists.d.ts +2 -1
  208. package/dist/engine/boot-validator/screens-lists.js +26 -24
  209. package/dist/engine/boot-validator/screens.d.ts +0 -2
  210. package/dist/engine/boot-validator/screens.js +102 -869
  211. package/dist/engine/boot-validator/security-baseline.js +3 -2
  212. package/dist/engine/boot-validator/transfer-graph.js +2 -2
  213. package/dist/engine/boot-validator/workspaces.js +3 -3
  214. package/dist/engine/bridge-stub.js +3 -4
  215. package/dist/engine/build-app-schema.js +130 -170
  216. package/dist/engine/build-config-feature-schema.js +50 -50
  217. package/dist/engine/build-target.js +20 -23
  218. package/dist/engine/codemod/pipeline-codemod.js +20 -13
  219. package/dist/engine/config-helpers.js +4 -4
  220. package/dist/engine/constants.js +2 -2
  221. package/dist/engine/create-app.js +2 -2
  222. package/dist/engine/define-feature.js +21 -13
  223. package/dist/engine/define-handler.js +13 -11
  224. package/dist/engine/define-step.js +1 -1
  225. package/dist/engine/define-workflow.d.ts +5 -5
  226. package/dist/engine/define-workflow.js +6 -6
  227. package/dist/engine/entity-handlers.d.ts +13 -0
  228. package/dist/engine/entity-handlers.js +22 -34
  229. package/dist/engine/entity-list-runtime-options.d.ts +8 -0
  230. package/dist/engine/entity-list-runtime-options.js +18 -0
  231. package/dist/engine/event-def.js +2 -2
  232. package/dist/engine/extension-names.d.ts +16 -17
  233. package/dist/engine/extension-names.js +37 -38
  234. package/dist/engine/extensions/escape-hatch-usage.js +1 -1
  235. package/dist/engine/extensions/tenant-data.js +2 -2
  236. package/dist/engine/extensions/user-data.d.ts +23 -24
  237. package/dist/engine/factories.d.ts +14 -13
  238. package/dist/engine/factories.js +38 -37
  239. package/dist/engine/feature-ast/entity-field-types.js +1 -1
  240. package/dist/engine/feature-ast/extractors/handlers.js +2 -1
  241. package/dist/engine/feature-ast/extractors/hooks.js +1 -1
  242. package/dist/engine/feature-ast/extractors/round2.js +25 -6
  243. package/dist/engine/feature-ast/extractors/shared.d.ts +2 -3
  244. package/dist/engine/feature-ast/extractors/shared.js +2 -3
  245. package/dist/engine/feature-ast/parse.js +13 -13
  246. package/dist/engine/feature-ast/patch.js +4 -182
  247. package/dist/engine/feature-ast/pattern-change-schema.d.ts +3 -0
  248. package/dist/engine/feature-ast/pattern-change-schema.js +2 -1
  249. package/dist/engine/feature-ast/pattern-id-matchers.d.ts +7 -0
  250. package/dist/engine/feature-ast/pattern-id-matchers.js +210 -0
  251. package/dist/engine/feature-ast/patterns.d.ts +11 -2
  252. package/dist/engine/feature-ast/patterns.js +43 -51
  253. package/dist/engine/feature-ast/render.js +50 -89
  254. package/dist/engine/feature-config-events-jobs.js +15 -12
  255. package/dist/engine/feature-entity-handlers.js +12 -5
  256. package/dist/engine/feature-manifest.d.ts +9 -9
  257. package/dist/engine/feature-manifest.js +6 -7
  258. package/dist/engine/feature-ui-extensions.d.ts +3 -3
  259. package/dist/engine/feature-ui-extensions.js +30 -22
  260. package/dist/engine/field-access.js +5 -6
  261. package/dist/engine/form-derivations.js +18 -7
  262. package/dist/engine/handler-field-references.js +1 -1
  263. package/dist/engine/index.d.ts +1 -0
  264. package/dist/engine/index.js +4 -4
  265. package/dist/engine/object-form.d.ts +1 -0
  266. package/dist/engine/object-form.js +14 -4
  267. package/dist/engine/ownership.js +3 -3
  268. package/dist/engine/parse-ref-target.js +5 -7
  269. package/dist/engine/pattern-library/index.js +2 -2
  270. package/dist/engine/pattern-library/library.js +2 -2
  271. package/dist/engine/pattern-library/types.js +3 -3
  272. package/dist/engine/pipeline.js +2 -2
  273. package/dist/engine/project-app-schema-for-roles.d.ts +2 -0
  274. package/dist/engine/project-app-schema-for-roles.js +7 -5
  275. package/dist/engine/projection-helpers.js +9 -9
  276. package/dist/engine/qualified-name.js +2 -2
  277. package/dist/engine/registry-facade.js +1 -1
  278. package/dist/engine/registry-ingest.js +13 -13
  279. package/dist/engine/registry-state.js +17 -19
  280. package/dist/engine/registry-validate.js +12 -12
  281. package/dist/engine/run-in.js +2 -2
  282. package/dist/engine/run-pipeline.js +7 -0
  283. package/dist/engine/schema-builder.js +251 -233
  284. package/dist/engine/screen-filter-ops.js +17 -20
  285. package/dist/engine/screen-helpers.js +4 -3
  286. package/dist/engine/screen-kind.d.ts +7 -0
  287. package/dist/engine/screen-kind.js +1 -0
  288. package/dist/engine/state-machine.d.ts +12 -12
  289. package/dist/engine/state-machine.js +7 -7
  290. package/dist/engine/steps/_resolver-utils.js +4 -3
  291. package/dist/engine/steps/for-each.js +4 -4
  292. package/dist/engine/steps/unsafe-projection-delete.js +1 -1
  293. package/dist/engine/steps/unsafe-projection-upsert.js +4 -4
  294. package/dist/engine/steps/wait-for-event.js +4 -4
  295. package/dist/engine/steps/workflow-system-events.js +3 -3
  296. package/dist/engine/strip-disabled-features-from-app-schema.js +51 -14
  297. package/dist/engine/tier-resolver-extension.d.ts +29 -27
  298. package/dist/engine/tier-resolver-extension.js +26 -26
  299. package/dist/engine/transfer-adjacency.js +2 -2
  300. package/dist/engine/validate-projection-allowlist.js +9 -28
  301. package/dist/engine/walk-step-instances.d.ts +2 -0
  302. package/dist/engine/walk-step-instances.js +38 -0
  303. package/dist/engine/where-rule-lint.js +1 -1
  304. package/dist/engine/write-handler-qn-extract.js +1 -1
  305. package/dist/entrypoint/index.d.ts +4 -1
  306. package/dist/entrypoint/index.js +10 -4
  307. package/dist/env/index.d.ts +7 -6
  308. package/dist/env/index.js +10 -9
  309. package/dist/errors/docs-url.d.ts +1 -1
  310. package/dist/errors/docs-url.js +22 -2
  311. package/dist/errors/transition-details.js +7 -7
  312. package/dist/errors/write-error-info.d.ts +6 -6
  313. package/dist/errors/write-error-info.js +6 -6
  314. package/dist/es-ops/context.d.ts +9 -9
  315. package/dist/es-ops/context.js +29 -29
  316. package/dist/es-ops/index.js +7 -9
  317. package/dist/es-ops/operations-schema.js +4 -10
  318. package/dist/es-ops/runner.d.ts +11 -11
  319. package/dist/es-ops/runner.js +49 -53
  320. package/dist/es-ops/types.d.ts +55 -55
  321. package/dist/es-ops/types.js +11 -11
  322. package/dist/event-store/admin-api.js +7 -8
  323. package/dist/event-store/errors.js +1 -1
  324. package/dist/event-store/event-store.js +12 -6
  325. package/dist/event-store/rebuild-dead-letter.js +1 -1
  326. package/dist/files/bind-pending-file-refs.js +3 -3
  327. package/dist/files/create-file-ref-from-bytes.js +4 -1
  328. package/dist/files/feature.js +9 -10
  329. package/dist/files/file-handle.js +7 -9
  330. package/dist/files/file-ref-entity.js +15 -15
  331. package/dist/files/file-ref-table.js +7 -8
  332. package/dist/files/file-routes.d.ts +7 -0
  333. package/dist/files/file-routes.js +22 -13
  334. package/dist/files/in-memory-provider.js +8 -9
  335. package/dist/files/local-provider.js +18 -25
  336. package/dist/files/provider-resolver.d.ts +7 -7
  337. package/dist/files/resolve-content-type.js +43 -0
  338. package/dist/files/storage-tracking.js +2 -2
  339. package/dist/files/upload-ledger.js +7 -0
  340. package/dist/files/zip-stream.d.ts +12 -19
  341. package/dist/files/zip-stream.js +44 -63
  342. package/dist/i18n/required-surface-keys.d.ts +1 -1
  343. package/dist/i18n/required-surface-keys.js +188 -212
  344. package/dist/internal/stack-support.d.ts +2 -1
  345. package/dist/internal/stack-support.js +1 -1
  346. package/dist/jobs/job-runner-context.d.ts +32 -0
  347. package/dist/jobs/job-runner-context.js +305 -0
  348. package/dist/jobs/job-runner-execution.d.ts +7 -0
  349. package/dist/jobs/job-runner-execution.js +160 -0
  350. package/dist/jobs/job-runner-gates.d.ts +19 -0
  351. package/dist/jobs/job-runner-gates.js +198 -0
  352. package/dist/jobs/job-runner-helpers.d.ts +17 -3
  353. package/dist/jobs/job-runner-helpers.js +69 -4
  354. package/dist/jobs/job-runner-schedulers.d.ts +1 -1
  355. package/dist/jobs/job-runner-schedulers.js +3 -4
  356. package/dist/jobs/job-runner-scope.d.ts +44 -0
  357. package/dist/jobs/job-runner-scope.js +102 -0
  358. package/dist/jobs/job-runner-types.d.ts +12 -0
  359. package/dist/jobs/job-runner.d.ts +0 -1
  360. package/dist/jobs/job-runner.js +57 -669
  361. package/dist/lifecycle/lifecycle.js +3 -5
  362. package/dist/lifecycle/signal-handlers.js +5 -4
  363. package/dist/logging/utils.d.ts +2 -1
  364. package/dist/logging/utils.js +38 -10
  365. package/dist/migrations/index.js +1 -1
  366. package/dist/migrations/kumiko-drift.js +14 -13
  367. package/dist/migrations/pending-rebuilds.d.ts +21 -20
  368. package/dist/migrations/pending-rebuilds.js +27 -27
  369. package/dist/migrations/projection-table-index.d.ts +3 -3
  370. package/dist/migrations/projection-table-index.js +8 -8
  371. package/dist/observability/escape-hatch-report.d.ts +3 -0
  372. package/dist/observability/escape-hatch-report.js +12 -1
  373. package/dist/observability/metric-validator.js +1 -1
  374. package/dist/observability/metrics-handle.js +3 -3
  375. package/dist/pipeline/append-event-core.js +11 -2
  376. package/dist/pipeline/cascade-handler.d.ts +1 -1
  377. package/dist/pipeline/cascade-handler.js +165 -138
  378. package/dist/pipeline/dispatch-batch.js +2 -2
  379. package/dist/pipeline/dispatch-query.js +20 -13
  380. package/dist/pipeline/dispatch-shared.d.ts +14 -3
  381. package/dist/pipeline/dispatch-shared.js +67 -721
  382. package/dist/pipeline/dispatch-stream.js +1 -1
  383. package/dist/pipeline/dispatch-write.js +297 -190
  384. package/dist/pipeline/dispatcher-utils.d.ts +1 -1
  385. package/dist/pipeline/dispatcher-utils.js +1 -1
  386. package/dist/pipeline/event-consumer-state.js +2 -2
  387. package/dist/pipeline/event-dispatcher-admin.js +2 -1
  388. package/dist/pipeline/event-dispatcher-delivery.js +4 -6
  389. package/dist/pipeline/event-dispatcher.js +17 -28
  390. package/dist/pipeline/handler-context-auth.d.ts +9 -0
  391. package/dist/pipeline/handler-context-auth.js +54 -0
  392. package/dist/pipeline/handler-context-config.d.ts +14 -0
  393. package/dist/pipeline/handler-context-config.js +113 -0
  394. package/dist/pipeline/handler-context-db.d.ts +24 -0
  395. package/dist/pipeline/handler-context-db.js +149 -0
  396. package/dist/pipeline/handler-context-dispatch.d.ts +21 -0
  397. package/dist/pipeline/handler-context-dispatch.js +89 -0
  398. package/dist/pipeline/handler-context-events.d.ts +43 -0
  399. package/dist/pipeline/handler-context-events.js +237 -0
  400. package/dist/pipeline/handler-context-notify.d.ts +12 -0
  401. package/dist/pipeline/handler-context-notify.js +55 -0
  402. package/dist/pipeline/handler-context-observability.d.ts +7 -0
  403. package/dist/pipeline/handler-context-observability.js +21 -0
  404. package/dist/pipeline/handler-context-scope.d.ts +48 -0
  405. package/dist/pipeline/handler-context-scope.js +88 -0
  406. package/dist/pipeline/irreversible-operation-gate.js +1 -1
  407. package/dist/pipeline/lifecycle-pipeline.js +9 -9
  408. package/dist/pipeline/member-read-only-transaction.js +1 -3
  409. package/dist/pipeline/msp-rebuild.js +1 -1
  410. package/dist/pipeline/notify-scope.js +12 -1
  411. package/dist/pipeline/pre-handler-gates.js +20 -4
  412. package/dist/pipeline/pre-transaction-reservations.d.ts +1 -0
  413. package/dist/pipeline/pre-transaction-reservations.js +9 -3
  414. package/dist/pipeline/projection-rebuild.js +15 -13
  415. package/dist/pipeline/system-hooks.js +39 -41
  416. package/dist/pipeline/system-identity-switch.js +1 -3
  417. package/dist/pipeline/tenant-timezone-cache.js +1 -1
  418. package/dist/random/generate.d.ts +29 -29
  419. package/dist/random/generate.js +30 -30
  420. package/dist/random/words.js +20 -20
  421. package/dist/rate-limit/middleware.js +9 -5
  422. package/dist/redis/client.js +2 -2
  423. package/dist/redis/pubsub-signal.js +14 -17
  424. package/dist/schema-cli/apply-command.d.ts +2 -0
  425. package/dist/schema-cli/apply-command.js +97 -0
  426. package/dist/schema-cli/baseline-command.d.ts +2 -0
  427. package/dist/schema-cli/baseline-command.js +33 -0
  428. package/dist/schema-cli/generate-command.d.ts +2 -0
  429. package/dist/schema-cli/generate-command.js +90 -0
  430. package/dist/schema-cli/shared.d.ts +39 -0
  431. package/dist/schema-cli/shared.js +95 -0
  432. package/dist/schema-cli/status-command.d.ts +2 -0
  433. package/dist/schema-cli/status-command.js +73 -0
  434. package/dist/schema-cli/validate-boot-input.d.ts +5 -0
  435. package/dist/schema-cli/validate-boot-input.js +130 -0
  436. package/dist/schema-cli/validate-command.d.ts +2 -0
  437. package/dist/schema-cli/validate-command.js +130 -0
  438. package/dist/schema-cli.d.ts +2 -18
  439. package/dist/schema-cli.js +47 -510
  440. package/dist/search/index.js +4 -4
  441. package/dist/search/meilisearch-adapter.js +2 -1
  442. package/dist/search/purge-subject.js +4 -5
  443. package/dist/search/reindex-entity.js +6 -9
  444. package/dist/time/boot-tz-warning.d.ts +2 -2
  445. package/dist/time/boot-tz-warning.js +8 -8
  446. package/dist/time/iana.js +10 -10
  447. package/dist/time/index.js +9 -9
  448. package/dist/time/legacy-date.d.ts +2 -2
  449. package/dist/time/legacy-date.js +6 -8
  450. package/dist/time/polyfill.js +1 -1
  451. package/dist/time/tz-context.d.ts +1 -1
  452. package/dist/time/tz-context.js +1 -1
  453. package/dist/ui-types/app-schema.js +7 -7
  454. package/dist/ui-types/list-row-meta.js +4 -4
  455. package/dist/upgrade-cli.js +159 -130
  456. package/dist/utils/compare.js +1 -1
  457. package/package.json +5 -5
  458. package/src/changes.json +358 -0
  459. package/src/scripts/codemod/crypto-shredding-testing-move.ts +2 -2
  460. package/src/scripts/codemod/feature-layout.ts +10 -2
  461. package/src/scripts/codemod/migrate-cross-tenant.ts +1 -1
  462. package/src/scripts/codemod/migrate-open-to-all.ts +1 -1
  463. package/src/scripts/codemod/object-form.ts +41 -4
  464. package/src/scripts/codemod/package-merge.ts +58 -8
  465. package/src/scripts/codemod/pii-personal-migration.ts +192 -153
  466. package/src/scripts/codemod/testing-injection.ts +122 -42
  467. package/src/scripts/codemod/testing-move.ts +29 -7
  468. package/src/scripts/codemod/unprocessable-error-details-reason.ts +2 -2
@@ -1,6 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, statSync, writeFileSync, } from "node:fs";
3
3
  import { dirname, isAbsolute, join, relative, resolve } from "node:path";
4
+ import { propertyOf } from "@cosmicdrift/kumiko-types/type-guards";
4
5
  import { getFlag, getStringFlag, parseArgs } from "./arg-parser.js";
5
6
  import { compareVersions, filterEntriesAfter, parseFeatureChangelog, sortEntries, } from "./engine/index.js";
6
7
  import { ensureTemporalPolyfill } from "./time/index.js";
@@ -96,7 +97,7 @@ export function findFeatureChangelogFiles(featuresDir) {
96
97
  // Layout is detected per-package, not guessed from a naming convention:
97
98
  // enterprise packages keep changes.json under src/, framework's
98
99
  // bundled-features keep it flat. A name-prefix heuristic (e.g. "ai-*")
99
- // silently drops packages that don't match it (fw#1605).
100
+ // silently drops packages that don't match it.
100
101
  const srcLayout = join(featuresDir, name, "src", "changes.json");
101
102
  const flatLayout = join(featuresDir, name, "changes.json");
102
103
  const changelogPath = existsSync(srcLayout) ? srcLayout : flatLayout;
@@ -167,7 +168,7 @@ export function findFeaturesDirs(cwd) {
167
168
  // Enterprise repo: packages/<name>/src/changes.json or packages/<name>/changes.json.
168
169
  // Detected by presence of changes.json, not a package-name prefix — a
169
170
  // prefix heuristic silently stops matching once packages are renamed or a
170
- // differently-named package is added (fw#1605). Skipped inside the
171
+ // differently-named package is added. Skipped inside the
171
172
  // framework repo itself (packages/framework present): every package's own
172
173
  // changes.json is already collected via findPackageChangelogFiles, and
173
174
  // would otherwise get double-counted as one here.
@@ -202,7 +203,7 @@ export function findFeaturesDirs(cwd) {
202
203
  // Consumer-facing codemod scripts ship inside the published
203
204
  // @cosmicdrift/kumiko-framework package (src/scripts/codemod), not at the
204
205
  // git repo root — only the installed package path exists in a consumer's
205
- // node_modules after a plain npm/bun install (fw#2301).
206
+ // node_modules after a plain npm/bun install.
206
207
  export function findCodemodScriptsRoot(repoRoot) {
207
208
  const local = join(repoRoot, "packages/framework/src");
208
209
  if (existsSync(join(local, CODEMOD_SUBDIR))) {
@@ -213,7 +214,7 @@ export function findCodemodScriptsRoot(repoRoot) {
213
214
  if (existsSync(pkgPath)) {
214
215
  try {
215
216
  const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
216
- if (pkg.name === "@cosmicdrift/kumiko-framework")
217
+ if (propertyOf(pkg, "name") === "@cosmicdrift/kumiko-framework")
217
218
  return local;
218
219
  // wrong name → fall through
219
220
  }
@@ -242,7 +243,7 @@ export function findCodemodScriptsRoot(repoRoot) {
242
243
  // absolute paths, symlinks pointing outward) or that isn't a real .ts file.
243
244
  // First arg is the consumer repo root (same as findCodemodScriptsRoot) —
244
245
  // not the scripts root — so out-of-tree callers keep compiling against the
245
- // public upgrade-cli subpath without silently resolving to null (fw#2341).
246
+ // public upgrade-cli subpath without silently resolving to null.
246
247
  function resolveCodemodScriptAt(codemodScriptsRoot, codemodField) {
247
248
  if (!codemodField)
248
249
  return null;
@@ -417,7 +418,7 @@ function parseStoredMarker(raw) {
417
418
  resolvedManual: dedupeManualById(resolvedManual),
418
419
  };
419
420
  }
420
- // A missing marker is a bootstrap app that never ran `--apply` (fw#2299); an
421
+ // A missing marker is a bootstrap app that never ran `--apply`; an
421
422
  // existing but unreadable one must not silently fall back to the installed
422
423
  // version, or a bare `--apply` would skip every codemod in between.
423
424
  function readMarker(targetDir) {
@@ -512,7 +513,7 @@ function writePartialMarker(out, targetDir, pending, manualEntries, failedVersio
512
513
  // failure; codemods that already ran are kept in a partial marker. Writes the
513
514
  // marker whenever dryRun is false —
514
515
  // even with zero pending entries, so an already-current app still gets a
515
- // bootstrap marker recording its installed version (fw#2299).
516
+ // bootstrap marker recording its installed version.
516
517
  // kumiko-lint-ignore complexity-budget sequential codemod runner with zero-pending bootstrap marker
517
518
  async function applyCodemods(out, pending, repoRoot, targetDir, dryRun,
518
519
  // Installed version for the zero-pending bootstrap marker — never a
@@ -658,27 +659,27 @@ function matchManualRefs(open, refs) {
658
659
  }
659
660
  return { resolvedIds, errors };
660
661
  }
662
+ function failUpgrade(out, ...lines) {
663
+ out.err("");
664
+ for (const line of lines)
665
+ out.err(` ${line}`);
666
+ out.err("");
667
+ return 1;
668
+ }
661
669
  function resolveManualMigrations(out, args, targetDir) {
662
- const fail = (...lines) => {
663
- out.err("");
664
- for (const line of lines)
665
- out.err(` ${line}`);
666
- out.err("");
667
- return 1;
668
- };
669
670
  const input = parseResolveInput(args);
670
671
  if ("error" in input)
671
- return fail(input.error);
672
+ return failUpgrade(out, input.error);
672
673
  const read = readMarker(targetDir);
673
674
  if (read.kind === "missing") {
674
- return fail(`No .kumiko/upgrade-state.json under ${targetDir}, nothing to resolve.`);
675
+ return failUpgrade(out, `No .kumiko/upgrade-state.json under ${targetDir}, nothing to resolve.`);
675
676
  }
676
677
  if (read.kind === "invalid")
677
- return fail("invalid .kumiko/upgrade-state.json, fix it first.");
678
+ return failUpgrade(out, "invalid .kumiko/upgrade-state.json, fix it first.");
678
679
  const open = read.marker.pendingManual;
679
680
  const { resolvedIds, errors } = matchManualRefs(open, input.refs);
680
681
  if (errors.length > 0)
681
- return fail(...errors, "Nothing was written.");
682
+ return failUpgrade(out, ...errors, "Nothing was written.");
682
683
  const { reason } = input;
683
684
  const resolution = getFlag(args, "not-applicable")
684
685
  ? "not-applicable"
@@ -720,39 +721,14 @@ kumiko-upgrade --resolve <id|version>[,<id|version>...] --reason "<text>" [--not
720
721
  --not-applicable with --resolve, record the entries as not applicable instead of migrated
721
722
  --dry-run with --apply, report what would run without writing anything
722
723
  --help, -h print this usage and exit`;
723
- // kumiko-lint-ignore complexity-budget CLI orchestration moved from bin/commands/upgrade.ts — same branching surface, shared by kumiko upgrade + published kumiko-upgrade bin
724
- export async function runUpgradeCli(argv, cwd, out, options) {
725
- if (argv.includes("--help") || argv.includes("-h")) {
726
- out.log(UPGRADE_USAGE);
727
- return 0;
728
- }
729
- // Standalone CLI entry, not booted via runProdApp/runDevApp — Temporal needs an explicit polyfill here.
730
- await ensureTemporalPolyfill();
731
- const repoRoot = options?.repoRoot ?? cwd;
732
- const args = parseArgs(argv);
733
- const jsonMode = getFlag(args, "json");
734
- const verbose = getFlag(args, "verbose");
735
- const fromFlag = getStringFlag(args, "from");
736
- // Resolved once here (not just inside --apply) so both the filter
737
- // baseline below and the --apply codemod run target the same directory.
738
- const dirFlag = getStringFlag(args, "dir");
739
- const targetDir = dirFlag ? resolve(dirFlag) : cwd;
740
- if (!existsSync(targetDir) || !statSync(targetDir).isDirectory()) {
741
- out.err("");
742
- out.err(` --dir path is not a directory: ${targetDir}`);
743
- out.err("");
744
- return 1;
745
- }
746
- if (args.flags.has("resolve")) {
747
- return resolveManualMigrations(out, args, targetDir);
748
- }
724
+ function resolveUpgradeBaseline(cwd, targetDir, fromFlag) {
749
725
  // Always resolve the actually installed version, even when --from is set,
750
726
  // so --json can report both the filter baseline and what's really there.
751
727
  const installedVersion = readCurrentVersion(cwd);
752
728
  // Filter baseline: explicit --from wins, otherwise the marker recorded
753
729
  // under targetDir (what was last actually applied there), falling back to
754
- // the installed version only when no marker exists yet (bootstrap,
755
- // fw#2299). Baselining on installedVersion here would silently treat every
730
+ // the installed version only when no marker exists yet (bootstrap).
731
+ // Baselining on installedVersion here would silently treat every
756
732
  // changelog entry up to the installed version as already handled, even
757
733
  // when the marker says otherwise — a bare `--apply` would then always
758
734
  // report "Nothing new" and bootstrap the marker onto the installed
@@ -760,33 +736,40 @@ export async function runUpgradeCli(argv, cwd, out, options) {
760
736
  const markerRead = readMarker(targetDir);
761
737
  const marker = fromFlag === undefined ? markerRead : { kind: "missing" };
762
738
  if (marker.kind === "invalid") {
763
- out.err("");
764
- out.err(" invalid .kumiko/upgrade-state.json, fix it or pass --from <version>");
765
- out.err("");
766
- return 1;
739
+ return {
740
+ kind: "error",
741
+ lines: ["invalid .kumiko/upgrade-state.json, fix it or pass --from <version>"],
742
+ };
767
743
  }
768
744
  const currentVersion = fromFlag ?? (marker.kind === "ok" ? marker.version : undefined) ?? installedVersion;
769
745
  if (!currentVersion) {
770
- out.err("");
771
- out.err(" Could not detect Kumiko version.");
772
- out.err(" Run from an app directory with node_modules, or use --from <version>.");
773
- out.err("");
774
- return 1;
746
+ return {
747
+ kind: "error",
748
+ lines: [
749
+ "Could not detect Kumiko version.",
750
+ "Run from an app directory with node_modules, or use --from <version>.",
751
+ ],
752
+ };
775
753
  }
776
754
  if (!SEMVER_RE.test(currentVersion)) {
777
- out.err("");
778
- out.err(` Invalid version format: "${currentVersion}" — expected x.y.z`);
779
- out.err("");
780
- return 1;
755
+ return {
756
+ kind: "error",
757
+ lines: [`Invalid version format: "${currentVersion}" — expected x.y.z`],
758
+ };
781
759
  }
760
+ return { kind: "ok", value: { currentVersion, installedVersion, markerRead } };
761
+ }
762
+ function collectAllChangelogEntries(cwd) {
782
763
  const featuresDirs = findFeaturesDirs(cwd);
783
764
  const packageChangelogFiles = findPackageChangelogFiles(cwd);
784
765
  if (featuresDirs.length === 0 && packageChangelogFiles.length === 0) {
785
- out.err("");
786
- out.err(" Could not find bundled-features directory.");
787
- out.err(" Run from framework/enterprise repo or an app with node_modules.");
788
- out.err("");
789
- return 1;
766
+ return {
767
+ kind: "error",
768
+ lines: [
769
+ "Could not find bundled-features directory.",
770
+ "Run from framework/enterprise repo or an app with node_modules.",
771
+ ],
772
+ };
790
773
  }
791
774
  const allEntries = [];
792
775
  for (const dir of featuresDirs) {
@@ -795,6 +778,18 @@ export async function runUpgradeCli(argv, cwd, out, options) {
795
778
  for (const changelogFile of packageChangelogFiles) {
796
779
  allEntries.push(...readChangelogFile(changelogFile));
797
780
  }
781
+ return { kind: "ok", value: allEntries };
782
+ }
783
+ function planUpgrade(args, cwd, targetDir) {
784
+ const dirFlag = getStringFlag(args, "dir");
785
+ const baseline = resolveUpgradeBaseline(cwd, targetDir, getStringFlag(args, "from"));
786
+ if (baseline.kind === "error")
787
+ return baseline;
788
+ const entries = collectAllChangelogEntries(cwd);
789
+ if (entries.kind === "error")
790
+ return entries;
791
+ const { currentVersion, installedVersion } = baseline.value;
792
+ const allEntries = entries.value;
798
793
  // Installed version of the target the marker belongs to (cwd unless --dir).
799
794
  const targetInstalledVersion = dirFlag ? readCurrentVersion(targetDir) : installedVersion;
800
795
  // Changelogs can be found in a parent workspace's newer install. A change
@@ -803,87 +798,121 @@ export async function runUpgradeCli(argv, cwd, out, options) {
803
798
  ? allEntries
804
799
  : allEntries.filter((entry) => compareVersions(entry.version, targetInstalledVersion) <= 0);
805
800
  const pending = sortEntries(filterEntriesAfter(installedEntries, currentVersion));
806
- if (getFlag(args, "apply")) {
807
- // Marker must reflect what is actually installed under the target (or
808
- // cwd), not the filter baseline above — otherwise CI stays green forever.
809
- const markerVersion = targetInstalledVersion;
810
- const dryRun = getFlag(args, "dry-run");
811
- if (markerVersion === null && !dryRun) {
812
- out.err("");
813
- out.err(` Could not detect the installed Kumiko version under ${targetDir}.`);
814
- out.err(" Refusing to write an upgrade marker without it (--from is only a filter).");
815
- out.err("");
816
- return 1;
801
+ return {
802
+ kind: "ok",
803
+ value: { ...baseline.value, targetInstalledVersion, allEntries, pending },
804
+ };
805
+ }
806
+ async function applyPlannedUpgrade(out, args, plan, repoRoot, targetDir) {
807
+ // Marker must reflect what is actually installed under the target (or
808
+ // cwd), not the filter baseline above — otherwise CI stays green forever.
809
+ const markerVersion = plan.targetInstalledVersion;
810
+ const dryRun = getFlag(args, "dry-run");
811
+ if (markerVersion === null && !dryRun) {
812
+ return failUpgrade(out, `Could not detect the installed Kumiko version under ${targetDir}.`, "Refusing to write an upgrade marker without it (--from is only a filter).");
813
+ }
814
+ out.log("");
815
+ const code = await applyCodemods(out, plan.pending, repoRoot, targetDir, dryRun, markerVersion ?? plan.currentVersion, carryOf(plan.markerRead), plan.currentVersion, getFlag(args, "verbose") ? manualDetailsOf(plan.allEntries) : undefined);
816
+ out.log("");
817
+ return code;
818
+ }
819
+ function reportUpgradeJson(out, plan) {
820
+ const { currentVersion, installedVersion } = plan;
821
+ const { pendingManual } = carryOf(plan.markerRead);
822
+ const pendingWithManualId = plan.pending.map((entry) => {
823
+ const manualId = manualIdOf(entry);
824
+ return manualId === undefined ? entry : { ...entry, manualId };
825
+ });
826
+ out.log(JSON.stringify({ currentVersion, installedVersion, pending: pendingWithManualId, pendingManual }, null, 2));
827
+ return 0;
828
+ }
829
+ function logEntryDetail(out, entry, verbose) {
830
+ if (verbose && entry.detail) {
831
+ out.log(` ${entry.detail}`);
832
+ }
833
+ }
834
+ function logBreakingSection(out, breaking, verbose) {
835
+ // skip: no breaking entries, the section is omitted
836
+ if (breaking.length === 0)
837
+ return;
838
+ out.log(` ⚠ BREAKING (${breaking.length})`);
839
+ out.log("");
840
+ for (const e of breaking) {
841
+ const manualId = manualIdOf(e);
842
+ out.log(` ${e.version} · ${e.title}${manualId === undefined ? "" : ` [${manualId}]`}`);
843
+ logEntryDetail(out, e, verbose);
844
+ if (e.migration) {
845
+ out.log(` → Migration: ${e.migration}`);
817
846
  }
818
847
  out.log("");
819
- const code = await applyCodemods(out, pending, repoRoot, targetDir, dryRun, markerVersion ?? currentVersion, carryOf(markerRead), currentVersion, verbose ? manualDetailsOf(allEntries) : undefined);
820
- out.log("");
821
- return code;
822
- }
823
- if (jsonMode) {
824
- const { pendingManual } = carryOf(markerRead);
825
- const pendingWithManualId = pending.map((entry) => {
826
- const manualId = manualIdOf(entry);
827
- return manualId === undefined ? entry : { ...entry, manualId };
828
- });
829
- out.log(JSON.stringify({ currentVersion, installedVersion, pending: pendingWithManualId, pendingManual }, null, 2));
830
- return 0;
831
848
  }
849
+ }
850
+ function logNonBreakingSection(out, heading, entries, verbose, showCodemod) {
851
+ // skip: no entries of this type, the section is omitted
852
+ if (entries.length === 0)
853
+ return;
854
+ out.log(` ✓ ${heading} (${entries.length})`);
855
+ out.log("");
856
+ for (const e of entries) {
857
+ out.log(` ${e.version} · ${e.title}`);
858
+ logEntryDetail(out, e, verbose);
859
+ if (showCodemod && hasCodemod(e)) {
860
+ out.log(` → codemod: ${e.codemod} (runs on --apply)`);
861
+ }
862
+ }
863
+ out.log("");
864
+ }
865
+ function reportUpgradeText(out, plan, verbose) {
866
+ const { pending } = plan;
832
867
  const breaking = pending.filter((e) => e.type === "breaking");
833
- const improvements = pending.filter((e) => e.type === "improvement");
834
- const fixes = pending.filter((e) => e.type === "fix");
835
- const openManual = carryOf(markerRead).pendingManual;
868
+ const openManual = carryOf(plan.markerRead).pendingManual;
869
+ const manualDetails = verbose ? manualDetailsOf(plan.allEntries) : undefined;
836
870
  out.log("");
837
- out.log(` Upgrade: ${currentVersion} → latest`);
871
+ out.log(` Upgrade: ${plan.currentVersion} → latest`);
838
872
  out.log("");
839
873
  if (pending.length === 0) {
840
874
  out.log(" ✓ Nothing new since your version.");
841
875
  out.log("");
842
- logOpenManual(out, openManual, verbose ? manualDetailsOf(allEntries) : undefined);
876
+ logOpenManual(out, openManual, manualDetails);
843
877
  return 0;
844
878
  }
845
- if (breaking.length > 0) {
846
- out.log(` ⚠ BREAKING (${breaking.length})`);
847
- out.log("");
848
- for (const e of breaking) {
849
- const manualId = manualIdOf(e);
850
- out.log(` ${e.version} · ${e.title}${manualId === undefined ? "" : ` [${manualId}]`}`);
851
- if (verbose && e.detail) {
852
- out.log(` ${e.detail}`);
853
- }
854
- if (e.migration) {
855
- out.log(` → Migration: ${e.migration}`);
856
- }
857
- out.log("");
858
- }
859
- }
860
- if (improvements.length > 0) {
861
- out.log(` ✓ IMPROVEMENTS (${improvements.length})`);
862
- out.log("");
863
- for (const e of improvements) {
864
- out.log(` ${e.version} · ${e.title}`);
865
- if (verbose && e.detail) {
866
- out.log(` ${e.detail}`);
867
- }
868
- }
869
- out.log("");
870
- }
871
- if (fixes.length > 0) {
872
- out.log(` ✓ FIXES (${fixes.length})`);
873
- out.log("");
874
- for (const e of fixes) {
875
- out.log(` ${e.version} · ${e.title}`);
876
- if (verbose && e.detail) {
877
- out.log(` ${e.detail}`);
878
- }
879
- }
880
- out.log("");
881
- }
879
+ logBreakingSection(out, breaking, verbose);
880
+ logNonBreakingSection(out, "IMPROVEMENTS", pending.filter((e) => e.type === "improvement"), verbose, true);
881
+ logNonBreakingSection(out, "FIXES", pending.filter((e) => e.type === "fix"), verbose, false);
882
882
  if (breaking.length > 0) {
883
883
  out.log(" ⚠ Review breaking changes above before upgrading.");
884
884
  out.log(" Run with --verbose for full migration details.");
885
885
  out.log("");
886
886
  }
887
- logOpenManual(out, openManual, verbose ? manualDetailsOf(allEntries) : undefined);
887
+ logOpenManual(out, openManual, manualDetails);
888
888
  return 0;
889
889
  }
890
+ // Shared by `kumiko upgrade` and the published kumiko-upgrade bin.
891
+ export async function runUpgradeCli(argv, cwd, out, options) {
892
+ if (argv.includes("--help") || argv.includes("-h")) {
893
+ out.log(UPGRADE_USAGE);
894
+ return 0;
895
+ }
896
+ // Standalone CLI entry, not booted via runProdApp/runDevApp — Temporal needs an explicit polyfill here.
897
+ await ensureTemporalPolyfill();
898
+ const args = parseArgs(argv);
899
+ // Resolved once here (not just inside --apply) so both the filter
900
+ // baseline and the --apply codemod run target the same directory.
901
+ const dirFlag = getStringFlag(args, "dir");
902
+ const targetDir = dirFlag ? resolve(dirFlag) : cwd;
903
+ if (!existsSync(targetDir) || !statSync(targetDir).isDirectory()) {
904
+ return failUpgrade(out, `--dir path is not a directory: ${targetDir}`);
905
+ }
906
+ if (args.flags.has("resolve")) {
907
+ return resolveManualMigrations(out, args, targetDir);
908
+ }
909
+ const planned = planUpgrade(args, cwd, targetDir);
910
+ if (planned.kind === "error")
911
+ return failUpgrade(out, ...planned.lines);
912
+ if (getFlag(args, "apply")) {
913
+ return applyPlannedUpgrade(out, args, planned.value, options?.repoRoot ?? cwd, targetDir);
914
+ }
915
+ if (getFlag(args, "json"))
916
+ return reportUpgradeJson(out, planned.value);
917
+ return reportUpgradeText(out, planned.value, getFlag(args, "verbose"));
918
+ }
@@ -1,7 +1,7 @@
1
1
  // Locale-independent string ordering for sorts that feed byte-exact serialized
2
2
  // artifacts (manifest JSON, snapshot.json, generated migration SQL). Unlike
3
3
  // String.localeCompare — whose order depends on the runner's ICU locale and so
4
- // can drift between a macOS dev box and Linux CI (#330) — this compares by
4
+ // can drift between a macOS dev box and Linux CI — this compares by
5
5
  // UTF-16 code unit, which is stable across machines and, for the BMP identifier
6
6
  // strings we sort here (table / column / feature / qualified names), equals
7
7
  // codepoint order.
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@cosmicdrift/kumiko-framework",
3
- "version": "0.386.0",
3
+ "version": "0.388.0",
4
4
  "description": "Framework core — engine, pipeline, API, DB, and every other bit that makes Kumiko go.",
5
- "license": "BUSL-1.1",
5
+ "license": "MIT",
6
6
  "author": "Marc Frost <marc@cosmicdriftgamestudio.com>",
7
7
  "repository": {
8
8
  "type": "git",
@@ -199,7 +199,7 @@
199
199
  "./package.json": "./package.json"
200
200
  },
201
201
  "dependencies": {
202
- "@cosmicdrift/kumiko-types": "0.386.0",
202
+ "@cosmicdrift/kumiko-types": "0.388.0",
203
203
  "bullmq": "^5.76.7",
204
204
  "bun-types": "^1.3.13",
205
205
  "hono": "^4.13.1",
@@ -208,14 +208,14 @@
208
208
  "jose": "^6.2.3",
209
209
  "meilisearch": "^0.58.0",
210
210
  "pino": "^10.3.1",
211
- "postgres": "npm:@bender0oo0/postgres@3.4.9-kumiko.1",
211
+ "postgres": "npm:@bender0oo0/postgres@3.4.9-kumiko.2",
212
212
  "temporal-polyfill": "^0.3.2",
213
213
  "ts-morph": "^28.0.0",
214
214
  "uuid": "^14.0.0",
215
215
  "zod": "^4.4.3"
216
216
  },
217
217
  "devDependencies": {
218
- "@cosmicdrift/kumiko-testing": "0.386.0",
218
+ "@cosmicdrift/kumiko-testing": "0.388.0",
219
219
  "bun-types": "^1.3.13",
220
220
  "pino-pretty": "^13.1.3"
221
221
  },