{"id":15819389,"url":"https://github.com/xunnamius/git-add-then-commit","last_synced_at":"2025-05-07T21:41:55.120Z","repository":{"id":37086599,"uuid":"325910905","full_name":"Xunnamius/git-add-then-commit","owner":"Xunnamius","description":"🔭 A minimalist CLI tool to automate the git-add-then-commit workflow when composing atomic commits with \"conventional\" messages","archived":false,"fork":false,"pushed_at":"2024-09-20T15:11:04.000Z","size":5387,"stargazers_count":2,"open_issues_count":12,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-01T18:18:47.181Z","etag":null,"topics":["add","angular","commit","commits","conventional","conventional-commit","git","release","semantic"],"latest_commit_sha":null,"homepage":"https://npm.im/git-add-then-commit","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/Xunnamius.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":".github/SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-01-01T03:32:14.000Z","updated_at":"2024-09-20T15:11:08.000Z","dependencies_parsed_at":"2024-10-05T06:41:09.159Z","dependency_job_id":"d1c94bf2-d15b-425b-8576-7f6478c9dee2","html_url":"https://github.com/Xunnamius/git-add-then-commit","commit_stats":{"total_commits":326,"total_committers":3,"mean_commits":"108.66666666666667","dds":0.3711656441717791,"last_synced_commit":"a5d786ead2862c8556b921d0612a3a79a5963014"},"previous_names":[],"tags_count":34,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Xunnamius%2Fgit-add-then-commit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Xunnamius%2Fgit-add-then-commit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Xunnamius%2Fgit-add-then-commit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Xunnamius%2Fgit-add-then-commit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Xunnamius","download_url":"https://codeload.github.com/Xunnamius/git-add-then-commit/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252961736,"owners_count":21832189,"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","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":["add","angular","commit","commits","conventional","conventional-commit","git","release","semantic"],"created_at":"2024-10-05T06:40:44.716Z","updated_at":"2025-05-07T21:41:55.090Z","avatar_url":"https://github.com/Xunnamius.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- prettier-ignore-start --\u003e\n\n\u003c!-- badges-start --\u003e\n\n[![Black Lives Matter!][badge-blm]][link-blm]\n[![Last commit timestamp][badge-last-commit]][link-repo]\n[![Open issues][badge-issues]][link-issues]\n[![Pull requests][badge-pulls]][link-pulls]\n[![Codecov][badge-codecov]][link-codecov]\n[![Source license][badge-license]][link-license]\n[![NPM version][badge-npm]][link-npm]\n[![Uses Semantic Release!][badge-semantic-release]][link-semantic-release]\n\n\u003c!-- badges-end --\u003e\n\n\u003c!-- prettier-ignore-end --\u003e\n\n# git-add-then-commit\n\nA minimalist CLI tool to automate the ↯ `git add X` ↯ `git commit -m 'Y(Z): W'`\n↯ workflow and help you compose [atomic][7] [consistent][2] [conventional\ncommits][10] quickly and easily.\n\n## Install\n\n```bash\nnpm install --global git-add-then-commit\n```\n\n## Usage\n\n```bash\ngac [path1, path2, ...] commit-type commit-scope commit-message\n```\n\n\u003e You can use `--help` to get help text output, `--version` to get the current\n\u003e version, and `--silent` to prevent all output.\n\nFor a repository using [conventional commits][10], your commit flow might go\nsomething like this:\n\n```bash\ngit add path/to/file2\ngit commit -m 'feat(file2): add new killer feature'\n```\n\nWhere the commit message has:\n\n- Type: **feat**\n- Scope: **file2**\n- Subject (or message): **add new killer feature**\n\nWith `git-add-then-commit` (`gac`), this can be simplified to:\n\n```bash\ngit add path/to/file2\ngac feat file2 'add new killer feature'\n```\n\nAnd further simplified to:\n\n```bash\ngac path/to/file2 feat file2 'add new killer feature'\n```\n\nAnd even further (using a scope option):\n\n```bash\ngac path/to/file2 feat -- 'add new killer feature'\n```\n\nAnd further still:\n\n```bash\ngac path feat -- 'add new killer feature'\n```\n\n### Scope Options\n\n`--` as used in the example above is a _scope option_, which can be used in\nplace of `commit-scope`.\n\n\u003e To maintain scope consistency in generated changelogs with minimal effort,\n\u003e favor the [`--scope-root`][2] and [`--scope-omit`][3] scope options.\n\n#### Basename\n\n`--` (or: `--scope-basename`) will generate a commit message using the\nlowercased _basename_ of 1) the first path passed to `gac` or 2) the first\nstaged path returned by `git status`. The basename is always lowercased.\n\nIf more than one file is staged and no paths are passed to `gac`, using\n`--scope-basename` will cause an ambiguity error.\n\n#### Omit\n\n`-` (or: `--scope-omit`) will generate a commit message with no scope.\n\n##### Example\n\nGiven the following filesystem structure:\n\n    .\n    └── src\n        └── index.ts \u003cMODIFIED\u003e\n\nThe following are equivalent:\n\n```bash\ngac src feat - 'add new killer feature'\n\ngit add src/index.ts\ngit commit -m 'feat: add new killer feature'\n```\n\n#### As-is\n\n`-a` (or: `--scope-as-is`) will generate a commit message using the first path\npassed to `gac` [_exactly as typed_][12].\n\nIf no paths are passed to `gac`, using `--scope-as-is` will cause an ambiguity\nerror.\n\n##### Example\n\nGiven the following filesystem structure:\n\n    .\n    └── src\n        ├── iNdex.ts \u003cMODIFIED\u003e\n        ├── cli.ts \u003cMODIFIED\u003e\n        ├── errors.ts \u003cMODIFIED\u003e\n        └── git.ts \u003cMODIFIED\u003e\n\nThe following are equivalent:\n\n```bash\ngac src/iNdex.ts src feat --scope-as-is 'add new killer feature'\n\ngit add src/iNdex.ts\ngit add src/cli.ts\ngit add src/errors.ts\ngit add src/git.ts\ngit commit -m 'feat(src/iNdex.ts): add new killer feature'\n```\n\n#### Full\n\n`-f` (or: `--scope-full`) will generate a commit message using the \"full\" or\nabsolute path (relative to the repository root) of the first path passed to\n`gac`.\n\nIf no path arguments are passed, `--scope-full` will use the full path—including\nfilename and extension—if there is exactly one path or staged file, the deepest\ncommon ancestor of all paths/files if there is more than one (or the first path\nis ambiguous), or fail with an ambiguity error if there is no relative common\nancestor.\n\nRegardless, the final `commit-scope` is always lowercased.\n\n##### Example\n\nGiven the following filesystem structure:\n\n    .\n    ├── public\n    │   └── images\n    │       ├── favicon.ico \u003cMODIFIED\u003e\n    │       ├── hero.png\n    │       └── villain.png\n    ├── src\n    │   ├── index.ts \u003cMODIFIED\u003e\n    │   └── interface\n    │       ├── cli.ts \u003cMODIFIED\u003e\n    │       └── git.ts\n    └── test\n        ├── units.ts\n        └── fixtures\n            ├── dummy-1.ts \u003cMODIFIED\u003e\n            └── dummy-2.ts \u003cMODIFIED\u003e\n\nThe following are equivalent:\n\n```bash\ngac src feat --scope-full 'add new killer feature'\n\ngit add src/index.ts\ngit add src/interface/cli.ts\ngit commit -m 'feat(src): add new killer feature'\n```\n\n```bash\ngac test refactor --scope-full 'update tests for new feature'\n\ngit add test/fixtures/dummy-1.ts\ngit add test/fixtures/dummy-2.ts\ngit commit -m 'refactor(test/fixtures): update tests for new feature'\n```\n\n```bash\ngac public style --scope-full 'new favicon'\n\ngit add public\ngit commit -m 'style(public/images/favicon.ico): new favicon'\n```\n\n#### Root\n\n`---` (or: `--scope-root`) will generate a commit message with a more\n\"photogenic\" scope. That is, commit messages derived using this option tend to\nlook nicer in [generated changelogs][5]. Specifically:\n\n- A small, consistently derived set of scopes are used across the lifetime of\n  the repository.\n- Derived scopes are analogous to filesystem structure.\n- Derived scopes tend to be short, sweet, and mostly alphanumeric.\n\nLike [`--scope-full`][6], `--scope-root` will derive `commit-scope` from the\nfirst path argument passed to `gac`.\n\n\u003e The path used to derive the `commit-scope` is referred to below as the\n\u003e _selected path_.\n\nUnlike [`--scope-full`][6], **only the _first directory_ (left-to-right) in the\nselected path—rather than the deepest common ancestor—is used to derive\n`commit-scope`**.\n\n\u003e For example, `path` in selected path `path/to/some/file` is the first\n\u003e directory.\n\nIf no path arguments are passed and there is exactly one staged file,\n`--scope-root` will use that file as the selected path. If there is more than\none staged file (or the first path is ambiguous) and their paths share a common\nancestor directory other than the repository root, the deepest common ancestor\nbecomes the selected path; if there is no valid common ancestor, the operation\nfails with an ambiguity error.\n\n\u003e An ambiguity error using `--scope-root` is usually a hint to construct [a more\n\u003e fine-grain commit][7].\n\nIf the selected path has no first directory, i.e. it points to a file at the\nroot of the repository, the filename is used as `commit-scope` instead with its\nfile extension removed (see `package.json` in the examples below).\n\nOn the other hand, if the selected path has:\n\n- A first directory matching `commit-type` (see `test` in the examples below):\n\n  - If there is a _second directory_ in the selected path, the second directory\n    is used to derive the `commit-scope` instead.\n\n    \u003e For example, `to` in `path/to/some/file` is the second directory.\n\n  - If there is no second directory, the filename (sans extension) is used to\n    derive the `commit-scope` _only if the file is not named \"index\"_.\n\n  - If there is no second directory and the file _is_ named \"index\" (sans\n    extension), `commit-scope` is [omitted][3].\n\n- A first directory named \"packages\" (see [Monorepo Pseudo-Pathspecs][4] below):\n\n  - If there is a _second directory_ in the selected path that is a common\n    ancestor, the first _and_ second directories are used to derive the\n    `commit-scope` instead.\n\n    \u003e For example, `packages/pkg-1` when committing `packages/pkg-1/some/file`\n    \u003e and `packages/pkg-1/some/other/file`\n\n  - If \"packages\" (as the first directory) is the deepest common ancestor in the\n    selected path—i.e. it's a commit spanning multiple monorepo packages—only\n    the first directory is used to derive the `commit-scope`, which is the\n    normal behavior.\n\n    \u003e For example, `packages` when committing `packages/pkg-1/some/file` and\n    \u003e `packages/pkg-TWO/some/file`\n\n- A first directory with a name beginning with \"external\":\n\n  - `commit-scope` becomes \"externals\".\n\nAt the end of the process, if it has not already been omitted, `commit-scope` is\nlowercased and [split][15] on `\".\"` with the first element used as the final\n`commit-scope`. Finally, if `commit-scope` matches `commit-type`, `commit-scope`\nis [omitted][3].\n\n##### Example\n\nGiven the following filesystem structure:\n\n    .\n    ├── CHANGELOG.md \u003cMODIFIED\u003e\n    ├── CONTRIBUTING.md\n    ├── docs\n    │   ├── supplementary.md \u003cMODIFIED\u003e\n    │   └── README.md \u003cMODIFIED\u003e\n    ├── external-scripts\n    │   └── my-script.ts \u003cMODIFIED\u003e\n    ├── index.ts \u003cMODIFIED\u003e\n    ├── identity.trifold.ts \u003cMODIFIED\u003e\n    ├── lib\n    │   ├── api\n    │   │   └── adapter.trifold.ts \u003cMODIFIED\u003e\n    │   ├── index.ts \u003cMODIFIED\u003e\n    │   ├── cli.ts \u003cMODIFIED\u003e\n    │   └── git.ts\n    ├── package-lock.json \u003cMODIFIED\u003e\n    ├── package.json \u003cMODIFIED\u003e\n    ├── README.md\n    └── test\n        ├── index.ts \u003cMODIFIED\u003e\n        ├── integrations\n        │   ├── browser-tests.ts\n        │   ├── e2e-tests.ts \u003cMODIFIED\u003e\n        │   └── index.ts \u003cMODIFIED\u003e\n        └── units.ts \u003cMODIFIED\u003e\n\nThe following are equivalent:\n\n```bash\ngac identity.trifold.ts feat --- 'added identity trifold subroutine'\n\ngit add identity.trifold.ts\ngit commit -m 'feat(identity): added identity trifold subroutine'\n```\n\n```bash\ngac lib/index.ts fix --- 'fix bug that caused crash'\n\ngit add lib/index.ts\ngit commit -m 'fix(lib): fix bug that caused crash'\n```\n\n```bash\ngac lib/api refactor --- 'use updated mongodb trifold driver'\n\ngit add lib/api/adapter.trifold.ts\ngit commit -m 'refactor(lib): use updated mongodb trifold driver'\n```\n\n```bash\ngac package.json package-lock.json chore --- 'update dependencies'\n\ngit add package.json\ngit add package-lock.json\ngit commit -m 'chore(package): update dependencies'\n```\n\n```bash\ngit add docs\ngac docs --- 'add sections on new killer feature'\n# one-liner: gac docs docs --- 'add sections on new killer feature'\n\ngit add docs\ngit commit -m 'docs: add sections on new killer feature'\n```\n\n```bash\ngac test/integrations/index.ts test --- 'update integration tests'\n\ngit add test/integrations/index.ts\ngit commit -m 'test(integrations): update integration tests'\n```\n\n```bash\ngac test/integrations style --- 'use emojis in all TODO comments'\n\ngit add test/integrations/e2e-tests.ts\ngit commit -m 'style(test): use emojis in all TODO comments'\n```\n\n```bash\ngac test/index.ts test --- 'update tooling to use latest features'\n\ngit add test/index.ts\ngit commit -m 'test: update tooling to use latest features'\n```\n\n```bash\ngac test test --- 'add unit tests for new killer feature'\n\ngit add test/units.ts\ngit commit -m 'test(units): add unit tests for new killer feature'\n```\n\n```bash\ngac index.ts lib/cli.ts feat --- 'add new killer feature'\n\ngit add index.ts\ngit add lib/cli.ts\ngit commit -m 'feat(index): add new killer feature'\n```\n\n```bash\ngac CHANGELOG.md docs --- 'regenerate'\n\ngit add CHANGELOG.md\ngit commit -m 'docs(changelog): regenerate'\n```\n\n```bash\ngac external-scripts/my-script.ts build --- 'update my-script functionality'\n\ngit add external-scripts/my-script.ts\ngit commit -m 'build(externals/my-script): update my-script functionality'\n```\n\n### Monorepo Pseudo-Pathspecs\n\nAlong with normal [pathspecs][16], `gac` also supports a so-called\n\"pseudo-pathspec\" syntax for easily referring to package [sub-roots][17] in a\nmonorepo.\n\nGiven the following filesystem structure:\n\n    .\n    ├── CHANGELOG.md\n    ├── CONTRIBUTING.md\n    ├── package-lock.json\n    ├── package.json\n    ├── packages\n    │   ├── pkg-1\n    │   │   ├── README.md \u003cMODIFIED\u003e\n    │   │   └── specific\n    │   │       └── script.ts \u003cMODIFIED\u003e\n    │   └── pkg-2\n    │   │   ├── README.md \u003cMODIFIED\u003e\n    │       └── src\n    │           └── index.ts \u003cMODIFIED\u003e\n    └── README.md\n\nThe following are pairs of equivalent commands where `::` is the pseudo-pathspec\nspecifier:\n\n```bash\ngac ::pkg-2 style --- 'cosmetic changes'\n\ngit add packages/pkg-2/README.md\ngit add packages/pkg-2/src/index.ts\ngit commit -m 'style(packages/pkg-2): cosmetic changes'\n```\n\n```bash\ngac ::pkg-1/specific/script.ts feat --- 'added something specific to a script'\n\ngit add packages/pkg-1/specific/script.ts\ngit commit -m 'feat(packages/pkg-1): added something specific to a script'\n```\n\n```bash\ncd packages/pkg-2\ngac ::pkg-1 feat --- 'added something specific to a script'\n\ngit add ../../packages/pkg-1/README.md\ngit add ../../packages/pkg-1/specific/script.ts\ngit commit -m 'feat(packages/pkg-1): added something specific to a script'\n```\n\n```bash\ncd packages/pkg-1\ngac :: refactor --- 'a non-atomic commit with a whole bunch of changes'\n\ngit add ../../packages\ngit commit -m 'refactor(packages): a non-atomic commit with a whole bunch of changes'\n```\n\n```bash\ngac ::*/README.md docs --- 'add license section to all packages'\n\ngit add packages/pkg-1/README.md\ngit add packages/pkg-2/README.md\ngit commit -m 'docs(packages): add license section to all packages'\n```\n\n### Other Features\n\n- Use `--help` for more usage information, including listing all aliases.\n\n- Use `--no-verify` to perform an [unverified commit][8].\n\n- Use `--verify=simple` to set `GAC_VERIFY_SIMPLE=true` in the runtime\n  environment, which can be used to skip certain [tests][18] in your [git\n  hooks][19] based on the presence of the variable.\n\n- If `commit-message` describes a [breaking change][9], [an exclamation point is\n  prepended to the colon][11] in the final commit message.\n\n- `gac` works with both currently staged files and any paths passed as arguments\n  with the latter having precedence. This makes it easy to, for instance, stage\n  files with [vscode][13] or [`git add -p`][14] then use `gac` to quickly\n  compose an [atomic][7] [conventional commit][10].\n\n- `gac` automatically adds \"!\" to messages of commits that are [breaking changes](https://www.conventionalcommits.org/en/v1.0.0/#specification).\n\n- `gac`  refuses to comply with unsafe git add commands unless the `--force` argument is given. For example, calling `git add -p some-file.js` and then later (perhaps accidentally) calling `gac some-file.js --- 'some message'` would result in the carefully curated changes staged by the first call to `git add` to be entirely overwritten by the second call to `git add` performed by `gac`. `gac` will detect this scenario and disarm the footgun.\n\n### Importing as a Module\n\nThis package can be imported and run directly in source without spawning a child\nprocess or calling a CLI. This is useful for, for instance, composing multiple\n[yargs][1]-based CLI tools together.\n\n```typescript\nimport { configureProgram } from 'git-add-then-commit';\n\nconst { program, parse } = configureProgram();\n// `program` is a yargs instance\n// `parse` is an async function that will (eventually) call program.parse(...)\nawait parse(['path', 'type', '--no-scope', 'commit message here']);\n```\n\n## Documentation\n\n\u003e Further documentation can be found under [`docs/`][docs].\n\nThis is a [dual CJS2/ES module][dual-module] package. That means this package\nexposes both CJS2 and ESM (treeshakable and non-treeshakable) entry points.\n\nLoading this package via `require(...)` will cause Node and some bundlers to use\nthe [CJS2 bundle][cjs2] entry point. This can reduce the efficacy of [tree\nshaking][tree-shaking]. Alternatively, loading this package via\n`import { ... } from ...` or `import(...)` will cause Node (and other JS\nruntimes) to use the non-treeshakable ESM entry point in [versions that support\nit][node-esm-support]. Modern bundlers like Webpack and Rollup will use the\ntreeshakable ESM entry point. Hence, using the `import` syntax is the modern,\npreferred choice.\n\nFor backwards compatibility with Node versions \u003c 14,\n[`package.json`][package-json] retains the [`main`][exports-main-key] key, which\npoints to the CJS2 entry point explicitly (using the .js file extension). For\nNode versions \u003e 14, [`package.json`][package-json] includes the more modern\n[`exports`][exports-main-key] key. For bundlers, [`package.json`][package-json]\nincludes the bundler-specific [`module`][module-key] key (eventually superseded\nby [`exports['.'].module`][exports-module-key]), which points to ESM source\nloosely compiled specifically to support [tree shaking][tree-shaking].\n\nThough [`package.json`][package-json] includes\n[`{ \"type\": \"commonjs\"}`][local-pkg], note that the ESM entry points are ES\nmodule (`.mjs`) files. [`package.json`][package-json] also includes the\n[`sideEffects`][side-effects-key] key, which is `false` for [optimal tree\nshaking][tree-shaking], and the `types` key, which points to a TypeScript\ndeclarations file.\n\nAdditionally, this package does not maintain shared state and so does not\nexhibit the [dual package hazard][hazard].\n\n### License\n\n[![FOSSA analysis][badge-fossa]][link-fossa]\n\n## Contributing and Support\n\n**[New issues][choose-new-issue] and [pull requests][pr-compare] are always\nwelcome and greatly appreciated! 🤩** Just as well, you can [star 🌟 this\nproject][link-repo] to let me know you found it useful! ✊🏿 Thank you!\n\nSee [CONTRIBUTING.md][contributing] and [SUPPORT.md][support] for more\ninformation.\n\n[badge-blm]: https://xunn.at/badge-blm 'Join the movement!'\n[link-blm]: https://xunn.at/donate-blm\n[badge-maintenance]:\n  https://img.shields.io/maintenance/active/2023\n  'Is this package maintained?'\n[link-repo]: https://github.com/xunnamius/git-add-then-commit\n[badge-last-commit]:\n  https://img.shields.io/github/last-commit/xunnamius/git-add-then-commit\n  'When was the last commit to the official repo?'\n[badge-issues]:\n  https://img.shields.io/github/issues/Xunnamius/git-add-then-commit\n  'Open issues'\n[link-issues]: https://github.com/Xunnamius/git-add-then-commit/issues?q=\n[badge-pulls]:\n  https://img.shields.io/github/issues-pr/xunnamius/git-add-then-commit\n  'Number of open pull requests'\n[link-pulls]: https://github.com/xunnamius/git-add-then-commit/pulls\n[badge-codecov]:\n  https://codecov.io/gh/Xunnamius/git-add-then-commit/branch/main/graph/badge.svg?token=HWRIOBAAPW\n  'Is this package well-tested?'\n[link-codecov]: https://codecov.io/gh/Xunnamius/git-add-then-commit\n[package-json]: package.json\n[badge-license]:\n  https://img.shields.io/npm/l/git-add-then-commit\n  \"This package's source license\"\n[link-license]:\n  https://github.com/Xunnamius/git-add-then-commit/blob/main/LICENSE\n[badge-fossa]:\n  https://app.fossa.com/api/projects/git%2Bgithub.com%2FXunnamius%2Fgit-add-then-commit.svg?type=large\n  \"Analysis of this package's license obligations\"\n[link-fossa]:\n  https://app.fossa.com/projects/git%2Bgithub.com%2FXunnamius%2Fgit-add-then-commit\n[badge-npm]:\n  https://api.ergodark.com/badges/npm-pkg-version/git-add-then-commit\n  'Install this package using npm or yarn!'\n[link-npm]: https://www.npmjs.com/package/git-add-then-commit\n[badge-semantic-release]:\n  https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg\n  'This repo practices continuous integration and deployment!'\n[link-semantic-release]: https://github.com/semantic-release/semantic-release\n[docs]: docs\n[choose-new-issue]:\n  https://github.com/Xunnamius/git-add-then-commit/issues/new/choose\n[pr-compare]: https://github.com/Xunnamius/git-add-then-commit/compare\n[contributing]: CONTRIBUTING.md\n[support]: .github/SUPPORT.md\n[cjs2]: https://webpack.js.org/configuration/output/#module-definition-systems\n[dual-module]:\n  https://github.com/nodejs/node/blob/8d8e06a345043bec787e904edc9a2f5c5e9c275f/doc/api/packages.md#dual-commonjses-module-packages\n[exports-main-key]:\n  https://github.com/nodejs/node/blob/8d8e06a345043bec787e904edc9a2f5c5e9c275f/doc/api/packages.md#package-entry-points\n[hazard]:\n  https://github.com/nodejs/node/blob/8d8e06a345043bec787e904edc9a2f5c5e9c275f/doc/api/packages.md#dual-package-hazard\n[local-pkg]:\n  https://github.com/nodejs/node/blob/8d8e06a345043bec787e904edc9a2f5c5e9c275f/doc/api/packages.md#type\n[module-key]:\n  https://github.com/nodejs/node-eps/blob/4217dca299d89c8c18ac44c878b5fe9581974ef3/002-es6-modules.md#51-determining-if-source-is-an-es-module\n[exports-module-key]:\n  https://webpack.js.org/guides/package-exports/#providing-commonjs-and-esm-version-stateless\n[node-esm-support]:\n  https://medium.com/%40nodejs/node-js-version-14-available-now-8170d384567e#2368\n[side-effects-key]:\n  https://webpack.js.org/guides/tree-shaking/#mark-the-file-as-side-effect-free\n[tree-shaking]: https://webpack.js.org/guides/tree-shaking\n[10]: https://conventionalcommits.org\n[1]: https://github.com/yargs/yargs\n[2]: #root\n[3]: #omit\n[5]: https://github.com/conventional-changelog/conventional-changelog\n[6]: #full\n[7]: https://dev.to/cbillowes/why-i-create-atomic-commits-in-git-kfi\n[8]:\n  https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---no-verify\n[9]:\n  https://github.com/Xunnamius/conventional-changelog-projector/blob/bde3ed43fd30aae4657c5b27f9e14a20115a903d/defaults.js#L124\n[11]:\n  https://www.conventionalcommits.org/en/v1.0.0/#commit-message-with--to-draw-attention-to-breaking-change\n[12]: https://en.wikipedia.org/wiki/WYSIWYG\n[13]: https://code.visualstudio.com/docs/editor/versioncontrol#_commit\n[14]:\n  https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging#_staging_patches\n[15]:\n  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split\n[16]:\n  https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-aiddefpathspecapathspec\n[4]: #monorepo-pseudo-pathspecs\n[17]: https://github.com/Xunnamius/projector#terminology\n[18]: https://www.npmjs.com/package/lint-staged\n[19]: https://www.npmjs.com/package/husky\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxunnamius%2Fgit-add-then-commit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxunnamius%2Fgit-add-then-commit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxunnamius%2Fgit-add-then-commit/lists"}