Skip to content

10.0.0

Latest

Choose a tag to compare

@sorccu sorccu released this 26 Oct 19:34
· 1 commit to main since this release
4f88d60

Checkly CLI version 10 makes deploys safer and the CLI predictable for scripts, CI and AI agents.

  • checkly deploy shows a plan of what will change, property by property, before it writes anything. It can write changes made in the Checkly web app back into your code, or refuse to overwrite them.
  • A deploy no longer runs your checks unless you ask, and it sets every property from your code.
  • stdout carries only a command's result, and exit codes tell usage errors, failures and pending confirmations apart.
  • checkly login works anywhere, including over SSH and for AI agents.
  • Any checkly runs your project's own installed version.
  • APIs that were deprecated during 9.x are removed.
npm install --save-dev checkly@latest

Read Breaking changes before you upgrade a project or a CI pipeline.

Breaking changes

checkly deploy plans every deploy

Before it writes anything, a deploy now asks Checkly what would change, and then applies exactly that plan. Resources that did not change are no longer written. If someone changes your Checkly account between the plan and the deploy, the deploy is refused. A forced run makes a new plan; a run pinned with --plan-token stops. See Deploy plans below for what the plan shows.

  • Use --no-plan to deploy without a plan, as 9.x did: every resource is written.
  • The first planned deploy of a project, and the first one after a --no-plan deploy, has nothing earlier to compare with. It writes every existing resource once to set a baseline. Resources that show no difference are marked = and counted under to set a baseline; resources that differ are listed as ~ updates with their diff. Later deploys show only what changed.
  • A deploy with nothing to change no longer asks for confirmation, even in CI or agent mode without --force. It prints No changes., ends with Project "<name>" is up to date. and exits with code 0.

Checks are no longer scheduled after a deploy unless you ask

In 9.x, every deploy ran all checks right away. In CLI version 10, a deploy schedules no checks unless you pass --schedule-on-deploy. Even then it schedules only the checks the deploy created or updated.

Flag What it does
--schedule-on-deploy Turns post-deploy scheduling on. It is off by default.
--schedule-on-deploy-scope=changed|all changed (the default) schedules only the checks the deploy created or updated. all also schedules the unchanged ones, as 9.x did.
--schedule-on-deploy-threshold=<n|auto> Schedules nothing if the deploy would schedule more than n checks. Heartbeat monitors don't count. auto lets Checkly choose (currently 500, and at most 2000).
--schedule-on-deploy-min-frequency=<n|auto> Skips checks that run more often than every n minutes, because they will run again soon. 0 schedules every check. auto lets Checkly choose (currently 10).

To get the closest match to the 9.x behaviour:

npx checkly deploy --schedule-on-deploy --schedule-on-deploy-scope=all --schedule-on-deploy-min-frequency=0

Checkly applies the threshold to every CLI version, so a deploy of more than 500 checks also needs --schedule-on-deploy-threshold.

If you pass a --schedule-on-deploy-* option without --schedule-on-deploy, the deploy fails with an error. This makes scripts that tuned scheduling fail visibly instead of quietly scheduling nothing. After the deploy, the CLI tells you how many checks it did not schedule and why.

A deploy sets every property from your code

In 9.x, a few properties were left alone by a deploy when your code did not set them, so a value set in the Checkly web app survived every deploy. A deploy now sends a value for all of them, and a value that only exists in the web app is reset on your next deploy unless your code sets it:

Resource Property Value when your code does not set it
Checks and CheckGroupV1 retryStrategy API, browser and multistep checks and CheckGroupV1: one immediate retry in another location, the same retry they got before. Monitors: no retries. PlaywrightCheck: none, because Playwright handles retries.
Checks description, intent, aiAutoRepairEnabled No description and no intent; automatic repair follows the account setting.
Alert channels sendRecovery, sendFailure, sendDegraded, sslExpiry, sslExpiryThreshold true, true, false, false, 30
PrivateLocation proxyUrl No proxy.
Dashboard customUrl, customDomain, logo, favicon, link, header, description Empty.
MaintenanceWindow timezone, repeatEndsAt UTC (a time zone set in the web app is reset; if the maintenance is active at the time, the deploy fails until it ends) and no end date.

A PlaywrightCheck that you remove from its group in code is now also removed from the group in Checkly. Before, it stayed in the group.

The deploy plan shows each value it would reset before you apply it, and in a terminal it offers to write the value into your code first. Because of this, the first plan after upgrading may list many resources as updates, with the note payload format changed (CLI upgrade).

Only results go to stdout

stdout now carries only a command's result: tables, JSON, check results, run summaries and final outcomes such as Successfully deployed …. Everything else goes to stderr: spinners, progress, warnings, hints, next steps, human-readable errors, prompts, and the plan shown before Apply these changes?. A terminal shows both, so nothing changes when you watch the output, but checkly <command> --output json | jq and checkly test > results.txt now get clean output.

  • init, import and create-checkly print their progress and next steps to stderr.
  • login prints its URL, code and waiting notes to stderr.
  • login, logout, switch, create-checkly and a login that another command starts now ask questions only when stdin and stderr are terminals. In 9.x, login, logout and switch always asked, and create-checkly asked only when stdout was a terminal. Now a piped stdout (| tee log.txt) still gets the questions, but a redirected stderr (2> file) does not.

Exit codes

Exit code Meaning What changed
0 Success checkly test and pw-test no longer exit 0 when they find no checks to run; see below.
1 Failure checkly init in agent or CI mode now exits 1 when it fails (it exited 0). checkly account plan <key> with an unknown key, cancelling the login account prompt, and a failed skills file read or write now exit 1 (they exited 2).
2 Invalid flag or argument Invalid flag and argument values, and flags that cannot be combined, now exit 2 across commands (many exited 1).
3 Confirmation required In agent and CI mode, a command that stops for confirmation (deploy, destroy, checks delete, …) now exits 3 instead of 2. The confirmation_required JSON is unchanged.
  • checkly test fails when it finds no checks to run, for example when nothing matches a file filter, --grep or --tags, as trigger and checks run already did. Pass --no-fail-on-no-matching to exit 0 instead. --list still exits 0. checkly pw-test also exits 1 when it finds no checks to run.
  • A second Ctrl+C now stops the CLI with SIGINT (exit status 130 in a shell) instead of exiting with 1.
  • checkly rules is removed and exits with 127; see Other removals.

Reports and agent output

  • Timed-out checks: a check that the CLI stopped waiting for (--timeout) is now reported as timed out instead of failed; it may still finish in Checkly. The list and ci reporters show it with ⏱ and count it separately, dot prints T, github shows ⏱️ Timed out, and json reports "result": "Timed out". Scripts that look for "result": "Fail" should also match "Timed out", or use the exit code, which is still 1.
  • checkly init in agent mode now prints { "status": "success", … } or { "status": "error", "message": … }, like login, instead of success: true | false and error.

CI detection

  • Jenkins, TeamCity and AWS CodeBuild are now detected as CI. There, a deploy without --force prints the confirmation JSON instead of showing a prompt nobody can answer.
  • CI=false (or 0, no, off) now turns off CI mode everywhere, including on GitHub Actions and GitLab CI.
  • With no reporter configured, the default is now ci in CI and when an AI agent runs the CLI, and list otherwise. Agents used to get list outside CI. Configs created by checkly init and the create-checkly boilerplate templates no longer pin reporters: ['list'].

Credentials are fixed once the CLI has authenticated

CHECKLY_API_KEY, CHECKLY_ACCOUNT_ID, CHECKLY_ENV, CHECKLY_API_URL and CHECKLY_MQTT_URL can no longer change during a run. Before, a check file or config that loaded another .env file could switch the account partway through, causing Forbidden errors or requests to a different account. The CLI now keeps the values it authenticated with and prints a warning if one changes. To use another account, set it before the CLI starts: on the command line, in your shell, or in the .env file of the directory you run the CLI from.

AgenticCheck is removed

Agentic Checks are being retired and stop running on December 1, 2026. CLI version 10 no longer includes AgenticCheck, so a project that still defines one fails to load. Use a BrowserCheck or MultiStepCheck with aiAutoRepairEnabled: true instead. Removing an AgenticCheck from your code deletes that check on your next deploy. To keep managing Agentic Checks as code until they stop running, stay on 9.x.

doubleCheck is removed

doubleCheck is no longer accepted on checks, check groups or the checks defaults in checkly.config.ts. Use retryStrategy:

  • Replace doubleCheck: true with RetryStrategyBuilder.singleRetry({ baseBackoffSeconds: 0, sameRegion: false }). This is one immediate retry from a different region, and also what API, browser and multistep checks get when they set no retry strategy. A bare singleRetry() is not the same: it waits 60 seconds and retries in the same region.
  • Replace doubleCheck: false with RetryStrategyBuilder.noRetries().

groupId and groupName are removed

Use group instead:

// Before
new ApiCheck('api', { name: 'API', request, groupId: myGroup.ref() })
new PlaywrightCheck('e2e', { name: 'E2E', playwrightConfigPath, groupName: 'My Group' })

// After
new ApiCheck('api', { name: 'API', request, group: myGroup })
new PlaywrightCheck('e2e', { name: 'E2E', playwrightConfigPath, group: myGroup })

groupName is also removed from playwrightChecks entries in checkly.config.ts. Pass group there as well, with a group declared in the config or CheckGroupV2.fromId().

shouldFail works only on ApiCheck, UrlMonitor and TcpMonitor

These are the types the Checkly web app supports it for. On any other type, shouldFail is now an error, even shouldFail: false, and so are checks.browserChecks.shouldFail and checks.multiStepChecks.shouldFail in checkly.config.ts. A project-wide checks.shouldFail default now applies only to these three types.

Note

Every other check that inherited shouldFail: true from checks.shouldFail is deployed with false after you upgrade, so its pass/fail result flips. This includes Browser, Multistep and Playwright checks, and all other monitor types. The deploy plan shows this change.

Other removals

These APIs were deprecated in 9.x and are now removed. A removed property that is still passed (from plain JavaScript or through a type cast) is reported as an error with a hint that names the replacement, so it is never dropped silently. A removed method, export or command fails as soon as it is used.

Removed Use instead
ApiCheck localSetupScript / localTearDownScript setupScript: { content: '…' } / tearDownScript: { content: '…' }. Check groups keep these properties for now.
caching in checkly.config.ts runner: { cache: { install: { version: '…' } } } in place of caching.dependencyCache.version. CLI versions before 9.1.0 ignore the new setting, so upgrade every environment that runs the CLI first.
AssertionBuilder.responseTme() AssertionBuilder.responseTime()
checkly rules command checkly skills. checkly rules now exits with code 127.
HeartbeatCheck, TcpCheck (and their …Props types) HeartbeatMonitor, TcpMonitor

Warning

HeartbeatCheck and TcpCheck were never marked as deprecated, so 9.x gave no warning about them. A check file that imports them fails to load.

checkly account usage uses the new usage reports

  • The JSON output has changed:
    • The summary reports totals.creditsUsed instead of totals.credits.used, and no longer includes percentOfBudget, meters or projections.
    • The summary and series report usageTermsIds (a list) instead of usageTermsId.
    • Series rows report creditsUsed and list their accountId and checkType under dimensions. Run counts are included only with --include runs. interval and groupBy (now a list) move to the top level, and warnings is replaced by coverage.gaps.
    • terms prints a list in { data, pagination }, instead of a single term.
  • --from and --to now select an inclusive UTC date range. On terms, they select every term that overlaps the range, instead of the one term that covers --to.
  • --check-type is removed. Use the new --pricing-rule flag to select charges, or series --group-by checkType to break usage down by check type. --group-by now accepts several values, such as account,checkType.
  • account usage terms now prints a table by default. The new account usage term <id> shows one term in detail.
  • The new account usage projections <id> projects a term's credit consumption, replacing the projections that were in the summary.

Upgrade notes

  • Warning for checks without a location: deploy and validate now warn about a check that has no locations and no privateLocations, because Checkly would pick a location for it. Set them on the check or its group, or set a default with checks.locations or checks.privateLocations in checkly.config.ts. This is only a warning: the deploy still goes ahead.
  • --timeout measures run time: in checkly test, trigger and pw-test, --timeout now counts from when a check starts running. On large sessions, Checkly can delay the start of a check, and that wait no longer counts. A check that never starts is reported after --timeout plus 900 seconds.
  • Stricter TypeScript syntax checks: TypeScript files are now parsed with a native parser (see below). A few mistakes that only tsc used to report now fail when deploy, test or pw-test bundles the check, for example const x without a value or await used as a variable name. Code like this would also fail when the check runs.
  • Reinstall if the parser cannot load: if your node_modules lacks the parser's native package (for example after npm install --omit=optional, or when node_modules was copied from another operating system), TypeScript checks fail with an error that says to reinstall your dependencies.
  • Malformed tsconfig.json files are ignored, for example one with a missing comma, as if the file did not exist.

New features

Deploy plans

  • See what changes, property by property. The plan starts with an overview row per changed resource: + create, ~ update, - delete, = set a baseline. Under it, each updated resource gets a coloured diff of its construct, in the same form checkly import writes, with each property's old lines followed directly by its new lines. Changes to scripts and request bodies appear as text diffs. Secrets are named but never shown.
  • Review before you apply. An interactive deploy shows the plan and asks Apply these changes?. --preview prints the plan without deploying and ends with a checkly deploy --plan-token … command that deploys exactly that plan later. The new --dry-run flag prints the plan as JSON for scripts and agents.
  • Write changes made in Checkly back into your code. If someone edited a resource in the web app, the prompt offers Update my code with the changes made in Checkly. This edits your construct files in place, keeping your file's style. It covers every resource type and writes helpers like Frequency.EVERY_5M, RetryStrategyBuilder and AssertionBuilder. Then it stops without deploying, so you can review the changes with git diff. Anything it cannot write safely, such as references, secrets and values built from variables, is listed for you to change by hand.
  • Refuse to overwrite changes made in Checkly. --fail-on-drift deploys nothing and exits 1 when the deploy would overwrite a change made in Checkly since the last planned deploy, such as a property edited in the web app or a resource deleted there. The error lists each affected resource. Set CHECKLY_FAIL_ON_DRIFT=1 to turn it on for a whole pipeline, and --no-fail-on-drift to override it. With --preview, it prints the plan and then fails if there is drift; --dry-run ignores it. It needs a plan: it cannot be combined with --no-plan, and when Checkly cannot make a plan, the deploy fails instead of going ahead unchecked. Resources that the deploy writes only to set a baseline have nothing earlier to compare with, so they get a warning instead.
  • --prune-unmanaged-relations deletes alert channel subscriptions and private location assignments that were added to your checks and groups outside the project. Without it they are kept and listed in the plan.
  • Code bundles and Playwright snapshots are uploaded only after you confirm the deploy. A preview, a dry run or a cancelled deploy uploads nothing.

Your project's checkly runs every command

Running a global checkly, pnpm dlx checkly or npx checkly@<version> in a project with its own checkly install used to fail with Unable to create a construct … outside a Checkly CLI project. From CLI version 10 on, checkly hands the command to the project's own install, like npx checkly in that directory. When the two versions differ, it prints one line saying which version runs. Set CHECKLY_NO_DELEGATION=1 to keep the command on the CLI you started. If the project's install cannot be started, the CLI says so and runs the command itself.

When the error still happens (with a global CLI older than 10.0.0, CHECKLY_NO_DELEGATION=1, Deno, or a project that resolves more than one checkly install), it now names the installs involved and says what to do.

Login that works anywhere, including for AI agents

checkly login now uses a device code. The CLI shows a URL and a short code, and you approve the login in any browser on any device. Login now works over SSH, in dev containers, in cloud coding sessions and in agent sandboxes. New users can sign up on the same page.

  • AI agents get one JSON line with the URL and code to pass on to you. checkly login --wait lets the agent wait for your approval, so you don't have to tell it you are done. If you have several accounts, the agent gets the list and asks you which one to use.
  • Logging in from any command: at a terminal, a command that needs a login now logs you in first instead of failing. CI and other runs without a terminal still fail with an error that points to CHECKLY_API_KEY and CHECKLY_ACCOUNT_ID.
  • Without a browser: pass --no-browser or set CHECKLY_NO_BROWSER=1 to print the login URL instead of opening a browser.
  • checkly logout no longer asks for a confirmation that nobody can give (AI agents, CI, scripts). Before, it exited without logging out.

Working with several accounts

  • Pick an account per command: setting CHECKLY_ACCOUNT_ID while you are logged in, in your shell or a project's .env file, runs commands in that account without changing your default. checkly login no longer refuses to run while it is set, and login, switch and whoami say when it overrides your default.
  • checkly whoami shows your default account, your other accounts, and where the current account comes from. The new --output json flag prints the same information.
  • Clearer account errors: when the account the CLI uses cannot be accessed with your login or API key, the CLI says which account it used, where it came from (CHECKLY_ACCOUNT_ID, your login's default), and what to change, instead of a bare Forbidden or Not Found. When CHECKLY_ACCOUNT_ID names an account your login cannot access, the error lists the accounts it can. When you are logged in, "not found" errors name the account that was searched and say how to look in another one.
  • checkly switch without a terminal (AI agents, CI) no longer shows a menu that nobody can answer. Agents get the list of accounts so they can ask you which one to use, and other runs get an error that lists them.

Test runs

  • --max-failures for test and trigger: --max-failures=<n> stops waiting for results once n checks have failed. The CLI writes its reports, asks Checkly to cancel the test session, and exits 1, so a broken change fails CI early. You can also set cli.maxFailures in checkly.config.ts. Only a check's final result counts, so a check that passes on retry never stops the run. Checks that did not finish are reported as Not finished, and the json reporter adds a stoppedEarly field. Cancelling is best effort, so some of those checks may still run in Checkly. --max-failures cannot be combined with --detach, or with --update-snapshots on test.
  • Retries and flaky checks: checkly test, trigger and pw-test now show how many times a check was retried, as in ✔ My check (2 retries), and the GitHub reporter shows the count too. A check that passed only after retrying is also counted as flaky in the summary, and still counts as passed (1 passed, 1 flaky, 1 total). The exit code is unchanged.

Faster TypeScript parsing, and TypeScript 7 support

The CLI now reads TypeScript files with oxc-parser, a native parser. This makes deploy, test and pw-test faster, and they no longer load the TypeScript compiler from your project. Projects that use TypeScript 7 now work, and the deploy plan and write-back don't need TypeScript installed. See the Upgrade notes for the stricter syntax checks.

Constructs

  • MaintenanceWindow has new properties: timezone, pauseAllChecks, silenceAlertsTags and silenceAllAlerts. tags is now optional, and a window that sets none of these four or tags gets a warning, because it affects no checks.
  • gRPC monitors support FlatBuffers through grpcConfig.encoding: 'FLATBUFFERS' and a base64-encoded compiled schema in grpcConfig.bfbsContent.
  • aiAutoRepairEnabled on BrowserCheck and MultiStepCheck now only accepts true, false or null. Other values are reported as errors before the deploy.
  • Bun 1.4: Playwright check suites can use Engine.bun('1.4'), or Engine.bun('1') for the latest Bun 1.x available in Checkly. A project that pins Bun 1.4.x, for example in .bun-version, now runs on Bun 1.4 instead of 1.3. Bun 1.5 or later runs on 1.4, with a notice.

Repository links

When no repository URL is configured, deploys and test runs now fall back to the GitHub Actions repository variables and then to the git origin remote. SSH remotes are converted to HTTPS, and credentials are removed. checkly init writes repoUrl into the config it generates.

Fixes

  • checkly test, trigger and pw-test no longer report a check twice, or end the run early, when its timeout coincides with its result arriving. The timeout also restarts with each retry, so a long series of retries is no longer cut off.
  • checkly test, trigger and pw-test now retry a failed connection for check results, as intended.
  • Pressing Ctrl+C during checkly test, trigger or pw-test no longer crashes the CLI when cancelling the test session fails.
  • checkly deploy no longer fails with Your project could not be deployed. at the Verifying deployed state step when the project is briefly locked on the Checkly side. It now waits and tries again up to three times.
  • The deploy confirmation only says that resources removed from code will be deleted when the deploy actually deletes some.
  • A successful deploy no longer crashes when the ping URL of a heartbeat monitor cannot be retrieved. It prints a warning instead.
  • A logicalId longer than 255 characters is now reported by validation, naming the construct, instead of failing the whole deploy with a database error.
  • Checks no longer fail to bundle when a TypeScript file uses an accessor class field.
  • checkly api keeps binary responses byte for byte, so downloaded ZIP files are no longer corrupted. A JSON response that is a plain string or null is now printed correctly, and --jq gives a clear error for a response that is not JSON.
  • checkly init now works in an empty folder for AI agents and in CI: it creates a package.json instead of exiting without doing anything.
  • checkly init now installs the agent skill when the agent reports a versioned name, as recent Claude Code versions do.
  • Each construct is now attributed to the file that declares it, not to the first check file that imported it. This affects the source file shown in the deploy plan, checkly test <file> filtering, --list grouping, and relative entrypoint paths for checks declared in shared modules, which are now also looked up next to that module.
  • checkly import round-trips more resources correctly: empty alert settings, zero retry backoff, frequencies that no constant covers, group concurrency, and project-level defaults.
  • In agent mode, the CLI now tells Checkly that its requests come from an AI agent. Checkly uses this to clean up import plans that an agent started and never committed.

All pull requests

Show the 94 pull requests in this release
  • fix(cli): install the agent skill when AI_AGENT carries a version suffix by @hlenke in #1485
  • ci: run the test workflow on pull requests against any base branch [RED-980] [ship] by @sorccu in #1489
  • feat(cli): derive the repo URL from the git remote [ship] by @martzoukos in #1500
  • fix(cli): let agents and CI run init in an empty folder by @hlenke in #1483
  • fix: preserve binary response bytes in api command by @sbezludny in #1502
  • chore(deps): weekly CLI dependency update (2026-10-02) [RED-1005] [ship] by @sorccu in #1503
  • fix(constructs): attribute a construct to the file that declares it [ship] by @sorccu in #1491
  • feat(deploy): preview every deploy and show the property-level diff [ship] by @sorccu in #1486
  • fix(codegen): correct default handling so import round-trips and the deploy preview renders every resource [RED-979] [ship] by @sorccu in #1488
  • feat(deploy): print the preview as a plan with an overview, coloured diffs and totals [RED-981] [ship] by @sorccu in #1490
  • feat(codegen): render Playwright check suites in the deploy preview [ship] by @sorccu in #1492
  • feat(deploy): show the preview before asking to apply, and add --skip-plan [RED-984] [ship] by @sorccu in #1493
  • feat(deploy): offer to write changes made in Checkly back into the code [RED-985] [ship] by @sorccu in #1494
  • feat(deploy): write frequency, retry strategy, alert policy and assertions back into the code [ship] by @sorccu in #1495
  • feat(write-back): write runtimeId and the request of every monitor type [RED-991] [ship] by @sorccu in #1496
  • feat(write-back): hold the rule table to every construct prop at build time [RED-992] [ship] by @sorccu in #1497
  • feat(write-back): update the code of every resource type, not only checks and groups [RED-997] [ship] by @sorccu in #1498
  • feat(deploy): plan a deploy only under --plan [RED-1016] [ship] by @sorccu in #1501
  • feat(grpc): support FlatBuffers monitor constructs [RED-800] [ship] by @danielpaulus in #1487
  • feat(deploy): say what a first plan writes again, and why [RED-1055] [ship] by @sorccu in #1505
  • fix(deploy): list the resources a first plan updates, and say why in one line [RED-1055] [ship] by @sorccu in #1506
  • feat(cli): add timezone and pause/silence scope to maintenance windows [RED-1015] [ship] by @shiini2 in #1466
  • ci(check-ai-context): comment only on a skills/ mismatch and keep one sticky comment [RED-1057] [ship] by @sorccu in #1507
  • ci(check-ai-context): fail on untracked files in skills/ [RED-1061] [ship] by @sorccu in #1508
  • feat(cli): add --schedule-on-deploy-threshold to deploy [RED-1080] [ship] by @sorccu in #1509
  • feat(cli): device-flow login for agents, remote shells and inline auth [show] by @hlenke in #1484
  • fix(constructs): validate automatic repair settings [ship] by @thebiglabasky in #1511
  • feat(cli): add --schedule-on-deploy-min-frequency to deploy [RED-1082] [ship] by @sorccu in #1510
  • ci(release): support release candidate versions [RED-1099] [ship] by @sorccu in #1512
  • feat(deploy)!: plan every deploy by default, with --no-plan to opt out [RED-1100] [ship] by @sorccu in #1513
  • feat(constructs)!: restrict shouldFail to ApiCheck, UrlMonitor and TcpMonitor [RED-1104] [ship] by @sorccu in #1514
  • feat(constructs)!: remove the AgenticCheck construct [RED-1108] [ship] by @sorccu in #1517
  • feat(constructs)!: remove the misspelled AssertionBuilder.responseTme() alias [RED-1113] [ship] by @sorccu in #1518
  • feat(cli)!: remove the deprecated checkly rules command [RED-1115] [ship] by @sorccu in #1519
  • feat(constructs)!: remove the HeartbeatCheck and TcpCheck aliases [RED-1116] [ship] by @sorccu in #1520
  • feat(config)!: remove the caching.dependencyCache.version option [RED-1114] [ship] by @sorccu in #1521
  • feat(constructs)!: remove the doubleCheck property [RED-1110] [ship] by @sorccu in #1523
  • feat(constructs)!: remove the deprecated groupId and groupName props [RED-1111] [ship] by @sorccu in #1524
  • feat(constructs): warn when a deployed check has no location [RED-1117] [ship] by @sorccu in #1525
  • feat(constructs)!: remove ApiCheck localSetupScript and localTearDownScript [RED-1112] [ship] by @sorccu in #1522
  • feat(deploy)!: schedule only the changed checks after a deploy [RED-1103] [ship] by @sorccu in #1515
  • fix(cli): report a check once when its timeout races an in-flight result [RED-1119] [ship] by @hlenke in #1499
  • feat(deploy)!: make --schedule-on-deploy opt-in [RED-1120] [ship] by @sorccu in #1526
  • fix(cli): exclude server-side scheduling delay from the per-check timeout [RED-814] [ship] by @sorccu in #1421
  • fix(cli): name a refused reference the way the construct spells it [RED-1121] [ship] by @sorccu in #1527
  • feat(cli): pair the old and new lines of each property in the construct diff [RED-1138] [ship] by @sorccu in #1534
  • feat(cli): list the resources a plan writes to set a baseline apart from its updates [RED-1140] [ship] by @sorccu in #1535
  • fix(cli): retry a dry-run deploy while the project is busy [RED-1125] [ship] by @sorccu in #1536
  • chore(deps): weekly CLI dependency update (2026-10-13) [RED-1137] [ship] by @sorccu in #1537
  • fix(cli): only say a deploy deletes removed resources when it does [RED-1156] [ship] by @sorccu in #1539
  • fix(cli): print the notice of an update the plan reports by cause alone [RED-1143] [ship] by @sorccu in #1540
  • fix(cli): parse dependencies of TypeScript accessor class fields [RED-1158] [ship] by @sorccu in #1541
  • perf(cli): parse TypeScript dependencies with oxc-parser [RED-1160] [ship] by @danielpaulus in #1533
  • feat(cli): let multi-account users act on another account per command [RED-1122] [ship] by @hlenke in #1528
  • fix(cli): remove a PlaywrightCheck from its group when deploy drops it [RED-1173] [ship] by @sorccu in #1544
  • fix(cli): send a default retry strategy and always turn doubleCheck off [RED-1174] [ship] by @sorccu in #1545
  • feat(cli)!: migrate account usage commands to v2 by @sbezludny in #1542
  • test(e2e): speed up device-flow login e2e on Windows by setting SHELL [RED-1187] [ship] by @sorccu in #1546
  • fix(cli): await mqtt.connectAsync so connection retries actually run [ship] by @hlenke in #1548
  • fix(cli): send the default of an alert channel flag, a proxy URL and dashboard text when unset [RED-1190] [ship] by @sorccu in #1551
  • fix(cli): reject construct logicalIds longer than Checkly stores [RED-1161] [ship] by @sorccu in #1547
  • feat(constructs)!: a deploy owns a check's intent and automatic repair setting [RED-1193] [ship] by @sorccu in #1553
  • feat(constructs): a maintenance window's timezone defaults to UTC [RED-1195] [ship] by @sorccu in #1554
  • fix(cli): await heartbeat ping URLs and catch failed session cancels [ship] by @hlenke in #1552
  • feat(cli): parse write-back and deploy preview sources with oxc-parser [RED-1162] [ship] by @sorccu in #1543
  • feat(cli): declare agent runs via x-checkly-source: AGENT [ship] by @martzoukos in #1412
  • test: keep tests from re-initialising the repository through a leaked GIT_DIR [RED-1200] [ship] by @sorccu in #1555
  • test(e2e): give the checks get suite room for a slow API response [RED-1202] [ship] by @sorccu in #1556
  • test(e2e): kill the login CLI directly instead of its process tree [RED-1142] [ship] by @sorccu in #1538
  • fix(cli): pin credentials and endpoints once authentication passes [RED-338] [ship] by @sorccu in #1559
  • fix(cli)!: fail test when no checks match, and unify CI detection [ship] by @hlenke in #1558
  • chore(deps): weekly CLI dependency update (2026-10-23) [RED-1218] [ship] by @sorccu in #1560
  • feat(cli): add --max-failures to test and trigger [RED-1227] [ship] by @sorccu in #1561
  • fix(cli): explain inaccessible accounts instead of bare 403/404 errors [RED-1239] [ship] by @sorccu in #1562
  • feat(cli): run project commands with the project's own checkly install [RED-757] [ship] by @sorccu in #1563
  • fix(reporters): include retry count for unfinished checks on --max-failures by @shafiktanbir in #1566
  • test(reporters): cover retry count for checks stopped by --max-failures [RED-1241] [ship] by @sorccu in #1567
  • fix(reporters): show retry count for unfinished checks in github reporter [RED-1243] [ship] by @sorccu in #1568
  • feat(cli): explain construct errors caused by two checkly installs [RED-1240] [ship] by @sorccu in #1564
  • feat(cli): add deploy --fail-on-drift to refuse overwriting changes made in Checkly [RED-1259] [ship] by @sorccu in #1569
  • feat(cli)!: rename deploy --prune-relations to --prune-unmanaged-relations [RED-1260] [ship] by @sorccu in #1570
  • feat(cli)!: send all non-result output to stderr [RED-1252] [ship] by @hlenke in #1557
  • fix(cli): return undefined for empty inline -c= flag in findConfigFlag by @shafiktanbir in #1574
  • test(cli): share one command-context mock across command specs [RED-1263] [ship] by @sorccu in #1572
  • test(cli): keep maintenance window dates stable across e2e redeploys [RED-1265] [ship] by @sorccu in #1573
  • feat(cli)!: exit 3 when a command needs confirmation [RED-1256] [ship] by @sorccu in #1576
  • docs: drop the pre-v10 exit code from the confirmation notes [RED-1256] [ship] by @sorccu in #1577
  • feat(cli): support Bun 1.4 and Bun 1.x (latest available) engines [RED-907] [ship] by @sorccu in #1578
  • fix(cli)!: exit 1 when init fails in agent or CI mode [RED-1255] [ship] by @sorccu in #1579
  • refactor(cli): remove the fancy output flag [RED-1261] [ship] by @sorccu in #1580
  • fix(cli): keep JSON string and null bodies intact in checkly api [RED-1269] [ship] by @sorccu in #1581
  • fix(reporters): report CLI-side timeouts as timed out, not failed [RED-1276] [ship] by @sorccu in #1582
  • fix(cli)!: exit 1 for runtime failures reported through this.error [RED-1274] [ship] by @sorccu in #1583
  • fix(cli)!: exit 2 for invalid flag and argument values [RED-1277] [ship] by @sorccu in #1584

New contributors

Full Changelog: v9.5.0...10.0.0