{"id":13660581,"url":"https://github.com/peerigon/scriptlint","last_synced_at":"2025-08-15T20:55:25.030Z","repository":{"id":37968979,"uuid":"225364544","full_name":"peerigon/scriptlint","owner":"peerigon","description":"an enforceable script naming standard for package.json","archived":false,"fork":false,"pushed_at":"2023-10-19T01:32:23.000Z","size":2295,"stargazers_count":133,"open_issues_count":11,"forks_count":1,"subscribers_count":13,"default_branch":"main","last_synced_at":"2025-08-09T15:44:10.228Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/peerigon.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-12-02T11:58:29.000Z","updated_at":"2025-02-06T11:22:17.000Z","dependencies_parsed_at":"2024-06-18T20:01:08.878Z","dependency_job_id":"5fdcf0a2-6065-40ca-9b75-c5988c62ba70","html_url":"https://github.com/peerigon/scriptlint","commit_stats":{"total_commits":140,"total_committers":6,"mean_commits":"23.333333333333332","dds":0.3285714285714286,"last_synced_commit":"f971a83b4b63dd9e50d9c8301372f3fe21266f80"},"previous_names":[],"tags_count":27,"template":false,"template_full_name":null,"purl":"pkg:github/peerigon/scriptlint","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peerigon%2Fscriptlint","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peerigon%2Fscriptlint/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peerigon%2Fscriptlint/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peerigon%2Fscriptlint/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/peerigon","download_url":"https://codeload.github.com/peerigon/scriptlint/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peerigon%2Fscriptlint/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270630143,"owners_count":24619370,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-15T02:00:12.559Z","response_time":110,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2024-08-02T05:01:23.268Z","updated_at":"2025-08-15T20:55:24.986Z","avatar_url":"https://github.com/peerigon.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"\u003cimg src=\"https://raw.githubusercontent.com/peerigon/scriptlint/main/assets/scriptlint-logo.png\" width=\"150\" height=\"150\"\u003e\u003cbr\u003e\n\n[![scriptlint status](https://img.shields.io/endpoint?url=https://scriptlint.peerigon.io/api/shield/scriptlint/latest)](https://scriptlint.peerigon.io/issues/scriptlint/latest)  \n[![npm version badge](https://img.shields.io/npm/v/scriptlint?style=flat-square)](https://npmjs.com/package/scriptlint)  \n[![dependency badge](https://img.shields.io/librariesio/release/npm/scriptlint?style=flat-square)](https://libraries.io/npm/scriptlint)  \n[![Issue badge](https://img.shields.io/github/issues/peerigon/scriptlint?style=flat-square)](https://github.com/peerigon/scriptlint/issues)  \n[![CI badge](https://github.com/peerigon/scriptlint/workflows/ci/badge.svg)](https://github.com/peerigon/scriptlint/actions?query=workflow%3Aci)\n\n# scriptlint\n\nEnforceable standards for your package.json scripts – like eslint for `npm run`\n\n⚠️ Requires nodejs \u003e= 14.x.x\n\n## Intro\n\n`package.json` scripts are an integral part of the Node dev experience: we use them to start our projects, run our dev environments and for all kinds of formatting, linting and tooling in general. They are just as important as our code. Yet we don't treat them with the same meticulous attention to detail. **Scripts need :heart: too!**\n\nOne of the main goals for scriptlint was to enable people to use memorable and consistent script names across their projects. Tools like [nps](https://github.com/sezna/nps) are great when you have to organize scripts with a certain level of complexity, but they don't help you with the structure and naming of your scripts.\n\nThis is where the scriptlint CLI shines: it makes best practices outlined in this documentation enforceable throughout your project(s). Think of it as eslint for your `\"scripts\"` section.\n\n## Rules\n\nHere's the tl;dr of all the best practices we consider the \"`scriptlint` standard\"\n\nYour `package.json`'s `\"scripts\"` section should…\n\n-   have a `test` script that is not the default script from `npm init`\n-   have a `dev` script and a `start` script\n-   _abstract script names from their implementation (`test`, not `jest`)_\n-   _use namespaces to categorize scripts (`\"test:unit\": \"jest\"`)_\n-   _use `:` as a namespace separator_\n-   _have the scripts in alphabetic order_\n-   _have a trigger script for all hooks (ex: if you have `prefoobar`, there must be a `foobar` script)_\n-   _use `camelCase` for all script names_\n-   _not alias `devDependencies` (no `\"jest\": \"jest\"`)_\n-   _not use `\u0026\u0026` or `\u0026` for sequential or parallel script execution_\n\n(_italic = strict rule_)\n\n[Read more about the standard rules here](https://github.com/peerigon/scriptlint/wiki/The-scriptlint-%22standard%22-tl%3Bdr)\n\n## Usage\n\nInstall locally:\n\n`npm install scriptlint -D` (or `yarn add scriptlint -D`)\n\n… then run `npx scriptlint --strict`\n\n[Read about configuration here](https://github.com/peerigon/scriptlint/wiki/Configuration)\n\n# Documentation\n\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/peerigon/scriptlint/wiki/Motivation\"\u003eMotivation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/peerigon/scriptlint/wiki/The-scriptlint-%22standard%22-tl%3Bdr\"\u003eThe\nscriptlint \"standard\" tl;dr\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003ca href=\"https://github.com/peerigon/scriptlint/wiki/The-scriptlint-%22standard%22\"\u003eThe\nscriptlint\n\"standard\"\u003c/a\u003e\n\u003col\u003e\n\u003cli\u003eRules enforceable via the scriptlint CLI\n\u003col\u003e\n\u003cli\u003e\n\u003ca\nhref=\"https://github.com/peerigon/scriptlint/wiki/The-scriptlint-%22standard%22#minimum-rules\"\u003eMinimum\nrules\u003c/a\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca\nhref=\"https://github.com/peerigon/scriptlint/wiki/The-scriptlint-%22standard%22#mandatory-start-mandatory-dev-and-mandatory-test\"\u003emandatory-start\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref=\"https://github.com/peerigon/scriptlint/wiki/The-scriptlint-%22standard%22#mandatory-start-mandatory-dev-and-mandatory-test\"\u003emandatory-dev\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref=\"https://github.com/peerigon/scriptlint/wiki/The-scriptlint-%22standard%22#mandatory-start-mandatory-dev-and-mandatory-test\"\u003emandatory-test\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref=\"https://github.com/peerigon/scriptlint/wiki/The-scriptlint-%22standard%22#mandatory-start-mandatory-dev-and-mandatory-test\"\u003eno-default-test\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003eStrict rules\n\u003col\u003e\n\u003cli\u003e\u003ca\nhref=\"https://github.com/peerigon/scriptlint/wiki/uses-allowed-namespace\"\u003euses-allowed-namespace\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref=\"https://github.com/peerigon/scriptlint/wiki/alphabetic-order\"\u003ealphabetic-order\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/peerigon/scriptlint/wiki/correct-casing\"\u003ecorrect-casing\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/peerigon/scriptlint/wiki/no-aliases\"\u003eno-aliases\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref=\"https://github.com/peerigon/scriptlint/wiki/prepost-trigger-defined\"\u003eprepost-trigger-defined\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref=\"https://github.com/peerigon/scriptlint/wiki/no-unix-double-ampersand\"\u003eno-unix-double-ampersand\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca\nhref=\"https://github.com/peerigon/scriptlint/wiki/no-unix-single-ampersand\"\u003eno-unix-single-ampersand\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/peerigon/scriptlint/wiki/Best-practices\"\u003eBest\npractices\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003eThe scriptlint CLI\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/peerigon/scriptlint/wiki/Installation\"\u003eInstallation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/peerigon/scriptlint/wiki/Usage\"\u003eUsage\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/peerigon/scriptlint/wiki/Configuration\"\u003eConfiguration\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/peerigon/scriptlint/wiki/Extending\"\u003eExtending\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/peerigon/scriptlint/wiki/Use-as-a-JavaScript-module\"\u003eUse as a\nJavaScript module\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/peerigon/scriptlint/wiki/Contributing-to-scriptlint\"\u003eContributing to\nscriptlint\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\n## Badge\n\nWould you like a scriptlint badge for your project readme? No problem: have a look at https://scriptlint.peerigon.io/ or adapt the snippet below:\n\n```markdown\n[![scriptlint status](https://img.shields.io/endpoint?url=https://scriptlint.peerigon.io/api/shield/scriptlint/latest)](https://scriptlint.peerigon.io/issues/scriptlint/latest)\n```\n\n---\n\n## Sponsors\n\n[\u003cimg src=\"https://assets.peerigon.com/peerigon/logo/peerigon-logo-flat-spinat.png\" width=\"150\" /\u003e](https://peerigon.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeerigon%2Fscriptlint","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpeerigon%2Fscriptlint","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeerigon%2Fscriptlint/lists"}