@drevops/bats-helpers

中文文档
2.0.0发布于 2026/08/06GPL-3.0-or-later近 30 天下载 2509

Helpers and assertions for BATS testing.

原始使用文档
文档目录9 节
  1. Table of Contents
  2. ✨ Features
  3. 📦 Installation
  4. NPM
  5. From source
  6. 🚀 Usage
  7. 📖 Documentation
  8. 🧩 API reference
  9. 🤝 Contributing

BATS helpers logo

BATS helpers

GitHub Issues GitHub Pull Requests Test shell codecov GitHub release (latest by date) LICENSE Renovate


Helpers and assertions for BATS testing.

Table of Contents

✨ Features

  • Assertions for command output, its individual lines, exit status, standard error, strings, files, directories and git repositories.
  • Literal, regular expression and format matching, with case sensitivity as an explicit choice.
  • Command mocking with per-call output, exit status and side effects, and responses selected by matched arguments.
  • An ordered log of every mocked call, asserted as a sequence and reported as a unified diff.
  • Mock expectations that fail the test when they go unused or when an unanticipated call arrives.
  • An opt-in sandbox mode where an unmocked command is denied by name, with an allow-list for the commands that must run for real and a report of everything that left the mock boundary.
  • Step runner for sequences of mocked calls and output assertions.
  • Deferred cleanup registered next to the code that created the thing it removes.
  • Retry for anything asynchronous, bounded by an attempt count, a delay and an optional deadline.
  • Data provider for running one function over many test cases, with named cases, per-case arity, a chosen assertion and matrix expansion.
  • Fixture and file utilities for building and restoring test sandboxes.
  • A plain-text archive for declaring a whole fixture file tree inline in the test, serialising a directory back to it, and asserting a directory against it with per-file diffs.
  • TUI helper for driving interactive scripts with scripted answers, bounded by a deadline and asserted against the prompts the script printed.

📦 Installation

Requires bats-core 1.13 or newer, and Bash 4.0 or newer. macOS ships Bash 3.2, so install a current one with brew install bash.

NPM

npm install -D bats-helpers@npm:@drevops/bats-helpers

This will also install bats-core.

From source

  1. Click Code -> Download ZIP in the GitHub UI.
  2. Extract files to a desired location. Usually, next to where bats-core is located.

🚀 Usage

Create a _loader.bash file next to your BATS tests with content:

# For NPM installation:
export BATS_LIB_PATH="${BATS_TEST_DIRNAME}/../node_modules"

# For source installation:
# export BATS_LIB_PATH="<path/to/extracted/files>"

bats_load_library bats-helpers

Then use load _loader.bash in every BATS test file:

#!/usr/bin/env bats
load _loader.bash

@test "My test" {
 run ls
 assert_success
}

📖 Documentation

Each page documents one module of the library, and names the variables that module reads beside the behaviour they change. Match modes are the one exception, describing what every assertion family shares. The API reference below links every public function into the page that documents it.

PageSourceCovers
Command assertionssrc/assert.command.bashOutput, exit statuses and standard error of a command run with run
Line assertionssrc/assert.line.bashIndividual lines of a captured stream, by index, by any line and by count
String assertionssrc/assert.string.bashPlain strings, and the string utilities behind the assertions
File assertionssrc/assert.file.bashFiles, directories and symbolic links
Git assertionssrc/assert.git.bashGit repositories and the files they track
Match modessrc/assert.string.bashHow a needle is read, and whether case matters
Failure reportingsrc/assert.base.bashThe shape of every failure report, and how to raise one
Mockingsrc/mock.bashCommand mocking, the call log, argument specifications, strictness and sandbox mode
Step runnersrc/steps.bashSequences of mocked calls and output assertions
Data providersrc/dataprovider.bashRunning one function over many test cases
Interactive scriptssrc/tui.bashDriving a script that asks questions
Retrysrc/retry.bashConditions that become true shortly
Cleanupsrc/cleanup.bashDeferred per-test cleanup
Fixturessrc/fixture.bashBuilding, dumping and asserting file trees
File utilitiessrc/file.bashCreating, trimming, backing up and restoring files

🧩 API reference

Every public function, the file that defines it, and the page that documents it. Functions whose names start with an underscore are internal, are not part of the public API, and may change or disappear in any release without notice.

FunctionSourceDescriptionDocumentation
flunkassert.base.bashFails the test with a message, its stack trace and stable pathsFailure reporting
format_errorassert.base.bashFormats a failure report as a titled block of aligned rowsFailure reporting
assert_emptyassert.string.bashAsserts that a string is emptyString assertions
assert_not_emptyassert.string.bashAsserts that a string is not emptyString assertions
assert_equalassert.string.bashAsserts that two strings are equalString assertions
assert_string_containsassert.string.bashAsserts that a string contains a substringString assertions
assert_string_contains_caseassert.string.bashAsserts that a string contains a substring, case-sensitivelyString assertions
assert_string_not_containsassert.string.bashAsserts that a string does not contain a substringString assertions
assert_string_not_contains_caseassert.string.bashAsserts that a string does not contain a substring, case-sensitivelyString assertions
assert_string_starts_withassert.string.bashAsserts that a string starts with a substringString assertions
assert_string_starts_with_caseassert.string.bashAsserts that a string starts with a substring, case-sensitivelyString assertions
assert_string_not_starts_withassert.string.bashAsserts that a string does not start with a substringString assertions
assert_string_not_starts_with_caseassert.string.bashAsserts that a string does not start with a substring, case-sensitivelyString assertions
assert_string_ends_withassert.string.bashAsserts that a string ends with a substringString assertions
assert_string_ends_with_caseassert.string.bashAsserts that a string ends with a substring, case-sensitivelyString assertions
assert_string_not_ends_withassert.string.bashAsserts that a string does not end with a substringString assertions
assert_string_not_ends_with_caseassert.string.bashAsserts that a string does not end with a substring, case-sensitivelyString assertions
assert_string_matchesassert.string.bashAsserts that a string matches a regular expressionString assertions
assert_string_matches_caseassert.string.bashAsserts that a string matches a regular expression, case-sensitivelyString assertions
assert_string_not_matchesassert.string.bashAsserts that a string does not match a regular expressionString assertions
assert_string_not_matches_caseassert.string.bashAsserts that a string does not match a regular expression, case-sensitivelyString assertions
assert_string_matches_formatassert.string.bashAsserts that a string matches a format stringString assertions
assert_string_matches_format_caseassert.string.bashAsserts that a string matches a format string, case-sensitivelyString assertions
assert_string_not_matches_formatassert.string.bashAsserts that a string does not match a format stringString assertions
assert_string_not_matches_format_caseassert.string.bashAsserts that a string does not match a format string, case-sensitivelyString assertions
string_matchassert.string.bashReports whether a needle matches a haystack, without asserting on itString utilities
string_format_to_regexassert.string.bashTranslates a format string into an extended regular expressionString utilities
string_randomassert.string.bashGenerates a random alphanumeric string, 8 characters long by defaultString utilities
assert_successassert.command.bashAsserts that a command succeedsCommand assertions
assert_failureassert.command.bashAsserts that a command failsCommand assertions
assert_outputassert.command.bashAsserts that a command outputs an exact stringCommand assertions
assert_output_containsassert.command.bashAsserts that output contains a substringCommand assertions
assert_output_contains_caseassert.command.bashAsserts that output contains a substring, case-sensitivelyCommand assertions
assert_output_not_containsassert.command.bashAsserts that output does not contain a substringCommand assertions
assert_output_not_contains_caseassert.command.bashAsserts that output does not contain a substring, case-sensitivelyCommand assertions
assert_output_matchesassert.command.bashAsserts that output matches a regular expressionCommand assertions
assert_output_matches_caseassert.command.bashAsserts that output matches a regular expression, case-sensitivelyCommand assertions
assert_output_not_matchesassert.command.bashAsserts that output does not match a regular expressionCommand assertions
assert_output_not_matches_caseassert.command.bashAsserts that output does not match a regular expression, case-sensitivelyCommand assertions
assert_output_matches_formatassert.command.bashAsserts that output matches a format stringCommand assertions
assert_output_matches_format_caseassert.command.bashAsserts that output matches a format string, case-sensitivelyCommand assertions
assert_output_not_matches_formatassert.command.bashAsserts that output does not match a format stringCommand assertions
assert_output_not_matches_format_caseassert.command.bashAsserts that output does not match a format string, case-sensitivelyCommand assertions
assert_statusassert.command.bashAsserts that a command exits with an exact statusExit statuses
assert_failure_statusassert.command.bashAsserts that a command fails with an exact statusExit statuses
assert_status_general_errorassert.command.bashAsserts that a command exits with status 1Exit statuses
assert_status_command_not_foundassert.command.bashAsserts that a command exits with status 127Exit statuses
assert_stderrassert.command.bashAsserts that a command writes an exact string to STDERRStandard error
assert_stderr_emptyassert.command.bashAsserts that a command wrote nothing to STDERRStandard error
assert_stderr_capturedassert.command.bashAsserts that STDERR was captured separately from the outputStandard error
assert_stderr_containsassert.command.bashAsserts that STDERR contains a substringStandard error
assert_stderr_contains_caseassert.command.bashAsserts that STDERR contains a substring, case-sensitivelyStandard error
assert_stderr_not_containsassert.command.bashAsserts that STDERR does not contain a substringStandard error
assert_stderr_not_contains_caseassert.command.bashAsserts that STDERR does not contain a substring, case-sensitivelyStandard error
assert_stderr_matchesassert.command.bashAsserts that STDERR matches a regular expressionStandard error
assert_stderr_matches_caseassert.command.bashAsserts that STDERR matches a regular expression, case-sensitivelyStandard error
assert_stderr_not_matchesassert.command.bashAsserts that STDERR does not match a regular expressionStandard error
assert_stderr_not_matches_caseassert.command.bashAsserts that STDERR does not match a regular expression, case-sensitivelyStandard error
assert_stderr_matches_formatassert.command.bashAsserts that STDERR matches a format stringStandard error
assert_stderr_matches_format_caseassert.command.bashAsserts that STDERR matches a format string, case-sensitivelyStandard error
assert_stderr_not_matches_formatassert.command.bashAsserts that STDERR does not match a format stringStandard error
assert_stderr_not_matches_format_caseassert.command.bashAsserts that STDERR does not match a format string, case-sensitivelyStandard error
assert_lineassert.line.bashAsserts that the line at an index equals a stringLine assertions
assert_line_notassert.line.bashAsserts that the line at an index does not equal a stringLine assertions
assert_line_containsassert.line.bashAsserts that the line at an index contains a stringLine assertions
assert_line_contains_caseassert.line.bashAsserts that the line at an index contains a string, case-sensitivelyLine assertions
assert_line_not_containsassert.line.bashAsserts that the line at an index does not contain a stringLine assertions
assert_line_not_contains_caseassert.line.bashAsserts that the line at an index does not contain a string, case-sensitivelyLine assertions
assert_line_matchesassert.line.bashAsserts that the line at an index matches a regular expressionLine assertions
assert_line_matches_caseassert.line.bashAsserts that the line at an index matches a regular expression, case-sensitivelyLine assertions
assert_line_not_matchesassert.line.bashAsserts that the line at an index does not match a regular expressionLine assertions
assert_line_not_matches_caseassert.line.bashAsserts that the line at an index does not match a regular expression, case-sensitivelyLine assertions
assert_line_matches_formatassert.line.bashAsserts that the line at an index matches a format stringLine assertions
assert_line_matches_format_caseassert.line.bashAsserts that the line at an index matches a format string, case-sensitivelyLine assertions
assert_line_not_matches_formatassert.line.bashAsserts that the line at an index does not match a format stringLine assertions
assert_line_not_matches_format_caseassert.line.bashAsserts that the line at an index does not match a format string, case-sensitivelyLine assertions
assert_any_lineassert.line.bashAsserts that some line equals a stringAny line
assert_no_lineassert.line.bashAsserts that no line equals a stringAny line
assert_any_line_containsassert.line.bashAsserts that some line contains a stringAny line
assert_any_line_contains_caseassert.line.bashAsserts that some line contains a string, case-sensitivelyAny line
assert_no_line_containsassert.line.bashAsserts that no line contains a stringAny line
assert_no_line_contains_caseassert.line.bashAsserts that no line contains a string, case-sensitivelyAny line
assert_any_line_matchesassert.line.bashAsserts that some line matches a regular expressionAny line
assert_any_line_matches_caseassert.line.bashAsserts that some line matches a regular expression, case-sensitivelyAny line
assert_no_line_matchesassert.line.bashAsserts that no line matches a regular expressionAny line
assert_no_line_matches_caseassert.line.bashAsserts that no line matches a regular expression, case-sensitivelyAny line
assert_any_line_matches_formatassert.line.bashAsserts that some line matches a format stringAny line
assert_any_line_matches_format_caseassert.line.bashAsserts that some line matches a format string, case-sensitivelyAny line
assert_no_line_matches_formatassert.line.bashAsserts that no line matches a format stringAny line
assert_no_line_matches_format_caseassert.line.bashAsserts that no line matches a format string, case-sensitivelyAny line
assert_line_countassert.line.bashAsserts the number of linesCounts
assert_line_count_notassert.line.bashAsserts that the number of lines differsCounts
assert_line_count_containsassert.line.bashAsserts how many lines contain a stringCounts
assert_line_count_contains_caseassert.line.bashAsserts how many lines contain a string, case-sensitivelyCounts
assert_line_count_not_containsassert.line.bashAsserts how many lines do not contain a stringCounts
assert_line_count_not_contains_caseassert.line.bashAsserts how many lines do not contain a string, case-sensitivelyCounts
assert_line_count_matchesassert.line.bashAsserts how many lines match a regular expressionCounts
assert_line_count_matches_caseassert.line.bashAsserts how many lines match a regular expression, case-sensitivelyCounts
assert_line_count_not_matchesassert.line.bashAsserts how many lines do not match a regular expressionCounts
assert_line_count_not_matches_caseassert.line.bashAsserts how many lines do not match a regular expression, case-sensitivelyCounts
assert_line_count_matches_formatassert.line.bashAsserts how many lines match a format stringCounts
assert_line_count_matches_format_caseassert.line.bashAsserts how many lines match a format string, case-sensitivelyCounts
assert_line_count_not_matches_formatassert.line.bashAsserts how many lines do not match a format stringCounts
assert_line_count_not_matches_format_caseassert.line.bashAsserts how many lines do not match a format string, case-sensitivelyCounts
assert_file_existsassert.file.bashAsserts that a file existsFile assertions
assert_file_not_existsassert.file.bashAsserts that a file does not existFile assertions
assert_file_containsassert.file.bashAsserts that a file contains a stringFile assertions
assert_file_contains_caseassert.file.bashAsserts that a file contains a string, case-sensitivelyFile assertions
assert_file_not_containsassert.file.bashAsserts that a file does not contain a stringFile assertions
assert_file_not_contains_caseassert.file.bashAsserts that a file does not contain a string, case-sensitivelyFile assertions
assert_file_matchesassert.file.bashAsserts that a file matches a regular expressionFile assertions
assert_file_matches_caseassert.file.bashAsserts that a file matches a regular expression, case-sensitivelyFile assertions
assert_file_not_matchesassert.file.bashAsserts that a file does not match a regular expressionFile assertions
assert_file_not_matches_caseassert.file.bashAsserts that a file does not match a regular expression, case-sensitivelyFile assertions
assert_file_matches_formatassert.file.bashAsserts that a file matches a format stringFile assertions
assert_file_matches_format_caseassert.file.bashAsserts that a file matches a format string, case-sensitivelyFile assertions
assert_file_not_matches_formatassert.file.bashAsserts that a file does not match a format stringFile assertions
assert_file_not_matches_format_caseassert.file.bashAsserts that a file does not match a format string, case-sensitivelyFile assertions
assert_files_equalassert.file.bashAsserts that two files are equalFile assertions
assert_files_equal_ignore_spacesassert.file.bashAsserts that two files are equal, ignoring blank lines and whitespace changesFile assertions
assert_files_not_equalassert.file.bashAsserts that two files are not equalFile assertions
assert_files_not_equal_ignore_spacesassert.file.bashAsserts that two files are not equal, ignoring blank lines and whitespace changesFile assertions
assert_binary_files_equalassert.file.bashAsserts that two binary files are equalFile assertions
assert_binary_files_not_equalassert.file.bashAsserts that two binary files are not equalFile assertions
assert_file_modeassert.file.bashAsserts the file permission modeFile assertions
assert_dir_existsassert.file.bashAsserts that a directory existsDirectories and symlinks
assert_dir_not_existsassert.file.bashAsserts that a directory does not existDirectories and symlinks
assert_dir_emptyassert.file.bashAsserts that a directory is emptyDirectories and symlinks
assert_dir_not_emptyassert.file.bashAsserts that a directory is not emptyDirectories and symlinks
assert_dir_contains_stringassert.file.bashAsserts that a directory contains a string in one of its filesSearching a directory
assert_dir_contains_string_caseassert.file.bashAsserts that a directory contains a string in one of its files, case-sensitivelySearching a directory
assert_dir_not_contains_stringassert.file.bashAsserts that a directory does not contain a string in any of its filesSearching a directory
assert_dir_not_contains_string_caseassert.file.bashAsserts that a directory does not contain a string in any of its files, case-sensitivelySearching a directory
assert_dir_matchesassert.file.bashAsserts that a file of a directory matches a regular expressionSearching a directory
assert_dir_matches_caseassert.file.bashAsserts that a file of a directory matches a regular expression, case-sensitivelySearching a directory
assert_dir_not_matchesassert.file.bashAsserts that no file of a directory matches a regular expressionSearching a directory
assert_dir_not_matches_caseassert.file.bashAsserts that no file of a directory matches a regular expression, case-sensitivelySearching a directory
assert_dirs_equalassert.file.bashAsserts that two directories are equalDirectories and symlinks
assert_symlink_existsassert.file.bashAsserts that a symbolic link existsDirectories and symlinks
assert_symlink_not_existsassert.file.bashAsserts that a symbolic link does not existDirectories and symlinks
assert_git_repoassert.git.bashAsserts that a directory is a git repositoryGit assertions
assert_git_not_repoassert.git.bashAsserts that a directory is not a git repositoryGit assertions
assert_git_cleanassert.git.bashAsserts that a git repository is cleanGit assertions
assert_git_not_cleanassert.git.bashAsserts that a git repository is not cleanGit assertions
assert_git_file_trackedassert.git.bashAsserts that a file is tracked in gitGit assertions
assert_git_file_not_trackedassert.git.bashAsserts that a file is not tracked in gitGit assertions
cleanup_registercleanup.bashRegisters a command to run once the current test has finishedCleanup
cleanup_runcleanup.bashRuns the registered commands in reverse order. Call from teardown()Cleanup
cleanup_registry_pathcleanup.bashResolves the file the registry is stored inCleanup sandbox
retry_runretry.bashRuns a command until it succeeds or until a bound is reachedRetry
file_mktouchfile.bashCreates a file and any missing parent directoriesFile utilities
file_trimfile.bashRemoves the last line of a file in placeFile utilities
file_read_envfile.bashEvaluates an expression with the variables from the ./.env file in scopeFile utilities
file_backup_pathfile.bashResolves the backup location of a fileFile backups
file_add_varfile.bashAppends a variable assignment to a file, backing the file up firstFile backups
file_restorefile.bashRestores a file from the backup taken by file_add_varFile backups
fixture_prepare_dirfixture.bashCreates an empty directory for a fixture, removing any existing contentFixtures
fixture_export_codebasefixture.bashExports the codebase at the latest commit to a destination directoryFixtures
fixture_create_dirfixture.bashCreates a file tree from an archive read from STDINFixture trees
fixture_dump_dirfixture.bashPrints a directory as an archiveFixture trees
fixture_assert_dirfixture.bashAsserts that a directory holds the file tree of an archive read from STDINFixture trees
dataprovider_rundataprovider.bashRuns the cases held in the TEST_CASES arrayFlat array
dataprovider_run_casesdataprovider.bashRuns the cases that a function declaresDeclared cases
dataprovider_casedataprovider.bashDeclares and runs one caseDeclared cases
dataprovider_matrixdataprovider.bashExpands value lists into their cartesian productMatrix
mock_setupmock.bashSets mocking up. Call from setup()Setup functions
mock_createmock.bashCreates a mock program that can be trackedSetup functions
mock_commandmock.bashMocks the provided commandSetup functions
mock_set_outputmock.bashSets the output of the mockSetup functions
mock_set_statusmock.bashSets the exit status of the mockSetup functions
mock_set_side_effectmock.bashSets shell code to run when the mock executesSetup functions
mock_set_strictmock.bashRejects the calls the mock's expectations do not coverStrictness
mock_set_forwardmock.bashRuns the real command for calls no specification acceptsArgument specifications
mock_spec_addmock.bashAdds an argument specification to the mockArgument specifications
mock_spec_argmock.bashConstrains one argument position of a specificationArgument specifications
mock_spec_countmock.bashPins the number of arguments a specification acceptsArgument specifications
mock_spec_set_outputmock.bashSets the output a specification responds withArgument specifications
mock_spec_set_statusmock.bashSets the exit status a specification responds withArgument specifications
mock_spec_set_side_effectmock.bashSets shell code a specification runsArgument specifications
mock_log_excludemock.bashExcludes commands from sequence comparisonsCall log
mock_log_printmock.bashReturns every recorded call, in orderCall log
mock_get_call_nummock.bashReturns the number of times the mock was calledAssertion functions
mock_get_call_argsmock.bashReturns the arguments the mock was called withAssertion functions
mock_get_call_usermock.bashReturns the user the mock was called withAssertion functions
mock_get_call_envmock.bashReturns an environment variable value from a mock callAssertion functions
mock_assert_call_argsmock.bashAsserts the arguments the mock was called withAssertion functions
mock_assert_callsmock.bashAsserts the ordered sequence of every mocked callCall log
mock_assert_no_callsmock.bashAsserts that no mocked command outside the excluded ones was calledCall log
mock_assert_calledmock.bashAsserts that a command was calledCall log
mock_assert_not_calledmock.bashAsserts that a command was not calledCall log
mock_verifymock.bashAsserts that every expectation was metStrictness
mock_sandbox_enablemock.bashEnables sandbox mode. Arguments seed the allow-listSandbox mode
mock_sandbox_allowmock.bashAllows commands to run for realSandbox mode
mock_sandbox_disablemock.bashRestores the PATH saved when the mode was enabledSandbox mode
mock_sandbox_enabledmock.bashReports whether sandbox mode is enabledSandbox mode
mock_sandbox_reportmock.bashPrints the denied and the escaped commandsWhat escaped
mock_path_checkmock.bashWarns when PATH changed after mock_setupWhen PATH is rewritten
steps_runsteps.bashRuns the setup or the assert phase of the STEPS arrayStep runner
tui_runtui.bashRuns the script named by SCRIPT_FILE, feeding it answers on STDINInteractive scripts
tui_assert_promptstui.bashAsserts the prompts appeared in order, ignoring casePrompt order
tui_assert_prompts_casetui.bashAsserts the prompts appeared in order, case-sensitivelyPrompt order

🤝 Contributing

See CONTRIBUTING.md for local development setup, the linting and testing commands, and the release procedure.


This repository was created using the Scaffold project template

版本与发布记录

@drevops/bats-helpers 共发布 12 个版本,首次发布于 2023/03/20;过去 12 个月发布了 3 个版本。

版本发布日期距今
2.0.0latest2026/08/063 个月前
1.6.02026/02/069 个月前
1.5.22025/12/0511 个月前
1.5.12025/07/301.3 年前
1.5.02025/07/301.3 年前
1.4.22025/01/081.8 年前

关于 @drevops/bats-helpers 的常见问题

@drevops/bats-helpers 是什么?

Helpers and assertions for BATS testing.

如何安装 @drevops/bats-helpers?

在项目目录运行 npm install @drevops/bats-helpers,或使用 pnpm add / yarn add / bun add。

@drevops/bats-helpers 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/drevops__bats-helpers 是否存在。

@drevops/bats-helpers 可以商用吗?

@drevops/bats-helpers 使用 GPL-3.0-or-later 许可。强 Copyleft:分发包含该代码的软件时,整个作品需以 GPL-3.0 兼容许可开源,并附带专利与反锁定条款。仅内部使用不触发此义务。以上为概括,不构成法律意见,请以许可原文为准。

@drevops/bats-helpers 的下载量有多少?

根据 npm 官方下载统计,@drevops/bats-helpers 在 2026/10/13 – 2026/11/11 这 30 天内被下载 2,509 次,日均约 84 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@drevops/bats-helpers 还在维护吗?

最新版本 2.0.0 发布于 2026/08/06(3 个月前);至今共发布 12 个版本,其中过去 12 个月发布了 3 个;首次发布于 2023/03/20。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。