Repository navigation
Update dependency @tailor-platform/sdk to v2.28.0 - #128
Merged
Merged
Conversation
renovate
Bot
force-pushed
the
renovate/tailor-platform-sdk-2.x
branch
2 times, most recently
from
October 5, 2026 05:57
6c16898 to
c0b7482
Compare
renovate
Bot
force-pushed
the
renovate/tailor-platform-sdk-2.x
branch
from
October 6, 2026 10:10
c0b7482 to
f146730
Compare
renovate
Bot
force-pushed
the
renovate/tailor-platform-sdk-2.x
branch
from
October 13, 2026 04:49
f146730 to
55ef1c6
Compare
renovate
Bot
force-pushed
the
renovate/tailor-platform-sdk-2.x
branch
2 times, most recently
from
October 15, 2026 16:29
9b23892 to
f3d87c9
Compare
jackchuka
approved these changes
Oct 19, 2026
jackchuka
left a comment
Member
There was a problem hiding this comment.
@tailor-platform/sdk 2.22.0 → 2.28.0 (minor). Additive; generate/typecheck/lint/format pass in all steps. Note CLI behavior changes (JSON output under AI agents, non-zero exit on declined prompt). Safe to merge.
renovate
Bot
force-pushed
the
renovate/tailor-platform-sdk-2.x
branch
2 times, most recently
from
October 19, 2026 01:50
c8a89ed to
6811afe
Compare
renovate
Bot
force-pushed
the
renovate/tailor-platform-sdk-2.x
branch
from
October 19, 2026 01:52
6811afe to
6082898
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
2.22.0→2.28.0Release Notes
tailor-platform/sdk (@tailor-platform/sdk)
v2.28.0Compare Source
Minor Changes
#2589
4bf9fd5Thanks @dqn! - Default to JSON output when an AI coding agent such as Claude Code, Codex, Cursor, or Gemini CLI runstailor, so the agent reads parseable output even without the bundled agent skill, and start--helpwith guidance for the agent. Pass--json=falseor setTAILOR_JSON_OUTPUT=falseto keep table output under an agent, or setPOLITTY_NO_AGENT=1to turn agent detection off. CLI plugins keep their current output.#2595
928a0cfThanks @toiroakr! - Addtailor data cloneto copy the data of an application from one workspace to another, andtailor data operation getto check on a started clone or wait for it with--wait. It copies the TailorDB namespaces registered in the application's subgraph;--copy-filesand--copy-idp-usersalso copy TailorDB file content and IdP users.--namedefaults to the application name in the config file.data clonewaits for the clone to finish; pass--no-waitto start it and exit.#2595
a99be0bThanks @toiroakr! - Add--clone-timeouttotailor tailordb migration testto set how long--data clonewaits for the data clone to finish, for example30sor10m. 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-timeoutso the command can time out and delete its temporary workspace before the job is stopped.#2595
a99be0bThanks @toiroakr! - Add--keep-ttltotailor tailordb migration testto record an expiry, for example24hor7d, on the temporary workspace that--keepretains, sotailor workspace prune --expiredcan delete it later. It requires--keep.#2586
65b793bThanks @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, andfilltake--dataset <name>(repeatable) to use datasets on top of the base seed data, andtailor seed dump --dataset <name>writes into one.--all-datasetsselects every dataset directory in name order forapply,validate, andfill, including gitignored local datasets and directories added later; it cannot be combined with--dataset, and fails if no dataset directories exist.apply --truncate --all-datasetskeeps the existing truncate scope and confirmation.validatechecks 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;applyrejects such an id before it changes anything.--no-baseapplies or validates the selected datasets alone, so a dump written with--datasetrestores on its own. Name the combinations you use in the newdatasetsoption ofseedPlugin(for exampledatasets: { preview: ["cogs", "shipments"] }) to select them with one--dataset. Projects without datasets work as before, except thattailor seed applynow 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 oftailor seed validateorfillpoints you at--dataset.#2600
ea634baThanks @ikawaha! - Add thegaplessoption to.serial()(preview), which numbers records without gaps: a number is used only by a create that commits.#2583
23b3b36Thanks @dqn! - AddmaintenanceModetodefineConfig()to choose whethertailor deployrestricts 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;falsedoes not restrict them.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.
Restoring table settings after a failed migration no longer fails for a table whose checkpoint sets
publishEvents: falsewhile an executor in the same deploy subscribes to it, which left that table restricted.#2577
eab2d88Thanks @dqn! - Show how longtailor deploykeeps 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 --jsonreturns the same breakdown undertailordbMaintenance. Each migration job now logs[tailor-sdk] migration script startedbefore the script runs.#2579
a139e89Thanks @dqn! - Addtailor user update --default-organization-id <id> [--default-folder-id <id>]to store wheretailor workspace create, workspace creation duringdeploy, and the programmaticcreateWorkspace()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 throughTAILOR_PLATFORM_ORGANIZATION_ID/TAILOR_PLATFORM_FOLDER_IDfor CLI commands, replaces both.deploy --create-workspacealso uses the resolved default location when checking whether an existing workspace matches.workspace create,deploy --create-workspace, and the programmaticcreateWorkspace()now reject a folder ID without an organization ID with a clear error instead of failing with an internal error.workspace createanddeploynow 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.Patch Changes
#2609
1c36c61Thanks @toiroakr! -tailor deploynow warns when an IdPpermissionrule 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.#2588
3de270fThanks @dqn! - Update@politty/zodto 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, nottailor profile create --name dev. Most commands report such an option as unknown; a few, such astailor completionandnpm create @tailor-platform/sdk, only warn and ignore it.tailor secret vault create --name,tailor secret vault delete --name, andtailor tailordb truncate --tables, which the documentation and earlier release notes use, still accept both forms. Mixing the two forms, as intailor tailordb truncate --tables User Order, is rejected; repeat the option for each table, as in--tables User --tables Order.#2578
b57a21fThanks @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.#2580
9c54e51Thanks @dqn! - Clarify intailor workspace prune --helpand error suggestions that location options must be given on the command line and that the defaults fromtailor user updateare not used. Warn before an unscoped sweep that every visible workspace is a candidate for the name and age filters, including with--yesor--dry-run.#2612
34a67e3Thanks @toiroakr! - Reject.serial()on fields insidedb.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.#2556
56abcc9Thanks @renovate! - fix(deps): update @inquirer#2604
4dde6eaThanks @renovate! - chore(deps): update dependency @types/node to v24.19.2#2607
b517e0aThanks @renovate! - fix(deps): update dependency @napi-rs/keyring to v2.1.1#2611
938f418Thanks @renovate! - fix(deps): update rolldownv2.27.0Compare Source
Minor Changes
#2570
80624d1Thanks @dqn! -@tailor-platform/sdk/clinow exportsWORKSPACE_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.#2526
95952c9Thanks @toiroakr! - AdddefaultDateRepresentationtodefineConfig(). Setting it to"temporal"givest.date(),t.datetime(), andt.time()fields that omitasTemporal values (Temporal.PlainDate,Temporal.Instant,Temporal.PlainTime) instead of strings, so a project can use Temporal everywhere without repeatingas: "temporal";"date"gives themDatevalues the same way. A field's ownas, includingas: "string", still takes precedence;db.*fields are unaffected. Runtailor generateafter changing the setting sotailor.d.tsupdates the field types.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 thetailor-runtimeVitest environment whentailorRuntime({ 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 insidebodyworks 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 generatedmigrate.test.tsscaffold calls the newapplyDateRepresentationhelper from@tailor-platform/sdk/vitestwith 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 thetailor-runtimeVitest environment, which providesTemporal).tailor.d.tsnow declares the setting per application, keyed by the application name; when several applications'tailor.d.tsfiles are included in one TypeScript program and disagree, calling a date builder withoutasis a type error until they are aligned.For projects that never set the option:
t.date()/t.datetime()/t.time()now recordas: "default"(and an explicitas: "string") in their metadata,tailor.d.tsgains aDateRepresentationRegistryentry ("<app>": "unset"), and the resolver, executor, workflow job, and auth hook bundle caches are rebuilt once on the next deploy.#2573
66a8d86Thanks @dqn! - Show why each function execution failed intailor function logs. Every execution now includeserrorKind(USER_RUNTIME,USER_NON_RUNTIME,PLATFORM,NONE, orUNSPECIFIED),errorName, anderrorMessage, so the list tells you whether a failure came from your code or the Platform without opening each execution. The list table showserrorKindanderrorName;--jsonand the execution details also includeerrorMessage.#2551
5c17144Thanks @k1LoW! - Expose when a Built-in IdP user's password was last set. The runtimeidp.ClientUserrecords now includepasswordUpdatedAt(an ISO 8601 string, ornullfor users without a password), and the AuthbeforeLoginhook claims are typed withpassword_updated_at(seconds since the Unix epoch), so applications can enforce their own password expiration.#2566
0a7a369Thanks @toiroakr! - Addtailor 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#2546
613d6a4Thanks @toiroakr! -tailor tailordb migration generateandtailor tailordb migration scriptnow scaffoldmigrate.tsas a multi-step script that exportssteps. It has one step for each schema change that needs a data migration, and steps that touch the same field are ordered withdependsOn.migration script --with-testwrites the test scaffolds againststepswhenmigrate.tsexports it.Where a generated
migrate.tsleaves a value or logic for you to decide, such as what an added required field holds in existing records, it now callsTODO(message)from./dbinstead of writingnullnext to a// TODO:comment or aneverannotation. The migration fails at that call, andtailor tailordb migration validateandtailor deployreject amigrate.tsthat still calls it before anything is changed.tailor deployalso rejects amigrate.tsthat still carries theTODO(tailor-migration-review)marker earlier versions generated, which onlymigration validatechecked before.#2504
b7cbbb4Thanks @dqn! - A TailorDB migration script can now exportstepsinstead ofmainto 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, anddependsOndeclares which steps must complete before another starts.When a step fails after other steps completed,
tailor deploykeeps the migration in progress instead of rolling it back: the next deploy resumes it from the steps that have not completed, andtailordb migration statusreports it. A script with a single step runs like amainscript, 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.runMigrationStepsin@tailor-platform/sdk/vitestrunsstepsin tests the same way. Scripts that exportmainbehave as before; a script that exports both runsmainand warns thatstepsis ignored.Patch Changes
#2549
736faf2Thanks @toiroakr! - Document thattailor deploy --jsonwrites exactly one JSON object to stdout and sends progress and diagnostics to stderr, and that deploy plugins report throughctx.loggerandctx.execto keep that output parseable.#2582
169a486Thanks @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.#2550
18e4dfbThanks @toiroakr! - Restrict thedefineIdppermission examples in the docs, theIdPPermissionJSDoc, theexampleproject and thestatic-web-sitetemplate to an administrator role, and warn in the IdP docs that a_loggedInpolicy lets every authenticated user read and change other users' login information and send password reset emails#2531
fb86a11Thanks @haru0017! - Correct the job function timeout in the Executor service docs to 5 minutes.#2569
80cbc74Thanks @toiroakr! - Stop disabling the GraphQLreadoperation of a table whiletailor deployapplies a TailorDB migration. Create, update, delete, and bulk upsert are still disabled and record events are still not published.readkeeps 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 changesreadchanges it before its script runs#2562
892a813Thanks @dqn! - Whentailor deploycannot confirm whether a TailorDB migration that runs in one transaction (a script that exportsmain, orstepswith 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.#2566
8405305Thanks @toiroakr! - Maketailor deployreport which TailorDB tables stay restricted when a failed migration cannot be fully restored or rolled back, and give recovery steps and--jsonerror context for a skipped restoration after a checkpoint conflict or an unverifiable checkpoint#2559
cf8da6bThanks @toiroakr! -tailor tailordb migration testno longer fails when the source namespace was deployed without a migration label (for example, before it adopted SDK migrations). Liketailor 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.#2539
228487cThanks @toiroakr! - List the workspace regions intailor workspace create --helpin the order the Platform returns them (asia-northeast, us-west)#2509
54f95b9Thanks @renovate! - chore(deps): update dependency @types/node to v24.19.1#2521
1910e15Thanks @renovate! - fix(deps): update dependency @bufbuild/protobuf to v2.16.0#2524
9210a2dThanks @renovate! - fix(deps): update dependency @toiroakr/lines-db to v0.14.0#2528
d8c2825Thanks @renovate! - fix(deps): update secretlint monorepo to v13.0.7#2535
75b61a0Thanks @renovate! - fix(deps): update dependency globals to v17.13.0#2536
248ea98Thanks @renovate! - fix(deps): update dependency oxc-parser to v0.152.0#2537
a99da7dThanks @renovate! - fix(deps): update dependency std-env to v4.3.0#2540
0d8bc9cThanks @renovate! - fix(deps): update dependency @toiroakr/lines-db to v0.15.0#2543
2547d99Thanks @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#2538
7485f14Thanks @toiroakr! -tailor setup ci envand 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#2570
88e17e9Thanks @dqn! -tailor setup ci previewnow 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.lockunder a longer name still regenerates, for example withtailor setup update, with a warning naming the first pull request number whose preview deploy fails.#2571
d6527caThanks @dqn! -tailor setup ci previewnow cancels the whole superseded preview run, including the jobs you added withneeds: 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. Runtailor setup updateto regenerate existing preview workflows; a top-levelconcurrency:you already set in one is kept in place of the new default.#2574
e2619b3Thanks @dqn! -tailor setup ci branchandtailor setup ci previewnow generate a final job,tailor-resultandtailor-preview-result, whose check (such astailor-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 itsneedsto make them count; regenerating the workflow keeps them, andtailor setup checkdoes not report them as hand edits.Run
tailor setup updateto add the job to existing workflows with the flags they were generated with;tailor setup checkreports them as outdated until then. If every managed job uses the sameruns-onyou set, for example self-hosted runners, the new job uses it too; otherwise, set it on the new job yourself.#2546
649ca55Thanks @toiroakr! - Whentailor deployloses the response to starting a TailorDB migration that runs in one transaction (a script that exportsmain, orstepswith 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.#2504
13143fdThanks @dqn! - Starting a workflow, fromtailor workflow startor for a TailorDB migration duringtailor deploy, is no longer retried after a transient platform error, because the retry could start a second execution.v2.26.0Compare Source
Minor Changes
#2525
d21806eThanks @dqn! - These state-changing commands now print a JSON result on stdout under--jsoninstead of leaving it empty:authconnection delete,authconnection revoke,organization folder delete,secret create,secret update,secret delete,secret vault delete,workspace delete,workspace restore,workspace user remove,tailordb truncate,tailordb migration set,tailordb migration rebaseline,tailordb migration sync, andtailordb migration generate. Each result carries the samechangedboolean as the other commands: for example,tailordb migration setto the checkpoint and migration history ID already in place, andtailordb migration generatewith no migration to write, reportfalse. Under--json,tailordb migration generateandtailordb migration scriptno longer open the file they create in the editor set byVISUALorEDITOR, which would otherwise write to the same stdout. Output without--jsonis unchanged.#2470
090297dThanks @toiroakr! - Add atemporaloption tokyselyTypePlugin. When enabled,date/datetimefields and top-leveltimefields resolve toTemporal.PlainDate/Temporal.Instant/Temporal.PlainTime(instead ofDate/string) in generated Kysely types, migrationdb.tsfiles, andtailor function scripttypes, and the generatedgetDB()reads them back as those values. Nestedtimefields remain strings. The mode is fixed by the plugin setting;getDB()takes notemporaloption.Each migration records whether its
db.tswas generated with Temporal types, and deploy runs that migration's script in the same mode, so migrations generated beforetemporalwas enabled keep receivingDatevalues. Migration files are now written as format version 7, which older SDK versions refuse to read.mockTailordbWithPGliteandcreateKyselyPGlite(with{ temporal: true }) return Temporal values from PGlite to match, and accept Temporal values as query parameters.v2.25.0Compare Source
Minor Changes
#2449
e4a0301Thanks @toiroakr! -tailor openandtailor auth-connection opennow always open the new Tailor Platform Console UI, which has replaced the previous UI atconsole.tailor.tech.tailor openopens/workspaces/{workspaceId}/services/applications/{applicationName}(previously/workspaces/{workspaceId}/applications/{applicationName}/overview), andtailor auth-connection openopens/workspaces/{workspaceId}/services/auth-connections(previously/workspaces/{workspaceId}/settings/connections). TheTAILOR_CONSOLE_NEXTenvironment variable is no longer read: a leftoverTAILOR_CONSOLE_NEXT=1no longer redirects the console host toconsole-next., so it can be removed.#2468
3c87be0Thanks @toiroakr! - Add an onDeployed plugin hook with deployed application IDs and URLs, public OAuth client IDs, and publishing to static websites. Hooks run after successful deploys, including deploys without resource changes, and can return structured JSON outputs.#2468
7451944Thanks @toiroakr! - AddfrontendPluginfrom@tailor-platform/sdk-plugin-frontendto build and upload frontend assets duringtailor deploy. Frontend builds can use deployed URLs and public OAuth client IDs as environment variables, and deployment results include uploaded frontend details inoutputs.frontends.Add deployment hooks and shared context types to
@tailor-platform/sdk. Successfultailor deploy --jsonresults now includeworkspaceIdandapplicationswith deployed application, Static Website, and AI Gateway URLs, plus public OAuth client IDs, even when no deploy plugins are configured.#2505
3296f08Thanks @dqn! - More state-changing commands now print a JSON result on stdout under--json, so scripts can confirm what changed without parsing stderr:login,logout,remove,profile delete,user switch,user pat delete,secret vault create,authconnection authorize,workspace user invite,workspace user update,workspace ttl set,workspace ttl clear,crashreport send, andtailordb migration script. Each result carries achangedboolean:truewhen the command did work,falsewhen it did nothing, such aslogoutwhen nobody is logged in,user switchto the current user, orworkspace ttl clearon a workspace with no TTL. Output without--jsonis unchanged.#2497
efcca78Thanks @tailor-bobbin! - Include the machine useridintailor machineuser listoutput so machine users can be matched against the invoker id available in resolvers and executors.#2486
caa34b4Thanks @dqn! -tailor secret createandtailor secret updatenow read the secret value from standard input when--valueis omitted, keeping it out of shell history and process listings:printf '%s' "$VALUE" | tailor secret create --vault-name <vault> --name <name>. The piped value can be up to 128 KiB, and one trailing newline is removed from it. Without--value, a terminal or empty standard input fails withSECRET_VALUE_REQUIRED.#2485
d06f314Thanks @dqn! -tailor show(and the programmaticshow()) now also lists each deployed static website defined instaticWebsiteswith its URL and description, and each deployed OAuth2 client defined inauth'soauth2Clientswith its client ID, so a CI step can read both from onetailor show --jsoncall right aftertailor deploy. Client secrets are never included. Credentials that cannot list OAuth2 clients, such as the workspace viewer role, get a warning andoauth2Clients: null, which sets that case apart from an application with no deployed OAuth2 clients.Patch Changes
#2487
d160c86Thanks @dqn! - Declining a confirmation prompt now makes the command exit non-zero with a*_CANCELLEDerror code, astailor deployandtailor removealready did, instead of exiting 0 as if the operation had succeeded. This coversworkspace delete/restore/prune,workspace user remove,organization folder delete,secret create/update/delete,secret vault delete,authconnection delete/revoke,tailordb truncate, andtailordb migration generate/set/sync/rebaseline. For example,tailor workspace deletereportsWORKSPACE_DELETION_CANCELLEDwhen the entered name does not match, andtailor tailordb migration generatestill generates the other namespaces before reportingMIGRATION_GENERATE_CANCELLEDfor the ones whose breaking changes were declined. Confirmation prompts appear only in an interactive terminal, so runs with--yes, in CI, or with--jsonare unaffected.migrateGenerate()now rejects withMIGRATION_GENERATE_CANCELLEDwhen its prompt is declined, instead of resolving or exiting the process.#2484
7454455Thanks @dqn! -tailor initnow exits non-zero when project scaffolding fails, instead of exiting 0. It reportsINIT_FAILEDwhencreate @tailor-platform/sdkexits with a non-zero code or is terminated by a signal, andINIT_SPAWN_FAILEDwhen the package manager cannot be started.#2488
608b7ebThanks @dqn! - Argument errors now follow--jsonandTAILOR_JSON_OUTPUT. An unknown option or subcommand, or an option value that fails validation, was printed as plain text even when JSON output was requested, because it happened before the flag took effect. It is now reported as the usual JSON error envelope on stderr with the codeINVALID_ARGUMENTS, for example{"error":{"code":"INVALID_ARGUMENTS","message":"Unknown flags: bogus"}}.--verbosenow also applies to these errors, adding the stack trace to the envelope or to the plain-text output, as it does for other failures. Otherwise, output without JSON mode is unchanged.#2506
69b3234Thanks @dqn! - List commands now say when--limitcut their output short. When more items exist than--limitallows, the list is followed byMore results exist beyond --limit N. Raise --limit to see more.on stderr, so a caller can tell a complete list from a partial one; stdout, including--jsonoutput, is unchanged. This matters most forexecutor jobs,function logs, andworkflow executions, which list 50 items unless--limitsays otherwise.#2492
46590a4Thanks @renovate! - fix(deps): update oxc#2515
ef00996Thanks @renovate! - chore(deps): lock file maintenance#2517
3220bc9Thanks @renovate! - fix(deps): update dependency rolldown to v1.2.12#2483
ae6451eThanks @toiroakr! -tailor setup ci branch,tailor setup ci tag, andtailor setup ci previewaccept--dirmore than once. The generated workflow deploys every app to the same workspace in one multi-config run from the repository root, runs the generate check for each app directory (plus seed validation and the migration drift check on branch and tag workflows), and runs its jobs on changes under any of them.--nameis required when--diris repeated, and the rootpackage.jsonmust declare@tailor-platform/sdk. With--erd-preview, each TailorDB namespace is previewed from the app that owns it.tailor setup ci branchandtailor setup ci previewalso accept--paths(repeatable) to run the generated jobs on changes outside the app directories, such as a frontend or shared packages. A pattern supports*,**, and a leading!to exclude paths; other glob characters are rejected.Branch and preview workflows with an app directory other than the repository root no longer filter their
on:triggers bypaths. Branch workflows start on every pull request and push, preview workflows on every pull request, and a newtailor-changesjob skips the plan, deploy, and preview jobs when nothing under the app directories (or--paths) changed. Skipped jobs report success, so these checks can be required in branch protection. If thetailor-changesjob itself fails, those jobs fail instead of being skipped, so a required check cannot pass without them.setupremains a beta command, so this ships as an immediate change rather than going through a deprecation cycle.Branch workflows generated with
--erd-previewnow install the project dependencies before building the ERD preview, which the setup step does not do.The workflow template version is bumped, so
tailor setup checkreports every generated target as outdated; runtailor setup updateto regenerate them. Branch and preview workflows whose--diris not the repository root switch to thetailor-changesjob described above, and branch workflows generated with--erd-previewget the new ERD matrix and install step. Other workflows regenerate identically.tailor setup updatekeeps every app directory and--pathspattern of a multi-directory target.#2489
16175f6Thanks @toiroakr! - You can addenvironment:to a managed job thattailor setup cigenerates without one (tailor-tag-guard, and thetailor-erd-preview*jobs from--erd-preview), so a step you added there can read that GitHub Environment's secrets, such as a token for installing dependencies from a private registry.tailor setup checkno longer reports it as a hand edit, and re-runningtailor setup cikeeps it. Theenvironment:oftailor-plan,tailor-deploy, and the preview jobs still comes from--environment.v2.24.0Compare Source
Minor Changes
#2459
72e295bThanks @toiroakr! - When a resolver, executor, or workflow job fails to build withFORBIDDEN_RUNTIME_GLOBALbecause it references a Node-only global such asprocessorBuffer, the error now names where the reference is: the file in your own code, or the installed package (code undernode_modules). A reference from an installed package can be allowed with the newbuildOptions.allowedRuntimeGlobalsoption ofdefineConfig(), keyed by package name, with the globals to allow ortruefor all of them — for examplebuildOptions: { allowedRuntimeGlobals: { "@ai-sdk/gateway": ["Buffer"] } }— once you have confirmed that the package's code referencing it never runs for your use. The error's suggestion shows the entry to add.buildOptions.allowedRuntimeGlobalshas no effect on your own code.#2463
f708521Thanks @toiroakr! -defineConfig()acceptsbuildOptions, which groups the settings that control how resolvers, executors, workflow jobs, and other functions are bundled:inlineSourcemap,logLevel, andallowedRuntimeGlobals. The top-levelinlineSourcemapandlogLevelstill work but are deprecated and will be removed in v3;tailor upgrademoves them intobuildOptionswith thev3/define-config-build-optionscodemod. Setting the same option both at the top level and inbuildOptionsfails config validation instead of silently using one of them.Patch Changes
#2475
10ab737Thanks @toiroakr! - Generated deploy jobs now expose the deployed workspace as job outputs, so a job of your own can useneeds:to run tests or deploy extra assets against it:tailor setup ci preview: thetailor-preview-deployjob exposesworkspace-id,workspace-name, andapp-urlof the per-PR workspace.tailor setup ci branchandtailor setup ci tag: thetailor-deployjob exposesworkspace-idandapp-url.tailor setup checkreports the template as outdated; runtailor setup updateto regenerate every target.#2464
978c332Thanks @renovate! - fix(deps): update secretlint monorepo to v13.0.6#2465
d8222e4Thanks @renovate! - chore(deps): update dependency @types/node to v24.19.0#2458
e982853Thanks @toiroakr! - Deploying a resolver, executor, or workflow no longer fails withFORBIDDEN_RUNTIME_GLOBALfor a Node-only global such asprocessthat is only used after checking that it exists — for exampleif (typeof process !== "undefined") { ... process.env.FOO ... }, an early exit such asif (typeof process === "undefined") return;followed byprocess.env.FOO, ortypeof process < "u" && process.emitWarning(message). A global used without such a check is still reported — for example theBuffer.from(...)inside@ai-sdk/gateway, which the Vercel AI SDK (ai) depends on.#2457
be6ffb2Thanks @toiroakr! - Fixworkflow.start()and job.start()calls that built and deployed but threw "workflow.start() is rewritten at build time and unavailable in the bundle" at runtime. These calls are now rewritten when:tsconfig.jsoncompilerOptions.pathsalias (e.g.import workflow from "@/workflow/syncGLBalances")createWorkflow()(e.g.export default module.workflows.syncGLBalances.create(mainJob)); wrapping the helper result in anothercreateWorkflow({ ...helperResult, name: "..." })call is no longer neededimport * as wf from "./workflows/sync"; wf.default.start(...))A
.start()call on an import from a workflow file that still cannot be rewritten — such as a helper-created workflow exported under a named export — now fails the build instead of deploying code that throws at runtime. The runtime error for an unrewrittenworkflow.start()also names the workflow.v2.23.0Compare Source
Minor Changes
e2df6cfThanks @dqn! -tailor deploynow marks updates that show no configuration difference and are applied again only because the application's resources were last deployed with a different SDK version. The plan lists them with[forced by SDK version]and the summary counts them (12 to update (11 forced by SDK version)), so after an SDK upgrade you can tell them apart from real configuration changes. With--json, such changes carryforcedBySdkVersion: trueandsummary.forcedBySdkVersioncounts them.Patch Changes
#2442
4a974b1Thanks @dqn! - Fix thetailor deployplan leaving out workflow execution policies: their changes are now listed in the Workflow section, and unmanaged or conflicting execution policies and applications now appear in the plan's warnings and owner conflicts, including--jsonoutput.#2462 [
551179a](https://redirecConfiguration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.