cli@1.2.2
cli@1.2.21.2.2 (2026-10-07)
🩹 Fixes
- The CLI no longer prints "Config file not found, creating default config file" or writes a default
~/.devtools.yamlon first run; a config file is still read when present. (1dff1083)
Product updates, new features, and improvements to Dev Tools.
cli@1.2.2~/.devtools.yaml on first run; a config file is still read when present. (1dff1083)cli@1.2.1cmd.Root() returns its root command, and each release publishes devtools-go-src-<version>.tar.gz, the Go source of the CLI and the modules it imports with the generated code included, to build against. (03382c8b)cli@1.2.0cleanup: steps that always run after the flow's normal steps, whether they passed or failed, so data a test creates is deleted even when a step in the middle fails and the next run starts from the same state. Cleanup steps are request or graphql steps that can read earlier outputs ({{ PostProducts.response.body.id }}); they run in listed order (depends_on may reorder them among themselves), a step that reads a step which never ran is reported as skipped, and a failing cleanup step fails an otherwise passing flow while an earlier failure stays the reported error. Cleanup steps appear after the normal steps in the console table and in JSON and JUnit reports, and run after every iteration in load runs without being measured. (f204ce9e){{ cookies.csrftoken }}, or {{ cookies["XSRF-TOKEN"] }} for names that aren't identifiers. This makes double-submit CSRF protection (Django, Laravel, Angular, many Express apps) testable: copy the CSRF cookie into the header the server checks. Values are URL-decoded the way client code reads them, the latest value of each cookie wins, and a flow variable named cookies takes precedence. (60054c5f)cli@1.1.3Error: assertion failed: response.status == 200 (got 401: {"error":"Invalid credentials"}). Non-2xx responses include a short body excerpt; 2xx bodies are left out because they can carry tokens. The flag reference no longer prints under a failing flow, and the error no longer repeats four times. (c8520dd6)cli@1.1.2response.body.qty == 3, response.body.price > 100 and arithmetic work. Response numbers used to compare as text, so equality was always false and >/< failed with a type error. Values copied into later requests with {{ }} keep their exact original text, as before. (3cd2d960)desktop@1.1.3Heads up: on October 13, 2026, DevTools Studio becomes Stresseur Studio. It's the same app with the same flows, and it's still free, open source and local. You don't need to do anything.
Details: https://dev.tools/blog/devtools-studio-becomes-stresseur-studio/
desktop@1.1.2Heads up: on October 13, 2026, DevTools Studio becomes Stresseur Studio. It's the same app with the same flows, and it's still free, open source and local. You don't need to do anything.
Details: https://dev.tools/blog/devtools-studio-becomes-stresseur-studio/
desktop@1.1.1Heads up: on October 13, 2026, DevTools Studio becomes Stresseur Studio. It's the same app with the same flows, and it's still free, open source and local. You don't need to do anything.
Details: https://dev.tools/blog/devtools-studio-becomes-stresseur-studio/
cli@1.1.1desktop@1.1.0Heads up: on October 13, 2026, DevTools Studio becomes Stresseur Studio. It's the same app with the same flows, and it's still free, open source and local. You don't need to do anything.
Details: https://dev.tools/blog/devtools-studio-becomes-stresseur-studio/
---
flow run --vus/--duration and load: scenarios with percentile tables + load_report JSON), versioned yamlflow schema (version: 2), HTTP assertions in yamlflow files now enforced on import (previously silently dropped), run: blocks execute in dependency order with strict failure modes (failed dependencies skip-and-continue instead of aborting the run), run-flows GitHub Action for CI, and real build-version reporting in devtools version. (9a3152a3)cli@1.1.0flow run --vus/--duration and load: scenarios with percentile tables + load_report JSON), versioned yamlflow schema (version: 2), HTTP assertions in yamlflow files now enforced on import (previously silently dropped), run: blocks execute in dependency order with strict failure modes (failed dependencies skip-and-continue instead of aborting the run), run-flows GitHub Action for CI, and real build-version reporting in devtools version. (9a3152a3)desktop@1.0.3@nx/eslint patch made dependency installation fail hard on Windows CI, so 1.0.2 shipped without Windows (and, due to an expired Apple agreement, macOS) artifacts. The dead patch is removed; this release ships installers for all platforms again. Includes everything from 1.0.2, notably the fix for workspaces going blank after many file reorders (#44).desktop@1.0.2display_order, converging to the float32 limit after a few dozen inserts — at which point every file in the workspace disappeared from the UI and new flows could not be created. Order generation now uses fixed steps, and a startup migration repacks existing display_order values to small sequential numbers (preserving your current order), so previously broken workspaces recover automatically. (#44)cli@1.0.3@nx/eslint patch made dependency installation fail hard on Windows CI, so 1.0.2 shipped without win32-x64/win32-ia32 binaries. The dead patch is removed; this release ships all platforms again. Includes the file display_order repair migration from 1.0.2 (#44).cli@1.0.2files.display_order values that converged to float32 MAX (a bug in desktop order generation) back to small sequential numbers, preserving relative order. Databases shared with a broken desktop workspace recover automatically. (#44)desktop@1.0.1{{ http_1.response.body.done }}). Previously the check ran before children, so any expression referencing a not-yet-written variable failed the entire flow on the first iteration. Missing identifiers are now treated as "don't break" (loops are still bounded by iteration count). ForEach semantics also aligned with For: an expression that evaluates true exits the loop. (#42)StoreUnifiedResults, so SQLite rejected the row with FOREIGN KEY constraint failed (787) whenever GenerateFiles=true. Files are now stored first, and HTTP folder_id references are remapped before insertion.Iterations: 0 and an empty break expression until you closed and reopened the workspace.break_condition field on for / for_each steps in YAML workspaces, mirroring the desktop UI's "Break If" setting.cli@1.0.1{{ http_1.response.body.done }}). Previously the check ran before children, so any expression referencing a not-yet-written variable failed the entire flow on the first iteration. Missing identifiers are now treated as "don't break" (loops are still bounded by iteration count). ForEach semantics also aligned with For: an expression that evaluates true exits the loop. (#42)break_condition field on for / for_each steps in YAML workspaces, so loops in CLI-driven flows can exit on a runtime predicate without needing the UI.desktop@1.0.0# 1.0.0 (2026-04-24)
{{ }}: uuid(), uuid("v4"), uuid("v7"), ulid(), now().now(): .Unix(), .UnixMilli(), .UnixMicro(), .UnixNano().faker namespace for fake data — type faker. to browse 35 generators including name(), email(), phoneNumber(), url(), ipv4(), ipv6(), macAddress(), username(), password(), word(), sentence(), paragraph(), date(), timestamp(), uuid(), randomInt(min, max).cli@1.0.0# 1.0.0 (2026-04-24)
uuid(), uuid("v4"), uuid("v7"), ulid(), now() helpers inside {{ }}.now(): .Unix(), .UnixMilli(), .UnixMicro(), .UnixNano().faker.* namespace (35 generators — name(), email(), phoneNumber(), url(), ipv4(), word(), sentence(), paragraph(), date(), timestamp(), uuid(), randomInt(min, max), ...) for fake test data.desktop@0.5.0desktop@0.4.0desktop@0.3.2desktop@0.3.1desktop@0.3.0cli@0.2.2desktop@0.2.3desktop@0.2.2desktop@0.2.1cli@0.2.1desktop@0.2.0