@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.
- package/AGENTS.md +6 -1
- package/LICENSE +21 -57
- package/README.md +2 -2
- package/agents/examples/anonymous-access.md +1 -1
- package/agents/examples/apex-landing.md +204 -0
- package/agents/examples/api-worker-split.md +64 -0
- package/agents/examples/app-config.md +14 -0
- package/agents/examples/auth-mfa.md +115 -0
- package/agents/examples/env-composition.md +28 -1
- package/agents/examples/legal-pages.md +1 -1
- package/agents/examples/prod-boot-options.md +16 -0
- package/agents/examples/rate-limiting.md +48 -0
- package/agents/examples/record-detail-layout.md +692 -0
- package/agents/examples/seed-migration.md +212 -0
- package/agents/examples/wizard-form.md +941 -0
- package/agents/examples/writeform-section.md +548 -0
- package/agents/features.md +19 -2
- package/agents/widgets.md +40 -39
- package/dist/api/api-constants.js +2 -2
- package/dist/api/auth-middleware.js +7 -7
- package/dist/api/auth-rate-limiters.js +7 -3
- package/dist/api/auth-routes-mfa.js +1 -1
- package/dist/api/auth-routes-session.js +1 -1
- package/dist/api/auth-routes-shared.js +7 -3
- package/dist/api/auth-routes-signup.js +1 -1
- package/dist/api/client-error-route.js +8 -2
- package/dist/api/client-ip.js +3 -1
- package/dist/api/extra-route.js +1 -1
- package/dist/api/index.d.ts +3 -1
- package/dist/api/index.js +3 -1
- package/dist/api/pii-leak-guard.js +4 -2
- package/dist/api/readiness.js +5 -5
- package/dist/api/redis-sse-broker.js +8 -6
- package/dist/api/request-context.d.ts +1 -1
- package/dist/api/request-context.js +1 -1
- package/dist/api/routes.js +2 -2
- package/dist/api/server-boot-checks.d.ts +10 -0
- package/dist/api/server-boot-checks.js +157 -0
- package/dist/api/server-event-dispatcher.d.ts +26 -0
- package/dist/api/server-event-dispatcher.js +208 -0
- package/dist/api/server-extra-routes.d.ts +11 -0
- package/dist/api/server-extra-routes.js +203 -0
- package/dist/api/server-middleware.d.ts +20 -0
- package/dist/api/server-middleware.js +211 -0
- package/dist/api/server-routes.d.ts +19 -0
- package/dist/api/server-routes.js +293 -0
- package/dist/api/server-websocket-routes.d.ts +4 -0
- package/dist/api/server-websocket-routes.js +108 -0
- package/dist/api/server-wiring.d.ts +32 -0
- package/dist/api/server-wiring.js +236 -0
- package/dist/api/server.d.ts +10 -15
- package/dist/api/server.js +48 -1250
- package/dist/api/session-cookies.js +4 -4
- package/dist/api/sse-broker.js +1 -1
- package/dist/api/sse-route.d.ts +13 -13
- package/dist/api/sse-route.js +31 -27
- package/dist/auth/index.js +4 -4
- package/dist/auth/roles.d.ts +4 -4
- package/dist/auth/roles.js +24 -24
- package/dist/compliance/duration-spec.js +18 -20
- package/dist/compliance/index.js +2 -3
- package/dist/compliance/override-schema.d.ts +4 -4
- package/dist/compliance/override-schema.js +19 -22
- package/dist/compliance/profiles.d.ts +26 -29
- package/dist/compliance/profiles.js +62 -69
- package/dist/compliance/sub-processors.d.ts +28 -30
- package/dist/compliance/sub-processors.js +17 -21
- package/dist/consumer-cli.js +4 -4
- package/dist/crypto/blind-index.js +18 -17
- package/dist/crypto/ciphertext-pattern.js +1 -1
- package/dist/crypto/event-pii.js +3 -3
- package/dist/crypto/kek-source.d.ts +1 -1
- package/dist/crypto/kek-source.js +3 -2
- package/dist/crypto/kms-adapter.d.ts +1 -1
- package/dist/crypto/kms-adapter.js +4 -6
- package/dist/crypto/kms-wiring.d.ts +1 -2
- package/dist/crypto/kms-wiring.js +2 -2
- package/dist/crypto/owner-transition-rekey.d.ts +5 -1
- package/dist/crypto/owner-transition-rekey.js +1 -1
- package/dist/crypto/pg-kms-adapter.js +2 -6
- package/dist/crypto/pii-field-encryption.d.ts +5 -1
- package/dist/crypto/pii-field-encryption.js +7 -5
- package/dist/crypto/subject-resolver.d.ts +1 -1
- package/dist/crypto/subject-resolver.js +2 -2
- package/dist/db/aggregate-sql.d.ts +21 -0
- package/dist/db/aggregate-sql.js +155 -0
- package/dist/db/apply-entity-event.d.ts +6 -6
- package/dist/db/apply-entity-event.js +55 -55
- package/dist/db/blind-index-cleanup.js +7 -7
- package/dist/db/closed-connection.d.ts +9 -0
- package/dist/db/closed-connection.js +95 -0
- package/dist/db/collect-table-metas.js +10 -11
- package/dist/db/compound-types.d.ts +1 -1
- package/dist/db/compound-types.js +12 -12
- package/dist/db/cursor.js +3 -4
- package/dist/db/dialect.d.ts +2 -2
- package/dist/db/dialect.js +3 -3
- package/dist/db/distinct-on.d.ts +1 -1
- package/dist/db/driver-row-coercion.d.ts +2 -0
- package/dist/db/driver-row-coercion.js +186 -0
- package/dist/db/driver-value-preparation.d.ts +16 -0
- package/dist/db/driver-value-preparation.js +99 -0
- package/dist/db/eagerload.d.ts +3 -3
- package/dist/db/eagerload.js +21 -12
- package/dist/db/entity-field-encryption.d.ts +1 -0
- package/dist/db/entity-field-encryption.js +1 -1
- package/dist/db/entity-table-meta.d.ts +2 -2
- package/dist/db/entity-table-meta.js +105 -112
- package/dist/db/event-store-executor-context.d.ts +3 -2
- package/dist/db/event-store-executor-context.js +13 -13
- package/dist/db/event-store-executor-read-aggregate.d.ts +8 -0
- package/dist/db/event-store-executor-read-aggregate.js +112 -0
- package/dist/db/event-store-executor-read-filter.d.ts +31 -0
- package/dist/db/event-store-executor-read-filter.js +203 -0
- package/dist/db/event-store-executor-read-paging.d.ts +14 -0
- package/dist/db/event-store-executor-read-paging.js +99 -0
- package/dist/db/event-store-executor-read-rows.d.ts +6 -0
- package/dist/db/event-store-executor-read-rows.js +32 -0
- package/dist/db/event-store-executor-read-search.d.ts +28 -0
- package/dist/db/event-store-executor-read-search.js +221 -0
- package/dist/db/event-store-executor-read-sort.d.ts +41 -0
- package/dist/db/event-store-executor-read-sort.js +130 -0
- package/dist/db/event-store-executor-read-where.d.ts +24 -0
- package/dist/db/event-store-executor-read-where.js +81 -0
- package/dist/db/event-store-executor-read.d.ts +2 -9
- package/dist/db/event-store-executor-read.js +50 -704
- package/dist/db/event-store-executor-write-steps.d.ts +20 -0
- package/dist/db/event-store-executor-write-steps.js +100 -0
- package/dist/db/event-store-executor-write.js +401 -510
- package/dist/db/index.d.ts +6 -2
- package/dist/db/index.js +5 -1
- package/dist/db/list-aggregate-labels.d.ts +14 -0
- package/dist/db/list-aggregate-labels.js +26 -0
- package/dist/db/located-timestamp.d.ts +11 -11
- package/dist/db/located-timestamp.js +29 -30
- package/dist/db/migrate-generator.d.ts +1 -1
- package/dist/db/migrate-generator.js +97 -105
- package/dist/db/migrate-runner.js +29 -26
- package/dist/db/money.d.ts +6 -6
- package/dist/db/money.js +29 -27
- package/dist/db/queries/backfill-pii.js +5 -5
- package/dist/db/queries/ddl.js +1 -1
- package/dist/db/queries/es-ops.d.ts +1 -1
- package/dist/db/queries/es-ops.js +1 -1
- package/dist/db/queries/event-consumer.js +3 -3
- package/dist/db/queries/event-store.js +4 -2
- package/dist/db/queries/projection-rebuild.js +3 -3
- package/dist/db/queries/raw-sql.d.ts +2 -2
- package/dist/db/queries/raw-sql.js +2 -2
- package/dist/db/queries/shadow-swap.js +19 -19
- package/dist/db/query.d.ts +3 -16
- package/dist/db/query.js +8 -761
- package/dist/db/rebuild-marker.js +20 -21
- package/dist/db/reference-data.js +6 -1
- package/dist/db/replay-migration-sql.js +2 -2
- package/dist/db/schema-inspection.js +4 -5
- package/dist/db/table-builder.d.ts +1 -2
- package/dist/db/table-builder.js +137 -190
- package/dist/db/table-info.d.ts +10 -0
- package/dist/db/table-info.js +45 -0
- package/dist/db/temporal-value-guards.d.ts +6 -0
- package/dist/db/temporal-value-guards.js +15 -0
- package/dist/db/tenant-db-runner.d.ts +1 -0
- package/dist/db/tenant-db-runner.js +3 -0
- package/dist/db/tenant-db.d.ts +2 -2
- package/dist/db/tenant-db.js +48 -11
- package/dist/db/where-clause.d.ts +6 -0
- package/dist/db/where-clause.js +236 -0
- package/dist/derivatives/delete-stored-file.js +6 -2
- package/dist/derivatives/derivatives-context.js +1 -1
- package/dist/engine/boot-validator/access-roles.js +4 -3
- package/dist/engine/boot-validator/api-ext.js +14 -14
- package/dist/engine/boot-validator/boot-check.js +1 -1
- package/dist/engine/boot-validator/config-deps.js +7 -6
- package/dist/engine/boot-validator/detail-screens.js +4 -4
- package/dist/engine/boot-validator/entity-handler.d.ts +1 -0
- package/dist/engine/boot-validator/entity-handler.js +77 -61
- package/dist/engine/boot-validator/form-derivations.js +35 -1
- package/dist/engine/boot-validator/gdpr-storage.js +4 -4
- package/dist/engine/boot-validator/i18n-keys.js +6 -4
- package/dist/engine/boot-validator/index.d.ts +2 -2
- package/dist/engine/boot-validator/index.js +22 -20
- package/dist/engine/boot-validator/nav.js +5 -5
- package/dist/engine/boot-validator/ownership.js +12 -9
- package/dist/engine/boot-validator/parent-ref.js +1 -1
- package/dist/engine/boot-validator/pii-retention.js +258 -187
- package/dist/engine/boot-validator/projection-list-screens.js +7 -7
- package/dist/engine/boot-validator/query-refs.js +1 -1
- package/dist/engine/boot-validator/screens-actions.d.ts +1 -0
- package/dist/engine/boot-validator/screens-actions.js +23 -17
- package/dist/engine/boot-validator/screens-dashboard.js +2 -5
- package/dist/engine/boot-validator/screens-forms.js +12 -17
- package/dist/engine/boot-validator/screens-kind-config-edit.d.ts +3 -0
- package/dist/engine/boot-validator/screens-kind-config-edit.js +88 -0
- package/dist/engine/boot-validator/screens-kind-entity-edit.d.ts +3 -0
- package/dist/engine/boot-validator/screens-kind-entity-edit.js +55 -0
- package/dist/engine/boot-validator/screens-kind-entity-list.d.ts +3 -0
- package/dist/engine/boot-validator/screens-kind-entity-list.js +228 -0
- package/dist/engine/boot-validator/screens-kind-projection-detail.d.ts +3 -0
- package/dist/engine/boot-validator/screens-kind-projection-detail.js +235 -0
- package/dist/engine/boot-validator/screens-kind-projection-list.d.ts +3 -0
- package/dist/engine/boot-validator/screens-kind-projection-list.js +52 -0
- package/dist/engine/boot-validator/screens-kind-secret-mint.d.ts +3 -0
- package/dist/engine/boot-validator/screens-kind-secret-mint.js +28 -0
- package/dist/engine/boot-validator/screens-kind-shared.d.ts +37 -0
- package/dist/engine/boot-validator/screens-kind-shared.js +142 -0
- package/dist/engine/boot-validator/screens-lists.d.ts +2 -1
- package/dist/engine/boot-validator/screens-lists.js +26 -24
- package/dist/engine/boot-validator/screens.d.ts +0 -2
- package/dist/engine/boot-validator/screens.js +102 -869
- package/dist/engine/boot-validator/security-baseline.js +3 -2
- package/dist/engine/boot-validator/transfer-graph.js +2 -2
- package/dist/engine/boot-validator/workspaces.js +3 -3
- package/dist/engine/bridge-stub.js +3 -4
- package/dist/engine/build-app-schema.js +130 -170
- package/dist/engine/build-config-feature-schema.js +50 -50
- package/dist/engine/build-target.js +20 -23
- package/dist/engine/codemod/pipeline-codemod.js +20 -13
- package/dist/engine/config-helpers.js +4 -4
- package/dist/engine/constants.js +2 -2
- package/dist/engine/create-app.js +2 -2
- package/dist/engine/define-feature.js +21 -13
- package/dist/engine/define-handler.js +13 -11
- package/dist/engine/define-step.js +1 -1
- package/dist/engine/define-workflow.d.ts +5 -5
- package/dist/engine/define-workflow.js +6 -6
- package/dist/engine/entity-handlers.d.ts +13 -0
- package/dist/engine/entity-handlers.js +22 -34
- package/dist/engine/entity-list-runtime-options.d.ts +8 -0
- package/dist/engine/entity-list-runtime-options.js +18 -0
- package/dist/engine/event-def.js +2 -2
- package/dist/engine/extension-names.d.ts +16 -17
- package/dist/engine/extension-names.js +37 -38
- package/dist/engine/extensions/escape-hatch-usage.js +1 -1
- package/dist/engine/extensions/tenant-data.js +2 -2
- package/dist/engine/extensions/user-data.d.ts +23 -24
- package/dist/engine/factories.d.ts +14 -13
- package/dist/engine/factories.js +38 -37
- package/dist/engine/feature-ast/entity-field-types.js +1 -1
- package/dist/engine/feature-ast/extractors/handlers.js +2 -1
- package/dist/engine/feature-ast/extractors/hooks.js +1 -1
- package/dist/engine/feature-ast/extractors/round2.js +25 -6
- package/dist/engine/feature-ast/extractors/shared.d.ts +2 -3
- package/dist/engine/feature-ast/extractors/shared.js +2 -3
- package/dist/engine/feature-ast/parse.js +13 -13
- package/dist/engine/feature-ast/patch.js +4 -182
- package/dist/engine/feature-ast/pattern-change-schema.d.ts +3 -0
- package/dist/engine/feature-ast/pattern-change-schema.js +2 -1
- package/dist/engine/feature-ast/pattern-id-matchers.d.ts +7 -0
- package/dist/engine/feature-ast/pattern-id-matchers.js +210 -0
- package/dist/engine/feature-ast/patterns.d.ts +11 -2
- package/dist/engine/feature-ast/patterns.js +43 -51
- package/dist/engine/feature-ast/render.js +50 -89
- package/dist/engine/feature-config-events-jobs.js +15 -12
- package/dist/engine/feature-entity-handlers.js +12 -5
- package/dist/engine/feature-manifest.d.ts +9 -9
- package/dist/engine/feature-manifest.js +6 -7
- package/dist/engine/feature-ui-extensions.d.ts +3 -3
- package/dist/engine/feature-ui-extensions.js +30 -22
- package/dist/engine/field-access.js +5 -6
- package/dist/engine/form-derivations.js +18 -7
- package/dist/engine/handler-field-references.js +1 -1
- package/dist/engine/index.d.ts +1 -0
- package/dist/engine/index.js +4 -4
- package/dist/engine/object-form.d.ts +1 -0
- package/dist/engine/object-form.js +14 -4
- package/dist/engine/ownership.js +3 -3
- package/dist/engine/parse-ref-target.js +5 -7
- package/dist/engine/pattern-library/index.js +2 -2
- package/dist/engine/pattern-library/library.js +2 -2
- package/dist/engine/pattern-library/types.js +3 -3
- package/dist/engine/pipeline.js +2 -2
- package/dist/engine/project-app-schema-for-roles.d.ts +2 -0
- package/dist/engine/project-app-schema-for-roles.js +7 -5
- package/dist/engine/projection-helpers.js +9 -9
- package/dist/engine/qualified-name.js +2 -2
- package/dist/engine/registry-facade.js +1 -1
- package/dist/engine/registry-ingest.js +13 -13
- package/dist/engine/registry-state.js +17 -19
- package/dist/engine/registry-validate.js +12 -12
- package/dist/engine/run-in.js +2 -2
- package/dist/engine/run-pipeline.js +7 -0
- package/dist/engine/schema-builder.js +251 -233
- package/dist/engine/screen-filter-ops.js +17 -20
- package/dist/engine/screen-helpers.js +4 -3
- package/dist/engine/screen-kind.d.ts +7 -0
- package/dist/engine/screen-kind.js +1 -0
- package/dist/engine/state-machine.d.ts +12 -12
- package/dist/engine/state-machine.js +7 -7
- package/dist/engine/steps/_resolver-utils.js +4 -3
- package/dist/engine/steps/for-each.js +4 -4
- package/dist/engine/steps/unsafe-projection-delete.js +1 -1
- package/dist/engine/steps/unsafe-projection-upsert.js +4 -4
- package/dist/engine/steps/wait-for-event.js +4 -4
- package/dist/engine/steps/workflow-system-events.js +3 -3
- package/dist/engine/strip-disabled-features-from-app-schema.js +51 -14
- package/dist/engine/tier-resolver-extension.d.ts +29 -27
- package/dist/engine/tier-resolver-extension.js +26 -26
- package/dist/engine/transfer-adjacency.js +2 -2
- package/dist/engine/validate-projection-allowlist.js +9 -28
- package/dist/engine/walk-step-instances.d.ts +2 -0
- package/dist/engine/walk-step-instances.js +38 -0
- package/dist/engine/where-rule-lint.js +1 -1
- package/dist/engine/write-handler-qn-extract.js +1 -1
- package/dist/entrypoint/index.d.ts +4 -1
- package/dist/entrypoint/index.js +10 -4
- package/dist/env/index.d.ts +7 -6
- package/dist/env/index.js +10 -9
- package/dist/errors/docs-url.d.ts +1 -1
- package/dist/errors/docs-url.js +22 -2
- package/dist/errors/transition-details.js +7 -7
- package/dist/errors/write-error-info.d.ts +6 -6
- package/dist/errors/write-error-info.js +6 -6
- package/dist/es-ops/context.d.ts +9 -9
- package/dist/es-ops/context.js +29 -29
- package/dist/es-ops/index.js +7 -9
- package/dist/es-ops/operations-schema.js +4 -10
- package/dist/es-ops/runner.d.ts +11 -11
- package/dist/es-ops/runner.js +49 -53
- package/dist/es-ops/types.d.ts +55 -55
- package/dist/es-ops/types.js +11 -11
- package/dist/event-store/admin-api.js +7 -8
- package/dist/event-store/errors.js +1 -1
- package/dist/event-store/event-store.js +12 -6
- package/dist/event-store/rebuild-dead-letter.js +1 -1
- package/dist/files/bind-pending-file-refs.js +3 -3
- package/dist/files/create-file-ref-from-bytes.js +4 -1
- package/dist/files/feature.js +9 -10
- package/dist/files/file-handle.js +7 -9
- package/dist/files/file-ref-entity.js +15 -15
- package/dist/files/file-ref-table.js +7 -8
- package/dist/files/file-routes.d.ts +7 -0
- package/dist/files/file-routes.js +22 -13
- package/dist/files/in-memory-provider.js +8 -9
- package/dist/files/local-provider.js +18 -25
- package/dist/files/provider-resolver.d.ts +7 -7
- package/dist/files/resolve-content-type.js +43 -0
- package/dist/files/storage-tracking.js +2 -2
- package/dist/files/upload-ledger.js +7 -0
- package/dist/files/zip-stream.d.ts +12 -19
- package/dist/files/zip-stream.js +44 -63
- package/dist/i18n/required-surface-keys.d.ts +1 -1
- package/dist/i18n/required-surface-keys.js +188 -212
- package/dist/internal/stack-support.d.ts +2 -1
- package/dist/internal/stack-support.js +1 -1
- package/dist/jobs/job-runner-context.d.ts +32 -0
- package/dist/jobs/job-runner-context.js +305 -0
- package/dist/jobs/job-runner-execution.d.ts +7 -0
- package/dist/jobs/job-runner-execution.js +160 -0
- package/dist/jobs/job-runner-gates.d.ts +19 -0
- package/dist/jobs/job-runner-gates.js +198 -0
- package/dist/jobs/job-runner-helpers.d.ts +17 -3
- package/dist/jobs/job-runner-helpers.js +69 -4
- package/dist/jobs/job-runner-schedulers.d.ts +1 -1
- package/dist/jobs/job-runner-schedulers.js +3 -4
- package/dist/jobs/job-runner-scope.d.ts +44 -0
- package/dist/jobs/job-runner-scope.js +102 -0
- package/dist/jobs/job-runner-types.d.ts +12 -0
- package/dist/jobs/job-runner.d.ts +0 -1
- package/dist/jobs/job-runner.js +57 -669
- package/dist/lifecycle/lifecycle.js +3 -5
- package/dist/lifecycle/signal-handlers.js +5 -4
- package/dist/logging/utils.d.ts +2 -1
- package/dist/logging/utils.js +38 -10
- package/dist/migrations/index.js +1 -1
- package/dist/migrations/kumiko-drift.js +14 -13
- package/dist/migrations/pending-rebuilds.d.ts +21 -20
- package/dist/migrations/pending-rebuilds.js +27 -27
- package/dist/migrations/projection-table-index.d.ts +3 -3
- package/dist/migrations/projection-table-index.js +8 -8
- package/dist/observability/escape-hatch-report.d.ts +3 -0
- package/dist/observability/escape-hatch-report.js +12 -1
- package/dist/observability/metric-validator.js +1 -1
- package/dist/observability/metrics-handle.js +3 -3
- package/dist/pipeline/append-event-core.js +11 -2
- package/dist/pipeline/cascade-handler.d.ts +1 -1
- package/dist/pipeline/cascade-handler.js +165 -138
- package/dist/pipeline/dispatch-batch.js +2 -2
- package/dist/pipeline/dispatch-query.js +20 -13
- package/dist/pipeline/dispatch-shared.d.ts +14 -3
- package/dist/pipeline/dispatch-shared.js +67 -721
- package/dist/pipeline/dispatch-stream.js +1 -1
- package/dist/pipeline/dispatch-write.js +297 -190
- package/dist/pipeline/dispatcher-utils.d.ts +1 -1
- package/dist/pipeline/dispatcher-utils.js +1 -1
- package/dist/pipeline/event-consumer-state.js +2 -2
- package/dist/pipeline/event-dispatcher-admin.js +2 -1
- package/dist/pipeline/event-dispatcher-delivery.js +4 -6
- package/dist/pipeline/event-dispatcher.js +17 -28
- package/dist/pipeline/handler-context-auth.d.ts +9 -0
- package/dist/pipeline/handler-context-auth.js +54 -0
- package/dist/pipeline/handler-context-config.d.ts +14 -0
- package/dist/pipeline/handler-context-config.js +113 -0
- package/dist/pipeline/handler-context-db.d.ts +24 -0
- package/dist/pipeline/handler-context-db.js +149 -0
- package/dist/pipeline/handler-context-dispatch.d.ts +21 -0
- package/dist/pipeline/handler-context-dispatch.js +89 -0
- package/dist/pipeline/handler-context-events.d.ts +43 -0
- package/dist/pipeline/handler-context-events.js +237 -0
- package/dist/pipeline/handler-context-notify.d.ts +12 -0
- package/dist/pipeline/handler-context-notify.js +55 -0
- package/dist/pipeline/handler-context-observability.d.ts +7 -0
- package/dist/pipeline/handler-context-observability.js +21 -0
- package/dist/pipeline/handler-context-scope.d.ts +48 -0
- package/dist/pipeline/handler-context-scope.js +88 -0
- package/dist/pipeline/irreversible-operation-gate.js +1 -1
- package/dist/pipeline/lifecycle-pipeline.js +9 -9
- package/dist/pipeline/member-read-only-transaction.js +1 -3
- package/dist/pipeline/msp-rebuild.js +1 -1
- package/dist/pipeline/notify-scope.js +12 -1
- package/dist/pipeline/pre-handler-gates.js +20 -4
- package/dist/pipeline/pre-transaction-reservations.d.ts +1 -0
- package/dist/pipeline/pre-transaction-reservations.js +9 -3
- package/dist/pipeline/projection-rebuild.js +15 -13
- package/dist/pipeline/system-hooks.js +39 -41
- package/dist/pipeline/system-identity-switch.js +1 -3
- package/dist/pipeline/tenant-timezone-cache.js +1 -1
- package/dist/random/generate.d.ts +29 -29
- package/dist/random/generate.js +30 -30
- package/dist/random/words.js +20 -20
- package/dist/rate-limit/middleware.js +9 -5
- package/dist/redis/client.js +2 -2
- package/dist/redis/pubsub-signal.js +14 -17
- package/dist/schema-cli/apply-command.d.ts +2 -0
- package/dist/schema-cli/apply-command.js +97 -0
- package/dist/schema-cli/baseline-command.d.ts +2 -0
- package/dist/schema-cli/baseline-command.js +33 -0
- package/dist/schema-cli/generate-command.d.ts +2 -0
- package/dist/schema-cli/generate-command.js +90 -0
- package/dist/schema-cli/shared.d.ts +39 -0
- package/dist/schema-cli/shared.js +95 -0
- package/dist/schema-cli/status-command.d.ts +2 -0
- package/dist/schema-cli/status-command.js +73 -0
- package/dist/schema-cli/validate-boot-input.d.ts +5 -0
- package/dist/schema-cli/validate-boot-input.js +130 -0
- package/dist/schema-cli/validate-command.d.ts +2 -0
- package/dist/schema-cli/validate-command.js +130 -0
- package/dist/schema-cli.d.ts +2 -18
- package/dist/schema-cli.js +47 -510
- package/dist/search/index.js +4 -4
- package/dist/search/meilisearch-adapter.js +2 -1
- package/dist/search/purge-subject.js +4 -5
- package/dist/search/reindex-entity.js +6 -9
- package/dist/time/boot-tz-warning.d.ts +2 -2
- package/dist/time/boot-tz-warning.js +8 -8
- package/dist/time/iana.js +10 -10
- package/dist/time/index.js +9 -9
- package/dist/time/legacy-date.d.ts +2 -2
- package/dist/time/legacy-date.js +6 -8
- package/dist/time/polyfill.js +1 -1
- package/dist/time/tz-context.d.ts +1 -1
- package/dist/time/tz-context.js +1 -1
- package/dist/ui-types/app-schema.js +7 -7
- package/dist/ui-types/list-row-meta.js +4 -4
- package/dist/upgrade-cli.js +159 -130
- package/dist/utils/compare.js +1 -1
- package/package.json +5 -5
- package/src/changes.json +358 -0
- package/src/scripts/codemod/crypto-shredding-testing-move.ts +2 -2
- package/src/scripts/codemod/feature-layout.ts +10 -2
- package/src/scripts/codemod/migrate-cross-tenant.ts +1 -1
- package/src/scripts/codemod/migrate-open-to-all.ts +1 -1
- package/src/scripts/codemod/object-form.ts +41 -4
- package/src/scripts/codemod/package-merge.ts +58 -8
- package/src/scripts/codemod/pii-personal-migration.ts +192 -153
- package/src/scripts/codemod/testing-injection.ts +122 -42
- package/src/scripts/codemod/testing-move.ts +29 -7
- package/src/scripts/codemod/unprocessable-error-details-reason.ts +2 -2
package/dist/upgrade-cli.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
672
|
+
return failUpgrade(out, input.error);
|
|
672
673
|
const read = readMarker(targetDir);
|
|
673
674
|
if (read.kind === "missing") {
|
|
674
|
-
return
|
|
675
|
+
return failUpgrade(out, `No .kumiko/upgrade-state.json under ${targetDir}, nothing to resolve.`);
|
|
675
676
|
}
|
|
676
677
|
if (read.kind === "invalid")
|
|
677
|
-
return
|
|
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
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
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
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
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
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
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
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
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
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
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
|
|
834
|
-
const
|
|
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,
|
|
876
|
+
logOpenManual(out, openManual, manualDetails);
|
|
843
877
|
return 0;
|
|
844
878
|
}
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
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,
|
|
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
|
+
}
|
package/dist/utils/compare.js
CHANGED
|
@@ -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
|
|
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.
|
|
3
|
+
"version": "0.388.0",
|
|
4
4
|
"description": "Framework core — engine, pipeline, API, DB, and every other bit that makes Kumiko go.",
|
|
5
|
-
"license": "
|
|
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.
|
|
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.
|
|
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.
|
|
218
|
+
"@cosmicdrift/kumiko-testing": "0.388.0",
|
|
219
219
|
"bun-types": "^1.3.13",
|
|
220
220
|
"pino-pretty": "^13.1.3"
|
|
221
221
|
},
|