{"id":13469144,"url":"https://github.com/textlint/textlint","last_synced_at":"2026-04-09T02:01:02.568Z","repository":{"id":25058853,"uuid":"28478929","full_name":"textlint/textlint","owner":"textlint","description":"textlint is the pluggable linter for natural language text.","archived":false,"fork":false,"pushed_at":"2026-04-03T01:20:25.000Z","size":48813,"stargazers_count":3103,"open_issues_count":52,"forks_count":155,"subscribers_count":32,"default_branch":"master","last_synced_at":"2026-04-03T04:50:23.429Z","etag":null,"topics":["javascript","lint","linter","markdown","natural-language","nlp","textlint"],"latest_commit_sha":null,"homepage":"https://textlint.org","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/textlint.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"docs/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"azu"}},"created_at":"2014-12-25T10:34:46.000Z","updated_at":"2026-04-02T21:02:40.000Z","dependencies_parsed_at":"2026-04-02T19:05:17.293Z","dependency_job_id":null,"html_url":"https://github.com/textlint/textlint","commit_stats":{"total_commits":3418,"total_committers":83,"mean_commits":41.18072289156626,"dds":"0.41720304271503805","last_synced_commit":"57a6ea51d2cbee67739922fbea508a03e8e305ec"},"previous_names":["azu/textlint"],"tags_count":1508,"template":false,"template_full_name":null,"purl":"pkg:github/textlint/textlint","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/textlint%2Ftextlint","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/textlint%2Ftextlint/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/textlint%2Ftextlint/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/textlint%2Ftextlint/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/textlint","download_url":"https://codeload.github.com/textlint/textlint/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/textlint%2Ftextlint/sbom","scorecard":{"id":222406,"data":{"date":"2025-08-04","repo":{"name":"github.com/textlint/textlint","commit":"91897b92e85f1a15396d1f0f1b814ea4679106e3"},"scorecard":{"version":"v5.2.1-28-gc1d103a9","commit":"c1d103a9bb9f635ec7260bf9aa0699466fa4be0e"},"score":5.5,"checks":[{"name":"Maintained","score":10,"reason":"30 commit(s) and 22 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 2/28 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#cii-best-practices"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#license"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: jobLevel 'contents' permission set to 'write': .github/workflows/ci.yml:35","Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql-analysis.yml:28","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql-analysis.yml:29","Info: jobLevel 'checks' permission set to 'read': .github/workflows/merge-gatekeeper.yml:16","Info: jobLevel 'statuses' permission set to 'read': .github/workflows/merge-gatekeeper.yml:17","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release.yml:24","Warn: jobLevel 'packages' permission set to 'write': .github/workflows/release.yml:60","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/release.yml:57","Info: topLevel 'contents' permission set to 'read': .github/workflows/ci.yml:5","Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Warn: topLevel 'contents' permission set to 'write': .github/workflows/create-release-pr.yml:15","Warn: no topLevel permission defined: .github/workflows/merge-gatekeeper.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/release-canary.yml:6","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: topLevel 'contents' permission set to 'write': .github/workflows/website-preview.yml:14","Info: topLevel 'contents' permission set to 'read': .github/workflows/website.yml:8"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#token-permissions"}},{"name":"Branch-Protection","score":3,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'master'","Info: 'force pushes' disabled on branch 'master'","Warn: 'branch protection settings apply to administrators' is disabled on branch 'master'","Warn: 'stale review dismissal' is disabled on branch 'master'","Warn: branch 'master' does not require approvers","Warn: codeowners review is not required on branch 'master'","Warn: 'last push approval' is disabled on branch 'master'","Warn: 'up-to-date branches' is disabled on branch 'master'","Info: status check found to merge onto on branch 'master'","Info: PRs are required in order to make changes on branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#branch-protection"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":9,"reason":"security policy file detected","details":["Info: security policy file detected: github.com/textlint/.github/SECURITY.md:1","Info: Found linked content: github.com/textlint/.github/SECURITY.md:1","Warn: One or no descriptive hints of disclosure, vulnerability, and/or timelines in security policy","Info: Found text in security policy: github.com/textlint/.github/SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#security-policy"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#signed-releases"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#fuzzing"}},{"name":"SAST","score":9,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 29 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":10,"reason":"all dependencies are pinned","details":["Info:  26 out of  26 GitHub-owned GitHubAction dependencies pinned","Info:  18 out of  18 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#pinned-dependencies"}},{"name":"Vulnerabilities","score":0,"reason":"10 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-xffm-g5w8-qvg7","Warn: Project is vulnerable to: GHSA-67mh-4wv8-2f99","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-w5p7-h5w8-2hfq","Warn: Project is vulnerable to: GHSA-7p7h-4mm5-852v","Warn: Project is vulnerable to: GHSA-4v9v-hfq4-rm2v","Warn: Project is vulnerable to: GHSA-9jgg-88mc-972h","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T02:54:08.707Z","repository_id":25058853,"created_at":"2025-08-17T02:54:08.707Z","updated_at":"2025-08-17T02:54:08.707Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31493326,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-06T17:22:55.647Z","status":"ssl_error","status_checked_at":"2026-04-06T17:22:54.741Z","response_time":112,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["javascript","lint","linter","markdown","natural-language","nlp","textlint"],"created_at":"2024-07-31T15:01:27.807Z","updated_at":"2026-04-09T02:01:02.543Z","avatar_url":"https://github.com/textlint.png","language":"TypeScript","readme":"# textlint\n\n\n\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://textlint.org/media/banner/banner_710x256.png\"\u003e\n  \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://textlint.org/media/logo/spaced/textlint-logo.png\"\u003e\n  \u003cimg alt=\"textlint logo\" src=\"https://textlint.org/media/logo/spaced/textlint-logo.png\"\u003e\n\u003c/picture\u003e\n\n\u003e The pluggable linting tool for natural language.\n\ntextlint is similar to [ESLint](http://eslint.org/ \"ESLint\"), but it's for use with natural language.\n\n\u003c!-- textlint-disable --\u003e\n\n[![GitHub Actions Build Status](https://github.com/textlint/textlint/workflows/CI/badge.svg)](https://github.com/textlint/textlint/actions?workflow=CI)\n\n\u003c!-- textlint-enable --\u003e\n\n## Website\n\n- Online demo\n- Searchable documents\n- Release blog\n\nVisit [https://textlint.org/](https://textlint.org/).\n\n## Features\n\n- No bundled rules.\n- To use a rule, install a textlint rule via npm.\n    - `npm install textlint-rule-xxx`.\n    - See [collection of textlint rules](https://github.com/textlint/textlint/wiki/Collection-of-textlint-rule \"Collection of textlint rule · textlint/textlint Wiki\")\n- [Markdown](./packages/@textlint/textlint-plugin-markdown) and [plain text](./packages/@textlint/textlint-plugin-text) are supported by default. Support is available for [HTML](https://github.com/textlint/textlint-plugin-html) and [other file formats](https://github.com/textlint/textlint#supported-file-formats) via plugins.\n- Supports the use of custom formatters and formatter bundles [formatter(reporter)](./packages/@textlint/linter-formatter)\n\n## Quick Tour\n\nFor a quick tour of textlint, checkout our [Getting Started](./docs/getting-started.md) guide :squirrel:\n\n## Installation\n\nYou can install the `textlint` command using npm:\n\n```\n$ npm install textlint --save-dev\n```\n\n**Requirements**:\n\n- Node.js 20+\n\nIf you're not sure what version of Node you're running, you can run `node -v` in your console to find out.\n\n**:warning: Warning:**\n\n- If you have installed `textlint` globally you must install each reference rule globally as well.\n- If you have installed `textlint` locally you must install each rule locally as well.\n\nWe recommend installing `textlint` locally.\n\n### For Node.js beginners\n\nIf you've never used Node.js and npm, please see the following:\n\n- [Installing Node.js and updating npm | npm Documentation](https://docs.npmjs.com/getting-started/installing-node \"02 - Installing Node.js and updating npm | npm Documentation\")\n\n## Usage\n\n![screenshot lint pretty-error](docs/assets/screenshot-lint-pretty-error.png)\n\ntextlint has no default rules!!\n\nYou can run textlint with `.textlintrc.json` config file.\n\n```sh\n# Install textlint and rules into local directory\nnpm install --save-dev textlint textlint-rule-no-todo\n```\n\n`npx textlint --init` command creates `.textlintrc.json` file from installed rules.\n\n```bash\nnpx textlint --init\n```\n\n`.textlintrc.json` will be created like this:\n\n```json\n{\n    \"rules\": {\n        \"no-todo\": true\n    }\n}\n```\n\nLint files via textlint:\n\n```sh\nnpx textlint ./README.md\n```\n\n`textlint` load `.textlintrc.json` from current directory and lint `README.md`.\n\n## CLI\n\nRun `npx textlint -h` for information on how to use the CLI.\n\n```\n$ textlint [options] file.md [file|dir|glob*]\n\nOptions:\n  -h, --help                  Show help.\n  -c, --config path::String   Use configuration from this file or sharable config.\n  --ignore-path path::String  Specify path to a file containing patterns that describes files to ignore. - default: .textlintignore\n  --init                      Create the config file if not existed. - default: false\n  --fix                       Automatically fix problems\n  --dry-run                   Enable dry-run mode for --fix. Only show result, don't change the file.\n  --debug                     Outputs debugging information\n  --print-config              Print the config object to stdout\n  -v, --version               Outputs the version number.\n\nUsing stdin:\n  --stdin                     Lint text provided on \u003cSTDIN\u003e. - default: false\n  --stdin-filename String     Specify filename to process STDIN as\n\nOutput:\n  -o, --output-file path::String  Enable report to be written to a file.\n  -f, --format String         Use a specific output format.\n\n                              Available formatter          : checkstyle, compact, github, jslint-xml, json, junit, pretty-error, stylish, table, tap, unix\n\n                              Available formatter for --fix: compats, diff, fixed-result, json, stylish - default: stylish\n  --no-color                  Disable color in piped output.\n  --quiet                     Report errors only. - default: false\n\nSpecifying rules and plugins:\n  --no-textlintrc             Disable .textlintrc\n  --plugin [String]           Set plugin package name\n  --rule [String]             Set rule package name\n  --preset [String]           Set preset package name and load rules from preset package.\n  --rulesdir [path::String]   Use additional rules from this directory\n\nCaching:\n  --cache                     Only check changed files - default: false\n  --cache-location path::String  Path to the cache file or directory - default: .textlintcache\n\nExperimental:\n  --experimental              Enable experimental flag.Some feature use on experimental.\n  --rules-base-directory path::String  Set module base directory. textlint load modules(rules/presets/plugins) from the base directory.\n  --mcp                       Start textlint as the Model Context Protocol (MCP) server.\n```\n\nWhen running textlint, you can target files to lint using the glob patterns.\nMake sure that you enclose any glob parameter you pass in quotes.\n\n```sh\n$ npx textlint \"docs/**\"\n```\n\nFor more details, see [CLI](./docs/cli.md) documentation.\n\n- Documentation: [CLI](./docs/cli.md)\n\nExample:\n\n- :information_source: See [examples/cli](examples/cli)\n\n## .textlintrc\n\n`.textlintrc` is config file that is loaded as JSON, YAML or JS via [azu/rc-config-loader](https://github.com/azu/rc-config-loader).\n\nRunning textlint with the following arguments\n\n```\n$ npx textlint --rule no-todo --rule very-nice-rule README.md\n```\n\nis equivalent to running `textlint README.md` in a directory with a `.textlintrc.json` containing the following json\n\n```json\n{\n  \"rules\": {\n    \"no-todo\": true,\n    \"very-nice-rule\": true\n  }\n}\n```\n\nYou can also configure options for specific rules in your `.textlintrc.json` file.\n\n```json\n{\n  \"rules\": {\n    \"no-todo\": false, // disable\n    \"very-nice-rule\": {\n        \"key\": \"value\"\n    }\n  }\n}\n```\n\nFor example here we pass the options (\"key\": \"value\") to `very-nice-rule`.\n\nOptions can be specified in your `.textlintrc.json` file as follows:\n\n\u003c!-- textlint-disable --\u003e\n\n```js\n{\n  // Allow to comment in JSON\n  \"rules\": {\n    \"\u003crule-name\u003e\": true | false | object\n  }\n}\n```\n\n\u003c!-- textlint-enable --\u003e\n\n:information_source: for more details see\n\n- [docs/configuring](docs/configuring.md)\n- [examples/config-file](examples/config-file)\n\n### Plugin\n\nA textlint plugin is a set of rules and rulesConfig or customize parser.\n\nTo enable plugin, put the \"plugin-name\" into `.textlintrc.json`.\n\n\u003c!-- textlint-disable --\u003e\n\n```js\n// `.textlintrc.json`\n{\n    \"plugins\": [\n        \"plugin-name\"\n    ],\n    // overwrite-plugins rules config\n    // \u003cplugin\u003e/\u003crule\u003e\n    \"rules\": {\n        \"plugin-name/rule-name\" : false\n    }\n}\n```\n\n\u003c!-- textlint-enable --\u003e\n\n:information_source: See [docs/plugin.md](docs/plugin.md)\n\n### Supported file formats\n\ntextlint supports Markdown and plain text by default.\n\nInstall **Processor Plugin** and add new file format support.\n\nFor example, if you want to lint HTML, use [textlint-plugin-html](https://github.com/textlint/textlint-plugin-html \"textlint-plugin-html\") as a plugin.\n\n    npm install textlint-plugin-html --save-dev\n\nAdd `\"html\"` to `.textlintrc.json`\n\n```\n{\n    \"plugins\": [\n        \"html\"\n    ]\n}\n```\n\nRun textlint on `.html` files:\n\n  textlint index.html\n\n- Example: [examples/html-plugin](examples/html-plugin)\n- Documentation: [docs/plugin.md](docs/plugin.md)\n\nOptional supported file types:\n\n- HTML: [textlint-plugin-html](https://github.com/textlint/textlint-plugin-html \"textlint-plugin-html\")\n- reStructuredText: [textlint-plugin-rst](https://github.com/jimo1001/textlint-plugin-rst \"textlint-plugin-rst\")\n  - Fork: [shiguredo/textlint-plugin-rst](https://github.com/shiguredo/textlint-plugin-rst)\n- AsciiDoc/Asciidoctor: [textlint-plugin-asciidoc-loose](https://github.com/azu/textlint-plugin-asciidoc-loose \"textlint-plugin-asciidoc-loose\")\n- Re:VIEW: [textlint-plugin-review](https://github.com/orangain/textlint-plugin-review \"textlint-plugin-review\")\n- Org-mode: [textlint-plugin-org](https://github.com/kijimaD/textlint-plugin-org \"textlint-plugin-org\")\n\nSee [Processor Plugin List](https://github.com/textlint/textlint/wiki/Collection-of-textlint-rule#processor-plugin-list \"Processor Plugin List\") for details.\n\n\n### Rules list :green_heart:\n\n- Check it: [A Collection of textlint rule · textlint/textlint Wiki](https://github.com/textlint/textlint/wiki/Collection-of-textlint-rule \"Collection of textlint rule · textlint/textlint Wiki\")\n\ntextlint has no built-in rules, but there are 100+ pluggable rules:\n\n- [textlint-rule-no-todo](https://github.com/textlint-rule/textlint-rule-no-todo)\n- [textlint-rule-max-number-of-lines](https://github.com/azu/textlint-rule-max-number-of-lines)\n- [textlint-rule-common-misspellings](https://github.com/io-monad/textlint-rule-common-misspellings)\n- [etc...](https://github.com/textlint/textlint/wiki/Collection-of-textlint-rule)\n\nSee [A Collection of textlint rule · textlint/textlint Wiki](https://github.com/textlint/textlint/wiki/Collection-of-textlint-rule \"Collection of textlint rule · textlint/textlint Wiki\") for more details.\n\nIf you create a new rule, please add it to the wiki :)\n\n### Fixable\n\n[![textlint rule](https://img.shields.io/badge/textlint-fixable-green.svg?style=social)](https://textlint.org/)\n\nSome rules are fixable using the `--fix` command line flag.\n\n``` sh\n$ npx textlint --fix README.md\n# If possible, textlint will fix the content.\n```\n\n![fixable-error](./docs/assets/fixable-error.png)\n\nAlso, support [dry run](https://en.wikipedia.org/wiki/Dry_run_(testing) \"dry run\") mode.\n\n```\n$ npx textlint --fix --dry-run --format diff README.md\n# show the difference between fixed content and original content.\n```\n\nYou can copy and paste to your README.\n\n```markdown\n[![textlint fixable rule](https://img.shields.io/badge/textlint-fixable-green.svg?style=social)](https://textlint.org/)\n```\n\n### Built-in formatters\n\nUse the following formatters:\n\n- stylish (defaults)\n- compact\n- checkstyle\n- github\n- jslint-xml\n- junit\n- tap\n- table\n- pretty-error\n- json\n- unix\n\ne.g. use `pretty-error` formatter:\n\n```\n$ npx textlint -f pretty-error file.md\n```\n\nMore details in [@textlint/linter-formatter](./packages/@textlint/linter-formatter \"@textlint/linter-formatter\").\n\n## Use as node module\n\nYou can use textlint as node module.\n\n```\n$ npm install textlint --save-dev\n```\n\nMinimal usage:\n\n```js\nimport { createLinter, loadTextlintrc, loadLinterFormatter } from \"textlint\";\nconst descriptor = await loadTextlintrc();\nconst linter = createLinter({ descriptor });\nconst results = await linter.lintFiles([\"*.md\"]);\n// textlint has two types formatter sets for linter and fixer\nconst formatter = await loadLinterFormatter({ formatterName: \"stylish\" });\nconst output = formatter.format(results);\nconsole.log(output);\n```\n\nFor more details, please read the following documents:\n\n- See [docs/use-as-modules.md](docs/use-as-modules.md)\n\n[@textlint/kernel](./packages/@textlint/kernel \"@textlint/kernel\") is a low level API for textlint.\nIt is useful for the browser or non-Node.js environments.\n\n```js\nimport { TextlintKernel } from \"@textlint/kernel\";\nconst kernel = new TextlintKernel();\nconst options = {\n    filePath: \"/path/to/file.md\",\n    ext: \".md\",\n    plugins: [\n        {\n            pluginId: \"markdown\",\n            plugin: require(\"@textlint/textlint-plugin-markdown\")\n        }\n    ],\n    rules: [\n        {\n            ruleId: \"no-todo\",\n            rule: require(\"textlint-rule-no-todo\").default\n        }\n    ]\n};\nkernel.lintText(\"TODO: text\", options).then(result =\u003e {\n    assert.ok(typeof result.filePath === \"string\");\n    assert.ok(result.messages.length === 1);\n});\n```\n\n\n\n## Conclusion\n\ntextlint has four extensible points:\n\n- [rule](docs/rule.md)\n    - rule is a rule for linting.\n- [filter rule](docs/filter-rule.md)\n    - filter rule is a rule for filtering result of errors.\n- [rule-preset](docs/rule-preset.md)\n    - rule-preset contains rules.\n- [plugin](docs/plugin.md)\n    - plugin contains a processor.\n\n![rule-preset-plugin](docs/assets/rule-preset-plugin.png)\n\n## FAQ: How to create rules?\n\nPlease see docs/\n\n- [docs/txtnode.md](docs/txtnode.md)\n    - What is TxtNode?\n- [docs/rule.md](docs/rule.md)\n    - How to create rules?\n    - Tutorial: creating `no-todo` rule.\n- [docs/rule-advanced.md](docs/rule-advanced.md)\n    - Advanced tutorial for creating rule.\n\n## FAQ: How to suppress error by comments like `\u003c!-- textlint-disable --\u003e`?\n\nYou can use filter rule like [textlint-filter-rule-comments](https://github.com/textlint/textlint-filter-rule-comments \"textlint-filter-rule-comments\").\n\nPlease see [Ignoring Text · textlint](https://textlint.org/docs/ignore.html) for more details.\n\n## Integrations\n\nFor more details, see [integrations document](./docs/integrations.md).\n\n### AI Assistants (MCP)\n\ntextlint can be used as a [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server, enabling AI assistants to interact with textlint directly:\n\n```bash\nnpx textlint --mcp\n```\n\nSupported editors:\n- VS Code with GitHub Copilot\n- Cursor\n- Windsurf\n- etc.\n\nFor setup instructions, see [MCP Setup Guide](./docs/mcp.md).\n\n### App\n\n- [textlint-app](https://github.com/textlint/textlint-app \"textlint-app\")\n  - Standalone cross platform app. No need Node.js environment.\n\n### Build Systems\n\n- gulp plugin\n  - [gulp-textlint](https://github.com/textlint/gulp-textlint \"gulp-textlint\")\n- Grunt plugin\n  - [grunt-textlint](https://github.com/textlint/grunt-textlint \"grunt-textlint\")\n\n### Editors\n\n- Atom Editor\n  - [1000ch/linter-textlint](https://github.com/1000ch/linter-textlint \"1000ch/linter-textlint\")\n- SublimeText\n  - [joeybaker/sublimelinter-textlint](https://github.com/joeybaker/sublimelinter-textlint)\n- Vim\n  - [vim-textlint](https://github.com/heavenshell/vim-textlint \"vim-textlint\")\n  - [scrooloose/syntastic](https://github.com/vim-syntastic/syntastic \"scrooloose/syntastic\")\n    - See [Markdown](https://github.com/vim-syntastic/syntastic/wiki/Markdown \"Markdown\"), [Text](https://github.com/vim-syntastic/syntastic/wiki/Text \"Text\") and [HTML](https://github.com/vim-syntastic/syntastic/wiki/HTML \"HTML\") of [scrooloose/syntastic Wiki](https://github.com/vim-syntastic/syntastic/wiki/Syntax-Checkers \"Syntax Checkers · scrooloose/syntastic Wiki\")\n- VS Code\n  - [textlint/vscode-textlint](https://github.com/textlint/vscode-textlint)\n- [micro](https://github.com/zyedidia/micro \"micro\")\n  - [hidaruma/micro-textlint-plugin](https://github.com/hidaruma/micro-textlint-plugin \"hidaruma/micro-textlint-plugin: textlint plugin for micro-editor\")\n- NetBeans\n  - [netbeans-textlint-plugin](https://github.com/junichi11/netbeans-textlint-plugin \"netbeans-textlint-plugin\")\n\n### Browser\n\n- Chrome Extension\n  - [Chrome: textlint-proofreader](https://chrome.google.com/webstore/detail/textlint-proofreader/hdongmdneapmhfblomidbafplpanpdmm)\n  - [io-monad/textlint-chrome-extension: textlint Chrome Extension](https://github.com/io-monad/textlint-chrome-extension \"io-monad/textlint-chrome-extension: textlint Chrome Extension\")\n\n### Other\n\n- [Pronto](https://github.com/prontolabs/pronto \"Pronto\"): [pronto-textlint](https://github.com/seikichi/pronto-textlint \"pronto-textlint\")\n- [reviewdog](https://github.com/reviewdog/reviewdog \"reviewdog\"): [azu/textlint-reviewdog-example](https://github.com/azu/textlint-reviewdog-example \"azu/textlint-reviewdog-example: textlint + reviewdog example project\")\n\n## Who's using textlint?\n\n- [survivejs/webpack-book](https://github.com/survivejs/webpack-book \"survivejs/webpack-book: From apprentice to master (CC BY-NC-ND)\")\n- [hoodiehq/hoodie](https://github.com/hoodiehq/hoodie \"hoodiehq/hoodie\")\n- [asciidwango/js-primer](https://github.com/asciidwango/js-primer \"asciidwango/js-primer: JavaScriptの入門書\")\n- [vuejs-jp/vuejs.org](https://github.com/vuejs-jp/jp.vuejs.org \"vuejs-jp/vuejs.org\")\n- [cypress-io/cypress-documentation](https://github.com/cypress-io/cypress-documentation \"cypress-io/cypress-documentation: Cypress Documentation including Guides, API, Plugins, Examples, \u0026 FAQ. docs.cypress.io\")\n\n## Packages\n\nThis repository is a monorepo that we manage using [Lerna](https://github.com/lerna/lerna). That means that we actually publish [several packages](./packages) to npm from the same codebase, including:\n\n### Core\n\nThese modules are parts of textlint.\n\n| Package                                  | Version                                  | Description                                             |\n| :--------------------------------------- | :--------------------------------------- |:--------------------------------------------------------|\n| [`textlint`](./packages/textlint)        | [![npm](https://img.shields.io/npm/v/textlint.svg?style=flat-square)](https://www.npmjs.com/package/textlint) | textlint command line tool itself                       |\n| [`@textlint/kernel`](./packages/@textlint/kernel) | [![npm](https://img.shields.io/npm/v/@textlint/kernel.svg?style=flat-square)](https://www.npmjs.com/package/@textlint/kernel) | textlint main logic module. It is universal JavaScript. |\n| [`@textlint/linter-formatter`](./packages/@textlint/linter-formatter) | [![npm](https://img.shields.io/npm/v/@textlint/linter-formatter.svg?style=flat-square)](https://www.npmjs.com/package/@textlint/linter-formatter) | textlint output formatter                               |\n| [`@textlint/fixer-formatter`](./packages/@textlint/fixer-formatter) | [![npm](https://img.shields.io/npm/v/@textlint/fixer-formatter.svg?style=flat-square)](https://www.npmjs.com/package/@textlint/fixer-formatter) | textlint output formatter for fixer                     |\n| [`@textlint/textlint-plugin-markdown`](./packages/@textlint/textlint-plugin-markdown) | [![npm](https://img.shields.io/npm/v/@textlint/textlint-plugin-markdown.svg?style=flat-square)](https://www.npmjs.com/package/@textlint/textlint-plugin-markdown) | markdown support for textlint                           |\n| [`@textlint/textlint-plugin-text`](./packages/@textlint/textlint-plugin-text) | [![npm](https://img.shields.io/npm/v/@textlint/textlint-plugin-text.svg?style=flat-square)](https://www.npmjs.com/package/@textlint/textlint-plugin-text) | plain text support for textlint                         |\n| [`@textlint/ast-tester`](./packages/@textlint/ast-tester) | [![npm](https://img.shields.io/npm/v/@textlint/ast-tester.svg?style=flat-square)](https://www.npmjs.com/package/@textlint/ast-tester) | Compliance tests for textlint's AST                     |\n| [`@textlint/markdown-to-ast`](./packages/@textlint/markdown-to-ast) | [![npm](https://img.shields.io/npm/v/@textlint/markdown-to-ast.svg?style=flat-square)](https://www.npmjs.com/package/@textlint/markdown-to-ast) | markdown parser                                         |\n| [`@textlint/ast-traverse`](./packages/@textlint/ast-traverse) | [![npm](https://img.shields.io/npm/v/@textlint/ast-traverse.svg?style=flat-square)](https://www.npmjs.com/package/@textlint/ast-traverse) | TxtNode traverse library                                |\n| [`@textlint/text-to-ast`](./packages/@textlint/text-to-ast)    | [![npm](https://img.shields.io/npm/v/@textlint/text-to-ast.svg?style=flat-square)](https://www.npmjs.com/package/@textlint/text-to-ast) | plain text parser                                       |\n| [`@textlint/config-loader`](./packages/@textlint/config-loader)    | [![npm](https://img.shields.io/npm/v/@textlint/config-loader.svg?style=flat-square)](https://www.npmjs.com/package/@textlint/config-loader) | Load .textlintrc config file                            |\n\n\n### Rule/Plugin helper\n\nThese modules are useful for textlint rule/plugin author.\n\n| Package                                  | Version                                  | Description                              |\n| :--------------------------------------- | :--------------------------------------- | :--------------------------------------- |\n| [`@textlint/ast-node-types`](./packages/@textlint/ast-node-types) | [![npm](https://img.shields.io/npm/v/@textlint/ast-node-types.svg?style=flat-square)](https://www.npmjs.com/package/@textlint/ast-node-types) | [textlint AST(Abstract Syntax Tree)](./docs/txtnode.md) type definition |\n| [`textlint-tester`](./packages/textlint-tester) | [![npm](https://img.shields.io/npm/v/textlint-tester.svg?style=flat-square)](https://www.npmjs.com/package/textlint-tester) | textlint rule testing tools              |\n| [`textlint-scripts`](https://github.com/textlint/textlint-scripts) | [![npm](https://img.shields.io/npm/v/textlint-scripts.svg?style=flat-square)](https://www.npmjs.com/package/textlint-scripts) | textlint rule npm run-scripts            |\n| [`create-textlint-rule`](https://github.com/textlint/create-textlint-rule) | [![npm](https://img.shields.io/npm/v/create-textlint-rule.svg?style=flat-square)](https://www.npmjs.com/package/create-textlint-rule) | create textlint rule with no build configuration |\n\n\n### Integrations\n\nThese modules are useful integration with textlint.\n\n| Package                                  | Version                                  | Description              |\n| :--------------------------------------- | :--------------------------------------- | :----------------------- |\n| [`gulp-textlint`](./packages/gulp-textlint) | [![npm](https://img.shields.io/npm/v/gulp-textlint.svg?style=flat-square)](https://www.npmjs.com/package/gulp-textlint) | gulp plugin for textlint |\n\n\n### Internal\n\nThese modules are internal usage in the monorepo.\n\n| Package                                  | Version                                  | Description          |\n| :--------------------------------------- | :--------------------------------------- | :------------------- |\n| [`@textlint/feature-flag`](./packages/@textlint/feature-flag) | [![npm](https://img.shields.io/npm/v/@textlint/feature-flag.svg?style=flat-square)](https://www.npmjs.com/package/@textlint/feature-flag) | feature flag manager |\n\n\n## Semantic Versioning Policy\n\ntextlint project follow [Semantic Versioning](https://semver.org/ \"Semantic Versioning\").\nHowever, textlint is not different from most semver project.\n\n- Patch release (intended to not break your lint build)\n    - A bug fix to the CLI or core (including formatters).\n    - Improvements to documentation.\n    - Non-user-facing changes such as refactoring.\n    - Re-releasing after a failed release (i.e., publishing a release that doesn't work for anyone).\n- Minor release (might break your lint build)\n    - A new option.\n    - An existing rule is deprecated.\n    - A new CLI capability is created.\n    - New public API are added (new classes, new methods, new arguments to existing methods, etc.).\n        - It might break type interface(`.d.ts`)\n    - A new formatter is created.\n- Major release (break your lint build)\n    - A new option to an existing rule that results in textlint reporting more errors by default.\n    - An existing formatter is removed.\n    - Part of the public API is removed or changed in an incompatible way.\n\n## Contributing\n\nFor bugs and feature requests, [please create an issue](https://github.com/textlint/textlint/issues).\n\nPull requests are always welcome.\n\nFor more details, see [Contributing Guide](docs/CONTRIBUTING.md).\n\n## License\n\nMIT © azu\n\nCopy some code from ESLint.\n\n    ESLint\n    Copyright (c) 2013 Nicholas C. Zakas. All rights reserved.\n    https://github.com/eslint/eslint/blob/master/LICENSE\n\n## Logos \u0026 Icons\n\nDownload from [textlint/media](https://github.com/textlint/media \"textlint/media: Official logo and icon.\").\n\n## Related Work\n\n\u003c!-- textlint-disable --\u003e\n\n- [SCG: TextLint](http://scg.unibe.ch/research/textlint \"SCG: TextLint\")\n\n## Acknowledgements\n\nThanks to [ESLint](https://eslint.org/ \"ESLint\").\n\n\u003ca href=\"https://www.netlify.com\"\u003e\n  \u003cimg src=\"https://www.netlify.com/img/global/badges/netlify-light.svg\"/\u003e\n\u003c/a\u003e\n\n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/textlint/textlint)\n\n\u003c!-- textlint-enable --\u003e\n","funding_links":["https://github.com/sponsors/azu"],"categories":["TypeScript","Repository","Uncategorized","Packages","JavaScript","其他工具"],"sub_categories":["Linter \u0026 Formatter","Uncategorized","检查与辅助"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftextlint%2Ftextlint","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftextlint%2Ftextlint","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftextlint%2Ftextlint/lists"}