@tailor-platform/sdk 2.26.0 → 2.28.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/CHANGELOG.md +144 -0
- package/agent-skills/tailor/SKILL.md +4 -2
- package/dist/application-CgJLyJaF.mjs +200 -0
- package/dist/application-CgJLyJaF.mjs.map +1 -0
- package/dist/application-CvmKh5WT.mjs +1 -0
- package/dist/cli/commands/deploy/deploy.d.mts +2 -0
- package/dist/cli/commands/deploy/tailordb/migration-validation.d.mts +2 -1
- package/dist/cli/commands/executor/get.d.mts +2 -1
- package/dist/cli/commands/executor/jobs.d.mts +2 -1
- package/dist/cli/commands/executor/trigger.d.mts +2 -1
- package/dist/cli/commands/function/get.d.mts +2 -1
- package/dist/cli/commands/function/list.d.mts +2 -1
- package/dist/cli/commands/organization/folder/create.d.mts +2 -1
- package/dist/cli/commands/organization/folder/delete.d.mts +2 -1
- package/dist/cli/commands/organization/folder/get.d.mts +2 -1
- package/dist/cli/commands/organization/folder/list.d.mts +2 -1
- package/dist/cli/commands/organization/folder/update.d.mts +2 -1
- package/dist/cli/commands/organization/get.d.mts +2 -1
- package/dist/cli/commands/organization/tree.d.mts +2 -1
- package/dist/cli/commands/organization/update.d.mts +2 -1
- package/dist/cli/commands/show.d.mts +2 -1
- package/dist/cli/commands/tailordb/migrate/bundler.d.mts +4 -6
- package/dist/cli/commands/tailordb/migrate/diff-calculator.d.mts +8 -1
- package/dist/cli/commands/tailordb/migrate/remote-state.d.mts +1 -0
- package/dist/cli/commands/tailordb/migrate/snapshot-types.d.mts +3 -1
- package/dist/cli/commands/workflow/executions.d.mts +2 -1
- package/dist/cli/commands/workflow/get.d.mts +2 -1
- package/dist/cli/commands/workflow/start.d.mts +2 -1
- package/dist/cli/commands/workspace/app/health.d.mts +2 -1
- package/dist/cli/commands/workspace/app/list.d.mts +2 -1
- package/dist/cli/commands/workspace/create.d.mts +5 -2
- package/dist/cli/commands/workspace/delete.d.mts +2 -1
- package/dist/cli/commands/workspace/get.d.mts +2 -1
- package/dist/cli/commands/workspace/restore.d.mts +2 -1
- package/dist/cli/commands/workspace/user/invite.d.mts +2 -1
- package/dist/cli/commands/workspace/user/list.d.mts +2 -1
- package/dist/cli/commands/workspace/user/remove.d.mts +2 -1
- package/dist/cli/commands/workspace/user/update.d.mts +2 -1
- package/dist/cli/lib.d.mts +3 -3
- package/dist/cli/lib.mjs +1 -1
- package/dist/cli/lib.mjs.map +1 -1
- package/dist/cli/main.d.mts +2 -0
- package/dist/cli/main.mjs +68 -55
- package/dist/cli/main.mjs.map +1 -1
- package/dist/cli/query/index.d.mts +2 -1
- package/dist/cli/shared/args.d.mts +4 -2
- package/dist/cli/shared/client.d.mts +6 -1
- package/dist/cli/shared/context.d.mts +2 -1
- package/dist/cli/shared/logger.d.mts +5 -2
- package/dist/cli/shared/readonly-guard.d.mts +2 -1
- package/dist/cli/shared/seed-context.d.mts +5 -0
- package/dist/cli/shared/type-generator.d.mts +2 -1
- package/dist/cli/shared/workspace-name.d.mts +2 -0
- package/dist/completion/zsh-worker.zsh +220 -19
- package/dist/configure/config/types.d.mts +34 -1
- package/dist/configure/index.d.mts +6 -6
- package/dist/configure/index.mjs +1 -1
- package/dist/configure/index.mjs.map +1 -1
- package/dist/configure/services/aigateway/types.d.mts +2 -1
- package/dist/configure/services/auth/types.d.mts +8 -2
- package/dist/configure/services/executor/executor.d.mts +2 -1
- package/dist/configure/services/executor/operation.d.mts +2 -1
- package/dist/configure/services/executor/trigger/event.d.mts +3 -2
- package/dist/configure/services/executor/trigger/schedule.d.mts +2 -1
- package/dist/configure/services/executor/trigger/webhook.d.mts +1 -1
- package/dist/configure/services/http-adapter/http-adapter.d.mts +2 -1
- package/dist/configure/services/idp/permission.d.mts +4 -3
- package/dist/configure/services/idp/types.d.mts +2 -1
- package/dist/configure/services/resolver/permission.d.mts +2 -1
- package/dist/configure/services/resolver/resolver.d.mts +3 -2
- package/dist/configure/services/secrets/types.d.mts +2 -1
- package/dist/configure/services/staticwebsite/types.d.mts +2 -1
- package/dist/configure/services/tailordb/permission.d.mts +2 -1
- package/dist/configure/services/tailordb/schema.d.mts +5 -4
- package/dist/configure/services/tailordb/types.d.mts +13 -2
- package/dist/configure/services/workflow/execution-policy.types.d.mts +2 -1
- package/dist/configure/services/workflow/job.d.mts +3 -2
- package/dist/configure/services/workflow/wait-point.d.mts +2 -1
- package/dist/configure/types/field.types.d.mts +50 -12
- package/dist/configure/types/permission-operand.types.d.mts +2 -1
- package/dist/configure/types/type.d.mts +3 -2
- package/dist/{crashreport-DFpRn-LS.mjs → crashreport-BAG8c7hB.mjs} +4 -4
- package/dist/{crashreport-DFpRn-LS.mjs.map → crashreport-BAG8c7hB.mjs.map} +1 -1
- package/dist/crashreport-BcXuocwI.mjs +1 -0
- package/dist/date-CgP7gMG_.mjs +2 -0
- package/dist/date-CgP7gMG_.mjs.map +1 -0
- package/dist/{secretmanager-5olfnI1b.mjs → date-representation-Cr7W7Pn2.mjs} +2 -2
- package/dist/date-representation-Cr7W7Pn2.mjs.map +1 -0
- package/dist/{errors-CpvSChyL.mjs → errors-D3qpNHR6.mjs} +2 -2
- package/dist/{errors-CpvSChyL.mjs.map → errors-D3qpNHR6.mjs.map} +1 -1
- package/dist/{field-parse-DhnFs9WG.mjs → field-parse-C41e3UAF.mjs} +2 -2
- package/dist/{field-parse-DhnFs9WG.mjs.map → field-parse-C41e3UAF.mjs.map} +1 -1
- package/dist/idp-G_ojPBB5.mjs.map +1 -1
- package/dist/kysely-type-BWMfV301.mjs +48 -0
- package/dist/kysely-type-BWMfV301.mjs.map +1 -0
- package/dist/logger-DuaT2zY3.mjs +9 -0
- package/dist/logger-DuaT2zY3.mjs.map +1 -0
- package/dist/{manager-8-JOvuLl.mjs → manager-Bk-7vkwd.mjs} +2 -2
- package/dist/{manager-8-JOvuLl.mjs.map → manager-Bk-7vkwd.mjs.map} +1 -1
- package/dist/migration-steps-C6F3zNdQ.mjs +3 -0
- package/dist/migration-steps-C6F3zNdQ.mjs.map +1 -0
- package/dist/package-json-D1BRkjtr.mjs +1 -0
- package/dist/parser/service/tailordb/types.d.mts +3 -1
- package/dist/plugin/builtin/enum-constants/index.d.mts +2 -1
- package/dist/plugin/builtin/file-utils/index.d.mts +2 -1
- package/dist/plugin/builtin/kysely-type/index.d.mts +2 -1
- package/dist/plugin/builtin/kysely-type/index.mjs +1 -1
- package/dist/plugin/builtin/seed/index.d.mts +11 -1
- package/dist/plugin/builtin/seed/index.mjs +1 -1
- package/dist/plugin/index.mjs +1 -1
- package/dist/register-ts-hook-yxshv0LV.mjs +1013 -0
- package/dist/register-ts-hook-yxshv0LV.mjs.map +1 -0
- package/dist/runtime/aigateway.mjs +1 -1
- package/dist/runtime/authconnection.mjs +1 -1
- package/dist/runtime/context.d.mts +2 -1
- package/dist/runtime/context.mjs +1 -1
- package/dist/runtime/date.d.mts +2 -1
- package/dist/runtime/field-parse.d.mts +2 -1
- package/dist/runtime/file.d.mts +2 -1
- package/dist/runtime/file.mjs +1 -1
- package/dist/runtime/globals.d.mts +2 -1
- package/dist/runtime/iconv.mjs +1 -1
- package/dist/runtime/idp.d.mts +6 -0
- package/dist/runtime/idp.mjs +1 -1
- package/dist/runtime/index.mjs +1 -1
- package/dist/runtime/logger.mjs +1 -1
- package/dist/runtime/secretmanager.mjs +1 -1
- package/dist/runtime/types.d.mts +7 -1
- package/dist/runtime/workflow.d.mts +2 -1
- package/dist/runtime/workflow.mjs +1 -1
- package/dist/{schema-CRtAmDcl.mjs → schema-B6hJQWp6.mjs} +2 -2
- package/dist/schema-B6hJQWp6.mjs.map +1 -0
- package/dist/seed/index.d.mts +19 -4
- package/dist/seed/index.mjs +7 -9
- package/dist/seed/index.mjs.map +1 -1
- package/dist/seed-C3P_T_Eh.mjs.map +1 -1
- package/dist/service-CETr0AKY.mjs +7 -0
- package/dist/service-CETr0AKY.mjs.map +1 -0
- package/dist/service-DREWLYxD.mjs +1 -0
- package/dist/{service-DFmt9UJP.mjs → service-b1g22NN9.mjs} +2 -2
- package/dist/{service-DFmt9UJP.mjs.map → service-b1g22NN9.mjs.map} +1 -1
- package/dist/service_pb-Bbu2QSIr.mjs +2 -0
- package/dist/service_pb-Bbu2QSIr.mjs.map +1 -0
- package/dist/service_pb-urxAIYHT.mjs +1 -0
- package/dist/tailor-proto/src/tailor/v1/events_pb.d.mts +53 -1
- package/dist/tailor-proto/src/tailor/v1/events_resource_pb.d.mts +33 -0
- package/dist/tailor-proto/src/tailor/v1/function_resource_pb.d.mts +0 -8
- package/dist/tailor-proto/src/tailor/v1/service_pb.d.mts +18 -1
- package/dist/tailor-proto/src/tailor/v1/tailordb_resource_pb.d.mts +4 -0
- package/dist/telemetry-DpkFGBmu.mjs +1 -0
- package/dist/{telemetry-Bklv9kQY.mjs → telemetry-Xk7J829P.mjs} +2 -2
- package/dist/{telemetry-Bklv9kQY.mjs.map → telemetry-Xk7J829P.mjs.map} +1 -1
- package/dist/types/field.generated.d.mts +2 -2
- package/dist/types/tailordb.generated.d.mts +2 -0
- package/dist/utils/test/index.mjs +1 -1
- package/dist/vitest/date-representation.d.mts +23 -0
- package/dist/vitest/index.d.mts +3 -1
- package/dist/vitest/index.mjs +1 -1
- package/dist/vitest/index.mjs.map +1 -1
- package/dist/vitest/migration-steps.d.mts +45 -0
- package/dist/vitest/mock-kysely.d.mts +2 -1
- package/dist/vitest/mocks/aigateway.d.mts +2 -1
- package/dist/vitest/mocks/authconnection.d.mts +2 -1
- package/dist/vitest/mocks/file.d.mts +2 -1
- package/dist/vitest/mocks/iconv.d.mts +2 -1
- package/dist/vitest/mocks/idp.d.mts +3 -1
- package/dist/vitest/mocks/logger.d.mts +2 -1
- package/dist/vitest/mocks/secretmanager.d.mts +2 -1
- package/dist/vitest/mocks/tailordb-pglite.d.mts +2 -1
- package/dist/vitest/mocks/tailordb.d.mts +2 -1
- package/dist/vitest/mocks/workflow.d.mts +3 -1
- package/dist/vitest/pglite-kysely.d.mts +2 -1
- package/dist/vitest/setup.d.mts +3 -1
- package/dist/vitest/setup.mjs +1 -1
- package/dist/vitest/setup.mjs.map +1 -1
- package/dist/vitest/workflow-local.d.mts +2 -1
- package/dist/{workspace_resource_pb-CxR_6fyN.mjs → workspace_resource_pb-CaoM2npP.mjs} +2 -2
- package/dist/workspace_resource_pb-CaoM2npP.mjs.map +1 -0
- package/docs/cli/application.md +37 -16
- package/docs/cli/data.md +105 -0
- package/docs/cli/function.md +2 -0
- package/docs/cli/secret.md +6 -6
- package/docs/cli/tailordb.md +18 -16
- package/docs/cli/user.md +37 -7
- package/docs/cli/workspace.md +10 -2
- package/docs/cli-reference.md +25 -3
- package/docs/configuration.md +28 -6
- package/docs/github-actions.md +212 -63
- package/docs/multi-environment.md +24 -0
- package/docs/plugin/custom.md +2 -1
- package/docs/services/auth.md +20 -0
- package/docs/services/executor.md +2 -2
- package/docs/services/idp.md +6 -1
- package/docs/services/resolver.md +3 -1
- package/docs/services/staticwebsite.md +5 -5
- package/docs/services/tailordb-migration.md +222 -41
- package/docs/services/tailordb.md +17 -4
- package/docs/testing.md +4 -0
- package/package.json +18 -18
- package/dist/application-ChqHuhZW.mjs +0 -1
- package/dist/application-DS0XKBtK.mjs +0 -200
- package/dist/application-DS0XKBtK.mjs.map +0 -1
- package/dist/crashreport-CBaRJl5h.mjs +0 -1
- package/dist/date-Dri6Yas-.mjs +0 -2
- package/dist/date-Dri6Yas-.mjs.map +0 -1
- package/dist/kysely-type-RDX59E1j.mjs +0 -48
- package/dist/kysely-type-RDX59E1j.mjs.map +0 -1
- package/dist/logger-Db-YRTwK.mjs +0 -9
- package/dist/logger-Db-YRTwK.mjs.map +0 -1
- package/dist/package-json-CmqhDJ__.mjs +0 -1
- package/dist/register-ts-hook-BuwkLuxC.mjs +0 -925
- package/dist/register-ts-hook-BuwkLuxC.mjs.map +0 -1
- package/dist/schema-CRtAmDcl.mjs.map +0 -1
- package/dist/secretmanager-5olfnI1b.mjs.map +0 -1
- package/dist/service-Bx-7Lz06.mjs +0 -1
- package/dist/service-CL1Bp4It.mjs +0 -7
- package/dist/service-CL1Bp4It.mjs.map +0 -1
- package/dist/service_pb-ZClWtj1X.mjs +0 -2
- package/dist/service_pb-ZClWtj1X.mjs.map +0 -1
- package/dist/service_pb-dB3RrGeh.mjs +0 -1
- package/dist/telemetry-DXHP3VVi.mjs +0 -1
- package/dist/workspace_resource_pb-CxR_6fyN.mjs.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,149 @@
|
|
|
1
1
|
# @tailor-platform/sdk
|
|
2
2
|
|
|
3
|
+
## 2.28.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#2589](https://github.com/tailor-platform/sdk/pull/2589) [`4bf9fd5`](https://github.com/tailor-platform/sdk/commit/4bf9fd5cae3b240f39647002adfdb55b93afb15b) Thanks [@dqn](https://github.com/dqn)! - Default to JSON output when an AI coding agent such as Claude Code, Codex, Cursor, or Gemini CLI runs `tailor`, so the agent reads parseable output even without the bundled agent skill, and start `--help` with guidance for the agent. Pass `--json=false` or set `TAILOR_JSON_OUTPUT=false` to keep table output under an agent, or set `POLITTY_NO_AGENT=1` to turn agent detection off. CLI plugins keep their current output.
|
|
8
|
+
|
|
9
|
+
- [#2595](https://github.com/tailor-platform/sdk/pull/2595) [`928a0cf`](https://github.com/tailor-platform/sdk/commit/928a0cf2d12deeb680f1319ae5cfc90d3c52873d) Thanks [@toiroakr](https://github.com/toiroakr)! - Add `tailor data clone` to copy the data of an application from one workspace to another, and `tailor data operation get` to check on a started clone or wait for it with `--wait`. It copies the TailorDB namespaces registered in the application's subgraph; `--copy-files` and `--copy-idp-users` also copy TailorDB file content and IdP users. `--name` defaults to the application name in the config file. `data clone` waits for the clone to finish; pass `--no-wait` to start it and exit.
|
|
10
|
+
|
|
11
|
+
- [#2595](https://github.com/tailor-platform/sdk/pull/2595) [`a99be0b`](https://github.com/tailor-platform/sdk/commit/a99be0b905bf95a5057e52e19d146b53a78475cc) Thanks [@toiroakr](https://github.com/toiroakr)! - Add `--clone-timeout` to `tailor tailordb migration test` to set how long `--data clone` waits for the data clone to finish, for example `30s` or `10m`. The default is now 30 minutes, up from 5, and the option is rejected with `--data seed`. If your CI job time limit is shorter than 30 minutes, pass a shorter `--clone-timeout` so the command can time out and delete its temporary workspace before the job is stopped.
|
|
12
|
+
|
|
13
|
+
- [#2595](https://github.com/tailor-platform/sdk/pull/2595) [`a99be0b`](https://github.com/tailor-platform/sdk/commit/a99be0b905bf95a5057e52e19d146b53a78475cc) Thanks [@toiroakr](https://github.com/toiroakr)! - Add `--keep-ttl` to `tailor tailordb migration test` to record an expiry, for example `24h` or `7d`, on the temporary workspace that `--keep` retains, so `tailor workspace prune --expired` can delete it later. It requires `--keep`.
|
|
14
|
+
|
|
15
|
+
- [#2586](https://github.com/tailor-platform/sdk/pull/2586) [`65b793b`](https://github.com/tailor-platform/sdk/commit/65b793b86896b939946851a49cbf65f6465fbee7) Thanks [@dqn](https://github.com/dqn)! - Keep scenario and per-environment seed data side by side as datasets: directories under `<distPath>/data/` holding JSONL rows for some of the tables. `tailor seed apply`, `validate`, and `fill` take `--dataset <name>` (repeatable) to use datasets on top of the base seed data, and `tailor seed dump --dataset <name>` writes into one. `--all-datasets` selects every dataset directory in name order for `apply`, `validate`, and `fill`, including gitignored local datasets and directories added later; it cannot be combined with `--dataset`, and fails if no dataset directories exist. `apply --truncate --all-datasets` keeps the existing truncate scope and confirmation. `validate` checks foreign keys across the base data and the selected datasets and reports an id defined in more than one of them at its own file and line; `apply` rejects such an id before it changes anything. `--no-base` applies or validates the selected datasets alone, so a dump written with `--dataset` restores on its own. Name the combinations you use in the new `datasets` option of `seedPlugin` (for example `datasets: { preview: ["cogs", "shipments"] }`) to select them with one `--dataset`. Projects without datasets work as before, except that `tailor seed apply` now reads all seed rows before truncating or seeding anything, so a malformed file stops the run with the workspace untouched. Naming a dataset directory, or a file in one, as the path of `tailor seed validate` or `fill` points you at `--dataset`.
|
|
16
|
+
|
|
17
|
+
- [#2600](https://github.com/tailor-platform/sdk/pull/2600) [`ea634ba`](https://github.com/tailor-platform/sdk/commit/ea634ba08df767730a1e8f415c87e60dfc4c0300) Thanks [@ikawaha](https://github.com/ikawaha)! - Add the `gapless` option to `.serial()` (preview), which numbers records without gaps: a number is used only by a create that commits.
|
|
18
|
+
|
|
19
|
+
- [#2583](https://github.com/tailor-platform/sdk/pull/2583) [`23b3b36`](https://github.com/tailor-platform/sdk/commit/23b3b363cc09bbf6c48e7d84d8b32068898062dd) Thanks [@dqn](https://github.com/dqn)! - Add `maintenanceMode` to `defineConfig()` to choose whether `tailor deploy` restricts the TailorDB namespaces it migrates while pending migrations run. `"migration"` restricts them (no generated GraphQL create, update, delete, or bulk upsert, and no record events) until the migrations complete, as every deploy did before; `"deploy"` keeps them restricted until the deploy has also applied resolvers, executors, and workflows, so executors from the previous deploy do not receive events from the migrated tables while the deploy replaces them; `false` does not restrict them.
|
|
20
|
+
|
|
21
|
+
Tables that a deploy left restricted after its migrations completed, for example because the deploy was interrupted, no longer make the next deploy stop with remote schema drift; that deploy releases them when it applies its TailorDB changes.
|
|
22
|
+
|
|
23
|
+
Restoring table settings after a failed migration no longer fails for a table whose checkpoint sets `publishEvents: false` while an executor in the same deploy subscribes to it, which left that table restricted.
|
|
24
|
+
|
|
25
|
+
- [#2577](https://github.com/tailor-platform/sdk/pull/2577) [`eab2d88`](https://github.com/tailor-platform/sdk/commit/eab2d8867b4e74c79a31a7f47eaeb958c6381370) Thanks [@dqn](https://github.com/dqn)! - Show how long `tailor deploy` keeps tables in maintenance mode while it applies TailorDB migrations. Deploy now tells waiting for a migration job to start apart from the script running: it reports when the script starts running, how long it waited and ran, and a summary of the whole maintenance window by phase. `tailor deploy --json` returns the same breakdown under `tailordbMaintenance`. Each migration job now logs `[tailor-sdk] migration script started` before the script runs.
|
|
26
|
+
|
|
27
|
+
- [#2579](https://github.com/tailor-platform/sdk/pull/2579) [`a139e89`](https://github.com/tailor-platform/sdk/commit/a139e899b087858677aa9e4cc03bf54e49dba95b) Thanks [@dqn](https://github.com/dqn)! - Add `tailor user update --default-organization-id <id> [--default-folder-id <id>]` to store where `tailor workspace create`, workspace creation during `deploy`, and the programmatic `createWorkspace()` put new workspaces when neither organization nor folder is given. The defaults are kept per user and platform, and any explicit organization or folder, including through `TAILOR_PLATFORM_ORGANIZATION_ID` / `TAILOR_PLATFORM_FOLDER_ID` for CLI commands, replaces both. `deploy --create-workspace` also uses the resolved default location when checking whether an existing workspace matches. `workspace create`, `deploy --create-workspace`, and the programmatic `createWorkspace()` now reject a folder ID without an organization ID with a clear error instead of failing with an internal error.
|
|
28
|
+
|
|
29
|
+
`workspace create` and `deploy` now use organization and folder IDs from `--env-file`, even when no user defaults are stored. Previously these values were ignored; a folder-only env file now fails unless an organization is also given. Command-line options take precedence, and empty env-file values are treated as not given.
|
|
30
|
+
|
|
31
|
+
### Patch Changes
|
|
32
|
+
|
|
33
|
+
- [#2609](https://github.com/tailor-platform/sdk/pull/2609) [`1c36c61`](https://github.com/tailor-platform/sdk/commit/1c36c618e9c4ad2ee4373a5962c8ea278e9aac07) Thanks [@toiroakr](https://github.com/toiroakr)! - `tailor deploy` now warns when an IdP `permission` rule allows every authenticated user (a condition on `_loggedIn`, such as `[{ user: "_loggedIn" }, "=", true]`, as its only condition). Such a rule lets any signed-in user run that operation against any IdP user, for example reading and changing login information such as email addresses or sending password reset emails to anyone. The deploy still succeeds; restrict the rule to an administrator role unless every user who can sign in is trusted.
|
|
34
|
+
|
|
35
|
+
- [#2588](https://github.com/tailor-platform/sdk/pull/2588) [`3de270f`](https://github.com/tailor-platform/sdk/commit/3de270f6bb1d75b74ed4d277593f0e70ecc2b59b) Thanks [@dqn](https://github.com/dqn)! - Update `@politty/zod` to 0.4.3. A positional argument is no longer accepted under its own name as an option, so pass the value positionally: `tailor profile create dev`, not `tailor profile create --name dev`. Most commands report such an option as unknown; a few, such as `tailor completion` and `npm create @tailor-platform/sdk`, only warn and ignore it. `tailor secret vault create --name`, `tailor secret vault delete --name`, and `tailor tailordb truncate --tables`, which the documentation and earlier release notes use, still accept both forms. Mixing the two forms, as in `tailor tailordb truncate --tables User Order`, is rejected; repeat the option for each table, as in `--tables User --tables Order`.
|
|
36
|
+
|
|
37
|
+
- [#2578](https://github.com/tailor-platform/sdk/pull/2578) [`b57a21f`](https://github.com/tailor-platform/sdk/commit/b57a21f9b6e16d6e3a87e19f7504429a41988a9c) Thanks [@dqn](https://github.com/dqn)! - Keep settings that a newer SDK version wrote to the CLI config file (`~/.config/tailor-platform/config.yaml`) when this version rewrites the file, for example after logging in or refreshing a token, instead of silently dropping them.
|
|
38
|
+
|
|
39
|
+
- [#2580](https://github.com/tailor-platform/sdk/pull/2580) [`9c54e51`](https://github.com/tailor-platform/sdk/commit/9c54e516264276dd453d6ad3b546452c830b4006) Thanks [@dqn](https://github.com/dqn)! - Clarify in `tailor workspace prune --help` and error suggestions that location options must be given on the command line and that the defaults from `tailor user update` are not used. Warn before an unscoped sweep that every visible workspace is a candidate for the name and age filters, including with `--yes` or `--dry-run`.
|
|
40
|
+
|
|
41
|
+
- [#2612](https://github.com/tailor-platform/sdk/pull/2612) [`34a67e3`](https://github.com/tailor-platform/sdk/commit/34a67e33a34533bd62f34b7e5bc358c2448eb038) Thanks [@toiroakr](https://github.com/toiroakr)! - Reject `.serial()` on fields inside `db.object()`. TailorDB cannot number a serial field nested in an object, so a create that omitted the value failed with an internal error. It is now a type error, and a build that still defines one fails; remove `.serial()` from the nested field (or move the field out of the object) to upgrade.
|
|
42
|
+
|
|
43
|
+
- [#2556](https://github.com/tailor-platform/sdk/pull/2556) [`56abcc9`](https://github.com/tailor-platform/sdk/commit/56abcc9a063ca90c4561d908c1975296227a3480) Thanks [@renovate](https://github.com/apps/renovate)! - fix(deps): update @inquirer
|
|
44
|
+
|
|
45
|
+
- [#2604](https://github.com/tailor-platform/sdk/pull/2604) [`4dde6ea`](https://github.com/tailor-platform/sdk/commit/4dde6ea565c97b1bfbdc8606bd0c565d25af6623) Thanks [@renovate](https://github.com/apps/renovate)! - chore(deps): update dependency @types/node to v24.19.2
|
|
46
|
+
|
|
47
|
+
- [#2607](https://github.com/tailor-platform/sdk/pull/2607) [`b517e0a`](https://github.com/tailor-platform/sdk/commit/b517e0aeede87d34eb518b79c5cfdd8378eb0e50) Thanks [@renovate](https://github.com/apps/renovate)! - fix(deps): update dependency @napi-rs/keyring to v2.1.1
|
|
48
|
+
|
|
49
|
+
- [#2611](https://github.com/tailor-platform/sdk/pull/2611) [`938f418`](https://github.com/tailor-platform/sdk/commit/938f418c4d847402e579f458f1e3ef3941906288) Thanks [@renovate](https://github.com/apps/renovate)! - fix(deps): update rolldown
|
|
50
|
+
|
|
51
|
+
## 2.27.0
|
|
52
|
+
|
|
53
|
+
### Minor Changes
|
|
54
|
+
|
|
55
|
+
- [#2570](https://github.com/tailor-platform/sdk/pull/2570) [`80624d1`](https://github.com/tailor-platform/sdk/commit/80624d199d1b035f2c127e3aeadc7ebd68c61fd7) Thanks [@dqn](https://github.com/dqn)! - `@tailor-platform/sdk/cli` now exports `WORKSPACE_NAME_MAX_LENGTH`, the maximum number of characters in a workspace name, so plugins can size names derived from a workspace name without hardcoding the limit.
|
|
56
|
+
|
|
57
|
+
- [#2526](https://github.com/tailor-platform/sdk/pull/2526) [`95952c9`](https://github.com/tailor-platform/sdk/commit/95952c9125aa22dbc264de7731073713acfd0ec4) Thanks [@toiroakr](https://github.com/toiroakr)! - Add `defaultDateRepresentation` to `defineConfig()`. Setting it to `"temporal"` gives `t.date()`, `t.datetime()`, and `t.time()` fields that omit `as` Temporal values (`Temporal.PlainDate`, `Temporal.Instant`, `Temporal.PlainTime`) instead of strings, so a project can use Temporal everywhere without repeating `as: "temporal"`; `"date"` gives them `Date` values the same way. A field's own `as`, including `as: "string"`, still takes precedence; `db.*` fields are unaffected. Run `tailor generate` after changing the setting so `tailor.d.ts` updates the field types.
|
|
58
|
+
|
|
59
|
+
The default is applied in every bundled function (resolvers, executors, workflow jobs, auth hooks, TailorDB hooks and validators, migration scripts), in `tailor function run`, and in the `tailor-runtime` Vitest environment when `tailorRuntime({ config })` points at the config (the config is read once when Vitest starts; a missing or unparsable config, or a value other than `"temporal"` or `"date"`, fails the run, while a config that throws while loading prints a warning and keeps string values, as it already does for secrets). Under `"temporal"`, every resolver bundle keeps the Temporal conversion, so `.parse()` on a field declared inside `body` works too. Each migration records the representation in effect when its script was generated and keeps running with it; a migration generated under `"temporal"` or `"date"` is written as format version 8, which older SDK versions refuse to read, and every generated `migrate.test.ts` scaffold calls the new `applyDateRepresentation` helper from `@tailor-platform/sdk/vitest` with the recorded value (`"string"` when none is recorded) before importing the script, so the test runs it with the same values (tests of `"temporal"` migrations run in the `tailor-runtime` Vitest environment, which provides `Temporal`). `tailor.d.ts` now declares the setting per application, keyed by the application name; when several applications' `tailor.d.ts` files are included in one TypeScript program and disagree, calling a date builder without `as` is a type error until they are aligned.
|
|
60
|
+
|
|
61
|
+
For projects that never set the option: `t.date()`/`t.datetime()`/`t.time()` now record `as: "default"` (and an explicit `as: "string"`) in their metadata, `tailor.d.ts` gains a `DateRepresentationRegistry` entry (`"<app>": "unset"`), and the resolver, executor, workflow job, and auth hook bundle caches are rebuilt once on the next deploy.
|
|
62
|
+
|
|
63
|
+
- [#2573](https://github.com/tailor-platform/sdk/pull/2573) [`66a8d86`](https://github.com/tailor-platform/sdk/commit/66a8d86dbb00a1d47288d8079be17aed34010573) Thanks [@dqn](https://github.com/dqn)! - Show why each function execution failed in `tailor function logs`. Every execution now includes `errorKind` (`USER_RUNTIME`, `USER_NON_RUNTIME`, `PLATFORM`, `NONE`, or `UNSPECIFIED`), `errorName`, and `errorMessage`, so the list tells you whether a failure came from your code or the Platform without opening each execution. The list table shows `errorKind` and `errorName`; `--json` and the execution details also include `errorMessage`.
|
|
64
|
+
|
|
65
|
+
- [#2551](https://github.com/tailor-platform/sdk/pull/2551) [`5c17144`](https://github.com/tailor-platform/sdk/commit/5c17144578950729f5a7c34b9258b55b00e48b84) Thanks [@k1LoW](https://github.com/k1LoW)! - Expose when a Built-in IdP user's password was last set. The runtime `idp.Client` `User` records now include `passwordUpdatedAt` (an ISO 8601 string, or `null` for users without a password), and the Auth `beforeLogin` hook claims are typed with `password_updated_at` (seconds since the Unix epoch), so applications can enforce their own password expiration.
|
|
66
|
+
|
|
67
|
+
- [#2566](https://github.com/tailor-platform/sdk/pull/2566) [`0a7a369`](https://github.com/tailor-platform/sdk/commit/0a7a369f0f4b67f36367fa6d5d0ff627b2390a31) Thanks [@toiroakr](https://github.com/toiroakr)! - Add `tailor deploy --migration-skip-steps <namespace>/<step>,...` to skip the steps of a multi-step TailorDB migration that already succeeded when a changed step list makes the migration run every step again, and make the warning shown in that case list the steps that already succeeded and say how to skip them
|
|
68
|
+
|
|
69
|
+
- [#2546](https://github.com/tailor-platform/sdk/pull/2546) [`613d6a4`](https://github.com/tailor-platform/sdk/commit/613d6a44a81612e6311b5f88514dc5451ffc13ef) Thanks [@toiroakr](https://github.com/toiroakr)! - `tailor tailordb migration generate` and `tailor tailordb migration script` now scaffold `migrate.ts` as a multi-step script that exports `steps`. It has one step for each schema change that needs a data migration, and steps that touch the same field are ordered with `dependsOn`. `migration script --with-test` writes the test scaffolds against `steps` when `migrate.ts` exports it.
|
|
70
|
+
|
|
71
|
+
Where a generated `migrate.ts` leaves a value or logic for you to decide, such as what an added required field holds in existing records, it now calls `TODO(message)` from `./db` instead of writing `null` next to a `// TODO:` comment or a `never` annotation. The migration fails at that call, and `tailor tailordb migration validate` and `tailor deploy` reject a `migrate.ts` that still calls it before anything is changed. `tailor deploy` also rejects a `migrate.ts` that still carries the `TODO(tailor-migration-review)` marker earlier versions generated, which only `migration validate` checked before.
|
|
72
|
+
|
|
73
|
+
- [#2504](https://github.com/tailor-platform/sdk/pull/2504) [`b7cbbb4`](https://github.com/tailor-platform/sdk/commit/b7cbbb43efe5550c439fc0a9e7886c7f3fa38d8e) Thanks [@dqn](https://github.com/dqn)! - A TailorDB migration script can now export `steps` instead of `main` to split its data migration into steps. Each step runs as its own job in its own transaction, so a long migration is no longer bound by a single job's execution-time limit, and `dependsOn` declares which steps must complete before another starts.
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
import type { MigrationSteps } from "./db";
|
|
77
|
+
|
|
78
|
+
export const steps = {
|
|
79
|
+
backfillInvoice: {
|
|
80
|
+
run: async (trx) => {
|
|
81
|
+
/* ... */
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
recomputeTotals: {
|
|
85
|
+
dependsOn: ["backfillInvoice"],
|
|
86
|
+
run: async (trx, { env }) => {
|
|
87
|
+
/* ... */
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
} satisfies MigrationSteps;
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
When a step fails after other steps completed, `tailor deploy` keeps the migration in progress instead of rolling it back: the next deploy resumes it from the steps that have not completed, and `tailordb migration status` reports it. A script with a single step runs like a `main` script, in one transaction: a failure inside it rolls its data changes back, and a failure in the post-migration schema changes restores the schema while the next deploy runs the step again. Steps must be safe to run again. `runMigrationSteps` in `@tailor-platform/sdk/vitest` runs `steps` in tests the same way. Scripts that export `main` behave as before; a script that exports both runs `main` and warns that `steps` is ignored.
|
|
94
|
+
|
|
95
|
+
### Patch Changes
|
|
96
|
+
|
|
97
|
+
- [#2549](https://github.com/tailor-platform/sdk/pull/2549) [`736faf2`](https://github.com/tailor-platform/sdk/commit/736faf28ab95b3b2dbe380495c3ae6c06554ee09) Thanks [@toiroakr](https://github.com/toiroakr)! - Document that `tailor deploy --json` writes exactly one JSON object to stdout and sends progress and diagnostics to stderr, and that deploy plugins report through `ctx.logger` and `ctx.exec` to keep that output parseable.
|
|
98
|
+
|
|
99
|
+
- [#2582](https://github.com/tailor-platform/sdk/pull/2582) [`169a486`](https://github.com/tailor-platform/sdk/commit/169a48643ab4b21ec00ca2e89bc302cc0505ac88) Thanks [@dqn](https://github.com/dqn)! - `tailor function logs <execution-id>` no longer shows a stray `: ` in the error when its name or message is empty. An execution the Platform aborted because of its own deadline or cancellation, which has no error name, now shows just its message.
|
|
100
|
+
|
|
101
|
+
- [#2550](https://github.com/tailor-platform/sdk/pull/2550) [`18e4dfb`](https://github.com/tailor-platform/sdk/commit/18e4dfbc042582663124d4d70c286ef33e72ee45) Thanks [@toiroakr](https://github.com/toiroakr)! - Restrict the `defineIdp` permission examples in the docs, the `IdPPermission` JSDoc, the `example` project and the `static-web-site` template to an administrator role, and warn in the IdP docs that a `_loggedIn` policy lets every authenticated user read and change other users' login information and send password reset emails
|
|
102
|
+
|
|
103
|
+
- [#2531](https://github.com/tailor-platform/sdk/pull/2531) [`fb86a11`](https://github.com/tailor-platform/sdk/commit/fb86a11bdc8b044044eaba3b6206d6cd475891d6) Thanks [@haru0017](https://github.com/haru0017)! - Correct the job function timeout in the Executor service docs to 5 minutes.
|
|
104
|
+
|
|
105
|
+
- [#2569](https://github.com/tailor-platform/sdk/pull/2569) [`80cbc74`](https://github.com/tailor-platform/sdk/commit/80cbc747a4e2389b943d826fcbb616eaea961b93) Thanks [@toiroakr](https://github.com/toiroakr)! - Stop disabling the GraphQL `read` operation of a table while `tailor deploy` applies a TailorDB migration. Create, update, delete, and bulk upsert are still disabled and record events are still not published. `read` keeps the table's live setting when the restrictions begin, and a table that a migration touches then follows that migration's schema, so a migration that changes `read` changes it before its script runs
|
|
106
|
+
|
|
107
|
+
- [#2562](https://github.com/tailor-platform/sdk/pull/2562) [`892a813`](https://github.com/tailor-platform/sdk/commit/892a813a2d1dade41e1572a623be039c6dfc0480) Thanks [@dqn](https://github.com/dqn)! - When `tailor deploy` cannot confirm whether a TailorDB migration that runs in one transaction (a script that exports `main`, or `steps` with a single step) started or finished, it no longer removes the run and rolls back the migration's schema changes while the script may still be running. It reports the outcome as unconfirmed, keeps the namespace in maintenance mode, and explains how to check the run and settle the migration. A later deploy refuses to run the migration again while that run is still executing. While the script runs, the deploy now keeps waiting while the platform is temporarily unavailable instead of giving up.
|
|
108
|
+
|
|
109
|
+
- [#2566](https://github.com/tailor-platform/sdk/pull/2566) [`8405305`](https://github.com/tailor-platform/sdk/commit/8405305b7a4942760362f73f629ab684169c31d4) Thanks [@toiroakr](https://github.com/toiroakr)! - Make `tailor deploy` report which TailorDB tables stay restricted when a failed migration cannot be fully restored or rolled back, and give recovery steps and `--json` error context for a skipped restoration after a checkpoint conflict or an unverifiable checkpoint
|
|
110
|
+
|
|
111
|
+
- [#2559](https://github.com/tailor-platform/sdk/pull/2559) [`cf8da6b`](https://github.com/tailor-platform/sdk/commit/cf8da6bb32d065559ba211dbfe338f3952ec1b2a) Thanks [@toiroakr](https://github.com/toiroakr)! - `tailor tailordb migration test` no longer fails when the source namespace was deployed without a migration label (for example, before it adopted SDK migrations). Like `tailor deploy`, it treats the namespace as being at migration 0 and tests 0001 onward, provided the namespace's schema matches the 0000 snapshot; otherwise it fails and shows the differences.
|
|
112
|
+
|
|
113
|
+
- [#2539](https://github.com/tailor-platform/sdk/pull/2539) [`228487c`](https://github.com/tailor-platform/sdk/commit/228487c73fa75d9d6729bbb92f4181dd89c2aa4b) Thanks [@toiroakr](https://github.com/toiroakr)! - List the workspace regions in `tailor workspace create --help` in the order the Platform returns them (`asia-northeast, us-west`)
|
|
114
|
+
|
|
115
|
+
- [#2509](https://github.com/tailor-platform/sdk/pull/2509) [`54f95b9`](https://github.com/tailor-platform/sdk/commit/54f95b91dc1aad1561b93ab9f57a1f7c4a7342c2) Thanks [@renovate](https://github.com/apps/renovate)! - chore(deps): update dependency @types/node to v24.19.1
|
|
116
|
+
|
|
117
|
+
- [#2521](https://github.com/tailor-platform/sdk/pull/2521) [`1910e15`](https://github.com/tailor-platform/sdk/commit/1910e15409751bd72e3837d1fb65986574e833be) Thanks [@renovate](https://github.com/apps/renovate)! - fix(deps): update dependency @bufbuild/protobuf to v2.16.0
|
|
118
|
+
|
|
119
|
+
- [#2524](https://github.com/tailor-platform/sdk/pull/2524) [`9210a2d`](https://github.com/tailor-platform/sdk/commit/9210a2d15c98a6b29a4c7bd23015abb21c4a0614) Thanks [@renovate](https://github.com/apps/renovate)! - fix(deps): update dependency @toiroakr/lines-db to v0.14.0
|
|
120
|
+
|
|
121
|
+
- [#2528](https://github.com/tailor-platform/sdk/pull/2528) [`d8c2825`](https://github.com/tailor-platform/sdk/commit/d8c2825e95ad5a7b4cc8af6a44ae461a31e0e9f8) Thanks [@renovate](https://github.com/apps/renovate)! - fix(deps): update secretlint monorepo to v13.0.7
|
|
122
|
+
|
|
123
|
+
- [#2535](https://github.com/tailor-platform/sdk/pull/2535) [`75b61a0`](https://github.com/tailor-platform/sdk/commit/75b61a053e9ce836d64893b2e20586cf48a71a30) Thanks [@renovate](https://github.com/apps/renovate)! - fix(deps): update dependency globals to v17.13.0
|
|
124
|
+
|
|
125
|
+
- [#2536](https://github.com/tailor-platform/sdk/pull/2536) [`248ea98`](https://github.com/tailor-platform/sdk/commit/248ea98c49ae47cdc0d552dbe6678c6bbc5d841c) Thanks [@renovate](https://github.com/apps/renovate)! - fix(deps): update dependency oxc-parser to v0.152.0
|
|
126
|
+
|
|
127
|
+
- [#2537](https://github.com/tailor-platform/sdk/pull/2537) [`a99da7d`](https://github.com/tailor-platform/sdk/commit/a99da7d38ea7b3e092c7ceab43018e276ae75267) Thanks [@renovate](https://github.com/apps/renovate)! - fix(deps): update dependency std-env to v4.3.0
|
|
128
|
+
|
|
129
|
+
- [#2540](https://github.com/tailor-platform/sdk/pull/2540) [`0d8bc9c`](https://github.com/tailor-platform/sdk/commit/0d8bc9c6a92ae4d2934780e8684ca2221fa5ec2c) Thanks [@renovate](https://github.com/apps/renovate)! - fix(deps): update dependency @toiroakr/lines-db to v0.15.0
|
|
130
|
+
|
|
131
|
+
- [#2543](https://github.com/tailor-platform/sdk/pull/2543) [`2547d99`](https://github.com/tailor-platform/sdk/commit/2547d99b4214378c21e41ded77633414776a04c2) Thanks [@toiroakr](https://github.com/toiroakr)! - `fillSeedData` (`tailor seed fill`) now refuses to write any file when a seed JSONL file was changed by another tool after the fill read it, instead of overwriting that change, and fills the first row of a file that starts with a byte order mark instead of skipping it
|
|
132
|
+
|
|
133
|
+
- [#2538](https://github.com/tailor-platform/sdk/pull/2538) [`7485f14`](https://github.com/tailor-platform/sdk/commit/7485f14cc0087dd4dc30f5b390358c31fa6d8e80) Thanks [@toiroakr](https://github.com/toiroakr)! - `tailor setup ci env` and the GitHub Actions guide now tell an organization or folder admin to create the platform machine user in the Tailor Console and grant it a role, and say that without the required permission you cannot view or create machine users, instead of telling you to contact Tailor support
|
|
134
|
+
|
|
135
|
+
- [#2570](https://github.com/tailor-platform/sdk/pull/2570) [`88e17e9`](https://github.com/tailor-platform/sdk/commit/88e17e9013f19e216bdc5c99208c032eded1fe06) Thanks [@dqn](https://github.com/dqn)! - `tailor setup ci preview` now rejects a name longer than 50 characters. Each pull request's preview workspace is named `<name>-pr-<number>`, which must fit in 63 characters, so a longer name made preview deploys fail once pull request numbers grew (from the first pull request for names of 59 characters or more). A preview workflow already recorded in `.github/tailor.lock` under a longer name still regenerates, for example with `tailor setup update`, with a warning naming the first pull request number whose preview deploy fails.
|
|
136
|
+
|
|
137
|
+
- [#2571](https://github.com/tailor-platform/sdk/pull/2571) [`d6527ca`](https://github.com/tailor-platform/sdk/commit/d6527cab6209968cb50ef0802cb48c6e5a3003b9) Thanks [@dqn](https://github.com/dqn)! - `tailor setup ci preview` now cancels the whole superseded preview run, including the jobs you added with `needs: tailor-preview-deploy`, so they no longer keep running against a preview workspace that a newer run is redeploying or that closing the pull request deletes. Run `tailor setup update` to regenerate existing preview workflows; a top-level `concurrency:` you already set in one is kept in place of the new default.
|
|
138
|
+
|
|
139
|
+
- [#2574](https://github.com/tailor-platform/sdk/pull/2574) [`e2619b3`](https://github.com/tailor-platform/sdk/commit/e2619b3a01a362ef588d4e9da300c666bc6e2491) Thanks [@dqn](https://github.com/dqn)! - `tailor setup ci branch` and `tailor setup ci preview` now generate a final job, `tailor-result` and `tailor-preview-result`, whose check (such as `tailor-result (my-app)`) reports whether the whole workflow passed, so branch protection needs only that one check instead of every job. It fails when a job it needs failed or was cancelled and passes when they succeeded or were skipped. Add your own jobs, such as end-to-end tests or a matrix job, to its `needs` to make them count; regenerating the workflow keeps them, and `tailor setup check` does not report them as hand edits.
|
|
140
|
+
|
|
141
|
+
Run `tailor setup update` to add the job to existing workflows with the flags they were generated with; `tailor setup check` reports them as outdated until then. If every managed job uses the same `runs-on` you set, for example self-hosted runners, the new job uses it too; otherwise, set it on the new job yourself.
|
|
142
|
+
|
|
143
|
+
- [#2546](https://github.com/tailor-platform/sdk/pull/2546) [`649ca55`](https://github.com/tailor-platform/sdk/commit/649ca55a614941dd3c0d382a510f47add4ba3d6d) Thanks [@toiroakr](https://github.com/toiroakr)! - When `tailor deploy` loses the response to starting a TailorDB migration that runs in one transaction (a script that exports `main`, or `steps` with a single step), it now waits for the migration that the platform started instead of removing it and rolling the schema back while it runs.
|
|
144
|
+
|
|
145
|
+
- [#2504](https://github.com/tailor-platform/sdk/pull/2504) [`13143fd`](https://github.com/tailor-platform/sdk/commit/13143fd168bfd9a313e347f4c7666f4ad0ee1ace) Thanks [@dqn](https://github.com/dqn)! - Starting a workflow, from `tailor workflow start` or for a TailorDB migration during `tailor deploy`, is no longer retried after a transient platform error, because the retry could start a second execution.
|
|
146
|
+
|
|
3
147
|
## 2.26.0
|
|
4
148
|
|
|
5
149
|
### Minor Changes
|
|
@@ -26,8 +26,10 @@ Use these files as the single source of truth:
|
|
|
26
26
|
1. Prefer SDK docs above assumptions. If behavior is unclear, cite the exact doc path used.
|
|
27
27
|
2. Keep examples compatible with Node.js 22+.
|
|
28
28
|
3. For CLI questions, verify command and option names from `docs/cli-reference.md` and `docs/cli/*.md`.
|
|
29
|
-
4. When running CLI commands,
|
|
30
|
-
|
|
29
|
+
4. When running CLI commands, parse the JSON instead of the table output, which is formatted for
|
|
30
|
+
humans and may change. The CLI defaults to JSON when it detects an AI coding agent; if a command
|
|
31
|
+
still prints a table (an undetected agent, or a CLI plugin command), set `TAILOR_JSON_OUTPUT=true`
|
|
32
|
+
or pass `--json`. Use `--help-json` for machine-readable help.
|
|
31
33
|
5. For configuration questions, validate examples against `docs/configuration.md` and related service docs.
|
|
32
34
|
|
|
33
35
|
## Quick Navigation
|